Comments
This commit is contained in:
42
README.md
42
README.md
@@ -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;
|
||||||
|
|||||||
119
src/main.cpp
119
src/main.cpp
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user