annotate service/beacon/beaconmap.py @ 1423:ba56263fe3b2

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