mirror of
https://github.com/home-assistant/core.git
synced 2026-05-04 20:04:35 +02:00
When discovering a Z-Wave adapter, always configure add-on in config flow (#153575)
This commit is contained in:
@@ -703,7 +703,15 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
|
||||
async def async_step_on_supervisor(
|
||||
self, user_input: dict[str, Any] | None = None
|
||||
) -> ConfigFlowResult:
|
||||
"""Handle logic when on Supervisor host."""
|
||||
"""Handle logic when on Supervisor host.
|
||||
|
||||
When the add-on is running, we copy over it's settings.
|
||||
We will ignore settings for USB/Socket if those were discovered.
|
||||
|
||||
If add-on is not running, we will configure the add-on.
|
||||
|
||||
When it's not installed, we install it with new config options.
|
||||
"""
|
||||
if user_input is None:
|
||||
return self.async_show_form(
|
||||
step_id="on_supervisor", data_schema=ON_SUPERVISOR_SCHEMA
|
||||
@@ -717,8 +725,11 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
|
||||
|
||||
if addon_info.state == AddonState.RUNNING:
|
||||
addon_config = addon_info.options
|
||||
self.usb_path = addon_config.get(CONF_ADDON_DEVICE)
|
||||
self.socket_path = addon_config.get(CONF_ADDON_SOCKET)
|
||||
# Use the options set by USB/ESPHome discovery
|
||||
if not self._adapter_discovered:
|
||||
self.usb_path = addon_config.get(CONF_ADDON_DEVICE)
|
||||
self.socket_path = addon_config.get(CONF_ADDON_SOCKET)
|
||||
|
||||
self.s0_legacy_key = addon_config.get(CONF_ADDON_S0_LEGACY_KEY, "")
|
||||
self.s2_access_control_key = addon_config.get(
|
||||
CONF_ADDON_S2_ACCESS_CONTROL_KEY, ""
|
||||
@@ -931,6 +942,21 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
|
||||
str(self.version_info.home_id), raise_on_progress=False
|
||||
)
|
||||
|
||||
# When we came from discovery, make sure we update the add-on
|
||||
if self._adapter_discovered and self.use_addon:
|
||||
await self._async_set_addon_config(
|
||||
{
|
||||
CONF_ADDON_DEVICE: self.usb_path,
|
||||
CONF_ADDON_SOCKET: self.socket_path,
|
||||
CONF_ADDON_S0_LEGACY_KEY: self.s0_legacy_key,
|
||||
CONF_ADDON_S2_ACCESS_CONTROL_KEY: self.s2_access_control_key,
|
||||
CONF_ADDON_S2_AUTHENTICATED_KEY: self.s2_authenticated_key,
|
||||
CONF_ADDON_S2_UNAUTHENTICATED_KEY: self.s2_unauthenticated_key,
|
||||
CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY: self.lr_s2_access_control_key,
|
||||
CONF_ADDON_LR_S2_AUTHENTICATED_KEY: self.lr_s2_authenticated_key,
|
||||
}
|
||||
)
|
||||
|
||||
self._abort_if_unique_id_configured(
|
||||
updates={
|
||||
CONF_URL: self.ws_address,
|
||||
|
||||
@@ -1168,7 +1168,7 @@ async def test_usb_discovery_migration_restore_driver_ready_timeout(
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("supervisor", "addon_not_installed", "addon_info")
|
||||
async def test_esphome_discovery(
|
||||
async def test_esphome_discovery_intent_custom(
|
||||
hass: HomeAssistant,
|
||||
install_addon: AsyncMock,
|
||||
set_addon_options: AsyncMock,
|
||||
@@ -1290,6 +1290,82 @@ async def test_esphome_discovery(
|
||||
assert len(mock_setup_entry.mock_calls) == 1
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("supervisor", "addon_installed", "addon_running", "addon_info")
|
||||
async def test_esphome_discovery_intent_recommended(
|
||||
hass: HomeAssistant,
|
||||
set_addon_options: AsyncMock,
|
||||
addon_options: dict,
|
||||
) -> None:
|
||||
"""Test ESPHome discovery success path."""
|
||||
addon_options.update(
|
||||
{
|
||||
CONF_ADDON_DEVICE: "/dev/ttyUSB0",
|
||||
CONF_ADDON_SOCKET: None,
|
||||
"s0_legacy_key": "new123",
|
||||
"s2_access_control_key": "new456",
|
||||
"s2_authenticated_key": "new789",
|
||||
"s2_unauthenticated_key": "new987",
|
||||
"lr_s2_access_control_key": "new654",
|
||||
"lr_s2_authenticated_key": "new321",
|
||||
}
|
||||
)
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN,
|
||||
context={"source": config_entries.SOURCE_ESPHOME},
|
||||
data=ESPHOME_DISCOVERY_INFO,
|
||||
)
|
||||
|
||||
assert result["type"] is FlowResultType.MENU
|
||||
assert result["step_id"] == "installation_type"
|
||||
assert result["menu_options"] == ["intent_recommended", "intent_custom"]
|
||||
|
||||
with (
|
||||
patch(
|
||||
"homeassistant.components.zwave_js.async_setup", return_value=True
|
||||
) as mock_setup,
|
||||
patch(
|
||||
"homeassistant.components.zwave_js.async_setup_entry",
|
||||
return_value=True,
|
||||
) as mock_setup_entry,
|
||||
):
|
||||
result = await hass.config_entries.flow.async_configure(
|
||||
result["flow_id"], {"next_step_id": "intent_recommended"}
|
||||
)
|
||||
|
||||
assert result["type"] is FlowResultType.CREATE_ENTRY
|
||||
assert result["title"] == TITLE
|
||||
assert result["result"].unique_id == str(ESPHOME_DISCOVERY_INFO.zwave_home_id)
|
||||
assert result["data"] == {
|
||||
"url": "ws://host1:3001",
|
||||
"usb_path": None,
|
||||
"socket_path": "esphome://192.168.1.100:6053",
|
||||
"s0_legacy_key": "new123",
|
||||
"s2_access_control_key": "new456",
|
||||
"s2_authenticated_key": "new789",
|
||||
"s2_unauthenticated_key": "new987",
|
||||
"lr_s2_access_control_key": "new654",
|
||||
"lr_s2_authenticated_key": "new321",
|
||||
"use_addon": True,
|
||||
"integration_created_addon": False,
|
||||
}
|
||||
assert set_addon_options.call_args == call(
|
||||
"core_zwave_js",
|
||||
AddonsOptions(
|
||||
config={
|
||||
"socket": "esphome://192.168.1.100:6053",
|
||||
"s0_legacy_key": "new123",
|
||||
"s2_access_control_key": "new456",
|
||||
"s2_authenticated_key": "new789",
|
||||
"s2_unauthenticated_key": "new987",
|
||||
"lr_s2_access_control_key": "new654",
|
||||
"lr_s2_authenticated_key": "new321",
|
||||
}
|
||||
),
|
||||
)
|
||||
assert len(mock_setup.mock_calls) == 1
|
||||
assert len(mock_setup_entry.mock_calls) == 1
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("supervisor", "addon_installed", "addon_info")
|
||||
async def test_esphome_discovery_already_configured(
|
||||
hass: HomeAssistant,
|
||||
|
||||
Reference in New Issue
Block a user