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.
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) }}
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.
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) }}
Montei com se fosse uma conta mesmo:
Primeiro, queria agradecer ao pessoal aqui que iniciou e vem desenvolvendo esse tópico. Sou iniciante nesse “meio” de automação residencial e me ajudou muito a montar o meu sistema de monitoramento de caixa d’água.
Queria pedir a ajuda de vocês, se possível.
Atualmente tô usando o sr04 como sensor ultrassônico + esp8266. Tá funcionando bem, mas queria implementar tb um medidor de temperatura da água, em sensor de vazão para controlar o consumo e uma válvula solenoide ou um registro para poder fechar e abrir o abastecimento para encher a caixa.
Poderiam me dar um “rumo” de como poderia fazer.
Vou deixar abaixo o código que estou usando no meu esp8266.
substitutions:
Configurações da placa:
Plataforma: esp8266
TipoPlaca: nodemcuv2Configurações do dispositivo:
hostname: ‘caixaagua_principal’ # Substituir hífen por sublinhado
PrefixoNome: “Caixa D’Água - Principal”Configurações da Rede:
RedeWifi: !secret RedeWifi # Nome da rede wifi que o dispositivo irá se conectar
SenhaWifi: !secret SenhaWifi # Senha da rede wifi que o dispositivo irá se conectar
SenhaWifiReconfig: !secret SenhaWifiReconfig # Senha do AP Wifi para reconfiguração do wifi do dispositivo
EndConfig: ${hostname}.local #192.168.1.50 # Endereço para configuração (IP que o esp está acessível atualmente na rede), especialmente usado quando quer alterar o hostname via OTA
WifiOculto: ‘False’ # Se a rede wifi está oculta defina como ‘True’
WifiFastConnect: ‘False’ # Se o esp realizará a conexão à rede wifi sem escanear as redes disponíveis defina como ‘True’Senhas
SenhaAPI: !secret SenhaAPI # Senha para adicionar o esp no HA
SenhaOTA: !secret SenhaOTA # Senha para atualizar o firmware do esp via OTAPinos do Sensor
SensorTriggerPin: GPIO5
SensorEchoPin: GPIO4INFORMAÇÕES FÍSICAS DAS CAIXAS E DA INSTALAÇÃO DOS SENSORES (medidas em metros):
Diametro interno da base da caixa (fundo)
DD1: “1.255”
Diametro interno da borda superior sem a tampa
DM: “1.471”
Distância entre o fundo da caixa e a borda sem a tampa
HB: “0.775”
Distância entre o fundo da caixa e a borda superior da tampa (onde o sensor será instalado)
HT: “0.953”
Distância entre o fundo da caixa e o nível da base da tubulação de saída (altura da coluna de água do nível morto)
HMT: “0.100”
Distância entre o fundo da caixa e o nível máximo normal (altura da água onde a boia é fechada)
HM: “0.673”
Distância entre o sensor e o nível máximo normal (altura onde a boia é fechada até o sensor)
HS: “0.280”
Distância entre o fundo da caixa e o nível de transbordamento (ou nível do extravasor/ladrão, o que o ocorrer primeiro)
HMA: “0.700”
Logger
LoggerUART: UART0_SWAP
LoggerLevel: DEBUGesphome:
name: $hostname
platform: ${Plataforma}
board: ${TipoPlaca}wifi:
networks:
- ssid: ${RedeWifi}
password: ${SenhaWifi}
hidden: ${WifiOculto}
fast_connect: ${WifiFastConnect}
use_address: ${EndConfig}Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: WIFI
password: ${SenhaWifiReconfig}Habilita um AP Wifi para reconfigurar em caso de perda de conexão com a rede configurada
captive_portal:
Habilita a atualização de firmware por OTA
ota:
platform: esphome
password: ${SenhaOTA}Habilita as mensagens de logs pela porta serial e via MQTT
logger:
hardware_uart: ${LoggerUART}
level: ${LoggerLevel}Habilita a api para comunicar com o Home Assistant
api:
password: ${SenhaAPI}switch:
- platform: restart
id: caixaagua_principal_restart
name: ${PrefixoNome} Reiniciar
icon: mdi:restarttext_sensor:
- platform: wifi_info
ip_address:
id: caixaagua_principal_IP
name: ${PrefixoNome} Endereço IP
icon: mdi:ip-network
ssid:
id: caixaagua_principal_SSID
name: ${PrefixoNome} Rede Wifi
icon: mdi:wifi- platform: version
id: caixaagua_principal_versao
name: ${PrefixoNome} Versão
icon: mdi:informationbinary_sensor:
platform: status
id: caixaagua_principal_status
name: ${PrefixoNome} Status
device_class: connectivityplatform: template
id: NAMIN
name: ${PrefixoNome} Nível Mínimo de Alerta
lambda: |-
if (id(VAGUAP).state <= id(AMIN).state) {
return true;
} else {
return false;
}platform: template
id: NAMAX
name: ${PrefixoNome} Nível Máximo de Alerta
lambda: |-
if (id(VAGUAP).state >= id(AMAX).state) {
return true;
} else {
return false;
}platform: template
id: ERRO_MED
name: ${PrefixoNome} Erro Medição
lambda: |-
if (((id(HMED).state > (id(HM).state + id(HS).state))) or (id(HMED).state < id(HS).state)) {
return true;
} else {
return false;
}sensor:
platform: wifi_signal
id: caixaagua_principal_wifi_sinal
name: ${PrefixoNome} Intensidade Wifi
icon: mdi:signal
update_interval: 10splatform: homeassistant
id: AMIN
name: ${PrefixoNome} Nível Mínimo de Alerta
internal: true
entity_id: input_number.caixa_agua_alerta_nivel_minimo
accuracy_decimals: 2platform: homeassistant
id: AMAX
name: ${PrefixoNome} Nível Máximo de Alerta
internal: true
entity_id: input_number.caixa_agua_alerta_nivel_maximo
accuracy_decimals: 2platform: ultrasonic
id: HMED
trigger_pin: ${SensorTriggerPin}
echo_pin: ${SensorEchoPin}
name: ${PrefixoNome} Distância Medida Sensor
internal: false
accuracy_decimals: 6
update_interval: 0.5s
timeout: 4m # Ajuste do timeout para 4 metros
filters:
- median:
window_size: 20
send_every: 20
send_first_at: 20platform: template
id: DD1
name: ${PrefixoNome} Diâmentro Interno Base
internal: true
unit_of_measurement: m
lambda: return ${DD1};
accuracy_decimals: 4
update_interval: 1splatform: template
id: DM
name: ${PrefixoNome} Diâmetro Interno Superior
internal: true
unit_of_measurement: m
lambda: return ${DM};
accuracy_decimals: 4
update_interval: 1splatform: template
id: HB
name: ${PrefixoNome} Altura Interna até a borda
internal: true
unit_of_measurement: m
lambda: return ${HB};
accuracy_decimals: 4
update_interval: 1splatform: template
id: HT
name: ${PrefixoNome} Altura com Tampa
internal: true
unit_of_measurement: m
lambda: return ${HT};
accuracy_decimals: 4
update_interval: 1splatform: template
id: HMT
name: ${PrefixoNome} Coluna de Água Nível Morto
internal: true
unit_of_measurement: m
lambda: return ${HMT};
accuracy_decimals: 4
update_interval: 1splatform: template
id: HM
name: ${PrefixoNome} Coluna de Água Útil
internal: true
unit_of_measurement: m
lambda: return ${HM};
accuracy_decimals: 4
update_interval: 1splatform: template
id: HS
name: ${PrefixoNome} Distância Sensor Nível Máximo
internal: true
unit_of_measurement: m
lambda: return ${HS};
accuracy_decimals: 4
update_interval: 1splatform: template
id: HMA
name: ${PrefixoNome} Coluna de Água Transbordamento
internal: true
unit_of_measurement: m
lambda: return ${HMA};
accuracy_decimals: 4
update_interval: 1splatform: template
id: H
name: ${PrefixoNome} Coluna de Água Atual
internal: false
unit_of_measurement: m
lambda: return (id(HM).state + id(HS).state - id(HMED).state);
accuracy_decimals: 4
update_interval: 1splatform: template
id: R1
name: ${PrefixoNome} Raio Menor
internal: true
unit_of_measurement: m
lambda: return (id(DD1).state / 2);
accuracy_decimals: 4
update_interval: 1splatform: template
id: RM
name: ${PrefixoNome} Raio Maior Máximo Físico
internal: true
unit_of_measurement: m
lambda: return (id(DM).state / 2);
accuracy_decimals: 4
update_interval: 1splatform: template
id: R2M
name: ${PrefixoNome} Raio Maior com Nível Máximo
internal: true
unit_of_measurement: m
lambda: return (id(R1).state + (id(HM).state * tan(atan(((id(DM).state - id(DD1).state) / 2) / (id(HB).state)))));
accuracy_decimals: 4
update_interval: 1splatform: template
id: R2
name: ${PrefixoNome} Raio Maior com o Nível Atual
internal: true
unit_of_measurement: m
lambda: return (id(R1).state + (id(H).state * tan(atan(((id(DM).state - id(DD1).state) / 2) / (id(HB).state)))));
accuracy_decimals: 4
update_interval: 1splatform: template
id: RHMT
name: ${PrefixoNome} Raio Maior no Nível Mínimo
internal: true
unit_of_measurement: m
lambda: return (id(R1).state + (id(HMT).state * tan(atan(((id(DM).state - id(DD1).state) / 2) / (id(HB).state)))));
accuracy_decimals: 4
update_interval: 1splatform: template
id: VTT
name: ${PrefixoNome} Volume com o Reservatório Cheio
internal: true
unit_of_measurement: litros
lambda: return ((1.047197 * id(HB).state) * ((id(RM).state * id(RM).state) + (id(RM).state * id(R1).state) + (id(R1).state * id(R1).state)) * 1000) - id(VMT).state;
accuracy_decimals: 0
update_interval: 1splatform: template
id: VMT
name: ${PrefixoNome} Volume Morto
internal: false
unit_of_measurement: litros
lambda: return ((1.047197 * id(HMT).state) * ((id(RHMT).state * id(RHMT).state) + (id(RHMT).state * id(R1).state) + (id(R1).state * id(R1).state)) * 1000);
accuracy_decimals: 0
update_interval: 1splatform: template
id: VT
name: ${PrefixoNome} Volume com o Nível Máximo
internal: false
unit_of_measurement: litros
lambda: return ((1.047197 * id(HM).state) * ((id(R2M).state * id(R2M).state) + (id(R2M).state * id(R1).state) + (id(R1).state * id(R1).state)) * 1000) - id(VMT).state;
accuracy_decimals: 0
update_interval: 1splatform: template
id: VAGUA
name: ${PrefixoNome} Volume
unit_of_measurement: litros
lambda: |-
if ((((1.047197 * id(H).state) * ((id(R2).state * id(R2).state) + (id(R2).state * id(R1).state) + (id(R1).state * id(R1).state)) * 1000) - id(VMT).state) < 0) {
return 0;
} else if ((((1.047197 * id(H).state) * ((id(R2).state * id(R2).state) + (id(R2).state * id(R1).state) + (id(R1).state * id(R1).state)) * 1000) - id(VMT).state) > id(VTT).state) {
return id(VTT).state;
} else {
return (((1.047197 * id(H).state) * ((id(R2).state * id(R2).state) + (id(R2).state * id(R1).state) + (id(R1).state * id(R1).state)) * 1000) - id(VMT).state);
}
accuracy_decimals: 0
update_interval: 1splatform: template
id: VAGUAP
name: ${PrefixoNome} Volume Percentual
unit_of_measurement: “%”
lambda: return ((id(VAGUA).state / id(VT).state) * 100);
accuracy_decimals: 1
update_interval: 1splatform: template
id: VAGUAT
name: ${PrefixoNome} Volume Total
unit_of_measurement: litros
lambda: return (2 * id(VAGUA).state);
accuracy_decimals: 0
update_interval: 1splatform: template
id: VAGUAPT
name: ${PrefixoNome} Volume Percentual Total
unit_of_measurement: “%”
lambda: return ((id(VAGUAT).state / (2 * id(VT).state)) * 100);
accuracy_decimals: 1
update_interval: 1s