Add bluetooth api to get the count of connectable and non-connectable scanners (#77427)

This commit is contained in:
J. Nick Koston 2022-08-29 09:21:30 -05:00 committed by GitHub
parent 6b9c4c7ec1
commit 40e8979951
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 3 deletions

View File

@ -60,6 +60,7 @@ __all__ = [
"async_rediscover_address",
"async_register_callback",
"async_track_unavailable",
"async_scanner_count",
"BaseHaScanner",
"BluetoothServiceInfo",
"BluetoothServiceInfoBleak",
@ -86,6 +87,12 @@ def async_get_scanner(hass: HomeAssistant) -> HaBleakScannerWrapper:
return HaBleakScannerWrapper()
@hass_callback
def async_scanner_count(hass: HomeAssistant, connectable: bool = True) -> int:
"""Return the number of scanners currently in use."""
return _get_manager(hass).async_scanner_count(connectable)
@hass_callback
def async_discovered_service_info(
hass: HomeAssistant, connectable: bool = True

View File

@ -144,7 +144,7 @@ class BluetoothManager:
] = []
self._history: dict[str, BluetoothServiceInfoBleak] = {}
self._connectable_history: dict[str, BluetoothServiceInfoBleak] = {}
self._scanners: list[BaseHaScanner] = []
self._non_connectable_scanners: list[BaseHaScanner] = []
self._connectable_scanners: list[BaseHaScanner] = []
self._adapters: dict[str, AdapterDetails] = {}
@ -153,13 +153,19 @@ class BluetoothManager:
"""Return if passive scan is supported."""
return any(adapter[ADAPTER_PASSIVE_SCAN] for adapter in self._adapters.values())
def async_scanner_count(self, connectable: bool = True) -> int:
"""Return the number of scanners."""
if connectable:
return len(self._connectable_scanners)
return len(self._connectable_scanners) + len(self._non_connectable_scanners)
async def async_diagnostics(self) -> dict[str, Any]:
"""Diagnostics for the manager."""
scanner_diagnostics = await asyncio.gather(
*[
scanner.async_diagnostics()
for scanner in itertools.chain(
self._scanners, self._connectable_scanners
self._non_connectable_scanners, self._connectable_scanners
)
]
)
@ -408,7 +414,11 @@ class BluetoothManager:
def _get_scanners_by_type(self, connectable: bool) -> list[BaseHaScanner]:
"""Return the scanners by type."""
return self._connectable_scanners if connectable else self._scanners
return (
self._connectable_scanners
if connectable
else self._non_connectable_scanners
)
def _get_unavailable_callbacks_by_type(
self, connectable: bool

View File

@ -2333,6 +2333,22 @@ async def test_getting_the_scanner_returns_the_wrapped_instance(hass, enable_blu
assert isinstance(scanner, models.HaBleakScannerWrapper)
async def test_scanner_count_connectable(hass, enable_bluetooth):
"""Test getting the connectable scanner count."""
scanner = models.BaseHaScanner()
cancel = bluetooth.async_register_scanner(hass, scanner, False)
assert bluetooth.async_scanner_count(hass, connectable=True) == 1
cancel()
async def test_scanner_count(hass, enable_bluetooth):
"""Test getting the connectable and non-connectable scanner count."""
scanner = models.BaseHaScanner()
cancel = bluetooth.async_register_scanner(hass, scanner, False)
assert bluetooth.async_scanner_count(hass, connectable=False) == 2
cancel()
async def test_migrate_single_entry_macos(
hass, mock_bleak_scanner_start, macos_adapter
):