MQTT2-Module - Praxisbeispiele
Einführung: MQTT2 vs. MQTT
Zur Einbindung von Geräten, welche mit einem MQTT-Server (früher: Broker) kommunizieren können, stehen unter FHEM zwei Optionen zur Verfügung: Man kann entweder einen dedizierten Server (wie z.B. mosquitto) nutzen, der dann über das Modul MQTT eingebunden wird und zu dem die Module MQTT_DEVICE und MQTT_BRIDGE gehören (bzw. noch MQTT_GENERIC_BRIDGE), oder man kann mit Hilfe des Moduls MQTT2_SERVER FHEM selbst zum MQTT-Server machen.
Gegenstand dieses Artikels sind Beispiele, wie MQTT-Client-Geräte mit Hilfe der MQTT2-Implementierung ohne einen weiteren Server wie mosquitto genutzt werden können.
Für alle Beispiele wird vorausgesetzt, dass ein MQTT2_SERVER-Device als Server definiert wurde. Es wird in einer Installation nur ein eiziger MQTT2_SERVER benötigt.
zigbee2mqtt
zigbee2mqtt ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.
Installation von zigbee2mqtt
Die Installation ist auf der Homepage des Projekts beschrieben. Ergänzend muß in der configuration.yaml eine client_id unter mqtt (z.B. zigbee_pi) vergeben werden.
Define eines MQTT2-Devices als "Bridge"
Dann kann eine Art "Grund-Device" angelegt werden, über das die gesamte Kommunikation zu allen angeschlossenen Zigbee-Geräten dann läuft:
defmod MQTT2_zigbee_pi MQTT2_DEVICE zigbee_pi attr MQTT2_zigbee_pi IODev MQTT2_FHEM_Server attr MQTT2_zigbee_pi setList permit_join {"zigbee2mqtt/bridge/config/permit_join $EVTPART1"}\ remove {"zigbee2mqtt/bridge/config/remove $EVTPART1"}\ log_level {"zigbee2mqtt/bridge/config/log_level $EVTPART1"}\ rename {"zigbee2mqtt/bridge/config/rename { \"old\":\"$EVTPART1\",\"new\":\"$EVTPART2\"}"}\ network_map {"zigbee2mqtt/bridge/networkmap $EVTPART1"}\ devicelist {"zigbee2mqtt/bridge/config/devices"}
attr MQTT2_zigbee_pi widgetOverride permit_join:true,false rename:textField remove:textField log_level:debug,info,warn,error network_map:raw,graphviz devicelist:noArg
Ist dieses angelegt, kann zigbee2mqtt mit set MQTT2_zigbee_pi permit_join true
in den Anlernmodus versetzt werden; anzulernende Geräte müssen dann nach Bedienungsanleitung in den Anlernmodus gebracht werden.
Nach einem Browser-refresh sollte das neue Device zusätzliche Readings in MQTT2_zigbee_pi erzeugt haben. Wer möchte, kann die Devices dann umbenennen; da diese in FHEM aber nachfolgend sowieso eigene Namen erhalten, kann dieses auch unterbleiben.
Vereinzeln der eigentlichen Geräte
Anschließend kann man - am einfachsten über die Anpassung der RAW-Definition des "Bridge"-Devices neue MQTT2_DEVICE-Geräte ableiten, die dann jeweils nur den Teil der readingList abbilden, der zu einem einzelnen pysischen Gerät gehört. Beispiele:
IKEA-Tradfri-Birne
Beispiel eines dimmbaren Tradfri-Leuchtmittels
defmod IKEA_Bulb2 MQTT2_DEVICE attr IKEA_Bulb2 IODev MQTT2_FHEM_Server attr IKEA_Bulb2 eventMap on:ON:off off:OFF:on attr IKEA_Bulb2 icon light_control attr IKEA_Bulb2 readingList zigbee_pi:zigbee2mqtt/Kueche_Durchgang_A2:.* { json2nameValue($EVENT) } attr IKEA_Bulb2 setList on {'zigbee2mqtt/Kueche_Durchgang_A2/set {"state":"ON"}'}\ off {'zigbee2mqtt/Kueche_Durchgang_A2/set {"state":"OFF"}'}\ brightness {"zigbee2mqtt/Kueche_Durchgang_A2/set {\"$EVTPART0\":\"$EVTPART1\"}"}\
attr IKEA_Bulb2 webCmd brightness attr IKEA_Bulb2 widgetOverride brightness:colorpicker,BRI,0,15,255
Temp/Hum. Sensor
tbd
Tasmota
tbd
Milight-Bridge
Vorbemerkung
Der esp8266_milight_hub ist ein open source- Projekt, mit dem auf Basis von openmili eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel. Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspriche dabei im Wesentlichen einem MySensors-Wifi-Gateway, es wird lediglich ein anderer CS-PIN genutzt, was allerdings in der Web-Oberfläche auch so umgestellt werden kann. Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist. Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit diesen ausgelöst werden.
Einstellungen am MiLight-Hub
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Einstellungen sind im Web-Interface des Hub einzustellen. Um auch %-Werte für die Helligkeit zu erhalten, sollten diese ebenfalls als zu sendendes Element ausgewählt werden.
FHEM-Devices
Bridge
Danach wird ein zentrales "Bridge-Device" definiert, über das später alle Informationen aller MiLight-Kanäle laufen bzw. zurückgemeldet werden.
define Milight_Bridge MQTT2_DEVICE milight_hub_1370325 attr Milight_Bridge IODev MQTT2_FHEM_Server attr Milight_Bridge readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/0:.* { json2nameValue($EVENT) }\ milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT) }\ ... milight_hub_1370325:milight/states/0x..../rgb_cct/1:.* { json2nameValue($EVENT) }
Einzelne Leuchtmittel
Um dann einzelne Geräte für jedes Leuchtmittel bzw. jede zu schaltende Gruppe zu erhalten, kopiert man dann (am besten über die RAW-Definition) die relevanten Teile aus dem Bridge-Device. Beispiel:
define Licht_Essen MQTT2_DEVICE attr Licht_Essen IODev MQTT2_FHEM_Server attr Licht_Essen eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/ attr Licht_Essen icon light_control attr Licht_Essen readingList milight_hub_1370325:milight/states/0xBE59/rgbw/0:.* { json2nameValue($EVENT) }\ milight_hub_1370325:milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT) } attr Licht_Essen room Esszimmer attr Licht_Essen setList on {'milight/0xBE59/rgbw/1 {"status":"ON"}'}\ off {'milight/0xBE59/rgbw/1 {"status":"OFF"}'}\ level {"milight/0xBE59/rgbw/1 {\"$EVTPART0\":\"$EVTPART1\"}"}\ hue {"milight/0xBE59/rgbw/1 {\"$EVTPART0\":\"$EVTPART1\"}"}\ command {"milight/0xBE59/rgbw/1 {\"$EVTPART0\":\"$EVTPART1\"}"}\ brightness {"milight/0xBE59/rgbw/1 {\"$EVTPART0\":\"$EVTPART1\"}"}\
attr Licht_Essen webCmd level:hue:command attr Licht_Essen widgetOverride state command:uzsuSelectRadio,Weiss,Nacht hue:colorpicker,HUE,0,1,359 level:colorpicker,BRI,0,1,100
Indem man in der readingList sowohl den einzelnen Kanal wie die Gruppenadresse (0) angibt, erhält man auch Rückmeldungen über Schaltvorgänge, die die Gruppe betreffen. Wer mag, kann dann noch ein Device anlegen, das nur den 0-Kanal abbildet; über dieses werden dann alle Leuchtmittel geschaltet, die zu der betreffenden Gruppenadresse gehören (im obigen Beispiel: 0xBE59).