NEWS
Objectzustände "aus dem Jenseits" tauchen auf
-
Ausgangspunkt: Nach Crash neu aufgesetzt auf Raspi Bullseye, frische IOBroker Installation, aus BackitUp Sicherung eingespielt. Beide Adapter MQTT und MQTT-Client im Einsatz (schon immer). Mosquitto auf anderem Raspi
Der Effekt:
Ein besonders wichtiger Object-Zustand aus MQTT erscheint immer wieder aus der Vergangenheit, "falsee".
Er kann aber z.B. in MQTT-Server gesetzt werden auf "true" und steht dann auch im Object.
Weglöschen/Neuerzeugen des Objectes hat nicht genützt. Irgendwann kommt er wieder.Anbei alle Zeilen aus den object.jsonl und status.jsonl. (Mehrfach!??)
Ich nehme an, das ist nur ein Indiz. Es gibt bestimmt noch weitere Folgen.
Danke für Hinweise -
@wolfgangd Na vielleicht hat jemand beim setzen im mqtt - die Werte mit dem retain flag gesetzt.
-
@mickym Das ist ein super-Tipp! Darauf bin ich nicht gekommen. Werde ich nachgehen. Danke
-
@wolfgangd sagte in Objectzustände "aus dem Jenseits" tauchen auf:
@mickym Das ist ein super-Tipp! Darauf bin ich nicht gekommen. Werde ich nachgehen. Danke
Ja das Problem ist, dass der mqtt-Adapter generell mit retain Flags nicht umgehen kann.
Ich hab mal ein kleines Video für Dich gemacht, um das zu demonstrieren:
mqtt Retain Fehler mit Mqtt Adapter.mp4
Um das Video etwas zu erläutern:
Retained Nachrichten sind ja permanente Nachrichten, die bleiben erhalten und werden automatisch zur Initialisierung beim Verbindungsaufbau an den Client gesendet.
Mit Node-Red kannst Du das gut nachvollziehen. Wenn ich den Flow neustarte, wird die Verbindung zum mqtt-Broker getrennt und neu aufgebaut. Bei mir ist der mqtt-Broker auch ein mosquitto.
Nun die verschiedenen Szenarien in dem Video, um zu demonstrieren, was passt und was nicht.
- Der mqtt-Adapter im iobroker selbst kennt gar kein Retain - Flag und geht auch damit nicht richtig um.
- Szene:
Ein Boolean "false" wird an das topic test/retain mit "Retain" Flag = "wahr" geschickt. Im Adapter wird der Wert aktualisiert, da mosquitto den Wert "false" schickt.
Dann wird der Flow neu gestartet. (Neuaufbau zum mqtt-Broker)
Wie erwartet wird der Wert "false" beim Wiederaufbau zur Initialisierung von mosquitto gesendet. Perfekt!!! Beim mqtt-Adapter merkt man nicht. - Szene
Ein Boolean "true" wird an das topic test/retain mit "Retain" Flag = "false" geschickt. Im Adapter wird der Wert aktualisiert, da mosquitto den Wert "true" schickt.
Dann wird der Flow neu gestartet. (Neuaufbau zum mqtt-Broker)
Nun wird der Wert "false" beim Wiederaufbau zur Initialisierung von mosquitto gesendet. Der mqtt Adapter bekommt das aber gar nicht mit, weil er keine Retain Nachrichten verarbeitet.
Nun haben wir den Fall, dass im Adapter ein völlig falscher Wert steht, als den der von mosquitto eigentlich gesendet wird (nämlich "false", im Adapter steht aber immer noch "true"). - Szene
Die einzige Möglichkeit eine "retained" Nachricht zu löschen, ist eine leere Nachricht an das topic mit Retain Flag = true zu setzen. Im mqtt-Adapter erscheint (null). Nun kann man den Datenpunkt theoretisch löschen und sollte auch nicht mehr auftauchen.
Wird der Flow neu gestartet. (Neuaufbau zum mqtt-Broker) ....
wird von mosquitto auch wirklich nichts mehr gesendet.
FAZIT: mosquitto sendet Dir Nachrichten, die der mqtt-Adapter leider gar nicht erfasst.
- Szene:
-
@mickym Vielen Dank für die ausführliche Darstellung. Problem gelöst!
-
... ich habe ein ähnliches (?) Problem ...
In den MQTT-Objekten haben sich zwischenzeitlich sehr viele "Leichen" angesammelt. Diese konnte ich über den Papierkorb löschen. Sobald ich den Adapter aber neu starte sind alle wieder da ...
Gibt es irgendwo einen Ordner o.ä. das man alles in "einem Rutsch" endgültig löschen kann ? Oder hilft es den Adapter komplett zu löschen ?
-
@raspiuser Na ja wenn Du ein Haufen retained Nachrichten in mosquitto geschickt hast und im Prinzip nicht mehr weißt welche, dann musst Du halt die mosquitto.db löschen. Über einen Adapter neustart sind sie ja nur da, wenn sie in deinem Broker noch vorhanden sind.
-
@mickym said in Objectzustände "aus dem Jenseits" tauchen auf:
die mosquitto.db löschen.
Kannst Du mir (als LINUX Anfänger) bitte erklären wie ich das sicher mache ?
Oder ist es sicherer den Adapter neu zu installieren ? -
@raspiuser Na wenn Du die Objekte aus dem Adapter löschst - dann kommen die doch wieder - da kannst Du den Adapter 10 mal löschen. Die Objekte sind doch in Deinem Broker. Zum einen musst Du halt mal schauen, warum Du die mit dem retained flag abgespeichert hast und woher das kommt. Ansonsten wenn es nicht zuviele sind musst Du halt an alle topics an die Du retained Nachrichten geschickt hast - wie unten beschrieben leere Nachrichten mit retained=true schicken.
Hast Du denn mosquitto als Broker laufen?
-
@mickym said in Objectzustände "aus dem Jenseits" tauchen auf:
Hast Du denn mosquitto als Broker laufen?
... so siehts aus ...
OK ... Adapter löschen bringt nix (Ich war der naiven Meinung, dass dann auch diese mosquitto.db weg ist).
Und die mosquitto.db löschen muss ich dann wohl unter PuTTY, richtig ? Eine kurze Anleitung wäre hilfreich ... (und alle Topic einzeln anzugehen macht keinen Sinn, einige Geräte davon gibts nicht mehr)... -
@raspiuser Wie gesagt in Zukunft halt aufpassen, dass Du keine retained topics mehr setzt, wenn du es nicht brauchst. Ja Du musst auf die Kommandozeile. Ob mit putty -ich nehme meist eine ssh aus meinem Windowseingabefenster.
Putty braucht man heutzutage eigentlich nimmer.
dann
cd /var/lib/mosquitto
mosquitto stoppen
sudo systemctl stop mosquitto
mosquitto db löschen
sudo rm mosquitto.db
mosquitto neu starten (leere db wird angelegt)
sudo systemctl start mosquitto
-
@mickym said in Objectzustände "aus dem Jenseits" tauchen auf:
Putty braucht man heutzutage eigentlich nimmer.
... ich schon ...
Vielen Dank für die Kurzanleitung !! Hat alles funktioniert !!
Diese Info hebe ich mir auf (um sie dann bei Bedarf auch wieder zu finden)