Mercurial > code > home > repos > homeauto
annotate service/powerEagle/reader.py @ 1021:b8540cba5c66
fudge timing to not miss data points
Ignore-this: e6d01f03cc500f66ad7763525c1a5e00
darcs-hash:3ea5682cd245a6bf8ff39222d0c3fa4964ed4f5a
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Sun, 03 Jan 2016 02:28:10 -0800 |
parents | 3edda1f7a322 |
children | ec6451f15ae5 |
rev | line source |
---|---|
1016 | 1 #!bin/python |
2 import json, logging, time | |
3 import sys | |
4 sys.path.append("/my/proj/homeauto/lib") | |
5 from logsetup import log | |
6 sys.path.append("/my/proj/room") | |
7 from carbondata import CarbonClient | |
8 from twisted.internet.defer import inlineCallbacks | |
9 from twisted.internet import reactor | |
10 from cyclone.httpclient import fetch | |
11 | |
12 from private_config import deviceIp, cloudId, installId, macId, periodSec | |
13 | |
14 auth = (cloudId + ':' + installId).encode('base64').strip() | |
15 | |
16 carbon = CarbonClient(serverHost='bang') | |
17 | |
18 class Poller(object): | |
19 def __init__(self, carbon): | |
20 self.carbon = carbon | |
1017
3edda1f7a322
LoopingCall sets the interview between calls, but I want the period of calls
drewp <drewp@bigasterisk.com>
parents:
1016
diff
changeset
|
21 reactor.callLater(0, self.poll) |
1016 | 22 |
23 @inlineCallbacks | |
24 def poll(self): | |
25 ret = None | |
1017
3edda1f7a322
LoopingCall sets the interview between calls, but I want the period of calls
drewp <drewp@bigasterisk.com>
parents:
1016
diff
changeset
|
26 startTime = time.time() |
1016 | 27 try: |
28 resp = yield fetch( | |
29 'http://{deviceIp}/cgi-bin/cgi_manager'.format(deviceIp=deviceIp), | |
30 method='POST', | |
31 headers={'Authorization': ['Basic %s' % auth]}, | |
32 postdata='''<LocalCommand> | |
33 <Name>get_usage_data</Name> | |
34 <MacId>0x{macId}</MacId> | |
35 </LocalCommand> | |
36 <LocalCommand> | |
37 <Name>get_price_blocks</Name> | |
38 <MacId>0x{macId}</MacId> | |
39 </LocalCommand>'''.format(macId=macId)) | |
40 ret = json.loads(resp.body) | |
41 if ret['demand_units'] != 'kW': | |
42 raise ValueError | |
43 if ret['summation_units'] != 'kWh': | |
44 raise ValueError | |
45 self.carbon.send('system.house.powerEagle.demand_w', | |
46 float(ret['demand']) * 1000) | |
47 self.carbon.send('system.house.powerEagle.summation_delivered_kWh', | |
48 float(ret['summation_delivered'])) | |
49 except Exception as e: | |
50 log.error("failed: %r", e) | |
51 log.error(repr(ret)) | |
52 | |
1017
3edda1f7a322
LoopingCall sets the interview between calls, but I want the period of calls
drewp <drewp@bigasterisk.com>
parents:
1016
diff
changeset
|
53 now = time.time() |
1021
b8540cba5c66
fudge timing to not miss data points
drewp <drewp@bigasterisk.com>
parents:
1017
diff
changeset
|
54 goal = startTime + periodSec - .2 |
1017
3edda1f7a322
LoopingCall sets the interview between calls, but I want the period of calls
drewp <drewp@bigasterisk.com>
parents:
1016
diff
changeset
|
55 reactor.callLater(max(1, goal - now), self.poll) |
1016 | 56 |
57 | |
58 log.setLevel(logging.INFO) | |
59 carbon = CarbonClient(serverHost='bang') | |
60 p = Poller(carbon) | |
61 reactor.run() |