Home Assistant · sähkön hinta ja CO2
Kaksi samanarvoista tapaa tuoda hinta- ja CO2-tiedot Home Assistantiin
Energy Price Forecast EU:n saa Home Assistantiin kahdella täysin tuetulla tavalla: natiivilla HACS-integraatiolla, joka määritetään käyttöliittymässä, tai perinteisellä YAML-paketilla, jossa on REST-sensori. Molemmat käyttävät samaa rajapintaa ja tuottavat ajankohtaiset arvot, käynnissä olevat tilat ja tärkeimmät aikaikkunat.
- HACS-integraatio: määritys valintaikkunassa, omat entiteetit, HACS:n oletuskaupassa
- YAML-paketti: REST-sensori ja mallisensorit kopioitaviksi, toimii myös ilman HACS:ia
- ilman API-avainta tavallinen testi kattaa 48 tuntia, API-avaimella jopa 120 tuntia – sama kummallakin tavalla
Kumpi tapa sopii sinulle?
Molemmat tavat käyttävät samaa summary-päätepistettä ja tuottavat samat tiedot. Ero on käyttöönotossa ja ylläpidossa.
packages/ ja valmista tuli. HACS:ia ei tarvita ja YAML-määritys on täysin hallinnassasi – hyvä tapa, jos hallitset Home Assistantin määrityksiä muutenkin Gitillä.
HACS-integraation avoin repositorio: github.com/BackupBaTTerY/energypriceforecast-home-assistant. Molemmat tavat voivat toimia myös rinnakkain, kunhan et luo samoja entiteettitunnuksia kahdesti.
Home Assistant -yhteys toimii edelleen ilman API-avainta ja tuottaa tavallisesti enintään 48 tuntia. Jos haluat suunnitella suurempia kuormia usealle päivälle, voit kokeilla Private Prota ja jopa 120 tunnin ennustetta 14 päivää ilmaiseksi.
Uusissa asennuksissa kannattaa käyttää osoitetta https://api.energypriceforecast.eu/api/v1/... pohjana. Summary-rajapinta ei palauta täydellistä hintasarjaa vaan tiiviin automaatiolohkon, jossa ovat nykyinen hinta, nykyinen CO2-arvo, paras mahdollinen ikkuna ja käyttöoikeuttasi koskevat metatiedot.
Näin otat HACS-integraation käyttöön
Integraatio on HACS:n oletuskaupassa, joten mitään ei tarvitse lisätä käsin.
- Etsi HACS:sta ”Energy Price Forecast EU” ja lataa integraatio; käynnistä sitten Home Assistant uudelleen.
- Asetukset → Laitteet ja palvelut → Lisää integraatio, hae ”Energy Price Forecast EU” ja valitse markkina sekä mahdolliset lisäasetukset.
Sivun yläosan painike (”Lisää HACS-integraatio”) avaa integraation suoraan HACS:ssa, jos HACS on jo asennettu.
Vertaa ennustetta julkaistuihin hintoihin
Vihreä näyttää julkaistut day-ahead-hinnat, oranssi nykyisen ennusteen ja sininen katkoviiva ensimmäisen tallennetun ennusteen. Aiempi ennuste pysyy näkyvissä virallisten hintojen ilmestyessä.
- Päivitä Energy Price Forecast EU HACS:ssa vähintään versioon 1.12.0 ja käynnistä Home Assistant uudelleen. Asenna myös ApexCharts Card 2.1.0 tai uudempi HACS:n kautta.
- Korvaa kaikki kolme
sensor.CHANGE_ME-kohtaa samalla hintasarjan entiteetillä kohdasta Kehittäjätyökalut → Tilat. Käytä nykyisen kuluttajahinnan entiteettiä, jos haluat määrittämäsi kokonaishinnan. Liitä YAML kohdassa Koontinäyttö → Muokkaa → Lisää kortti → Manuaalinen.
Tallennus alkaa päivityksen jälkeen ja säilyy uudelleenkäynnistyksissä. Arvot säilyvät kyseisen markkinapäivän loppuun; vanhoja ennusteita ei luoda jälkikäteen. captured_at on Home Assistantin vastaanottoaika, ei mallin ajoaika. Tämä ei ole kiinteän ennustepituuden laatumittaus eikä rajaton arkisto.
Varmista, että akselin yksikkö vastaa anturia, esimerkiksi EUR/kWh eikä snt/kWh. Laskettu kokonaishinta ei takaa sähkölaskun summaa. Ilman avainta API-horisontti on edelleen enintään 48 tuntia; käytä asianmukaista pääsyä ja graph_span: 6d enintään 120 tunnille. Kortti koskee HACS-integraatiota, ei alla olevaa REST-summary-esimerkkiä, eikä lisää API-kutsuja.
Kopioitava YAML
type: custom:apexcharts-card
header:
show: true
title: Energy Price Forecast EU
graph_span: 3d
span:
start: day
now:
show: true
label: Nyt
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: Virallinen (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: Nykyinen ennuste
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: Tallennettu ennuste (ensimmäinen vastaanotettu)
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;
Valinnainen: muokkaa korttia tekoälyn avulla
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 Finnish.
Tulos viidessä minuutissa (YAML-paketti)
Jos valitsit YAML-tavan, ota nämä kolme tiedostoa. Pakettitiedosto hakee tiedot, Lovelace-kortti näyttää ne ja esimerkkiautomaatio havainnollistaa varsinaisen käytön.
is_cheapest_window_now ja jäljellä olevat minuutit.Tältä tulos näyttää
Näin otat paketin käyttöön
- Lataa pakettitiedosto ja tallenna se nimellä
/config/packages/energypriceforecast.yaml. - Jos packages ei ole vielä käytössä, lisää tiedostoon
configuration.yamltämä lohko. - Lataa Home Assistant uudelleen tai käynnistä se kerran uudelleen.
- Tuo sen jälkeen Lovelace-kortti ja halutessasi esimerkkiautomaatio.
homeassistant:
packages: !include_dir_named packages
Lovelace-kortin voit lisätä koontinäyttöön korttityypillä Manuaalinen luettelosta. Automaation voit tuoda automaatioihin myös YAML-muodossa tai käyttää sitä pelkkänä mallina.
Mitkä entiteetit saat sen jälkeen?
Pakettitiedosto luo yhden raakalähteen ja sen päälle suoraan käytettäviä entiteettejä. Näet heti, toimiiko rajapinta kunnolla, ja voit rakentaa omia automaatioita jäsentämättä JSONia.
| Entiteetti | Merkitys | Tyypillinen käyttö |
|---|---|---|
sensor.energypriceforecast_api | Summary-päätepisteen raakavastaus, mukana flat, price, co2 ja meta. | Vianetsintä ja pohja muille malleille. |
sensor.epf_current_price | Nykyinen hinta käynnissä olevalla jaksolla. Lähde voi olla day-ahead tai ennuste. | Hinnan mukaan ohjattu latausasema, lämpöpumppu, lämminvesivaraaja. |
sensor.epf_current_co2_intensity | Nykyinen CO2-arvo käynnissä olevalla jaksolla. | Kuorman siirto CO2:n mukaan. |
binary_sensor.epf_cheapest_price_window_active | on, kun laskettu paras hintaikkuna on jo käynnissä. | Suora käyntipäätös ilman omia aikavertailuja. |
sensor.epf_cheapest_price_window_remaining_minutes | Tämänhetkisen parhaan hintaikkunan jäljellä oleva kesto. | Arvio siitä, kuinka kauan kuorma saa vielä käydä. |
sensor.epf_next_full_price_window | Seuraava kokonainen tuleva hintaikkuna. | Myöhempi käynnistys tai suunnittelu. |
sensor.epf_api_key_status | Tallennetun API-avaimen tila. | Näet nopeasti, onko voimassa todella 48 vai 120 tuntia. |
sensor.epf_allowed_horizon | Palvelimen sallima horisontti tunteina. | Tarkista, saako asennuksesi todella halutun pituuden. |
Minkä ajanjakson rajapinta tarkalleen tuottaa?
Home Assistantin kannalta ratkaisevaa ei ole vain URL vaan myös sen takana oleva logiikka. Juuri sen pitää olla läpinäkyvää.
hours=48. Saat näin yksinkertaisen testihorisontin, joka on tarkoitettu julkiseksi ilman erillistä avainta.hours=120 eli viiteen päivään.Mihin API-avain annetaan ja miten horisonttia pidennetään?
Molemmat tehdään suoraan pakettitiedostossa. Toista päätepistettä ei tarvita: otat vain Authorization-otsakkeen käyttöön ja muutat tuntimäärää.
rest:
- resource: "https://api.energypriceforecast.eu/api/v1/home-assistant/summary?country=fi&hours=120&window_hours=4"
scan_interval: 1800
headers:
Accept: "application/json"
Authorization: "Bearer YOUR_API_KEY"
Sen, käytetäänkö avaintasi todella, näet sen jälkeen entiteeteistä sensor.epf_api_key_status, sensor.epf_allowed_horizon ja sensor.epf_used_horizon.
Mitä summary-päätepiste käytännössä antaa?
Summary-polku on rakennettu tarkoituksella automaatioita varten. Se säästää paljon omaa logiikkaa, koska sinun ei tarvitse ensin jäsentää pitkiä tuntisarjoja tehdäksesi yksinkertaisia päätöksiä.
| Kenttä | Merkitys | Miksi se on hyödyllinen |
|---|---|---|
flat.current_price | Nykyinen hinta-arvo käynnissä olevalla jaksolla. | Suora nykytila hintalogiikkaa varten. |
flat.current_co2_g_kwh | Nykyinen CO2-arvo käynnissä olevalla jaksolla. | Suora nykytila CO2-logiikkaa varten. |
flat.is_cheapest_window_now | Näyttää, onko paras hintaikkuna jo aktiivinen. | Tärkeämpi kuin pelkkä alkamisaika. |
flat.cheapest_window_remaining_minutes | Käynnissä olevan parhaan hintaikkunan jäljellä oleva kesto. | Hyödyllinen käyntiaikaa koskevissa päätöksissä. |
price.next_full_window.start | Seuraava kokonainen tuleva hintaikkuna. | Suunnittelu, kun haluat tietoisesti aloittaa myöhemmin. |
meta.api_key_state | Tallennetun avaimen tila. | Vianetsintä ja testivaihe. |
meta.allowed_horizon_hours | Mitä palvelin sallii tälle käyttöoikeudelle. | Selkeä läpinäkyvyys rajoista. |
meta.used_horizon_hours | Mitä rajapinta todella palautti. | Näin tämä sivu ja taustajärjestelmä pysyvät rehellisesti samassa tahdissa. |
Virallinen kenttäviite päätepisteelle home-assistant/summary
Summary-päätepiste on tarkoituksella tiivis. Moniin automaatioihin riittää jo lohko flat. Jos haluat ohjata tarkemmin tai rakentaa visualisointeja, voit käyttää lisäksi jäsennellympiä lohkoja price, co2, combined ja source.
| Kenttä | Merkitys | Tyypillinen käyttö |
|---|---|---|
flat.current_price | Nykyinen hinta yksikössä EUR/kWh. Käyttää käynnissä olevalle jaksolle automaattisesti parasta saatavilla olevaa julkista lähdettä. | Yksinkertainen hintasensori automaatioihin. |
flat.current_price_source | Nykyisen hinnan lähdetunniste, esimerkiksi day_ahead. | Tarkista, onko arvo jo virallinen vai vielä ennuste. |
flat.current_co2_g_kwh | Nykyinen CO2-intensiteetti yksikössä gCO2/kWh. | Joustavan kulutuksen siirto CO2:n mukaan. |
flat.cheapest_window_* | Edullisimman aikaikkunan alku, loppu ja keskiarvo pyydetyllä horisontilla. | Sähköauton lataus, lämminvesivaraaja, lämpöpumppu. |
flat.greenest_window_* | Vähäpäästöisimmän aikaikkunan alku, loppu ja keskiarvo. | Vähäpäästöinen ajoitus. |
flat.combined_window_* | Hinnan ja CO2:n välinen kompromissi-ikkuna. | Kun molemmat ovat tärkeitä etkä halua määrittää omaa painotusta. |
price.current | Olio, jossa on start, end, value, unit ja source nykyiselle hintajaksolle. | Koontinäytöt ja tarkempi tilalogiikka. |
price.cheapest_window_next_horizon | Jäsennelty lohko edullisimmalle ikkunalle, mukana kesto ja lähdekohtaiset määrät. | Kun tarvitset alun, lopun ja kontekstin yhdessä. |
co2.current | Olio, jossa on nykyinen CO2-arvo ja siihen kuuluva aikaikkuna. | CO2-näyttö jäsentämättä lohkoa flat. |
co2.greenest_window_next_horizon | Jäsennelty lohko vihreimmälle ikkunalle. | Vähäpäästöinen lataus- tai lämmityslogiikka. |
combined.best_window_next_horizon | Yhdistetty suositus, jossa ovat hinta-, CO2- ja pistearvot. | Yksi ”paras nyt” -päätös ilman omaa pisteytystä. |
source.price | Hintalähteen metatiedot, muun muassa Firestore-dokumentti, day-ahead-toimittaja ja saatavilla olevien merkintöjen määrä. | Vianetsintä, valvonta ja laadunvarmistus. |
source.co2 | CO2-lähteen metatiedot. | Vianetsintä ja jäljitettävyys. |
hourly-forecast.flat.current_price on julkinen hinta-arvo, jota voi käyttää juuri nyt käynnissä olevalle jaksolle. Se voi tulla virallisesta day-ahead-huutokaupasta tai muusta julkaistusta lähteestä, kun markkinatulos ei ole vielä kokonaan saatavilla.retail-forecast on toistaiseksi tarkoitettu julkiseksi vain valituille markkinoille. Muilla markkinoilla summary pysyy tarkoituksella markkina- eli perusarvoissa.Esimerkki: lataa auto vain edullisessa ikkunassa
Juuri tätä varten esimerkkiautomaatio on mukana. Se käyttää tarkoituksella totuusarvoa binary_sensor.epf_cheapest_price_window_active eikä laukea pelkän kellonajan perusteella. Se on luotettavampaa, koska paras ikkuna voi olla jo käynnissä.
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"
Jos haluat ilmoituksen sijaan käynnistää suoraan latausaseman tai kytkimen, vaihdat viimeisessä vaiheessa vain palvelun omaan kohdepalveluusi, esimerkiksi switch.turn_on.
Mukauta omaan asennukseesi tekoälyn avulla
Tämä kehote auttaa tekoälyä rakentamaan summary-päätepisteestä sopivan Home Assistant -automaation. Se ei korvaa yllä olevaa yksinkertaista kopioi ja liitä -aloitusta, vaan on tarkoitettu yksilöllisiin kuormiin, aikarajoihin ja turvasääntöihin.
Älä koskaan anna tekoälylle oikeaa API-avaintasi. Jätä tulokseen aina paikkamerkki YOUR_API_KEY ja lisää avain vasta paikallisesti Home Assistantissa.
Näytä kopioitava kehote
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 Finnish.
Koneluettava pohja: integraatiopäätepisteiden OpenAPI-sopimus.
Milloin summary riittää ja milloin tarvitset enemmän?
summary riittää useimpiin Home Assistant -automaatioihin
Jos tarvitset ajankohtaiset arvot, parhaan ikkunan ja yksinkertaiset tilat, summary-päätepiste on oikea tapa. Juuri sitä varten myös pakettitiedosto on rakennettu.
Omiin hintasarjoihin tai kaavioihin sopii paremmin raakasarjan päätepiste
Jos haluat myöhemmin rakentaa omaa pisteytyslogiikkaa, kaavioita tai yksityiskohtaisia aikasarjoja, summary-päätepiste ei tarkoituksella ole mahdollisimman yksityiskohtainen. Silloin sopivampi on ennustepäätepiste, jossa on raakasarja.
Ovatko nämä kotitalouden tarkkoja sähkön hintoja?
Eivät automaattisesti. Summary käyttää ensisijaisesti markkina- eli perushintoja. Kotitaloutesi tarkka hinta riippuu lisäksi siirrosta, veroista, maksuista ja sähkönmyyjän lisistä.
Mitä tehdä, jos arvoja ei näy liittämisen jälkeen?
Tyypillisiä syitä: packages-kansiota ei ole otettu mukaan, YAMLissa on sisennysvirhe, Home Assistantia ei ole ladattu uudelleen tai väärä arvo parametrille country. Nopeimmin sen näkee Home Assistantin lokeista ja kehittäjätyökaluista.
Mille alueille julkaistut day-ahead-hinnat tulevat?
Välitämme julkaistut day-ahead-hinnat vain, jos lähde sen sallii. Alueille NO1, NO3, NO4, NO5, SE1, SE2, FI, RO, SK, GR, BG ja Italian alueet Pohjoista lukuun ottamatta rajapinnat palauttavat siksi 24. lokakuuta 2026 alkaen ennusteemme jokaiselle tunnille, ja anturit merkitsevät nämä tunnit ennusteeksi. Julkaistut hinnat saat siellä Home Assistantin Nord Pool -integraation kautta; SK:lle, GR:lle, BG:lle ja Italialle ENTSO-E-integraation kautta omalla tunnuksella.
Aiheeseen liittyvää: evcc sekä sähkön hinta- ja CO2-ennuste.