Anwendungsfälle und Beispiele für MQTT_GENERIC_BRIDGE

Begonnen von hexenmeister, 01 Oktober 2018, 10:57:38

Vorheriges Thema - Nächstes Thema

hexenmeister

Einen wunderschönen guten Morgen allerseits!
Aufgrund von Nachfragen und teilweise auch Missverständnissen halte ich es für eine gute Idee, hier ein paar alltagstaugliche Anwendungsbeispiele für die GenericBridge zusammen zu bringen.
Natürlich ist jeder eingeladen auch seine Lösungen beizusteuern. Allerdings sollten allzu identische Fälle nicht nochmal gepostet werden.

Ich fange an...
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

hexenmeister

#1
Vorab:
Es wird eine (und in den allermeisten Fällen einzige!) Mqtt-Broker-Installation benötigt. Es empfiehlt sich mosquitto zu verwendet. Das geht quasi 'fire and forget':
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mosquitto


Grundsätzliche Konfiguration:
Definition MQTT

defmod mqtt MQTT <Broker-IP>:1883
attr mqtt alias MQTT Broker
attr mqtt devStateIcon .*active:none:disconnect .*disconnected:none:connect
attr mqtt group MQTT
attr mqtt icon mqtt
attr mqtt room IO_Devices
attr mqtt stateFormat Connection: connection


wer möchte, kann den Status des FHEM-Servers per MQTT LWT mitteilen:
attr mqtt last-will retain:1 system/<fhem-name>/connection/status connection lost
attr mqtt on-connect retain:1 {Log3("mqtt",3,"connected to MQTT server");;1} system/<fhem-name>/connection/status connected
attr mqtt on-disconnect retain:1 {Log3("mqtt",3,"disconnected from MQTT server");;1} system/<fhem-name>/connection/status disconnected


Anstatt MQTT-Modul können auch MQTT2_CLIENT und MQTT2_SERVER verwendet werden.
In Verbindung mit MQTT2_SERVER muss in diesem autocreate abgeschaltet werden (attr <name> autocreate 0), ansonsten bekommt die GenericBridge keine Events mehr weitergeleitet!

Definition Generic Bridge
defmod mqttGenericBridge MQTT_GENERIC_BRIDGE
attr mqttGenericBridge IODev mqtt
attr mqttGenericBridge alias MQTT generic bridge
attr mqttGenericBridge group MQTT
attr mqttGenericBridge room IO_Devices
attr mqttGenericBridge stateFormat dev: device-count in: incoming-count out: outgoing-count


eine Reading an einem beliebigen Device per MQTT setzen (für State-Reading soll state verwendet werden)
attr <device-name> mqttSubscribe <reading-name>:topic=<topic>
(anstatt 'topic' kann für eine bessere Lesbarkeit 'readings-topic' verwendet werden)

ein Set-Befehl an einem beliebigen Device mit dem per MQTT gesendeten Wert ausführen
(für set ohne namen (set on, set off) soll state verwendet werden)
attr <device-name> mqttSubscribe <set-befehl>:stopic=<topic>
(anstatt 'stopic' kann für eine bessere Lesbarkeit 'set-topic' verwendet werden)

ein Attribut an einem beliebigen Device per MQTT setzen
attr <device-name> mqttSubscribe <attribut-name>:atopic=<topic>
(anstatt 'atopic' kann für eine bessere Lesbarkeit 'attr-topic' verwendet werden)

eine Änderung eines Readings per MQTT senen
attr <device-name> mqttPublish <readings-name>:topic=<topic>

eine Änderung eines Attributes per MQTT senen
attr <device-name> mqttPublish <attribut-name>:atopic=<topic>

Verwendung von Variablen
Es können mit dem Attribute mqttDefaults Variablen definiert werden, die in mqttPublish und mqttSubscribe verwendet werden können:
attr <device-name> mqttDefaults base={"allgemeinerPfad/"}
...
attr <device-name> mqttPublish <reading-name>:topic={"$base/irgendEinName"}

Weiterhin können in Topics folgende vordefinierte Variablen verwendet werden:
$reading - aktuell zu verarbeitende Reading
$device - aktulles Gerät
$name - Die Variable $name wird im Unterschied zu $reading ggf. ueber die in 'mqttAlias' definierten Aliases beeinflusst. (s. Commandref für mqttAlias)
attr <device-name> mqttPublish <reading-name>:topic={"$base/$device/$name"}

Mehrere Readings auf einmal
Es können für einen Topic (sinnigerweise mit Variablen) auch mehrere Readings gleichzeitig angegeben werden. Diese müssen in diesem Fall durch ein | getrennt werden:
attr <device-name> mqttPublish <reading-name1>|<reading-name2>:topic={"$base/$device/$name"}

Wildcards
mit einem * kann ein Topic für alle Readings zusammen definiert werden:
attr <device-name> mqttPublish *:topic={"$base/$device/$name"}

Beim Subscribe können in der Topic-Definition auch MQTT-Wildcards (+ und #) verwendet werden.
Falls der Reading-Name mit einem '*'-Zeichen am Anfang definiert wird, gilt dieser als 'Platzhalter'. Der tatsaechliche Name der Reading (und ggf. des Geraetes) wird dabei durch Variablen aus dem Topic definiert ($reading, $name). Im Topic wirken diese Variablen als Wildcards, macht natuerlich nur Sinn, wenn Reading-Name auch nicht fest definiert ist (also faengt mit '*' an).

... und vieles Weitere in Commandref: https://fhem.de/commandref_DE.html#MQTT_GENERIC_BRIDGE
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

hexenmeister

#2
Sensoren-Werte von einer FHEM-Instanz in eine andere übertragen

Definition für ein HomeMatic-Device (Dirk's-Sensor + Verwendung von DevPoint-Modul):
(es werden gezielt bestimmte Werte übertragen)
defmod <sensor-device-name> CUL_HM xxxxxx
attr <sensor-device-name> model HB-UW-Sen-THPL-I
...
attr <sensor-device-name> mqttDefaults base=haus/wohnzimmer
attr <sensor-device-name> mqttPublish humidity|luminosity|dewpoint|absoluteHumidity:topic={"$base/klima/$name"}


Definition eines Empfänger-Dummy:
(es werden alle Werte bei passenden Topics empfangen)
defmod <dummy-device-name> dummy
attr <dummy-device-name> readingList absoluteHumidity dewpoint humidity luminosity temperature vapourPressure
attr <dummy-device-name> mqttDefaults base=haus/wohnzimmer
attr <dummy-device-name> mqttSubscribe *:topic={"$base/klima/$reading"}
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

hexenmeister

#3
Aktoren, die in einer FHEM-Instanz definiert sind, aus einer anderen schalten
Switch

Definition eines Schalters (EnOcean FSR14)
defmod <actor-device-name> EnOcean 0000000B
attr <actor-device-name> IODev FGW14
attr <actor-device-name> alias Licht
attr <actor-device-name> devStateIcon off:light_light_dim_00@gray on:light_light_dim_100@yellow .*:hourglass
attr <actor-device-name> eep A5-38-08
attr <actor-device-name> group Beleuchtung
attr <actor-device-name> gwCmd switching
attr <actor-device-name> icon light_downlight
attr <actor-device-name> manufID 00D
attr <actor-device-name> mqttPublish state:topic=haus/wohnzimmer/licht/top/state
attr <actor-device-name> mqttSubscribe state:stopic=haus/wohnzimmer/licht/top/set
attr <actor-device-name> room Wohnzimmer
attr <actor-device-name> subDef 0010000B
attr <actor-device-name> subType gateway
attr <actor-device-name> webCmd on:off


Definition des Dummy-Steuerung-Device:
defmod <dummy-device-name> dummy
attr <dummy-device-name> devStateIcon off:light_light_dim_00@gray on:light_light_dim_100@#FF5722 .*:hourglass
attr <dummy-device-name> eventMap {usr=>{'an'=>'on','aus'=>'off'}}
attr <dummy-device-name> group Beleuchtung
attr <dummy-device-name> icon light_ceiling
attr <dummy-device-name> mqttPublish state:topic=haus/wohnzimmer/licht/top/set
attr <dummy-device-name> mqttSubscribe state:topic=haus/wohnzimmer/licht/top/state
attr <dummy-device-name> room Wohnzimmer
attr <dummy-device-name> setList on off
attr <dummy-device-name> webCmd an:aus


Natürlich kann auch ein anderes MQTT-Client verwendet werden. Z.B. NodeRED:
[{"id":"7baea47e.820cac","type":"mqtt in","z":"62e90aa0.5d60d4","name":"","topic":"haus/wohnzimmer/licht/top/state","qos":"2","broker":"e7d617ab.0f9208","x":290,"y":360,"wires":[["3336774a.795608"]]},{"id":"8f2201e7.dae91","type":"mqtt out","z":"62e90aa0.5d60d4","name":"","topic":"haus/wohnzimmer/licht/top/set","qos":"","retain":"","broker":"e7d617ab.0f9208","x":840,"y":360,"wires":[]},{"id":"3336774a.795608","type":"ui_switch","z":"62e90aa0.5d60d4","name":"","label":"Wohnzimmerlicht","group":"e4f06bbf.a91a28","order":1,"width":0,"height":0,"passthru":false,"decouple":"true","topic":"","style":"","onvalue":"on","onvalueType":"str","onicon":"","oncolor":"","offvalue":"off","offvalueType":"str","officon":"","offcolor":"","x":570,"y":360,"wires":[["8f2201e7.dae91"]]},{"id":"e7d617ab.0f9208","type":"mqtt-broker","z":"","broker":"192.168.0.15","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":""},{"id":"e4f06bbf.a91a28","type":"ui_group","z":"","name":"Schalter","tab":"50154367.e9148c","order":2,"disp":true,"width":"6","collapse":false},{"id":"50154367.e9148c","type":"ui_tab","z":"","name":"Home","icon":"dashboard","order":1}]
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

hexenmeister

#4
Aktoren, die in einer FHEM-Instanz definiert sind, aus einer anderen schalten
Dimmer

Aktor-Definition:
defmod <actor-device-name> CUL_HM xxxxxx
attr <actor-device-name> model HM-LC-Dim1TPBU-FM
...
attr <actor-device-name> mqttPublish pct:topic=haus/wohnzimmer/licht/level state:topic=haus/wohnzimmer/licht/state
attr <actor-device-name> mqttSubscribe pct:stopic=haus/wohnzimmer/licht/set


Streuer-Dummy:
defmod <dummy-device-name> dummy
attr <dummy-device-name> devStateIcon off:light_light_dim_00@gray 0:light_light_dim_00@gray dark:light_light_dim_10@#FF5722 \d:light_light_dim_10@#FF5722 1\d:light_light_dim_20@#FF5722 2\d:light_light_dim_30@#FF5722 3\d:light_light_dim_40@#FF5722 4\d:light_light_dim_50@#FF5722 5\d:light_light_dim_60@#FF5722 half:light_light_dim_60@#FF5722 6\d:light_light_dim_70@#FF5722 7\d:light_light_dim_80@#FF5722 bright:light_light_dim_80@#FF5722 8\d:light_light_dim_90@#FF5722 9\d:light_light_dim_100@#FF5722 100:light_light_dim_100@#FF5722 on:light_light_dim_100@#FF5722 .*:hourglass
attr <dummy-device-name> eventMap {dev=>{'on'=>'100','off'=>'0'}, \
usr=>{'an'=>'on','aus'=>'off','dunkel'=>'15','hell'=>'70','halb'=>'50'}}
attr <dummy-device-name> group Beleuchtung
attr <dummy-device-name> icon light_ceiling
attr <dummy-device-name> mqttPublish level:topic=haus/wohnzimmer/licht/set\
state:topic=haus/wohnzimmer/licht/set
attr <dummy-device-name> mqttSubscribe level:topic=haus/wohnzimmer/licht/level\
state:topic=haus/wohnzimmer/licht/state
attr <dummy-device-name> readingList level
attr <dummy-device-name> room Wohnzimmer
attr <dummy-device-name> setList on off level:slider,0,1,100
attr <dummy-device-name> stateFormat level
attr <dummy-device-name> webCmd an:hell:halb:dunkel:aus:level
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

hexenmeister

#5
Aktoren, die in einer FHEM-Instanz definiert sind, aus einer anderen schalten
Shutters / Blinds

Aktor-Definition:
defmod <actor-device-name> CUL_HM xxxxxx
attr <actor-device-name> model HM-LC-Bl1PBU-FM
...
attr <actor-device-name> mqttPublish pct:topic=haus/wohnzimmer/rollo/all/position state:topic=haus/wohnzimmer/rollo/all/state
attr <actor-device-name> mqttSubscribe pct:stopic=haus/wohnzimmer/rollo/all/set



Steuer-Dummy:
defmod <dummy-device-name> dummy
attr <dummy-device-name> devStateIcon runter:fts_shutter_100 \d(.\d)*:fts_shutter_100 hoch:fts_shutter_10 100:fts_shutter_10 1\d(.\d)*:fts_shutter_90 2\d(.\d)*:fts_shutter_80 3\d(.\d)*:fts_shutter_70 4\d(.\d)*:fts_shutter_60 5\d(.\d)*:fts_shutter_50 6\d(.\d)*:fts_shutter_40 schatten:fts_shutter_40 7\d(.\d)*:fts_shutter_30 8\d(.\d)*:fts_shutter_20 9\d(.\d)*:fts_shutter_10 nacht:fts_shutter_10
attr <dummy-device-name> eventMap {usr=>{'oeffnen'=>'100','schliessen'=>'0','halb'=>'60','schatten'=>'80','dunkel'=>'30'}}
attr <dummy-device-name> group Beschattung
attr <dummy-device-name> icon fts_shutter
attr <dummy-device-name> mqttPublish position:topic=haus/wohnzimmer/rollo/all/set state:topic=haus/wohnzimmer/rollo/all/set
attr <dummy-device-name> mqttSubscribe position:topic=haus/wohnzimmer/rollo/all/position state:topic=haus/wohnzimmer/rollo/all/state
attr <dummy-device-name> readingList position
attr <dummy-device-name> room Wohnzimmer
attr <dummy-device-name> setList position:slider,0,1,100
attr <dummy-device-name> stateFormat position
attr <dummy-device-name> webCmd oeffnen:schatten:halb:dunkel:schliessen:position
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

choetzu

#6
Zitat von: hexenmeister am 01 Oktober 2018, 10:58:03
Sensoren-Werte von einer FHEM-Instanz in eine andere übertragen

Definition für ein HomeMatic-Device (Dirk's-Sensor + Verwendung von DevPoint-Modul):
(es werden gezielt bestimmte Werte übertragen)
defmod <sensor-device-name> CUL_HM xxxxxx
attr <sensor-device-name> model HB-UW-Sen-THPL-I
...
attr <sensor-device-name> mqttDefaults base=haus/wohnzimmer
attr <sensor-device-name> mqttPublish humidity|luminosity|dewpoint|absoluteHumidity:topic={"$base/klima/$name"}


Definition eines Empfänger-Dummy:
(es werden alle Werte bei passenden Topics empfangen)
defmod <dummy-device-name> dummy
attr <dummy-device-name> readingList absoluteHumidity dewpoint humidity luminosity temperature vapourPressure
attr <dummy-device-name> mqttDefaults base=haus/wohnzimmer
attr <dummy-device-name> mqttSubscribe *:topic={"$base/klima/$reading"}


danke für deine gute Erklärung. Ich versuche grad meine ersten Gehversuche, doch ich scheitere kläglich.. aber irgendwie bin ich zu blöd. Ich versuche grad all meine Sysmon Readings an ein Dummy auf einer anderen Instanz zu übertragen:

Zu sendende Device (Sysmon):
*:topic=Test/Sysmon/$device/$name

Zu empfangendes Device (Sysmon_Dummy):
*:topic=Test/Sysmon/$device/$reading

die Daten werden auch übertragen und kommen an. Jedoch wird nix ins Dummy geschrieben. Mit geschweiften Klammern gibts Fehlermeldungen. Was mach ich falsch?
Raspi3, EnOcean, Zwave, Homematic

hexenmeister

#7
Deine Geräte heißen unterschiedlich (Sysmon und Symon_dummy)?
Wenn ja, dann wird gesendet auf "Test/Sysmon/Sysmon/..." und gelauscht auf "Test/Sysmon/Sysmon_Dummy/...". Passt nicht zusammen.

Versuche mal auch den Topic in Klammern UND Anführungszeichen zu nehmen:
*:topic={"Test/Sysmon/$device/$reading"}
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

choetzu

Danke für die schnelle Antwort. Das $device hat mich verwirrt. Aber nun ist es klar. Danke.

So funktioniert es:

Sysmon sendet mqttPublish:
*:topic={"Test/Sysmon/$device/$reading"}

Sysmon_Dummy empfängt mqttSubscribe:
*:topic={"Test/Sysmon/Sysmon/$reading"}
Raspi3, EnOcean, Zwave, Homematic

MadNBG

Hallo, ich habe ESPs und Sonoffs für mich entdeckt und stelle nun logischerweise auf mqtt um.
Die generic bridge ist ja unendlich geil, kein Stress mehr mit fhem2fhem und die Handhabung ist selbsterklärend.
Leider hab ich ein Problem - ich weiß nicht, woran es liegt.

Ein Schalter soll zwei Lampen einschalten.

....  mqttPublish state:topic=/Lampe1/cmnd/POWER state:topic=/Lampe2/cmnd/POWER

...geht leider nicht. Die topics passen, einzeln kann ich sie schalten.
Kann mir bitte jemand auf die Sprünge helfen?

Fhem-Zentrale: Raspi 3 mit mosquito, CO20, Jeelink-USB
Fhem-"FrontEnd": Win10 mit N3700 und 16Gb RAM, MySQL
mapleCUN für Außensensor AS2000, IT, FS20
Diverse Sonoffs, ESPs, netatmo, Enigma2, LaCrosse

hexenmeister

#10
Das ist so nicht vorgesehen, ein reading = ein Topic. Wenn es zwei gleich benannte gibt, wird irgendein davon verwendet.
Du kannst jedoch mit einer 'expression' nachhelfen.
Ungefähr so:
mqttPublish state:expression={"/Lampe1/cmnd/POWER"=>$message, "/Lampe2/cmnd/POWER"=>$message}
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

MadNBG

Danke für Deine rasche Hilfe!
Muss mich noch schlau machen, wie das mit den expressions funktioniert. Werde dann den Erfolg posten, ich denke das ist ein häufiges Szenario, vielleicht wäre da eine feste Funktion in der bridge auch sinnvoll?
Fhem-Zentrale: Raspi 3 mit mosquito, CO20, Jeelink-USB
Fhem-"FrontEnd": Win10 mit N3700 und 16Gb RAM, MySQL
mapleCUN für Außensensor AS2000, IT, FS20
Diverse Sonoffs, ESPs, netatmo, Enigma2, LaCrosse

hexenmeister

#12
Bis jetzt habe ich zwei Nachrichten ausgehend einer Readingsänderung für einen ziemlichen Sonderfall gehalten. Welches Szenario macht es zu einem häufigen Anwendungsfall? Und wie sollen Rückmeldungen von mehreren Geräten zusammengefasst werden?
Wenn es nur um Zusammenfassung von mehreren Devices geht, dann ist das eher Aufgabe für eine 'structure'.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

MadNBG

Ja , ich hatte das Schalten mehrerer Geräte bisher mittels structure gelöst. Ich dachte, dass ich mir somit einige devices  und notifys sparen kann.
Aber ich bin vermutlich auf dem Holzweg -  ich gehe stark davon aus, dass Du Dich viel intensiver damit beschäftigt hast.
Ich danke Dir!

Fhem-Zentrale: Raspi 3 mit mosquito, CO20, Jeelink-USB
Fhem-"FrontEnd": Win10 mit N3700 und 16Gb RAM, MySQL
mapleCUN für Außensensor AS2000, IT, FS20
Diverse Sonoffs, ESPs, netatmo, Enigma2, LaCrosse

frankreed

Hallo,

ich habe erfolgreich einen Homematic-Heizkörperthermostat mit der GENERIC MQTT BRIDGE eingerichtet:

Das Thermostat habe ich mal exemplarisch mal unter dem Namen "KZ_Thermostat" angelegt.
Unter diesem Device dann den Channel 4 ausgewählt, der als Device "KZ_Thermostat_Clima" automatisch angelegt wurde.

Im Device "KZ_Thermostat_Clima" dann folgende Attribute angelegt:

mqttPublish: measured-temp|desired-temp:topic={"fhem/kinderzimmer/$name"} measured-temp|desired-temp:qos=1 measured-temp|desired-temp:retain=0
   
mqttSubscribe: desired-temp:stopic={"fhem/kinderzimmer/solltemp/set"}

Steuerung und Auslesen über den MQTT-Broker klappt einwandfrei.

Vielleicht kann mein Beispiel ja jemand brauchen....  :)

Grüße Frank