Langtidslagring af data fra Home Assistant

Hvis man har fulgt min guide til at opsætte måling af strøm fra elmåleren, og man derefter har fået dataen ind i Home Assistant, så vil man desværre opleve, at dataen forsvinder efter noget tid. Dette skyldes at Home Assistant automatisk sletter gammel data, såsom historikken for dine sensorer, alle events fra dine Zigbee enheder og så videre.

For at undgå dette sker, har jeg valgt at opsætte Home Assistants Recorder, så jeg selv opbevarer dataen sikkert i en database, som jeg selv kan vælge at slette indhold i, når den fylder for meget.

Disclaimer: Hvis du følger denne guide og får opsat Recorder manuelt, så forsvinder hele din historik. Du kan godt flytte eksisterende historik over i din egen database, men find selv ud af hvordan det gøres.

Valg af database

Recorder understøtter pr. 9. november 2021 MariaDB, MySQL, PostgreSQL og SQLite. Hvis du ikke har rørt ved Recorder før, så bruger Home Assistant allerede en SQLite database, som ligger i roden af mappen (samme hvor configuration.yaml er) under navnet home-assistant_v2.db. SQLite er rigtig fin, da den kan det meste en database nu skal, men folk har klaget over at databasen bliver ødelagt, at det smadrer SD kort i deres Raspberry Pi osv.

Jeg har valgt at gå med MariaDB, men I kan selv bestemme om I vil bruge én af de andre. Som jeg har skrevet i andre opslag før, kører jeg unRAID som operativsystem til min server. Det gør opsætning af Docker containers virkelig nemt, for jeg får et rigtig fint interface til det. Det image jeg har valgt at bruge hedder lscr.io/linuxserver/mariadb. Du skal give den et par options, før det virker:

MYSQL_ROOT_PASSWORD="langt&og&sikker&adgangskode"
MYSQL_DATABASE="homeassistant"
MYSQL_USER="morten"
MYSQL_PASSWORD="tilfældig&adgangskode"
REMOTE_SQL="http://URL1/your.sql,https://URL2/your.sql"
  • MYSQL_ROOT_PASSWORD: Dette er adgangskoden til at tilgå databasen, hvis du nu skulle ødelægge ét eller andet
  • MYSQL_DATABASE: Navnet på databasen. Jeg har valgt at kalde min homeassistant
  • MYSQL_USER: Navnet på brugeren du vil logge ind med
  • MYSQL_PASSWORD: Adgangskoden til brugeren
  • REMOTE_SQL: Ikke nødvendigt, så den kan bare være en tom streng

Alt afhængig af hvordan din opsætning ser ud, skal du ende med at have en Docker container kørende med MariaDB installeret.

Opsætning i Home Assistant

Opsætningen i Home Assistant er nok det meste enkle af det hele, for du skal blot ændre i 2 filer og så kører det.

configuration.yaml:

recorder:
    db_url: !secret mariadb_url
    commit_interval: 30
    auto_purge: false

secrets.yaml:

mariadb_url: "mysql://BRUGERNAVN:ADGANGSKODE@192.168.1.56:3306/homeassistant?charset=utf8"

Sæt dine egne værdier fra tidligere ind i din mariadb_url streng, og husk at rette IP adressen til, så den matcher den maskine MariaDB kører på.

Nu har du opsat Recorder således, at den gemmer al historikken i hukommelsen (RAM), men hvert 30. sekund bliver det smidt i databasen. Det er nemlig meget “billigere” at gemme ting i RAM, og så gemme det bagefter, både fordi det er hurtigere, men også fordi det ikke slider på din SSD/harddisk/SD kort som databasen bliver gemt på.

Hvis du så hopper ind i Home Assistant -> Configuration -> Server Controls og tjekker om din configuration.yaml fil er korrekt, kan du derefter genstarte Home Assistant. Du burde nu se, at alle dine sensorer mangler historik, hvilket er et godt tegn. Efter et par sekunder, burde den nye data begynde at poppe frem, hvilket bekræfter at du nu har gemt historikken via Recorder i din egen database.

Automatisk sletning af data

Som vi satte Recorder op før, gemte vi ALT dataen i databasen, og så satte vi også Recorder til aldrig at slette dataen. Det vil på sigt resultere i, at databasen fylder hele din disk op. Det har jeg prøvet at fikse med et SQL script, som du blot kan køre mod din MariaDB Docker container:

SET foreign_key_checks = 0;

DELETE FROM states WHERE
	`entity_id` != 'sensor.kamstrup_power' AND 
	`entity_id` != 'sensor.energy' AND 
	`entity_id` != 'sensor.energy_spent' AND 
	`created` <= NOW() - INTERVAL 7 DAY;

DELETE FROM events WHERE
    `created` <= NOW() - INTERVAL 7 DAY;

SET foreign_key_checks = 1;

For at gøre det hele lavpraktisk, kommer der her en forklaring:

  1. Først slår vi foreign_key_checks fra, så vi ikke får fejl, når vi sletter dataen (det er ret teknisk, så bare stol på mig)
  2. Så sletter vi alle states ud fra disse kriterier:
    1. Entity ID må ikke være sensor.kamstrup_power
    2. Entity ID må ikke være sensor.energy
    3. Entity ID må ikke være sensor.energy_spent
    4. Oprettelsesdatoen skal være over en uge siden
  3. Så sletter vi alle events der er over en uge gammel
  4. Så slår vi foreign_key_checks til igen

Dette opbevarer alle states for de 3 sensorer jeg skrev, og sletter al data der er en uge gammel. Jeg vil jo nemlig gerne opbevare mine energimålinger, så jeg kan gå flere måneder tilbage og se hvad mit forbrug var. Du kan tilføje flere, fjerne dem og rette dem til, lige som det passer dig. Det kan jo sagtens være, du vil gemme meget mere data end mig.

SQL scriptet bliver kørt hver uge via et cron job fra min unRAID server, som ser sådan her ud:

echo 'mysql --user=BRUGERNAVN --password=ADGANGSKODE --database=homeassistant < /config/purge.sql' | docker exec -i mariadb bash

Jeg har lagt mit SQL script ind i en fil der hedder purge.sql, som jeg har gemt i samme mappe som MariaDB, så man inde fra Docker containeren kan tilgå filen. Hvordan din opsætning ser ud, kan jeg ikke vide, så brug blot mit som inspiration.

2 svar til “Langtidslagring af data fra Home Assistant”

  1. Pelle Ravn Avatar
    Pelle Ravn

    Du skal muligvis nok lige sætte et volume på den MariaDB, for skulle du få lyst til at opgradere eller lave ændringer i dit image, så sletter den din container og din data.

    1. Morten Avatar

      Hej Pelle. Der er et volume på MariaDB containeren, hvis man kigger på deres docker-compose. I unRAID er /config i hvert fald mappet til min egen mappe, og jeg har bekræftet at der bliver taget backup af den. Men ja, god idé, for hvis man dræber containeren, så kan ens data forsvinde.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *