def _log_exception(self, exception): action_type = cv.determine_script_action(self._action) error = str(exception) level = logging.ERROR if isinstance(exception, vol.Invalid): error_desc = "Invalid data" elif isinstance(exception, exceptions.TemplateError): error_desc = "Error rendering template" elif isinstance(exception, exceptions.Unauthorized): error_desc = "Unauthorized" elif isinstance(exception, exceptions.ServiceNotFound): error_desc = "Service not found" else: error_desc = "Unexpected error" level = _LOG_EXCEPTION self._log( "Error executing script. %s for %s at pos %s: %s", error_desc, action_type, self._step + 1, error, level=level, )
def referenced_entities(self): """Return a set of referenced entities.""" if self._referenced_entities is not None: return self._referenced_entities referenced = set() for step in self.sequence: action = cv.determine_script_action(step) if action == cv.SCRIPT_ACTION_CALL_SERVICE: data = step.get(CONF_SERVICE_DATA) if not data: continue entity_ids = data.get(ATTR_ENTITY_ID) if entity_ids is None: continue if isinstance(entity_ids, str): entity_ids = [entity_ids] for entity_id in entity_ids: referenced.add(entity_id) elif action == cv.SCRIPT_ACTION_CHECK_CONDITION: referenced |= condition.async_extract_entities(step) elif action == cv.SCRIPT_ACTION_ACTIVATE_SCENE: referenced.add(step[CONF_SCENE]) self._referenced_entities = referenced return referenced
def referenced_entities(self): """Return a set of referenced entities.""" if self._referenced_entities is not None: return self._referenced_entities referenced: set[str] = set() for step in self.sequence: action = cv.determine_script_action(step) if action == cv.SCRIPT_ACTION_CALL_SERVICE: for data in ( step, step.get(CONF_TARGET), step.get(service.CONF_SERVICE_DATA), step.get(service.CONF_SERVICE_DATA_TEMPLATE), ): _referenced_extract_ids(data, ATTR_ENTITY_ID, referenced) elif action == cv.SCRIPT_ACTION_CHECK_CONDITION: referenced |= condition.async_extract_entities(step) elif action == cv.SCRIPT_ACTION_ACTIVATE_SCENE: referenced.add(step[CONF_SCENE]) self._referenced_entities = referenced return referenced
async def async_validate_action_config(hass: HomeAssistant, config: ConfigType) -> ConfigType: """Validate config.""" action_type = cv.determine_script_action(config) if action_type == cv.SCRIPT_ACTION_DEVICE_AUTOMATION: platform = await device_automation.async_get_device_automation_platform( hass, config[CONF_DOMAIN], "action") config = platform.ACTION_SCHEMA(config) # type: ignore if (action_type == cv.SCRIPT_ACTION_CHECK_CONDITION and config[CONF_CONDITION] == "device"): platform = await device_automation.async_get_device_automation_platform( hass, config[CONF_DOMAIN], "condition") config = platform.CONDITION_SCHEMA(config) # type: ignore return config
async def async_validate_action_config( hass: HomeAssistant, config: ConfigType ) -> ConfigType: """Validate config.""" action_type = cv.determine_script_action(config) if action_type in STATIC_VALIDATION_ACTION_TYPES: pass elif action_type == cv.SCRIPT_ACTION_DEVICE_AUTOMATION: platform = await device_automation.async_get_device_automation_platform( hass, config[CONF_DOMAIN], "action" ) config = platform.ACTION_SCHEMA(config) # type: ignore elif action_type == cv.SCRIPT_ACTION_CHECK_CONDITION: if config[CONF_CONDITION] == "device": platform = await device_automation.async_get_device_automation_platform( hass, config[CONF_DOMAIN], "condition" ) config = platform.CONDITION_SCHEMA(config) # type: ignore elif action_type == cv.SCRIPT_ACTION_WAIT_FOR_TRIGGER: config[CONF_WAIT_FOR_TRIGGER] = await async_validate_trigger_config( hass, config[CONF_WAIT_FOR_TRIGGER] ) elif action_type == cv.SCRIPT_ACTION_REPEAT: config[CONF_SEQUENCE] = await async_validate_actions_config( hass, config[CONF_REPEAT][CONF_SEQUENCE] ) elif action_type == cv.SCRIPT_ACTION_CHOOSE: if CONF_DEFAULT in config: config[CONF_DEFAULT] = await async_validate_actions_config( hass, config[CONF_DEFAULT] ) for choose_conf in config[CONF_CHOOSE]: choose_conf[CONF_SEQUENCE] = await async_validate_actions_config( hass, choose_conf[CONF_SEQUENCE] ) else: raise ValueError(f"No validation for {action_type}") return config
def referenced_devices(self): """Return a set of referenced devices.""" if self._referenced_devices is not None: return self._referenced_devices referenced = set() for step in self.sequence: action = cv.determine_script_action(step) if action == cv.SCRIPT_ACTION_CHECK_CONDITION: referenced |= condition.async_extract_devices(step) elif action == cv.SCRIPT_ACTION_DEVICE_AUTOMATION: referenced.add(step[CONF_DEVICE_ID]) self._referenced_devices = referenced return referenced
def referenced_areas(self): """Return a set of referenced areas.""" if self._referenced_areas is not None: return self._referenced_areas referenced: set[str] = set() for step in self.sequence: action = cv.determine_script_action(step) if action == cv.SCRIPT_ACTION_CALL_SERVICE: for data in ( step.get(CONF_TARGET), step.get(service.CONF_SERVICE_DATA), step.get(service.CONF_SERVICE_DATA_TEMPLATE), ): _referenced_extract_ids(data, ATTR_AREA_ID, referenced) self._referenced_areas = referenced return referenced