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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1016
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
1 #!bin/python
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
2 import json, logging, time
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
3 import sys
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
4 sys.path.append("/my/proj/homeauto/lib")
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
5 from logsetup import log
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
6 sys.path.append("/my/proj/room")
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
7 from carbondata import CarbonClient
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
8 from twisted.internet.defer import inlineCallbacks
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
9 from twisted.internet import reactor
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
10 from cyclone.httpclient import fetch
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
11
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
12 from private_config import deviceIp, cloudId, installId, macId, periodSec
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
13
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
14 auth = (cloudId + ':' + installId).encode('base64').strip()
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
15
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
16 carbon = CarbonClient(serverHost='bang')
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
17
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
18 class Poller(object):
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
19 def __init__(self, carbon):
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
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
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
22
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
23 @inlineCallbacks
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
24 def poll(self):
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
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
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
27 try:
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
28 resp = yield fetch(
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
29 'http://{deviceIp}/cgi-bin/cgi_manager'.format(deviceIp=deviceIp),
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
30 method='POST',
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
31 headers={'Authorization': ['Basic %s' % auth]},
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
32 postdata='''<LocalCommand>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
33 <Name>get_usage_data</Name>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
34 <MacId>0x{macId}</MacId>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
35 </LocalCommand>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
36 <LocalCommand>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
37 <Name>get_price_blocks</Name>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
38 <MacId>0x{macId}</MacId>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
39 </LocalCommand>'''.format(macId=macId))
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
40 ret = json.loads(resp.body)
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
41 if ret['demand_units'] != 'kW':
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
42 raise ValueError
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
43 if ret['summation_units'] != 'kWh':
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
44 raise ValueError
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
45 self.carbon.send('system.house.powerEagle.demand_w',
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
46 float(ret['demand']) * 1000)
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
47 self.carbon.send('system.house.powerEagle.summation_delivered_kWh',
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
48 float(ret['summation_delivered']))
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
49 except Exception as e:
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
50 log.error("failed: %r", e)
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
51 log.error(repr(ret))
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
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
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
56
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
57
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
58 log.setLevel(logging.INFO)
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
59 carbon = CarbonClient(serverHost='bang')
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
60 p = Poller(carbon)
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
61 reactor.run()