Sparkblocks are a text-only version of the sparkline charts, using just unicode symbols. These are a convenient way to represent trends in pure text, quite useful when you want to use SMS, tweets or even the subject line of an email to show a story. Those of you following me on Twitter may have seen recent tweets of mine that look like this:
Home power consumption for the last 7 days: ▆▅▆▇▅▃▁
Edit: I created a dedicated Twitter account for my house, folow it here:
Follow @iot_house
Here is how I did that:
First, I grabbed and installed a Python library for generating unicode text based sparkline bargraphs from lists of numbers. The Readme contains all you need to get the job done in 30 or less seconds.
Next, I registered with PushingBox – a neat service for cloud notifications. I created a simple scenario that would post a tweet with the sparkblocks for me, so that I keep my Python code as simple as possible:
The scenario receives an unique identifier called “DeviceID”, write this down for later use.
I log my power usage to emoncms, storing my kWhd data in feed number 5. I will be fetching week’s worth of data from that feed, converting it to text sparkblock and tweeting it using a simple Python script:
#!/usr/bin/python
import time
import urllib
import json
from sparkblocks import spark #https://github.com/1stvamp/py-sparkblocks
import urllib, urllib2
from urllib import quote_plus
API= "**********API***********" # emoncms API key
feedID=5 # emoncms feed id that contains the kwh/d data
deviceID = "****DeviceID******" #PushingBox deviceID
sec_per_day = 60 * 60 * 24
end = (int(time.time())) #now
start = (end - (7 * sec_per_day)) #7 days ago
data_url = "http://emoncms.org/feed/data.json?apikey=" + API +"&id=" + str(feedID) + "&start=" + str(start*1000) + "&end=" + str(end*1000) + "&dp="
#urllib's urlencode doesn't take utf8, so use a custom one
def urlencode_utf8(params):
if hasattr(params, 'items'):
params = params.items()
return '&'.join(
(quote_plus(k.encode('utf8'), safe='/') + '=' + quote_plus(v.encode('utf8'), safe='/')
for k, v in params))
def pushingbox(key,val):
url = 'http://api.pushingbox.com/pushingbox'
values = {'devid' : key, 'msg' : val}
try:
data = urlencode_utf8(values)
req = urllib2.Request(url, data)
sendrequest = urllib2.urlopen(req)
except Exception, detail:
print "Error ", detail
# read in the data from emoncms
try:
sock = urllib.urlopen(data_url)
data_str = sock.read()
sock.close
except Exception, detail:
print "Error ", detail
data = json.loads(data_str)
x=0
sparkval=[] #A list to hold the sparkline values
data.reverse() #Reversed order, as we want newest data last in the sparkline
for i in data:
sparkval.append(float(data[x][1])) #first parameter is the timestamp, ignoring it
#print float(data[x][1])
x+=1
pushingbox(deviceID,spark(sparkval))
Finally, I set a cron job to run this every Sunday just before midnight.
Neat, right?



Pingback: In-memory SQL analysis of emonCMS feed | Martin's corner on the web