Como medir consumo da caixa d'água com Home Assistant

Noite man, não consegui com o ESPHome, testei de tudo mas o sensor só dava timeout, resolvi com TASMOTA. Obrigado pela ajuda…Abs

Não, meio que larguei de mão essa automação…rsrsrsrs

1 curtida

como puedo yo usar tu código para un deposito cilíndrico de altura 122cm y radio 60cm. Gracias

Minha caixa fica completamente externa, sem nenhum tippo de cobertura ou proteção do tempo. Por este motivo optei por usar este tipo de sensor.

Ele me dá a informação necessária, até prq eu não tenho poblemas de falta de água na minha região.

A unica diferença é que acrecentei um sensor para me falar se a entrada de água (boia) está ou não acionada.

Tentei seu código, mas ele diz que os pinos estão em múltiplos lugares e não valida.

Fala pessoal blz. estou com uma dificuldade de resolver um código pronto por outra pessoa, porem quero adaptar a minha situação, vamos lá…

eu já tenho implementado o monitoramento de fluxo de agua, porem, eu queria monitorar o valor do consumo através das tarifas que minha concessionaria de agua cobra, encontrei um código “Resolvido”, porem, esse código se trata de outra concessionaria de agua, eu sou da capital de São Paulo, e concessionaria de agua aqui e a Sabesp, aqui funciona assim, dependendo do consumo em metros cúbicos eles te cobram um valor, porem, o primeiro valor que vai de 0 a 10 m³ e um valor fixo, eles chama de “Valor mínimo”, de 11m³ em diante o valor e variável, ou seja, vai de acordo com o que você consumir. vou postar aqui o código de um rapaz lá do rio de janeiro, pois o que me parece e que a forma de cobrança deles e diferente, segue o link do código :

https://homeassistantbrasil.com.br/t/template-para-calculo-de-custo-de-agua-resolvido/4180/7

    #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
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 %}

Neste caso queria adaptar as tarifas da Sabesp com o detalhe de que a primeira tarifa ela e fixar ate os 10m³.

quem poder me ajudar ficarei extremamente grato.

Fiz um sensor para calcular o valor referente a Copasa (MG).
@xandyveloso talvez esse calculo sirva para você. A Copasa cobra taxa mínima apenas se o consumo for 0 m³ ( vc pode alterar o sensor para 10m³) , depois disso é a mínima + consumo variável.

Dentro da pasta config, criar uma pasta

custom_templates

dentro da pasta custom_templates, criar um arquivo:

formatter.jinja

no arquivo formatter.jinja, colocar o codigo abaixo:

{% macro calcular_tarifa(consumo, faixa, tarifas) %}
  {% set valor = tarifas.fixa %}
  {% if consumo > 0 %}
    {% if consumo <= 5 %}
      {% set valor = valor + (consumo * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) %}
    {% elif consumo <= 10 %}
      {% set valor = valor + (5 * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) + ((consumo - 5) * tarifas['a5a10' if faixa == 'agua' else 'e5a10']) %}
    {% elif consumo <= 15 %}
      {% set valor = valor + (5 * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) + (5 * tarifas['a5a10' if faixa == 'agua' else 'e5a10']) + ((consumo - 10) * tarifas['a10a15' if faixa == 'agua' else 'e10a15']) %}
    {% elif consumo <= 20 %}
      {% set valor = valor + (5 * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) + (5 * tarifas['a5a10' if faixa == 'agua' else 'e5a10']) + (5 * tarifas['a10a15' if faixa == 'agua' else 'e10a15']) + ((consumo - 15) * tarifas['a15a20' if faixa == 'agua' else 'e15a20']) %}
    {% elif consumo <= 40 %}
      {% set valor = valor + (5 * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) + (5 * tarifas['a5a10' if faixa == 'agua' else 'e5a10']) + (5 * tarifas['a10a15' if faixa == 'agua' else 'e10a15']) + (5 * tarifas['a15a20' if faixa == 'agua' else 'e15a20']) + ((consumo - 20) * tarifas['a20a40' if faixa == 'agua' else 'e20a40']) %}
    {% else %}
      {% set valor = valor + (5 * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) + (5 * tarifas['a5a10' if faixa == 'agua' else 'e5a10']) + (5 * tarifas['a10a15' if faixa == 'agua' else 'e10a15']) + (5 * tarifas['a15a20' if faixa == 'agua' else 'e15a20']) + (20 * tarifas['a20a40' if faixa == 'agua' else 'e20a40']) + ((consumo - 40) * tarifas['a40' if faixa == 'agua' else 'e40']) %}
    {% endif %}
  {% endif %}
  {{ valor }}
{% endmacro %}

Como não tenho sensor para medir o consumo, eu criei um input_number:


Caso tenha um sensor de consumo, altere o input_number.copasa_consumo_atual no código para o sensor real.

Dentro de sensor.yaml, adicione o código abaixo:

- platform: template
  sensors:
    copasa_valor_conta:
      friendly_name: "Copasa Valor Conta"
      unique_id: 8f161dfa-9f9a-4500-bf4d-08374eda23b1
      icon_template: mdi:water-circle
      unit_of_measurement: "BRL"
      value_template: >-
        {% set consumo_atual = (states('input_number.copasa_consumo_atual')) | int %}
        {% set tarifa_agua = {
          "fixa": 21.23,
          "a0a5": 2.200,
          "a5a10": 4.685,
          "a10a15": 7.260,
          "a15a20": 9.911,
          "a20a40": 12.607,
          "a40": 15.381
        } %}
        {% set tarifa_esgoto = {
          "fixa": 15.70,
          "e0a5": 1.630,
          "e5a10": 3.467,
          "e10a15": 5.372,
          "e15a20": 7.334,
          "e20a40": 9.329,
          "e40": 11.380
        } %}
        {% from 'formatter.jinja' import calcular_tarifa %}
        {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
        {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
        {% set valor_total = (valor_agua | float) + (valor_esgoto | float) %}
        {{ valor_total | round(2) }}
      attribute_templates :
          Água: >-
            {% set consumo_atual = (states('input_number.copasa_consumo_atual')) | int %}
            {% set tarifa_agua = {
              "fixa": 21.23,
              "a0a5": 2.200,
              "a5a10": 4.685,
              "a10a15": 7.260,
              "a15a20": 9.911,
              "a20a40": 12.607,
              "a40": 15.381
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
            {{ valor_agua | round(2) }}
          Esgoto: >-
            {% set consumo_atual = (states('input_number.copasa_consumo_atual')) | int %}
            {% set tarifa_esgoto = {
              "fixa": 15.70,
              "e0a5": 1.630,
              "e5a10": 3.467,
              "e10a15": 5.372,
              "e15a20": 7.334,
              "e20a40": 9.329,
              "e40": 11.380
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
            {{ valor_esgoto | round(2) }}

Não criei input number para as faixas de consumo, pois são 7 faixas para água e 7 para esgoto, então deixei como variáveis mesmo.

image

Fala Walber blz,

Estou adaptando aqui para o meu caso, mas fiquei com uma duvida, quando você diz “Dentro de sensor.yaml” eu preciso criar um arquivo chamado “sensor.yaml” e colocar o código la dentro ou tenho que colocar dentro do arquivo “configuration.yaml” e dai colocar no bloco “sensor:” ?

Se vc usa arquivos separados coloca dentro de sensor.yaml
caso contrario coloque dentro do bloco em configuration.yaml

Entendi.

Blz vou tentar fazer aqui dai quando terminar compartilho com a galera caso tenha alguem igual o meu caso.

Walber

Muito obrigado e parabéns.

Fala Walber.

Cara eu fiz uma adaptação aqui porem não quer funcionar pois estar dando indisponivel:

{% macro calcular_tarifa(consumo, faixa, tarifas) %}
  {% set valor = tarifas.fixa %}
  {% if consumo > 0 %}
    {% elif consumo <= 10 %}
      {% set valor = valor %}
    {% elif consumo <= 20 %}
      {% set valor = valor + ((consumo - 10) * tarifas['faixa_2-11a20' if faixa == 'agua' else 'faixa_2-11a20']) %}
    {% elif consumo <= 50 %}
      {% set valor = valor + (10 * tarifas['faixa_2-11a20' if faixa == 'agua' else 'faixa_2-11a20']) + ((consumo - 20) * tarifas['faixa_3-21a50' if faixa == 'agua' else 'faixa_3-21a50']) %}
    {% else %}
      {% set valor = valor + (10 * tarifas['faixa_2-11a20' if faixa == 'agua' else 'faixa_2-11a20']) + (30 * tarifas['faixa_3-21a50' if faixa == 'agua' else 'faixa_3-21a50']) + ((consumo - 50) * tarifas['faixa_4-50a60' if faixa == 'agua' else 'faixa_4-50a60']) %}
    {% endif %}
  {% endif %}
  {{ valor }}
{% endmacro %}


- platform: template
  sensors:
    sabesp_valor_conta:
      friendly_name: "Sabesp Conta"
      unique_id: 8f161dfa-9f9a-4500-bf4d-08374eda23b1
      icon_template: mdi:water-circle
      unit_of_measurement: "BRL"
      value_template: >-
        {% set consumo_atual = (states('sensor.cons_agua_custo_m3')) | int %}
        {% set tarifa_agua = {
          "fixa": 38.34,
          "faixa_2-11a20": 6.01,
          "faixa_3-21a50": 14.98,
          "faixa_4-50a60": 16.50
        } %}
        {% set tarifa_esgoto = {
          "fixa": 38.34,
          "faixa_2-11a20": 6.01,
          "faixa_3-21a50": 14.98,
          "faixa_4-50a60": 16.50
        } %}
        {% from 'formatter.jinja' import calcular_tarifa %}
        {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
        {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
        {% set valor_total = (valor_agua | float) + (valor_esgoto | float) %}
        {{ valor_total | round(2) }}
      attribute_templates :
          Água: >-
            {% set consumo_atual = (states('sensor.cons_agua_custo_m3')) | int %}
            {% set tarifa_agua = {
            "fixa": 38.34,
              "faixa_2-11a20": 6.01,
              "faixa_3-21a50": 14.98,
              "faixa_4-50a60": 16.50
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
            {{ valor_agua | round(2) }}
          Esgoto: >-
            {% set consumo_atual = (states('sensor.cons_agua_custo_m3')) | int %}
            {% set tarifa_esgoto = {
              "fixa": 38.34,
              "faixa_2-11a20": 6.01,
              "faixa_3-21a50": 14.98,
              "faixa_4-50a60": 16.50
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
            {{ valor_esgoto | round(2) }}

Levando em consideração essas faixas

não comece as variáveis com números e não coloque caracteres especiais.
faixa_2-11a20 ele vai ler faixa_2 MENOS 11a20.

Faça as correções e teste novamente

Walber,

Fiz as alterações porem continua dando indisponivel.

{% macro calcular_tarifa(consumo, faixa, tarifas) %}
  {% set valor = tarifas.fixa %}
  {% if consumo > 0 %}
    {% elif consumo <= 10 %}
      {% set valor = valor %}
    {% elif consumo <= 20 %}
      {% set valor = valor + ((consumo - 10) * tarifas['faixa2' if faixa == 'agua' else 'faixa2']) %}
    {% elif consumo <= 50 %}
      {% set valor = valor + (10 * tarifas['faixa2' if faixa == 'agua' else 'faixa2']) + ((consumo - 20) * tarifas['faixa3' if faixa == 'agua' else 'faixa3']) %}
    {% else %}
      {% set valor = valor + (10 * tarifas['faixa2' if faixa == 'agua' else 'faixa2']) + (50 * tarifas['faixa3' if faixa == 'agua' else 'faixa3']) + ((consumo - 50) * tarifas['faixa4' if faixa == 'agua' else 'faixa4']) %}
    {% endif %}
  {% endif %}
  {{ valor }}
{% endmacro %}

- platform: template
  sensors:
    sabesp_conta:
      friendly_name: "Sabesp Conta"
      unique_id: 8f161dfa-9f9a-4500-bf4d-08374eda23b1
      icon_template: mdi:water-circle
      unit_of_measurement: "BRL"
      value_template: >-
        {% set consumo_atual = (states('input_number.teste_agua')) | int %}
        {% set tarifa_agua = {
          "fixa": 38.34,
          "faixa2": 6.01,
          "faixa3": 14.98,
          "faixa4": 16.50
        } %}
        {% set tarifa_esgoto = {
          "fixa": 38.34,
          "faixa2": 6.01,
          "faixa3": 14.98,
          "faixa4": 16.50
        } %}
        {% from 'formatter.jinja' import calcular_tarifa %}
        {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
        {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
        {% set valor_total = (valor_agua | float) + (valor_esgoto | float) %}
        {{ valor_total | round(2) }}
      attribute_templates :
          Água: >-
            {% set consumo_atual = (states('input_number.teste_agua')) | int %}
            {% set tarifa_agua = {
              "fixa": 38.34,
              "faixa2": 6.01,
              "faixa3": 14.98,
              "faixa4": 16.50
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
            {{ valor_agua | round(2) }}
          Esgoto: >-
            {% set consumo_atual = (states('input_number.teste_agua')) | int %}
            {% set tarifa_esgoto = {
              "fixa": 38.34,
              "faixa2": 6.01,
              "faixa3": 14.98,
              "faixa4": 16.50
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
            {{ valor_esgoto | round(2) }}

Não estou perto do pc, então não consigo testar.

Mantém as variáveis iguais as originais e altere apenas o sensor de entrada e a lógica para contar os 0 a 10, 11 a 20 etc

Testa ai:

- platform: template
  sensors:
    copasa_valor_conta:
      friendly_name: "Copasa Valor Sabesp"
      unique_id: 8f161dfa-9f9a-4500-bf4d-08374eda23b1
      icon_template: mdi:water-circle
      unit_of_measurement: "BRL"
      value_template: >-
        {% set consumo_atual = (states('input_number.copasa_consumo_atual')) | int %}
        {% set tarifa_agua = {
          "fixa": 38.34,
          "a11a20": 6.01,
          "a21a50": 14.98,
          "a50": 16.50
        } %}
        {% set tarifa_esgoto = {
          "fixa": 38.34,
          "e11a20": 6.01,
          "e21a50": 14.98,
          "e50": 16.50
        } %}
        {% from 'formatter.jinja' import calcular_tarifa %}
        {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
        {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
        {% set valor_total = (valor_agua | float) + (valor_esgoto | float) %}
        {{ valor_total | round(2) }}
      attribute_templates :
          Água: >-
            {% set consumo_atual = (states('input_number.copasa_consumo_atual')) | int %}
            {% set tarifa_agua = {
              "fixa": 38.34,
              "a11a20": 6.01,
              "a21a50": 14.98,
              "a50": 16.50
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
            {{ valor_agua | round(2) }}
          Esgoto: >-
            {% set tarifa_esgoto = {
              "fixa": 38.34,
              "e11a20": 6.01,
              "e21a50": 14.98,
              "e50": 16.50
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
            {{ valor_esgoto | round(2) }}

Macro:

{% macro calcular_tarifa(consumo, faixa, tarifas) %}
  {% set valor = tarifas.fixa %}
  {% if consumo > 10 %}
    {% if consumo <= 20 %}
      {% set valor = valor + ((consumo -10) * tarifas['a11a20' if faixa == 'agua' else 'e11a20']) %}
    {% elif consumo <= 50 %}
      {% set valor = valor + (10 * tarifas['a11a20' if faixa == 'agua' else 'e11a20']) + ((consumo - 20) * tarifas['a21a50' if faixa == 'agua' else 'e21a50']) %}
    {% else %}
      {% set valor = valor + (10 * tarifas['a11a20' if faixa == 'agua' else 'e11a20']) + (30 * tarifas['a21a50' if faixa == 'agua' else 'e21a50']) + ((consumo - 50) * tarifas['a50' if faixa == 'agua' else 'e50']) %}
    {% endif %}
  {% endif %}
  {{ valor }}
{% endmacro %}

Welber,

Finalmente conseguir, quase arranquei os cabelos aqui mas foi, deu certo, vou deixar o código aqui para galera aqui de São Paulo que tem a Sabesp como concessionaria de agua e esgoto utilizarem em suas automações.

Antes de mais nada agradecer enormemente o @Walber pelo apoio, foi essencial para fazer esse processo.

{% macro calcular_tarifa(consumo, faixa, tarifas) %}
  {% set valor = tarifas.fixa %}
  {% if consumo > 0 %}
    {% if consumo <= 10 %}
      {% set valor = valor %}
    {% elif consumo <= 20 %}
      {% set valor = valor + ((consumo - 10) * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) %}
    {% elif consumo <= 30 %}
      {% set valor = valor + (10 * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) + ((consumo - 20) * tarifas['a5a10' if faixa == 'agua' else 'e5a10']) %}
    {% elif consumo <= 40 %}
      {% set valor = valor + (10 * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) + (10 * tarifas['a5a10' if faixa == 'agua' else 'e5a10']) + ((consumo - 30) * tarifas['a10a15' if faixa == 'agua' else 'e10a15']) %}
    {% elif consumo <= 50 %}
      {% set valor = valor + (10 * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) + (10 * tarifas['a5a10' if faixa == 'agua' else 'e5a10']) + (10 * tarifas['a10a15' if faixa == 'agua' else 'e10a15']) + ((consumo - 40) * tarifas['a15a20' if faixa == 'agua' else 'e15a20']) %}
    {% elif consumo <= 60 %}
      {% set valor = valor + (10 * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) + (10 * tarifas['a5a10' if faixa == 'agua' else 'e5a10']) + (10 * tarifas['a10a15' if faixa == 'agua' else 'e10a15']) + (10 * tarifas['a15a20' if faixa == 'agua' else 'e15a20']) + ((consumo - 50) * tarifas['a20a40' if faixa == 'agua' else 'e20a40']) %}
    {% elif consumo <= 70 %}      
      {% set valor = valor + (10 * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) + (10 * tarifas['a5a10' if faixa == 'agua' else 'e5a10']) + (10 * tarifas['a10a15' if faixa == 'agua' else 'e10a15']) + (10 * tarifas['a15a20' if faixa == 'agua' else 'e15a20']) + (10 * tarifas['a20a40' if faixa == 'agua' else 'e20a40']) + ((consumo - 60) * tarifas['a40' if faixa == 'agua' else 'e40']) %}
    {% else %}
      {% set valor = valor + (10 * tarifas['a0a5' if faixa == 'agua' else 'e0a5']) + (10 * tarifas['a5a10' if faixa == 'agua' else 'e5a10']) + (10 * tarifas['a10a15' if faixa == 'agua' else 'e10a15']) + (10 * tarifas['a15a20' if faixa == 'agua' else 'e15a20']) + (10 * tarifas['a20a40' if faixa == 'agua' else 'e20a40']) + (10 * tarifas['a40' if faixa == 'agua' else 'e40']) %}
    {% endif %}
  {% endif %}
  {{ valor }}
{% endmacro %}

- platform: template
  sensors:
    sabesp_valor_conta:
      friendly_name: "Sabesp Valor Conta"
      unique_id: 8f161dfa-9f9a-4500-bf4d-08374eda23b1
      icon_template: mdi:water-circle
      unit_of_measurement: "BRL"
      value_template: >-
        {% set consumo_atual = (states('sensor.cons_agua_custo_m3')) | int %}
        {% set tarifa_agua = {
          "fixa": 38.34,
          "a0a5": 6.01,
          "a5a10": 14.98,
          "a10a15": 16.50,
          "a15a20": 16.50,
          "a20a40": 16.50,
          "a40": 16.50
        } %}
        {% set tarifa_esgoto = {
          "fixa": 38.34,
          "e0a5": 6.01,
          "e5a10": 14.98,
          "e10a15": 16.50,
          "e15a20": 16.50,
          "e20a40": 16.50,
          "e40": 16.50
        } %}
        {% from 'formatter.jinja' import calcular_tarifa %}
        {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
        {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
        {% set valor_total = (valor_agua | float) + (valor_esgoto | float) %}
        {{ valor_total | round(2) }}
      attribute_templates :
          Água: >-
            {% set consumo_atual = (states('sensor.cons_agua_custo_m3')) | int %}
            {% set tarifa_agua = {
              "fixa": 38.34,
              "a0a5": 6.01,
              "a5a10": 14.98,
              "a10a15": 16.50,
              "a15a20": 16.50,
              "a20a40": 16.50,
              "a40": 16.50
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
            {{ valor_agua | round(2) }}
          Esgoto: >-
            {% set consumo_atual = (states('sensor.cons_agua_custo_m3')) | int %}
            {% set tarifa_esgoto = {
              "fixa": 38.34,
              "e0a5": 6.01,
              "e5a10": 14.98,
              "e10a15": 16.50,
              "e15a20": 16.50,
              "e20a40": 16.50,
              "e40": 16.50
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
            {{ valor_esgoto | round(2) }}

Esses últimos valores de (16.50) eu repeti pq pela tabela da Sabesp vai somente ate esse valor, e tambem para cumprir tabela rsrr.

1 curtida

O seu acima de 30m³ esta calculando R$ 3,04 a mais por m³.
Da uma verificada mas acho que esta errado

Boa tarde, @Walber , tudo bem.

eu dei uma revisada aqui e ajeitei as variáveis, os valores batem certinho ate 70m³

Vou Fixar uma tabela para comparar utilizando um “input.namber” com o sensor:

------------------------------------------- Mémoria de Calculo ------------------------------------------
V. Unitario | Agua+Esgoto| A 10m³ | Soma a cada 10m³

00a10 = 38,34 | 2x = 76,68 | 10x = Fixo | Fixo = 76,68

10a20 = 06,01 | 2x = 12,02 | 10x = 120,20 | +^ = 196,88 (*Obs. 76,68 + 120,20 )

20a30 = 14,98 | 2x = 29,68 | 10x = 299,60 | +^ = 496,48 (*Obs. 196,88 + 299,60 )

30a40 = 16,50 | 2x = 33,00 | 10x = 330,00 | +^ = 826,48 (*Obs. 496,48 + 330,00 )

40a50 = 16,50 | 2x = 33,00 | 10x = 330,00 | +^ = 1.156,48 (*Obs. 826,48 + 330,00 )

50a60 = 16,50 | 2x = 33,00 | 10x = 330,00 | +^ = 1.486,48 (*Obs. 1.156,48 + 330,00 )

60a70 = 16,50 | 2x = 33,00 | 10x = 330,00 | +^ = 1.816,48 (*Obs. 1.486,48 + 330,00 )


{% macro calcular_tarifa(consumo, faixa, tarifas) %}
  {% set valor = tarifas.fixa %}
  {% if consumo > 0 %}
    {% if consumo <= 10 %}
      {% set valor = valor %}
    {% elif consumo <= 20 %}
      {% set valor = valor + ((consumo - 10) * tarifas['a10a20' if faixa == 'agua' else 'e10a20']) %}
    {% elif consumo <= 30 %}
      {% set valor = valor + (10 * tarifas['a10a20' if faixa == 'agua' else 'e10a20']) + ((consumo - 20) * tarifas['a20a30' if faixa == 'agua' else 'e20a30']) %}
    {% elif consumo <= 40 %}
      {% set valor = valor + (10 * tarifas['a10a20' if faixa == 'agua' else 'e10a20']) + (10 * tarifas['a20a30' if faixa == 'agua' else 'e20a30']) + ((consumo - 30) * tarifas['a30a40' if faixa == 'agua' else 'e30a40']) %}
    {% elif consumo <= 50 %}
      {% set valor = valor + (10 * tarifas['a10a20' if faixa == 'agua' else 'e10a20']) + (10 * tarifas['a20a30' if faixa == 'agua' else 'e20a30']) + (10 * tarifas['a30a40' if faixa == 'agua' else 'e30a40']) + ((consumo - 40) * tarifas['a40a50' if faixa == 'agua' else 'e40a50']) %}
    {% elif consumo <= 60 %}
      {% set valor = valor + (10 * tarifas['a10a20' if faixa == 'agua' else 'e10a20']) + (10 * tarifas['a20a30' if faixa == 'agua' else 'e20a30']) + (10 * tarifas['a30a40' if faixa == 'agua' else 'e30a40']) + (10 * tarifas['a40a50' if faixa == 'agua' else 'e40a50']) + ((consumo - 50) * tarifas['a50a60' if faixa == 'agua' else 'e50a60']) %}
    {% elif consumo <= 70 %}      
      {% set valor = valor + (10 * tarifas['a10a20' if faixa == 'agua' else 'e10a20']) + (10 * tarifas['a20a30' if faixa == 'agua' else 'e20a30']) + (10 * tarifas['a30a40' if faixa == 'agua' else 'e30a40']) + (10 * tarifas['a40a50' if faixa == 'agua' else 'e40a50']) + (10 * tarifas['a50a60' if faixa == 'agua' else 'e50a60']) + ((consumo - 60) * tarifas['a70' if faixa == 'agua' else 'e70']) %}
    {% else %}
      {% set valor = valor + (10 * tarifas['a10a20' if faixa == 'agua' else 'e10a20']) + (10 * tarifas['a20a30' if faixa == 'agua' else 'e20a30']) + (10 * tarifas['a30a40' if faixa == 'agua' else 'e30a40']) + (10 * tarifas['a40a50' if faixa == 'agua' else 'e40a50']) + (10 * tarifas['a50a60' if faixa == 'agua' else 'e50a60']) + (10 * tarifas['a70' if faixa == 'agua' else 'e70']) %}
    {% endif %}
  {% endif %}
  {{ valor }}
{% endmacro %}

- platform: template
  sensors:
    sabesp_valor_conta:
      friendly_name: "Sabesp Valor Conta"
      unique_id: 8f161dfa-9f9a-4500-bf4d-08374eda23b1
      icon_template: mdi:cash
      unit_of_measurement: "BRL"
      value_template: >-
        {% set consumo_atual = (states('input_number.numero_agua_teste')) | int %}
        {% set tarifa_agua = {
          "fixa": 38.34,
          "a10a20": 6.01,
          "a20a30": 14.98,
          "a30a40": 16.50,
          "a40a50": 16.50,
          "a50a60": 16.50,
          "a70": 16.50
        } %}
        {% set tarifa_esgoto = {
          "fixa": 38.34,
          "e10a20": 6.01,
          "e20a30": 14.98,
          "e30a40": 16.50,
          "e40a50": 16.50,
          "e50a60": 16.50,
          "e70": 16.50
        } %}
        {% from 'formatter.jinja' import calcular_tarifa %}
        {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
        {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
        {% set valor_total = (valor_agua | float) + (valor_esgoto | float) %}
        {{ valor_total | round(2) }}
      attribute_templates :
          Água: >-
            {% set consumo_atual = (states('input_number.numero_agua_teste')) | int %}
            {% set tarifa_agua = {
              "fixa": 38.34,
              "a10a20": 6.01,
              "a20a30": 14.98,
              "a30a40": 16.50,
              "a40a50": 16.50,
              "a50a60": 16.50,
              "a70": 16.50
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_agua = calcular_tarifa(consumo_atual, 'agua', tarifa_agua) %}
            {{ valor_agua | round(2) }}
          Esgoto: >-
            {% set consumo_atual = (states('input_number.numero_agua_teste')) | int %}
            {% set tarifa_esgoto = {
              "fixa": 38.34,
              "e10a20": 6.01,
              "e20a30": 14.98,
              "e30a40": 16.50,
              "e40a50": 16.50,
              "e50a60": 16.50,
              "e70": 16.50
            } %}
            {% from 'formatter.jinja' import calcular_tarifa %}
            {% set valor_esgoto = calcular_tarifa(consumo_atual, 'esgoto', tarifa_esgoto) %}
            {{ valor_esgoto | round(2) }}