303.525 datasets geïndexeerd1.419 uitgevers
Open Data IndexDe index van open data over Nederland
Open Data Index›Bouwen›Alert als de rivier bij jou te hoog of te laag staat
AlertOm te beginnenKlimaat en milieu

Alert als de rivier bij jou te hoog of te laag staat

Een klein script dat elke paar uur de waterstand van Rijkswaterstaat ophaalt, de verwachting voor de komende dagen erbij zet en een melding geeft als de rivier buiten de normale band van de afgelopen tien jaar komt. Met de neerslag van het KNMI als verklaring.

Je AI-assistentOpen Data Index MCP aan
De MCP-server van Open Data Index staat aan in je chat. Zo leest de assistent dit project en de bronnen zelf.
Jij plakt de prompt van dit project
De assistent haalt op bij Open Data Index
  • geef_project("waterstand-alert")
  • geef_bron("rws-waterinfo")
  • geef_bron("knmi-daggegevens")
De assistent

Ik heb het project, de geteste aanroepen en de valkuilen. Ik bouw een alert met Waterinfo en Waterwebservices en KNMI daggegevens van het weer. Zo kan het eruitzien:

Dit bouw je zelf. Kopieer de prompt naar Claude, ChatGPT of Cursor, met de MCP-server aan, of volg de stappen hieronder.

Volg de stappen
22:20
Waterstandnu
ALERT: Rijn bij Lobith 630 cm

Lager dan het laagste punt van 2016 tot en met 2025 (647 cm). Verwachting 18 okt: 625 cm.

Rijn bij LobithALERT
630cm boven NAP
1464hoogste 2016-2025
1110hoog (90%)
877midden
717laag (5%)
647laagste 2016-2025
630nu
24 uur eerder
632 cm
Bereik, 48 uur
628-634 cm
Verwachting 18 okt 06:00
625 cm
Regen Deelen, 30 dagen
45,1 mm
Normaal (1991-2020)
73,1 mm
Mockup

Dit is een mockup, geen werkende versie, met de cijfers uit onze proefdraai van 16 oktober 2026, 22:20. De MCP-server zet je aan met het adres op Voor AI.

Voor wie

Bewoners van uiterwaarden en rivierdorpen, schippers en binnenvaartbedrijven (laagwater betekent minder lading), kanoërs, lokale media en iedereen die een Telegram- of Slackbot wil die zegt: "De Rijn bij Lobith staat lager dan op enig moment in de afgelopen tien jaar."

Wat je krijgt

Een alert-script voor de Rijn bij Lobith (het punt waar de Rijn Nederland binnenkomt) dat je met cron of een GitHub Action elke paar uur draait. Het haalt de laatste 48 uur tienminutenwaarden op, de verwachting van Rijkswaterstaat en de neerslag van het KNMI, en geeft OK, LET OP of ALERT.

Proefdraai op 16 oktober 2026, 22:20 (+01:00): de Rijn stond bij Lobith op 630 cm boven NAP, 2 cm lager dan 24 uur eerder. De verwachting liep tot 18 oktober 06:00 en zakte naar 625 cm. Dat is lager dan het laagste punt in alle 526.029 tienminutenwaarden van 2016 tot en met 2025 (647 cm op 18 augustus 2022; in de droge herfst van 2018 was het laagste punt 649 cm). Op 1 oktober 2026 om 13:00 stond de Rijn er zelfs op 602 cm, met een afvoer van 536 m³/s op 30 september (in oktober 2018 was het laagste 656 m³/s). Bij KNMI-station Deelen viel van 15 september tot en met 14 oktober 2026 45,1 mm regen, 62% van wat normaal is voor die dagen in 1991-2020.

Afvoer van de Rijn bij Lobith (maandgemiddelde): 683 kubieke meter per seconde in september 2026, 61% minder dan in september 2025

Afvoer van de Rijn bij Lobith (maandgemiddelde), september 2025 – september 2026, in kubieke meter per seconde. Het hoogste punt was februari 2026 (3.269). Cijfers met * zijn voorlopig.

Bron: Rijkswaterstaat, Waterwebservices (DDAPI 2.0), Lobith (Bovenrijn, Tolkamer) · opgehaald 25 oktober 2026 · selectie: ProcesType: meting; maandgemiddelde van tienminutenwaardenOpen de tabel Los blok

Zo zou je kunnen starten7 stappen

  1. 1

    Zoek je meetpunt in de catalogus

    Alles gaat met POST en een JSON-body naar de nieuwe Waterwebservices (DDAPI 2.0); het oude adres waterwebservices.rijkswaterstaat.nl werkt niet meer. De catalogus (1,75 MB, minder dan een seconde) geeft 2.499 locaties met code, naam en lengte- en breedtegraad (ETRS89), en in AquoMetadataLocatieLijst welke grootheid waar gemeten wordt. Voor een alert wil je WATHTE (waterhoogte in cm ten opzichte van NAP). Niet elk punt heeft alles: Lobith Tolkamer en Arnhem Nederrijn hebben WATHTE én Q (afvoer), Nijmegen Waal en Deventer alleen WATHTE, voor de Maas zijn Sint Pieter en Venlo goede punten. Kies de dichtstbijzijnde locatie die de grootheid echt heeft.

    curl -X POST "https://ddapi20-waterwebservices.rijkswaterstaat.nl/METADATASERVICES/OphalenCatalogus" \
      -H 'Content-Type: application/json' -d '{"CatalogusFilter":{"Grootheden":true,"Eenheden":true,"Compartimenten":true}}'
    {"Succesvol": true, "AquoMetadataLijst": [...202...], "AquoMetadataLocatieLijst": [...],
     "LocatieLijst": [...2499...], ...}
    {"Locatie_MessageID": 15596, "Code": "lobith.bovenrijn.tolkamer", "Coordinatenstelsel": "ETRS89",
     "Lat": 51.8495, "Lon": 6.1024, "Naam": "Lobith, Bovenrijn, Tolkamer", "Omschrijving": "Lobith, Bovenrijn, Tolkamer"}
    lobith.bovenrijn.tolkamer ['Q/m3/s', 'T/oC', 'WATHTE/cm']
    nijmegen.waal ['WATHTE/cm']
    maastricht.sintpieter ['Q/m3/s', 'WATHTE/cm']
  2. 2

    Vraag de laatste meting op

    OphalenLaatsteWaarnemingen geeft per reeks de laatste waarde, maar ook van reeksen die al lang gestopt zijn: voor Lobith kwamen er twaalf WATHTE-reeksen terug, met laatste waarden uit 1934, 1947, 1987 en 2010. Neem alleen ProcesType meting en daarvan de waarde met het nieuwste Tijdstip. Recente waarden zijn Ongecontroleerd. Tijden staan altijd in vaste +01:00, ook in de zomer.

    curl -X POST "https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenLaatsteWaarnemingen" \
      -H 'Content-Type: application/json' -d '{"LocatieLijst":[{"Code":"lobith.bovenrijn.tolkamer"}],"AquoPlusWaarnemingMetadataLijst":[{"AquoMetadata":{"Compartiment":{"Code":"OW"},"Grootheid":{"Code":"WATHTE"}}}]}'
    {"Succesvol":true,"WaarnemingenLijst":[{"AquoMetadata":{ ... "Grootheid":{"Code":"WATHTE","Omschrijving":"Waterhoogte"},
      "Hoedanigheid":{"Code":"NAP","Omschrijving":"t.o.v. Normaal Amsterdams Peil"}, ... "ProcesType":"meting", ...},
     "MetingenLijst":[{"Meetwaarde":{"Waarde_Alfanumeriek":"630","Waarde_Numeriek":630.0},
       "Tijdstip":"2026-10-16T22:20:00.000+01:00",
       "WaarnemingMetadata":{"Bemonsteringshoogte":"0","Kwaliteitswaardecode":"00","OpdrachtgevendeInstantie":"RIKZMON_WAT",
                             "Referentievlak":"NVT","Statuswaarde":"Ongecontroleerd"}}]},
     ... (en elf oude reeksen, bijvoorbeeld:)
     {"Meetwaarde":{"Waarde_Alfanumeriek":"1016","Waarde_Numeriek":1016.0},"Tijdstip":"1934-12-31T08:40:00.000+01:00", ... "Statuswaarde":"Definitief"}
  3. 3

    Haal de laatste 48 uur op

    OphalenWaarnemingen met ProcesType meting en een periode in +01:00 geeft de tienminutenwaarden (elke waarde is het gemiddelde over vijf minuten ervoor en erna). Zonder ProcesType krijg je ook de verwachting erbij. Een tijd zonder tijdzone (2026-10-16T00:00:00 of alleen 2026-10-16) geeft HTTP 400 met platte tekst: 'Het parsen van 'Begindatumtijd' is mislukt. Lever geldige waarden aan in het formaat 'yyyy-MM-dd'T'HH:mm:ss+01:00''. Z en +02:00 worden wel goed omgerekend, maar het antwoord staat altijd in +01:00. Uit 48 uur haal je de trend: hoeveel cm per dag stijgt of zakt de rivier?

    curl -X POST "https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen" \
      -H 'Content-Type: application/json' -d '{"Locatie":{"Code":"lobith.bovenrijn.tolkamer"},"AquoPlusWaarnemingMetadata":{"AquoMetadata":{"Compartiment":{"Code":"OW"},"Grootheid":{"Code":"WATHTE"},"ProcesType":"meting"}},"Periode":{"Begindatumtijd":"2026-10-15T00:00:00.000+01:00","Einddatumtijd":"2026-10-17T00:00:00.000+01:00"}}'
    1 reeks, 279 waarden, 81 kB
    "WaardeBepalingsMethode": {"Code": "other:F007", "Omschrijving": "Rekenkundig gemiddelde waarde over vorige 5 en volgende 5 minuten"}
    2026-10-15T00:00:00.000+01:00 630.0 Ongecontroleerd
    2026-10-15T00:10:00.000+01:00 628.0 Ongecontroleerd
    ...
    2026-10-16T22:10:00.000+01:00 630.0 Ongecontroleerd
    2026-10-16T22:20:00.000+01:00 630.0 Ongecontroleerd
  4. 4

    Bepaal je eigen drempels uit tien jaar data

    Rijkswaterstaat heeft officiële waarschuwingspeilen, maar die staan niet in de API en de pagina's van waterinfo.rws.nl buiten /publiek en /thema zijn in robots.txt afgesloten. Daarom: haal tien jaar tienminutenwaarden op (per jaar één aanroep van 15 MB en 3,5 seconden; meer dan een jaar per keer maakt het antwoord onhandig groot) en bereken percentielen. Voor Lobith 2016 tot en met 2025: 526.029 waarden, laagste 647 cm (18 augustus 2022), 5% laagste onder 717 cm, mediaan 877 cm, 5% hoogste boven 1.207 cm, 1% hoogste boven 1.349 cm, hoogste 1.464 cm (10 januari 2018). Doe dit één keer en zet de getallen in je script. Let op: in 2025 kwamen er twee reeksen terug die elkaar een maand overlappen (sensorwissel op 28 oktober 2025, 4.279 identieke waarden): ontdubbel op tijdstip.

    curl -X POST "https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen" \
      -H 'Content-Type: application/json' -d '{"Locatie":{"Code":"lobith.bovenrijn.tolkamer"},"AquoPlusWaarnemingMetadata":{"AquoMetadata":{"Compartiment":{"Code":"OW"},"Grootheid":{"Code":"WATHTE"},"ProcesType":"meting"}},"Periode":{"Begindatumtijd":"2018-01-01T00:00:00.000+01:00","Einddatumtijd":"2019-01-01T00:00:00.000+01:00"}}'
    2016 200 15.0 MB 3.6 s [('SB', 52705)]
    2018 200 15.0 MB 3.6 s [('SB', 52561)]
    2022 200 15.0 MB 3.4 s [('SB', 52561)]
    2025 200 16.0 MB 4.9 s [('SB', 9310), ('SB', 47526)]
    percentiel 0: 647  1: 665  5: 717  10: 744  50: 877  90: 1110  95: 1207  99: 1349  100: 1464
    2018 (649.0, '2018-10-23T08:30:00.000+01:00') (1464.0, '2018-01-10T07:20:00.000+01:00')
    2022 (647.0, '2022-08-18T03:50:00.000+01:00') (1282.0, '2022-01-08T10:50:00.000+01:00')
    2026 tot nu: min 2026-10-01T13:00:00.000+01:00 602.0  max 2026-02-26T13:00:00.000+01:00 1297.0
  5. 5

    Zet de verwachting erbij

    Met ProcesType verwachting krijg je de waterstandsverwachting van Rijkswaterstaat (methode RWSM-F232). Op 16 oktober 2026 liep die tot 18 oktober 06:00, dus ongeveer anderhalve dag vooruit, met 325 waarden vanaf middernacht. Een alert op de verwachting waarschuwt eerder dan een alert op de meting. Vraag gerust een langere periode; je krijgt terug wat er is.

    curl -X POST "https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen" \
      -H 'Content-Type: application/json' -d '{"Locatie":{"Code":"lobith.bovenrijn.tolkamer"},"AquoPlusWaarnemingMetadata":{"AquoMetadata":{"Compartiment":{"Code":"OW"},"Grootheid":{"Code":"WATHTE"},"ProcesType":"verwachting"}},"Periode":{"Begindatumtijd":"2026-10-16T00:00:00.000+01:00","Einddatumtijd":"2026-10-22T00:00:00.000+01:00"}}'
    verwachting {'Code': 'RWSM-F232', 'Omschrijving': 'RWS Methodiek F232'} 325 waarden
    2026-10-16T00:00:00.000+01:00 630.0 ... 2026-10-18T06:00:00.000+01:00 625.0
    {"Meetwaarde": {"Waarde_Alfanumeriek": "625", "Waarde_Numeriek": 625.0}, "Tijdstip": "2026-10-18T06:00:00.000+01:00",
     "WaarnemingMetadata": {"Bemonsteringshoogte": "0", ... "Statuswaarde": "Ongecontroleerd"}}
  6. 6

    Afvoer (Q): kies de juiste reeks

    Afvoer in m³/s zegt meer dan waterhoogte als je jaren vergelijkt (de rivierbodem verandert), maar Q is een berekende grootheid en dat zie je in de data. Voor oktober 2018 kwamen er drie Q-reeksen terug: 'Debiet uit Q-f relatie' (oude formule), 'Debiet uit Q-f relatie (2018)' (gecontroleerd) en een daggemiddelde (WaardeBewerkingsMethode GEM24H); een van de reeksen had ook waarden van 9,99999e+37 (geen waarde). In 2026 zijn er twee SB-reeksen met dezelfde metadata (een tot 23 augustus, een vanaf 26 augustus) en een losse NVT-reeks van één dag (1 januari) met 237 tot 243 m³/s, terwijl de SB-reeks die dag 1.136 tot 1.185 m³/s gaf, met precies dezelfde rekenregel. Kies dus de reeks met WaardeBepalingsMethode 'Debiet uit Q-f relatie (2018)' en WaardeBewerkingsMethode NVT, neem daarvan de reeks met BemonsteringsSoort SB als die er is (vóór 2025 bestaat alleen NVT), en filter onmogelijke waarden weg.

    curl -X POST "https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen" \
      -H 'Content-Type: application/json' -d '{"Locatie":{"Code":"lobith.bovenrijn.tolkamer"},"AquoPlusWaarnemingMetadata":{"AquoMetadata":{"Compartiment":{"Code":"OW"},"Grootheid":{"Code":"Q"},"ProcesType":"meting"}},"Periode":{"Begindatumtijd":"2018-10-24T00:00:00.000+01:00","Einddatumtijd":"2018-10-25T00:00:00.000+01:00"}}'
    {'Code': 'other:F216', 'Omschrijving': 'Debiet uit Q-f relatie'}         NVT    145 [('00:00', 741.6, 'Ongecontroleerd'), ...]
    {'Code': 'other:F216', 'Omschrijving': 'Debiet uit Q-f relatie'}         GEM24H   2 [('00:00', 735.0, 'Ongecontroleerd'), ...]
    {'Code': 'other:F230', 'Omschrijving': 'Debiet uit Q-f relatie (2018)'}  NVT    145 [('00:00', 683.58, 'Gecontroleerd'), ...]
    september-oktober 2026, Q-f relatie (2018): laagste 536.22 m³/s op 2026-09-30T08:10:00.000+01:00
  7. 7

    Neerslag als verklaring

    KNMI daggegevens geeft per station de dagneerslag (RH, in tienden van een mm; -1 betekent minder dan 0,05 mm) en de verdamping (EV24, tienden van een mm). Station 275 Deelen ligt bij Arnhem. Tel de laatste 30 dagen op en vergelijk met dezelfde kalenderdagen in 1991-2020. Zeg er wel bij dat de Rijn bij Lobith vooral reageert op regen en sneeuwsmelt in Duitsland en Zwitserland, met dagen vertraging; voor kleine rivieren en beken is lokale regen wel de verklaring. De daggegevens lopen een à twee dagen achter: op 16 oktober was 14 oktober de nieuwste dag.

    curl -X POST "https://www.daggegevens.knmi.nl/klimatologie/daggegevens" \
      -d 'stns=275&vars=RH:EV24&start=20261010&end=20261016&fmt=json'
    [{"station_code":275,"date":"2026-10-10T00:00:00.000Z","RH":21,"EV24":13},
     {"station_code":275,"date":"2026-10-11T00:00:00.000Z","RH":75,"EV24":9},
     {"station_code":275,"date":"2026-10-12T00:00:00.000Z","RH":0,"EV24":17},
     {"station_code":275,"date":"2026-10-13T00:00:00.000Z","RH":45,"EV24":5},
     {"station_code":275,"date":"2026-10-14T00:00:00.000Z","RH":0,"EV24":16}]

Hoe de bronnen samenkomen

  • Waterinfo en WaterwebservicesKNMI daggegevens van het weervia datum (dagwaarde) en plaats: kies het KNMI-station dichtbij het meetpunt (Lobith en Arnhem: 275 Deelen; Maastricht: 380)

    Leg de dagelijkse laagste of hoogste waterstand naast de neerslag van de dagen ervoor. Voor beken en kleine rivieren zie je het verband direct; voor de Rijn en de Maas komt het meeste water uit het buitenland en is het KNMI-station alleen een lokale aanwijzing.

  • Waterinfo en WaterwebservicesActueel Hoogtebestand Nederland (AHN)via hoogte ten opzichte van NAP (Waterinfo in cm, AHN in m)

    Zet de verwachte waterstand naast de hoogte van een uiterwaard of kade uit het AHN: welk land ligt lager dan de rivier? Een eerste schatting, want het verhang (de rivier daalt stroomafwaarts) en dijken tellen niet mee.

Laat AI het bouwen

Plak deze prompt in Claude, ChatGPT, Cursor of Lovable. Hij noemt de echte endpoints, de koppelsleutels en de valkuilen, zodat de assistent meteen werkende code schrijft. Controleer de uitkomst altijd met de bron zelf.

Bouw een waterstand-alert voor een Nederlandse rivier. Het script draait elke drie uur (cron of GitHub Actions), haalt de waterstand op bij Rijkswaterstaat en stuurt een bericht (Telegram, Slack of e-mail) als de rivier buiten de normale band komt. Geen sleutel nodig.

Data: Rijkswaterstaat Waterwebservices, DDAPI 2.0. Alles is POST met een JSON-body naar https://ddapi20-waterwebservices.rijkswaterstaat.nl/. Gebruik NIET het oude adres waterwebservices.rijkswaterstaat.nl (stuurt door naar een overstappagina) en NIET de interne API van waterinfo.rws.nl (robots.txt verbiedt alles behalve /publiek en /thema).
- Locaties: POST METADATASERVICES/OphalenCatalogus met {"CatalogusFilter":{"Grootheden":true,"Eenheden":true,"Compartimenten":true}}. 2.499 locaties met Code, Naam, Lat, Lon (ETRS89). AquoMetadataLocatieLijst koppelt Locatie_MessageID aan AquoMetaData_MessageID: zo zie je welke grootheid (WATHTE waterhoogte in cm t.o.v. NAP, Q afvoer in m³/s) op welke locatie bestaat. Goede punten: lobith.bovenrijn.tolkamer (Rijn), nijmegen.waal, arnhem.nederrijn, deventer (IJssel), maastricht.sintpieter en venlo (Maas).
- Meting: POST ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen met {"Locatie":{"Code":"lobith.bovenrijn.tolkamer"},"AquoPlusWaarnemingMetadata":{"AquoMetadata":{"Compartiment":{"Code":"OW"},"Grootheid":{"Code":"WATHTE"},"ProcesType":"meting"}},"Periode":{"Begindatumtijd":"2026-10-15T00:00:00.000+01:00","Einddatumtijd":"2026-10-17T00:00:00.000+01:00"}}. Waarden in WaarnemingenLijst[].MetingenLijst[] met Tijdstip, Meetwaarde.Waarde_Numeriek en WaarnemingMetadata.Statuswaarde.
- Verwachting: dezelfde aanroep met "ProcesType":"verwachting" (loopt ongeveer anderhalve dag vooruit).

Valkuilen die je MOET afvangen:
- Geef tijden altijd met tijdzone, het liefst zoals de API ze zelf teruggeeft: 2026-10-16T22:20:00.000+01:00 (vaste +01:00, ook in de zomer). Zonder tijdzone volgt HTTP 400 met platte tekst ('Het parsen van 'Begindatumtijd' is mislukt'), dus niet blind .json() aanroepen. Het antwoord staat altijd in +01:00; toon tijden aan gebruikers in Nederlandse tijd (zomertijd = een uur later).
- Zonder ProcesType krijg je meting, verwachting en astronomisch getij door elkaar.
- OphalenLaatsteWaarnemingen geeft ook oude, gestopte reeksen (Lobith: laatste waarden uit 1934, 1947, 2010). Neem de meting met het nieuwste Tijdstip.
- Er kunnen meerdere reeksen tegelijk terugkomen (sensorwissel); ontdubbel op Tijdstip.
- Waarden als 999999999 of 9.99999e+37 betekenen 'geen waarde': filter alles buiten een redelijke band.
- Recente waarden zijn 'Ongecontroleerd'; zeg dat in de melding.
- Q (afvoer) is berekend. Er staan meerdere reeksen naast elkaar (oude Q-f relatie, Q-f relatie (2018), daggemiddelde GEM24H). Kies WaardeBepalingsMethode 'Debiet uit Q-f relatie (2018)', WaardeBewerkingsMethode NVT en, als die er is, BemonsteringsSoort SB (op 1 januari 2026 gaf een NVT-reeks met dezelfde rekenregel 237 m³/s tegen 1.150 in de SB-reeks).
- Officiële waarschuwingspeilen staan niet in de API. Bereken eenmalig percentielen uit tien jaar tienminutenwaarden (per jaar één aanroep, ongeveer 15 MB) en sla ze op. Lobith 2016-2025: laagste 647 cm, P5 717, mediaan 877, P95 1207, P99 1349, hoogste 1464 cm boven NAP.
- Niet elke tien minuten pollen: de waarden komen per tien minuten, een alert elke één tot drie uur is genoeg. Stuur een eerlijke User-Agent mee.

Neerslag als context: KNMI daggegevens, POST https://www.daggegevens.knmi.nl/klimatologie/daggegevens met stns=275&vars=RH&start=JJJJMMDD&end=JJJJMMDD&fmt=json. RH in tienden van een mm, -1 is minder dan 0,05 mm (tel als 0). De nieuwste dag is meestal eergisteren. Zeg in de melding dat de Rijn vooral door regen in Duitsland en Zwitserland wordt gevoed.

Uitkomst: een melding als "De Rijn bij Lobith staat op 630 cm boven NAP (16 oktober 22:20), 2 cm lager dan gisteren. Dat is lager dan het laagste punt van 2016-2025 (647 cm). Verwachting 18 oktober: 625 cm.", alleen verstuurd als de status verandert (OK naar LET OP, LET OP naar ALERT en terug), plus een kleine webpagina met een grafiek van de laatste 30 dagen en de drempels als horizontale lijnen.

Probeer het zelf

De kern van het project in een klein script. Nodig: Python 3.10+ en requests. Getest op 2026-10-16; hieronder de echte uitvoer van die proefdraai.

# Waterstand-alert: staat de Rijn bij Lobith te hoog of te laag? Plus de neerslag van de afgelopen 30 dagen.
# Bronnen: Rijkswaterstaat Waterwebservices (DDAPI 2.0) en KNMI daggegevens. Geen sleutel nodig.
from datetime import datetime, timedelta, timezone
import requests

UA = {"User-Agent": "mijn-project/1.0 (+jij@voorbeeld.nl)"}
RWS = "https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES"
LOCATIE, NAAM = "lobith.bovenrijn.tolkamer", "Rijn bij Lobith"
# Drempels in cm boven NAP, berekend uit alle tienminutenwaarden 2016-2025 (526.029 waarden, zie stap 4).
DREMPELS = {"zeer laag": 647, "laag": 717, "hoog": 1207, "zeer hoog": 1349}
WT = timezone(timedelta(hours=1))   # de API werkt in vaste +01:00, ook in de zomer

def t(d):   # 2026-10-16T22:20:00.000+01:00
    return d.astimezone(WT).strftime("%Y-%m-%dT%H:%M:%S.000+01:00")

def waarnemingen(proces, begin, eind):
    body = {"Locatie": {"Code": LOCATIE},
            "AquoPlusWaarnemingMetadata": {"AquoMetadata": {"Compartiment": {"Code": "OW"},
                                           "Grootheid": {"Code": "WATHTE"}, "ProcesType": proces}},
            "Periode": {"Begindatumtijd": t(begin), "Einddatumtijd": t(eind)}}
    d = requests.post(f"{RWS}/OphalenWaarnemingen", json=body, headers=UA, timeout=120).json()
    if not d.get("Succesvol"):
        return {}
    uit = {}   # tijdstip -> cm; dubbele reeksen (bij een sensorwissel) vallen zo samen
    for w in d["WaarnemingenLijst"]:
        for m in w["MetingenLijst"]:
            v = m["Meetwaarde"]["Waarde_Numeriek"]
            if v is not None and -999 < v < 5000:   # 999999999 en 9.99999e+37 zijn 'geen waarde'
                uit[datetime.fromisoformat(m["Tijdstip"])] = v
    return dict(sorted(uit.items()))

def oordeel(cm):
    if cm <= DREMPELS["zeer laag"]: return "ALERT: lager dan het laagste punt van 2016-2025"
    if cm <= DREMPELS["laag"]:      return "LET OP: laagwater (laagste 5% van 2016-2025)"
    if cm >= DREMPELS["zeer hoog"]: return "ALERT: hoogwater (hoogste 1% van 2016-2025)"
    if cm >= DREMPELS["hoog"]:      return "LET OP: hoog (hoogste 5% van 2016-2025)"
    return "OK: binnen de normale band"

nu = datetime.now(timezone.utc)
gemeten = waarnemingen("meting", nu - timedelta(hours=48), nu)
laatste_t, laatste = list(gemeten.items())[-1]
dag_eerder = min(gemeten, key=lambda x: abs((laatste_t - x) - timedelta(hours=24)))
verwacht = waarnemingen("verwachting", nu, nu + timedelta(days=4))

print(f"{NAAM}: {laatste:.0f} cm boven NAP om {laatste_t:%d-%m-%Y %H:%M} (+01:00), ongecontroleerd")
print(f"  24 uur eerder: {gemeten[dag_eerder]:.0f} cm, verschil {laatste - gemeten[dag_eerder]:+.0f} cm")
print(f"  laagste en hoogste in 48 uur: {min(gemeten.values()):.0f} en {max(gemeten.values()):.0f} cm")
if verwacht:
    vt, vw = list(verwacht.items())[-1]
    print(f"  verwachting tot {vt:%d-%m %H:%M}: {min(verwacht.values()):.0f} tot {max(verwacht.values()):.0f} cm, eind {vw:.0f} cm")
print(f"  nu: {oordeel(laatste)}")
if verwacht:
    print(f"  eind verwachting: {oordeel(vw)}")

# Neerslag in het eigen land: KNMI-station 275 (Deelen, bij Arnhem), laatste 30 dagen tegen 1991-2020.
def rh(start, eind):
    r = requests.post("https://www.daggegevens.knmi.nl/klimatologie/daggegevens", headers=UA, timeout=120,
                      data={"stns": "275", "vars": "RH", "start": start, "end": eind, "fmt": "json"})
    return [(d["date"][:10], max(d["RH"], 0) / 10) for d in r.json() if d["RH"] is not None]   # tienden mm, -1 = < 0,05 mm

recent = rh(f"{(nu - timedelta(days=40)):%Y%m%d}", f"{nu:%Y%m%d}")[-30:]
som = sum(v for _, v in recent)
dagen = {d[5:] for d, _ in recent}           # dezelfde kalenderdagen in 1991-2020
normaal = rh("19910101", "20201231")
per_jaar = {}
for d, v in normaal:
    if d[5:] in dagen:
        per_jaar[d[:4]] = per_jaar.get(d[:4], 0) + v
gem = sum(per_jaar.values()) / len(per_jaar)
print(f"\nNeerslag Deelen {recent[0][0]} t/m {recent[-1][0]}: {som:.1f} mm, normaal (1991-2020) {gem:.1f} mm ({som / gem:.0%})")
print("Let op: de Rijn bij Lobith hangt vooral af van regen en smeltwater in Duitsland en Zwitserland.")
Uitvoer
Rijn bij Lobith: 630 cm boven NAP om 16-10-2026 22:20 (+01:00), ongecontroleerd
  24 uur eerder: 632 cm, verschil -2 cm
  laagste en hoogste in 48 uur: 628 en 634 cm
  verwachting tot 18-10 06:00: 625 tot 627 cm, eind 625 cm
  nu: ALERT: lager dan het laagste punt van 2016-2025
  eind verwachting: ALERT: lager dan het laagste punt van 2016-2025

Neerslag Deelen 2026-09-15 t/m 2026-10-14: 45.1 mm, normaal (1991-2020) 73.1 mm (62%)
Let op: de Rijn bij Lobith hangt vooral af van regen en smeltwater in Duitsland en Zwitserland.

Waar het misgaat

  • Tijden staan in het antwoord altijd in vaste +01:00, ook in de zomer: 22:20 in de data is in juli 23:20 op de klok. Geef in de aanvraag altijd een tijdzone mee (2026-10-16T22:20:00.000+01:00); zonder tijdzone volgt HTTP 400 met een foutmelding in platte tekst in plaats van JSON.
  • De 'laatste waarneming' is niet altijd de nieuwste: OphalenLaatsteWaarnemingen gaf voor Lobith twaalf WATHTE-reeksen terug, waarvan elf al gestopt (1934 tot 2025). Wie de eerste neemt, meldt een waterstand van 1.016 cm uit 1934. Sorteer op Tijdstip.
  • Afvoer (Q) heeft meerdere naast elkaar lopende reeksen met verschillende rekenregels, losse dagen met afwijkende waarden (237 m³/s op 1 januari 2026, waar de doorlopende reeks rond 1.150 lag) en 9,99999e+37 als 'geen waarde'. Gebruik voor een alert de waterhoogte (WATHTE, één doorlopende reeks) en voor afvoer alleen de reeks 'Debiet uit Q-f relatie (2018)', bij voorkeur BemonsteringsSoort SB.
  • Waterhoogte is geen afvoer en verschilt per plek. 630 cm boven NAP is extreem laag bij Lobith, maar zegt niets over Nijmegen of Deventer. Bereken drempels per meetpunt, en vergelijk over lange periodes liever de afvoer: de bodem van de Rijn is de afgelopen decennia gezakt, dus dezelfde afvoer geeft nu een lagere waterstand.
  • Onze drempels zijn statistisch (percentielen over 2016-2025), geen officiële waarschuwingspeilen. Noem ze in je melding zo, en verwijs voor officiële waarschuwingen naar Rijkswaterstaat en je waterschap.
  • Grote antwoorden: één jaar tienminutenwaarden is 15 MB, omdat elke waarde zijn volledige metadata meekrijgt. Vraag voor een alert alleen de laatste 48 uur (81 kB) en sla je drempels op in plaats van ze elke keer opnieuw te berekenen.

Verder bouwen

  • Meer meetpunten: dezelfde aanroepen werken voor de Maas (maastricht.sintpieter, venlo), de Waal (nijmegen.waal), de IJssel (deventer) en de Nederrijn (arnhem.nederrijn). Laat de gebruiker op een kaart klikken en kies de dichtstbijzijnde locatie met WATHTE uit de catalogus.
  • Laagwater en scheepvaart: schippers rekenen met de diepgang. Zet de waterstand om naar 'zoveel cm lager dan de mediaan' en laat zien hoeveel dagen per jaar Lobith onder de 5%-drempel (717 cm) zat; voor 2018 en 2022 is dat een mooie vergelijking met 2026.
  • Zeespiegel en storm: voor Hoek van Holland of Vlissingen geeft ProcesType astronomisch het getij zonder wind. Het verschil met de meting is de opzet door storm; koppel die aan de wind (FHX, DDVEC) van het KNMI-station aan de kust.
  • Kijk stroomopwaarts: het Duitse PEGELONLINE heeft Emmerich, net boven Lobith. Een stijging daar zie je kort daarna bij Lobith; meet zelf hoeveel uur ertussen zit.

De bronnen2

Waterinfo en Waterwebservices

RijkswaterstaatNederland, meetlocatie, per 10 minuten

De metingen van Rijkswaterstaat in de grote rivieren, de kust en de Noordzee: waterhoogte, afvoer, watertemperatuur, golven en meer. Elke tien minuten een nieuwe waarde, en voor sommige meetpunten een reeks die teruggaat tot 1900. Waterinfo is de website, de Waterwebservices zijn de API erachter.

OpenAPIRealtimeKlimaat en milieu
Actueel
bijgewerkt minder dan een uur geleden

KNMI daggegevens van het weerUitgewerkt

KNMINederland, weerstation

Dagwaarden van ruim vijftig weerstations: temperatuur, neerslag, zon en wind. De reeks van De Bilt begint in 1901.

OpenAPIDownloadKlimaat en milieu
Actueel
bijgewerkt 3 dagen geleden

Meer om te bouwen