Stroomprijzen in Home Assistant

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.

Twee prijzen per uur, beide in EUR/kWh. 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

  1. Open configuration.yaml (via de File editor- of Studio Code Server-add-on).
  2. Plak het rest:-blok hieronder erin. Staat er al een rest: of template: in je config? Voeg dan alleen de regels eronder toe — niet de sleutel zelf nog een keer.
  3. Controleer je config via Instellingen → Systeem → Herstarten → Configuratie controleren.
  4. 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 - forecast
Belangrijk: de state van een sensor moet een korte, enkele waarde zijn (getal of tekst). De volledige uurlijst van 24 prijzen hoort daarom in de json_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 }}
Wil je je eigen exacte tarief? Vervang in de eerste sensor 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.wasmachine

EV 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.laadpaal

Melding 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.

PadBetekenisVoorbeeld
today.cheapest.startBegintijd goedkoopste uur vandaag2026-04-30T10:00:00+02:00
today.cheapest.all_inAll-in prijs op dat uur (EUR/kWh)0.1298
today.most_expensive.startBegintijd duurste uur vandaag2026-04-30T19:00:00+02:00
today.average_all_inDaggemiddelde all-in (EUR/kWh)0.2054
today.average_marketDaggemiddelde marktprijs (EUR/kWh)0.0604
today.negative_hours_marketAantal uren met negatieve marktprijs ('gratis stroom')1
today.negative_hours_all_inAantal uren met negatieve consumentenprijs (incl. belasting)0
today.hours[].market / .all_inVolledige uurlijst (24 stuks)array
tomorrow.availabletrue zodra de prijzen van morgen bekend zijn (~14:00)true / false
tomorrow.cheapest.startGoedkoopste uur morgen2026-05-01T04:00:00+02:00
forecast.days[].average_market_estimateVerwacht daggemiddelde (indicatief)0.0603
forecast.days[].negative_probabilityRuwe 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

Het 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.