Formation PUB420 : Système domotique DIY, 2020 Home Assistant

6.66 Contenu de la base de données de Home Assistant


Par défaut, Home Assistant utilise une base de données SQLite pour stocker les configurations de même que les données sur les capteurs.

Cette base de données est contenue dans le fichier /mnt/data/supervisor/homeassistant/home-assistant_v2.db.

Remarquez qu'il est possible de configurer Home Assistant pour qu'il utilise un autre système de gestion de bases de données, par exemple MySQL ou PostgreSQL.

Explorer la base de données dans l'interface Web

Pour explorer facilement votre base de données SQLite, vous pouvez installer le module complémentaire SQLite Web.

  • Cliquez sur votre nom dans le bas de la barre latérale de gauche afin d'accéder à votre profil.
  • Activez le Mode avancé.
  • Rendez-vous dans le menu Paramètres / Modules complémentaires.
  • Cliquez sur Boutique des modules complémentaires.
  • Dans la zone de recherche, tapez sqlite.

    Module complémentaire SQLite Web

  • Cliquez sur la tuile SQLite Web pour lancer l'installation.
  • Grâce aux onglets Structure, Content et Query, vous avez la possibilité de voir la structure des tables et leurs données et d'effectuer des requêtes SQL.

    Contenu BD

Explorer la base de données à la ligne de commande

Alors qu'il était auparavant possible d'explorer la base de données directement dans le Terminal HassOS, ceci ne fonctionne plus depuis 2022.

Pour travailler avec votre base de données en ligne de commande, vous devrez d'abord en télécharger une copie sur votre poste de travail.

Je vous propose deux techniques pour y arriver :

  • À partir de la commande scp :
    Terminal de l'ordinateur

    scp -O -P 22222 root@192.168.1.145:/mnt/data/supervisor/homeassistant/home-assistant_v2.db /chemin/local

  • À partir du module complémentaire File Editor : cliquez sur l'enveloppe puis retrouvez le fichier home-assistant_v2.db, directement dans le dossier config. Un clic sur les trois points verticaux vous permettra de télécharger le fichier.

    File Editor

Sur votre poste de travail, assurez-vous que SQLite soit installé.

Dans une fenêtre Terminal, entrez la commande sqlite3 suivie du chemin complet de la base de données (là où vous l'avez téléchargée).

Terminal

sqlite3 chemin/home-assistant_v2.db

Résultat à l'écran

monnom@MacBook-Pro-de-MonNom ~ %sqlite3 /Users/monnom/Downloads/home-assistant_v2.db
SQLite version 3.37.0 2021-12-09 01:34:53
Enter ".help" for usage hints.
sqlite>

Attention : si vous entrez le nom d'une base de données qui n'existe pas, SQLite créera une nouvelle base de données vide.

Structure de la base de données

Pour connaître le nom des tables de cette base de données, entrez cette commande à la ligne de commande :

SQLite

.tables

Résultat à l'écran

sqlite> .tables
event_data        state_attributes      statistics_runs
events            states                statistics_short_term
recorder_runs     statistics
schema_changes    statistics_meta
sqlite>

Si vous n'obtenez aucune table, c'est que vous avez fait une erreur dans le chemin ou le nom de la base de données lors de son ouverture.

Pour connaître la structure des tables :

SQLite

SELECT sql FROM sqlite_master;

Résultat à l'écran

sqlite> SELECT sql FROM sqlite_master;

CREATE TABLE event_data (

            data_id INTEGER NOT NULL,

            hash BIGINT,

            shared_data TEXT,

            PRIMARY KEY (data_id)

)

CREATE INDEX ix_event_data_hash ON event_data (hash)

CREATE TABLE state_attributes (

            attributes_id INTEGER NOT NULL,

            hash BIGINT,

            shared_attrs TEXT,

            PRIMARY KEY (attributes_id)

)

CREATE INDEX ix_state_attributes_hash ON state_attributes (hash)

CREATE TABLE statistics_meta (

            id INTEGER NOT NULL,

            statistic_id VARCHAR(255),

            source VARCHAR(32),

            unit_of_measurement VARCHAR(255),

            has_mean BOOLEAN,

            has_sum BOOLEAN,

            name VARCHAR(255),

            PRIMARY KEY (id)

)

CREATE UNIQUE INDEX ix_statistics_meta_statistic_id ON statistics_meta (statistic_id)

CREATE TABLE recorder_runs (

            run_id INTEGER NOT NULL,

            start DATETIME,

            "end" DATETIME,

            closed_incorrect BOOLEAN,

            created DATETIME,

            PRIMARY KEY (run_id)

)

CREATE INDEX ix_recorder_runs_start_end ON recorder_runs (start, "end")

CREATE TABLE schema_changes (

            change_id INTEGER NOT NULL,

            schema_version INTEGER,

            changed DATETIME,

            PRIMARY KEY (change_id)

)

CREATE TABLE statistics_runs (

            run_id INTEGER NOT NULL,

            start DATETIME,

            PRIMARY KEY (run_id)

)

CREATE INDEX ix_statistics_runs_start ON statistics_runs (start)

CREATE TABLE events (

            event_id INTEGER NOT NULL,

            event_type VARCHAR(64),

            event_data TEXT,

            origin VARCHAR(32),

            origin_idx SMALLINT,

            time_fired DATETIME,

            context_id VARCHAR(36),

            context_user_id VARCHAR(36),

            context_parent_id VARCHAR(36),

            data_id INTEGER,

            PRIMARY KEY (event_id),

            FOREIGN KEY(data_id) REFERENCES event_data (data_id)

)

CREATE INDEX ix_events_event_type_time_fired ON events (event_type, time_fired)

CREATE INDEX ix_events_context_id ON events (context_id)

CREATE INDEX ix_events_data_id ON events (data_id)

CREATE INDEX ix_events_time_fired ON events (time_fired)

CREATE TABLE statistics (

            id INTEGER NOT NULL,

            created DATETIME,

            start DATETIME,

            mean FLOAT,

            min FLOAT,

            max FLOAT,

            last_reset DATETIME,

            state FLOAT,

            sum FLOAT,

            metadata_id INTEGER,

            PRIMARY KEY (id),

            FOREIGN KEY(metadata_id) REFERENCES statistics_meta (id) ON DELETE CASCADE

)

CREATE INDEX ix_statistics_start ON statistics (start)

CREATE INDEX ix_statistics_metadata_id ON statistics (metadata_id)

CREATE UNIQUE INDEX ix_statistics_statistic_id_start ON statistics (metadata_id, start)

CREATE TABLE statistics_short_term (

            id INTEGER NOT NULL,

            created DATETIME,

            start DATETIME,

            mean FLOAT,

            min FLOAT,

            max FLOAT,

            last_reset DATETIME,

            state FLOAT,

            sum FLOAT,

            metadata_id INTEGER,

            PRIMARY KEY (id),

            FOREIGN KEY(metadata_id) REFERENCES statistics_meta (id) ON DELETE CASCADE

)

CREATE INDEX ix_statistics_short_term_start ON statistics_short_term (start)

CREATE UNIQUE INDEX ix_statistics_short_term_statistic_id_start ON statistics_short_term (metadata_id, start)

CREATE INDEX ix_statistics_short_term_metadata_id ON statistics_short_term (metadata_id)

CREATE TABLE states (

            state_id INTEGER NOT NULL,

            entity_id VARCHAR(255),

            state VARCHAR(255),

            attributes TEXT,

            event_id INTEGER,

            last_changed DATETIME,

            last_updated DATETIME,

            old_state_id INTEGER,

            attributes_id INTEGER,

            context_id VARCHAR(36),

            context_user_id VARCHAR(36),

            context_parent_id VARCHAR(36),

            origin_idx SMALLINT,

            PRIMARY KEY (state_id),

            FOREIGN KEY(event_id) REFERENCES events (event_id) ON DELETE CASCADE,

            FOREIGN KEY(old_state_id) REFERENCES states (state_id),

            FOREIGN KEY(attributes_id) REFERENCES state_attributes (attributes_id)

)

CREATE INDEX ix_states_context_id ON states (context_id)

CREATE INDEX ix_states_entity_id_last_updated ON states (entity_id, last_updated)

CREATE INDEX ix_states_last_updated ON states (last_updated)

CREATE INDEX ix_states_attributes_id ON states (attributes_id)

CREATE INDEX ix_states_event_id ON states (event_id)

CREATE INDEX ix_states_old_state_id ON states (old_state_id)

sqlite>

Voici les mêmes informations présentées graphiquement.

Pour produire ce diagramme, j'ai ouvert la base de données dans Valentina Studio.

Schéma BD

Interroger les données

À partir d'ici, il est possible d'afficher le contenu des différentes tables. Mais avant, il est intéressant d'effectuer deux petites configurations pour améliorer le rendu.

SQLite

.mode column
.headers on

Et pour voir le contenu d'une table :

SQLite

sqlite> SELECT * FROM statistics_meta;
id   statistic_id                                   source     unit_of_measurement  has_mean   has_sum
--   --------------------------------------------   --------   -------------------  --------   -------
1    sensor.node_14_battery_level                   recorder   %                    1          0
2    sensor.dome_door_window_sensor_battery_level   recorder   %                    1          0
3    sensor.neo_capteur_5_en_1_illuminance          recorder   Lux                  1          0
4    sensor.porte_dentree_battery_level             recorder   %                    1          0
5    sensor.node_16_humidity                        recorder   %                    1          0
6    sensor.node_16_air_temperature                 recorder   °C                   1          0

Si vous préférez, vous pouvez remplacer .mode column par :

SQLite

.mode box

Cette fois, les données appararaîtront dans un tableau.

SQLite

sqlite> SELECT * FROM statistics_meta;
┌────┬──────────────────────────────────────────────┬──────────┬─────────────────────┬──────────┬─────────┐
│ id │ statistic_id                                 │ source   │ unit_of_measurement │ has_mean │ has_sum │
├────┼──────────────────────────────────────────────┼──────────┼─────────────────────┼──────────┼─────────┤
│ 1  │ sensor.node_14_battery_level                 │ recorder │ %                   │ 1        │ 0       │
│ 2  │ sensor.dome_door_window_sensor_battery_level │ recorder │ %                   │ 1        │ 0       │
│ 3  │ sensor.neo_capteur_5_en_1_illuminance        │ recorder │ Lux                 │ 1        │ 0       │
│ 4  │ sensor.porte_dentree_battery_level           │ recorder │ %                   │ 1        │ 0       │
│ 5  │ sensor.node_16_humidity                      │ recorder │ %                   │ 1        │ 0       │
│ 6  │ sensor.node_16_air_temperature               │ recorder │ °C                  │ 1        │ 0       │
└────┴──────────────────────────────────────────────┴──────────┴─────────────────────┴──────────┴─────────┘

Pour plus d'information

« Database ». Home Assistant. https://www.home-assistant.io/docs/backend/database/

« Data ». Home assistant. https://data.home-assistant.io/docs/data

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre