diff --git a/turntouch/__init__.py b/turntouch/__init__.py index 791d2e38489afce1161f593e65cda660966f7c39..d3e0e27fa28c6686be41daac882babf899d317b6 100644 --- a/turntouch/__init__.py +++ b/turntouch/__init__.py @@ -4,47 +4,11 @@ from bluepy import btle from typing import List -TT_DEVICE_NAME = 'Turn Touch Remote' -TT_SHORT_DEVICE_NAME = 'Turn Touch Rem' -BLE_SHORT_DEVICE_NAME = 0x08 -BLE_COMPLETE_DEVICE_NAME = 0x09 logger = logging.getLogger('TurnTouch') -class DeviceFoundException(Exception): - """Exception thrown when a device is found to abort further scanning.""" - pass - - -class ScanDelegate(btle.DefaultDelegate): - """Handle callbacks for devices discovered by a BLE scan.""" - only_one = False - - def __init__(self, only_one=False, *args, **kwargs): - self.only_one = only_one - super(ScanDelegate, self).__init__(*args, **kwargs) - - def handleDiscovery(self, device, is_new_device, is_new_data): - """When a Turn Touch device is discovered, log a message. - If only searching for one device, short-circuit the scan by raising - a DeviceFoundException once we've found a Turn Touch device.""" - if is_new_device and is_turn_touch(device): - logger.info("Discovered device {address}".format( - address=device.addr)) - if self.only_one: - raise DeviceFoundException() - - class TurnTouch(btle.Peripheral): """A Turn Touch smart home remote.""" - pass - - -def is_turn_touch(device: btle.ScanEntry) -> bool: - """Determine whether a device found by btle.Scanner is a Turn Touch.""" - short_name = device.getValueText(BLE_SHORT_DEVICE_NAME) - name = device.getValueText(BLE_COMPLETE_DEVICE_NAME) - return (name == TT_DEVICE_NAME or short_name == TT_SHORT_DEVICE_NAME) def scan(device_index: int = 0, @@ -55,6 +19,40 @@ def scan(device_index: int = 0, :param timeout float: Scanning timeout, in seconds :param only_one float: Stop scanning after one Turn Touch is found :return list: Found TurnTouch devices""" + + TT_DEVICE_NAME = 'Turn Touch Remote' + TT_SHORT_DEVICE_NAME = 'Turn Touch Rem' + BLE_SHORT_DEVICE_NAME = 0x08 + BLE_COMPLETE_DEVICE_NAME = 0x09 + + class DeviceFoundException(Exception): + """Exception thrown when a device is found.""" + pass + + class ScanDelegate(btle.DefaultDelegate): + """Handle callbacks for devices discovered by a BLE scan.""" + only_one = False + + def __init__(self, only_one=False, *args, **kwargs): + self.only_one = only_one + super(ScanDelegate, self).__init__(*args, **kwargs) + + def handleDiscovery(self, device, is_new_device, is_new_data): + """When a Turn Touch device is discovered, log a message. + If only searching for one device, short-circuit the scan by raising + a DeviceFoundException once we've found a Turn Touch device.""" + if is_new_device and is_turn_touch(device): + logger.info("Discovered device {address}".format( + address=device.addr)) + if self.only_one: + raise DeviceFoundException() + + def is_turn_touch(device: btle.ScanEntry) -> bool: + """Determine whether a ScanEntry (device) is a Turn Touch.""" + short_name = device.getValueText(BLE_SHORT_DEVICE_NAME) + name = device.getValueText(BLE_COMPLETE_DEVICE_NAME) + return name == TT_DEVICE_NAME or short_name == TT_SHORT_DEVICE_NAME + scanner = btle.Scanner(device_index) try: scanner.withDelegate(ScanDelegate(only_one)).scan(timeout)