Språk

Home Assistant · strømpris og CO2

To likeverdige veier til pris- og CO2-data i Home Assistant

Energy Price Forecast EU har to fullt støttede veier inn i Home Assistant: en nativ HACS-integrasjon med oppsett i brukergrensesnittet, eller en klassisk YAML-pakke med REST-sensor. Begge bruker samme API og leverer aktuelle verdier, løpende tilstander og de viktigste tidsvinduene.

Hvilken vei passer for deg?

Begge veier bruker samme summary-endepunkt og leverer de samme dataene. Forskjellen ligger i oppsett og vedlikehold.

Åpent repository for HACS-integrasjonen: github.com/BackupBaTTerY/energypriceforecast-home-assistant. Begge veier kan også kjøre side om side, så lenge du ikke oppretter de samme entity-ID-ene to ganger.

Start gratis, planlegg lenger ved behov

Home Assistant-tilgangen kan fortsatt brukes uten API-nøkkel og leverer vanligvis opptil 48 timer. Vil du planlegge større forbrukere over flere dager, kan du prøve Private Pro med opptil 120 timer gratis i 14 dager.

Viktig API-merknad

Nye oppsett bør bruke https://api.energypriceforecast.eu/api/v1/... som adresse. Summary-API-et leverer ikke en komplett prisserie, men en kompakt automasjonsblokk med aktuell pris, aktuell CO2-verdi, best mulige vindu og metainformasjon om tilgangen din.

Slik setter du opp HACS-integrasjonen

Integrasjonen står i HACS sin standardbutikk, så du trenger ikke legge til noe manuelt.

  1. Søk i HACS etter «Energy Price Forecast EU» og last ned integrasjonen; start deretter Home Assistant på nytt.
  2. Innstillinger → Enheter og tjenester → Legg til integrasjon, søk etter «Energy Price Forecast EU», og velg marked og eventuelle valgfrie innstillinger.

Knappen øverst («Legg til HACS-integrasjonen») åpner integrasjonen direkte i HACS hvis HACS allerede er installert.

Sammenlign prognosen med publiserte priser

Grønt viser publiserte day-ahead-priser, oransje den aktuelle prognosen og den blå stiplede linjen den først lagrede prognosen. Den tidligere prognosen blir stående når de offisielle prisene kommer.

  1. Oppdater Energy Price Forecast EU til minst 1.12.0 i HACS, og start Home Assistant på nytt. Installer også ApexCharts Card 2.1.0 eller nyere via HACS.
  2. Erstatt alle tre sensor.CHANGE_ME med samme prisserie-entitet fra Utviklerverktøy → Tilstander. Bruk entiteten for gjeldende sluttkundepris for din konfigurerte totalpris. Lim inn YAML under Dashbord → Rediger → Legg til kort → Manuelt.

Lagringen begynner etter oppdateringen og overlever omstarter. Verdiene beholdes til slutten av den aktuelle markedsdagen; tidligere prognoser kan ikke gjenopprettes. captured_at er mottakstidspunktet i Home Assistant, ikke tidspunktet for modellkjøringen. Dette er verken en kvalitetsmåling med fast prognoseavstand eller et ubegrenset arkiv.

Tilpass akseenheten til sensoren, for eksempel NOK/kWh eller EUR/kWh, ikke øre/kWh. En beregnet totalpris garanterer ikke strømregningen. Uten nøkkel er API-horisonten fortsatt opptil 48 timer; bruk riktig tilgang og graph_span: 6d for opptil 120 timer. Kortet gjelder HACS-integrasjonen, ikke REST-summary-eksemplet nedenfor, og gir ingen ekstra API-kall.

YAML klar til å kopiere
type: custom:apexcharts-card
header:
  show: true
  title: Energy Price Forecast EU
graph_span: 3d
span:
  start: day
now:
  show: true
  label: Nå
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: Offisiell (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: Aktuell prognose
    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: Lagret prognose (først mottatt)
    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;
Valgfritt: tilpass kortet med en KI
Help me tailor an ApexCharts card for Energy Price Forecast EU. First ask for my exact entity ID, sensor unit, integration version, hourly/quarter-hourly settlement and whether I want market or retail prices. Do not ask for an API key.
From integration 1.12.0, Price forecast series and Current retail price expose:
- raw_today and raw_tomorrow: published day-ahead slots.
- raw_forecast: current forecast slots beyond official coverage.
These lists contain {start, end, value}.
- raw_forecast_reference: {start, end, value, captured_at}; the first forecast received for a then-future slot, saved locally. Later forecasts and official prices never overwrite it.
References accumulate only after updating, survive restarts and are removed after the target market day ends. captured_at is the HA observation time, not model creation.
Use green for official prices, orange for the current forecast and dashed blue for the saved forecast, on the same axis in the sensor's unit. Require ApexCharts Card 2.1.0 or newer. Use each series' data_generator and extend_to: false. Draw start through end, preserve gaps with null, and retain genuine zero/negative prices. Never copy official values into a forecast line. Use only the documented attributes.
Optionally ask about the hourly/weekend plan: its hours attribute contains {start, end, average_value}. Mark those times separately without changing the plan. Return complete YAML for a manual Lovelace card and explain where to paste it. A chart alone does not switch a charger.

Answer in Norwegian.

Resultat på 5 minutter (YAML-pakke)

Har du valgt YAML-veien, tar du disse tre filene. Pakkefilen henter dataene, Lovelace-kortet viser dem, og eksempelautomasjonen viser den egentlige bruken.

Bevisst enkelPakkefilen bruker bare summary-endepunktet. Ingen HACS, ikke noe tillegg og ikke noe Python-skript er nødvendig.
Laget for ekte styringDet viktige her er ikke bare starttider, men også tilstander som is_cheapest_window_now og gjenstående minutter.
Skånsom hentingEksempelet henter data hvert 30. minutt som standard. For day-ahead pluss prognose er det normalt mer enn nok.

Slik ser resultatet ut

Forhåndsvisning av et Lovelace-kort med aktuell pris, CO2-verdi og prisvinduer.
Lovelace-kortet viser entitetene fra pakkefilen direkte, uten at du først må bygge egne dashbord.
Forhåndsvisning av en enkel Home Assistant-automasjon som utløses av det billigste prisvinduet.
Eksempelautomasjonen starter bevisst enkelt og kan deretter tilpasses ladeboks, varmepumpe eller bryter.

Slik legger du inn pakken

  1. Last ned pakkefilen og lagre den som /config/packages/energypriceforecast.yaml.
  2. Hvis packages ikke er slått på ennå, utvider du configuration.yaml med denne blokken.
  3. Last Home Assistant på nytt, eller start på nytt én gang.
  4. Importer deretter Lovelace-kortet og eventuelt eksempelautomasjonen.
homeassistant:
  packages: !include_dir_named packages

Lovelace-kortet kan du legge inn i et dashbord via korttypen Manuelt i listen. Automasjonen kan du også importere som YAML under automasjoner, eller bare bruke som mal.

Hvilke entiteter får du etterpå?

Pakkefilen oppretter én råkilde og, bygget på den, entiteter som kan brukes direkte. Da ser du med en gang om API-et kjører som det skal, og du kan bygge egne automasjoner uten JSON-parsing.

Entitet Betydning Typisk bruk
sensor.energypriceforecast_apiRåsvar fra summary-endepunktet inkludert flat, price, co2 og meta.Feilsøking og grunnlag for flere templates.
sensor.epf_current_priceAktuell pris i den pågående perioden. Kilden kan være day-ahead eller prognose.Prisstyrt ladeboks, varmepumpe, varmtvannsbereder.
sensor.epf_current_co2_intensityAktuell CO2-verdi i den pågående perioden.CO2-orientert flytting av forbruk.
binary_sensor.epf_cheapest_price_window_activeon, når det beregnede beste prisvinduet allerede er i gang.Direkte beslutning om drift uten egne tidssammenligninger.
sensor.epf_cheapest_price_window_remaining_minutesGjenstående varighet av det nåværende beste prisvinduet.Anslå hvor lenge en forbruker fortsatt kan gå.
sensor.epf_next_full_price_windowDet neste fullstendige fremtidige vinduet for pris.Starte senere eller planlegge.
sensor.epf_api_key_statusStatus for den lagrede API-nøkkelen.Se raskt om 48 timer eller 120 timer faktisk gjelder.
sensor.epf_allowed_horizonHorisont i timer som serveren tillater.Kontrollere at oppsettet ditt faktisk får ønsket lengde.

Hvilken periode leverer API-et nøyaktig?

For Home Assistant er det avgjørende ikke bare URL-en, men også logikken bak. Nettopp den skal være gjennomsiktig.

Uten API-nøkkelEksempelet bruker hours=48. Da får du den enkle testhorisonten som er ment å være offentlig uten ekstra nøkkel.
Med API-nøkkelNår du setter bearer-tokenet i headeren, kan du øke horisonten i pakken til opptil hours=120 altså 5 dager.
PrisoppløsningDay-ahead kan foreligge i perioder på 15 minutter. Prognosen utover det forblir timebasert. Summary kombinerer dette ryddig internt.
Day-ahead førstSå snart offisielle day-ahead-priser finnes, har de forrang. Prognoseverdier brukes bare for den gjenstående perioden.
CO2 forblir timebasertCO2-dataene regnes ikke kunstig om til kvarter. For summary er den timebaserte CO2-visningen som regel nok.
Ferdig beregnede vinduerAPI-et leverer ikke bare råverdier, men også det billigste vinduet, det grønneste vinduet og det neste fullstendige fremtidige vinduet.

Hvor legger du inn API-nøkkelen, og hvordan øker du horisonten?

Begge deler skjer direkte i pakkefilen. Du trenger ikke et annet endepunkt; du aktiverer bare Authorization-headeren og justerer timeverdien.

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

Om nøkkelen din faktisk brukes, ser du deretter i sensor.epf_api_key_status, sensor.epf_allowed_horizon og sensor.epf_used_horizon.

Hva gir summary-endepunktet konkret?

Summary-stien er bevisst bygget for automasjoner. Den sparer deg for mye egen logikk, fordi du ikke først må parse lange timeserier for å ta enkle beslutninger.

Felt Betydning Hvorfor det er nyttig
flat.current_priceAktuell prisverdi i den pågående perioden.Direkte nåtilstand for prislogikk.
flat.current_co2_g_kwhAktuell CO2-verdi i den pågående perioden.Direkte nåtilstand for CO2-logikk.
flat.is_cheapest_window_nowViser om det beste prisvinduet allerede er aktivt.Viktigere enn bare et starttidspunkt.
flat.cheapest_window_remaining_minutesGjenstående varighet av det pågående beste prisvinduet.Nyttig for beslutninger om driftstid.
price.next_full_window.startNeste fullstendige fremtidige vindu for pris.Planlegging når du bevisst vil starte senere.
meta.api_key_stateStatus for den lagrede nøkkelen.Feilsøking og testfase.
meta.allowed_horizon_hoursHva serveren tillater for denne tilgangen.Tydelig åpenhet om grenser.
meta.used_horizon_hoursHva API-et faktisk har levert.Slik holder denne siden og backend ærlig tritt.

Offisiell feltreferanse for home-assistant/summary

Summary-endepunktet er bevisst kompakt. For mange automasjoner er blokken flat allerede nok. Vil du styre mer presist eller bygge egne dashbord, kan du i tillegg bruke de mer strukturerte blokkene price, co2, combined og source.

Felt Betydning Typisk bruk
flat.current_priceAktuell pris i NOK/kWh. Bruker automatisk den beste tilgjengelige offentlige kilden for den pågående perioden.Enkel prissensor for automasjoner.
flat.current_price_sourceKildeetikett for den aktuelle prisen, for eksempel day_ahead.Sjekke om verdien allerede er offisiell eller fortsatt en prognose.
flat.current_co2_g_kwhAktuell CO2-intensitet i gCO2/kWh.CO2-basert flytting av fleksibelt forbruk.
flat.cheapest_window_*Start, slutt og gjennomsnitt for det billigste tidsvinduet i den forespurte horisonten.Elbillading, varmtvannsbereder, varmepumpe.
flat.greenest_window_*Start, slutt og gjennomsnitt for tidsvinduet med lavest CO2.Planlegging med lav CO2.
flat.combined_window_*Kompromissvindu mellom pris og CO2.Når begge deler teller og du ikke vil definere en egen vekting.
price.currentObjekt med start, end, value, unit og source for den aktuelle prisperioden.Dashbord og mer presis tilstandslogikk.
price.cheapest_window_next_horizonStrukturert blokk for det billigste vinduet, med varighet og antall per kilde.Når du trenger start, slutt og kontekst samlet.
co2.currentObjekt med aktuell CO2-verdi og tilhørende tidsvindu.CO2-visning uten å parse flat.
co2.greenest_window_next_horizonStrukturert blokk for det grønneste vinduet.Lade- eller varmelogikk med lav CO2.
combined.best_window_next_horizonKombinert anbefaling med pris-, CO2- og score-verdier.Én enkelt «best nå»-beslutning uten egen score.
source.priceMetadata om priskilden, blant annet Firestore-dokument, day-ahead-leverandør og antall tilgjengelige oppføringer.Feilsøking, overvåking og kvalitetskontroll.
source.co2Metadata om CO2-kilden.Feilsøking og sporbarhet.
Viktig om prisfeltSummary leverer ikke den komplette råserien for alle prisvarianter. For Home Assistant leverer den først og fremst nåtilstanden og ferdig beregnede vinduer. For fullstendige tidsserier er hourly-forecast det mer passende endepunktet.
Aktuell betyr ikke faktisk historisk prisflat.current_price er den offentlige prisverdien som kan brukes nå for den pågående perioden. Den kan komme fra den offisielle day-ahead-auksjonen eller fra en annen frigitt kilde når markedsresultatet ennå ikke foreligger fullt ut.
Totalpris bare for utvalgte markederEndepunktet retail-forecast er foreløpig bare ment offentlig for utvalgte markeder. For andre markeder holder summary seg bevisst til markeds- eller basisverdier.

Eksempel: lad bilen bare i det billige vinduet

Nettopp det er eksempelautomasjonen til for. Den bruker bevisst den boolske verdien binary_sensor.epf_cheapest_price_window_active i stedet for bare å utløse på et klokkeslett. Det er mer robust, fordi det beste vinduet allerede kan være i gang.

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"

Vil du starte en ladeboks eller en bryter direkte i stedet for et varsel, bytter du bare ut tjenesten i siste trinn med din egen måltjeneste, for eksempel switch.turn_on.

Tilpass til oppsettet ditt med KI

Denne prompten hjelper en KI med å bygge en passende Home Assistant-automasjon ut fra summary-endepunktet. Den erstatter ikke den enkle kopier-og-lim-starten ovenfor, men er ment for individuelle forbrukere, tidsfrister og sikkerhetsregler.

Beskytt API-nøkkelen

Gi aldri en KI den ekte API-nøkkelen din. La alltid YOUR_API_KEY stå i resultatet, og legg først inn nøkkelen lokalt i Home Assistant.

Vis prompt til kopiering
Help me build a safe Home Assistant automation using the Energy Price Forecast EU API.

Read the API contract first:
https://energypriceforecast.eu/openapi/integration-api.json

Use /api/v1/home-assistant/summary and do not invent fields. The API uses official day-ahead prices wherever available and forecast values only for the remaining open horizon.

Before writing YAML, ask me no more than these questions, one at a time:
1. Country or bidding zone?
2. Which load should be controlled and which Home Assistant entity switches it?
3. Power, required runtime and latest completion time?
4. Optimise for price, CO2 or both?
5. Free without a key and up to 48 hours, or Private Pro with up to 120 hours?
6. Do I use packages or configuration.yaml?

Rules for your result:
- Free: hours=48 and no Authorization header.
- Private Pro: hours=120 and header Authorization: Bearer YOUR_API_KEY.
- Never ask me to paste the real key into the chat.
- Handle HTTP errors and check meta.api_key_state and meta.allowed_horizon_hours.
- Briefly explain every API property you use.
- Produce complete, correctly indented YAML and state exactly where it belongs.
- Start with a safe test mode using a notification or input_boolean. Put real load switching in a separate, clearly marked step.
- Define safe behaviour for stale, missing or implausible data. An API error must never switch the load on unexpectedly.
- Finish with a checklist: HTTP 200, sensors populated, allowed horizon correct and test mode triggered correctly.

Ask when information is missing. Do not silently assume entity names, tariffs or electrical limits.

Answer in Norwegian.

Maskinlesbart grunnlag: OpenAPI-kontrakt for integrasjonsendepunktene.

Når er summary nok, og når trenger du mer?

summary er nok for de fleste Home Assistant-automasjoner

Trenger du aktuelle verdier, et beste vindu og enkle tilstander, er summary-endepunktet riktig vei. Nettopp det er pakkefilen også bygget for.

For egne prisserier eller diagrammer er et endepunkt med råserien bedre

Vil du senere bevisst bygge egen scoringslogikk, diagrammer eller detaljerte tidsserier, er summary-endepunktet med vilje ikke så detaljert som mulig. Da er et forecast-endepunkt med råserien den mer passende veien.

Er dette nøyaktige strømpriser for husholdninger?

Ikke automatisk. Summary arbeider først og fremst med markeds- eller basispriser. Den nøyaktige husholdningsprisen din avhenger i tillegg av nettleie, avgifter og påslag fra leverandøren.

Hva gjør du hvis det ikke vises verdier etter innliming?

Typiske årsaker: mappen packages er ikke inkludert, innrykksfeil i YAML, Home Assistant er ikke lastet på nytt, eller en feil verdi for country. Raskest ser du det i loggene til Home Assistant og i utviklerverktøyene.

Hvilke soner får publiserte day-ahead-priser?

Vi videreformidler bare publiserte day-ahead-priser der kilden tillater det. For NO1, NO3, NO4, NO5, SE1, SE2, FI, RO, SK, GR, BG og de italienske sonene unntatt Nord leverer endepunktene derfor siden 24. oktober 2026 vår prognose for hver time, og sensorene merker disse timene som prognose. De publiserte prisene får du der via Home Assistants Nord Pool-integrasjon; for SK, GR, BG og Italia via en ENTSO-E-integrasjon med ditt eget token.

Relatert: evcc med strømpris- og CO2-prognose.

Les mer