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.
- HACS-integratie: instellen via een dialoog, eigen entiteiten, opgenomen in de standaard HACS-store
- YAML-pakket: REST-sensor plus templatesensoren om te kopiëren en plakken, werkt ook zonder HACS
- zonder API-key een gebruikelijke test met 48 uur, met API-key tot 120 uur – bij beide manieren gelijk
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.
packages/ zetten en klaar. Geen HACS nodig, volledige controle over de YAML-configuratie, een goede keuze als je je Home Assistant-configuratie toch al met Git beheert.
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.
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.
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.
- Zoek in HACS naar “Energy Price Forecast EU” en download de integratie; start Home Assistant daarna opnieuw.
- 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.
- 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.
- Vervang alle drie
sensor.CHANGE_MEdoor 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.
is_cheapest_window_now en de resterende minuten.Zo ziet het resultaat eruit
Zo voeg je het pakket toe
- Download het pakketbestand en sla het op als
/config/packages/energypriceforecast.yaml. - Zijn packages nog niet ingeschakeld, vul dan
configuration.yamlaan met dit blok. - Laad Home Assistant opnieuw of start één keer opnieuw op.
- 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_api | Ruw antwoord van het summary-endpoint inclusief flat, price, co2 en meta. | Debugging en basis voor verdere templates. |
sensor.epf_current_price | Actuele prijs in het lopende slot. De bron kan day-ahead of voorspelling zijn. | Prijsgestuurde laadpaal, warmtepomp, boiler. |
sensor.epf_current_co2_intensity | Actuele CO2-waarde in het lopende slot. | CO2-gerichte lastverschuiving. |
binary_sensor.epf_cheapest_price_window_active | on, als het berekende beste prijsvenster al loopt. | Direct beslissen over draaien, zonder eigen tijdvergelijkingen. |
sensor.epf_cheapest_price_window_remaining_minutes | Resterende duur van het huidige beste prijsvenster. | Inschatten hoe lang een verbruiker nog mag draaien. |
sensor.epf_next_full_price_window | Het volgende volledige toekomstige venster voor prijs. | Later starten of plannen. |
sensor.epf_api_key_status | Status van de ingevulde API-key. | Snel zien of 48 uur of 120 uur echt gelden. |
sensor.epf_allowed_horizon | Horizon 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.
hours=48. Daarmee krijg je de eenvoudige testhorizon die zonder extra sleutel openbaar bedoeld is.hours=120 oftewel 5 dagen.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_price | Actuele prijswaarde in het lopende slot. | Directe actuele toestand voor prijslogica. |
flat.current_co2_g_kwh | Actuele CO2-waarde in het lopende slot. | Directe actuele toestand voor CO2-logica. |
flat.is_cheapest_window_now | Laat zien of het beste prijsvenster al actief is. | Belangrijker dan alleen een starttijd. |
flat.cheapest_window_remaining_minutes | Resterende duur van het lopende beste prijsvenster. | Nuttig voor beslissingen over looptijd. |
price.next_full_window.start | Volgend volledig toekomstig venster voor prijs. | Planning als je bewust later wilt starten. |
meta.api_key_state | Status van de ingevulde sleutel. | Foutzoeken en testfase. |
meta.allowed_horizon_hours | Wat de server voor deze toegang toestaat. | Heldere transparantie over limieten. |
meta.used_horizon_hours | Wat 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_price | Actuele prijs in EUR/kWh. Voor de lopende slot gebruikt de API automatisch de beste publiek beschikbare bron. | Eenvoudige prijssensor voor automatiseringen. |
flat.current_price_source | Bronlabel van de actuele prijs, bijvoorbeeld day_ahead. | Controleren of de waarde al officieel is of nog voorspeld. |
flat.current_co2_g_kwh | Actuele 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.current | Object met start, end, value, unit en source voor de actuele prijsslot. | Dashboards en preciezere logica. |
price.cheapest_window_next_horizon | Gestructureerd blok voor het goedkoopste venster, inclusief duur en bronverdeling. | Als je start, einde en context samen wilt gebruiken. |
co2.current | Object met actuele CO2-waarde en het bijbehorende tijdvenster. | CO2-weergave zonder parsing uit flat. |
co2.greenest_window_next_horizon | Gestructureerd blok voor het groenste venster. | CO2-geoptimaliseerd laden of verwarmen. |
combined.best_window_next_horizon | Gecombineerd aanbevelingsblok met prijs-, CO2- en scorewaarden. | Eén directe beslissing zonder eigen gewichten. |
source.price | Metadata over de prijsbron, inclusief Firestore-document, day-ahead-provider en aantallen beschikbare waarden. | Debugging, monitoring en kwaliteitscontrole. |
source.co2 | Metadata over de CO2-bron. | Debugging en herleidbaarheid. |
hourly-forecast geschikter.flat.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.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.
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.
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.