Flugzeugdaten / ADS-B Tracking für meine Allsky-Kamera via adsb.fi

Eigenes Logo für adsb.fiIch 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:

  1. Daten von adsb.fi abrufen
  2. In das passende dump1090-JSON-Format umwandeln
  3. Das Ergebnis über Apache unter einer URL bereitstellen
  4. 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

Sichtbare Flugzeuge mit korrektem Overlay

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 erlauben

Schritt 6: Syntax prüfen

 sudo apachectl configtest

Schritt 7: Apache neu laden

 sudo systemctl reload apache2

Hat dir dieser Beitrag gefallen?

Du kannst allsky-rodgau.de mit einem kleinen Kaffee auf BuyMeACoffee unterstützen.

Jetzt Kaffee spendieren!