async def handle_call_service( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] ) -> None: """Handle call service command.""" blocking = True # We do not support templates. target = msg.get("target") if template.is_complex(target): raise vol.Invalid("Templates are not supported here") try: context = connection.context(msg) await hass.services.async_call( msg["domain"], msg["service"], msg.get("service_data"), blocking, context, target=target, ) connection.send_result(msg["id"], {"context": context}) except ServiceNotFound as err: if err.domain == msg["domain"] and err.service == msg["service"]: connection.send_error(msg["id"], const.ERR_NOT_FOUND, "Service not found.") else: connection.send_error(msg["id"], const.ERR_HOME_ASSISTANT_ERROR, str(err)) except vol.Invalid as err: connection.send_error(msg["id"], const.ERR_INVALID_FORMAT, str(err)) except HomeAssistantError as err: connection.logger.exception(err) connection.send_error(msg["id"], const.ERR_HOME_ASSISTANT_ERROR, str(err)) except Exception as err: # pylint: disable=broad-except connection.logger.exception(err) connection.send_error(msg["id"], const.ERR_UNKNOWN_ERROR, str(err))
def __init__( self, hass: HomeAssistant, sequence: Sequence[Dict[str, Any]], name: str, domain: str, *, # Used in "Running <running_description>" log message running_description: Optional[str] = None, change_listener: Optional[Callable[..., Any]] = None, script_mode: str = DEFAULT_SCRIPT_MODE, max_runs: int = DEFAULT_MAX, max_exceeded: str = DEFAULT_MAX_EXCEEDED, logger: Optional[logging.Logger] = None, log_exceptions: bool = True, top_level: bool = True, variables: Optional[ScriptVariables] = None, ) -> None: """Initialize the script.""" all_scripts = hass.data.get(DATA_SCRIPTS) if not all_scripts: all_scripts = hass.data[DATA_SCRIPTS] = [] hass.bus.async_listen_once( EVENT_HOMEASSISTANT_STOP, partial(_async_stop_scripts_at_shutdown, hass)) self._top_level = top_level if top_level: all_scripts.append({ "instance": self, "started_before_shutdown": not hass.is_stopping }) self._hass = hass self.sequence = sequence template.attach(hass, self.sequence) self.name = name self.domain = domain self.running_description = running_description or f"{domain} script" self.change_listener = change_listener self.script_mode = script_mode self._set_logger(logger) self._log_exceptions = log_exceptions self.last_action = None self.last_triggered: Optional[datetime] = None self._runs: List[_ScriptRun] = [] self.max_runs = max_runs self._max_exceeded = max_exceeded if script_mode == SCRIPT_MODE_QUEUED: self._queue_lck = asyncio.Lock() self._config_cache: Dict[Set[Tuple], Callable[..., bool]] = {} self._repeat_script: Dict[int, Script] = {} self._choose_data: Dict[int, Dict[str, Any]] = {} self._referenced_entities: Optional[Set[str]] = None self._referenced_devices: Optional[Set[str]] = None self.variables = variables self._variables_dynamic = template.is_complex(variables) if self._variables_dynamic: template.attach(hass, variables)
async def handle_call_service(hass, connection, msg): """Handle call service command.""" blocking = True if msg["domain"] == HASS_DOMAIN and msg["service"] in ["restart", "stop"]: blocking = False # We do not support templates. target = msg.get("target") if template.is_complex(target): raise vol.Invalid("Templates are not supported here") try: context = connection.context(msg) await hass.services.async_call( msg["domain"], msg["service"], msg.get("service_data"), blocking, context, target=target, ) connection.send_message( messages.result_message(msg["id"], {"context": context})) except ServiceNotFound as err: if err.domain == msg["domain"] and err.service == msg["service"]: connection.send_message( messages.error_message(msg["id"], const.ERR_NOT_FOUND, "Service not found.")) else: connection.send_message( messages.error_message(msg["id"], const.ERR_HOME_ASSISTANT_ERROR, str(err))) except vol.Invalid as err: connection.send_message( messages.error_message(msg["id"], const.ERR_INVALID_FORMAT, str(err))) except HomeAssistantError as err: connection.logger.exception(err) connection.send_message( messages.error_message(msg["id"], const.ERR_HOME_ASSISTANT_ERROR, str(err))) except Exception as err: # pylint: disable=broad-except connection.logger.exception(err) connection.send_message( messages.error_message(msg["id"], const.ERR_UNKNOWN_ERROR, str(err)))