
Vanha Home Assistant oli pyörinyt vuosia Raspberry Pi:llä. Uusi Home Assistant toimii nyt osana EnergyHubia Lenovo Tinyssä Docker-kontissa, jossa Node-RED ja muut komponentit hoitavat varsinaisen energiaoptimoinnin. Kun rakensin uuden järjestelmän valmiiksi, edessä oli kysymys, joka on tutumpi kuin haluaisin myöntää: mitä tehdä vanhalle koneelle, jossa pyöri vielä kourallinen toimivia automaatioita?
Helppo vastaus olisi ollut palauttaa vanhan HA:n varmuuskopio uudelle palvelimelle ja jatkaa siitä. Home Assistant tukee varmuuskopion palauttamista myös migraatiossa, ja tavallisessa siirrossa se voi olla aivan oikea tapa. Tässä tapauksessa sitä en kuitenkaan halunnut tehdä, koska vanha järjestelmä sisälsi myös ohjauksia ja teknistä velkaa, joita uuteen ei haluttu tuoda. Sen sijaan kävin vanhan konfiguraation läpi toiminto kerrallaan ja siirsin vain sen, mikä oli yhä tarpeen. Vanhaa Home Assistantia käytettiin lähteenä ja dokumentaationa, ei uuden järjestelmän mallina. Home Assistantin virallinen varmuuskopio- ja palautusohje kuvaa varsinaisen backup-migraation.
Tässä artikkelissa kerron, miksi tällainen valikoiva migraatio oli tässä järjestelmässä järkevä, mitä tämäntyyppisessä siirrossa pitää huomioida ja mikä oli oma prosessini pääpiirteittäin. Lopuksi kerron, mitä vanhalle Raspberry Pi:lle tapahtuu — se ei jää eläkkeelle vaan saa uuden ja mielenkiintoisen tehtävän.
Miksi vanhaa ei tässä tapauksessa kannattanut kloonata
Vanha HA sisälsi kolmenlaista tavaraa sekaisin: yhä hyödyllisiä laiteintegraatioita, EnergyHubin jo korvaamia vanhoja ohjauksia sekä observability-toimintoja, jotka kannattaa rakentaa uudelleen nykyisen arkkitehtuurin päälle. Nämä kolme luokkaa vaativat kolme eri kohtelua, eikä varmuuskopion palautus osaa erottaa niitä.
Tärkein syy olla kloonaamatta on kuitenkin ohjausvastuu. Uusi EnergyHub sisältää jo omat, kovaksi ajetut ohjauspolut sähköautolle, lämpöpumpulle, käyttövedelle ja invertterin tehonrajoitukselle. Jos vanha ohjauslogiikka tuotaisiin rinnalle, syntyisi kaksi kirjoittajaa samaan laitteeseen. Pahimmillaan tämä rikkoisi koko vastuunjakomallin, jossa jokaisella laitteella on täsmälleen yksi taho, joka päättää sen tilan. Kilpailevat ohjauspolut ovat sellainen vikaluokka, jota ei haluta rakentaa vahingossa sisään migraation nimissä.
Toinen syy on tekninen velka. Vuosien aikana vanhaan HA:han oli kertynyt päällekkäisiä automaatioita, samoilla tai lähes samoilla ID:illä olevia toimintoja, useita versioita samoista template-sensoreista, irrallisia Python-scriptejä ja include-tiedostoja, joita ei välttämättä enää käytetty. Koko /config-hakemiston kopioiminen olisi tuonut kaiken tämän mukanaan uuteen, puhtaaseen järjestelmään.
Mitä siirrettiin: laiteintegraatiot
Ensimmäinen luokka on helpoin: laitteet, jotka toimivat edelleen ja joita uusi järjestelmä ei korvaa. Näitä oli käytännössä kaksi.
Rappukäytävän WLED-valo kolmella Zigbee-painikkeella siirrettiin omaksi packageksi. Kaikilla kolmella painikkeella oli vanhassa järjestelmässä sama toiminta, joten niitä ei tarvinnut erotella fyysisen sijainnin mukaan: lyhyt painallus antaa kirkkaamman valon hetkeksi, pitkä ja kaksoispainallus ajavat valoefektit, ja päivä- ja yötila säätävät kirkkauden kellonajan mukaan. Pakettipohjainen Home Assistant -rakenne on kuvattu tarkemmin ohjeessa HA:n valmistelu integraatiokerrokseksi.
Toinen WLED-laite on EnergyHubin fyysinen tilapaneeli — 22-segmenttinen palkki, joka näyttää lämpöpumpun, sähköauton, aurinkotuotannon, sähkön hinnan, talon kulutuksen, verkon tuonnin ja viennin sekä kiukaan ja saunan tilan yhdellä silmäyksellä. Olennaista oli, että uudessa toteutuksessa paneeli lukee mahdollisimman pitkälle EnergyHubin canonical-signaaleja eikä ylläpidä omaa rinnakkaista mittauslogiikkaansa. Kun samat tiedot ovat jo olemassa järjestelmän omina totuuslähteinä, paneelin ei pidä laskea niitä uudestaan omalla tavallaan.
Konkreettinen löytö: WLED:n master ja segmentti 0
Paras esimerkki siitä, miksi vanhaa logiikkaa ei pidä siirtää sokkona, tuli tilapaneelin kanssa.
Home Assistantin WLED-integraatiossa entiteettien nimet eivät kertoneet niiden todellista merkitystä. Laitteella oli erikseen master-entiteetti ja segmentti 0, mutta nimistä sitä ei suoraan nähnyt. Aluksi tulkitsin segmentti 0:aa masteriksi. Seurauksena automaatio sytytti jatkuvasti segmentti 0:n, mikä näkyi paneelissa ylimääräisinä valkoisina LED-valoina.
Merkitys varmistui vasta entiteettien unique_id-tunnisteista, joissa saman laitteen master ja segmentit erottuvat toisistaan tunnisteen loppuosan perusteella. Kun mapping korjattiin — master toimii masterina, segmentti 0 pidetään pois päältä ja segmentit 1–22 muodostavat varsinaisen näytön — paneeli alkoi toimia oikein.
Tämä on koko migraation ydinopetus tiivistettynä yhteen bugiin: HA:n näyttämä nimi ei aina yksin kerro entiteetin todellista merkitystä, ja toiminnallinen testaus oli tärkeämpää kuin se, että YAML meni config-checkistä läpi. Konfiguraatio oli koko ajan validia. Se vain ohjasi väärää asiaa.
Mitä ei siirretty: EnergyHubin jo korvaamat ohjaukset
Toinen luokka on vanhat ohjaukset, jotka uusi järjestelmä tekee jo paremmin. Nämä jätettiin tietoisesti siirtämättä.
Vanhassa HA:ssa oli runsaasti sähköauton logiikkaa: aurinkolatausta, halpojen tuntien latausta, yölatausta, releohjausta, pääsulakesuojaa, watchdogeja ja manuaaliohituksia. Uusi EnergyHub sisältää jo nämä omina, testattuina kerroksinaan. Sama koskee lämpöpumpun vanhaa hintasääntöpohjaista comfort wheel -optimointia, käyttöveden aurinko- ja hintaperusteista boostia sekä invertterin oman tehonrajoituslogiikan. Kaikissa näissä pätee sama periaate: vanhan automaation kopiointi loisi toisen kirjoittajan samaan laitteeseen, ja yksinkertaisen vanhan säännön palauttaminen kehittyneemmän tilalle olisi askel taaksepäin.
Tähän luokkaan kuuluvat myös viihde- ja kokeilutoiminnot — mediasoitinohjaukset, juhlapyhäautomaatiot ja erilaiset valoefektit, joita ei enää käytetä. Jos niitä joskus tarvitaan, ne rakennetaan puhtaasti uuden HA:n nykyisillä integraatioilla. Tavoitteena ei ole säilyttää historiallista konfiguraatiota vain siksi, että se on joskus tehty.
Mitä rakennetaan uudelleen: observability
Kolmas luokka on kiinnostavin. Vanhassa HA:ssa oli hyödyllisiä seuranta- ja diagnostiikkatoimintoja, joita ei kannata kopioida sellaisenaan mutta jotka kannattaa rakentaa uudelleen nykyisen datan päälle. Näiden yhteinen piirre on, että ne ovat read-only: ne eivät ohjaa mitään, joten ne eivät voi joutua ristiriitaan EnergyHubin ohjauspolkujen kanssa.
Kärkiaihe on aurinkotuotannon rahallinen hyöty. Vanha HA laski jo yksinkertaista eurolaskentaa — paljonko tuotettiin, paljonko vietiin verkkoon, paljonko käytettiin itse ja mikä oli hinta kulloinkin. Uudessa EnergyHubissa on parempi mittausdata, InfluxDB ja varttihinnoittelu, joten sama asia kannattaa rakentaa kunnolliseksi aikajaksokohtaiseksi historiatoiminnoksi eikä kääntää vanhaa versiota.
Muut uudelleenrakennettavat ovat lämpöpumpun huolto- ja diagnostiikkatietoja: legionella-ajojen historia, kompressorin ja lisälämmittimen käyttötunnit, lämmitys- ja liuospiirin ΔT:t sekä demand- ja prioriteettidiagnostiikka. Näistä tulee oma read-only maintenance/diagnostics-kerros. Sungrown MPPT- ja DC-diagnostiikka voidaan rakentaa kevyesti template-sensoreina, koska raakadata on jo olemassa eikä uusia Modbus-lukuja tarvita.
Tässä luokassa piili myös hyödyllinen varoitus. Vanha ”COP”-sensori oli nimetty harhaanjohtavasti — se laski todellisuudessa kahden lämpötilaeron suhdetta, ei lämpöpumpun hyötysuhdetta lainkaan. Juuri tällaista sensoria ei pidä siirtää nimen perusteella. Jos COP-laskenta rakennetaan, sen on perustuttava tuotettuun lämpötehoon suhteessa todelliseen sähkötehoon. Vanhan järjestelmän läpikäynti on siis myös tilaisuus korjata vanhat virheet sen sijaan, että ne monistettaisiin eteenpäin.
Mitä tämäntyyppisessä siirrossa pitää huomioida
Kokemuksesta tiivistettynä muutama asia toistuu jokaisessa vastaavassa migraatiossa.
Siirrä toiminto kerrallaan, älä koko konfiguraatiota. Jokainen siirretty toiminto on oma pieni, testattava ja palautettava kokonaisuutensa. LED-migraatio esimerkiksi vietiin Gitiin omana rajattuna committinaan, joka sisälsi vain kaksi package-tiedostoa. Muut samaan aikaan keskeneräiset EnergyHub-muutokset jätettiin koskematta. Näin jokaisen muutoksen vaikutus on erikseen todennettavissa ja tarvittaessa peruttavissa.
Testaa fyysisesti, älä vain konfiguraation validoinnilla. Config-check ei löydä väärää entiteettimappausta. Segmentti 0 -bugi paljastui vasta katsomalla, mitä paneeli oikeasti näytti. Toiminnallinen testi migraation jälkeen on ainoa tapa varmistua, että siirretty toiminto tekee sitä mitä pitääkin.
Sammuta vanha järjestelmä testin ajaksi. Vanha Raspberry Pi -HA sammutettiin kokonaan, jotta se ei voinut enää kirjoittaa samoihin WLED-laitteisiin. Tämä oli olennaista: kahden Home Assistantin rinnakkainen ohjaus olisi tehnyt vikojen lähteen tunnistamisesta hyvin vaikeaa. Kun vanha HA oli poissa, uusi oli ainoa ohjaaja ja segmentti 0:n ongelma voitiin jäljittää yksiselitteisesti uuden järjestelmän automaatioon. Sama periaate koskee mitä tahansa laitetta, jota kaksi järjestelmää voisi ohjata yhtä aikaa.
Käsittele vanha konfiguraatio arkistona, joka voi sisältää salaisuuksia. Vanhojen konfiguraatiotiedostojen seassa on tyypillisesti tunnistetietoja selväkielisenä — vanhoja API-avaimia, käyttäjätunnuksia ja tokeneita jääneistä integraatioista. Näitä ei pidä koskaan siirtää uuteen järjestelmään eikä julkaista blogin liitteenä tai Git-repositorioon. Vanha vientipaketti kannattaa säilyttää salaisuuksia sisältävänä arkistona ja kohdella sitä sen mukaisesti.
Erottele ohjaus ja seuranta. Se, mikä ohjaa laitetta, on siirrossa vaarallista, koska se voi joutua ristiriitaan uuden järjestelmän kanssa. Se, mikä vain lukee ja näyttää, on turvallista. Kun toiminnot lajitellaan tämän mukaan, iso osa päätöksistä tekee itsensä: ohjaukset korvataan tai jätetään, seuranta rakennetaan uudelleen.
Vanha Raspberry Pi saa uuden tehtävän
Alkuperäinen syy koko urakkaan oli, että vanhassa HA:ssa oli enää vähän toimintoja käytössä — ja sen Raspberry Pi haluttiin vapauttaa uuteen käyttöön. Kun tarpeelliset toiminnot on siirretty ja loput jätetty tietoisesti taakse, kone vapautuu tehtävään, johon se sopii itse asiassa erinomaisesti: ulkopuoliseksi järjestelmävahdiksi.
Ajatus on yksinkertainen ja se korjaa yhden EnergyHubin rakenteellisen heikkouden. Tällä hetkellä järjestelmän oma valvontakerros — watchdogit, System Health -näkymä ja muut terveystarkastukset — pyörii samalla Lenovo Tinyllä kuin valvottava järjestelmä itse. Jos kone, sen verkko tai Docker-ympäristö kaatuu, myös valvonta kaatuu sen mukana. Silloin hiljaisuus voi tarkoittaa joko sitä, että kaikki on kunnossa, tai sitä, ettei kukaan ole enää kertomassa ettei ole. Sisäinen valvonta ei voi luotettavasti valvoa omaa alustaansa.
Erillinen Raspberry Pi ratkaisee tämän, koska se on riippumaton solmu. Se voidaan rakentaa tarkkailemaan EnergyHub-palvelinta ulkopuolelta: vastaako se, päivittyvätkö sen julkaisemat signaalit, pyörivätkö valvottavat palvelut ja onko sen kellonaika kunnossa. Koska vahti on erillisellä raudalla, erillisellä virransyötöllä ja mahdollisesti erillisellä verkkoyhteydellä, se pystyy hälyttämään juuri siinä tilanteessa, jossa itse pääjärjestelmä on pudonnut kokonaan pois — eli juuri silloin kun hälytystä eniten tarvitaan.
Tämä on myös hyvä esimerkki siitä, ettei ”eläkkeelle jäävä” laite ole automaattisesti hyödytön. Raspberry Pi:tä ei enää ollut järkevää käyttää koko EnergyHubin alustana, mutta juuri sen keveys ja erillisyys tekevät siitä hyvän riippumattoman vahdin. Ulkopuolisen järjestelmävahdin rakentaminen on oma projektinsa, ja palaan siihen myöhemmin omassa artikkelissaan.
Yhteenveto
Home Assistant -migraatio ei ollut varmuuskopion palautus vaan järjestelmän arkeologinen tutkimus. Vanhasta HA:sta erotettiin kolme asiaa: edelleen hyödylliset laiteintegraatiot, jotka siirrettiin; EnergyHubin jo korvaamat vanhat ohjaukset, jotka jätettiin tietoisesti taakse; ja observability-toiminnot, jotka kannattaa rakentaa uudelleen nykyisen arkkitehtuurin päälle.
Tähän mennessä valmiina ovat rappukäytävän WLED-kokonaisuus painikkeineen ja EnergyHubin 22-segmenttinen tilapaneeli. Migraatio vietiin Gitiin rajattuna muutoksena, ja vanha HA voidaan pitää sammutettuna näiden toimintojen osalta. Jatkokehitykseen jäivät lämpöpumpun huolto- ja diagnostiikkakerros, aurinkotuotannon €-hyödyn uudelleentoteutus Influx-pohjaisesti, Sungrown MPPT-diagnostiikka ja talokuorman suodatetut UI-signaalit. Niiden toteutus kuuluu sarjan myöhempiin vaiheisiin eikä tämän migraation onnistumisen ehdoksi.
Isoin oppi on kuitenkin metodinen. Vanha järjestelmä kannattaa kohdata tutkittavana kohteena, ei mallina, jota jäljitellään. Silloin migraatiosta tulee tilaisuus siivota, korjata ja ymmärtää — ei vain tapa raahata vuosien tekninen velka mukanaan uuteen ympäristöön.
Seuraavassa osassa siirryn yksittäisten toimintojen migraatiosta koko alustan kestävyyteen. Uusi palvelin hoitaa nyt ohjauksen ja valvonnan, mutta se pyörii itse verkkosähkön varassa — ja seuraava osa kertoo, mitä tapahtui kun kytkin sen UPS:n taakse. Matkalla selviää, ettei UPS ole pelkkä akku vaan ohjattava laite, johon ei kannata luottaa sokeasti, ja miksi en vielä antanut sen sammuttaa palvelinta automaattisesti.



















