Extraindo dados de sensores do MariaDB primário para um secundário - aantonelloborges/codesamples GitHub Wiki

Exporta dados específicos do Home Assistant para um segundo banco MariaDB usando uma abordagem automatizada e filtrada.

Aqui está o guia detalhado:

Objetivo

  • Extrair dados (como consumo de energia) do banco principal (MariaDB 1) do Home Assistant
  • Inserir esses dados no segundo banco MariaDB (MariaDB 2)
  • Realizar isso periodicamente, de forma automatizada, com um script ou integração

Pré-requisitos:

  • Home Assistant com Record primário configurado para MariaDB
  • Dados dos sensores incluídos no Record primário
  • Acesso de administrador no HA
  • Add-On do Terminal ou VS Code instalado
  • Conhecimentos básicos em SQL para conexão com a base de dados (conhecimentos e em Linux e Python são recomendados)

1. No MariaDB de destino, crie uma tabela para armazenar os dados:

Configuração do Banco MariaDB 2 (Destino)

CREATE DATABASE energia_dedicada;

USE energia_dedicada;

CREATE TABLE energy_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    entity_id VARCHAR(255) NOT NULL,
    state FLOAT NOT NULL,
    last_updated DATETIME NOT NULL
);

2. Conecte-se ao MariaDB 1 (principal) para verificar a estrutura dos dados que deseja replicar. Isso pode ser feito com o comando:

USE homeassistant; -- Ou o nome do banco principal
SHOW TABLES;

Normalmente, os sensores estão na tabela states ou statistics.

3. Crie um Script para Exportação de Dados

No terminal, crie uma subpasta na pasta 'config'

Ex.:

mkdir -p /config/scripts

E crie um arquivo para armazenar o seu script

Ex.:

nano /config/scripts/energy_export.py

E adicione o script abaixo nesse arquivo

O script Python abaixo lê os dados do primeiro banco e os insere no segundo banco, filtrando apenas os dados desejados (ex.: consumo de energia).

import mysql.connector
from datetime import datetime
        
# Configurações do MariaDB principal (fonte)
DB_SOURCE_HOST = "IP_DO_MARIADB_PRINCIPAL"
DB_SOURCE_USER = "usuario_fonte"
DB_SOURCE_PASSWORD = "senha_fonte"
DB_SOURCE_NAME = "homeassistant"
        
# Configurações do MariaDB secundário (destino)
DB_DEST_HOST = "IP_DO_MARIADB_DESTINO"
DB_DEST_USER = "usuario_destino"
DB_DEST_PASSWORD = "senha_destino"
DB_DEST_NAME = "energia_dedicada"
        
# ID da entidade que será exportada (ex.: sensor.energy_usage)
# Ajuste o nome da entidade (ENTITY_ID) para o sensor desejado.

ENTITY_ID = "sensor.energy_usage"
         
### ----------------------------------------------------------

# Função para obter os dados do banco fonte
def fetch_energy_data():
    try:
        conn = mysql.connector.connect(
            host=DB_SOURCE_HOST,
            user=DB_SOURCE_USER,
            password=DB_SOURCE_PASSWORD,
            database=DB_SOURCE_NAME
        )
        cursor = conn.cursor(dictionary=True)
        query = """
            SELECT entity_id, state, last_updated
            FROM states
            WHERE entity_id = %s
            ORDER BY last_updated DESC
            LIMIT 1;
        """
        cursor.execute(query, (ENTITY_ID,))
        data = cursor.fetchone()
        return data
    except mysql.connector.Error as err:
        print(f"Erro no banco fonte: {err}")
        return None
    finally:
        if conn.is_connected():
            cursor.close()
            conn.close()

# Função para inserir dados no banco destino
def insert_data_into_dest(data):
    try:
        conn = mysql.connector.connect(
            host=DB_DEST_HOST,
            user=DB_DEST_USER,
            password=DB_DEST_PASSWORD,
            database=DB_DEST_NAME
        )
        cursor = conn.cursor()
        query = """
            INSERT INTO energy_data (entity_id, state, last_updated)
            VALUES (%s, %s, %s);
        """
        cursor.execute(query, (data["entity_id"], float(data["state"]), data["last_updated"]))
        conn.commit()
        print("Dados inseridos no banco destino com sucesso")
    except mysql.connector.Error as err:
        print(f"Erro no banco destino: {err}")
    finally:
        if conn.is_connected():
            cursor.close()
            conn.close()
 
# Fluxo principal
if __name__ == "__main__":
    data = fetch_energy_data()
    if data:
        insert_data_into_dest(data)
    else:
        print("Nenhum dado encontrado para exportação")

4. Crie um agendamento de execução do script

4.1. Opção A: Agendamento do Script via Automação do HA

Primeiro passo é habilitar o Shell Command no configuration.yaml

Adicione uma configuração para o comando que executa o script Python:

shell_command:
   run_energy_script: "python3 /config/scripts/energy_export.py"

Reinicie o HA

Segundo passo é criar a automação no HA

alias: Agendar Exportação de Energia
description: Executa o script Python para exportação de dados
trigger:
  - platform: time
    at: "03:00:00"  # Executa às 03:00 AM
action:
  - service: shell_command.run_energy_script
mode: s

4.2. Opção B: Agendamento do Script via CRON

No terminal do linux (pelo Add-On do Terminal), abra o "Cron"

crontab -e

Adicione a linha para executar o script a cada 5 minutos:

*/5 * * * * /usr/bin/python3 /config/scripts/energy_export.py