Tópico de desatualizado verificar novo tópico
Antes de mais, fica aqui o link para o Github. Tem a explicação em inglês e o ficheiro que precisam.
Para que este guia funcione terão que fazer download do zip conforme mostro na imagem abaixo.
Após feito o download terão que colocar o ficheiro daily_insert_mysql.py
dentro da pasta python_scripts que deverá dentro dentro da pasta
config
PS: A pasta python_scripts
é apenas uma sugestão, podem meter noutra mas depois nos códigos abaixo, têm de atualizar o destino.
Introdução
Nas últimas semanas, eu @ricreis394 , o @RodolfoVieira e o @ricain temos vindo a debater formas de poder guardar dados diários de longo tempo e que ocupassem quase nada no sistema.
Inicialmente foi proposto um método por ficheiro em json publicado neste tópico:
Gráfico Diário consumo de Electricidade
Porém, tinha algumas desvantagens que era a utilização para o Grafana. Com json não havia maneira de importar os dados para o Grafana. Então surgiu a ideia de passar para o MariaDB.
E acredito ser uma solução melhor face ao json.
O que faz mesmo?
É um simples script escrito em python, que regista o valor pretendido, guardando também o dia atual. Ao correr o script mais vezes, o valor anterior será escrito por cima, até ser um dia diferente, ou seja, depois da meia-noite.
A tabela é criada automaticamente ao correr o script, se ela não existir.
Como valor, só é aceite valores em float
Exemplo de como fica a tabela:
date | value |
---|---|
2020-04-06 | 15.5 |
2020-04-07 | 16 |
2020-04-08 | 14.8 |
2020-04-09 | 11.2 |
2020-04-10 | 15.4 |
Ou seja, 365 linhas nem 500KB ocupa
Ok, sei o que faz, mas onde posso aplicá-lo?
Vou deixar aqui algumas:
Publicar valores diários dos gastos do dia de eletricidade.
Publicar a média do dia da temperatura/humidade da casa, ou de uma certa divisão.
Publicar se a regou ou não por dia .
Por enquanto só aceita valores do tipo *float*, por isso neste caso podem usar 0.0 ou 1.0, sendo *False* ou *True*
etc…
Sejam criativos
Utilização
python3 daily_insert_mysql.py --host=db_host(ip or hostname) --user=your_user --password=your_password --db=your_db --table=your_table --value your_value
exemplo em código
Configuração do MariaDB
É necessário a instalação do addon Maria DB
Têm de criar a base de dados, isto só precisam de fazer uma vez. Outras tabelas que possam querer criar mais tarde podem fazê-lo na mesma base de dados
No addon do MariaDB, acrescentem este código.
Não retirem o que lá está, é só acrescentar
databases:
- custom_data
logins:
- username: custom_data_user
host: '%'
password: teste
rights:
- username: custom_data_user
host: '%'
database: custom_data
grant: ALL PRIVILEGES ON
No user e password metam o que quiserem.
Como inserir valores na tabela:
O primeiro shell_command
é para instalar a dependência necessária para o python e o segundo é o script para inserir os valores
shell_command:
python_install_pymysql_dependency: "pip install pymysql"
energy_daily_insert: "python3 /config/python_scripts/daily_insert_mysql.py --host=core-mariadb --user=custom_data_user --password=teste --db=custom_data --table=energy_kwh --value {{ states.sensor.energy_daily_kwh.state }}"
A primeira automation
é para instalar a dependencia se necessitar, a segunda é para inserir o valor cada vez que o estado altera.
Podem fazer o trigger do que quiserem, se preferirem podem só fazer o trigger ao final do dia.
No exemplo abaixo a automação faz com que seja publicado na base de dados o consumo energético do dia, e sempre que esse valor se for alterando publica na base de dados automaticamente.
automation:
- alias: "Energy install python pymysql dependency at startup"
initial_state: true
trigger:
- platform: homeassistant
event: start
action:
- service: shell_command.python_install_pymysql_dependency
- alias: "Energy daily update total kw"
initial_state: true
trigger:
- platform: state
entity_id: sensor.energy_daily_kwh
action:
- service: shell_command.energy_daily_insert
Apresentação dos valores criados na base de dados
Neste passo, existem várias formas e depende do efeito que queiram, se for para usar no Home Assistant usem a integração oficial SQL
Exemplo:
sensor:
- platform: sql
db_url: mysql://user:password@localhost/custom_data
queries:
- name: Sql value
query: "SELECT `value` FROM energy_kwh WHERE `date` = '2020-04-10';"
column: 'value'
unit_of_measurement: 'kWh'
Como este script foi a pensar mais no grafana, nesse caso, isto não será preciso. No grafana podem configurar a base de dados MySQL diretamente
Exemplo do grafana:
Se pretendem usar isto para grafana, podem ver este tutorial, que é uma continuação deste tópico:
EDIT 12-04-2020:
Acabei de fazer uma implementação no script. Agora aceita várias colunas, se quiserem. É totalmente opcional.
Usa o paramentro --col
Exemplo: python3 daily_insert_mysql.py --host=core-mariadb --user=data_energy --password=teste --db=custom_data --table=energy_kwh --value 3.4 --col fridge
Se a coluna não existir, ele cria sem stress.
ATENÇÃO PARA OS QUE USARAM O SCRIPT ANTES DESTA ALTERAÇÃO
Têm que fazer uma alteração na tabela, ou então se preferirem eliminem a tabela e o script cria-a de novo.
A coluna value
tem de permitir o valor NULL
e o valor por defeito tem de ser NULL
Podem usar o HeidiSQL se preferirem para fazer a alteração
EDIT 01-05-2020:
Pro tip
Aconselho vivamente a usarem o script desta forma abaixo. Assim conseguem manter apenas um shell_command que vai servir para qualquer valor que queiram adicionar. E na Automação podem até ter vários triggers e depois fazer a análise para qual coluna ele vai.
automation:
- alias: "Energy daily insert values to database"
initial_state: true
trigger:
- platform: state
entity_id: sensor.energy_daily_simples
- platform: state
entity_id: sensor.energy_daily_fridge
- platform: state
entity_id: sensor.energy_daily_dishwasher
- platform: state
entity_id: sensor.energy_daily_drying_machine
- platform: state
entity_id: sensor.energy_daily_washing_machine
- platform: state
entity_id: sensor.energy_daily_hot_water_tank
action:
- service: shell_command.daily_insert_mysql
data_template:
table: energy_kwh
value: >
{{ trigger.to_state.state }}
column: >
{% if trigger.entity_id == "sensor.energy_daily_simples" %}
total
{% elif trigger.entity_id == "sensor.energy_daily_fridge" %}
fridge
{% elif trigger.entity_id == "sensor.energy_daily_dishwasher" %}
dishwasher
{% elif trigger.entity_id == "sensor.energy_daily_drying_machine" %}
drying_machine
{% elif trigger.entity_id == "sensor.energy_daily_washing_machine" %}
washing_machine
{% elif trigger.entity_id == "sensor.energy_daily_hot_water_tank" %}
hot_water_tank
{% endif %}
shell_command:
daily_insert_mysql: "python3 /config/python_scripts/daily_insert_mysql.py --host=core-mariadb --user=custom_data_user --password=teste --db=custom_data --table={{ table }} --value={{ value }} {{ '--col='+column if column is defined }}"