ich habe eine Bridge zwischen mqtt und fhem implementiert.
das sind die Module 00_MQTT.pm, 10_MQTT_BRIDGE und 10_MQTT_DEVICE.pm
mit
define <mqtt-name> MQTT ip:port
legt man die Verbindung zum mqtt-broker an. Als broker habe ich
mosquitto verwendet. Das ist in C geschrieben und braucht nur minimal Resourcen und ist auf Debian basierten Systemen normalerweise als Packet verfügbar.
mit
define <mqtt-device-name> MQTT_BRIDGE <fhem-device>
legt man für ein bestehendes FHEM-device eine Verbindung zum mqtt an. Es wird die im IODev-attribute angegebne MQTT-verbindung verwendet.
Die Verbindung funktioniert bidirektioinal:
mit den Attributen 'publishState' und 'publishReading_<readingname> man kann Änderungen am State bzw. Readings nach mqtt publizieren. Der Attribut-wert ist immer das Topic an das die Message geschickt werden soll. Message-inhalt ist jeweils der neue Wert des Readings bzw. states.
mit den Attributen 'subscribeSet' bzw. 'subscribeSet_<setcommand>' kann man mqtt-topics abonnieren. Immer wenn eine Nachricht auf dem abonnierten Topic eintrifft für das betreffende Device 'set <devicename> <setcommand> <messageinhalt> ausgeführt.
Beispiel:
define mqtt MQTT 127.0.0.1:1883
define mqtt_licht_wohnzimmer MQTT_BRIDGE lichtwohnzimmer
attr mqtt_licht_wohnzimmer subscribeSet fhem/wohnzimmer/licht/set
attr mqtt_licht_wohnzimmer publishState fhem/wohnzimmer/licht
jetzt kann z.B. mit 'mosquitto_pub -t fhem/wohnzimmer/licht/set -m on' ein 'set lichtwohnzimmer on' auslösen.
oder mit einem 'mosquitto_sub -t fhem/wohnzimmer/licht' erfahren, wenn sich der state von 'lichtwohnzimmer' verändert.
für Readings werden die nahmen der betreffenden Readings als Teil des Attribute-names gesetzt:
define mqtt_heizung_wohnzimmer MQTT_BRIDGE heizungwohnzimmer
attr mqtt_heizung_wohnzimmer publishReading_mesured-temp fhem/wohnzimmer/temperature
attr mqtt_heizung_wohnzimmer subscribeReading_desired-temp fhem/wohnzimmer/temperature/set
jetzt erfährt man auf dem topic fhem/wohnzimmer/temperature, wenn sich das Reading 'mesured-temp' des fhem-devices 'heizungwohnzimmer' ändert. Die Temperatur kann man einstellen, indem man messages mit dem gewünschten Temperaturwert an das Topic 'fhem/wohnzimmer/temperature/set' schickt. MQTT_BRIDGE verwendet man, wenn man bestehende fhem-devices (Aktoren und Sensoren) über mqtt steuern bzw. sichtbar machen will.
mit
define <mqtt-device-name> MQTT_DEVICE
legt man ein neues auf mqtt-topics gemapptes FHEM-device an. Es wird die im IODev-attribute angegebne MQTT-verbindung verwendet. Messages von mqtt updaten die readings dieses devices direkt, es wird kein weiterer dummy benötigt. MQTT_DEVICE verwendet man zur Einbindung von über mqtt erreichbaren sensoren und aktoren.
Beispiel:
define licht_kinderzimmer MQTT_DEVICE
attr licht_kinderzimmer publishSet on off fhem/kinderzimmer/licht
attr licht_kinderzimmer subscribeReading_state fhem/kinderzimmer/licht/set
mit 'set licht_kinderzimmer on' schickt man jetzt eine message 'on' an das topic fhem/kinderzimmer/licht.
Umgekehrt kann das reading state über messages an fhem/kinderzimmer/licht/set gesetzt werden.
bzw:
define heizung_kinderzimmer MQTT_DEVICE
attr heizung_kinderzimmer publishSet_desired-temp fhem/kinderzimmer/temperatur
attr heizung_kinderzimmer subscribeReading_messured-temp fhem/kinderzimmer/temperatur/set
attr heizung_kinderzimmer stateFormat messured-temp
In den Topic-namen der vorgenannten Attribute werden aktuell noch keine Wildcards unterstützt.
um das Erstellen der Readings zu vereinfachen gibt es das Attribute autoSubscribeReadings:
'attr heizung_kinderzimmer autoSubscribeReadings fhem/kinderzimmer/+/set'
sorgt dafür, dass für alle empfangenen Messages automatisch das jeweils passende 'subscribeReading_xxx'-Attribut erstellt und das zugehörige Reading auch gleich geupdated wird. Das letzte '+' im Topic wird als Name des Readings benutzt.
Also wenn eine Message '17.5' an 'fhem/kinderzimmer/messured-temp/set' empfangen wird, wird 'attr heizung_kinderzimmer subscribeReading_messured-temp fhem/kinderzimmer/messsured-temp' gesetzt und gleichzeitig das Reading 'messured-temp' erzeugt und auf den Wert '17.5' gesetzt. Wenn alle gewünschten Readings auf diese Weise angelegt sind, kann man das Attribut 'autoSubscribeReadings' wieder entfernen.
alles
im SVN zu finden.
Gruß,
Norbert