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

Caro @RodolfoVieira antes de mais parabéns pelo tutorial! Já há algum tempo que estava para perguntar por uma coisa destas.

É possível arranjar forma de guardar ou exportar os dados para Excel ?

Sim, creio que sim. Se não me engano o HeidiSQL permite fazeres essa exportação

Viva,

E pq não fazer uma ligação do Excel via ODBC à Base de dados?

É assim que eu tenho a ligação.

1 Curtiu

Boas Malta.

Queria apresentar num gráfico o consumo anual por meses mas está apresentar por dia.
Guardo na BD por dia, não dá para agrupar por meses. Não é o que esta função GROUP_CONCAT(MONTH(date) SEPARATOR ‘,’), faz ?

chart: bar
custom_options:
  showLegend: false
data:
  datasets:
    - backgroundColor: '${states["sensor.consumo_mes_tomadasala"].attributes.colors}'
      borderWidth: 1
      data: '${states["sensor.consumo_mes_tomadasala"].attributes.data}'
      label: Sala
    - backgroundColor: '${states["sensor.consumo_mes_frigorifico"].attributes.colors}'
      borderWidth: 1
      data: '${states["sensor.consumo_mes_frigorifico"].attributes.data}'
      label: Frigorifico
    - backgroundColor: '${states["sensor.consumo_mes_desumidificador"].attributes.colors}'
      borderWidth: 1
      data: '${states["sensor.consumo_mes_desumidificador"].attributes.data}'
      label: Desumidificador
    - backgroundColor: '${states["sensor.consumo_mes_cilindro"].attributes.colors}'
      borderWidth: 1
      data: '${states["sensor.consumo_mes_cilindro"].attributes.data}'
      label: Cilindro
  labels: '${states["sensor.consumo_mes_cilindro"].attributes.labels}'
entity_row: false
options:
  scales:
    yAxes:
      - ticks:
          beginAtZero: true
  title:
    display: true
    text: >
      ${ "Consumo energético Ano Corrente -> " +
      (parseFloat(states["sensor.consumo_mes_tomadasala"].attributes.total_eur)
      +
      parseFloat(states["sensor.consumo_mes_frigorifico"].attributes.total_eur)
      +
      parseFloat(states["sensor.consumo_mes_desumidificador"].attributes.total_eur)
      + parseFloat(states["sensor.consumo_mes_cilindro"].attributes.total_eur))
      + "€"}
type: 'custom:chartjs-card'
- name: consumo_mes_tomadasala
        query: >-
          SELECT
              CONCAT(
                  '[',
                  GROUP_CONCAT(MONTH(date) SEPARATOR ','),
                  ']'
              ) AS labels,
              CONCAT(
                  '[',
                  GROUP_CONCAT(energia_mes_sala SEPARATOR ','),
                  ']'
              ) AS data,
              CONCAT(
                  '["',
                  GROUP_CONCAT(IF(`energia_mes_sala` >= 10, 'red', IF(`energia_mes_sala` >= 5, 'orange', 'green')) SEPARATOR '","'),
                  '"]'
              ) AS colors,
              ROUND(SUM(energia_mes_sala), 2) AS total,
              FORMAT(round(((sum(energia_mes_sala) * 0.1281)*1.23), 2), 2) AS 'total_eur',
              'info in attributes' AS value
          FROM consumo_mes
          WHERE MONTH(date) = MONTH(CURRENT_DATE);
        column: "value"
      - name: consumo_mes_frigorifico
        query: >-
          SELECT
              CONCAT(
                  '[',
                  GROUP_CONCAT(MONTH(date) SEPARATOR ','),
                  ']'
              ) AS labels,
              CONCAT(
                  '[',
                  GROUP_CONCAT(energia_mes_aquecedorsuite SEPARATOR ','),
                  ']'
              ) AS data,
              CONCAT(
                  '["',
                  GROUP_CONCAT(IF(`energia_mes_aquecedorsuite` >= 10, 'red', IF(`energia_mes_aquecedorsuite` >= 5, 'orange', 'blue')) SEPARATOR '","'),
                  '"]'
              ) AS colors,
              ROUND(SUM(energia_mes_aquecedorsuite), 2) AS total,
              FORMAT(round(((sum(energia_mes_aquecedorsuite) * 0.1281)*1.23), 2), 2) AS 'total_eur',
              'info in attributes' AS value
          FROM consumo_mes
          WHERE MONTH(date) = MONTH(CURRENT_DATE);
        column: "value"
      - name: consumo_mes_desumidificador
        query: >-
          SELECT
              CONCAT(
                  '[',
                  GROUP_CONCAT(MONTH(date) SEPARATOR ','),
                  ']'
              ) AS labels,
              CONCAT(
                  '[',
                  GROUP_CONCAT(energia_mes_desumidificador SEPARATOR ','),
                  ']'
              ) AS data,
              CONCAT(
                  '["',
                  GROUP_CONCAT(IF(`energia_mes_desumidificador` >= 10, 'red', IF(`energia_mes_desumidificador` >= 5, 'orange', 'red')) SEPARATOR '","'),
                  '"]'
              ) AS colors,
              ROUND(SUM(energia_mes_desumidificador), 2) AS total,
              FORMAT(round(((sum(energia_mes_desumidificador) * 0.1281)*1.23), 2), 2) AS 'total_eur',
              'info in attributes' AS value
          FROM consumo_mes
          WHERE MONTH(date) = MONTH(CURRENT_DATE);
        column: "value"
      - name: consumo_mes_cilindro
        query: >-
          SELECT
              CONCAT(
                  '[',
                  GROUP_CONCAT(MONTH(date) SEPARATOR ','),
                  ']'
              ) AS labels,
              CONCAT(
                  '[',
                  GROUP_CONCAT(energia_mes_cilindro SEPARATOR ','),
                  ']'
              ) AS data,
              CONCAT(
                  '["',
                  GROUP_CONCAT(IF(`energia_mes_cilindro` >= 10, 'red', IF(`energia_mes_cilindro` >= 5, 'orange', 'yellow')) SEPARATOR '","'),
                  '"]'
              ) AS colors,
              ROUND(SUM(energia_mes_cilindro), 2) AS total,
              FORMAT(round(((sum(energia_mes_cilindro) * 0.1281)*1.23), 2), 2) AS 'total_eur',
              'info in attributes' AS value
          FROM consumo_mes
          WHERE MONTH(date) = MONTH(CURRENT_DATE);
        column: "value"

O que essa função faz é mostrar o nome dos meses. Isso é possível fazer, eu tenho a query mas não tou no PC agora. Depois envio

Boa Tarde @ricreis394 quando poderes disponibilizar a query. Agradeço. Obrigado

Estou ausente do PC, só para a semana é que vou poder enviar

Sem problema. Obrigado

Aqui está a apresentação por meses:

Screenshot_3

sensor:
  - platform: sql
    db_url: !secret db_url_custom_data
    queries:
      - name: energy_last_12_months
        column: "attributes"
        query: >-
          SELECT
             CONCAT('[', GROUP_CONCAT(`month` ORDER BY `order` SEPARATOR ','), ']') AS labels,
             CONCAT('[', GROUP_CONCAT(`total` ORDER BY `order` SEPARATOR ','), ']') AS data,
             'info in attributes' AS 'attributes'
           FROM
           (
          	SELECT
          	  ROUND(SUM(`total`), 2) AS 'total',
          	  CONCAT('"',MONTHNAME(date), ' ', YEAR(date),'"') AS 'month',
          	  DATE(`date`) AS 'order'
          	FROM `energy_kwh`
          	GROUP BY MONTH(`date`), YEAR(`date`)
          	ORDER BY `date` DESC
          	LIMIT 12
          ) AS `something`;
type: 'custom:chartjs-card'
chart: bar
entity_row: true
data:
  datasets:
    - backgroundColor: var(--accent-color)
      borderWidth: 1
      data: '${states["sensor.energy_last_12_months"].attributes.data}'
      label: Eletricidade
  labels: '${states["sensor.energy_last_12_months"].attributes.labels}'
options:
  scales:
    yAxes:
      - ticks:
          beginAtZero: true
  title:
    display: true
    text: "${'Consumo energético (últimos 12 meses) \U0001F4B0 ' + states['sensor.energy_invoice'].state.replace('.', ',') + '€'}"
custom_options:
  showLegend: false
1 Curtiu

Obrigado pelo excelente tutoria!

Fiz conforme ele, mas está gerando a seguinte mensagem no log:

2020-08-28 16:48:43 ERROR (MainThread) [homeassistant.components.shell_command] Error running command: python3 /config/py_scripts/daily_insert_mysql.py --host=core-mariadb --user=custom_data --password=senha --db=custom_data --table={{ table }} --value={{ value }} {{ ‘–col=’+column if column is defined }}, return code: 1

Infelizmente o erro retornado pelo script não é apresentado nos logs do HA. Por isso, a única forma para poderes ver o erro é entrar no container do HA e executar o script manualmente a ver no que dá.
Segue o que tens de fazer (assumindo uma instalação por docker e não HassOS):

  • Entrar na máquina do HA via SSH
  • fazer sudo docker exec -it homeassistant bash <- vais entrar dentro do container do HA
  • Correr o script que está em cima, mas renderizado (ou seja, sem o template jinja2)

Ricardo,

Obrigado pelas orientações. O problema é na senha, que está incorreta!

1 Curtiu

Eu gostaria de entender quais são os valores informados para o cálculo do valor a ser pago:

FORMAT(round(((sum(consumo_energia_diario) * 0.15184 + 0.1183 + 0.041 + 0.107)*1.23), 2), 2)

Gostaria de alterar para refletir como pagamos no Brasil.

0.15184 - custo por cada kWh
0.1183 - uma taxa diária fixa existente em Portugal
0.041 - mais outra taxa fixa
0.107 - outra taxa fixa
1.23 - IVA (todos os custos anteriores ainda são somados do respetivo IVA - imposto)

1 Curtiu

Deves ter o cálculo explicado na fatura

1 Curtiu

Muito obrigado pelo retorno!

@lopitos, é possível eu incluir uma variável para substituir um dos valores no SQL acima?

Por exemplo:

FORMAT(round(((sum(consumo_energia_diario) * 0.15184 + 0.1183 + 0.041 + 0.107) * CONCAT('float(states.input_text.valor_kwh.state)'), 2), 2)

Ou seria melhor armazenar o valor dessa variável na mesma tabela?

Infelizmente não é possível usar templates em Sql query, o componente foi desenhado assim numa perspectiva de segurança.
Podes sim armazenar o valor na base de dados

1 Curtiu

Bom dia,

Obrigado pela partilha… no entanto teitei criar isto no meu HA e nao obtive resultados … será que poderias dar uma breve explicação do codigo colocado…

Não tens de crear nenhuma automação para que este codigo consigo funcionar?

Obrigado pela ajuda…

Boa tarde, como se abre a porta?


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


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