Taal

Home Assistant · stroomprijs en CO2

Twee gelijkwaardige manieren om prijs- en CO2-data in Home Assistant te krijgen

Voor Energy Price Forecast EU zijn er twee volledig ondersteunde manieren om naar Home Assistant te gaan: een native HACS-integratie die je via de interface instelt, of een klassiek YAML-pakket met REST-sensor. Beide gebruiken dezelfde API en leveren actuele waarden, lopende toestanden en de belangrijkste tijdvensters.

Welke weg past bij jou?

Beide manieren gebruiken hetzelfde summary-endpoint en leveren inhoudelijk dezelfde data. Het verschil zit in het instellen en het onderhoud.

Open-source repository van de HACS-integratie: github.com/BackupBaTTerY/energypriceforecast-home-assistant. Beide manieren kunnen ook naast elkaar draaien, zolang je niet twee keer dezelfde entity-ID's aanmaakt.

Gratis starten, optioneel verder vooruit plannen

De koppeling met Home Assistant blijft zonder API-key bruikbaar en levert doorgaans tot 48 uur. Wil je grotere verbruikers over meerdere dagen plannen, dan kun je Private Pro met tot 120 uur 14 dagen gratis proberen.

Belangrijke API-opmerking

Nieuwe installaties gebruiken het best https://api.energypriceforecast.eu/api/v1/... als adres. De summary-API levert geen volledige prijsreeks, maar een compact automatiseringsblok met de actuele prijs, de actuele CO2-waarde, het best mogelijke venster en meta-informatie over je toegang.

Zo stel je de HACS-integratie in

De integratie staat in de standaard HACS-store, dus je hoeft niets handmatig toe te voegen.

  1. Zoek in HACS naar “Energy Price Forecast EU” en download de integratie; start Home Assistant daarna opnieuw.
  2. Instellingen → Apparaten & diensten → Integratie toevoegen, zoek naar “Energy Price Forecast EU” en kies je markt plus eventuele opties.

De knop bovenaan (“HACS-integratie toevoegen”) opent de integratie direct in HACS als HACS al is geïnstalleerd.

Voorspelling vergelijken met gepubliceerde prijzen

Groen toont de gepubliceerde day-ahead-prijzen, oranje de actuele voorspelling en de blauwe stippellijn de eerst opgeslagen voorspelling. Zodra officiële prijzen verschijnen, blijft de eerdere voorspelling zichtbaar ter vergelijking.

  1. Werk Energy Price Forecast EU in HACS bij naar minimaal 1.12.0 en herstart Home Assistant. Installeer ook ApexCharts Card vanaf 2.1.0 via HACS.
  2. Vervang alle drie sensor.CHANGE_ME door dezelfde prijsreeks-entiteit uit Ontwikkelaarstools → Statussen. Gebruik voor je ingestelde all-in prijs de entiteit Huidige consumentenprijs. Plak de YAML onder Dashboard → Bewerken → Kaart toevoegen → Handmatig.

Het opslaan begint pas na deze update en overleeft herstarts. Waarden blijven bewaard tot de betreffende marktdag eindigt; eerdere voorspellingen worden niet achteraf aangemaakt. captured_at is het ontvangsttijdstip in Home Assistant, niet de modelrun. Dit is geen kwaliteitsmeting met een vaste vooruitkijktijd en geen onbeperkt archief.

Laat de as-eenheid overeenkomen met de sensor, bijvoorbeeld EUR/kWh en niet ct/kWh. Een berekende all-in prijs is geen gegarandeerde rekening. Zonder sleutel blijft de API-horizon maximaal 48 uur; gebruik voor maximaal 120 uur de juiste toegang en graph_span: 6d. Deze kaart is voor de HACS-integratie, niet voor het REST-summary-voorbeeld hieronder, en doet geen extra API-aanvragen.

YAML om te kopiëren
type: custom:apexcharts-card
header:
  show: true
  title: Energy Price Forecast EU
graph_span: 3d
span:
  start: day
now:
  show: true
  label: Nu
yaxis:
  - id: price
    decimals: 3
    apex_config:
      title:
        text: EUR/kWh
all_series_config:
  yaxis_id: price
  type: line
  curve: stepline
  extend_to: false
  stroke_width: 2
  float_precision: 4
  show:
    legend_value: false
series:
  # Replace ALL three placeholders with the SAME price or retail sensor.
  - entity: sensor.CHANGE_ME
    name: Officieel (day-ahead)
    color: "#43a047"
    data_generator: |
      const raw = [...(entity.attributes.raw_today ?? []),
                   ...(entity.attributes.raw_tomorrow ?? [])];
      const slots = raw.map(e => ({
        start: Date.parse(e.start), end: Date.parse(e.end), value: e.value
      })).filter(e => Number.isFinite(e.start) && Number.isFinite(e.end)
        && e.end > e.start && typeof e.value === 'number' && Number.isFinite(e.value))
        .sort((a, b) => a.start - b.start);
      const points = [];
      let previousEnd = null;
      for (const slot of slots) {
        if (previousEnd !== null && slot.start > previousEnd) {
          points.push([previousEnd, null], [slot.start - 1, null]);
        }
        points.push([slot.start, slot.value], [slot.end - 1, slot.value]);
        previousEnd = slot.end;
      }
      return points;
  - entity: sensor.CHANGE_ME
    name: Actuele voorspelling
    color: "#fb8c00"
    data_generator: |
      const raw = entity.attributes.raw_forecast ?? [];
      const slots = raw.map(e => ({
        start: Date.parse(e.start), end: Date.parse(e.end), value: e.value
      })).filter(e => Number.isFinite(e.start) && Number.isFinite(e.end)
        && e.end > e.start && typeof e.value === 'number' && Number.isFinite(e.value))
        .sort((a, b) => a.start - b.start);
      const points = [];
      let previousEnd = null;
      for (const slot of slots) {
        if (previousEnd !== null && slot.start > previousEnd) {
          points.push([previousEnd, null], [slot.start - 1, null]);
        }
        points.push([slot.start, slot.value], [slot.end - 1, slot.value]);
        previousEnd = slot.end;
      }
      return points;
  - entity: sensor.CHANGE_ME
    name: Opgeslagen voorspelling (eerst ontvangen)
    color: "#1e88e5"
    stroke_dash: 5
    data_generator: |
      const raw = entity.attributes.raw_forecast_reference ?? [];
      const slots = raw.map(e => ({
        start: Date.parse(e.start), end: Date.parse(e.end), value: e.value
      })).filter(e => Number.isFinite(e.start) && Number.isFinite(e.end)
        && e.end > e.start && typeof e.value === 'number' && Number.isFinite(e.value))
        .sort((a, b) => a.start - b.start);
      const points = [];
      let previousEnd = null;
      for (const slot of slots) {
        if (previousEnd !== null && slot.start > previousEnd) {
          points.push([previousEnd, null], [slot.start - 1, null]);
        }
        points.push([slot.start, slot.value], [slot.end - 1, slot.value]);
        previousEnd = slot.end;
      }
      return points;
Optioneel: kaart aanpassen met AI
Help me een ApexCharts-kaart voor Energy Price Forecast EU aan te passen. Vraag eerst naar mijn exacte entity-ID, sensoreenheid, integratieversie, uur-/kwartierafrekening en of ik markt- of all-in prijzen wil. Vraag niet om een API-sleutel.
Vanaf integratie 1.12.0 leveren Prijsreeks en Huidige consumentenprijs:
- raw_today en raw_tomorrow: gepubliceerde day-ahead-tijdvakken.
- raw_forecast: actuele voorspellingen buiten de officiële dekking.
Deze lijsten bevatten {start, end, value}.
- raw_forecast_reference: {start, end, value, captured_at}; de eerst ontvangen voorspelling voor een toen toekomstig tijdvak, lokaal opgeslagen. Latere voorspellingen en officiële prijzen overschrijven deze niet.
Referenties ontstaan pas na de update, overleven herstarts en worden na de betreffende marktdag verwijderd. captured_at is de HA-ontvangsttijd, niet de modelaanmaaktijd.
Toon officiële prijzen groen, actuele voorspellingen oranje en opgeslagen voorspellingen blauw gestippeld op dezelfde as in de sensoreenheid. Vereis ApexCharts Card vanaf 2.1.0. Gebruik per reeks data_generator en extend_to: false. Teken start tot end, behoud gaten met null en echte nul-/negatieve prijzen. Kopieer geen officiële waarden naar een voorspellingslijn. Gebruik alleen de beschreven attributen.
Vraag eventueel naar het uren-/weekendplan: hours bevat {start, end, average_value}. Markeer die tijden apart zonder het plan te veranderen. Lever volledige YAML voor een handmatige Lovelace-kaart en leg uit waar ik die plak. Een grafiek alleen schakelt geen laadpaal.

In 5 minuten resultaat (YAML-pakket)

Heb je voor de YAML-weg gekozen, neem dan deze drie bestanden. Het pakketbestand haalt de data op, de Lovelace-kaart toont ze en de voorbeeldautomatisering laat het eigenlijke gebruik zien.

Bewust eenvoudigHet pakketbestand gebruikt alleen het summary-endpoint. Geen HACS, geen add-on, geen Python-script nodig.
Al bedoeld voor echte sturingBelangrijk zijn hier niet alleen starttijden, maar ook toestanden zoals is_cheapest_window_now en de resterende minuten.
Servervriendelijk ophalenHet voorbeeld haalt standaard elke 30 minuten data op. Voor day-ahead plus voorspelling is dat normaal ruim voldoende.

Zo ziet het resultaat eruit

Voorbeeld van een Lovelace-kaart met actuele prijs, CO2-waarde en prijsvensters.
De Lovelace-kaart toont direct de entiteiten uit het pakketbestand, zonder dat je eerst eigen dashboards hoeft te bouwen.
Voorbeeld van een eenvoudige Home Assistant-automatisering met een trigger op het goedkoopste prijsvenster.
De voorbeeldautomatisering begint bewust eenvoudig en is daarna om te bouwen naar laadpaal, warmtepomp of schakelaar.

Zo voeg je het pakket toe

  1. Download het pakketbestand en sla het op als /config/packages/energypriceforecast.yaml.
  2. Zijn packages nog niet ingeschakeld, vul dan configuration.yaml aan met dit blok.
  3. Laad Home Assistant opnieuw of start één keer opnieuw op.
  4. Importeer daarna de Lovelace-kaart en eventueel de voorbeeldautomatisering.
homeassistant:
  packages: !include_dir_named packages

De Lovelace-kaart voeg je in een dashboard toe via Handmatig als kaarttype. De automatisering kun je bij de automatiseringen ook als YAML importeren of gewoon als sjabloon overnemen.

Welke entiteiten krijg je daarna?

Het pakketbestand maakt één ruwe bron aan en daarop gebaseerd direct bruikbare entiteiten. Zo zie je meteen of de API goed loopt en kun je zonder JSON-parsing eigen automatiseringen bouwen.

Entiteit Betekenis Typisch gebruik
sensor.energypriceforecast_apiRuw antwoord van het summary-endpoint inclusief flat, price, co2 en meta.Debugging en basis voor verdere templates.
sensor.epf_current_priceActuele prijs in het lopende slot. De bron kan day-ahead of voorspelling zijn.Prijsgestuurde laadpaal, warmtepomp, boiler.
sensor.epf_current_co2_intensityActuele CO2-waarde in het lopende slot.CO2-gerichte lastverschuiving.
binary_sensor.epf_cheapest_price_window_activeon, als het berekende beste prijsvenster al loopt.Direct beslissen over draaien, zonder eigen tijdvergelijkingen.
sensor.epf_cheapest_price_window_remaining_minutesResterende duur van het huidige beste prijsvenster.Inschatten hoe lang een verbruiker nog mag draaien.
sensor.epf_next_full_price_windowHet volgende volledige toekomstige venster voor prijs.Later starten of plannen.
sensor.epf_api_key_statusStatus van de ingevulde API-key.Snel zien of 48 uur of 120 uur echt gelden.
sensor.epf_allowed_horizonHorizon in uren die de server toestaat.Controleren of je installatie echt de gewenste lengte krijgt.

Welke periode levert de API precies?

Voor Home Assistant telt niet alleen de URL, maar ook de logica erachter. Juist die moet transparant zijn.

Zonder API-keyHet voorbeeld gebruikt hours=48. Daarmee krijg je de eenvoudige testhorizon die zonder extra sleutel openbaar bedoeld is.
Met API-keyAls je het bearer-token in de header zet, kun je de horizon in het pakket verhogen tot hours=120 oftewel 5 dagen.
PrijsresolutieDay-ahead kan in slots van 15 minuten beschikbaar zijn. De voorspelling daarbuiten blijft per uur. De summary combineert dat intern netjes.
Day-ahead eerstZodra er officiële day-aheadprijzen zijn, krijgen die voorrang. Alleen voor de rest van de periode worden voorspelde waarden gebruikt.
CO2 blijft per uurDe CO2-data worden niet kunstmatig naar kwartieren omgerekend. Voor de summary volstaat de CO2-weergave per uur doorgaans.
Kant-en-klaar berekende venstersDe API levert niet alleen ruwe waarden, maar ook al het goedkoopste venster, het groenste venster en het volgende volledige toekomstige venster.

Waar vul je de API-key in en hoe verleng je de horizon?

Beide gebeuren direct in het pakketbestand. Je hebt geen tweede endpoint nodig; je activeert alleen de Authorization-header en past het aantal uren aan.

rest:
  - resource: "https://api.energypriceforecast.eu/api/v1/home-assistant/summary?country=nl&hours=120&window_hours=4"
    scan_interval: 1800
    headers:
      Accept: "application/json"
      Authorization: "Bearer YOUR_API_KEY"

Of je key echt wordt gebruikt, zie je daarna in sensor.epf_api_key_status, sensor.epf_allowed_horizon en sensor.epf_used_horizon.

Wat levert het summary-endpoint concreet op?

Het summary-pad is bewust voor automatiseringen gebouwd. Het bespaart je veel eigen logica, omdat je niet eerst urenlange reeksen hoeft te parsen om eenvoudige beslissingen te nemen.

Veld Betekenis Waarom het nuttig is
flat.current_priceActuele prijswaarde in het lopende slot.Directe actuele toestand voor prijslogica.
flat.current_co2_g_kwhActuele CO2-waarde in het lopende slot.Directe actuele toestand voor CO2-logica.
flat.is_cheapest_window_nowLaat zien of het beste prijsvenster al actief is.Belangrijker dan alleen een starttijd.
flat.cheapest_window_remaining_minutesResterende duur van het lopende beste prijsvenster.Nuttig voor beslissingen over looptijd.
price.next_full_window.startVolgend volledig toekomstig venster voor prijs.Planning als je bewust later wilt starten.
meta.api_key_stateStatus van de ingevulde sleutel.Foutzoeken en testfase.
meta.allowed_horizon_hoursWat de server voor deze toegang toestaat.Heldere transparantie over limieten.
meta.used_horizon_hoursWat de API daadwerkelijk heeft geleverd.Zo blijven deze pagina en de backend eerlijk in lijn.

Officiële veldreferentie voor home-assistant/summary

De summary-endpoint is bewust compact. Voor veel automatiseringen volstaat het blok flat. Wie meer controle of eigen dashboards wil, kan daarnaast de blokken price, co2, combined en source gebruiken.

Veld Betekenis Typisch gebruik
flat.current_priceActuele prijs in EUR/kWh. Voor de lopende slot gebruikt de API automatisch de beste publiek beschikbare bron.Eenvoudige prijssensor voor automatiseringen.
flat.current_price_sourceBronlabel van de actuele prijs, bijvoorbeeld day_ahead.Controleren of de waarde al officieel is of nog voorspeld.
flat.current_co2_g_kwhActuele CO2-intensiteit in gCO2/kWh.CO2-gestuurde belastingverschuiving.
flat.cheapest_window_*Start, einde en gemiddelde waarde van het goedkoopste tijdvenster.EV-laden, boiler, warmtepomp.
flat.greenest_window_*Start, einde en gemiddelde waarde van het groenste tijdvenster.CO2-geoptimaliseerde planning.
flat.combined_window_*Compromisvenster tussen prijs en CO2.Wanneer beide belangrijk zijn zonder eigen scorelogica.
price.currentObject met start, end, value, unit en source voor de actuele prijsslot.Dashboards en preciezere logica.
price.cheapest_window_next_horizonGestructureerd blok voor het goedkoopste venster, inclusief duur en bronverdeling.Als je start, einde en context samen wilt gebruiken.
co2.currentObject met actuele CO2-waarde en het bijbehorende tijdvenster.CO2-weergave zonder parsing uit flat.
co2.greenest_window_next_horizonGestructureerd blok voor het groenste venster.CO2-geoptimaliseerd laden of verwarmen.
combined.best_window_next_horizonGecombineerd aanbevelingsblok met prijs-, CO2- en scorewaarden.Eén directe beslissing zonder eigen gewichten.
source.priceMetadata over de prijsbron, inclusief Firestore-document, day-ahead-provider en aantallen beschikbare waarden.Debugging, monitoring en kwaliteitscontrole.
source.co2Metadata over de CO2-bron.Debugging en herleidbaarheid.
Belangrijk over prijsveldenDe summary-endpoint levert niet de volledige ruwe tijdreeks van alle prijsvarianten. Voor Home Assistant levert hij vooral de actuele toestand en reeds berekende vensters. Voor volledige uurlijkse reeksen is hourly-forecast geschikter.
Actueel is niet hetzelfde als historisch vaststaandflat.current_price is de publiek bruikbare prijs voor de lopende slot. Die kan uit de officiële day-ahead komen of uit een andere vrijgegeven bron wanneer de marktuitkomst nog niet volledig beschikbaar is.
Totaalprijs alleen voor geselecteerde marktenDe publieke retail-forecast-endpoint is momenteel alleen bedoeld voor geselecteerde markten. Voor andere markten blijft de summary bewust bij markt- of basiswaarden.

Voorbeeld: auto alleen in het goedkope venster laden

Precies daarvoor is de voorbeeldautomatisering bijgevoegd. Ze gebruikt bewust de boolean binary_sensor.epf_cheapest_price_window_active in plaats van alleen op een kloktijd te triggeren. Dat is robuuster, omdat het beste venster ook al kan lopen.

trigger:
  - platform: state
    entity_id: binary_sensor.epf_cheapest_price_window_active
    to: "on"

action:
  - service: persistent_notification.create
    data:
      title: "Cheapest price window active"

Wil je in plaats van een melding direct een laadpaal of schakelaar starten, dan vervang je in de laatste stap alleen de service door je eigen doelservice, zoals switch.turn_on.

Met AI aanpassen aan jouw installatie

Deze prompt helpt een AI om uit het summary-endpoint een passende Home Assistant-automatisering te bouwen. Hij vervangt de eenvoudige kopieer-en-plakstart hierboven niet, maar is bedoeld voor individuele verbruikers, tijdslimieten en veiligheidsregels.

API-key beschermen

Geef een AI nooit je echte API-key. Laat in het resultaat altijd YOUR_API_KEY staan en vul de sleutel pas lokaal in Home Assistant in.

Prompt om te kopiëren tonen
Help mij een veilige Home Assistant-automatisering te bouwen met de Energy Price Forecast EU API.

Lees eerst het API-contract:
https://energypriceforecast.eu/openapi/integration-api.json

Gebruik /api/v1/home-assistant/summary en verzin geen velden. De API gebruikt officiële day-aheadprijzen zodra die beschikbaar zijn en prognosewaarden alleen voor de resterende open horizon.

Stel mij vóór de YAML één voor één maximaal deze vragen:
1. Land of prijszone?
2. Welke verbruiker moet worden aangestuurd en welke Home Assistant-entity schakelt hem?
3. Vermogen, benodigde looptijd en uiterste eindtijd?
4. Optimaliseren op prijs, CO2 of beide?
5. Free zonder key en maximaal 48 uur, of Private Pro met maximaal 120 uur?
6. Gebruik ik packages of configuration.yaml?

Regels voor het resultaat:
- Free: hours=48 en geen Authorization-header.
- Private Pro: hours=120 en header Authorization: Bearer JOUW_API_KEY.
- Vraag mij nooit om de echte key in de chat te plakken.
- Verwerk HTTP-fouten en controleer meta.api_key_state en meta.allowed_horizon_hours.
- Leg elke gebruikte API-eigenschap kort uit.
- Geef volledige, correct ingesprongen YAML en noem exact waar die hoort.
- Begin met een veilige testmodus via een melding of input_boolean. Zet het werkelijk schakelen van de verbruiker in een aparte, duidelijk gemarkeerde stap.
- Definieer veilig gedrag bij oude, ontbrekende of onwaarschijnlijke data. Een API-fout mag de verbruiker nooit onverwacht inschakelen.
- Sluit af met een controlelijst: HTTP 200, sensoren gevuld, toegestane horizon correct en testmodus correct geactiveerd.

Vraag door als informatie ontbreekt. Neem entitynamen, tarieven of elektrische grenzen niet stilzwijgend aan.

Machineleesbare basis: OpenAPI-contract van de integratie-endpoints.

Uitgebreidere oplossing voor complexere optimalisatie

Als eenvoudige Home Assistant-automatiseringen niet meer volstaan, loont DAO vooral wanneer je prijs, PV, opslag en verbruikers samen wilt optimaliseren. Home Assistant op deze pagina is bewust de eenvoudige instap. DAO is het pad voor gevorderden die meer willen dan alleen schakelen of triggeren.

Wanneer volstaat summary en wanneer heb je meer nodig?

summary volstaat voor de meeste Home Assistant-automatiseringen

Heb je actuele waarden, een beste venster en eenvoudige toestanden nodig, dan is het summary-endpoint de juiste weg. Precies daarvoor is ook het pakketbestand gebouwd.

Voor eigen prijsreeksen of grafieken is een endpoint met ruwe reeksen beter

Wil je later bewust eigen scoringslogica, diagrammen of gedetailleerde tijdreeksen bouwen, dan is het summary-endpoint met opzet niet zo uitgebreid mogelijk. Een forecast-endpoint met de ruwe reeks is dan het passendere pad.

Zijn dit exacte huishoudelijke stroomprijzen?

Niet automatisch. De summary werkt vooral met markt- of basisprijzen. Je exacte huishoudelijke stroomprijs hangt daarnaast af van net, belastingen, heffingen en opslagen van de leverancier.

Wat te doen als er na het plakken geen waarden verschijnen?

Typische oorzaken: de map packages is niet opgenomen, een inspringfout in de YAML, Home Assistant is niet opnieuw geladen of een verkeerde waarde voor country. Het snelst zie je dat in de logboeken van Home Assistant en in de ontwikkelaarstools.

Voor welke zones zijn er gepubliceerde day-ahead-prijzen?

Gepubliceerde day-ahead-prijzen geven we alleen door waar de bron dat toestaat. Voor NO1, NO3, NO4, NO5, SE1, SE2, FI, RO, SK, GR, BG en de Italiaanse zones behalve Noord leveren de endpoints daarom sinds 24 oktober 2026 voor elk uur onze prognose, en de sensoren markeren die uren als prognose. De gepubliceerde prijzen krijg je daar via de Nord Pool-integratie van Home Assistant; voor SK, GR, BG en Italië via een ENTSO-E-integratie met een eigen token.

Verwant: evcc met stroomprijs- en CO2-prognose en Stroomprijs vs CO2.

Meer hierover