fhem: Flugdaten aufzeichnen mit adsbox und python

Ich wollte gerne die Flugzeug-Aktivitäten, die ich in adsbox mit meinem RTL-SDR empfange aufzeichnen und visualisieren.

Dazu habe ich zuerst TWFlug gefunden. Leider ist das Programm sehr beschränkt und der Quellcode nicht verfügbar. Erschwerend kommt hinzu, dass es ein Java Programm ist. Jedenfalls war es für meine Zwecke unbrauchbar und anhand der unvollständigen Beschreibungen nicht zum Laufen zu bekommen.

Dann habe ich py1090 von Jonas Lieb gefunden. Der Autor hat den Quelltext unter MIT Lizenz freigegeben. Also habe ich den Code unter meinem Github Account kopiert und angepasst. Mein py1090_2 liest die ads-b Nachrichten über Port 30003 von adsbox und schreibt eine Logdatei in einem für fhem tauglichen Format auf demselben Server (Linux Debian 8). Mein Code bereinigt die gesammelten Flugzeuge regelmäßig und berechnet noch absolute Sicht-Entfernungen. Ausserdem kann man festlegen, in welchem Umkreis um eine Position Flugzeuge aufgezeichnet werden. Wenn einem zum Beispiel nur Flugzeuge im Umkreis von 30km interessieren. Das Ganze kann man dann schön aufbereitet in FHEM anzeigen lassen (oben die Anzahl der Flugzeuge und unten die niedrigste Höhe):

fhem-flugdaten

Zudem habe ich den Code so vorbereitet, dass ich später noch Daten zur Laustärke und zum nächst sichtbaren Flugzeug zu FHEM übertrage (via Telnet).

fhem-fluglaerm1

Zuerst einmal die Definition der extern befüllten Logdatei in der fhem.cfg:

define FileLog_Flugdaten FileLog ./log/FileLog_Flugdaten-%Y-%m.log fakelog
attr FileLog_Flugdaten room Flugdaten
#fuer die obere Grafik
define Flugdaten_SVG SVG FileLog_Flugdaten:myFlug:CURRENT
attr Flugdaten_SVG room Flugdaten
#fuer die untere Grafik
define Flugdaten_SVG2 SVG FileLog_Flugdaten:Flugdaten_SVG:CURRENT
attr Flugdaten_SVG2 room Flugdaten

(diese Zeilen stammen aus meinem laufenden System. Die Beschreibung für TWFlug war entweder nicht vorhanden oder unbrauchbar)

Die Logdatei sieht folgendermassen aus:

2016-06-27_07:04:11 flugdaten anzahl: 8 dist: 28.60 km alt: 10660.38 m
2016-06-27_07:05:13 flugdaten anzahl: 5 dist: 31.93 km alt: 10668.00 m
2016-06-27_07:06:16 flugdaten anzahl: 5 dist: 39.92 km alt: 10683.24 m
2016-06-27_07:07:21 flugdaten anzahl: 8 dist: 28.65 km alt: 10363.20 m
2016-06-27_07:15:03 flugdaten anzahl: 12 dist: 46.19 km alt: 12184.38 m

Dazu benötigt man noch die gplot-Dateien myFlug.gplot und Flugdaten_SVG im Verzeichnis fhem/www/glpot oder erstellt sich einen eigene:

 

# Created by FHEM/98_SVG.pm, 2016-06-24 16:12:20
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Empfangene Flugzeuge'
set ytics
set y2tics
set grid ytics y2tics
set ylabel "Anzahl Flugzeuge"
set y2label "Anzahl Flugzeuge"

#FileLog_Flugdaten 4:anzahl:0:

plot "<IN>" using 1:2 axes x1y1 title 'Anzahl Flugzeuge' ls l0 lw 0.5 with lines

und für das untere Diagramm (die Anzahl und die derzeit kleinste Höhe kann man schlecht in einem Diagramm darstellen):

 

# Created by FHEM/98_SVG.pm, 2016-06-24 17:26:14 set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Empfangene Flugzeuge'
set ytics
set y2tics
set grid ytics y2tics
set ylabel "Min Hoehe"
set y2label ""

#FileLog_Flugdaten 9:anzahl:0:

plot "<IN>" using 1:2 axes x1y1 title 'Min Hoehe' ls l0 lw 0.5 with lines

Zur Übertragung des Geräschpegels habe ich in fhem ein Dummy angelegt:

define fluglaerm dummy
define FileLog_fluglaerm FileLog ./log/FileLog_fluglaerm-%Y-%m.log fluglaerm.*
attr FileLog_fluglaerm room Flugdaten

Wenn man die fhem.cfg geändert hat und dann “sudo python3 dump1090.py” startet (nachdem man die adsbox Adresse in dump1090.py angepasst hat), sollten die Nachrichten von adsbox über den Bildschirm scrollen. Alle fünf Minuten (siehe in dump1090.py) schreibt dump1090.py eine neue Logzeile in die Logdatei.

fhem.cfg Zeilen für das Fluglaerm dummy device:

define fluglaerm dummy
define FileLog_fluglaerm FileLog ./log/FileLog_fluglaerm-%Y-%m.log fluglaerm.*
attr FileLog_fluglaerm room Flugdaten

Diese Device wird über das Python Modul fhem.py beschickt. Die Daten dazu sollen über serial_data.py gelesen werden.

Code in meinem Github Repo