Add missing adapter data to Bluetooth config entry titles (#115930)

This commit is contained in:
J. Nick Koston 2024-04-23 21:52:55 +02:00 committed by GitHub
parent 8bf3c87336
commit bb2bd086bc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 38 additions and 16 deletions

View File

@ -86,6 +86,7 @@ from .manager import HomeAssistantBluetoothManager
from .match import BluetoothCallbackMatcher, IntegrationMatcher from .match import BluetoothCallbackMatcher, IntegrationMatcher
from .models import BluetoothCallback, BluetoothChange from .models import BluetoothCallback, BluetoothChange
from .storage import BluetoothStorage from .storage import BluetoothStorage
from .util import adapter_title
if TYPE_CHECKING: if TYPE_CHECKING:
from homeassistant.helpers.typing import ConfigType from homeassistant.helpers.typing import ConfigType
@ -332,6 +333,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
) from err ) from err
adapters = await manager.async_get_bluetooth_adapters() adapters = await manager.async_get_bluetooth_adapters()
details = adapters[adapter] details = adapters[adapter]
if entry.title == address:
hass.config_entries.async_update_entry(
entry, title=adapter_title(adapter, details)
)
slots: int = details.get(ADAPTER_CONNECTION_SLOTS) or DEFAULT_CONNECTION_SLOTS slots: int = details.get(ADAPTER_CONNECTION_SLOTS) or DEFAULT_CONNECTION_SLOTS
entry.async_on_unload(async_register_scanner(hass, scanner, connection_slots=slots)) entry.async_on_unload(async_register_scanner(hass, scanner, connection_slots=slots))
await async_update_device(hass, entry, adapter, details) await async_update_device(hass, entry, adapter, details)

View File

@ -12,7 +12,6 @@ from bluetooth_adapters import (
AdapterDetails, AdapterDetails,
adapter_human_name, adapter_human_name,
adapter_model, adapter_model,
adapter_unique_name,
get_adapters, get_adapters,
) )
import voluptuous as vol import voluptuous as vol
@ -28,6 +27,7 @@ from homeassistant.helpers.typing import DiscoveryInfoType
from . import models from . import models
from .const import CONF_ADAPTER, CONF_DETAILS, CONF_PASSIVE, DOMAIN from .const import CONF_ADAPTER, CONF_DETAILS, CONF_PASSIVE, DOMAIN
from .util import adapter_title
OPTIONS_SCHEMA = vol.Schema( OPTIONS_SCHEMA = vol.Schema(
{ {
@ -47,14 +47,6 @@ def adapter_display_info(adapter: str, details: AdapterDetails) -> str:
return f"{name} {manufacturer} {model}" return f"{name} {manufacturer} {model}"
def adapter_title(adapter: str, details: AdapterDetails) -> str:
"""Return the adapter title."""
unique_name = adapter_unique_name(adapter, details[ADAPTER_ADDRESS])
model = adapter_model(details)
manufacturer = details[ADAPTER_MANUFACTURER] or "Unknown"
return f"{manufacturer} {model} ({unique_name})"
class BluetoothConfigFlow(ConfigFlow, domain=DOMAIN): class BluetoothConfigFlow(ConfigFlow, domain=DOMAIN):
"""Config flow for Bluetooth.""" """Config flow for Bluetooth."""

View File

@ -2,7 +2,14 @@
from __future__ import annotations from __future__ import annotations
from bluetooth_adapters import BluetoothAdapters from bluetooth_adapters import (
ADAPTER_ADDRESS,
ADAPTER_MANUFACTURER,
ADAPTER_PRODUCT,
AdapterDetails,
BluetoothAdapters,
adapter_unique_name,
)
from bluetooth_data_tools import monotonic_time_coarse from bluetooth_data_tools import monotonic_time_coarse
from homeassistant.core import callback from homeassistant.core import callback
@ -69,3 +76,12 @@ def async_load_history_from_system(
connectable_loaded_history[address] = service_info connectable_loaded_history[address] = service_info
return all_loaded_history, connectable_loaded_history return all_loaded_history, connectable_loaded_history
@callback
def adapter_title(adapter: str, details: AdapterDetails) -> str:
"""Return the adapter title."""
unique_name = adapter_unique_name(adapter, details[ADAPTER_ADDRESS])
model = details.get(ADAPTER_PRODUCT, "Unknown")
manufacturer = details[ADAPTER_MANUFACTURER] or "Unknown"
return f"{manufacturer} {model} ({unique_name})"

View File

@ -99,9 +99,7 @@ async def test_async_step_user_linux_one_adapter(
result["flow_id"], user_input={} result["flow_id"], user_input={}
) )
assert result2["type"] is FlowResultType.CREATE_ENTRY assert result2["type"] is FlowResultType.CREATE_ENTRY
assert ( assert result2["title"] == "ACME Bluetooth Adapter 5.0 (00:00:00:00:00:01)"
result2["title"] == "ACME Bluetooth Adapter 5.0 (cc01:aa01) (00:00:00:00:00:01)"
)
assert result2["data"] == {} assert result2["data"] == {}
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
@ -144,9 +142,7 @@ async def test_async_step_user_linux_two_adapters(
result["flow_id"], user_input={CONF_ADAPTER: "hci1"} result["flow_id"], user_input={CONF_ADAPTER: "hci1"}
) )
assert result2["type"] is FlowResultType.CREATE_ENTRY assert result2["type"] is FlowResultType.CREATE_ENTRY
assert ( assert result2["title"] == "ACME Bluetooth Adapter 5.0 (00:00:00:00:00:02)"
result2["title"] == "ACME Bluetooth Adapter 5.0 (cc01:aa01) (00:00:00:00:00:02)"
)
assert result2["data"] == {} assert result2["data"] == {}
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1

View File

@ -3173,3 +3173,16 @@ async def test_haos_9_or_later(
registry = async_get_issue_registry(hass) registry = async_get_issue_registry(hass)
issue = registry.async_get_issue(DOMAIN, "haos_outdated") issue = registry.async_get_issue(DOMAIN, "haos_outdated")
assert issue is None assert issue is None
async def test_title_updated_if_mac_address(
hass: HomeAssistant, mock_bleak_scanner_start: MagicMock, one_adapter: None
) -> None:
"""Test the title is updated if it is the mac address."""
entry = MockConfigEntry(
domain="bluetooth", title="00:00:00:00:00:01", unique_id="00:00:00:00:00:01"
)
entry.add_to_hass(hass)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert entry.title == "ACME Bluetooth Adapter 5.0 (00:00:00:00:00:01)"