annotate service/powerEagle/reader.py @ 311:ec6451f15ae5

powereagle reader writes to influxdb Ignore-this: cbd088f968244a7e869868ff82b079f0
author drewp@bigasterisk.com
date Fri, 16 Sep 2016 01:28:48 -0700
parents 7a1e9ef4c8b2
children 655a11cde0ab
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
211
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
1 #!bin/python
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
2 import json, logging, time
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
3 import sys
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
4 sys.path.append("/my/proj/homeauto/lib")
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
5 from logsetup import log
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
6 from twisted.internet.defer import inlineCallbacks
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
7 from twisted.internet import reactor
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
8 from cyclone.httpclient import fetch
311
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
9 from influxdb import InfluxDBClient
211
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
10
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
11 from private_config import deviceIp, cloudId, installId, macId, periodSec
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
12
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
13 auth = (cloudId + ':' + installId).encode('base64').strip()
311
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
14 influx = InfluxDBClient('bang', 9060, 'root', 'root', 'main')
211
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
15
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
16 class Poller(object):
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
17 def __init__(self, carbon):
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
18 self.carbon = carbon
212
a7dd996617ef LoopingCall sets the interview between calls, but I want the period of calls
drewp@bigasterisk.com
parents: 211
diff changeset
19 reactor.callLater(0, self.poll)
211
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
20
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
21 @inlineCallbacks
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
22 def poll(self):
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
23 ret = None
212
a7dd996617ef LoopingCall sets the interview between calls, but I want the period of calls
drewp@bigasterisk.com
parents: 211
diff changeset
24 startTime = time.time()
211
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
25 try:
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
26 resp = yield fetch(
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
27 'http://{deviceIp}/cgi-bin/cgi_manager'.format(deviceIp=deviceIp),
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
28 method='POST',
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
29 headers={'Authorization': ['Basic %s' % auth]},
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
30 postdata='''<LocalCommand>
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
31 <Name>get_usage_data</Name>
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
32 <MacId>0x{macId}</MacId>
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
33 </LocalCommand>
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
34 <LocalCommand>
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
35 <Name>get_price_blocks</Name>
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
36 <MacId>0x{macId}</MacId>
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
37 </LocalCommand>'''.format(macId=macId))
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
38 ret = json.loads(resp.body)
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
39 if ret['demand_units'] != 'kW':
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
40 raise ValueError
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
41 if ret['summation_units'] != 'kWh':
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
42 raise ValueError
311
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
43 influx.write_points([
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
44 dict(measurement='housePowerW',
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
45 fields=dict(value=float(ret['demand']) * 1000),
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
46 tags=dict(house='berkeley'),
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
47 time=int(startTime)),
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
48 dict(measurement='housePowerSumDeliveredKwh',
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
49 fields=dict(value=float(ret['summation_delivered'])),
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
50 tags=dict(house='berkeley'),
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
51 time=int(startTime)),
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
52 ], time_precision='s')
211
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
53 except Exception as e:
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
54 log.error("failed: %r", e)
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
55 log.error(repr(ret))
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
56
212
a7dd996617ef LoopingCall sets the interview between calls, but I want the period of calls
drewp@bigasterisk.com
parents: 211
diff changeset
57 now = time.time()
216
7a1e9ef4c8b2 fudge timing to not miss data points
drewp@bigasterisk.com
parents: 212
diff changeset
58 goal = startTime + periodSec - .2
212
a7dd996617ef LoopingCall sets the interview between calls, but I want the period of calls
drewp@bigasterisk.com
parents: 211
diff changeset
59 reactor.callLater(max(1, goal - now), self.poll)
211
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
60
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
61
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
62 log.setLevel(logging.INFO)
311
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
63 influx = InfluxDBClient('bang', 9060, 'root', 'root', 'main')
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
64
ec6451f15ae5 powereagle reader writes to influxdb
drewp@bigasterisk.com
parents: 216
diff changeset
65 p = Poller(influx)
211
7d3645c2157e rainforest eagle data -> carbon
drewp@bigasterisk.com
parents:
diff changeset
66 reactor.run()