Tag 12: MQTT-Button
Hinter dem heutigen Türchen des Adventskalenders finden Sie einen weiteren Button. In dem Versuch des heutigen Tages werden wir uns weiter mit dem MQTT-Protokoll beschäftigen, diesmal in Verbindung mit Node-RED. Außerdem sehen wir, wie zwei Buttons gleichzeitig ausgewertet werden können. Der Versuch des heutigen Tages hat folgenden Aufbau:
Es gibt also zwei Buttons, die wir nutzen können. Aktivieren Sie nun das Programm des heutigen Tages. Anschließend können Sie den Node-RED-Flow importieren. Diesen müssen Sie zunächst aber leicht anpassen. Sie müssen nämlich [PID] im Topic durch Ihre persönliche MQTT-ID ersetzen. Das geht aber ganz einfach mit dem folgenden Trick:
Kopieren Sie den Node-RED-Flow in einen Texteditor Ihrer Wahl, in Windows zum Beispiel in den Editor. Anschließend wählen Sie die Option Ersetzen (im Editor unter Bearbeiten/Ersetzen ([Strg]+[H]). Dort geben Sie im Feld Suchen nach [PID] ein und im Feld Ersetzen durch Ihre persönliche ID. Anschließend können Sie einfach auf Alle ersetzen klicken. Schon haben Sie den Flow angepasst und können ihn in Node-RED importieren und starten, natürlich nicht, ohne die alten Flows zu deaktivieren.
Wenn Sie nun in Node-RED auf das Debug-Register gehen und einen Button auf dem Steckboard drücken, sehen Sie dort zum Beispiel folgende Nachricht:
Unter dem Key cmd wird das Kommando get_button_state gesendet. Unter value folgt ein Array mit allen Buttons und ihren Werten. Über pin_name, pin_id oder pin_nr können Sie einen Button identifizieren. Die ersten beiden Werte sind selbst definiert, der dritte gibt den verwendeten IO-Pin am Board an. Pin_state gibt an, wie der boolesche Wert des Buttons ist, also TRUE oder FALSE bzw. HIGH oder LOW.
Ist der Button nicht gedrückt, ist der Pin-Value übrigens TRUE. Das liegt daran, dass der Pin mit einem internen Pull-up-Widerstand auf HIGH und per Tastendruck auf LOW gezogen wird. Der Key pin_value gibt einen anlogen Wert an, der bei Buttons keine Rolle spielt.
In diesem Fall habe ich Button2 gedrückt, und das Board hat sofort eine Meldung mit allen aktivierten Buttons und deren Werten sowohl an das out-Topic, das am Debug-Node hängt, als auch an das Topic
NodeESP/[PID]/button/state/get/out
gesendet. Das letzte Topic wird in Node-RED ausgewertet. Dazu kommt ein JSON-Node, der aus dem reinen Text ein JSON-Objekt macht. Der Split-Node trennt das Button-Array in einzelne Elemente auf, die nacheinander an den Switch-Node weitergereicht werden. Dieser überprüft den Pinnamen und entscheidet, um welchen der beiden Buttons es sich handelt. Es folgt ein Template-Node, der einfach nur den Wert von pin_state filtert, also TRUE oder FALSE an den nächsten Node weitergibt. Hierbei handelt es sich um einen Dashboard-Button, der einen An-Zustand anzeigt, wenn der Wert FALSE war, und umgekehrt. Er invertiert an dieser Stelle also sozusagen den Wert des Buttons.
Wenn Sie auf das Dashboard wechseln, indem Sie beispielsweise auf das Dashboard-Register auf der rechten Seite und anschließend auf das Rechteck mit dem Pfeil nach oben klicken, sehen Sie auch die beiden Buttons. Da das Board beim Loslassen des Buttons direkt die Statusveränderung mitteilt, können Sie also sofort sehen, welcher Button gedrückt und welcher nicht gedrückt ist.
Der große Vorteil bei MQTT und dem Verwenden eines Online-Brokers ist, dass man die Buttons von überall in der Welt aus auswerten kann. Sie können also das Board mit zur Arbeit nehmen, während der Node-RED-Server zu Hause auf einem Rechner läuft. Und dann könnten Sie beispielsweise das Licht und die Heizung einstellen, wenn Sie sich auf den Nachhauseweg machen, oder per Sprachausgabe den Daheimgebliebenen mitteilen, dass Sie auf dem Weg sind. Und das alles mit einem simplen Knopfdruck von irgendwo auf der Welt.
Funktioniert, so wie in der Anleitung beschrieben wunderbar…
Den Flow leicht an ein praktisches Anwendungsbeispiel angepasst :-)
Bei mir funktioniert nur ein Knopf. Wenn beide Buttons nicht gedrückt sind, sind beim funktionierenden Button ca 3V zwischen den Beinchen, beim „kaputten“ nur 0.01V. Beim Drücken gehen (wie erwartet) die Spannungen jeweils auf 0V. Dass dann beim 0.01V-Button keine Nachricht an den Broker rausgeht ist nicht verwunderlich.
Ist der IO18 vielleicht falsch konfiguriert und es fehlt ein pull-up?
Neue Erkenntnis: Wenn man mit einem Patchkabel IO18 auf 3V3 zieht (statt auf 0V mit dem Button aus dem Originalschema) dann wird eine mqtt-Nachricht versendet. Das bestätigt die Vermutung, dass IO18 falsch konfiguriert ist und einen Pull-Down statt eines Pull-Ups hat.
Die Verkabelung ist unvollständig. So kann der andere Button kein Ereignis auslösen. Beiliegend meine Verkabelung, bei der beide Buttons ordnungsgemäß reagieren.
Soll das so sein?
Hallo,
nach den FW Update 16.12.2018
Auch geschafft mit eigenem Broker :-) Klappt bisher auch bei mir alles so wie es soll.
im Flow angezeigter Button-state wird nicht dynamisch angepasst, solange der Button gedrückt wird ..
Dashboard und Flow zeigen Unterschiedliches an, ist das normal? wie müßte das korrigiert werden??
Hallo,
ich denke das ist im Programm des NoeESP drin.
Es wird hier die abfallende Flanke gemeldet, es müsste schon beim Druck des Tasters/Button, ansteigende Flanke eine Meldung erfolgen.
Ob überhaupt eine Flankenauswertung erfolgt wewis man nicht.
Hallo,
das ist richtig, aber alle zwei Button aufeinmal überwacht und gemeldet.
So wie ich das verstehe wird hier wohl einmal der Druck und beim zweiten Mal das Loslassen gemeldet.
Hallo,
mit dem Broker auf dem Raspberry Pi.
Moin,
Warum kann ich nicht meinen eigenen Mosquitto Broker nutzen?
Ich habe am ESP meinen Server eingerichtet, aber es kommen keinerlei Pakete an.
Hallo,
haben Sie in dem Node-RED-Flow den Broker geändert?
–> Schnipp <–
{
"id": "3c53c9b8.8965a6",
"type": "mqtt-broker",
"z": "",
"name": "fkainka.de",
"broker": "broker.fkainka.de", <<<— hier die IP-Adresse oder den Server eintragen
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": true,
"keepalive": "60",
"cleansession": true,
"willTopic": "",
"willQos": "0",
"willPayload": "",
"birthTopic": "",
"birthQos": "0",
"birthPayload": ""
},
——
Ja, das hat damit aber nichts zu tun.
Es gibt keinerlei Pakete vom NodeESP, die sich am Broker Interface melden.
Auch über Wireshark sind keine Pakete zu sehen. Ich hatte meinen Wifi AP in verdacht gehabt, der lässt aber Client Kommunikation zu.
Mmmhh… Hierzu kann ich nur beschreiben, wie es bei mir funktioniert hat, in der Hoffnung, dass das etwas hilfreich ist. Bei mir musste ich das Programm „day12“ (logisch) auf dem NodeESP laden (und das noch einmal prüfen) und danach die MQTT-Konfiguration. Der NodeESP zeigte erst einmal „rot“, nach einem neuen Laden wurde die Anzeige „grün“. Ich meine, dass ich ihn zwei bis drei Mal neu gestartet habe :-| (o.k. keine sinnige Problemlösung)
Im Node-RED müssen die beiden MQTT-Felder ebenfalls „connected“ anzeigen (hier verwende ich einen anderen Rasp-Pi als Server). Mit einem doppelten Klick kann die Konfiguration (am besten eine IP-Adresse) geprüft werden.
Auf dem RaspPi mit dem Mosquitto-Server kann unter /var/log/mosquitto die Log-Datei angeschaut werden. Wenn alles läuft, sieh das ungefähr so aus:
„1544644050: New connection from 192.168.XXX.ESP on port 1883.
1544644050: New client connected from 192.168.XXX.ESP as [PID] (c1, k15).
1544644169: New connection from 192.168.XXX.RED on port 1883.
1544644169: New client connected from 192.168.XXX.RED as mqtt_[PID-RED] (c1, k60).
1544644189: New connection from 192.168.XXX.ESP on port 1883.
1544644189: Client [PID] already connected, closing old connection.
1544644189: Client [PID] disconnected.
1544644189: New client connected from 192.168.XXX.ESP as [PID] (c1, k15).
1544644377: Client mqtt_[PID] disconnected.“
Aaaaalso: Ich bin dem Problem auf die Schliche gekommen.
Mein Broker arbeitet einwandfrei.
Leider schein das Programm auf dem ESP Probleme zu haben.
Ich musste mehrfach resetten und andere Programme laden, bis ich nun endlich die erste MQTT Nachricht vom ESP auf der Leitung sehen konnte.
Aber Meine Broker antwortet mit Connection refused. Warum? Na ganz einfach: der kleine ESP sendet im connect command kein User oder Passwort mit und deshalb bekomme ich keine Verbindung.
Ich hier mal nen Screenshot gemacht.
@Der Zingel,
deine, ich drück es mal so aus, ‚Vermutungen‘ können nicht stimmen.
Ein altes und immer passendes Sprichwort sagt:“ Wer viel misst, misst Mist.“
Schau bei mir, ich habe nach der gepostetn Anleitung einen HQTT Server als Service auf einen RPi installiert und laufen.
Dazu und auch zur Kommunikation, NodeESP -> PC/Browser, war kein Passwort nötig.
Dein Problem liegt wo anderst.
@Der Zingel,
gerade einen Broker auf dem PC aufgesetzt und erfolgreich getestet.
2.Bild
Ich hatte beim iobroker auch ein Passwort für mqtt eingerichtet, ging auch nicht, habe dann den Passwortschutz entfernt dann ging es, scheint also so als ob die Einstellungen beim ESP für Benutzername/Passwort nicht funktionieren.
Eventuell überträgt der esp das Passwort verkehrt, eventuell hilft es den hash aus der Passwortdatei zu nutzen.
Hallo Frank,
1. was ist ein ioBroker?
2. ich habe nirgendwo ein Benutzer/Passwort
Wenn ich den Broker auf dem RPi starte werde ich nicht gefragt nach einem Benutzer/Passwort, geht auch nicht da ich den als Service laufen habe.
Auf dem PC starte ich auch nur die exe fertig, kein Benutzer/Passwort
@paulaner
Bevor man sich aus dem Fenster lehnt, sollte man überlegen ;)
In der NodeESP Firmware ist ein Bug, der verhindert, dass Userdaten, die man im Broker eingerichtet hat nicht im Connect Command übertragen werden.
Mit dem Screenshot habe ich das nachgewiesen.
Hallo,
eventuell äußert sich Fabian mal dazu, ober schon mit einem Benutzer/Passwort Erfahrung hat.
@Der Zingler
nimm meine Entschuldigung wenn ich falsch liege.
@paulaner
Kein Problem.
Mal schauen, ob sich Fabian meldet.
iobroker ist ein mqtt-Broker (unter anderem). Ohne Passwort geht es ja auch, aber am mqtt-Broker kann man ein Passwort einrichten damit nicht jeder darauf zugreifen kann, und das gleiche Passwort müsste man dann am ESP eingeben damit er sich anmeldet, aber das geht eben nicht. Also eingeben geht schon aber funktionieren tut es nicht ;)
Danke, wieder was gelernt.
Nutze Node-Red als App unter iobroker. In iobroker aber mqtt-Client installiert. Auf dem Rechner mqtt-Server separat. Das läuft.
Hallo,
ich habe auch gerade meinen eigenen Mosquitto Server auf einen Raspberry 3B eingerichtet.
Die IP in der config von NadeESP rein und submitted.
Die zwei Änderungen im Flow, fkainka.de gegen meine RPi IP, deployed, fertig.
und hier eine ganz einfach Anleitung.
https://www.open-homeautomation.com/de/2016/06/09/install-an-mqtt-broker-on-your-raspberry-pi/
Hallo,
klappt wunderbar.
Beim debuggen bekomme ich pro Button zwei (2) Meldungen.
– bei einer ‚pin_state‘ = true
– bei der anderen ‚pin_state‘ = false
ok
So wie ich das verstehe wird hier wohl einmal der Druck und beim zweiten Mal das Loslassen gemeldet. (Sorry, eben den Antwort-Knopf übersehen)
Soll das so sein?