Echtzeit-Wetter- und Luftraumbewertung für Drohnen-Piloten in Deutschland.
- Sicherheitsbewertung — Windgeschwindigkeit (je Höhe), Böen, Temperatur, Taupunkt (pro Höhe) und geomagnetische Aktivität werden gegen die Betriebsgrenzen geprüft
- Taupunkt je Höhe — pro Altitude aus DFS-Temperatur und -Luftfeuchte via Magnus-Tetens berechnet, zwei Gefahrenstufen (Warnung / kritisch) plus absolutes Flugverbot bei gefrierendem Regen
- Luftraumüberlagerung — DiPUL/DFS WMS mit 32 Zonentypen (Kontrollzonen, Naturschutzgebiete, Militärgebiete, …)
- Betroffene Zonen — API-basierte GeoJSON-Polygone für den genauen Standort, auf der Karte dargestellt mit Popups und Klick-Details
- Wolkenuntergrenze — nächstgelegenes Flughafen-TAF wird nach Wolkenuntergrenze ausgewertet
- Luftverkehr live — Flugzeuge in der Nähe (
✈️ Starrflügler, 🚁 Hubschrauber, 🛩 Leichtflugzeuge, 🛸 UAVs) über das OpenSky-Netzwerk, alle 15 Sekunden aktualisiert - Parallele API-Abfragen — alle Datenquellen werden gleichzeitig abgerufen (UTM, OpenWeatherMap, Kp-Index, DiPUL, OpenSky)
- Zweisprachig — Deutsch/Englisch umschaltbar, wird in localStorage gespeichert
- Hell- & Dunkelmodus — umschaltbar, wird in localStorage gespeichert
- Mobiloptimiert — responsives Grid, touchfreundliche Bedienung, 16px-Eingaben (kein iOS-Autozoom)
- Rate Limiting — 10 Anfragen / Minute pro IP, Token-Bucket via
golang.org/x/time/rate
| Quelle | Daten |
|---|---|
| DFS UTM | Wind, Temperatur & Luftfeuchte auf 2 / 10 / 50 / 100 / 150 m AGL (Taupunkt wird daraus abgeleitet) |
| OpenWeatherMap | Ergänzende Oberflächenwerte (Fallback für Taupunkt) |
| GFZ Potsdam | Kp-Index (geomagnetische Aktivität) |
| DiPUL / DFS | Luftraumzonen, WMS-Überlagerung & Zonendetails |
| DFS TAF | Wolkenuntergrenze vom nächstgelegenen Flughafen-TAF |
| OpenSky Network | Echtzeit-Luftverkehr (State Vectors, ~11 km Radius) |
| HERE Maps | Adress-Geocoding (nur Deutschland) |
| OpenStreetMap | Kartenkacheln |
| Leaflet | Interaktive Karte |
| Parameter | Grenzwert |
|---|---|
| Windgeschwindigkeit | ≤ 12 m/s je Höhenstufe |
| Böen | ≤ 12 m/s |
| Temperatur | −20 °C … +50 °C |
| Taupunkt-Abstand (Warnung) | T < 3 °C und (T − Td) < 2 °C → Nebel-/Klareisgefahr |
| Taupunkt-Abstand (kritisch) | −10 °C ≤ T ≤ 0 °C und (T − Td) < 1 °C → Vereisungsgefahr |
| Gefrierender Regen | Niederschlag > 0 mm bei Oberflächen-T ≤ 0 °C → absolutes Flugverbot |
| Regen (nicht gefrierend) | > 0 mm → Warnung (wetterfeste IP-Drohne empfohlen, kein Flugverbot) |
| Schneefall | > 0 cm → Warnung (wetterfeste IP-Drohne empfohlen, kein Flugverbot) |
| Kp-Index | ≤ 4 (GPS- / Funk-Zuverlässigkeit) |
Die App ist primär auf BOS-Nutzer (Polizei, Feuerwehr, Rettung, Katastrophenschutz) mit IP-geschützten Drohnen ausgelegt. Leichter Regen oder Schnee werden daher als Warnung angezeigt, jedoch ohne den Flugstatus auf „gesperrt" zu setzen.
- Sprache: Go 1.23 —
net/http,html/template, kein Web-Framework - Version:
0.9(siehe VERSION) - Abhängigkeiten:
golang.org/x/time/rate(Rate Limiting) - Karte: Leaflet.js + OpenStreetMap + DiPUL WMS
- Betrieb: Docker Compose — 3 App-Replikas + Nginx Reverse Proxy
- Image: Multi-Stage-Build →
gcr.io/distroless/static-debian12:nonroot(~8 MB) - Proxy: Cloudflare → Nginx → Go-App (echte IP via
CF-Connecting-IP)
drohnenwetter/
├── go/ # Go-Anwendung
│ ├── cmd/drohnenwetter/
│ │ └── main.go # Einstiegspunkt, Server, Rate Limiting, Middleware
│ ├── internal/
│ │ ├── api/
│ │ │ ├── client.go # HTTP-Client (8 s Timeout)
│ │ │ ├── geocode.go # HERE Maps Geocoding
│ │ │ ├── weather.go # DFS UTM + OpenWeatherMap + Kp-Index
│ │ │ ├── dipul.go # DiPUL Token-Cache + Zonenabruf
│ │ │ ├── wms.go # DiPUL WMS GetFeatureInfo (Klick-Details)
│ │ │ ├── metar.go # Wolkenuntergrenze aus Flughafen-TAF
│ │ │ └── opensky.go # OpenSky OAuth2 Token-Cache + Verkehrsabruf
│ │ ├── assessment/
│ │ │ └── assess.go # Sicherheitsbewertungslogik
│ │ └── handler/
│ │ ├── home.go # GET /
│ │ ├── results.go # POST /results — paralleler Abruf & Rendering
│ │ ├── zone-info.go # GET /zone-info — Zonenklick-Details (GeoJSON)
│ │ ├── traffic.go # GET /traffic — Live-Luftverkehr JSON
│ │ ├── track.go # GET /track — Flugtrack-Proxy
│ │ └── util.go # Gemeinsame Handler-Hilfsfunktionen
│ ├── templates/
│ │ ├── base.html # Gemeinsames CSS, Hell/Dunkel-Modus, i18n, Footer
│ │ ├── index.html # Startseite
│ │ ├── results.html # Dashboard: Messwerte, Karte, Zonen, Luftverkehr
│ │ ├── impressum.html # Impressum
│ │ └── datenschutz.html # Datenschutzerklärung
│ ├── static/ # Favicons, Manifest, robots.txt, Sitemap
│ ├── Dockerfile
│ ├── go.mod
│ └── go.sum
├── nginx/
│ └── drohnenwetter.de.conf
├── checks/
│ └── smoke.sh # Smoke-Tests gegen Live-Site
├── .github/
│ └── workflows/
│ └── daily-health.yml # Täglicher automatischer Health-Check (07:00 UTC)
├── docker-compose.yml
└── .env # API-Keys (nicht eingecheckt)
- Docker + Docker Compose
- API-Keys (siehe unten)
.env-Datei im Projektverzeichnis anlegen:
HERE_API_KEY=dein_here_maps_api_key
OPENWEATHER_TOKEN=dein_openweathermap_api_key
OPENSKY_CLIENT_ID=deine_opensky_client_id
OPENSKY_CLIENT_SECRET=dein_opensky_client_secret| Variable | Bezugsquelle |
|---|---|
HERE_API_KEY |
developer.here.com — kostenlose Stufe verfügbar |
OPENWEATHER_TOKEN |
openweathermap.org/api — OneCall 3.0 erforderlich |
OPENSKY_CLIENT_ID |
opensky-network.org — API-Client unter dem eigenen Konto anlegen |
OPENSKY_CLIENT_SECRET |
Wie oben — OAuth2 Client Credentials Flow |
OPENSKY_CLIENT_IDundOPENSKY_CLIENT_SECRETsind optional. Ohne diese Angaben greift die App auf die anonyme OpenSky-API zurück (niedrigere Rate Limits, keine Track-Daten).
docker compose up --buildDie App ist danach unter http://localhost:8080 erreichbar.
docker compose logs -f drohnenwetter-appGo muss nicht lokal installiert sein — der Docker-Build übernimmt die Kompilierung. Falls Go lokal vorhanden ist:
cd go
go build ./... # Kompilierungsprüfung
HERE_API_KEY=... OPENWEATHER_TOKEN=... \
OPENSKY_CLIENT_ID=... OPENSKY_CLIENT_SECRET=... \
go run ./cmd/drohnenwetter # lokal starten auf :8080./checks/smoke.sh # Live-Site testen
./checks/smoke.sh http://localhost:8080 # lokale Instanz testenDas mitgelieferte docker-compose.yml betreibt 3 App-Replikas hinter Nginx.
Konzipiert für den Betrieb hinter Cloudflare (echte Client-IP aus CF-Connecting-IP).
Live unter: drohnenwetter.de
Sicherheitshinweis: Kein integriertes TLS. Ausschließlich hinter Nginx + Cloudflare (oder einem anderen TLS-terminierenden Proxy) betreiben. Den Go-App-Port 8080 nicht direkt im Internet exponieren.
Persönliches Projekt — ohne Gewähr. Kein Ersatz für offizielle Vorflugchecks. Wetterdaten © jeweilige Anbieter. Kartendaten © OpenStreetMap-Beitragende.
Kontakt: info@drohnenwetter.de · github.com/olizimmermann
