Mercurial > code > home > repos > homeauto
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 |
rev | line source |
---|---|
1016 | 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 | 3 import sys |
4 sys.path.append("/my/proj/homeauto/lib") | |
5 from logsetup import log | |
6 from twisted.internet.defer import inlineCallbacks | |
7 from twisted.internet import reactor | |
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 | 10 |
11 from private_config import deviceIp, cloudId, installId, macId, periodSec | |
12 | |
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 | 15 |
16 class Poller(object): | |
17 def __init__(self, carbon): | |
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 | 20 |
21 @inlineCallbacks | |
22 def poll(self): | |
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 | 25 try: |
26 resp = yield fetch( | |
27 'http://{deviceIp}/cgi-bin/cgi_manager'.format(deviceIp=deviceIp), | |
28 method='POST', | |
29 headers={'Authorization': ['Basic %s' % auth]}, | |
30 postdata='''<LocalCommand> | |
31 <Name>get_usage_data</Name> | |
32 <MacId>0x{macId}</MacId> | |
33 </LocalCommand> | |
34 <LocalCommand> | |
35 <Name>get_price_blocks</Name> | |
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 | 39 ret = json.loads(resp.body) |
40 if ret['demand_units'] != 'kW': | |
41 raise ValueError | |
42 if ret['summation_units'] != 'kWh': | |
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 | 57 except Exception as e: |
58 log.error("failed: %r", e) | |
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 | 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 | 65 |
66 | |
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 | 71 reactor.run() |