Predetermine listener type for script change listeners (#41510)
This commit is contained in:
parent
0b3bea0282
commit
5ebf5996f1
2 changed files with 30 additions and 4 deletions
|
@ -53,7 +53,13 @@ from homeassistant.const import (
|
||||||
EVENT_HOMEASSISTANT_STOP,
|
EVENT_HOMEASSISTANT_STOP,
|
||||||
SERVICE_TURN_ON,
|
SERVICE_TURN_ON,
|
||||||
)
|
)
|
||||||
from homeassistant.core import SERVICE_CALL_LIMIT, Context, HomeAssistant, callback
|
from homeassistant.core import (
|
||||||
|
SERVICE_CALL_LIMIT,
|
||||||
|
Context,
|
||||||
|
HassJob,
|
||||||
|
HomeAssistant,
|
||||||
|
callback,
|
||||||
|
)
|
||||||
from homeassistant.helpers import condition, config_validation as cv, template
|
from homeassistant.helpers import condition, config_validation as cv, template
|
||||||
from homeassistant.helpers.event import async_call_later, async_track_template
|
from homeassistant.helpers.event import async_call_later, async_track_template
|
||||||
from homeassistant.helpers.script_variables import ScriptVariables
|
from homeassistant.helpers.script_variables import ScriptVariables
|
||||||
|
@ -789,7 +795,11 @@ class Script:
|
||||||
self.name = name
|
self.name = name
|
||||||
self.domain = domain
|
self.domain = domain
|
||||||
self.running_description = running_description or f"{domain} script"
|
self.running_description = running_description or f"{domain} script"
|
||||||
self.change_listener = change_listener
|
self._change_listener = change_listener
|
||||||
|
self._change_listener_job = (
|
||||||
|
None if change_listener is None else HassJob(change_listener)
|
||||||
|
)
|
||||||
|
|
||||||
self.script_mode = script_mode
|
self.script_mode = script_mode
|
||||||
self._set_logger(logger)
|
self._set_logger(logger)
|
||||||
self._log_exceptions = log_exceptions
|
self._log_exceptions = log_exceptions
|
||||||
|
@ -812,6 +822,21 @@ class Script:
|
||||||
if self._variables_dynamic:
|
if self._variables_dynamic:
|
||||||
template.attach(hass, variables)
|
template.attach(hass, variables)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def change_listener(self) -> Optional[Callable[..., Any]]:
|
||||||
|
"""Return the change_listener."""
|
||||||
|
return self._change_listener
|
||||||
|
|
||||||
|
@change_listener.setter
|
||||||
|
def change_listener(self, change_listener: Callable[..., Any]) -> None:
|
||||||
|
"""Update the change_listener."""
|
||||||
|
self._change_listener = change_listener
|
||||||
|
if (
|
||||||
|
self._change_listener_job is None
|
||||||
|
or change_listener != self._change_listener_job.target
|
||||||
|
):
|
||||||
|
self._change_listener_job = HassJob(change_listener)
|
||||||
|
|
||||||
def _set_logger(self, logger: Optional[logging.Logger] = None) -> None:
|
def _set_logger(self, logger: Optional[logging.Logger] = None) -> None:
|
||||||
if logger:
|
if logger:
|
||||||
self._logger = logger
|
self._logger = logger
|
||||||
|
@ -830,8 +855,8 @@ class Script:
|
||||||
choose_data["default"].update_logger(self._logger)
|
choose_data["default"].update_logger(self._logger)
|
||||||
|
|
||||||
def _changed(self):
|
def _changed(self):
|
||||||
if self.change_listener:
|
if self._change_listener_job:
|
||||||
self._hass.async_run_job(self.change_listener)
|
self._hass.async_run_hass_job(self._change_listener_job)
|
||||||
|
|
||||||
def _chain_change_listener(self, sub_script):
|
def _chain_change_listener(self, sub_script):
|
||||||
if sub_script.is_running:
|
if sub_script.is_running:
|
||||||
|
|
|
@ -39,6 +39,7 @@ def async_watch_for_action(script_obj, message):
|
||||||
flag.set()
|
flag.set()
|
||||||
|
|
||||||
script_obj.change_listener = check_action
|
script_obj.change_listener = check_action
|
||||||
|
assert script_obj.change_listener is check_action
|
||||||
return flag
|
return flag
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue