Fix Automation/Script: sequence within a parallel ignoring enabled flag (#142977)

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
This commit is contained in:
MichaelMKKelly 2025-04-19 10:49:05 +01:00 committed by GitHub
parent 4483025856
commit 35f9cc55f1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 49 additions and 1 deletions

View File

@ -629,6 +629,10 @@ class _ScriptRun:
self, script: Script, *, parallel: bool = False
) -> None:
"""Execute a script."""
if not script.enabled:
self._log("Skipping disabled script: %s", script.name)
trace_set_result(enabled=False)
return
result = await self._async_run_long_action(
self._hass.async_create_task_internal(
script.async_run(
@ -1442,8 +1446,12 @@ class Script:
script_mode: str = DEFAULT_SCRIPT_MODE,
top_level: bool = True,
variables: ScriptVariables | None = None,
enabled: bool = True,
) -> None:
"""Initialize the script."""
"""Initialize the script.
enabled attribute is only used for non-top-level scripts.
"""
if not (all_scripts := hass.data.get(DATA_SCRIPTS)):
all_scripts = hass.data[DATA_SCRIPTS] = []
hass.bus.async_listen_once(
@ -1462,6 +1470,7 @@ class Script:
self.name = name
self.unique_id = f"{domain}.{name}-{id(self)}"
self.domain = domain
self.enabled = enabled
self.running_description = running_description or f"{domain} script"
self._change_listener = change_listener
self._change_listener_job = (
@ -2002,6 +2011,7 @@ class Script:
max_runs=self.max_runs,
logger=self._logger,
top_level=False,
enabled=parallel_script.get(CONF_ENABLED, True),
)
parallel_script.change_listener = partial(
self._chain_change_listener, parallel_script

View File

@ -6658,3 +6658,41 @@ async def test_calling_service_backwards_compatible(
],
}
)
async def test_enabled_sequence_in_parallel(
hass: HomeAssistant, caplog: pytest.LogCaptureFixture
) -> None:
"""Test to ensure sequence inside parallel follows enabled tag."""
event = "test_event"
events = async_capture_events(hass, event)
sequence = cv.SCRIPT_SCHEMA(
{
"parallel": [
{
"sequence": [{"event": event, "event_data": {"value": "disabled"}}],
"enabled": "false",
},
{
"sequence": [{"event": event, "event_data": {"value": "enabled"}}],
"enabled": "true",
},
]
}
)
script_obj = script.Script(hass, sequence, "Test Name", "test_domain")
await script_obj.async_run(context=Context())
await hass.async_block_till_done()
assert len(events) == 1
assert events[0].data["value"] == "enabled"
expected_trace = {
"0": [{"result": {"enabled": False}}],
"0/parallel/1/sequence/0": [
{"result": {"event": "test_event", "event_data": {"value": "enabled"}}}
],
}
assert_action_trace(expected_trace)