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

O ficheiro /config/py_scripts/daily_insert_mysql.py é executado todas as vezes que o HA é reiniciado??

Não, é executado apenas quando o valor muda.
O que é executado sempre é o shell_command.python_install_pymysql_dependency

1 Curtiu

Bom dia,

Precisava de uma ajuda , é o seguinte, gostaria que no gráfico a apresenta apenas apresenta-se o ultimo valor disponível do mês e não some-se os dias todos do mês.

Obrigado…

Boas.

Queria passar todas as automações para node-red e o @bbaixo deu-me um grande empurrão, só há uma coisa que me falta para o conseguir fazer como quero:

Queria que o seguinte function node me actauliza-se só a a linha (row) de cada dia , e não acrescenta-se uma linha nova por cada vez que o valor é actualizado, tal como faz o projecto original.

No function node tenho o seguinte:

var geral_euros = Number(msg.payload[0].state)


msg.topic =  "INSERT INTO tbl_custos_energia_mensais (`geral_euros_mes`) " + 
             "VALUES ('" + geral_euros + "')";
return msg;

Obrigado.

dá uma vista de olhos aqui, no meu caso, eu meti chave primária sendo cada dia, então no meu código eu Insiro os valores, mas se o dia for o mesmo vai fazer UPDATE em vez de INSERT

Boas.

Por acaso hoje de manhã fui ao python script e realmente pareceu-me que era mesmo isso, tentei ( um pouco à pressa) adaptar e não consegui. Agora com mais calma e com a confirmação de que é por aí vou voltar a testar.

Viva,

Para complementar o meu post anterior, e se a moderação assim considerar útil, partilho dois gráficos que mostram a mesma informação mas com aspeto diferente:

image

image

Eu prefiro a segunda versão.

Por fim e a título de curiosidade, os dados estão em mariaDB e uso o Node Red para preencher a base de dados e para fazer as consultas que resultam nos gráficos.

3 Curtiram

Isso era um bom tema para criares um tópico complementar a este, em que explicasses como fazer a inserção de dados e as consultas em Node Red. :wink:

1 Curtiu

Sugeria algo diferente, para não cairmos no erro novamente, de ter vários tópico a falar do mesmo.
A sugestão passaria pelo @bbaixo me enviar uma PM com o tutorial, e eu depois edito e coloco aqui. Por baixo do primeiro post inicial editando-o.

1 Curtiu

Só para dar feedback, consegui com o seguinte código no function node:

var bcalor = Number(msg.payload)

msg.topic =  "INSERT INTO consumo_energias (`consumo_energia_dia_bcalor`) " + 
             "VALUES ('" + bcalor + "')" +
             "ON DUPLICATE KEY UPDATE  `consumo_energia_dia_bcalor`=" + bcalor + "";
return msg;

Realmente não tinha também o campo ´date´como primary key e por isso a bd “deixava” acrescentar linhas com a mesma data. Essa parte fiz manualmente na BD com o phpmyadmin.

E porque não usas o meu script em vez de manualmente fazeres isso? Aparentemente o objetivo é o mesmo

Sim o objectivo é o mesmo.

Primeiro gostava de passar isto para node red o máximo possível, depois já andava com erros do shell comand há algum tempo apesar de tudo funcionar, mas na última actualização deixou mesmo de funcionar( fiz roll back e não funcionava na mesma) . E como já tinha algo em node red a funcionar só me faltava mesmo a questão do update, para mim era mais fácil resolver essa situação.

O ideal era ter o teu script no function node, mas não sei como adaptar tudo ( só para este pormenor já foi uma dor de cabeça ) e também teria de adaptar o payload.

Este node parece ser uma boa solução

O problema do meu script no HA é que quando existem erros, eles são muito vagos. Possivelmente existe forma de aparecer os erros detalhadamente mas nunca perdi muito tempo com isso.

Já ando às voltas com uma tomada com medidor de consumo, mas não consigo meter isto a trabalhar corretamente.
Os consumos apresentados não fazem sentido.

Alguém pode dar uma ajuda?

O sensor que mostra o consumo em kwh tem o nome sensor.consumption_13.
O sensor que mostra o consumo em Wh tem o nome sensor.power_14.

base_de_dados.yaml

shell_command:
  daily_insert_mysql: "python3 /config/py_scripts/daily_insert_mysql.py --host=core-mariadb --user=XXX --password=XXXX --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"
    initial_state: true
    trigger:
      - platform: state
        entity_id: sensor.energy
    action:
      - service: shell_command.daily_insert_mysql
        data_template:
          table: consumo_energia
          value: >
            {{ trigger.to_state.state }}
          column: >
            {% if trigger.entity_id == "sensor.energy" %}
              consumo_energia_diario
            {% endif %}


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


sensor:
  - platform: history_stats
    entity_id: sensor.power_14
    state: 'on'
    name: Horas termoacumulador
    start: '{{ now().replace(hour=0, minute=0, second=0) }}'
    end: '{{ now() }}'          


  - platform: sql
    db_url: mysql://XXX:XXXX@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.161818 + 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"  


utility_meter:
  energy:
    source: sensor.power_14
    cycle: monthly

input_select:
  energy_daily_graph_select:
    name: Qual o mês para consulta
    options:
      - Últimos 30 dias
      - Janeiro
      - Fevereiro
      - Março
      - Abril
      - Maio
      - Junho
      - Julho
      - Agosto
      - Setembro
      - Outubro
      - Novembro
      - Dezembro

No Card Configuration tenho o seguinte:

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

Boas, não me parece que o problema esteja na apresentação do gráfico nem o registo na tabela, o problema deve estar no teu sensor.
Estás a usar o sensor Wh no utility_meter, deverias estar a usar o Kwh, com Wh claro que tens valores muito altos…
E o sensor tem de ser incremental, fazendo reset ao final do dia, verifica se é assim, ou se durante o dia varia para baixo e para cima.

Bom dia,

Para além desta alteração recomendas mais alguma?

utility_meter:
  energy:
    source: sensor.consumption_13
    cycle: monthly

Se o sensor estiver incremental fazendo reset ao final do dia está bom, verificaste?

O sensor de kWh não está a fazer reset.
Continuo com 0.13kWh.

Para registar os consumos de vários equipamentos, tens uma tabela por cada equipamento com esta lógica ou tens uma tabela para tudo, em que cada equipamento é uma coluna?

Estava a pensar registar vários consumos (geral + alguns equipamentos específicos) mas queria saber a melhor maneira para fazer isto. Obrigado

Acabei de ver como fazer isto no teu github. Basta 1 tabela :slightly_smiling_face:

O entity_id: sensor.energy_daily_fridge indica o valor atual que o frigorífico está a consumir ao dia?


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


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