mirror of
https://github.com/home-assistant/core.git
synced 2025-07-20 19:57:07 +00:00
Add bluetooth api to get the count of connectable and non-connectable scanners (#77427)
This commit is contained in:
parent
6b9c4c7ec1
commit
40e8979951
@ -60,6 +60,7 @@ __all__ = [
|
|||||||
"async_rediscover_address",
|
"async_rediscover_address",
|
||||||
"async_register_callback",
|
"async_register_callback",
|
||||||
"async_track_unavailable",
|
"async_track_unavailable",
|
||||||
|
"async_scanner_count",
|
||||||
"BaseHaScanner",
|
"BaseHaScanner",
|
||||||
"BluetoothServiceInfo",
|
"BluetoothServiceInfo",
|
||||||
"BluetoothServiceInfoBleak",
|
"BluetoothServiceInfoBleak",
|
||||||
@ -86,6 +87,12 @@ def async_get_scanner(hass: HomeAssistant) -> HaBleakScannerWrapper:
|
|||||||
return 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
|
@hass_callback
|
||||||
def async_discovered_service_info(
|
def async_discovered_service_info(
|
||||||
hass: HomeAssistant, connectable: bool = True
|
hass: HomeAssistant, connectable: bool = True
|
||||||
|
@ -144,7 +144,7 @@ class BluetoothManager:
|
|||||||
] = []
|
] = []
|
||||||
self._history: dict[str, BluetoothServiceInfoBleak] = {}
|
self._history: dict[str, BluetoothServiceInfoBleak] = {}
|
||||||
self._connectable_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._connectable_scanners: list[BaseHaScanner] = []
|
||||||
self._adapters: dict[str, AdapterDetails] = {}
|
self._adapters: dict[str, AdapterDetails] = {}
|
||||||
|
|
||||||
@ -153,13 +153,19 @@ class BluetoothManager:
|
|||||||
"""Return if passive scan is supported."""
|
"""Return if passive scan is supported."""
|
||||||
return any(adapter[ADAPTER_PASSIVE_SCAN] for adapter in self._adapters.values())
|
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]:
|
async def async_diagnostics(self) -> dict[str, Any]:
|
||||||
"""Diagnostics for the manager."""
|
"""Diagnostics for the manager."""
|
||||||
scanner_diagnostics = await asyncio.gather(
|
scanner_diagnostics = await asyncio.gather(
|
||||||
*[
|
*[
|
||||||
scanner.async_diagnostics()
|
scanner.async_diagnostics()
|
||||||
for scanner in itertools.chain(
|
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]:
|
def _get_scanners_by_type(self, connectable: bool) -> list[BaseHaScanner]:
|
||||||
"""Return the scanners by type."""
|
"""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(
|
def _get_unavailable_callbacks_by_type(
|
||||||
self, connectable: bool
|
self, connectable: bool
|
||||||
|
@ -2333,6 +2333,22 @@ async def test_getting_the_scanner_returns_the_wrapped_instance(hass, enable_blu
|
|||||||
assert isinstance(scanner, models.HaBleakScannerWrapper)
|
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(
|
async def test_migrate_single_entry_macos(
|
||||||
hass, mock_bleak_scanner_start, macos_adapter
|
hass, mock_bleak_scanner_start, macos_adapter
|
||||||
):
|
):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user