Skip to content

Commit 3248131

Browse files
balloobfrenck
authored andcommitted
When discovering a Z-Wave adapter, always configure add-on in config flow (home-assistant#153575)
1 parent bdc9eb3 commit 3248131

File tree

2 files changed

+106
-4
lines changed

2 files changed

+106
-4
lines changed

homeassistant/components/zwave_js/config_flow.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,15 @@ async def async_step_rf_region(
703703
async def async_step_on_supervisor(
704704
self, user_input: dict[str, Any] | None = None
705705
) -> ConfigFlowResult:
706-
"""Handle logic when on Supervisor host."""
706+
"""Handle logic when on Supervisor host.
707+
708+
When the add-on is running, we copy over it's settings.
709+
We will ignore settings for USB/Socket if those were discovered.
710+
711+
If add-on is not running, we will configure the add-on.
712+
713+
When it's not installed, we install it with new config options.
714+
"""
707715
if user_input is None:
708716
return self.async_show_form(
709717
step_id="on_supervisor", data_schema=ON_SUPERVISOR_SCHEMA
@@ -717,8 +725,11 @@ async def async_step_on_supervisor(
717725

718726
if addon_info.state == AddonState.RUNNING:
719727
addon_config = addon_info.options
720-
self.usb_path = addon_config.get(CONF_ADDON_DEVICE)
721-
self.socket_path = addon_config.get(CONF_ADDON_SOCKET)
728+
# Use the options set by USB/ESPHome discovery
729+
if not self._adapter_discovered:
730+
self.usb_path = addon_config.get(CONF_ADDON_DEVICE)
731+
self.socket_path = addon_config.get(CONF_ADDON_SOCKET)
732+
722733
self.s0_legacy_key = addon_config.get(CONF_ADDON_S0_LEGACY_KEY, "")
723734
self.s2_access_control_key = addon_config.get(
724735
CONF_ADDON_S2_ACCESS_CONTROL_KEY, ""
@@ -931,6 +942,21 @@ async def async_step_finish_addon_setup_user(
931942
str(self.version_info.home_id), raise_on_progress=False
932943
)
933944

945+
# When we came from discovery, make sure we update the add-on
946+
if self._adapter_discovered and self.use_addon:
947+
await self._async_set_addon_config(
948+
{
949+
CONF_ADDON_DEVICE: self.usb_path,
950+
CONF_ADDON_SOCKET: self.socket_path,
951+
CONF_ADDON_S0_LEGACY_KEY: self.s0_legacy_key,
952+
CONF_ADDON_S2_ACCESS_CONTROL_KEY: self.s2_access_control_key,
953+
CONF_ADDON_S2_AUTHENTICATED_KEY: self.s2_authenticated_key,
954+
CONF_ADDON_S2_UNAUTHENTICATED_KEY: self.s2_unauthenticated_key,
955+
CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY: self.lr_s2_access_control_key,
956+
CONF_ADDON_LR_S2_AUTHENTICATED_KEY: self.lr_s2_authenticated_key,
957+
}
958+
)
959+
934960
self._abort_if_unique_id_configured(
935961
updates={
936962
CONF_URL: self.ws_address,

tests/components/zwave_js/test_config_flow.py

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1168,7 +1168,7 @@ async def mock_restore_nvm(data: bytes, options: dict[str, bool] | None = None):
11681168

11691169

11701170
@pytest.mark.usefixtures("supervisor", "addon_not_installed", "addon_info")
1171-
async def test_esphome_discovery(
1171+
async def test_esphome_discovery_intent_custom(
11721172
hass: HomeAssistant,
11731173
install_addon: AsyncMock,
11741174
set_addon_options: AsyncMock,
@@ -1290,6 +1290,82 @@ async def test_esphome_discovery(
12901290
assert len(mock_setup_entry.mock_calls) == 1
12911291

12921292

1293+
@pytest.mark.usefixtures("supervisor", "addon_installed", "addon_running", "addon_info")
1294+
async def test_esphome_discovery_intent_recommended(
1295+
hass: HomeAssistant,
1296+
set_addon_options: AsyncMock,
1297+
addon_options: dict,
1298+
) -> None:
1299+
"""Test ESPHome discovery success path."""
1300+
addon_options.update(
1301+
{
1302+
CONF_ADDON_DEVICE: "/dev/ttyUSB0",
1303+
CONF_ADDON_SOCKET: None,
1304+
"s0_legacy_key": "new123",
1305+
"s2_access_control_key": "new456",
1306+
"s2_authenticated_key": "new789",
1307+
"s2_unauthenticated_key": "new987",
1308+
"lr_s2_access_control_key": "new654",
1309+
"lr_s2_authenticated_key": "new321",
1310+
}
1311+
)
1312+
result = await hass.config_entries.flow.async_init(
1313+
DOMAIN,
1314+
context={"source": config_entries.SOURCE_ESPHOME},
1315+
data=ESPHOME_DISCOVERY_INFO,
1316+
)
1317+
1318+
assert result["type"] is FlowResultType.MENU
1319+
assert result["step_id"] == "installation_type"
1320+
assert result["menu_options"] == ["intent_recommended", "intent_custom"]
1321+
1322+
with (
1323+
patch(
1324+
"homeassistant.components.zwave_js.async_setup", return_value=True
1325+
) as mock_setup,
1326+
patch(
1327+
"homeassistant.components.zwave_js.async_setup_entry",
1328+
return_value=True,
1329+
) as mock_setup_entry,
1330+
):
1331+
result = await hass.config_entries.flow.async_configure(
1332+
result["flow_id"], {"next_step_id": "intent_recommended"}
1333+
)
1334+
1335+
assert result["type"] is FlowResultType.CREATE_ENTRY
1336+
assert result["title"] == TITLE
1337+
assert result["result"].unique_id == str(ESPHOME_DISCOVERY_INFO.zwave_home_id)
1338+
assert result["data"] == {
1339+
"url": "ws://host1:3001",
1340+
"usb_path": None,
1341+
"socket_path": "esphome://192.168.1.100:6053",
1342+
"s0_legacy_key": "new123",
1343+
"s2_access_control_key": "new456",
1344+
"s2_authenticated_key": "new789",
1345+
"s2_unauthenticated_key": "new987",
1346+
"lr_s2_access_control_key": "new654",
1347+
"lr_s2_authenticated_key": "new321",
1348+
"use_addon": True,
1349+
"integration_created_addon": False,
1350+
}
1351+
assert set_addon_options.call_args == call(
1352+
"core_zwave_js",
1353+
AddonsOptions(
1354+
config={
1355+
"socket": "esphome://192.168.1.100:6053",
1356+
"s0_legacy_key": "new123",
1357+
"s2_access_control_key": "new456",
1358+
"s2_authenticated_key": "new789",
1359+
"s2_unauthenticated_key": "new987",
1360+
"lr_s2_access_control_key": "new654",
1361+
"lr_s2_authenticated_key": "new321",
1362+
}
1363+
),
1364+
)
1365+
assert len(mock_setup.mock_calls) == 1
1366+
assert len(mock_setup_entry.mock_calls) == 1
1367+
1368+
12931369
@pytest.mark.usefixtures("supervisor", "addon_installed", "addon_info")
12941370
async def test_esphome_discovery_already_configured(
12951371
hass: HomeAssistant,

0 commit comments

Comments
 (0)