Martin Weissenböck

Was ist ... MQTT?

img

MQTT ist ein Protokoll, das zur Übertragung geringer Datenmengen, zum Beispiel von Messstationen, entwickelt wurde. Geringe Datenmengen, keine extremen Anforderungen an die Übertragungsgeschwindigkeit, einfach zu implementieren: deshalb ist MQTT für das Smart Home (die Haus-Automatisierung) oder allgemeiner für das Internet-of-Things (IoT) sehr gut geeignet. MQTT kann als inoffizieller Standard für das IoT angesehen werden.

Wie die Signale übermittelt werden, ist für das MQTT-Protokoll unwichtig. Nachrichten werden mittels TCP/IP - das Protokoll, über das auch unsere Internetanfragen laufen - übertragen. Dafür sind die Ports 1883 (unverschlüsselt) und 8883 (verschlüsselt) reserviert.

Auf der Webseite der MQTT-Organisation sind alle technischen Details dokumentiert. Von HiveMQ gibt es das kostenlose eBuch MQTT Essentials (englisch).

Was erwartet Sie in diesem Beitrag?

Sie werden…


Ein im Text weist darauf hin, dass in der Langversion an der Stelle mehr Text, ein Programmcode oder eine detaillierte Anleitung zu finden ist. Die Langversion kann über den Link und den QR-Code am Ende des Beitrags abgerufen werden.

Die Grundlagen

Jedes MQTT-Netzwerk hat genau einen Server, auch Broker oder central hub genannt. Häufig wird im Smart Home dazu ein Raspberry oder ein kleiner Linux-Desktoprechner verwendet. Da dieser Rechner ständig eingeschaltet sein muss, sollte auf den Energiebedarf geachtet werden.

Alle anderen Mitglieder des Netzwerks sind Clients. Jeder Client muss vorerst beim Server registriert werden. Die Registrierung heißt pairing, oft übersetzt mit anlernen. Clients tauschen keine Nachrichten direkt untereinander aus, vielmehr geht alles immer über den Server (Broker):

Aufbau einer Nachricht

Nachrichten bestehen aus einem Thema (Topic) und einem Nachrichteninhalt (Payload).

Bei der Ausgabe werden die Einträge nach dem Schlüsselbegriff oft alphabetisch sortiert.

Übertragen einer Nachricht

Ein Client kann Nachrichten an den Server senden, etwa wenn sich eine Messgröße (wie etwa die Raumtemperatur) ändert oder wenn der Client aufgefordert wird, etwas zu melden.

Dieses Senden von Nachrichten heißt publish (veröffentlichen).

Beispiel einer Nachricht (vereinfacht):

Das bedeutet: in einem Smart Home ist im Bad der Temperatursensor Temp installiert und der meldet eine relative Feuchtigkeit von 42.63% und eine Temperatur von 24.00°C

Abonnieren

Ein (anderer) Client kann Nachrichten abonnieren. Das heißt, der Client teilt dem Server über die Mitteilung subscribe (anmelden) mit, dass er Nachrichten zu einem Topic (im Beispiel oben zum Topic "Bad/Temp") bekommen möchte, etwa um den Temperaturwert für die Steuerung der Heizung zu verwenden.

Auch mehrere Topic können auf einmal abonniert werden:

Mit "#" werden alle Topics einer Hierarchieebene und aller folgenden abonniert. mit "+" nur die Topics der jeweiligen Ebene.

Beispiel: "Erdgeschoß/Wohnzimmer/#" abonniert alle Geräte im Wohnzimmer, "Erdgeschoß/#" alle Geräte im Erdgeschoß.. Mit "Erdgeschoß/+/Temp" können alle Temperatursensoren im Erdgeschoß ausgelesen werden.

Eine Nachrichtenübertragung im Detail

ErklärungClient 1RichtungServer = BrokerRichtungClient 2
Client 1 meldet sich beim Server anCONNECT   
Server bestätigt die Anmeldung (Acknowledge)CONNACK   
Client 2 hat sich schon früher angemeldet und schickt über das Topic "Bad/Temp" den Wert 24°C an den Server   PUBLISH Bad/Temp 24°C
Dabei wird auch retain gesetzt. Der Server merkt sich die Temperatur  24°C retain
Client 1 abonniert die Temperatur im BadSUBSCRIBE Bad/Temp   
Server schickt den letzten (über retain) bekannten TemperaturwertPUBLISH Bad/Temp 24°C24°C  
Client 2 veröffentlicht einen neuen Temperaturwert: 27°C  27°CPUBLISH Bad/Temp 27°C
Der Server merkts sich den aktuellen Wert und schickt ihn an alle Abonnenten weiter.PUBLISH Bad/Temp 27°C27°C  
Client 1 möchte nicht mehr an der Datenübertragung teilnehmen und meldet sich abDISCONNECT   

Experimente mit MQTT

Dazu benötigen wir einen MQTT-Broker, mindestens einen Client und ein Programm, mit dem wir die PUBLISH- und SUBSCRIBE-Befehle an den Broker senden können

Der Broker: Mosquitto

mosquitto-text-side

Häufig wird Mosquitto eingesetzt: es gibt Versionen für Linux, Mac, Windows und andere. Die Installation wird auf der Mosquitto-Webseite sehr detailliert beschrieben.

Bei mir ist der Mosquitto-Broker unter der Adresse 192.168.12.71 zu finden, die Beispiele sind darauf ausgerichtet. Diese IP-Adresse bitte entsprechend dem eigenen Netz ändern.

Der Client: ESP32

Dann brauchen wir wenigstens ein Gerät, das auf MQTT-Befehle reagiert. Wir können dazu den ESP32 verwenden, der in den PCNEWS 180 beschrieben worden ist. Die Adresse des Brokers muss in Configuration   Configure MQTT eingetragen sein:

tasmota-04

Note

Wer ein Smart Home mit ZigBee und/oder Node-RED aufgebaut hat, findet in der Langversion dieses Beitrags Hinweise, wie damit MQTT-Experimente möglich sind.

Der ESP32 hat (bei mir) die Adresse 192.168.50.1, GPIO2 ist (wie in den PCNEWS 180 beschrieben) als Relais konfiguriert. Um den Zustand des Ausgangs 2 anzuzeigen, wird entweder eine LED angeschlossen oder der Ausgang in der Benutzeroberfläche kontrolliert:

toggle

Das Programm: MQTTX CLI

MQTTX ist nützliches Programm, mit dem alle MQTT-Befehle erprobt werden können und das ohne zusätzlich installierte Programme auskommt. Es wird für verschiedene Betriebssysteme angeboten.

Hier zeige ich den Aufruf über die Windows-Kommandozeile (CLI). Warum über die CLI? Weil damit am besten zu sehen ist, worauf es ankommt!

Jetzt kann es losgehen!

Tip

Die PowerShell verlangt für Zeichenketten in der Kommandozeile einfache Apostrophe - sonst sind in Windows doppelte Apostrophe üblich.

Publish

Beim ESP32 mit der Adresse http://192.168.50.1 ist der Ausgang GPIO2 im Zustand OFF .

Ein Klick auf Information zeigt das Topic dieses ESP32:

Topic

Das Topic zur Steuerung von Tasmota-Komponenten beginnt immer mit cmnd/tasmota_, gefolgt von den letzten 6 Stellen der MAC-Adresse, hier F8:29:14.

MAC Address

Um den Power-(Relay-)Ausgang umzuschalten, ist ein MQTT-Befehl mit dem Topic cmnd/tasmota_F82914/power und dem Payload toggle zu senden:

PS C:\users\martin\Downloads> .\mqttx-cli-win-x64.exe pub -h 192.168.12.71 -p 1883 -t 'cmnd/tasmota_F82914/power' -m 'toggle'

Der Reihe nach:

Absenden! Die Antwort von Mosquitto in der PowerShell

Im Browser wird auf der ESP32-Benutzeroberfläche die Änderung angezeigt. Wer eine LED angeschlossen hat, sieht die Zustandsänderung auch dort.

Subscribe

Nun wollen wir etwas von unserem ESP32 empfangen. Der Prozessor bietet viele Anschlussmöglichkeiten für Peripheriekomponenten. Programme müssen nicht geschrieben werden, alles kann über die Configuration eingestellt werden.

Der ESP32 hat aber auch eine Reihe von Sensoren eingebaut: so kann das Magnetfeld über eine Hallsonde oder die Prozessortemperatur direkt ausgelesen werden. (Das Handbuch weist darauf hin, dass diese Messwerte nicht sehr genau sind.)

Um das Magnetfeld anzeigen zu können, ist über Configuration  Configute Module GPIO36 auf HallEffect1 zu setzen. Nicht vergessen: danach Save anklicken!

Der interne Temperatursensor wird über Tools  Console und den Befehl SetOption146 1 eingeschaltet. Es folgt wieder Tools und Main Menu.

In der Benutzeroberfläche erscheint:

Temperatur und Magnetfeld

Mit subscribe teilen wir dem Broker mit, dass wir diese Daten gerne (regelmäßig, bei jeder Änderung) hätten:

PS C:\users\martin\Downloads\> .\mqttx-cli-win-x64.exe sub -h 192.168.12.71 -t 'tele/tasmota_F82914/SENSOR' -p 1883

Zu den Teilen des Befehls:

Und schon treffen die Antworten ein:

Zusammenfassung

MQTT kommuniziert vor allem mit den beiden Befehlen PUBLISH und SUBSCRIBE. Mit MQTTX CLI ist deren Funktion einfach zu erproben.

MQTTX (ohne CLI) liefert dieselben Informationen, allerdings mit einer grafischen Benutzeroberfläche.

Für alle wichtigen Programmiersprachen gibt es Programmbibliotheken, um MQTT-Befehle direkt aus Programmen absetzen zu können.

Darüber hinaus gibt es eine große Zahl anderer Programme zur Kommunikation.

MQTT und Node-RED

Node-RED ist ein grafischer Werkzeugkasten für die Programmierung von ereignisgesteuerten Abläufen. In einer Smart Home Steuerung treten Signale (Ereignisse) ohne vorhersehbaren Ablauf auf und erfordern daher spezielle Programmiertechniken.

Node-RED kann durch Paletten (Programmpakete) erweitert werden, daher kann die MQTT-Kommunikation zwischen Broker (Server) und Clients in Node-RED implementiert werden. Die einzelnen Funktionen werden in Nodes implementiert und mit einander verknüpft. Das Node-RED-Programm kann gemeinsam mit einem MQTT-Broker (wie etwa Mosquitto) und Zigbee2MQTT auf einem Rechner installiert werden. Noide-RED wird als Webseite über einen beliebigen Browser bedient. Übliche Adresse: http://<Rechner-Adresse>:1880.

MQTT und Zigbee2MQTT

ZigBee ist ein eigener Funkstandard, der wegen der geringeren Datenmenge weniger störungsanfällig ist. ZigBee-Komponenten bauen darüber hinaus dazu über ZigBee-Router ihr eigenes Mesh-Netzwerk auf und können damit auch große Flächen abdecken. ZigBee-Router sind, vereinfacht gesprochen, jene ZigBee-Komponenten, die ständig (über das Stromnetz) mit Energie versorgt werden und deshalb Signale an andere Komponenten weitergeben können. Das Mesh-Netzwerk wird von ZigBee selbstständig aufgebaut und bei Bedarf, zum Beispiel beim Ausfall einer Komponenten, selbstständig reorganisiert. Viele Komponenten für Smart Homes werden in zwei Varianten, nämlich für ZigBee und WLAN, angeboten. Zigbee2MQTT erlaubt die Verbindung von ZigBee-Geräten über MQTT.

Wichtige Begriffe

Connection:

Eine Verbindung zwischen Broker und Client (nach dem Pairing) zum Zweck des Datenaustauschs. Zwei Clients tauschen Daten nie direkt aus, immer nur über den Broker. Da der Broker ja den Überblick hat, entscheidet er selbst, wann Daten gesendet werden. Wenn ein Client etwas senden will, sendet er ein CONNECT-Ansuchen an der Broker. Dieser antwortet mit CONNACK (Connection acknowledge, Verbindung bewilligt).

Friendly name:

Jedes Gerät hat eine eindeutige MAC-Adresse, bestehend aus 12 Hexadezimalziffern und geschrieben beispielsweise als 94:B5:55:F8:29:14 oder 0x94b555f82914. Die Geräte können immer darüber angesprochen werden. Da das aber wenig benutzerfreundlich ist, kann zusätzlich ein friendly name, ein freundlicher Name, angegeben und in der Konfigurationsdatei des Brokers eingetragen werden. Beispiel: "Erdgeschoß/Küche/Deckenlampe".

ISO-Schichtenmodell:

MQTT ist in den Schichten 5-7 angelegt. Darunter (in der Schicht 4) ist TCP, das transmission control protocol und (in der Schicht 3) IP (das internet protocol).

Last will and testament (LWT):

Wenn ein Client eine Verbindung aufbaut, kann er zusätzlich eine Nachricht im Broker hinterlegen, die gesendet wird, wenn die Verbindung unterbrochen wird. Genannt last will and testament, (Letzter Wille und Testament) oder kurz nur will

Pairing:

Bevor eine Verbindung mit CONNECT angefordert werden kann, muss ein neues Gerät angemeldet werden. Der Vorgang heißt pairing, übersetzt oft mit anlernen. Dazu muss einerseits am MQTT Broker das Anlernen aktiviert werden und andererseits das neue Gerät selbst in den pairing-Modus versetzt werden.

Payload:

Der aktuelle Nachrichteninhalt; anders formuliert die Daten, die gesendet oder empfangen werden. Payloads werden häufig als JSON-Zeichenkette geschrieben, da diese Schreibweise sehr leicht (für Menschen) lesbar und (für Programme) analysierbar ist.

Publish:

Der Mechanismus zum Senden von Daten

Publisher, Subscriber:

Clients können als Publisher oder Subscriber verwendet werden. Ein Publisher sendet Daten aus (Beispiel: Temperaturwerte), ein Subscriber empfängt Daten und wertet sie aus (Beispiel: ein Microcontroller, der einen Verbraucher schaltet). Viele Clients sind Publisher und Subscriber zugleich.

Quality of Service (QoS):

Welche Qualität der Datenübertragung ist in einem konkreter Anwendungsfall erforderlich, welche Maßnahmen zur Sicherung werden gefordert? Es gibt die Stufen 0, 1 oder 2.

Retain:

Wenn der aktuelle Zustand eines Clients auf Anforderung nicht übertragen werden kann, wird der letzte Zustand übertragen. Dazu ist natürlich eine Zwischenspeicherung im Broker notwendig. Beispiel: ein batteriebetriebener Temperatursensor schickt -- um Energie zu sparen -- nur dann Daten, wenn sich ein Wert ändert, .

Subscribe:

Der Mechanismus für das Anmelden zum Empfangen von Daten

Subscriber:

Siehe Publisher

Topic:

Übersetzt: Thema. Die Adresse eines Geräts oder einer Funktion eines Geräts als Zeichenkette

WebSocket:

WebSocket baut auf TCP auf und erlaubt eine bidirektionale Verbindung. MQTT-Befehle können in WebSockets "verpackt" werden und damit über HTTP/HTTPS übertragen werden. Das gestattet, MQTT-Befehle über Webbrowser zu senden und zu empfangen.

Zur Langversion

Link und QR-Code: https://pcnews.at/markdown/n181/index.html oder https://t.ly/lblE0

Copyright

by-nc-sa1