annotate service/beacon/beaconmap.py @ 310:6ba2c88f9847

beaconmap rewrites with influxdb Ignore-this: 8f5e74d944a1abda0c758ea6e65df2f0
author drewp@bigasterisk.com
date Fri, 16 Sep 2016 01:27:28 -0700
parents 299ddd7e2070
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
1 from __future__ import division
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
2 import sys, cyclone.web, json, datetime, time
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
3 import arrow
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
4 from twisted.internet import reactor, task
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
5 from dateutil.tz import tzlocal
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
6 import math
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
7 import cyclone.sse
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
8 from locator import Locator, Measurement
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
9
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
10 sys.path.append("/my/proj/homeauto/lib")
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
11 from cycloneerr import PrettyErrorHandler
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
12 from logsetup import log
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
13
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
14 from db import Db
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
15
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
16 class Devices(PrettyErrorHandler, cyclone.web.RequestHandler):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
17 def get(self):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
18 devices = []
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
19 startCount = datetime.datetime.now(tzlocal()) - datetime.timedelta(seconds=60*20)
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
20 for addr in db.addrs(startCount):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
21 # limit to "addr_type": "Public"
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
22 name = None
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
23 if addr == "00:ea:23:23:c6:c4":
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
24 name = 'apollo'
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
25 if addr == "00:ea:23:21:e0:a4":
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
26 name = 'white'
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
27 if addr == "00:ea:23:24:f8:d4":
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
28 name = 'green'
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
29 row = db.latestDetail(addr)
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
30 if 'Eddystone-URL' in row:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
31 name = row['Eddystone-URL']
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
32 devices.append({
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
33 'addr': addr,
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
34 'name': name})
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
35 devices.sort(key=lambda d: (d['name'] or 'zzz',
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
36 d['addr']))
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
37 self.set_header("Content-Type", "application/json")
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
38 self.write(json.dumps({'devices': devices}))
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
39
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
40
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
41 class Poller(object):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
42 def __init__(self):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
43 self.listeners = [] # Points handlers
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
44
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
45 self.lastPointTime = {} # addr : secs
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
46 self.lastValues = {} # addr : {sensor: (secs, rssi)}
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
47 task.LoopingCall(self.poll).start(2)
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
48
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
49 def poll(self):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
50 addrs = set(l.addr for l in self.listeners if l.addr)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
51 seconds = 60 * 20
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
52 now = datetime.datetime.now(tzlocal())
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
53 startTime = (now - datetime.timedelta(seconds=seconds))
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
54 startTimeSec = arrow.get(startTime).timestamp
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
55 for addr in addrs:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
56 points = {} # from: [offsetSec, rssi]
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
57 for row in db.recentRssi(startTime, addr):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
58 t = (row['time'] - startTime).total_seconds()
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
59 points.setdefault(row['from'], []).append([
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
60 round(t, 2), row['rssi']])
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
61 self.lastValues.setdefault(addr, {})[row['from']] = (
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
62 now, row['rssi'])
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
63
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
64 for pts in points.values():
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
65 smooth(pts)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
66
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
67 if not points:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
68 continue
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
69
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
70 last = max(pts[-1][0] + startTimeSec for pts in points.values())
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
71 if self.lastPointTime.get(addr, 0) == last:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
72 continue
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
73 self.lastPointTime[addr] = last
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
74 msg = json.dumps({
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
75 'addr': addr,
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
76 'startTime': startTimeSec,
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
77 'points': [{'from': k, 'points': v}
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
78 for k,v in sorted(points.items())]})
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
79 for lis in self.listeners:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
80 if lis.addr == addr:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
81 lis.sendEvent(msg)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
82
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
83 def lastValue(self, addr, maxSensorAgeSec=30):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
84 """note: only considers actively polled addrs"""
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
85 out = {} # from: rssi
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
86 now = datetime.datetime.now(tzlocal())
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
87 for sensor, (t, rssi) in self.lastValues.get(addr, {}).iteritems():
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
88 print 'consider %s %s' % (t, now)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
89 if (now - t).total_seconds() < maxSensorAgeSec:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
90 out[sensor] = rssi
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
91 return out
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
92
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
93 def smooth(pts):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
94 # see https://filterpy.readthedocs.io/en/latest/kalman/UnscentedKalmanFilter.html
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
95 for i in range(0, len(pts)):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
96 if i == 0:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
97 prevT, smoothX = pts[i]
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
98 else:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
99 t, x = pts[i]
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
100 if t - prevT < 30:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
101 smoothX = .8 * smoothX + .2 * x
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
102 else:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
103 smoothX = x
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
104 pts[i] = [t, round(smoothX, 1)]
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
105 prevT = t
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
106
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
107 class Points(cyclone.sse.SSEHandler):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
108 def __init__(self, application, request, **kw):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
109 cyclone.sse.SSEHandler.__init__(self, application, request, **kw)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
110 if request.headers['accept'] != 'text/event-stream':
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
111 raise ValueError('ignoring bogus request')
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
112 self.addr = request.arguments.get('addr', [None])[0]
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
113
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
114 def bind(self):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
115 if not self.addr:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
116 return
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
117 poller.listeners.append(self)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
118 def unbind(self):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
119 if not self.addr:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
120 return
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
121 poller.listeners.remove(self)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
122
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
123 class LocatorEstimatesPoller(object):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
124 def __init__(self):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
125 self.listeners = []
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
126 self.lastResult = {}
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
127 self.locator = Locator()
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
128 task.LoopingCall(self.poll).start(1)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
129
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
130 def poll(self):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
131 addrs = set(l.addr for l in self.listeners if l.addr)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
132 now = datetime.datetime.now(tzlocal())
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
133 cutoff = (now - datetime.timedelta(seconds=60))
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
134
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
135 for addr in addrs:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
136 d = {} # from: [(t, rssi)]
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
137 for row in db.recentRssi(cutoff, addr):
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
138 d.setdefault(row['from'], []).append((row['time'].timestamp, row['rssi']))
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
139
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
140 for pts in d.values():
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
141 pts.sort()
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
142 smooth(pts)
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
143
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
144 meas = Measurement(dict((k, v[-1][1]) for k, v in d.items()))
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
145 nearest = [
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
146 (dist, coord) for dist, coord in self.locator.nearestPoints(meas) if dist < 25
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
147 ]
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
148 if nearest:
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
149 weightedCoord = self.locator.estimatePosition(nearest)
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
150 else:
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
151 weightedCoord = [-999, -999, -999]
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
152 self.lastResult[addr] = {'nearest': nearest, 'weightedCoord': weightedCoord}
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
153
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
154 for lis in self.listeners:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
155 lis.sendEvent(self.lastResult[addr])
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
156
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
157 class PositionEstimates(cyclone.sse.SSEHandler):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
158 def __init__(self, application, request, **kw):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
159 cyclone.sse.SSEHandler.__init__(self, application, request, **kw)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
160 if request.headers['accept'] != 'text/event-stream':
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
161 raise ValueError('ignoring bogus request')
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
162 self.addr = request.arguments.get('addr', [None])[0]
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
163
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
164 def bind(self):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
165 if not self.addr:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
166 return
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
167 locatorEstimatesPoller.listeners.append(self)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
168 def unbind(self):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
169 if not self.addr:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
170 return
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
171 locatorEstimatesPoller.listeners.remove(self)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
172
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
173 class Sensors(PrettyErrorHandler, cyclone.web.RequestHandler):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
174 def get(self):
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
175 sensors = db.sensors()
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
176
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
177 t1 = datetime.datetime.now(tzlocal()) - datetime.timedelta(seconds=60*10)
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
178 out = []
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
179
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
180 allRows = list(db.recentRssi(t1))
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
181 allRows.sort(key=lambda r: r['time'], reverse=True)
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
182
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
183 for sens in sensors:
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
184 rssiHist = {} # level: count
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
185 for row in allRows:
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
186 if row['from'] == sens:
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
187 bucket = (row['rssi'] // 5) * 5
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
188 rssiHist[bucket] = rssiHist.get(bucket, 0) + 1
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
189
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
190 out.append({
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
191 'from': sens,
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
192 'count': sum(rssiHist.values()),
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
193 'hist': rssiHist,
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
194 })
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
195
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
196 self.set_header("Content-Type", "application/json")
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
197 self.write(json.dumps({'sensors': out}))
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
198
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
199 class Save(PrettyErrorHandler, cyclone.web.RequestHandler):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
200 def post(self):
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
201 lines = open('saved_points').readlines()
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
202 lineNum = len(lines) + 1
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
203 row = poller.lastValue('00:ea:23:21:e0:a4')
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
204 with open('saved_points', 'a') as out:
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
205 out.write('%s %r\n' % (lineNum, row))
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
206 self.write('wrote line %s: %r' % (lineNum, row))
310
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
207
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
208 db = Db()
6ba2c88f9847 beaconmap rewrites with influxdb
drewp@bigasterisk.com
parents: 291
diff changeset
209
291
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
210 poller = Poller()
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
211 locatorEstimatesPoller = LocatorEstimatesPoller()
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
212
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
213 reactor.listenTCP(
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
214 9113,
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
215 cyclone.web.Application([
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
216 (r"/(|.*\.(?:js|html|json))$", cyclone.web.StaticFileHandler, {
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
217 "path": ".", "default_filename": "beaconmap.html"}),
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
218 (r"/devices", Devices),
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
219 (r'/points', Points),
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
220 (r'/sensors', Sensors),
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
221 (r'/save', Save),
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
222 (r'/positionEstimates', PositionEstimates),
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
223 ]))
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
224 log.info('serving on 9113')
299ddd7e2070 start bt beacon tools
drewp@bigasterisk.com
parents:
diff changeset
225 reactor.run()