Michael loves building software; he's been building search engines for
more than a decade, and has been working on Lucene as a committer, PMC
member and Apache member, for the past few years. He's co-author of
the recently published Lucene in Action, 2nd edition. In his spare
time Michael enjoys building his own computers, writing software to
control his house (mostly in Python), encoding videos and tinkering
with all sorts of other things. Michael is a DZone MVB and is not an employee of DZone and has posted 49 posts at DZone. You can read more from them at their website. View Full User Profile
Track your home's live electricity usage with Python
Modern electric meters (the one attached to the outside of your house)
emit an IR flash for each watt-hour consumed, through the port on the
top of the meter. It turns out, it's easy to detect this flash, decode
it into "live" power usage, and make cool charts like this: That's live KW on the Y axis and time on the X axis.
flash, at least for my meter, appears to have high temporal accuracy,
meaning it flashes precisely as you cross 1.000 WH. This is great,
since it enables accurate, real-time power usage. For example, when I
turn on the lights in my home office, I quickly see the power jump by
~65 watts, and then drop again when I turn the lights off.
is a fun way to track down which appliances or crazy computers or
parasitic drains are using up so much electricity in your house!
I've gone through several designs for this over the years. My last attempt was destroyed when lightning hit my house
(there's always a silver lining!), so, I decided to try something new
this time and I'm very happy with the approach since it's much simpler,
and, moves the pulse detection into Python.
I use a trivial
analog circuit to detect the IR pulse, consisting of two 100K resistors
in series and an IR photodiode in parallel with one of the resistors.
Make sure you get the polarity right on the photodiode otherwise it
won't work! Mount the photodiode on your power meter, aligned so that
it "sees" each IR pulse. I also added a small (0.01 uF) ceramic
capacitor in parallel with the same resistor, to suppress transient EM
fields otherwise picked up by the relatively long wires out to my meter.
Finally, I use this simple USB audio adapter
to move the problem into the digital domain, connecting to the ends of
the two series resistors to the mic input to use it for the A/D
conversion. This USB audio adapter drives the mic input with ~4.0V bias
voltage, which is great since otherwise you'd need an external source.
there's no pulse, the photo-diode acts roughly like an open switch,
meaning there is a fixed 200K resistive load on the mic input. When a
pulse happens (mine seem to last for ~10 msec), the photo-diode acts
roughly like a closed switch, suddenly dropping the series resistance to
100K. This drop causes a very detectible pulse (strongly negative then
strongly positive) on the mic input's voltage, I suspect because
there's a capacitor behind the bias voltage (but: I am no analog circuit
engineer, so this is speculation!).
You can plug this USB audio adapter into any computer; I use a Sheeva plug computer (delightful device, very low power -- I have three!). I record the digital samples (arecord
works well, at a 2 Khz rate) and decode the samples in Python to detect
a pulse whenever the value drops below -1000. You can easily compute
the live KW based on the time between two adjacent pulses, push this
into a database, and build graphs on top of this using Google's visualization APIs (I use dygraphs).
last approach didn't have nearly the temporal accuracy (ie, it smoothed
heavily across time), which masks interesting things. For example, now I
can tell the difference between a resistive load (the coffee maker,
oven, crockpot) and an inductive load (refrigerator compressor, vacuum
cleaner) because the inductive load has a huge spike in the beginning,
as the motor consumes lots of power trying to spin up.