annotate service/powerEagle/reader.py @ 1219:bff11263c71e

add request timeout. don't send NaN to influxdb. crash on failures. Ignore-this: 7c5303376024a46e3cdc6aaf70cf4da8 darcs-hash:0e480db6080f334daf539eb1bc692a8ec0bd537c
author drewp <drewp@bigasterisk.com>
date Tue, 26 Mar 2019 09:12:30 -0700
parents d22c0c502ff6
children 71aa55cd8433
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
1219
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
2 import json, logging, time, os
1016
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 from twisted.internet.defer import inlineCallbacks
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
7 from twisted.internet import reactor
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
8 from cyclone.httpclient import fetch
1116
d22c0c502ff6 powereagle reader writes to influxdb
drewp <drewp@bigasterisk.com>
parents: 1021
diff changeset
9 from influxdb import InfluxDBClient
1016
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
10
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
11 from private_config import deviceIp, cloudId, installId, macId, periodSec
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
12
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
13 auth = (cloudId + ':' + installId).encode('base64').strip()
1116
d22c0c502ff6 powereagle reader writes to influxdb
drewp <drewp@bigasterisk.com>
parents: 1021
diff changeset
14 influx = InfluxDBClient('bang', 9060, 'root', 'root', 'main')
1016
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 class Poller(object):
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
17 def __init__(self, carbon):
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
18 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
19 reactor.callLater(0, self.poll)
1016
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
20
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
21 @inlineCallbacks
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
22 def poll(self):
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
23 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
24 startTime = time.time()
1016
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
25 try:
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
26 resp = yield fetch(
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
27 'http://{deviceIp}/cgi-bin/cgi_manager'.format(deviceIp=deviceIp),
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
28 method='POST',
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
29 headers={'Authorization': ['Basic %s' % auth]},
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
30 postdata='''<LocalCommand>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
31 <Name>get_usage_data</Name>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
32 <MacId>0x{macId}</MacId>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
33 </LocalCommand>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
34 <LocalCommand>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
35 <Name>get_price_blocks</Name>
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
36 <MacId>0x{macId}</MacId>
1219
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
37 </LocalCommand>'''.format(macId=macId),
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
38 timeout=10)
1016
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
39 ret = json.loads(resp.body)
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
40 if ret['demand_units'] != 'kW':
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
41 raise ValueError
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
42 if ret['summation_units'] != 'kWh':
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
43 raise ValueError
1219
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
44 pts = [
1116
d22c0c502ff6 powereagle reader writes to influxdb
drewp <drewp@bigasterisk.com>
parents: 1021
diff changeset
45 dict(measurement='housePowerW',
d22c0c502ff6 powereagle reader writes to influxdb
drewp <drewp@bigasterisk.com>
parents: 1021
diff changeset
46 fields=dict(value=float(ret['demand']) * 1000),
d22c0c502ff6 powereagle reader writes to influxdb
drewp <drewp@bigasterisk.com>
parents: 1021
diff changeset
47 tags=dict(house='berkeley'),
1219
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
48 time=int(startTime))]
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
49 sd = float(ret['summation_delivered'])
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
50 if sd > 0: # Sometimes nan
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
51 pts.append(dict(measurement='housePowerSumDeliveredKwh',
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
52 fields=dict(value=float()),
1116
d22c0c502ff6 powereagle reader writes to influxdb
drewp <drewp@bigasterisk.com>
parents: 1021
diff changeset
53 tags=dict(house='berkeley'),
1219
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
54 time=int(startTime)))
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
55
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
56 influx.write_points(pts, time_precision='s')
1016
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
57 except Exception as e:
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
58 log.error("failed: %r", e)
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
59 log.error(repr(ret))
1219
bff11263c71e add request timeout. don't send NaN to influxdb. crash on failures.
drewp <drewp@bigasterisk.com>
parents: 1116
diff changeset
60 os.abort()
1016
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
61
1017
3edda1f7a322 LoopingCall sets the interview between calls, but I want the period of calls
drewp <drewp@bigasterisk.com>
parents: 1016
diff changeset
62 now = time.time()
1021
b8540cba5c66 fudge timing to not miss data points
drewp <drewp@bigasterisk.com>
parents: 1017
diff changeset
63 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
64 reactor.callLater(max(1, goal - now), self.poll)
1016
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
65
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
66
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
67 log.setLevel(logging.INFO)
1116
d22c0c502ff6 powereagle reader writes to influxdb
drewp <drewp@bigasterisk.com>
parents: 1021
diff changeset
68 influx = InfluxDBClient('bang', 9060, 'root', 'root', 'main')
d22c0c502ff6 powereagle reader writes to influxdb
drewp <drewp@bigasterisk.com>
parents: 1021
diff changeset
69
d22c0c502ff6 powereagle reader writes to influxdb
drewp <drewp@bigasterisk.com>
parents: 1021
diff changeset
70 p = Poller(influx)
1016
1c5ff4c16f1e rainforest eagle data -> carbon
drewp <drewp@bigasterisk.com>
parents:
diff changeset
71 reactor.run()