Mercurial > code > home > repos > homeauto
diff service/beacon/db.py @ 310:6ba2c88f9847
beaconmap rewrites with influxdb
Ignore-this: 8f5e74d944a1abda0c758ea6e65df2f0
author | drewp@bigasterisk.com |
---|---|
date | Fri, 16 Sep 2016 01:27:28 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/beacon/db.py Fri Sep 16 01:27:28 2016 -0700 @@ -0,0 +1,67 @@ +from pymongo import MongoClient +from influxdb import InfluxDBClient +import arrow + + +from influxdb.resultset import ResultSet +# patch a crash where the row didn't seem to have enough Nones in it +def point_from_cols_vals(cols, vals): + point = {} + for col_index, col_name in enumerate(cols): + try: + point[col_name] = vals[col_index] + except IndexError: + point[col_name] = None + return point +ResultSet.point_from_cols_vals = staticmethod(point_from_cols_vals) + +class Db(object): + def __init__(self, influxArgs=('bang', 9060, 'root', 'root', 'beacon'), + mongoArgs=('bang', 27017)): + self.mongo = MongoClient(*mongoArgs, tz_aware=True)['beacon']['data'] + self.influx = InfluxDBClient(*influxArgs) + + def addrs(self, startTime): + ret = set() + for row in self.influx.query(''' + select * + from "rssi" + where time > '%s' + ''' % (startTime.isoformat()))['rssi']: + ret.add(row['toAddr']) + return ret + + def _fixRow(self, row): + row['time'] = arrow.get(row['time']) + row['rssi'] = row.pop('max') + + def sensors(self): + return [row['from'] for row in + self.influx.query('SHOW TAG VALUES FROM "rssi" WITH KEY = "from"').get_points()] + + def recentRssi(self, startTime, toAddr=None): + toAddrPredicate = (" and toAddr = '%s'" % toAddr) if toAddr else '' + for row in self.influx.query(''' + select time,max(value),"from","toAddr" + from "rssi" + where time > '%s' %s + group by time(2s), "from" + order by time + ''' % (startTime.isoformat(), toAddrPredicate))['rssi']: + if row['max'] is not None: + self._fixRow(row) + yield row + + def latestDetail(self, addr): + doc = self.mongo.find_one({'addr': addr}, sort=[('t', -1)]) + if not doc: + return {} + return doc + +if __name__ == '__main__': + import datetime + from dateutil.tz import tzlocal + db = Db() + print db.addrs(datetime.datetime.now(tzlocal()) - datetime.timedelta(seconds=60*2)) + print list(db.recentRssi(datetime.datetime.now(tzlocal()) - datetime.timedelta(seconds=60*2))) + print db.latestDetail('00:ea:23:23:c6:c4')