Merge pull request #42 from janecker/configuration_nvs_storage
Changes configuration storage of spoolman and bambu values
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -5,4 +5,4 @@
 | 
			
		||||
.vscode/ipch
 | 
			
		||||
.vscode/extensions.json
 | 
			
		||||
.vscode/settings.json
 | 
			
		||||
data
 | 
			
		||||
data
 | 
			
		||||
 
 | 
			
		||||
@@ -146,20 +146,20 @@
 | 
			
		||||
 | 
			
		||||
        <div class="card">
 | 
			
		||||
            <div class="card-body">
 | 
			
		||||
                <h5 class="card-title">Set URL/IP to your Spoolman-Instanz</h5>
 | 
			
		||||
                <input type="text" id="spoolmanUrl" placeholder="http://ip-or-url-of-your-spoolman-instanz:port">
 | 
			
		||||
                <h5 class="card-title">If you want to enable sending Spool to Spoolman Octoprint Plugin:</h5>
 | 
			
		||||
                <h5 class="card-title">Set URL/IP to your Spoolman instance</h5>
 | 
			
		||||
                <input type="text" id="spoolmanUrl" onkeydown="if(event.keyCode == 13) document.getElementById('btnSaveSpoolmanUrl').click()" placeholder="http://ip-or-url-of-your-spoolman-instance:port">
 | 
			
		||||
                <h5 class="card-title">If you want to enable sending the spool to the Spoolman Octoprint plugin:</h5>
 | 
			
		||||
                <p>
 | 
			
		||||
                    <input type="checkbox" id="spoolmanOctoEnabled" {{spoolmanOctoEnabled}} onchange="toggleOctoFields()"> Send to Octo-Plugin
 | 
			
		||||
                </p>
 | 
			
		||||
                <div id="octoFields" style="display: none;">
 | 
			
		||||
                    <p>
 | 
			
		||||
                        <input type="text" id="spoolmanOctoUrl" placeholder="http://ip-or-url-of-your-octoprint-instanz:port" value="{{spoolmanOctoUrl}}">
 | 
			
		||||
                        <input type="text" id="spoolmanOctoUrl" placeholder="http://ip-or-url-of-your-octoprint-instance:port" value="{{spoolmanOctoUrl}}">
 | 
			
		||||
                        <input type="text" id="spoolmanOctoToken" placeholder="Your Octoprint Token" value="{{spoolmanOctoToken}}">
 | 
			
		||||
                    </p>
 | 
			
		||||
                </div>
 | 
			
		||||
                
 | 
			
		||||
                <button onclick="checkSpoolmanInstance()">Save Spoolman URL</button>
 | 
			
		||||
                <button id="btnSaveSpoolmanUrl" onclick="checkSpoolmanInstance()">Save Spoolman URL</button>
 | 
			
		||||
                <p id="statusMessage"></p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
@@ -169,16 +169,16 @@
 | 
			
		||||
                <h5 class="card-title">Bambu Lab Printer Credentials</h5>
 | 
			
		||||
                <div class="bambu-settings">
 | 
			
		||||
                    <div class="input-group">
 | 
			
		||||
                        <label for="bambuIp">Bambu Drucker IP-Adresse:</label>
 | 
			
		||||
                        <label for="bambuIp">Bambu Printer IP Address:</label>
 | 
			
		||||
                        <input type="text" id="bambuIp" placeholder="192.168.1.xxx" value="{{bambuIp}}">
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="input-group">
 | 
			
		||||
                        <label for="bambuSerial">Drucker Seriennummer:</label>
 | 
			
		||||
                        <label for="bambuSerial">Printer Serial Number:</label>
 | 
			
		||||
                        <input type="text" id="bambuSerial" placeholder="BBLXXXXXXXX" value="{{bambuSerial}}">
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="input-group">
 | 
			
		||||
                        <label for="bambuCode">Access Code:</label>
 | 
			
		||||
                        <input type="text" id="bambuCode" placeholder="Access Code vom Drucker" value="{{bambuCode}}">
 | 
			
		||||
                        <input type="text" id="bambuCode" placeholder="Access Code of the printer" value="{{bambuCode}}">
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <hr>
 | 
			
		||||
                    <p>If activated, FilaMan will automatically update the next filled tray with the last scanned and weighed spool.</p>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										49
									
								
								src/api.cpp
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								src/api.cpp
									
									
									
									
									
								
							@@ -2,6 +2,7 @@
 | 
			
		||||
#include <HTTPClient.h>
 | 
			
		||||
#include <ArduinoJson.h>
 | 
			
		||||
#include "commonFS.h"
 | 
			
		||||
#include <Preferences.h>
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
 | 
			
		||||
volatile spoolmanApiStateType spoolmanApiState = API_INIT;
 | 
			
		||||
@@ -583,23 +584,19 @@ 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<String>());
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
    doc.clear();
 | 
			
		||||
@@ -608,21 +605,17 @@ bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octoWh, const
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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>();
 | 
			
		||||
    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.");
 | 
			
		||||
 | 
			
		||||
    doc.clear();
 | 
			
		||||
    return "";
 | 
			
		||||
    preferences.end();
 | 
			
		||||
    return spoolmanUrl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool initSpoolman() {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										148
									
								
								src/bambu.cpp
									
									
									
									
									
								
							
							
						
						
									
										148
									
								
								src/bambu.cpp
									
									
									
									
									
								
							@@ -10,6 +10,7 @@
 | 
			
		||||
#include "esp_task_wdt.h"
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#include "display.h"
 | 
			
		||||
#include <Preferences.h>
 | 
			
		||||
 | 
			
		||||
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<String>()) {
 | 
			
		||||
        // Temporäre Strings für die Werte
 | 
			
		||||
        String ip = doc["bambu_ip"].as<String>();
 | 
			
		||||
        String code = doc["bambu_accesscode"].as<String>();
 | 
			
		||||
        String serial = doc["bambu_serialnr"].as<String>();
 | 
			
		||||
    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<bool>()) autoSendToBambu = doc["autoSendToBambu"].as<bool>();
 | 
			
		||||
        if (doc["autoSendTime"].is<int>()) autoSetBambuAmsCounter = doc["autoSendTime"].as<int>();
 | 
			
		||||
        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<String>() != 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<String>() != "" && vtTray["cali_idx"].as<String>() != 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");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								src/bambu.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								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();
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								src/config.h
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								src/config.h
									
									
									
									
									
								
							@@ -3,6 +3,29 @@
 | 
			
		||||
 | 
			
		||||
#include <Arduino.h>
 | 
			
		||||
 | 
			
		||||
#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[];
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
@@ -454,7 +455,7 @@ void scanRfidTask(void * parameter) {
 | 
			
		||||
        nfcJsonData = "";
 | 
			
		||||
        activeSpoolId = "";
 | 
			
		||||
        Serial.println("Tag entfernt");
 | 
			
		||||
        if (!autoSendToBambu) oledShowWeight(weight);
 | 
			
		||||
        if (!bambuCredentials.autosend_enable) oledShowWeight(weight);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // aktualisieren der Website wenn sich der Status ändert
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,8 +10,10 @@
 | 
			
		||||
#include <Update.h>
 | 
			
		||||
#include "display.h"
 | 
			
		||||
#include "ota.h"
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef VERSION
 | 
			
		||||
  #define VERSION "1.1.0"
 | 
			
		||||
#endif
 | 
			
		||||
@@ -203,6 +205,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");
 | 
			
		||||
@@ -262,31 +267,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>()) 
 | 
			
		||||
        {
 | 
			
		||||
            String bambuIp = doc["bambu_ip"].as<String>();
 | 
			
		||||
            String bambuSerial = doc["bambu_serialnr"].as<String>();
 | 
			
		||||
            String bambuCode = doc["bambu_accesscode"].as<String>();
 | 
			
		||||
            autoSendToBambu = doc["autoSendToBambu"].as<bool>();
 | 
			
		||||
            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));
 | 
			
		||||
 | 
			
		||||
        doc.clear();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user