Språk

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.

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.

Ö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.

Börja gratis, planera längre vid behov

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.

Viktigt om API:et

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.

  1. Sök i HACS efter ”Energy Price Forecast EU” och ladda ner integrationen; starta sedan om Home Assistant.
  2. 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.

  1. 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.
  2. Ersätt alla tre sensor.CHANGE_ME med 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.

Medvetet enkeltPaketfilen använder bara summary-endpointen. Ingen HACS, inget tillägg och inget Python-skript behövs.
Tänkt för verklig styrningDet viktiga här är inte bara starttider utan också tillstånd som is_cheapest_window_now och återstående minuter.
Skonsam hämtningExemplet hämtar som standard var 30:e minut. För day-ahead plus prognos räcker det normalt gott och väl.

Så ser resultatet ut

Förhandsvisning av ett Lovelace-kort med aktuellt pris, CO2-värde och prisfönster.
Lovelace-kortet visar entiteterna från paketfilen direkt, utan att du först behöver bygga egna instrumentpaneler.
Förhandsvisning av en enkel Home Assistant-automation som utlöses av det billigaste prisfönstret.
Exempelautomationen börjar medvetet enkelt och kan sedan anpassas till laddbox, värmepump eller brytare.

Så lägger du in paketet

  1. Ladda ner paketfilen och spara den som /config/packages/energypriceforecast.yaml.
  2. Om packages inte är aktiverat ännu kompletterar du configuration.yaml med det här blocket.
  3. Läs in Home Assistant på nytt eller starta om en gång.
  4. 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_apiRåsvar från summary-endpointen inklusive flat, price, co2 och meta.Felsökning och grund för fler mallar.
sensor.epf_current_priceAktuellt pris i den pågående perioden. Källan kan vara day-ahead eller prognos.Prisstyrd laddbox, värmepump, varmvattenberedare.
sensor.epf_current_co2_intensityAktuellt CO2-värde i den pågående perioden.CO2-inriktad lastförflyttning.
binary_sensor.epf_cheapest_price_window_activeon, 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_windowNästa fullständiga framtida fönster för pris.Starta senare eller planera.
sensor.epf_api_key_statusStatus för den sparade API-nyckeln.Se snabbt om 48 timmar eller 120 timmar verkligen gäller.
sensor.epf_allowed_horizonHorisont 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.

Utan API-nyckelExemplet använder hours=48. Då får du den enkla testhorisonten som är tänkt att vara offentlig utan extra nyckel.
Med API-nyckelNär du sätter bearer-token i headern kan du öka horisonten i paketet till upp till hours=120 alltså 5 dagar.
PrisupplösningDay-ahead kan finnas i perioder om 15 minuter. Prognosen därutöver förblir timvis. Summary kombinerar detta snyggt internt.
Day-ahead förstSå snart officiella day-ahead-priser finns har de företräde. Prognosvärden används bara för den återstående perioden.
CO2 förblir timvisCO2-datan räknas inte om konstlat till kvartar. För summary räcker den timvisa CO2-vyn i regel.
Färdigberäknade fönsterAPI:et levererar inte bara råvärden utan redan det billigaste fönstret, det grönaste fönstret och nästa fullständiga framtida fönster.

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&currency=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_priceAktuellt prisvärde i den pågående perioden.Direkt nuläge för prislogik.
flat.current_co2_g_kwhAktuellt CO2-värde i den pågående perioden.Direkt nuläge för CO2-logik.
flat.is_cheapest_window_nowVisar 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.startNästa fullständiga framtida fönster för pris.Planering när du medvetet vill starta senare.
meta.api_key_stateStatus för den sparade nyckeln.Felsökning och testfas.
meta.allowed_horizon_hoursVad servern tillåter för den här åtkomsten.Tydlig öppenhet om gränser.
meta.used_horizon_hoursVad 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_priceAktuellt 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_sourceKä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_kwhAktuell 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.currentObjekt med start, end, value, unit och source för den aktuella prisperioden.Instrumentpaneler och mer exakt tillståndslogik.
price.cheapest_window_next_horizonStrukturerat 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.currentObjekt med aktuellt CO2-värde och tillhörande tidsfönster.CO2-visning utan att tolka flat.
co2.greenest_window_next_horizonStrukturerat block för det grönaste fönstret.Laddnings- eller värmelogik med låg CO2.
combined.best_window_next_horizonKombinerad rekommendation med pris-, CO2- och poängvärden.Ett enda ”bäst nu”-beslut utan egen poängsättning.
source.priceMetadata om priskällan, bland annat Firestore-dokument, day-ahead-leverantör och antal tillgängliga poster.Felsökning, övervakning och kvalitetskontroll.
source.co2Metadata om CO2-källan.Felsökning och spårbarhet.
Viktigt om prisfältSummary levererar inte den kompletta råserien för alla prisvarianter. För Home Assistant levererar den framför allt nuläget och redan beräknade fönster. För fullständiga tidsserier är hourly-forecast den lämpligare endpointen.
Aktuellt betyder inte faktiskt historiskt prisflat.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.
Totalpris bara för utvalda marknaderEndpointen 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.

Skydda API-nyckeln

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.

Läs mer