Status: aktiv (Stand: 26.09.2026, issue #248)
Diese Seite beschreibt den vollständigen Datenfluss des Tools end-to-end: Woher die Eingaben kommen, welche Zwischenschritte es gibt, wo jedes Ergebnis landet und wer es konsumiert. Die zweite Seite dieses Dokuments sollte ausreichen, um dem Grünenflächenamt oder h_da zu erklären, wo eine Zahl herkommt.
flowchart TD
subgraph Quellen
LHH["LHH Baumkataster CSV (v6)"]
DWD["DWD Wetter (HOYRAS)"]
OSM["OSM/ALKIS, LBEG, Citree (Enrichment)"]
end
subgraph Daily_0400["Taeglich ab 03:00 (Windows-Task)"]
DWDUPD["03:00 DWD-Cache-Update<br/>run_scheduled_dwd_update.ps1"]
SWBM["04:00 SWBM-Lauf<br/>run_scheduled_water_balance.ps1<br/>(Letzte 3 Tage + 7 Tage Vorhersage)"]
AGG["Stadt-/Niederschlags-/Alters-Aggregat<br/>swbm_city_daily_agg etc."]
OP["Operational Products<br/>refresh_operational_tree_products.py<br/>(Risiko-GPKG + SWBM-State)"]
PLAN["Bewaesserungsplanung<br/>run_irrigation_planning.py (MILP)"]
end
subgraph PostGIS["PostGIS (bgcki)"]
STATE["swbm_daily_state<br/>(~134.760 Profile/Tag)"]
OPPROD["operational_tree_product"]
DECISION["irrigation_plan_decision"]
REVIEW["irrigation_plan_review<br/>+ work_order + execution<br/>(HITL-Audit-Trail)"]
end
subgraph ML["ML-Refresh (manuell nachts, ~woechentlich)"]
MLRUN["run_ml_refresh_overnight.ps1<br/>Train + Inference + SHAP<br/>tree_features.gpkg Rebuild"]
end
subgraph HITL["Taipy HITL (Forschungsdienst)"]
TAIPI["Taipy GUI<br/>Planentwurf + Freigabe<br/>+ Ausfuehrung + Szenario<br/>(SHAP-Begruendung)"]
end
subgraph Consumer
GRAF["Grafana: Lagebild +<br/>Bewaesserungsbetrieb<br/>(inkl. HITL-Flow)"]
QGIS["QGIS/QWC via WFS"]
GFMS["GFMS (LHH) –<br/>Einsatzplanung"]
end
LHH --> SWBM
OSM --> SWBM
DWD --> DWDUPD --> SWBM
SWBM --> STATE
SWBM --> AGG --> GRAF
MLRUN -. "Risiko-GPKG<br/>(Pointer in config)" .-> OP
STATE -. "State-Parquet-Mirror" .-> OP
OP --> OPPROD
OPPROD --> GRAF
OPPROD --> QGIS
STATE --> PLAN
OPPROD --> PLAN
PLAN --> DECISION
DECISION --> GRAF
DECISION --> TAIPI
TAIPI --> REVIEW
REVIEW --> GRAF
DECISION -. "Export/Review" .-> GFMS
GFMS -. "Bewaesserungs-Events (#249, WFS 2027;<br/>CSV-Import vorbereitet)" .-> STATE
| Thema | Konvention |
|---|---|
| Baum-Id | objectid des Baumkatasters (stabil, als Text behandelt) |
| Koordinatensystem | EPSG:25832 (UTM 32N) in allen Vektoren und Rastern |
| Temperatur | immer Celsius |
| Tagesdatum | state_date / run_date als YYYY-MM-DD |
| Szenario-Fan-out | Bäume mit unbekanntem Alter/SVF haben mehrere Profile pro Tag (3 bzw. 9 model_version-Varianten) – das ist Design, keine Duplikate |
;-getrennt), aktuell Baum-2026-09-11-v6_aktuell_prod_wie_WFS.csv (108.368 Rohzeilen → 89.280 analysierbare Bäume nach Status-Filter, siehe Status-Matrix).import_tree_data.py) + Enrichment (OSM-Straßen, LBEG-GK25, Citree-Artenprofile, Wipfeldürre-Mapping).bgcki.trees_current + abgeleitet tree_features.gpkg (SWBM-Features, Fingerprint-Guard, wird vom ML-Refresh neu gebaut).run_scheduled_dwd_update.ps1 lädt die Cache-Dateien neu.run_scheduled_water_balance.ps1 → run_daily_water_balance.py.tree_features.gpkg (per Task-Argument), DWD-Cache.bgcki.swbm_daily_state (~134.760 Profile-Zeilen/Tag inkl. Szenario-Fan-out), lokal daily_state.parquet (Mirror, ~1 MB/Tag).model_version. Stale Varianten (v5/v6-Inventarwechsel) sind praktisch eliminiert; Restanalyse in #241.refresh_swbm_city_agg.py (→ swbm_city_daily_agg), refresh_swbm_precip_agg.py (→ swbm_city_precip_daily), refresh_swbm_age_agg.py (→ swbm_city_age_daily_agg).refresh_operational_tree_products.py.irrigation_review.inputs.risk_path in config/config.yaml, Self-Heal-Guard via update_operational_risk_pointer.py --check), (b) aktueller SWBM-State-Parquet.bgcki.operational_tree_product (je Baum: drought_risk_ml, drought_risk_rulebased, site_vulnerability_*, aktuelle SWBM-Stresswerte, Geometrie).run_ml_refresh_overnight.ps1 (getrennter Prozess).tree_features.gpkg-Rebuild, (6) Risk-Pointer-Update.data/output/<YYYY_MM_DD>_ml_operational_train_…/ mit Risiko-GPKG + SHAP-Attributions-Tabelle.update_operational_risk_pointer.py + einen manuellen Products-Refresh ausführen (siehe AGENTS.md, Stale-Pointer).run_irrigation_planning.py (CLI, aktiv nur wenn irrigation_planning.enabled: true).swbm_daily_state (aktuelles Tages-State) + operational_tree_product (Risiko) + irrigation_events.parquet (letzte Bewässerung) + Kapazitäten aus config/config.yaml (108.000 L, 9 Fahrer, Schicht, 9 Fahrzeuge × 60 Jobs).bgcki.irrigation_plan_decision (einschließlich planning_run_date), lokal plan_decisions.parquet.MAX(planning_run_date), inkl. HITL-Flow: offene Entwürfe → Arbeitsaufträge → Ausführungen), Taipy HITL (Freigabe + SHAP-Begründung), GFMS-Export/Review (#108).irrigation_events in den SWBM fließen (Issue #249, noch nicht implementiert – GFMS-Exportformat steht mit der LHH aus).enabled: false → stiller Skip (by design, Smoke-/Rollout-Phase).docs/plans/2026-09-18-irrigation-planning-rollout.md (lokal, nicht Teil der öffentlichen Doku)