Ne, war es nicht. Es ging eher um den Teil, wie kann ich Topics abonieren und diese Werte in einer Variable speichern. Den Punkt habe ich nach weiterem googlen und probieren mittlerweile hin bekommen. Jetzt muss ich gucken, wie ich das noch schön Formatieren kann. Vor allem geht es um den zweiten Topic. Der ist in der Regel zwischen 600 und 0.01 (hier Watt). Leider wird das recht "einfach" veröffentlicht.
Aber hier erstmal mein Code, das macht das ganze einfacher. Noch Ohne LC Display.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* SSID = "SSID";
const char* PSK = "Streng geheimes Passwort";
const char* MQTT_BROKER = "192.168.178.43";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(MQTT_BROKER, 1883);
client.setCallback(callback);
}
void setup_wifi() {
WiFi.begin(SSID, PSK);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
}
Serial.println(WiFi.localIP());
}
void loop() {
if (!client.connected()) {
while (!client.connected()) {
client.connect("ESP8266Client");
client.subscribe("alias/0/Shellys/Flaechenheizung/LEISTUNG_AKTUELL");
client.subscribe("alias/0/Shellys/Flaechenheizung/POWER");
delay(100);
}
}
client.loop();
}
void callback(char* topic, byte* payload, unsigned int length) {
String msg;
if(strcmp(topic, "alias/0/Shellys/Flaechenheizung/LEISTUNG_AKTUELL") == 0) {
for (byte i = 0; i < length; i++) {
char tmp = char(payload[i]);
msg += tmp;
}
} else if(strcmp(topic, "alias/0/Shellys/Flaechenheizung/POWER") == 0) {
for (byte i = 0; i < length; i++) {
char tmp = char(payload[i]);
msg += tmp;
}
}
Serial.println(msg);
}
Mit ein wenig streicheln und so bekomme ich jetzt eine Ausgabe für das Topic mit "../LEISTUNG_AKTUELL", den Wert von ".../POWER", hier True und False bekomme ich nur bei Änderung des Wertes, solange sich nichts ändert bleibt die Variable leer. Da werde ich ein "NC" oder so rein packen, wenn noch nichts da ist an Werten.
Zu meiner Ausgabe des Wertes LEISTUNG _AKTUELL, im Moment schwankt der ganz schön hin und her. Daran wird sich nichts ändern. Deshalb wollte ich gucken, dass ich die "Ausgabe" im Display etwas "optimiere", nur ich weiß nicht wie ich das am besten umstellen soll.
Ich denke an sowas in der Art: bei Werten von 0,01 - 9,99 W, werden 2 zusätzliche Leerzeichen hinzugefügt, bei Werten von 10.00 - 99,99 W wird eine zusätzliches Leerzeichen hinzugefügt und ab 100,00 W kommt kein Leerzeichen hinzu. Mein Problem ist weniger die If Abfrage, eher ich bekomme den Wert als Zeichenkette oder auch String und müsste diesen in eine Zahl umwandeln, auf 2 Stellen nach dem Komma runden und dann könnte ich die Abfrage starten und entsprechend lcd.setCursor und lcd.print(" ") die Ausgabe "Formatieren" oder gibt es da was einfaches?
Ich wollte gerne, dass der Dezimalpunkt an der gleichen Stelle bleibt. Finde ich Optisch etwas schöner.
Grob soll es wie folgt auf dem Display aussehen:
Leistung: 0,15 W
Zustand: ON / OFF
Michael