Mercurial > code > home > repos > homeauto
changeset 1265:1ddd1f057749
some old Measurement and Locator edits
Ignore-this: 188ecdf63f49b7a58f99a5961c6c23a6
darcs-hash:53fc6d5070d1ac0ad286c9c4d59a85dc134f3f02
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Sat, 20 Apr 2019 23:35:46 -0700 |
parents | c5b13d630d90 |
children | ee5698ef64dd |
files | service/beacon/locator.py service/beacon/makefile service/beacon/rssiscan.py |
diffstat | 3 files changed, 82 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/beacon/locator.py Sat Apr 20 23:35:46 2019 -0700 @@ -0,0 +1,59 @@ +from __future__ import division +import ast, math + +class Measurement(object): + def __init__(self, d): + self.d = d + + def distanceTo(self, other): + sharedKeys = set(self.d).intersection(other.d) + return math.sqrt(sum((other.d[f] - self.d[f])**2 for f in sharedKeys)) + +class Locator(object): + def __init__(self): + self.points = {} # num : (meas, coord) + for lineLev, lineCoord in zip(open('saved_points'), open('saved_points_coords')): + n, d = lineLev.split(None, 1) + c = ast.literal_eval(lineCoord) + if c['num'] != int(n): + raise ValueError("%r vs %r" % (lineLev, lineCoord)) + self.points[c['num']] = (Measurement(ast.literal_eval(d)), + (round(c['x'], 3), round(c['y'], 3), round(c['z'], 3))) + for junk in [1, 2, 28, 29]: + del self.points[junk] + + def nearestPoints(self, meas): + out = [] # (dist, coord) + for num, (knownMeas, coord) in self.points.iteritems(): + out.append((round(knownMeas.distanceTo(meas), 2), coord)) + out.sort() + return out + + def estimatePosition(self, nearest): + """list of (dist, coord) -> weighted coord""" + floors = [row[1][2] for row in nearest] + freqs = [(floors.count(z), z) for z in floors] + freqs.sort() + bestFloor = freqs[-1][1] + sameFloorMatches = [(dist, coord) for dist, coord in nearest + if coord[2] == bestFloor] + sameFloorMatches.sort() + sameFloorMatches = sameFloorMatches[:3] + + weightedCoord = [0, 0, 0] + totalWeight = 0 + for dist, coord in sameFloorMatches: + weight = (1 / (dist - sameFloorMatches[0][0] + .2)) + totalWeight += weight + for i in range(3): + weightedCoord[i] += weight * coord[i] + for i in range(3): + weightedCoord[i] /= totalWeight + return weightedCoord + +if __name__ == '__main__': + loc = Locator() + for row in loc.nearestPoints(Measurement({"bed":-78.2,"changing":-90.2,"living":-68})): + print row + +
--- a/service/beacon/makefile Sat Apr 20 23:33:39 2019 -0700 +++ b/service/beacon/makefile Sat Apr 20 23:35:46 2019 -0700 @@ -1,4 +1,4 @@ -build_image: +build_image_x86: docker build --network=host -t bang6:5000/beacon_x86:latest . docker push bang6:5000/beacon_x86:latest @@ -11,3 +11,9 @@ local_run: docker run --rm -it -p 10004:10004 --net=host bang6:5000/beacon_x86:latest + +fresh_sudo: + sudo -v +redeploy_x86: fresh_sudo build_image_x86 + sudo /my/proj/ansible/playbook -l dash,bang -t rfid + supervisorctl -s http://$(RUNHOST):9001/ restart $(JOB)_$(PORT)
--- a/service/beacon/rssiscan.py Sat Apr 20 23:33:39 2019 -0700 +++ b/service/beacon/rssiscan.py Sat Apr 20 23:35:46 2019 -0700 @@ -176,21 +176,22 @@ rows = list(evt_le_advertising_report_dump(pkt)) for row in sorted(rows): rssi = row.pop('rssi') - points.append(dict( - measurement='rssi', - tags={'from': source, 'toAddr': row['addr']}, - fields={'value': rssi}, - time=nowMs, - )) - key = (row['addr'], row['evt_type']) - if lastDoc.get(key) != row: - # should check mongodb here- maybe another - # node already wrote this row - lastDoc.put(key, row) - row = row.copy() - row['t'] = now - coll.insert(row) - + if row['addr_type'] == 'Public': # or, someday, if it's a device we know + points.append(dict( + measurement='rssi', + tags={'from': source, 'toAddr': row['addr']}, + fields={'value': rssi}, + time=nowMs, + )) + key = (row['addr'], row['evt_type']) + if lastDoc.get(key) != row: + # should check mongodb here- maybe another + # node already wrote this row + lastDoc.put(key, row) + row = row.copy() + row['t'] = now + coll.insert(row) + influx.write_points(points, time_precision='ms') sock.setsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, old_filter )