diff --git a/docker-compose.dwd.yml b/docker-compose.dwd.yml index 71d4493..8834680 100644 --- a/docker-compose.dwd.yml +++ b/docker-compose.dwd.yml @@ -1,8 +1,6 @@ # DWD-Regenvorhersage-Pipeline (RV-Komposit → PMTiles-Frames) — NICHT Teil des Default-Stacks. -# DAUER-CONTAINER mit interner 5-Min-Schleife (loop.sh): der DSM-Aufgabenplaner kann nur -# stündlich, daher KEIN Cron. Einmal starten (überlebt Reboots via restart-Policy): -# docker compose -f docker-compose.dwd.yml up -d --build -# Stoppen: docker compose -f docker-compose.dwd.yml down +# Trigger: DSM-Aufgabenplaner ALLE 5 MINUTEN: +# docker compose -f docker-compose.dwd.yml run --rm dwd-radar # ⚠️ NIE mit --remove-orphans aufrufen (löscht den App-Container)! # Schreibt ins data-Volume (./data/radar) — ausgeliefert von main.py /radar/* (Range-Route). # Georeferenzierung PoC-bewiesen 2026-06-08, s. tools/dwd-radar/ + docs/DWD_RAIN_FORECAST_PLAN.md. @@ -15,7 +13,6 @@ services: volumes: - ./data/radar:/out environment: - - INTERVAL_S=300 # Schleifen-Intervall (RV-Läufe kommen alle 5 Min) - FRAME_STEP=1 # alle 25 Frames (5-Min-Schritte); 2 = 10-Min-Schritte falls DS-Last zu hoch - KEEP_RUNS=2 - restart: unless-stopped + restart: "no" diff --git a/docs/DWD_RAIN_FORECAST_PLAN.md b/docs/DWD_RAIN_FORECAST_PLAN.md index 55b29dd..4c84e5d 100644 --- a/docs/DWD_RAIN_FORECAST_PLAN.md +++ b/docs/DWD_RAIN_FORECAST_PLAN.md @@ -1,28 +1,6 @@ # DWD Regen-Vorhersage (Radar-Nowcast) — Scoping-Plan -**Status:** UMGESETZT auf Staging (v1240, 2026-06-08) — PoC bestanden, Pipeline + Frontend live. -**Offen:** DSM-Aufgabenplaner-Cron (alle 5 Min, Staging + Prod) anlegen; Gerätetest; Prod-Deploy. - -## Umsetzung (2026-06-08) -- **PoC Georeferenzierung BESTANDEN** (`tools/dwd-radar/poc/`): DE1200 = polar-stereografisch auf - WGS84-Ellipsoid (wradlib-Parameter, False Easting/Northing 543196.835/3622588.862 → LL-Ecke (0,0); - in GDAL-Konvention y südwärts negativ, Gitter y ∈ [-1200000, 0]). Anker (9°E, 51°N) = Mitte von - Pixel (470/600) ✓, Ecken decken sich mit der DE1200-Spec ✓. -- **Pipeline** `tools/dwd-radar/make_radar_tiles.py` (Container: GDAL + go-pmtiles): RV-Komposit → - je Frame dekodieren → RGBA-Farbskala (transparent < 0,05 mm/5min) → Warp 3857 → MBTiles z7-Basis - + Overviews bis z4 → PMTiles. 25 Frames ≈ 14 s (Mac) / ~30 s (DS). Manifest + atomarer Swap - (`run-/`), KEEP_RUNS=2. `docker-compose.dwd.yml` — **DSM-Aufgabenplaner ALLE 5 MIN**: - `cd && docker compose -f docker-compose.dwd.yml run --rm dwd-radar` (⚠️ NIE --remove-orphans). -- **Serving** main.py: `/radar/manifest.json` (no-store) + `/radar/{run}/{file}` (Range/206, - immutable — Run-Id im Pfad). sw.js: `/radar/` Pass-through. -- **Frontend** map.js: Radar-Frames heterogen (`{url, time, dwd}`) — DWD ersetzt den RainViewer- - Nowcast (0–120 min) wenn: Toggle an + GL-Modus + Kartenmitte in DE1200-Bbox + Manifest frisch - (< 30 min). Sonst RainViewer-Fallback (auch außerhalb DE / offline / DWD-Ausfall). DWD-Frames - als `pmtiles://`-Raster-Template über das vorhandene Protokoll; Label „+X Min · DWD". -- **Settings-Toggle** „DWD-Regenvorhersage" (`by_dwd_radar`, Default AN), settings.js. - -(Ursprüngliches Scoping:) -~~**Status:** gescoppt + Datenformat verifiziert (2026-06-05). Umsetzung offen.~~ +**Status:** gescoppt + Datenformat verifiziert (2026-06-05). Umsetzung offen. **Ziel:** Verlässliche, längere Regen-**Vorhersage** als animiertes Karten-Overlay (bis +2 h) statt RainViewers unzuverlässigem 30-Min-Nowcast (der oft leer ist). Self-hosted wie die Basemap — passt zur Tile-Server-Philosophie. diff --git a/tools/dwd-radar/Dockerfile b/tools/dwd-radar/Dockerfile index b0f622c..9136775 100644 --- a/tools/dwd-radar/Dockerfile +++ b/tools/dwd-radar/Dockerfile @@ -11,9 +11,5 @@ RUN ARCH=$([ "$TARGETARCH" = "arm64" ] && echo arm64 || echo x86_64) && \ rm /tmp/pmtiles.tar.gz && pmtiles version || true COPY make_radar_tiles.py /app/make_radar_tiles.py -COPY loop.sh /app/loop.sh -RUN chmod +x /app/loop.sh WORKDIR /app -# Dauerbetrieb mit interner 5-Min-Schleife (DSM-Aufgabenplaner kann nur stündlich). -# Einmal-Lauf weiterhin möglich: docker compose run --rm dwd-radar python3 /app/make_radar_tiles.py -CMD ["/app/loop.sh"] +CMD ["python3", "/app/make_radar_tiles.py"] diff --git a/tools/dwd-radar/loop.sh b/tools/dwd-radar/loop.sh deleted file mode 100644 index 499f4eb..0000000 --- a/tools/dwd-radar/loop.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -# Endlos-Schleife statt Cron: Der DSM-Aufgabenplaner kann minimal stündlich (René 2026-06-08), -# die RV-Läufe kommen aber alle 5 Minuten. Der Container läuft daher dauerhaft (restart: -# unless-stopped) und schläft zwischen den Läufen — idle ist nur die sh+sleep (winzig), -# Python/GDAL leben nur während des Laufs. make_radar_tiles.py ist idempotent -# (gleicher Lauf vorhanden → sofort fertig), Fehler brechen die Schleife nicht. -INTERVAL="${INTERVAL_S:-300}" -echo "DWD-Radar-Loop: alle ${INTERVAL}s (INTERVAL_S zum Ändern)" -while true; do - python3 /app/make_radar_tiles.py || echo "Lauf fehlgeschlagen — nächster Versuch in ${INTERVAL}s" - sleep "$INTERVAL" -done