Buienradar API

In 2021 heb ik een tutorial gemaakt om Buienradar met Domoticz te verbinden. Tegenwoordig stellen de meeste commerciële weerwebsites een API beschikbaar waarmee je je eigen programma's met de gemeten informatie van de weersites kan voorzien. Weliswaar zijn hier wat voorwaarden aan verbonden, maar voor persoonlijk en non-commercieel gebruik en lichte toepassingen is dit kosteloos.   

In deze tutorial laat ik je zien hoe eenvoudig het is om de basis weerinformatie via een door Buienradar beschikbaar gestelde API van de Buienradar webserver te halen.

Wat is een API?

Een API staat voor Application Programming Interface. Het is een digitale koppeling waarmee verschillende softwareprogramma’s of apps met elkaar kunnen communiceren en gegevens kunnen uitwisselen. Het is dus een digitale brug tussen twee verschillende softwareprogramma’s. Het zorgt ervoor dat systemen automatisch en veilig data met elkaar kunnen uitwisselen, zonder dat je handmatig gegevens hoeft over te typen

Daar gaan we…


Bibliotheek laden

Als eerste zal de Raspberry Pi voorzien moeten zijn van de Request bibliotheek. Met Requests kun je HTTP/1.1-verzoeken extreem eenvoudig versturen. Je hoeft niet handmatig query strings aan je URL’s toe te voegen of je data te coderen met form-encode PUT— POST, maar gebruik tegenwoordig gewoon de jsonmethode! Als je je Raspberry Pi regelmatig update/upgrade zal de bibliotheek waarschijnlijk al geïnstalleerd zijn.

De bibliotheek installeer je met het volgende commando in de terminal.

pip3 install requests

Koppeling maken met de API

Onderstaand script haalt actuele weerdata op via de gratis JSON-feed van Buienradar (data.buienradar.nl/2.0/feed/json)

Open je favoriete editor, maak een bestand aan zoals buienradar.py, plak onderstaand script erin en sla het op.

Je kunt het script op de volgende manier opstarten:

python3 buienradar.py # dichtstbijzijnd/eerste station
python3 buienradar.py --station 6275 # specifiek station (bv. Arnhem)
python3 buienradar.py --lat 52.0 --lon 5.9 # dichtstbijzijnde bij coördinaten
python3 buienradar.py --loop 300 # elke 5 minuten herhalen

Onder het script is een overzicht van het stationID, breedtegraad, lengtegraad en locatie

De code

#!/usr/bin/env python3

import argparse
import json
import math
import sys
import time
from datetime import datetime

try:
    import requests
except ImportError:
    print("De module 'requests' ontbreekt. Installeer met: pip3 install requests")
    sys.exit(1)

BUIENRADAR_URL = "https://data.buienradar.nl/2.0/feed/json"


def haal_data_op():
    """Haal de volledige Buienradar feed op als Python-dict."""
    response = requests.get(BUIENRADAR_URL, timeout=10)
    response.raise_for_status()
    return response.json()


def haversine(lat1, lon1, lat2, lon2):
    """Bereken de afstand in km tussen twee coördinaten."""
    r = 6371.0
    dlat = math.radians(lat2 - lat1)
    dlon = math.radians(lon2 - lon1)
    a = (
        math.sin(dlat / 2) ** 2
        + math.cos(math.radians(lat1))
        * math.cos(math.radians(lat2))
        * math.sin(dlon / 2) ** 2
    )
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
    return r * c


def vind_station(data, station_id=None, lat=None, lon=None):
    """
    Zoek een specifiek station op ID, of het dichtstbijzijnde station
    bij opgegeven coördinaten. Zonder opties wordt het eerste station
    uit de lijst gebruikt.
    """
    stations = data["actual"]["stationmeasurements"]

    if station_id is not None:
        for s in stations:
            if s["stationid"] == station_id:
                return s
        raise ValueError(f"Station met ID {station_id} niet gevonden.")

    if lat is not None and lon is not None:
        dichtstbij = min(
            stations,
            key=lambda s: haversine(lat, lon, s["lat"], s["lon"]),
        )
        return dichtstbij

    return stations[0]


def toon_station(s):
    """Print de belangrijkste gegevens van een station leesbaar."""
    print("=" * 50)
    print(f"Station: {s.get('stationname', 'onbekend')} (ID: {s.get('stationid')})")
    print(f"Tijdstip: {s.get('timestamp')}")
    print("-" * 50)
    print(f"Temperatuur:        {s.get('temperature')} °C")
    print(f"Gevoelstemperatuur: {s.get('feeltemperature')} °C")
    print(f"Luchtvochtigheid:   {s.get('humidity')} %")
    print(f"Luchtdruk:          {s.get('airpressure')} hPa")
    print(f"Windrichting:       {s.get('winddirection')}")
    print(f"Windsnelheid:       {s.get('windspeed')} m/s (Bft {s.get('windspeedBft')})")
    print(f"Windstoten:         {s.get('windgusts')} m/s")
    print(f"Neerslag (huidig):  {s.get('precipitation')} mm/u")
    print(f"Neerslag vandaag:   {s.get('sunpower') and s.get('rainFallLastHour')}")
    print(f"Zicht:              {s.get('visibility')} m")
    print(f"Weerbeschrijving:   {s.get('weatherdescription')}")
    print("=" * 50)


def main():
    parser = argparse.ArgumentParser(
        description="Lees actuele weergegevens van Buienradar uit."
    )
    parser.add_argument("--station", type=int, help="Stationnummer (bv. 6275 De Bilt)")
    parser.add_argument("--lat", type=float, help="Breedtegraad voor dichtstbijzijnd station")
    parser.add_argument("--lon", type=float, help="Lengtegraad voor dichtstbijzijnd station")
    parser.add_argument("--json", action="store_true", help="Toon ruwe JSON van het station")
    parser.add_argument(
        "--loop",
        type=int,
        default=0,
        help="Herhaal elke N seconden (0 = eenmalig ophalen)",
    )
    args = parser.parse_args()

    while True:
        try:
            data = haal_data_op()
            station = vind_station(data, args.station, args.lat, args.lon)

            if args.json:
                print(json.dumps(station, indent=2, ensure_ascii=False))
            else:
                toon_station(station)

        except requests.exceptions.RequestException as e:
            print(f"[{datetime.now()}] Fout bij ophalen van data: {e}")
        except ValueError as e:
            print(f"[{datetime.now()}] {e}")
            break

        if args.loop <= 0:
            break

        time.sleep(args.loop)


if __name__ == "__main__":
    main()

Optioneel: als je het script als achtergronddienst op de Raspberry Pi wilt draaien met systemd

1. Zet dit script op bv. /home/pi/buienradar.py
2. Maak /etc/systemd/system/buienradar.service met inhoud:

   [Unit]
   Description=Buienradar uitlezer
   After=network-online.target

   [Service]
   ExecStart=/usr/bin/python3 /home/pi/buienradar.py --loop 300
   Restart=always
   User=pi

   [Install]
   WantedBy=multi-user.target

 3. Activeer met:
      sudo systemctl daemon-reload
      sudo systemctl enable --now buienradar.service
      sudo systemctl status buienradar.service

StationID breedtegraad, lengtegraad locatie
6215 52.12,04.43 Voorschoten
6225 52.47,04.57 IJmuiden
6229 53.00,04.75 Texelhors
6235 52.92,04.78 Den Helder
6239 54.85,04.73 Zeeplatform F-3″
6240 52.30,04.77 Schiphol
6242 53.25,04.92 Vlieland
6248 52.63,05.17 Wijdenes
6249 52.65,04.98 Berkhout
6251 53.38,05.35 Hoorn Terschelling
6252 53.22,03.22 Zeeplatform K13
6257 52.50,04.60 Wijk aan Zee
6258 52.65,05.40 Houtribdijk
6260 52.10,05.18 De Bilt
6267 52.88,05.38 Stavoren
6269 52.45,05.53 Lelystad
6270 53.22,05.77 Leeuwarden
6273 52.70,05.88 Marknesse
6275 52.07,05.88 Arnhem
6277 53.42,06.20 Lauwersoog
6278 52.43,06.27 Heino
6279 52.73,06.52 Hoogeveen
6280 53.13,06.58 Groningen
6283 52.07,06.65 Groenlo-Hupsel
6285 53.57,06.40 Huibertgat
6286 53.20,07.15 Beerta

6290 52.27,06.90 Twente
6308 51.38,03.38 Cadzand
6310 51.45,03.60 Vlissingen
6311 51.37,03.66 Hoofdplaat — Down ?
6312 51.46,03.62 Oosterschelde
6313 51.50,03.25 Vlakte aan de Raa
6315 51.45,04.00 Hansweert
6316 51.65,03.70 Schaar
6319 51.23,03.83 Westdorpe
6320 51.93,03.67 LE Goeree
6321 52.00,03.28 Euro platform
6323 51.53,03.90 Goes
6324 51.60,04.00 Stavenisse
6330 51.98,04.10 Hoek van Holland
6331 51.52,04.13 Tholen
6340 51.45,04.33 Woensdrecht
6343 51.88,04.32 Rotterdam Geulhaven
6344 51.95,04.45 Rotterdam
6348 51.97,04.93 Lopik-Cabauw
6350 51.57,04.93 Gilze Rijen
6356 51.87,05.15 Herwijnen
6370 51.45,05.42 Eindhoven
6375 51.65,05.70 Volkel
6377 51.20,05.77 Ell

6380 50.92,05.78 Maastricht
6391 51.50,06.20 Arcen

Het resultaat

Hieronder staat het resultaat dat in mijn terminal te zien is na het starten van het script.

==================================================
Station: Meetstation Arnhem (ID: 6275)
Tijdstip: 2026-08-23T12:10:00
Temperatuur: 18.6 °C
Gevoelstemperatuur: 18.6 °C
Luchtvochtigheid: 49.0 %
Luchtdruk: 1024.6 hPa
Windrichting: NW
Windsnelheid: 4.6 m/s (Bft 3)
Windstoten: 7.7 m/s
Neerslag (huidig): 0.0 mm/u
Neerslag vandaag: 0.0
Zicht: 44300.0 m
Weerbeschrijving: Zwaar bewolkt

Conclusie

Het gebruik van de API van Buienradar is eenvoudig toe te passen om de basis weersinformatie van de webserver uit te kunnen lezen. Naast dat het gebruik laagdrempelig is, is het nog gratis ook. Bovendien is het een leuke aanvulling op je domotica. Doe er je voordeel mee!

Have A Nice Day!

Geef als eerste een reactie

Laat een reactie achter

Het e-mailadres wordt niet gepubliceerd.


*