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

hexenmeister

Ich habe eine ähnliche Definition

defmod OG_BZ_TT01_Clima CUL_HM xxx
attr OG_BZ_TT01_Clima alias HKThermostat: Bad
attr OG_BZ_TT01_Clima group Klima
attr OG_BZ_TT01_Clima icon hm-cc-rt-dn
attr OG_BZ_TT01_Clima model HM-CC-RT-DN
attr OG_BZ_TT01_Clima mqttDefaults base={"$base/og/bz"}
attr OG_BZ_TT01_Clima mqttPublish measured-temp|desired-temp|ValvePosition|controlMode:topic={"$base/klima/$name"}
attr OG_BZ_TT01_Clima mqttSubscribe desired-temp|controlMode:stopic={"$base/klima/$reading/set"}
attr OG_BZ_TT01_Clima peerIDs 00000000,
attr OG_BZ_TT01_Clima room Badezimmer


Damit $base in mqttDefaults funktioniert, muss diese in der Bridge selbst definiert werden:
globalDefaults base=ha

Damit entstehen folgende pub/subscriptions (Befehl an der Bridge: get devinfo):
OG_BZ_TT01_Clima
  publish:
    ValvePosition    => ha/og/bz/klima/ValvePosition (mode: R; qos: 0)
    controlMode      => ha/og/bz/klima/controlMode (mode: R; qos: 0)
    desired-temp     => ha/og/bz/klima/desired-temp (mode: R; qos: 0)
    measured-temp    => ha/og/bz/klima/measured-temp (mode: R; qos: 0)
  subscribe:
    controlMode      <= ha/og/bz/klima/+/set (mode: S)
    desired-temp     <= ha/og/bz/klima/+/set (mode: S)


Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

desmoloch

Zitat von: hexenmeister am 27 Januar 2019, 10:27:24
Ich habe eine ähnliche Definition

defmod OG_BZ_TT01_Clima CUL_HM xxx
attr OG_BZ_TT01_Clima alias HKThermostat: Bad
attr OG_BZ_TT01_Clima group Klima
attr OG_BZ_TT01_Clima icon hm-cc-rt-dn
attr OG_BZ_TT01_Clima model HM-CC-RT-DN
attr OG_BZ_TT01_Clima mqttDefaults base={"$base/og/bz"}
attr OG_BZ_TT01_Clima mqttPublish measured-temp|desired-temp|ValvePosition|controlMode:topic={"$base/klima/$name"}
attr OG_BZ_TT01_Clima mqttSubscribe desired-temp|controlMode:stopic={"$base/klima/$reading/set"}
attr OG_BZ_TT01_Clima peerIDs 00000000,
attr OG_BZ_TT01_Clima room Badezimmer


Damit $base in mqttDefaults funktioniert, muss diese in der Bridge selbst definiert werden:
globalDefaults base=ha

Damit entstehen folgende pub/subscriptions (Befehl an der Bridge: get devinfo):
OG_BZ_TT01_Clima
  publish:
    ValvePosition    => ha/og/bz/klima/ValvePosition (mode: R; qos: 0)
    controlMode      => ha/og/bz/klima/controlMode (mode: R; qos: 0)
    desired-temp     => ha/og/bz/klima/desired-temp (mode: R; qos: 0)
    measured-temp    => ha/og/bz/klima/measured-temp (mode: R; qos: 0)
  subscribe:
    controlMode      <= ha/og/bz/klima/+/set (mode: S)
    desired-temp     <= ha/og/bz/klima/+/set (mode: S)


also ich hab jetzt hier eine Stunde probiert warum das subscribe bei mir nicht klappt.
Folgendes habe ich probiert:
mqttSubscribe desired-temp|controlMode:stopic={"$base/klima/$reading/set"}
und
mqttSubscribe desired-temp:stopic={"$base/klima/solltemp/set"}

Ich kann einfach keine Temp einstellen...
Aber hiermit klappt es:
mqttSubscribe desired-temp:stopic={"$base/klima/temperature/set"}
Warum um alles in der Welt klappt es nur mit "temperature"?!

Ich hau mich jetzt hin...

hexenmeister

Gute Frage, bei mit hat mit deiner Einstllung funktioniert. Vlt. ein Tippfehler irgendwo?
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

desmoloch

Zitat von: hexenmeister am 01 Februar 2019, 17:42:26
Gute Frage, bei mit hat mit deiner Einstllung funktioniert. Vlt. ein Tippfehler irgendwo?

Ich verstehe die Welt nicht...ich habe die Einstellungen gestern aus fhem ins Forum kopiert. Es ging nicht. Nun nochmal zurückkopiert und nun geht's. Keine Ahnung was das soll, aber nun geht's ja :)
Danke!

tomleitner

#19
Hallo und Danke für MQTT_GENERIC_BRIGE -- geniale Idee.

Mein Anwendungsfall wäre: Einzelne Sensoren an MQTT publishen sowie einzelne Schalter ebenso publishen und beim setzen des "state" werts über MQTT entsprechend reagieren.  Dazu hätte ich die Bridge wie folgt definiert:

define MQTT_BRIDGE MQTT_GENERIC_BRIDGE fhem room=MQTT_BRIDGE_DEVICES
attr MQTT_BRIDGE IODev MQTT2_Server
attr MQTT_BRIDGE globalPublish *:topic={"fhem/$device/$reading"}
attr MQTT_BRIDGE mqttSubscribe *:topic={"fhem/$device/$reading"}
attr MQTT_BRIDGE
attr MQTT_BRIDGE room MQTT
attr MQTT_BRIDGE stateFormat dev: device-count in: incoming-count out: outgoing-count


Alle Devices die ich monitoren will sind im Raum MQTT_BRIDGE_DEVICES. Ebenso die Schalter.

Ach ja: Mein IODEV ist ein MQTT2_CLIENT (heißt hier, mißverständlicherweise MQTT2_Server).

Die Probleme/Auffälligkeiten:

a.) Das reading "device-count" bleibt immer auf 0 obwohl incoming-count und outgoing-count brav hinauf zählen und es funktioniert auch!
b.) Aber das Hauptproblem ist -- ich kann nicht subscriben:

MQTT_BRIDGE: unknown attribute mqttSubscribe. Type 'attr MQTT_BRIDGE ?' for a detailed list. Usage: attr [-a|-r] [] where is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.

Das Attribut "mqttSubscribe" existiert gar nicht??

Nicht einmal die Fehlermeldung stimmt, wenn ich

fhem> attr MQTT_BRIDGE ?

eingebe kommt:

fhem> attr MQTT_BRIDGE ?
MQTT_BRIDGE: unknown attribute ?, choose one of alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 IODev globalDefaults:textField-long globalAlias:textField-long globalPublish:textField-long globalTypeExclude:textField-long globalDeviceExclude:textField-long disable:1,0 debug:0,1 event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading DbLogExclude DbLogInclude cmdIcon devStateIcon devStateIcon:textField-long devStateStyle fhem_widget_channels fm_fav fm_groups fm_name fm_order fm_type fm_view genericDeviceType:security,ignore,switch,outlet,light,blind,thermometer,thermostat,contact,garage,window,lock homebridgeMapping:textField-long icon siriName sortby webCmd webCmdLabel:textField-long widgetOverride userattr


Bin um jeden Hinweis dankbar.

Ciao // Tom

hexenmeister

Die Erklärung ist einfach.

a) beim device-count werden nur Geräte gezählt, die mit eigenen mqtt*-Attributen versehen sind. Bei einer globalen Definition 'globalPublish' kann die Bridge nicht (ohne weiteres) wissen, welche Geräte angesprochen werden sollen. Daher wird auch nichts gezählt.

b) mqttSubscribe ist gedach für diejenigen Geräte, die per MQTT 'versorgt' werden sollen. Die Bridge selbst gehört nicht dazu. Aus technischen Gründen kann es sein, dass diese Attribute trotzdem vom FHEM angeboten werden, gesetzt werden können sie jedoch nicht, die Bridge  'währt' sich dagegen.
Ein 'globalSubscribe' gibt es nicht. Ich habe mich entschieden, diese Festure nicht anzubieten. Bei unbedachten Verwendung könnte ein großes Sicherheitsrisiko entstehen. Einfach diese Attribute an den gewünschgten Devices erstellen.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

tomleitner

Danke, Dir -- klingt logisch.

Allerdings wird das Attribut mqttSubscribe nicht bei meinen Devices angeboten, nicht im User-Interface aber auch nicht wenn ich es im fhem.cfg einbaue:
RotLicht: unknown attribute mqttSubscribe. Type 'attr RotLicht ?' for a detailed list.

RotLicht ist ein ZWave Schalter bei mir ...

Und ja: Ich habe die aktuellste Software Version laufen ....

Was kann dafür der Grund sein?

Danke.




tomleitner

#22
.... noch ein komisches Problem.  Nach einem FHEM restart mit "shutdown restart" funktioniert die Bridge nicht. Es kommen meldungen rein
aber es geht nichts hinaus. Erst wenn ich im Web Interface auf "DEF" klicke, dort die Definition:

fhem room=MQTT_BRIDGE_DEVICES

nochmal bestätige und "modify MQTT_BRIDGE" klicke ... dann geht es plötzlich??

Ideen dazu?

Danke.

hexenmeister

ZitatWas kann dafür der Grund sein?
Könnte das übliche 'NichtGeleseneDokumentation' sein ;D
Die Definition lautet 'fhem room=MQTT_BRIDGE_DEVICES'. Der erste Parameter (wie im Commandref steht) ist der Prefix für die Optionsattribute. Ist für Sonderfälle gedacht, wenn mehr als eine Bridge im System vorhanen ist. Deine Parameter heißen also 'fhemSubscribe' etc.

Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

hexenmeister

Zitat von: tomleitner am 03 Februar 2019, 22:01:29
.... noch ein komisches Problem.  Nach einem FHEM restart mit "shutdown restart" funktioniert die Bridge nicht. Es kommen meldungen rein
aber es geht nichts hinaus. Erst wenn ich im Web Interface auf "DEF" klicke, dort die Definition:

fhem room=MQTT_BRIDGE_DEVICES

nochmal bestätige und "modify MQTT_BRIDGE" klicke ... dann geht es plötzlich??
Ist wohl ein Bug.
Die Unterstützung von MQTT2*-Geräten ist noch recht jung. Die Bridge ist auf MQTT als DevIO optimiert. Ist wohl ein Bug, nachzustellen klappt bei mir jedoch nicht. Möglicherweise meldet sich die Bridge zu früh für DevIO. Ich muss probieren, ob es hilft, wenn die Bridge wartet, bis IO 'connected' ist.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

tomleitner

Danke. Mit dem fhemSubscribe funktioniert es nun. An sich habe ich die Doku gelesen, aber das war mir nicht so bewusst.

Wegen dem Bug: bei mir ist es reproduzierbar Immer so. Der Fehler tritt immer auf. Was ich bemerke ist dass bei Klick auf "modify MQTT_Bridge" im log file ein disconnect und reconnect auf den MQTT Server erfolgt. Offenbar ist er nach einem restart gar nicht richtig connected ?

Tom

hexenmeister

Zitat von: tomleitner am 04 Februar 2019, 07:51:34
Wegen dem Bug: bei mir ist es reproduzierbar Immer so. Der Fehler tritt immer auf. Was ich bemerke ist dass bei Klick auf "modify MQTT_Bridge" im log file ein disconnect und reconnect auf den MQTT Server erfolgt.
Das ist bei MQTT2*-Module so gewollt. Beim Anmelden von subscriptions wird ein reconnect durchgeführt.

Zitat von: tomleitner am 04 Februar 2019, 07:51:34
Offenbar ist er nach einem restart gar nicht richtig connected ?
Gute Frage, sollte nicht so sein. Schau doch mal nach dem Start das state von dem IO-Device an.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

tomleitner

Bin nun draufgekommen das dieses fehlerhafte Verhalten (Bridge geht nicht nach restart so lange bis man im User Interface DEF und "modify" geklickt hat)  nur dann auftritt wenn device-count = 0 ist.  Nun hab ich ein Device mit einem "fhemSubscribe" Attribut ausgestattet ... und nun lebt die Bridge auch nach einem Restart.

Ich denke das ist trotzdem ein Bug weil es mag ja Anwendungen geben wo jemand über die Bridge nur Dinge publishen will und nichts subscriben will ....

Danke.

hexenmeister

Auch fürs publishen gibt es Attribute für die einzelnen Geräte. Die globalPublish war eigentlich nicht für alleinigen Einsatz gedacht. Eher eine nicht ausgebaute Test-Methode.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

tomleitner

Oh ... aber mit globalPublish ist es wohl am einfachsten!

Heißt das, dass globalPublish wieder verschwinden kann und nicht supported ist?

hexenmeister

Einfach ja, gut - meistens nicht. Damit pustet man ohne Kontrolle Daten raus. Kommt später ein neues Gerät hinzu - werden möglicherweise Daten gesendet, die man nicht senden wollte. Beim subscribe hätte man u. U. damit gleich ein Sicherheitsproblem.
globalPublish ist schon drin und wird auch jetzt bleiben, man sollte jedoch die Risiken im Auge behalten. globalSubscribe wird es aber nicht geben.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

tomaszG

Hello,

I have already opened a topic for this problem https://forum.fhem.de/index.php/topic,99223.0.html

I have a fhem with a number of EnoCean devices paired. I am successfully using MQTT2_CLIENT and MQTT_GENERIC BRIDGE to forward measurmenet to an MQTT broker. Here is an extract of my config:


define locmqtt MQTT2_CLIENT xxxxx.xxxxx.xx:9883
setuuid locmqtt 5c7fba12-f33f-31d1-0d46-2eb4a2db7bd3bfb3
attr locmqtt SSL 1
attr locmqtt clientId rpn001
attr locmqtt subscriptions 1

define mqttGeneric MQTT_GENERIC_BRIDGE mqtt subType=hvac.04
setuuid mqttGeneric 5c54553c-f33f-d38f-19c2-06b4ddb36f166b9c
attr mqttGeneric IODev locmqtt
attr mqttGeneric globalDefaults base={"enocean/$device"}
attr mqttGeneric globalPublish *:topic={"$base/$reading"}


The attr locmqtt subscriptions 1 was just designed to avoid unnecessary subscriptions, but it may need to change ?
Now my goal is to send new setpointTemp values through MQTT to the valves, but I cant figure it out.
I realized that the EnOcean devices have a userattr that contains mqttSubscribe, eg:


define EnO_019AC3A8 EnOcean 019AC3A8
setuuid EnO_019AC3A8 5ca31d29-f33f-3d86-9e7a-021df6cc029d9742
attr EnO_019AC3A8 userattr mqttAlias:textField-long mqttDefaults:textField-long mqttDisable:both,incoming,outgoing mqttForward:all,none mqttPublish:textField-long mqttSubscribe:textField-long
attr EnO_019AC3A8 IODev TCM_ESP3_0
attr EnO_019AC3A8 comMode biDir
attr EnO_019AC3A8 destinationID unicast
attr EnO_019AC3A8 eep A5-20-04
attr EnO_019AC3A8 manufID 045
attr EnO_019AC3A8 room EnOcean
attr EnO_019AC3A8 subDef FF902D0C
attr EnO_019AC3A8 subType hvac.04
attr EnO_019AC3A8 teachMethod 4BS
attr EnO_019AC3A8 webCmd setpointTemp


If i understand correctly, I have to use this attribute somehow, but as it is in userattr, I don't quite understand how to make use of the snippets examples that hexenmeister has shared. Can you please help me out ?

elo

#32
Kann ich außer dem Topicnamen oder * auch ein Regex angeben?
* Sendet zu viele Werte
attr PVSMAEM mqttPublish *:topic={"fhem/pv/$device"} *:qos=1 *:retain=0 *:expression={"{\"$name\":".$value."}"}

und sie in oder | Abschnitte zu formatieren, macht auch keinen Sinn, da es über 30 Werte sind. (Das sprengt die fhem webAnzeige)

Alles was ich bisher versuchte, klappte leider nicht.

SMAEM12345678.*
SMAEM12345678*
SMAEM12345678.*$
SMAEM12345678/w
--
Raspi + FHEM 5.8 + HM-MOD-PCB + HM-LAN + HM-LC_Bl1PBU-FM + HM-LC-BL1-FM + HM-PB-2-WM + HM-LC-SW1-FM + HM-TC-IT-WM-W-EU + HM-CC-RT-DN

hexenmeister

Sorry für späte Antwort.  :(
Das wird so nicht unterstützt.
Du kannst aber mit * alle Readings greifen und dann mit Perlmitteln in der expression filtern.

irgendwie so (ungetestet):
desired-temp!info:expression={if($reading=~/SMAEM12345678.*/){$value}else{undef})}
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

PatrickR

Mahlzeit!

An dieser Stelle einen großen Dank an hexenmeister. Ich setze neben der Hauptinstanz zwei weitere FHEM-Instanzen ein, um Module auszulagern, die den ganzen Betrieb aufhalten. Das habe ich vorher mit einem Wust aus FHEM2FHEM, Notifies, Dummys etc. gelöst. Jetzt geht es elegant per MQTT_GENERIC_BRIDGE und die geklonten Geräte verhalten sich in der Hauptinstanz fast wie die echten. Es ist erfrischend, was mir so an Freezes entgeht, fast ohne Komfortverlust.

Patrick
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook