Kategoria: HEOMF

  • Case: oma talo — Osa 6: HA:n rooli ja entiteettimalli

    Tämä on kuudes osa sarjasta joka dokumentoi EnergyHub-järjestelmän rakentamisen vanhaan rintamamiestaloon. Edellisessä osassa käytiin läpi prioriteetit, tilakoneet ja fallback-logiikka — miten järjestelmä päättää kuka saa sähköä ja mitä tapahtuu kun yhteys katkeaa. Tässä osassa katsotaan miten data organisoidaan Home Assistantissa niin että se pysyy hallittavana kun järjestelmä kasvaa.


    Energiajärjestelmässä on paljon entiteettejä. Modbus-rekisterit, hintatiedot, vaihevirrat, lämpöpumpun anturit, capability-flagit, parametrit, ohjaussignaalit — kaikki asuvat Home Assistantissa ja kaikki tarvitsevat selkeän paikan.

    Ilman rakennetta tämä kertyy nopeasti kasaksi entiteettejä joiden nimet eivät kerro mitään, joiden yksiköt vaihtelevat integraatiosta toiseen ja joita ei kukaan enää muista mistä tulevat. EnergyHubissa rakenne on tehty etukäteen — ei jälkikäteen siivoamalla.

    Neljä roolia, neljä etuliitettä

    Jokainen EnergyHub-entiteetti alkaa etuliitteellä joka kertoo sen roolin järjestelmässä. Tämä ei ole pelkkä nimeämiskäytäntö — se on tietomalli joka tekee näkyväksi mitä kukin entiteetti tekee ja kuka saa käyttää sitä.

    m_ — mittaukset

    Kanoniset, normalisoidut arvot joita kaikki muut järjestelmän osat käyttävät. sensor.m_grid_power_w, sensor.m_pv_power_w, sensor.m_spot_price_eur_kwh. Nämä ovat template-sensoreita jotka normalisoivat raakadatan yhtenäiseen muotoon — oikea yksikkö, oikea etumerkki, oikea skaalaus.

    Node-RED käyttää abstrahoitua järjestelmämallia, ei integraatiokohtaista raakadataa. Se ei tiedä tuleeko tieto Nordpool-integraatiosta, P1-mittarilta vai Modbus-rekisteristä — eikä sen tarvitse tietää. Se lukee m_buy_price_eur_kwh ja saa aina oikean arvon.

    p_ — parametrit

    Kaikki säädettävät kynnysarvot ja raja-arvot. input_number.p_fuse_limit_a, input_number.p_cheap_price, input_number.p_solar_excess_w. Nämä eivät ole hardkoodattuja lukuja automaatioissa tai Node-RED-funktioissa — ne ovat HA:n käyttöliittymässä säädettäviä liukusäätimiä ja syöttökenttiä.

    Kun sulakerajaa pitää muuttaa — esimerkiksi liittymäkoko kasvaa 25:stä 35 ampeerin — muutos tehdään yhteen paikkaan. Node-RED lukee arvon MQTT-telemetrian kautta ja käyttää sitä automaattisesti.

    c_ — capabilityt ja tilaohjaukset

    Capability-flagit ja tilaohjaukset. input_boolean.c_ev_charge_allowed, input_select.c_hp_mode. Kuten aiemmissa osissa selitettiin, c_-etuliite kattaa sekä käyttöoikeudet (c_ev_charge_allowed — saako EV ladata) että tilaohjaukset (c_hp_mode — missä tilassa lämpöpumppu on). Nimestä näkee kumpi on kyseessä: _allowed-päätteiset ovat käyttöoikeuksia, muut ovat tilaohjausta. Nämä eivät ole eksplisiittisiä komentoja — komennot tulevat Node-REDiltä MQTT:n kautta.

    d_ — diagnostiikka

    Ihmisluettavat selitykset järjestelmän päätöksistä. input_text.d_ev_last_reason, input_text.d_hp_last_reason. Nämä eivät ohjaa mitään — ne kertovat miksi viimeisin päätös tehtiin. ”EV estetty: peak_protection, L1=23.8A”. Diagnostiikkaentiteetit tekevät näkymättömästä logiikasta näkyvää ilman että tarvitsee avata Node-REDiä.

    sys_ — järjestelmätila

    Globaalit tilaentiteetit. input_boolean.sys_safety_trip, input_boolean.sys_optimization_enabled, input_select.sys_operating_mode. Nämä ovat koko järjestelmän tila-arvoja joita useat komponentit lukevat.

    Pakettipohja — yksi tiedosto per vastuu

    Entiteetit eivät asu yhdessä suuressa tiedostossa. Ne on jaettu paketteihin loogisten vastuurajojen mukaan:

    00_core.yaml          p_-parametrit, sys_-boolean-arvot
    00_core_modes.yaml    sys_operating_mode, c_-flagit ja moodit
    10_integrations.yaml  Modbus, Nordpool, P1-mittari — raakadata
    20_measurements.yaml  m_-sensorit — normalisoitu data
    30_load_ev.yaml       EV-latauksen tilakone, d_ev_last_reason
    31_load_heatpump.yaml HP EVU/Boost, d_hp_last_reason
    40_optimization.yaml  MQTT-rajapinta Node-REDiin
    50_reporting.yaml     Energiamittarit, utility_meter

    Rakenne muistuttaa modulaarista ohjelmistoarkkitehtuuria: core, integrations, measurements, optimization, reporting. Jokainen kerros on toisistaan riippumaton — 20_measurements.yaml voi muuttua ilman että 40_optimization.yaml:iin tarvitsee koskea.

    Kun EV-latauksen logiikkaan tarvitaan muutos, avataan 30_load_ev.yaml. Kun Modbus-rekisteriin tulee korjaus, avataan 10_integrations.yaml. Tiedoston nimi kertoo suoraan mitä se sisältää.

    Pieni mutta tärkeä täsmennys raportoinnista: 50_reporting.yaml:n utility_meter on operatiivinen raportointikerros — se laskee kuinka paljon sähköä on ostettu tai myyty päivässä, kuukaudessa, vuodessa. Se ei ole sama asia kuin observability. InfluxDB ja Grafana ovat observability-kerros — ne tallentavat aikasarjadatan ja tekevät jälkikäteisanalyysin mahdolliseksi. Molemmat ovat tarpeen, mutta eri tarkoituksiin.

    Kanoninen mittauskerros käytännössä

    20_measurements.yaml on koko järjestelmän tärkein tiedosto vaikka se ei ohjaa mitään. Se on se kerros joka tekee raakadatasta luotettavia mittauksia.

    Raakadata ei ole sama asia kuin luotettava mittaus. P1-mittarin arvo voi olla positiivinen tai negatiivinen riippuen integraatiosta. Nordpool voi palauttaa arvon senttiä tai euroa. Modbus-rekisteri voi palauttaa unknown jos yhteys on poikki. Kanoninen kerros ratkaisee nämä kaikki yhdessä paikassa.

    Esimerkki ostosähkön hintalaskennasta:

    yaml

    - name: "m_buy_price_eur_kwh"
      state: >
        {% set spot = state_attr('sensor.nordpool_kwh_fi_eur_3_00_0',
           'current_price') | float(0) %}
        {% set marginaali = states('input_number.p_electricity_margin')
           | float(0.004) %}
        {% set siirto = states('input_number.p_electricity_transfer')
           | float(0.048) %}
        {{ ((spot * 1.255) + marginaali + siirto) | round(4) }}

    Jos Nordpool-integraation rakenne muuttuu tai siirrytään toiseen hintalähteeseen, korjaus tehdään tähän yhteen templateen. Node-RED ei tarvitse muutosta.

    Signaalin etumerkki — yksi konventio kaikkialle

    m_grid_power_w > 0 tarkoittaa että ostetaan verkosta. m_grid_power_w < 0 tarkoittaa että myydään verkkoon. Sama konventio kaikkialla — ei erikoistapauksia, ei poikkeuksia.

    Tämä tuntuu pieneltä asialta mutta se on yksi niistä päätöksistä joka pitää tehdä kerran ja pitää kiinni aina. Jos jossain kohtaa arvo onkin toisin päin, koko optimointilogiikka tekee vääriä päätöksiä — ja vika on vaikea löytää koska jokainen yksittäinen arvo näyttää oikealta.

    float(0) — hiljainen ongelma ja eri fallback-politiikat

    Template-sensoreissa on yksi yleinen kompromissi: | float(0) muuntaa unknown– ja unavailable-tilat hiljaisesti nollaksi.

    Nolla ei aina tarkoita nollaa. Joskus se tarkoittaa että data puuttuu.

    Kriittinen havainto on se että fallback-oletus riippuu mittauksen kriittisyydestä — kaikilla mittauksilla ei ole sama turvallinen oletusarvo.

    Jos Modbus-yhteys katkeaa ja Sungrow-invertteri menee unavailable-tilaan, m_pv_power_w palauttaa 0. Node-RED tulkitsee sen niin että aurinko ei tuota. Tämä on turvallinen oletus — parempi olettaa nollatuotanto kuin tehdä päätöksiä datalla jonka alkuperä on tuntematon.

    Mutta jos P1-mittari menee unavailable-tilaan ja m_grid_power_w palauttaa 0, tilanne on eri. Node-RED tulkitsee sen niin että verkosta ei osteta eikä myydä. Se voi johtaa väärään päätökseen — esimerkiksi EV-latauksen sallimiseen tilanteessa jossa verkkoteho on oikeasti korkea ja sulake uhkaa laueta.

    PV missing → 0 on turvallinen. Grid missing → 0 ei välttämättä ole turvallinen.

    Kriittisille arvoille kannattaa lisätä diagnostiikkasensori joka havaitsee unavailable-tilan erikseen ja kirjaa sen — ja fallback-politiikka pitää valita mittauksen roolin mukaan. Tämä ei ole vielä EnergyHubissa täysin toteutettu — se on yksi niistä asioista jotka rakentuvat käytön myötä.

    Yksikkö nimessä — ei arvata

    Entiteetin nimi sisältää aina yksikön kun se ei ole itsestään selvä:

    sensor.m_grid_power_w — watteina, ei kilowatteina
    sensor.m_phase_l1_a — ampeereina
    sensor.m_spot_price_eur_kwh — euroina per kilowattitunti, ei senttiä
    sensor.m_hp_tap_water_top_c — celsiusasteina

    Kun Node-RED-funktiossa lukee s.gridPower_W, tietää heti että se on watteina. Ei tarvitse avata integraatiodokumentaatiota tarkistamaan.

    Mitä HA ei sisällä

    HA:n entiteettimalli on tarkoituksella rajattu. Siellä ei ole:

    • Optimointilogiikkaa — se on Node-REDissä
    • Päätöksiä siitä milloin ladata tai lämmittää — ne tulevat Node-REDiltä komennolla
    • Historiadataa aikasarjoina — se on InfluxDB:ssä

    HA on mittaus- ja ohjausrajapinta. Se tekee tehtävänsä hyvin kun se pysyy siinä roolissa.

    Entiteettimalli kasvaa hallitusti

    Kun järjestelmään lisätään uusi laite — olkoon se akku, latauspiste tai uusi lämpöpumppu kuten Nibe, Mitsubishi tai Daikin — se liitetään samaan malliin. Uudet Modbus-rekisterit tulevat 10_integrations.yaml:iin. Normalisoidut mittaukset tulevat 20_measurements.yaml:iin m_-etuliitteellä. Ohjauslogiikka saa oman paketin 3x_-numeroväliin. MQTT-rajapinta laajenee 40_optimization.yaml:ssa.

    Rakenne ei muutu — se laajenee.

    Tämä on se hetki jolloin etukäteen tehty arkkitehtuuripäätös maksaa itsensä takaisin. Uuden laitteen lisääminen on ennakoitavaa työtä, ei arvausta siitä mihin se kuuluu. Harrasteprojekti muuttuu ylläpidettäväksi järjestelmäksi.


    Seuraavaksi: Osa 7 — Hinta ja sulakkeet. Miten spot-hintadata kulkee järjestelmään, miten se yhdistetään sulakerajoihin ja miten nämä kaksi rajoitetta toimivat yhdessä päätöksenteossa.

    Tekninen toteutus: Entiteettimalli, nimeämiskäytäntö ja pakettipohja on kuvattu tarkemmin ohjeessa HA:n valmistelu integraatiokerrokseksi.

  • Case: oma talo — Osa 5: Prioriteetit, tilakoneet ja fallback

    Tämä on viides osa sarjasta joka dokumentoi EnergyHub-järjestelmän rakentamisen vanhaan rintamamiestaloon. Edellisessä osassa käytiin läpi kerrosmalli ja vastuunjako — miten neljä kerrosta kommunikoivat keskenään MQTT:n kautta. Tässä osassa päästään siihen kysymykseen joka nousee aina kun järjestelmä kasvaa riittävän monimutkaiseksi: kuka saa sähköä kun kaikki haluavat sitä yhtä aikaa?


    Tiistai-iltapäivä. Aurinko paistaa, invertterin teho on 12 kW. Sähköauto on kytkettynä ja haluaa ladata. Lämpöpumppu harkitsee käyttöveden lämmittämistä. Kiuas on ajastettu käynnistymään tunnin kuluttua. L1-vaihe on 23 ampeeria.

    Neljä tavoitetta, yksi liittymä, 25 ampeerin sulake.

    Järjestelmä tarvitsee selkeän vastauksen siihen kenen pyyntö menee edelle. Ei kompromissia — prioriteetti.

    Tilakone — yksi moodi kerrallaan

    EnergyHubissa koko järjestelmä on aina yhdessä tilassa. Operating mode ei ole pelkkä informaatioarvo — se on prioriteettikerros joka määrittää miten kaikki päätökset tehdään.

    Tilat järjestyksessä prioriteetin mukaan:

    emergency          ← korkein prioriteetti — turvatila
    peak_protection    ← sulake uhkaa — pudota kuormat
    manual_override    ← ihminen päättää — ei automaatiota
    vacation           ← talo tyhjillään — minimikäyttö
    guest              ← mukavuus prioriteetiksi
    cheap_energy       ← halpa sähkö — lataa kaikki
    solar_maximize     ← aurinko ylituottaa — käytä itse
    normal             ← oletustila — hinta + aurinko + sulakkeet

    Fallback ei ole varsinainen operating mode — se on järjestelmän terveystila. Se aktivoituu automaattisesti kun data on vanhentunutta tai yhteys on katkennut. Siinä ei kilpailla muiden moodien kanssa: jos järjestelmä ei tiedä missä tilassa se on, se siirtyy konservatiivisiin oletuksiin riippumatta siitä mitä operating mode sanoo.

    Tärkeää on ymmärtää mitä prioriteettijärjestys tarkoittaa käytännössä: kun moodi on peak_protection, Node-RED ei enää kysy onko hinta halpa tai tuottaako aurinko. Se pudottaa kuormat prioriteettijärjestyksessä riippumatta muista olosuhteista. Moodi ohittaa optimoinnin.

    Miten moodi muuttuu — ja kuka saa muuttaa

    Tilamuutos voi tulla kolmesta suunnasta — mutta ei kaikista suunnista kaikkiin tiloihin.

    Safety Guardian muuttaa moodin välittömästi kun vaihevirta ylittää 90 % sulakerajasta. Tämä tapahtuu 10 sekunnin syklillä — ei odoteta seuraavaa minuuttipäätöstä. Guardian voi asettaa peak_protection-moodin, mutta se ei voi itse poistaa sitä — paluu normal-moodiin tapahtuu kun vaihevirta laskee alle 75 % rajan. Hystereesi estää sen että moodi flippaa edestakaisin pienten vaihteluiden mukana.

    emergency-moodista poistuminen vaatii manuaalisen toimenpiteen — käyttäjän tai huolto-operaation. Se ei nollaudu automaattisesti.

    Node-RED Decision Engine toimii optimointi- ja päätöksentekokerroksena. Se voi pyytää moodinvaihtoa kun se havaitsee tilanteen muuttuvan — cheap_energy kun hinta putoaa alle kynnyksen, solar_maximize kun aurinkoylijäämä kasvaa riittäväksi. Se ei voi kuitenkaan ohittaa emergency– tai manual_override-moodia.

    Käyttäjä voi vaihtaa moodin suoraan HA:n käyttöliittymästä. manual_override tarkoittaa että järjestelmä ei tee omia päätöksiä — ihminen on ottanut ohjat. Tämä on ainoa tila johon vain käyttäjä pääsee.

    Kaikki tilamuutokset kirjataan. InfluxDB:stä näkee jälkikäteen milloin moodi muuttui, mihin suuntaan ja mikä sen aiheutti.

    Priority Resolver — päätöslogiikka järjestyksessä

    Node-RED:n Priority Resolver käy tilanteet läpi kiinteässä järjestyksessä. Ensimmäinen osuma ratkaisee — loput haarasta jätetään käymättä läpi.

    1. Emergency ja safety trip

    Jos sys_safety_trip on true tai moodi on emergency, kaikki ohjattavat kuormat sammutetaan välittömästi. EV-lataus estetään, lämpöpumppu blokataan EVU-signaalilla, lisävastus sammutetaan, kiuas estetään. PV-rajoitusta ei aseteta — aurinko saa tuottaa vapaasti koska se pienentää verkkokuormaa. Tässä tilanteessa ei optimoida. Turvallisuus menee edelle.

    2. Peak protection

    Vaihevirta on liian korkea tai Safety Guardian on laukaissut moodin. Kuormat pudotetaan prioriteettijärjestyksessä:

    • EV-lataus estetään ensimmäisenä — suurin yksittäinen kuorma, 3,6 kW
    • Kiuas estetään — toinen suuri kuorma
    • Lisävastus estetään
    • Lämpöpumppu: jos kompressori pyörii yli 60 % teholla, blokataan EVU-signaalilla. Jos alle, annetaan jatkaa normaalisti.

    PV:tä ei rajoiteta — aurinkoinvertteri saa tuottaa vapaasti koska se pienentää verkon kuormaa.

    3. Manual override

    Moodi on manual_override — järjestelmä ei tee mitään. Se ei muuta mitään tilaa, ei lähetä komentoja. Ihminen päättää.

    4. Vacation

    Talo on tyhjillään. EV-lataus estetään. Kiuas estetään. Lämpöpumppu: jos käyttövesi on laskenut alle minimilämpötilan tai huonelämpötila on laskenut alle asetetun tavoitelämpötilan, annetaan lämmittää normaalisti. Muuten blokataan.

    5. Normaali optimointi

    Kaikki muut moodit — normal, solar_maximize, cheap_energy, guest — päätyvät tähän haaraan. Tässä otetaan huomioon hinta, aurinkotuotanto ja sulakerajat yhdessä.

    Normaali optimointi — kolme muuttujaa

    Normaalissa optimoinnissa kolme tekijää vaikuttaa jokaiseen päätökseen:

    Hinta — spot-hinta verrattuna kahteen kynnysarvoon. Negatiivinen hinta tarkoittaa että sähköstä maksetaan verkkoon myymisestä — tällöin kannattaa rajoittaa vientiä ja käyttää kaikki itse. Halpa hinta tarkoittaa että lataaminen ja lämmittäminen kannattaa. Kallis hinta tarkoittaa päinvastoin.

    Aurinkotuotanto — ylijäämäaurinko on ensisijainen energianlähde omaan käyttöön. Jos aurinko tuottaa enemmän kuin talo kuluttaa, ylijäämä ohjataan ensin EV-lataukseen, sitten lämpöpumpun boostiin. Verkkoon myynti on viimeinen vaihtoehto — ja negatiivisilla hinnoilla jopa haitallinen.

    Sulakkeet — vaihevirrat rajoittavat kaiken muun. Optimointilogiikka ei koskaan tee päätöstä joka johtaisi sulakeylitykseen. Tämä ei ole pelkästään Safety Guardianin vastuulla — se on myös optimointilogiikan sisäänrakennettu rajoite.

    Capability — lupa ennen päätöstä

    Ennen kuin Priority Resolver tekee yhtään päätöstä, se tarkistaa capability-flagit. c_ev_charge_allowed: false tarkoittaa että EV-latausta ei sallita riippumatta hinnasta tai aurinkotilanteesta.

    Capability on käyttöoikeus — vastaus kysymykseen ”saako tämä laite toimia”. Se ei kerro tekeekö järjestelmä niin. Komento on se päätös joka lähetetään laitteelle.

    Tämä erottelu on tärkeä: käyttäjä voi asettaa capability-flagin pois päältä — ”en halua ladata tänä yönä” — ilman että logiikkaan tarvitsee koskea. Järjestelmä kunnioittaa rajoitteen.

    Shadow/live-mekanismi on eri abstraktiotaso. Se ei vastaa kysymykseen ”saako laite toimia” vaan ”saako EnergyHub ohjata laitetta”. Capability on käyttöoikeus laitteelle, shadow/live on execution control — kuka omistaa ohjauksen. Nämä kaksi toimivat yhdessä mutta eri tasoilla.

    Fallback — mitä tapahtuu kun yhteys katkeaa

    Fallback-logiikka on se osa järjestelmästä josta harvoin puhutaan mutta joka on yhtä tärkeä kuin optimointilogiikka.

    Kun järjestelmä ei tiedä mikä on tosi — data on vanhentunutta, yhteys on poikki, mittaukset eivät päivity — se ei arvaa. Se siirtyy konservatiivisiin oletuksiin: EV-lataus estetään, lämpöpumppu jatkaa normaalisti ilman boostia, ei aggressiivista optimointia. Parempi jättää käyttämättä optimointimahdollisuus kuin tehdä väärä päätös epävarman datan perusteella — erityisesti kun EV-lataus on suurin yksittäinen kuorma ja sulakeylilyönti on mahdollinen.

    EnergyHubissa fallback toimii kerroksittain.

    Jos Node-RED kaatuu, HA jatkaa mittaamista. Laitteet jäävät viimeiseen tunnettuun tilaan — Shelly-releet eivät liiku, invertteri jatkaa viimeisellä rajoitusasetuksella. Ei optimaalista, mutta turvallista.

    Jos HA kaatuu, Node-RED lukee MQTT:n retain-viesteistä viimeisimmän tunnetun tilan. Se ei saa uutta dataa, joten se siirtyy konservatiivisiin oletuksiin.

    Jos MQTT-broker kaatuu, kaikki kommunikaatio lakkaa. Laitteet jäävät tilaan johon ne viimeksi ohjattiin.

    Jokaisessa tapauksessa fyysiset suojaukset — sulakkeet, invertterin suojat, lämpöpumpun termostaatit — toimivat edelleen. Ne eivät riipu ohjelmistosta.

    Viimeiseen tunnettuun tilaan jääminen on turvallinen ratkaisu lyhyellä aikavälillä. Pitkällä aikavälillä olosuhteet muuttuvat — aurinkotuotanto laskee, ulkolämpötila vaihtelee, sähkön hinta nousee. Järjestelmä joka on pysähtynyt ei pysty reagoimaan näihin muutoksiin. EV-rele voi jäädä kiinni kun aurinko on laskenut ja sähkö on kallista — tai auki kun aurinko olisi riittänyt lataukseen. Tila joka oli järkevä kaatumishetkellä ei välttämättä ole järkevä kaksi tuntia myöhemmin.

    Tästä syystä pitkä kaatuminen ei ole neutraali tila — se on tila jossa optimointi on poissa käytöstä ja laitteet toimivat viimeisen komennon mukaan riippumatta siitä onko se enää perusteltua.

    Käytännön ratkaisu on watchdog-logiikka: jos järjestelmä havaitsee että se ei ole saanut uutta dataa tietyn ajan kuluessa, se asettaa laitteet eksplisiittisesti konservatiiviseen tilaan — EV-rele auki, invertteri täydelle teholle, lämpöpumppu normaalille ilman boostia. Tämä on parempi kuin se että laitteet jäävät tuntemattomaan tilaan ilman valvontaa. Watchdog on yksi niistä asioista jotka rakennetaan kun järjestelmä on muuten toimiva — mutta sen puuttuminen huomataan vasta kun kaatuminen kestää odotettua kauemmin.

    Käytännön esimerkki: peak protection laukeaa

    25.5.2026 klo 14:00. Aurinkoa riittää, sähkön hinta on 2,3 senttiä per kilowattitunti. EV-lataus on sallittu ja lämpöpumppu toimii normaalisti.

    Klo 14:05. L1-vaihe nousee 23,8 ampeerin. Safety Guardian havaitsee ylityksen 10 sekunnin syklillä — 90 % 25 ampeerin rajasta on 22,5 ampeeria, raja ylittyy selvästi. Guardian julkaisee energyhub/command/mode: peak_protection. HA kirjaa tilamuutoksen.

    Node-RED lukee seuraavalla minuuttisyklillä tilanteen: moodi on peak_protection. Priority Resolver menee suoraan peak-haaraan riippumatta hinnasta tai aurinkotuotannosta. Päätös: EV off, kiuas off, HP normal — kompressori alle 60 %.

    Klo 14:20. Suuri kulutus loppuu. L1-vaihe laskee 16,2 ampeerin. Safety Guardian havaitsee että ollaan alle 75 % rajan — 18,75 ampeeria. Guardian julkaisee energyhub/command/mode: normal. Järjestelmä palaa optimointimoodiin.

    Koko tapahtuma kestää 15 minuuttia. Päätökset on kirjattu observability-topiciin syineen. InfluxDB näyttää vaihevirran kehityksen kaavioina.

    Miksi tilakone eikä ehtojen lista

    Vaihtoehto tilakoneelle olisi rakentaa optimointilogiikka pitkänä ehtolistana: ”jos hinta < X ja virta < Y ja aurinko > Z, tee A, muuten jos…”

    Tämä toimii pienessä järjestelmässä. Mutta kun ehtoja on kymmeniä ja ne alkavat olla ristiriidassa keskenään, kukaan ei enää tiedä mitä järjestelmä tekee missäkin tilanteessa. Vika löytyy vasta kun se on jo tapahtunut — väärässä tilanteessa, väärällä hetkellä.

    Tilakone pakottaa ajattelemaan etukäteen. Jokainen moodi on eksplisiittinen. Tilasiirtymät ovat määriteltyjä — ja tärkeää on myös se kuka saa tehdä minkäkin siirtymän. Mikä tahansa tilanne voidaan kysyä: ”missä moodissa järjestelmä on ja mitä se tässä moodissa tekee?” — ja saada selkeä vastaus.

    Se on kotiautomaatiossa harvinainen luksus.


    Seuraavaksi: Osa 6 — HA:n rooli ja entiteettimalli. Miten mittaukset, parametrit ja ohjaussignaalit järjestetään niin että ne pysyvät hallittavina kun järjestelmä kasvaa.

    Tekninen toteutus: Priority Resolver -koodi ja operating mode -rakenne on kuvattu ohjeessa HA:n valmistelu integraatiokerrokseksi.

  • Kun hinta ei enää riitä – miksi tulevaisuuden EnergyHub tarvitsee myös verkkotietoa

    Edellisessä artikkelissa kävin läpi miksi kotitalouksien energian optimointi ei skaalaudu. Syy oli arkkitehtuurinen: ohjaus tapahtuu väärällä tasolla, kustannus on väärässä paikassa ja järjestelmät eivät kommunikoi keskenään.

    Mutta on vielä syvempi ongelma.

    Vaikka kaikki kodit alkaisivat optimoida kulutustaan pörssisähkön hinnan perusteella, se ei vielä riittäisi. Koska hinta on vain yksi signaali sähköjärjestelmästä. Se kertoo markkinatilanteen — mutta ei verkon fyysistä tilaa.

    Ja juuri siitä on kyse seuraavassa vaiheessa.

    Verkkoa ei rakenneta nopeasti

    Suomen sähköjärjestelmä perustuu laajaan suurjänniteverkkoon, joka yhdistää voimalaitokset, kantaverkon, alueverkot ja jakeluverkot toisiinsa. Merkittävä osa alueellisesta sähkönsiirrosta tapahtuu 110 kilovoltin verkoissa, jotka muodostavat tärkeän linkin kantaverkon ja paikallisten jakeluverkkojen välille.

    Kun alue kasvaa — uusia koteja, latauspaikkoja, teollisuutta — myös verkon kapasiteettia pitää kasvattaa. Ja tässä tulee ensimmäinen ongelma.

    110 kilovoltin sähköjohdon rakentaminen ei tapahdu nopeasti.

    Ennen kuin ensimmäinen pylväs pystytään, tarvitaan Energiaviraston hankelupa. Luvantarpeesta säädetään sähkömarkkinalaissa: vähintään 110 kilovoltin johto vaatii luvan ennen rakentamista. Hankelupa on voimassa viisi vuotta lainvoimaiseksi tulosta.

    Mutta lupakäsittely on vasta alkua. Sen jälkeen tulevat maankäyttö- ja lunastusmenettelyt, ympäristöselvitykset, mahdolliset valitukset ja itse rakentaminen.

    Kokonaisaikataulu voi suurissa hankkeissa venyä useisiin vuosiin. Suunnittelu, ympäristöselvitykset, luvitus, maanomistajaneuvottelut ja rakentaminen muodostavat yhdessä pitkän prosessin.

    Pääkaupunkiseudulla Fingridin Helsingin kaapeli -hanke käynnistyi vuonna 2020 ja uusi 400 kilovoltin kaapeliyhteys valmistuu vuonna 2026. Jo tämä yksittäinen hanke havainnollistaa, että verkkoinvestointien aikajänne lasketaan vuosissa, ei kuukausissa.

    Hyvinkään ja Riihimäen seudun verkon vahvistaminen on toinen esimerkki samasta ilmiöstä. Siirtokyvyn kasvattaminen vie aikaa ja rahaa — eikä se tapahdu silloin kun kulutus kasvaa, vaan vuosia sen jälkeen.

    Pullonkaula ei näy hinnassa — ennen kuin on liian myöhäistä

    Tässä on keskeinen ongelma.

    Nordpool-hinta kertoo koko Suomen markkinatilanteen. Se ei kerro, onko Espoon pohjoinen syöttöasema lähellä kapasiteettirajaansa. Se ei kerro, onko Hyvinkään ja Riihimäen välinen 110 kilovoltin yhteys kuormittunut kovana pakkaspäivänä.

    Hinta voi heijastaa laajempaa alueellista tai valtakunnallista niukkuutta, mutta paikallinen jakeluverkon pullonkaula ei välttämättä näy Suomen tarjousalueen hinnassa lainkaan.

    Tämä tarkoittaa, että hintaohjaukseen perustuva kotiautomaatio optimoi väärää asiaa. Se siirtää kulutusta halvoille tunneille — mutta ei välttämättä verkon kannalta oikeisiin hetkiin.

    Hintaohjaus voi jopa kasvattaa paikallista huipputehoa

    Hintaohjaus ei automaattisesti vähennä verkkokuormitusta.

    Jos suuri määrä koteja reagoi samaan halpaan tuntiin samalla tavalla, sähköautojen lataus, käyttövesivaraajat ja lämpöpumput voivat käynnistyä samanaikaisesti.

    Yksittäisen kotitalouden näkökulmasta optimointi toimii. Sähkölasku pienenee ja kulutusta siirtyy halvemmille tunneille.

    Paikallisen verkon näkökulmasta lopputulos voi kuitenkin olla toinen. Kuorma kasautuu samoille tunneille, jolloin huipputeho kasvaa.

    Tämä on yksi syy siihen, miksi tulevaisuudessa tarvitaan myös verkkotietoisia ohjaussignaaleja.

    FinFlex — ensimmäinen askel oikeaan suuntaan

    Huhtikuussa 2025 avattiin jotain uutta.

    Fingrid ja Helen Sähköverkko avasivat Suomen ensimmäisen yhteisen siirtojenhallinnan markkinan — FinFlexin. Kyseessä on TSO-DSO-joustomarkkinan pilotti, jossa sekä kantaverkon että jakeluverkon pullonkauloja hallitaan yhden markkinapaikan kautta. Kauppapaikkana toimii NODES-alusta.

    Tämä on merkittävä askel. Ensimmäistä kertaa Suomessa verkon fyysinen kapasiteettitilanne ja markkinamekanismi yhdistyvät samaan paikkaan.

    Käytännössä tämä tarkoittaa, että joustoresurssit — sähköautot, lämpöpumput, akut ja teollisuuskuormat — voivat tarjota kapasiteettia silloin kun verkko sitä tarvitsee. Ei vain silloin kun hinta on korkea.

    FinFlex on vielä pilotti. Se ei vielä koske yksittäisiä kotitalouksia suoraan.

    FinFlex ei myöskään tarkoita, että yksittäinen lämpöpumppu tai sähköauto saisi suoraan verkkoyhtiöltä ohjauskäskyn. Se osoittaa kuitenkin suunnan: verkon fyysinen kapasiteettitilanne voidaan muuttaa markkinasignaaliksi, jota joustoresurssit voivat hyödyntää.

    Mitä tämä tarkoittaa kotiautomaatiolle

    Tähän asti kodin energianhallinta on perustunut yksinkertaiseen signaaliin: Nordpool-hintaan.

    Se on hyvä lähtökohta. Mutta se ei riitä, kun sähköjärjestelmä monimutkaistuu.

    Tulevaisuuden kodin energiajärjestelmä tarvitsee useampia signaaleja.

    Hinta kertoo markkinatilanteen. Se on edelleen tärkein signaali yksittäiselle kotitaloudelle.

    Aurinkoylijäämä kertoo oman tuotannon tilanteen.

    Sulakekuorma kertoo oman liittymän tilan.

    DSO-signaali voisi tulevaisuudessa kertoa jakeluverkkoyhtiön kapasiteettitilanteesta. Onko alueellinen verkko kuormittunut? Pitäisikö kulutusta siirtää? Tällaisia signaaleja ei vielä ole kotitalouksille yleisesti tarjolla.

    Tehomaksu on nousemassa yhä tärkeämmäksi osaksi sähkönsiirtoa. Esillä olleissa malleissa pienasiakkaiden tehomaksut on usein sidottu noin 8 kilowatin tehorajaan, jonka ylittävästä huipputehosta peritään erillinen maksu. Tämä muuttaa optimointiongelman luonnetta — energian hinnan lisäksi myös hetkellinen teho alkaa vaikuttaa kustannuksiin.

    V2G-signaali tulevaisuudessa: sähköauto ei vain lataa, vaan voi myös tarjota energiaa takaisin sähköjärjestelmälle silloin kun sitä tarvitaan.

    Koti joustavana resurssina — ilman asumismukavuuden heikkenemistä

    Tässä on ydinajatus, joka erottaa tulevan mallin nykyisestä.

    Kotitalous ei ole vain kuluttaja. Se on joustoresurssi.

    Mutta jouston pitää tapahtua ehdoilla, jotka sopivat asumiseen. Ei niin, että verkkoyhtiö sammuttaa lämmityksen pakkasella. Vaan niin, että kodin energiajärjestelmä osaa itse päättää, milloin jousto on mahdollista ilman vaikutusta asumismukavuuteen.

    Lämpöpumppu voi olla EVU-tilassa tunnin ajan, jos varaajassa on riittävästi lämpöenergiaa. Sähköauto voi lykätä latausta puoli tuntia, jos se ehtii silti täyteen ennen lähtöä. Aurinkovoimala voi rajoittaa tuotantoaan negatiivisten hintojen aikana.

    Kaikki nämä ovat pieniä joustoja.

    Mutta miljoona kotia tekemässä niitä koordinoidusti on jo merkittävä resurssi sähköjärjestelmälle.

    Grid-Aware Control — seuraava kerros EnergyHubiin

    HEOMF-viitekehyksessä tämä voidaan nähdä uutena ulottuvuutena: Grid-Aware Control.

    Nykyinen EnergyHub optimoi esimerkiksi hinnan, aurinkotuotannon, sulakekuorman ja käyttäjän tavoitteiden perusteella.

    Mutta seuraava taso lisää mukaan verkon tilan ja tehoperusteiset kustannukset.

    Tämä ei tarkoita, että kodin järjestelmä pitää rakentaa uudelleen. Se tarkoittaa, että arkkitehtuuriin lisätään uusi syöte — esimerkiksi DSO-signaali tai tehomaksulaskuri — ja päätöslogiikka ottaa sen huomioon.

    Arkkitehtuuri ensin. Optimointi seuraa.

    Miksi tämä on tärkeää nyt

    Sähköverkko rakentuu hitaasti. Luvitusprosessit kestävät vuosia. Uusi 110 kilovoltin johto ei synny silloin kun kulutus kasvaa — vaan parhaimmillaankin vuosia myöhemmin.

    Tässä välissä kapasiteettia pitää löytää muualta.

    Ja se muualta on ohjaus.

    Jos kodit, sähköautot ja lämpöpumput osaavat reagoida verkon tilaan — eivät vain hintaan — kapasiteettia vapautuu ilman uutta johtoa.

    FinFlex on ensimmäinen konkreettinen askel siihen, että tällainen koordinointi on mahdollinen.

    Kotiautomaatio ei muutu passiivisesta säästäjästä aktiiviseksi verkon resurssiksi yhdessä yössä. Mutta arkkitehtuuri kannattaa rakentaa niin, että se on mahdollista.

    Sähköjärjestelmän seuraava haaste ei välttämättä ole energian riittävyys. Yhä useammin kyse on siitä, saadaanko energia oikeaan paikkaan oikeaan aikaan ilman että verkkoa joudutaan jatkuvasti vahvistamaan.

    Lopuksi

    Pörssisähkö on tehnyt kotitalouksista aktiivisempia toimijoita sähköjärjestelmässä.

    Se on ollut hyvä alku.

    Mutta tulevaisuuden sähköjärjestelmä tarvitsee enemmän kuin yhden signaalin.

    Kun sähköautot, lämpöpumput, aurinkosähkö ja akustot yleistyvät, pelkkä hintatieto ei enää riitä kuvaamaan koko järjestelmän tilaa.

    Siksi seuraava looginen askel ei välttämättä ole parempi hintaoptimointi.

    Se voi olla verkkotietoinen energianhallinta.

    Järjestelmä, joka ei kysy pelkästään:

    ”Milloin sähkö on halpaa?”

    Vaan myös:

    ”Milloin sähköjärjestelmä tarvitsee minua?”


    Seuraavassa osassa: joustomarkkina käytännössä — mitä aggregaattorit tekevät, mitä V2G tarkoittaa suomalaiselle sähköautoilijalle ja milloin verkkosignaalit voivat alkaa näkyä yksittäisen kodin energianohjauksessa.

    Piditkö artikkelista?

    Seuraa blogia myös Blogit.fi:ssä, niin löydät uudet kirjoitukset helposti.

    Seuraa blogia Blogit.fi:ssä
  • Case: oma talo — Osa 4: Kerrosmalli ja vastuunjako

    Tämä on neljäs osa sarjasta joka dokumentoi EnergyHub-järjestelmän rakentamisen vanhaan rintamamiestaloon. Edellisessä osassa käytiin läpi Home Assistantin rooli integraatiokerroksena — mitä se tekee ja mitä se jättää tekemättä. Tässä osassa katsotaan miten kaikki kerrokset toimivat yhdessä ja kuka vastaa mistäkin.


    Kotitalouden energiajärjestelmä on harhaanjohtavan yksinkertainen paperilla. Aurinko tuottaa, lämpöpumppu lämmittää, auto latautuu. Mutta kun kaikki tapahtuu samanaikaisesti — ja samaan aikaan sähkön hinta on negatiivinen, L1-vaihe lähestyy 25 ampeeria ja lämpöpumpun käyttövesi on viilenemässä — tarvitaan selkeä kuva siitä kenen vuoro on päättää.

    EnergyHubissa vastaus on kerrosmalli. Jokainen kerros tietää oman vastuualueensa eikä astu toisen tontille.

    Neljä kerrosta, neljä vastuuta

    ┌─────────────────────────────────────────────┐
    │  HAVAINTOKERROS                             │
    │  InfluxDB + Grafana                         │
    │  Tallentaa kaiken — tekee näkymättömän      │
    │  näkyväksi jälkikäteen                      │
    ├─────────────────────────────────────────────┤
    │  OPTIMOINTIKERROS                           │
    │  Node-RED                                   │
    │  Päättää mitä tehdään — priorisoi,          │
    │  tasapainottaa, optimoi                     │
    ├─────────────────────────────────────────────┤
    │  INTEGRAATIOKERROS                          │
    │  Home Assistant                             │
    │  Lukee, normalisoi, välittää — ylläpitää    │
    │  järjestelmän tilaa                         │
    ├─────────────────────────────────────────────┤
    │  KENTTÄKERROS                               │
    │  Modbus · Shelly · P1-mittari               │
    │  Toimii itsenäisesti — fyysiset suojaukset  │
    │  eivät riipu ylemmistä kerroksista          │
    └─────────────────────────────────────────────┘

    Kerrosten välinen kommunikaatio tapahtuu MQTT:n kautta. Kenttäkerroksen laiteprotokollat — kuten Modbus TCP aurinkoinvertterin ja lämpöpumpun kanssa — jäävät integraatiokerroksen sisälle, eivätkä näy ylöspäin. MQTT-broker, tässä tapauksessa Mosquitto, toimii väylänä jossa jokainen kerros julkaisee omaan suuntaansa ilman suoria kytköksiä toisiin kerroksiin.

    Kenttäkerros — toimii aina

    Kenttäkerroksen laitteet — Sungrow-aurinkoinvertteri, Thermia-maalämpöpumppu, Shelly-releet, HomeWizard P1 -mittari — toimivat omalla logiikallaan riippumatta siitä mitä ylemmissä kerroksissa tapahtuu. Sama pätee laajemmin: Fronius Symo, SMA Sunny Boy, ABB-invertterit, Huawei SUN2000 ja GoodWe toimivat kaikki itsenäisesti — EnergyHub ohjaa niitä, mutta ei ole niiden toiminnan edellytys. Nibe-, Mitsubishi-, Daikin- ja Vaillant-lämpöpumput ovat samassa asemassa kuin Thermia: ne lämmittävät taloa omalla säätölogiikallaan, EnergyHub vain antaa lisäohjeita.

    Kenttäkerroksessa on fyysisesti toimivat turvasuojaukset: aurinkoinvertterin ylijännitesuoja, lämpöpumpun kompressorin suojatermostaatti ja sähkökeskuksen sulakkeet. Nämä toimivat laitehardwaressa — eivät ohjelmiston varassa. EnergyHubin ohjelmallinen kuormanpudotus on lisäsuoja näiden päällä, ei niiden korvike.

    Integraatiokerros — lukee ja välittää

    Home Assistant lukee kenttäkerroksen laitteiden tilat Modbus TCP:n kautta ja normalisoi ne kanonisiksi mittauksiksi. sensor.m_grid_power_w, sensor.m_pv_power_w, sensor.m_spot_price_eur_kwh — nämä ovat yhtenäisiä arvoja joita kaikki muut kerrokset käyttävät.

    HA myös vastaanottaa Node-REDin komennot MQTT:sta ja välittää ne laitteille. Kun Node-RED päättää että lämpöpumppu tarvitsee boostin, se julkaisee energyhub/command/hp/mode: boost — HA kuuntelee, tulkitsee ja ohjaa Shelly Pro 2:n relettä sen mukaisesti.

    HA ylläpitää myös järjestelmän tilaa. Operating mode — normal, peak_protection, vacation, emergency — asuu HA:ssa. Node-RED voi pyytää tilamuutosta, mutta HA kirjaa sen ja julkaisee kaikkien saataville. Näin tila on aina yhdessä paikassa.

    Optimointikerros — päättää

    Node-RED on järjestelmän aivot. Se vastaanottaa kaiken telemetrian MQTT:n kautta, ylläpitää flow-kontekstissa ajantasaisen kuvan tilanteesta ja ajaa päätöslogiikan minuutin välein.

    Päätöslogiikka on eksplisiittistä JavaScript-koodia — ei piilotettuna YAML-automaatioiden ketjuun. Kun Node-RED päättää sallia EV-latauksen, se tekee sen koska spot-hinta on alle kynnysarvon tai aurinkoylijäämä ylittää rajan. Syy on koodissa luettavissa, ei arvailtavissa.

    Safety Guardian on erillinen flow joka reagoi välittömästi — ei minuutin syklillä vaan 10 sekunnin välein saapuviin vaihevirtatietoihin. Kun L1-vaihe lähestyy 25 ampeerin sulakerajaa, Safety Guardian laukaisee peak_protection-moodin välittömästi odottamatta seuraavaa minuuttipäätöstä. Vaihevirtatiedot tulevat HA:n kautta — jos HA käynnistetään uudelleen, reaaliaikainen valvonta palautuu vasta kun HA alkaa julkaista uutta telemetriaa.

    Node-RED kirjaa jokaisen päätöksensä perusteluineen energyhub/observability/decisions-topiciin — ei vain mitä tehtiin, vaan miksi tehtiin. Tämä ei ole ohjausta varten vaan auditointia varten. Jos joku kysyy miksi EV ei latautunut tiistaina klo 14, vastaus löytyy observability-topicista: virta oli liian korkea, moodi oli peak_protection, lataus estettiin tästä syystä.

    Havaintokerros — tekee näkymättömän näkyväksi

    InfluxDB tallentaa kaiken aikasarjadatana — vaihevirrat, spot-hinnat, aurinkotuotannon, lämpöpumpun kompressorin kierrosluvun, päätökset ja niiden syyt. Grafana visualisoi sen.

    Havaintokerros ei ohjaa mitään. Se ei lähetä komentoja eikä muuta tiloja. Mutta se on se kerros joka paljastaa onko järjestelmä oikeasti toiminut kuten piti — ja tekee mahdolliseksi kysyä kysymyksiä datalta jälkikäteen.

    Tämä on HEOMF-kypsyysmallissa keskeinen asia: järjestelmä jota ei voi analysoida jälkikäteen, on järjestelmä jota ei voi parantaa.

    MQTT — kerrosten yhteinen kieli

    MQTT on se liima joka pitää kerrokset yhdessä mutta löyhästi kytkettynä. Kerrosten välinen kommunikaatio tapahtuu MQTT:n kautta — ei suoria funktiokutsuja, ei jaettuja tietorakenteita.

    Topicrakenne noudattaa selkeää logiikkaa:

    energyhub/telemetry/     →  HA julkaisee mittauksia ylöspäin
    energyhub/command/       →  Node-RED antaa komentoja alaspäin
    energyhub/system/        →  järjestelmätilan viestit
    energyhub/observability/ →  päätösloki analyysiin

    Tämä tarkoittaa että Node-RED voidaan käynnistää uudelleen — se lukee MQTT:n retain-viesteistä viimeisimmän tunnetun tilan ja jatkaa siitä. HA voidaan käynnistää uudelleen — Node-RED odottaa uusia telemetriaviestejä ja jatkaa heti kun niitä alkaa tulla. Kummankin voi käynnistää uudelleen ilman että koko järjestelmä menee sekaisin, vaikka lyhyt katkos reaaliaikaisessa päätöksenteossa syntyy.

    Tämä ei ole onnettomuus — se on suunniteltu ominaisuus.

    Vastuunjako käytännössä

    Yksi konkreettinen esimerkki selventää vastuunjaon paremmin kuin mikään kaavio.

    Klo 14:30 aurinko tuottaa 12 kW, spot-hinta on -0,001 EUR/kWh, L1-vaihe on 16 ampeeria ja EV on kytkettynä.

    Kenttäkerros: Sungrow raportoi 12 kW tuotannon Modbus-rekistereistä. P1-mittari raportoi L1=16 A.

    Integraatiokerros: HA lukee arvot, normalisoi ne kanonisiksi sensoreiksi ja julkaisee MQTT:hen: grid=-3695 W (vienti), pv=12000 W, spot=-0.001 EUR/kWh, L1=16.2 A.

    Optimointikerros: Node-RED lukee tilanteen. Hinta on negatiivinen — PV-rajoituslogiikka laskee sopivan rajoitusprosentin omakäytön perusteella ja julkaisee energyhub/command/pv/curtail_pct: 24. EV-lataus sallitaan koska se käyttää ylijäämää eikä nosta vaihevirta yli rajan.

    Integraatiokerros: HA vastaanottaa PV-rajoituskomennon ja kirjoittaa tässä Sungrow-toteutuksessa Modbus-rekisteriin 5007 arvon 240 (24,0 %). Invertterin ohjausrekisterit vaihtelevat valmistajittain — SunSpec-standardia tukevat laitteet kuten monet Fronius- ja SMA-invertterit käyttävät yhtenäistä rekisterikarttaa.

    Kenttäkerros: Sungrow siirtää paneelien toimintapisteen pois maksimitehopisteestä. MPPT-jännite nousee 501 V:sta 558 V:iin — invertteri ottaa vähemmän virtaa paneeleilta.

    Havaintokerros: InfluxDB tallentaa koko tapahtumaketjun syineen. Grafana näyttää sen kaavioina.

    Jokainen kerros teki oman osuutensa. Kukaan ei astunut toisen tontille.

    Miksi tämä on tärkeämpää kuin miltä näyttää

    Useimmat kotiautomaatiojärjestelmät rakentuvat yksittäisten automaatioiden varaan. ”Jos aurinko tuottaa yli 2 kW ja hinta on alle 5 senttiä, lataa auto.” Tämä toimii kunnes tulee tilanne jota ei osattu ennakoida — ja niitä tulee aina.

    Kerrosmalli ei poista yllätyksiä. Mutta se tekee niistä hallittavia. Kun jotain menee väärin, tiedetään missä kerroksessa etsiä. Kun logiikkaa pitää muuttaa, tiedetään mihin koskea. Kun järjestelmä laajenee — akku, V2H, tehomaksu — uusi komponentti liitetään oikeaan kerrokseen ilman että koskaan tarvitsee kirjoittaa kaikkea uudelleen.

    Se on EnergyHubin ydinajatus: rakenna infrastruktuuri, ei automaatio.


    Seuraavaksi: Osa 5 — Prioriteetit, tilakoneet ja fallback. Miten järjestelmä päättää kuka saa sähköä kun kaikki haluavat sitä yhtä aikaa.

    Tekninen toteutus: MQTT-rakenne ja Node-REDin integraatio on kuvattu tarkemmin ohjeessa HA:n valmistelu integraatiokerrokseksi.

  • Case: oma talo — Osa 3: Home Assistant integraatiokerroksena

    Home Assistantin roolia EnergyHubin integraatiokerroksena kuvaava grafiikka

    Tämä on kolmas osa sarjasta, joka dokumentoi EnergyHub-järjestelmän rakentamista vanhaan rintamamiestaloon. Edellisessä osassa käytiin läpi arkkitehtuuripäätökset ennen koodia: miksi järjestelmä jaettiin vastuualueisiin ja mihin järjestelmätason päätöksenteko sijoitetaan. Tässä osassa tarkastelen sitä, mitä Home Assistantin rooli integraatiokerroksena tarkoitti käytännössä.


    Kun EnergyHub-arkkitehtuuria suunniteltiin, yksi kysymys nousi toistuvasti esiin: pitääkö Home Assistantin päättää vai välittää?

    Vanhassa järjestelmässä HA teki molempia. Se luki arvot, vertasi kynnysarvoihin ja ohjasi laitteita samojen automaatioiden sisällä. Tämä toimi pitkään, kunnes aurinkotuotanto, sähkön hinta, sähköauton lataus ja lämpöpumpun käyttö alkoivat vaikuttaa toisiinsa.

    Ongelma ei ollut se, etteikö Home Assistantilla voisi tehdä monimutkaista logiikkaa. Ongelma oli, että tämän talon järjestelmätason priorisointipäätökset olivat vuosien aikana hajonneet eri automaatioihin.

    EnergyHubissa päätös oli siksi selkeä: Home Assistant ei omista energian optimointiin liittyvää järjestelmätason priorisointia.

    Arkkitehtuuri yhdellä silmäyksellä

    ┌─────────────────────────────────────────┐
    │  Kenttä- ja laitetaso                    │
    │  Sungrow · Thermia · Shelly · P1         │
    └────────────────────┬────────────────────┘
                         │ lukee / ohjaa
    ┌────────────────────▼────────────────────┐
    │  Home Assistant                         │
    │  Integraatiot · normalisointi · tila    │
    │  käyttöliittymä · paikallinen logiikka  │
    └──────────┬──────────────────┬───────────┘
               │ telemetria       │ ohjauspyynnöt
               ▼                  ▲
    ┌─────────────────────────────────────────┐
    │  Node-RED                               │
    │  priorisointi · päätös · orkestrointi   │
    └─────────────────────────────────────────┘

    Tässä vaiheessa työnjako hahmotettiin tarkoituksella yksinkertaisena. Home Assistant yhdistää laitteet yhteiseen tilannekuvaan. Node-REDiin keskitetään talon eri tavoitteiden välinen päätöksenteko. Fyysinen laite säilyttää oman sisäisen säätönsä ja suojauksensa.

    Myöhemmissä Case-osissa rajat tarkentuivat edelleen. Tämä oli lähtökohta, jonka avulla vanha hajautunut automaatiomalli saatiin ensin purettua ymmärrettäviksi vastuiksi.

    Mitä integraatiokerros tässä projektissa tarkoittaa?

    Home Assistantin ensimmäinen tehtävä on lukea laitteiden tilat Modbusin, P1-mittauksen ja muiden integraatioiden kautta. Toinen tehtävä on muuttaa eri lähteiden tiedot sellaiseen yhteiseen muotoon, jota muu EnergyHub voi käyttää ilman laitekohtaista tulkintaa.

    Kolmas tehtävä on toimia osana ohjauspolkua. Ylemmän tason päätös voidaan välittää Home Assistantin kautta laitteelle, mutta päätös ja fyysinen toteutus pidetään käsitteellisesti erillään.

    HA voi sisältää myös determinististä paikallista logiikkaa: käyttötiloja, datan validointia, aikakatkaisuja tai käyttäjän ohitusten käsittelyä. Rajaus ei siis tarkoita, että HA olisi passiivinen viestiputki. Rajaus koskee sitä, missä koko talon tavoitteiden väliset kompromissit ratkaistaan.

    Miksi vastuunjako kannattaa?

    Ensimmäinen hyöty on vianhaku. Kun jotain menee väärin, voidaan seurata ketjua vaihe vaiheelta:

    lähdelaite
    → HA:n lukema
    → kanoninen mittaus
    → Node-REDin päätös
    → ohjauspyyntö
    → laitteen readback
    → fyysinen vaste

    Jos lähdelaitteen tieto on oikein mutta kanoninen mittaus väärin, ongelma on normalisoinnissa. Jos tilannekuva on oikein mutta päätös väärä, vikaa etsitään päätöksentekologiikasta. Jos komento lähetettiin mutta fyysistä vastetta ei synny, ongelma voi olla ohjauspolussa, laitteessa tai laitteen omissa ehdoissa.

    Tämä on tarkempi tapa ajatella vikaa kuin olettaa, että se kuuluu automaattisesti tietylle kerrokselle.

    Toinen hyöty on testattavuus. Kun rajapinnat ovat määriteltyjä, Node-REDin päätöslogiikkaa voidaan syöttää testidatalla ilman oikeaa laitetta. Samoin Home Assistantin mittauksia ja integraatioita voidaan tarkistaa ilman, että optimointilogiiikka tekee niiden perusteella oikeita ohjauksia.

    Kolmas hyöty on hallittu vikatila. Yhden komponentin vika ei saa automaattisesti tarkoittaa sitä, että jokin vanha arvo tai viimeinen komento tulkitaan turvalliseksi. Jokaiselle olennaiselle toiminnolle pitää määritellä erikseen, mitä tapahtuu tiedon, päätöksentekijän tai ohjausyhteyden kadotessa.

    Kanoniset mittaukset erottavat lähteen järjestelmätason tiedosta

    Yksi konkreettinen ratkaisu, joka syntyi arkkitehtuuripäätöksistä, oli kanoninen mittauskerros. Home Assistantissa järjestelmätason mittauksille käytettiin m_-etuliitettä — “measurement”.

    Ajatus oli tärkeämpi kuin nimeämiskäytäntö: raakadata ei ole sama asia kuin järjestelmätason mittaus.

    P1-lähteen teho voi käyttää eri etumerkkisopimusta kuin muu järjestelmä. Hintaintegraatio voi ilmoittaa arvon eri yksikössä. Modbus-arvo voi olla hetken unknown tai puuttua kokonaan yhteyshäiriössä.

    Kanoninen kerros normalisoi tämän. Esimerkiksi:

    sensor.m_grid_power_w
      positiivinen = osto
      negatiivinen = vienti
    
    sensor.m_spot_price_eur_kwh
      aina €/kWh

    Muu järjestelmä käyttää kanonista suuretta eikä laitteen tai integraation alkuperäistä esitystapaa. Jos lähde myöhemmin muuttuu, korjaus tehdään integraatiorajassa eikä jokaiseen päätöksentekosääntöön.

    Pelkkä arvo ei riitä

    Ensimmäisessä toteutusvaiheessa huomio oli pitkälti arvon normalisoinnissa. Myöhemmin sama periaate osoittautui tarpeelliseksi myös tiedon laadulle.

    Järjestelmätason mittauksesta pitää pystyä tietämään esimerkiksi:

    • mistä tieto tuli
    • milloin se havaittiin
    • kuinka vanha se on
    • onko se käyttökelpoinen kyseiseen päätökseen

    Tämä ajatus kasvoi myöhemmin paljon alkuperäistä m_-sensorimallia pidemmälle, mutta sen alku on tässä: päätöksentekijän ei pitäisi joutua tulkitsemaan jokaista raakaintegraatiota erikseen.

    Capability kertoo luvan – ei päätöstä

    Toinen alkuvaiheen rakenne oli capability-ajattelu: erillinen tila kertoo, onko tietyn toiminnon käyttäminen sallittua.

    Esimerkiksi c_ev_charge_allowed voidaan tulkita käyttöluvaksi sähköauton lataukselle. Se ei tarkoita, että auton pitäisi juuri nyt ladata, eikä se ole sama asia kuin fyysiselle releelle annettava komento.

    Tässä erossa on kolme eri kysymystä:

    1. Saako toimintoa käyttää?
    2. Haluaako päätöksenteko käyttää sitä juuri nyt?
    3. Toteutuiko pyydetty toiminto fyysisesti?

    Tämä erottelu osoittautui myöhemmin olennaiseksi. Yhden boolean-arvon ei pidä yrittää olla samanaikaisesti käyttäjän lupa, optimoinnin päätös ja fyysisen releen tila.

    Operating mode kokoaa käyttäjän tavoitteen yhteen paikkaan

    Toinen suunnitteluvaiheen ajatus oli keskitetty operating mode eli järjestelmän toimintatila. Sen tarkoitus oli estää tilanne, jossa esimerkiksi poissaolo, tehorajoitus ja normaali hintaoptimointi toteutetaan toisistaan tietämättöminä automaatioina.

    Alkuvaiheessa käytin tiloista nimiä kuten normal, peak_protection, vacation ja emergency. Myöhemmässä toteutuksessa nimet ja tarkka vastuunjako muuttuivat, mutta periaate säilyi: järjestelmällä pitää olla eksplisiittinen tapa ilmaista, mikä käyttötilanne on voimassa ja mikä tavoite ohittaa normaalin optimoinnin.

    Home Assistant oli luonteva paikka tehdä käyttötilasta käyttäjälle näkyvä ja säilyttää sen järjestelmätason tila. Päätöksentekologiikka puolestaan käyttää tätä yhtenä syötteenään.

    Tärkeää on, ettei toimintatila saa yksin ohittaa fyysisiä suoja- tai laiterajoja. Esimerkiksi käyttäjän pyytämä “lataa nyt” voi ohittaa normaalin hintapäätöksen, mutta ei liittymän sallittua kuormaa.

    Mitä Home Assistant ei tässä EnergyHubissa omista?

    Tässä projektissa HA:han ei haluttu keskittää päätöstä siitä, onko juuri tämä vartti kokonaisuuden kannalta paras sähköauton lataukseen tai kuinka lämpöpumpun, auton ja muun jouston prioriteetit pitäisi sovittaa yhteen.

    Nämä päätökset keskitettiin Node-REDiin, jossa yhteinen päätöspolku oli helpompi nähdä ja testata.

    Tämä ei tarkoita, ettei HA:ssa olisi lainkaan päätöksiä. Paikalliset tilakoneet, käyttötilat, datan validointi ja muut deterministiset säännöt voivat aivan hyvin kuulua integraatio- ja automaatiokerrokseen.

    Rajanveto on siis tämä: HA ei tässä toteutuksessa omista koko talon monen tavoitteen optimointia.

    Uudelleenkäynnistyminen paljasti tärkeän eron tilan ja historian välillä

    Alkuperäisessä suunnitelmassa ajatus oli, että Node-RED voi käynnistyä uudelleen, lukea Home Assistantin nykytilan ja jatkaa siitä. Tämä on hyvä tavoite, mutta lause “historiaa ei tarvita” oli liian vahva.

    Normaalin päätöksenteon ei pitäisi riippua siitä, että koko vanha tapahtumahistoria ladataan muistista jokaisessa restartissa. Järjestelmän pitää kuitenkin säilyttää tai pystyä rekonstruoimaan sellainen tila, jolla on merkitystä tulevalle käyttäytymiselle.

    Tällaista tilaa voivat olla esimerkiksi:

    • aktiivinen käyttötila
    • käyttäjän voimassa oleva tilapäinen ohitus
    • hystereesiin tai vähimmäiskestoon liittyvä tieto
    • sellainen määräaika, jota ei saa unohtaa restartissa

    Sen lisäksi historiadataa tarvitaan aivan eri tarkoitukseen: päätösten jäljitettävyyteen, vianhakuun, datan laadun arviointiin ja myöhemmin mallintamiseen.

    Tämä ero — päätöksenteon tarvitsema nykytila vs. auditointiin tarvittava historia — tarkentui vasta järjestelmän rakentamisen edetessä.

    Mitä tapahtuu, jos Node-RED pysähtyy?

    Myös tähän alkuperäinen vastaus oli liian yksinkertainen: “laitteet jäävät viimeiseen tunnettuun turvalliseen tilaan”. Viimeinen tunnettu tila ei välttämättä ole turvallinen tai tarkoituksenmukainen pitkään jatkuvassa häiriössä.

    Oikea suunnittelukysymys on laitekohtainen: mikä on hyväksyttävä fallback, jos ylempi päätöksenteko katoaa?

    • voiko laite palata omaan normaaliin säätöönsä
    • pitääkö tilapäinen optimointipyyntö purkaa
    • saako jokin kuorma jäädä päälle määräajaksi
    • miten HA tai muu paikallinen kerros tunnistaa päätöksentekijän katoamisen

    Tämä ajatus johti myöhemmissä Case-osissa heartbeat-, watchdog-, sallittavuus- ja final gate -ratkaisuihin. Tässä vaiheessa tärkeä päätös oli vasta se, että vikatilaa ei jätetä sattuman varaan.

    Käytännön toteutus Home Assistant Containerilla

    EnergyHubissa Home Assistant pyörii Docker-kontissa Lenovo ThinkCentrellä. Käytössä ei ole Home Assistant OS:ää vaan Home Assistant Container.

    Tämä antaa täyden hallinnan samalle Debian-koneelle rakennettavasta Docker-kokonaisuudesta, mutta samalla HAOS:n Supervisor- ja add-on-malli ei ole käytössä. Tarvittavat muut palvelut, kuten MQTT-välittäjä, ajetaan omina kontteinaan. Yhteisön custom integration -integraatioita voidaan puolestaan asentaa HACS:n kautta.

    Pakettipohjaisella konfiguraatiolla eri vastuut erotettiin jo tiedostotasolla:

    • 00_core.yaml — järjestelmäparametrit ja yhteiset tilat
    • 10_integrations.yaml — laite- ja tietolähdeintegraatiot
    • 20_measurements.yaml — kanoniset m_-sensorit
    • 30_load_ev.yaml — sähköautoon liittyvä paikallinen tila ja ohjausrajapinta
    • 31_load_heatpump.yaml — lämpöpumpun ohjausrajapinta
    • 40_optimization.yaml — rajapinta Node-REDin suuntaan
    • 50_reporting.yaml — energia- ja raportointitiedot

    Kaikki tämän vaiheen tiedostonimet tai vastuut eivät jääneet myöhemmin muuttumattomiksi. Olennaisempaa oli, että integraatiot, mittaukset, ohjausrajapinnat ja raportointi alettiin erottaa jo konfiguraation rakenteessa.

    Tekninen toteutus on kuvattu tarkemmin ohjeessa Home Assistantin valmistelu integraatiokerrokseksi.

    Tämän vaiheen tärkein oppi

    Home Assistantin arvo EnergyHubissa ei vähentynyt, kun siltä poistettiin järjestelmätason optimoinnin omistajuus. Päinvastoin sen rooli selkeytyi.

    Se toimii rajana laitteiden kirjavan maailman ja EnergyHubin yhteisen tilamallin välillä. Kun mittaukset, käyttötilat ja ohjausrajapinnat ovat yhdessä paikassa määriteltyjä, ylempi päätöksenteko voi keskittyä siihen, mitä sen oikeasti pitää ratkaista.

    Integraatiokerroksen tehtävä ei ole olla mahdollisimman yksinkertainen. Sen tehtävä on tehdä muun järjestelmän riippuvuuksista hallittavia.

    Seuraavaksi: kerrosmalli käytännössä

    Osa 4 käy läpi kerrosmallin kokonaisuudessaan: miten Home Assistant, Node-RED ja kenttätaso keskustelevat keskenään ja mikä MQTT:n rooli tässä toteutuksessa on.

    HEOMF Case: Oma talo -sarjan pääsivulta löydät kaikki sarjan osat.

  • Case: oma talo — Osa 2: Arkkitehtuuripäätökset: mitä päätettiin ennen koodia

    EnergyHubin arkkitehtuuripäätöksiä ennen varsinaisen toteutuksen aloittamista kuvaava grafiikka

    Ensimmäinen reaktio ongelmaan oli väärä.

    Kun Osa 0:ssa kuvattu tilanne alkoi olla selvä — järjestelmä oli kasvanut hallitsemattomaksi, ohjausvastuu oli epäselvä eikä uusia ominaisuuksia enää uskaltanut lisätä huoletta — ensimmäinen ajatus oli siivota Home Assistant.

    Ajatus vaikutti loogiselta. Automaatioita voisi järjestellä paketteihin, nimeämiskäytäntöjä yhtenäistää ja YAML:ia selkeyttää. Kaikki tuntui korjattavissa olevalta, kunhan kokonaisuuden vain kävisi kunnolla läpi.

    Kävin läpi.

    Mitä enemmän kokonaisuutta tutkin, sitä selvemmäksi yksi asia tuli: ongelma ei ollut YAML.

    Ongelma oli siinä, mihin päätöksenteko oli kertynyt

    Home Assistantiin oli vuosien varrella kertynyt paljon muutakin kuin integraatioita ja käyttöliittymää. Samassa kokonaisuudessa ratkaistiin esimerkiksi:

    • milloin auto lataa
    • mitä kuormaa priorisoidaan
    • milloin aurinkoylijäämä menee hinnan edelle
    • milloin tehoraja ohittaa muut tavoitteet

    Nämä ovat järjestelmätason päätöksiä. Ongelma ei ollut se, etteikö Home Assistantilla voisi toteuttaa logiikkaa, vaan se, että päätökset olivat hajallaan eri automaatioissa ilman yhtä yhteistä priorisointimallia.

    Kun yksi automaatio päätti käynnistää latauksen, toinen saattoi samaan aikaan yrittää rajoittaa sitä. Molemmat saattoivat olla yksittäin järkeviä, mutta kumpikaan ei omistanut kokonaisuutta.

    Tässä projektissa päätin siksi erottaa Home Assistantin roolin järjestelmätason optimoinnista. Home Assistant jäi integraatioiden, tilan seurannan ja käyttöliittymän keskeiseksi alustaksi, mutta koko talon priorisointia ei enää rakennettaisi hajalleen sen erillisiin automaatioihin.

    Pelkkä vanhan rakenteen siistiminen olisi tehnyt samasta vastuunjaosta siistimmän näköisen. Se ei olisi ratkaissut itse ongelmaa.

    Tärkein yksittäinen päätös

    Tärkein arkkitehtuuripäätös koko projektissa oli tämä:

    Tässä EnergyHubissa Home Assistant ei enää omista järjestelmätason optimointia.

    Se kerää ja välittää tietoa, hallitsee integraatioita, tarjoaa käyttöliittymän ja toimii osana ohjauspolkua. Päätökset siitä, milloin kuormia kannattaa käyttää, mitä priorisoidaan ja miten ristiriitaiset tavoitteet sovitetaan yhteen, keskitetään omaan päätöksentekologiikkaansa.

    Tämä yksi päätös selkeytti paljon muuta. Kun vastuut ovat näkyviä, on helpompi päättää, kuuluuko uusi toiminto laiteintegraatioon, automaatioon, optimointiin vai fyysisen ohjauksen sallittavuuteen.

    HEOMF:n optimoinnin arkkitehtuurissa sama periaate näkyy loogisten vastuiden erottamisena: integraatio, automaatio, optimointi ja fyysinen toteutus eivät ole sama tehtävä, vaikka osa niistä pyörisi samalla teknisellä alustalla.

    Miltä työnjako näytti ennen ensimmäistä koodiriviä?

    Projektin toteutusta varten jaoin vastuut neljään käytännön kokonaisuuteen. Tämä oli toteutustapa, ei vaatimus siitä, että jokaisen vastuun pitäisi aina olla oma erillinen ohjelmistonsa tai fyysinen laitteensa.

    Kenttä- ja laitetaso

    Täällä ovat fyysiset laitteet ja niiden suorat rajapinnat: Shelly-releet, lämpöpumpun ja invertterin Modbus-yhteydet, energiamittaukset ja laitteiden omat säätimet.

    Tärkeä tavoite oli, etteivät laitteiden omat turvalliset käyttörajat riippuisi siitä, että ylemmän tason optimointi toimii juuri sillä hetkellä. Se ei tarkoita, että koko kenttätaso olisi täysin itsenäinen kaikissa häiriöissä, vaan että vian vaikutus pyritään rajaamaan mahdollisimman lähelle sitä toimintoa, jota se koskee.

    Integraatio ja tilannekuva

    Home Assistantin tehtäväksi jäi laiteintegraatioiden kokoaminen, mittausten ja tilojen tarjoaminen muulle järjestelmälle sekä käyttöliittymä.

    Ajatus ei ollut tehdä HA:sta passiivista putkea. Se voi sisältää myös automaatiota ja paikallista tilalogiikkaa. Rajaus koski ennen kaikkea sitä, ettei koko talon optimointipäätöksiä enää hajautettaisi ympäri järjestelmää.

    Päätöksenteko ja orkestrointi

    Node-RED valittiin tässä projektissa paikaksi, johon järjestelmätason päätöksentekoa alettiin keskittää. Sen tehtäväksi suunniteltiin hinnan, aurinkotuotannon, tehon, lämpötilojen ja käyttäjän tavoitteiden yhdistäminen yhteiseen päätöspolkuun.

    Tässä kerroksessa ratkaistaan esimerkiksi, milloin autoa kannattaa ladata, milloin lämpöpumpulle annetaan poikkeava tavoite ja mikä kuorma väistää, jos kaikkia tavoitteita ei voida toteuttaa samaan aikaan.

    Observointi ja historiatieto

    Aikasarjatietokannan ja visualisoinnin tehtäväksi suunniteltiin muutakin kuin energiankulutuksen näyttäminen. Järjestelmästä piti myöhemmin pystyä tarkistamaan myös päätöksiä ja niiden seurauksia.

    Tätä ei kannata ajatella täysin erillisenä ohjauskerroksena, vaan toimintona, joka kulkee muiden vastuiden rinnalla. Ilman historiatietoa ja diagnostiikkaa hiljainen vika voi näyttää pitkään normaalilta toiminnalta.

    MQTT rajapinnaksi kerrosten väliin

    Yksi keskeisistä suunnittelupäätöksistä oli käyttää MQTT:tä sovituissa kohdissa järjestelmän sisäisenä viestiväylänä. Tarkoitus oli vähentää suoria riippuvuuksia niin, ettei päätöksentekologiikan tarvitse tuntea jokaisen laitteen omaa rajapintaa.

    Suunnitelman mukaisia aiheita olivat esimerkiksi:

    energyhub/system/safety_trip
    energyhub/command/ev/allowed

    MQTT ei itsessään takaa, että vastaanottajan ollessa poissa jokainen viesti automaattisesti odottaa ja toimitetaan myöhemmin. Se riippuu muun muassa QoS-tasosta, retained-viesteistä, sessiosta ja sovelluksen omasta suunnittelusta.

    Arkkitehtuuripäätös oli siksi laajempi kuin “käytetään MQTT:tä”: viestien merkitys, säilyvyys, vanheneminen ja vastaanottajan käyttäytyminen piti määritellä erikseen.

    Tavoite oli, että yhden komponentin vaihto tai uudelleenkäynnistys ei pakota kirjoittamaan koko järjestelmän logiikkaa uudelleen.

    Miksi juuri Node-RED?

    Kysymys ei ollut siitä, etteikö Home Assistantin automaatioilla voisi rakentaa monimutkaistakin päätöksentekoa. Tässä projektissa Node-RED sopi kuitenkin paremmin siihen tapaan, jolla halusin nähdä ja testata päätöspolun.

    Energiaoptimointi ei ollut enää vain yksittäinen “jos X, tee Y” -reaktio. Päätöksessä saatettiin joutua huomioimaan yhtä aikaa esimerkiksi hinta, aurinkotuotanto, kokonaisteho, lämpötila ja käyttäjän asettama tavoite.

    Node-REDissä tällaisen päätösketjun pystyi rakentamaan näkyväksi flow’ksi, jossa lähtötiedot, ehdot, prioriteetit ja lopputulos voitiin erottaa toisistaan.

    Toinen syy oli vikatilanteiden eksplisiittinen käsittely. Puuttuva hintatieto, vanhentunut mittaus tai vastaamaton laite piti saada omaksi tunnetuksi tilakseen sen sijaan, että automaatio vain jäisi hiljaa tekemättä.

    Tämä oli siis EnergyHubin toteutusvalinta, ei yleinen väite siitä, että Node-RED olisi optimointiin aina Home Assistantia parempi.

    Miksi kriittinen päätöspolku haluttiin paikalliseksi?

    Kolmas keskeinen päätös oli sijoittaa EnergyHubin varsinainen päätöksenteko paikalliselle Lenovo ThinkCentre -koneelle Debianin ja Docker Composen päälle.

    Tavoitteena ei ollut poistaa pilveä järjestelmästä. Hintatiedot, sääennusteet ja osa laitekohtaisesta datasta tulevat joka tapauksessa ulkoisista palveluista.

    Sen sijaan halusin, ettei talon sisäinen päätöspolku olisi tarpeettomasti riippuvainen jatkuvasta internet-yhteydestä. Paikalliset mittaukset, laiteintegraatiot ja keskeinen ohjaus pystyvät toimimaan paikallisessa verkossa, vaikka uusi ulkoinen tieto olisi hetken poissa.

    Tämä ei vielä tee järjestelmästä automaattisesti vikasietoista. Myös Lenovo, paikallinen verkko tai oma ohjelmisto voivat vikaantua. Siksi myöhempi työ joutui käsittelemään erikseen fallbackit, watchdogit, datan tuoreuden ja fyysisen toteuman verifioinnin.

    Mitä päätettiin jo tässä vaiheessa jättää ratkaisematta?

    Arkkitehtuuripäätöksiä tehdessä oli tärkeää erottaa rakenne varsinaisesta optimointilogiikasta.

    Kerrosmalli ei vielä kerro, mikä on oikea sähköauton latausraja, kuinka paljon lämmitystä kannattaa siirtää tai mikä ennustemalli toimii parhaiten. Se ei myöskään tee järjestelmästä luotettavaa vain siksi, että komponentit on nimetty eri kerroksiin.

    Arkkitehtuurin tehtävä oli tehdä nämä myöhemmät ongelmat ratkaistaviksi yksi kerrallaan:

    • päätöslogiikka voidaan muuttaa ilman että laiteintegraatio kirjoitetaan uudelleen
    • uusi mittaus voidaan lisätä yhteiseen tilannekuvaan ilman että jokainen ohjaus lukee sitä suoraan
    • vikatilanteen paikka voidaan rajata paremmin
    • uuden ominaisuuden vastuu voidaan määrittää ennen toteutusta

    Juuri tätä varten arkkitehtuuri tehtiin ennen koodia.

    Yksi päätös vaikutti kaikkeen myöhempään

    Jälkikäteen katsottuna tärkein ratkaisu ei ollut Node-RED, MQTT, Debian eikä Lenovo. Ne olivat toteutusteknologioita.

    Tärkein ratkaisu oli päättää, ettei koko järjestelmä enää kasva yhden työkalun sisällä sen mukaan, mihin uusi automaatio sattuu helpoimmin syntymään.

    Päätöksenteko, integraatio, fyysinen toteutus ja havaittavuus saivat omat vastuunsa.

    Myöhemmät osat näyttävät, että rajat eivät pysyneet käytännössä aivan näin yksinkertaisina. Se oli odotettavissa. Olennaisempaa oli, että järjestelmällä oli ensimmäistä kertaa rakenne, jonka sisällä näitä rajoja voitiin tarkentaa ilman että palattiin vanhaan hajautettuun automaatiomalliin.

    Seuraavaksi: Home Assistant integraatiokerroksena

    Osa 3: Home Assistant integraatiokerroksena käsittelee sitä, miten entiteettimalli rakennettiin, mitä integraatioita tarvittiin ja miten rajapinta päätöksentekokerrokseen toteutettiin käytännössä.

    Tekninen perusalusta on kuvattu erillisessä Debian + Docker + Home Assistant + Node-RED -ohjeessa.

    HEOMF Case: Oma talo -sarjan pääsivulta löydät kaikki sarjan osat.

  • Case: oma talo — Osa 1: Mitä vuosi dataa kertoo ennen optimointia

    Ennen kuin rakennetaan mitään, katsotaan mitä on.

    Tämä artikkeli on lähtötilanteen analyysi. Aineisto kattaa noin vuoden — 14.4.2025 alkaen huhtikuun 2026 alkuun — ja se on kerätty vanhan järjestelmän aikana, ennen kuin uusi EnergyHub on pystyssä. Uusi järjestelmä on tätä kirjoittaessa vielä rakenteilla. Sarja dokumentoi rakentamista kun se tapahtuu.

    Data tulee kolmesta lähteestä: verkosta ostettu sähkö 15 minuutin resoluutiolla, verkkoon myyty sähkö samalla resoluutiolla ja aurinkovoimalan tuotantodata. Hintalaskelmissa käytetään spot-hintaa, 0,4 snt/kWh marginaalia ja siirto- sekä verokuluja yhteensä noin 4,74 snt/kWh. Käytännössä jokainen itse käytetty aurinkokilowattitunti korvaa siis ostosähköä noin 5,14 sentin lisäkustannuksella spothinnan päälle. Verkkoon myyty kilowattitunti saa pelkän spot-hinnan — ilman siirtoa, ilman veroja, ilman mitään muuta.

    Tästä seuraa yksi koko sarjan keskeisimmistä havainnoista, ja se näkyy datassa heti.

    Ensimmäinen havainto: energiaa tuotetaan paljon, mutta arvo jää osin hyödyntämättä

    Vuoden mittausjaksolla 13,2 kWp aurinkovoimala tuotti noin 12 800 kWh. Se on merkittävä määrä — enemmän kuin puolet talon vuosikulutuksesta. Mutta kun katsotaan minne tuo energia meni, kuva muuttuu.

    Itse käytettiin noin 4 600 kWh — se on 36 prosenttia tuotannosta. Loput, noin 8 600 kWh, meni verkkoon myyntiin.

    Taloudellisesti ero on merkittävä. Itse käytetty aurinkosähkö oli arvoltaan keskimäärin 11,4 snt/kWh — se korvasi ostosähköä, johon sisältyy siirto ja verot. Verkkoon myyty sähkö sai keskimäärin 3,3 snt/kWh. Hintaero on lähes nelinkertainen.

    Vuoden aurinkosähkön kokonaisarvo oli noin 812 euroa, josta oman käytön osuus oli 526 euroa ja myynnin osuus vain 286 euroa — vaikka myyntiin meni kaksi kolmasosaa tuotannosta.

    Tämä on tärkein yksittäinen luku koko analyysissa. Aurinkosähkön arvo ei synny tuotantomäärästä. Se syntyy siitä, kuinka suuri osa tuotannosta saadaan käytettyä oikeaan aikaan omassa kuormassa.

    Toinen havainto: kulutus ei ole tasainen — ja optimointiongelma vaihtelee vuodenajan mukaan

    Vuosikulutus oli noin 22 700 kWh. Se kuulostaa yhdeltä luvulta, mutta kätkee alleen kaksi täysin erilaista optimointiongelmaa.

    Tammikuu 2026 oli yksi kuukausi. Kulutus oli 3 800 kWh, ostosähkön kustannus 713 euroa. Aurinkotuotantoa kertyi vain 153 kWh — käytännössä nolla. Nettokustannus oli lähes sama kuin ostokustannus.

    Heinäkuu 2025 oli toinen kuukausi. Kulutus oli 976 kWh, mutta aurinkovoimala tuotti 2 206 kWh — yli kaksi kertaa enemmän kuin talo kulutti. Ostosähköä tarvittiin vain 399 kWh, lasku oli 31 euroa, ja verkkoon myytiin 1 629 kWh myyntituloin 41 euroa. Kuukauden nettotulos oli siis plussan puolella: myyntitulot ylittivät ostokustannukset.

    Päivittäinen kulutuksen keskiarvo (sininen) ja kuukauden korkein vuorokausikulutus (oranssi). Talvi- ja kesäkuukausien ero on selvä — mutta myös maksimin ja keskiarvon välinen kuilu kertoo joustopotentiaalista.

    Kesällä korostuu aurinkosähkön oma käyttö. Talo kuluttaa vähän, aurinko tuottaa paljon — ja silti heinäkuussa omakäyttöaste oli vain 26 prosenttia. Kolme neljästä aurinkokilowattitunnista meni verkkoon kesälläkin, usein tunteina jolloin spot-hinta oli matala tai negatiivinen.

    Talvella kuorma on täysin eri luokkaa. Tammikuun päiväkulutuksen keskiarvo oli 123 kWh — lähes neljä kertaa enemmän kuin heinäkuussa. Aurinkotuotantoa ei juuri ole, hinta vaihtelee ja tehopiikit kasvavat.

    Sama optimointilogiikka ei toimi molemmissa tilanteissa. Kesällä tavoite on saada oma kuorma käymään silloin kun aurinkoa on. Talvella tavoite on siirtää kuormia halvemmille tunneille ja pitää tehopiikit kurissa. Järjestelmä joka ei tunnista tätä eroa optimoi väärin puoli vuotta.

    Kolmas havainto: tehopiikit kertovat enemmän kuin vuosikulutus

    Kokonaiskulutus kertoo paljon, mutta ei kerro milloin kuorma osuu yhteen.

    Tuntiteho suhteessa vuorokauden keskilämpötilaan. Pakkasella tehon hajonta kasvaa selvästi — mutta korkeita tuntitehoja esiintyy myös leudommalla säällä. Tehopiikit eivät ole pelkästään lämmitysongelma.

    15 minuutin resoluutiolla tarkasteltuna korkein yksittäinen tehopiikki oli 18,1 kW — tammikuussa, yöllä, ilman aurinkoa. Lähes kaikki top-20 tehopiikit ajoittuivat talvikuukausiin ja tilanteisiin joissa aurinkotuotantoa ei ollut lainkaan.

    Mutta kuviossa näkyy myös outlier-pisteitä yli 12 kW plus-lämpötilan puolella — siis tilanteissa joissa lämmitystarve ei ole suuri. Todennäköinen selitys on sauna ja lämmin käyttövesi samaan aikaan. Saunan kiukaan teho on 9 kW, ja jos käyttövesivaraaja lämpenee samalla hetkellä, yhteistä kuormaa kertyy helposti 11–14 kW pelkästään näistä kahdesta. Auton lataus lisää vielä 3,6 kW jos se sattuu käymään samaan aikaan.

    Tämä on tehopiikkien ydin: ne eivät synny yhdestä laitteesta, vaan kuormien päällekkäisyydestä. Kukaan ei suunnittele ”sauna + käyttövesi + lataus samaan aikaan” — se vain tapahtuu. Ja juuri siksi tehopiikkien hallinta on koordinointiongelma, ei yksittäisen laitteen ohjausta.

    Kesällä tilanne oli erilainen. Elokuun korkein kuormituspiikki oli 17,0 kW — ja samaan hetkeen tuotettiin 1,8 kW aurinkoa, joten verkosta otettu teho oli noin 15,2 kW. Aurinko leikkasi huippua vain marginaalisesti. Tässäkin tapauksessa kuorma syntyi todennäköisesti samoista syistä: sauna, käyttövesi tai lataus samaan aikaan.

    Kolme tavoitetta — hinta, aurinko ja teho — eivät automaattisesti tue toisiaan. Ne voivat aktiivisesti sotia keskenään.

    Neljäs havainto: aurinko paistaa kun sähkö on halpaa

    Hintatarkastelussa näkyy kiinnostava asymmetria.

    Aurinkotuotantotunneilla spot-hinta oli keskimäärin 4,7 snt/kWh — selvästi alle vuoden keskiarvon. Aurinko tuottaa siis eniten juuri silloin kun sähkö on muutenkin halpaa markkinalla.

    Itse käytetty aurinkosähkö on silti aina arvokkaampaa kuin myyty — koska se korvaa ostosähköä johon sisältyy spot-hinnan lisäksi siirtomaksu, verot ja ALV. Tässä järjestelmässä itse käytetty kilowattitunti vastaa noin 11,4 snt/kWh säästöä, kun myyty kilowattitunti tuo vain 3,3 snt/kWh. Oman käytön arvo on lähes nelinkertainen myyntiin verrattuna — joten omaa tuotantoa kannattaa aina suosia.

    Osa kulutuksesta on kuitenkin pakko ostaa verkosta. Siinä kohtaa ratkaisee hinta: kalliit tunnit vältetään, halvat suositaan — riippumatta siitä mihin vuorokaudenaikaan ne osuvat. Tämä on se lisäsäästö jota pelkkä aurinkosähkön oma käyttö ei tuota.

    Mitä tämä tarkoittaa optimoinnin kannalta

    Skenaarioanalyysi näyttää potentiaalin selkeästi. Jos omakäyttöaste nousisi nykyisestä 36 prosentista 50 prosenttiin, lisäarvo olisi noin 142 euroa vuodessa. 60 prosentin omakäyttöasteella lisäarvo olisi lähes 245 euroa.

    Nämä luvut ovat realistisia — mutta ne edellyttävät kuormansiirtoa joka toimii koordinoidusti, ei satunnaisesti. Ja siinä tulee vastaan ongelma josta Osa 0:ssa puhuttiin: vanhalla järjestelmällä en uskaltanut lisätä älykkäämpää kuormansiirtoa, koska en tiennyt miten se sopisi olemassa oleviin logiikkoihin.

    Data on selkeä. Mahdollisuus on selkeä. Estäjänä on arkkitehtuuri — tai sen puute.

    Yhteenveto lähtötilanteesta

    MittariArvo
    Vuosikulutus22 700 kWh
    Aurinkotuotanto12 800 kWh
    Omakäyttöaste36 %
    Ostosähkön kustannus2 522 €/vuosi
    Aurinkosähkön myyntitulo286 €
    Aurinkosähkön oman käytön arvo526 €
    Korkein 15 min tehopiikki18,1 kW
    Kallein kuukausitammikuu 2026: 713 €
    Halvin kuukausiheinäkuu 2025: 31 €

    Tämä on tilanne ennen uutta järjestelmää. Ei huono — mutta selvästi parempi on mahdollinen, jos optimointi tehdään hallitusti.

    Seuraavissa osissa katsotaan miten. Ensin arkkitehtuuripäätökset — ne valinnat jotka tehdään ennen koodia.

    Seuraavaksi: Osa 2 — Arkkitehtuuripäätökset. Miksi kerrosmalli, miksi Node-RED, ja mitä tarkoittaa ohjausvastuu käytännössä.

    Tämän artikkelin data on analysoitu Python-pohjaisella laskentaskriptillä.

  • Case: oma talo — Osa 0: Miksi kaikki rakennettiin uudelleen

    Tämä sarja ei ala automaatioista. Se alkaa siitä, miksi automaatiot eivät enää riittäneet.

    Keväällä 2026 minulla oli toimiva järjestelmä.
    Maalämpöpumppu ohjautui pörssisähkön mukaan. Sähköauto latautui halvimmilla tunneilla. Aurinkotuotanto näkyi kojelaudalla. LED-nauha seinällä kertoi energiatilanteen yhdellä vilkaisulla.
    Sitten aloin suunnitella tätä sarjaa. Tavoitteeni oli yksinkertainen: dokumentoida miten järjestelmä toimii.
    Törmäsin ongelmaan jo ensimmäisellä sivulla.

    Järjestelmä ei ollut rikki. Se oli kasvanut.

    Yhdessä vaiheessa sähköauton latausta ohjasi käytännössä kolme eri logiikkaa samaan aikaan. Yksi automaatio halusi ladata halvimmilla tunneilla. Toinen reagoi aurinkoylijäämään. Kolmas valvoi pääsulakkeita ja pudotti kuormaa tarvittaessa.

    Kaikki toimivat yksinään oikein. Ongelma oli, ettei kukaan enää varsinaisesti omistanut latauksen ohjausta.

    Kun järjestelmään lisättiin vielä uusia ehtoja, aloin huomata jotain epämukavaa: en enää pystynyt varmasti sanomaan, mikä logiikka kulloinkin päätti mitä tapahtuu. Järjestelmä ei ollut varsinaisesti rikki. Mutta se ei ollut enää hallittu.

    Toinen ongelma tuli aurinkosähkön hyödyntämisessä. Data oli selkeä: vuoden mittausjaksolla yli 60 prosenttia aurinkotuotannosta meni verkkoon myyntihintaan, joka oli noin neljäsosa ostosähkön hinnasta. Oman käytön kasvattaminen olisi taloudellisesti merkittävää. Mutta kun mietin, miten lisäisin älykkäämmän kuormansiirron aurinkotunneille, törmäsin seinään.

    En uskaltanut enää laajentaa olemassa olevaan järjestelmään.

    Jokainen uusi ominaisuus kasvatti samalla riskiä siitä, että jokin vanha logiikka käyttäytyisi odottamattomasti. En tiennyt mihin uusi ohjaus kuuluisi — enkä pystynyt varmistamaan mitä sivuvaikutuksia sillä olisi.

    Tämä oli tärkeä havainto. En ollut enää rakentamassa järjestelmää — olin ylläpitämässä kasvua jota en täysin ymmärtänyt.

    Kasvu ilman rakennetta

    Vuosien varrella oli syntynyt kymmeniä YAML-automaatioita ilman pakettirakenetta. Hintalogiikka, EV-ohjaus, lämpöpumppu, aurinkotuotanto ja LED-visualisointi olivat kehittyneet omina projekteina omaan tahtiinsa. Jossain vaiheessa ne alkoivat vaikuttaa toisiinsa tavoilla, joita ei ollut suunniteltu.

    Dashboard oli täynnä kokeiluja, joista osa oli käytössä, osa ei. Sulakevahdin logiikka oli kirjoitettu yhteen paikkaan mutta siihen viitattiin kolmesta eri kohdasta eri tavoin. Kun halusin lisätä uuden ohjauksen, en tiennyt mihin se kuuluu — enkä uskaltanut ottaa riskiä.

    Sama ongelma näkyi myöhemmin myös HEOMF-työssä, jossa kotitalouden energiajärjestelmää analysoitiin laajemmin: optimointi ei ensisijaisesti hajoa automaatioihin, vaan arkkitehtuuriin niiden alla. Jos ohjausvastuu ei ole selkeä, järjestelmä on hauras riippumatta siitä kuinka hyvin yksittäiset osat toimivat.

    Siinä oli ongelma. Ja sen nimi oli:

    Ohjausvastuu ei ollut selkeä.

    Päätös

    Päätin rakentaa uuden EnergyHub-pohjan.

    Ei siksi, että Home Assistant olisi lakannut toimimasta. Vaan siksi, että vanha järjestelmä oli kokeiluympäristö — ja se oli saavuttanut rajansa. En voinut enää luotettavasti laajentaa, auditoida tai selittää sitä. Ja jos en pysty selittämään järjestelmää, en pysty myöskään luottamaan siihen.

    Uusi alusta rakennettiin Lenovo ThinkCentre mini-PC:lle Debian-käyttöjärjestelmän päälle Docker Compose -rakenteella. Home Assistant toimii integraatiokerroksena — ei optimointimoottorina. Node-RED ottaa vastuun päätöksenteosta. MQTT on järjestelmien välinen selkäranka.

    Mutta tekninen pino on toissijainen asia. Tärkeämpää on se, mitä arkkitehtuurilla tavoitellaan:

    Siirrytään kokeiluympäristöstä hallittuun energiainfrastruktuuriin.

    Tämä tarkoittaa käytännössä, että jokaisella järjestelmän osalla on selkeä rooli — ja vain yksi rooli. Mittaus on mittausta. Päätöksenteko on päätöksentekoa. Ohjaus on ohjausta. Turvalogiikka toimii itsenäisesti riippumatta siitä, onko optimointikerros pystyssä vai ei.

    Tähän liittyy yksi suunnitteluperiaate, joka ohjaa koko EnergyHub-rakennetta:

    Järjestelmän pitää toimia taustalla ilman päivittäistä seurantaa tai säätöä.

    Ihminen puuttuu kuvaan kahdessa tilanteessa: kun muuttaa talon tilaa — lähtee lomalle, kutsuu vieraita, haluaa saunan tiettyyn aikaan — tai kun haluaa tehdä manuaalisen ohituksen. Muuten järjestelmä hoitaa itse. Se priorisoi, toipuu häiriöistä ja tunnistaa hiljaiset viat — ilman että kukaan katsoo.

    Autonomia ei synny yksittäisistä automaatioista. Se syntyy rakenteesta.

    Se kuulostaa yksinkertaiselta. Mutta se vaatii rakenteen, ei vain hyvää tarkoitusta.

    Mitä tämä sarja näyttää

    Tämä ei ole tutoriaali eikä valmis ratkaisu.

    Se on dokumentaatio oikeasta toteutuksesta, oikeassa talossa, oikeine ongelmineen — mukaan lukien ne päätökset joita katuu ja ne joita ei. Mukana on myös kustannukset, sekä eurot että aika.

    Sarja etenee rakentamisen logiikassa. Ensin katsotaan lähtötilanne rehellisesti: mitä vuoden data kertoo ennen kuin uusi järjestelmä on pystyssä. Sitten käydään läpi arkkitehtuuripäätökset — valinnat jotka tehtiin ennen koodia. Sen jälkeen rakennetaan kerros kerrokselta: integraatiokerros, optimointikerros, kenttäohjaukset laitteittain. Lopuksi katsotaan operointi — miten järjestelmä pidetään toiminnassa vuosien ajan, ei vain käyttöönottopäivänä.

    Jokaiseen tekniseen toteutukseen on linkki erilliseen ohjeartikkeliin. Pääsarjan voi lukea ilman niitä.

    Ennen kuin mennään eteenpäin

    Yksi asia kannattaa sanoa suoraan.

    Tässä talossa on 13,2 kWp aurinkovoimala, maalämpöpumppu, sähköauto ja nyt uusi EnergyHub-alusta. Järjestelmä on lähtökohtaisesti enemmän kuin mitä useimmissa kotitalouksissa on.

    Mutta sarjan ydinajatus ei ole tämän talon kopioiminen.

    Se on sen osoittaminen, miten energiajärjestelmää kannattaa ajatella. Sama kerrosarkkitehtuuri, sama vastuunjako, sama ajattelu ohjausvastuusta toimii pienemmässä talossa, yksinkertaisemmalla laitteistolla, matalammalla kypsyystasolla.

    Mittakaava muuttuu, rakenne ei.

    Seuraavassa osassa: mitä vuoden data kertoo ennen optimointia — kulutuksen anatomia, tehopiikit ja aurinkosähkön todellinen arvo tässä taloudessa.

    HEOMF-arkkitehtuurisarjan löydät täältä. White paper HEOMF-kypsyysmallista löytyy täältä.

  • HEOMF – Optimoinnin arkkitehtuuri – Osa 1: Miksi kotitalon energiajärjestelmä pitää suunnitella uudelleen

    Kotitalouden energianhallinnan arkkitehtuuria ja järjestelmätason ohjausta kuvaava grafiikka

    Kotitalouden sähköjärjestelmä on muuttunut nopeasti. Aurinkosähkö, lämpöpumput, sähköautot, pörssisähkö, akut ja erilaiset kuormanhallinnan tarpeet ovat tuoneet samaan taloon yhä enemmän laitteita, mittauksia ja päätöksiä.

    Samalla yksi asia on usein jäänyt ennalleen: laitteita ohjataan edelleen erillisinä kokonaisuuksina. Yksi automaatio seuraa sähkön hintaa, toinen lataa autoa, kolmas ohjaa lämpöpumppua ja neljäs reagoi aurinkotuotantoon.

    Kun järjestelmä on pieni, tämä voi toimia hyvin. Kun riippuvuuksia tulee lisää, yksittäisten automaatioiden summa ei kuitenkaan enää välttämättä muodosta toimivaa kokonaisuutta.

    Tässä kohtaa ongelma ei ole enää yksittäisen automaation toteutus. Se on arkkitehtuurikysymys.

    Yksittäisten ohjausten raja tulee nopeasti vastaan

    Kotitalouden energian optimointi alkaa usein aivan järkevästi: seurataan sähkön hintaa, ajastetaan muutama kuorma ja lisätään automaatiota sinne, missä siitä näyttää olevan hyötyä.

    Ongelma syntyy vähitellen. Sähköauton lataus voi haluta käynnistyä samoilla halvoilla varteilla kuin käyttöveden lämmitys. Lämpöpumpulla voi olla samaan aikaan oma lämmitystarpeensa. Aurinkotuotanto voi muuttaa tavoitetta kesken päivän, ja pääsulakkeet asettavat kaikelle yhteisen fyysisen rajan.

    Jokainen yksittäinen automaatio voi tehdä oman tehtävänsä oikein ja silti koko talo toimia huonosti.

    Tämä on tärkeä ero: paikallisesti oikea päätös ei välttämättä ole järjestelmätasolla oikea päätös.

    Energia ja teho ovat eri asioita

    Optimoinnista puhuttaessa huomio kiinnittyy helposti energiaan ja hintaan: montako kilowattituntia käytetään ja mitä ne maksavat. Sähköjärjestelmän toiminnan kannalta myös hetkellinen teho on kuitenkin olennainen.

    Ajatellaan tavallista tilannetta, jossa sähköauto lataa, lämpöpumppu käy ja käyttövesi lämpenee samaan aikaan. Jokainen kuorma voi olla käynnissä täysin perustellusta syystä, mutta niiden yhteisteho voi muodostaa tarpeettoman korkean piikin.

    Se voi tulla vastaan esimerkiksi pääsulakkeiden rajana tai kasvattaa tehopohjaisen hinnoittelun merkitystä siellä, missä sellaista sovelletaan. Siksi energianhallinta ei voi tarkastella vain kilowattitunteja. Sen täytyy tietää myös, mitä talossa tapahtuu juuri nyt.

    Halvin energia ei ole hyvä optimointitulos, jos kaikki halvat kuormat käynnistetään samaan aikaan.

    Mittaus on päätöksenteon lähtökohta

    Ohjaus tarvitsee tietoa. Pelkkä jälkikäteen näkyvä energiankulutus ei riitä, jos järjestelmän pitää tehdä päätöksiä reaaliajassa tai estää tehopiikki ennen kuin se syntyy.

    Riippuen ohjattavista kuormista järjestelmän pitää tuntea esimerkiksi liittymän kokonaisteho, yksittäisten suurten kuormien tila, käytettävissä oleva aurinkotuotanto, laitteiden omat rajat sekä se, kuinka tuoretta mittausdata on.

    Kaikkea ei tarvitse mitata mahdollisimman tarkasti vain mittaamisen vuoksi. Oleellista on, että päätöksenteon kannalta kriittiset suureet tunnetaan riittävän luotettavasti.

    Ilman luotettavaa tilannekuvaa automaatio joutuu tekemään oletuksia juuri silloin, kun sen pitäisi tehdä päätöksiä.

    Pilvipalvelu voi olla osa järjestelmää, mutta ei sen ainoa perusta

    Monet kodin energialaitteet käyttävät valmistajan pilvipalvelua tai API-rajapintaa. Niistä voi saada arvokasta tietoa ja hyödyllisiä ohjausmahdollisuuksia, eikä pilven käyttö itsessään ole ongelma.

    Arkkitehtuurin kannalta olennaista on riippuvuus. Yhteys voi katketa, palvelu voi muuttua tai API voi olla hetkellisesti käytettävissä huonosti. Tällöin talon turvallisen perustoiminnan ei pitäisi romahtaa.

    Paikallinen järjestelmä tarvitsee siksi selkeän toimintatavan tilanteisiin, joissa ulkoinen tieto puuttuu. Joitakin optimointeja voidaan jättää tekemättä, mutta esimerkiksi kuormien turvalliset rajat ja laitteiden oma perustoiminta pitää säilyttää.

    Tätä voidaan ajatella yksinkertaisena periaatteena: optimointi saa hyödyntää pilveä, mutta turvallinen perustoiminta ei saa olla siitä täysin riippuvainen.

    Kyberturvallisuus kuuluu samaan arkkitehtuuriin

    Kun samaan järjestelmään yhdistetään mittareita, lämpöpumppu, sähköauton lataus, invertteri, releitä, kotiautomaatio ja etäyhteyksiä, kotitalouden energianhallinta alkaa muistuttaa pientä hajautettua IT-järjestelmää.

    Siksi pääsynhallinta, verkon rajaukset, päivitykset ja laitteiden oletusasetukset eivät ole erillisiä tietoturva-aiheita. Ne ovat osa sitä, voiko ohjausjärjestelmään luottaa.

    Riski ei koske vain mittausdataa. Jos ohjausjärjestelmä pystyy kytkemään suuria sähkökuormia, virheellinen tai luvaton ohjaus voi vaikuttaa myös talon fyysiseen toimintaan.

    Käyttäjän ei pitäisi olla jatkuva säätöalgoritmi

    Manuaalinen optimointi voi olla hyvä tapa ymmärtää omaa kulutusta ja kokeilla, millaiset ohjaukset todella toimivat. Se ei kuitenkaan skaalaudu hyvin järjestelmään, jossa päätöksiä pitää tehdä jatkuvasti useiden kuormien välillä.

    Jos käyttäjän pitää päivittäin tarkistaa hinnat, siirtää latauksia, muuttaa lämmitystä ja tarkistaa, mitä muut laitteet tekevät samaan aikaan, järjestelmän kokonaislogiikka on käytännössä ihmisen päässä.

    Hyvän automaation tavoite ei ole tehdä käyttäjästä tarpeetonta. Tavoite on siirtää toistuvat ja yksiselitteiset päätökset järjestelmälle niin, että käyttäjä määrittää tavoitteet, rajat ja poikkeustilanteet.

    Vaatimukset kasvavat ennen kuin laitteet loppuvat kesken

    Hintasignaalit tarkentuvat, tehopohjainen hinnoittelu voi lisätä hetkellisen tehon merkitystä, akkujen määrä kasvaa ja kotitalouksien joustoa voidaan tulevaisuudessa hyödyntää myös laajemmin sähköjärjestelmässä.

    Tämä ei tarkoita, että jokaisen kodin pitäisi rakentaa monimutkainen energiahubi. Se tarkoittaa, että järjestelmän rakenteen pitäisi kestää uusien mittausten, kuormien ja tavoitteiden lisääminen ilman että jokainen uusi ominaisuus vaatii uuden irrallisen automaation.

    Arkkitehtuurin tehtävä on erottaa vastuut

    Kun kotitalouden energianhallinta suunnitellaan kokonaisuutena, kaikkien toimintojen ei tarvitse olla yhdessä ohjelmassa tai yhdessä laitteessa. Arkkitehtuuri tarkoittaa ennen kaikkea vastuiden selkeää jakamista.

    Järjestelmässä pitää pystyä erottamaan ainakin mittaus, tilannekuvan muodostaminen, optimointipäätös, varsinainen laiteohjaus ja turvallisuusrajat. Näillä voi olla eri tekniset toteutukset, mutta niiden vastuiden pitäisi olla ymmärrettäviä.

    Tämä on myös HEOMF:n optimoinnin arkkitehtuuri -sarjan lähtökohta. Tarkoitus ei ole määrätä yhtä oikeaa ohjelmistoa tai laitekokoonpanoa, vaan kuvata rakenne, jonka päälle toimiva energianhallinta voidaan rakentaa.

    Mikä siis pitää suunnitella uudelleen?

    Kyse ei lopulta ole siitä, miten yksittäistä relettä, lämpöpumppua tai latausasemaa ohjataan. Ne ovat toteutuksen osia.

    Varsinainen kysymys on, miten koko talon mittaukset, tavoitteet, rajoitteet ja kuormat muodostavat yhden hallittavan järjestelmän.

    Hyvä energiajärjestelmä ei ole mahdollisimman suuri kokoelma automaatioita. Se on suunniteltu kokonaisuus, jossa jokaisella osalla on selkeä tehtävä ja jossa yksittäisen vian ei pitäisi tehdä koko talon toiminnasta arvaamatonta.

    Seuraavassa osassa

    Osa 2: Kotitalous ei ole enää kuluttaja – vaan energiakeskus tarkentaa, mitä kotitalouden energiajärjestelmä nykyään sisältää ja miksi energia ja teho pitää käsitellä erillisinä suureina.

  • Home Energy Optimization Is Broken — Introducing HEOMF

    HEOMF maturity levels for household energy optimization

    For years, home energy optimization has often been reduced to one idea: move consumption to the cheapest hours.

    Charge the EV at night. Heat water when electricity is cheap. Shift heating away from expensive periods. These are sensible actions, but they solve only one part of the problem.

    A household energy system is not driven by electricity price alone. Power limits, heat-pump efficiency, thermal inertia, solar production, storage, EV charging needs, comfort and external market signals can all affect what the best decision actually is.

    This is the starting point for HEOMF – Home Energy Optimization Maturity Framework: optimization should be treated as a system-design problem, not simply as a search for the cheapest hour.

    Price is only one variable

    Price-based scheduling is attractive because it is easy to understand. If electricity is cheaper at 02:00 than at 18:00, moving a flexible load looks like an obvious improvement.

    But the cheapest hour may also be a poor operating point. Several large loads may overlap and create a power peak. A heat pump may operate at a worse efficiency. Heating may be shifted too aggressively and reduce comfort. Solar production expected a few hours later may make grid charging unnecessary.

    The relevant question is therefore not simply when is electricity cheapest? It is when is the total outcome best after the system’s real constraints are taken into account?

    Optimization can easily become a daily task

    There is another problem with simple price optimization: the work often ends up with the user. Prices are checked, charging is moved, heating settings are adjusted and appliances are scheduled manually.

    Even a few minutes per day becomes a recurring task over a year. More importantly, the household becomes dependent on someone continuously making small operational decisions.

    A mature energy-management system should move in the opposite direction. As the system becomes more capable, routine decisions should require less attention from the user, not more.

    HEOMF is a maturity model, not a product

    HEOMF is not a specific device, software platform or automation technology. It is a framework for describing how household energy management develops from passive use toward coordinated and, eventually, externally connected operation.

    The model has five levels. A higher level does not automatically mean a better household. The right level is the one that produces enough benefit without adding unjustified complexity, cost or risk.

    Level 0 — Passive

    At Level 0, energy use is not actively optimized against price or other external signals. Devices may still have sophisticated internal controls — a heat pump can regulate itself very well — but there is no household-level optimization coordinating when and why different loads operate.

    This is not a failure state. If the household has little flexible consumption or the economic potential is small, Level 0 can be entirely rational.

    Level 1 — Price-aware

    Level 1 begins when electricity price becomes an active decision variable. EV charging, domestic hot water or other flexible loads are shifted to cheaper periods, either manually or with simple schedules.

    This is often the first visible step into demand response. It is simple and can produce immediate savings, but the logic remains largely one-dimensional: price tells the system when to act.

    The weakness appears when several loads react to the same signal. The cheapest hours can become the highest-power hours, and a price-only schedule can ignore efficiency, comfort and technical limits.

    Level 2 — Constraint-aware

    At Level 2, price is still important, but it is no longer allowed to make decisions alone. The system begins to understand its own constraints.

    For heating, that can mean considering heat-pump efficiency, temperature limits and the building’s ability to store heat. For EV charging, it can mean respecting main-fuse or household power limits. Comfort, domestic hot-water needs and device operating limits become part of the decision.

    This is a major change in thinking. The question shifts from where are the cheapest hours? to where can consumption be moved without creating a worse result elsewhere?

    For many households, Level 2 may already be the most sensible endpoint.

    Level 3 — Predictive and multivariable

    Level 3 adds time and prediction to constraint-aware control. Decisions can use price forecasts, weather forecasts, expected solar production, thermal behaviour, EV charging needs and the priorities of several flexible loads.

    The system no longer reacts only to the current state. It can decide to preheat before a colder period, postpone a load because solar production is expected later, or reserve available household power for a more important load.

    This is where optimization becomes a distinct system function. Multiple resources are coordinated rather than controlled independently.

    The benefit is greater coordination, but the engineering requirement also increases. Measurement quality, clear constraints, fallback behaviour and a layered architecture become essential rather than optional.

    Level 4 — Market and system participant

    At Level 4, the household can move beyond optimizing only itself. Flexible loads or storage may respond to external requests, participate through an aggregator or provide capacity to reserve and flexibility markets.

    The defining feature is not ownership of a battery or an EV. A battery used only for self-consumption or price arbitrage can still belong to a lower maturity level. Level 4 begins when external market or system control becomes part of the energy-management logic.

    This also introduces new responsibilities: communication reliability, telemetry, market rules, contractual limits, cybersecurity and a clear boundary between external requests and local safety constraints.

    Market participation is therefore an opportunity, not an automatic goal.

    Architecture becomes more important as maturity increases

    A simple Level 1 schedule can live inside a single device. A Level 3 or Level 4 system cannot remain understandable if measurement, interpretation, decisions and device commands are all mixed into the same automation rules.

    A scalable structure separates measurement, analysis, decision logic, control and safety. The optimizer can then make decisions without directly embedding every device-specific detail, while local safety limits can still override optimization when necessary.

    I explore this structure in more detail in the Optimization Architecture series.

    More data does not automatically mean better optimization

    Modern households can produce large amounts of data: power, energy, temperatures, prices, solar production, state of charge and device status. But data only becomes useful when its quality is understood and it supports a specific decision.

    Higher-resolution measurements can be valuable for power management and short-term behaviour, especially as settlement and market processes increasingly use shorter time intervals. But measurement resolution alone does not make a system mature.

    The important question is whether the system can turn measurements into reliable state information and then make controlled decisions from it.

    The framework is also about knowing when to stop

    Energy technology is developing quickly. Dynamic pricing, solar generation, batteries, EV charging and flexibility services give households more options than before.

    That does not mean every household should use every option. A small household with little flexible electrical load may gain very little from advanced automation. A home with electric heating, an EV, solar production and tight power constraints may benefit much more from coordinated control.

    The purpose of HEOMF is not to push every household toward Level 4. It is to help answer a more useful question: what level of energy-management maturity does this household actually need?

    The goal is not maximum optimization

    The goal is not to chase every price signal, automate every possible device or build the most complex system.

    The goal is to achieve the desired outcome with a system that remains understandable, robust and proportionate to the value it creates.

    In that sense, the best optimization is still the one you do not have to think about every day.

    The HEOMF main page contains the full maturity model, self-assessment and the rest of the series.