diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/html/spoolman.html b/html/spoolman.html index 912948d..49abe55 100644 --- a/html/spoolman.html +++ b/html/spoolman.html @@ -146,20 +146,20 @@
-
Set URL/IP to your Spoolman-Instanz
- -
If you want to enable sending Spool to Spoolman Octoprint Plugin:
+
Set URL/IP to your Spoolman instance
+ +
If you want to enable sending the spool to the Spoolman Octoprint plugin:

Send to Octo-Plugin

- +

@@ -169,16 +169,16 @@
Bambu Lab Printer Credentials
- +
- +
- +

If activated, FilaMan will automatically update the next filled tray with the last scanned and weighed spool.

diff --git a/src/api.cpp b/src/api.cpp index a100239..12a96d8 100644 --- a/src/api.cpp +++ b/src/api.cpp @@ -2,6 +2,7 @@ #include #include #include "commonFS.h" +#include volatile spoolmanApiStateType spoolmanApiState = API_INIT; //bool spoolman_connected = false; @@ -565,42 +566,36 @@ bool checkSpoolmanInstance(const String& url) { return false; } -bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octoWh, const String& octoTk) { - if (!checkSpoolmanInstance(url)) return false; +bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octo_url, const String& octoTk) { + Preferences preferences; + preferences.begin(NVS_NAMESPACE_API, false); // false = readwrite + preferences.putString(NVS_KEY_SPOOLMAN_URL, url); + preferences.putBool(NVS_KEY_OCTOPRINT_ENABLED, octoOn); + preferences.putString(NVS_KEY_OCTOPRINT_URL, octo_url); + preferences.putString(NVS_KEY_OCTOPRINT_TOKEN, octoTk); + preferences.end(); - JsonDocument doc; - doc["url"] = url; - doc["octoEnabled"] = octoOn; - doc["octoUrl"] = octoWh; - doc["octoToken"] = octoTk; - Serial.print("Speichere Spoolman Data in Datei: "); - Serial.println(doc.as()); - if (!saveJsonValue("/spoolman_url.json", doc)) { - Serial.println("Fehler beim Speichern der Spoolman-URL."); - return false; - } + //TBD: This could be handled nicer in the future spoolmanUrl = url; octoEnabled = octoOn; - octoUrl = octoWh; + octoUrl = octo_url; octoToken = octoTk; return true; } String loadSpoolmanUrl() { - JsonDocument doc; - if (loadJsonValue("/spoolman_url.json", doc) && doc["url"].is()) { - octoEnabled = (doc["octoEnabled"].is()) ? doc["octoEnabled"].as() : false; - if (octoEnabled && doc["octoToken"].is() && doc["octoUrl"].is()) - { - octoUrl = doc["octoUrl"].as(); - octoToken = doc["octoToken"].as(); - } - - return doc["url"].as(); + Preferences preferences; + preferences.begin(NVS_NAMESPACE_API, true); + String spoolmanUrl = preferences.getString(NVS_KEY_SPOOLMAN_URL, ""); + octoEnabled = preferences.getBool(NVS_KEY_OCTOPRINT_ENABLED, false); + if(octoEnabled) + { + octoUrl = preferences.getString(NVS_KEY_OCTOPRINT_URL, ""); + octoToken = preferences.getString(NVS_KEY_OCTOPRINT_TOKEN, ""); } - Serial.println("Keine gültige Spoolman-URL gefunden."); - return ""; + preferences.end(); + return spoolmanUrl; } bool initSpoolman() { diff --git a/src/bambu.cpp b/src/bambu.cpp index 0225dae..c738ec8 100644 --- a/src/bambu.cpp +++ b/src/bambu.cpp @@ -10,6 +10,7 @@ #include "esp_task_wdt.h" #include "config.h" #include "display.h" +#include WiFiClient espClient; SSLClient sslClient(&espClient); @@ -17,22 +18,13 @@ PubSubClient client(sslClient); TaskHandle_t BambuMqttTask; -String topic = ""; -//String request_topic = ""; -const char* bambu_username = "bblp"; -const char* bambu_ip = nullptr; -const char* bambu_accesscode = nullptr; -const char* bambu_serialnr = nullptr; - -String g_bambu_ip = ""; -String g_bambu_accesscode = ""; -String g_bambu_serialnr = ""; bool bambuDisabled = false; bool bambu_connected = false; -bool autoSendToBambu = false; int autoSetToBambuSpoolId = 0; +BambuCredentials bambuCredentials; + // Globale Variablen für AMS-Daten int ams_count = 0; String amsJsonData; // Speichert das fertige JSON für WebSocket-Clients @@ -43,18 +35,22 @@ bool removeBambuCredentials() { vTaskDelete(BambuMqttTask); } - if (!removeJsonValue("/bambu_credentials.json")) { - Serial.println("Fehler beim Löschen der Bambu-Credentials."); - return false; - } + Preferences preferences; + preferences.begin(NVS_NAMESPACE_BAMBU, false); // false = readwrite + preferences.remove(NVS_KEY_BAMBU_IP); + preferences.remove(NVS_KEY_BAMBU_SERIAL); + preferences.remove(NVS_KEY_BAMBU_ACCESSCODE); + preferences.remove(NVS_KEY_BAMBU_AUTOSEND_ENABLE); + preferences.remove(NVS_KEY_BAMBU_AUTOSEND_TIME); + preferences.end(); + // Löschen der globalen Variablen - g_bambu_ip = ""; - g_bambu_accesscode = ""; - g_bambu_serialnr = ""; - bambu_ip = nullptr; - bambu_accesscode = nullptr; - bambu_serialnr = nullptr; - autoSendToBambu = false; + bambuCredentials.ip = ""; + bambuCredentials.serial = ""; + bambuCredentials.accesscode = ""; + bambuCredentials.autosend_enable = false; + bambuCredentials.autosend_time = BAMBU_DEFAULT_AUTOSEND_TIME; + autoSetToBambuSpoolId = 0; ams_count = 0; amsJsonData = ""; @@ -68,25 +64,21 @@ bool saveBambuCredentials(const String& ip, const String& serialnr, const String if (BambuMqttTask) { vTaskDelete(BambuMqttTask); } - - JsonDocument doc; - doc["bambu_ip"] = ip; - doc["bambu_accesscode"] = accesscode; - doc["bambu_serialnr"] = serialnr; - doc["autoSendToBambu"] = autoSend; - doc["autoSendTime"] = (autoSendTime != "") ? autoSendTime.toInt() : autoSetBambuAmsCounter; - if (!saveJsonValue("/bambu_credentials.json", doc)) { - Serial.println("Fehler beim Speichern der Bambu-Credentials."); - return false; - } + bambuCredentials.ip = ip.c_str(); + bambuCredentials.serial = serialnr.c_str(); + bambuCredentials.accesscode = accesscode.c_str(); + bambuCredentials.autosend_enable = autoSend; + bambuCredentials.autosend_time = autoSendTime.toInt(); - // Dynamische Speicherallokation für die globalen Pointer - bambu_ip = ip.c_str(); - bambu_accesscode = accesscode.c_str(); - bambu_serialnr = serialnr.c_str(); - autoSendToBambu = autoSend; - autoSetBambuAmsCounter = autoSendTime.toInt(); + Preferences preferences; + preferences.begin(NVS_NAMESPACE_BAMBU, false); // false = readwrite + preferences.putString(NVS_KEY_BAMBU_IP, bambuCredentials.ip); + preferences.putString(NVS_KEY_BAMBU_SERIAL, bambuCredentials.serial); + preferences.putString(NVS_KEY_BAMBU_ACCESSCODE, bambuCredentials.accesscode); + preferences.putBool(NVS_KEY_BAMBU_AUTOSEND_ENABLE, bambuCredentials.autosend_enable); + preferences.putInt(NVS_KEY_BAMBU_AUTOSEND_TIME, bambuCredentials.autosend_time); + preferences.end(); vTaskDelay(100 / portTICK_PERIOD_MS); if (!setupMqtt()) return false; @@ -95,35 +87,36 @@ bool saveBambuCredentials(const String& ip, const String& serialnr, const String } bool loadBambuCredentials() { - JsonDocument doc; - if (loadJsonValue("/bambu_credentials.json", doc) && doc["bambu_ip"].is()) { - // Temporäre Strings für die Werte - String ip = doc["bambu_ip"].as(); - String code = doc["bambu_accesscode"].as(); - String serial = doc["bambu_serialnr"].as(); + Preferences preferences; + preferences.begin(NVS_NAMESPACE_BAMBU, true); + String ip = preferences.getString(NVS_KEY_BAMBU_IP, ""); + String serial = preferences.getString(NVS_KEY_BAMBU_SERIAL, ""); + String code = preferences.getString(NVS_KEY_BAMBU_ACCESSCODE, ""); + bool autosendEnable = preferences.getBool(NVS_KEY_BAMBU_AUTOSEND_ENABLE, false); + int autosendTime = preferences.getInt(NVS_KEY_BAMBU_AUTOSEND_TIME, BAMBU_DEFAULT_AUTOSEND_TIME); + preferences.end(); - g_bambu_ip = ip; - g_bambu_accesscode = code; - g_bambu_serialnr = serial; + if(ip != ""){ + bambuCredentials.ip = ip.c_str(); + bambuCredentials.serial = serial.c_str(); + bambuCredentials.accesscode = code.c_str(); + bambuCredentials.autosend_enable = autosendEnable; + bambuCredentials.autosend_time = autosendTime; - if (doc["autoSendToBambu"].is()) autoSendToBambu = doc["autoSendToBambu"].as(); - if (doc["autoSendTime"].is()) autoSetBambuAmsCounter = doc["autoSendTime"].as(); + Serial.println("credentials loaded loadCredentials!"); + Serial.println(bambuCredentials.ip); + Serial.println(bambuCredentials.serial); + Serial.println(bambuCredentials.accesscode); + Serial.println(String(bambuCredentials.autosend_enable)); + Serial.println(String(bambuCredentials.autosend_time)); - ip.trim(); - code.trim(); - serial.trim(); - - // Dynamische Speicherallokation für die globalen Pointer - bambu_ip = g_bambu_ip.c_str(); - bambu_accesscode = g_bambu_accesscode.c_str(); - bambu_serialnr = g_bambu_serialnr.c_str(); - - topic = "device/" + String(bambu_serialnr); - //request_topic = "device/" + String(bambu_serialnr) + "/request"; return true; } - Serial.println("Keine gültigen Bambu-Credentials gefunden."); - return false; + else + { + Serial.println("Keine gültigen Bambu-Credentials gefunden."); + return false; + } } struct FilamentResult { @@ -226,7 +219,7 @@ FilamentResult findFilamentIdx(String brand, String type) { bool sendMqttMessage(const String& payload) { Serial.println("Sending MQTT message"); Serial.println(payload); - if (client.publish((String(topic) + "/request").c_str(), payload.c_str())) + if (client.publish(("device/"+bambuCredentials.serial+"/request").c_str(), payload.c_str())) { return true; } @@ -499,7 +492,7 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) { trayObj["cali_idx"].as() != ams_data[storedIndex].trays[j].cali_idx) { hasChanges = true; - if (autoSendToBambu && autoSetToBambuSpoolId > 0 && hasChanges) + if (bambuCredentials.autosend_enable && autoSetToBambuSpoolId > 0 && hasChanges) { autoSetSpool(autoSetToBambuSpoolId, ams_data[storedIndex].trays[j].id); } @@ -523,7 +516,7 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) { (vtTray["tray_type"].as() != "" && vtTray["cali_idx"].as() != ams_data[i].trays[0].cali_idx)) { hasChanges = true; - if (autoSendToBambu && autoSetToBambuSpoolId > 0 && hasChanges) + if (bambuCredentials.autosend_enable && autoSetToBambuSpoolId > 0 && hasChanges) { autoSetSpool(autoSetToBambuSpoolId, 254); } @@ -580,11 +573,11 @@ void reconnect() { oledShowTopRow(); // Attempt to connect - String clientId = String(bambu_serialnr) + "_" + String(random(0, 100)); - if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode)) { + String clientId = bambuCredentials.serial + "_" + String(random(0, 100)); + if (client.connect(clientId.c_str(), BAMBU_USERNAME, bambuCredentials.accesscode.c_str())) { Serial.println("MQTT re/connected"); - client.subscribe((String(topic) + "/report").c_str()); + client.subscribe(("device/"+bambuCredentials.serial+"/report").c_str()); bambu_connected = true; oledShowTopRow(); } else { @@ -630,28 +623,23 @@ void mqtt_loop(void * parameter) { bool setupMqtt() { // Wenn Bambu Daten vorhanden - bool success = loadBambuCredentials(); + //bool success = loadBambuCredentials(); - if (!success) { - bambuDisabled = true; - return false; - } - - if (success && bambu_ip != "" && bambu_accesscode != "" && bambu_serialnr != "") + if (bambuCredentials.ip != "" && bambuCredentials.accesscode != "" && bambuCredentials.serial != "") { bambuDisabled = false; sslClient.setCACert(root_ca); sslClient.setInsecure(); - client.setServer(bambu_ip, 8883); + client.setServer(bambuCredentials.ip.c_str(), 8883); // Verbinden mit dem MQTT-Server bool connected = true; - String clientId = String(bambu_serialnr) + "_" + String(random(0, 100)); - if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode)) + String clientId = String(bambuCredentials.serial) + "_" + String(random(0, 100)); + if (client.connect(bambuCredentials.ip.c_str(), BAMBU_USERNAME, bambuCredentials.accesscode.c_str())) { client.setCallback(mqtt_callback); client.setBufferSize(15488); - client.subscribe((String(topic) + "/report").c_str()); + client.subscribe(("device/"+bambuCredentials.serial+"/report").c_str()); Serial.println("MQTT-Client initialisiert"); oledShowMessage("Bambu Connected"); diff --git a/src/bambu.h b/src/bambu.h index aef6c3b..bf8836e 100644 --- a/src/bambu.h +++ b/src/bambu.h @@ -16,6 +16,14 @@ struct TrayData { String cali_idx; }; +struct BambuCredentials { + String ip; + String serial; + String accesscode; + bool autosend_enable; + int autosend_time; +}; + #define MAX_AMS 17 // 16 normale AMS + 1 externe Spule extern String amsJsonData; // Für die vorbereiteten JSON-Daten @@ -28,9 +36,10 @@ extern bool bambu_connected; extern int ams_count; extern AMSData ams_data[MAX_AMS]; -extern bool autoSendToBambu; +//extern bool autoSendToBambu; extern int autoSetToBambuSpoolId; extern bool bambuDisabled; +extern BambuCredentials bambuCredentials; bool removeBambuCredentials(); bool loadBambuCredentials(); diff --git a/src/config.cpp b/src/config.cpp index dd601c6..644177e 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -46,8 +46,6 @@ const uint8_t webserverPort = 80; const char* apiUrl = "/api/v1"; // ***** API -// ***** Bambu Auto Set Spool -uint8_t autoSetBambuAmsCounter = 60; // ***** Bambu Auto Set Spool // ***** Task Prios diff --git a/src/config.h b/src/config.h index dd6cb20..ecccd51 100644 --- a/src/config.h +++ b/src/config.h @@ -3,6 +3,29 @@ #include +#define BAMBU_DEFAULT_AUTOSEND_TIME 60 + + +#define NVS_NAMESPACE_API "api" +#define NVS_KEY_SPOOLMAN_URL "spoolmanUrl" +#define NVS_KEY_OCTOPRINT_ENABLED "octoEnabled" +#define NVS_KEY_OCTOPRINT_URL "octoUrl" +#define NVS_KEY_OCTOPRINT_TOKEN "octoToken" + +#define NVS_NAMESPACE_BAMBU "bambu" +#define NVS_KEY_BAMBU_IP "bambuIp" +#define NVS_KEY_BAMBU_ACCESSCODE "bambuCode" +#define NVS_KEY_BAMBU_SERIAL "bambuSerial" +#define NVS_KEY_BAMBU_AUTOSEND_ENABLE "autosendEnable" +#define NVS_KEY_BAMBU_AUTOSEND_TIME "autosendTime" + +#define NVS_NAMESPACE_SCALE "scale" +#define NVS_KEY_CALIBRATION "cal_value" +#define NVS_KEY_AUTOTARE "auto_tare" + +#define BAMBU_USERNAME "bblp" + + extern const uint8_t PN532_IRQ; extern const uint8_t PN532_RESET; @@ -25,7 +48,7 @@ extern const uint8_t OLED_DATA_END; extern const char* apiUrl; extern const uint8_t webserverPort; -extern uint8_t autoSetBambuAmsCounter; + extern const unsigned char wifi_on[]; extern const unsigned char wifi_off[]; diff --git a/src/main.cpp b/src/main.cpp index 01763d4..76de6f4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -119,7 +119,7 @@ void loop() { } // Wenn Bambu auto set Spool aktiv - if (autoSendToBambu && autoSetToBambuSpoolId > 0) + if (bambuCredentials.autosend_enable && autoSetToBambuSpoolId > 0) { if (!bambuDisabled && !bambu_connected) { @@ -131,10 +131,10 @@ void loop() { if (nfcReaderState == NFC_IDLE) { lastAutoSetBambuAmsTime = currentMillis; - oledShowMessage("Auto Set " + String(autoSetBambuAmsCounter - autoAmsCounter) + "s"); + oledShowMessage("Auto Set " + String(bambuCredentials.autosend_time - autoAmsCounter) + "s"); autoAmsCounter++; - if (autoAmsCounter >= autoSetBambuAmsCounter) + if (autoAmsCounter >= bambuCredentials.autosend_time) { autoSetToBambuSpoolId = 0; autoAmsCounter = 0; @@ -162,7 +162,7 @@ void loop() { // Ausgabe der Waage auf Display if(pauseMainTask == 0) { - if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == NFC_IDLE && (!autoSendToBambu || autoSetToBambuSpoolId == 0))) + if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == NFC_IDLE && (!bambuCredentials.autosend_enable || autoSetToBambuSpoolId == 0))) { (weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight); } diff --git a/src/nfc.cpp b/src/nfc.cpp index ea10267..83bfe7c 100644 --- a/src/nfc.cpp +++ b/src/nfc.cpp @@ -7,6 +7,7 @@ #include "api.h" #include "esp_task_wdt.h" #include "scale.h" +#include "bambu.h" //Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS); Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); @@ -447,7 +448,7 @@ void scanRfidTask(void * parameter) { //uidString = ""; nfcJsonData = ""; Serial.println("Tag entfernt"); - if (!autoSendToBambu) oledShowWeight(weight); + if (!bambuCredentials.autosend_enable) oledShowWeight(weight); } // aktualisieren der Website wenn sich der Status ändert diff --git a/src/scale.cpp b/src/scale.cpp index 83edeeb..8172d9f 100644 --- a/src/scale.cpp +++ b/src/scale.cpp @@ -18,11 +18,6 @@ uint8_t scale_tare_counter = 0; bool scaleTareRequest = false; uint8_t pauseMainTask = 0; uint8_t scaleCalibrated = 1; - -Preferences preferences; -const char* NVS_NAMESPACE = "scale"; -const char* NVS_KEY_CALIBRATION = "cal_value"; -const char* NVS_KEY_AUTOTARE = "auto_tare"; bool autoTare = true; // ##### Funktionen für Waage ##### @@ -32,7 +27,8 @@ uint8_t setAutoTare(bool autoTareValue) { autoTare = autoTareValue; // Speichern mit NVS - preferences.begin(NVS_NAMESPACE, false); // false = readwrite + Preferences preferences; + preferences.begin(NVS_NAMESPACE_SCALE, false); // false = readwrite preferences.putBool(NVS_KEY_AUTOTARE, autoTare); preferences.end(); @@ -90,7 +86,8 @@ void start_scale(bool touchSensorConnected) { float calibrationValue; // NVS lesen - preferences.begin(NVS_NAMESPACE, true); // true = readonly + Preferences preferences; + preferences.begin(NVS_NAMESPACE_SCALE, true); // true = readonly calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue); // auto Tare @@ -197,12 +194,13 @@ uint8_t calibrate_scale() { Serial.println(newCalibrationValue); // Speichern mit NVS - preferences.begin(NVS_NAMESPACE, false); // false = readwrite + Preferences preferences; + preferences.begin(NVS_NAMESPACE_SCALE, false); // false = readwrite preferences.putFloat(NVS_KEY_CALIBRATION, newCalibrationValue); preferences.end(); // Verifizieren - preferences.begin(NVS_NAMESPACE, true); + preferences.begin(NVS_NAMESPACE_SCALE, true); float verifyValue = preferences.getFloat(NVS_KEY_CALIBRATION, 0); preferences.end(); diff --git a/src/website.cpp b/src/website.cpp index 0ff02db..d554235 100644 --- a/src/website.cpp +++ b/src/website.cpp @@ -10,6 +10,7 @@ #include #include "display.h" #include "ota.h" +#include "config.h" #ifndef VERSION #define VERSION "1.1.0" @@ -195,6 +196,9 @@ void setupWebserver(AsyncWebServer &server) { Serial.print("Geladene Spoolman-URL: "); Serial.println(spoolmanUrl); + // Load Bamb credentials: + loadBambuCredentials(); + // Route für about server.on("/about", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("Anfrage für /about erhalten"); @@ -254,31 +258,11 @@ void setupWebserver(AsyncWebServer &server) { html.replace("{{spoolmanOctoUrl}}", (octoUrl != "") ? octoUrl : ""); html.replace("{{spoolmanOctoToken}}", (octoToken != "") ? octoToken : ""); - JsonDocument doc; - if (loadJsonValue("/bambu_credentials.json", doc) && doc["bambu_ip"].is()) - { - String bambuIp = doc["bambu_ip"].as(); - String bambuSerial = doc["bambu_serialnr"].as(); - String bambuCode = doc["bambu_accesscode"].as(); - autoSendToBambu = doc["autoSendToBambu"].as(); - bambuIp.trim(); - bambuSerial.trim(); - bambuCode.trim(); - - html.replace("{{bambuIp}}", bambuIp ? bambuIp : ""); - html.replace("{{bambuSerial}}", bambuSerial ? bambuSerial : ""); - html.replace("{{bambuCode}}", bambuCode ? bambuCode : ""); - html.replace("{{autoSendToBambu}}", autoSendToBambu ? "checked" : ""); - html.replace("{{autoSendTime}}", String(autoSetBambuAmsCounter)); - } - else - { - html.replace("{{bambuIp}}", ""); - html.replace("{{bambuSerial}}", ""); - html.replace("{{bambuCode}}", ""); - html.replace("{{autoSendToBambu}}", ""); - html.replace("{{autoSendTime}}", String(autoSetBambuAmsCounter)); - } + html.replace("{{bambuIp}}", bambuCredentials.ip); + html.replace("{{bambuSerial}}", bambuCredentials.serial); + html.replace("{{bambuCode}}", bambuCredentials.accesscode ? bambuCredentials.accesscode : ""); + html.replace("{{autoSendToBambu}}", bambuCredentials.autosend_enable ? "checked" : ""); + html.replace("{{autoSendTime}}", (bambuCredentials.autosend_time != 0) ? String(bambuCredentials.autosend_time) : String(BAMBU_DEFAULT_AUTOSEND_TIME)); request->send(200, "text/html", html); });