Home Assistant · elpris och CO2
Två likvärdiga vägar till pris- och CO2-data i Home Assistant
Energy Price Forecast EU har två fullt stödda vägar in i Home Assistant: en inbyggd HACS-integration med grafisk konfiguration eller ett klassiskt YAML-paket med REST-sensor. Båda använder samma API och levererar aktuella värden, pågående tillstånd och de viktigaste tidsfönstren.
- HACS-integration: konfiguration via en dialog, egna entiteter, med i HACS standardbutik
- YAML-paket: REST-sensor plus mallsensorer att kopiera in, fungerar även utan HACS
- utan API-nyckel ett typiskt test med 48 timmar, med API-nyckel upp till 120 timmar – lika för båda vägarna
Vilken väg passar dig?
Båda vägarna använder samma summary-endpoint och levererar samma data. Skillnaden ligger i konfiguration och underhåll.
packages/ och du är klar. Ingen HACS behövs, full kontroll över YAML-konfigurationen – ett bra val om du ändå hanterar din Home Assistant-konfiguration med Git.
Öppet repository för HACS-integrationen: github.com/BackupBaTTerY/energypriceforecast-home-assistant. Båda vägarna kan också köras parallellt, så länge du inte skapar samma entity-ID två gånger.
Home Assistant-åtkomsten går fortfarande att använda utan API-nyckel och levererar normalt upp till 48 timmar. Vill du planera större förbrukare över flera dagar kan du prova Private Pro med upp till 120 timmar gratis i 14 dagar.
Nya installationer bör använda https://api.energypriceforecast.eu/api/v1/... som adress. Summary-API:et levererar ingen komplett prisserie utan ett kompakt automationsblock med aktuellt pris, aktuellt CO2-värde, bästa möjliga fönster och metainformation om din åtkomst.
Så konfigurerar du HACS-integrationen
Integrationen finns i HACS standardbutik, så du behöver inte lägga till något manuellt.
- Sök i HACS efter ”Energy Price Forecast EU” och ladda ner integrationen; starta sedan om Home Assistant.
- Inställningar → Enheter och tjänster → Lägg till integration, sök efter ”Energy Price Forecast EU” och välj marknad samt eventuella valfria inställningar.
Knappen högst upp (”Lägg till HACS-integrationen”) öppnar integrationen direkt i HACS om HACS redan är installerat.
Jämför prognosen med publicerade priser
Grönt visar publicerade day-ahead-priser, orange den aktuella prognosen och den blå streckade linjen den först sparade prognosen. Den tidigare prognosen finns kvar när de officiella priserna kommer.
- Uppdatera Energy Price Forecast EU till minst 1.12.0 i HACS och starta om Home Assistant. Installera också ApexCharts Card 2.1.0 eller senare via HACS.
- Ersätt alla tre
sensor.CHANGE_MEmed samma prisserie-entitet från Utvecklarverktyg → Tillstånd. Använd entiteten för aktuellt slutkundspris för ditt konfigurerade totalpris. Klistra in YAML under Instrumentpanel → Redigera → Lägg till kort → Manuellt.
Lagringen börjar efter uppdateringen och överlever omstarter. Värden sparas till slutet av den aktuella marknadsdagen; tidigare prognoser kan inte återskapas. captured_at är mottagningstiden i Home Assistant, inte modellens körningstid. Det är varken ett kvalitetsmått med fast framförhållning eller ett obegränsat arkiv.
Anpassa axelns enhet till sensorn, exempelvis SEK/kWh eller EUR/kWh, inte öre/kWh. Ett beräknat totalpris är ingen garanterad elräkning. Utan nyckel är API-horisonten fortfarande högst 48 timmar; använd rätt åtkomst och graph_span: 6d för högst 120 timmar. Kortet gäller HACS-integrationen, inte REST-summary-exemplet nedan, och gör inga extra API-anrop.
YAML att kopiera
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: Officiellt (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 prognos
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: Sparad prognos (först mottagen)
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;
Valfritt: anpassa 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 Swedish.
Resultat på 5 minuter (YAML-paket)
Har du valt YAML-vägen tar du dessa tre filer. Paketfilen hämtar datan, Lovelace-kortet visar den och exempelautomationen visar den egentliga användningen.
is_cheapest_window_now och återstående minuter.Så ser resultatet ut
Så lägger du in paketet
- Ladda ner paketfilen och spara den som
/config/packages/energypriceforecast.yaml. - Om packages inte är aktiverat ännu kompletterar du
configuration.yamlmed det här blocket. - Läs in Home Assistant på nytt eller starta om en gång.
- Importera sedan Lovelace-kortet och eventuellt exempelautomationen.
homeassistant:
packages: !include_dir_named packages
Lovelace-kortet lägger du in i en instrumentpanel via korttypen Manuellt i listan. Automationen kan du också importera som YAML under automationer eller bara använda som mall.
Vilka entiteter får du sedan?
Paketfilen skapar en råkälla och, byggda på den, entiteter som går att använda direkt. Då ser du genast om API:et fungerar som det ska, och du kan bygga egna automationer utan JSON-tolkning.
| Entitet | Betydelse | Typisk användning |
|---|---|---|
sensor.energypriceforecast_api | Råsvar från summary-endpointen inklusive flat, price, co2 och meta. | Felsökning och grund för fler mallar. |
sensor.epf_current_price | Aktuellt pris i den pågående perioden. Källan kan vara day-ahead eller prognos. | Prisstyrd laddbox, värmepump, varmvattenberedare. |
sensor.epf_current_co2_intensity | Aktuellt CO2-värde i den pågående perioden. | CO2-inriktad lastförflyttning. |
binary_sensor.epf_cheapest_price_window_active | on, när det beräknade bästa prisfönstret redan pågår. | Direkt beslut om drift utan egna tidsjämförelser. |
sensor.epf_cheapest_price_window_remaining_minutes | Återstående tid för det just nu bästa prisfönstret. | Uppskatta hur länge en förbrukare får fortsätta gå. |
sensor.epf_next_full_price_window | Nästa fullständiga framtida fönster för pris. | Starta senare eller planera. |
sensor.epf_api_key_status | Status för den sparade API-nyckeln. | Se snabbt om 48 timmar eller 120 timmar verkligen gäller. |
sensor.epf_allowed_horizon | Horisont i timmar som servern tillåter. | Kontrollera att din installation verkligen får önskad längd. |
Vilken period levererar API:et exakt?
För Home Assistant är det avgörande inte bara URL:en utan också logiken bakom. Just den ska vara genomskinlig.
hours=48. Då får du den enkla testhorisonten som är tänkt att vara offentlig utan extra nyckel.hours=120 alltså 5 dagar.Var anger du API-nyckeln och hur ökar du horisonten?
Båda sakerna görs direkt i paketfilen. Du behöver ingen andra endpoint; du aktiverar bara Authorization-headern och justerar timvärdet.
rest:
- resource: "https://api.energypriceforecast.eu/api/v1/home-assistant/summary?country=se3¤cy=SEK&hours=120&window_hours=4"
scan_interval: 1800
headers:
Accept: "application/json"
Authorization: "Bearer YOUR_API_KEY"
Om din nyckel verkligen används ser du sedan i sensor.epf_api_key_status, sensor.epf_allowed_horizon och sensor.epf_used_horizon.
Vad ger summary-endpointen konkret?
Summary-vägen är medvetet byggd för automationer. Den sparar dig mycket egen logik, eftersom du inte först behöver tolka långa timserier för att fatta enkla beslut.
| Fält | Betydelse | Varför det är användbart |
|---|---|---|
flat.current_price | Aktuellt prisvärde i den pågående perioden. | Direkt nuläge för prislogik. |
flat.current_co2_g_kwh | Aktuellt CO2-värde i den pågående perioden. | Direkt nuläge för CO2-logik. |
flat.is_cheapest_window_now | Visar om det bästa prisfönstret redan är aktivt. | Viktigare än bara en starttid. |
flat.cheapest_window_remaining_minutes | Återstående tid för det pågående bästa prisfönstret. | Användbart för beslut om drifttid. |
price.next_full_window.start | Nästa fullständiga framtida fönster för pris. | Planering när du medvetet vill starta senare. |
meta.api_key_state | Status för den sparade nyckeln. | Felsökning och testfas. |
meta.allowed_horizon_hours | Vad servern tillåter för den här åtkomsten. | Tydlig öppenhet om gränser. |
meta.used_horizon_hours | Vad API:et faktiskt har levererat. | Så håller den här sidan och backend ärligt jämna steg. |
Officiell fältreferens för home-assistant/summary
Summary-endpointen är medvetet kompakt. För många automationer räcker redan blocket flat. Vill du styra mer exakt eller bygga egna instrumentpaneler kan du dessutom använda de mer strukturerade blocken price, co2, combined och source.
| Fält | Betydelse | Typisk användning |
|---|---|---|
flat.current_price | Aktuellt pris i SEK/kWh. Använder automatiskt den bästa tillgängliga offentliga källan för den pågående perioden. | Enkel prissensor för automationer. |
flat.current_price_source | Källetikett för det aktuella priset, till exempel day_ahead. | Kontrollera om värdet redan är officiellt eller fortfarande en prognos. |
flat.current_co2_g_kwh | Aktuell CO2-intensitet i gCO2/kWh. | CO2-baserad förflyttning av flexibel förbrukning. |
flat.cheapest_window_* | Start, slut och genomsnitt för det billigaste tidsfönstret i den begärda horisonten. | Elbilsladdning, varmvattenberedare, värmepump. |
flat.greenest_window_* | Start, slut och genomsnitt för tidsfönstret med lägst CO2. | Planering med låg CO2. |
flat.combined_window_* | Kompromissfönster mellan pris och CO2. | När båda spelar roll och du inte vill definiera en egen viktning. |
price.current | Objekt med start, end, value, unit och source för den aktuella prisperioden. | Instrumentpaneler och mer exakt tillståndslogik. |
price.cheapest_window_next_horizon | Strukturerat block för det billigaste fönstret med längd och antal per källa. | När du behöver start, slut och sammanhang tillsammans. |
co2.current | Objekt med aktuellt CO2-värde och tillhörande tidsfönster. | CO2-visning utan att tolka flat. |
co2.greenest_window_next_horizon | Strukturerat block för det grönaste fönstret. | Laddnings- eller värmelogik med låg CO2. |
combined.best_window_next_horizon | Kombinerad rekommendation med pris-, CO2- och poängvärden. | Ett enda ”bäst nu”-beslut utan egen poängsättning. |
source.price | Metadata om priskällan, bland annat Firestore-dokument, day-ahead-leverantör och antal tillgängliga poster. | Felsökning, övervakning och kvalitetskontroll. |
source.co2 | Metadata om CO2-källan. | Felsökning och spårbarhet. |
hourly-forecast den lämpligare endpointen.flat.current_price är det offentliga prisvärde som går att använda just nu för den pågående perioden. Det kan komma från den officiella day-ahead-auktionen eller från en annan frisläppt källa när marknadsresultatet ännu inte är komplett.retail-forecast är för närvarande bara avsedd att vara offentlig för utvalda marknader. För övriga marknader håller sig summary medvetet till marknads- eller basvärden.Exempel: ladda bilen bara i det billiga fönstret
Just det är exempelautomationen till för. Den använder medvetet det booleska värdet binary_sensor.epf_cheapest_price_window_active i stället för att bara utlösas på ett klockslag. Det är robustare, eftersom det bästa fönstret redan kan pågå.
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"
Vill du starta en laddbox eller en brytare direkt i stället för en avisering byter du bara ut tjänsten i sista steget mot din egen måltjänst, till exempel switch.turn_on.
Anpassa till din installation med AI
Den här prompten hjälper en AI att bygga en passande Home Assistant-automation utifrån summary-endpointen. Den ersätter inte den enkla kopiera-och-klistra-starten ovan utan är tänkt för individuella förbrukare, tidsgränser och säkerhetsregler.
Ge aldrig en AI din riktiga API-nyckel. Låt alltid YOUR_API_KEY stå kvar i resultatet och ange nyckeln först lokalt i Home Assistant.
Visa prompt att kopiera
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 Swedish.
Maskinläsbar grund: OpenAPI-kontrakt för integrationsendpoints.
När räcker summary och när behöver du mer?
summary räcker för de flesta Home Assistant-automationer
Behöver du aktuella värden, ett bästa fönster och enkla tillstånd är summary-endpointen rätt väg. Just det är paketfilen också byggd för.
För egna prisserier eller diagram är en endpoint med råserien bättre
Vill du senare medvetet bygga egen poänglogik, diagram eller detaljerade tidsserier är summary-endpointen avsiktligt inte maximalt detaljerad. Då är en forecast-endpoint med råserien den lämpligare vägen.
Är det här exakta elpriser för hushåll?
Inte automatiskt. Summary arbetar främst med marknads- eller baspriser. Ditt exakta hushållspris beror dessutom på nät, skatter, avgifter och elhandlarens påslag.
Vad gör du om inga värden visas efter inklistringen?
Typiska orsaker: mappen packages är inte inkluderad, indragsfel i YAML, Home Assistant har inte lästs in på nytt eller ett felaktigt värde för country. Snabbast ser du det i Home Assistants loggar och i utvecklarverktygen.
Vilka zoner får publicerade day-ahead-priser?
Vi för bara vidare publicerade day-ahead-priser där källan tillåter det. För NO1, NO3, NO4, NO5, SE1, SE2, FI, RO, SK, GR, BG och de italienska zonerna utom Nord levererar endpointerna därför sedan den 24 oktober 2026 vår prognos för varje timme, och sensorerna markerar de timmarna som prognos. De publicerade priserna får du där via Home Assistants Nord Pool-integration; för SK, GR, BG och Italien via en ENTSO-E-integration med en egen token.
Relaterat: evcc med elpris- och CO2-prognos.