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.
- HACS-integrasjon: oppsett via en dialog, egne entiteter, med i HACS sin standardbutikk
- YAML-pakke: REST-sensor pluss template-sensorer til å kopiere inn, fungerer også uten HACS
- uten API-nøkkel en typisk test med 48 timer, med API-nøkkel opptil 120 timer – likt for begge veier
Hvilken vei passer for deg?
Begge veier bruker samme summary-endepunkt og leverer de samme dataene. Forskjellen ligger i oppsett og vedlikehold.
packages/ og du er ferdig. Ingen HACS nødvendig, full kontroll over YAML-konfigurasjonen – et godt valg hvis du uansett styrer Home Assistant-konfigurasjonen med Git.
Å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.
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.
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.
- Søk i HACS etter «Energy Price Forecast EU» og last ned integrasjonen; start deretter Home Assistant på nytt.
- 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.
- 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.
- Erstatt alle tre
sensor.CHANGE_MEmed 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.
is_cheapest_window_now og gjenstående minutter.Slik ser resultatet ut
Slik legger du inn pakken
- Last ned pakkefilen og lagre den som
/config/packages/energypriceforecast.yaml. - Hvis packages ikke er slått på ennå, utvider du
configuration.yamlmed denne blokken. - Last Home Assistant på nytt, eller start på nytt én gang.
- 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_api | Råsvar fra summary-endepunktet inkludert flat, price, co2 og meta. | Feilsøking og grunnlag for flere templates. |
sensor.epf_current_price | Aktuell pris i den pågående perioden. Kilden kan være day-ahead eller prognose. | Prisstyrt ladeboks, varmepumpe, varmtvannsbereder. |
sensor.epf_current_co2_intensity | Aktuell CO2-verdi i den pågående perioden. | CO2-orientert flytting av forbruk. |
binary_sensor.epf_cheapest_price_window_active | on, når det beregnede beste prisvinduet allerede er i gang. | Direkte beslutning om drift uten egne tidssammenligninger. |
sensor.epf_cheapest_price_window_remaining_minutes | Gjenstående varighet av det nåværende beste prisvinduet. | Anslå hvor lenge en forbruker fortsatt kan gå. |
sensor.epf_next_full_price_window | Det neste fullstendige fremtidige vinduet for pris. | Starte senere eller planlegge. |
sensor.epf_api_key_status | Status for den lagrede API-nøkkelen. | Se raskt om 48 timer eller 120 timer faktisk gjelder. |
sensor.epf_allowed_horizon | Horisont 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.
hours=48. Da får du den enkle testhorisonten som er ment å være offentlig uten ekstra nøkkel.hours=120 altså 5 dager.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_price | Aktuell prisverdi i den pågående perioden. | Direkte nåtilstand for prislogikk. |
flat.current_co2_g_kwh | Aktuell CO2-verdi i den pågående perioden. | Direkte nåtilstand for CO2-logikk. |
flat.is_cheapest_window_now | Viser om det beste prisvinduet allerede er aktivt. | Viktigere enn bare et starttidspunkt. |
flat.cheapest_window_remaining_minutes | Gjenstående varighet av det pågående beste prisvinduet. | Nyttig for beslutninger om driftstid. |
price.next_full_window.start | Neste fullstendige fremtidige vindu for pris. | Planlegging når du bevisst vil starte senere. |
meta.api_key_state | Status for den lagrede nøkkelen. | Feilsøking og testfase. |
meta.allowed_horizon_hours | Hva serveren tillater for denne tilgangen. | Tydelig åpenhet om grenser. |
meta.used_horizon_hours | Hva 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_price | Aktuell pris i NOK/kWh. Bruker automatisk den beste tilgjengelige offentlige kilden for den pågående perioden. | Enkel prissensor for automasjoner. |
flat.current_price_source | Kildeetikett for den aktuelle prisen, for eksempel day_ahead. | Sjekke om verdien allerede er offisiell eller fortsatt en prognose. |
flat.current_co2_g_kwh | Aktuell 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.current | Objekt med start, end, value, unit og source for den aktuelle prisperioden. | Dashbord og mer presis tilstandslogikk. |
price.cheapest_window_next_horizon | Strukturert blokk for det billigste vinduet, med varighet og antall per kilde. | Når du trenger start, slutt og kontekst samlet. |
co2.current | Objekt med aktuell CO2-verdi og tilhørende tidsvindu. | CO2-visning uten å parse flat. |
co2.greenest_window_next_horizon | Strukturert blokk for det grønneste vinduet. | Lade- eller varmelogikk med lav CO2. |
combined.best_window_next_horizon | Kombinert anbefaling med pris-, CO2- og score-verdier. | Én enkelt «best nå»-beslutning uten egen score. |
source.price | Metadata om priskilden, blant annet Firestore-dokument, day-ahead-leverandør og antall tilgjengelige oppføringer. | Feilsøking, overvåking og kvalitetskontroll. |
source.co2 | Metadata om CO2-kilden. | Feilsøking og sporbarhet. |
hourly-forecast det mer passende endepunktet.flat.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.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.
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.