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.
Thanks, you’re right! It works now ![]()
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… ![]()
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
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?
Ok, understood but still a weird condition given the actual conditions outside yesterday ![]()
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 ![]()
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 ![]()
Ok, I think you convinced me
It’s probably better to create the most common sensors by default. I want to see if I can combine some of the ideas with the confusion of having observations and forecasts in the same service (this issue). Give me a bit of time to think this over some more.
The KNMI APIs I’m using (EDR, WMS, Notification Service, App) weren’t available when that integration was started.
I need to handle this failure a bit better. It’s caused (I think) by assuming a radar image is always available via WMS from the last 5 minutes. After initial startup it uses the Notification Service, but during startup it makes this assumption. I need to do the same as with the EDR API and do a call to the metadata endpoint (GetCapabilities in case of WMS), and figure out the latest endpoint. Will create an issue/PR for this.
Thanks to @Hmmbob work and input, this functionality has now been included in version 0.6.0.
Thanks a lot to you both!
just to check, i’m seeing some stuff in my logs that i can’t relate:
2026-03-02 09:03:38.981 ERROR (MainThread) [custom_components.nl_weather.KNMI.notification_service] Error handling notification message for 10-minute-in-situ-meteorological-observations: max() iterable argument is empty
2026-03-02 09:04:10.549 ERROR (MainThread) [custom_components.nl_weather.KNMI.notification_service] Error handling notification message for 10-minute-in-situ-meteorological-observations: max() iterable argument is empty
anyone has the same?
Most likely a hick up with the KNMI API output. Did it recover afterwards?
Check the Observation Time sensor around that time, and check if you see anything abnormal. You can also check your Station Name sensor.
I don’t see the error myself, if you send me the Station Name output around that time I can further debug it. I can see where in the code this error originates from, but it helps to reproduce it from the actual data. The KNMI EDR API also allows to fetch historic observations, so I can replay the data
I’ll have alook later, it seemed pretty persistant
Seems to be gone, let’s get on with life



