I wanted whole-house water use in Home Assistant without a camera on the utility meter, a clamp-on sensor, or a reed switch counting pulses. What I ended up with is a used utility-grade ultrasonic meter from eBay, installed after the utility meter and read directly over its own encoder cable by an ESP32.
This is a Badger E-Series Ultrasonic 1": utility grade, no moving parts, ±1.5% over the normal flow range and ±3% down to 0.25 gpm. 316 stainless body, can run fully submerged, sealed 20-year battery. Every read returns the same total the LCD shows, down to 0.001 ft³ (about 28 mL) on mine. The units are set at the factory (gallons, ft³ or m³), so check the LCD on yours. New from a distributor they run $500–1k; I paid $75 on eBay.
It didn’t work out of the box: Badger doesn’t publish the encoder’s electrical interface, so I worked it out from public documents and measurement, which turned out easier than expected. All you need is an ESP32 and a 4.7–10 kΩ resistor ![]()
One warning before you wire anything: Badger ships the encoder cable in two colour codes, and a red/black/white cable fits both. Wired to the wrong one, the meter just stays silent. The repo has a multimeter test that tells them apart.
Code, notes and gotchas at Github repo,
