MQTT
MQTT ist ein Protokoll ("Message Queue Telemetry Transport"), mit dem Daten und Befehle zwischen verschiedenen Geräten ausgetauscht werden. Die Kommunikation erfolgt dabei über einen Serverdienst, den so genannten MQTT-Broker.
MQTT wurde entwickelt, um möglichst effizient, sicher und mit wenig Datenlast zu kommunizieren.
Eine sehr kurze Einführung in MQTT
MQTT wird ausführlich auf diesen [[1]] hier erklärt. Eine FHEM-orientierte Einführung findet man auf dieser Seite.
FHEM und MQTT
MQTT benötigt für den Betrieb einen (und nur einen) zentralen Server, der formal Broker genannt wurde. Ein solcher Server kann extern (also außerhalb von FHEM, zum Beispiel mosquitto) als auch durch FHEM selbst bereitgestellt werden. Wer MQTT jetzt nutzen will, sollte keinen externen Server installieren, sondern FHEM als Server nutzen.
Damit FHEM als Server für MQTT funktioniert, muss ein Modul installiert werden, das die Aufgabe des Brokers übernimmt. Es handelt sich um das Modul MQTT2_SERVER.[1] Dieser FHEM-eigene Server bietet weniger Optionen als ein vollwertiger MQTT-Server wie mosquitto, ist jedoch für kleinere Installationen völlig ausreichend. Ein MQTT-Server kann mehrere FHEM-Installationen bedienen[2].
Einbindung mit externem Broker
Wird in der MQTT Einführung beschrieben:
Für die Kommunikation zwischen einem MQTT-fähigen Objekt und dem Broker ist der Broker zuständig (außerhalb von FHEM). Die Kommunikation zwischen Broker und FHEM geschieht via dem IO-Modul 00_MQTT.pm (so genannte physikalische Stufe, siehe dazu [Erläuterung zum Zwei-Stufen-Modell]. Damit innerhalb von FHEM das Objekt angesprochen werden kann, muss es weiter in FHEM ein Gerät vom Typ MQTT_DEVICE geben, das die Befehle vom Objekt entgegennimmt bzw. an das Objekt sendet.
Einbindung mit MQTT2 von FHEM
Hier gilt das oben gesagte, wobei nun die Kommunikation zwischen dem MQTT-fähigen Objekt und dem Broker durch FHEM selbst bereitgestellt wird. Dazu muss in FHEM ein Gerät
defmod <Broker- bzw Devicename> MQTT2_SERVER 1883 global
angelegt werden (die Zahl 1883 bezieht sich auf den Port, auf dem MQTT arbeitet).
Seit November 2018 ist es mit MQTT2_CLIENT[3] möglich, MQTT2 DEVICE-Geräte einzurichten, ohne dass MQTT2_SERVER auf derselben Installation vorhanden sein muss. MQTT2_CLIENT kann auch mit einem klassischen Broker wie mosquitto betrieben werden.
Weitere Hinweise zur Verwendung der MQTT2-Module sind in den Praxisbeispielen zu finden.
MQTT2_SERVER und MQTT2_CLIENT ermöglichen - im Unterschied zur klassischen Einbindung - passwortgeschütze Datenübertragungen zwischen den einzelnen Komponenten.
MQTT_GENERIC_BRIDGE
Das Modul MQTT_GENERIC_BRIDGE kann seit November 2018 mit allen drei IO-Modul-Varianten zusammen eingesetzt werden, also sowohl mit MQTT2_SERVER bzw. MQTT2_CLIENT oder MQTT (00_MQTT.pm).
Dabei sollte man jedoch beachten, dass zur Verwendung mit den MQTT2-IO's unbedingt die autocreate-Funktion des betreffenden IOs ausgeschaltet wird und dies auch bleibt[4]! Weiter wird das Perl-Modul libmodule-pluggable-perl benötigt[5], damit im Hintergrund auch das Modul MQTT geladen werden kann.
Anwendungsfälle und -beispiele für das Modul sind diesem Thread zu entnehmen.
Performancefragen...
...oder was sollte man als Lösung wählen, wenn man in die MQTT-Welt einsteigt[6]? Grundsätzlich sollte man davon ausgehen, dass innerhalb von FHEM die Verarbeitung derselben Daten näherungsweise denselben Aufwand bedeuten, unabhängig davon, welche der Implementierungen (MQTT2_CLIENT, MQTT oder MQTT2_SERVER) man konkret wählt. Ein externer Broker hat daher vor allem dann Vorteile, wenn die MQTT Daten überwiegend für was anderes (nicht FHEM) verwendet werden, oder MQTT zweckentfremdet wird (wie z.Bsp. für Musikübertragung). Nutzt man das MQTT-Protokoll dagegen vorwiegend innerhalb von FHEM, ist eher der Einsatz von MQTT2_SERVER in Betracht zu ziehen. Dieser soll Anfängern die Anbindung von MQTT Geraeten in FHEM einfacher machen. Wer später merkt, dass er doch einen externen Broker benötigt, kann dann immer noch auf MQTT2_CLIENT in Verbindung mit einem anderen Broker wechseln. Dagegen ist der Weg von MQTT_DEVICE zu MQTT2_DEVICE mit erheblich mehr Aufwand verbunden.
Links
- Thread, zur Entstehungsgeschichte von MQTT2_CLIENT
- Ankündigungsthread zur MQTT2-Erweiterung der MQTT_GENERIC_BRIDGE
Hinweise
- ↑ Die Zahl 2 an FHEM bedeutet nicht, dass es sich um eine neuere Protokollversion für FHEM handelt (also nicht so etwas wie MQTT 2.0), sondern das erst kürzlich MQTT in FHEM integriert wurde.
- ↑ Dies gilt sowohl für einen klassischen Broker wie für einen MQTT2_SERVER.
- ↑ commandref
- ↑ siehe dazu diesen Thread zu den technischen Hintergründen
- ↑ Dieses kann über
apt-get install libmodule-pluggable-perl
installiert werden - ↑ vgl. hierzu diesen Beitrag von Rudolf König