NEWS
Brauche Hilfe um ein json abzurufen und auszuwerten
-
@fastfoot sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
Die Daten die du ziehst sind kostenpflichtig?
Nö, ich fange sie mit einem DVB-T Receiver an einem RasPi selber ab
-
@fastfoot sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
Spielen mit den Ausdrücken auf https://try.jsonata.org/
Habe ich jetzt ein wenig gemacht.
Das erträumte Ergebnis war ernüchterndHabe dann sogar das Unmögliche getan und die Doku gelesen. Aber auch dort keinen korrekten Hinweis auf meinen Wunsch erhalten:
kann man in dem
expression
bereits z.B. (Wohnort - x) < lat > (Wohnort +x) filtern?
Habe dazu nichts gefunden, resp. bekam nur ERROR -
@Homoran sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
kann man in dem expression bereits z.B. (Wohnort - x) < lat > (Wohnort +x) filtern?
Habe dazu nichts gefunden, resp. bekam nur ERRORDu kannst im Filter(alles zwischen den eckigen Klammern) folgendes eingeben
aircraft[lat >50 and lat < 52].{ "flight":flight, "lat":lat, "lon":lon, "alt_baro":alt_baro }
probiere das mal mit fixen Werten zuerst, später kannst du ja Variablen einfügen. Hier habe ich den Filter für die Flugnummer entfernt, weil ich denke dass lat und lon eh nur da sind wenn eine Flugnummer existiert. denke daran dass du einen Punkt statt Komma in der Angabe benutzt, also zB lat > 50.0400776
-
@fastfoot werde ich testen - danke!
@fastfoot sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
probiere das mal mit fixen Werten zuerst, später kannst du ja Variablen einfügen.
genau das hatte ich vor, zumal ich nicht weiß wie ich an die Geokoordinaten aus der Systemsteuerung komme
@fastfoot sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
dass lat und lon eh nur da sind wenn eine Flugnummer existiert.
nicht mal dann.
Wenn der Empfang schlecht ist heisst es:Total Aircraft: 7 With Positions: 4
Die 7 haben ihr Kennzeichen aber nicht alle eine aktuelle Position.
Die Daten werden jede Sekunde aktualisiert -
@Homoran solange du noch entwickelst, würde ich die Aktualisierungsrate nicht so niedrig setzen, damit du nicht durcheinander kommst. der letzte Filter bringt nur Daten wenn Positionsdaten da sind, könntest auch noch die Höhe einbeziehen. Ich würde mir ein JSON in eine Variable schreiben und mit diesen Daten hantieren bis das Ergebnis stimmt, dann erst würde ich live Daten auf mein Programm loslassen
-
@fastfoot
Habe jetzt dem JSONata noch die maximale Höhe mitgegeben da laufe ich in das nächste für mich nicht nachvollziehbare Problem:
es kommt wieder undefined17:07:00.047 info javascript.0 (13728) script.js.Fliegenklatsche: undefined 17:07:15.012 info javascript.0 (13728) script.js.Fliegenklatsche: undefined
das json ist im Moment leer
Außerdem erscheint immer mal wieder ein parser Error (IMHO vom debug), den ich auch nicht verstehe
-
@fastfoot sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
würde ich die Aktualisierungsrate nicht so niedrig setzen
damit meinte ich die Aktualisierung des jsons auf dem RasPi
sobald dort 1 Sekunde keine Daten vom Flieger empfangen werden zählt ein Zähler hoch und nach 60 Sekunden ist er aus der Liste raus, vorher ggf. schcon die Positionsdaten.ich habe den Trigger abgeschaltet und rufe das json manuell auf
Aber ich muss es ja auch im real-Life Betrieb testen - siehe letzter post -
@Homoran Du musst das Ergebnis prüfen: Falls erg dann action. Wenn keine Daten da sind ist das Ergebnis undefined. Den Filter nicht zu eng setzen, während der Entwicklung!
-
@fastfoot sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
Falls erg dann action
Jepp, danke
Bin ja schon am finetuning der Rohdaten
ich ändere immer wieder den Range um nichts leeres zu bekommen. Aber auch das muss ich abfangen.Aus dem Parser Error werde ich nicht schlau. Hier mal alle Daten, vielleicht etwas unübersichtlich:
Der Schraubenhuber flog eben direkt über unser Haus
Screen der Karte, der Live-Daten und des js-logsHier das zeitgleiche json
{ "now" : 1603552640.8, "messages" : 1850340, "aircraft" : [ {"hex":"3df744","flight":"HUMMEL4 ","alt_baro":800,"alt_geom":900,"gs":133.7,"track":332.9,"baro_rate":-128,"squawk":"4426","emergency":"none","category":"A7","lat":50.900574,"lon":6.983445,"nic":9,"rc":75,"seen_pos":0.1,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":453,"seen":0.1,"rssi":-16.2}, {"hex":"3c66ea","flight":"DLH3U ","alt_baro":21875,"alt_geom":22450,"gs":402.4,"ias":271,"tas":376,"mach":0.612,"track":94.7,"track_rate":0.00,"roll":-0.2,"mag_heading":94.6,"baro_rate":-1856,"geom_rate":-1856,"squawk":"5245","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":11008,"lat":50.328555,"lon":7.004230,"nic":8,"rc":186,"seen_pos":14.4,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":351,"seen":12.8,"rssi":-22.1}, {"hex":"461e16","flight":"FIN3EF ","alt_baro":40000,"alt_geom":40350,"gs":409.6,"ias":233,"tas":432,"mach":0.772,"track":226.7,"track_rate":0.00,"roll":0.0,"mag_heading":229.6,"baro_rate":64,"geom_rate":32,"squawk":"1000","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":40000,"nav_altitude_fms":40000,"nav_modes":["autopilot","vnav","tcas"],"lat":50.716599,"lon":7.030730,"nic":8,"rc":186,"seen_pos":2.0,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":2888,"seen":1.5,"rssi":-19.9}, {"hex":"4400d0","alt_baro":21825,"alt_geom":22300,"gs":401.2,"ias":284,"mach":0.632,"track":116.5,"mag_heading":104.2,"baro_rate":1984,"geom_rate":1984,"squawk":"5333","version":2,"nac_v":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":74,"seen":19.3,"rssi":-22.4}, {"hex":"ac45d5","alt_baro":14950,"alt_geom":15250,"gs":362.1,"ias":313,"tas":392,"mach":0.620,"track":238.0,"roll":-0.4,"mag_heading":235.7,"baro_rate":-2624,"geom_rate":-3072,"squawk":"7702","category":"A5","nav_qnh":1012.8,"nav_altitude_mcp":11008,"nav_heading":237.7,"lat":50.936016,"lon":6.497955,"nic":8,"rc":186,"seen_pos":48.4,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":711,"seen":42.3,"rssi":-21.2}, {"hex":"406a59","version":0,"sil_type":"unknown","mlat":[],"tisb":[],"messages":45,"seen":221.6,"rssi":-23.3}, {"hex":"4072c8","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":3337,"seen":71.3,"rssi":-22.5}, {"hex":"407797","flight":"EZY21DC ","alt_baro":38000,"alt_geom":38400,"gs":381.5,"ias":244,"tas":434,"mach":0.772,"track":289.8,"track_rate":0.03,"roll":-0.4,"mag_heading":286.2,"baro_rate":0,"geom_rate":-32,"squawk":"6604","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":38016,"nav_heading":0.0,"lat":51.126088,"lon":6.040497,"nic":8,"rc":186,"seen_pos":0.2,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","mlat":[],"tisb":[],"messages":8064,"seen":0.2,"rssi":-20.7} ] }
Warum mag der die Hummel nicht?
-
@Homoran sagte:
wie ich an die Geokoordinaten aus der Systemsteuerung komme
Wenn die Koordinaten in der Javascript-Instanz eingetragen sind:
Inhalt der Funktion getNative(id):
return getObject(id).native;
-
@Homoran sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
Warum mag der die Hummel nicht?
Normalerweise bekommst du ein Array mit Flügen zurück, die dann geparst werden können. Wenn du nur einen Flug hast, werden dessen Daten wohl schon aufgelöst, also Hummel4 ist kein Obkekt sondern bereits der Wert(sorry, bin nicht gut im Erklären, das ist eher @paul53 sein Ding)
-
@fastfoot sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
Wenn du nur einen Flug hast, werden dessen Daten wohl schon aufgelöst, also Hummel4 ist kein Obkekt sondern bereits der Wert
Ja, so in der Art sieht es aus
@fastfoot sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
sorry, bin nicht gut im Erklären
für mich reicht's
-
@Homoran sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
Ja, so in der Art sieht es aus
Probiere mal hinter die letzte geschweifte Klammer eckige Klammern zu setzen, das forciert das Erstellen eines Array. Er meldet aber trotzdem mehr als ein Element, das verstehe ich nicht Er liefert neben dem Objekt noch zweimal true
[{'flight':'HUMMEL4 ','lat':50.900574,'lon':6.983445,'alt_baro':800}]
aircraft[ flight.$contains(/./) and lat >50.78 and lat < 51.08 and alt_baro < 900 ].{ "flight":flight, "lat":lat, "lon":lon, "alt_baro":alt_baro }[]
-
@fastfoot bin da auch dran,
wollte über length_of abfangen, klappt aber nicht.
bei nur noch einem Flugzeug springt er nicht in den sonst_falls, bei mehr als einem läuft es richtig
EDIT:
läuft!
habe das SONST_FALLS gegen ein SONST getauscht.Beim ersten Versuch damit hatte ich noch das falsch Objekt, nämlich
i
angegeben -
Euch beiden erst mal vielen Dank.
Habe heute viel gelernt. Hoffentlich war das nicht zuviel und setzt sich nochHabe jetzt nur noch ein Problem.
Ich habe jetzt die erste Abfrage nach der Kennung weggelassen und wollte auch Flieger erfassen, deren Kennung ich nicht habe.
Dieser Fall sollte abgefangen werden und mit "unbekannt" erstezt werden.
Das klappt auch bei nur einem Flieger, bei mehreren Fliegern weitestgehend auch, jedoch wird IMMER zum Schluss ein weiterer Eintrag ohne jegliche Daten erstellt.Hier im Beispiel ist die Länge des Arrays 3, es gibt jedoch 4 Einträge.
Die ersten 3 sind in Ordnung (im 3. lag keine Flugnummer vor und wurde korrekt mit "unbekannt" ersetzt)Wo kommt diese letzte Zeile noch her?
Bevor ich sie mit unlauteren Mitteln abfange, was ohne weiteres gehen würde, würde ich es gerne verstehen.Außerdem hätte ich gerne
i
im debug angezeigt, bekomme bei 1-3 nur ein [object][object] und in der ominösen 4. Zeile ein true undefined
ich dachtei
wäre eine ZahlDanke
-
@Homoran sagte:
ich dachte i wäre eine Zahl
Nein, das ist bei einer for-Schleife (Zählschleife) so, aber nicht bei for in Schleifen. Bei Arrays sollte man besser die Zählschleifen verwenden.
-
@Homoran
Ich würde die Zählschleife verwenden und innerhalb der Schleife filtern, wobei das erstes Filterkriterium das Vorhandensein von "lat", "lon" und "alt_baro" sein sollte: -
@paul53 sagte in Brauche Hilfe um ein json abzurufen und auszuwerten:
Ich würde die Zählschleife verwenden und innerhalb der Schleife filtern
so weit bin ich auch schon, wobei es mir nicht gelingt die Attribute korrekt zu bestimmen. Objekt 'i' geht ja jetzt nicht mehr
Muss mir mal deine Vorgehensweise ansehen -
@paul53 Hat was länger gedauert, waren grad keine Flieger unterwegs (muss mein System später mal hardwaretechnisch noch was aufrüsten).
Jetzt scheint es zu klappen!
War ich gar nicht so weit von entfernt, mir fehlte nur das eigenständige Zerlegen des JSON(-Arrays) in "Unter"-JSONs, was bisher die Schleifen gemacht hatte.
Das das ganze JSON jeweils wieder "nur" ein Element des Arrays war, und damit als i-tes Element aufgerufen werden konnte, hatte ich nicht auf dem Schirm.Da habe ich ja heite Nacht noch einiges zu rekapitulieren
-
sooo, aktueller Stand:
gestern Abend bekam ich keinerlei Meldungen.
Vom Bett aus habe ich es dann mit dem Tablet noch geschafft einen debug einzubauen und stellte fest, dass die Geokoordinaten aus der javascript Instanz anscheinend vom Typ String waren.
Diese noch "schnell" in Zahl konvertiert und es lief.Die Daten werden im Moment zur Kontrolle in einen Datenpunkt geschrieben und historisiert:
Dann hatte ich noch versucht den Erfassungsbereich weniger hardcoded zu machen und mit einer Variable schnell zu ändern, Im Moment bekam ich auch Maschinen, die aus einer anderen Richtung im Landeanflug waren (zum Testen ganz gut, auf Dauer aber nicht)
Hatte aber die Rechnung nicht mit Herrn Mercator gemacht, der Ausschnitt war nicht quadratisch
Also empirisch noch einen Faktor eingebaut und es sah besser aus:
Ich werde wahrscheinlich diesen Faktor noch erhöhen, da die mich interessierende Flugroute fast genau von Ost nach West geht.Jetzt kam der quälende Teil.
Ich wollte den Abstand des Fliegers zu meinem Haus berechnen.
Habe im Netz eine brauchbare Rechnung gefunden:distance = sqrt(dx * dx + dy * dy) mit distance: Entfernung in km dx = 111.3 * cos(lat) * (lon1 - lon2) lat = (lat1 + lat2) / 2 * 0.01745 dy = 111.3 * (lat1 - lat2) lat1, lat2, lon1, lon2: Breite, Länge in Grad
Quelle: https://www.kompf.de/gps/distcalc.html
Das wollte ich aus Platzgründen in einer Funktion verstecken, woran ich mal wieder gescheitert bin.
Das Blockly sieht inzwischen gigantisch aus:
und das ist nur der obere Teil für mehrere Flieger, für einen Flieger kommt das selbe nochmal
weitere geplante Dinge
- Der Abstand im Raum (zusätzlich noch ein Pythagoras zur Höhe)
- Arrays für jeweils einen Flug aufbauen, dort den dichtesten Abstand rausfinden
- diesen einen Datensatz in ein weiteres Array für alle Flüge übernehmen
- danach das temporäre Array wieder löschen
mal sehen wie weit ich komme, habe noch keine Möglichkeit gefunden eine Liste mit Namen des Fluges variabel zu erstellen