diff --git a/homeassistant/helpers/script.py b/homeassistant/helpers/script.py index 43429bdb1d2..2b4da38b15e 100644 --- a/homeassistant/helpers/script.py +++ b/homeassistant/helpers/script.py @@ -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 diff --git a/tests/helpers/test_script.py b/tests/helpers/test_script.py index 4c707590528..4a50cb9399f 100644 --- a/tests/helpers/test_script.py +++ b/tests/helpers/test_script.py @@ -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)