[gelöst]JSON String zerlegen

Begonnen von Nighthawk, 03 Oktober 2022, 19:29:46

Vorheriges Thema - Nächstes Thema

Nighthawk

Hallo zusammen,

ich habe mich nun an das Projekt DIY Zigbee herangetraut (da ich noch einige CC2530 rumliegen hatte) und habe einige Sensoren mithilefe von https://ptvo.info/ aufgebaut.
Grundsätzlich bekomme ich meine Informationen mit dem folgenden Readinglist heraus:
$DEVICETOPIC:.* { my %ret; while ($EVENT =~ /.temperature_l3..([\d]+\.[\d]+)./g) { $ret{"Temperatur_oben"}=$1; }; return \%ret; }

Bei einer der Konfiguration habe ich aber Probleme die Werte auseinander zu dividieren, und zwar wenn ich mehrere DS18B20 am gleichen Pin einlese.

Dabei ensteht folgendes JSON von Zigbee2MQTT :
zigbee2mqtt/Sensor {"action":null,"device_l1":"76","device_l3":"28-AA-B7-01-1C-13-02-E8","humidity_l1":79,"l1":78.98,"l10":null,"l11":null,"l12":null,"l13":null,"l14":null,"l15":null,"l16":null,"l2":null,"l3":13.938,"l4":null,"l5":null,"l6":null,"l7":null,"l8":null,"l9":null,"last_seen":"2022-10-03T15:13:56+02:00","linkquality":29,"pressure_l1":101638,"state_l1":"OFF","state_l10":null,"state_l11":null,"state_l12":null,"state_l13":null,"state_l14":null,"state_l15":null,"state_l16":null,"state_l2":null,"state_l3":null,"state_l4":null,"state_l5":"OFF","state_l6":"OFF","state_l7":"ON","state_l8":"OFF","state_l9":null,"temperature_l1":18.8,"temperature_l3":13.9}

zigbee2mqtt/Sensor{"action":null,"device_l1":"76","device_l3":"28-FF-B9-A5-82-17-04-12","humidity_l1":79,"l1":78.98,"l10":null,"l11":null,"l12":null,"l13":null,"l14":null,"l15":null,"l16":null,"l2":null,"l3":13.75,"l4":null,"l5":null,"l6":null,"l7":null,"l8":null,"l9":null,"last_seen":"2022-10-03T15:13:56+02:00","linkquality":47,"pressure_l1":101638,"state_l1":"OFF","state_l10":null,"state_l11":null,"state_l12":null,"state_l13":null,"state_l14":null,"state_l15":null,"state_l16":null,"state_l2":null,"state_l3":null,"state_l4":null,"state_l5":"OFF","state_l6":"OFF","state_l7":"ON","state_l8":"OFF","state_l9":null,"temperature_l1":18.8,"temperature_l3":13.8}


Hier werden die Daten von Sensor "device_l3":"28-AA-B7-01-1C-13-02-E8" und "device_l3":"28-FF-B9-A5-82-17-04-12" beide auf l3 gesendet, somit muss ich vorher nach der Sensor ID filtern, leider reichen meine JSON, sowie Regexp Kenntnisse dafür absolut nicht mehr aus.

Wie bekommt man es hin erst nach Prüfung der ID den Temperaturwert zuzuordnen?

Gruß
Alex

Beta-User

Ungetestet vielleicht so:
zigbee2mqtt/Sensor {my $ret = json2nameValue($EVENT); { $ret->{device_l3} => $ret->{temperature_l3} } }
Zum Aufhübschen kannst du dann ggf. noch einen Zuordnungshash vorneweg basteln, der für die Sensoren sprechende Namen enthält und hinten dann halt "vorne" dahin verweisen.
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

Nighthawk

Hallo Beta-User,

leider kommt bei der Variante gar kein Reading rein.

Beta-User

OK, sieht so aus, als müßte man umpacken:zigbee2mqtt/Sensor:.* {my $ret = json2nameValue($EVENT); my $ret2->{$ret->{device_l3}} = $ret->{temperature_l3}; return $ret2 }
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

Nighthawk

Hallo Beta-User,

das hat schon mal geklappt, danke dafür!
Gibt es nun noch einen Trick einer If Abfrage inerhalb {$ret->{device_l3}}?
In der Richtung
{$ret->{if device_l3=="28-AA-B7-01-1C-13-02-E8"  {"Temp_X"} elseif device_l3=="28-FF-B9-A5-82-17-04-12" {"Temp_Y"}}}.


Gruß
Alex

Beta-User

 ;D irgendwie hatte ich schon auf die Frage gewartet...

Zitat von: Beta-User am 03 Oktober 2022, 20:02:26
Zum Aufhübschen kannst du dann ggf. noch einen Zuordnungshash vorneweg basteln, der für die Sensoren sprechende Namen enthält und hinten dann halt "vorne" dahin verweisen.

Sähe dann z.B. so aus:
m2client:zigbee2mqtt/Sensor:.* {my $ret = json2nameValue($EVENT); my $lst = { '28-AA-B7-01-1C-13-02-E8'=>'Temp_X', '28-FF-B9-A5-82-17-04-12'=>'Temp_Y'}; my $ret2->{$lst->{$ret->{device_l3}}} = $ret->{temperature_l3}; return $ret2 }
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

Nighthawk

Hammer, funktioniert genau wie gewollt und etwas dabei gelernt :-)


DANKE!

Nighthawk

Eine letzte Frage hätte ich noch,

mit
my $lst = { '28-AA-B7-01-1C-13-02-E8'=>'Temp_X', '28-FF-B9-A5-82-17-04-12'=>'Temp_Y'}

wird ja eine List erstellt,

wo dann mit
my $ret2->{$lst->{$ret->{device_l3}}} = $ret->{temperature_l3}

in der List das Element für das "device_l3" gewählt wird und mit dem  zugehörigen temperature_l3 in das Reading geschrieben wird, verstehe ich es soweit halbwegs richtig?

Was müsste getan werden um nur den Wert für z.B. 28-AA-B7-01-1C-13-02-E8 zu behalten und das andere zu ignorieren?

Gruß
Alex

Beta-User

Ich hol mal etwas weiter aus...

Vermutlich liegt dein Problem woanders, nämlich darin, dass mehrere CC2530 im Einsatz sind, die denselben Topic befüllen (/Sensor). Wenn du es schaffen würdest, dass jeder seinen eigenen bekommt, wäre das Problem kleiner, denn dann bräuchtest du $lst nicht und könntest "hinten" direkt einen Hash schreiben mit "temperature" als Namen, und jede Hardware bekäme seine MQTT2_DEVICE-Instanz...

Wenn du mehrere "Klone" machen willst, um das mit der M2D-Instanz/Sensor hinzubekommen, würde ich (z.B. für den einen) mit "return if $ret->{device_l3} ne '28-AA-B7-01-1C-13-02-E8';" halt alle anderen Sensoren vorab rausschießen.
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

Nighthawk

#9
Hallo Beta-User,

deine Vermutung ist fast richtig, ich habe zwar mehrere CC2530 im Einsatz, diese haben aber jedes seinen eigenen Topic.
Das Problemgerät ist eines wo mehrere DS18B20 an einem 1W Pin hängen, wodurch die Temperaturen alternierend ausgegeben werden, diese würde ich in FHEM aber gerne in jeweis eigene Devices trennen.
Leider habe ich keine Ahnung wo ich die If Abfrage platzieren muss, egal wo ich diese einsetze gibt es Fehlermeldungen.

Gruß
Alex

Beta-User

Hmm, eigentlich würde ich annehmen, dass für den alternierenden dann die Variante mit der Namenszuordnung eigentlich die effizienteste ist. Aber trotzdem - vielleicht hilfreich um meinen ersten untetesteten Vorschlag zu verstehen:
zigbee2mqtt/Sensor:.* {my $ret = json2nameValue($EVENT); return if $ret->{device_l3} ne '28-AA-B7-01-1C-13-02-E8'; return { temperature => $ret->{temperature_l3}} }
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

Nighthawk

Hallo Bet-User,
nochmals vielen Dank, nun habe ich alles so wie ich es brauche und denke es sogar verstanden zu haben.
Warum die Erste Variante nicht lief ist ganz einfach, ich habe nur blind kopiert ohne nachzudenken, dort fehlt das return. Mit der Variante bekomme ich alle Werte des Zigbee-Sensors (da ist auch noch ein SHT31 dran und es sind noch einige DIgital Ein-/Ausgänge definiert).


Gruß
Alex

Beta-User

 :) Gerne!
Vor allem, wenn dann sowas zurückkommt wie
Zitat von: Nighthawk am 14 Oktober 2022, 16:56:07
denke es sogar verstanden zu haben.
Das "Rumkaspern" mit Hashes bzw. Referenzen auf Hashes ist zugegebenermaßen etwas "speziell", aber wenn man es mal soweit intus hat, kann man wirklich interessante Dinge damit anstellen.

Viel Spaß noch!
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