WIP find_devices

This commit is contained in:
Jan Mrna 2022-08-15 23:39:20 +02:00
parent 3da00c737e
commit d4052e819a
3 changed files with 41 additions and 7 deletions

View File

@ -1,10 +1,30 @@
from typing import Final, Dict from typing import Final, Dict, Any, TypeVar, Type
from .generic import Device from .generic import Device, NoResponseError
from .sensor_wired_IAQ import SensorWiredIAQ from .sensor_wired_IAQ import SensorWiredIAQ
from .sensor_wired_RHT import SensorWiredRHT from .sensor_wired_RHT import SensorWiredRHT
# links device identifiers to its class # links device identifiers to its class
device_identifiers: Final[Dict[int, Device]] = { DEVICE_IDENTIFIERS: Final[Dict[int, Device]] = {
SensorWiredIAQ.DEVICE_CODE: SensorWiredIAQ, SensorWiredIAQ.DEVICE_CODE: SensorWiredIAQ,
SensorWiredRHT.DEVICE_CODE: SensorWiredRHT, SensorWiredRHT.DEVICE_CODE: SensorWiredRHT,
} }
T = TypeVar("T", bound=Device)
def find_devices(device_cls: Type[T], address_space: list[Any]) -> list[T]:
"""
Look for devices in given address space
"""
# found_devices = []
# for address in address_space:
# try:
# found_devices.append(device_cls(address))
# except NoResponseError:
# pass
# return found_devices
return list(filter(device_cls.probe, address_space))
# TODO add device args
# TODO return devices themselves, not addresses
# TODO add .address to Device

View File

@ -1,7 +1,7 @@
"""Module containing classes for generic wired/wireless devices""" """Module containing classes for generic wired/wireless devices"""
from dataclasses import dataclass from dataclasses import dataclass
from typing import Dict, Final, Any from typing import Dict, Final, Any
from abc import ABC, abstractmethod from abc import ABC, abstractclassmethod, abstractmethod, abstractstaticmethod
import minimalmodbus import minimalmodbus
import serial import serial
@ -27,7 +27,7 @@ class ReadoutErrorCounter:
no_response: int = 0 no_response: int = 0
class NoResponseException(Exception): class NoResponseError(Exception):
""" """
Raised when device fails to respond Raised when device fails to respond
""" """
@ -59,6 +59,20 @@ class Device(ABC):
Return serial number, unique for each device Return serial number, unique for each device
""" """
@classmethod
def probe(cls, address) -> bool:
"""
Probe given address, return True if device detected,
False otherwise
"""
# try instantiating; this raises NoResponseError
# if device not detected
try:
_ = cls(address)
except NoResponseError:
return False
return True
class ModbusRTUDevice(Device): class ModbusRTUDevice(Device):
""" """
@ -103,7 +117,7 @@ class ModbusRTUDevice(Device):
try: try:
self.read_register(self.input_registers["SERIAL_NUMBER_1"]) self.read_register(self.input_registers["SERIAL_NUMBER_1"])
except minimalmodbus.NoResponseError as exc: except minimalmodbus.NoResponseError as exc:
raise NoResponseException from exc raise NoResponseError from exc
def read_register( def read_register(
self, register_number: int, signed: bool = False, retries: int = 10 self, register_number: int, signed: bool = False, retries: int = 10