From 134fbd5ce028a801a3148c96a699d6fe2a74a715 Mon Sep 17 00:00:00 2001 From: Thorsten Date: Sat, 28 Dec 2024 18:51:50 +0100 Subject: [PATCH] Comments --- README.md | 42 ++++++++++++++--- src/main.cpp | 119 ++++++++++++++++++++++++++----------------------- src/settings.h | 6 +-- 3 files changed, 100 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 2bb9ca9..e7e5a8a 100644 --- a/README.md +++ b/README.md @@ -45,26 +45,56 @@ const char* passwordList[] = { // ################## Tasmota Einstellungen ################### +// ===================== Energiemessung ======================= + + // Zwischenstecker am Balkonkraftwerk -String tasmota_plug_ip = "192.168.178.222"; +String tasmota_plug_ip = "192.168.178.237"; String tasmota_plug_json_prefix_power = "Power"; // SmartMeterReader String tasmota_smr_ip = "192.168.178.236"; String tasmota_smr_json_prefix_power = "Power"; -String tasmota_smr_json_prefix_1_8_0 = "E_in_180"; -String tasmota_smr_json_prefix_1_8_1 = "E_in_181"; -String tasmota_smr_json_prefix_1_8_2 = "E_in_182"; -String tasmota_smr_json_prefix_2_8_0 = "E_in_280"; + +// ================== Register-Einstellungen ================== + +// ------------- 1.8.0 ------------- +// Überschrift im Display, wenn das 1.8.0 Register angezeigt wird (LCD Display Zeile 1) +String tasmota_smr_json_prefix_1_8_0_lcd_text = "1.8.0 (HT+NT):"; +// Tasmota Script JSON Prefix für das 1.8.0 Register (Wert in Zeile 2) +String tasmota_smr_json_prefix_1_8_0 = "E_in_180"; + +// ------------- 1.8.1 ------------- +// Überschrift im Display, wenn das 1.8.1 Register angezeigt wird (LCD Display Zeile 1) +String tasmota_smr_json_prefix_1_8_1_lcd_text = "1.8.1 (HT):"; +// Tasmota Script JSON Prefix für das 1.8.1 Register (Wert in Zeile 2) +String tasmota_smr_json_prefix_1_8_1 = "E_in_181"; + +// ------------- 1.8.2 ------------- +// Überschrift im Display, wenn das 1.8.2 Register angezeigt wird (LCD Display Zeile 1) +String tasmota_smr_json_prefix_1_8_2_lcd_text = "1.8.2 (NT):"; +// Tasmota Script JSON Prefix für das 1.8.2 Register (Wert in Zeile 2) +String tasmota_smr_json_prefix_1_8_2 = "E_in_182"; + +// ------------- 2.8.0 ------------- + +// Überschrift im Display, wenn das 2.8.0 Register angezeigt wird (LCD Display Zeile 1) +String tasmota_smr_json_prefix_2_8_0_lcd_text = "2.8.0 (Einsp.):"; +// Tasmota Script JSON Prefix für das 2.8.0 Register (Wert in Zeile 2) +String tasmota_smr_json_prefix_2_8_0 = "E_out_280"; + + +// ------- Nachkommastellen -------- // Anzahl Nachkommastellen bei den ausgelesenen Tasmota Werten // -1 = Alle / 0 = Keine / 2 = 2 Nachkommastellen int tasmota_decimalplaces = 2; + // ################# Allgemeine Einstellungen ################# // Aktualisierungsrate im Bildschirm aktuelle Leistung (in Millisekunden) -unsigned long refreshrate_power = 2500; +unsigned long refreshrate_power = 3000; // Aktualisierungsrate in den Bildschirmen der Verbrauchsdaten (in Millisekunden) unsigned long refreshrate_consumption = 15000; diff --git a/src/main.cpp b/src/main.cpp index 7387c5d..d2b208f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,9 +1,7 @@ #include #include #include -//#include -#include - +#include #define BUTTON_PIN D3 // GPIO-Pin verbunden mit Taster (D3 entspricht GPIO0) @@ -18,9 +16,9 @@ bool isModeChanged = false; // Zustand, ob eine Nachricht angezeigt wird int lastButtonState = HIGH; // Letzter Zustand des Buttons int currentButtonState; -// Array für die Werte -String tasmota_smr_ip_values[6]; -String tasmota_plug_ip_values[6]; +// Array für die Werte der Tasmota Geräte +String tasmota_smr_ip_values[6] = {"?", "?", "?", "?", "?", "?"}; +String tasmota_plug_ip_values[6] = {"?", "?", "?", "?", "?", "?"}; String tasmota_smr_ip_values_old[6]; String tasmota_plug_ip_values_old[6]; @@ -165,13 +163,6 @@ void extractTasmotaValues(const String& url, String values[6], int decimalPlaces } } - - - - - - - void connectToWiFi() { Serial.println("WLAN Verbindungsaufbau zu: " + String(ssidList[current_ap])); Serial.println("Passwort: " + String(passwordList[current_ap])); @@ -220,7 +211,10 @@ void connectToWiFi() { } } -void update_power_values() { +void update_energie_values() { + + _lcd_display_text(0, "Netzbezug:", "left"); + _lcd_display_text(1, "Erzeugung:", "left"); lcd.setCursor(10, 0); lcd.print(" "); @@ -238,141 +232,152 @@ void update_power_values() { tasmota_plug_ip_values_old[0] = tasmota_plug_ip_values[0]; } -void update_180_values() { - _lcd_display_text(1, (tasmota_smr_ip_values[2] + "kWh").c_str(), "center"); - tasmota_smr_ip_values_old[2] = tasmota_smr_ip_values[2]; -} - -void update_181_values() { - _lcd_display_text(1, (tasmota_smr_ip_values[3] + "kWh").c_str(), "center"); - tasmota_smr_ip_values_old[3] = tasmota_smr_ip_values[3]; -} - -void update_182_values() { - _lcd_display_text(1, (tasmota_smr_ip_values[4] + "kWh").c_str(), "center"); - tasmota_smr_ip_values_old[4] = tasmota_smr_ip_values[4]; -} - -void update_280_values() { - _lcd_display_text(1, (tasmota_smr_ip_values[5] + "kWh").c_str(), "center"); - tasmota_smr_ip_values_old[5] = tasmota_smr_ip_values[5]; -} - void handleButtonPress() { + // Button auslesen currentButtonState = digitalRead(BUTTON_PIN); + // Knopfdruck erkannt if (currentButtonState == LOW && lastButtonState == HIGH) { - lcd.clear(); - + // Modus Variable umstellen currentMode = (currentMode + 1) % 5; - Serial.print("Neuer Modus: "); - Serial.println(modeNames[currentMode]); - + // Aktualisierungsrate wählen if (currentMode == 0) { refreshRate = refreshrate_power; } else { refreshRate = refreshrate_consumption; } + // Ausgabe im seriellen Monitor + Serial.print("Neuer Modus: "); + Serial.println(modeNames[currentMode]); Serial.print("Aktualisierungsrate: "); Serial.println(refreshRate); + // isModeChanged Variable setzen isModeChanged = true; + // Prellschutz delay(200); + + // LCD clear + lcd.clear(); + } lastButtonState = currentButtonState; } void setup() { + + // Modus Knopf pinMode(BUTTON_PIN, INPUT_PULLUP); + // Seriellen Monitor starten Serial.begin(115200); delay(1000); + // LCD initialisieren lcd.init(); lcd.backlight(); lcd.createChar(0, customChar_wlan); + //WLAN Hostname und Modus definieren WiFi.setHostname(hostname); WiFi.mode(WIFI_STA); - lcd.setCursor(0, 0); - _lcd_display_text(0, "Bereit", "center"); - - - - } void loop() { + // Modus Button Handle handleButtonPress(); + // WLAN Verbindung erneuern falls nötig if (WiFi.status() != WL_CONNECTED && !reconnecting) { reconnecting = true; connectToWiFi(); } - + // Wenn die Refresh Rate erreicht ist die Tasmota Geräte wieder abfragen if (WiFi.status() == WL_CONNECTED && !reconnecting) { if (millis() - lastUpdateTime >= refreshRate) { lastUpdateTime = millis(); + // Falls Modus Energiemeter aktiv ist vor dem aktualiesieren einmal die alten Werte im Display anzeigen. + // Sollte das Tasmota Gerät länger nicht antworten und gerade der Modus gewechselt wurde bliebe das Display sonst + if (currentMode == 0) { + update_energie_values(); + } + extractTasmotaValues("http://" + tasmota_smr_ip + "/cm?cmnd=Status%208", tasmota_smr_ip_values, tasmota_decimalplaces); + // Falls Modus Energiemeter aktiv ist vor dem aktualiesieren einmal die alten Werte im Display anzeigen. + // Sollte das Tasmota Gerät länger nicht antworten und gerade der Modus gewechselt wurde bliebe das Display sonst leer + if (currentMode == 0) { if (isModeChanged == true) { - _lcd_display_text(0, "Netzbezug:", "left"); - _lcd_display_text(1, "Erzeugung:", "left"); - update_power_values(); + update_energie_values(); } + // Nur bei Modus 0 auch noch den Plug abfragen. extractTasmotaValues("http://" + tasmota_plug_ip + "/cm?cmnd=Status%208", tasmota_plug_ip_values, tasmota_decimalplaces); } } } - + // Modi werden nur ausgeführt wenn + // A: der entsprechende Modus gewählt ist und sich der alte Wert vom neuen Wert unterscheidet + // B: der Modus gerade über den Knopf gewechselt wurde switch (currentMode) { + + // Energiemeter case 0: if (tasmota_smr_ip_values[1] != tasmota_smr_ip_values_old[1] || isModeChanged == true) { isModeChanged = false; - _lcd_display_text(0, "Netzbezug:", "left"); - _lcd_display_text(1, "Erzeugung:", "left"); - update_power_values(); + update_energie_values(); } break; + + // 1.8.0 case 1: if (tasmota_smr_ip_values[2] != tasmota_smr_ip_values_old[2] || isModeChanged == true) { isModeChanged = false; _lcd_display_text(0, tasmota_smr_json_prefix_1_8_0_lcd_text.c_str(), "center"); - update_180_values(); + _lcd_display_text(1, (tasmota_smr_ip_values[2] + "kWh").c_str(), "center"); + tasmota_smr_ip_values_old[2] = tasmota_smr_ip_values[2]; } break; + + // 1.8.1 case 2: if (tasmota_smr_ip_values[3] != tasmota_smr_ip_values_old[3] || isModeChanged == true) { isModeChanged = false; _lcd_display_text(0, tasmota_smr_json_prefix_1_8_1_lcd_text.c_str(), "center"); - update_181_values(); + _lcd_display_text(1, (tasmota_smr_ip_values[3] + "kWh").c_str(), "center"); + tasmota_smr_ip_values_old[3] = tasmota_smr_ip_values[3]; } break; + + // 1.8.2 case 3: if (tasmota_smr_ip_values[4] != tasmota_smr_ip_values_old[4] || isModeChanged == true) { isModeChanged = false; _lcd_display_text(0, tasmota_smr_json_prefix_1_8_2_lcd_text.c_str(), "center"); - update_182_values(); + _lcd_display_text(1, (tasmota_smr_ip_values[4] + "kWh").c_str(), "center"); + tasmota_smr_ip_values_old[4] = tasmota_smr_ip_values[4]; } break; + + // 2.8.0 case 4: if (tasmota_smr_ip_values[5] != tasmota_smr_ip_values_old[5] || isModeChanged == true) { isModeChanged = false; _lcd_display_text(0, tasmota_smr_json_prefix_2_8_0_lcd_text.c_str(), "center"); - update_280_values(); + _lcd_display_text(1, (tasmota_smr_ip_values[5] + "kWh").c_str(), "center"); + tasmota_smr_ip_values_old[5] = tasmota_smr_ip_values[5]; } break; } diff --git a/src/settings.h b/src/settings.h index a28be77..18713b5 100644 --- a/src/settings.h +++ b/src/settings.h @@ -45,13 +45,13 @@ String tasmota_smr_json_prefix_1_8_0 = "E_in_180"; // ------------- 1.8.1 ------------- // Überschrift im Display, wenn das 1.8.1 Register angezeigt wird (LCD Display Zeile 1) -String tasmota_smr_json_prefix_1_8_1_lcd_text = "1.8.1 (NT):"; +String tasmota_smr_json_prefix_1_8_1_lcd_text = "1.8.1 (HT):"; // Tasmota Script JSON Prefix für das 1.8.1 Register (Wert in Zeile 2) String tasmota_smr_json_prefix_1_8_1 = "E_in_181"; // ------------- 1.8.2 ------------- // Überschrift im Display, wenn das 1.8.2 Register angezeigt wird (LCD Display Zeile 1) -String tasmota_smr_json_prefix_1_8_2_lcd_text = "1.8.2 (HT):"; +String tasmota_smr_json_prefix_1_8_2_lcd_text = "1.8.2 (NT):"; // Tasmota Script JSON Prefix für das 1.8.2 Register (Wert in Zeile 2) String tasmota_smr_json_prefix_1_8_2 = "E_in_182"; @@ -80,6 +80,4 @@ unsigned long refreshrate_consumption = 15000; // ############################################################ - - #endif // SETTINGS_H \ No newline at end of file