NEWS
[gelöst] MQTT Senden aus ioBroker
-
Hallo,
ich hab nochmal eine Verständnisfrage zum MQTT-Broker.
Ich habe einen Arduino mit diversen Sensoren aufgebaut und bekomme diese Werte auch alle schön per MQTT-Adapter an ioBroker gesendet. Soweit so gut. Jetzt möchte ich aber auch Topics von ioBroker an den Arduino senden um z.B. Relais zu schalten. Und da ist mir jetzt nicht klar wie ich das eigentlich machen muss :?: Kann ich da einfach in meinem MQTT-Adapter (als Server konfiguriert) Objekte anlegen und werden diese dann (bei Änderung oder wann auch immer ?) gesendet? Oder muss ich dafür noch einen zweiten MQTT-Adapter als Client installieren? Oder ganz anders?
Sorry, für die Frage aber ich hab schon einige Varianten durchprobiert und weiß momentan nicht, ob der Fehler im Arduino-Sketch liegt ober ob ich falsch rangehe.
Danke und Gruß Thilo
-
Hallo,
ich hab nochmal eine Verständnisfrage zum MQTT-Broker.
Ich habe einen Arduino mit diversen Sensoren aufgebaut und bekomme diese Werte auch alle schön per MQTT-Adapter an ioBroker gesendet. Soweit so gut. Jetzt möchte ich aber auch Topics von ioBroker an den Arduino senden um z.B. Relais zu schalten. Und da ist mir jetzt nicht klar wie ich das eigentlich machen muss :?: Kann ich da einfach in meinem MQTT-Adapter (als Server konfiguriert) Objekte anlegen und werden diese dann (bei Änderung oder wann auch immer ?) gesendet? Oder muss ich dafür noch einen zweiten MQTT-Adapter als Client installieren? Oder ganz anders?
Sorry, für die Frage aber ich hab schon einige Varianten durchprobiert und weiß momentan nicht, ob der Fehler im Arduino-Sketch liegt ober ob ich falsch rangehe.
Danke und Gruß Thilo `
Du kannst auch über mqtt Broker senden. Du kannst aber nicht einfach so die Objekte anlegen, weil diese Objekte im Arduino bekannt sein müssen. Eigentlich sollte Arduino bei der Verbindung alle Topos einmal schicken? Falls es nicht passiert, dann natürlich kannst Objekte in mqtt.0 anlegen und die beschreiben. -
Hallo,
ich hab nochmal eine Verständnisfrage zum MQTT-Broker.
Ich habe einen Arduino mit diversen Sensoren aufgebaut und bekomme diese Werte auch alle schön per MQTT-Adapter an ioBroker gesendet. Soweit so gut. Jetzt möchte ich aber auch Topics von ioBroker an den Arduino senden um z.B. Relais zu schalten. Und da ist mir jetzt nicht klar wie ich das eigentlich machen muss :?: Kann ich da einfach in meinem MQTT-Adapter (als Server konfiguriert) Objekte anlegen und werden diese dann (bei Änderung oder wann auch immer ?) gesendet? Oder muss ich dafür noch einen zweiten MQTT-Adapter als Client installieren? Oder ganz anders?
Sorry, für die Frage aber ich hab schon einige Varianten durchprobiert und weiß momentan nicht, ob der Fehler im Arduino-Sketch liegt ober ob ich falsch rangehe.
Danke und Gruß Thilo `
Schau doch mal hier im Forum unter "ioBroker praktische Anwendungen / Projekte".
Dort habe ich einiges geschrieben zum Thema MQTT und der Nutzung im ioBroker.
-
Hallo Andy,
ich bin ja eben nach Deinem Beispiel vorgegangen. Dort wird ja das Topic "RESET" erzeugt mit dem man den Arduino neustarten können sollte. Das Topic erscheint bei mir auch im MQTT-Adapter nachdem ich den Arduino das erste Mal gestartet habe. Wenn ich aber jetzt den Wert im ioBroker ändere müsste ja nach meinem bisherigen Verständnis der neue Wert an den Arduino gesendet werden und ggf. auch einen Neustart auslösen. Es passiert aber nix, der Arduino schreibt auch nichts in den Seriellen Monitor was er ja lt. dem Sketch tun müsste:
`void callback(char* topic, byte* payload, unsigned int length) { int i = 0; char message_buff[100]; Serial.print("Empfangen: " + String(topic)); for(i=0; i <length; i++)/{/message_buff[i]="payload[i];" }/;/string/msgstring="String(message_buff);" konvertierung/der/nachricht/in/ein/serial.println("/-="">" + msgString); if (msgString == "1"){ // Wenn 1 dann Reset mqttClient.publish(mqtt_topics_ip,"RESET"); Serial.println("Reset"); digitalWrite(RESETPIN, LOW); delay(1000); } } void setup() { Serial.begin(9600); Serial.println("GrillDuino " + ver); mqttClient.setServer(mqtt_server, 1883); mqttClient.setCallback(callback);</length;>` Deshalb meine Frage, habe ich generell was noch nicht verstanden? oder habe ich einen Fehler im Sketch? oder muss ich im MQTT-Adapter noch etwas anders einstellen? ![250_mqtt_adapter.png](/assets/uploads/files/250_mqtt_adapter.png) [/i][/i][/i]
-
Aber es ist schon klar, das sich die Scripte auf einen ESP8266 beziehen?
Für die Reset-Funktion muss auch Hardwareseitig eine Verbindung, siehe Script, hergestellt werden.
Auf nem Arduino sollte das aber auch - entsprechend angepasst - funktionieren.
Wie hast du den Arduino netzwerktechnisch angebunden?
Die Konfiguration sieht bei mir auch so aus, bis auf das ich die Bekanntgabe eigener States beim Verbinden deaktiviert habe.
Bei mir steht in der Maske für Bekantgeben eigener States mqtt.0.
Das könnte schon der Fehler bei dir sein.
Gesendet von meinem GT-N8000 mit Tapatalk
-
Hallo Andy,
ich bin ja eben nach Deinem Beispiel vorgegangen. Dort wird ja das Topic "RESET" erzeugt mit dem man den Arduino neustarten können sollte. Das Topic erscheint bei mir auch im MQTT-Adapter nachdem ich den Arduino das erste Mal gestartet habe. Wenn ich aber jetzt den Wert im ioBroker ändere müsste ja nach meinem bisherigen Verständnis der neue Wert an den Arduino gesendet werden und ggf. auch einen Neustart auslösen. Es passiert aber nix, der Arduino schreibt auch nichts in den Seriellen Monitor was er ja lt. dem Sketch tun müsste:
`void callback(char* topic, byte* payload, unsigned int length) { int i = 0; char message_buff[100]; Serial.print("Empfangen: " + String(topic)); for(i=0; i <length; i++)/{/message_buff[i]="payload[i];" }/;/string/msgstring="String(message_buff);" konvertierung/der/nachricht/in/ein/serial.println("/-="">" + msgString); if (msgString == "1"){ // Wenn 1 dann Reset mqttClient.publish(mqtt_topics_ip,"RESET"); Serial.println("Reset"); digitalWrite(RESETPIN, LOW); delay(1000); } } void setup() { Serial.begin(9600); Serial.println("GrillDuino " + ver); mqttClient.setServer(mqtt_server, 1883); mqttClient.setCallback(callback);</length;>` Deshalb meine Frage, habe ich generell was noch nicht verstanden? oder habe ich einen Fehler im Sketch? oder muss ich im MQTT-Adapter noch etwas anders einstellen? filename="MQTT_Adapter.PNG" index="0">~~ Falls dein STATE 'mqtt.0.GrillRESET' heist, wird das nie über MQTT adapter gesendet, weil du ausdrücklich gesagt hast, dass du nur "Grill.." Objekte sendest. Muss vielleicht deine Maske 'mqtt.0.Grill*' sein?[/i][/i][/i] ``` `
-
Jetzt dachte ich schon ihr hättet mich auf die Lösung gestoßen weil ich die Maske fürs Bekanntgeben eigener States anpassen müsste. Das hilft aber leider auch nicht Ich habe da jetzt alles Mögliche versucht, sogar testweise mal nur * ! Hilft aber auch nicht. Außerdem sieht die Debugausgabe im ioBroker-Log IMO gut aus:
mqtt-0 2016-04-08 00:19:57 debug Send to client [GrillDuino01] "GrillDuino01/RESET": 1 mqtt-0 2016-04-08 00:19:57 debug onStateChange mqtt.0.GrillDuino01.RESET: {"val":"1","ack":false,"ts":1460067597,"q":0,"from":"system.adapter.admin.0","lc":1460067597} mqtt-0 2016-04-08 00:19:57 debug stateChange mqtt.0.GrillDuino01.RESET: {"val":"1","ack":false,"ts":1460067597,"q":0,"from":"system.adapter.admin.0","lc":1460067597} inMem 2016-04-08 00:19:57 debug message mqtt* mqtt.0.GrillDuino01.RESET val=1, ack=false, ts=1460067597, q=0, from=system.adapter.admin.0, lc=1460067597 mqtt-0 2016-04-08 00:19:57 debug stateChange mqtt.0.GrillDuino01.Licht: {"val":1023,"ack":true,"ts":1460067597,"q":0,"from":"system.adapter.mqtt.0","lc":1460067224} inMem 2016-04-08 00:19:57 debug message mqtt* mqtt.0.GrillDuino01.Licht val=1023, ack=true, ts=1460067597, q=0, from=system.adapter.mqtt.0, lc=1460067224 mqtt-0 2016-04-08 00:19:57 debug Server received "GrillDuino01/Licht" (number): 1023
Es könnte also schon sein, dass der FEhler im Arduino-Sketch liegt. DAbei ist mir ja erstmal völlig egal ob dann auch wirklich ein Hardreset ausgelöst würde. Aber es müsste ja im Seriellen Monitor ein Eintrag "Empfangen: topic" erscheinen. Da tut sich aber schon nix. Vielleicht wird die Callback-Funktion des MQTT-Clients gar nicht ausgeführt? Ich habe aber k.A. wie ich das sonst noch testen könnte…?
EDIT: Ich hab's dank hartnäckiger Googelei herausgefunden In der Loop-Routine des Arduino-Sketchs hatte die folgende Zeile gefehlt:
mqttClient.loop();
Damit werden jetzt die "Subscribten" Topics abgefragt und ich kann meinen Arduino auch von ioBroker aus ansteuern. *juhuuu
Danke und Gruß
Thilo