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
Hallo Reiner,
json2nameValue ?
Ist mW genau dafür da.
Gruß Otto
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.
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?
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.
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:
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?
Um die alten Readings zu loeschen kann man vor json2reading
CommandDeleteReading(undef, "fr24tracked .*flight.*");;
einbauen.
Vom readingsGroup habe ich keine Ahnung :)
Und die Funktion dann regelmäßig mit einem at aufrufen oder könnte man das als parseFunction1 oder parseFunction2 direkt im HTTPMOD machen?