Ich wollte meine Allsky-Aufnahmen um eine zusätzliche Information ergänzen: Flugzeugdaten direkt im Bild, inklusive Callsign, Flughöhe und Richtung. Da ich kein eigenes ADS-B-Setup betreiben wollte, habe ich die Open-Data-API von adsb.fi genutzt und eine Lösung gebaut, die mit indi-allsky zusammenarbeitet.
Mit der folgenden Anleitung erhaltet ihr über adsb.fi minütlich aktuelle Infos zu Flugzeugen rund um den Standort eurer Allsky-Kamera und könnte diese direkt auf dem Allsky-Foto ausgeben lassen.
Warum adsb.fi?
adsb.fi bietet eine öffentlich zugängliche, JSON-basierte API, die kompatibel zur ADSB-Exchange-v2-API ist. Damit bekommt man sehr detaillierte Informationen:
- ICAO-Hex
- Callsign
- Position (lat/lon)
- Barometrische bzw. geometrische Höhe
- Geschwindigkeit, Kurs
Die Nutzung ist für persönliche, nicht-kommerzielle Zwecke erlaubt – damit eignet sich der Dienst gut für ein privates Allsky-Projekt.
Ziel: eine dump1090-kompatible aircraft.json für indi-allsky
indi-allsky kann ADS-B nur darstellen, wenn eine Datei im Format von dump1090 bereitsteht – konkret eine aircraft.json. Da ich keinen dump1090-Receiver betreibe, war der Ansatz:
- Daten von adsb.fi abrufen
- In das passende dump1090-JSON-Format umwandeln
- Das Ergebnis über Apache unter einer URL bereitstellen
- indi-allsky auf diese URL zeigen lassen
Das Ergebnis: Flight-Overlay direkt auf den Allsky-Nachtaufnahmen – live aktualisiert.
Python-Adapter: adsb.fi → dump1090 JSON
Ich habe eine kleine Python-Anwendung gebaut, die jede Minute die aktuellen Flugdaten lädt und als aircraft.json ablegt.
Pfadstruktur:
/home/dante/adsb_adapter/ ├── adsbfi_to_aircraftjson.py └── out/aircraft.json
Virtualenv anlegen und requests installieren:
python3 -m venv ~/adsb_adapter ~/adsb_adapter/bin/pip install requests mkdir -p ~/adsb_adapter/out
Python-Skript adsbfi_to_aircraftjson.py – wichtig: Bei xxx müsst ihr euren Breiten- und Längengrad eingeben!
#!/usr/bin/env python3 import time import json import os import requests LAT = xxx LON = xxx DIST_NM = 100 OUT_DIR = "/home/dante/adsb_adapter/out" OUT_FILE = os.path.join(OUT_DIR, "aircraft.json") API_URL = f"https://opendata.adsb.fi/api/v3/lat/{LAT}/lon/{LON}/dist/{DIST_NM}" def fetch_adsb(): resp = requests.get(API_URL, timeout=5) resp.raise_for_status() return resp.json() def convert_to_dump1090(data): ac_list = data.get("ac", []) aircraft = [] for ac in ac_list: lat = ac.get("lat") lon = ac.get("lon") if lat is None or lon is None: continue rec = { "hex": ac.get("hex") or ac.get("icao") or "", "squawk": ac.get("squawk"), "flight": (ac.get("flight") or "").strip(), "lat": lat, "lon": lon, "altitude": ac.get("alt_geom") or ac.get("alt_baro"), "speed": ac.get("gs"), "track": ac.get("track"), "messages": ac.get("messages", 0), "seen": 0.0 } aircraft.append(rec) now_ts = time.time() total_messages = sum(a.get("messages", 0) for a in aircraft) return { "now": now_ts, "messages": total_messages, "aircraft": aircraft } def main(): os.makedirs(OUT_DIR, exist_ok=True) try: data = fetch_adsb() aircraft_json = convert_to_dump1090(data) tmp = OUT_FILE + ".tmp" with open(tmp, "w") as f: json.dump(aircraft_json, f, separators=(",", ":")) os.replace(tmp, OUT_FILE) except Exception as e: print(f"Error updating aircraft.json: {e}") if __name__ == "__main__": main()
Testlauf:
~/adsb_adapter/bin/python ~/adsb_adapter/adsbfi_to_aircraftjson.py
Die Datei aircraft.json liegt anschließend unter:
/home/dante/adsb_adapter/out/aircraft.json
Bereitstellen per Apache unter eigener URL
Damit indi-allsky auf die Datei zugreifen kann, braucht es eine HTTP- bzw. HTTPS-URL. Ich habe dafür einen eigenen Pfad gewählt (/adsb/data), um Konflikte mit eventuell vorhandener dump1090-Konfiguration zu vermeiden.
Neue Apache-Konfiguration anlegen:
sudo nano /etc/apache2/conf-available/adsb_alias.conf
Inhalt:
Alias /adsb/data /home/dante/adsb_adapter/out
<Directory "/home/dante/adsb_adapter/out">
Require all granted
Options -Indexes
</Directory>
Konfiguration aktivieren und Apache neu laden:
sudo a2enconf adsb_alias sudo systemctl reload apache2
Test per curl:
curl -k https://localhost/adsb/data/aircraft.json
Die Ausgabe sollte das JSON aus aircraft.json zeigen.
Automatische Aktualisierung per cron
Damit der Adapter regelmäßig neue Daten holt, läuft er per cron jede Minute:
crontab -e
Eintrag:
* * * * * /home/dante/adsb_adapter/bin/python /home/dante/adsb_adapter/adsbfi_to_aircraftjson.py >/home/dante/adsb_adapter/adsb_adapter.log 2>&1
Damit wird die aircraft.json minütlich aktualisiert.
Konfiguration in indi-allsky
In den ADS-B-Einstellungen von indi-allsky trage ich als Datenquelle die URL ein:
https://localhost/adsb/data/aircraft.json
indi-allsky erkennt das dump1090-kompatible Format und zeigt die Flugzeuge im Bild an.
Flugzeuge labeln
indi-allsky unterstützt Python-ähnliches Number-Formatting in den Image-Labels.
Beispiel für ein komplettes Overlay pro Flugzeug:
{flight:s} – {altitude_m: .0f} m – {dir:s} – {distance:0.1f} km
Die Ausgabe sieht dann z. B. so aus:
DLH4AB – 10 850 m – SW – 32.4 km
Mit diesem Setup läuft das ADS-B-Overlay für meine Allsky-Kamera komplett ohne eigene Antenne – die Daten kommen über die Open-Data-API von adsb.fi. Der Python-Adapter sorgt für das passende dump1090-Format, Apache stellt die Datei unter einer festen URL bereit und indi-allsky nutzt die Daten für das Flugzeug-Overlay im Bild.
Beispielbild
Man erkennt hier ganz schön zwei Flugzeuge, relativ mittig im Bild und die dazugehörigen Callsigns, Entfernungen und die Flughöhen.
CPA253 ist eine Boeing 777-300ER, während die WMT2CH ein deutlich kleinerer Airbus A320-200 ist – daher sieht man die CPA253 sehr deutlich und die WMT2CH etwas schwächer, zumal sie rund 600 Meter höher fliegt.
Auf der Live-Foto-Seite von allsky-rodgau.de werden die aktuell sichtbaren Flugzeuge mit Verlinkung ausgegeben sodass man direkt nachsehen kann, um was für eine Maschine es sich genau handelt.
UPDATE: Sicherheitseinstellungen
Schritt 1: Apache-Konfiguration öffnen
sudo nano /etc/apache2/sites-enabled/indi-allsky.conf
Schritt 2: Zum HTTPS-VirtualHost scrollen
<VirtualHost *:443> ... </VirtualHost>
Schritt 3: ADS-B Bereich finden
# ADSB Aircraft tracking Alias /dump1090/data /run/dump1090-mutability Alias /dump1090 /usr/share/dump1090-mutability/html
Darunter sollte folgendes bereits vorhanden sein – falls nein: Ergänzen!
<Directory "/var/www/html/adsb/data"> Options -Indexes Require all granted </Directory>
Schritt 4: Den <Files>-Block direkt danach einfügen und Datei speichern
<Files "aircraft.json">
RewriteEngine On
# Wenn ein Referer vorhanden ist, muss er von der eigenen Domain kommen
RewriteCond %{HTTP_REFERER} !="" RewriteCond %{HTTP_REFERER} !^https://access\.allsky-rodgau\.de [NC]
RewriteCond %{HTTP_REFERER} !^https://allsky-rodgau\.de [NC] RewriteRule .* - [F]
# Wenn kein Referer vorhanden ist, Zugriff erlaubenSchritt 6: Syntax prüfen
sudo apachectl configtest
Schritt 7: Apache neu laden
sudo systemctl reload apache2
