Como criar uma base de dados leve no HA com histórico e apresentação gráfica

Sim, já tinha reparado nos teus posts anteriores.
Já agora, como estás a separar os sensores? Shellys EM, usando pinça em disjuntores especificos e separados, ou (outro devices) directamente ligados à L & N dos aparelhos?

Oh, talvez até apenas smart plugs - com registo de consumo?

A minha ideia era ver da placa vitrocerâmica e forno, mas com o consumo de um e outro excedendo os 2500W - só a placa pode chegar aos 6.500W…
Talvez acabe por configurar o quadro e aumente o nº de disjuntores. Espaço ainda há.

Viva,

Consumo geral: Shelly 3EM
Consumo iluminação: Shelly 1PM e Shelly 2.5
Consumo maqs da cozinha: Shelly 1PM
Systemas IT: Shelly Smart Plug S

Para forno e placa a melhor opção é optar por um Shelly EM com duas pinças

1 Curtiu

Realmente, os Shelly começam a ser como os Raspberries.
Nunca é demais ter mais uns quantos.

Hmmm, devo estar a fazer algo mal:

automation:
  - alias: "Bi-horário EDP-semanal"
    initial_state: true
    trigger:
      - platform: homeassistant
        event: start
    action:
      - service: shell_command.python_install_pymysql_dependency
      
  - alias: "Registar o consumo diário bi-horário"
    initial_state: true
    trigger:
      - platform: state
        entity_id: 
             - sensor.daily_energy_shelly_peak_offpeak_offpeak
             - sensor.daily_energy_shelly_peak_offpeak_peak
    action:
      - service: shell_command.daily_insert_mysql
        data_template:
          table: consumobi_energia
          value: >
            {{ trigger.to_state.state }}
          column: >
            {% if trigger.entity_id == "sensor.daily_energy_shelly_peak_offpeak_offpeak" %}
              consumobi_energia_diario_offpeak
            {% endif %}
            {% if trigger.entity_id == "sensor.daily_energy_shelly_peak_offpeak_peak" %}
              consumobi_energia_diario_peak
            {% endif %}
                        
            
sensor:
  - platform: sql
    db_url: mysql://XXX:XXX.@core-mariadb/custom_data
    queries:
      - name: consumobi_electricidade_offpeak
        query: >-
          SELECT
              CONCAT(
                  '[',
                  GROUP_CONCAT(DAY(date) SEPARATOR ','),
                  ']'
              ) AS labels,
              CONCAT(
                  '[',
                  GROUP_CONCAT(consumobi_energia_diario_offpeak SEPARATOR ','),
                  ']'
              ) AS data,
              CONCAT(
                  '["',
                  GROUP_CONCAT(IF(`consumobi_energia_diario_offpeak` >= 10, 'red', IF(`consumobi_energia_diario_offpeak` >= 6, 'orange', 'green')) SEPARATOR '","'),
                  '"]'
              ) AS colors,
              ROUND(SUM(consumobi_energia_diario_offpeak), 2) AS total,
              FORMAT(round(((sum(consumo_energia_diario_offpeak) * 0.0923)*1.23), 2), 2) AS 'total_eur',
              'info in attributes' AS value
          FROM consumobi_energia
          WHERE MONTH(date) = MONTH(CURRENT_DATE);
        column: "value_offpeak"
      - name: consumobi_electricidade_peak
        query: >-
          SELECT
              CONCAT(
                  '[',
                  GROUP_CONCAT(DAY(date) SEPARATOR ','),
                  ']'
              ) AS labels,
              CONCAT(
                  '[',
                  GROUP_CONCAT(consumobi_energia_diario_peak SEPARATOR ','),
                  ']'
              ) AS data,
              CONCAT(
                  '["',
                  GROUP_CONCAT(IF(`consumobi_energia_diario_peak` >= 10, 'red', IF(`consumobi_energia_diario_peak` >= 6, 'orange', 'green')) SEPARATOR '","'),
                  '"]'
              ) AS colors,
              ROUND(SUM(consumobi_energia_diario_peak), 2) AS total,
              FORMAT(round(((sum(consumo_energia_diario_peak) * 0.1833)*1.23), 2), 2) AS 'total_eur',
              'info in attributes' AS value
          FROM consumobi_energia
          WHERE MONTH(date) = MONTH(CURRENT_DATE);
        column: "value_peak"

Como ainda só há registo do “offpeak”, dadas as horas, no HeidiSQL, experimentei o chartjs:

chart: bar
custom_options:
  showLegend: false
data:
  datasets:
    - backgroundColor: '${states["sensor.consumobi_electricidade_offpeak"].attributes.colors}'
      borderWidth: 1
      data: '${states["sensor.consumobi_electricidade_offpeak"].attributes.data}'
      label: Eletricidade
  labels: '${states["sensor.consumobi_electricidade_offpeak"].attributes.labels}'
entity_row: false
options:
  scales:
    yAxes:
      - ticks:
          beginAtZero: true
  title:
    display: true
    text: >
      ${"Consumo energético Mês Corrente -> " +
      states["sensor.consumobi_electricidade_offpeak"].attributes.total_eur + "€"}
type: 'custom:chartjs-card'

Mas o gráfico aparece, no eixo X, desconfigurado, e sem valores apresentados.
No HeidiSQL, o offpeak está a 0,65.

Assim é complicado de perceber, mostra os dados obtidos pelo Sensor SQL, e um printscreen do gráfico.

Base de dados:

Graph:

Mas o problema está, sem dúvida, nos sensores:

Verifica se a query funciona bem

Tentei adaptar isto ao meu tarifário bihorário mas não consigo colocar a funcionar. Também não percebo muito bem o código.

Já consigo recolher bem os dados:

Mas só obtenho este resultado:

Partilho o meu base_dados.yaml:

shell_command:
  daily_insert_mysql: "python3 /config/py_scripts/daily_insert_mysql.py --host=core-mariadb --user=... --password=... --db=custom_data --table={{ table }} --value={{ value }} {{ '--col='+column if column is defined }}"
  python_install_pymysql_dependency: "pip install pymysql"

automation:

  - alias: "Instala a dependencia no arranque do ha"
    initial_state: true
    trigger:
      - platform: homeassistant
        event: start
    action:
      - service: shell_command.python_install_pymysql_dependency

  - alias: "Registar o consumo diário de energia no vazio"
    initial_state: true
    trigger:
      - platform: state
        entity_id: sensor.daily_energy_vazio
    action:
      - service: shell_command.daily_insert_mysql
        data_template:
          table: consumo_energia
          value: >
            {{ trigger.to_state.state }}
          column: >
            {% if trigger.entity_id == "sensor.daily_energy_vazio" %}
              consumo_energia_diario_vazio
            {% endif %}
            
  - alias: "Registar o consumo diário de energia fora do vazio"
    initial_state: true
    trigger:
      - platform: state
        entity_id: sensor.daily_energy_fora_de_vazio
    action:
      - service: shell_command.daily_insert_mysql
        data_template:
          table: consumo_energia
          value: >
            {{ trigger.to_state.state }}
          column: >
            {% if trigger.entity_id == "sensor.daily_energy_fora_de_vazio" %}
              consumo_energia_diario_fora_do_vazio
            {% endif %}
            
  - alias: "Insere na tabela o número de Horas que a bomba de calor esta ligada"
    initial_state: true
    trigger:
      - platform: state
        entity_id: sensor.horas_bomba_calor
    condition:
      - condition: template
        value_template: >
          {{ (trigger.to_state.state | float) != 0.0 }}
    action:
      - service: shell_command.daily_insert_mysql
        data_template:
          table: horas_bomba_calor
          value: >
            {{ trigger.to_state.state }}
          column: bombacalor
          
sensor:
  - platform: history_stats
    entity_id: automation.bomba_de_calor_desligada
    state: 'on'
    name: Horas Bomba Calor
    start: '{{ now().replace(hour=0, minute=0, second=0) }}'
    end: '{{ now() }}'
  - platform: sql
    db_url: mysql://...:...@core-mariadb/custom_data
    queries:
      - name: consumo_electricidade
        query: >-
          SELECT
              CONCAT(
                  '[',
                  GROUP_CONCAT(DAY(date) SEPARATOR ','),
                  ']'
              ) AS labels,
              CONCAT(
                  '[',
                  GROUP_CONCAT(consumo_energia_diario SEPARATOR ','),
                  ']'
              ) AS data,
              CONCAT(
                  '["',
                  GROUP_CONCAT(IF(`consumo_energia_diario` >= 10, 'red', IF(`consumo_energia_diario` >= 5, 'orange', 'green')) SEPARATOR '","'),
                  '"]'
              ) AS colors,
              ROUND(SUM(consumo_energia_diario), 2) AS total,
              FORMAT(round(((sum(consumo_energia_diario) * 0.15184 + 0.1183 + 0.041 + 0.107)*1.23), 2), 2) AS 'total_eur',
              'info in attributes' AS value
          FROM consumo_energia
          WHERE MONTH(date) = MONTH(CURRENT_DATE);
        column: "value"

Também queria criar um gráfico em que visualizo o número de horas que a minha bomba de calor está ligada. Já consigo recolher os dados. O meu problema está em criar um gráfico com os dados:

Se me conseguirem ajudar, agradeço. A mim parece-me que me está a faltar conhecimentos na parte do código da criação de gráficos ou da consulta de dados na tabela. Se houver um bom tutorial que eu possa ler, agradeço também uma sugestão.

Viva @djm ,

Um nota, que me salta à vista.

Os teus campos de registo em mariaDB possuem estes nomes:

image

E na tua query o nome não está correto:

image

Tens q fazer corresponder os nomes dos campos das tabelas no código da query.

Experimenta isto:

        query: >-
          SELECT
              CONCAT(
                  '[',
                  GROUP_CONCAT(DAY(date) SEPARATOR ','),
                  ']'
              ) AS labels,
              CONCAT(
                  '[',
                  GROUP_CONCAT(consumo_energia_diario_vazio SEPARATOR ','),
                  ']'
              ) AS data,
              CONCAT(
                  '["',
                  GROUP_CONCAT(IF(`consumo_energia_diario_vazio` >= 10, 'red', IF(`consumo_energia_diario_vazio` >= 5, 'orange', 'green')) SEPARATOR '","'),
                  '"]'
              ) AS colors,
              ROUND(SUM(consumo_energia_diario_vazio), 2) AS total,
              FORMAT(round(((sum(consumo_energia_diario_vazio) * 0.15184 + 0.1183 + 0.041 + 0.107)*1.23), 2), 2) AS 'total_eur',
              'info in attributes' AS value
          FROM consumo_energia
          WHERE MONTH(date) = MONTH(CURRENT_DATE);
        column: "value"
2 Curtiram

Olá, Boa noite.
Eu também tenho a mesma duvida sobre o gráfico da horas que algum dispositivo está ligado!
Já configurei a base de dados e funciona tudo bem quer no consumo elétrico, quer no tempo que a caldeira está ligada, mas o valor gravado é por exemplo 1.18, como se traduz isso em horas e minutos?
2021-03-24

Aqui o package completo

### controle de consumos ###
shell_command:
  daily_insert_mysql: "python3 /config/py_scripts/daily_insert_mysql.py --host=core-mariadb --user=user --password=password --db=consumos --table={{ table }} --value={{ value }} {{ '--col='+column if column is defined }}"
  python_install_pymysql_dependency: "pip install pymysql"

#### Sensores #####

sensor:
  - platform: history_stats
    entity_id: switch.sonoff_caldeira
    state: 'on'
    name: horas Caldeira
    start: '{{ now().replace(hour=0, minute=0, second=0) }}'
    end: '{{ now() }}'

  - platform: sql
    db_url: mysql://user:password@core-mariadb/consumos
    queries:
      - name: consumo_electricidade
        query: >-
          SELECT
              CONCAT(
                  '[',
                  GROUP_CONCAT(DAY(date) SEPARATOR ','),
                  ']'
              ) AS labels,
              CONCAT(
                  '[',
                  GROUP_CONCAT(consumo_energia_diario SEPARATOR ','),
                  ']'
              ) AS data,
              CONCAT(
                  '["',
                  GROUP_CONCAT(IF(`consumo_energia_diario` >= 10, 'red', IF(`consumo_energia_diario` >= 5, 'orange', 'green')) SEPARATOR '","'),
                  '"]'
              ) AS colors,
              ROUND(SUM(consumo_energia_diario), 2) AS total,
              FORMAT(round(((sum(consumo_energia_diario) * 0.15184 + 0.1183 + 0.041 + 0.107)*1.23), 2), 2) AS 'total_eur',
              'info in attributes' AS value
          FROM consumo_energia
          WHERE MONTH(date) = MONTH(CURRENT_DATE);
        column: "value"

  - platform: sql
    db_url: mysql://user:password@core-mariadb/consumos
    queries:
      - name: tempo_caldeira
        query: >-
          SELECT
              CONCAT(
                  '[',
                  GROUP_CONCAT(DAY(date) SEPARATOR ','),
                  ']'
              ) AS labels,
              CONCAT(
                  '[',
                  GROUP_CONCAT(caldeira SEPARATOR ','),
                  ']'
              ) AS data,
              CONCAT(
                  '["',
                  GROUP_CONCAT(IF(`caldeira` >= 10, 'red', IF(`caldeira` >= 5, 'orange', 'green')) SEPARATOR '","'),
                  '"]'
              ) AS colors,
              ROUND(SUM(caldeira), 2) AS total,
#              FORMAT(round(((sum(caldeira) * 0.15184 + 0.1183 + 0.041 + 0.107)*1.23), 2), 2) AS 'total_eur',
              'info in attributes' AS value
          FROM horas_caldeira
          WHERE MONTH(date) = MONTH(CURRENT_DATE);
        column: "value"


##### automações #####
automation:

  - alias: "Instala a dependencia no arranque do ha"
    initial_state: true
    trigger:
      - platform: homeassistant
        event: start
    action:
      - service: shell_command.python_install_pymysql_dependency

  - alias: "Registar o consumo diário de energia"
    initial_state: true
    trigger:
      - platform: state
        entity_id: sensor.energy_today
    action:
      - service: shell_command.daily_insert_mysql
        data_template:
          table: consumo_energia
          value: >
            {{ trigger.to_state.state }}
          column: >
            {% if trigger.entity_id == "sensor.energy_today" %}
              consumo_energia_diario
            {% endif %}

  - alias: "Insere na tabela o número de Horas que a caldeira esta ligada"
    initial_state: true
    trigger:
      - platform: state
        entity_id: sensor.horas_caldeira
    condition:
      - condition: template
        value_template: >
          {{ (trigger.to_state.state | float) != 0.0 }}
    action:
      - service: shell_command.daily_insert_mysql
        data_template:
          table: horas_caldeira
          value: >
            {{ trigger.to_state.state }}
          column: caldeira

Obrigado por alguma dica

Bom dia Rodolfo,

No Node-Red, depois de alterar os dados a amarelo, tenho este Debug:

É um erro e falhei alguma configuração ou é mesmo assim?

Porque no Card, no dropdown de “Ultimos 30 Dias” está impecável, mas se selecionar efetivamente o mês corrente, aparece:

Cheira-me que o problema ou está na configuração do Node-Red, ou na gravação dos dados para a mariaDB, apesar de me parecer que na base de dados está a gravar bem o valor:

Obrigado!!
Tiago Matias

Para ver o mês corrente, é por Últimos 30 dias, ao selecionar o mês corrente (Março), vai mostrar o mês de março do ano passado.
Isso foi implementado dessa forma porque se tiveres no inicio do mês, tipo dia 5, selecionar o mês corrente vai aparecer apenas 5 barras, para evitar isso, achei que fazia mais sentido ter o Últimos 30 dias, que mostra o gráfico mais preenchido

E não há maneira de mostrar sempre os últimos 12 meses? Assim ficava o gráfico sempre totalmente preenchido.

Ahhh! Entendido!!

Então aquele Debug do Node-Red é mesmo assim, certo?

Obrigado!! :ok_hand:

@75TiagoMatias relativamente ao “erro” no debug do nodered também me acontece, não sei se o @ricreis394 poderá dar algum input em relação a isso.

Sim , existe uma outra query que já foi publicada algures que mostra o gráfico dos últimos 12 meses

@75TiagoMatias Qual é o erro? O debug que mostras é só o resultado da query, que à primeira vista está correto

@ricreis394 mas porque é que aparece isso no debug? não deveria aparecer nada.

A minha pergunta é a seguinte:
https://www.heidisql.com/
Este programa tem que ser instalado num pc na rede que esteja sempre ligado correto?
Eu tenho o meu HÁ instalado num NAS…
Esta aplicação serve apenas para verificar se tudo está a correr bem se tens os valores a chegar ou precisas para mais alguma coisa.
Posso instalar tudo sem esta aplicação?

Olá, não o pc não tem que estar sempre ligado.
O heidisql é apenas um programa que neste caso serve para veres se a tabela está a ser criada.
Podes instalar tudo sim, mas seria bom teres algum programa, para veres se está a ser criada a base.


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade