This commit is contained in:
2024-12-28 18:51:50 +01:00
parent f55d7c1eff
commit 134fbd5ce0
3 changed files with 100 additions and 67 deletions

View File

@@ -45,26 +45,56 @@ const char* passwordList[] = {
// ################## Tasmota Einstellungen ################### // ################## Tasmota Einstellungen ###################
// ===================== Energiemessung =======================
// Zwischenstecker am Balkonkraftwerk // 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"; String tasmota_plug_json_prefix_power = "Power";
// SmartMeterReader // SmartMeterReader
String tasmota_smr_ip = "192.168.178.236"; String tasmota_smr_ip = "192.168.178.236";
String tasmota_smr_json_prefix_power = "Power"; 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 // Anzahl Nachkommastellen bei den ausgelesenen Tasmota Werten
// -1 = Alle / 0 = Keine / 2 = 2 Nachkommastellen // -1 = Alle / 0 = Keine / 2 = 2 Nachkommastellen
int tasmota_decimalplaces = 2; int tasmota_decimalplaces = 2;
// ################# Allgemeine Einstellungen ################# // ################# Allgemeine Einstellungen #################
// Aktualisierungsrate im Bildschirm aktuelle Leistung (in Millisekunden) // 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) // Aktualisierungsrate in den Bildschirmen der Verbrauchsdaten (in Millisekunden)
unsigned long refreshrate_consumption = 15000; unsigned long refreshrate_consumption = 15000;

View File

@@ -1,9 +1,7 @@
#include <ESP8266WiFi.h> #include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h> #include <ESP8266HTTPClient.h>
#include <LiquidCrystal_I2C.h> #include <LiquidCrystal_I2C.h>
//#include <settings.h> #include <settings.h>
#include <settings-my-ignore.h>
#define BUTTON_PIN D3 // GPIO-Pin verbunden mit Taster (D3 entspricht GPIO0) #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 lastButtonState = HIGH; // Letzter Zustand des Buttons
int currentButtonState; int currentButtonState;
// Array für die Werte // Array für die Werte der Tasmota Geräte
String tasmota_smr_ip_values[6]; String tasmota_smr_ip_values[6] = {"?", "?", "?", "?", "?", "?"};
String tasmota_plug_ip_values[6]; String tasmota_plug_ip_values[6] = {"?", "?", "?", "?", "?", "?"};
String tasmota_smr_ip_values_old[6]; String tasmota_smr_ip_values_old[6];
String tasmota_plug_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() { void connectToWiFi() {
Serial.println("WLAN Verbindungsaufbau zu: " + String(ssidList[current_ap])); Serial.println("WLAN Verbindungsaufbau zu: " + String(ssidList[current_ap]));
Serial.println("Passwort: " + String(passwordList[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.setCursor(10, 0);
lcd.print(" "); lcd.print(" ");
@@ -238,141 +232,152 @@ void update_power_values() {
tasmota_plug_ip_values_old[0] = tasmota_plug_ip_values[0]; 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() { void handleButtonPress() {
// Button auslesen
currentButtonState = digitalRead(BUTTON_PIN); currentButtonState = digitalRead(BUTTON_PIN);
// Knopfdruck erkannt
if (currentButtonState == LOW && lastButtonState == HIGH) { if (currentButtonState == LOW && lastButtonState == HIGH) {
lcd.clear(); // Modus Variable umstellen
currentMode = (currentMode + 1) % 5; currentMode = (currentMode + 1) % 5;
Serial.print("Neuer Modus: "); // Aktualisierungsrate wählen
Serial.println(modeNames[currentMode]);
if (currentMode == 0) { if (currentMode == 0) {
refreshRate = refreshrate_power; refreshRate = refreshrate_power;
} else { } else {
refreshRate = refreshrate_consumption; refreshRate = refreshrate_consumption;
} }
// Ausgabe im seriellen Monitor
Serial.print("Neuer Modus: ");
Serial.println(modeNames[currentMode]);
Serial.print("Aktualisierungsrate: "); Serial.print("Aktualisierungsrate: ");
Serial.println(refreshRate); Serial.println(refreshRate);
// isModeChanged Variable setzen
isModeChanged = true; isModeChanged = true;
// Prellschutz
delay(200); delay(200);
// LCD clear
lcd.clear();
} }
lastButtonState = currentButtonState; lastButtonState = currentButtonState;
} }
void setup() { void setup() {
// Modus Knopf
pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(BUTTON_PIN, INPUT_PULLUP);
// Seriellen Monitor starten
Serial.begin(115200); Serial.begin(115200);
delay(1000); delay(1000);
// LCD initialisieren
lcd.init(); lcd.init();
lcd.backlight(); lcd.backlight();
lcd.createChar(0, customChar_wlan); lcd.createChar(0, customChar_wlan);
//WLAN Hostname und Modus definieren
WiFi.setHostname(hostname); WiFi.setHostname(hostname);
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
lcd.setCursor(0, 0);
_lcd_display_text(0, "Bereit", "center");
} }
void loop() { void loop() {
// Modus Button Handle
handleButtonPress(); handleButtonPress();
// WLAN Verbindung erneuern falls nötig
if (WiFi.status() != WL_CONNECTED && !reconnecting) { if (WiFi.status() != WL_CONNECTED && !reconnecting) {
reconnecting = true; reconnecting = true;
connectToWiFi(); connectToWiFi();
} }
// Wenn die Refresh Rate erreicht ist die Tasmota Geräte wieder abfragen
if (WiFi.status() == WL_CONNECTED && !reconnecting) { if (WiFi.status() == WL_CONNECTED && !reconnecting) {
if (millis() - lastUpdateTime >= refreshRate) { if (millis() - lastUpdateTime >= refreshRate) {
lastUpdateTime = millis(); 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); 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 (currentMode == 0) {
if (isModeChanged == true) { if (isModeChanged == true) {
_lcd_display_text(0, "Netzbezug:", "left"); update_energie_values();
_lcd_display_text(1, "Erzeugung:", "left");
update_power_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); 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) { switch (currentMode) {
// Energiemeter
case 0: case 0:
if (tasmota_smr_ip_values[1] != tasmota_smr_ip_values_old[1] || isModeChanged == true) { if (tasmota_smr_ip_values[1] != tasmota_smr_ip_values_old[1] || isModeChanged == true) {
isModeChanged = false; isModeChanged = false;
_lcd_display_text(0, "Netzbezug:", "left"); update_energie_values();
_lcd_display_text(1, "Erzeugung:", "left");
update_power_values();
} }
break; break;
// 1.8.0
case 1: case 1:
if (tasmota_smr_ip_values[2] != tasmota_smr_ip_values_old[2] || isModeChanged == true) { if (tasmota_smr_ip_values[2] != tasmota_smr_ip_values_old[2] || isModeChanged == true) {
isModeChanged = false; isModeChanged = false;
_lcd_display_text(0, tasmota_smr_json_prefix_1_8_0_lcd_text.c_str(), "center"); _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; break;
// 1.8.1
case 2: case 2:
if (tasmota_smr_ip_values[3] != tasmota_smr_ip_values_old[3] || isModeChanged == true) { if (tasmota_smr_ip_values[3] != tasmota_smr_ip_values_old[3] || isModeChanged == true) {
isModeChanged = false; isModeChanged = false;
_lcd_display_text(0, tasmota_smr_json_prefix_1_8_1_lcd_text.c_str(), "center"); _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; break;
// 1.8.2
case 3: case 3:
if (tasmota_smr_ip_values[4] != tasmota_smr_ip_values_old[4] || isModeChanged == true) { if (tasmota_smr_ip_values[4] != tasmota_smr_ip_values_old[4] || isModeChanged == true) {
isModeChanged = false; isModeChanged = false;
_lcd_display_text(0, tasmota_smr_json_prefix_1_8_2_lcd_text.c_str(), "center"); _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; break;
// 2.8.0
case 4: case 4:
if (tasmota_smr_ip_values[5] != tasmota_smr_ip_values_old[5] || isModeChanged == true) { if (tasmota_smr_ip_values[5] != tasmota_smr_ip_values_old[5] || isModeChanged == true) {
isModeChanged = false; isModeChanged = false;
_lcd_display_text(0, tasmota_smr_json_prefix_2_8_0_lcd_text.c_str(), "center"); _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; break;
} }

View File

@@ -45,13 +45,13 @@ String tasmota_smr_json_prefix_1_8_0 = "E_in_180";
// ------------- 1.8.1 ------------- // ------------- 1.8.1 -------------
// Überschrift im Display, wenn das 1.8.1 Register angezeigt wird (LCD Display Zeile 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) // 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"; String tasmota_smr_json_prefix_1_8_1 = "E_in_181";
// ------------- 1.8.2 ------------- // ------------- 1.8.2 -------------
// Überschrift im Display, wenn das 1.8.2 Register angezeigt wird (LCD Display Zeile 1) // Ü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) // 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"; String tasmota_smr_json_prefix_1_8_2 = "E_in_182";
@@ -80,6 +80,4 @@ unsigned long refreshrate_consumption = 15000;
// ############################################################ // ############################################################
#endif // SETTINGS_H #endif // SETTINGS_H