57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
import os
|
||
|
import sys
|
||
|
import json
|
||
|
import numpy
|
||
|
import subprocess
|
||
|
from bluepy.btle import Scanner, DefaultDelegate
|
||
|
from pprint import pprint
|
||
|
|
||
|
devices = ( {'name': 'charol', 'addr': 'd3:01:00:00:6a:32', 'values': [] }, )
|
||
|
|
||
|
class ScanReport2SD(DefaultDelegate):
|
||
|
def handleDiscovery(self, dev, isNewDev, isNewData):
|
||
|
if dev.rssi < -128:
|
||
|
return
|
||
|
|
||
|
for d in devices:
|
||
|
# quick and dirty
|
||
|
try:
|
||
|
if d['addr'] == dev.addr:
|
||
|
d['values'].append(dev.rssi)
|
||
|
except:
|
||
|
continue
|
||
|
|
||
|
def report():
|
||
|
data = {}
|
||
|
for d in devices:
|
||
|
list = d['values']
|
||
|
name = d['name']+'_litter'
|
||
|
if list == []:
|
||
|
data[name] = 0
|
||
|
print("DEBUG {} {}".format(name, list))
|
||
|
else:
|
||
|
# percentile85 has given good results to filter out cat/signal movement
|
||
|
percentile = numpy.percentile(numpy.array(list), 85)
|
||
|
# we reset values
|
||
|
d['values'] = []
|
||
|
# -60 is the rssi thershold we consider in place
|
||
|
if percentile < -60:
|
||
|
data[name] = 1
|
||
|
if percentile >= -60:
|
||
|
data[name] = 2
|
||
|
subprocess.run(["loginctl", "lock-session"])
|
||
|
print("DEBUG {} {} {}".format(name, percentile, list))
|
||
|
pprint(data)
|
||
|
f = open('/tmp/CatSpy.json', 'w')
|
||
|
f.write(json.dumps(data))
|
||
|
f.close()
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
scanner = Scanner().withDelegate(ScanReport2SD())
|
||
|
print ("Scanning for devices...")
|
||
|
while True:
|
||
|
scanner.scan(20)
|
||
|
report()
|