Improve remote Bluetooth scanner manufacturer data (#135961)

Co-authored-by: Joostlek <joostlek@outlook.com>
This commit is contained in:
J. Nick Koston 2025-01-19 00:55:13 -10:00 committed by GitHub
parent 85bea5b70e
commit 0d968267a2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 39 additions and 8 deletions

View File

@ -22,6 +22,7 @@ from bluetooth_adapters import (
adapter_model,
adapter_unique_name,
get_adapters,
get_manufacturer_from_mac,
)
from bluetooth_data_tools import monotonic_time_coarse as MONOTONIC_TIME
from habluetooth import (
@ -333,15 +334,21 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
address = entry.unique_id
assert address is not None
assert source_entry is not None
source_domain = entry.data[CONF_SOURCE_DOMAIN]
if mac_manufacturer := await get_manufacturer_from_mac(address):
manufacturer = f"{mac_manufacturer} ({source_domain})"
else:
manufacturer = source_domain
details = AdapterDetails(
address=address,
product=entry.data.get(CONF_SOURCE_MODEL),
manufacturer=manufacturer,
)
await async_update_device(
hass,
entry,
source_entry.title,
AdapterDetails(
address=address,
product=entry.data.get(CONF_SOURCE_MODEL),
manufacturer=entry.data[CONF_SOURCE_DOMAIN],
),
details,
)
return True
manager = _get_manager(hass)

View File

@ -25,7 +25,9 @@ from homeassistant.components.bluetooth.const import (
UNAVAILABLE_TRACK_SECONDS,
)
from homeassistant.components.bluetooth.manager import HomeAssistantBluetoothManager
from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import device_registry as dr
from homeassistant.setup import async_setup_component
import homeassistant.util.dt as dt_util
from homeassistant.util.json import json_loads
@ -523,7 +525,19 @@ async def test_scanner_stops_responding(hass: HomeAssistant) -> None:
@pytest.mark.usefixtures("enable_bluetooth")
async def test_remote_scanner_bluetooth_config_entry(hass: HomeAssistant) -> None:
@pytest.mark.parametrize(
("manufacturer", "source"),
[
("test", "test"),
("Raspberry Pi Trading Ltd (test)", "28:CD:C1:11:23:45"),
],
)
async def test_remote_scanner_bluetooth_config_entry(
hass: HomeAssistant,
device_registry: dr.DeviceRegistry,
manufacturer: str,
source: str,
) -> None:
"""Test the remote scanner gets a bluetooth config entry."""
manager: HomeAssistantBluetoothManager = _get_manager()
@ -543,8 +557,9 @@ async def test_remote_scanner_bluetooth_config_entry(hass: HomeAssistant) -> Non
connector = (
HaBluetoothConnector(MockBleakClient, "mock_bleak_client", lambda: False),
)
scanner = FakeScanner("esp32", "esp32", connector, True)
scanner = FakeScanner(source, source, connector, True)
unsetup = scanner.async_setup()
assert scanner.source == source
entry = MockConfigEntry(domain="test")
entry.add_to_hass(hass)
cancel = manager.async_register_hass_scanner(
@ -561,9 +576,18 @@ async def test_remote_scanner_bluetooth_config_entry(hass: HomeAssistant) -> Non
cancel()
unsetup()
assert hass.config_entries.async_entry_for_domain_unique_id(
adapter_entry = hass.config_entries.async_entry_for_domain_unique_id(
"bluetooth", scanner.source
)
assert adapter_entry is not None
assert adapter_entry.state is ConfigEntryState.LOADED
dev = device_registry.async_get_device(
connections={(dr.CONNECTION_BLUETOOTH, scanner.source)}
)
assert dev is not None
assert dev.config_entries == {adapter_entry.entry_id}
assert dev.manufacturer == manufacturer
manager.async_remove_scanner(scanner.source)
await hass.async_block_till_done()