NEWS
[gelöst] MQTT - Problem mit Publish
-
Nachdem ich nun das Wochenende mit ausprobieren verbracht habe, hoffe ich hier schlauere Menschen zu finden
Zum Problem:
Ich hatte bis dato eine Instar Kamera als Client an den ioBroker MQTT Broker/Client (2.3.4) Adapter angebunden. Der Adapter war als Broker eingestellt. Hat prinzipiell funktioniert aber dann doch nicht so nachvollziehbar. Es gab letztlich im ioBroker Log immer die Meldung, dass das Senden nach 11 Versuchen aufgegeben wurde. Egal.
Da ich an meheren Stellen gelesen habe, im Broker Modus ist der Adapter nicht so zuverlässig, habe ich den Vorschlag aufgenommen, Mosquitto (1.6.12) als Broker auf dem Rpi4 laufen zu lassen und den Adapter als Client zu nutzen. (z. Info, dazu habe ich vorher alles im ioBroker entfernt, was mit MQTT zu tun hat und den Raspi neu gestartet)Die Kamera meldet sich korrekt im Mosquitto an. Der ioBroker Client bezieht (subscribe) alle States der Kamera und legt dafür Objekte an. Auch prima.
Jetzt will ich aber natürlich über die Vis in ioBroker auch etwas an der Kamera verändern können. Nun geht das Problem los: Wie mache ich das am Besten?
Wer Instar nicht kennt: Die Kamera veröffentlicht den Status in topics nach dem Schema xx/status/yy
Wenn man nun etwas ändern will, lautet der Topic xx/yy/raw
An diesen wird der payload gesendetWas funktioniert:
Ich lege manuell ein Objekt im Baum unter mqtt.0 an nach dem Schema xx.yy.raw
Das funktioniert. Wenn ich z.b. einen Schalter in der vis mit diesem Objekt verknüpfe, dann kommt es über den Broker bei der Kamera an und sie meldet über xx/status/yy den neuen Zustand zurück.Nun aber:
Ich habe gelernt, ich soll nicht manuell Objekte bei einem Adapter anlegen, da diese manuellen Einträge gelöscht werden könnten z.B. beim Aktualisieren des Adapters. Also lege ich das Objekt unter 0_userdata an. Wenn ich das mache, und mit einem Schalter in der vis verknüpfe, sendet der MQTT Adapter als topic immer 0_userdata/0/...xx/yy/raw
Ja, vielleicht nicht überraschend. Der Mosquitto Broker empfängt das auch nur gibt es niemand, an den er es weiterleitet. Die Instar Kamera hört ja auf ..xx/yy/raw, nicht auf 0_userdata/0/...xx/yy/rawAlso: wie bekomme ich es hin, dass ich das Objekt manuell außerhalb der Adapter Instanz anlegen kann und trotzdem über den Adpater mit dem gewünschten Topic versenden kann?
Ich hoffe, ich konnte das Thema einigermaßen erklären
Zum Abschluss noch ein snip von meiner Adaptereinstellung. Gerne kann ich auch noch diverse Log's liefernMarc
-
@weissnicht sagte in MQTT - Problem mit Publish:
Was funktioniert:
Ich lege manuell ein Objekt im Baum unter mqtt.0 an nach dem Schema xx.yy.raw
Das funktioniert. Wenn ich z.b. einen Schalter in der vis mit diesem Objekt verknüpfe, dann kommt es über den Broker bei der Kamera an und sie meldet über xx/status/yy den neuen Zustand zurück.Nun aber:
Ich habe gelernt, ich soll nicht manuell Objekte bei einem Adapter anlegen, da diese manuellen Einträge gelöscht werden könnten z.B. beim Aktualisieren des Adapters. Also lege ich das Objekt unter 0_userdata an. Wenn ich das mache, und mit einem Schalter in der vis verknüpfe, sendet der MQTT Adapter als topic immer 0_userdata/0/...xx/yy/raw
Ja, vielleicht nicht überraschend. Der Mosquitto Broker empfängt das auch nur gibt es niemand, an den er es weiterleitet. Die Instar Kamera hört ja auf ..xx/yy/raw, nicht auf 0_userdata/0/...xx/yy/rawDas ist in diesem Fall aber Käse - da wenn Du einen Datenpunkt unter dem mqtt Adapter anlegst - legst Du diesen nicht im Adapter sondern in Deinem Broker an. Wenn Du den Adapter also löschst und Du wieder neu einrichtest und dann Dich dann wieder mit Deinem Broker / mosquitto verbindest sind die Datenpunkte ja wieder da.
Du kannst aber auch zusätzlich Datenpunkte aus userdata_0.0 publishen - dann würde ich aber eine neue Instanz dafür nehmen und dann kannst einen eigenen Datenpunkt im mqtt machen - so hab icc es gemacht. Dieses Bekanntgeben von States usw. das würde ich alles in einer extra Instanz machen - aber nicht mit Deinem normalen Front-End. Sonst bekommst Du leicht Endlosschleifen rein.
Wie gesagt einfach mit vis direkt in die mqtt Datenpunkte schreiben - sonst musst Du halt mit blockly in die mqtt Punkte schreiben. Die andere Möglichkeit ist, Du sagst Deine Kamara welche Datenpunkte sie subscriben muss. Aber wie gesagt, mach die Punkte in Deinen mqtt Adapter und gut ist. Prinzipiell kannst Du aber auch mit einer eigenen Instanz einen 0_userdata/0/...xx/yy/raw auf xx/yy publishen lassen - aber das macht alles keinen Sinn in meinen Augen.
-
Danke erstmal für die schnelle Reaktion. Ich versuche mal, ob ich alles richtig verstanden habe...
@mickym said in MQTT - Problem mit Publish:
Das ist in diesem Fall aber Käse - da wenn Du einen Datenpunkt unter dem mqtt Adapter anlegst - legst Du diesen nicht im Adapter sondern in Deinem Broker an. Wenn Du den Adapter also löschst und Du wieder neu einrichtest und dann Dich dann wieder mit Deinem Broker / mosquitto verbindest sind die Datenpunkte ja wieder da.
Mit Datenpunkt unter dem MQTT Adapter heißt für mich, ich lege ein Objekt im Adapter an. Dieses würde dann bei Änderung über den Adapter automatisch veröffentlicht (publish).
Der Broker (Mosquitto) merkt sich dies doch nur, wenn er ein retain flag bekommt?! Außerdem hilft es nur bedingt, wenn der Broker es sich merkt. Ich möchte ja letztendlich im ioBroker bequem auf die Topics in Form von automatisch bei Änderung veröffentlichte Objekt (die die Topics repräsentieren) zugreifen können. Ich habe versucht, direkt aus der vis etwas zu senden. Dazu habe ich als Objekt des Widgets den Topic angegeben - das ist sicher nicht richtig so und hat auch nicht funktioniertDu kannst aber auch zusätzlich Datenpunkte aus userdata_0.0 publishen - dann würde ich aber eine neue Instanz dafür nehmen und dann kannst einen eigenen Datenpunkt im mqtt machen - so hab icc es gemacht. Dieses Bekanntgeben von States usw. das würde ich alles in einer extra Instanz machen - aber nicht mit Deinem normalen Front-End. Sonst bekommst Du leicht Endlosschleifen rein.
Das publish über eine extra Instanz zu machen hatte ich auch schon überlegt. Aber ich verstehe immernoch nicht, wie ich aus 0_userdata etwas veröffentliche, so dass der Topic dieses Präfix nicht mehr enthält. Bzw. wie bekomme ich den in die extra MQTT Instanz. Oder habe ich da irgendetws garnicht verstanden?
Wie gesagt einfach mit vis direkt in die mqtt Datenpunkte schreiben - sonst musst Du halt mit blockly in die mqtt Punkte schreiben.
Ja, wenn ich das so mache funktioniert es - setzt das Anlegen der Datenpunkte im MQTT Adapter voraus.
Die andere Möglichkeit ist, Du sagst Deine Kamara welche Datenpunkte sie subscriben muss.
Das geht leider nicht. Bei der Kamera kann man nicht eintragen, welche Topics sie abonniert, das ist vorgegeben.
Aber wie gesagt, mach die Punkte in Deinen mqtt Adapter und gut ist. Prinzipiell kannst Du aber auch mit einer eigenen Instanz einen 0_userdata/0/...xx/yy/raw auf xx/yy publishen lassen - aber das macht alles keinen Sinn in meinen Augen.
Richtig. Damit sind wir aber wieder beim Eingangsproblem, dass ich manuell Datenpunkte unterhalb eines Adapters anlege - was man nicht machen soll.
-
@weissnicht sagte in MQTT - Problem mit Publish:
Mit Datenpunkt unter dem MQTT Adapter heißt für mich, ich lege ein Objekt im Adapter an. Dieses würde dann bei Änderung über den Adapter automatisch veröffentlicht (publish).
Der Broker (Mosquitto) merkt sich dies doch nur, wenn er ein retain flag bekommt?! Außerdem hilft es nur bedingt, wenn der Broker es sich merkt. Ich möchte ja letztendlich im ioBroker bequem auf die Topics in Form von automatisch bei Änderung veröffentlichte Objekt (die die Topics repräsentieren) zugreifen können. Ich habe versucht, direkt aus der vis etwas zu senden. Dazu habe ich als Objekt des Widgets den Topic angegeben - das ist sicher nicht richtig so und hat auch nicht funktioniertIm Prinzip hast Du mit allem Recht, was Du sagst und ich würde ja auch direkt unter dem Adapter die Datenpunkte anlegen. Im Prinzip funktioniert es so, wie Du sagst - wenn Du einen DP im iobroker anlegst, wird dieser in den Broker gepublisht. Ob sich der Broker den DP merkt kann Dir erst mal egal sein, denn selbst wenn er im Broker nicht mehr existiert heißt das nicht, dass er in Deinem Adapter nicht mehr existiert. Der Adapter überprüft das nicht und das ist auch unbedeutend, weil Deine vis das mitbekommt, wenn der DP vom Broker erneut aktualisiert wird.
Und Dein letzter Satz stimmt einfach nicht - bei mir geht das ohne Probleme.
Hier mal ein kurzer Test :
Egal ob ich uber vis den DP steuere - wird das nach mosquitto weitergegeben und in dem Fall vom meinem NodeRed Dashboard übernommen oder ich schalte das über NodeRed Dashboard- mossquitto - vis. Geht in beide Richtungen ohne Probleme. Falls Du da in meinen Augen ein Problem hast, dann solltest Du mal Deine Adaptereinstellungen überprüfen. Es müssen alle Häkchen draußen, also nichts gesetzt sein.
-
Und Dein letzter Satz stimmt einfach nicht - bei mir geht das ohne Probleme.
Tja, nach meiner heutigen Erfahrung hat Du mit der letzten Aussage wohl recht - es geht.
Ich habe jetzt nochmal probiert - auf einmal ging es obwohl ich mir mehr wie sicher bin, es bereits am Wochenende probiert zu haben. Keine Ahnung, was zwischen evtl. Tippfehlern und nicht gemachten Neustarts des Adapters nicht korrekt war.
Also, der Trick ist: Man muss in dem Objekt, welches den Topic repräsentieren soll, unter dem Reiter NATIV einen Paramter topic anlegen, welcher als Inhalt genau den Topic hat , den man senden möchte. In meinem Beispiel also:
Dieser Topic wird dann vom MQTT Adapter genauso veröffentlicht. Puh, ich könnte schwören, das hatte ich das am Wochenende genauso getestet hatte.
Der MQTT Adapter muss dann nur diesen (oder auch noch andere) Objektbaum abonnieren, wie hier:
Dann veröffentlicht er das bei jeder Änderung im Objekt ohne irgendwelche Zusätze.
Und da ich den Objekt-Baum des Adapers selbst nicht abonniere, ist es auch egal, was sich dort ändert.Nebenbei, ich konnte jetzt keine negativen Effekte erkennen, im Adapter Publish bei Änderungen und Bekanntgabe eigene States beim Verbinden anzukreuzen.
Und diese beiden Funktionen benötige ich ja auch. Oder?Das Einzige, was mich jetzt noch stört, hat scheinbar was mit Mosquitto zu tun oder ist ein Thema des MQTT Protokolls:
Da der MQTT Adapter alles abonniert, was mit instar anfängt, sendet der Mosquitto Broker auch immer die Veröffentlichung des MQTT Adapters wieder zurück an diesen. Warum, verstehe ich noch nicht ganz. Liegt aber einfach nur daran, dass der Adapter eben alles zu diesem Präfix-Topic abonniert hat. Auch die eigenen MeldungenBin jetzt sehr zufrieden, habe einen MQTT Broker der unabhängig vom ioBroker funktioniert, was später evtl. eine Spielwiese für andere Projekte öffnet
-
@weissnicht Wie gesagt, ich lege die Punkte direkt unter dem mqtt-Adapter an und das funktioniert ebenfalls ohne Probleme und Verrenkungen.
-
Naja, bevor ich das hier als gelöst abschließe, zur Erinnerung:
Keine eigenen Datenpunkte unter einem Adapter anlegen. Nur in 0_userdata (extra dafür in ioBroker vorhanden) oder evtl. noch unter javascript. Aber das hat natürlich nur Designgründe -
@weissnicht Weißt Du. ich lege meine Punkte immer über NodeRed über die mqtt Nodes in mosquitto an, und die tauchen dann immer automatisch unter dem Adapter auf. - In meinen Augen bildet dieser Adapter eine Ausnahme von der Regel. Sonst versuche ich mich ja immer an Regeln zu halten. Aber bevor es nun philosophisch wird - soll das jeder so machen, wie er es für richtig hält.