#!/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()