Template para calculo de custo de Agua (Resolvido)

Estou tentando montar o template para me mostrar o custo previsto que terei com a conta de agua.

Tenho um hidrômetro de pulso conectado ao Home Assistant que mostrei nesse tópico:

Estou tentando incluir um sensor que me mostre o custo mensal que terei com a água.
Já incluí utility_meter com offset de 25 dias para consolidar mensalmente quantos litros estou recebendo de agua e agora estou tentando calcular o custo.

A Estrutura tarifária de Niterói - RJ, cidade onde moro, segue na imagem abaixo:
image

Pensei na seguinte lógica mas estou com dificuldade em relação a sintaxe.
Alguém poderia me ajudar com o código abaixo:

#  - platform: template
#    sensors:
#      custo_mensal_aguas_de_niteroi:
#        friendly_name: "Custo previsto da Aguas de Niterói"
#        icon_template: mdi:cash-usd
#        unit_of_measurement: 'R$'
# Se sensor.monthly_water_in_aguas_de_niteroi < 15000
        value_template: "{{ ( float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * 
(3,8671 * 2) ) | round(2) }}"
# Se sensor.monthly_water_in_aguas_de_niteroi < 30000
        value_template: "{{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) 
* (3,8671 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * 
(9,6677 * 2)) ) | round(2) }}"
# Se sensor.monthly_water_in_aguas_de_niteroi < 45000
        value_template: "{{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) 
* (3,8671 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * 
(9,6677 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-30000) * 
(11,9879 * 2)) ) | round(2) }}"        
# Se sensor.monthly_water_in_aguas_de_niteroi < 60000
        value_template: "{{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) 
* (3,8671 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * 
(9,6677 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-30000) * 
(11,9879 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-45000) * 
(23,2024 * 2)) ) | round(2) }}"
# Se sensor.monthly_water_in_aguas_de_niteroi > 60000
        value_template: "{{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) 
* (3,8671 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * 
(9,6677 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-30000) * 
(11,9879 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-45000) * 
(23,2024 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-60000) * 
(30,9366 * 2)) ) | round(2) }}"
1 Like

A sintaxe para condicionais no template é:

        value_template: >-
          {% if (states('sensor.monthly_water_in_aguas_de_niteroi') | float < 15000) %}
            {{ (states('sensor.monthly_water_in_aguas_de_niteroi') | float * 3.8671 * 2) | round(2) }}
          {% elif (states('sensor.monthly_water_in_aguas_de_niteroi')  | float < 30000) %}
            {{ (states('sensor.monthly_water_in_aguas_de_niteroi') | float * 9.6677 * 2) | round(2) }}
          {% else %}
            {{ (states('sensor.monthly_water_in_aguas_de_niteroi') | float * 30.9366 * 2) | round(2) }}
          {% endif %}

O código acima não está na forma correta para o seu cálculo, apenas usei um exemplo para mostrar o uso do if e elif no template.

1 Like

Obrigado @douglasit.

Ainda preciso entender melhor porque não consegui o resultado que eu queria e o sensor aparece como “Indisponível”
image

  - platform: template
sensors:
  custo_mensal_aguas_de_niteroi:
    friendly_name: "Custo previsto da Aguas de Niterói"
    icon_template: mdi:cash-usd
    unit_of_measurement: 'R$'
    value_template: >-
      {% if (states('sensor.monthly_water_in_aguas_de_niteroi') < 15000) %}
        {{ ( float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * (3,8671 * 2) ) | round(2) }}
      {% elif (states('sensor.monthly_water_in_aguas_de_niteroi') < 30000) %}
        {{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * (3,8671 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * (9,6677 * 2)) ) | round(2) }}
      {% elif (states('sensor.monthly_water_in_aguas_de_niteroi') < 45000) %}
        {{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * (3,8671 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * (9,6677 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-30000) * (11,9879 * 2)) ) | round(2) }}
      {% elif (states('sensor.monthly_water_in_aguas_de_niteroi') < 60000) %}
        {{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * (3,8671 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * (9,6677 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-30000) * (11,9879 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-45000) * (23,2024 * 2)) ) | round(2) }}
      {% else %}
        {{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * (3,8671 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * (9,6677 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-30000) * (11,9879 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-45000) * (23,2024 * 2)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-60000) * (30,9366 * 2)) ) | round(2) }}
      {% endif %}

Acredito que seja devido que na casa decimal da tarifa você usou vírgula ao invés de ponto.

Obrigado @douglasit

Era isso e também tinha que incluir | float nas condições “If”.
Também dividi por 1000 pois a tarifa é para m³ (1000 litros)

Ficou assim:

- platform: template
sensors:
  custo_mensal_aguas_de_niteroi:
    friendly_name: "Custo previsto da Aguas de Niterói"
    icon_template: mdi:cash-usd
    unit_of_measurement: 'R$'
    value_template: >-
      {% if (states('sensor.monthly_water_in_aguas_de_niteroi') | float < 15000) %}
        {{ ( float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * (3.8671 * 2 / 1000) ) | round(2) }}
      {% elif (states('sensor.monthly_water_in_aguas_de_niteroi') | float < 30000) %}
        {{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * (3.8671 * 2 / 1000)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * (9.6677 * 2 / 1000)) ) | round(2) }}
      {% elif (states('sensor.monthly_water_in_aguas_de_niteroi') | float < 45000) %}
        {{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * (3.8671 * 2 / 1000)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * (9.6677 * 2 / 1000)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-30000) * (11.9879 * 2 / 1000)) ) | round(2) }}
      {% elif (states('sensor.monthly_water_in_aguas_de_niteroi') | float < 60000) %}
        {{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * (3.8671 * 2 / 1000)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * (9.6677 * 2 / 1000)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-30000) * (11.9879 * 2 / 1000)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-45000) * (23.2024 * 2 / 1000)) ) | round(2) }}
      {% else %}
        {{ ( (float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * (3.8671 * 2 / 1000)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * (9.6677 * 2 / 1000)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-30000) * (11.9879 * 2 / 1000)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-45000) * (23.2024 * 2 / 1000)) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-60000) * (30.9366 * 2 / 1000)) ) | round(2) }}
      {% endif %}

No Lovelace ficou assim por enquanto:
image

Valeu!

Seria uma boa você criar um input_number com o valor de cada tarifa e usar essa entidade no seu template, assim você conseguir atualizar os valores de tarifa sem ter que editar o template.

Obrigado pela dica @douglasit !

Criei as variaveis “input_number” e corrigi a lógica da programação.
Me parece que agora está correto.

#Configuração das variaveis auxiliares para controlar a tarifa de Agua por faixas de volume
input_number:
# Faixa 1 - consumo de agua até 15.000m³
  tarifa_agua_faixa1:
    name: Tarifa de agua Faixa 1
    unit_of_measurement: 'R$'
    initial: 3.8671
    min: 0
    max: 999
# Faixa 2 - consumo de agua entre 15.000m³ e 30.000m³
  tarifa_agua_faixa2:
    name: Tarifa de agua Faixa 2
    unit_of_measurement: 'R$'
    initial: 9.6677
    min: 0
    max: 999
# Faixa 3 - consumo de agua entre 30.000m³ e 45.000m³
  tarifa_agua_faixa3:
    name: Tarifa de agua Faixa 3
    unit_of_measurement: 'R$'
    initial: 11.9879
    min: 0
    max: 999
# Faixa 4 - consumo de agua entre 45.000m³ e 60.000m³
  tarifa_agua_faixa4:
    name: Tarifa de agua Faixa 4
    unit_of_measurement: 'R$'
    initial: 23.2024
    min: 0
    max: 999
# Faixa 5 - consumo de agua acima de 60.000m³
  tarifa_agua_faixa5:
    name: Tarifa de agua Faixa 5
    unit_of_measurement: 'R$'
    initial: 30.9366
    min: 0
    max: 999

Codigo do template:

  - platform: template
sensors:
  custo_mensal_aguas_de_niteroi:
    friendly_name: "Custo Mensal Aguas de Niterói"
    icon_template: mdi:cash-usd
    unit_of_measurement: 'R$'
    value_template: >-
      {% if (states('sensor.monthly_water_in_aguas_de_niteroi') | float < 15000) %}
        {{ ( float(states.sensor.monthly_water_in_aguas_de_niteroi.state) * ((states('input_number.tarifa_agua_faixa1') | float) * 2 / 1000) ) | round(2) }}
      {% elif (states('sensor.monthly_water_in_aguas_de_niteroi') | float < 30000) %}
        {{ ( (15000 * (states('input_number.tarifa_agua_faixa1') | float) * 2 / 1000) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-15000) * ((states('input_number.tarifa_agua_faixa2') | float) * 2 / 1000)) ) | round(2) }}
      {% elif (states('sensor.monthly_water_in_aguas_de_niteroi') | float < 45000) %}
        {{ ( (15000 * (states('input_number.tarifa_agua_faixa1') | float * 2 / 1000) + (15000 * states('input_number.tarifa_agua_faixa2') | float) * 2 / 1000) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-30000) * ((states('input_number.tarifa_agua_faixa3') | float) * 2 / 1000)) ) | round(2) }}
      {% elif (states('sensor.monthly_water_in_aguas_de_niteroi') | float < 60000) %}
        {{ ( (15000 * (states('input_number.tarifa_agua_faixa1') | float) * 2 / 1000) + (15000 * (states('input_number.tarifa_agua_faixa2') | float) * 2 / 1000) + (15000 * (states('input_number.tarifa_agua_faixa3') | float) * 2 / 1000) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-45000) * ((states('input_number.tarifa_agua_faixa4') | float) * 2 / 1000)) ) | round(2) }}
      {% else %}
        {{ ( (15000 * (states('input_number.tarifa_agua_faixa1') | float) * 2 / 1000) + (15000 * (states('input_number.tarifa_agua_faixa2') | float) * 2 / 1000) + (15000 * (states('input_number.tarifa_agua_faixa3') | float) * 2 / 1000) + (15000 * (states('input_number.tarifa_agua_faixa4') | float) * 2 / 1000) + ((float(states.sensor.monthly_water_in_aguas_de_niteroi.state)-60000) * ((states('input_number.tarifa_agua_faixa5') | float) * 2 / 1000)) ) | round(2) }}
      {% endif %}
1 Like