Water Meter sensor - Australia, Victoria

Sharing for those searching for a similar solution, and thanks to @chris.huitema for the guidance :slight_smile:

This solution reads my existing water meter and integrates the usage into Home Assistant, including the Energy dashboard.

Water Meter

Analog water meters (Read your water meter | South East Water - Type 1) in my area contain a port that can be used to measure usage through a reed switch. This port is located at the top left of the meter display and will have a black cap on it.

Hardware:

  • Raspberry Pi Pico W (but any ESPHome device with GPIO and GND pins will do)
  • 3-core irrigation cable (0.5mm)
  • Plastic Reed Switch (normally open)

Installation

Attach reed switch to 2 of the irrigation wires and double back one side. Make sure you keep this as thin as possible so it will fit in the port. I personally was lazy and just tied the wires around each other and sealed with electrical tape, but I would recommend soldering. Remove the black cap from the meter and insert the switch as far as it will go. Run the irrigation cable to where you will keep your Pico, with access to power and Wi-Fi. On the other end of the irrigation cable, attach one wire to GPIO7 (any GPIO pin will do) and GND (any GND pin) of the Pico.

I have the cable running about 25m from the meter into my attic to an outdoor enclosure for power boards. You should be able to run the cable up to 50m while still reading the switch. The Pico is then powered from mains and is within reach of my Wi-Fi network.

Configuration

I’m using ESPHome on the Pico W as I find the integration with Home Assistant to be excellent and it is very easy to make configuration changes over the air.
Below is the sensor configuration to add:

sensor:
  - platform: pulse_counter
    pin:
      number: GPIO7
      inverted: true
      mode:
        input: true
        pullup: true
    update_interval : 10s
    name: "pulse water"
    id: pulse_water

  - platform: pulse_meter
    pin:
      number: GPIO7
      inverted: true
      mode:
        input: true
        pullup: true
    name: "Water Pulse Meter"
    id: water_pulse_meter
    unit_of_measurement: 'l/min'
    icon: "mdi:water"
    internal_filter: 100ms
    timeout: 30s
    filters:
      - throttle: 10s
    total:
      name: "Water Usage Total"
      id: water_meter_total
      unit_of_measurement: "m³"
      accuracy_decimals: 3
      device_class: water
      state_class: total_increasing
      filters:
        - multiply: 0.001

Sensors

Once configured, you can add sensor.water_usage_total to the Energy dashboard and configure your price per m3 (which is equivalent to kl that my provider uses).

1 Like

Thanks for the guide.

I’ve got the same meter and will give it a go.

In the “pulse_meter” platform, why do you have:
filters:
- multiply: 10

Does this mean 1 pulse is = 10 L?

Yes I did, with the assumption that the meter had the magnet on the 10L mark, however I later discovered this isn’t the case so the multiply filter isn’t required.
Have updated the original post as such.

1 Like

Curious if this meter is the Honeywell V100?

I’m in the ACT, and have a meter which looks similar (hard to tell from a drawing) - it’s branded Elster, but seems to be the Honeywell unit. I found the T110 probe is meant to suit it.

I couldn’t find a model number on the unit itself, but it does look very similar to the Honeywell V100.
Looking at the T110 probe, I don’t think it would fit in mine as it doesn’t appear to have the same two-prong port, but it might work for you.

1 Like

I’m trying to tackle a similar problem right now. I’m in Melbourne.
I decided I would first try to see if I could even read anything from the water meter, so I used an Aqara door sensor with an extended reed switch as I used for my gas meter.

I inserted the reed sensor into the 2 prong port, and sure enough, as water is used the contact is closed and opened.

I was going to put the smarts into Home assistant with an automation to increment a counter for every pulse as I do with Gas, but it seems with my water meter that it pulses more than once for every rotation of the last digit. Seems like 2 pulses on reed switch for every rotation. And my yaml skills arent great so i’m stuck here.

@barneyonline Did you have similar behaviour with your water meter and do you or anyone else have any additional info I can use to move forward?

Thanks in advance

Hey @PashaK

I didn’t have that problem with my meter; every pulse equals 1 litre.
Since your not using ESPHome I can’t help you too much with a yaml as I’m not proficient myself, however I do cheat by using ChatGPT. This is what it suggested:

sensor:
  - platform: template
    sensors:
      volume_sensor:
        friendly_name: "Volume Sensor"
        unit_of_measurement: "L"
        value_template: >
          {% set pulse_count = states('sensor.pulse') | int %}
          {% set conversion_factor = 2  # Adjust this value based on your pulse-to-liter conversion %}
          {{ (pulse_count // conversion_factor) | float }}

Give it a try and see if it works. Be sure to share what you get working back here.

I actually have ESPhome, works well.
I only used the contact sensor solution as I just done it for Gas and thats working perfectly, and since I had the components all laid out i was more curious if i could even get a reed sensor into the plug hole and detect something and it did.

I got a bunch of ESP8266s and ESP32s ready to go on hand also, and started compiling the code in espHome as I think thats the way to go.

sensor:
  - platform: pulse_meter
    pin: GPIO12
    name: "Instant water consumption"
    unit_of_measurement: "L/min"
    icon: "mdi:water"
    timeout: 1s
    accuracy_decimals: 3
    filters:
      - lambda: return (x / 2.0);
    total:
      name: "Total water consumption"
      unit_of_measurement: "m³"
      device_class: water
      state_class: total_increasing
      accuracy_decimals: 3
      icon: "mdi:water"
      filters:
        - lambda: return (x / 2000.0);

That code is taken from here: https://community.home-assistant.io/t/water-flow-meter-pulse-meter-included-esphome/418427 as it mentions multiple pulses per litre, and i adjusted it to 2 as that’s what it is for me.

The other reason for contact sensor was its low power using zigbee and its running off of 2 x AA rechargeables so i don’t need to source power for it. if I go ESP or pico i got to run it to the garage for power and run a lead over the concrete.

I appreciate your reply and i might even given that a shot to see what happens.

Ive only just started getting my water meter monitored yesterday and still trying to get my head around the calibration as am using ESPHome on a D1 Mini. I’m just using a jaycar glass reed switch sealed in heatsink and some silicon placed in the front port indicated in the diagram above and seems to be picking up pulses.

I have exactly the same meter here in Western Australia, and from the technical spec sheet Ive found each pulse represents 5L, maybe its an older type. I have also seen a spec sheet for 0.5L pulse registration for v100 series, but the counter registration of my meter didn’t align for those models.

5L per pulse, these have xxxxx.xxx digits on the front panel and very right most digit represents 1 L (10L per full revolution) as per the diagram at start of this topic

0.5L per pulse model - these have xxxx.xxxx digitson front panel and guessing that the right digit represents per 0.1L??

I’d just run a test to figure out what you’re getting: assume 1 pulse = 1L (as above), configure it and then fill a 1L jug from the tap. Check how many pulses you got and adjust from there.

If you find your water meter has recorded 2 pulses for 1L (i.e. 1 pulse = 0.5L), then update the config for the pulse_meter with the filter “multiply: 0.5” as below:

sensor:
  - platform: pulse_counter
    pin:
      number: GPIO7
      inverted: true
      mode:
        input: true
        pullup: true
    update_interval : 10s
    name: "pulse water"
    id: pulse_water

  - platform: pulse_meter
    pin:
      number: GPIO7
      inverted: true
      mode:
        input: true
        pullup: true
    name: "Water Pulse Meter"
    id: water_pulse_meter
    unit_of_measurement: 'l/min'
    icon: "mdi:water"
    internal_filter: 100ms
    timeout: 30s
    filters:
      - throttle: 10s
      - multiply: 0.5
    total:
      name: "Water Usage Total"
      id: water_meter_total
      unit_of_measurement: "m³"
      accuracy_decimals: 3
      device_class: water
      state_class: total_increasing
      filters:
        - multiply: 0.001

Re-test with the new config and see if the numbers match.

Hi,

Thanks so much its, working. I had to adjust the last multiply to 0.5 both because I wanted it in Litres, and because 0.001 was still counting every pulse as 1 litre.

I have it setup roughly at the moment to run it for the night see how it goes, then i’ll neaten it all up tomorrow.

Then need to figure out how to track costs, but the hard part is done.

1 Like