Support for custom Bluetooth adapter on switchbot.bluetooth.

This commit is contained in:
Fabio Manganiello 2023-02-08 23:00:10 +01:00
parent 8469a1027f
commit f30e077a5a
Signed by untrusted user: blacklight
GPG key ID: D90FBA7F76362774

View file

@ -53,11 +53,13 @@ class SwitchbotBluetoothPlugin(AsyncRunnablePlugin, EnumSwitchEntityManager):
def __init__( def __init__(
self, self,
interface: Optional[str] = None,
connect_timeout: Optional[float] = 5, connect_timeout: Optional[float] = 5,
device_names: Optional[Dict[str, str]] = None, device_names: Optional[Dict[str, str]] = None,
**kwargs, **kwargs,
): ):
""" """
:param interface: Name of the Bluetooth interface to use (default: first available).
:param connect_timeout: Timeout in seconds for the connection to the :param connect_timeout: Timeout in seconds for the connection to the
Switchbot device. Default: 5 seconds Switchbot device. Default: 5 seconds
:param device_names: Bluetooth address -> device name mapping. If not :param device_names: Bluetooth address -> device name mapping. If not
@ -75,6 +77,7 @@ class SwitchbotBluetoothPlugin(AsyncRunnablePlugin, EnumSwitchEntityManager):
""" """
super().__init__(**kwargs) super().__init__(**kwargs)
self._interface = interface
self._connect_timeout = connect_timeout if connect_timeout else 5 self._connect_timeout = connect_timeout if connect_timeout else 5
self._scan_lock = RLock() self._scan_lock = RLock()
self._devices: Dict[str, BLEDevice] = {} self._devices: Dict[str, BLEDevice] = {}
@ -95,7 +98,9 @@ class SwitchbotBluetoothPlugin(AsyncRunnablePlugin, EnumSwitchEntityManager):
Switchbot registered ``tx`` service. Switchbot registered ``tx`` service.
""" """
dev = await self._get_device(device) dev = await self._get_device(device)
async with BleakClient(dev.address, timeout=self._connect_timeout) as client: async with BleakClient(
dev.address, adapter=self._interface, timeout=self._connect_timeout
) as client:
await client.write_gatt_char(str(uuid), command.value) await client.write_gatt_char(str(uuid), command.value)
async def _get_device(self, device: str) -> BLEDevice: async def _get_device(self, device: str) -> BLEDevice:
@ -196,7 +201,10 @@ class SwitchbotBluetoothPlugin(AsyncRunnablePlugin, EnumSwitchEntityManager):
async def _scan(self, duration: Optional[float] = None) -> Collection[Entity]: async def _scan(self, duration: Optional[float] = None) -> Collection[Entity]:
with self._scan_lock: with self._scan_lock:
timeout = duration or self.poll_interval or 5 timeout = duration or self.poll_interval or 5
devices = await BleakScanner.discover(timeout=timeout) devices = await BleakScanner.discover(
adapter=self._interface, timeout=timeout
)
compatible_devices = [ compatible_devices = [
d d
for d in devices for d in devices