Compare commits

...

3 Commits

Author SHA1 Message Date
J. Nick Koston 368fde9561 Move AdvertisementDataCallback import to TYPE_CHECKING 2026-04-18 21:35:24 -05:00
J. Nick Koston 4a782c4a42 Add test for detection_callback kwarg 2026-04-18 21:25:25 -05:00
J. Nick Koston dc37f33475 Add detection_callback kwarg to bluetooth.async_get_scanner
bleak removed register_detection_callback, so the detection callback
must now be passed via the BleakScanner constructor. Pass an optional
detection_callback through to HaBleakScannerWrapper so callers can wire
it up at construction time.
2026-04-18 21:22:48 -05:00
2 changed files with 33 additions and 2 deletions
+8 -2
View File
@@ -30,6 +30,7 @@ from .models import BluetoothCallback, BluetoothChange, ProcessAdvertisementCall
if TYPE_CHECKING:
from bleak.backends.device import BLEDevice
from bleak.backends.scanner import AdvertisementDataCallback
@singleton(DATA_MANAGER)
@@ -39,7 +40,10 @@ def _get_manager(hass: HomeAssistant) -> HomeAssistantBluetoothManager:
@hass_callback
def async_get_scanner(hass: HomeAssistant) -> BleakScanner:
def async_get_scanner(
hass: HomeAssistant,
detection_callback: AdvertisementDataCallback | None = None,
) -> BleakScanner:
"""Return a HaBleakScannerWrapper cast to BleakScanner.
This is a wrapper around our BleakScanner singleton that allows
@@ -48,7 +52,9 @@ def async_get_scanner(hass: HomeAssistant) -> BleakScanner:
The wrapper is cast to BleakScanner for type compatibility with
libraries expecting a BleakScanner instance.
"""
return cast(BleakScanner, HaBleakScannerWrapper())
return cast(
BleakScanner, HaBleakScannerWrapper(detection_callback=detection_callback)
)
@hass_callback
+25
View File
@@ -3121,6 +3121,31 @@ async def test_getting_the_scanner_returns_the_wrapped_instance(
assert isinstance(scanner, HaBleakScannerWrapper)
@pytest.mark.usefixtures("enable_bluetooth")
async def test_getting_the_scanner_with_detection_callback(
hass: HomeAssistant,
) -> None:
"""Test detection_callback is invoked for advertisements."""
detected: list[tuple[BLEDevice, AdvertisementData]] = []
def _detected(device: BLEDevice, advertisement_data: AdvertisementData) -> None:
detected.append((device, advertisement_data))
scanner = bluetooth.async_get_scanner(hass, detection_callback=_detected)
assert isinstance(scanner, HaBleakScannerWrapper)
switchbot_device = generate_ble_device("44:44:33:11:23:45", "wohand")
switchbot_adv = generate_advertisement_data(
local_name="wohand",
manufacturer_data={89: b"\xd8.\xad\xcd\r\x85"},
)
inject_advertisement(hass, switchbot_device, switchbot_adv)
await hass.async_block_till_done()
assert len(detected) == 1
assert detected[0][0].address == switchbot_device.address
@pytest.mark.usefixtures("enable_bluetooth")
async def test_scanner_count_connectable(hass: HomeAssistant) -> None:
"""Test getting the connectable scanner count."""