Přeskočit na hlavní obsah

Ukládání dat

Ve výchozí instalaci Home Assistanta se provádí veškeré logování historie do souborové databáze SQLite, která je výborná s malým počtem entit a krátkou historií. Správná volba databáze je klíčová pro optimální výkon a správu dat.

Jak můžete vidět níže, dotazy umí SQLite opravdu dobře, ale jakmile dojde k DML operacím -insert,update, a delete - začne být pomalejší.

DB compare

Porovnání výkonu různých databázových operací

Interpretace grafu

Hodnoty v grafu označují počet nanosekund potřebných na jednu operaci. Menší je lepší.

Další vlastností SQLite je, že běží na stejném stroji a disku jako Home Assistant, což může být v závislosti na situaci výhodou i nevýhodou.

Odmazávání historických dat

V případě, že začíná být Home Assistant velmi pomalý a nepotřebujete příliš historii přímo v něm, je užitečný parameter purge_keep_days. Tento parametr umožňuje nastavit počet dní, které se uchovávají v DB. Výchozí hodnota je 10 dní a k odmazávání dat dochází vždy každý den v 4:12 lokálního času.

configuration.yaml
# Použijte jen jedno db_url podle DB do které chcete HA napojit
recorder:
...
purge_keep_days: 14 # pokud chceme zachovat 2 týdny dat

Podporované databáze

  • SQLite ≥ 3.31.0 (2020)
  • MariaDB ≥ 10.3 (2017) a MySQL ≥ 8.0 (2018)
  • PostgreSQL ≥ 12 (2019)

Nastavení připojení dle DB

Knihovna pro připojení k DB

Pro připojení do všech databází používá HA jednotnou knihovnu SQLAlchemy, díky čemuž je konfigurace připojení pro všechny databáze velmi podobná.

configuration.yaml
# Použijte jen jedno db_url podle DB do které chcete HA napojit
recorder:
# SQLite
db_url: sqlite:////cesta/k/db_souboru

# MySQL nebo MariaDB
db_url: mysql://uzivatel:heslo@server/databaze?charset=utf8mb4

# PostgreSQL
db_url: postgresql://uzivatel:heslo@server/databaze

Další nastavení recorderu

Kromě nastavení připojení do databáze můžeme v konfiguračním souboru HA definovat odfiltrování (exclude) entit, které se budou zaznamenávat do DB.

configuration.yaml
recorder:
db_url: !secret postgre_conn
exclude:
# Odstranění celých domén
domains:
- automation
- update
# Odstranění konkrétních entit
entities:
- sun.sun

Instalace databáze

MariaDB

Pokud máte v HA k dispozici doplňky, můžete využít instalaci MariaDB tímto způsobem. V konfiguraci bude potřeba pouze nastavit heslo do databáze, které není ve výchozí instalaci doplněno a doplněk spustit.

Záloha databáze

SQLite

Pokud používáte SQLite, který je standardní součástí a výchozí konfigurací HA, pak je datový soubor součástí zálohy Home Assistanta a stačí pak provést tuto zálohu.

Záloha SQLite

MariaDB/MySQL

Pokud používáte MariaDB jako doplněk HomeAssistanta, což doporučuji, pak nejjednodušším způsobem zálohy MariaDB je záloha celého doplňku.

Záloha doplňku MariaDB

Alternativně můžete použít svého oblíbeného klienta pro MySQL/MariaDB, pokud v sobě obsahuje podporu záloh, nebo si v terminálu doinstalovat utilitu mysqldump.

Instalace mysqldump v Ubuntu/Debian

sudo apt update
sudo apt install mariadb-client
mysqldump --version

Použití mysqldump pro zálohu

mysqldump -h [mariadb_server_ip] -P [port] -u [username] -p[password] [database_name] > [backup_file].sql

Příklad zálohy MariaDB běžící na lokálním stroji:

mysqldump -h 127.0.0.1 -u homeassistant -phomeassistant homeassistant > bck_homeassistant.sql

Migrace mezi databázemi

Můžete se dostat do situace, kdy jste na začátku zvolili jednu databázi (nebo jste prostě nechali výchozí SQLite) a nyní bystě chtěli začít používat jinou. V ideálním případě byste určitě rádi zachovali i všechny data, které už v databázi máte. A to je naštěstí možné.

MariaDB/MySQL -> PostgreSQL

Následuje způsob pro přechod z MariaDB/MySQL na PostgreSQL, ale kroky na všechny ostatní kombinace databází by měly být velmi podobné.

Instalace PostgreSQL

V návodu níže předpokládám, že už máte nainstalovanou a zprovozněnou PostgreSQL databázi.

1. Zastavení ukládání do DB

Prvním krokem který doporučuji je zastavení zaznamenávání do databáze, což můžeme udělat zavoláním služby recorder.disable. Díky tomuto kroku můžeme bez obav stáhnout data z databáze bez nutnosti zastavovat Home Assistant.

2. Konverze dat z MySQL/MariaDB na PostgreSQL

Instalace pgloader v Ubuntu/Debian
sudo apt-get update
sudo apt-get install pgloader
Instalace pgloader na MacOS
brew install pgloader
Konverze dat
  • vytvoříme definiční soubor pro konverzi a uložíme ho jako soubor mysql-to-postgres.load - použijte váš oblíbený editor.

    mysql-to-postgres.load
    LOAD DATABASE
    FROM mysql://homeassistant:[email protected]/homeassistant
    INTO postgresql://homeassistant:[email protected]/homeassistant

    WITH include drop, create tables, create indexes, reset sequences,
    workers = 8, concurrency = 1,
    multiple readers per thread, rows per range = 50000

    SET work_mem to '32 MB', maintenance_work_mem to '64 MB';
  • tento soubor pomocí pgloaderu spustíme:

    pgloader mysql-to-postgres.load
Různá struktura DB

Může se stát, že máte DB vytvořenou ve starší verzi Home Assistanta a obsahuje stále sloupce, které už nejsou potřeba a bude pravděpodobně prázdné. Tyto sloupce pak mohou způsobit problém při migraci a bohužel není možné je jen odstranit, ale změnit typ obvykle na char(1).

Aktuální definici tabulek HA najdete zde.

3. Přehození DB v konfiguraci a zapnutí ukládání

  • v configuration.yaml souboru HA změníme nastavení recorderu, tak jak jsme si ukázali v kapitole výše.
  • zapneme ukládání do DB zavoláním služby recorder.enable