From 208a82142c7f151cecd88e7331ed683cac911481 Mon Sep 17 00:00:00 2001 From: DasMoorhuhn Date: Sat, 22 Jun 2024 18:05:28 +0200 Subject: [PATCH] added device recocnition --- .gitignore | 3 ++- python/src/devices.example.yml | 8 ++++++++ python/src/devices.py | 23 +++++++++++++++++++++++ python/src/devices.yml | 8 -------- python/src/discovery.py | 33 ++++++++++++++++++++++----------- python/src/loop.py | 3 +-- python/src/main.py | 20 +++++++------------- 7 files changed, 63 insertions(+), 35 deletions(-) create mode 100644 python/src/devices.example.yml delete mode 100644 python/src/devices.yml diff --git a/.gitignore b/.gitignore index ed8ebf5..8647625 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -__pycache__ \ No newline at end of file +__pycache__ +devices.yml \ No newline at end of file diff --git a/python/src/devices.example.yml b/python/src/devices.example.yml new file mode 100644 index 0000000..30041aa --- /dev/null +++ b/python/src/devices.example.yml @@ -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" diff --git a/python/src/devices.py b/python/src/devices.py index 31e56f0..b5f480c 100644 --- a/python/src/devices.py +++ b/python/src/devices.py @@ -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 + + + + diff --git a/python/src/devices.yml b/python/src/devices.yml deleted file mode 100644 index ce23077..0000000 --- a/python/src/devices.yml +++ /dev/null @@ -1,8 +0,0 @@ -devices: - - "A4:C1:38:83:05:E8": - name: "My Sensor" - room: "My Room" - - - "...": - name: "..." - room: "..." diff --git a/python/src/discovery.py b/python/src/discovery.py index d01ff82..afe4609 100644 --- a/python/src/discovery.py +++ b/python/src/discovery.py @@ -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 diff --git a/python/src/loop.py b/python/src/loop.py index e50ca33..53abbbe 100644 --- a/python/src/loop.py +++ b/python/src/loop.py @@ -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) diff --git a/python/src/main.py b/python/src/main.py index 8f018a1..791c261 100644 --- a/python/src/main.py +++ b/python/src/main.py @@ -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')