Transformando um hidrômetro mecânico em um medidor de água Zigbee

Pessoal, já acompanho aqui faz um bom tempo, sou usuário de home assistant a mais de 8 anos, segue uma contribuição para o forum de um projeto que desenvolvi recentemente.

Transformando um hidrômetro mecânico em um medidor de água Zigbee

Eu queria monitorar o consumo de água da minha casa pelo Home Assistant, mas tinha um problema simples: meu hidrômetro é um modelo mecânico convencional e não possui nenhuma saída eletrônica.

A ideia inicial parecia simples: de alguma forma, detectar o movimento do ponteiro do hidrômetro e transformar isso em uma informação digital.

O problema foi encontrar uma maneira de fazer isso de forma confiável, barata e sem precisar modificar o hidrômetro.


A solução: CNY70

Depois de algumas tentativas, cheguei ao CNY70, um pequeno sensor óptico reflexivo.

A ideia é posicionar o sensor próximo ao ponteiro/disco que se movimenta dentro do hidrômetro. Conforme a parte refletiva passa em frente ao sensor, a leitura muda. Aquele do lado direito, cada volta dele representa 10 litros.

Isso permitiu transformar o movimento mecânico em uma sequência de eventos que o ESP32 consegue interpretar.

A leitura do sensor sofre pequenas variações, então utilizei dois limites para criar uma espécie de histerese. Dessa forma, pequenas oscilações não são interpretadas como vários movimentos.

No meu caso, a relação utilizada ficou:

1 volta = 10 litros

Então, cada volta detectada pelo sensor acrescenta 10 litros ao consumo acumulado.


:hammer_and_wrench: Construção da capa e posicionamento do CNY70

Uma das partes mais importantes do projeto foi conseguir posicionar o CNY70 exatamente no ponto em que ele pudesse enxergar o movimento do mecanismo do hidrômetro.

Para isso, fiz uma pequena capa para acomodar e proteger o sensor, utilizando Durepoxi para construir o suporte e manter o CNY70 na posição correta.

A ideia foi fazer uma solução simples, barata e que pudesse ser adaptada diretamente ao hidrômetro, sem precisar modificar o mecanismo interno.

Suporte construído com Durepoxi para posicionar o CNY70 sobre o mecanismo do hidrômetro.

:electric_plug: Diagrama de ligação

A ligação do CNY70 ao ESP32-C6 é bastante simples. O sensor é utilizado como um detector óptico: conforme o mecanismo do hidrômetro se movimenta, a reflexão da luz muda e essa variação é lida pelo ESP32 através da entrada analógica.

Diagrama de ligação do CNY70 utilizado no projeto.

A partir dessa leitura, o ESP32 consegue identificar cada volta do mecanismo e transformar esse movimento em consumo de água.


:test_tube: Do sensor ao ESP32

Usei um ESP32-C6 para fazer a leitura do CNY70.

O sensor fornece uma leitura analógica, que é feita pelo ADC do ESP32. O firmware verifica periodicamente essa leitura e identifica a passagem da parte metálica do ponteiro por diferença de contraste e reflexão da luz.

O funcionamento básico ficou assim:

Hidrômetro mecânico
        ↓
      CNY70
        ↓
       ADC
        ↓
   ESP32-C6
        ↓
  Detecta movimento
        ↓
   +10 litros

:satellite_antenna: Transformando em um dispositivo Zigbee

O ESP32-C6 possui rádio Zigbee, então utilizei o ESP-IDF junto com o Zigbee SDK da Espressif.

Em vez de criar um protocolo próprio, utilizei o Simple Metering cluster, que já é destinado a dispositivos de medição.

O consumo acumulado é enviado através do atributo:

CurrentSummationDelivered

Assim, o dispositivo não precisa ficar enviando uma mensagem específica inventada pelo projeto. Ele se comporta como um dispositivo Zigbee de medição.


:floppy_disk: E se faltar energia?

Esse era outro ponto importante.

Não queria que o hidrômetro voltasse a zero toda vez que o ESP32 reiniciasse ou a bateria acabasse.

Por isso, o valor acumulado é armazenado na memória não volátil (NVS) do ESP32.

O fluxo ficou:

Movimento detectado
        ↓
+10 litros
        ↓
Atualiza contador
        ↓
Salva na memória
        ↓
Envia pelo Zigbee

Assim, depois de um reinício, o dispositivo consegue continuar a partir do valor anteriormente armazenado.


:battery: Pensando em bateria

Como a ideia é que o dispositivo possa funcionar com bateria, também trabalhei com o Light Sleep do ESP32-C6.

O objetivo é não deixar o microcontrolador trabalhando em potência máxima o tempo todo.

Ainda estou trabalhando na otimização do consumo, principalmente porque existe um equilíbrio entre:

  • frequência de leitura do sensor;
  • funcionamento do CNY70;
  • comunicação Zigbee;
  • tempo acordado;
  • tempo em Light Sleep.

Essa parte ainda está em desenvolvimento, mas a arquitetura do projeto já considera o funcionamento com baixo consumo.


:mobile_phone_with_arrow: Zigbee2MQTT

Para integrar o dispositivo ao meu sistema, utilizei o Zigbee2MQTT.

Como o meu dispositivo é um projeto próprio, criei um external converter chamado:

watermeter.mjs

Esse arquivo faz a ponte entre o dispositivo Zigbee e o Zigbee2MQTT.

Ele interpreta o valor enviado pelo CurrentSummationDelivered e disponibiliza duas informações:

water_consumed
→ consumo total em m³

water_consumed_liters
→ consumo total em litros

Assim, no Home Assistant posso trabalhar diretamente com o consumo de água sem precisar interpretar os dados brutos do Zigbee.


:bullseye: Resultado

No final, consegui transformar:

Hidrômetro mecânico
        ↓
      CNY70
        ↓
     ESP32-C6
        ↓
      Zigbee
        ↓
   Zigbee2MQTT
        ↓
 Home Assistant

em um medidor de água integrado à minha automação residencial.

O mais interessante para mim foi conseguir fazer isso sem substituir o hidrômetro e sem precisar de um sensor específico e caro.

O CNY70 acabou sendo uma solução bastante simples para transformar o movimento mecânico em uma informação que o ESP32 consegue interpretar.


:hammer_and_wrench: Para quem quiser fazer algo parecido

O projeto ainda está em desenvolvimento, mas deixei o código disponível no GitHub:

GitHub - brunostavares/watermeter-zigbee: Implementação de leitor de fluxo de água em hidrômetro analógico com esp32c6 alimentado por bateria, com uso de CNY70. Dispositivo Zigbee com auto light sleep. · GitHub

No repositório estão o firmware do ESP32-C6 e também o external converter utilizado pelo Zigbee2MQTT.

Para reproduzir a ideia, os principais componentes são:

  • ESP32-C6
  • CNY70
  • Alguns resistores
  • Um hidrômetro mecânico
  • Coordenador Zigbee
  • Zigbee2MQTT

A parte mais importante é o posicionamento do CNY70 em relação ao elemento móvel do hidrômetro. O sensor precisa enxergar uma diferença suficientemente clara entre as posições do ponteiro/disco.

A relação de 10 litros por volta também depende do hidrômetro utilizado. Portanto, quem fizer uma adaptação diferente provavelmente precisará determinar primeiro quantos litros correspondem a cada movimento completo.


:rocket: Próximos passos

Ainda quero melhorar algumas coisas, principalmente:

  • consumo de energia;
  • autonomia com bateria;
  • calibração do sensor;
  • instalação física do CNY70;
  • testes de longo prazo.

Mas a parte principal já está funcionando: um hidrômetro mecânico comum agora consegue fornecer seu consumo de água via Zigbee para o Home Assistant.

1 curtida

Parabéns pelo projeto com a solução completa!! implantei uma medição aqui também, como já tinha o hidrômetro com saída pulsada comprei um HO-01 aí foi mais fácil!

Olá!! Parabéns… Eu me interessei pela ideia mas fiquei com o uma dúvida… não consegui entender direito como que ficou instalado… aquela foto com o durepox eu não consegui visualizar direito como que ficou… Eu tenho um hidrômetro mas além do ponteiro ele tem o contador… Pra viabilizar no meu hidrômetro, precisaria ficar visível para que os valores medidos no hidrômetro poder ser visualizado para leitura do condimínio.

Pelo que entendi no caso do @BrunoT o hidrômetro dele é mecânico, tem tipo um “espelho na agulha” o qual reflete a luz e conta o pulso do giro. No meu caso o meu hidrômetro é eletrônico ele já tem uma saída pulsada de um pulso para cada litro de água, sai um fio de dentro dele mesmo. Ambos funcionam contanto pulsos e enviando para o home assistant.

o meu é este modelo [Ultrassônico SS – Saga Medição] https://sagamedicao.com.br/ultrassonico/) aí liguei ele em um datalogger que já tem suporte ao MQTT

Medidor De Consumo De Água Datalogger REMOTE IO HO01 - Hidrômetro MQTT - PISCALED | Arduino | Componentes eletrônicos | Motor de passo | Sensores

aí o home assistant ja coloca ele na aba de energia e tenho o consumo de água diario, mes, acumulado, etc…

na epoca que estava pesquisando em alguns foruns eu vi um projeto onde se se usava uma camera mesmo para ler o contador numérico. AI solution for analog water meter - Share your Projects! - Home Assistant Community


1 curtida

@glauberbiro você instalou esse hidrômetro depois do hidrômetro da concessionária ou substituiu o já existente?

Uso o da concessionária msm, pq na época tinha um amigo que trabalhava na copasa e ele conseguiu solicitar ao time de campo para q fosse instalado um eletrônico qdo construi la.

O problema é que precisam ser substituídos a cada 5 ou 7 anos. Aí vou ter um problema pq vao instalar um mecanico comum.

Opa @dsduarte , desculpa a demora em responder eu estava com problemas com minha senha aqui do forum, vamos lá…
Se vc observar bem a parte de leitura da numeração no meu hidrômetro fica separada do restante da relojoaria (parte com os ponteiros), por isso consegui fazer aquela “Capa” com durepoxi, dá uma olhada em como é meu medidor.

A questão principal não é nem em relação a fazer essa capa, o ideal que ela fosse feita em uma impressora 3d, mas não tenho… no caso você deveria pensar em alguma forma de fixar o CNY70 na direção do ponteiro, preferencialmente o que faz um giro a cada 10 litros, eu fiz dessa forma pq se for necessário retirar, eu faço sem danificar o medidor.

Acho que a primeira coisa que vc pode fazer é ver se seu medidor já não é pre-equipado para sensor pulsado (a maioria é, menos o meu kkkk), se for fica muito mais fácil, nesse caso vc vai ver que no ponteiro de 10l tem uma pequena peça metálica, aquilo é um imã, ai vc vai instalar apenas um reed switch (fecha contato quando tem campo magnético), a adaptação no código é tranquila de ser feita e fica uma solução ainda mais otimizada que a minha. Digo isso pq meu para economizar energia eu coloco o ESP32 em light sleep e acordo ele a cada 10 segundos para ler o CNY70, com o reed switch dá pra acordar só quando o contato do reed switch fechar.

Se o seu medidor tiver esse imã, vc pode tentar fazer uma outra coisa que talvez funcione, adaptar ali um sensor de porta zigbee, vai ter que tirar ele do invólucro pra chegar mais perto, mas o princípio é o mesmo, fecha contato com presença de campo magnético, só não sei se vai ser suficiente para conseguir detectar, só testando…

Qualquer coisa manda foto do seu medidor que eu tento te ajudar…

E só pra atualizar meu medidor está funcionando perfeitamente e super estável, na última versão ele já está a 10 dias em funcionamento contínuo alimentado com uma bateria 18650, estou me segurando pra não mexer em mais nada pra ver até onde ele aguenta…

1 curtida