mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 14:17:45 +00:00
Add unique ID to TRADFRI (#34745)
This commit is contained in:
parent
de3f0c788c
commit
13c8c2e841
@ -1,6 +1,5 @@
|
|||||||
"""Config flow for Tradfri."""
|
"""Config flow for Tradfri."""
|
||||||
import asyncio
|
import asyncio
|
||||||
from collections import OrderedDict
|
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
import async_timeout
|
import async_timeout
|
||||||
@ -70,7 +69,7 @@ class FlowHandler(config_entries.ConfigFlow):
|
|||||||
else:
|
else:
|
||||||
user_input = {}
|
user_input = {}
|
||||||
|
|
||||||
fields = OrderedDict()
|
fields = {}
|
||||||
|
|
||||||
if self._host is None:
|
if self._host is None:
|
||||||
fields[vol.Required(CONF_HOST, default=user_input.get(CONF_HOST))] = str
|
fields[vol.Required(CONF_HOST, default=user_input.get(CONF_HOST))] = str
|
||||||
@ -83,25 +82,28 @@ class FlowHandler(config_entries.ConfigFlow):
|
|||||||
step_id="auth", data_schema=vol.Schema(fields), errors=errors
|
step_id="auth", data_schema=vol.Schema(fields), errors=errors
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_step_zeroconf(self, user_input):
|
async def async_step_homekit(self, user_input):
|
||||||
"""Handle zeroconf discovery."""
|
"""Handle homekit discovery."""
|
||||||
|
await self.async_set_unique_id(user_input["properties"]["id"])
|
||||||
|
self._abort_if_unique_id_configured({CONF_HOST: user_input["host"]})
|
||||||
|
|
||||||
host = user_input["host"]
|
host = user_input["host"]
|
||||||
|
|
||||||
# pylint: disable=no-member # https://github.com/PyCQA/pylint/issues/3167
|
|
||||||
self.context["host"] = host
|
|
||||||
|
|
||||||
if any(host == flow["context"]["host"] for flow in self._async_in_progress()):
|
|
||||||
return self.async_abort(reason="already_in_progress")
|
|
||||||
|
|
||||||
for entry in self._async_current_entries():
|
for entry in self._async_current_entries():
|
||||||
if entry.data[CONF_HOST] == host:
|
if entry.data[CONF_HOST] != host:
|
||||||
return self.async_abort(reason="already_configured")
|
continue
|
||||||
|
|
||||||
|
# Backwards compat, we update old entries
|
||||||
|
if not entry.unique_id:
|
||||||
|
self.hass.config_entries.async_update_entry(
|
||||||
|
entry, unique_id=user_input["properties"]["id"]
|
||||||
|
)
|
||||||
|
|
||||||
|
return self.async_abort(reason="already_configured")
|
||||||
|
|
||||||
self._host = host
|
self._host = host
|
||||||
return await self.async_step_auth()
|
return await self.async_step_auth()
|
||||||
|
|
||||||
async_step_homekit = async_step_zeroconf
|
|
||||||
|
|
||||||
async def async_step_import(self, user_input):
|
async def async_step_import(self, user_input):
|
||||||
"""Import a config entry."""
|
"""Import a config entry."""
|
||||||
for entry in self._async_current_entries():
|
for entry in self._async_current_entries():
|
||||||
|
@ -7,6 +7,5 @@
|
|||||||
"homekit": {
|
"homekit": {
|
||||||
"models": ["TRADFRI"]
|
"models": ["TRADFRI"]
|
||||||
},
|
},
|
||||||
"zeroconf": ["_coap._udp.local."],
|
|
||||||
"codeowners": ["@ggravlingen"]
|
"codeowners": ["@ggravlingen"]
|
||||||
}
|
}
|
||||||
|
@ -10,9 +10,6 @@ ZEROCONF = {
|
|||||||
"axis",
|
"axis",
|
||||||
"doorbird"
|
"doorbird"
|
||||||
],
|
],
|
||||||
"_coap._udp.local.": [
|
|
||||||
"tradfri"
|
|
||||||
],
|
|
||||||
"_elg._tcp.local.": [
|
"_elg._tcp.local.": [
|
||||||
"elgato"
|
"elgato"
|
||||||
],
|
],
|
||||||
|
@ -80,7 +80,9 @@ async def test_discovery_connection(hass, mock_auth, mock_entry_setup):
|
|||||||
mock_auth.side_effect = lambda hass, host, code: {"host": host, "gateway_id": "bla"}
|
mock_auth.side_effect = lambda hass, host, code: {"host": host, "gateway_id": "bla"}
|
||||||
|
|
||||||
flow = await hass.config_entries.flow.async_init(
|
flow = await hass.config_entries.flow.async_init(
|
||||||
"tradfri", context={"source": "zeroconf"}, data={"host": "123.123.123.123"}
|
"tradfri",
|
||||||
|
context={"source": "homekit"},
|
||||||
|
data={"host": "123.123.123.123", "properties": {"id": "homekit-id"}},
|
||||||
)
|
)
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_configure(
|
result = await hass.config_entries.flow.async_configure(
|
||||||
@ -90,6 +92,7 @@ async def test_discovery_connection(hass, mock_auth, mock_entry_setup):
|
|||||||
assert len(mock_entry_setup.mock_calls) == 1
|
assert len(mock_entry_setup.mock_calls) == 1
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||||
|
assert result["result"].unique_id == "homekit-id"
|
||||||
assert result["result"].data == {
|
assert result["result"].data == {
|
||||||
"host": "123.123.123.123",
|
"host": "123.123.123.123",
|
||||||
"gateway_id": "bla",
|
"gateway_id": "bla",
|
||||||
@ -218,16 +221,23 @@ async def test_import_connection_legacy_no_groups(
|
|||||||
|
|
||||||
|
|
||||||
async def test_discovery_duplicate_aborted(hass):
|
async def test_discovery_duplicate_aborted(hass):
|
||||||
"""Test a duplicate discovery host is ignored."""
|
"""Test a duplicate discovery host aborts and updates existing entry."""
|
||||||
MockConfigEntry(domain="tradfri", data={"host": "some-host"}).add_to_hass(hass)
|
entry = MockConfigEntry(
|
||||||
|
domain="tradfri", data={"host": "some-host"}, unique_id="homekit-id"
|
||||||
|
)
|
||||||
|
entry.add_to_hass(hass)
|
||||||
|
|
||||||
flow = await hass.config_entries.flow.async_init(
|
flow = await hass.config_entries.flow.async_init(
|
||||||
"tradfri", context={"source": "zeroconf"}, data={"host": "some-host"}
|
"tradfri",
|
||||||
|
context={"source": "homekit"},
|
||||||
|
data={"host": "new-host", "properties": {"id": "homekit-id"}},
|
||||||
)
|
)
|
||||||
|
|
||||||
assert flow["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
assert flow["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||||
assert flow["reason"] == "already_configured"
|
assert flow["reason"] == "already_configured"
|
||||||
|
|
||||||
|
assert entry.data["host"] == "new-host"
|
||||||
|
|
||||||
|
|
||||||
async def test_import_duplicate_aborted(hass):
|
async def test_import_duplicate_aborted(hass):
|
||||||
"""Test a duplicate import host is ignored."""
|
"""Test a duplicate import host is ignored."""
|
||||||
@ -244,13 +254,34 @@ async def test_import_duplicate_aborted(hass):
|
|||||||
async def test_duplicate_discovery(hass, mock_auth, mock_entry_setup):
|
async def test_duplicate_discovery(hass, mock_auth, mock_entry_setup):
|
||||||
"""Test a duplicate discovery in progress is ignored."""
|
"""Test a duplicate discovery in progress is ignored."""
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
"tradfri", context={"source": "zeroconf"}, data={"host": "123.123.123.123"}
|
"tradfri",
|
||||||
|
context={"source": "homekit"},
|
||||||
|
data={"host": "123.123.123.123", "properties": {"id": "homekit-id"}},
|
||||||
)
|
)
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
||||||
|
|
||||||
result2 = await hass.config_entries.flow.async_init(
|
result2 = await hass.config_entries.flow.async_init(
|
||||||
"tradfri", context={"source": "zeroconf"}, data={"host": "123.123.123.123"}
|
"tradfri",
|
||||||
|
context={"source": "homekit"},
|
||||||
|
data={"host": "123.123.123.123", "properties": {"id": "homekit-id"}},
|
||||||
)
|
)
|
||||||
|
|
||||||
assert result2["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
assert result2["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||||
|
|
||||||
|
|
||||||
|
async def test_discovery_updates_unique_id(hass):
|
||||||
|
"""Test a duplicate discovery host aborts and updates existing entry."""
|
||||||
|
entry = MockConfigEntry(domain="tradfri", data={"host": "some-host"},)
|
||||||
|
entry.add_to_hass(hass)
|
||||||
|
|
||||||
|
flow = await hass.config_entries.flow.async_init(
|
||||||
|
"tradfri",
|
||||||
|
context={"source": "homekit"},
|
||||||
|
data={"host": "some-host", "properties": {"id": "homekit-id"}},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert flow["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||||
|
assert flow["reason"] == "already_configured"
|
||||||
|
|
||||||
|
assert entry.unique_id == "homekit-id"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user