FHEM Forum

FHEM - Hausautomations-Systeme => MQTT => Thema gestartet von: sn am 17 Januar 2020, 13:10:45

Titel: MQTT2, json und Zerlegen der Daten
Beitrag von: sn am 17 Januar 2020, 13:10:45
Hallo,

ich habe Sensoren, welche z.B. Temperatur und Luftfeuchtigkeit per MQTT als JSON string veröffentlichen, z.B.

testboard/temperature0/value {"timestamp":"2020-01-17 11:25:19", "value":"23.0", "unit":"C", "node":"testboard", "measurement":"temperature", "sensortype":"DHT22", "sensorid":"0"}
testboard/humidity0/value {"timestamp":"2020-01-17 11:25:19", "value":"44.0", "unit":"%", "node":"testboard", "measurement":"humidity", "sensortype":"DHT22", "sensorid":"0"}

Der erste Teil ist das topic.

Ein Device habe ich mir angelegt und kann die Daten empfangen:

defmod MQTT2_testboard MQTT2_DEVICE
attr MQTT2_testboard IODev mqtt2_client
attr MQTT2_testboard icon mqtt_device
attr MQTT2_testboard readingList mqtt2_client:testboard/temperature0/value:.* { json2nameValue($EVENT) }\
mqtt2_client:testboard/humidity0/value:.* { json2nameValue($EVENT) }
attr MQTT2_testboard room MQTT



Allerdings habe ich noch einige Fragen, auf die ich bisher keine Antworten gefunden habe.

Danke und viele Grüße
Stefan
Titel: Antw:MQTT2, json und Zerlegen der Daten
Beitrag von: rudolfkoenig am 17 Januar 2020, 13:59:42
1. json2nameValue hat weitere optionale Parameter (prefix und jsonmap)
2. readingList benoetigt ein regexp und keine MQTT-Subscription-Syntax

Beides sollte hier: https://fhem.de/commandref_modular.html#jsonMap beschrieben sein.
Titel: Antw:MQTT2, json und Zerlegen der Daten
Beitrag von: Beta-User am 17 Januar 2020, 14:00:51
(Auch schon fertig, etwas anderer Fokus...)
1. Zur Sortiererei:
Bitte liest mal im Wiki zu MQTT2_CLIENT, wie man verhindert, dass "alles in ein Großdevice" kommt...

Kurfassung: Du brauchst ein MQTT2_DEVICE mit passender bridgeRegexp, dann landen jeweils die "weitergeleiteten" Informationen in je einem eigenen MQTT2_DEVICE, ohne dass man noch einen Dummy oder so benötigt.

2. Mit dem, was in readingList steht, bist du bereits in Perl angekommen, die MQTT-spezifischen Wildcards gelten daher hier nicht mehr, sondern es müssen und können die Perl-Varianten verwendet werden. Hier würde ich statt "+" "[^/]+" verwenden, also mindestens ein Zeichen, das kein Schrägstrich ist...

3. Um zu plausibilisieren, was ich hier erzähle, kannst du folgendes versuchen:
attr MQTT2_testboard readingList mqtt2_client:([^/]+)/([^/]+)/value:.* { json2nameValue($EVENT,"$1_$2") }