NL Weather Integration (forecast, observations, rain radar and warnings)

Sorry to break this, it’s you.
You really have to get separate keys, or it won’t connect indeed.
Check the manual, it’s three different services

I have the same problem as @JohnTazzy: I requested API keys for the 3 different services and always got the same one, both displayed on the website and sent to m email.
I guess there’s something wrong on KNMI’s side, I’ll contact them and see if they can help.

Please check very carefully. The beginning and end of the keys are the same, but the middle is different.

The reason why the keys are similar is because it’s a base64 encoded JSON string. This results in the same start and end of the key, but the middle will be different. Check if you like.

2 Likes

Thanks, you’re right! It works now :partying_face:

Then I honestly don’t understand why the first time I tried copy-pasting each single API key into its field it didn’t work, which is the reason I ended up here… :man_shrugging:

Great stuff, thank you very much!

I’m still a HA novice and can’t get the radar chart to show permanently on the dashboard. In my dashboard I see a tile with the name, image and status Inactive. Only when I click on it, the radar shows. Could you tell me how to show it permanently on the dashboard? Thanks in advance.

Hmm… not sure what’s happening. The radar is a camera entity meant for security camera’s. Abusing it here for an animated gif of a radar.

To show it, you need to add a “Picture with entity” card on your dashboard. Add the camera.neerslag_radar entity in both places, and remove the image. You can play around with the other settings yourself. See the screenshot:

This is my raw yaml config for the dashboard card:

-  type: picture-entity
   show_state: false
   show_name: true
   camera_view: auto
   fit_mode: contain
   entity: camera.neerslag_radar
   name: Neerslagradar
   camera_image: camera.neerslag_radar

What does “exceptional” mean as “waarneming”?

It’s not exceptionally good or bad outside or so…

Good question! I think I made a mistake there. The weather condition (“exceptional”) in question is defined here in the code.

The weather code come from this table in the KNMI Handboek Waarnemingen. When looking at Table 6 there, code 4 and 5 are defined as “Heiigheid of rook, of stof zwevend in de lucht”.

I think I’ll list them under Fog. But then (as I do with the other Fog codes) look at the actual visibility range before declaring it as Fog. Only when visibility drops below 1000 meters it’s fog, above it’s mist (the English word, not the Dutch).

Hi Paul,

Is it possible to add only the web map api and EDR api to get the integration configured?
I am looking for a lightweight option the only use the web map api and EDR api to display the awesome darkmode map on my dashboard.

Great work!

Nope, that’s not possible. The Notification Service is actually used to know when a new radar image has been added to WMS or a new observation has been added to the EDR API. Otherwise I would need to poll these APIs for updates.

The Notification Service is just a MQTT https websocket connection. It’s lightweight. What concern do you have?

1 Like

Ok, understood but still a weird condition given the actual conditions outside yesterday :smile:

Then, as a feature request: I think it would be great if the waarnemingen could be split out it separate sensors - that makes it way easier to use the data in the rest of HomeAssistant. I know that “you can do this with template sensors”, but that’s for sure not very starter friendly - it would be great if this just works out of the box.

Example from the Weerlive.nl/KNMI custom component:

I’ve tried to answer why I think this is not a good idea in this github issue. Long story short: I think it should be a HA core functionality to easily create sensors out of weather variables or forecast items. It becomes messy if each weather integration creates all these sensors themselves.

Yeah, I got a notification of your reply and answered.

The thing is: I tend to agree, but it’s simply not the design choice the HA Core team has made… Creating the sensors is possible, but only with rather noob-unfriendly trigger-based template sensors.

How difficult can we make getting a temperature sensor (example) in HA - if you need to create a template sensor to do this… That’s crazy.

But, as replied in the PR, I think that these specific sensors are most commonly available in the weather integrations.


Other thought by the way; it’s a bit unfortunate that there’s a custom_component out there that has KNMI as name but is actually using the WeerLive API, and not the KNMI API directly… Your component is the only one actually connecting to the KNMI directly, as far as I know

@PaulVanSchayck Not sure if this is related to one of my changes, or an API outage? I actually don’t think that my changes (that I’m running locally) caused this, but you might be able to verify :slight_smile:

2026-02-09 08:19:41.413 ERROR (MainThread) [aiohttp.server] Error handling request from 172.19.0.3
Traceback (most recent call last):
  File "/usr/local/lib/python3.13/site-packages/aiohttp/web_protocol.py", line 510, in _handle_request
    resp = await request_handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/aiohttp/web_app.py", line 569, in _handle
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/aiohttp/web_middlewares.py", line 117, in impl
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 92, in security_filter_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 214, in forwarded_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 26, in request_context_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 86, in ban_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 242, in auth_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 41, in headers_middleware
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/http.py", line 73, in handle
    result = await handler(request, **request.match_info)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 807, in get
    return await self.handle(request, camera)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 825, in handle
    image = await _async_get_image(
            ^^^^^^^^^^^^^^^^^^^^^^^
    ...<4 lines>...
    )
    ^
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 194, in _async_get_image
    else await camera.async_camera_image(width=width, height=height)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/nl_weather/camera.py", line 242, in async_camera_image
    was_updated = await self.__retrieve_radar_image(self._last_modified)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/nl_weather/camera.py", line 180, in __retrieve_radar_image
    radar_images = await asyncio.gather(*fetch)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/nl_weather/camera.py", line 161, in fetch_realtime_with_time
    return t, await self._wms.radar_real_time_image(
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<4 lines>...
    )
    ^
  File "/config/custom_components/nl_weather/KNMI/wms.py", line 67, in radar_real_time_image
    return await self.get(params)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/nl_weather/KNMI/wms.py", line 40, in get
    raise NotFoundError("No data found for query") from None
custom_components.nl_weather.KNMI.wms.NotFoundError: No data found for query
2026-02-09 08:19:41.536 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&TIME=2026-02-09T07:00:00%2B00:00&DATASET=nl_rdr_data_rtcor_5m&LAYERS=precipitation_real_time&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:41.550 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&TIME=2026-02-09T06:10:00%2B00:00&DATASET=nl_rdr_data_rtcor_5m&LAYERS=precipitation_real_time&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:41.655 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T07:20:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:41.696 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&TIME=2026-02-09T06:30:00%2B00:00&DATASET=nl_rdr_data_rtcor_5m&LAYERS=precipitation_real_time&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:41.707 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&TIME=2026-02-09T06:40:00%2B00:00&DATASET=nl_rdr_data_rtcor_5m&LAYERS=precipitation_real_time&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:41.761 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T07:30:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:41.764 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&TIME=2026-02-09T06:50:00%2B00:00&DATASET=nl_rdr_data_rtcor_5m&LAYERS=precipitation_real_time&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:41.863 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T08:00:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:41.874 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T07:10:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:42.015 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T08:10:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:42.030 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T08:30:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:42.073 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T07:50:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:42.094 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T07:40:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:42.117 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T08:40:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:42.159 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 429): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T09:00:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:42.203 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T08:20:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:42.256 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T08:50:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000
2026-02-09 08:19:42.307 DEBUG (MainThread) [custom_components.nl_weather.KNMI.wms] Called WMS endpoint (status: 404): https://api.dataplatform.knmi.nl/wms/adaguc-server?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&FORMAT=image/png&TRANSPARENT=TRUE&CRS=EPSG:3857&DIM_REFERENCE_TIME=2026-02-09T07:10:00%2B00:00&TIME=2026-02-09T09:10:00%2B00:00&DATASET=radar_forecast_2.0&LAYERS=precipitation_nowcast&STYLES=rainrate-blue-to-purple/nearest&WIDTH=1208&HEIGHT=1208&BBOX=0.0,6300000,1000000,7300000

edit: yeah, running vanilla 0.5.1 also gives me this error. Something changed serverside?

edit 2:

AH - it’s always DNS :slight_smile: