MQTT ist ein Protokoll, welches bei der Vernetzung von Endgeräten im Internet der Dinge (Internet of things = IoT) eine wichtige Rolle spielt. Es wurde bereits 1999 von IBM entwickelt und hatte ursprünglich das Ziel. geräte miteinader zu vernetzen, die nur über teure und geringe Bandbreiten miteinander kommunizieren konnten. Konkret ging es damals um Sattelitenverbindungen. Es ist daher streng darauf ausgelegt, einfach, also mit möglichst wenig Datenmenge und gleichzeitig zuverlässig zu kommunizieren. Im Jahr 2010 wurde MQTT lizenzfrei und ist mittlerweile ISO Standard (ISO/IEC 20922:2016).
Für das Smart Home eignet sich MQTT vor allem deshalb so gut, weil es so einfach ist. Außerdem ist die Zahl der zu vernetzenden Geräte extrem groß.
Inhaltsverzeichnis
1. Publish-Subscribe Kommunikation
Das MQTT Protokoll ist so aufgebaut, dass es sog. Publisher gibt, die Nachrichten veröffentlichen und Subscriber, die Nachrichten abonieren. Die Teilnehmer kommunizieren jedoch nicht direkt miteinander sondern über einen sog. „Broker“. Dieser verwaltet, empfängt und versendet die Nachrichten.
2. Der MQTT Client
Jeder Client ist ein Endnutzer, der sowohl Nachrichten senden, als auch empfangen kann. Er identifiziert sich beim Broker durch die sog. Client ID. Im Smart Home könnte ein Client zB. eine LED Lampe sein. Ebenso ein Client wäre ein Bewegungssensor.
3. MQTT Topics
Die Nachrichtenübermittlung im MQTT gestützten Smarthome läuft nach dem „Topic-System“. Es handelt sich hier dabei um eine Art Ordnerstruktur. Ein Beispiel wäre die Struktur: "Wohnung1/Zimmer3/Licht/"
. Die Struktur ist nicht vorgegeben, sondern frei wählbar. Jede Nachricht, die über MQTT gesendet wird, wird in eine solche Struktur eingruppiert. Wenn also unserer Bewegungsmelder das Signal BEWEGUNG sendet, dann wird dies immer einem bestimmten Topic zugeordnet – beispielsweise „Wohnung1/Zimmer3/Sensoren/Bewegungsmelder/"
. Diese Topics können aboniert werden. Unsere Lampe könnte also genau diesen Topic abonieren. Der Broker würde dann an die Lampe alle Nachrichten weiterleiten, die auf diesem Topic eingehen – und zwar nur auf diesem Topic, wenn sonst kein anderen aboniert wurde. Im Smarthome übernimmt Home Assistant mit seiner Erweiterung zigbee2mqtt die Anmeldung und Auswertung der Topics. In der Log Datei von zigbee2mqtt kann man die einzelnen Topics genau nachvollziehen.
Es existiert auch ein Mechanismus, mit dem sich das Ordnersystem der Topics gruppieren lässt: sogenannte Single-Level-Wildcards(+) und Multi-Level-Wildcards(#)
- Die Single-level-Wildcard ersetzt ein Element eines Topics durch eine Wildcard, sprich: Ein Subscriber zum topic „5OG/+/Temperatursensor/Temperatur“ würde alle Nachrichten erhalten, die den drei angegebenen Leveln entsprechen, ungeachtet der Wildcard. Nachrichten zu beispielsweise „5OG/Zimmer2/Temperatursensor/Temperatur“ oder „5OG/Flur/Temperatursensor/Temperatur“ würden jetzt empfangen werden.
- Die Multi-level-Wildcard ersetzt die ganze folgende Baumstruktur. Eine Subscription zum Topic „5OG/#“ würde absolut alle Nachrichten empfangen, die mit „5OG/“ beginnen, auch z.Bsp „5OG/Flur/Tischkicker/Schummelmodul/Status“
- Wildcards lassen sich beliebig kombinieren, beispielsweise „+/+/Temperatursensor/#“ für alle Temperatursensor-Daten aus allen Stöcken und Zimmern.
4. Sicherheitsmerkmale
Wichtig im Smarthome ist vor allem, dass eine Nachricht den Empfänger auch erreicht. MQTT stellt dies dadruch sicher, dass die Nachricht mit drei sog. Quality-of-Service-Levels (QoS) gesendet werden kann. (0) at most once, (1) at least once und (2) exactly once. MQTT stellt auch sicher, dass die Nachricht übertragen wird, wenn der Broker kurzzeitig die Verbindung zu seinen Clients verliert. Doch MQTT enthält noch weitere Einstellmöglichkeiten, die für das Smarthome nützlich sind.
5. Retained Messages
Dabei handelt es sich um eine Funktion, die dafür sorgst, dass die letzte gesendete Nachricht eines Topics am Broker hinterlegt werden kann. Wenn ein neuer Subscriber sich zum Topic anmeldet, so wird automatisch die zuletzt gesendete Nachricht an ihn verschickt. Dies kann man im Smarthome unter Home Assistant dazu nutzen, dass ein neuer Subscriber automatisch den letzten Wert eines Gerätes erhält und damit dessen Zustand kennt, ohne darauf zu warten, dass auf diesem Topic erst eine Nachricht verschickt wird.
6. Last Will and Testament
Bereist beim Aufbau der Verbindung kann ein Client mitteilen, was passieren soll, wenn die Verbindung abbricht. Der Client verfügt also mehr oder weniger seinen letzten Willen. Wenn der Broker jetzt bemerkt, dass er mit dem Client nicht mehr verbunden ist, so sendet er auf dem entsprechenden Topic die vorher definierte Nachricht. Im Smarthome unter Home Assistant kann man diese Funktion dazu nutzen, dass eine Benarichtigung erfolgt, wenn ein Gerät seine Verbindung zum „Netz“ verloren hat. So könnte beispielsweise eine Lampe blinken, wenn einer der Fenster oder Türkontakte nicht mehr mit dem Broker verbunden ist und so nicht mehr gewährleistet werden kann, dass Home Assistant zuverlässige Aussagen darüber treffen kann, ob alle Fenster und Türen im Haus verriegelt sind.
7. Persistent Sessions
Wenn aufgrund der örlichen Gegebenheiten im Smart Home damit gerechnet werden muss, dass es häufiger zu Verbindungsabbrüchen von Clients kommt, so kann man persistente Sessions nutzen. Hier sendet der Broker an einen Client, der sich neu verbindet, alle für ihn bestimmten Nachrichten, die er verpasst hat. Auch diese Funktion ist unter Home Assistant und zigbee2mqtt nutzbar.