MQTT2, json und Zerlegen der Daten

Begonnen von sn, 17 Januar 2020, 13:10:45

Vorheriges Thema - Nächstes Thema

sn

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.

  • Da die Struktur des JSON gleichbleibt, werden die Readings so aktualisiert ("überschrieben"), dass ich nur die zuletzt veröffentlichten Daten sehe (z.B. nur die Luftfeuchtigkeit). Wie kann ich eine Sortierung/Zuordnung anhand der Daten im JSON vornehmen? Meine Vorstellung wäre, dass es ein (dummy-)Device gibt mit Namen der "node" (in diesem Falle "testboard"), das dann als Readings die Temperatur und Luftfeuchtigkeit bekommt.

  • Die Topics in MQTT können ja auch mit "+" aboniert werden. Wenn ich nun
    attr MQTT2_testboard readingList mqtt2_client:testboard/+/value:.* { json2nameValue($EVENT) }
    verwende, dann scheinen keine Daten in FHEM anzukommen. Ist dies nicht unterstützt?

Danke und viele Grüße
Stefan

rudolfkoenig

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.

Beta-User

(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") }
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors