
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).
Sie werden…
den Einsatz von MQTT kennenlernen
Aufbau und Übertragung einer Nachricht kennenlernen
den Ablauf einer MQTT-Übertragung verstehen
eigene Versuche mit MQTT durchführen
die Verwendung von MQTT in ZigBee und Node-RED kennenlernen
die Unterschiede zwischen MQTT und HTML verstehen
die wichtigsten Fachausdrücken von MQTT verstehen
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.
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):
Clients senden Nachrichten an den Broker und geben an, von welchem Thema (Topic) die Nachricht handelt. Beispiel: Lufttemperatur im Badezimmer.
Clients können Nachrichten zu Themen abonnieren, auf die sie reagieren sollen. Beispiel: ein Client fragt nach der Lufttemperatur im Badezimmer und entscheidet, ob er zum Thema Badezimmerheizung den Nachrichteninhalt "Heizung ein" oder "Heizung aus" senden soll --- abhängig von der Temperatur und bei Bedarf auch von anderen Faktoren, wie etwa der Tageszeit. Ein weiterer Client hat das Thema Badezimmerheizung abonniert und schaltet über ein Relais die Heizung ein oder aus.
Nachrichten bestehen aus einem Thema (Topic) und einem Nachrichteninhalt (Payload).
Ein Topic ist eine Zeichenkette, die (im Smart Home) ein konkretes Gerät oder eine Funktion benennt.
Beispiel: der Temperatursensor wurde als "Temp" benannt. Durch Schrägstriche können Hierarchieebenen eingerichtet werden, Beispiele: "Bad/Temp" oder "Wohnzimmer/Temp" oder "Bad/Heizung".
Der Nachrichteninhalt wird oft in JSON-Form angegeben. JSON steht für "JavaScript Object Notation". Wie der Name schon sagt, ist dieses Format zur Speicherung und Übertragung von strukturierten Daten (das heißt von Objekten) für die Programmiersprache JavaScript entwickelt worden. JSON ist programmiersprachenunabhängig und wird auch gerne auf Webseiten zur Übertragung von Daten zwischen einem Client (zum Beispiel einem Webbrowser) und dem Server verwendet. ☝
Beispiele:
Befehl zum Einschalten eines Verbrauchers:
xxxxxxxxxx21{ "state":"on"2}
Meldung eines Temperatursensors:
xxxxxxxxxx21{ "temperature": 24.002}
Meldung eines Zwischensteckers über den aktuellen Zustanf (state) und Strom-, Energie-, Wirkleistungs- und Spannungsmesswerte (vereinfacht):
xxxxxxxxxx61{ "current":0.27,2"energy":3.97,3"power":60,4"state":"ON",5"voltage":2296}
Bei der Ausgabe werden die Einträge nach dem Schlüsselbegriff oft alphabetisch sortiert.
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):
xxxxxxxxxx71`{2`"topic":"Bad/Temp",3"payload": {4"humidity":42.63,5"temperature":24.006}7}`
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 ☝
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. ☝
| Erklärung | Client 1 | Richtung | Server = Broker | Richtung | Client 2 |
|---|---|---|---|---|---|
| Client 1 meldet sich beim Server an | CONNECT | → | |||
| 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 Bad | SUBSCRIBE Bad/Temp | → | |||
| Server schickt den letzten (über retain) bekannten Temperaturwert | PUBLISH Bad/Temp 24°C | ← | 24°C | ||
| Client 2 veröffentlicht einen neuen Temperaturwert: 27°C | 27°C | ← | PUBLISH Bad/Temp 27°C | ||
| Der Server merkts sich den aktuellen Wert und schickt ihn an alle Abonnenten weiter. | PUBLISH Bad/Temp 27°C | ← | 27°C | ||
| Client 1 möchte nicht mehr an der Datenübertragung teilnehmen und meldet sich ab | DISCONNECT | → |
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

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.
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:

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:

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!
Mit einem Klick in der Download-Seite auf v1.9.10.cli.win64.exe wird die Datei mqttx-cli-win-x64.exe in den Download-Ordner gestellt.
Im Startmenü im Suchfenster PowerShell eingeben und damit die Windows PowerShell öffnen.
Ins Download-Verzeichnis navigieren, üblicherweise mit cd \users\EigenerBenutzername\Downloads
Dort sollte mqttx-cli-win-x64.exe zu finden sein — mit dir überprüfen.
Jetzt kann es losgehen!
Tip
Die PowerShell verlangt für Zeichenketten in der Kommandozeile einfache Apostrophe - sonst sind in Windows doppelte Apostrophe üblich.
☝
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:

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.

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:
mqttx-cli-win-x64.exe ist der Name des Programms. Wer will, kann die Datei auf m.exe umgenennen -- spart Tipparbeit!
pub steht für publish - wir wollen etwas senden.
-h 192.168.12.71 Der Befehl geht an den Host 192,.168.12.71 - da ist der Mosquitto-Server installiert
-p 1883 Die Postnummer ist 1883. Da das der Standard ist, kann sie auch weggelassen werden
-t cmnd/tasmota_F82914/power Das Topic
-m toggle Die Mitteilung (Message = Payload) besteht aus einem einzigen Wort: toggle (umschalten).
Absenden! Die Antwort von Mosquitto in der PowerShell
xxxxxxxxxx41[2024-6-2] [17:07:39] » ... Connecting...2[2024-6-2] [17:07:39] » √ Connected3[2024-6-2] [17:07:39] » ... Message publishing...4[2024-6-2] [17:07:39] » √ Message published
Im Browser wird auf der ESP32-Benutzeroberfläche die Änderung angezeigt. Wer eine LED angeschlossen hat, sieht die Zustandsänderung auch dort. ☝
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:

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:
sub steht für subscribe
-t 'tele/tasmota_F82914/SENSOR' ist das Topic zum Anfordern der Messwerte
-h und -p sind schon bekannt.
Und schon treffen die Antworten ein: ☝
xxxxxxxxxx81{2"Time": "2024-06-02T17:42:39",3"ESP32": {4"Temperature": 72.2,5"HallEffect": 366},7"TempUnit": "C"8}
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. ☝
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. ☝
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. ☝
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.
Beim Broker geschieht dies mit einem Software-Befehl. zigbee2mqtt verwendet die Konfigurationsdatei configuration.yaml. Dort kann das pairing mit permit_join: true aktiviert werden. Nicht vergessen: nach dem paiting wieder auf false setzen.
Ein neues Gerät wird meistens bereits mit dem ersten Anschließen automatisch in den Pairing-Modus versetzt. Aber natürlich geht das auch nachträglich:
Oft wird dazu eine Taste solange gedrückt, bis eine LED blinkt.
LED-Lampen haben keine Tasten, daher werden sie vier- oder fünfmal kurz hintereinander ein- und ausgeschaltet. (Nicht vergessen: die Lampe muss zum Pairing natürlich zuletzt eingeschaltet bleiben.) Die Lampe beginnt dann im Zwei-Sekunden-Rhythmus zu "atmen", wird also langsam heller und wieder dunkler.
Gute Anleitungen zum Pairen sehr vieler Geräte sind in den ZigBee2MQTT-Gerätebeschreibungen zu finden.
Empfehlung: beim Pairen sollten Broker und neues Gerät möglich nahe beisammen sein. Das dürfte ein Sicherheitsmaßnahme sein, um unbeabsichtigtes Pairing zu verhindern.
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.
Stufe 0: Client und Server hängen über eine direkte Drahtverbindung zusammen, daher ist es unwahrscheinlich, dass Daten verloren gehen. Oder der Verlust einzelner Datenpakete ist zu verschmerzen
Stufe 1: Jedes Datenpaket muss tatsächlich ankommen, doppelte Pakete werden erkannt und aussortiert. Oder Stufe 2 ist zu aufwändig.
Stufe 2: Jedes Datenpaket muss genau einmal verarbeitet werden.
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.
Link und QR-Code: https://pcnews.at/markdown/n181/index.html oder https://t.ly/lblE0

Copyright
