It often happens that I need to know the the min/max/average values of an emonCMS feed or do basic data analysis/querying, I was running a SQL query on the database end to get my answers. In some cases, however, one may not have a direct access to the database. EmonCMS’s API allows JSON data extract for a feed, so I decided to use that as a source. Here is a simple Python code that I put together that will fetch a week’s worth of emonCMS data feed, store that data in a in-memory database (sqlite3) and run three simple SQL queries on it:
#!/usr/bin/python import time import urllib import json import urllib, urllib2 import sqlite3 # sudo apt-get sqlite3 API= "***API****" # emoncms API key feedID=16 # emoncms feed id 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=" # 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) conn = sqlite3.connect(":memory:") conn.execute (""" CREATE TABLE feed ( time INTEGER, data REAL ); """) #Load the JSON data from EmonCMS into a table x=0 for row in data: conn.execute("INSERT INTO feed (time, data) VALUES (?,?)", (str(data[x][0]),float(data[x][1])) ) x+=1 #print "\nEntire table contents:\n" #for row in conn.execute("SELECT * FROM feed"): # print row result = conn.execute("SELECT MAX(data) FROM feed") res = result.next()[0] print "Max value: " + str(res) result = conn.execute("SELECT MIN(data) FROM feed") res = result.next()[0] print "Min value: " + str(res) result = conn.execute("SELECT AVG(data) FROM feed") res = result.next()[0] print "Avg value: " + str(res)
I use this approach to Tweet various facts about my house’s telemetry, I have set up a dedicated Twitter account fo it:
Follow @iot_house