annotate service/beacon/db.py @ 1754:92999dfbf321 default tip

add shelly support
author drewp@bigasterisk.com
date Tue, 04 Jun 2024 13:03:43 -0700
parents 6ba2c88f9847
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
1 from pymongo import MongoClient
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
2 from influxdb import InfluxDBClient
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
3 import arrow
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
4
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
5
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
6 from influxdb.resultset import ResultSet
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
7 # patch a crash where the row didn't seem to have enough Nones in it
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
8 def point_from_cols_vals(cols, vals):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
9 point = {}
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
10 for col_index, col_name in enumerate(cols):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
11 try:
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
12 point[col_name] = vals[col_index]
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
13 except IndexError:
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
14 point[col_name] = None
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
15 return point
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
16 ResultSet.point_from_cols_vals = staticmethod(point_from_cols_vals)
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
17
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
18 class Db(object):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
19 def __init__(self, influxArgs=('bang', 9060, 'root', 'root', 'beacon'),
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
20 mongoArgs=('bang', 27017)):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
21 self.mongo = MongoClient(*mongoArgs, tz_aware=True)['beacon']['data']
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
22 self.influx = InfluxDBClient(*influxArgs)
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
23
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
24 def addrs(self, startTime):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
25 ret = set()
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
26 for row in self.influx.query('''
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
27 select *
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
28 from "rssi"
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
29 where time > '%s'
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
30 ''' % (startTime.isoformat()))['rssi']:
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
31 ret.add(row['toAddr'])
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
32 return ret
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
33
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
34 def _fixRow(self, row):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
35 row['time'] = arrow.get(row['time'])
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
36 row['rssi'] = row.pop('max')
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
37
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
38 def sensors(self):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
39 return [row['from'] for row in
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
40 self.influx.query('SHOW TAG VALUES FROM "rssi" WITH KEY = "from"').get_points()]
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
41
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
42 def recentRssi(self, startTime, toAddr=None):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
43 toAddrPredicate = (" and toAddr = '%s'" % toAddr) if toAddr else ''
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
44 for row in self.influx.query('''
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
45 select time,max(value),"from","toAddr"
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
46 from "rssi"
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
47 where time > '%s' %s
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
48 group by time(2s), "from"
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
49 order by time
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
50 ''' % (startTime.isoformat(), toAddrPredicate))['rssi']:
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
51 if row['max'] is not None:
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
52 self._fixRow(row)
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
53 yield row
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
54
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
55 def latestDetail(self, addr):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
56 doc = self.mongo.find_one({'addr': addr}, sort=[('t', -1)])
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
57 if not doc:
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
58 return {}
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
59 return doc
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
60
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
61 if __name__ == '__main__':
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
62 import datetime
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
63 from dateutil.tz import tzlocal
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
64 db = Db()
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
65 print db.addrs(datetime.datetime.now(tzlocal()) - datetime.timedelta(seconds=60*2))
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
66 print list(db.recentRssi(datetime.datetime.now(tzlocal()) - datetime.timedelta(seconds=60*2)))
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents:
diff changeset
67 print db.latestDetail('00:ea:23:23:c6:c4')