Waterlab  ·  micro-innovatielab  ·  hydrologische modellering + AI  ·  NVIDIA Jetson AGX Orin

1 · Wat is deze proef?

Dit dashboard toont resultaten van het Wflow SBM hydrologisch model, gedraaid op een NVIDIA Jetson AGX Orin — een compact ARM-gebaseerd edge-apparaat, normaal gebruikt voor AI-inferentie aan de rand van het netwerk. Het doel was te testen of een volledige hydrologische modelleeropzet (invoerdata, simulatie, export, webdashboard) volledig autonoom op zo'n apparaat kan draaien, zonder cloud en zonder x86-werkstation.

Wflow SBM is een fysisch-gebaseerd neerslagregelmodel ontwikkeld door Deltares en beschikbaar als open-source Julia-pakket. Het modelleert bodemwater, grondwater, laterale afvoer en rivierrouting op een rastergrid — in dit geval het IJssel-stroomgebied op ~800 m resolutie.

Hardware
Jetson AGX Orin
aarch64 ARM · 64 GB · 12-core
Model
Wflow SBM 1.0.2
Julia 1.12 · 3-laags bodem · kinematische golf
Domein
300 × 240 cellen
~800 m · 19 490 actieve cellen
Forcing
ERA5-Land
neerslag · temp · ET · dagelijks
Simulatie jan 1995
62 tijdstappen
runtime ~31 s (na JIT)
Simulatie jul 2021
123 tijdstappen
runtime ~2 min (JIT warm)

Netwerktoegang vanuit de iPad gaat via Tailscale — een overlay-VPN dat directe communicatie mogelijk maakt ondanks WiFi AP-isolatie op het lokale netwerk. Het dashboard wordt geserveerd door FastAPI/uvicorn en toont rivierdebieten via deck.gl 3D-kolommen.

2 · Lessons learned (samenvatting)

De volledige rapportage is beschikbaar in LESSONS_LEARNED.md. Hieronder de meest impactvolle bevindingen voor Deltares en toekomstige gebruikers.

#ProbleemOorzaakFixImpact
1 JIT-compilatie 2–3 uur op ARM CFTime.jl type-instabiliteit → LLVM-cascade op aarch64 Type-stabiele Period-constructor; @nospecialize in Wflow Blokkerend
2 c_layer heeft 3 lagen, model verwacht 4 Wflow voegt intern een NaN-schildwacht laag toe: maxlayers = n+1 NetCDF hergebouwd met 4 lagen Blokkerend
3 Beginstaat mist time-dimensie set_states! eist 3D/4D met time=1 NetCDF herbouwd met singleton tijdsdimensie Blokkerend
4 3 cellen buiten ERA5-dekking Bounding box te krap; uitlaat IJsselmeer net buiten grid Nearest-neighbour invulling Blokkerend
5 Kampen-meetpunt niet op riviernetwerk 800 m resolutie: geografische stad ≠ model-riviercel Coördinaten gesnapped naar uitlaatcel (5.496, 53.221) Blokkerend
6 iPad kon dashboard niet bereiken WiFi AP-clientisolatie blokkeert peer-to-peer op poort 8000 Tailscale overlay-netwerk Blokkerend
7 Python cdsapi crasht op ARM attrs-namespace ontbreekt in Python 3.10 systeem-installatie Installatiedependencies in apart --target-pad Oplosbaar
8 Browser laadt oude JavaScript Safari op iPad cached app.js agressief ?v=N cache-busting + Cache-Control: no-store Oplosbaar

Tijdsinvestering: ~12 uur voor de 1995-opzet (waarvan ~7 uur aan ARM-specifieke technische problemen), ~3 uur voor 2021 + dashboard-uitbreiding. Met deze kennis vooraf ingepast: ~2–3 uur totaal.

3 · Analyse resultaten Juli 2021

De juli 2021 Rijn-vloed was de zwaarste in Duitsland en Nederland in decennia. Bij Lobith (meetpunt Pannerdense Kop) bereikte de Rijn een piek van 6 687 m³/s op 18 juli 2021 (bron: RWS Waterinfo, station lobith.bovenrijn.tolkamer). De simulatie is twee keer uitgevoerd: eerst met een synthetische inflow-schatting, daarna met de werkelijk gemeten debietreeks.

⚠ Bronnen van de synthetische inflow — en waarom ze faalkten

Bij de eerste opzet was de RWS Waterinfo REST API niet beschikbaar (het oude eindpunt gaf "Exceeded 30 redirects" doordat het in april 2026 was vervangen). De inflow bij Westervoort werd daarom synthetisch opgebouwd uit twee aannames:

AannameBronGebruikte waardeWerkelijk (RWS)Fout
Lobith piekdebiet RWS waterstandsberichten jul 2021
(persbericht, niet gevalideerde meting)
~8 900 m³/s op 15 jul 6 687 m³/s op 18 jul +33%
IJssel-aandeel bij hoog water Vuistregel voor gemiddelde Rijnverdeling
(langjarig gemiddelde ~18–25%)
25% 13,4% (899 / 6 687) +87%
Resulterende inflow Westervoort 8 900 × 25% = 2 225 m³/s 2 200 m³/s 899 m³/s ×2,45

Waarom week het IJssel-aandeel zo sterk af? Bij extreme afvoer op de Rijn reguleert Rijkswaterstaat actief de verdeling bij de Pannerdense Kop. Bij de jul-2021 golf werd meer water naar de Waal geleid om benedenrivierafvoer te spreiden. Het langjarig gemiddelde van ~25% is dus géén betrouwbare schatting tijdens hoogwater — juist het moment dat het er toe doet.

Simulatievergelijking: synthetisch vs. gemeten inflow

Piek Kampen — synthetische inflow
3 090 m³/s
16 jul 2021
Piek Kampen — gemeten inflow (RWS)
1 767 m³/s
17 jul 2021
Dagen boven 1 500 m³/s — synthetisch
14
drempel overschreden
Dagen boven 1 500 m³/s — gemeten inflow
2
drempel overschreden
Piek inflow Westervoort (model-randconditie)
Synthetisch: 2 200 m³/s  (8 900 × 25% — vuistregel + persbericht)
Gemeten RWS: 899 m³/s  (station westervoort.ijsselkop)
Gesimuleerd piekdebiet Kampen (model-uitvoer)
Synthetische run: 3 090 m³/s
Gemeten-inflow run: 1 767 m³/s

Leerpunten

Gemeten referentiedata (RWS Waterinfo)

Lobith piek (Rijn totaal)
6 687 m³/s
18 jul 2021 · station lobith.bovenrijn.tolkamer
Westervoort piek (IJssel)
899 m³/s
18 jul 2021 · station westervoort.ijsselkop
IJssel-aandeel werkelijk
13,4%
899 / 6 687 · vs. aangenomen 25%
API-bron
rws-waterinfo 1.0.1
ddapi20-waterwebservices.rijkswaterstaat.nl
Huidig debiet Kampen
m³/s · RWS + routing
Verwacht max 14 dagen
m³/s
Neerslag komende 14 d
mm totaal · Open-Meteo
Waakzaamheidsniveau
drempel: 1500 m³/s
Gemeten = RWS-meting Verwacht = model / Open-Meteo Grondwater = reservoirmodel assen apart: debiet (links, m³/s) · waterpeil (rechts, m+NAP) · grondwater (m)
Indicatieve verwachting — geen gekalibreerd model. Gebaseerd op statistisch recessiemodel toegepast op RWS Waterinfo debietsmeting (Westervoort) + neerslagimpulsrespons (Open-Meteo ERA5/IFS, 14 dagen). Marge neemt toe tot ±70% op dag 14. Gebruik RWS waterstandsberichten voor operationele beslissingen. Bron: RWS Waterinfo (meting) · Open-Meteo (neerslag) · cache 15 min.
🤖 AI-interventie · integraal · Claude (Anthropic) + BRO grondwater-koppeling
Interventie genereren…
🌊 Waterlab — Rijn & IJssel Leerplatform · gebiedsbeschrijving · zes proeven · technische achtergrond

0 · Leerplatform — wat dit laat zien

Waterlab is een persoonlijk leerplatform, geen operationeel systeem. De zes proeven zijn opgezet om drie concrete dingen te leren — en elke keuze (model, dataset, AI-aanpak) is gemaakt om iets te begrijpen, niet om een product te bouwen.

Doel 1 · Modellen
Hoe werken wflow SBM en Ribasim?
Proeven 4–6: wat doet ERA5-forcing, waar slaat calibratie aan? Proeven 2–3: hoe groot is ensemble-spread, hoe werkt netwerk­routing op ARM64?
Doel 2 · Vakgebied
Hoe werkt het Rijn–IJssel systeem?
Pannerdense Kop-verdeling, waterpeil-regimes, dijkbewaking, stakeholders (RWS, HHNK, Vitens) — domeinkennis die de kwaliteit van AI-interventies bepaalt.
Doel 3 · AI
Wat doet AI concreet?
Proef 1: expert-agent (Claude) op waterpeil-regime, niet op debiet. Proeven 2–3: Qwen2.5-32B lokaal voor ensemble-interpretatie en model-orkestratie.

1 · Hoe werkt het Rijn–IJssel systeem?

De IJssel is geen zelfstandige rivier maar een zijtak van de Rijn. Al het water in de IJssel komt via de Rijn uit de Alpen en het Middenrijngebied. Bij Lobith (bij Zevenaar) passeert de Rijn de grens. Verderop, bij de Pannerdense Kop, splitst de stroom zich op in drie richtingen.

Rijn
Lobith
100% · grens NL/DE
Splitsing
Pannerdense Kop
actief geregeld door RWS
~13% IJssel → Westervoort → Deventer → Kampen → IJsselmeer dit model
~22% Neder-Rijn → Lek → Rotterdam
~67% Waal → Nijmegen → Rotterdam

Als de Rijn hoog staat door smeltwater of extreme regenval in Duitsland stijgt ook de IJssel. Bij Kampen mondt de IJssel uit in het IJsselmeer. Als het water te hoog stijgt, moeten dijken het tegenhouden — of ze houden het niet meer.

2 · Wat zie je op de kaart?

De kaart toont het IJssel-stroomgebied van Westervoort (bij Arnhem) tot Kampen. Elke 3D-staaf is één rastercel van ~800 × 800 meter.

Blauw — normaal
< 40% van de piek
Reguliere waterafvoer
Oranje — verhoogd
40–70% van de piek
Boven-gemiddelde afvoer
Rood/Paars — extreem
> 70% van de piek
Hoogwater

🧪 Waterlab — negen proeven

Elke proef is een afgebakend experiment met één concrete leervraag. Hieronder per POC: wat het functioneel doet, hoe het technisch werkt, en wat een logische opvolging zou zijn. Klap onderaan elke kaart Herkomst — hoe komt dit tot stand open om elke stap af te pellen: databron → randvoorwaarde → modelstap → output → AI-duiding, met bron-endpoints en een eerlijke markering waar een stap niet fysisch is.

1

14-daagse verwachting & AI-interventie

Proef 1 · Verwachting + Claude expert-agent · integraal met grondwater
✓ live
Functioneel

Het dashboard toont een 14-daagse debietverwachting bij Kampen op basis van de actuele RWS Waterinfo-meting bij Lobith en de ECMWF-verwachting.

Een Claude-agent (Anthropic API) legt de verwachting uit als expert-hydroloog: niet "het debiet wordt X m³/s" maar "het peil nadert de waakdrempel — RWS en HHNK starten dan doorgaans Y protocol".

De meerwaarde: domeinkennis over stakeholders, peilregimes en de Pannerdense Kop-verdeling zit in de systeemprompt, niet in de modeloutput.

Integraal (nieuw): de interventie is cross-domein. Via de gekalibreerde IJssel→Veluwe-grondwaterkoppeling (Proef 9) vertaalt de agent de live peilverwachting óók naar drinkwaterwinning (Vitens), landbouw/beregening en natuur/kweldruk — niet alleen scheepvaart en peil.

Grondwater in de grafiek: de verwachtingsgrafiek toont nu naast debiet en peil ook de verwachte absolute grondwaterstand (Veluwe-flank, BRO) met onzekerheidsband, uit het reservoirmodel (Proef 9 / v2).

Technisch

Model: lineaire regressie op ERA5-historiek (recessiecoëfficiënt + impulsrespons). Geen fysisch gekalibreerd model — bewust simpel om de AI-interventie centraal te stellen.

Data: RWS Waterinfo live via REST (debiet Lobith), ECMWF open API (14-daagse neerslag), ERA5-Land (trainingsdata).

AI: claude-haiku-4-5 via Anthropic API. Systeemprompt bevat gebiedsschematisatie: Pannerdense Kop-verdeling (~13% IJssel), peilregimes (waak/alarm), stakeholders (RWS-dist. Oost-Nederland, HHNK, Vitens Oost).

Grondwater (Proef 9-koppeling): de prompt krijgt live de recente BRO-grondwaterstand + de gekalibreerde koppeling (lag ~18 d, r≈0.9) én de reservoirmodel-voorspelling (nowcast/forecast met NSE) mee; de grafiek toont die absolute voorspelling + band. Endpoints /api/forecast/intervention en /api/grondwater/reservoir.

Stack: Python/FastAPI backend, Plotly.js chart, server-sent events voor live update.

Opvolging
  • Vervang het statistische model door een wflow SBM nowcast met assimilatie van actuele RWS-metingen (Ensemble Kalman Filter).
  • Breid de AI-interventie uit met een tool-use patroon: de agent roept zelf de Waterinfo API aan om live peilmetingen op te vragen.
  • Koppel de verwachting aan de FEWS PI REST API (Proef 7) zodat het als externe databron in operationele systemen zichtbaar wordt.
  • Gedaan: grondwater-projectie + lineair reservoirmodel (absolute voorspelling met band). Volgende: een river-term in het reservoir (v2b) voor putten die neerslag-alleen niet verklaart.
  • Test met een kleiner lokaal model (bijv. Qwen2.5-7B) om te meten hoeveel domeinkennis verloren gaat bij downsizing.
Herkomst — hoe komt dit tot standdatabron → randvoorwaarde → model → output → duiding
1 Databron

RWS Waterinfo (debiet Lobith, live REST) · ECMWF / Open-Meteo (14-d neerslag) · ERA5-Land (training) · BRO GLD (grondwater).

2 Randvoorwaarde

Actuele Lobith-meting + Pannerdense Kop-verdeling (~13% naar de IJssel) als instroom-aanname.

3 Modelstap

Lineaire regressie (recessie + impulsrespons) + lineair reservoirmodel grondwater (v2/v2b). Niet fysisch gekalibreerd — bewust simpel.

4 Output

14-d debietverwachting Kampen, P10/mean/P90-band + absolute grondwaterstand met band. /api/forecast · /api/grondwater/reservoir

5 AI-duiding

claude-haiku-4-5 (Anthropic API), expert-hydroloog-systeemprompt. /api/forecast/intervention

2

Ensemble AI — neerslag scenario's

Proef 2 · wflow ×5 + Qwen2.5-32B interpretatie
✓ live
Functioneel

Vijf parallelle wflow SBM-runs simuleren het droogtescenario zomer 2018 met neerslagmultiplicatoren van ×0.70 tot ×1.30. De spread tussen de runs visualiseert hydrologische onzekerheid.

Een lokaal LLM interpreteert de ensemble-output: "De P10–P90 band is smal — de droogte wordt gedomineerd door de bovenstrooms Rijn-afvoer, niet door lokale neerslag."

Leervraag: kan een lokaal 32B-model bruikbare hydrologische interpretaties geven op edge hardware?

Technisch

Model: wflow SBM (Julia) met ERA5-Land forcing mei–aug 2018. Vijf runs met neerslags­caling: 0.70 / 0.85 / 1.00 / 1.15 / 1.30. Elke run: ~800×800m rastercellen, IJssel-bekken (~8.000 km²).

AI: Qwen2.5-32B lokaal via llama.cpp op Jetson AGX Orin (60W TDP). Geen cloud-latentie, maar ~45 s per interpretatie.

Output: P10, P25, P50, P75, P90 percentielband als tijdreeks. Plotly.js band-chart met shade-fill tussen P10 en P90.

Stack: Python orchestrator start Julia-subprocessen, verzamelt NetCDF-output, berekent percentielen.

Opvolging
  • Vervang vaste neerslagmultiplicatoren door ECMWF ensemble members (51 runs): echte meteorologische onzekerheid i.p.v. synthetische perturbaties.
  • Voeg een Ensemble Kalman Filter toe die de debietmeting bij Westervoort assimileert om de ensemble-spread te verkleinen.
  • Test of Qwen2.5-7B voldoende is voor de interpretatiestap: sneller, lager energieverbruik, meetbaar kwaliteitsverschil.
  • Publiceer de ensemble-output als PI REST timeseries (Proef 7) met statistiek als parameternaam (Q.sim.P50, Q.sim.P90).
Herkomst — hoe komt dit tot standdatabron → randvoorwaarde → model → output → duiding
1 Databron

ERA5-Land reanalyse (neerslag / temperatuur / verdamping), mei–aug 2018.

2 Randvoorwaarde

Neerslagscaling ×0.70–×1.30. Synthetische perturbatie — geen echte meteorologische onzekerheid.

3 Modelstap

wflow SBM ×5 (Julia), ~800×800 m raster, IJssel-bekken ~8.000 km².

4 Output

P10/P25/P50/P75/P90 percentielband (NetCDF → tijdreeks). /api/ensemble

5 AI-duiding

Qwen2.5-32B lokaal (llama.cpp, Jetson AGX Orin) — ~45 s per interpretatie.

📐 Schematisatie, netwerk & instroom-randvoorwaarde per run: docs/WL-PROV-2_schematisatie.md ↗ (WL-PROV-2)
3

Multimodel pipeline — Ribasim + LLM + wflow

Proef 3 · AI-gestuurde modelketen op ARM64
✓ live
Functioneel

Een drietrapspipeline koppelt hydraulische netwerk­routering, LLM-orkestratie en hydrologische detailsimulatie in één run:

Stap 1 — Ribasim: simuleert het Rijn/IJssel-netwerk (Pannerdense Kop, drie aftakkingen) en berekent waterdeficiet per tak.

Stap 2 — LLM: de orchestrator analyseert de Ribasim-output en identificeert de kritieke knoop (grootste waterdeficiet).

Stap 3 — wflow ×5: voert vijf droogte­scenario's uit voor het geïdentificeerde deelbekken.

Technisch

Ribasim: de officiële Linux-binary is x86-64 only. Op ARM64 Jetson: Python 3.13 bouwt het model (.gpkg + toml), Julia-solver draait de simulatie via het Ribasim.jl package. Geen binary nodig.

LLM orchestrator: Qwen2.5-32B via llama.cpp. Input: Ribasim waterbalans als JSON. Output: knoop-ID + motivatie. Geen function-calling — plain text parsing met regex fallback.

wflow: zelfde setup als Proef 2, maar alleen voor het geselecteerde deelbekken. Vijf perturbatie­scenario's parallel als Julia-subprocessen.

Data: wflow_moselle dient als referentie-run voor de Moselle-tak (Roer/Maas systeem).

Opvolging
  • Vervang plain text parsing door structured output / function calling: betrouwbaardere knoop-identificatie zonder regex-kwetsbaarheid.
  • Voeg een tweede LLM-stap toe die de wflow-resultaten samenvat en een beleidsadvies formuleert (twee-agent patroon).
  • Draai Ribasim met actuele RWS-verdeling (dagelijkse Pannerdense Kop-setting) i.p.v. climatologisch gemiddelde.
  • Publiceer de pipeline als REST-endpoint: POST trigger → async job → PI REST output. Koppelbaar aan FEWS als externe model-as-a-service.
Herkomst — hoe komt dit tot standdatabron → randvoorwaarde → model → output → duiding
1 Databron

Ribasim-netwerkschematisatie (Rijn/IJssel, Pannerdense Kop, 3 takken) + ERA5-Land voor de wflow-stap.

2 Randvoorwaarde

Climatologisch gemiddelde Pannerdense Kop-verdeling als netwerk-instelling.

3 Modelstap

Ribasim (Julia-solver, ARM64, géén x86-binary) → LLM kiest kritieke knoop → wflow SBM ×5 op het deelbekken.

4 Output

Kritieke knoop-ID + droogtescenario's voor het geselecteerde deelbekken. /api/multimodel

5 AI-duiding

Qwen2.5-32B orchestrator (plain-text parsing + regex-fallback, geen function-calling).

📐 Schematisatie, netwerk & instroom-randvoorwaarde per run: docs/WL-PROV-2_schematisatie.md ↗ (WL-PROV-2)
4

Hoogwater — januari 1995

Proef 4 · Historische simulatie · 6.687 m³/s Lobith
✓ live
Functioneel

Simulatie van de zwaarste Rijnvloed in decennia: januari 1995 bereikte Lobith 12.600 m³/s; 250.000 mensen werden preventief geëvacueerd. Het model simuleert 90 dagen (nov 1994–feb 1995).

De 3D-kaart toont dag voor dag hoe de hoogwater­golf door het IJssel-bekken trekt: instroom Westervoort → piekafvoer Kampen → uitzakken. De tijdreeks vergelijkt gesimuleerd debiet met de drempelwaarden voor waak en alarm.

Leervraag: reproduceert wflow SBM de grootteorde en timing van een extreme hoogwatergolf op ERA5-forcing zonder kalibratie?

Technisch

Model: wflow SBM (kinematische golfrouting), ~800×800m raster, IJssel-bekken ~8.000 km². Cold start — geen spin-up voorafgaand aan de event­periode.

Forcing: ERA5-Land reanalyse (neerslag, temperatuur, verdamping). Tijdstap: 1 dag. Dekking: nov 1994 t/m feb 1995 (90 tijdstappen).

Instroom: bovenstroomse randconditie bij Westervoort — gesynthetiseerd uit het RIZA/RWS-archief (piek ~3 120 m³/s; RWS Waterinfo heeft geen data vóór ~2000), niet uit ERA5. Naast de cold start de voornaamste onzekerheid. Zie docs/WL-PROV-2_schematisatie.md ↗.

Output: NetCDF → GeoJSON per dag (riviercellen + debiet). MapLibre GL JS rendert de 3D-extrusie met Plotly.js tijdreeks naast de kaart.

Opvolging
  • Voeg RWS historische metingen toe als bovenstrooms randconditie (Lobith-debiet 1994–1995 is beschikbaar via Waterinfo-archief). Verwachting: betere piekamplitude.
  • Vergelijk met SOBEK 1D-simulatie van dezelfde periode om de beperking van kinematische golf­routing zichtbaar te maken (geen inundatiemodellering).
  • Voeg een AI-narratief toe (zoals Proef 1): wat betekent deze golf voor evacuatie­beslissingen, dijkbewaking, scheepvaartblokkade?
  • Kalibreer de Manning-ruwheid op de 1995-meting en gebruik die parameters voor Proef 5 en 6.
Herkomst — hoe komt dit tot standdatabron → randvoorwaarde → model → output → duiding
1 Databron

ERA5-Land reanalyse, nov 1994 – feb 1995 (90 dagstappen).

2 Randvoorwaarde

Instroom bij Westervoort gesynthetiseerd uit het RIZA/RWS-archief (piek ~3 120 m³/s) — geen RWS-data vóór ~2000. Meteo-forcing uit ERA5-Land.

3 Modelstap

wflow SBM, kinematische golfrouting, ~800 m raster. Cold start — geen spin-up vóór de event-periode.

4 Output

NetCDF → GeoJSON per dag (riviercellen + debiet Kampen) voor de 3D-kaart. /fews … period=1995

5 AI-duiding

Geen — historische simulatie zonder AI-stap.

📐 Schematisatie, netwerk & instroom-randvoorwaarde per run: docs/WL-PROV-2_schematisatie.md ↗ (WL-PROV-2)
5

Droogte — zomer 2018

Proef 5 · Historische simulatie · ~600 m³/s Lobith
✓ live
Functioneel

De ernstigste droogte in Nederland in decennia: zomer 2018 zakte de Rijn bij Lobith naar ~600 m³/s — 70% onder het langjarig gemiddelde. De 3D-kaart toont de IJssel in extreme laagte­stand.

Het model simuleert 4 maanden (mei–aug 2018). De tijdreeks toont het sluipende karakter van de droogte: geen dramatische piek maar een langzame daling, wekenlang onder de grens voor scheepvaartbeperkingen (~700 m³/s Lobith).

Leervraag: hoe snel signaleert wflow SBM een droogte-aanvang, en waar in het bekken worden de eerste effecten zichtbaar?

Technisch

Model: zelfde setup als Proef 4 (wflow SBM, ~800m raster). Periode: 1 mei–31 aug 2018 (123 tijdstappen).

Forcing: ERA5-Land reanalyse mei–aug 2018. Droogte-signaal zit in de neerslagdeficieten: ERA5 reproduceert de periode nauwkeurig (RMSE neerslag <1 mm/dag t.o.v. KNMI-stations).

Beperking: wflow SBM is een regen-afvoermodel. Grondwater­onttrekkingen (landbouw, Vitens) en laagwater-regulering via stuwen zitten niet in het model — daardoor overschatting van het debiet bij extreme droogte.

Ensemble-link: Proef 2 gebruikt dezelfde forcingperiode voor de ensemble-varianten (×0.70–×1.30).

Opvolging
  • Voeg grondwateronttrekking toe als negatieve flux in het wflow SBM-schema (Vitens pompcapaciteit Oost-Nederland is publiek beschikbaar).
  • Gebruik de 2018-droogte als testcase voor het KNMI'23 klimaatscenario: wat verwachten we voor een vergelijkbare periode in 2050 onder WH-scenario?
  • Koppel aan een scheepvaartmodel: welke drempeldiepte bij welke locatie, en hoeveel dagen per jaar onder die drempel bij toekomstige klimaatscenario's?
  • Vergelijk de ERA5-forcing met KNMI gridded daily om de betrouwbaarheid van ERA5 voor droogte-signalering te kwantificeren.
Herkomst — hoe komt dit tot standdatabron → randvoorwaarde → model → output → duiding
1 Databron

ERA5-Land reanalyse, mei–aug 2018 (123 dagstappen). Neerslagdeficiet gevalideerd vs KNMI-stations (RMSE <1 mm/dag).

2 Randvoorwaarde

ERA5-forcing. Géén grondwateronttrekking (landbouw/Vitens) of stuwregulering → overschatting bij extreme droogte.

3 Modelstap

wflow SBM ~800 m raster (zelfde setup als Proef 4). Regen-afvoermodel.

4 Output

Debiet Kampen (sluipend laagwaterverloop). /fews … period=2018

5 AI-duiding

Geen — historische simulatie.

📐 Schematisatie, netwerk & instroom-randvoorwaarde per run: docs/WL-PROV-2_schematisatie.md ↗ (WL-PROV-2)
6

Hoogwater — juli 2021

Proef 6 · Validatie met RWS meetreeks · Eifel/Ardennen
✓ live
Functioneel

Extreme buien boven Eifel en Ardennen veroorzaakten in 48 uur catastrofale overstromingen langs Ahr, Roer en Maas. Nederland was minder zwaar getroffen dan Duitsland, maar de IJssel steeg snel.

Dit is de enige proef met een expliciete validatie: de bovenstrooms randconditie bij Westervoort is de gemeten RWS-inflow (niet ERA5). De gesimuleerde en gemeten afvoer bij Kampen zijn daardoor vergelijkbaar.

Leervraag: wat is het verschil in piekafvoer en timing tussen ERA5-gedreven en meting-gedreven simulatie bij een snel-opkomend hoogwater?

Technisch

Model: wflow SBM, periode jun–aug 2021 (92 tijdstappen). Twee runs: (a) ERA5-forcing, (b) gemeten RWS-inflow bij Westervoort als bovenstrooms randconditie.

Validatie: RWS Waterinfo-debiet bij Kampen (daggemiddelde). Nash-Sutcliffe coëfficiënt voor run (b) is merkbaar hoger dan voor run (a) — de Eifel-piek wordt door ERA5 onderschat (te brede, te lage regenband).

Opmerking: de Maas-overstroming en Ahr-vallei catastrofe zijn buiten het IJssel-model. Wflow beslaat alleen het IJssel-bekken; de Roer-bijdrage loopt via de Maas, niet via de IJssel.

Data: RWS Waterinfo REST API voor zowel Lobith als Kampen (debiet + waterpeil).

Opvolging
  • Breid de validatie uit met een Nash-Sutcliffe score-visualisatie in het dashboard: hoeveel beter is gemeten inflow t.o.v. ERA5 per event?
  • Combineer Proef 6 met Proef 1: gebruik de AI-expert om het verschil tussen ERA5-run en meetreeks-run te duiden (wanneer is ERA5 betrouwbaar genoeg voor operationeel gebruik?).
  • Modelleer ook het Maas-bekken (wflow_moselle is al aanwezig als referentie) en koppel de twee bekkens via Ribasim-netwerknodes.
  • Voeg een dijkdoorbraakmodule toe (SOBEK of D-FLOW FM 2D) voor het scenario "wat als de Ijsseldijk het niet houdt?".
Herkomst — hoe komt dit tot standdatabron → randvoorwaarde → model → output → duiding
1 Databron

RWS Waterinfo: gemeten inflow Westervoort + validatie-debiet Kampen (daggemiddeld). ERA5-Land voor run (a).

2 Randvoorwaarde

Beide op ERA5-Land-forcing; verschil = instroom Westervoort: (a) gesynthetiseerd (RWS-berichten, ~2 200 m³/s), (b) gemeten RWS-debiet.

3 Modelstap

wflow SBM, jun–aug 2021 (92 dagstappen). Alleen IJssel-bekken (Maas/Roer buiten het model).

4 Output

Debiet Kampen + Nash-Sutcliffe vs gemeten — run (b) merkbaar hoger dan run (a). /fews … period=2021

5 AI-duiding

Geen — validatie-experiment zonder AI-stap.

📐 Schematisatie, netwerk & instroom-randvoorwaarde per run: docs/WL-PROV-2_schematisatie.md ↗ (WL-PROV-2)
7

FEWS PI REST — Waterlab als service

Proef 7 · FastAPI · Deltares PI JSON v1.25 · vier endpoints
✓ live
Functioneel

Waterlab publiceert wflow-tijdreeksen en RWS Waterinfo-metingen via een FEWS-compatibele PI REST API. Elke FEWS-instantie bij RWS of een waterschap kan Waterlab als externe databron aanroepen — zonder aanpassing aan FEWS.

De vier standaard-endpoints zijn live op localhost:8000/fews/rest/fewspiservice/v1/:

  • filters — beschikbare datafilters
  • locations — Kampen en Westervoort (coördinaten, metadata)
  • parameters — Q.sim, Q.meting, H.meting
  • timeseries — PI JSON met header + events[] per dag
Technisch

Implementatie: 5 Python-bestanden (~200 regels), FastAPI router gemount op het hoofd-dashboard. Conform Deltares PI REST spec v1.25 (publiek beschikbaar).

Niet-standaard extensie: de period-parameter selecteert een historische wflow-simulatie (1995 / 2018 / 2021). Standaard PI REST heeft geen historisch-event-concept — dit is bewust toegevoegd als leerfunctie.

Data-adapter: pi_client.py haalt live RWS Waterinfo-data op en vertaalt die naar PI JSON-formaat. data_adapter.py leest wflow NetCDF-output en converteert naar PI timeseries.

Beperking: read-only, geen authenticatie, geen schrijf-operaties. Geen WebSocket push — polling per request.

Opvolging
  • Voeg OAuth2 authenticatie toe conform de FEWS PI REST beveiligings-extensie, zodat de service ook buiten localhost bruikbaar is.
  • Implementeer de POST /timeseries endpoint voor het wegschrijven van modelresultaten naar een FEWS-database (bi-directionele koppeling).
  • Voeg WebSocket push-notificaties toe: FEWS abonneert zich op nieuwe wflow-runs en krijgt een melding zodra verse tijdreeksen beschikbaar zijn.
  • Publiceer de service via Cloudflare Tunnel (zonder port-forwarding) zodat externe FEWS-testen in het netwerk van RWS of een waterschap mogelijk worden.
  • Genereer een OpenAPI-spec die exact overlapt met de Deltares PI REST YAML — zodat Swagger-clients automatisch kunnen verbinden.
Herkomst — hoe komt dit tot standdwarse interop-laag — geen eigen modelrun
1 Databron

wflow NetCDF-output (historische runs op schijf) + RWS Waterinfo live.

2 Schematisatie

n.v.t. — interoplaag, geen eigen modelrun of randvoorwaarde.

3 Adapter

data_adapter.py (wflow NetCDF) + pi_client.py (RWS) → PI JSON v1.25, FastAPI-router.

4 Output

filters · locations · parameters · timeseries op /fews/rest/fewspiservice/v1/ (Deltares PI REST 1.25).

5 AI-duiding

Geen — read-only databron-service.

8

GraphQL-façade — één query-laag over het domein

Proef 8 · WL-GQL-1 · Strawberry · read-only gateway op /graphql
✓ live
Functioneel

Eén "verhaal" over een station — bijvoorbeeld Kampen tijdens juli 2021 — combineert nu stationmetadata, drempelregimes, gemeten RWS-debiet, gesimuleerd wflow-debiet én de 14-daagse verwachting met AI-interventie. Voorheen moest een consument die uit losse REST-calls zelf aan elkaar knopen.

Met de GraphQL-gateway haalt één query precies de gevraagde velden op, en wordt het schema de domeingraaf: station → thresholds / measured / simulated / forecast.

Bewijst de platformvisie: API-first, headless, elke consumer (dashboard, FEWS, app, webhook) is een verwisselbare client.

Technisch

Stack: strawberry-graphql[fastapi] gemount via GraphQLRouter op de bestaande uvicorn-app (/graphql, GraphiQL aan). Read-only, geen mutations/subscriptions, geen auth (PoC, LAN/Tailscale).

Geen tweede datapad: de resolvers delegeren naar bestaande bronfuncties — build_forecast(), get_waterinfo_timeseries(), get_wflow_timeseries() en _build_intervention(). Geen gedupliceerde datalogica.

Voorbeeld-velden: measured = live RWS, simulated = wflow-output (peak 1627 m³/s op 2021-07-17), forecast.band = P10/mean/P90, forecast.intervention = Claude-duiding met graceful fallback.

Bestand: dashboard/graphql_api.py (~1 module, thin resolvers).

Opvolging
  • Voeg de node station → nearbyGroundwaterWells toe (WL-GQL-2) zodra de BRO-connector (Proef 9) bestaat — dit koppelt de platform-laag aan de nieuwe databron.
  • Introduceer auth + rate-limiting (persisted queries) voordat de gateway publiek wordt.
  • Overweeg subscriptions voor de live 14-daagse verwachting i.p.v. polling.
  • Houd zware tijdreeksen bewust op PI REST/JSON (HTTP-caching) — GraphQL voor de domeingraaf, niet voor bulk.
Herkomst — hoe komt dit tot standdwarse query-laag — delegeert, geen tweede datapad
1 Bronfuncties

Delegeert naar bestaande bronnen: build_forecast(), get_waterinfo_timeseries(), get_wflow_timeseries(), _build_intervention().

2 Datapad

Geen tweede datapad — thin resolvers, geen gedupliceerde datalogica.

3 Resolverlaag

strawberry-graphql[fastapi] read-only gateway op /graphql (GraphiQL aan).

4 Output

Domeingraaf station → thresholds / measured / simulated / forecast; één query haalt precies de gevraagde velden.

5 AI-duiding

forecast.intervention = Claude-duiding via de gedelegeerde functie (graceful fallback).

9

BRO grondwater-koppeling — IJssel ↔ Veluwe

Proef 9 · BRO GLD + PDOK OGC · grondwater↔IJssel · lag-correlatie + voorspelling + AI
✓ live
Functioneel

Koppelt echte gemeten grondwaterstanden (BRO) langs de oostflank van de Veluwe aan het IJssel-peil bij Kampen. Toetst de hypothese kwelzone-omkering bij laagwater data-gedreven op het droogte-event zomer 2018 — zonder eerst een MODFLOW/iMOD-model te bouwen.

De analyse berekent de lag-correlatie (rivierpeil → grondwaterrespons, dagen–weken vertraging) en laat Qwen2.5-32B lokaal een hydrologische duiding genereren.

Vooruitblik + voorspelling: de tab projecteert de live IJssel-verwachting naar de verwachte grondwaterrespons, en een lineair reservoirmodel voorspelt de absolute grondwaterstand per put met onzekerheidsband — dat overbrugt de BRO-meetlatentie van maanden (nowcast → forecast).

Maakt de bestaande conceptuele backlog-POC "iMOD · Veluwe grondwater" voor het eerst uitvoerbaar met data.

Technisch

Discovery + bridge: PDOK OGC API Features bro-gminsamenhang-karakteristieken, collectie gm_gld met bbox → per put: BRO-ID, locatie, GMW-koppeling, aantal observaties, datumbereik én CSV-reeks-URL. Eén call lost discovery + GMW↔GLD-koppeling op.

Reeksen: broservices GET /gm/gld/v1/seriesAsCsv/{broId}?asISO8601=true (CSV, m-waarden). Server-side requests (CORS-restrictie omzeild), 15-min cache.

Feasibility bevestigd (WL-BRO-0): bbox Veluwe-oostflank ↔ IJssel = 997 GMW-putten, 313 GLD's met zomer-2018 data. 5 kandidaatputten gecureerd.

AI: Qwen2.5-32B lokaal — zelfde patroon als de ensemble-interpretatie, met graceful fallback.

Voorspelling (v2 + v2b): lineair reservoir met twee termen — recharge (Open-Meteo neerslag−ET0) én de IJssel-stand (RWS WATHTE Kampen): GW = base + k_r·Σ recharge·e^(−i/τr) + k_q·Σ rivier·e^(−i/τq). Per put gekalibreerd op de BRO-historie (2D-grid τ + regressie); nowcast laatste-meting→vandaag + forecast +14 d, bias-correctie + NSE + band; graceful fallback naar recharge-only. Endpoints /api/grondwater/projection, /api/grondwater/reservoir. Zie docs/grondwater_voorspelling_voorstel.md.

Opvolging
  • Gedaan: connector bro_gld + overlay, lag-correlatie, projectie, reservoirmodel v2 (recharge) + v2b (river-term, RWS-stand) en GraphQL-koppeling nearbyGroundwaterWells (Proef 8). De river-term verbetert alle putten; GLD…8262 blijft moeilijk (NSE 0.22, band ±1 m).
  • Vervang de data-gedreven toets door een fysisch iMOD/MODFLOW 6-kwelmodel.
  • Breid uit naar meerdere droogte-events (2018, 2022) om de respons te valideren.
Herkomst — hoe komt dit tot standdatabron → randvoorwaarde → model → output → duiding
1 Databron

BRO GLD via PDOK OGC (gm_gld, bbox) + broservices seriesAsCsv · Open-Meteo (neerslag/ET0) · RWS WATHTE Kampen. Server-side, gecached.

2 Randvoorwaarde

Recharge (neerslag−ET0) + IJssel-stand (RWS WATHTE Kampen) als river-term; per put een eigen lag/τ, gekalibreerd op zomer 2018.

3 Modelstap

Lag-correlatie + lineair reservoir (v2 recharge, v2b + river-term). Data-gedreven — géén fysisch kwelmodel (geen MODFLOW/iMOD).

4 Output

Absolute grondwaterstand per put + NSE + onzekerheidsband. /api/grondwater/projection · /api/grondwater/reservoir

5 AI-duiding

Qwen2.5-32B lokaal (llama.cpp, Jetson) — hydrologische duiding, graceful fallback.

🤖
Ensemble nog niet uitgevoerd
Voer de ensemble simulatie uit om resultaten te zien:

python run_ensemble.py

De vijf scenario's (neerslag ×0.70 t/m ×1.30) worden sequentieel gesimuleerd en de resultaten worden hier automatisch zichtbaar.

🎯 Validatie — gesimuleerd vs. gemeten (WL-VAL-1)

Hoe goed is het model écht? Per netwerkpunt leggen we simulatie en meting naast elkaar met een objectieve skill-score (NSE, KGE, Pearson r, bias). Eerlijk principe: een score alleen waar een onafhankelijke meting bestaat — de rest staat met reden in de matrix onderaan, geen verzonnen getallen. De scores zijn ook een API-veld: /api/validation.

Hindcast — hoe goed deden we? (WL-VAL-2)

Terugblik: voor elke dag in het venster reconstrueren we de toen uitgegeven Westervoort-verwachting (de recessie die de live verwachting gebruikt) en leggen die over de gerealiseerde RWS-meting — "leg de groene over de blauwe, wat was de fout?" Zo zie je de fout per lead-time (dag 1–14) en of de onzekerheidsband klopt. Realisatie = RWS Westervoort: dezelfde bron als hierboven, geen tweede waarheid.

Niet (zelfstandig) te valideren — en waarom

Punt / runStatusReden

Skill-metrieken: dashboard/validation.py (getest, tests/test_validation.py). NSE/KGE: 1 = perfect, 0 = niet beter dan het gemiddelde, <0 = slechter. Bij waterpeil staat de simulatie op een ander referentievlak → alleen de dynamiek (geanomaliseerd) wordt getoetst, met het datum-offset apart.

🛰 Data-assimilatie — de verwachting bijsturen met de meting (POC E)

De hindcast liet zien dat de Westervoort-verwachting systematisch overschat. Hier assimileren we de recente RWS-meting via een ensemble-Kalman-update (Ensemble Smoother, EnKF-familie) op de recessieparameters (recessiesnelheid τ + seizoensdoel), en corrigeren zo de verwachting. Onder de live-grafiek staat het bewijs: de fout per horizon vrij vs geassimileerd, gedraaid via dezelfde hindcast-machinerie. Getoetst bij Westervoort — dezelfde meetbron als de validatie, geen tweede datapad.

💡 In gewone taal — wat betekent dit?

Het model schat hoe de rivierafvoer de komende twee weken langzaam wegzakt nadat de regen is gevallen. Maar het bleek dat het model dat steevast te hoog inschat — het denkt dat het water trager wegloopt dan in werkelijkheid.

Data-assimilatie lost dat op: we laten het model eerst de metingen van de afgelopen ~10 dagen bekijken en zijn aannames daarop bijstellen, vóórdat het vooruit voorspelt. Vergelijk het met een hardloper die zijn eindtijd bijstelt op basis van hoe snel hij de eerste kilometers écht liep — in plaats van vast te houden aan de gok vooraf.

In de grafiek hieronder: de groene lijn is wat er echt gemeten is, de rode stippellijn is de oude (ongecorrigeerde) verwachting die te hoog zit, en de blauwgroene lijn is de bijgestuurde verwachting — dichter bij de werkelijkheid. De schaduw eromheen is de eerlijke onzekerheid.

Onderaan staat het bewijs: als je dit voor elke dag in het verleden nadoet, is de fout van de bijgestuurde verwachting op elke voorspeldag kleiner. Kortom: door de meting mee te nemen wordt de verwachting betrouwbaarder — en het blijft eerlijk over hoe zeker het is.

gemeten (werkelijkheid) oude verwachting bijgestuurde verwachting

📽 Uitleg in 26 seconden

Geanimeerd uit de live assimilatie-data; opnieuw te genereren met tools/make_assim_video.py.

🧮 De wiskunde — stap voor stap (3½ min · TU-niveau)

Van de recessie-ODE via het ensemble-Kalman-filter tot de RMSE-toets — formules met MathJax, voorkennis 1e jaar TU. Deck: tools/math_slides.html, render: tools/make_math_video.py.

🎛 Speeltuin — draai het model zelf, live

Dit draait exact het model uit de video — zie tools/enkf_from_scratch.py ↗, een ~50-regels-versie recht uit de formules die de productie-code tot machineprecisie reproduceert. Sleep aan de knoppen en zie het effect op de verwachting en de fout.

Laden…

RMSE = snelle schatting over de laatste ~24 uitgifte-dagen (voor responsiviteit). Meetfout klein ⇒ grotere gain ⇒ sterkere correctie — precies de 1-D-intuïtie uit de video.

💬 Vraag het — uitleg-assistent (WL-CHAT-1)

Stel een vraag over Waterlab: de inrichting, de proeven, de herkomst van de data of de skill van de modellen. De assistent (Claude Haiku) antwoordt uitsluitend op basis van de eigen herkomst- en uitleg-bronnen (WL-PROV/GOV + handleiding) — staat het er niet in, dan zegt hij dat eerlijk. Achter login en met een budget per sessie i.v.m. tokenkosten.

Toegang vereist een wachtwoord (tokenkosten-beheersing).

📖 Handleiding — Waterlab

Waterlab is een persoonlijk leerplatform rond hydrologische modellering en AI, draaiend op een NVIDIA Jetson AGX Orin. Drie leerdoelen: modellen leren (wflow, Ribasim), het vakgebied verkennen (IJssel–Rijn, droogte/hoogwater) en AI testen (Claude + lokale Qwen). Deze pagina legt uit hoe je het dashboard en de API's gebruikt.

1 · Navigatie — de tabbladen

TabWat je ziet
WaterlabIntroductie en de drie leerdoelen.
Rijn & IJsselUitleg van het stroomgebied: Pannerdense Kop, het traject Westervoort → Kampen, en de kaart.
POC'sDe negen proeven, elk langs drie lijnen: functioneel · technisch · opvolging + een uitklapbare herkomst-keten (databron → … → AI-duiding).
VerwachtingLive 14-daagse IJssel-verwachting + de integrale AI-interventie (incl. grondwater-koppeling).
Ensemble AI · Multimodelwflow-ensemble (5 neerslagscenario's) en de Ribasim→LLM→wflow pipeline.
Jan 1995 · Zomer 2018 · Jul 2021Historische wflow-simulaties (hoogwater/droogte-events).
GrondwaterProef 9: gemeten grondwater (BRO) vs IJssel-peil + lag-correlatie + AI-duiding.
ValidatieGesimuleerd vs gemeten per punt met skill-score (NSE/KGE/r/bias) + eerlijke "niet te valideren"-matrix. API: /api/validation.
Vraag hetUitleg-chatbot (Claude Haiku), gegrond in de eigen herkomst-/uitleg-bronnen — geen vrije generatie. Achter login + budget per sessie.
FEWSWaterlab als FEWS PI REST-service (API-explorer).
Platform Visie · Roadmap · InfoArchitectuurvisie, backlog en analyse-achtergrond.

2 · De API's (platform-laag)

Waterlab is API-first: elke consumer (dashboard, FEWS, app) is een verwisselbare client. Er zijn drie ingangen.

FEWS PI REST 1.25
Deltares-compatibele tijdreeksen-API. Basis: /fews/rest/fewspiservice/v1/
Endpoints: filters, locations, parameters, timeseries.
GraphQL-façade
Eén query-laag over de domeingraaf. Verken interactief in GraphiQL.
REST data-endpoints
/api/forecast · /api/grondwater · /api/ensemble · /api/multimodel — JSON voor de dashboardpanelen.

GraphQL voorbeeld — één query haalt stationmetadata, de live verwachting én de nabije grondwaterputten op:

{
  station(id: "kampen") {
    name
    forecast(days: 14) {
      band { date p10 mean p90 }
      intervention { regime text source }
    }
    nearbyGroundwaterWells(radiusKm: 20, limit: 3) {
      broId  distanceKm  nObs
      series(period: "2018-06-01/2018-08-31") { events { date value } }
    }
  }
}

PI REST voorbeeld (vanaf de commandline):

curl "http://<host>:8000/fews/rest/fewspiservice/v1/timeseries?locationIds=KAMPEN&parameterIds=Q.sim&period=2021"

Limieten op GraphQL: read-only (geen mutations); query-diepte max 10, max 2000 tokens, max 15 aliassen per query; en max 60 verzoeken per minuut per IP (HTTP 429 bij overschrijding). Zware bulk-tijdreeksen blijven bewust op PI REST/JSON (HTTP-caching).

3 · Databronnen

BronGebruik
RWS WaterinfoLive debiet (Westervoort/Lobith) en waterpeil (Kampen) — voor de verwachting.
Open-Meteo / ECMWF14-daagse neerslagverwachting IJssel-stroomgebied.
wflow SBM (Julia)Hydrologische simulaties (historische events + ensemble), output op schijf.
BRO GLD + PDOK OGCGemeten grondwaterstanden + putlocaties (Proef 9). Server-side opgehaald, gecached.
ERA5-LandHistorische forcing/training voor de modellen.

4 · AI-componenten

Claude (Anthropic API)
De expert-interventie bij de live verwachting — integraal: peil/scheepvaart én grondwaterafhankelijke domeinen (drinkwater, landbouw, natuur/kwel).
Qwen2.5-32B (lokaal)
Draait op de Jetson via llama.cpp. Interpreteert het ensemble en de grondwater↔IJssel-koppeling — geen cloud, ~30–60 s per duiding.

5 · Beperkingen

Waterlab is een leer-/PoC-omgeving, geen operationeel systeem. De verwachting is indicatief (statistisch model, geen gekalibreerde nowcast). BRO-grondwaterdata heeft maanden latentie; de IJssel→grondwater-koppeling is gekalibreerd op één droogte-event (2018) en data-gedreven, niet fysisch (geen MODFLOW/iMOD). Voor operationele beslissingen: waterinfo.rws.nl.

Waterlab
Leren met AI
hydrologische modellering & AI-integratie_
⚗ Micro-innovatielab  ·  1 persoon  ·  experimenteel

Waterlab

Persoonlijk leer- en experimenteerplatform voor hydrologische modellering en AI-integratie in waterbeheer. Één persoon, één edge computer (NVIDIA Jetson AGX Orin), open data en open-source modellen — om te begrijpen wat er mogelijk is.

Doel 1 · Modellen
Leren van modellen
wflow SBM, Ribasim, ensemble-methoden, data-assimilatie — hoe werken ze, wat geven ze, waar zitten de grenzen?
Doel 2 · Vakgebied
Vakgebied verkennen
RWS-processen, waterschappen, het Deltares-ecosysteem en FEWS — hoe ziet het huidige kennisinstrumentarium eruit?
Doel 3 · AI
AI-innovaties testen
LLM-orkestratie, expert-agents, tool use en real-time integratie — wat voegt AI concreet toe aan hydrologische analyse?

Achterliggende vraag: hoe zou een modern kennisinstrumentarium voor waterbeheer eruitzien als je het vandaag opnieuw ontwerpt — API-first, AI-ondersteund, zonder legacy GUI-afhankelijkheden? De uitkomsten zijn indicatief. Dit is geen operationeel systeem.

wflow SBMRibasimJuliaERA5-Land Claude APIQwen2.5-32BFastAPIMapLibre GLARM64 Jetson
De redeneerlijn · waarde eerst
Van waardestroom naar bewijs

Kies een waardestroom. Je ziet welke informatiefuncties ze raakt — innemen, schematiseren, rekenen, duiden, samenstellen, ontsluiten, valideren — en komt dan bij de proef die het aantoont. De negen proeven blijven eronder staan als techniek; hier staat de waarde voorop.

Waardestroom innemenschemati­serenrekenenduidensamen­stellenontsluitenvalideren
W1Verwachting Proef 1 · live 14-daagse + AI bekijk →herkomstskill
W2Historisch & ensemble Proef 2 · 4 · 5 · 6 · wflow SBM bekijk →herkomstskill
W4Multimodel Proef 3 · Ribasim → AI → wflow bekijk →herkomst
W5Grondwater & validatie Proef 9 · BRO + reservoir bekijk →herkomstskill
Dwars · platform / interop FEWS PI REST en GraphQL zijn géén waardestroom maar een dwarse ontsluitingslaag: dezelfde data, elke client (dashboard, FEWS, app) is verwisselbaar — geen tweede datapad.

● = de waardestroom raakt deze informatiefunctie. De schil is een client op dezelfde API's; de proeven, FEWS en GraphQL blijven onveranderd bereikbaar via de tabs hierboven.

✓ Wat Waterlab wél is
  • Redeneerlijn end-to-end op generieke bouwstenen — open data → open-source modellen → AI-duiding, op één edge-computer.
  • AI als eerste klas op de rekenketen — duidende laag op model- en meetoutput, geen losse chatbot.
  • Standaard-interop zonder tweede datapad — dezelfde data via PI REST (Deltares 1.25) én GraphQL; elke client is verwisselbaar.
✗ Wat Waterlab niet is
  • Geen MKS-Goud / PIN-norm — geen operationele status, geen 24/7-keten.
  • 1 persoon, experimenteel — een micro-innovatielab, geen dienst.
  • Deels statistisch i.p.v. fysisch — de verwachting rust op een statistisch model, geen gekalibreerde nowcast.
  • Data-gedreven grondwater — lag-correlatie + reservoir op één event (2018), geen MODFLOW/iMOD-kwelmodel.

Positionering: het innovatie-/leersegment van de waardeketenring, niet de operationele keten. Uitkomsten zijn indicatief — voor operationele beslissingen: waterinfo.rws.nl. · volledige wél/niet-tekst ↗

nu Open-Meteo + RWS Waterinfo
Proef 1 · Live verwachting
14-daagse verwachting
Actuele waterpeil- en debietsverwachting bij Kampen op basis van Open-Meteo weersvoorspelling en RWS Waterinfo meetdata. Claude (Anthropic) stelt een concrete interventie voor.
×1.30 ×1.15 ×1.00 ×0.85 ×0.70 AI
Proef 2 · Ensemble + AI interpretatie
Ensemble AI — neerslag scenario's
Vijf neerslag-scenario's (×0.70–×1.30 multiplier) draaien parallel in wflow SBM. Qwen2.5-32B (lokale LLM) interpreteert de spread en geeft een hydrologisch advies.
Ribasim netwerk LLM orchestrator wflow ×5 scenario wflow ERA5 2018 wflow analyse
Proef 3 · AI-gestuurde multimodel pipeline
Multimodel — Ribasim + LLM + wflow
Ribasim (Julia-solver) simuleert het Rijn/IJssel-netwerk. Een LLM identificeert de kritieke knoop en stuurt automatisch vijf wflow-droogte-scenario's aan. Volledig on-device op ARM64.
FEWS client GET Waterlab PI REST v1.25 /fewspiservice/v1 JSON { "timeSeries" events[] "header" } filters · locations · parameters · timeseries
Proef 7 · FEWS PI REST integratie
FEWS PI REST — Waterlab als service
wflow-output beschikbaar via vier standaard FEWS-endpoints conform Deltares spec v1.25. RWS- en waterschap-systemen kunnen direct verbinden zonder aanpassing aan FEWS.
6.687 m³/s
Proef 4 · Historische simulatie
Hoogwater — januari 1995
De zwaarste Rijnvloed in decennia. Lobith bereikte 6.687 m³/s; 250.000 mensen werden geëvacueerd. wflow SBM simuleert 90 dagen op ERA5-Land forcing met kinematische golfrouting.
~600 m³/s · normaal 2.000
Proef 5 · Droogte simulatie
Droogte — zomer 2018
Ernstigste droogte in Nederland in decennia. Lobith zakte naar ~600 m³/s — 70% onder normaal. ERA5-Land forcing mei–aug 2018; wflow op echte droogte-condities.
Piek Maas · Limburg · Luik
Proef 6 · Historische simulatie
Hoogwater — juli 2021
Extreme neerslag in 48 uur boven Ardennen en Eifel veroorzaakte catastrofale overstromingen langs Maas en Roer. Vergelijking met ERA5 forcing en RWS meetreeksen.
🏗 Platform Visie

AI-first Waterplatform

Herontwerp van het complete waterinstrumentarium als een API-first platform zonder GUI-afhankelijkheden. Een generieke basislaag verzorgt data-ingestie, model-executie en AI-orkestratie; domeinmodules voegen gebiedsspecifieke schematisaties, drempelwaarden en expertkennis toe als configuratie — niet als code. Elke consumer (dashboard, FEWS, app, webhook) is een verwisselbare API-client. Het resultaat is een significante vermindering van koppelingen en een platform dat zonder aanpassingen een nieuw stroomgebied ondersteunt zodra de domein-config beschikbaar is.

API-firstEvent-drivenAI-orchestratedDomain-agnostic Tool Use / MCPContainer APIOpenAPI 3.1FEWS-compatible
Platform architectuur — gelaagd overzicht
Consumers Dashboard / PWA MapLibre · Plotly FEWS Operationeel Deltares FEWS client Mobile / PWA React Native · Flutter Alert Systeem email · SMS · webhook Custom API Clients scripts · notebooks · RTC API Gateway OpenAPI 3.1 · JWT Auth · Rate Limiting · Versioning · gRPC/REST AI Orchestrator Claude / LLM — modelkeuze · scenario-generatie · interpretatie · interventie · tool use Agent Pool (Claude) Tool Registry / MCP Domain Context Memory / RAG trigger Model Execution containerized runners wflow · SOBEK · D-FLOW · Ribasim Data Hub normalized connectors ERA5T · Open-Meteo · RWS WI · FEWS Analysis Engine uncertainty · ensemble ensemble stats · EnKF · anomaly detection Event Bus async triggers observations · thresholds · webhooks · SSE domain extensions IJssel wflow config · SOBEK Kampen thresholds · LLM context Rijn-delta D-FLOW FM · Ribasim Lobith · Pannerdense Kop Maas wflow · SOBEK 1D Borgharen · Venlo · Mook Kust / Estuarium D-FLOW FM 3D · saliniteit Haringvliet · Nieuwe Waterweg + Nieuw domein config.yaml + model adapter plug-in zonder code-wijziging
API Gateway AI Orchestrator (centraal) Model Execution Data Hub Analysis Engine Event Bus Gestippelde pijl = event-driven trigger (omhoog naar AI)
Domain Service Model
Core Platform (generiek) Obs Broker Model Runner AI Orchestrator Event Bus + Domain Config (YAML) schematisatie drempelwaarden LLM context stakeholders Platform instantieert domein via config — geen code-aanpassing IJssel Domain Service wflow-ijssel.yaml Kampen · Westervoort · Roggebotsluis Maas Domain maas.yaml plug-in + Nieuw any.yaml 0 code Doorgetrokken = bestaand · Gestippeld = toekomstig plug-in Domeinkennis = YAML config · Geen fork van platform-code vereist
De kernlaag werkt domein-agnostisch: model-runners, data-connectors en AI-agent zijn generiek. Een nieuw stroomgebied (Maas, kust, buitenland) vereist alleen een domain.yaml met schematisatie-pad, meetpuntlocaties, drempelwaarden en LLM-contextprompt.
AI Orchestrator — agent flow
Trigger nieuwe observatie / user request / cron AI Agent Planning "welke tools zijn nodig voor dit verzoek?" → tool: get_observations (station="Kampen", days=1) → tool: get_forecast_forcing (days=14) → tool: run_model_ensemble (n=5, model="wflow") → tool: compute_ensemble_stats (p10,p90) → tool: check_thresholds (domain="ijssel") Output structured JSON + NL interventie-tekst
De AI-agent beslist autonoom welke tools worden aangeroepen op basis van het verzoek en de domeincontext. Tool-calls zijn traceerbaar (audit log). Het zelfde agent-patroon werkt voor dijkbewaking (hoogwater), laagwaterbeheer en klimaatdoorrekeningen — alleen de context-prompt verschilt.
Afhankelijkheden: huidig vs. nieuw platform
Component Huidig (Waterlab) Nieuw platform Winst
Model-uitvoer Per-event Julia scripts, hardcoded paden, handmatig starten Model Execution API: POST /models/wflow-sbm/run → run-id containerized versioned
GUI / frontend FastAPI serveert statische HTML + JS; tightly coupled met server API retourneert JSON/GeoJSON; elke consumer is verwisselbaar ontkoppeld headless
AI / LLM Directe Anthropic API-call in server.py; lokale Qwen los beheerd AI Orchestration Service: één interface, pluggable backends (cloud/lokaal) unified switchable
Data-ingestie Per-script: download_forcing.py, forecast.py, RWS-fetch los Data Hub connectors: gestandaardiseerde adapter per bron, gecached normalized cacheable
Configuratie Hardcoded paden in TOML/YAML, per-event handmatig aanpassen Domain config YAML: één bestand volledig beschrijft een domein portable reproduceerbaar
Observability Print-statements, handmatig logbestanden bekijken Structured logs, distributed tracing (OpenTelemetry), audit trail traceable alerting
Nieuw domein toevoegen Fork + aanpassen van model-scripts, nieuwe export-scripts, nieuwe endpoints Schrijf domain.yaml, registreer model-adapter → klaar 0 code-wijziging
Migratiestappen — van Waterlab naar platform
1
API-laag over bestaande modellen
Wrap de huidige Julia-scripts achter een Model Execution REST API (FastAPI of gRPC). POST /models/wflow-sbm-ijssel/run retourneert een run_id; polling of webhook bij gereed. Bestaande scripts ongewijzigd — API is een thin adapter. Resultaat: model-uitvoer is nu aanroepbaar door elke service of agent.
2
Data Hub — gestandaardiseerde connectors
Verplaats download_forcing.py, forecast.py en RWS Waterinfo-fetch naar een Data Hub met één interface: GET /data/{source}/{variable}/{bbox}/{period}. Cache-laag (15 min) vervangt de huidige ad-hoc caching in server.py. Open-Meteo, ERA5T, RWS Waterinfo en FEWS Web Services krijgen elk een adapter.
3
AI Orchestrator als centrale controller
Vervang de directe model-calls in server.py door een AI Orchestration Service. De agent gebruikt tool use (of MCP) om Data Hub en Model Runner aan te roepen, resultaten te interpreteren en een gestructureerde respons te produceren. Huidige Claude- en Qwen-integraties worden als backend geregistreerd in de tool registry.
4
Domain config + Event Bus
Extraheer IJssel-specifieke kennis (thresholds, schematisatie-paden, LLM system prompt, stakeholder-mapping) naar een ijssel.yaml. Voeg een Event Bus toe die observatie-triggers en drempeloverschrijdingen publiceert; de AI-agent subscribet hierop. Nieuw domein = nieuw YAML-bestand.
🔬 Onderzoeksrichting

Backlog & Mogelijke POC's

Verkenning van uitbreidingen voor Waterlab: koppeling met het operationele Delft-FEWS-systeem van RWS, hydraulische modellen (SOBEK, D-FLOW FM), data-assimilatie via een Ensemble Kalman Filter, een live physics-based ensemble en klimaatprojecties met KNMI'23-scenario's. De zes uitgewerkte cases zijn concreet uitvoerbaar op de bestaande Jetson-hardware en sluiten direct aan op wat al draait.

Delft-FEWSSOBEKD-FLOW FMOpenDA RTC-ToolsiMODKNMI'23SFINCS
Acties na review — status

De review was enthousiast maar legde één structureel risico bloot: voor een vakgenoot was de herkomst van data en schematisatie onzichtbaar en niets tegen metingen gevalideerd. De leidende as van de opvolging is daarom vertrouwen, niet cosmetica: eerst herkomst zichtbaar maken, dan skill tegen metingen, dan interpretatie aan de kaart. Volledige backlog: docs/BACKLOG_WaterLab_review ↗.

10afgehandeld
1open (geblokkeerd)
3prioriteits-assen
IDActieStatusWaar te zien
WL-VIS-2Eerlijke grafieklabels — elke serie gemeten / gesimuleerd / verwacht + eenheid, gescheiden assen✓ klaaralle grafieken
WL-GOV-1Canonieke "wat dit wél/niet bewijst"-grens✓ klaarlanding · doc ↗
WL-PROV-1Aftepelbare herkomst-keten per proef (databron → randvoorwaarde → modelstap → output → AI-duiding)✓ klaarPOC's-tab
WL-PROV-2Herkomst van schematisatie & instroom-randvoorwaarden per run✓ klaardoc ↗
WL-VAL-1Gesimuleerd vs gemeten per punt + skill-score (NSE/KGE/r/bias), eerlijke "niet te valideren"-matrix✓ klaarValidatie-tab · /api/validation
WL-VAL-2Hindcast-terugblik — uitgegeven verwachting vs realisatie, fout per horizon✓ klaarValidatie-tab
WL-VIS-1Elk netwerkpunt klikbaar → detail (debiet, rivierdiepte, hoger/lager dan normaal) + tooltip✓ klaarkaart Jul 2021
WL-COMM-1Site-herinrichting: redeneerlijn-schil (waardestromen × informatiefuncties)✓ klaarlanding
WL-CHAT-1Bevraagbare uitleg-chatbot, gegrond in de PROV-bronnen, achter login + budget✓ klaarVraag het-tab
WL-DEMO-1Rondleiding afgestemd op het herkomst- & validatieverhaal (~4 min)✓ klaarDEMO.md
+ extraLabelcorrectie: wflow h_river = rivierdiepte, niet m+NAP (bijvangst VAL-1) · docs-viewer /docs/{naam}✓ klaargrafieken · docs
WL-FC-1Statistisch model vervangen door wflow SBM nowcast⏳ opengeblokkeerd op voorverwarmde Julia-sysimage (build_sysimage.jl); bewuste PO-noot
Uitgewerkte verkenningen — concreet uitvoerbaar
FEWS Server RWS operationeel REST fewspy client Python · JSON ts vergelijking Plotly overlay Q wflow FEWS RWS
✓ Haalbaar
POC A · Operationele koppeling
Delft-FEWS Web Services
RWS draait een operationeel FEWS-systeem voor de grote rivieren dat tijdreeksen publiceert via een REST API. Via fewspy halen we de officiële 2–10-daagse Rijn/IJssel-prognose op en vergelijken die real-time met ons wflow-output — directe validatie van het statistisch model.
fewspyREST APIRWS FEWSPlotly
waterpeil dijk rivier polder SOBEK 1D routing Verheij–van der Knaap doorbraakformule
◎ POC Idee
POC B · Hydraulische koppeling
SOBEK dijkdoorbraakrouting
wflow-debiet als bovenstrooms randvoorwaarde → SOBEK Rural 1D kanaalrouting → Verheij–van der Knaap doorbraakformule op gekozen dijkvak (Deventer/Zwolle) → inundatiediepte in polder als functie van tijd. Output als GeoJSON vloedpolygoon op de bestaande MapLibre-kaart.
D-HYDRO SOBEKdoorbraakformule1D routingGeoJSON
Q nu nat droog ← ERA5T spinup Open-Meteo ×5 →
⟳ In Design
POC C · Live physics-based forecast
Live wflow Ensemble (14 d)
Dagelijkse cron: ERA5T near-realtime forcing → wflow spinup tot gisteren → bodemtoestand als begintoestand → vijf Open-Meteo neerslagvarianten (×0.70–×1.30) → P10/mean/P90 debiet Kampen. Vervangt de statistische recessiecurve door een fysisch model met onzekerheidsbanden.
ERA5TOpen-Meteo gridwflow statecron
diep ondiep ongestructureerd rooster
◎ POC Idee
POC D · 2D hydraulica
D-FLOW FM — uiterwaarden
Vervangt de riviercel-GeoJSON door een 2D hydrodynamische simulatie van de uiterwaarden met Delft3D Flexible Mesh. Het ongestructureerde rooster past zich aan de complexe geometrie aan en berekent waterdiepte en stroomsnelheid per cel. Output: UGRID NetCDF → deck.gl GridLayer.
Delft3D-FMUGRID NetCDFflex meshdeck.gl
t obs prior posterior breed (onzekerheid) nauw (gecorrigeerd)
◎ POC Idee
POC E · Data-assimilatie
Ensemble Kalman Filter
Live RWS Waterinfo-metingen (debiet Kampen/Westervoort) corrigeren de wflow-bodemtoestand via een Ensemble Kalman Filter. Na elke observatie krimpt het ensemblespread — betere begintoestand voor de volgende 14-daagse voorspelling. Bouwt direct voort op de bestaande ensemble-infrastructuur.
OpenDAPython EnKFwflow stateRWS live
piekdebiet Q (m³/s) 1995 huidig W 2050 G 2050 WH 2100 2000 3000 4000 P(Q>x)
✓ Haalbaar
POC F · Klimaatprojectie
KNMI'23 klimaatscenario's
De vier KNMI'23-scenario's (W, WH, G, GH) worden via delta-change toegepast op de ERA5-forcing: temperatuur +Δ, neerslag ×factor, verdamping gecorrigeerd. Vijf wflow-runs per scenario geven exceedance probability curves voor 2050 en 2100 ten opzichte van de 1995-referentiepiek (≈ 3500 m³/s Kampen).
KNMI'23 deltafactorenxarraywflow SBMexceedance curves
Backlog — verdere ideeën & uitbreidingen
iMOD · Veluwe grondwater
Koppeling IJssel-waterpeil ↔ Veluwe-grondwater via iMOD-python of MODFLOW 6. Visualiseer kwelzone-omkering bij laagwater (< 0.3 m+NAP): IJssel daalt → kweldruk negatief → grondwateronttrekking Veluwe-natuur.
iMOD-pythonMODFLOW 6kwelzonegrondwater
RTC-Tools · stuurbeheer
Deltares RTC-Tools 2 (CasADi/IPOPT) bepaalt optimale stuwstanden (Driel, Amerongen, Roggebotsluis) gegeven de wflow-verwachting. Sluit de regelloop: waarnemen → voorspellen → besturen. Ribasim als plantmodel.
RTC-Tools 2CasADiIPOPTRibasim plant
D-FLOW FM 3D · saliniteit
Bij hoog IJsseldebiet dringt zoet water door in het zoute Ketelmeer/IJsselmeer. D-FLOW FM 3D met zout-transport berekent de halocline en de impact op drinkwaterwinning Vitens en de ecologie van de overgang.
D-FLOW FM 3Dzout-transportKetelmeerVitens
HIS-SSM · schade-model
Inundatiediepte uit SOBEK/D-FLOW FM gekoppeld aan HIS-SSM schadefuncties per BGT-landgebruiksklasse. Economische schade per scenario in euro's — input voor kosten-batenanalyse dijkverhoging.
HIS-SSMschadefunctiesBGTKBA
SFINCS · urbane overstroming
Super-Fast INundation of CoastS (Deltares) als snel 2D alternatief voor stedelijke gebieden (Zwolle, Deventer): ordes sneller dan D-FLOW FM en geschikt voor real-time inzet op de Jetson.
SFINCS2D snelurban floodreal-time
HydroMT-update · nieuwe schematisatie
Automatische heropbouw van de wflow SBM-schematisatie met een recenter DEM (AHN4) en actueel landgebruik (BRP 2024). HydroMT genereert alle statische kaarten zonder handmatige tussenstappen.
HydroMTAHN4BRP 2024automatisch
🧪 PROEF 7 — POC FEWS PI REST
Wat is bewezen
Waterlab draait als volwaardige FEWS PI REST service. Vier standaard-endpoints retourneren PI JSON conform Deltares spec v1.25. Elke FEWS-instantie bij RWS of een waterschap kan dit endpoint als externe databron aanroepen zonder aanpassing aan FEWS zelf.
Wat je ziet op deze pagina
API Explorer — klik een endpoint om de ruwe PI JSON-response live te zien.
Tijdreeksgrafiek — wflow-simulatie versus RWS Waterinfo-meting op dezelfde locatie/parameter-sleutel.
PI REST hiërarchie — filter → location → parameter → timeseries.
Wat nog ontbreekt
Authenticatie · schrijf-endpoints · webhooks · push-notificaties.
Dit is een read-only v1 demonstratie — het bewijst dat het protocol werkt, niet dat het productie-klaar is.
🔌 PI REST

Waterlab als FEWS PI REST service

Waterlab publiceert wflow SBM output en RWS Waterinfo data via een FEWS-compatibele PI REST API. De vier standaard-endpoints zijn live op localhost beschikbaar.

Wil je zien hoe een héle proef via deze interface binnenkomt?

API Explorer · /fews/rest/fewspiservice/v1/
← klik een endpoint om de ruwe PI JSON response te zien
Tijdreeksvergelijking — Q.sim (wflow) vs Q.meting (RWS live)
PI REST hiërarchie
Filter Location Parameter TimeSeriesKey TimeSeries { header, events[] }

Waterlab implementeert versie 1.25 van de PI REST standaard (Deltares/RWS). De parameter period is een niet-standaard extensie om historische wflow simulaties op te vragen via dezelfde endpoint.

🔌 POC via FEWS — draai een proef als FEWS-client

Hier draaien we een bestaande proef volledig via de FEWS PI REST-interface (/fews/rest/fewspiservice/v1/) — niet via de interne API. Elke waarde die je hieronder ziet is opgehaald zoals een échte Delft-FEWS-instantie dat zou doen: eerst de bron ontdekken (filters → locations → parameters), dan de tijdreeks (timeseries) binnenhalen als PI JSON. Zo bewijst Waterlab dat het een verwisselbare FEWS-databron is — geen tweede datapad.

De FEWS-handshake

1 · filters
2 · locations
3 · parameters
4 · timeseries

Resultaat — Q.sim uit PI JSON

Bron: alle waarden via /fews/rest/fewspiservice/v1/timeseries?parameterIds=Q.sim&period=… — dezelfde proef (wflow SBM 1995/2018/2021), maar binnengehaald als FEWS-client. De meet-parameters Q.meting/H.meting zijn via dezelfde interface beschikbaar, maar leveren live RWS-data (recent) — niet de event-periode — dus die overlayen we hier bewust niet.