Sistema de Água com ESPHome e Home Assistant
O WaterSystem transforma o quadro de entrada de água de uma casa num sistema vigiado a tempo inteiro: um ESP32 a correr ESPHome mede o caudal instantâneo e o consumo acumulado, lê a temperatura da água da rede e a do depósito de AQS com duas sondas Dallas, comanda uma válvula motorizada de corte geral com dois relés em interlock e dispara um alarme local se o sensor de inundação detetar água no chão. Tudo local, sem nuvem e sem subscrições.
Neste artigo
- Visão geral do sistema
- Hardware e esquema de ligação
- Mapeamento dos GPIO
- O YAML, bloco a bloco
- Caudal e consumo acumulado
- Temperaturas com OneWire
- Válvula de corte com interlock
- Alarme de inundação
- Rede, gestão e atualizações
- Instalação passo a passo
- No Home Assistant
- Diagnóstico e boas práticas
- Conclusão
Visão geral do sistema
A ideia é simples: em vez de comprar um contador inteligente fechado, instrumenta-se o quadro de entrada de água. O caudalímetro de impulsos mede o débito instantâneo, duas sondas DS18B20 leem a temperatura da água da rede e a do depósito de AQS, uma válvula motorizada de esfera corta a água a partir de dois relés e um sensor de humidade vigia o chão. O ESP32 expõe tudo ao Home Assistant como sensores, switches e um binário de alarme.
- 2Relés para a válvula motorizada (abre/fecha)
- 2Sondas DS18B20 no mesmo barramento OneWire
- 1Caudalímetro de impulsos com integração em L e m³
- 0Serviços externos ou dependência da nuvem
O resultado é um sistema híbrido: a água continua a chegar normalmente, mas passas a ter histórico de consumo, temperatura da rede, temperatura do AQS e um botão de corte geral no telemóvel — mais um alarme que dispara se houver fuga.
Hardware e esquema de ligação
Nada de exótico. Tudo cabe numa caixa de embutir junto ao quadro de entrada, alimentado por uma fonte de 5 V:
- Placa ESP32 — o YAML usa
board: esp32dev. O ESP32 é obrigatório aqui: opulse_counterexige um contador de hardware. - Caudalímetro de impulsos (tipo YF-B1/S201, ~396 impulsos/litro) — entra no GPIO33 com pull-up.
- Duas sondas DS18B20 — no barramento OneWire do GPIO4, uma na entrada da rede e outra no depósito de AQS.
- Válvula motorizada de esfera com dois fios de comando (abre/fecha), acionada por dois relés opto-isolados.
- Sensor de inundação normalmente fechado — no GPIO26, com dispositivo
moisture. - Buzzer/ sirene de alarme — no GPIO27, pulsa em ciclo quando há fuga.
- Fonte de 5 V DC, caixa de embutir e cabo de ligação.

Nota de hardware: o caudalímetro trabalha tipicamente entre 3,3 V e 5 V, mas convém confirmar a tensão de saída do modelo que usares e, se for 5 V, colocar um divisor de tensão ou um level shifter antes do GPIO33 — o ESP32 não tolera 5 V nas entradas.
Trabalha sempre com o quadro de água fechado e sem pressão durante a instalação da válvula. Se a válvula motorizada tiver tempos de curso próprios, respeita-os: não alimentes as duas bobinas em simultâneo.
Mapeamento dos GPIO
O YAML fixa todos os pinos, com comentários. É este o mapa completo:
| Sinal | GPIO | Direção | Função |
|---|---|---|---|
| Barramento OneWire | GPIO4 | Barramento | Duas sondas DS18B20 (AQS + Rede) |
| Caudalímetro | GPIO33 | Entrada (pull-up) | Impulsos de caudal, 396 imp/L |
| Abrir Válvula | GPIO32 | Saída → relé | Relé relay1, interlock com relay2 |
| Fechar Válvula | GPIO25 | Saída → relé | Relé relay2, interlock com relay1 |
| Alarme / Sirene | GPIO27 | Saída → buzzer | Pulsa enquanto houver fuga |
| Sensor de Água | GPIO26 | Entrada (invertida) | Deteção de inundação (moisture) |
Duas proteções merecem destaque. A primeira é o interlock: os dois relés da válvula partilham o grupo interlock_group [relay1, relay2], pelo que é impossível pedir «abrir» e «fechar» ao mesmo tempo — a válvula nunca fica com as duas bobinas energizadas. A segunda é a inversão do sensor de inundação: o contacto é normalmente fechado e só abre quando deteta água, por isso inverted: true faz com que on signifique exatamente «há água no chão».
O sensor de inundação tem filtros delayed_on: 100ms e delayed_off: 100ms. Sem isto, uma gota isolada ou uma vibração no contacto dispararia o alarme. Com o filtro, só uma presença de água confirmada durante 100 ms é publicada.
O YAML, bloco a bloco
O ficheiro SistemaAgua.yaml está estruturado por blocos funcionais. Estes são os excertos que interessam, do caudalímetro à válvula:
Caudal e consumo acumulado
O pulse_counter lê os impulsos do caudalímetro e divide-os pelo fator de calibração (396 impulsos por litro, ou 6,6 impulsos por segundo a 1 L/min, vezes 60). Dois sensores integration derivam daí o total em litros e em metros cúbicos:
sensor:
- platform: pulse_counter
pin:
number: 33
mode:
input: true
pullup: true
unit_of_measurement: 'L/min'
accuracy_decimals: 2
id: water_usage
name: "Debito agua instantaneo"
update_interval: 5s
filters:
- lambda: return (x / 396); # 396 = 6.6 * 60
- platform: integration
name: "Total em M3"
unit_of_measurement: 'm³'
accuracy_decimals: 2
sensor: water_usage
device_class: water
state_class: total_increasing
time_unit: min
filters:
- lambda: return (x / 1000);
- platform: integration
name: "Utilização Total"
unit_of_measurement: 'L'
accuracy_decimals: 2
sensor: water_usage
state_class: total_increasing
device_class: water
time_unit: minCode language: PHP (php)
Temperaturas com OneWire
O barramento OneWire no GPIO4 serve duas sondas DS18B20, cada uma identificada pelo seu endereço de 64 bits. Uma mede a água que vem da rede pública, a outra a água quente do depósito de AQS. Cada sonda tem o seu próprio update_interval — 60 s chega para monitorização doméstica.
one_wire:
- platform: gpio
pin: GPIO4
sensor:
- platform: dallas_temp
address: 0x8400000139764228
name: Temperatura AQS
id: taqs
update_interval: 60s
- platform: dallas_temp
address: 0x90000001396C8F28
name: Temperatura Rede
id: tin
update_interval: 60s
Endereços das sondas: cada DS18B20 tem um endereço único gravado em fábrica, visível nos logs do ESPHome quando o barramento arranca. Substitui os valores 0x8400… e 0x9000… pelos das tuas sondas — se ficarem trocados, AQS e Rede aparecem invertidos no Home Assistant.
Válvula de corte com interlock
A válvula motorizada de esfera tem dois fios de comando. Dois relés bastam: um dá o pulso de abertura, o outro o de fecho. O interlock impede que ambos estejam ativos ao mesmo tempo, protegendo o motor da válvula:
switch:
- platform: gpio
pin: GPIO32
name: "Abrir Valvula"
id: relay1
interlock: &interlock_group [relay1, relay2]
- platform: gpio
pin: GPIO25
name: "Fechar Valvula"
id: relay2
interlock: *interlock_groupCode language: JavaScript (javascript)
Se a válvula for do tipo on/off simples (só corta ou dá passagem, sem posições intermédias), podes ligar apenas um relé e usar o outro como reserva. O interlock continua a fazer sentido para nunca deixares os dois contactos fechados em simultâneo.
Alarme de inundação
O sensor de humidade é um binário normalmente fechado: em condições normais está on; quando deteta água, abre. Com inverted: true, o Home Assistant passa a ver on exatamente quando há fuga — e o automação local dispara a sirene em ciclo, alternando entre on e off para chamar a atenção sem ficar sempre a apitar:
switch:
- platform: gpio
pin: GPIO27
name: "Alarme Inundação"
id: buzinunda
binary_sensor:
- platform: gpio
pin:
number: GPIO26
inverted: true
name: "Sensor Água"
device_class: moisture
id: leak
filters:
- delayed_on: 100ms
- delayed_off: 100ms
on_press:
- while:
condition:
binary_sensor.is_on: leak
then:
- switch.turn_on: buzinunda
- delay: 200ms
- switch.turn_off: buzinunda
- delay: 100ms
- switch.turn_on: buzinunda
- delay: 200ms
- switch.turn_off: buzinunda
- delay: 400ms
on_release:
then:
- switch.turn_off: buzinundaCode language: JavaScript (javascript)
Porque é que o buzzer pulsa em vez de ficar fixo? Um sinal intermitente é mais fácil de localizar numa casa grande do que um zumbido contínuo, e evita que o buzzer aqueça se a fuga demorar a ser resolvida. O ciclo 200/100/200/400 ms repete-se enquanto o sensor estiver ativo.
Caudal e consumo acumulado
O caudalímetro usado neste projeto é do tipo mais comum nos kits de automação: um rotor com ímã que gera impulsos proporcionais ao caudal. O fator de calibração típico é 6,6 impulsos por segundo por litro/minuto, ou seja, 396 impulsos por litro. Daí a fórmula x / 396 no filtro do pulse_counter.
Se o teu modelo tiver um fator diferente (encontra-se muitas vezes no datasheet ou medido com um recipiente graduado), basta substituir 396 pelo valor correto. A precisão do sistema depende inteiramente deste número.
Os dois sensores de integração dão-te duas leituras complementares: Utilização Total em litros (útil para automações que comparam consumos diários) e Total em M3 em metros cúbicos (útil para acompanhar a fatura da água). Ambos têm state_class: total_increasing, o que faz o Home Assistant gerar estatísticas de longo prazo automaticamente.
Temperaturas com OneWire
As duas DS18B20 partilham um único pino (GPIO4) porque o OneWire é um barramento multi-drop: cada sonda responde ao seu endereço único, e o ESPHome distingue-as sem precisar de pinos separados. Isso simplifica muito a cablagem dentro da caixa de embutir.
As aplicações práticas são diretas: comparar a temperatura da rede com a do AQS permite ver se o depósito está a ser aquecido corretamente, se o consumo de água quente está a arrefecer o acumulador mais depressa do que o habitual, ou se a água da rede vem anormalmente fria (o que aumenta o trabalho da bomba de calor).
Válvula de corte com interlock
A válvula motorizada de esfera é o atuador central do sistema. Ao contrário de um relé simples, precisa de um pulso de comando para mudar de posição: uma bobina faz rodar o motor num sentido (abrir), a outra no sentido oposto (fechar). O interlock do ESPHome garante que os dois relés nunca estão fechados ao mesmo tempo — o que, na prática, queimaria o motor da válvula em segundos.
No Home Assistant, os dois switches aparecem como entidades separadas. Podes usá-los em automações de corte geral (fecha a válvula quando sais de casa), em rotinas de férias, ou em conjunto com o sensor de inundação para um corte automático de emergência.
Se a tua válvula tiver tempos de curso longos (10–20 s), adiciona um on_turn_on com delay e switch.turn_off em cada relé, à imagem do que se faz no portão. Assim o motor nunca fica energizado depois de a válvula chegar ao fim de curso.
Alarme de inundação
O sensor de humidade é o elemento de segurança do sistema. Fica no chão, junto ao quadro de entrada ou debaixo do depósito de AQS, e deteta a presença de água por condutividade entre dois contactos. O ESPHome expõe-no como binary_sensor com device_class: moisture, o que faz o Home Assistant mostrar o ícone e a cor corretos.
Quando o sensor dispara, o buzzer local entra em ciclo intermitente. Esse comportamento é definido diretamente no YAML, sem depender do Home Assistant — o alarme funciona mesmo se a rede Wi-Fi ou o HA estiverem em baixo. No Home Assistant, o binário fica disponível para notificações push, corte automático da válvula ou registo histórico de eventos.
Rede, gestão e atualizações
A parte de rede segue o padrão do projeto do portão: nada depende de um servidor de fabricante. O SistemaAgua.yaml garante:
- IP estático — o dispositivo vive sempre em
192.168.1.231, com gateway e DNS em192.168.1.254. - Rede Wi-Fi —
SF_24Gcom as definições estáticas; se precisares de redundância, acrescenta redes adicionais como no portão. - Access Point de emergência — com
ap: {}ecaptive_portal, o dispositivo abre o seu próprio Wi-Fi para reconfiguração. - Improv Serial — provisionamento de Wi-Fi pela porta série.
- OTA — atualizações de firmware sem cabo.
- Web Server — interface local de consulta e logs.
- API nativo — ligação direta ao Home Assistant, sem MQTT.
wifi:
ap: {}
ssid: SF_24G
password: "••••••••"
manual_ip:
static_ip: 192.168.1.231
gateway: 192.168.1.254
subnet: 255.255.255.0
dns1: 192.168.1.254
captive_portal:
improv_serial:
ota:
- platform: esphome
web_server:Code language: CSS (css)
Antes de publicar o YAML: as palavras-passe do Wi-Fi ficam em texto no ficheiro — mantém o SistemaAgua.yaml fora de repositórios públicos. Recomenda-se ainda definir api: encryption_key para cifrar a ligação ao Home Assistant e ota: password para proteger as atualizações. Com IP estático, reserva também o endereço no router.
Instalação passo a passo
Do ficheiro em branco ao sistema operacional, em sete passos:
- Liga a fiação em bancada. Monta ESP32 + caudalímetro + as duas DS18B20 + sensor de inundação numa protoboard e confirma que todos os sensores respondem nos logs do ESPHome.
- Descobre os endereços das sondas. No arranque, o ESPHome lista os endereços OneWire encontrados. Copia-os para o YAML nos campos
address. - Calibra o caudalímetro. Deixa correr 10 L de água por um recipiente graduado e compara com o total lido no Home Assistant. Ajusta o fator
396se houver desvio. - Grava o firmware. Importa
SistemaAgua.yamlno ESPHome, corrige as credenciais Wi-Fi e envia via OTA ou USB. - Adiciona ao Home Assistant. O dispositivo aparece em Dispositivos & Serviços; aceita a ligação API e as entidades ficam disponíveis.
- Instala no quadro de água. Com o quadro fechado e sem pressão, monta a válvula motorizada, o caudalímetro, as sondas e o sensor de inundação no chão.
- Monta o dashboard e as automações. Adiciona os sensores de caudal e temperatura, os dois switches da válvula e o binário de inundação ao painel; cria as automações de corte e de alerta.
No Home Assistant
Depois de pareado, o dispositivo cria um conjunto de entidades pronto a usar. É no dashboard que o sistema ganha vida:
Consumo em tempo real
O sensor Débito água instantâneo mostra o caudal em L/min, e os totais em litros e m³ acumulam para estatísticas de longo prazo — ideais para gráficos diários, semanais e mensais.
Temperaturas AQS e Rede
As duas DS18B20 aparecem como sensores de temperatura independentes, prontos para gráficos de evolução e para automações (por exemplo, avisar se o AQS desce abaixo de 40 °C).
Corte geral da água
Os switches Abrir Válvula e Fechar Válvula permitem cortar a água da casa a partir do telemóvel, do Voice Assist ou de uma automação de ausência.
Alarme de inundação
O binário Sensor Água dispara o buzzer local e pode acionar notificações push, corte automático da válvula e registo histórico de eventos.
Automações que valem a pena
Com os sensores e a válvula expostos, qualquer automação é possível. Estas três são as mais úteis no dia a dia:
- Corte por inundação — quando o
binary_sensor.sensor_aguaficaon, fecha a válvula e envia notificação imediata. - Aviso de consumo anormal — se o débito instantâneo ficar acima de um limiar (por exemplo 20 L/min) durante mais de 10 minutos, notifica.
- Modo ausência — um scene que fecha a válvula e ativa o alarme quando sais de casa.
alias: Água - corte por inundação
trigger:
- platform: state
entity_id: binary_sensor.sensor_agua
to: "on"
action:
- service: switch.turn_on
target:
entity_id: switch.fechar_valvula
- service: notify.mobile_app
data:
message: "Inundação detectada. Válvula de água fechada automaticamente."Code language: JavaScript (javascript)
Diagnóstico e boas práticas
Quando algo falha, os cinco pontos abaixo resolvem quase sempre o problema:
- O caudalímetro lê zero. Confirma o fator de calibração e verifica se o pino está com pull-up ativo. Sem pull-up, o sinal flutua e o
pulse_counternão conta. - As temperaturas estão trocadas. Os endereços das duas DS18B20 ficaram invertidos no YAML. Corrige e volta a gravar.
- A válvula não responde. O interlock pode estar a bloquear o relé oposto. Verifica nos logs se ambos foram pedidos em simultâneo.
- Alarme dispara sem água. Contacto do sensor de inundação sujo ou húmido. Limpa, seca e confirma os filtros
delayed_on/off. - Perdeu a ligação Wi-Fi. Liga ao AP de emergência com o telemóvel, reentra as credenciais e o dispositivo volta a ligar-se, mantendo o IP estático.
Antes de qualquer alteração grande, exporta o SistemaAgua.yaml. O ESPHome guarda histórico no Home Assistant, mas um ficheiro de cópia em local seguro torna qualquer regressão instantânea.
Conclusão
O WaterSystem mostra que não é preciso um contador inteligente de operadora para ter controlo total sobre o consumo de água. Com um ESP32, um caudalímetro, duas sondas de temperatura, dois relés e um sensor de inundação, obtém-se monitorização contínua, histórico de consumos, corte geral remoto e alarme local de fugas — tudo local e sem subscrições.
É um projeto replicável: copia o SistemaAgua.yaml, ajusta os GPIO e os endereços das sondas às tuas ligações, calibra o caudalímetro e tens o sistema no dashboard ao fim de uma tarde. Tudo local, tudo teu.
Quer montar o teu?
A documentação do ESPHome e do Home Assistant cobre tudo o que é preciso para dar o primeiro passo — e o YAML deste artigo serve de ponto de partida.
