NEWS
[gelöst] mqtt Adapter, publish/subscribe schaukeln sich auf
-
Hallo mosquito und mqtt-Adapter-Gurus,
um meine PiFace-Steuerung zu retten, habe ich von dem Raspberry 3 alles entfernt, was nicht direkt mit dem PiFace zu tun hat, also VIS und andere Adapter. Dann habe ich ioBroker mit den höchsten Versionen der benötigten Adapter versorgt, die noch unter node 8.latest laufen.
Alles andere läuft nun auf einem Raspberry Pi4 mit den "latest"-Versionen unter node 12.latest.Über mein PiFace-Rack schalte ich unter anderem meine Bewässerung.
Die Visualisierung dazu läuft nun auf dem Pi4, also müssen die States dorthin, das ist mir mit entsprechender Konfiguration auch gelungen,
der PiFace-Pi published via mqtt als Client die relevanten States: piface.*,javascript.1.watering.garden.*
Auf dem Pi4 habe ich entsprechende subscriptions konfiguriert: piface/#, javascript/1/watering/garden/#
Diese States werden auch schön unter mqtt.0 angelegt und nach Anpassung der View korrekt angezeigt.
Im Automatikmodus sehe ich nun in meiner Visualisierung ziemlich zeitnah, wie die Kreise durchgeschaltet werden, eigentlich alles schön.Über die Visualisierung kann ich auch manuell Bewässerungskreise für eine ausgewählte Zeit einschalten.
Die geänderten Werte werden unter mqtt.0.javascript.1.watering.garden.... allem Anschein nach nicht automatisch published, also konfigurieren: javascript.1.watering.garden.circuit.*.duration_set, javascript.1.watering.garden.circuit.action
Gut, jetzt sind die Änderungen in mqtt.fx zu sehen.
Sie sind damit aber noch immer nicht auf dem PiFace-Pi! Ja, jetzt fehlt da die subscription: javascript/1/watering/garden/circuit/*/duration_set, javascript/1/watering/garden/circuit/actionSo, nun die Dauer setzen und die Aktion auslösen, bin gespannt, wäre jetzt noch ein schöner Abschluss für den langen Abend.
Hm, die Vis hat Verbindungsprobleme, Log auch, gleiches beim PiFace-Pi, mqtt.fx zeigt eine Flut von Nachrichten, die action auf den beiden Pi's spielen ping pong und ich schaffe es gerade noch via ssh den mqtt.0 auf dem Pi4 zu stoppen.
Aber warum schaukeln die Messages sich hoch?gedachter Ablauf: Auf dem Pi4 wird via der View der Action-Code in den State geschrieben, mqtt.0 sendet die Änderung an den Broker, der mqtt-Client auf dem PiFace-Pi holt sich den geänderten Wert und schreibt ihn nach javascript.1.watering.garden.circuit.action. Das Bewässerungsskript reagiert via der dort erzeugten subscription auf die Änderung, löst die Aktion aus und setzt den State für action auf 0 zurück.
Dieser Wert wird wieder published und vom Pi4 via der subscription eingelesen und alles ist schön in sync.Was läuft schief?
Auf dem Pi4 ist im Log zu sehen, dass die 0 ankommt, es wird aber sofort wieder der action-Code (Zahl > 0) zurückgeschrieben. Warum?
Das produziert dann wieder den unter gedachter Ablauf beschriebenen Ablauf und so schaukelt sich das immer weiter hoch?Ursache?
Das Setzen der Werte erfolgt via der View und da wird nach meiner Kenntnis kein ack==true gesetzt. Wenn ein Skript einen Wert per setState setzt, normalerweise auch nicht. In der mqtt-Konfiguration habe ich "Sende auch Zustände" aktiviert. Sollte doch hier keine Rolle spielen oder?Habe ich in meiner Konfiguration einen Denkfehler? Ist es normal, dass in einer solchen Konfiguration (überschneidene subscriptions und publishs) sich die Änderungen hochschaukeln?
Sollte ich die Änderungen auf einem anderen Weg zum PiFace-Pi senden?Ach ja, das Problem tritt unabhängig davon auf, ob ich den Broker des ioBroker mqtt-Adapters nutze oder den mosquitto.
Wie sind eure Erfahrungen und Tipps?
-
@greyhound Zeig doch mal die Einstellungen von der MQTT-Instanz.
-
@greyhound
ich nutze schon seit ca. 2 Jahren dieses Projekt ohne Probleme und Ausfall.
Hier meine MQTT-Server-Einstellungen:
.
Wichtig ist das nur das mqtt.0.* in der Maske steht, sonst hängt der Server von der Datenflut. -
Danke für eure Rückmeldungen.
Hier meine Einstellungen:
PiFace-Pi-Client
"Subscribe patterns" waren konfiguriert auf: javascript/1/watering/garden/circuit//duration_set, javascript/1/watering/garden/circuit/action
Wenn ich diesen Parameter leer lasse, scheint das wie # zu wirken, auf einem anderen ioBrokersystem ist mir da viel überschrieben worden.
publish: javascript.1.scriptEnabled.,javascript.0.scriptEnabled.,piface.,javascript.1.watering.garden.,javascript.0.lights.,javascript.0.alarm.*Pi4
subscribe: javascript/1/scriptEnabled/#,piface/#,javascript/1/watering/garden/#,javascript/0/lights.#,javascript/0/alarm/#,javascript/0/scriptEnabled/#
publish war vor dem crash konfiguriert auf: hm-rpc.0.OEQ0996420.1.STATE,javascript.1.watering.garden.circuit.*.duration_set, javascript.1.watering.garden.circuit.actionPrinzipiell funktioniert es ja in eine Richtung. Aber anscheinend fehlt eine Entkopplung wenn es zum Teil bidirektional arbeiten soll.
Hier
PiFace-Pi sendet alles unter javascript.1.watering.garden.*
Pi4 empfängt alles
Pi4 wird ein Wert unter javascript.1.watering.garden.* geändert und gesendet
PiFace-Pi empfängt die Änderung
PiFace-Pi Skript reagiert und setzt den Datenpunkt auf 0 und sendet den geänderten Wert
Pi4 empfängt den Wert 0 und sendet nun den vorherigen Wert erneut, warum?
Nach meinem Verständnis wäre die Kette hier zu Ende.
Hat das was mit dem retain-flag zu tun? -
@greyhound Bei mir sieht es so aus:
Bislang keine Probleme. -
@MCU
D. h., du published alle states deiner Installation. Wie groß ist deine Installation?
Hast du 2 ioBroker-Installationen die sich gegenseitig aktualisieren? -
@greyhound Nutze es nur für einige ESP8266 und ESP32 Versuche. Da kommt nicht soviel zusammen.
-
Nach vielen Experimenten und Stunden musste ich leider einsehen, dass das so nichts wird und einen eigenen Adapter geschrieben. siehe iobmqtt - ioBroker Message Fornat Adapter