211
|
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.task import LoopingCall
|
|
9 from twisted.internet.defer import inlineCallbacks
|
|
10 from twisted.internet import reactor
|
|
11 from cyclone.httpclient import fetch
|
|
12
|
|
13 from private_config import deviceIp, cloudId, installId, macId, periodSec
|
|
14
|
|
15 auth = (cloudId + ':' + installId).encode('base64').strip()
|
|
16
|
|
17 carbon = CarbonClient(serverHost='bang')
|
|
18
|
|
19 class Poller(object):
|
|
20 def __init__(self, carbon):
|
|
21 self.carbon = carbon
|
|
22 self.lastPollTime = 0
|
|
23 LoopingCall(self.poll).start(interval=periodSec)
|
|
24
|
|
25 @inlineCallbacks
|
|
26 def poll(self):
|
|
27 ret = None
|
|
28 try:
|
|
29 resp = yield fetch(
|
|
30 'http://{deviceIp}/cgi-bin/cgi_manager'.format(deviceIp=deviceIp),
|
|
31 method='POST',
|
|
32 headers={'Authorization': ['Basic %s' % auth]},
|
|
33 postdata='''<LocalCommand>
|
|
34 <Name>get_usage_data</Name>
|
|
35 <MacId>0x{macId}</MacId>
|
|
36 </LocalCommand>
|
|
37 <LocalCommand>
|
|
38 <Name>get_price_blocks</Name>
|
|
39 <MacId>0x{macId}</MacId>
|
|
40 </LocalCommand>'''.format(macId=macId))
|
|
41 ret = json.loads(resp.body)
|
|
42 if ret['demand_units'] != 'kW':
|
|
43 raise ValueError
|
|
44 if ret['summation_units'] != 'kWh':
|
|
45 raise ValueError
|
|
46 self.carbon.send('system.house.powerEagle.demand_w',
|
|
47 float(ret['demand']) * 1000)
|
|
48 self.carbon.send('system.house.powerEagle.summation_delivered_kWh',
|
|
49 float(ret['summation_delivered']))
|
|
50 except Exception as e:
|
|
51 log.error("failed: %r", e)
|
|
52 log.error(repr(ret))
|
|
53
|
|
54 self.lastPollTime = time.time()
|
|
55
|
|
56
|
|
57 log.setLevel(logging.INFO)
|
|
58 carbon = CarbonClient(serverHost='bang')
|
|
59 p = Poller(carbon)
|
|
60 reactor.run()
|