NEWS
Einzelnes MQTT-Topic bei Aktualisierung publizieren?
-
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Bzw. wie würde das in diesem Zusammenhang mein Problem lösen?
mit dem MQTT-Client Adapter kannst du selektiv jeden einzelnen State verwalten.
Dies geschieht direkt in den Objekten über das Zahnrad, über den auch Einstellungen für Historisierung, Sourceanalytix u.a. gemacht werden -
@homoran Danke für die Rückmeldung. Ich habe mir den Adapter installiert und verstehe das nun so, dass der bestimmte States erstmal abonnieren muss, oder?
Also es geht im Endeffekt um das hier bspw.:
In dem mqtt-client habe ich eine lokale Verbindung zu meinem broker hergestellt, was soweit auch geklappt hat. Aber der Objektbaum im mqtt-client bleibt leer:
Ich hätte jetzt erwartet, dass dort die states auftauchen, um diese dann wie von dir beschrieben bearbeiten zu können, oder nicht?
So sehen meine settings aus, in welchem ich mal über die zusätzlichen Subscriptions versucht habe an die topics heranzukommen:
-
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
bestimmte States erstmal abonnieren muss, oder?
ist bei mir ewig her, als ich es getestet hatte, aber
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
um das hier bspw.:
kann ich mobil leider nicht erkennen
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Aber der Objektbaum im mqtt-client bleibt leer:
Ich hätte jetzt erwartet, dass dort die states auftauchen, um diese dann wie von dir beschrieben bearbeiten zu können, oder nicht?
Nein, die Einstellungen sind bei dem zu publishenden/abbonietenden State selber
-
@homoran Okay jetzt habe ich den Adapter verstanden. Man kann bei jedem beliebigen Objekt nun ein Publish oder Subscribe in Richtung eines Brokers senden.
Aber das bringt mir doch nichts?
Also angemeldet ist der Client-Adapter logischerweise an meinem Broker, was beides mein iobroker ist. Der Broker hat ein State von der AhoyDTU, um welches es geht.
Würde ich da nun hinten dran noch zusätzlich den MQTT-Client aktivieren, dann würde er bei einer Anpassung des Wertes ein Publish vom Client an den Broker senden - der sendet das aber immernoch nicht an die AhoyDTU, weil er das nur bei Änderungen macht.Der Adapter ist meinem Verständnis nach dafür da, dass ich nun bei jedem beliebigen Objekt, was ich lokal im iobroker verarbeite Dinge dann an einen Broker publishen oder subscriben kann. Aber die AhoyDTU ist ja auch ein Client und wird immer nur über meinen Broker versorgt werden.
Ich muss zugeben, dass mir sich der Sinn des Client-Adapters für mein Problem hier nicht erschließt?
Edit:
Also würde ich bei besagtem Topic den MQTT-Client aktivieren, dann würde er das dem MQTT-Broker jetzt halt in ein neues Topic melden. Mehr passiert da eigentlich nicht. Ich glaube tatsächlich, dass der Anwendungsfall hier ein falscher ist. -
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Ich muss zugeben, dass mir sich der Sinn des Client-Adapters für mein Problem hier nicht erschließt?
Ja, das Problem ist hier echt der Broker mit der Einstellung "nur bei Änderungen publizieren". Jeder andere Broker macht genau dies nicht.
Möglicher Workaround: Per Skript das Topic kurz vor Setzen der "0" auf "1" (oder was auch immer Sinn ergibt) setzen.
-
@marc-berg Ja, solch einen Workaround habe ich gerade. Der ist nur sehr unsauber, da man vorher nicht weiß, ob er Zustand gerade überhaupt inkonsistent ist oder nicht. Dieses getoggle, gerade über MQTT mit Wechselrichter dahinter verschluckt sich dann häufig.
Weil du sagst, dass jeder andere Broker genau "dies" nicht macht, was meinst du damit? Es ist ja als Setting im Broker vorhanden und könnte man deaktivieren. Ich halte das nur für sinnvoll, dass ein Broker nicht hunderte Topics jedes mal publiziert ungeachtet einer Änderung - vondemher ist das ja schon Ressourcen und Netzlastschonend. Also diese Einstellung stört mich eigentlich gar nicht, sondern dass man es für ein einzelnes Topic nicht anders handhaben kann.
Oder habe ich dich missverstanden? -
@berzi
Irgendwie komme ich jetzt nicht mehr mit.Der Wunsch war doch nur ein einziges Topic zu publishen, anstelle über eine Maske eine ganze Gruppe.
Genau das macht der Client-Adapter.Wenn
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
sich der Zustand des Wechselrichters im Hintergrund ändern kann
ohne dass diese Änderung bei dir ankommt, liegt doch das Abonnement dieser Änderung im argen.
Wenn du an dieser Ursache angreifst hast du anschließend auch wieder nur Änderungen.
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Ich halte das nur für sinnvoll, dass ein Broker nicht hunderte Topics jedes mal publiziert ungeachtet einer Änderung - vondemher ist das ja schon Ressourcen und Netzlastschonend.
Das kann man so sehen, andererseits ist das MQTT-Protokoll so effektiv, dass möglicherweise dieses Verhalten ei gepreist sein kpnnte.
-
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Würde ich da nun hinten dran noch zusätzlich den MQTT-Client aktivieren,
nein, der ist vorgeschaltet
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Der Adapter ist meinem Verständnis nach dafür da, dass ich nun bei jedem beliebigen Objekt, was ich lokal im iobroker verarbeite Dinge dann an einen Broker publishen oder subscriben kann.
richtig!
Wenn es dann sein muss (was in meinen Augen ein fixen von Symptomen ist, anstelke die Ursache zu fixen) und üblicherweise nur bei Änderung an andere Clients publishen willst, dann musst du alle States im mqtt-Client n6r bei Änderung an den Broker publishen, diesen einen Hoymiles Datenpunkt aber auf Aktualisierung.
Der Broker dann auf Aktualisierung
-
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Weil du sagst, dass jeder andere Broker genau "dies" nicht macht, was meinst du damit? Es ist ja als Setting im Broker vorhanden und könnte man deaktivieren.
Jeder "normale" Broker (Mosquitto, RabbitMQ, wasauchimmer) wird dir jedes veröffentliche Topic an die Clients verteilen. Ob es sich zum letzten Mal geändert hat oder nicht. Die Option im Adapter ist insofern eine Sonderlocke.
Ich halte das nur für sinnvoll, dass ein Broker nicht hunderte Topics jedes mal publiziert ungeachtet einer Änderung - vondemher ist das ja schon Ressourcen und Netzlastschonend. Also diese Einstellung stört mich eigentlich gar nicht, sondern dass man es für ein einzelnes Topic nicht anders handhaben kann.
Das sehe ich wie @Homoran , die paar Bytes machen den Kohl nicht fett.
-
@homoran sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Irgendwie komme ich jetzt nicht mehr mit.
Der Wunsch war doch nur ein einziges Topic zu publishen, anstelle über eine Maske eine ganze Gruppe.
Nein. Der Wunsch war, die globale Einstellung "nur Änderungen publishen" für genau ein Topic zu übersteuern.
ohne dass diese Änderung bei dir ankommt, liegt doch das Abonnement dieser Änderung im argen.
Nein. Das "ctrl..." Topic ist (vom iobroker) überhaupt nicht abonniert. Darf es auch nicht.
-
Ich glaube, dass Issue https://github.com/lumapu/ahoy/issues/1539 kannst du schließen. Ist ja kein Ahoydtu-, sondern Broker-"Problem".
-
@Berzi Ich halte das für Käse nur Änderungen zu publizieren, aber wenn man es unbedingt machen will, dann halt nicht beim Broker. Dann nutz den Adapter als Client entweder an einem Broker (andere Instanz) oder einem "normalen Broker" wie mosquitto und da kannst Du ja dann nur Änderungen publizieren. Zusätzlich nimmst Du dann noch einen anderen Client (andere Instanz oder mqtt-client) für den Topic, bei dem Du auch publizieren willst, wenn keine Änderungen erfolgt sind.
Bei dem Client kannst ja dann je topic entscheiden, ob Du publishen willst oder nicht:
Also generell ist es überhaupt nicht empfehlenswert irgendeine Option anzuklicken, wenn man den Adapter als Broker betreibt, Einen Broker sollte man möglichst nach Standard betreiben. Bei Clients kannst Du machen wie Du meinst.
-
@mickym sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Ich halte das für Käse nur Änderungen zu publizieren,
Habe ich was anderes behauptet?
-
@marc-berg sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
@mickym sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Ich halte das für Käse nur Änderungen zu publizieren,
Habe ich was anderes behauptet?
Nein - ich wollte Dir eigentlich beipflichten - ah ich sehe ich hab auf Deinen Post geantwortet, war natürlich an den TE gerichtet.
EDIT: Habe es korrigiert.
-
@marc-berg said in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
@homoran sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Irgendwie komme ich jetzt nicht mehr mit.
Der Wunsch war doch nur ein einziges Topic zu publishen, anstelle über eine Maske eine ganze Gruppe.
Nein. Der Wunsch war, die globale Einstellung "nur Änderungen publishen" für genau ein Topic zu übersteuern.
ohne dass diese Änderung bei dir ankommt, liegt doch das Abonnement dieser Änderung im argen.
Nein. Das "ctrl..." Topic ist (vom iobroker) überhaupt nicht abonniert. Darf es auch nicht.
Tatsächlich hast du das sehr gut zusammengefasst, danke dir. Das ist genau der Case, den ich habe.
Nun habt ihr mich aber dann am Ende verloren, was die Lösung sein soll
Ist einfach das Setting in meinem MQTT-Broker "nur Änderungen publizieren" Quatsch, dass ich das aktiv habe? (was dann wohl meine Falschannahme war)
Die Sache mit dem Client-Adapter leuchtet mir ehrlich gesagt für mein Problem immernoch nicht ein. Ich könnte nun neben dem Ctrl-Topic (um welches es hier geht) den Client Adapter aktivieren. Okay... dann mach ich das wie von bspw. @mickym in seinem Bild gezeigt. Dann passiert folgendes als nächstes: Der MQTT-Client schickt dieses Topic an den Broker, dadurch erscheint es in einem neuen Ordner in dem Objektbaum des MQTT-Broker Adapters als neues Objekt. Dadurch gewinne ich doch nichts... ich will doch einfach nur, dass die Änderung des ctrl-topics an den Client auch bei Aktualisierung geschickt wird. Mit dem MQTT-Client Adapter hab ich jetzt nur erreicht, dass der das aufnimmt und dann nochmal an neuer Stelle an den gleichen Broker schickt, damit der sich das halt nochmal woanders ablegt. ^^
Ich glaube in diesem Thema mit dem MQTT-Client-Adapter reden wir echt aneinander vorbei oder ich kapiere etwas ganz grundlegendes nicht. -
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
ich will doch einfach nur, dass die Änderung des ctrl-topics an den Client auch bei Aktualisierung geschickt wird.
das kannst du doch im Client konfigurieren! (Hab ich so noch im Kopf!)
und im Broker den Haken weg bei "nur Änderungen"
Wenn du allerdings nur diesen einen DP auch bei Aktualisierung publishen willst, musst du alle anderen im Client auf nur bei Änderung stellen, was natürlich ein gewisser Aufwand ist.Also e7nfach alles immer publishen und gut ist. Dann brauchst du natürlich den Cluent nicht mehr
-
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Ist einfach das Setting in meinem MQTT-Broker "nur Änderungen publizieren" Quatsch, dass ich das aktiv habe? (was dann wohl meine Falschannahme war)
Ich würde es so zusammenfassen: der MQTT Adapter als Broker ist etwas speziell, da er so eng in den ioBroker integriert ist und z.B. mit Retained Messages nicht umgehen kann. Für die meisten Anwendungsfälle reicht er aber aus.
ABER:
Ich habe mir mal den (zweifelhaften) Spass erlaubt, das Ganze zu testen. Ergebnis: Die Einstellung "nur bei Änderungen publishen" greift nur (!), wenn die Änderungen über einen ioBroker-Datenpunkt eingestellt werden. Beim Publishen via MQTT allerdings nicht. Das heißt, du kommst mit dem MQTT Client Adapter wahrscheinlich doch weiter, ohne alles anpassen zu müssen.
- Erstellen eines Datenpunktes unter "0_userdata"
- Klicken auf das Zahnrädchen, Auswahl des mqtt-client Adapters
- Eingeben des Topics "ahoydtu/ctrl/power/0"
- nur publishen
Jetzt solltest Du über deinen neuen Datenpunkt steuern können. Achtung, in der MQTT Client Instanz alle Prefixe und zusätzliche Subscriptions entfernen!
-
@homoran Ich weiß gar nicht wie ich es anders erklären soll, wir redne aneinander vorbei
Ja! Natürlich kann das der Client! Aber er meldet das an den Broker!
Also um es vllt mal aufzuskizzieren...
mqtt
-0
--ahoydtu
---ctrl
----power
-----0 <= dieser state kann '0' oder '1' haben und schaltet einen anderen MQTT-Client (die AhoyDTU) an oder ausWenn ich da nun bei diesem Objekt den MQTT-Client aktiviere (mit egal welchen Einstellungen), dann macht der ja nur folgendes - er meldet das wieder an den Broker. Es passiert also folgendes:
mqtt
-0
--mqttclientstuff
---soeben
----gepushedes
-----Objekt-wo-ich-das-aktiviert habe
--ahoydtu
---ctrl
----power
-----0 (alles bleibt beim Alten, denn er nimmt das nur und published das ja an den broker erneut)EDIT:
Jetzt hat @Marc-Berg gerade geantwortet - danke! Du hast meinen Antwendungsfall tatsächlich verstandenUnd das klingt nach einem Workaround
Zwar von hinten durch die Brust, aber ich habe verstanden was du aufgebaut hast
DANKE, dass du das sogar bei dir so getestet hast. In dem Fall ist es ja tatsächlich auch kein Problem der ahoyDTU
-
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
wir redne aneinander vorbei
richtig
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
er meldet das wieder an den Broker.
auch richtig!
@marc-berg sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
nur publishen
war für mich nach der Aussage
@marc-berg sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Das "ctrl..." Topic ist (vom iobroker) überhaupt nicht abonniert. Darf es auch nicht.
selbstverständlich
@berzi sagte in Einzelnes MQTT-Topic bei Aktualisierung publizieren?:
Du hast meinen Antwendungsfall tatsächlich verstanden
isch 'abe gar keine DTU