JSON-String zu Readings via json2namevalue????

Begonnen von frankreed, 16 März 2020, 18:37:53

Vorheriges Thema - Nächstes Thema

frankreed

Hallo,

ich habe mir einen Zigbee coordinator mit Zigbee2Tasmota gebaut. Funktioniert und empfängt Daten.
Der Coordinator sendet auch verschiedene MQTT-Topics.

Weiterhin habe ich ein MQTT2_Device angelegt:

defmod ZigBee_THP_1 MQTT2_DEVICE
attr ZigBee_THP_1 IODev myMQTT2Client_Gateway
attr ZigBee_THP_1 room Wohnzimmer


Der empfangene JSON-String ist:

{"ZbReceived":{"THP_Garten":{"Device":"0x6B6B","Temperature":25.77,"Humidity":31.45,"PressureUnit":"hPa","Pressure":972,"PressureScale":-1,"PressureScaledValue":9725,"Endpoint":1,"LinkQuality":84}}}


Wie kann ich denn jetzt mein Readinglist-Attribut setzten, dass daraus die Readings Temperature, Humidity, Pressure erzeugt werden, wenn ein Teil des JSON-STrings den Wert "THP_Garten" enthält?

Hintergrund:
Es kommen auf dem abonnierten TOPIC noch weitere Sensoren an, die sich erst im Teilstring des JSON unterscheiden.....

Danke für die Hilfe.

87insane

Hey,

nur kurz da Handy. Denke aber das du mit deinen Fähigkeiten, aus der mqtt2attrtemp Datei deine Infos erlesen kannst.

https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template

Gesendet von meinem LM-G810 mit Tapatalk


Beta-User

Auch korz... Dort v.a. die OpenMQTTGateway-BT-Varianten+tasmota-ds18B20.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

frankreed

Sorry ich blick da nicht durch.

Ein Sensor liefert den JSON

{"ZbReceived":{"THP_Garten":{"Device":"0x6B6B","Temperature":26.37,"Humidity":37.95,"PressureUnit":"hPa","Pressure":980,"PressureScale":-1,"PressureScaledValue":9800,"Endpoint":1,"LinkQuality":52}}}


der andere

{"ZbReceived":{"THP_Wohnzimmer":{"Device":"0x9F68","Temperature":26.28,"Humidity":49.23,"PressureUnit":"hPa","Pressure":979,"PressureScale":-1,"PressureScaledValue":9799,"Endpoint":1,"LinkQuality":60}}}


auf dem MQTT2_DEVICE ZigBee_THP_1 mit dem Topic "DVES_3E01D2/tele/SENSOR"

Mit dem Attribut
attr ZigBee_THP_1 readingList DVES_3E01D2/tele/SENSOR:.* { json2nameValue($EVENT) }

werden die Readings sowohl vom Sensor1 als auch vom Sensor2 im gleichen MQTT2_Device angelegt.

Ich möchte aber, dass im Device nur die Readings vom Sensor1 angelegt werden.
Für die Werte vom Sensor2 möchte ich dann ein separates MQTT2_Device anlegen.

Ich komm' halt nicht auf den Trichter, wie ich den JSON-String so parsen muss, dass nur die entprechenden Readings angelegt werden.....
Mit einem kleinen Schubs in die richtige Richtung krieg' ich das dann sicher hin.
Danke für Eure Mühe.

Grüße frankreed


Beta-User

#4
Na ja, das war der Versuch eines kleinen Schubses...

Das steht bei "tasmota_use_DS18x20_id"
attr DEVICE readingList \
  TELETOPIC/INFO.:.* { json2nameValue($EVENT) }\
  TELETOPIC/RESULT:.* { my %ret; while ($EVENT =~ /.Id...([A-F0-9]{12})...Temperature..([\d]+\.[\d]+)./g) { $ret{"Temperatur_".$1}=$2; }; return \%ret; }

Und das bei einem der OMG-BT-Sachen:
BASE_ID/home_presence/DEVNAME:.* { return undef unless $EVENT =~ m,(..)..)..)..)..)..),;; json2nameValue($EVENT,"BT_".uc($1.$2.$3.$4.$5.$6)."_");; {"last"=>uc($1.$2.$3.$4.$5.$6)}}
Prinzip ist: Erst regex-en, dann Teile des Ergebnisses an json2nameValue übergeben.

Unterstellt, das kommt über den "RESULT-Zweig, könnte das  angepaßt in etwa so aussehen:
attr DEVICE readingList \
  [...]\
  TELETOPIC/RESULT:.* { return undef unless $EVENT =~ m,Device...(0x....),;; json2nameValue($EVENT,"${1}_",$JSONMAP)}
K.A., ob das mit dem verschachtelten JSON so 100% hinhaut, bitte ggf. die Ergebnisse mal zeigen. Die Id ist immer 4-HEX-stellig, sonst müßten wir die regex etwas anpassen?

Nachtrag: Evtl. würde es Sinn machen, eine Art "Zwischendevice" zu bauen und für jede ID  ein separates Gerät anzulegen (ähnlich der (unfertigen) 433-MHz-Lösung bei Tasmota). Aber eines nach dem anderen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

frankreed

Nee, das haut leider nicht hin. Es werden im Device immer noch die Deadings von beiden Sensoren erzeugt..
Hier nochmal die raw definition:

defmod ZigBee_THP_1 MQTT2_DEVICE
attr ZigBee_THP_1 IODev myMQTT2Client_Gateway
attr ZigBee_THP_1 readingList DVES_3E01D2/tele/SENSOR:.* { return undef unless $EVENT =~ m,Device...(0x....),;;;; json2nameValue($EVENT,"${1}_",$JSONMAP)}
attr ZigBee_THP_1 room Wohnzimmer
attr ZigBee_THP_1 stateFormat {sprintf ("Temperature: %.1f°C Humidity: %.1f%% Pressure: %.1fhpa", ReadingsVal($name,"ZigbeeReceived_0x073E_Temperature",0), ReadingsVal($name,"ZigbeeReceived_0x073E_Humidity",0), ReadingsVal($name,"ZigbeeReceived_0x073E_Pressure",0)) }

setstate ZigBee_THP_1 Temperature: 0.0°C Humidity: 0.0% Pressure: 0.0hpa
setstate ZigBee_THP_1 2020-03-17 15:14:47 0x6B6B_ZbReceived_THP_Garten_Battery 100
setstate ZigBee_THP_1 2020-03-17 15:15:07 0x6B6B_ZbReceived_THP_Garten_Device 0x6B6B
setstate ZigBee_THP_1 2020-03-17 15:15:07 0x6B6B_ZbReceived_THP_Garten_Endpoint 1
setstate ZigBee_THP_1 2020-03-17 15:15:07 0x6B6B_ZbReceived_THP_Garten_Humidity 51.94
setstate ZigBee_THP_1 2020-03-17 15:15:07 0x6B6B_ZbReceived_THP_Garten_LinkQuality 31
setstate ZigBee_THP_1 2020-03-17 15:14:47 0x6B6B_ZbReceived_THP_Garten_ModelId lumi.weather
setstate ZigBee_THP_1 2020-03-17 15:15:07 0x6B6B_ZbReceived_THP_Garten_Pressure 979
setstate ZigBee_THP_1 2020-03-17 15:15:07 0x6B6B_ZbReceived_THP_Garten_PressureScale -1
setstate ZigBee_THP_1 2020-03-17 15:15:07 0x6B6B_ZbReceived_THP_Garten_PressureScaledValue 9794
setstate ZigBee_THP_1 2020-03-17 15:15:07 0x6B6B_ZbReceived_THP_Garten_PressureUnit hPa
setstate ZigBee_THP_1 2020-03-17 15:15:07 0x6B6B_ZbReceived_THP_Garten_Temperature 26.25
setstate ZigBee_THP_1 2020-03-17 15:14:47 0x6B6B_ZbReceived_THP_Garten_Voltage 3.025
setstate ZigBee_THP_1 2020-03-17 15:14:17 0x9F68_ZbReceived_THP_Wohnzimmer_Battery 100
setstate ZigBee_THP_1 2020-03-17 15:14:27 0x9F68_ZbReceived_THP_Wohnzimmer_Device 0x9F68
setstate ZigBee_THP_1 2020-03-17 15:14:27 0x9F68_ZbReceived_THP_Wohnzimmer_Endpoint 1
setstate ZigBee_THP_1 2020-03-17 15:14:27 0x9F68_ZbReceived_THP_Wohnzimmer_Humidity 39.51
setstate ZigBee_THP_1 2020-03-17 15:14:27 0x9F68_ZbReceived_THP_Wohnzimmer_LinkQuality 86
setstate ZigBee_THP_1 2020-03-17 15:14:17 0x9F68_ZbReceived_THP_Wohnzimmer_ModelId lumi.weather
setstate ZigBee_THP_1 2020-03-17 15:14:27 0x9F68_ZbReceived_THP_Wohnzimmer_Pressure 979
setstate ZigBee_THP_1 2020-03-17 15:14:27 0x9F68_ZbReceived_THP_Wohnzimmer_PressureScale -1
setstate ZigBee_THP_1 2020-03-17 15:14:27 0x9F68_ZbReceived_THP_Wohnzimmer_PressureScaledValue 9794
setstate ZigBee_THP_1 2020-03-17 15:14:27 0x9F68_ZbReceived_THP_Wohnzimmer_PressureUnit hPa
setstate ZigBee_THP_1 2020-03-17 15:14:27 0x9F68_ZbReceived_THP_Wohnzimmer_Temperature 26.63
setstate ZigBee_THP_1 2020-03-17 15:14:17 0x9F68_ZbReceived_THP_Wohnzimmer_Voltage 3.005

Beta-User

Mach' mal zwei Kopien m. anderem Namen von dem Device und setze jeweils in die regex statt der 4 Punkte einen der beiden IDs ein...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

frankreed

Hallo Beta-User,
super, danke hat funktioniert. Jetzt werden in Abhängigkeit der ID's bei den neu angelegten MQTT2_DEVICES nur diejenigen Readings angelegt, die zur ID passen.
Morgen nehm' ich mir mal dein Attribut readinglist genauer unter die Lupe um zu verstehen, was da gemacht wird. Will ja auch was lernen :-)
Nochmal zur Vollständigkeit hier die raw definition eines der neu angelegten Devices:

defmod ZigBee_THP_6 MQTT2_DEVICE
attr ZigBee_THP_6 IODev myMQTT2Client_Gateway
attr ZigBee_THP_6 readingList DVES_3E01D2/tele/SENSOR:.* { return undef unless $EVENT =~ m,Device...(0x9F68),;;;; json2nameValue($EVENT,"${1}_",$JSONMAP)}
attr ZigBee_THP_6 room Wohnzimmer
attr ZigBee_THP_6 stateFormat {sprintf ("Temperature: %.1f°C Humidity: %.1f%% Pressure: %.1fhpa", ReadingsVal($name,"ZigbeeReceived_0x073E_Temperature",0), ReadingsVal($name,"ZigbeeReceived_0x073E_Humidity",0), ReadingsVal($name,"ZigbeeReceived_0x073E_Pressure",0)) }

setstate ZigBee_THP_6 Temperature: 0.0°C Humidity: 0.0% Pressure: 0.0hpa
setstate ZigBee_THP_6 2020-03-17 18:37:25 0x9F68_ZbReceived_THP_Wohnzimmer_Battery 100
setstate ZigBee_THP_6 2020-03-17 18:37:25 0x9F68_ZbReceived_THP_Wohnzimmer_Device 0x9F68
setstate ZigBee_THP_6 2020-03-17 18:37:25 0x9F68_ZbReceived_THP_Wohnzimmer_Endpoint 1
setstate ZigBee_THP_6 2020-03-17 18:37:25 0x9F68_ZbReceived_THP_Wohnzimmer_Humidity 35.73
setstate ZigBee_THP_6 2020-03-17 18:37:25 0x9F68_ZbReceived_THP_Wohnzimmer_LinkQuality 86
setstate ZigBee_THP_6 2020-03-17 18:37:25 0x9F68_ZbReceived_THP_Wohnzimmer_ModelId lumi.weather
setstate ZigBee_THP_6 2020-03-17 18:37:25 0x9F68_ZbReceived_THP_Wohnzimmer_Pressure 979.49
setstate ZigBee_THP_6 2020-03-17 18:36:36 0x9F68_ZbReceived_THP_Wohnzimmer_PressureScale -1
setstate ZigBee_THP_6 2020-03-17 18:36:36 0x9F68_ZbReceived_THP_Wohnzimmer_PressureScaledValue 9794
setstate ZigBee_THP_6 2020-03-17 18:37:25 0x9F68_ZbReceived_THP_Wohnzimmer_PressureUnit hPa
setstate ZigBee_THP_6 2020-03-17 18:37:25 0x9F68_ZbReceived_THP_Wohnzimmer_Temperature 27.6
setstate ZigBee_THP_6 2020-03-17 18:37:25 0x9F68_ZbReceived_THP_Wohnzimmer_Voltage 3.005


Nochmal vielen Dank für die Hilfe!