Earth Notes: On Local Bytes Power Monitoring Smart Plug: Review

Updated 2023-01-28 19:59 GMT.
By Damon Hart-Davis.
Learn how I set up and used this device preflashed with Tasmota! #powerMeter #cutCarbon #frugal
Local Bytes power monitoring smart plug 20221005 on pack base
I have pined for the remote live power monitoring of an individual appliance that I had with the AlertMe I reviewed years ago: this turns out to be just what I have been missing! It provides three main ways of tracking energy use by a plugged-in appliance: eyeballing the auto-updating Web page that the plug serves itself, polling by another machine for a JSON response, and MQTT (which I have not yet done).

Product: Power Monitoring Smart Plug

Local Bytes power monitoring smart plug 20221005 on pack base
Power Monitoring Smart Plug - Preflashed with Tasmota (type G - UK - BS1316 - 13A)
  • Brand:
  • Colour: white
  • Weight: 69g
  • Height: 32mm
  • Width: 57mm
  • Depth: 57mm
  • SKU: smart-plug-pm
  • GTIN/UPC/EAN: 5065005164008
  • InStock
  • valid at/until:
Review summary
  • Power Monitoring Smart Plug
  • At last it seems that I can do the detailed power monitoring and load profiling of my appliances that I have not been able to since the AlertMe.

    Much easier to set up and configure and even (re)calibrate than I expected.

    Local Bytes has very responsive customer service and even noticed my Twitter cry for help that was not directed at it!

    Note: running totals eg for "Today" in status responses seem not to be reliable; summing per-minute samples seems more in accord with other measurements.

  • Pros:
    • live appliance power monitoring over WiFi
    • works with HTTP polling or MQTT
    • cheap
    • simple and quick to set up
    • all packaging is recyclable cardboard
  • Cons:
    • running totals may be inaccurate
    • forgets some accumulated total energy when powered off
    • scared myself doing a hard reset and needed to reconfigure
    • may need some calibration
    • a bit large for very tightly-packed sockets
  • Rating: 4/5
  • Published:
  • Updated:


I was alerted to the Local Bytes product by this Twitter thread.

Being the easily-led instant-gratification junky that I am, I back-ordered one the same day (2022-09-18) for GBP12.50 + GBP4 postage total.


Local Bytes power monitoring smart plug 20221005 Web page with MacBook Air M1 as load

The device arrived in the post 2022-10-05.

Once the working day was over I was able to actually think about what might be involved setting it up as I have no MQTT, Tasmota, etc, at the moment!

The first test to plug it into a power socket and switch the socket on and off to check for anything obvious happening. In this case the on-off button on the side lights up blue, and a relay clicks on, and off when the power goes off.

Also, as is the modern way, the plug offers a WiFi access point. Signing into that from my phone, I am asked which of my WiFi networks I'd like it to connect to, and what that WiFi password is. There are moments when I regret creating very strong WiFi passwords... In any case I will let the plug talk on the IoT-only SSID to segregate it a little from other traffic. It calls itself tasmota-HHHHHH-NNNN where H is an uppercase hex digit and N is a decimal digit. The HHHHHH is the end of the device's MAC address.

The plug allocated itself an IP address on my IoT LAN via DHCP, and I am fixing that in the router for simplicity of polling from other devices on my LAN such as the RPis and my laptop.

I then connect to that IP address over HTTP (not HTTPS) and instantly see an auto-updating page which shows the current load and lets me toggle it on and off!

Bravo, fab easy setup in well under and hour including writing these notes! Full marks!

This is my first taste of the world enabled by the ESP range, the ESP8266EX in this case...

(The button on the side of the plug also toggles power on/off to the load, but interestingly with much more lag than using the Web interface button!)


I asked the device to upgrade itself via the home-page button, to ensure that I have the latest firmware. That is usually a good idea for security reasons at least. The device came back in less time than to type this paragraph.

MQTT or Cowardice

What I probably should do now is set up an MQTT system, and connect that all up.

But I am in the habit of polling for data from cron jobs on my RPi(s). So I might stick with that if I can find an easy and not-too-ugly way to do it.

It turns out that I can easily use commands over HTTP, eg from my browser, such as http://<ip>/cm?cmnd=Power%20TOGGLE. This is good!

I can even (confusingly) turn on and off the LED on the power button independently of the power to the load, eg: http://<ip>/cm?cmnd=LedPower%20ON.

I Broke It!

Trying and failing to restore the normal LED functionality, I tried resetting the device, but lost the Local Bytes configuration. I had to set up the WiFi again. I ended up with a reduced Web interface, and no power monitoring, and the power toggle button was ineffective. Boo hiss!

I suggest not doing what I did. Unless you know what you are doing, maybe!


Twitter and Robin Hawkes in particular came to the rescue in minutes: If you lost the config / Tasmota template you can find it here and paste it into the plug settings page. I accidentally hard-reset a plug and this got the measurements back again.

Courtesy of Local Bytes (UK) Power Monitoring Plug (smart-plug-pm-uk), pasting the configuration below into Configuration > Configure Other > Template brings it all back as it was to my eye, hurrah!

{"NAME":"LocalBytes PM","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18}

Now I note that the home page is claiming a mains voltage of ~310V+. It seems still to be ~245V, as it reported before the great resetting. Maybe I partly fried something while it was misconfigured? In any case I have cross-re-calibrated it against the Enphase live reading with http://IP/cm?cmnd=VoltageSet%20248. That sets a calibration value of 1529, vs the default of 1950. Quite a shift.

Now this looks like what I need:

http://IP/cm?cmnd=Status 8

which returns:

{"StatusSNS":{"Time":"2022-10-05T21:21:53","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":0.004,"Yesterday":0.000,"Today":0.004,"Power": 6,"ApparentPower":14,"ReactivePower":13,"Factor":0.44,"Voltage":247,"Current":0.058}}}

which contains the live Power value, hurrah!

(A quick test using my ~6W LED desk lamp indicates an active power of ~7W to ~8W, but a power factor of ~0.5, which is a bit uglier than I expected.)


The next task is to set up a 1-minute poll on the main RPi. It can use wget to poll the plug, and jq to parse and extract the power value, which can then be appended to a timestamped log. This would only be enabled when I am actively monitoring an appliance, though could be left to run for hours or days if need be.

I think that the dishwasher pre-wash cycle may make for a good initial case.

2022-10-07: resuming...

Distracted by a day of actual work yesterday, I am back on the case today. And good, I plugged it in and turned it on and it all just worked. Not to be assumed...

I have created a polling/logging script at script/

A basic run of the script with no arguments attempts to poll the plug and spit out the JSON string received:

% sh script/
{"StatusSNS":{"Time":"2022-10-07T14:09:06","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":0.003,"Yesterday":0.000,"Today":0.003,"Power": 0,"ApparentPower": 0,"ReactivePower": 0,"Factor":0.00,"Voltage":248,"Current":0.000}}}

Running the script with the plug turned off (not running) gives a slightly-variable but not excessive timeout and no output:

% time sh script/
0.016u 0.014s 0:01.04 1.9%	0+0k 0+0io 0pf+0w
% time sh script/
0.018u 0.014s 0:16.05 0.1%	0+0k 0+0io 0pf+0w

Running the script with the -log argument is silent on stdout and appends records such as this to the log file named by day, and created if necessary:

% cat LBplug-2022-10-07.log
2022-10-07T13:36:41 {"StatusSNS":{"Time":"2022-10-07T14:36:41","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":0.003,"Yesterday":0.000,"Today":0.003,"Power": 0,"ApparentPower": 0,"ReactivePower": 0,"Factor":0.00,"Voltage":248,"Current":0.000}}}
2022-10-07T13:36:54 {"StatusSNS":{"Time":"2022-10-07T14:36:53","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":0.003,"Yesterday":0.000,"Today":0.003,"Power": 0,"ApparentPower": 0,"ReactivePower": 0,"Factor":0.00,"Voltage":248,"Current":0.000}}}

If the plug is not responding no records are appended. So at worst if forgetting to disable a logging cron job, the filesystem is not filled with garbage!

To set this up in cron to sample once per minute, append to crontab (can be commented out when not in use):

# Optional per-minute gathering of data from Local Bytes monitoring plug.
* * * * * cd /rw/docs-public/ && sh script/ -lo

Test 1: Fridge/Freezer

The first appliance I will monitor with this will be my old foe the fridge...

2022-10-07T14:01:01 {"StatusSNS":{"Time":"2022-10-07T15:01:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":0.003,"Yesterday":0.000,"Today":0.003,"Power": 2,"ApparentPower":12,"ReactivePower":12,"Factor":0.13,"Voltage":248,"Current":0.049}}}
2022-10-07T14:02:01 {"StatusSNS":{"Time":"2022-10-07T15:02:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":0.003,"Yesterday":0.000,"Today":0.003,"Power": 2,"ApparentPower":11,"ReactivePower":11,"Factor":0.15,"Voltage":248,"Current":0.046}}}

I can see the consumption rise from 2W to ~7W when I open the door and the (LED) lights come on!

Raw data (.log.gz) from 7th, 8th, 9th, 10th. See all artefacts.

It seems that a single sample was missed/dropped across the two full days, which is pretty good and may well have been the WiFi system's fault:

% wc -l LBplug-2022-10-0{8,9}.log
  1439 LBplug-2022-10-08.log
  1440 LBplug-2022-10-09.log
LBplug 2022 10 07
Data collected from first day (2022-10-07) up to midnight UTC for fridge/freezer. Notice the sometimes-visible high compressor start-up power demand of ~800W, possible ~200W defrost activity, and ~80W normal running consumption on a typical ~50% duty cycle. Sampling is at 1-minute intervals. All times UTC.

On Twitter @LocalBytesShop said: We're a big fan of using the PowerDelta command to increase resolution. The WattRes command applies when polling over HTTP, I think. For my current purposes, and with only minimal calibration, this is advanced-class material! If I do make use of WattRes, eg to go to 1DP, then I will have to extend my regex to extract a non-integer power value.

For further examination of the data see 2022-10: Yet More Measurements.

Next in line will probably be the TiVo cable TV box and friends, to see how much energy they are actually using, eg when left on overnight unnecessarily!


Looking at the data I note a couple of things that could probably be fixed:

Initially I have fixed only the missing 'Z'. I have also invoked the WattRes 1 command and will adjust parsing scripts to cope.

Here are some relevant lines from from the log while doing the above:

2022-10-10T07:13:02 {"StatusSNS":{"Time":"2022-10-10T08:13:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.483,"Yesterday":1.230,"Today":0.455,"Power": 3,"ApparentPower": 9,"ReactivePower": 9,"Factor":0.28,"Voltage":246,"Current":0.038}}}
2022-10-10T08:56:01Z {"StatusSNS":{"Time":"2022-10-10T09:56:02","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.030,"Yesterday":1.230,"Today":0.003,"Power": 0,"ApparentPower": 0,"ReactivePower": 0,"Factor":0.00,"Voltage":249,"Current":0.000}}}
2022-10-10T09:13:01Z {"StatusSNS":{"Time":"2022-10-10T10:13:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.030,"Yesterday":1.230,"Today":0.003,"Power":37.9,"ApparentPower":50.6,"ReactivePower":33.5,"Factor":0.75,"Voltage":249,"Current":0.203}}}

The plug's home page now shows 1DP for the W, VA and VAr values.

Initial observation suggests that the extra digit is not entirely noise!

Test 2: Dishwasher Prewash

Jumping the queue, I shall take a quick profile of our dishwasher prewash cycle.

Before, with the dial in the "off" position and no LEDs lit up:

2022-10-10T09:29:01Z {"StatusSNS":{"Time":"2022-10-10T10:29:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.030,"Yesterday":1.230,"Today":0.003,"Power":0.0,"ApparentPower":9.5,"ReactivePower":9.5,"Factor":0.00,"Voltage":249,"Current":0.038}}}

Raw data (.log.gz) from 10th. See all artefacts.

LBplug prewash power
Load profile of dishwasher prewash: <1W before and after, with ~100W for the bulk of the cycle, and ~10W to ~20W during fill/empty.

The entire set of power readings is:

2022-10-10T09:29:01ZZ 0.0
2022-10-10T09:30:01ZZ 0.7
2022-10-10T09:31:02ZZ 0.6
2022-10-10T09:32:02ZZ 0.5
2022-10-10T09:33:01ZZ 24.1
2022-10-10T09:34:01ZZ 9.0
2022-10-10T09:35:01ZZ 102.3
2022-10-10T09:36:01ZZ 103.0
2022-10-10T09:37:01ZZ 102.3
2022-10-10T09:38:01ZZ 99.3
2022-10-10T09:39:02ZZ 103.3
2022-10-10T09:40:01ZZ 101.1
2022-10-10T09:41:01ZZ 100.6
2022-10-10T09:42:01ZZ 101.8
2022-10-10T09:43:02ZZ 101.3
2022-10-10T09:44:01ZZ 102.3
2022-10-10T09:45:01ZZ 101.0
2022-10-10T09:46:01ZZ 102.0
2022-10-10T09:47:01ZZ 10.9
2022-10-10T09:48:01ZZ 0.6
2022-10-10T09:49:01ZZ 0.7
2022-10-10T09:50:01ZZ 0.5
2022-10-10T09:51:01ZZ 0.6
2022-10-10T09:52:01ZZ 0.6

Looking at the before and after 'total' energy values of 3.030kWh and 3.056kWh indicates a total consumption of 0.026kWh (26Wh) as previously estimated.

Test 3: TV Stuff

As of I have the plug monitoring everything in the TV corner. That includes the TV and DVD player and cable box (TiVo), plus a standard lamp and games console. Currently all is off at the wall, so the plug will be silent, and I should treat missing samples as 0W. To that end I am manually inserting 0 samples just after each block of use.

Raw data (.log.gz) from 10th, 11th, 12th, 13th, 14th, 15th, 16th, 17th, 18th, 19th. See all artefacts.

The TV is on at ~4pm and the log is showing nothing. I think that the plug cannot hear the WiFi router: they are about as far apart as is possible in this house. The (2.4Ghz) channel is already at maximum power. I have tried rebooting the router, and oddly the plug is now visible.

Also, oddly, the total energy accumulator seems to have gone backwards a little bit:

2022-10-10T09:51:01Z {"StatusSNS":{"Time":"2022-10-10T10:51:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.056,"Yesterday":1.230,"Today":0.029,"Power":0.6,"ApparentPower":6.7,"ReactivePower":6.7,"Factor":0.09,"Voltage":249,"Current":0.027}}}
2022-10-10T09:52:01Z {"StatusSNS":{"Time":"2022-10-10T10:52:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.056,"Yesterday":1.230,"Today":0.029,"Power":0.6,"ApparentPower":9.7,"ReactivePower":9.7,"Factor":0.06,"Voltage":248,"Current":0.039}}}
2022-10-10T14:59:01Z {"StatusSNS":{"Time":"1970-01-01T00:24:08","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.048,"Yesterday":1.230,"Today":0.020,"Power":53.2,"ApparentPower":72.7,"ReactivePower":49.6,"Factor":0.73,"Voltage":247,"Current":0.294}}}
2022-10-10T15:00:01Z {"StatusSNS":{"Time":"1970-01-01T00:25:08","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.049,"Yesterday":1.230,"Today":0.021,"Power":56.7,"ApparentPower":78.8,"ReactivePower":54.7,"Factor":0.72,"Voltage":248,"Current":0.318}}}

TV on standby + TiVo cable box seem to be using ~16W total.

2022-10-10T16:07:01Z {"StatusSNS":{"Time":"2022-10-10T17:07:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.101,"Yesterday":1.230,"Today":0.073,"Power":15.8,"ApparentPower":28.1,"ReactivePower":23.3,"Factor":0.56,"Voltage":247,"Current":0.114}}}

The TV and TiVo and lamp on eat ~75W.

2022-10-10T18:36:01Z {"StatusSNS":{"Time":"2022-10-10T19:36:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.215,"Yesterday":1.230,"Today":0.188,"Power":75.4,"ApparentPower":91.9,"ReactivePower":52.6,"Factor":0.82,"Voltage":248,"Current":0.371}}}

The cumulative total seems to have slipped back again when the plug had power removed overnight, again:

2022-10-10T21:01:01Z {"StatusSNS":{"Time":"2022-10-10T22:01:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.397,"Yesterday":1.230,"Today":0.370,"Power":51.3,"ApparentPower":77.0,"ReactivePower":57.4,"Factor":0.67,"Voltage":248,"Current":0.310}}}
2022-10-11T05:31:01Z {"StatusSNS":{"Time":"2022-10-11T06:31:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.030,"Yesterday":1.230,"Today":0.003,"Power":23.1,"ApparentPower":33.6,"ReactivePower":24.4,"Factor":0.69,"Voltage":245,"Current":0.137}}}

It is quite possible that the appropriate values are only committed to non-volatile storage after a fairly significant quantum, ie that the plug itself does not expect to lose power often.

For applications such as this I may have to sum implied energy for every minute that I do get a poll response.

LBplug TV corner power
TV corner power consumption from afternoon of 10th to morning of 19th.

Preparation of intermediate files from the central full eight days:

% cat LBplug-2022-10-1{1,2,3,4,5,6,7,8}.log.gz | gzip -d | xz -v -e --best > LBplug-full-8-days.log.xz
% cat LBplug-2022-10-1{1,2,3,4,5,6,7,8}.log.gz | gzip -d | sh ./ | xz -v -e --best > LBplug-full-8-days.power.xz
% xz -d < LBplug-full-8-days.power.xz | wc -l
% xz -d < LBplug-full-8-days.power.xz | egrep ' 0$' | wc -l
% xz -d < LBplug-full-8-days.power.xz | awk '{s+=$2}END{print s/60}'

Thus 4701 1-minute records plus 34 manually inserted 0 records. That is ~78h 'on' (~9.6h/d, up to ~8.3h/d watched) out of 192h for a ~41% duty cycle.

A total of 4133Wh (4.133kWh) was used over those 8 days, ie ~517Wh/d, with a mean power of ~22W, or ~53W while on for the "TV corner" as a whole. That is very roughly 10% of daily demand (excluding for hot water via the Thermino).

(Note that the DVD player is not plugged in. The X-box is off, but plugged in.)

% xz -d < LBplug-full-8-days.power.xz | awk '$2>60{++n;s+=$2}END{print n,s/60}'
1730 2261.43
% xz -d < LBplug-full-8-days.power.xz | awk '$2>20&&$2<=60{++n;s+=$2}END{print n,s/60}'
2276 1699.05
% xz -d < LBplug-full-8-days.power.xz | awk '$2>0&&$2<=20{++n;s+=$2}END{print n,s/60}'
695 172.89

Test 4: Washing Machine Cold Wash

This test is a detailed load profile of a cottons cold wash in the Zanussi ZWF01483W washing machine.

Enphase 1-minute sampling is also enabled around this test (.log.gz). Though I am alone in the house, other appliances are running such as a dishwasher rinse and the fridge/freezer doing its thing. The Enphase battery should largely be able to keep the net grid flow to zero. (Nothing is expected to generate or draw more than 1kW during this test.)

Raw data (.log.gz) from 29th. See all artefacts.

LBplug cold wash
Zanussi ZWF01483W large cold cottons wash energy profile, inlet mains ~17°C.

Total energy consumption apparently 0.407kWh ("Today" 0.410 - 0.003):

2022-10-29T08:34:01Z {"StatusSNS":{"Time":"2022-10-29T09:34:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.030,"Yesterday":1.230,"Today":0.003,"Power":0.0,"ApparentPower":0.0,"ReactivePower":0.0,"Factor":0.00,"Voltage":246,"Current":0.000}}}
2022-10-29T11:10:01Z {"StatusSNS":{"Time":"2022-10-29T12:10:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.437,"Yesterday":1.230,"Today":0.410,"Power":0.1,"ApparentPower":8.6,"ReactivePower":8.6,"Factor":0.01,"Voltage":247,"Current":0.035}}}

Consumption (Wh) looks more like expected when minute samples are summed:

% gzip -d < LBplug-2022-10-29.log.gz | sh ./ | awk '{s+=$2}END{print s/60}'

Test 5: Dishwasher Eco

This test is a detailed load profile of a 50°C 'eco' wash on a moderately full load.

Enphase 1-minute sampling is also enabled around this test (.log.gz). Though I am alone in the house, other appliances are running such as the fridge/freezer doing its thing.

Raw data (.log.gz) from 29th. See all artefacts.

LBplug eco cycle
Electra C1845W full load eco cycle wash energy profile, inlet mains ~17°C. Almost all the energy used is in two bursts heating water for the main wash then rinse cycles. ~0.76kWh total.

Actual duration ~196m, so just short of that indicated by the initial display.

Power consumption from 12:24Z to 15:42Z apparently 0.946kW ("Today" 0.949 - 0.003):

2022-10-29T12:24:01Z {"StatusSNS":{"Time":"2022-10-29T13:24:01","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.030,"Yesterday":1.230,"Today":0.003,"Power":0.2,"ApparentPower":8.9,"ReactivePower":8.9,"Factor":0.02,"Voltage":247,"Current":0.036}}}
2022-10-29T15:42:01Z {"StatusSNS":{"Time":"2022-10-29T16:42:02","ENERGY":{"TotalStartTime":"2022-10-05T19:17:26","Total":3.977,"Yesterday":1.230,"Today":0.949,"Power":0.2,"ApparentPower":4.9,"ReactivePower":4.9,"Factor":0.04,"Voltage":247,"Current":0.020}}}

Consumption (Wh) looks more like expected when minute samples are summed:

% gzip -d < LBplug-2022-10-29.log.gz | sh ./ | awk '{s+=$2}END{print s/60}'

Test 6: Washing Machine Eco 40C Wash

This test is a detailed load profile of two cottons Eco 40°C washes in the Zanussi ZWF01483W washing machine.

Enphase 1-minute sampling is also enabled around this test (.log.gz).

Raw data (.log.gz) from 4th. See all artefacts.

LBplug eco 40C LBplug eco 40C
Two successive Eco 40°C cotton runs with bedding. The second load may have been heavier or more absorbent and thus harder to heat and to spin up. The first load was from 2 single beds (duration ~144 minutes, ~0.45kWh), the second from 1 double bed plus a substantial bath mat (duration ~209 minutes, ~1.23kWh). Water temperature (not measured) estimated to be ~17°C.

Energy consumptions estimated from 1-minute samples, ~0.45kWh and ~1.23kWh:

% gzip -d < run1.log.gz | awk '{s+=$2}END{print s/60}'
% gzip -d < run2.log.gz | awk '{s+=$2}END{print s/60}'

Test 6b: Washing Machine Eco 40C Wash Redux

This time we are being careful to manage the load. This load is just the bedding from a single bed.

(Mains inlet temperature ~13°C? Start approx 08:07Z.)


~2779 words.