Stroomprijzen in Home Assistant
Stroomvoorspeller.nl publiceert een vast JSON-bestand met de day-ahead stroomprijzen van vandaag en morgen, plus een meerdaagse voorspelling. Je leest het rechtstreeks uit met de ingebouwde RESTful sensor van Home Assistant — geen custom integratie, geen account, geen API-sleutel. Kopieer de YAML hieronder, pas eventueel de namen aan, klaar.
De data-URL
Alle waarden staan in één bestand:
https://stroomvoorspeller.nl/data/ha.json
Het bestand wordt een paar keer per dag ververst, telkens als er nieuwe day-ahead data binnenkomt (de prijzen van morgen verschijnen rond 14:00). Het is een statisch bestand achter een CDN, dus je mag het gerust elke 30 minuten ophalen. De prijzen zelf veranderen gedurende de dag niet meer zodra ze bekend zijn.
market is de kale beursprijs (EPEX), zonder belasting of leverancieropslag.
all_in is een indicatieve consumentenprijs: market + gemiddelde leverancieropslag
+ energiebelasting, maal 21% btw. Elk uur én elke dagsamenvatting bevat beide
prijzen, zodat je zelf kiest waar je op stuurt — de kale markt of de all-in prijs. Wil je je
exacte prijs? Gebruik market en tel in Home Assistant je eigen opslag,
belasting en btw erbij op.
Stap voor stap
- Open
configuration.yaml(via de File editor- of Studio Code Server-add-on). - Plak het
rest:-blok hieronder erin. Staat er al eenrest:oftemplate:in je config? Voeg dan alleen de regels eronder toe — niet de sleutel zelf nog een keer. - Controleer je config via Instellingen → Systeem → Herstarten → Configuratie controleren.
- Herstart Home Assistant. De sensoren verschijnen onder Instellingen → Apparaten & services → Entiteiten.
1. De basis: één ophaalactie, meerdere sensoren
Met het top-level rest:-platform haal je het bestand één keer op
en maak je er meteen meerdere sensoren van. Dat is netjes voor de server én voor je setup.
configuration.yaml
rest:
- resource: https://stroomvoorspeller.nl/data/ha.json
scan_interval: 1800 # elke 30 minuten; de data ververst maar enkele keren per dag
sensor:
# Goedkoopste uur van vandaag (tijdstip)
- name: "Stroom goedkoopste uur vandaag"
unique_id: sv_cheapest_today
value_template: "{{ value_json.today.cheapest.start }}"
device_class: timestamp
# Goedkoopste prijs van vandaag (all-in EUR/kWh)
- name: "Stroom goedkoopste prijs vandaag"
unique_id: sv_cheapest_price_today
value_template: "{{ value_json.today.cheapest.all_in }}"
unit_of_measurement: "EUR/kWh"
state_class: measurement
# Daggemiddelde van vandaag (all-in EUR/kWh)
- name: "Stroom gemiddelde vandaag"
unique_id: sv_avg_today
value_template: "{{ value_json.today.average_all_in }}"
unit_of_measurement: "EUR/kWh"
# Aantal negatieve uren morgen (0 als morgen nog niet bekend is)
- name: "Stroom negatieve uren morgen"
unique_id: sv_neg_tomorrow
value_template: "{{ value_json.tomorrow.negative_hours | default(0) }}"
# 'Drager'-sensor: houdt de volledige uurlijsten als attributen vast.
# De template-sensoren hieronder rekenen hierop verder.
- name: "Stroomprijzen data"
unique_id: sv_data
value_template: "{{ value_json.generated }}"
device_class: timestamp
json_attributes:
- today
- tomorrow
- forecastjson_attributes
van een drager-sensor, niet in de state. Dat is precies wat de laatste sensor hierboven doet.
2. De huidige prijs (altijd actueel)
De drager-sensor wordt maar een paar keer per dag opgehaald. Toch wil je een sensor die elk
uur de juiste prijs toont. Dat los je lokaal op met een template-sensor: die
kiest elke minuut het juiste uur uit de attributen — zonder opnieuw te downloaden.
configuration.yaml
template:
- sensor:
- name: "Stroom huidige prijs"
unique_id: sv_now_price
unit_of_measurement: "EUR/kWh"
state: >
{% set hours = state_attr('sensor.stroomprijzen_data', 'today').hours %}
{% set ns = namespace(price='unknown') %}
{% if hours %}
{% for h in hours %}
{% if as_timestamp(h.start) <= as_timestamp(now()) < as_timestamp(h.start) + 3600 %}
{% set ns.price = h.all_in %}
{% endif %}
{% endfor %}
{% endif %}
{{ ns.price }}
- name: "Stroom huidige prijs (markt)"
unique_id: sv_now_price_market
unit_of_measurement: "EUR/kWh"
state: >
{% set hours = state_attr('sensor.stroomprijzen_data', 'today').hours %}
{% set ns = namespace(price='unknown') %}
{% if hours %}
{% for h in hours %}
{% if as_timestamp(h.start) <= as_timestamp(now()) < as_timestamp(h.start) + 3600 %}
{% set ns.price = h.market %}
{% endif %}
{% endfor %}
{% endif %}
{{ ns.price }}h.all_in
door een eigen berekening op h.market, bijvoorbeeld:
{{ (h.market + 0.0182 + 0.0916) * 1.21 }} waarbij 0.0182 de
leverancieropslag van jóuw contract is (incl. btw delen door 1,21 als je excl. btw rekent).
3. Voorbeeld-automatiseringen
Apparaat starten op het goedkoopste uur van de dag
alias: Wasmachine op goedkoopste uur
trigger:
# Elk heel uur kijken of dit hét goedkoopste uur van vandaag is.
- platform: time_pattern
minutes: "0"
condition:
- condition: template
value_template: >
{{ now().strftime('%Y-%m-%dT%H') ==
as_timestamp(state_attr('sensor.stroomprijzen_data', 'today').cheapest.start)
| timestamp_custom('%Y-%m-%dT%H', true) }}
action:
- service: switch.turn_on
target:
entity_id: switch.wasmachineEV alleen laden als de prijs onder 15 ct/kWh ligt
alias: EV laden bij lage prijs
trigger:
- platform: state
entity_id: sensor.stroom_huidige_prijs
condition:
- condition: numeric_state
entity_id: sensor.stroom_huidige_prijs
below: 0.15
action:
- service: switch.turn_on
target:
entity_id: switch.laadpaalMelding bij negatieve prijzen morgen
alias: Melding negatieve stroomprijs morgen
trigger:
- platform: numeric_state
entity_id: sensor.stroom_negatieve_uren_morgen
above: 0
action:
- service: notify.mobile_app_jouw_telefoon
data:
title: "Gratis stroom morgen ⚡"
message: >
Morgen zijn er {{ states('sensor.stroom_negatieve_uren_morgen') }}
uren met een negatieve marktprijs.Welke waarden kun je ophalen?
Dit zijn de meest gebruikte velden. Het pad begint telkens met value_json. (in een RESTful sensor) of je leest het uit de attributen van de drager-sensor.
| Pad | Betekenis | Voorbeeld |
|---|---|---|
today.cheapest.start | Begintijd goedkoopste uur vandaag | 2026-04-30T10:00:00+02:00 |
today.cheapest.all_in | All-in prijs op dat uur (EUR/kWh) | 0.1298 |
today.most_expensive.start | Begintijd duurste uur vandaag | 2026-04-30T19:00:00+02:00 |
today.average_all_in | Daggemiddelde all-in (EUR/kWh) | 0.2054 |
today.average_market | Daggemiddelde marktprijs (EUR/kWh) | 0.0604 |
today.negative_hours_market | Aantal uren met negatieve marktprijs ('gratis stroom') | 1 |
today.negative_hours_all_in | Aantal uren met negatieve consumentenprijs (incl. belasting) | 0 |
today.hours[].market / .all_in | Volledige uurlijst (24 stuks) | array |
tomorrow.available | true zodra de prijzen van morgen bekend zijn (~14:00) | true / false |
tomorrow.cheapest.start | Goedkoopste uur morgen | 2026-05-01T04:00:00+02:00 |
forecast.days[].average_market_estimate | Verwacht daggemiddelde (indicatief) | 0.0603 |
forecast.days[].negative_probability | Ruwe kans op negatieve uren (0–1) | 0.29 |
De volledige structuur staat beschreven in het JSON Schema. Het databestand zelf kun je hier bekijken: /data/ha.json.
Over de voorspelling: gebruik 'm met mate
forecast-blok is een modelvoorspelling met onzekerheid, geen
zekerheid. Bouw automatiseringen die op exacte prijzen rekenen daarom op today en —
na ongeveer 14:00 — tomorrow; dat zijn harde day-ahead prijzen. Gebruik
forecast alleen voor losse planning, bijvoorbeeld "wordt het later deze week
goedkoper?". Lees meer op Over de voorspelling.
Open data & bron
De feed is vrij te gebruiken onder CC-BY 4.0 — vermeld stroomvoorspeller.nl als bron. Onderliggende prijzen: ENTSO-E day-ahead (EPEX Spot, NL-biedzone). De voorspelling gebruikt Open-Meteo (weer) en TTF-gasprijzen.
Bouw je iets leuks met deze feed, of mis je een waarde? Laat het weten via contactstroomvoorspeller@gmail.com — ik hoor graag wat je ermee maakt.