Decided to figure out how to measure the energy used by a desktop computer and see if I can figure out a way to identify different workloads.
I have a Mac Studio M1 to run the workload, and an old MacBook laptop to run data collection on, so that it doesn't add to the workload.
First thing we need is a power monitoring plug that has an API. The TP-Link Kasa platform seems like a good place to start. It has a python based API available on GitHub.
% pip3 install python-kasa
I ordered a Kasa KP115 smart plug from Amazon for $22.99.
Setup the plug using the mobile app, then:
% kasa No host name given, trying discovery.. Discovering devices on 255.255.255.255 for 3 seconds == PowerMeter - KP115(US) == Host: 10.0.0.46 Device state: ON == Generic information == Time: 2022-10-31 15:21:56 (tz: {'index': 6, 'err_code': 0} Hardware: 1.0 Software: 1.0.18 Build 210910 Rel.141202 MAC (rssi): 10:27:F5:9C:37:12 (-49) Location: {'latitude': 36.xxx, 'longitude': -121.xxx} == Device specific information == LED state: True On since: 2022-10-31 12:35:15 == Current State == <EmeterStatus power=3.456 voltage=122.48 current=0.049 total=0.002> == Modules == + <Module Schedule (schedule) for 10.0.0.46> + <Module Usage (schedule) for 10.0.0.46> + <Module Antitheft (anti_theft) for 10.0.0.46> + <Module Time (time) for 10.0.0.46> + <Module Cloud (cnCloud) for 10.0.0.46> + <Module Emeter (emeter) for 10.0.0.46>
Next - you have to specify host, or it will crash, and specifying type saves it an extra API call, and you get a single result
% kasa --host 10.0.0.46 --type plug emeter == Emeter == Current: 0.049 A Voltage: 121.715 V Power: 3.628 W Total consumption: 0.002 kWh Today: 0.002 kWh This month: 0.002 kWh
Using a csh loop to get a 1 second trace of the data it's clear that the data changes about every 4 seconds.
% while 1 while? kasa --host 10.0.0.46 --type plug | egrep '(Time:|EmeterStatus)' while? sleep 1 while? end Time: 2022-10-31 16:09:34 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=0.0 voltage=122.49 current=0.0 total=0.004> Time: 2022-10-31 16:09:35 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=0.0 voltage=122.49 current=0.06 total=0.004> Time: 2022-10-31 16:09:36 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=0.0 voltage=122.36 current=0.06 total=0.004> Time: 2022-10-31 16:09:38 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.68 voltage=122.36 current=0.06 total=0.004> Time: 2022-10-31 16:09:39 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.68 voltage=122.36 current=0.06 total=0.004> Time: 2022-10-31 16:09:40 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.68 voltage=122.36 current=0.05 total=0.004> Time: 2022-10-31 16:09:41 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.68 voltage=122.258 current=0.05 total=0.004> Time: 2022-10-31 16:09:42 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.253 voltage=122.258 current=0.05 total=0.004> Time: 2022-10-31 16:09:43 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.253 voltage=122.258 current=0.05 total=0.004> Time: 2022-10-31 16:09:45 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.253 voltage=122.258 current=0.049 total=0.004> Time: 2022-10-31 16:09:46 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.253 voltage=122.382 current=0.049 total=0.004> Time: 2022-10-31 16:09:47 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.253 voltage=122.382 current=0.049 total=0.004> Time: 2022-10-31 16:09:48 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.675 voltage=122.382 current=0.049 total=0.004> Time: 2022-10-31 16:09:49 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.675 voltage=122.382 current=0.012 total=0.004> Time: 2022-10-31 16:09:50 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.675 voltage=122.446 current=0.012 total=0.004> Time: 2022-10-31 16:09:52 (tz: {'index': 6, 'err_code': 0} <EmeterStatus power=3.675 voltage=122.446 current=0.012 total=0.004>
The output formatting is defined in cli.py
kasa --host 10.0.0.46 --type plug | awk '/Time:|EmeterStatus/{printf("%s %s ", $2, $3)}'; echo 2022-10-31 16:23:11 power=1.017 voltage=122.608
That's all I have time to do for now, to be continued...
Top comments (0)