From e50fe799114610c05362937790eace4857a733f0 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 20 Dec 2023 20:37:39 -1000 Subject: [PATCH] Update habluetooth to 2.0.0 (#106145) --- .../components/bluetooth/__init__.py | 2 +- homeassistant/components/bluetooth/api.py | 5 +--- homeassistant/components/bluetooth/manager.py | 5 +--- .../components/bluetooth/manifest.json | 2 +- homeassistant/components/esphome/bluetooth.py | 2 +- .../components/ruuvi_gateway/bluetooth.py | 2 +- .../components/shelly/bluetooth/__init__.py | 2 +- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- .../bluetooth/test_advertisement_tracker.py | 2 +- tests/components/bluetooth/test_api.py | 8 +++---- .../components/bluetooth/test_base_scanner.py | 24 +++++++++---------- .../components/bluetooth/test_diagnostics.py | 12 +++++----- tests/components/bluetooth/test_init.py | 4 ++-- tests/components/bluetooth/test_manager.py | 20 +++++++--------- tests/components/bluetooth/test_models.py | 13 +++++----- tests/components/bluetooth/test_wrappers.py | 4 ++-- 18 files changed, 53 insertions(+), 60 deletions(-) diff --git a/homeassistant/components/bluetooth/__init__.py b/homeassistant/components/bluetooth/__init__.py index 234712bddaf..2dd4f06ecdf 100644 --- a/homeassistant/components/bluetooth/__init__.py +++ b/homeassistant/components/bluetooth/__init__.py @@ -303,7 +303,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: adapters = await manager.async_get_bluetooth_adapters() details = adapters[adapter] slots: int = details.get(ADAPTER_CONNECTION_SLOTS) or DEFAULT_CONNECTION_SLOTS - entry.async_on_unload(async_register_scanner(hass, scanner, True, slots)) + entry.async_on_unload(async_register_scanner(hass, scanner, connection_slots=slots)) await async_update_device(hass, entry, adapter, details) hass.data.setdefault(DOMAIN, {})[entry.entry_id] = scanner entry.async_on_unload(entry.add_update_listener(async_update_listener)) diff --git a/homeassistant/components/bluetooth/api.py b/homeassistant/components/bluetooth/api.py index 4acb8d91c84..29054a54e72 100644 --- a/homeassistant/components/bluetooth/api.py +++ b/homeassistant/components/bluetooth/api.py @@ -181,13 +181,10 @@ def async_rediscover_address(hass: HomeAssistant, address: str) -> None: def async_register_scanner( hass: HomeAssistant, scanner: BaseHaScanner, - connectable: bool, connection_slots: int | None = None, ) -> CALLBACK_TYPE: """Register a BleakScanner.""" - return _get_manager(hass).async_register_scanner( - scanner, connectable, connection_slots - ) + return _get_manager(hass).async_register_scanner(scanner, connection_slots) @hass_callback diff --git a/homeassistant/components/bluetooth/manager.py b/homeassistant/components/bluetooth/manager.py index 5508f58c82b..381beb02520 100644 --- a/homeassistant/components/bluetooth/manager.py +++ b/homeassistant/components/bluetooth/manager.py @@ -220,7 +220,6 @@ class HomeAssistantBluetoothManager(BluetoothManager): def async_register_scanner( self, scanner: BaseHaScanner, - connectable: bool, connection_slots: int | None = None, ) -> CALLBACK_TYPE: """Register a scanner.""" @@ -228,7 +227,5 @@ class HomeAssistantBluetoothManager(BluetoothManager): if history := self.storage.async_get_advertisement_history(scanner.source): scanner.restore_discovered_devices(history) - unregister = super().async_register_scanner( - scanner, connectable, connection_slots - ) + unregister = super().async_register_scanner(scanner, connection_slots) return partial(self._async_unregister_scanner, scanner, unregister) diff --git a/homeassistant/components/bluetooth/manifest.json b/homeassistant/components/bluetooth/manifest.json index b5bce32148a..e911038b9f6 100644 --- a/homeassistant/components/bluetooth/manifest.json +++ b/homeassistant/components/bluetooth/manifest.json @@ -20,6 +20,6 @@ "bluetooth-auto-recovery==1.2.3", "bluetooth-data-tools==1.18.0", "dbus-fast==2.21.0", - "habluetooth==1.0.0" + "habluetooth==2.0.0" ] } diff --git a/homeassistant/components/esphome/bluetooth.py b/homeassistant/components/esphome/bluetooth.py index 9534074b678..24524233a70 100644 --- a/homeassistant/components/esphome/bluetooth.py +++ b/homeassistant/components/esphome/bluetooth.py @@ -38,7 +38,7 @@ async def async_connect_scanner( return partial( _async_unload, [ - async_register_scanner(hass, scanner, scanner.connectable), + async_register_scanner(hass, scanner), scanner.async_setup(), ], ) diff --git a/homeassistant/components/ruuvi_gateway/bluetooth.py b/homeassistant/components/ruuvi_gateway/bluetooth.py index d3cf1e81379..c4fbe474776 100644 --- a/homeassistant/components/ruuvi_gateway/bluetooth.py +++ b/homeassistant/components/ruuvi_gateway/bluetooth.py @@ -84,7 +84,7 @@ def async_connect_scanner( coordinator=coordinator, ) unload_callbacks = [ - async_register_scanner(hass, scanner, connectable=False), + async_register_scanner(hass, scanner), scanner.async_setup(), scanner.start_polling(), ] diff --git a/homeassistant/components/shelly/bluetooth/__init__.py b/homeassistant/components/shelly/bluetooth/__init__.py index 92c630323ba..2f9019ba5e6 100644 --- a/homeassistant/components/shelly/bluetooth/__init__.py +++ b/homeassistant/components/shelly/bluetooth/__init__.py @@ -43,7 +43,7 @@ async def async_connect_scanner( ) scanner = ShellyBLEScanner(source, entry.title, connector, False) unload_callbacks = [ - async_register_scanner(hass, scanner, False), + async_register_scanner(hass, scanner), scanner.async_setup(), coordinator.async_subscribe_events(scanner.async_on_event), ] diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index 50b6fe01a6b..5a43dbe2f06 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -23,7 +23,7 @@ dbus-fast==2.21.0 fnv-hash-fast==0.5.0 ha-av==10.1.1 ha-ffmpeg==3.1.0 -habluetooth==1.0.0 +habluetooth==2.0.0 hass-nabucasa==0.75.1 hassil==1.5.1 home-assistant-bluetooth==1.11.0 diff --git a/requirements_all.txt b/requirements_all.txt index 09ccea97ec7..f685fa29564 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -989,7 +989,7 @@ ha-philipsjs==3.1.1 habitipy==0.2.0 # homeassistant.components.bluetooth -habluetooth==1.0.0 +habluetooth==2.0.0 # homeassistant.components.cloud hass-nabucasa==0.75.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index a08abd5fd95..334bf7d2044 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -788,7 +788,7 @@ ha-philipsjs==3.1.1 habitipy==0.2.0 # homeassistant.components.bluetooth -habluetooth==1.0.0 +habluetooth==2.0.0 # homeassistant.components.cloud hass-nabucasa==0.75.1 diff --git a/tests/components/bluetooth/test_advertisement_tracker.py b/tests/components/bluetooth/test_advertisement_tracker.py index 190b05e60e8..f90b82fc379 100644 --- a/tests/components/bluetooth/test_advertisement_tracker.py +++ b/tests/components/bluetooth/test_advertisement_tracker.py @@ -346,7 +346,7 @@ async def test_advertisment_interval_longer_than_adapter_stack_timeout_adapter_c switchbot_device_went_unavailable = False scanner = FakeScanner("new", "fake_adapter") - cancel_scanner = async_register_scanner(hass, scanner, False) + cancel_scanner = async_register_scanner(hass, scanner) @callback def _switchbot_device_unavailable_callback(_address: str) -> None: diff --git a/tests/components/bluetooth/test_api.py b/tests/components/bluetooth/test_api.py index 732fce4c8e2..a42752dcfc7 100644 --- a/tests/components/bluetooth/test_api.py +++ b/tests/components/bluetooth/test_api.py @@ -28,7 +28,7 @@ async def test_scanner_by_source(hass: HomeAssistant, enable_bluetooth: None) -> """Test we can get a scanner by source.""" hci2_scanner = FakeScanner("hci2", "hci2") - cancel_hci2 = bluetooth.async_register_scanner(hass, hci2_scanner, True) + cancel_hci2 = bluetooth.async_register_scanner(hass, hci2_scanner) assert async_scanner_by_source(hass, "hci2") is hci2_scanner cancel_hci2() @@ -74,9 +74,9 @@ async def test_async_scanner_devices_by_address_connectable( connector = ( HaBluetoothConnector(MockBleakClient, "mock_bleak_client", lambda: False), ) - scanner = FakeInjectableScanner("esp32", "esp32", connector, False) + scanner = FakeInjectableScanner("esp32", "esp32", connector, True) unsetup = scanner.async_setup() - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) switchbot_device = generate_ble_device( "44:44:33:11:23:45", "wohand", @@ -141,7 +141,7 @@ async def test_async_scanner_devices_by_address_non_connectable( HaBluetoothConnector(MockBleakClient, "mock_bleak_client", lambda: False), ) scanner = FakeStaticScanner("esp32", "esp32", connector) - cancel = manager.async_register_scanner(scanner, False) + cancel = manager.async_register_scanner(scanner) assert scanner.discovered_devices_and_advertisement_data == { switchbot_device.address: (switchbot_device, switchbot_device_adv) diff --git a/tests/components/bluetooth/test_base_scanner.py b/tests/components/bluetooth/test_base_scanner.py index 4f60fc9ef9b..e1d64115e86 100644 --- a/tests/components/bluetooth/test_base_scanner.py +++ b/tests/components/bluetooth/test_base_scanner.py @@ -116,7 +116,7 @@ async def test_remote_scanner( ) scanner = FakeScanner("esp32", "esp32", connector, True) unsetup = scanner.async_setup() - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) scanner.inject_advertisement(switchbot_device, switchbot_device_adv) @@ -182,7 +182,7 @@ async def test_remote_scanner_expires_connectable( ) scanner = FakeScanner("esp32", "esp32", connector, True) unsetup = scanner.async_setup() - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) start_time_monotonic = time.monotonic() scanner.inject_advertisement(switchbot_device, switchbot_device_adv) @@ -234,9 +234,9 @@ async def test_remote_scanner_expires_non_connectable( connector = ( HaBluetoothConnector(MockBleakClient, "mock_bleak_client", lambda: False), ) - scanner = FakeScanner("esp32", "esp32", connector, False) + scanner = FakeScanner("esp32", "esp32", connector, True) unsetup = scanner.async_setup() - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) start_time_monotonic = time.monotonic() scanner.inject_advertisement(switchbot_device, switchbot_device_adv) @@ -308,9 +308,9 @@ async def test_base_scanner_connecting_behavior( connector = ( HaBluetoothConnector(MockBleakClient, "mock_bleak_client", lambda: False), ) - scanner = FakeScanner("esp32", "esp32", connector, False) + scanner = FakeScanner("esp32", "esp32", connector, True) unsetup = scanner.async_setup() - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) with scanner.connecting(): assert scanner.scanning is False @@ -366,7 +366,7 @@ async def test_restore_history_remote_adapter( True, ) unsetup = scanner.async_setup() - cancel = _get_manager().async_register_scanner(scanner, True) + cancel = _get_manager().async_register_scanner(scanner) assert "EB:0B:36:35:6F:A4" in scanner.discovered_devices_and_advertisement_data assert "E3:A5:63:3E:5E:23" not in scanner.discovered_devices_and_advertisement_data @@ -380,7 +380,7 @@ async def test_restore_history_remote_adapter( True, ) unsetup = scanner.async_setup() - cancel = _get_manager().async_register_scanner(scanner, True) + cancel = _get_manager().async_register_scanner(scanner) assert "EB:0B:36:35:6F:A4" in scanner.discovered_devices_and_advertisement_data assert "E3:A5:63:3E:5E:23" not in scanner.discovered_devices_and_advertisement_data @@ -410,9 +410,9 @@ async def test_device_with_ten_minute_advertising_interval( connector = ( HaBluetoothConnector(MockBleakClient, "mock_bleak_client", lambda: False), ) - scanner = FakeScanner("esp32", "esp32", connector, False) + scanner = FakeScanner("esp32", "esp32", connector, True) unsetup = scanner.async_setup() - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) monotonic_now = time.monotonic() new_time = monotonic_now @@ -501,9 +501,9 @@ async def test_scanner_stops_responding( connector = ( HaBluetoothConnector(MockBleakClient, "mock_bleak_client", lambda: False), ) - scanner = FakeScanner("esp32", "esp32", connector, False) + scanner = FakeScanner("esp32", "esp32", connector, True) unsetup = scanner.async_setup() - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) start_time_monotonic = time.monotonic() diff --git a/tests/components/bluetooth/test_diagnostics.py b/tests/components/bluetooth/test_diagnostics.py index f70c301dcfe..a8e693c3f99 100644 --- a/tests/components/bluetooth/test_diagnostics.py +++ b/tests/components/bluetooth/test_diagnostics.py @@ -457,9 +457,9 @@ async def test_diagnostics_remote_adapter( connector = ( HaBluetoothConnector(MockBleakClient, "mock_bleak_client", lambda: False), ) - scanner = FakeScanner("esp32", "esp32", connector, False) + scanner = FakeScanner("esp32", "esp32", connector, True) unsetup = scanner.async_setup() - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) scanner.inject_advertisement(switchbot_device, switchbot_adv) inject_advertisement(hass, switchbot_device, switchbot_adv) @@ -511,7 +511,7 @@ async def test_diagnostics_remote_adapter( -127, [], ], - "connectable": False, + "connectable": True, "device": { "__type": "", "repr": "BLEDevice(44:44:33:11:23:45, wohand)", @@ -537,7 +537,7 @@ async def test_diagnostics_remote_adapter( [], -127, -127, - [[]], + [], ], "connectable": True, "device": { @@ -551,7 +551,7 @@ async def test_diagnostics_remote_adapter( "rssi": -127, "service_data": {}, "service_uuids": [], - "source": "local", + "source": "esp32", "time": ANY, } ], @@ -595,7 +595,7 @@ async def test_diagnostics_remote_adapter( "type": "FakeHaScanner", }, { - "connectable": False, + "connectable": True, "discovered_device_timestamps": {"44:44:33:11:23:45": ANY}, "discovered_devices_and_advertisement_data": [ { diff --git a/tests/components/bluetooth/test_init.py b/tests/components/bluetooth/test_init.py index 52624e67996..1659b989af0 100644 --- a/tests/components/bluetooth/test_init.py +++ b/tests/components/bluetooth/test_init.py @@ -2816,7 +2816,7 @@ async def test_scanner_count_connectable( ) -> None: """Test getting the connectable scanner count.""" scanner = FakeScanner("any", "any") - cancel = bluetooth.async_register_scanner(hass, scanner, False) + cancel = bluetooth.async_register_scanner(hass, scanner) assert bluetooth.async_scanner_count(hass, connectable=True) == 1 cancel() @@ -2824,7 +2824,7 @@ async def test_scanner_count_connectable( async def test_scanner_count(hass: HomeAssistant, enable_bluetooth: None) -> None: """Test getting the connectable and non-connectable scanner count.""" scanner = FakeScanner("any", "any") - cancel = bluetooth.async_register_scanner(hass, scanner, False) + cancel = bluetooth.async_register_scanner(hass, scanner) assert bluetooth.async_scanner_count(hass, connectable=False) == 2 cancel() diff --git a/tests/components/bluetooth/test_manager.py b/tests/components/bluetooth/test_manager.py index 2a470feacfa..212f45bb5f0 100644 --- a/tests/components/bluetooth/test_manager.py +++ b/tests/components/bluetooth/test_manager.py @@ -55,7 +55,7 @@ from tests.common import async_fire_time_changed, load_fixture def register_hci0_scanner(hass: HomeAssistant) -> Generator[None, None, None]: """Register an hci0 scanner.""" hci0_scanner = FakeScanner("hci0", "hci0") - cancel = bluetooth.async_register_scanner(hass, hci0_scanner, True) + cancel = bluetooth.async_register_scanner(hass, hci0_scanner) yield cancel() @@ -64,7 +64,7 @@ def register_hci0_scanner(hass: HomeAssistant) -> Generator[None, None, None]: def register_hci1_scanner(hass: HomeAssistant) -> Generator[None, None, None]: """Register an hci1 scanner.""" hci1_scanner = FakeScanner("hci1", "hci1") - cancel = bluetooth.async_register_scanner(hass, hci1_scanner, True) + cancel = bluetooth.async_register_scanner(hass, hci1_scanner) yield cancel() @@ -559,9 +559,7 @@ async def test_switching_adapters_when_one_goes_away( hass: HomeAssistant, enable_bluetooth: None, register_hci0_scanner: None ) -> None: """Test switching adapters when one goes away.""" - cancel_hci2 = bluetooth.async_register_scanner( - hass, FakeScanner("hci2", "hci2"), True - ) + cancel_hci2 = bluetooth.async_register_scanner(hass, FakeScanner("hci2", "hci2")) address = "44:44:33:11:23:45" @@ -611,7 +609,7 @@ async def test_switching_adapters_when_one_stop_scanning( ) -> None: """Test switching adapters when stops scanning.""" hci2_scanner = FakeScanner("hci2", "hci2") - cancel_hci2 = bluetooth.async_register_scanner(hass, hci2_scanner, True) + cancel_hci2 = bluetooth.async_register_scanner(hass, hci2_scanner) address = "44:44:33:11:23:45" @@ -730,7 +728,7 @@ async def test_goes_unavailable_connectable_only_and_recovers( ) unsetup_connectable_scanner = connectable_scanner.async_setup() cancel_connectable_scanner = _get_manager().async_register_scanner( - connectable_scanner, True + connectable_scanner ) connectable_scanner.inject_advertisement( switchbot_device_connectable, switchbot_device_adv @@ -752,7 +750,7 @@ async def test_goes_unavailable_connectable_only_and_recovers( ) unsetup_not_connectable_scanner = not_connectable_scanner.async_setup() cancel_not_connectable_scanner = _get_manager().async_register_scanner( - not_connectable_scanner, False + not_connectable_scanner ) not_connectable_scanner.inject_advertisement( switchbot_device_non_connectable, switchbot_device_adv @@ -801,7 +799,7 @@ async def test_goes_unavailable_connectable_only_and_recovers( ) unsetup_connectable_scanner_2 = connectable_scanner_2.async_setup() cancel_connectable_scanner_2 = _get_manager().async_register_scanner( - connectable_scanner, True + connectable_scanner ) connectable_scanner_2.inject_advertisement( switchbot_device_connectable, switchbot_device_adv @@ -902,7 +900,7 @@ async def test_goes_unavailable_dismisses_discovery_and_makes_discoverable( ) unsetup_connectable_scanner = non_connectable_scanner.async_setup() cancel_connectable_scanner = _get_manager().async_register_scanner( - non_connectable_scanner, True + non_connectable_scanner ) with patch.object(hass.config_entries.flow, "async_init") as mock_config_flow: non_connectable_scanner.inject_advertisement( @@ -914,7 +912,7 @@ async def test_goes_unavailable_dismisses_discovery_and_makes_discoverable( assert mock_config_flow.mock_calls[0][1][0] == "switchbot" assert async_ble_device_from_address(hass, "44:44:33:11:23:45", False) is not None - assert async_scanner_count(hass, connectable=True) == 1 + assert async_scanner_count(hass, connectable=False) == 1 assert len(callbacks) == 1 assert ( diff --git a/tests/components/bluetooth/test_models.py b/tests/components/bluetooth/test_models.py index 6e8181b5a22..9b513ed2197 100644 --- a/tests/components/bluetooth/test_models.py +++ b/tests/components/bluetooth/test_models.py @@ -107,7 +107,8 @@ async def test_wrapped_bleak_client_local_adapter_only( "00:00:00:00:00:01", "hci0", ) - cancel = manager.async_register_scanner(scanner, True) + scanner.connectable = True + cancel = manager.async_register_scanner(scanner) inject_advertisement_with_source( hass, switchbot_device, switchbot_adv, "00:00:00:00:00:01" ) @@ -187,7 +188,7 @@ async def test_wrapped_bleak_client_set_disconnected_callback_after_connected( connector, True, ) - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) inject_advertisement_with_source( hass, switchbot_device, switchbot_adv, "00:00:00:00:00:01" ) @@ -291,7 +292,7 @@ async def test_ble_device_with_proxy_client_out_of_connections( connector = HaBluetoothConnector(MockBleakClient, "esp32", lambda: False) scanner = FakeScanner("esp32", "esp32", connector, True) - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) inject_advertisement_with_source( hass, switchbot_proxy_device_no_connection_slot, switchbot_adv, "esp32" ) @@ -356,7 +357,7 @@ async def test_ble_device_with_proxy_clear_cache( connector = HaBluetoothConnector(MockBleakClient, "esp32", lambda: True) scanner = FakeScanner("esp32", "esp32", connector, True) - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) inject_advertisement_with_source( hass, switchbot_proxy_device_with_connection_slot, switchbot_adv, "esp32" ) @@ -466,7 +467,7 @@ async def test_ble_device_with_proxy_client_out_of_connections_uses_best_availab connector, True, ) - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) assert manager.async_discovered_devices(True) == [ switchbot_proxy_device_no_connection_slot ] @@ -578,7 +579,7 @@ async def test_ble_device_with_proxy_client_out_of_connections_uses_best_availab connector, True, ) - cancel = manager.async_register_scanner(scanner, True) + cancel = manager.async_register_scanner(scanner) assert manager.async_discovered_devices(True) == [ switchbot_proxy_device_no_connection_slot ] diff --git a/tests/components/bluetooth/test_wrappers.py b/tests/components/bluetooth/test_wrappers.py index 78ec5bd16ac..cc837f381d4 100644 --- a/tests/components/bluetooth/test_wrappers.py +++ b/tests/components/bluetooth/test_wrappers.py @@ -187,8 +187,8 @@ def _generate_scanners_with_fake_devices(hass): for device, adv_data in hci1_device_advs.values(): scanner_hci1.inject_advertisement(device, adv_data) - cancel_hci0 = manager.async_register_scanner(scanner_hci0, True, 2) - cancel_hci1 = manager.async_register_scanner(scanner_hci1, True, 1) + cancel_hci0 = manager.async_register_scanner(scanner_hci0, connection_slots=2) + cancel_hci1 = manager.async_register_scanner(scanner_hci1, connection_slots=1) return hci0_device_advs, cancel_hci0, cancel_hci1