HTTPMOD/JSON: Werte aus Array variabler Länge darstellen

Begonnen von reibuehl, 05 Januar 2021, 23:04:35

Vorheriges Thema - Nächstes Thema

reibuehl

Hallo,

ich würde gerne die aktuell von meinem ADS-B Empfänger getrackten Flüge als Reading bzw. readingsGroup anzeigen. Ich bekomme die Werte vom Empfänger als Einträge im JSON Array "aircraft"

{ "now" : 1609884010.3,
  "messages" : 44951,
  "aircraft" : [
    {"hex":"502d2b","mlat":[],"tisb":[],"messages":193,"seen":169.0,"rssi":-22.7},
    {"hex":"407799","squawk":"5236","flight":"BAW105  ","lat":48.630702,"lon":9.150599,"nucp":7,"seen_pos":1.6,"altitude":39000,"vert_rate":0,"track":124,"speed":489,"mlat":[],"tisb":[],"messages":1372,"seen":0.2,"rssi":-19.0},
    {"hex":"4ca60b","squawk":"4112","flight":"ABR5TR  ","lat":48.574127,"lon":8.946674,"nucp":7,"seen_pos":0.5,"altitude":14025,"vert_rate":1152,"track":262,"speed":214,"category":"A2","mlat":[],"tisb":[],"messages":3380,"seen":0.1,"rssi":-16.9}
  ]
}


Interessant davon ist der Wert "flight" aus den Einträgen im "aircraft" array - der leider auch mal fehlen kann :-(

Wie könnte ich den daraus ein nettes Reading oder eine readingsGroup machen?

Reiner
Reiner.

Otto123

#1
Hallo Reiner,

json2nameValue  ?
Ist mW genau dafür da.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

reibuehl

Hallo Otto,

json2nameValue wird in der commandref nur in ein paar anderen Modulen kurz referenziert, ich konnte aber bisher keine ausführlichere Dokumentation dazu finden. Ist json2nameValue flexibler, was die Auswahl der Readings angeht, als das extractAllJSON im HTTPMOD? Mit extractAllJSON bekomme ich im HTTPMOD Device momentan Readings mit Namen wie aircraft_01_flight, scheitere aber bisher daran, diese sauber in eine ReadingsGroup zu bringen, da in der LIste der Readings immer wieder auch noch veraltete Readings drin stehen - also zum Beispiel bei 4 Einträgen im Array könnte es ein aircraft_05_flight und aircraft_06_flight Reading geben, weil halt irgendwann mal 6 Einträge in dem Array drin waren und damals dann die beiden Readings angelegt aber nicht mehr gelöscht oder gecleared wurden.

Ich hab ein Reading, das immer die aktuelle Anzahl der getrackten Flüge enthält, weiß aber nicht wie ich den Wert dazu benützen könnte, nur die ersten X Readings aus dem Array zu beachten... also um z.B. für die readingsGroup Definition zu haben, die von 01 bis { sprintf("%02d", readingsVal("FR24", "feed_num_ac_tracked", 0)) } geht.
Reiner.

rudolfkoenig

json2nameValue hat folgende Parameter:
- JSON string
- prefix (optional, wird jedem ReadingNamen vorangestellt)
- map (optional, Zeiger auf einem Hash, um ReadingsNamen umzuwandeln)
- filter (optional, regexp, um die Namen zu filtern)
Zurueckgeliefert wird ein Hash mit ReadingName/Wert paaren.

json2reading ist der Wrapper fuer Endbenutzer, Parameter:
- hash des Geraetes, der die Readings bekommen soll ($defs{Name})
- JSON string
- prefix (optional, s.o)
- map (optional, s.o)
- postProcess (optional, Funktion, um den vom json2nameValue bearbeiteten Hash nochmal zu aendern, z.Bsp. via hashKeyRename)
- filter (optional, s.o)

hashKeyRename ist gedacht fuer Konstrukte wie  [ { "name":"Spannung", "wert":"230" }, { "name":"Frequenz", "wert":50 }]
fhem> delete XX
fhem> defmod XX dummy
fhem> {json2reading($defs{XX},'[{"name":"Spannung","wert":"230"},{"name":"Frequenz","wert":50}]',undef,undef,'hashKeyRename($ret,"^(.+)_name:(.*)","^(.+)_wert")')}
fhem> l XX
Internals:
   CFGFN     
   FUUID      5ff59779-f33f-c296-f129-5da9b2a8292cea8d
   NAME       XX
   NR         11
   STATE      ???
   TYPE       dummy
   READINGS:
     2021-01-06 11:56:59   Frequenz        50
     2021-01-06 11:56:59   Spannung        230
Attributes:


Welcher ADS-B Empfaenger ist das?

reibuehl

Der ADS-B Empfänger ist ein RTL-SDR mit der FlightRadar24 feed software und dump1090-mutability als Receiver Software.

Über die URLs http://<host>:8754/monitor.json bekommt man generelle Statistiken (u.a. die Angesprochene Anzahl getrackter Flüge) und unter http://<host>/dump1090/data/aircraft.json die Liste der Flüge.
Reiner.

rudolfkoenig

Danke.

Wg. der urpspruenglichen Frage:
fhem> { json2reading($defs{XX}, '...JSON-aus-dem-ersten-Beitrag..', undef, undef, undef, 'flight') }
fhem> l XX
Internals:
   CFGFN     
   FUUID      5ff5aa08-f33f-c296-2795-0ae1bbc9114c9455
   NAME       XX
   NR         11
   STATE      ???
   TYPE       dummy
   READINGS:
     2021-01-06 13:16:10   aircraft_2_flight BAW105 
     2021-01-06 13:16:10   aircraft_3_flight ABR5TR 
Attributes:

reibuehl

Hallo Rudolf,

ich habe die von Dir vorgeschlagene Perl Funktion mal so ausgeführt:


{ json2reading($defs{fr24tracked}, InternalVal("fr24tracked","htmlbody","") , undef, undef, undef, 'flight') }


Die aircraft_1_flight und aircraft_2_flight  Readings wurden im HTTPMOD Device "fr24tracked" korrekt angelegt. Allerdings habe ich damit genau das gleiche Problem wie mit dem expandAllJSON: Wenn die beiden Flüge durch sind und z.B. gerade nur ein Flug getrackt wird, bleibt im Reading aircraft_2_flight immer noch der alte Wert.
Könnte ich die Funktion irgendwie in das DEF einer readingsGroup einbauen? Aber wie müsste dafür dann das $defs{...} abgeändert werden? Oder bin ich da ganz auf dem Holzweg?
Reiner.

rudolfkoenig

Um die alten Readings zu loeschen kann man vor json2reading
CommandDeleteReading(undef, "fr24tracked .*flight.*");;
einbauen.

Vom readingsGroup habe ich keine Ahnung :)

reibuehl

Und die Funktion dann regelmäßig mit einem at aufrufen oder könnte man das als parseFunction1 oder parseFunction2 direkt im HTTPMOD machen?
Reiner.