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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Nils P. (ert)


Bewertung
0 lesenswert
nicht 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. (jojos)


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

von Michael U. (amiga)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.