Home Assistant · elpris og CO2
To ligeværdige veje til pris- og CO2-data i Home Assistant
Energy Price Forecast EU har to fuldt understøttede veje ind i Home Assistant: en native HACS-integration med opsætning i brugerfladen eller en klassisk YAML-pakke med REST-sensor. Begge bruger samme API og leverer aktuelle værdier, løbende tilstande og de vigtigste tidsvinduer.
- HACS-integration: opsætning via en dialog, egne entiteter, med i HACS’ standardbutik
- YAML-pakke: REST-sensor plus template-sensorer til at kopiere ind, virker også uden HACS
- uden API-nøgle en typisk test med 48 timer, med API-nøgle op til 120 timer – ens for begge veje
Hvilken vej passer til dig?
Begge veje bruger samme summary-endpoint og leverer de samme data. Forskellen ligger i opsætning og vedligeholdelse.
packages/ og du er færdig. Ingen HACS nødvendig, fuld kontrol over YAML-konfigurationen – et godt valg, hvis du i forvejen styrer din Home Assistant-konfiguration med Git.
Open source-repository for HACS-integrationen: github.com/BackupBaTTerY/energypriceforecast-home-assistant. Begge veje kan også køre side om side, så længe du ikke opretter de samme entity-id’er to gange.
Home Assistant-adgangen kan fortsat bruges uden API-nøgle og leverer typisk op til 48 timer. Vil du planlægge større forbrugere over flere dage, kan du prøve Private Pro med op til 120 timer gratis i 14 dage.
Nye opsætninger bør bruge https://api.energypriceforecast.eu/api/v1/... som adresse. Summary-API’et leverer ikke en komplet prisserie, men en kompakt automatiseringsblok med aktuel pris, aktuel CO2-værdi, det bedst mulige vindue og metaoplysninger om din adgang.
Sådan sætter du HACS-integrationen op
Integrationen står i HACS’ standardbutik, så du skal ikke tilføje noget manuelt.
- Søg i HACS efter “Energy Price Forecast EU” og hent integrationen; genstart derefter Home Assistant.
- Indstillinger → Enheder og tjenester → Tilføj integration, søg efter “Energy Price Forecast EU”, og vælg marked samt eventuelle valgfrie indstillinger.
Knappen øverst (“Tilføj HACS-integrationen”) åbner integrationen direkte i HACS, hvis HACS allerede er installeret.
Sammenlign prognosen med offentliggjorte priser
Grøn viser offentliggjorte day-ahead-priser, orange den aktuelle prognose og den blå stiplede linje den først gemte prognose. Den tidligere prognose forbliver synlig, når officielle priser bliver tilgængelige.
- Opdater Energy Price Forecast EU til mindst 1.12.0 i HACS, og genstart Home Assistant. Installer også ApexCharts Card 2.1.0 eller nyere via HACS.
- Erstat alle tre
sensor.CHANGE_MEmed samme prisserie-entitet fra Udviklerværktøjer → Tilstande. Brug den aktuelle slutkundepris-entitet til din konfigurerede samlede pris. Indsæt YAML under Dashboard → Rediger → Tilføj kort → Manuelt.
Gemningen begynder efter opdateringen og overlever genstarter. Værdierne bevares til slutningen af den pågældende markedsdag; tidligere prognoser kan ikke genskabes. captured_at er modtagelsestiden i Home Assistant, ikke modellens tidspunkt. Det er hverken en kvalitetsmåling med fast prognoseafstand eller et ubegrænset arkiv.
Tilpas aksens enhed til sensoren, fx DKK/kWh eller EUR/kWh, ikke øre/kWh. En beregnet slutkundepris er ikke en garanteret regning. Uden nøgle er API-horisonten fortsat op til 48 timer; brug passende adgang og graph_span: 6d til op til 120 timer. Kortet er til HACS-integrationen, ikke REST-summary-eksemplet nedenfor, og giver ingen ekstra API-kald.
YAML klar til kopiering
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: Officiel (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: Aktuel 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: Gemt prognose (først modtaget)
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;
Valgfrit: tilpas kortet med en AI
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 Danish.
Resultat på 5 minutter (YAML-pakke)
Har du valgt YAML-vejen, så tag disse tre filer. Pakkefilen henter dataene, Lovelace-kortet viser dem, og eksempelautomatiseringen viser den egentlige brug.
is_cheapest_window_now og resterende minutter.Sådan ser resultatet ud
Sådan tilføjer du pakken
- Hent pakkefilen, og gem den som
/config/packages/energypriceforecast.yaml. - Hvis packages endnu ikke er slået til, så udvid
configuration.yamlmed denne blok. - Genindlæs Home Assistant, eller genstart én gang.
- Importer derefter Lovelace-kortet og eventuelt eksempelautomatiseringen.
homeassistant:
packages: !include_dir_named packages
Lovelace-kortet kan du indsætte i et dashboard via korttypen Manuelt på listen. Automatiseringen kan du også importere som YAML under automatiseringer eller blot bruge som skabelon.
Hvilke entiteter får du bagefter?
Pakkefilen opretter én råkilde og oven på den entiteter, der kan bruges direkte. Så ser du med det samme, om API’et kører rent, og du kan bygge egne automatiseringer uden JSON-parsing.
| Entitet | Betydning | Typisk brug |
|---|---|---|
sensor.energypriceforecast_api | Råsvar fra summary-endpointet inklusive flat, price, co2 og meta. | Fejlsøgning og grundlag for flere templates. |
sensor.epf_current_price | Aktuel pris i det igangværende interval. Kilden kan være day-ahead eller prognose. | Prisstyret ladeboks, varmepumpe, vandvarmer. |
sensor.epf_current_co2_intensity | Aktuel CO2-værdi i det igangværende interval. | CO2-orienteret flytning af forbrug. |
binary_sensor.epf_cheapest_price_window_active | on, når det beregnede bedste prisvindue allerede er i gang. | Direkte beslutning om drift uden egne tidssammenligninger. |
sensor.epf_cheapest_price_window_remaining_minutes | Resterende varighed af det aktuelt bedste prisvindue. | Vurdere, hvor længe en forbruger stadig må køre. |
sensor.epf_next_full_price_window | Det næste fulde fremtidige vindue for pris. | Start senere, eller planlæg. |
sensor.epf_api_key_status | Status for den indtastede API-nøgle. | Se hurtigt, om 48 timer eller 120 timer reelt gælder. |
sensor.epf_allowed_horizon | Horisont i timer, som serveren tillader. | Kontrollere, om din opsætning reelt får den ønskede længde. |
Hvilken periode leverer API’et præcist?
For Home Assistant er det afgørende ikke kun URL’en, men også logikken bag. Netop den skal være gennemskuelig.
hours=48. Det giver dig den enkle testhorisont, som er tænkt offentlig uden ekstra nøgle.hours=120 altså 5 dage.Hvor indtaster du API-nøglen, og hvordan øger du horisonten?
Begge dele sker direkte i pakkefilen. Du behøver ikke et andet endpoint; du aktiverer blot Authorization-headeren og tilpasser timetallet.
rest:
- resource: "https://api.energypriceforecast.eu/api/v1/home-assistant/summary?country=dk1&hours=120&window_hours=4"
scan_interval: 1800
headers:
Accept: "application/json"
Authorization: "Bearer YOUR_API_KEY"
Om din nøgle reelt bliver brugt, ser du derefter i sensor.epf_api_key_status, sensor.epf_allowed_horizon og sensor.epf_used_horizon.
Hvad giver summary-endpointet konkret?
Summary-stien er bevidst bygget til automatiseringer. Den sparer dig for meget egen logik, fordi du ikke først skal parse lange timeserier for at træffe enkle beslutninger.
| Felt | Betydning | Hvorfor det er nyttigt |
|---|---|---|
flat.current_price | Aktuel prisværdi i det igangværende interval. | Direkte aktuel tilstand til prislogik. |
flat.current_co2_g_kwh | Aktuel CO2-værdi i det igangværende interval. | Direkte aktuel tilstand til CO2-logik. |
flat.is_cheapest_window_now | Viser, om det bedste prisvindue allerede er aktivt. | Vigtigere end kun et starttidspunkt. |
flat.cheapest_window_remaining_minutes | Resterende varighed af det igangværende bedste prisvindue. | Nyttigt til beslutninger om driftstid. |
price.next_full_window.start | Næste fulde fremtidige vindue for pris. | Planlægning, når du bevidst vil starte senere. |
meta.api_key_state | Status for den indtastede nøgle. | Fejlsøgning og testfase. |
meta.allowed_horizon_hours | Hvad serveren tillader for denne adgang. | Klar gennemsigtighed om grænser. |
meta.used_horizon_hours | Hvad API’et faktisk har leveret. | Så er denne side og backend ærligt i takt. |
Officiel feltreference for home-assistant/summary
Summary-endpointet er bevidst kompakt. Til mange automatiseringer er blokken flat nok. Hvis du vil have mere kontrol eller bygge egne dashboards, kan du også bruge de mere strukturerede blokke price, co2, combined og source.
| Felt | Betydning | Typisk brug |
|---|---|---|
flat.current_price | Aktuel pris i DKK/kWh. Bruger automatisk den bedste tilgængelige offentlige kilde for det aktuelle interval. | Enkel prissensor til automatiseringer. |
flat.current_price_source | Kildelabel for den aktuelle pris, fx day_ahead. | Se om værdien allerede er officiel eller stadig prognosebaseret. |
flat.current_co2_g_kwh | Aktuel CO2-intensitet i gCO2/kWh. | CO2-styret lastflytning. |
flat.cheapest_window_* | Start, slut og gennemsnit for det billigste tidsvindue. | Elbil, varmtvandsbeholder, varmepumpe. |
flat.greenest_window_* | Start, slut og gennemsnit for det grønneste tidsvindue. | CO2-optimeret planlægning. |
flat.combined_window_* | Kompromisvindue mellem pris og CO2. | Når begge hensyn er vigtige uden egen vægtning. |
price.current | Objekt med start, end, value, unit og source for den aktuelle prisslot. | Dashboards og mere præcis logik. |
price.cheapest_window_next_horizon | Struktureret blok for det billigste vindue inklusive varighed og kildefordeling. | Når start, slut og kontekst skal bruges samlet. |
co2.current | Objekt med aktuel CO2-værdi og tilhørende tidsvindue. | CO2-visning uden parsing af flat. |
co2.greenest_window_next_horizon | Struktureret blok for det grønneste vindue. | CO2-optimeret opladning eller opvarmning. |
combined.best_window_next_horizon | Kombineret anbefalingsblok med pris, CO2 og score. | En enkelt "best now"-beslutning uden egen score. |
source.price | Metadata om priskilden, inklusive Firestore-dokument, day-ahead-provider og antal tilgængelige værdier. | Debug, overvågning og kvalitetskontrol. |
source.co2 | Metadata om CO2-kilden. | Debug og sporbarhed. |
hourly-forecast bedre egnet.flat.current_price er den offentligt brugbare pris for det aktuelle slot. Den kan komme fra den officielle day-ahead-auktion eller fra en anden frigivet kilde, hvis hele markedsresultatet endnu ikke er tilgængeligt.retail-forecast-endpoint er i øjeblikket kun beregnet til udvalgte markeder. For andre markeder holder summary bevidst fast i markeds- eller basisværdier.Eksempel: oplad kun bilen i det billige vindue
Netop det er eksempelautomatiseringen til. Den bruger bevidst den boolske værdi binary_sensor.epf_cheapest_price_window_active i stedet for kun at udløse på et klokkeslæt. Det er mere robust, fordi det bedste vindue 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 i stedet for en notifikation starte en ladeboks eller en kontakt direkte, udskifter du blot tjenesten i sidste trin med din egen måltjeneste, for eksempel switch.turn_on.
Tilpas til din opsætning med en AI
Denne prompt hjælper en AI med at bygge en passende Home Assistant-automatisering ud fra summary-endpointet. Den erstatter ikke den enkle kopier-og-indsæt-start ovenfor, men er tænkt til individuelle forbrugere, tidsfrister og sikkerhedsregler.
Giv aldrig en AI din rigtige API-nøgle. Lad altid YOUR_API_KEY stå i resultatet, og indtast først nøglen 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 Danish.
Maskinlæsbart grundlag: OpenAPI-kontrakt for integrationsendpoints.
Hvornår er summary nok, og hvornår har du brug for mere?
summary er nok til de fleste Home Assistant-automatiseringer
Har du brug for aktuelle værdier, et bedste vindue og enkle tilstande, er summary-endpointet den rigtige vej. Netop det er pakkefilen også bygget til.
Til egne prisserier eller diagrammer er et endpoint med råserien bedre
Vil du senere bevidst bygge din egen scoringslogik, diagrammer eller detaljerede tidsserier, er summary-endpointet med vilje ikke maksimalt detaljeret. Så er et forecast-endpoint med råserien den mere passende vej.
Er det præcise elpriser for husholdninger?
Ikke automatisk. Summary arbejder primært med markeds- eller basispriser. Din præcise husholdningspris afhænger desuden af net, afgifter, gebyrer og leverandørens tillæg.
Hvad gør du, hvis der ikke vises værdier efter indsætning?
Typiske årsager: mappen packages er ikke inkluderet, indrykningsfejl i YAML, Home Assistant er ikke genindlæst eller en forkert værdi for country. Hurtigst ser du det i Home Assistants logfiler og i udviklerværktøjerne.
Hvilke zoner får offentliggjorte day-ahead-priser?
Vi videregiver kun offentliggjorte day-ahead-priser, hvor kilden tillader det. For NO1, NO3, NO4, NO5, SE1, SE2, FI, RO, SK, GR, BG og de italienske zoner undtagen Nord leverer endpointene derfor siden 24. oktober 2026 vores prognose for hver time, og sensorerne markerer de timer som prognose. De offentliggjorte priser får du dér via Home Assistants Nord Pool-integration; for SK, GR, BG og Italien via en ENTSO-E-integration med dit eget token.
Relateret: evcc med elpris- og CO2-prognose og Elpris vs CO2.