Forum: Haus & Smart Home MQTT Arduino Lib, subscribe / alte Werte anfordern / persitent Value


von Nils P. (ert)


Lesenswert?

Hallo zusammen,

ich baue mir grade einen Arduino-Sketch zusammen und brauche einen 
Denkanstoß. Bitte nicht gleich alle über Arduino herziehen :D

Grundlage ist die MQTT Library 
https://pubsubclient.knolleary.net/index.html und 
https://github.com/mertenats/open-home-automation/blob/master/ha_mqtt_rgb_light/ha_mqtt_rgb_light.ino

Ziel ist ein MQTT-Client bei einem H801 Ledtreiber. Dieser läuft auch 
soweit ganz gut mit FHEM und Mosquitto.

Jetzt will aber, dass bei einem Neustart der ESP (auf dem H801) mit den 
alten Werten vom MQTT-Broker gefüttert wird... Dort liegen ja die 
vorherigen Werte. Seht ihr die Möglichkeit mit der MQTT Library einen 
Wert abzufragen. Man kann zwar Topics subscriben, aber der Broker sendet 
ja nicht einfach so den alten Status. Der Client würde den Wert ja 
updaten.

Könnt ihr mir auf die Sprünge helfen?

Besten Dank
G Ert

von Johannes S. (Gast)


Lesenswert?

Der Broker speichert keine alten Werte, das muss man selber machen, z.B. 
über eine Datenbank.

von Michael U. (amiga)


Lesenswert?

Hallo,

dafür gibt es bei MQTT die Retained Messages.
Er speicher aber eben nur die Message und schickt sie raus, wenn sich 
ein Client anmeldet, der diesen topic abboniert hat.

Das Flag muß aber der Sender der Message, hier also FHEM, setzen
Sinn ist, daß der Sender entscheiden soll, ob ein Client eine vielleicht 
schon Stunden alte Message beim Anmelden am Broker bekommen soll oder 
nicht.

Ich send z.B. die Zimmertemperatur alle 3 Minuten mit reatsin-Flag. Der 
Client ist eine Anzeige, die beim Einschalten oder Neustart gleich die 
Temperatur anzeigt und nicht erst max. 3 Minuten später.
Es gibt aber eben auch Fälle, wo das nicht passieren soll, sondern der 
Client eben"keine Ahnung" anzeigt bis er eine Message bekonnt.
Der Client kann nicht feststellen, ob es eine alte oder aktuelle Message 
ist, die da nach dem Start ankommt. Das ist beim MQTT-Protokoll nicht 
vorgesehen.

Gruß aus Berlin
Michael

: Bearbeitet durch User
von Nils P. (ert)


Lesenswert?

Besten Dank an alle, habs mit Retain hinbekommen.

Bisl Tricky das zusammensetzen: anbei ein paar Codeschnipsel
1
//Retain topic:
2
int len = strlen(LIGHT_ON);
3
4
//client.publish(MQTT_LIGHT_RGB_STATE_TOPIC, buf, len, true);
5
client.publish(MQTT_LIGHT_RGB_STATE_TOPIC,(uint8_t*) LIGHT_ON,len ,true);
6
7
//Abrufen bei Neustart ohne publish
8
client.subscribe(MQTT_LIGHT_RGB_STATE_TOPIC);

Greez Ert

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.