MoonrakerSharpWebApi 1.3.1-preview
dotnet add package MoonrakerSharpWebApi --version 1.3.1-preview
NuGet\Install-Package MoonrakerSharpWebApi -Version 1.3.1-preview
<PackageReference Include="MoonrakerSharpWebApi" Version="1.3.1-preview" />
paket add MoonrakerSharpWebApi --version 1.3.1-preview
#r "nuget: MoonrakerSharpWebApi, 1.3.1-preview"
// Install MoonrakerSharpWebApi as a Cake Addin #addin nuget:?package=MoonrakerSharpWebApi&version=1.3.1-preview&prerelease // Install MoonrakerSharpWebApi as a Cake Tool #tool nuget:?package=MoonrakerSharpWebApi&version=1.3.1-preview&prerelease
MoonrakerRestApiSharp (former KlipperRestApiSharp)
A C# based library to communicate with the Moonraker WebApi, available with Fluidd and MainsailOS.
Important!
With the upcoming version, starting from 1.1.0
, KlipperClient
become MoonrakerClient
. also the namespaces will changed and generalized with our other print server api nugets.
Old | New |
---|---|
AndreasReitberger |
AndreasReitberger.API.Moonraker |
KlipperClient |
MoonrakerClient |
Klipper... |
Moonraker... |
Nuget MoonrakerRestApiSharp
Nuget KlipperRestApiSharp (deprecated)
Platform specific setup
Android
On Android
you need to allow local connections in the AndroidManifest.xml
.
For this, create a new xml file and link to it in your manifest at android:networkSecurityConfig
Content of the network_security_config.xml
file
<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
The manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionName="1.0.0"
android:versionCode="1"
package="com.company.app"
>
<application
android:label="App Name"
android:allowBackup="true"
android:icon="@mipmap/appicon"
android:roundIcon="@mipmap/appicon_round"
android:supportsRtl="true"
android:networkSecurityConfig="@xml/network_security_config"
>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
Moonrakers Documentation
This C# library wraps the available Web API functions listed in the Moonraker's documentation below. https://moonraker.readthedocs.io/en/latest/web_api/
You can see the current migration progress in the following table.
Supported OS
Basically all OS using the Moonraker WebApi are theoretically supported.
Tested with our app
- MainsailOS
- FluiddPi
App's using this library
I also created an iOS app to interact with a moonraker based OS. The app is available for testing here:<br> TestFlight: https://testflight.apple.com/join/TyguKzt9
Note for Android
There is an android version in development, however due to the poor performance using Xamarin.Android, I decided to wait till .NET MAUI is available.
WebAPI migration status
Following you'll find the list of migrated functions from the WebAPI.
Printer Administration
Function | Added? | Tested? |
---|---|---|
Get Klippy host information | ✅ | ✅ |
Emergency Stop | ✅ | ✅ |
Host Restart | ✅ | ✅ |
Firmware Restart | ✅ | ✅ |
Printer Status
Function | Added? | Tested? |
---|---|---|
List available printer objects | ✅ | ✅ |
Query printer object status | ✅ | ✅ |
Subscribe to printer object status | ✅ | ✅ |
Query Endstops | ✅ | ✅ |
Query Server Info | ✅ | ✅ |
Get Server Configuration | ✅ | ✅ |
Request Cached Temperature Data | ✅ | ✅ |
Request Cached GCode Responses | ✅ | ✅ |
Restart Server | ✅ | ✅ |
Get Websocket ID | ✅ | ✅ |
GCode APIs
Function | Added? | Tested? |
---|---|---|
Run a gcode | ✅ | ✅ |
Get GCode Help | ✅ | ✅ |
Print Management
Function | Added? | Tested? |
---|---|---|
Print a file | ✅ | ✅ |
Pause a print | ✅ | ✅ |
Resume a print | ✅ | ✅ |
Cancel a print | ✅ | ✅ |
Machine Commands
Function | Added? | Tested? |
---|---|---|
Get System Info | ✅ | ✅ |
Shutdown the Operating System | ✅ | ✅ |
Reboot the Operating System | ✅ | ✅ |
Restart a system service | ✅ | No |
Stop a system service | ✅ | No |
Start a system service | ✅ | No |
Get Moonraker Process Stats | ✅ | ✅ |
File Operations
Function | Added? | Tested? |
---|---|---|
List available files | ✅ | ✅ |
Get gcode metadata | ✅ | ✅ |
Get directory information | ✅ | ✅ |
Create directory | ✅ | ✅ |
Delete directory | ✅ | ✅ |
Move a file or directory | ✅ | ✅ |
Copy a file or directory | ✅ | ✅ |
File download | ✅ | ✅ |
File upload | ✅ | ✅ |
File delete | ✅ | ✅ |
Download klippy.log | ✅ | ✅ |
Download moonraker.log | ✅ | ✅ |
Authorization
Function | Added? | Tested? |
---|---|---|
Login User | ✅ | ✅ |
Logout Current User | ✅ | ✅ |
Get Current User | ✅ | ✅ |
Create User | ✅ | ✅ |
Delete User | ✅ | ✅ |
List Available Users | ✅ | ✅ |
Reset User Password | ✅ | ✅ |
Refresh JSON Web Token | ✅ | ✅ |
Generate a Oneshot Token | ✅ | ✅ |
Get the Current API Key | ✅ | ✅ |
Generate a New API Key | ✅ | ✅ |
Database APIs
Function | Added? | Tested? |
---|---|---|
List namespaces | ✅ | ✅ |
Get Database Item | ✅ | ✅ |
Add Database Item | ✅ | ✅ |
Delete Database Item | ✅ | ✅ |
Job Queue APIs
Function | Added? | Tested? |
---|---|---|
Retrieve the job queue status | ✅ | ✅ |
Enqueue a job | ✅ | ✅ |
Remove a Job | ✅ | ✅ |
Pause the job queue | ✅ | ✅ |
Start the job queue | ✅ | ✅ |
Update Manager APIs
Function | Added? | Tested? |
---|---|---|
Get update status | ✅ | ✅ |
Perform a full update | ✅ | ✅ |
Update Moonraker | ✅ | No |
Update Klipper | ✅ | No |
Update Client | ✅ | No |
Update System Packages | ✅ | No |
Recover a corrupt repo | ✅ | No |
Power APIs
Function | Added? | Tested? |
---|---|---|
Get Device List | ✅ | ✅ |
Get Device Status | ✅ | ✅ |
Set Device State | ✅ | ✅ |
Get Batch Device Status | ✅ | ✅ |
Batch Power On Devices | ✅ | ✅ |
Batch Power Off Devices | ✅ | ✅ |
Octoprint API emulation
Function | Added? | Tested? |
---|---|---|
Version information | ✅ | ✅ |
Server status | ✅ | ✅ |
Login verification & User information | ✅ | No |
Get settings | ✅ | ✅ |
Octoprint File Upload | ✅ | ✅ |
Get Job status | ✅ | ✅ |
Get Printer status | ✅ | ✅ |
Send GCode command | ✅ | ✅ |
List Printer profiles | ✅ | ✅ |
History APIs
Function | Added? | Tested? |
---|---|---|
Get job list | ✅ | ✅ |
Get job totals | ✅ | ✅ |
Reset totals | ✅ | ✅ |
Get a single job | ✅ | ✅ |
Delete job | ✅ | ✅ |
MQTT APIs
Function | Added? | Tested? |
---|---|---|
Publish a topic | No | No |
Subscribe to a topic | No | No |
Websocket notifications
Not implemented yet.
Usage
You can check the Test project for more code examples.
Initialize the client
This initialize a new KlipperClient
object. Always check if the
client is reachable before using it.
private readonly string _host = "192.168.10.113";
private readonly int _port = 80;
private readonly string _api = "";
private readonly bool _ssl = false;
// Note, the api key is not mandatory
KlipperClient _server = new(_host, _port, _ssl);
await _server.CheckOnlineAsync();
if (_server.IsOnline)
{
await _server.RefreshAllAsync();
Assert.IsTrue(_server.InitialDataFetched);
//var token = await _server.GetOneshotTokenAsync();
KlipperAccessTokenResult token2 = await _server.GetApiKeyAsync();
Assert.IsTrue(!string.IsNullOrEmpty(token2.Result));
}
WebSocket
It's recommended to StartListening()
to the WebSocket of your Klipper server.
An example is shown below.
Dictionary<DateTime, string> websocketMessages = new();
KlipperClient _server = new(_host, _api, _port, _ssl);
await _server.CheckOnlineAsync();
Assert.IsTrue(_server.IsOnline);
_server.StartListening();
// Once the Id has been received, subscribe to the printer status objects
_server.WebSocketConnectionIdChanged += (o, args) =>
{
Assert.IsNotNull(args.ConnectionId);
Assert.IsTrue(args.ConnectionId > 0);
Task.Run(async () =>
{
string subResult = await _server.SubscribeAllPrinterObjectStatusAsync(args.ConnectionId);
});
};
_server.Error += (o, args) =>
{
Assert.Fail(args.ToString());
};
_server.ServerWentOffline += (o, args) =>
{
Assert.Fail(args.ToString());
};
_server.WebSocketDataReceived += (o, args) =>
{
if (!string.IsNullOrEmpty(args.Message))
{
websocketMessages.Add(DateTime.Now, args.Message);
Debug.WriteLine($"WebSocket Data: {args.Message} (Total: {websocketMessages.Count})");
}
};
_server.WebSocketError += (o, args) =>
{
Assert.Fail($"Websocket closed due to an error: {args}");
};
// Wait 10 minutes
CancellationTokenSource cts = new(new TimeSpan(0, 10, 0));
_server.WebSocketDisconnected += (o, args) =>
{
if (!cts.IsCancellationRequested)
Assert.Fail($"Websocket unexpectly closed: {args}");
};
do
{
await Task.Delay(10000);
await _server.CheckOnlineAsync();
} while (_server.IsOnline && !cts.IsCancellationRequested);
_server.StopListening();
Assert.IsTrue(cts.IsCancellationRequested);
User auth
If your Klipper server is protected with a login, please call the LoginUserAsync
method first.
Alternatively you can provide the API key instead.
string username = "TestUser";
string password = "TestPassword";
KlipperUserActionResult userCreated = await _server.CreateUserAsync(username, password);
Assert.IsNotNull(userCreated);
List<KlipperUser> users = await _server.ListAvailableUsersAsync();
Assert.IsTrue(users?.Count > 0);
KlipperUserActionResult login = await _server.LoginUserAsync(username, password);
Assert.IsNotNull(login);
Assert.IsTrue(login.Username == username);
KlipperUser currentUser = await _server.GetCurrentUserAsync();
Assert.IsNotNull(currentUser);
KlipperUserActionResult newTokenResult = await _server.RefreshJSONWebTokenAsync();
Assert.IsNotNull(newTokenResult);
Assert.IsTrue(_server.UserToken == newTokenResult.Token);
string newPassword = "TestPasswordChanged";
KlipperUserActionResult refreshPassword = await _server.ResetUserPasswordAsync(password, newPassword);
Assert.IsNotNull(refreshPassword);
KlipperUserActionResult logout = await _server.LogoutCurrentUserAsync();
Assert.IsNotNull(logout);
login = await _server.LoginUserAsync(username, newPassword);
Assert.IsNotNull(login);
Assert.IsTrue(login.Username == username);
logout = await _server.LogoutCurrentUserAsync();
Assert.IsNotNull(logout);
KlipperUserActionResult userDeleted = await _server.DeleteUserAsync(username);
Assert.IsNotNull(userDeleted);
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- CommunityToolkit.Mvvm (>= 8.2.2)
- Newtonsoft.Json (>= 13.0.3)
- Print3dServer.Core (>= 1.0.0-preview)
- RCoreSharp (>= 1.0.9)
- RestSharp (>= 110.2.0)
- System.Net.Http (>= 4.3.4)
- System.Text.Json (>= 8.0.3)
-
net6.0
- CommunityToolkit.Mvvm (>= 8.2.2)
- Newtonsoft.Json (>= 13.0.3)
- Print3dServer.Core (>= 1.0.0-preview)
- RCoreSharp (>= 1.0.9)
- RestSharp (>= 110.2.0)
- System.Net.Http (>= 4.3.4)
- System.Text.Json (>= 8.0.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.3.1-preview | 113 | 4/22/2024 |
1.3.0 | 251 | 5/19/2023 |
1.2.0-beta | 153 | 12/11/2022 |
1.1.0-alpha | 142 | 10/9/2022 |
Check GitHub releases for changelog.