Mercurial > code > home > repos > homeauto
view service/powerEagle/reader.py @ 1017:3edda1f7a322
LoopingCall sets the interview between calls, but I want the period of calls
Ignore-this: 224af7b995395d5e0c43c382360e4c90
darcs-hash:ac6b7338bc3a80b4b53be59b63c4a612daf49f7b
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Tue, 15 Dec 2015 00:41:51 -0800 |
parents | 1c5ff4c16f1e |
children | 7a1e9ef4c8b2 |
line wrap: on
line source
#!bin/python import json, logging, time import sys sys.path.append("/my/proj/homeauto/lib") from logsetup import log sys.path.append("/my/proj/room") from carbondata import CarbonClient from twisted.internet.defer import inlineCallbacks from twisted.internet import reactor from cyclone.httpclient import fetch from private_config import deviceIp, cloudId, installId, macId, periodSec auth = (cloudId + ':' + installId).encode('base64').strip() carbon = CarbonClient(serverHost='bang') class Poller(object): def __init__(self, carbon): self.carbon = carbon reactor.callLater(0, self.poll) @inlineCallbacks def poll(self): ret = None startTime = time.time() try: resp = yield fetch( 'http://{deviceIp}/cgi-bin/cgi_manager'.format(deviceIp=deviceIp), method='POST', headers={'Authorization': ['Basic %s' % auth]}, postdata='''<LocalCommand> <Name>get_usage_data</Name> <MacId>0x{macId}</MacId> </LocalCommand> <LocalCommand> <Name>get_price_blocks</Name> <MacId>0x{macId}</MacId> </LocalCommand>'''.format(macId=macId)) ret = json.loads(resp.body) if ret['demand_units'] != 'kW': raise ValueError if ret['summation_units'] != 'kWh': raise ValueError self.carbon.send('system.house.powerEagle.demand_w', float(ret['demand']) * 1000) self.carbon.send('system.house.powerEagle.summation_delivered_kWh', float(ret['summation_delivered'])) except Exception as e: log.error("failed: %r", e) log.error(repr(ret)) now = time.time() goal = startTime + periodSec reactor.callLater(max(1, goal - now), self.poll) log.setLevel(logging.INFO) carbon = CarbonClient(serverHost='bang') p = Poller(carbon) reactor.run()