Tema
Este projecto visa obter o consumo de água e gás das nossas casas, bem como o custo associado ao mesmo.
Resumo
Surge da vontade de ter todos os consumos da casa integrados no HA, onde o gás e a água estavam em falta. Há utilizadores que já terão implementado algo para o mesmo efeito mas através da troca de ideias e ajuda de membros da comunidade foi-me proposto apresentar esta solução que se diferencia pela sua simplicidade a nível de requisitos de hardware, acessível à maioria dos utilizadores e ao mesmo tempo desconhecida por grande parte deles, onde o esforço se assenta na integração com o HA, que será o grande foco.
Descrição
Se chegarem ao final deste extenso tutorial, o resultado será este:
Para a implementação deste projecto foi utilizado o seguinte:
- HA ;
- Rede Zigbee com alcance até aos contadores;
- Grafana para elaboração de gráficos;
- E para a contagem… “meio” sensor de porta xiaomi! (por contador)
E como é que um sensor de porta vai fazer a leitura dos consumos?
Grande parte dos contadores de água e gás que temos instalados nas nossas residências são magnéticos e como tal contabilizam os impulsos através de ímanes. Um sensor de porta da xiaomi não é nada mais que um reed switch (peça grande) que é activado por meio de um íman (peça pequena).
Vamos então encostar a peça grande do sensor ao contador e deixar este actuar como íman em vez da peça pequena. Se o estado deste se alterar então terão condições para prosseguir!
Este foi o tipo de contador de gás testado neste projecto, que tem um espaço livre onde se pode encaixar o sensor para que este seja accionado pelo íman. Para que caiba dentro da caixinha será necessário retirar o sensor da carcaça e limar um pouco da placa sem que seja danificada a antena (zona assinalada na imagem).
Desta forma já cabe no interior da caixa, sendo possível fechá-lo com uma simples tampa feita numa impressora 3D ou então fazê-la à mão (o meu caso ).
Basta retirar o sensor da carcaça (caso se pretenda fechar a tampa completamente) e posicioná-lo junto à peça vermelha. Tem folga para também colocar uma tampa mas ainda não a fiz.
A componente física está concluída, vamos então passar à parte lógica. O processo base é semelhante tanto para a água como para o gás, com ligeiras adaptações.
Nota: A integração dos sensores zigbee não é coberta neste tutorial, é assumido que nesta fase já estarão disponíveis no HA.
1 - ÁGUA
1.1 - CRIAR UM CONTADOR DE MODO A CONTABILIZAR AS VEZES QUE O SENSOR “ABRE E FECHA”
Adicionar ao configuration.yaml:
counter:
contador_impulsos_agua:
initial: 0
step: 1
Adicionar ao automations.yaml:
- alias: Contador de impulsos da água
description: ''
trigger:
- platform: state
entity_id: binary_sensor.contador_agua
to: 'off'
from: 'on'
condition: []
action:
- service: counter.increment
data: {}
entity_id: counter.contador_impulsos_agua
mode: single
Neste caso o sensor “abre e fecha” duas vezes para subir um algarismo (equivalente a 1 litro). Para facilitar as contas vamos assumir que um impulso equivale a 1 litro de água e, como tal, vamos criar um novo sensor, dividindo o valor obtido no primeiro por 2.
Adicionar ao configuration.yaml:
- platform: template
sensors:
contador_impulsos_agua_reais:
friendly_name: Contador de impuslsos de água reais
value_template: >-
{{ 'unknown' if states('counter.contador_impulsos_agua') == 'unknown' else ((states('counter.contador_impulsos_agua')|int / 2)|round(0, "floor")) }}
1.2 - CRIAR SENSORES PARA OS IMPULSOS
Adicionar ao configuration.yaml:
utility_meter:
contador_impulsos_agua_day:
source: sensor.contador_impulsos_agua_reais
cycle: daily
contador_impulsos_agua_month:
source: sensor.contador_impulsos_agua_reais
cycle: monthly
contador_impulsos_agua_year:
source: sensor.contador_impulsos_agua_reais
cycle: yearly
1.3 - CRIAR SENSORES PARA OS CONSUMOS
Adicionar ao configuration.yaml:
- platform: template
sensors:
water_consumption_m3_day:
unit_of_measurement: 'm3'
value_template: >-
{% set impulse_unit = 0.001 %}
{% set impulse_count = states('sensor.contador_impulsos_agua_day') %}
{{ 'unknown' if impulse_count == 'unknown' else (impulse_count|int * impulse_unit|float) | round(3) }}
water_consumption_m3_month:
unit_of_measurement: 'm3'
value_template: >-
{% set impulse_unit = 0.001 %}
{% set impulse_count = states('sensor.contador_impulsos_agua_month') %}
{{ 'unknown' if impulse_count == 'unknown' else (impulse_count|int * impulse_unit|float) | round(3) }}
water_consumption_m3_year:
unit_of_measurement: 'm3'
value_template: >-
{% set impulse_unit = 0.001 %}
{% set impulse_count = states('sensor.contador_impulsos_agua_year') %}
{{ 'unknown' if impulse_count == 'unknown' else (impulse_count|int * impulse_unit|float) | round(3) }}
1.4 - CRIAR SENSORES PARA OS CUSTOS
Esta é a parte mais chata pois requer interpretar a factura. O exemplo que se segue tem como base os valores da SIMAR Loures/Odivelas para o ano corrente. Foram adicionados comentários de forma a ser mais fácil adaptar para outras companhias.
1.4.1 - DIÁRIO
Adicionar ao configuration.yaml:
- platform: template
sensors:
water_cost_day:
unit_of_measurement: '€'
value_template: >-
{# Variáveis #}
{% set days = 1 %} {# Apenas indicativo para melhor compreensão das taxas #}
{% set m3_count_day = states('sensor.water_consumption_m3_day')|float %} {# Total do consumo diário em m3 #}
{% set m3_count_month = states('sensor.water_consumption_m3_month')|float %} {# Total consumo mensal em m3 #}
{% set vat6 = 0.06 %} {# IVA #}
{% set tariff_fix = 0.1064 %} {# Preço diário d Tarifa Fixa #}
{% set m3_unit_var1 = 0.5366 %} {# Preço do m3 no escalão 1 #}
{% set m3_unit_var2 = 1.2534 %} {# Preço do m3 no escalão 2 #}
{% set m3_unit_var3 = 1.7731 %} {# Preço do m3 no escalão 3 #}
{% set m3_unit_var4 = 3.3634 %} {# Preço do m3 no escalão 4 #}
{% set tar_unit_var1 = 0.4829 %} {# Taxa Águas Residuais Variável no escalão 1 #}
{% set tar_unit_var2 = 1.1281 %} {# Taxa Águas Residuais Variável no escalão 2 #}
{% set tar_unit_var3 = 1.5986 %} {# Taxa Águas Residuais Variável no escalão 3 #}
{% set tar_unit_var4 = 3.0271 %} {# Taxa Águas Residuais Variável no escalão 4 #}
{% set consumption_fix = (days * tariff_fix)|round(2) %} {# Tarifa Fixa #}
{% set tar_fix = (days * 0.0653)|round(2) %} {# Taxa Águas Residuais Fixa #}
{% set trs_fix = (days * 0.0841)|round(2) %} {# Taxa Resíduos Sólidos Fixa #}
{% set trs_var = (m3_count_day * 0.3996)|round(2) %} {# Taxa Resíduos Sólidos Variável - Escalão único #}
{% set trha_fix = (m3_count_day * 0.0445)|round(2) %} {# Taxa Recursos Hídricos Água #}
{% set trhs_fix = (m3_count_day * 0.0312)|round(2) %} {# Taxa Recursos Hídricos Saneamento #}
{% set tgr_fix = (m3_count_day * 0.0404)|round(2) %} {# Taxa Gestão Resíduos #}
{% set limit1 = 5 %} {# Limites do escalão 1 #}
{% set limit2 = 15 %} {# Limites do escalão 2 #}
{% set limit3 = 25 %} {# Limites do escalão 3 #}
{# [Escalão 1] <= 5 m3 #}
{% if m3_count_month <= limit1 %}
{% set consumption_var = (m3_count_day * m3_unit_var1)|round(2) %}
{% set tar_var = (m3_count_day * tar_unit_var1)|round(2) %}
{# [Escalão 2] > 5 m3 <= 15 m3 #}
{% elif m3_count_month > limit1 and m3_count_day <= limit2 %}
{# Caso exista transição de escalão #}
{% if (m3_count_month - m3_count_day) < limit1 %}
{% set m3_count_tax1 = limit1 - (m3_count_month - m3_count_day) %}
{% set m3_count_tax2 = m3_count_month - limit1 %}
{# Cálculos variáveis compostos #}
{% set consumption_var = (m3_count_tax1 * m3_unit_var1)|round(2) + (m3_count_tax2 * m3_unit_var2)|round(2) %}
{% set tar_var = (m3_count_tax1 * tar_unit_var1)|round(2) + (m3_count_tax2 * tar_unit_var2)|round(2) %}
{# Caso não exista transição de escalão #}
{% else %}
{# Cálculos variáveis simples#}
{% set consumption_var = (m3_count_day * m3_unit_var2)|round(2) %}
{% set tar_var = (m3_count_day * tar_unit_var2)|round(2) %}
{% endif %}
{# [Escalão 3] > 15 m3 <= 25 m3 #}
{% elif m3_count_month > limit2 and m3_count_day <= limit3 %}
{# Caso exista transição de escalão #}
{% if m3_count_month - m3_count_day < limit2 %}
{# Caso a transição venha de 2 escalões abaixo #}
{% if m3_count_month - m3_count_day < 5 %}
{% set m3_count_tax1 = limit1 - (m3_count_month - m3_count_day) %}
{% set m3_count_tax2 = limit2 - limit1 %}
{# Caso a transição venha de 1 escalão abaixo #}
{% else %}
{% set m3_count_tax1 = 0 %}
{% set m3_count_tax2 = limit2 - (m3_count_month - m3_count_day) %}
{% endif %}
{% set m3_count_tax3 = m3_count_month - limit2 %}
{# Cálculos variáveis compostos #}
{% set consumption_var = (m3_count_tax1 * m3_unit_var1)|round(2) + (m3_count_tax2 * m3_unit_var2)|round(2) + (m3_count_tax3 * m3_unit_var3)|round(2) %}
{% set tar_var = (m3_count_tax1 * tar_unit_var1)|round(2) + (m3_count_tax2 * tar_unit_var2)|round(2) + (m3_count_tax3 * tar_unit_var3)|round(2) %}
{# Caso não exista transição de escalão #}
{% else %}
{# Cálculos variáveis simples #}
{% set consumption_var = (m3_count_day * m3_unit_var3)|round(2) %}
{% set tar_var = (m3_count_day * tar_unit_var3)|round(2) %}
{% endif %}
{# [Escalão 4] > 25 m3 #}
{% elif m3_count_month > limit3 %}
{# Caso exista transição de escalão #}
{% if m3_count_month - m3_count_day < limit3 %}
{# Caso a transição venha de 3 escalões abaixo #}
{% if m3_count_month - m3_count_day < limit1 %}
{% set m3_count_tax1 = limit1 - (m3_count_month - m3_count_day) %}
{% set m3_count_tax2 = limit2 - limit1 %}
{% set m3_count_tax3 = limit3 - limit2 %}
{# Caso a transição venha de 2 escalões abaixo #}
{% elif m3_count_month - m3_count_day < limit2 %}
{% set m3_count_tax1 = 0 %}
{% set m3_count_tax2 = limit2 - (m3_count_month - m3_count_day) %}
{% set m3_count_tax3 = limit3 - limit2 %}
{# Caso a transição venha de 1 escalão abaixo #}
{% else %}
{% set m3_count_tax1 = 0 %}
{% set m3_count_tax2 = 0 %}
{% set m3_count_tax3 = limit3 - (m3_count_month - m3_count_day) %}
{% endif %}
{% set m3_count_tax4 = m3_count_month - limit3 %}
{# Cálculos variáveis compostos #}
{% set consumption_var = (m3_count_tax1 * m3_unit_var1)|round(2) + (m3_count_tax2 * m3_unit_var2)|round(2) + (m3_count_tax3 * m3_unit_var3)|round(2) + (m3_count_tax4 * m3_unit_var4)|round(2) %}
{% set tar_var = (m3_count_tax1 * tar_unit_var1)|round(2) + (m3_count_tax2 * tar_unit_var2)|round(2) + (m3_count_tax3 * tar_unit_var3)|round(2) + (m3_count_tax4 * tar_unit_var4)|round(2) %}
{# Caso não exista transição de escalão #}
{% else %}
{# Cálculos variáveis simples #}
{% set consumption_var = (m3_count_day * m3_unit_var4)|round(2) %}
{% set tar_var = (m3_count_day * tar_unit_var4)|round(2) %}
{% endif %}
{% endif %}
{# Cálculo do custo total #}
{{ 'unknown' if m3_count_day == 'unknown' else (( (consumption_fix + consumption_var)|round(2) + (tar_fix + tar_var)|round(2) + (trs_fix + trs_var)|round(2) + (trha_fix + trhs_fix)|round(2) + tgr_fix + (((consumption_fix + consumption_var + trha_fix)|round(2)) * vat6)|round(2) ))|round(2) }}
water_cost_day_tax:
unit_of_measurement: '€'
value_template: >-
{# Variáveis #}
{% set days = 1 %} {# Apenas indicativo para melhor compreensão das taxas #}
{% set m3_count_day = states('sensor.water_consumption_m3_day')|float %} {# Total do consumo diário em m3 #}
{% set m3_count_month = states('sensor.water_consumption_m3_month')|float %} {# Total consumo mensal em m3 #}
{% set vat6 = 0.06 %} {# IVA #}
{% set tariff_fix = 0.1064 %} {# Preço diário d Tarifa Fixa #}
{% set m3_unit_var1 = 0.5366 %} {# Preço do m3 no escalão 1 #}
{% set m3_unit_var2 = 1.2534 %} {# Preço do m3 no escalão 2 #}
{% set m3_unit_var3 = 1.7731 %} {# Preço do m3 no escalão 3 #}
{% set m3_unit_var4 = 3.3634 %} {# Preço do m3 no escalão 4 #}
{% set tar_unit_var1 = 0.4829 %} {# Taxa Águas Residuais Variável no escalão 1 #}
{% set tar_unit_var2 = 1.1281 %} {# Taxa Águas Residuais Variável no escalão 2 #}
{% set tar_unit_var3 = 1.5986 %} {# Taxa Águas Residuais Variável no escalão 3 #}
{% set tar_unit_var4 = 3.0271 %} {# Taxa Águas Residuais Variável no escalão 4 #}
{% set consumption_fix = (days * tariff_fix)|round(2) %} {# Tarifa Fixa #}
{% set tar_fix = (days * 0.0653)|round(2) %} {# Taxa Águas Residuais Fixa #}
{% set trs_fix = (days * 0.0841)|round(2) %} {# Taxa Resíduos Sólidos Fixa #}
{% set trs_var = (m3_count_day * 0.3996)|round(2) %} {# Taxa Resíduos Sólidos Variável - Escalão único #}
{% set trha_fix = (m3_count_day * 0.0445)|round(2) %} {# Taxa Recursos Hídricos Água #}
{% set trhs_fix = (m3_count_day * 0.0312)|round(2) %} {# Taxa Recursos Hídricos Saneamento #}
{% set tgr_fix = (m3_count_day * 0.0404)|round(2) %} {# Taxa Gestão Resíduos #}
{% set limit1 = 5 %} {# Limites do escalão 1 #}
{% set limit2 = 15 %} {# Limites do escalão 2 #}
{% set limit3 = 25 %} {# Limites do escalão 3 #}
{# [Escalão 1] <= 5 m3 #}
{% if m3_count_month <= limit1 %}
{% set consumption_var = (m3_count_day * m3_unit_var1)|round(2) %}
{% set tar_var = (m3_count_day * tar_unit_var1)|round(2) %}
{# [Escalão 2] > 5 m3 <= 15 m3 #}
{% elif m3_count_month > limit1 and m3_count_day <= limit2 %}
{# Caso exista transição de escalão #}
{% if (m3_count_month - m3_count_day) < limit1 %}
{% set m3_count_tax1 = limit1 - (m3_count_month - m3_count_day) %}
{% set m3_count_tax2 = m3_count_month - limit1 %}
{# Cálculos variáveis compostos #}
{% set consumption_var = (m3_count_tax1 * m3_unit_var1)|round(2) + (m3_count_tax2 * m3_unit_var2)|round(2) %}
{% set tar_var = (m3_count_tax1 * tar_unit_var1)|round(2) + (m3_count_tax2 * tar_unit_var2)|round(2) %}
{# Caso não exista transição de escalão #}
{% else %}
{# Cálculos variáveis simples#}
{% set consumption_var = (m3_count_day * m3_unit_var2)|round(2) %}
{% set tar_var = (m3_count_day * tar_unit_var2)|round(2) %}
{% endif %}
{# [Escalão 3] > 15 m3 <= 25 m3 #}
{% elif m3_count_month > limit2 and m3_count_day <= limit3 %}
{# Caso exista transição de escalão #}
{% if m3_count_month - m3_count_day < limit2 %}
{# Caso a transição venha de 2 escalões abaixo #}
{% if m3_count_month - m3_count_day < 5 %}
{% set m3_count_tax1 = limit1 - (m3_count_month - m3_count_day) %}
{% set m3_count_tax2 = limit2 - limit1 %}
{# Caso a transição venha de 1 escalão abaixo #}
{% else %}
{% set m3_count_tax1 = 0 %}
{% set m3_count_tax2 = limit2 - (m3_count_month - m3_count_day) %}
{% endif %}
{% set m3_count_tax3 = m3_count_month - limit2 %}
{# Cálculos variáveis compostos #}
{% set consumption_var = (m3_count_tax1 * m3_unit_var1)|round(2) + (m3_count_tax2 * m3_unit_var2)|round(2) + (m3_count_tax3 * m3_unit_var3)|round(2) %}
{% set tar_var = (m3_count_tax1 * tar_unit_var1)|round(2) + (m3_count_tax2 * tar_unit_var2)|round(2) + (m3_count_tax3 * tar_unit_var3)|round(2) %}
{# Caso não exista transição de escalão #}
{% else %}
{# Cálculos variáveis simples #}
{% set consumption_var = (m3_count_day * m3_unit_var3)|round(2) %}
{% set tar_var = (m3_count_day * tar_unit_var3)|round(2) %}
{% endif %}
{# [Escalão 4] > 25 m3 #}
{% elif m3_count_month > limit3 %}
{# Caso exista transição de escalão #}
{% if m3_count_month - m3_count_day < limit3 %}
{# Caso a transição venha de 3 escalões abaixo #}
{% if m3_count_month - m3_count_day < limit1 %}
{% set m3_count_tax1 = limit1 - (m3_count_month - m3_count_day) %}
{% set m3_count_tax2 = limit2 - limit1 %}
{% set m3_count_tax3 = limit3 - limit2 %}
{# Caso a transição venha de 2 escalões abaixo #}
{% elif m3_count_month - m3_count_day < limit2 %}
{% set m3_count_tax1 = 0 %}
{% set m3_count_tax2 = limit2 - (m3_count_month - m3_count_day) %}
{% set m3_count_tax3 = limit3 - limit2 %}
{# Caso a transição venha de 1 escalão abaixo #}
{% else %}
{% set m3_count_tax1 = 0 %}
{% set m3_count_tax2 = 0 %}
{% set m3_count_tax3 = limit3 - (m3_count_month - m3_count_day) %}
{% endif %}
{% set m3_count_tax4 = m3_count_month - limit3 %}
{# Cálculos variáveis compostos #}
{% set consumption_var = (m3_count_tax1 * m3_unit_var1)|round(2) + (m3_count_tax2 * m3_unit_var2)|round(2) + (m3_count_tax3 * m3_unit_var3)|round(2) + (m3_count_tax4 * m3_unit_var4)|round(2) %}
{% set tar_var = (m3_count_tax1 * tar_unit_var1)|round(2) + (m3_count_tax2 * tar_unit_var2)|round(2) + (m3_count_tax3 * tar_unit_var3)|round(2) + (m3_count_tax4 * tar_unit_var4)|round(2) %}
{# Caso não exista transição de escalão #}
{% else %}
{# Cálculos variáveis simples #}
{% set consumption_var = (m3_count_day * m3_unit_var4)|round(2) %}
{% set tar_var = (m3_count_day * tar_unit_var4)|round(2) %}
{% endif %}
{% endif %}
{# Cálculo do custo total das taxas e impostos #}
{{ 'unknown' if m3_count_day == 'unknown' else (( consumption_fix + (tar_fix + tar_var)|round(2) + (trs_fix + trs_var)|round(2) + (trha_fix + trhs_fix)|round(2) + tgr_fix + (((consumption_fix + consumption_var + trha_fix)|round(2)) * vat6)|round(2) ))|round(2) }}
1.4.2 - MENSAL
Aqui há duas vias, criar um sensor do tipo “utility meter” através do sensor diário ou criar um novo sensor independente.
1.4.2.1 - MENSAL - UTILITY METER
utility_meter:
water_cost_month:
source: sensor.water_cost_day
cycle: monthly
Adicionar ao configuration.yaml:
1.4.2.2 - MENSAL - INDEPENDENTE
Adicionar ao configuration.yaml:
- platform: template
sensors:
water_cost_month:
unit_of_measurement: '€'
value_template: >-
{% set days = now().day %}
{% set m3_count = states('sensor.water_consumption_m3_month')|float %}
{% set vat6 = 1.06 %}
{% set tariff_fix = 0.1064 %}
{% set m3_unit_var1 = 0.5366 %}
{% set m3_unit_var2 = 1.2534 %}
{% set m3_unit_var3 = 1.7731 %}
{% set m3_unit_var4 = 3.3634 %}
{% set tar_unit_var1 = 0.4829 %}
{% set tar_unit_var2 = 1.1281 %}
{% set tar_unit_var3 = 1.5986 %}
{% set tar_unit_var4 = 3.0271 %}
{% set consumption_fix = (days * tariff_fix)|round(2) %}
{% set tar_fix = (days * 0.0653)|round(2) %}
{% set trs_fix = (days * 0.0841)|round(2) %}
{% set trs_var = (m3_count * 0.3996)|round(2) %}
{% set trha_fix = (m3_count * 0.0445)|round(2) %}
{% set trhs_fix = (m3_count * 0.0312)|round(2) %}
{% set tgr_fix = (m3_count * 0.0404)|round(2) %}
{% set limit1 = 5 %}
{% set limit2 = 15 %}
{% set limit3 = 25 %}
{% if m3_count <= limit1 %}
{% set consumption_var = (m3_count * m3_unit_var1)|round(2) %}
{% set tar_var = (m3_count * tar_unit_var1)|round(2) %}
{% elif m3_count > limit1 and m3_count <= limit2 %}
{% set consumption_var = (limit1 * m3_unit_var1)|round(2) + ((m3_count - limit1) * m3_unit_var2)|round(2) %}
{% set tar_var = (limit1 * tar_unit_var1)|round(2) + ((m3_count - limit1) * tar_unit_var2)|round(2) %}
{% elif m3_count > limit2 and m3_count <= limit3 %}
{% set consumption_var = (limit1 * m3_unit_var1)|round(2) + ((limit2 - limit1) * m3_unit_var2)|round(2) + ((m3_count - limit2) * m3_unit_var3)|round(2) %}
{% set tar_var = (limit1 * tar_unit_var1)|round(2) + ((limit2 - limit1) * tar_unit_var2)|round(2) + ((m3_count - limit2) * tar_unit_var3)|round(2) %}
{% elif m3_count > limit3 %}
{% set consumption_var = (limit1 * m3_unit_var1)|round(2) + ((limit2 - limit1) * m3_unit_var2)|round(2) + ((limit3 - limit2) * m3_unit_var3)|round(2) + ((m3_count - limit3) * m3_unit_var4)|round(2) %}
{% set tar_var = (limit1 * tar_unit_var1)|round(2) + ((limit2 - limit1) * tar_unit_var2)|round(2) + ((limit3 - limit2) * tar_unit_var3)|round(2) + ((m3_count - limit3) * tar_unit_var4)|round(2) %}
{% endif %}
{{ 'unknown' if m3_count == 'unknown' else (((consumption_fix + consumption_var + trha_fix) * vat6)|round(2) + (tar_fix + tar_var + trs_fix + trs_var + trhs_fix + tgr_fix)|round(2))|round(2) }}
1.4.3 - ANUAL
Adicionar ao configuration.yaml:
utility_meter:
water_cost_year:
source: sensor.water_cost_month
cycle: yearly
1.5 - CRIAR CONTADOR PARA O VISOR
Adicionar ao configuration.yaml:
counter:
contador_agua_visor:
initial: 0
step: 1
Adicionar ao automations.yaml:
- alias: Visor do contador da água
description: ''
trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.contador_impulsos_agua_reais
condition: []
action:
- service: counter.increment
target:
entity_id: counter.contador_agua_visor
mode: single
1.6 - CRIAR ALERTA DE CONSUMO DIÁRIO
Adicionar ao configuration.yaml:
input_number:
water_daily_warning:
name: Aviso consumo diário de água
min: 0
max: 10
step: 0.1
unit_of_measurement: €
icon: mdi:speedometer-slow
Adicionar ao automations.yaml:
- alias: Aviso de consumo de água diário
description: ''
trigger:
- platform: template
value_template: '{{ states.sensor.water_cost_day.state >= states.input_number.water_daily_warning.state
}}'
condition: []
action:
- service: notify.notify
data:
title: AVISO
message: O consumo diário de água foi atingido.
mode: single
1.7 - GRÁFICOS
Nota: É assumido que já está feita a integração do Grafana com o HA.
Importar os seguintes gráficos em formato JSON:
1.7.1 - Cosumo (m3)
{
"aliasColors": {
"CONSUMO DE ÁGUA (m3)": "dark-blue"
},
"bars": true,
"dashLength": 10,
"dashes": false,
"decimals": 2,
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 9,
"w": 12,
"x": 0,
"y": 0
},
"hiddenSeries": false,
"id": 23763571993,
"legend": {
"alignAsTable": true,
"avg": true,
"current": false,
"max": true,
"min": true,
"show": true,
"total": true,
"values": true
},
"lines": false,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": false
},
"percentage": false,
"pluginVersion": "7.4.3",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": true,
"steppedLine": false,
"targets": [
{
"alias": "CONSUMO DE ÁGUA (m3)",
"groupBy": [
{
"params": [
"1d"
],
"type": "time"
},
{
"params": [
"null"
],
"type": "fill"
}
],
"measurement": "m3",
"orderByTime": "ASC",
"policy": "autogen",
"query": "SELECT max(\"value\") FROM \"m3\" WHERE (\"entity_id\" = 'water_consumption_m3_day') AND $timeFilter GROUP BY time(1d) fill(null)",
"rawQuery": false,
"refId": "A",
"resultFormat": "time_series",
"select": [
[
{
"params": [
"value"
],
"type": "field"
},
{
"params": [],
"type": "max"
}
]
],
"tags": [
{
"key": "entity_id",
"operator": "=",
"value": "water_consumption_m3_day"
}
],
"tz": "Europe/Lisbon"
}
],
"thresholds": [],
"timeFrom": "30d",
"timeRegions": [],
"timeShift": null,
"title": "CONSUMO DE ÁGUA (m3)",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"transparent": true,
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:612",
"decimals": 2,
"format": "m3",
"label": "",
"logBase": 1,
"max": null,
"min": "0",
"show": true
},
{
"$$hashKey": "object:613",
"decimals": 2,
"format": "m3",
"label": null,
"logBase": 1,
"max": null,
"min": "0",
"show": false
}
],
"yaxis": {
"align": false,
"alignLevel": null
},
"datasource": null
}
1.7.2 - Custo (€)
{
"aliasColors": {
"CUSTO": "light-blue",
"CUSTO DIÁRIO": "light-orange",
"CUSTO FIXO + TAXAS + IMPOSTOS": "dark-blue",
"FIXO + TAXAS + IMPOSTOS": "dark-blue",
"IMPOSTOS + TAXAS": "dark-blue"
},
"bars": true,
"dashLength": 10,
"dashes": false,
"decimals": 2,
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 9,
"w": 12,
"x": 12,
"y": 0
},
"hiddenSeries": false,
"id": 23763571993,
"legend": {
"alignAsTable": true,
"avg": true,
"current": false,
"max": true,
"min": true,
"show": true,
"total": true,
"values": true
},
"lines": false,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": false
},
"percentage": false,
"pluginVersion": "7.4.3",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [
{
"$$hashKey": "object:151",
"alias": "CUSTO",
"stack": false
}
],
"spaceLength": 10,
"stack": true,
"steppedLine": false,
"targets": [
{
"alias": "CUSTO",
"groupBy": [
{
"params": [
"1d"
],
"type": "time"
},
{
"params": [
"null"
],
"type": "fill"
}
],
"measurement": "€",
"orderByTime": "ASC",
"policy": "autogen",
"query": "SELECT max(\"value\") FROM \"m3\" WHERE (\"entity_id\" = 'gas_consumption_m3_day') AND $timeFilter GROUP BY time(1d) fill(null)",
"rawQuery": false,
"refId": "A",
"resultFormat": "time_series",
"select": [
[
{
"params": [
"value"
],
"type": "field"
},
{
"params": [],
"type": "max"
}
]
],
"tags": [
{
"key": "entity_id",
"operator": "=",
"value": "water_cost_day"
}
],
"tz": "Europe/Lisbon"
},
{
"alias": "FIXO + TAXAS + IMPOSTOS",
"groupBy": [
{
"params": [
"1d"
],
"type": "time"
},
{
"params": [
"null"
],
"type": "fill"
}
],
"measurement": "€",
"orderByTime": "ASC",
"policy": "autogen",
"query": "SELECT max(\"value\") FROM \"m3\" WHERE (\"entity_id\" = 'water_consumption_m3_day') AND $timeFilter GROUP BY time(1d) fill(null)",
"rawQuery": false,
"refId": "B",
"resultFormat": "time_series",
"select": [
[
{
"params": [
"value"
],
"type": "field"
},
{
"params": [],
"type": "max"
}
]
],
"tags": [
{
"key": "entity_id",
"operator": "=",
"value": "water_cost_day_tax"
}
],
"tz": "Europe/Lisbon"
}
],
"thresholds": [],
"timeFrom": "30d",
"timeRegions": [],
"timeShift": null,
"title": "CUSTO DIÁRIO",
"tooltip": {
"shared": true,
"sort": 2,
"value_type": "individual"
},
"transparent": true,
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:612",
"decimals": 2,
"format": "currencyEUR",
"label": "",
"logBase": 1,
"max": null,
"min": "0",
"show": true
},
{
"$$hashKey": "object:613",
"decimals": 2,
"format": "kwatth",
"label": null,
"logBase": 1,
"max": null,
"min": "0",
"show": false
}
],
"yaxis": {
"align": false,
"alignLevel": null
},
"datasource": null
}
1.8 - LOVELACE
Código para a tab que corresponde à imagem apresentada no início:
- title: ÁGUA
icon: 'mdi:water'
theme: dark_cyan
visible:
- user: 3147541b540048da97d8e1de7dd67563
badges: []
cards:
- type: markdown
content: '## <center>CONSUMO DE ÁGUA</center>'
- type: picture-elements
elements:
- type: state-label
entity: counter.contador_agua_visor
style:
top: 34%
left: 54.5%
color: white
font-size: 1.4em
font-weight: bold
image: /local/contador_agua_2.jpg
- type: markdown
content: '## <center>DIÁRIO</center>'
- type: horizontal-stack
cards:
- type: 'custom:mini-graph-card'
entities:
- sensor.water_consumption_m3_day
line_color: blue
line_width: 5
font_size: 70
decimals: 3
align_state: center
show:
name: false
icon: false
- type: 'custom:mini-graph-card'
entities:
- sensor.water_cost_day
line_color: red
line_width: 5
font_size: 70
align_state: center
show:
name: false
icon: false
- type: entities
entities:
- entity: input_number.water_daily_warning
name: Aviso diário
- type: markdown
content: '## <center>GERAL</center>'
- entities:
- entity: sensor.water_consumption_m3_day
name: DIA
icon: 'mdi:cube'
- entity: sensor.water_consumption_m3_month
name: MÊS
icon: 'mdi:cube'
- entity: sensor.water_consumption_m3_year
name: ANO
icon: 'mdi:cube'
- entity: sensor.water_cost_day
icon: 'mdi:currency-eur'
name: ''
- entity: sensor.water_cost_month
icon: 'mdi:currency-eur'
name: ''
- entity: sensor.water_cost_year
icon: 'mdi:currency-eur'
name: ''
columns: 3
show_icon: true
show_name: true
type: glance
- type: markdown
content: '## <center>GRÁFICOS</center>'
- type: iframe
url: >-
https://SET_URL_TO_GRAPH_HERE&refresh="5s"
aspect_ratio: 70%
- type: iframe
url: >-
https://SET_URL_TO_GRAPH_HERE&refresh="5s"
aspect_ratio: 70%
2 - GÁS
2.1 - CRIAR UM CONTADOR DE MODO A CONTABILIZAR AS VEZES QUE O SENSOR “ABRE E FECHA”
Adicionar ao configuration.yaml:
counter:
contador_impulsos_gas:
initial: 0
step: 1
Adicionar ao automations.yaml:
- alias: Contador de impulsos do gás
description: ''
trigger:
- platform: state
entity_id: binary_sensor.contador_gas
to: 'off'
from: 'on'
condition: []
action:
- service: counter.increment
data: {}
entity_id: counter.contador_impulsos_gas
mode: single
Neste caso o sensor “abre e fecha” e sobe 10 algarismos (equivalente a 10 litros de gás). Vamos considerar este valor o correspondente a 1 impulso.
2.2 - CRIAR SENSORES PARA OS IMPULSOS
Adicionar ao configuration.yaml:
utility_meter:
contador_impulsos_gas_day:
source: counter.contador_impulsos_gas
cycle: daily
contador_impulsos_gas_month:
source: counter.contador_impulsos_gas
cycle: monthly
contador_impulsos_gas_year:
source: counter.contador_impulsos_gas
cycle: yearly
2.3 - CRIAR SENSORES PARA OS CONSUMOS
Adicionar ao configuration.yaml:
- platform: template
sensors:
gas_consumption_m3_day:
unit_of_measurement: 'm3'
value_template: >-
{% set impulse_unit = 0.01 %}
{% set impulse_count = states('sensor.contador_impulsos_gas_day') %}
{{ 'unknown' if impulse_count == 'unknown' else (impulse_count|int * impulse_unit|float) | round(2) }}
gas_consumption_m3_month:
unit_of_measurement: 'm3'
value_template: >-
{% set impulse_unit = 0.01 %}
{% set impulse_count = states('sensor.contador_impulsos_gas_month') %}
{{ 'unknown' if impulse_count == 'unknown' else (impulse_count|int * impulse_unit|float) | round(2) }}
gas_consumption_m3_year:
unit_of_measurement: 'm3'
value_template: >-
{% set impulse_unit = 0.01 %}
{% set impulse_count = states('sensor.contador_impulsos_gas_year') %}
{{ 'unknown' if impulse_count == 'unknown' else (impulse_count|int * impulse_unit|float) | round(2) }}
gas_consumption_kwh_day:
unit_of_measurement: 'kWh'
value_template: >-
{% set m3_count = states('sensor.gas_consumption_m3_day') %}
{% set fcv = 0.96092100 %} {# Factor de Correcção de Volume #}
{% set pcs = 11.76693000 %} {# Poder Calorífico Superior #}
{{ 'unknown' if m3_count == 'unknown' else (m3_count|float * fcv|float * pcs|float) | round(2) }}
gas_consumption_kwh_month:
unit_of_measurement: 'kWh'
value_template: >-
{% set m3_count = states('sensor.gas_consumption_m3_month') %}
{% set fcv = 0.96092100 %} {# Factor de Correcção de Volume #}
{% set pcs = 11.76693000 %} {# Poder Calorífico Superior #}
{{ 'unknown' if m3_count == 'unknown' else (m3_count|float * fcv|float * pcs|float) | round(2) }}
gas_consumption_kwh_year:
unit_of_measurement: 'kWh'
value_template: >-
{% set m3_count = states('sensor.gas_consumption_m3_year') %}
{% set fcv = 0.96092100 %} {# Factor de Correcção de Volume #}
{% set pcs = 11.76693000 %} {# Poder Calorífico Superior #}
{{ 'unknown' if m3_count == 'unknown' else (m3_count|float * fcv|float * pcs|float) | round(2) }}
2.4 - CRIAR SENSORES PARA OS CUSTOS
Esta é a parte mais chata pois requer interpretar a factura. O exemplo que se segue tem como base os valores da EDP para o ano corrente, com um desconto de 5%. Foram adicionados comentários de forma a ser mais fácil adaptar para outras companhias.
Adicionar ao configuration.yaml:
- platform: template
sensors:
gas_cost_day:
unit_of_measurement: '€'
value_template: >-
{% set days = 1 %}
{% set vat23 = 1.23 %}
{% set vat6 = 1.06 %}
{% set kwh_count = states('sensor.gas_consumption_kwh_day')|float %}
{% set kwh_price = 0.0595 %}
{% set kwh_discount = 1 - 0.05 %} {# Desconto nos kwh's #}
{% set consumption = ((kwh_count * kwh_price) * kwh_discount) * vat23 %}
{% set ttf = (days * 0.0678) * vat23 %} {# Termo Tarifário Fixo #}
{% set tar = (days * 0.0148) * vat6 %} {# Tarifa de Acesso às Redes #}
{% set tos_fixed = (days * 0.00484614) * vat23 %} {# TOS Fixo #}
{% set tos_var = (kwh_count * 0.00416305) * vat23 %} {# TOS Variável #}
{% set iecgnc = (kwh_count * 0.0059292) * vat23 %} {# IECGNC #}
{{ 'unknown' if kwh_count == 'unknown' else ( consumption + ttf + tar + tos_fixed + tos_var + iecgnc ) | round(3) }}
gas_cost_month:
unit_of_measurement: '€'
value_template: >-
{% set days = now().day %}
{% set vat23 = 1.23 %}
{% set vat6 = 1.06 %}
{% set kwh_count = states('sensor.gas_consumption_kwh_month')|float %}
{% set kwh_price = 0.0595 %}
{% set kwh_discount = 1 - 0.05 %} {# Desconto nos kwh's #}
{% set consumption = ((kwh_count * kwh_price) * kwh_discount) * vat23 %}
{% set ttf = (days * 0.0678) * vat23 %} {# Termo Tarifário Fixo #}
{% set tar = (days * 0.0148) * vat6 %} {# Tarifa de Acesso às Redes #}
{% set tos_fixed = (days * 0.00484614) * vat23 %} {# TOS Fixo #}
{% set tos_var = (kwh_count * 0.00416305) * vat23 %} {# TOS Variável #}
{% set iecgnc = (kwh_count * 0.0059292) * vat23 %} {# IECGNC #}
{{ 'unknown' if kwh_count == 'unknown' else ( consumption + ttf + tar + tos_fixed + tos_var + iecgnc ) | round(3) }}
gas_cost_year:
unit_of_measurement: '€'
value_template: >-
{% set days = now().strftime('%j')|int %}
{% set vat23 = 1.23 %}
{% set vat6 = 1.06 %}
{% set kwh_count = states('sensor.gas_consumption_kwh_year')|float %}
{% set kwh_price = 0.0595 %}
{% set kwh_discount = 1 - 0.05 %} {# Desconto nos kwh's #}
{% set consumption = ((kwh_count * kwh_price) * kwh_discount) * vat23 %}
{% set ttf = (days * 0.0678) * vat23 %} {# Termo Tarifário Fixo #}
{% set tar = (days * 0.0148) * vat6 %} {# Tarifa de Acesso às Redes #}
{% set tos_fixed = (days * 0.00484614) * vat23 %} {# TOS Fixo #}
{% set tos_var = (kwh_count * 0.00416305) * vat23 %} {# TOS Variável #}
{% set iecgnc = (kwh_count * 0.0059292) * vat23 %} {# IECGNC #}
{{ 'unknown' if kwh_count == 'unknown' else ( consumption + ttf + tar + tos_fixed + tos_var + iecgnc ) | round(3) }}
gas_cost_day_tax:
unit_of_measurement: '€'
value_template: >-
{% set days = 1 %}
{% set vat23 = 1.23 %}
{% set vat6 = 1.06 %}
{% set kwh_count = states('sensor.gas_consumption_kwh_day')|float %}
{% set ttf = (days * 0.0678) * vat23 %} {# Termo Tarifário Fixo #}
{% set tar = (days * 0.0148) * vat6 %} {# Tarifa de Acesso às Redes #}
{% set tos_fixed = (days * 0.00484614) * vat23 %} {# TOS Fixo #}
{% set tos_var = (kwh_count * 0.00416305) * vat23 %} {# TOS Variável #}
{% set iecgnc = (kwh_count * 0.0059292) * vat23 %} {# IECGNC #}
{{ 'unknown' if kwh_count == 'unknown' else ( ttf + tar + tos_fixed + tos_var + iecgnc ) | round(3) }}
2.5 - CRIAR CONTADOR PARA O VISOR
Adicionar ao configuration.yaml:
counter:
contador_gas_visor:
initial: 0
step: 1
Adicionar ao automations.yaml:
- alias: Visor do contador do gás
description: ''
trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: counter.contador_impulsos_gas
condition: []
action:
- repeat:
count: '10'
sequence:
- service: counter.increment
target:
entity_id: counter.contador_gas_visor
mode: single
Nota: O visor actualizará de 10 em 10 a cada impulso recebido.
2.6 - CRIAR ALERTA DE CONSUMO DIÁRIO
Adicionar ao configuration.yaml:
input_number:
gas_daily_warning:
name: Aviso consumo diário de gás
min: 0
max: 10
step: 0.1
unit_of_measurement: €
icon: mdi:speedometer-slow
Adicionar ao automations.yaml:
- alias: Aviso de consumo de gás diário
description: ''
trigger:
- platform: template
value_template: '{{ states.sensor.gas_cost_day.state >= states.input_number.gas_daily_warning.state
}}'
condition: []
action:
- service: notify.notify
data:
title: AVISO
message: O consumo diário de gás foi atingido.
mode: single
2.7 - GRÁFICOS
Nota: É assumido que já está feita a integração do Grafana com o HA.
Importar os seguintes gráficos em formato JSON:
2.7.1 - Cosumo (m3)
{
"aliasColors": {
"CONSUMO DE GÁS (m3)": "dark-orange"
},
"bars": true,
"dashLength": 10,
"dashes": false,
"decimals": 2,
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 9,
"w": 12,
"x": 0,
"y": 0
},
"hiddenSeries": false,
"id": 2,
"legend": {
"alignAsTable": true,
"avg": true,
"current": false,
"max": true,
"min": true,
"show": true,
"total": true,
"values": true
},
"lines": false,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": false
},
"percentage": false,
"pluginVersion": "7.4.3",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": true,
"steppedLine": false,
"targets": [
{
"alias": "CONSUMO DE GÁS (m3)",
"groupBy": [
{
"params": [
"1d"
],
"type": "time"
},
{
"params": [
"null"
],
"type": "fill"
}
],
"measurement": "m3",
"orderByTime": "ASC",
"policy": "autogen",
"query": "SELECT max(\"value\") FROM \"m3\" WHERE (\"entity_id\" = 'gas_consumption_m3_day') AND $timeFilter GROUP BY time(1d) fill(null)",
"rawQuery": false,
"refId": "A",
"resultFormat": "time_series",
"select": [
[
{
"params": [
"value"
],
"type": "field"
},
{
"params": [],
"type": "max"
}
]
],
"tags": [
{
"key": "entity_id",
"operator": "=",
"value": "gas_consumption_m3_day"
}
],
"tz": "Europe/Lisbon"
}
],
"thresholds": [],
"timeFrom": "30d",
"timeRegions": [],
"timeShift": null,
"title": "CONSUMO DE GÁS (m3)",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"transparent": true,
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:612",
"decimals": 2,
"format": "m3",
"label": "",
"logBase": 1,
"max": null,
"min": "0",
"show": true
},
{
"$$hashKey": "object:613",
"decimals": 2,
"format": "m3",
"label": null,
"logBase": 1,
"max": null,
"min": "0",
"show": false
}
],
"yaxis": {
"align": false,
"alignLevel": null
},
"datasource": null
}
1.7.2 - Consumo (kWh)
{
"aliasColors": {
"CONSUMO DE GÁS (kWh)": "dark-yellow"
},
"bars": true,
"dashLength": 10,
"dashes": false,
"decimals": 2,
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 9,
"w": 12,
"x": 12,
"y": 0
},
"hiddenSeries": false,
"id": 3,
"legend": {
"alignAsTable": true,
"avg": true,
"current": false,
"max": true,
"min": true,
"show": true,
"total": true,
"values": true
},
"lines": false,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": false
},
"percentage": false,
"pluginVersion": "7.4.3",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": true,
"steppedLine": false,
"targets": [
{
"alias": "CONSUMO DE GÁS (kWh)",
"groupBy": [
{
"params": [
"1d"
],
"type": "time"
},
{
"params": [
"null"
],
"type": "fill"
}
],
"measurement": "kWh",
"orderByTime": "ASC",
"policy": "autogen",
"query": "SELECT max(\"value\") FROM \"m3\" WHERE (\"entity_id\" = 'gas_consumption_kwh_day') AND $timeFilter GROUP BY time(1d) fill(null)",
"rawQuery": false,
"refId": "A",
"resultFormat": "time_series",
"select": [
[
{
"params": [
"value"
],
"type": "field"
},
{
"params": [],
"type": "max"
}
]
],
"tags": [
{
"key": "entity_id",
"operator": "=",
"value": "gas_consumption_kwh_day"
}
],
"tz": "Europe/Lisbon"
}
],
"thresholds": [],
"timeFrom": "30d",
"timeRegions": [],
"timeShift": null,
"title": "CONSUMO DE GÁS (kWh)",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"transparent": true,
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:612",
"decimals": 2,
"format": "kwatth",
"label": null,
"logBase": 1,
"max": null,
"min": "0",
"show": true
},
{
"$$hashKey": "object:613",
"decimals": 2,
"format": "kwatth",
"label": null,
"logBase": 1,
"max": null,
"min": "0",
"show": false
}
],
"yaxis": {
"align": false,
"alignLevel": null
},
"datasource": null
}
1.7.3 - Custo (€)
{
"aliasColors": {
"CUSTO": "light-orange",
"CUSTO DIÁRIO": "light-orange",
"CUSTO FIXO + TAXAS + IMPOSTOS": "dark-orange",
"FIXO + TAXAS + IMPOSTOS": "dark-orange",
"IMPOSTOS + TAXAS": "dark-orange"
},
"bars": true,
"dashLength": 10,
"dashes": false,
"decimals": 2,
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 9,
"w": 12,
"x": 12,
"y": 9
},
"hiddenSeries": false,
"id": 4,
"legend": {
"alignAsTable": true,
"avg": true,
"current": false,
"max": true,
"min": true,
"show": true,
"total": true,
"values": true
},
"lines": false,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": false
},
"percentage": false,
"pluginVersion": "7.4.3",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [
{
"$$hashKey": "object:151",
"alias": "CUSTO",
"stack": false
}
],
"spaceLength": 10,
"stack": true,
"steppedLine": false,
"targets": [
{
"alias": "CUSTO",
"groupBy": [
{
"params": [
"1d"
],
"type": "time"
},
{
"params": [
"null"
],
"type": "fill"
}
],
"measurement": "€",
"orderByTime": "ASC",
"policy": "autogen",
"query": "SELECT max(\"value\") FROM \"m3\" WHERE (\"entity_id\" = 'gas_cost_day') AND $timeFilter GROUP BY time(1d) fill(null)",
"rawQuery": false,
"refId": "A",
"resultFormat": "time_series",
"select": [
[
{
"params": [
"value"
],
"type": "field"
},
{
"params": [],
"type": "max"
}
]
],
"tags": [
{
"key": "entity_id",
"operator": "=",
"value": "gas_cost_day"
}
],
"tz": "Europe/Lisbon"
},
{
"alias": "FIXO + TAXAS + IMPOSTOS",
"groupBy": [
{
"params": [
"1d"
],
"type": "time"
},
{
"params": [
"null"
],
"type": "fill"
}
],
"measurement": "€",
"orderByTime": "ASC",
"policy": "autogen",
"query": "SELECT max(\"value\") FROM \"m3\" WHERE (\"entity_id\" = 'gas_cost_day_tax') AND $timeFilter GROUP BY time(1d) fill(null)",
"rawQuery": false,
"refId": "B",
"resultFormat": "time_series",
"select": [
[
{
"params": [
"value"
],
"type": "field"
},
{
"params": [],
"type": "max"
}
]
],
"tags": [
{
"key": "entity_id",
"operator": "=",
"value": "gas_cost_day_tax"
}
],
"tz": "Europe/Lisbon"
}
],
"thresholds": [],
"timeFrom": "30d",
"timeRegions": [],
"timeShift": null,
"title": "CUSTO DIÁRIO",
"tooltip": {
"shared": true,
"sort": 2,
"value_type": "individual"
},
"transparent": true,
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:612",
"decimals": 2,
"format": "currencyEUR",
"label": "",
"logBase": 1,
"max": null,
"min": "0",
"show": true
},
{
"$$hashKey": "object:613",
"decimals": 2,
"format": "kwatth",
"label": null,
"logBase": 1,
"max": null,
"min": "0",
"show": false
}
],
"yaxis": {
"align": false,
"alignLevel": null
},
"datasource": null
}
2.8 - LOVELACE
Código para a tab que corresponde à imagem apresentada no início:
- title: GÁS
icon: 'mdi:gas-cylinder'
theme: dark_cyan
badges: []
cards:
- type: markdown
content: '## <center>CONSUMO DE GÁS</center>'
- type: picture-elements
elements:
- type: state-label
entity: counter.contador_gas_visor
style:
top: 39.2%
left: 52.8%
color: white
font-size: 1.4em
font-weight: bold
image: /local/contador_gas_2.jpg
- type: markdown
content: '## <center>DIÁRIO</center>'
- type: horizontal-stack
cards:
- type: 'custom:mini-graph-card'
entities:
- sensor.gas_consumption_m3_day
line_color: green
line_width: 5
font_size: 70
align_state: center
show:
name: false
icon: false
- type: 'custom:mini-graph-card'
entities:
- sensor.gas_consumption_kwh_day
line_color: orange
line_width: 5
font_size: 70
align_state: center
show:
name: false
icon: false
- type: 'custom:mini-graph-card'
entities:
- sensor.gas_cost_day
line_color: red
line_width: 5
font_size: 70
align_state: center
show:
name: false
icon: false
- type: entities
entities:
- entity: input_number.gas_daily_warning
name: Aviso diário
- type: markdown
content: '## <center>GERAL</center>'
- entities:
- entity: sensor.gas_consumption_m3_day
name: DIA
icon: 'mdi:cube'
- entity: sensor.gas_consumption_m3_month
name: MÊS
icon: 'mdi:cube'
- entity: sensor.gas_consumption_m3_year
name: ANO
icon: 'mdi:cube'
- entity: sensor.gas_consumption_kwh_day
name: ''
icon: 'mdi:lightning-bolt'
- entity: sensor.gas_consumption_kwh_month
name: ''
icon: 'mdi:lightning-bolt'
- entity: sensor.gas_consumption_kwh_year
name: ''
icon: 'mdi:lightning-bolt'
- entity: sensor.gas_cost_day
icon: 'mdi:currency-eur'
name: ''
- entity: sensor.gas_cost_month
icon: 'mdi:currency-eur'
name: ''
- entity: sensor.gas_cost_year
icon: 'mdi:currency-eur'
name: ''
columns: 3
show_icon: true
show_name: true
type: glance
- type: markdown
content: '## <center>GRÁFICOS</center>'
- type: iframe
url: >-
https://SET_URL_TO_GRAPH_HERE&refresh="5s"
aspect_ratio: 70%
- type: iframe
url: >-
https://SET_URL_TO_GRAPH_HERE&refresh="5s"
aspect_ratio: 70%
- type: iframe
url: >-
https://SET_URL_TO_GRAPH_HERE&refresh="5s"
aspect_ratio: 70%
Lista de Material
Sensor de porta:
- https://mauser.pt/catalog/product_info.php?cPath=570_2198_2744&products_id=096-7373
- https://mauser.pt/catalog/product_info.php?cPath=554_556&products_id=096-7969
Gateway Zigbee: