FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: dirk.k am 17 Juni 2018, 20:34:57

Titel: [gelöst] Verständnisfrage - decode_json
Beitrag von: dirk.k am 17 Juni 2018, 20:34:57
Hallo zusammen,
ich benötige etwas Unterstützung bei decode_json in einem userreading.

ich habe einen MQTT Messagestring in folgendem Format:
{"Time":"2018-06-17T19:24:15", "Uptime":126, "Vcc":3.161, "POWER":"OFF", "Wifi":{"AP":1, "SSId":"iD8myIoT", "RSSI":34, "APMac":"74:EA:3A:8F:AE:74"}}
gespeichert im Reading "INFO4".
Daraus möchte ich die uptime und RSSI extrahieren.
Für die Uptime klappt es, für RSSI nicht. Ich denke die Klammern sorgen dafür.
Was muss ich tun, um an die RSSI-Daten zu kommen? Wo ist mein Fehler?
mein Code für die Userreadings:
attr Sonoff_S20_2 userReadings \
uptime {\
my $s = "[" . (ReadingsVal("$NAME","INFO4",0)) . "]";;\
my $decoded = decode_json($s);;\
my $address = $decoded->[0]->{'Uptime'};;\
return $address;;\
},\
\
RSSI {\
my $s = "[" . (ReadingsVal("$NAME","INFO4",0)) . "]";;\
my $decoded = decode_json($s);;\
my $address = $decoded->[0]->{'Wifi:RSSI'};;\
return $address;;\
},

Titel: Antw:Verständnisfrage - decode_json
Beitrag von: dev0 am 18 Juni 2018, 07:18:19
Mit userReadings geht es z.B. so (für den DEF Editor):

uptime:INFO4:.* {decode_json(ReadingsVal($NAME,"INFO4",0))->{Uptime}}, RSSI:INFO4:.* {decode_json(ReadingsVal($NAME,"INFO4",0))->{Wifi}{RSSI}}


Aber warum nimmst Du nicht das expandJSON Modul?

# alle JSON Objekte dekodieren
define ej expandJSON Sonoff_S20_.*:INFO4:.*

# nur die Werte von Uptime und Wifi_RSSI dekodieren
define ej expandJSON Sonoff_S20_.*:INFO4:.* Uptime|Wifi_RSSI


Titel: Antw:Verständnisfrage - decode_json
Beitrag von: dirk.k am 18 Juni 2018, 19:18:05
Danke, die erste Variante funktioniert prompt.

Nächste Verständnisfrage: was bedeutet "uptime:INFO4:.* {...}" ?
Ist an der Stelle nicht die Definition für das Ziel der "Berechnung"?
Welche Wirkung hat das im Vergleich mit uptime {...}

Die Variante 2 ist mir zu hoch... sieht aus, als würde ich ein Objekt definieren um die Werte für ein anderes Objekt zu "errechnen". Wenn dem so ist ... warum nicht im Userreading?

Vielen Dank für die Unterstützung
Titel: Antw:Verständnisfrage - decode_json
Beitrag von: dev0 am 21 Juni 2018, 07:21:49
Es handelt sich um den Trigger, auf den das Userreading reagieren soll. Siehe https://fhem.de/commandref.html#userReadings

Die zweite Variante hat den Vorteil, wenn sie geschickt definiert ist, mehrere Devices und Readings abzudecken und für Anwender geeignet ist, die sich mit Perl nicht so auskennen.