NEWS
Grundsatzfrage zu den MQTT Adaptern
-
Hallo Christian,
hast du schon einmal den Haken bei "Sende auch Zustände" gesetzt?
Damit sollte es eigentlich funktionieren.Gruß, Karsten
-
@christianf sagte in Grundsatzfrage zu den MQTT Adaptern:
Hallo,
ich bin schon lange begeisterter ioBroker Nutzer und ein Freund von MQTT. Nun bin ich aber an einen Punkt gekommen, bei dem ich nicht weiter weiß und um Verständnis-Nachhilfe bitte.
Als mqtt.0 läuft bei mir ein Broker/Server. Dieser nimmt Daten von diversen Devices an: Shellys, Rasenrobo, Sonoff usw. Es werden aber nur Daten angenommen, zB Spannung, Strom usw., die die Clients dort hin schicken. Entsprechend ist der Datenpunktebaum unter mqtt.0 recht groß.
Nun habe ich ein Gerät (EVCC), das einen bestimmten Wert aus ioBroker (Netzspannung, Leistung) gern serviert haben möchte. Heißt, der MQTT-Broker soll aus den Datenpunkten eines anderen Adapters (hier Javascript) Werte bei Veränderung ziehen und diese Veränderung über MQTT bereitstellen, sodass EVCC diese Änderungen abonnieren kann. Dazu habe ich unter
"Maske zum Bekanntgeben eigener States" folgendes angegeben: mqtt.0.,javascript.0.Auf einem Client habe ich mir MQTTbox installiert um zu schauen ob was ankommt, tut es aber nicht. Die anderen Nachrichten der anderen MQTT Devices kann ich sehen.
Stattdessen dachte ich mir, müsse ich wohl den MQTT-Client installieren. Habe also auch das probiert, mit dem Ergebnis dass die gesamte iobroker Installation crasht weil der MQTT-Client aus irgendeinem Grund offenbar versucht, JEDEN State zu publishen, ohne dass ich das einstellen könnte (MQTT-Client taucht im Zahnrad-Menü der States nicht auf).
Hat jemand einen Tipp für mich, was ich tun könnte bzw. was ich falsche mache?
Herzlichen Dank!
Also, ich habe fast das gleiche anliegen... EVCC läuft soweit (iobroker ->Modbusadapter aus!!!). Allerdings möchte ich die Werte, welche über modbus an den IOBROKER übermittelt werden gern per MQTT veröffentlichen und an EVCC veröffentlichen. Damit ich beides parallel nutzen kann.
Wenn ich den Client als MQTT.1 installiere geht praktisch der iobroker in die knie (Auslastung 100 Prozent).
Der Broker kann ja auch bestehende Daten veröffentlichen, so verstehe ich den Post hier.
Bisher weiss ich weder wie ich das bewerkstelligen kann (Einstellung im Broker) noch wie ich die Daten prüfen kann.Ich hoffe in diesem Topic bin ich richtig.
-
@mr1burns Man wird kaum helfen können, wenn ihr Eure mqtt-Einstellungen nicht postet und was ihr vorhabt. Einfach mal alle Zustände publishen - da wundert es mich nicht, wenn es zu Crashs kommt, weil man Endlosschleifen produziert. Am Besten ist immer erstmal alle Haken weg machen und die Standardeinstellungen zu nutzen und sich dann wirklich 10 mal überlegen, ob man einen Haken braucht oder nicht. Ich arbeite zwar mit einem mosquitto als Broker nutze aber 2 Instanzen des mqtt Adapters und es läuft so lange gut, solange ich nicht versuche alle states des iobrokers nach mqtt zu publishen und dann noch mit dem Adapter als Broker. Die Funktion fremde Adapterstates zu beschreiben, sollte nur mit besonderer Vorsicht geschehen und ggf. in einer eigenen Instanz.
-
@mickym
So erstmal die Einstellungen:
So laufen beide Instanzen ohne das der PI überläuft.
Was möchte ich erreichen:
Ich möchte die Daten welche mir der Modbusadapter über den WR zur verfügung stellt veröffentlichen. Damit die Daten dem EVCC zur verfügung gestellt werden können. (wie das genau eingestellt sein muss ist ein anderes Blatt.)
Aktuell läuft EVCC direkt über modbus. Der kann aber nur eine Verbindung sonst gibt es Fehler.Logisch wäre das Objekt einzustellen, siehe BSP.:
Hier bekomme ich über MQTTBox keine Daten. Wahrscheinlich passt irgendwie meine Verständnis noch nicht was ich hier eingeben soll.
-
@mr1burns So jetzt wird das schon etwas deutlicher.
Ich gehe mal davon aus - Du nutzt nun nicht 2 Instanzen des mqtt-Client/Server Adapters, sondern
mqtt.0 = ist Dein Server/Broker
mqtt-client.0 = ist Dein ClientDu hättest auch mit einem Adapter auskommen können - aber das tut erst mal nichts zur Sache. Ich würde auf dem Broker grundsätzlich auch erst mal alle Haken weg machen. Die Maske zum Veröffentlichen der eigenen States beim Broker heißt immer
mqtt.0.*
das heißt dort sind die States gespeichert, die der Broker verwaltet. Auf dem Client gibst Du nun an , was Du veröffentlichst. So ich habe mir gerade angeschaut - wie dieser mqtt-client funktioniert, da ich den normalerweise nicht verwende. Aber habs kapiert. Das heißt in dem Client gibst Du nur einzelne States ein, die gepublisht werden sollen und gibst oben drüber an in welches Topic. (also über das Zahnrad neben dem State) Für einzelne States funktioniert das sicher sehr gut - wenn Du allerdings Deinen ganzen Baum (also eines ganzen Adapters) publishen willst dann eignet sich der Client/Server Adapter besser.
Also als erstes in Deinem Broker die eigenen States richtig stellen. Als Subscriber in Deiner MQTT Box - kannst ja auch mal # eingeben, dann siehst Du alles was sich verändert - aber mach bitte alle Haken in Deinem Broker weg. Das braucht es einfach nicht. Ach ja in Deiner mqtt Box - die kennt nur die mqtt topics und keine Adapter instanzen. Da gehören also die / hin und keine Punkte. Das muss dann genauso aussehen, wie das topic oben. Aber wie gesagt wenn Du eine subscription auf # machst, bekommst Du alles mit, was neu in Deinem Broker ist.
Wichtig ist auch, dass Dein Topic Leerzeichen enthält - das musst Du auch genauso eingeben bei den Topic in Deiner mqtt Box - es wird nicht durch Unterstriche ersetzt.
Hier mal ein Beispiel mit dem ich es nachgestellt habe:
Im Datenpunkt ändert sich was - bei Dir unter modbus.0 - bei mir unter 0_userdata.0 - Ich setze folgenden String:
Der mqtt-Client Adapter erstellt in der Regel automatisch das topic - kann man aber ändern:
Du siehst das topic enthält einige Leerzeichen.
Im Broker - bei mir ist das allerdings auch ein Client kommt das topic entsprechend an - aber hier ist der Name und nicht die ID für mqtt relevant:
In der Subscription bzw. in einem neutralen MQTT-Client müssen die Leerzeichen miteingegeben werden:
Also wie gesagt entweder gibst Du in Deiner mqtt Box # oder modbus/# ein oder wirklich das ganze Topic mit Leerzeichen und nicht mit Unterstrichen.
Also
modbus/0/inputRegisters/5016 Total DC Power
Wichtig ist aber in meinen Augen
- mqtt.0.* - als Einzige Maske für die eigenen States
- ggf. nur mit dem Client/Server mqtt Adapter arbeiten, wenn Du ganze Adapterinstanzen exportieren willst - sollte aber das System nicht überlasten, sonst lieber einzelne Datenpunkte.
- Das mqtt topic hat nichts mit der ID des iobrokers zu tun. Das topic wird vom mqtt Adapter meist als Namen gesetzt.
-
@mr1burns So ich hab das nun mal für Dich alles nachgestellt - wobei ich kurzfristig mal bei dem mqtt Client/Server Adapter die neueste Version genutzt habe - aber das kommt nur dann in Frage, wenn Du ganze Bäume hochlädst.
Es gab für mich jedoch eine sehr erhellende Erkenntnis. Ich benutze ja mosquitto als Broker - deswegen stimmt das unten auch nur halb.
Fakt ist:
Wenn Du den mqtt-Adapter als Broker verwendest und gleichzeitig einen mqtt-Client Adapter oder auch den mqtt Adapter als Client - das zerschiesst Dir immer das System, wenn Du keinen Prefix verwendest. Das ist dann eine Endlosschleife.
Deshalb funktioniert das Publishen mit dem mqtt-Adapter als Broker NUR, wenn du dafür eigene Präfixe nimmst.
Im mqtt-Client Adapter also ein Präfix einstellen:
Nur dann werden Endlosschleifen vermieden:
Ansonsten wenn Du einen ganzen Adapter veröffentlichen willst - brauchst Du die neueste Version des mqtt Client/Server Adapters.
Damit kannst Du, wie von Dir geplant ganze Adapterbäume veröffentlichen:
Bei den Subscriber topics ist es wohl wurscht, ob man was einträgt oder nicht - wird wohl bei einem leeren Feld # verwendet.
-
@mickym
Du bis echt gut drauf... ich sag schon mal danke.. in der MQTTBox bekomme ich schon was... werde aber erst morgen oder am WE weiter Testen können... -
@mr1burns So naja - interessiert mich ja selbst etwas.
So ich habe noch war rausgefunden - grundsätzlich exportiert ein mqtt-Client Server Adapter alle topics - die als eignen definiert werden.
Falls das topic jedoch mit einem Namen beginnt der einem der Root-Namen im iobroker entspricht, dann werden die nicht mehr reimportiert - auch nicht wenn es über mosquitto läuft. Deshalb muss man immer einen eigenen Präfix mitgeben. Im Subtree ist es kein Problem. Das heißt Adapterinstanzen können ohne Prefix zwar exportiert werden - aber man wird sie nie in einer mqtt Instanz finden. Deshalb funktioniert das Publishen nur mit eigenem Präfix.
Habs auch gerade getestet - wenn man Zustände braucht - Du rennst sofort in eine Endlosschleife.
Also GRUNDSATZ: Alles was Du exportierst aus eigenen internen Zuständen macht man am Besten irgendein Schwachsinn in das subscription Feld eintragen - sonst nimmt der Adapter leider willkürlich # und subscribed alles und wenn man den eigenen Präfix nimmt - gibts bei Zuständen sofort wieder Endlosschleifen.
Also wenn man Zustände benötigt - da fremde Adapter ja die Werte bestätigt in Ihren Namensraum schreiben - dann kann man mit dem mqtt Client/Server in der Version 4.0.7 folgende Konfiguration verwenden - getestet mit dem backitup Adapter:
und hier sieht man das Ergebnis:
So damit ist das Thema erstmal wieder für mich abgeschlossen. Ich hoffe es hat manchen wieder etwas geholfen und ich habe ja auch wieder was dazugelernt.
-
Ich lese mir den Thread bereits zum fünften Mal durch.
In der Hoffnung das mir nichts entgeht... leider komme ich aber nicht ans Ziel.
Gerne poste ich auch meine Einstellungen der Adapter, aber dort steht durch das viele ausprobieren sowieso nurnoch Käse drin.
Ich verwende den MQTT Adapter und diesen als Server/Broker.
der mir quasi nur einen Impuls an meinen Client senden soll.Der Client ist ein Arduino, welcher entsprechend mit einem Koppelrelais versehen ist und einen Impuls (true -> 1s -> false) auf mein Garagentorantrieb gibt.
Der abgebildete Datenpunkt Befehl kommt über die Vis bzw über den javascript Adapter der direkt in den abgebildeten Baum des mqtt Adapters schreibt.Das hat bisher auch gut funktioniert nur seit dem Update auf 4.07... geht es leider nicht mehr.
Und leider ist mein Verständnis für deine Erklärung nur begrenzt und ich verstehe nicht wie ich Präfixe verwenden muss.Ein Denkanstoß wäre sehr willkommen.
Vielen Dank vorab!
Edit: das "Online" Lebenszeichen erhalte ich weiterhin Ordnungsgemäß vom Arduino.
-
@issr4k Hallo, wie ich bereits schon mal erwähnt habe - published ein Broker eigentlich gar nicht. Ich würde mal alle Haken aus der mqtt Konfig rausnehmen und einen den separaten mqtt-Client installieren - den Adapter mit dem Zahnrad - das ist keine neue Instanz dieses Adapters, sondern ein komplett anderer.
Diesem client-Adapter gibts Du als Broker dann die lokale Instanz Deines jetzt bereits als Broker installiertem Instanz mit.
Die 1. Kachel ist der Adapter, den Du bereits installiert hast und den Du als Broker konfiguriert hast. Der 2. Adapter heißt nur mqtt-Client und der stellt Dir das Zahnrad zur Verfügung.
Bei diesem gibst Du dann als Broker local host ein, da ja Dein Broker Adapter auf der gleichen Maschine läuft:
hier musst Du auch keine Präfixe eingeben beim Publishen - darf halt grundsätzlich nicht wie ein Adapter heißen.
Das Publishen stellst Du dann bei den Datenpunkten über das Zahnrad in den Objekten ein:
das schöne an dem reinen Client-Adapter ist, dass Du hier völlig frei in der Wahl des Topics bist:
In diesem Fall würde ich auch nichts abonnieren:
Falls ein anderer Client was in dieses Topic reinschreiben sollte, bekommst Du das ja über Deine Broker instanz mit.
Nachtrag:
Der abgebildete Datenpunkt Befehl kommt über die Vis bzw über den javascript Adapter der direkt in den abgebildeten Baum des mqtt Adapters schreibt.
Leg lieber einen eigenen Datenpunkt unter 0_userdata.0 an - so wie sich das gehört und schreib mit VIS bzw. über den Javascript Adapter in diesen Datenpunkt. Der mqtt-client Adapter published es dann an den Server - Deine mqtt-Broker Instanz und informiert Deinen Client (Ardunino), dass ein neuer Wert vorhanden ist und schickt ihn dann. Ein Broker ist unter mqtt - eigentlich immer ein passives Kerlchen, der zwar schickt, aber nur wenn ein Client das subscribed - abonniert hat.
Das andere mit dem in den Datenpunkt direkt unter der mqtt-Instanz reinschreiben, funktioniert mit dem anderen Adapter nur dann richtig, wenn dieser als Client zu einem anderen Broker betrieben wird.
-
@mickym was spricht dagegen eine 2. Instanz des MQTT Broker/Client zu nehmen und als Client zu konfigurieren? Bzw. was ist der Vorteil.
Ich wollte gerade schreiben das der MQTT-Client scheinbar weniger gepflegt wird, aber Apollon77 hat sich dem wohl angenommen - der wird also gepflegt und Fehler behoben. -
@bananajoe
Nachteile des mqtt-Broker/Client Adapters- Du musst zwingend ein Präfix verwenden, da wie erläutert topics, die mit einem Adapterpfad beginnen, nicht wieder reimportiert werden. Ist nicht schlimm, aber man muss es dem Arduino Client halt sagen, dass ein anderes Topic abonniert werden muss.
- topic können nicht frei vergeben werden.
- nicht einfach über Zahnrad einzelne states auswählbar.
Es geht aber auch 2. Instanz des mqtt-Broker/Client Adapters als Client konfiguriert
Man kann eine 2. Instanz als des mqtt Client/Broker Adapters verwenden, dann alles bei mqtt.1.* belassen, aber wie gesagt dann ist Präfix Pflicht und auf keinen Fall was subscriben. Muss man halt nur in Ardunio das Topic zum Subscriben ändern. Also Pattern zum subscriben auf nothing oder sowas setzen, das wird wohl in einer der nächsten Versionen angeboten, dass der subscribe Eintrag als Option ignoriert werden kann. dann kann man auch in selbst erstellte Datenpunkte unter mqtt.1 via VIS oder JS was publishen. Betreibt man den Adapter als Broker scheint das halt manchmal Probleme zu machen, sowohl direkt was in die Objekte der Adapterinstanz was reinzuschreiben als auch mit SendTo, wie in einem Parallelthread zu lesen..
@BananaJoe Wir Betreiben den Adapter ja nicht als Broker, sondern als Client zu mosquitto. Das ist der Unterschied.Vielleicht gehts auch als Broker aber Präfix ist immer notwendig beim publishen mit diesem Adapter
-
@bananajoe sagte in Grundsatzfrage zu den MQTT Adaptern:
Ich wollte gerade schreiben das der MQTT-Client scheinbar weniger gepflegt wird, aber Apollon77 hat sich dem wohl angenommen - der wird also gepflegt und Fehler behoben.
dachte ich bis vor 1 Jahr auch, da war das auch total antiquiert mit Listen, aber da hat sich massiv was getan mit dem Zahnrad.
-
Hallo @mickym
bin leider erst heute morgen ans Testen gekommen und was soll ich sagen... in einem anderen Thread wurdest du als MQTT -Meister betitelt und das würde ich auch unterschreiben...
Habe wie du gesagt hast den client dazu genommen, die States neu angelegt, mit MQTT Explorer rumexperimentiert und jetzt funktioniert es... irgendwie...
Ich sehe am Ende eines laaaangen, laaangen Tunnels etwas Licht, aber noch ein weiter Weg für mich, bis ich das wirklich verstanden habe.
Vielen, vielen Dank an dich!
auch an @BananaJoe -
Sorry wenn ich diesen Faden wieder ausgrabe, aber ich bin gerade mit meinem Latein am Ende.
Nachdem ich nur den mqtt-Broker/Client Adapter verwendet habe um einige Topics an meine Wärmepumpe zu schicken, wollte ich es nun richtig machen und Broker und Client trennen.
Eingestellt ist am Broker folgendes
Am Client Adapter sieht s so aus, admin und Passwort stimmen natürlich auch.
Leider bekomme ich keine Verbindung zustande, im Log steht dann immer folgendes
Das Ganze läuft bei mir in einem Proxmox Container, die Verbindung von meiner Wärmepumpe zum MQTT Broker funktioniert einwandfrei und Ping an localhost funktioniert auch. Getestet habe ich auch mit 127.0.0.1 und 192.168.178.38 - immer das gleiche Ergebnis.
Das ist /etc/hosts127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters # --- BEGIN PVE --- 192.168.178.38 iobroker.home iobroker # --- END PVE ---
Vielleicht hat ja noch jemand eine Idee, ich komme einfach nicht mehr weiter.
Ich muss dazu sagen, dass ich mit Ü60 nicht so der Linuxexperte bin und mir alles nach und nach angelesen habe. -
Ich habe nun eine andere Lösung für mich gefunden.
Für die wenigen Datenpunkte, die ich an die WP schicken möchte, benutze ich nun einfach einen sendTo Block in Blockly. Hier ein Beispiel
Funktioniert bisher gut. So kann ich mir die entsprechenden Datenpunkte unter 0_userdata anlegen und muss nicht mehr in mqtt.0 rum schreiben. Den Client Adapter kann ich damit dann wohl auch sparen.