[gelöst] Verständnisfrage - decode_json

Begonnen von dirk.k, 17 Juni 2018, 20:34:57

Vorheriges Thema - Nächstes Thema

dirk.k

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;;\
},


dev0

#1
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



dirk.k

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

dev0

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.