add OctoPrint integration with configurable fields and update functionality
This commit is contained in:
		
							
								
								
									
										65
									
								
								src/api.cpp
									
									
									
									
									
								
							
							
						
						
									
										65
									
								
								src/api.cpp
									
									
									
									
									
								
							| @@ -5,11 +5,15 @@ | ||||
|  | ||||
| bool spoolman_connected = false; | ||||
| String spoolmanUrl = ""; | ||||
| bool octoEnabled = false; | ||||
| String octoUrl = ""; | ||||
| String octoToken = ""; | ||||
|  | ||||
| struct SendToApiParams { | ||||
|     String httpType; | ||||
|     String spoolsUrl; | ||||
|     String updatePayload; | ||||
|     String octoToken; | ||||
| }; | ||||
|  | ||||
| JsonDocument fetchSingleSpoolInfo(int spoolId) { | ||||
| @@ -87,14 +91,16 @@ void sendToApi(void *parameter) { | ||||
|     String httpType = params->httpType; | ||||
|     String spoolsUrl = params->spoolsUrl; | ||||
|     String updatePayload = params->updatePayload; | ||||
|      | ||||
|     String octoToken = params->octoToken;     | ||||
|  | ||||
|     HTTPClient http; | ||||
|     http.begin(spoolsUrl); | ||||
|     http.addHeader("Content-Type", "application/json"); | ||||
|     if (octoEnabled && octoToken != "") http.addHeader("X-Api-Key", octoToken); | ||||
|  | ||||
|     int httpCode = http.PUT(updatePayload); | ||||
|     if (httpType == "PATCH") httpCode = http.PATCH(updatePayload); | ||||
|     if (httpType == "POST") httpCode = http.POST(updatePayload); | ||||
|  | ||||
|     if (httpCode == HTTP_CODE_OK) { | ||||
|         Serial.println("Spoolman erfolgreich aktualisiert"); | ||||
| @@ -198,6 +204,43 @@ uint8_t updateSpoolWeight(String spoolId, uint16_t weight) { | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| bool updateSpoolOcto(int spoolId) { | ||||
|     String spoolsUrl = octoUrl + "/plugin/Spoolman/selectSpool"; | ||||
|     Serial.print("Update Spule in Octoprint mit URL: "); | ||||
|     Serial.println(spoolsUrl); | ||||
|  | ||||
|     JsonDocument updateDoc; | ||||
|     updateDoc["spool_id"] = spoolId; | ||||
|     updateDoc["tool"] = "tool0"; | ||||
|  | ||||
|     String updatePayload; | ||||
|     serializeJson(updateDoc, updatePayload); | ||||
|     Serial.print("Update Payload: "); | ||||
|     Serial.println(updatePayload); | ||||
|  | ||||
|     SendToApiParams* params = new SendToApiParams(); | ||||
|     if (params == nullptr) { | ||||
|         Serial.println("Fehler: Kann Speicher für Task-Parameter nicht allokieren."); | ||||
|         return false; | ||||
|     } | ||||
|     params->httpType = "POST"; | ||||
|     params->spoolsUrl = spoolsUrl; | ||||
|     params->updatePayload = updatePayload; | ||||
|     params->octoToken = octoToken; | ||||
|  | ||||
|     // Erstelle die Task | ||||
|     BaseType_t result = xTaskCreate( | ||||
|         sendToApi,                // Task-Funktion | ||||
|         "SendToApiTask",          // Task-Name | ||||
|         4096,                     // Stackgröße in Bytes | ||||
|         (void*)params,            // Parameter | ||||
|         0,                        // Priorität | ||||
|         NULL                      // Task-Handle (nicht benötigt) | ||||
|     ); | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool updateSpoolBambuData(String payload) { | ||||
|     JsonDocument doc; | ||||
|     DeserializationError error = deserializeJson(doc, payload); | ||||
| @@ -435,17 +478,24 @@ bool checkSpoolmanInstance(const String& url) { | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| bool saveSpoolmanUrl(const String& url) { | ||||
| bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octoWh, const String& octoTk) { | ||||
|     if (!checkSpoolmanInstance(url)) return false; | ||||
|  | ||||
|     JsonDocument doc; | ||||
|     doc["url"] = url; | ||||
|     Serial.print("Speichere URL in Datei: "); | ||||
|     Serial.println(url); | ||||
|     doc["octoEnabled"] = octoOn; | ||||
|     doc["octoUrl"] = octoWh; | ||||
|     doc["octoToken"] = octoTk; | ||||
|     Serial.print("Speichere Spoolman Data in Datei: "); | ||||
|     Serial.println(doc.as<String>()); | ||||
|     if (!saveJsonValue("/spoolman_url.json", doc)) { | ||||
|         Serial.println("Fehler beim Speichern der Spoolman-URL."); | ||||
|         return false; | ||||
|     } | ||||
|     spoolmanUrl = url; | ||||
|     octoEnabled = octoOn; | ||||
|     octoUrl = octoWh; | ||||
|     octoToken = octoTk; | ||||
|  | ||||
|     return true; | ||||
| } | ||||
| @@ -453,6 +503,13 @@ bool saveSpoolmanUrl(const String& url) { | ||||
| String loadSpoolmanUrl() { | ||||
|     JsonDocument doc; | ||||
|     if (loadJsonValue("/spoolman_url.json", doc) && doc["url"].is<String>()) { | ||||
|         octoEnabled = (doc["octoEnabled"].is<bool>()) ? doc["octoEnabled"].as<bool>() : false; | ||||
|         if (octoEnabled && doc["octoToken"].is<String>() && doc["octoUrl"].is<String>()) | ||||
|         { | ||||
|             octoUrl = doc["octoUrl"].as<String>(); | ||||
|             octoToken = doc["octoToken"].as<String>(); | ||||
|         } | ||||
|  | ||||
|         return doc["url"].as<String>(); | ||||
|     } | ||||
|     Serial.println("Keine gültige Spoolman-URL gefunden."); | ||||
|   | ||||
| @@ -9,9 +9,12 @@ | ||||
|  | ||||
| extern bool spoolman_connected; | ||||
| extern String spoolmanUrl; | ||||
| extern bool octoEnabled; | ||||
| extern String octoUrl; | ||||
| extern String octoToken; | ||||
|  | ||||
| bool checkSpoolmanInstance(const String& url); | ||||
| bool saveSpoolmanUrl(const String& url); | ||||
| bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octoWh, const String& octoTk); | ||||
| String loadSpoolmanUrl(); // Neue Funktion zum Laden der URL | ||||
| bool checkSpoolmanExtraFields(); // Neue Funktion zum Überprüfen der Extrafelder | ||||
| JsonDocument fetchSingleSpoolInfo(int spoolId); // API-Funktion für die Webseite | ||||
| @@ -19,5 +22,6 @@ bool updateSpoolTagId(String uidString, const char* payload); // Neue Funktion z | ||||
| uint8_t updateSpoolWeight(String spoolId, uint16_t weight); // Neue Funktion zum Aktualisieren des Gewichts | ||||
| bool initSpoolman(); // Neue Funktion zum Initialisieren von Spoolman | ||||
| bool updateSpoolBambuData(String payload); // Neue Funktion zum Aktualisieren der Bambu-Daten | ||||
| bool updateSpoolOcto(int spoolId); // Neue Funktion zum Aktualisieren der Octo-Daten | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -197,6 +197,11 @@ void loop() { | ||||
|       vTaskDelay(2000 / portTICK_PERIOD_MS); | ||||
|       weightSend = 1; | ||||
|       autoSetToBambuSpoolId = spoolId.toInt(); | ||||
|  | ||||
|       if (octoEnabled)  | ||||
|       { | ||||
|         updateSpoolOcto(autoSetToBambuSpoolId); | ||||
|       } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|   | ||||
| @@ -239,7 +239,10 @@ void setupWebserver(AsyncWebServer &server) { | ||||
|     server.on("/spoolman", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|         Serial.println("Anfrage für /spoolman erhalten"); | ||||
|         String html = loadHtmlWithHeader("/spoolman.html"); | ||||
|         html.replace("{{spoolmanUrl}}", spoolmanUrl); | ||||
|         html.replace("{{spoolmanUrl}}", (spoolmanUrl != "") ? spoolmanUrl : ""); | ||||
|         html.replace("{{spoolmanOctoEnabled}}", octoEnabled ? "checked" : ""); | ||||
|         html.replace("{{spoolmanOctoUrl}}", (octoUrl != "") ? octoUrl : ""); | ||||
|         html.replace("{{spoolmanOctoToken}}", (octoToken != "") ? octoToken : ""); | ||||
|  | ||||
|         JsonDocument doc; | ||||
|         if (loadJsonValue("/bambu_credentials.json", doc) && doc["bambu_ip"].is<String>())  | ||||
| @@ -277,10 +280,21 @@ void setupWebserver(AsyncWebServer &server) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (request->getParam("octoEnabled")->value() == "true" && (!request->hasParam("octoUrl") || !request->hasParam("octoToken"))) { | ||||
|             request->send(400, "application/json", "{\"success\": false, \"error\": \"Missing OctoPrint URL or Token parameter\"}"); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         String url = request->getParam("url")->value(); | ||||
|         bool octoEnabled = (request->getParam("octoEnabled")->value() == "true") ? true : false; | ||||
|         String octoUrl = request->getParam("octoUrl")->value(); | ||||
|         String octoToken = (request->getParam("octoToken")->value() != "") ? request->getParam("octoToken")->value() : ""; | ||||
|  | ||||
|         url.trim(); | ||||
|         octoUrl.trim(); | ||||
|         octoToken.trim(); | ||||
|          | ||||
|         bool healthy = saveSpoolmanUrl(url); | ||||
|         bool healthy = saveSpoolmanUrl(url, octoEnabled, octoUrl, octoToken); | ||||
|         String jsonResponse = "{\"healthy\": " + String(healthy ? "true" : "false") + "}"; | ||||
|  | ||||
|         request->send(200, "application/json", jsonResponse); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user