added device recocnition

This commit is contained in:
DasMoorhuhn 2024-06-22 18:05:28 +02:00
parent 6d5b2a6850
commit 208a82142c
7 changed files with 63 additions and 35 deletions

3
.gitignore vendored
View File

@ -1 +1,2 @@
__pycache__
__pycache__
devices.yml

View File

@ -0,0 +1,8 @@
devices:
- mac: A4:C1:38:00:00:00
name: "my_device_1"
room: "my_room_1"
- mac: A4:C1:38:00:00:00
name: "my_device_2"
room: "my_room_2"

View File

@ -1,2 +1,25 @@
import yaml
import os
workdir, filename = os.path.split(os.path.abspath(__file__))
config_file = f"{workdir}{os.sep}devices.yml"
class Device:
def __init__(self, data):
self.mac = data['mac']
self.name = data['name']
self.room = data['room']
def get_devices():
devices_list = []
with open(file=config_file, mode='r') as file:
devices = yaml.safe_load(file)
for device in devices['devices']: devices_list.append(Device(data=device))
return devices_list

View File

@ -1,8 +0,0 @@
devices:
- "A4:C1:38:83:05:E8":
name: "My Sensor"
room: "My Room"
- "...":
name: "..."
room: "..."

View File

@ -1,10 +1,9 @@
import asyncio
from threading import Thread
from bluepy.btle import DefaultDelegate
from bluepy.btle import Scanner
from datetime import datetime
from data_class import Data
from devices import get_devices as get_device_from_config
# This is the list, where the responses will be stored from the `handleDiscovery`
devices = []
@ -21,6 +20,7 @@ class ScanDelegate(DefaultDelegate):
if self.is_temperature(sdid, val):
data_obj = Data(self.parse_data(val))
if self.is_atc_device(dev, data_obj):
device_from_config = self.get_device(dev)
devices.append([dev, data_obj])
@staticmethod
@ -29,13 +29,16 @@ class ScanDelegate(DefaultDelegate):
if len(val) != 30: return False
return True
@staticmethod
def is_atc_device(dev, data_obj):
def is_atc_device(self, dev, data_obj):
global devices
if 'A4:C1:38' not in dev.addr.upper(): return False
for device in devices:
if str(device[0].addr) == str(dev.addr): return False
print("Device %s (%s), RSSI=%d dB" % (dev.addr.upper(), dev.addrType, dev.rssi))
device_from_config = self.get_device(dev)
try:print(f"Device: {dev.addr.upper()} ({dev.addrType}), RSSI: {dev.rssi} dB, Room: {device_from_config.room}")
except:print(f"Device: {dev.addr.upper()} ({dev.addrType}), RSSI: {dev.rssi} dB, Room: ?")
print(f'\tTemp: {data_obj.temperature}°C, Humid: {data_obj.humidity}%, Batt: {data_obj.battery_percent}%\n')
return True
@ -54,12 +57,20 @@ class ScanDelegate(DefaultDelegate):
'count': bytes[14],
}
@staticmethod
def get_device(dev):
return next((d for d in get_device_from_config() if d.mac == dev.addr.upper()), None)
def start_discovery(timeout=10.0):
global devices
print(f'Start discovery with timout {timeout}s...')
scanner = Scanner().withDelegate(ScanDelegate())
scanner.scan(timeout=timeout, passive=True)
class Discovery:
def __init__(self):
pass
return devices
def start_discovery(self, timeout=20.0):
global devices
print(f'Start discovery with timout {timeout}s...')
scanner = Scanner().withDelegate(ScanDelegate())
scanner.scan(timeout=timeout, passive=True)
return devices

View File

@ -1,9 +1,8 @@
from time import sleep
from discovery import start_discovery
def start_loop(interval=60):
while True:
from discovery import start_discovery
start_discovery()
sleep(interval)

View File

@ -1,19 +1,13 @@
from discovery import start_discovery
from discovery import Discovery
from data_class import Data
from loop import start_loop
from time import sleep
devices = start_discovery()
while True:
discovery = Discovery()
devices = discovery.start_discovery()
sleep(10)
if len(devices) > 0:
for device_list in devices:
data = device_list[1]
device = device_list[0]
data:Data
# print(f'Temp: {data.temperature}°C, Humid: {data.humidity}%, Batt: {data.battery_percent}%')
else:
print('No devices found')