FHEM Forum

FHEM => Sonstiges => Thema gestartet von: reibuehl am 05 Januar 2021, 23:04:35

Titel: HTTPMOD/JSON: Werte aus Array variabler Länge darstellen
Beitrag von: reibuehl am 05 Januar 2021, 23:04:35
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
Titel: Antw:HTTPMOD/JSON: Werte aus Array variabler Länge darstellen
Beitrag von: Otto123 am 05 Januar 2021, 23:15:17
Hallo Reiner,

json2nameValue  ?
Ist mW genau dafür da.

Gruß Otto
Titel: Antw:HTTPMOD/JSON: Werte aus Array variabler Länge darstellen
Beitrag von: reibuehl am 06 Januar 2021, 11:35:18
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.
Titel: Antw:HTTPMOD/JSON: Werte aus Array variabler Länge darstellen
Beitrag von: rudolfkoenig am 06 Januar 2021, 12:01:44
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?
Titel: Antw:HTTPMOD/JSON: Werte aus Array variabler Länge darstellen
Beitrag von: reibuehl am 06 Januar 2021, 13:05:04
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.
Titel: Antw:HTTPMOD/JSON: Werte aus Array variabler Länge darstellen
Beitrag von: rudolfkoenig am 06 Januar 2021, 13:19:46
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:
Titel: Antw:HTTPMOD/JSON: Werte aus Array variabler Länge darstellen
Beitrag von: reibuehl am 06 Januar 2021, 15:15:32
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?
Titel: Antw:HTTPMOD/JSON: Werte aus Array variabler Länge darstellen
Beitrag von: rudolfkoenig am 06 Januar 2021, 15:36:48
Um die alten Readings zu loeschen kann man vor json2reading
CommandDeleteReading(undef, "fr24tracked .*flight.*");;
einbauen.

Vom readingsGroup habe ich keine Ahnung :)
Titel: Antw:HTTPMOD/JSON: Werte aus Array variabler Länge darstellen
Beitrag von: reibuehl am 06 Januar 2021, 15:47:09
Und die Funktion dann regelmäßig mit einem at aufrufen oder könnte man das als parseFunction1 oder parseFunction2 direkt im HTTPMOD machen?