Non-Invasive Power Meter

So an essential part of making your home smart is knowing how much power it uses over the day. Tracking this can be difficult, often you need to install a completely new power meter which can often cost a bunch of money. However, quite a few power meters have a red LED on the front that blinks every time that one Wh has been used.

The simple idea therefore is: Why don’t we just abuse that functionality to make the power-meter IoT enabled? We just have to hook up a simple photoresistor in front of that aforementioned LED and track the amount of pulses we receive. Then using ESPHome we can instantly have the power meter show up in Home Assistant 🎉

Hooking it all up is quite easy: Just buy a suitable photoresistor (make sure the wave length approximately matches the one from your power meter). Then connect it using a simple variable resistor divider (see this article for inspiration). And… that should already be it :)



Some energy meters have an exposed S0 port (which essentially just is a switch that closes), if that is the case the photodiode can be replaced with the following connection.

S0 ------------ VCC
S0 --+-- 10k -- GND
.    |
.    +--------- GPIO12

For ESPHome, you can then use the pulse counter sensor using below configuration:

  - platform: pulse_counter
    pin: GPIO12
    unit_of_measurement: 'kW'
    name: 'Power Meter'
      - multiply: 0.06  # (60s/1000 pulses per kWh)

Adjust GPIO12 to match your set up of course. The output from the pulse counter sensor is in pulses/min and we also know that 1000 pulses from the LED should equal 1kWh of power usage. Thus, rearranging the expression yields a proportional factor of 0.06 from pulses/min to kW.

And if a technician shows up and he looks confused about what the heck you have done to your power meter, tell them about ESPHome 😉


Photoresistors often have a bit of noise during their switching phases. So in certain situations, a single power meter tick can result in many pulses being counted. This effect is especially big on ESP8266s. If you’re experiencing this, try enabling the internal_filter: filter option:

  - platform: pulse_counter
    # ...
    internal_filter: 10us

See Total Daily Energy Sensor for counting up the total daily energy usage with these pulse_counter power meters.

See Also