MQTT2-Module - Praxisbeispiele

Aus FHEMWiki

Einführung: MQTT bzw. MQTT2 in FHEM

Zur Einbindung von Geräten, welche mit einem MQTT-Server (früher: Broker) kommunizieren können, stehen unter FHEM zwei Optionen zur Verfügung. Details sind dieser Übersicht zu entnehmen. Hier werden als IO-Devices MQTT2_CLIENT bzw. MQTT2_SERVER genutzt.

Damit erfolgt die Einbindung der eigentlichen Geräte mit MQTT2_DEVICE, das u.A. die setextensions direkt unterstützt, also z.B. on-for-timer.


Info blue.png
Die nachfolgenden Beispiele gelingen am einfachsten mit MQTT2_SERVER als Server, für dieser sollte dabei autocreate aktiviert werden, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden.


Info blue.png
Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum Import von Code Snippets. Wer die Attribute direkt und einzeln bearbeitet, muß ggf. die "\" entfernen!


Beispiel:

define MQTT2_FHEM_Server MQTT2_SERVER 1883 global
attr MQTT2_FHEM_Server autocreate 1

zigbee2mqtt

Darstellung in FHEMWEB

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 des zigbee2mqtt-Diensts 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.

mqtt:
  client_id: 'zigbee_pi'

Da der Dienst auch später in den Anlernmodus versetzt werden kann, kann man auch gleich permit_join: false setzen, um das versehentliche Einbinden neuer oder fremder Geräte zu unterbinden.

Define eines MQTT2-Devices als "Bridge"

Dann kann eine Art "Grund-Device" angelegt werden, das für die Ansteuerung des eigentlichen Server-Dienstes genutzt wird, der nach Konfiguration von zigbee2mqtt zur Verfügung steht.

In der Regel sollte dieses automatisch erstellt werden, wenn der zigbee2mqtt-Dienst (oder der betreffende Rechner) neu gestartet wird (oder FHEM oder dort ein Sensor einen Messwert sendet). Beispiel[1]:

defmod MQTT2_zigbee_pi MQTT2_DEVICE zigbee_pi
attr MQTT2_zigbee_pi IODev MQTT2_FHEM_Server
attr MQTT2_zigbee_pi IODev MQTT2_FHEM_Server
attr MQTT2_zigbee_pi readingList zigbee_pi:zigbee2mqtt/bridge/state:.* state\
  zigbee_pi:zigbee2mqtt/0x90fd9ffffe65db16:.* { json2nameValue($EVENT, ) }\
  zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT, ) }\
  zigbee_pi:zigbee2mqtt/bridge/log:.* { json2nameValue($EVENT, 'log_') }
attr MQTT2_zigbee_pi room MQTT2_DEVICE

Für die Funktion einer zigbee2mqtt-Bridge steht ein template bereit, das direkt die passenden Attribute vergibt, um dem zigbee2mqtt-Dienst passende Anweisungen geben zu können und weitere Geräte für die eigentlichen Aktoren und Sensoren anzulegen:

set MQTT2_zigbee_pi attrTemplate zigbee2mqtt_bridge

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.

Vereinzeln der eigentlichen Geräte

Über das mit dem template vergebene bridgeRegexp-Attribut

attr MQTT2_zigbee_pi bridgeRegexp zigbee2mqtt/([A-Za-z0-9]*)[/]?.*:.* "zigbee_$1" 

werden anschließend neue MQTT2_DEVICE-Geräte automatisch angelegt, sobald ein bisher unbekanntes Zigbee-Gerät einen neuen Status (z.B. einen Meßwert) meldet. Um zu erfragen, welche Geräte dem zigbee-Deinst bekannt sind, kann man get MQTT2_zigbee_pi devicelist true eine Liste abgefragt werden, die weitere Informationen zu den bereits angelernten Geräten enthält. Geräte, die nicht automatisch etwas senden, kann man mit Hilfe des MQTT2_SERVER-Geräts einmalig schalten, damit diese ihren Status bzw. das erfolgreiche Schalten zurückmelden, Beispiel[2]:

set MQTT2_FHEM_Server publish zigbee2mqtt/0x90fd9ffffe0bcd51/set {"state":"ON","brightness":60}

Für Gerätetypen, für die bereits templates vorhanden sind, ist es am einfachsten, diese templates einmalig auf die Geräte anzuwenden, wie oben für die Bridge beschrieben. Dafür wird immer vorausgesetzt, dass ein neues Device mit autocreate (ggf. über die bridgeRegexp) angelegt wurde[3]

Beispiele:

IKEA-Tradfri-Birne

Beispiel eines dimmbaren Tradfri-Leuchtmittels

defmod IKEA_Bulb2 MQTT2_DEVICE
attr IKEA_Bulb2 IODev MQTT2_FHEM_Server
attr IKEA_Bulb2 icon light_control
attr IKEA_Bulb2 devStateIcon {zigbee2mqtt_devStateIcon255($name)}
attr IKEA_Bulb2 readingList zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT) }
attr IKEA_Bulb2 setList on:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {"state":"ON"}\
    off:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {"state":"OFF"}\
    brightness:colorpicker,BRI,0,15,255 zigbee2mqtt/0x90fd9ffffe0bcd51/set {"state":"on","$EVTPART0":"$EVTPART1"}
attr IKEA_Bulb2 webCmd toggle:on:off:brightness
attr IKEA_Bulb2 model L_02a_zigbee2mqtt_bulb

Kann man auch die Farbtemperatur einstellen, wird die setList wie folgt erweitert:

...
color_temp:colorpicker,CT,250,1,454 zigbee2mqtt/0x90fd9ffffe0bcd51/set {"$EVTPART0":"$EVTPART1"}

Die templates sind dabei in der Regel so gestaltet, dass eventuell mehr Optionen in FHEMWEB erscheinen, als tatsächlich vorhanden oder erwünscht sind. Da sich obige Lampe durch Klicken auf das devSTateIcon schalten läßt, genügt für diese folgendes webCmd:

attr IKEA_Bulb2 webCmd brightness

Durch die model-Angabe kann nachvollzogen werden, welches template angewendet wurde.

Temp/Hum. Sensor

tbd

Motion Sensor

Als MQTT-Server wird hier mosquitto verwendet, als IO-Device wird daher ein MQTT2_CLIENT-Gerät definiert:

defmod mqtt2_client MQTT2_CLIENT 192.168.2.4:1883
attr mqtt2_client autocreate 1
attr mqtt2_client rawEvents zigbee2mqtt/GB_Bewegungsmelder:.*
attr mqtt2_client room test
attr mqtt2_client subscriptions #

Das eigentliche Device sieht dann so aus:

defmod GB_Bewegungsmelder_MQTT2 MQTT2_DEVICE zigbee_158d0001f9d030
attr GB_Bewegungsmelder_MQTT2 IODev mqtt2_client
attr GB_Bewegungsmelder_MQTT2 devStateIcon motion:motion_detector@red off:motion_detector@green no_motion:motion_detector@green
attr GB_Bewegungsmelder_MQTT2 icon motion_detector@blue
attr GB_Bewegungsmelder_MQTT2 readingList mqtt2client:zigbee2mqtt/GB_Bewegungsmelder:.* { json2nameValue($EVENT) }
attr GB_Bewegungsmelder_MQTT2 room MQTT2_DEVICE
attr GB_Bewegungsmelder_MQTT2 stateFormat {\
if(ReadingsVal("$name","occupancy",0) eq "true") {\
	sprintf("motion");;\
	} else {\
	sprintf("no_motion");;	\
	}\
}

Tasmota

Tasmota (Theo Arends Sonoff MQTT Over The Air - einer offenen Firmware von arendst) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann.

X mark.svgBitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die die herstellereigene firmware ersetzt wird!


MQTT2_DEVICE

Dieses sollte bei aktiviertem autocreate am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet wird oder an einem evtl. vorhandenen Taster geschalten. Hier wurden Tasmota version(en) 6.1.1 und 6.2.1 getestet, Hardware war Sonoff Touch und S20.

Manuelle Anpassungen

Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden:

defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD
attr MQTT2_DVES_9B01BD IODev m2server
attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/sonoffkitchen/STATE:.* { json2nameValue($EVENT) }\
   DVES_9B01BD:tele/sonoffkitchen/LWT:.* LWT\
   DVES_9B01BD:cmnd/sonoffkitchen/POWER:.* POWER\
   DVES_9B01BD:tele/sonoffkitchen/UPTIME:.* { json2nameValue($EVENT) }\
   DVES_9B01BD:tele/sonoffkitchen/SENSOR:.* { json2nameValue($EVENT) }\
   DVES_9B01BD:tele/sonoffkitchen/INFO1:.* { json2nameValue($EVENT) }\
   DVES_9B01BD:tele/sonoffkitchen/INFO2:.* { json2nameValue($EVENT) }\
   DVES_9B01BD:tele/sonoffkitchen/INFO3:.* { json2nameValue($EVENT) }\
   DVES_9B01BD:stat/sonoffkitchen/RESULT:.* { json2nameValue($EVENT) }\
   DVES_9B01BD:stat/sonoffkitchen/STATE:.* { json2nameValue($EVENT) }
attr MQTT2_DVES_9B01BD room MQTT2_DEVICE
attr MQTT2_DVES_9B01BD setList on cmnd/sonoff/POWER on\
   off cmnd/sonoff/POWER off\
   reboot cmnd/sonoff/Restart 1
attr MQTT2_DVES_9B01BD webCmd on:off:reboot

attrTemplate

Für gängige Tasmota-Geräte stehen templates bereit, mit denen sich diese schnell konfigurieren lassen. Beachten Sie dazu den Abschnitt zu attrTemplate. Bei Anwendung eines template mit "split" im Namen werden dabei weitere Geräte angelegt und konfiguriert.

Shelly

Vorbemerkung

Auch für Shelly-Geräte steht eine Auswahl an templates bereit. Beachten Sie auch hier, dass uU. bei Anwendung eines template mit "split" im Namen weitere Geräte angelegt und konfiguriert werden.

Shelly1

Shellybulb

Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:

Internals:
  CFGFN     
  CID        shellybulb_3CC533
  DEF        shellybulb_3CC533
  DEVICETOPIC MQTT2_shellybulb_3CC533
  IODev      MQTT2_FHEM_Server
  NAME       MQTT2_shellybulb_3CC533
  NR         246
  STATE      ???
  TYPE       MQTT2_DEVICE
  READINGS:
    2018-12-12 19:28:08   status_blue     0
    2018-12-12 19:28:08   status_brightness 61
    2018-12-12 19:28:08   status_effect   0
    2018-12-12 19:28:08   status_gain     26
    2018-12-12 19:28:08   status_green    0
    2018-12-12 19:28:08   status_ison     true
    2018-12-12 19:28:08   status_mode     color
    2018-12-12 19:28:08   status_red      255
    2018-12-12 19:28:08   status_temp     3250
    2018-12-12 19:28:08   status_white    0
Attributes:
  IODev      MQTT2_FHEM_Server
  readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, 'status_') }
  room       MQTT2_DEVICE
Darstellung in FHEMWEB nach Anwendung des template

Dann bei den set-Anweisungen das attrTemplate "shellybulb" auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.

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.

Milight: Darstellung in FHEMWEB

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

Info blue.png
Noch zu überarbeiten mit attrTemplate; experimentelle Versionen stehen zur Verfügung


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:colorpicker,BRI,0,1,100 milight/0xBE59/rgbw/1 {"$EVTPART0":"$EVTPART1"}\
   hue:colorpicker,HUE,0,1,359 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 

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

Für ein dynamisches Icon kann derselbe code verwendet werden wir bei Tradfri beschrieben, dazu muss in der MQTT-Konfiguration des Milight-Hub auch "brightness" mit als zu sendendes Element eingestellt bleiben.

Beispiel für ein RGB-CCT-Device:

defmod Licht_Wz_all MQTT2_DEVICE
attr Licht_Wz_all IODev MQTT2_Broker
attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/
attr Licht_Wz_all group Licht
attr Licht_Wz_all icon light_control
attr Licht_Wz_all readingList milight_hub_10693013:milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\
milight_hub_10693013:milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\
milight_hub_10693013:milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\

attr Licht_Wz_all room Wohnzimmer
attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {"status":"ON"}\
off milight/0x5D02/rgb_cct/0 {"status":"OFF"}\
level milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
next_mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
mode_speed_up milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
mode_speed_down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
device_id milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
effect milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\
commands milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}
attr Licht_Wz_all sortby 1
attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue
attr Licht_Wz_all webCmdLabel command\ 
:brightness:saturation\
:color_temp:hue

Allgemeine Hinweise

MQTT2_SERVER nutzen

Nutzt man das rawEvents-Attribut am MQTT2_SERVER[4], kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.

attrTemplate

Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion attrTemplate genutzt werden. Für gängige Gerätetypen stehen bereits einige templates bereit. Um Ihnen die Auswahl zu erleichtern, kann mit set <MQTT2-Device-Name> attrTemplate ? eine Liste der vorhandenen Templates samt kurzer Beschreibung aufgerufen werden. Haben Sie ein passendes template gefunden, wenden Sie es mit set <MQTT2-Device-Name> attrTemplate <template_name> an.

Wer plant, mehrere gleichartige Geräte anzulegen, aber andere Einstellungen zu wählen, als sie ind den vorhandenen templates enthalten sind, kann hierfür auch die attrTemplate-Funktion nutzen. Hierfür können die vorhandenen templates aus der Datei mqtt2.template[5] als Basis genutzt werden, Ihre templates speichern Sie einfach als neue Datei mit der Endung .template im selben Verzeichnis und lesen diese mit { AttrTemplate_Initialize() } neu ein. Danach können Sie diese direkt verwenden. Haben Sie ein template erstellt und möchten dieses teilen, erstellen Sie einfach einen Beitrag in diesem Thread. Für Fragen, die Meldung von Fehlern oder für Verbesserungsvorschläge an den templates in mqtt2.template ist dieser Thread gedacht.

Links

Hinweise

  1. Hier waren bereits zwei Zigbee-Geräte angelernt
  2. Die mit 0x... beginnende Angabe entspricht dabei dem friendly_name. Wer seine Geräte umbenannt hat, muß ggf. dann sein bridgeRegexp-Attribut entsprechend anpassen.
  3. Dieses befindet sich dann im Raum MQTT2_DEVICE. Um diesen sichtbar zu machen, muß ggf. die Browser-Seite neu geladen werden.
  4. attr MQTT2_FHEM_Server rawEvents .*
  5. zu finden im Unterverzeichnis fhem/FHEM/lib/AttrTemplate