Hi everyone,
finally I've managed to get something going in Python, this time. It's
probably not different from what Ari has written.
Once our smart meter starts sending data (or rather powershop starts
processing it) I'm planning to update the usage as often as possible.
Anyway, here's my 0.1 version, based on tweet-a-watt and other random
code
#!/usr/bin/env python
import time, datetime, sys
import socket
import google_meter
import rfc3339
import units
import httplib
import oauth2
import json
QUIET = False
DEBUG = True
#Obtain your Google PowerMeter token:
http://www.ladyada.net/make/tweetawatt/powermeter.html
powerMeterToken = "TOKEN HERE"
powerMeterPath = "PATH HERE"
powerMeterVariable = powerMeterPath + ".d1"
powerMeterLog_level = 1
powerMeterUnit = units.KILOWATT_HOUR
powerMeterUncertainty = 0.001
powerMeterTime_uncertainty = 1
powerMeterDurational = True
powerMeterLast_time = time.time()
powerMeterLog = google_meter.Log(powerMeterLog_level)
powerMeterService = google_meter.Service(powerMeterToken, "https://
www.google.com/powermeter/feeds", log=powerMeterLog)
#powerShopService = google_meter.Service(powerShopToken,
powerShopApi )
#Create a google_meter object
powerMeter = google_meter.Meter(
powerMeterService,
powerMeterVariable,
powerMeterUncertainty * powerMeterUnit,
powerMeterTime_uncertainty,
powerMeterDurational,
powerMeterLast_time)
#Powershop details
psApiSecret = "POWER SHOP API SECRET HERE"
#you can get consumer token and secret from my other app
http://powershop.emanueleziglioli.it
psConsumerToken = ""
psTokenSecret = ""
psAccessToken = oauth2.Token( psConsumerToken, psTokenSecret )
psConsumer = oauth2.Consumer( psConsumerToken, psApiSecret )
signature_method = oauth2.SignatureMethod_HMAC_SHA1()
connection = httplib.HTTPSConnection("
secure.powershop.co.nz")
psApiUrl = "
https://secure.powershop.co.nz/external_api/v1/"
psCustomerUrl = "customer.js"
def fetch_response(oauth_request, connection, debug=False):
url = oauth_request.to_url()
connection.request( oauth_request.method, url )
response = connection.getresponse()
s = response.read()
if DEBUG:
print 'requested URL: %s' % url
print 'server response: %s' % s
return s
def get_location( locUrl ):
oauth_request = oauth2.Request.from_consumer_and_token(
psConsumer, token=psAccessToken, http_url=psApiUrl+locUrl
)
oauth_request.sign_request(signature_method, psConsumer,
psAccessToken)
jsres = fetch_response(oauth_request, connection)
return json.loads(jsres)
# the 'main loop' runs once a second or so... TODO change to a set
interval
def update(idleevent):
global avgwattdataidx, sensorhistories, twittertimer, DEBUG
# Determine the minute of the hour (ie 6:42 -> '42')
currminute = (int(time.time())/60) % 10
# Figure out if its been five minutes since our last save
if (currminute % 1 == 0):
currPowerMeter_Update_Time = time.time()
# Print out debug data, Wh used in last 5 minutes
customerjs = get_location( psCustomerUrl );
last_reading_value = customerjs['result']['properties'][0]
['registers'][0]['last_reading_value']
#Send it to GooglePowerMeter (TODO if different, also get time
from reading):
try:
powerMeter.PostIntervalReading(
last_reading_value * powerMeterUnit )
#powerMeterUncertainty * powerMeterUnit,
#powerMeter.last_read_time,
#currPowerMeter_Update_Time )
except (IOError, socket.error), e:
print '-- %s: %s' % (e.__class__.__name__, e)
while True:
update(None)