mirror of
https://github.com/home-assistant/core.git
synced 2025-07-14 16:57:10 +00:00
Fix apple_tv IP Address not being updated from discovery (#107611)
This commit is contained in:
parent
2d1c5d84f3
commit
cfbfdf7949
@ -126,7 +126,7 @@ class AppleTVConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
@callback
|
@callback
|
||||||
def _entry_unique_id_from_identifers(self, all_identifiers: set[str]) -> str | None:
|
def _entry_unique_id_from_identifers(self, all_identifiers: set[str]) -> str | None:
|
||||||
"""Search existing entries for an identifier and return the unique id."""
|
"""Search existing entries for an identifier and return the unique id."""
|
||||||
for entry in self._async_current_entries():
|
for entry in self._async_current_entries(include_ignore=True):
|
||||||
if not all_identifiers.isdisjoint(
|
if not all_identifiers.isdisjoint(
|
||||||
entry.data.get(CONF_IDENTIFIERS, [entry.unique_id])
|
entry.data.get(CONF_IDENTIFIERS, [entry.unique_id])
|
||||||
):
|
):
|
||||||
@ -186,7 +186,6 @@ class AppleTVConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
if discovery_info.ip_address.version == 6:
|
if discovery_info.ip_address.version == 6:
|
||||||
return self.async_abort(reason="ipv6_not_supported")
|
return self.async_abort(reason="ipv6_not_supported")
|
||||||
host = discovery_info.host
|
host = discovery_info.host
|
||||||
self._async_abort_entries_match({CONF_ADDRESS: host})
|
|
||||||
service_type = discovery_info.type[:-1] # Remove leading .
|
service_type = discovery_info.type[:-1] # Remove leading .
|
||||||
name = discovery_info.name.replace(f".{service_type}.", "")
|
name = discovery_info.name.replace(f".{service_type}.", "")
|
||||||
properties = discovery_info.properties
|
properties = discovery_info.properties
|
||||||
@ -196,6 +195,15 @@ class AppleTVConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
if unique_id is None:
|
if unique_id is None:
|
||||||
return self.async_abort(reason="unknown")
|
return self.async_abort(reason="unknown")
|
||||||
|
|
||||||
|
# The unique id for the zeroconf service may not be
|
||||||
|
# the same as the unique id for the device. If the
|
||||||
|
# device is already configured so if we don't
|
||||||
|
# find a match here, we will fallback to
|
||||||
|
# looking up the device by all its identifiers
|
||||||
|
# in the next block.
|
||||||
|
await self.async_set_unique_id(unique_id)
|
||||||
|
self._abort_if_unique_id_configured(updates={CONF_ADDRESS: host})
|
||||||
|
|
||||||
if existing_unique_id := self._entry_unique_id_from_identifers({unique_id}):
|
if existing_unique_id := self._entry_unique_id_from_identifers({unique_id}):
|
||||||
await self.async_set_unique_id(existing_unique_id)
|
await self.async_set_unique_id(existing_unique_id)
|
||||||
self._abort_if_unique_id_configured(updates={CONF_ADDRESS: host})
|
self._abort_if_unique_id_configured(updates={CONF_ADDRESS: host})
|
||||||
|
@ -691,6 +691,44 @@ async def test_zeroconf_ip_change(hass: HomeAssistant, mock_scan) -> None:
|
|||||||
assert unrelated_entry.data[CONF_ADDRESS] == "127.0.0.2"
|
assert unrelated_entry.data[CONF_ADDRESS] == "127.0.0.2"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_zeroconf_ip_change_after_ip_conflict_with_ignored_entry(
|
||||||
|
hass: HomeAssistant, mock_scan
|
||||||
|
) -> None:
|
||||||
|
"""Test that the config entry gets updated when the ip changes and reloads."""
|
||||||
|
entry = MockConfigEntry(
|
||||||
|
domain="apple_tv", unique_id="mrpid", data={CONF_ADDRESS: "127.0.0.2"}
|
||||||
|
)
|
||||||
|
ignored_entry = MockConfigEntry(
|
||||||
|
domain="apple_tv",
|
||||||
|
unique_id="unrelated",
|
||||||
|
data={CONF_ADDRESS: "127.0.0.2"},
|
||||||
|
source=config_entries.SOURCE_IGNORE,
|
||||||
|
)
|
||||||
|
ignored_entry.add_to_hass(hass)
|
||||||
|
entry.add_to_hass(hass)
|
||||||
|
mock_scan.result = [
|
||||||
|
create_conf(
|
||||||
|
IPv4Address("127.0.0.1"), "Device", mrp_service(), airplay_service()
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
with patch(
|
||||||
|
"homeassistant.components.apple_tv.async_setup_entry", return_value=True
|
||||||
|
) as mock_async_setup:
|
||||||
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
DOMAIN,
|
||||||
|
context={"source": config_entries.SOURCE_ZEROCONF},
|
||||||
|
data=DMAP_SERVICE,
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert result["type"] == data_entry_flow.FlowResultType.ABORT
|
||||||
|
assert result["reason"] == "already_configured"
|
||||||
|
assert len(mock_async_setup.mock_calls) == 1
|
||||||
|
assert entry.data[CONF_ADDRESS] == "127.0.0.1"
|
||||||
|
assert ignored_entry.data[CONF_ADDRESS] == "127.0.0.2"
|
||||||
|
|
||||||
|
|
||||||
async def test_zeroconf_ip_change_via_secondary_identifier(
|
async def test_zeroconf_ip_change_via_secondary_identifier(
|
||||||
hass: HomeAssistant, mock_scan
|
hass: HomeAssistant, mock_scan
|
||||||
) -> None:
|
) -> None:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user