Medição de Consumo de Água e Gás

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 :sunglasses:;
  • 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! :+1:

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 :grin:).

E este foi o contador de água testado:

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

Imagem para o picture-elements:
contador-agua

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.

Imagem para o picture-elements:
contador_gas_1

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:

Gateway Zigbee:


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


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