annotate service/beacon/db.py @ 1462:2b29f14eb6bd

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