Dieses Projekt stellt meteorologische Vertikalprofile (Temps) aus DWD-Modelldaten bereit und visualisiert sie interaktiv als Skew-T Log-P Diagramm.
Live: https://tlogpviewer.wetterheidi.de/ (Passwortgeschützt) Admin: https://tlogpviewer.wetterheidi.de/admin.html (Passwortgeschützt)
DWD OpenData-Server
│
▼
Hetzner Server (wetterheidi-server)
/apps/TLogPViewer/
├── sounding_data/ ← Git-Repo (nur Code, keine Daten)
│ ├── fetch_sounding.py
│ ├── run_locations.sh
│ ├── locations.json
│ ├── admin_api.py
│ ├── sounding_viewer.html
│ └── admin.html
├── data/ ← Generierte JSON-Dateien (von nginx ausgeliefert)
├── venv/ ← Python-Umgebung
└── backups/ ← Automatische Backups von locations.json
│
▼
nginx → https://tlogpviewer.wetterheidi.de/
Datenpfad:
- Zwei
systemd-Timer startenrun_locations.shpünktlich zur DWD-Verfügbarkeit - Das Skript lädt GRIB2-Dateien vom DWD, konvertiert sie in JSON und schreibt sie nach
/apps/TLogPViewer/data/ - nginx liefert die JSON-Dateien direkt aus – kein GitHub im Datenpfad
GitHub wird nur noch für Code-Versionierung genutzt. Keine Wetterdaten im Repo.
Öffne https://tlogpviewer.wetterheidi.de/admin.html im Browser.
- Browser fragt nach Benutzername und Passwort (nginx Basic Auth)
- Orte hinzufügen, bearbeiten, aktivieren/deaktivieren per UI
- Änderungen werden sofort in
/apps/TLogPViewer/sounding_data/locations.jsongespeichert - Beim nächsten Timer-Lauf werden die neuen Orte automatisch heruntergeladen
Die Konfiguration pro Ort (locations.json):
{
"alias": "Startplatz",
"lat": 47.981,
"lon": 11.235,
"enabled": true,
"models": {
"icon-d2": { "step": "0:24:1" }
}
}Die Timer liegen auf dem Server unter /etc/systemd/system/.
| Timer | Modelle | Auslösung (UTC) | Grund |
|---|---|---|---|
tlogp-d2eu.timer |
ICON-D2 + ICON-EU | 02:15, 05:15, 08:15, 11:15, 14:15, 17:15, 20:15, 23:15 | DWD-Verfügbarkeit ~2h nach Laufstart |
tlogp-icon.timer |
ICON global | 04:15, 10:15, 16:15, 22:15 | DWD-Verfügbarkeit ~4h nach Laufstart |
Timer-Status prüfen:
systemctl list-timers tlogp*Download manuell anstoßen (z.B. nach Server-Neustart):
systemctl start tlogp-d2eu.service
journalctl -u tlogp-d2eu.service -fEs gibt zwei getrennte Passwort-Dateien:
| Datei | Zugriffsbereich | Benutzer |
|---|---|---|
/etc/nginx/.htpasswd-tlogp |
Admin-UI + API | admin |
/etc/nginx/.htpasswd-wetterheidi |
Viewer (öffentliche Nutzer) | wetterheidi, weitere |
# Admin-Passwort setzen (Benutzer: admin):
htpasswd -c /etc/nginx/.htpasswd-tlogp admin
# Viewer-Nutzer anlegen (erster Nutzer, -c erstellt die Datei):
htpasswd -c /etc/nginx/.htpasswd-wetterheidi wetterheidi
# Weitere Viewer-Nutzer hinzufügen (ohne -c, sonst wird die Datei überschrieben!):
htpasswd /etc/nginx/.htpasswd-wetterheidi weiterernutzer
nginx -t && systemctl reload nginxNach einem git push vom Mac:
git -C /apps/TLogPViewer/sounding_data pullFür Änderungen an run_locations.sh, fetch_sounding.py oder locations.json ist kein Service-Neustart nötig – sie werden beim nächsten Timer-Lauf automatisch verwendet.
Wenn admin_api.py geändert wurde:
systemctl restart tlogp-api.serviceWichtig: Die Datei im Repo enthält nur Port 80. Certbot ergänzt beim ersten Einrichten den SSL-Block direkt in der Server-Datei. Deshalb nach jedem cp der Konfiguration certbot erneut aufrufen, damit SSL wiederhergestellt wird:
cp /apps/TLogPViewer/sounding_data/deploy/nginx-tlogpviewer.conf \
/etc/nginx/sites-available/tlogpviewer.wetterheidi.de
certbot --nginx -d tlogpviewer.wetterheidi.de
nginx -t && systemctl reload nginx# Download-Logs
journalctl -u tlogp-d2eu.service -n 100
journalctl -u tlogp-icon.service -n 100
# Admin-API
journalctl -u tlogp-api.service -f
# nginx
tail -f /var/log/nginx/error.logls /apps/TLogPViewer/data/ # aktuelle JSON-Dateien
cat /apps/TLogPViewer/data/index.json # Index der verfügbaren DateienDateien älter als 3 Tage werden automatisch von run_locations.sh gelöscht.
Falls der Server ausfällt oder Probleme auftreten:
1. Viewer auf GitHub-Daten umstellen – in sounding_viewer.html die zwei Zeilen tauschen:
// Aktiv (Server):
const DATA_BASE = '/data';
// Auf GitHub umschalten:
// const DATA_BASE = '/data';
const DATA_BASE = 'https://raw.githubusercontent.com/wetterheidi/sounding_data/main/data';2. GitHub Actions reaktivieren – unter https://github.com/wetterheidi/sounding_data/actions
den Workflow TlogP Data Fetcher über den Button "Enable workflow" reaktivieren.
Für Spezial-Analysen (historische Daten, bestimmte Lagen, exotische Koordinaten) kann fetch_sounding.py lokal auf dem Mac ausgeführt werden.
brew install eccodes
python3 -m venv ~/sounding-env
source ~/sounding-env/bin/activate
pip install numpy requests eccodes# Aktueller Lauf, ICON-EU, nur Schritt 0:
python3 fetch_sounding.py --lat 48.35 --lon 11.79
# ICON-D2, Zeitreihe 0–24h, stündlich, in ./data/ speichern:
python3 fetch_sounding.py --lat 48.35 --lon 11.79 --model icon-d2 --step 0:24:1 --outdir ./data
# Historischer Lauf (z.B. 12Z vom 15. Mai 2024):
python3 fetch_sounding.py --lat 48.35 --lon 11.79 --model icon-eu --date 20240515 --run 12 --step 0:48:3Parameter:
| Parameter | Beschreibung |
|---|---|
--lat / --lon |
Koordinaten in Dezimalgrad |
--model |
icon-d2, icon-eu oder icon |
--step |
Vorhersagestunden: Einzelwert 0, Liste 0,12,24 oder Bereich 0:48:1 |
--date / --run |
Für historische Läufe, z.B. --date 20240515 --run 12 |
--alias |
Kurzname für die Ausgabedatei |
--outdir |
Ausgabeverzeichnis (Standard: .) |
Der Viewer unter https://tlogpviewer.wetterheidi.de/ benötigt keinen lokalen Webserver. Die HTML-Datei kann auch per Doppelklick lokal geöffnet werden (dann "Lokal laden" verwenden).
- Cloud: Button "☁️ Aktuelle Daten laden" – lädt alle JSON-Dateien vom Server
- Lokal: Button "Lokal laden ↑" oder Drag & Drop einer JSON-Datei ins Fenster
- Ort: Dropdown oben links
- Zeit: Schieberegler unten oder Pfeiltasten Links/Rechts
- Animation: Leertaste startet/stoppt die Zeitleiste
- Maus: Zeigt exakte Werte des nächsten Modell-Levels; berechnet dynamisch Trockenadiabate, Feuchtadiabate und Sättigungsmischungsverhältnislinie
- Mausrad: Zoom
- Klicken & Ziehen: Verschieben im Zoom
- Doppelklick: Zoom zurücksetzen
Alle Zeiten in UTC.
- Läufe: alle 3h (00, 03, 06, 09, 12, 15, 18, 21Z)
- Verfügbarkeit: ~1,5–2h nach Laufstart
- Vorhersagezeitraum: bis +48h, stündliche Auflösung
- Vertikale Level: 65
- Läufe: alle 3h (00, 03, 06, 09, 12, 15, 18, 21Z)
- Verfügbarkeit: ~2h nach Laufstart
- Vorhersagezeitraum: bis +120h (bis +78h stündlich, danach 3-stündlich)
- Vertikale Level: 74
- Läufe: alle 6h (00, 06, 12, 18Z)
- Verfügbarkeit: ~4h nach Laufstart
- Vorhersagezeitraum: bis +180h (00Z/12Z bis +384h)
- Vertikale Level: 120