diff --git a/src/Clients/KlipperClient.cpp b/src/Clients/KlipperClient.cpp index 510d6a6..b7f450b 100644 --- a/src/Clients/KlipperClient.cpp +++ b/src/Clients/KlipperClient.cpp @@ -1,3 +1,6 @@ +// Moonraker API: https://github.com/Arksine/moonraker/blob/master/docs/web_api.md +// ArduinoJSON Assistant: https://arduinojson.org/v6/assistant/ + #include "KlipperClient.h" KlipperClient::KlipperClient(GlobalDataController *globalDataController, DebugController *debugController) { @@ -154,12 +157,12 @@ void KlipperClient::getPrinterJobResults() { return; } //**** get the Printer Job status - String apiGetData = "GET /printer/objects/query?heater_bed&extruder&print_stats&toolhead&display_status"; + String apiGetData = "GET /printer/objects/query?heater_bed&extruder&webhooks&virtual_sdcard&print_stats&toolhead&display_status"; WiFiClient printClient = getSubmitRequest(apiGetData); if (printerData.error != "") { return; } - const size_t bufferSize = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + 2*JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + 710; + const size_t bufferSize = JSON_ARRAY_SIZE(4) + JSON_OBJECT_SIZE(1) + 3*JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + JSON_OBJECT_SIZE(9) + 426; DynamicJsonDocument jsonBuffer(bufferSize); // Parse JSON object @@ -168,20 +171,36 @@ void KlipperClient::getPrinterJobResults() { this->debugController->printLn("Klipper Data Parsing failed: " + String(myServer) + ":" + String(myPort)); printerData.error = "Klipper Data Parsing failed: " + String(myServer) + ":" + String(myPort); printerData.state = ""; + printerData.isPrinting = false; + printerData.toolTemp = ""; + printerData.toolTargetTemp = ""; + printerData.bedTemp = ""; + printerData.bedTargetTemp = (const char*)jsonBuffer["result"]["status"]["heater_bed"]["target"]; + return; return; } - printerData.averagePrintTime = (const char*)jsonBuffer["result"]["status"]["print_stats"]["averagePrintTime"]; - printerData.estimatedPrintTime = (const char*)jsonBuffer["result"]["status"]["print_stats"]["estimatedPrintTime"]; + printerData.averagePrintTime = (int)jsonBuffer["result"]["status"]["toolhead"]["averagePrintTime"]; + printerData.estimatedPrintTime = (float)jsonBuffer["result"]["status"]["toolhead"]["estimated_print_time"]; printerData.fileName = (const char*)jsonBuffer["result"]["status"]["print_stats"]["filename"]; - printerData.fileSize = (const char*)jsonBuffer["job"]["file"]["size"]; + // printerData.fileSize = (const char*)jsonBuffer["job"]["file"]["size"]; printerData.lastPrintTime = (const char*)jsonBuffer["job"]["lastPrintTime"]; - printerData.progressCompletion = (const char*)jsonBuffer["result"]["status"]["display_status"]["progress"]; + printerData.progressCompletion = (int)jsonBuffer["result"]["status"]["display_status"]["progress"]; printerData.progressFilepos = (const char*)jsonBuffer["result"]["status"]["virtual_sdcard"]["file_position"]; printerData.progressPrintTime = (const char*)jsonBuffer["result"]["status"]["print_stats"]["print_duration"]; printerData.progressPrintTimeLeft = (const char*)jsonBuffer["progress"]["printTimeLeft"]; printerData.filamentLength = (const char*)jsonBuffer["result"]["status"]["job"]["print_stats"]["filament_used"]; printerData.state = (const char*)jsonBuffer["result"]["status"]["print_stats"]["state"]; +/** +printerData.progressPrintTimeLeft : +If no metadata is available, print duration and progress can be used to calculate the ETA: + +// assume "result" is the response from the status query +let vsd = result.status.virtual_sdcard; +let pstats = result.status.print_stats; +let total_time = pstats.print_duration / vsd.progress; +let eta = total_time - pstats.print_duration; */ + if (isOperational()) { this->debugController->printLn("Status: " + printerData.state); @@ -189,13 +208,13 @@ void KlipperClient::getPrinterJobResults() { this->debugController->printLn("Printer Not Operational"); } - //**** get the Printer Temps and Stat - apiGetData = "GET /printer/objects/query?heater_bed&extruder&print_stats"; + //**** get the fileseize + apiGetData = "GET /server/files/metadata?filename=" + printerData.fileName; printClient = getSubmitRequest(apiGetData); if (printerData.error != "") { return; } - const size_t bufferSize2 = 3*JSON_OBJECT_SIZE(2) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(9) + 300; + const size_t bufferSize2 = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(8) + 128; DynamicJsonDocument jsonBuffer2(bufferSize2); // Parse JSON object @@ -205,20 +224,21 @@ void KlipperClient::getPrinterJobResults() { printerData.toolTemp = ""; printerData.toolTargetTemp = ""; printerData.bedTemp = ""; - printerData.bedTargetTemp = (const char*)jsonBuffer2["result"]["status"]["heater_bed"]["target"]; + printerData.bedTargetTemp = (int)jsonBuffer["result"]["status"]["heater_bed"]["target"]; return; } - String printing = (const char*)jsonBuffer2["result"]["status"]["print_stats"]["state"]; + String printing = (bool)jsonBuffer["result"]["status"]["print_stats"]["state"]; if (printing == "printing") { printerData.isPrinting = true; } else { printerData.isPrinting = false; } - printerData.toolTemp = (const char*)jsonBuffer2["result"]["status"]["extruder"]["temperature"]; - printerData.toolTargetTemp = (const char*)jsonBuffer2["result"]["status"]["extruder"]["target"]; - printerData.bedTemp = (const char*)jsonBuffer2["result"]["status"]["heater_bed"]["temperature"]; - printerData.bedTargetTemp = (const char*)jsonBuffer2["result"]["status"]["heater_bed"]["target"]; + printerData.toolTemp = (int)jsonBuffer["result"]["status"]["extruder"]["temperature"]; + printerData.toolTargetTemp = (int)jsonBuffer["result"]["status"]["extruder"]["target"]; + printerData.bedTemp = (int)jsonBuffer["result"]["status"]["heater_bed"]["temperature"]; + printerData.bedTargetTemp = (int)jsonBuffer["result"]["status"]["heater_bed"]["target"]; + printerData.fileSize = (long)jsonBuffer2["result"]["size"]; if (isPrinting()) { this->debugController->printLn("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)");