Taal

Home Assistant · prijs en CO2

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

Er zijn twee volwaardig ondersteunde wegen: een native HACS-integratie met UI-setup, of een gewone REST-sensor die je in YAML plakt. Beide gebruiken dezelfde API en geven actuele waarden, live vensterstatus en de belangrijkste tijdvensters terug.

Welke weg past bij jou?

Beide wegen gebruiken dezelfde summary-endpoint en geven inhoudelijk dezelfde data. Het verschil zit in de installatie en het onderhoud.

Opensource-repository van de HACS-integratie: github.com/BackupBaTTerY/energypriceforecast-home-assistant. Beide wegen kunnen ook naast elkaar draaien, zolang je geen dubbele entity-ID's aanmaakt.

Gratis beginnen, optioneel verder vooruit plannen

De Home Assistant-opzet blijft zonder API-key bruikbaar tot 48 uur. Wil je grotere verbruikers meerdere dagen vooruit plannen, dan kun je Private Pro met maximaal 120 uur 14 dagen gratis proberen.

API-migratie

Nieuwe integraties moeten vanaf nu https://api.energypriceforecast.eu/api/v1/... gebruiken. Oudere project-URL's werken voor bestaande setups deels nog, maar mogen niet langer als referentie voor nieuwe integraties worden gebruikt.

Zo installeer je de HACS-integratie

Zolang de integratie nog niet in de HACS-standaardlijst staat, voeg je de repository eenmalig handmatig toe.

  1. Open HACS, klik rechtsboven op de drie puntjes → Custom repositories.
  2. Vul repository-URL https://github.com/BackupBaTTerY/energypriceforecast-home-assistant in, kies type Integration, voeg toe.
  3. Zoek naar "Energy Price Forecast EU", download het, herstart daarna Home Assistant.
  4. Instellingen → Apparaten & diensten → Integratie toevoegen, zoek naar "Energy Price Forecast EU" en kies je markt plus eventuele opties.

De knop hierboven ("HACS-integratie toevoegen") opent stap 1 en 2 automatisch 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: de 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.

Aanbevolen endpoint

Voor Home Assistant is /api/v1/home-assistant/summary het meest praktisch. De endpoint levert niet alleen ruwe waarden, maar ook al berekende vensters voor goedkoop, groen en gecombineerd gebruik.

https://api.energypriceforecast.eu/api/v1/home-assistant/summary?country=nl&hours=48&window_hours=4
Prijsflat.current_price en flat.cheapest_window_*.
CO2flat.current_co2_g_kwh en flat.greenest_window_*.
Gecombineerdflat.combined_window_* voor de compromiskeuze tussen prijs en CO2.

Snelle start voor copy-paste (REST-sensor)

Als je voor de REST-sensor hebt gekozen: dit is bewust eenvoudig. YAML-blok plakken, markt aanpassen, Home Assistant herladen.

  1. Plaats het YAML-blok hieronder in configuration.yaml of in een package-bestand dat Home Assistant al inlaadt.
  2. Pas alleen country aan. Gebruik voor Denemarken altijd dk1 of dk2.
  3. Herlaad of herstart Home Assistant.
  4. Controleer onder Ontwikkelaarstools of de nieuwe sensoren waarden teruggeven.
Geschikt voor beginnersHet voorbeeld gebruikt bewust eenvoudige flat-velden in plaats van complexe templates, zodat het copy-paste-vriendelijk blijft.
Wat je moet aanpassenMeestal alleen country. De rest kan ongewijzigd blijven.
Wat je daarna zou moeten zienMinstens één sensor voor de actuele prijs en één sensor voor het goedkoopste venster.

REST-sensorvoorbeeld

Dit voorbeeld vraagt Nederland elke 15 minuten op. Voor andere markten hoef je alleen de parameter country te wijzigen.

rest:
  - resource: "https://api.energypriceforecast.eu/api/v1/home-assistant/summary?country=nl&hours=48&window_hours=4"
    scan_interval: 900
    sensor:
      - name: "StroomprijsVoorspelling actuele prijs"
        value_template: "{{ value_json.flat.current_price }}"
        unit_of_measurement: "EUR/kWh"

      - name: "StroomprijsVoorspelling actuele CO2-intensiteit"
        value_template: "{{ value_json.flat.current_co2_g_kwh }}"
        unit_of_measurement: "gCO2/kWh"

      - name: "StroomprijsVoorspelling goedkoopste venster start"
        value_template: "{{ value_json.flat.cheapest_window_start }}"

      - name: "StroomprijsVoorspelling groenste venster start"
        value_template: "{{ value_json.flat.greenest_window_start }}"

Na het invoegen Home Assistant herladen of herstarten en de sensorwaarden onder Ontwikkelaarstools controleren.

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.

Wanneer volstaat summary en wanneer heb je hourly-forecast nodig?

summary volstaat voor eenvoudige automatiseringen

Als je alleen de actuele prijs, de actuele CO2-intensiteit of het beste 4-uursvenster nodig hebt, is home-assistant/summary de juiste endpoint. Zo blijft de YAML kort en vermijd je onnodig parsen.

hourly-forecast is beter voor grafieken en complexere templates

Als je zelf grafieken wilt tekenen, eigen scores wilt berekenen of day-ahead apart van modelvoorspelling wilt tonen, gebruik dan hourly-forecast. Daar zijn de uurlijkse reeksen explicieter zichtbaar.

Supportmatrix van de publieke API

Niet elk zichtbaar land is al voor elk publiek endpoint vrijgegeven. Daarom is het beter om expliciet te tonen welke markten per endpoint echt ondersteund worden.

Markt hourly-forecast home-assistant/summary co2-live Eindprijsprognose voor consumenten
retail-forecast
DEjajajaja
NLjajajaja
BEjajajanee
FRjajajanee
CZjajajanee
ATjajajaja
PLjajajanee
FIjajajanee
SE1jajajanee
SE2jajajanee
SE3jajajanee
SE4jajajanee
DK1jajajaja
DK2jajajaja
NO1jajajaja
NO2jajajaja
NO3jajajaja
NO4jajajaja
NO5jajajaja
DenemarkenGebruik voor Denemarken altijd dk1 of dk2. dk valt terug op DK1.
TsjechiëCZ is nu publiek beschikbaar voor prijs en CO2 in de summary- en live-CO2-route. Een publieke totaalprijsprognose is er daar nog niet.
Eindprijs voor consumentenMet retail-forecast wordt hier een geschatte eindklantprijs bedoeld, niet alleen de kale markt- of basisprijs. Publiek beschikbaar is dit momenteel voor DE, NL, DK1, DK2, AT en NO1 t/m NO5.

Met AI aanpassen aan jouw installatie

Deze prompt helpt een AI om van de summary-endpoint een Home Assistant-automatisering voor jouw verbruiker, deadline en veiligheidsregels te maken. Dit is een aanvulling op de eenvoudige copy-paste-opzet hierboven.

Bescherm je API-key

Geef een AI nooit je echte API-key. Laat JOUW_API_KEY in het resultaat 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 voor de integratie-endpoints.

Belangrijke opmerkingen

Is er een officiële Home Assistant-integratie?

Ja, er is een native HACS-integratie beschikbaar (momenteel als custom repository, zie de vergelijking hierboven). Het REST-sensorpad op deze pagina blijft ook volledig ondersteund - stabieler, makkelijker te testen en voor veel setups volledig voldoende.

Zijn de API-prijzen mijn exacte huishoudtarief?

Niet automatisch. hourly-forecast en de Home-Assistant-summary leveren eerst markt- of basisprijzen. Het exacte totaal hangt per land af van netkosten, belastingen, heffingen en leveranciersmarges.

Wat gebeurt er bij een niet-ondersteund land?

De publieke API geeft daarvoor nu bewust een foutmelding in plaats van stil op Duitsland terug te vallen. Dat is expres strenger, zodat automatiseringen geen verkeerde data krijgen.

Wat als er na het plakken geen waarden verschijnen?

De meest voorkomende oorzaken zijn: YAML op de verkeerde plek geplaatst, Home Assistant niet herladen, een niet-ondersteunde country-waarde of een fout in de YAML-inspringing. Ontwikkelaarstools en de Home Assistant-logs laten dat meestal direct zien.

Gerelateerd: evcc met stroomprijs- en CO2-prognose.