esp-home

Sistema de Água com ESPHome e Home Assistant

14 min de leitura
Sistema de monitorização de água com ESPHome - imagem de capa do artigo

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.

ProjetoWaterSystem
HardwareESP32 · caudalímetro · 2× DS18B20 · válvula motorizada · sensor de inundação
FirmwareESPHome (min. 2024.6.0)
PlataformaHome Assistant
FicheiroSistemaAgua.yaml
RedeIP estático · AP + captive portal
NuvemNenhuma — 100% local

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: o pulse_counter exige 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.
Esquema de ligação do WaterSystem: fonte de 5 V, ESP32, caudalímetro, duas sondas DS18B20, módulo de dois relés para a válvula motorizada, sensor de inundação e sirene.
Ligação completa: ESP32 no centro, caudalímetro e sondas à esquerda, relés e válvula à direita
!

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:

SinalGPIODireçãoFunção
Barramento OneWireGPIO4BarramentoDuas sondas DS18B20 (AQS + Rede)
CaudalímetroGPIO33Entrada (pull-up)Impulsos de caudal, 396 imp/L
Abrir VálvulaGPIO32Saída → reléRelé relay1, interlock com relay2
Fechar VálvulaGPIO25Saída → reléRelé relay2, interlock com relay1
Alarme / SireneGPIO27Saída → buzzerPulsa enquanto houver fuga
Sensor de ÁguaGPIO26Entrada (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».

OK

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
i

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)
OK

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)
i

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.

OK

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 em 192.168.1.254.
  • Rede Wi-Fi — SF_24G com as definições estáticas; se precisares de redundância, acrescenta redes adicionais como no portão.
  • Access Point de emergência — com ap: {} e captive_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:

  1. 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.
  2. Descobre os endereços das sondas. No arranque, o ESPHome lista os endereços OneWire encontrados. Copia-os para o YAML nos campos address.
  3. 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 396 se houver desvio.
  4. Grava o firmware. Importa SistemaAgua.yaml no ESPHome, corrige as credenciais Wi-Fi e envia via OTA ou USB.
  5. Adiciona ao Home Assistant. O dispositivo aparece em Dispositivos & Serviços; aceita a ligação API e as entidades ficam disponíveis.
  6. 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.
  7. 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:

01

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.

02

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

03

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.

04

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_agua fica on, 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:

  1. 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_counter não conta.
  2. As temperaturas estão trocadas. Os endereços das duas DS18B20 ficaram invertidos no YAML. Corrige e volta a gravar.
  3. 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.
  4. Alarme dispara sem água. Contacto do sensor de inundação sujo ou húmido. Limpa, seca e confirma os filtros delayed_on/off.
  5. 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.
OK

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.