1 """Support for Template vacuums."""
3 from __future__
import annotations
8 import voluptuous
as vol
12 DOMAIN
as VACUUM_DOMAIN,
16 SERVICE_RETURN_TO_BASE,
17 SERVICE_SET_FAN_SPEED,
44 from .const
import DOMAIN
45 from .template_entity
import (
46 TEMPLATE_ENTITY_ATTRIBUTES_SCHEMA_LEGACY,
47 TEMPLATE_ENTITY_AVAILABILITY_SCHEMA_LEGACY,
49 rewrite_common_legacy_to_modern_conf,
52 _LOGGER = logging.getLogger(__name__)
54 CONF_VACUUMS =
"vacuums"
55 CONF_BATTERY_LEVEL_TEMPLATE =
"battery_level_template"
56 CONF_FAN_SPEED_LIST =
"fan_speeds"
57 CONF_FAN_SPEED_TEMPLATE =
"fan_speed_template"
59 ENTITY_ID_FORMAT = VACUUM_DOMAIN +
".{}"
69 VACUUM_SCHEMA = vol.All(
70 cv.deprecated(CONF_ENTITY_ID),
73 vol.Optional(CONF_FRIENDLY_NAME): cv.string,
74 vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
75 vol.Optional(CONF_BATTERY_LEVEL_TEMPLATE): cv.template,
76 vol.Optional(CONF_FAN_SPEED_TEMPLATE): cv.template,
77 vol.Required(SERVICE_START): cv.SCRIPT_SCHEMA,
78 vol.Optional(SERVICE_PAUSE): cv.SCRIPT_SCHEMA,
79 vol.Optional(SERVICE_STOP): cv.SCRIPT_SCHEMA,
80 vol.Optional(SERVICE_RETURN_TO_BASE): cv.SCRIPT_SCHEMA,
81 vol.Optional(SERVICE_CLEAN_SPOT): cv.SCRIPT_SCHEMA,
82 vol.Optional(SERVICE_LOCATE): cv.SCRIPT_SCHEMA,
83 vol.Optional(SERVICE_SET_FAN_SPEED): cv.SCRIPT_SCHEMA,
84 vol.Optional(CONF_FAN_SPEED_LIST, default=[]): cv.ensure_list,
85 vol.Optional(CONF_ENTITY_ID): cv.entity_ids,
86 vol.Optional(CONF_UNIQUE_ID): cv.string,
89 .extend(TEMPLATE_ENTITY_ATTRIBUTES_SCHEMA_LEGACY.schema)
90 .extend(TEMPLATE_ENTITY_AVAILABILITY_SCHEMA_LEGACY.schema),
93 PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend(
94 {vol.Required(CONF_VACUUMS): vol.Schema({cv.slug: VACUUM_SCHEMA})}
99 """Create the Template Vacuums."""
102 for object_id, entity_config
in config[CONF_VACUUMS].items():
104 unique_id = entity_config.get(CONF_UNIQUE_ID)
121 async_add_entities: AddEntitiesCallback,
122 discovery_info: DiscoveryInfoType |
None =
None,
124 """Set up the template vacuums."""
129 """A template vacuum component."""
131 _attr_should_poll =
False
140 """Initialize the vacuum."""
142 hass, config=config, fallback_name=object_id, unique_id=unique_id
145 ENTITY_ID_FORMAT, object_id, hass=hass
149 self.
_template_template = config.get(CONF_VALUE_TEMPLATE)
153 VacuumEntityFeature.START | VacuumEntityFeature.STATE
159 if pause_action := config.get(SERVICE_PAUSE):
164 if stop_action := config.get(SERVICE_STOP):
169 if return_to_base_action := config.get(SERVICE_RETURN_TO_BASE):
171 hass, return_to_base_action, friendly_name, DOMAIN
176 if clean_spot_action := config.get(SERVICE_CLEAN_SPOT):
178 hass, clean_spot_action, friendly_name, DOMAIN
183 if locate_action := config.get(SERVICE_LOCATE):
188 if set_fan_speed_action := config.get(SERVICE_SET_FAN_SPEED):
190 hass, set_fan_speed_action, friendly_name, DOMAIN
206 """Return the status of the vacuum cleaner."""
210 """Start or resume the cleaning task."""
214 """Pause the cleaning task."""
221 """Stop the cleaning task."""
228 """Set the vacuum cleaner to return to the dock."""
235 """Perform a spot clean-up."""
242 """Locate the vacuum cleaner."""
257 run_variables={ATTR_FAN_SPEED: fan_speed},
262 "Received invalid fan speed: %s for entity %s. Expected: %s",
270 """Set up templates."""
288 none_on_template_error=
True,
295 if isinstance(result, TemplateError):
297 self.
_state_state = STATE_UNKNOWN
303 if result
in _VALID_STATES:
304 self.
_state_state = result
305 elif result == STATE_UNKNOWN:
309 "Received invalid vacuum state: %s for entity %s. Expected: %s",
312 ", ".join(_VALID_STATES),
319 battery_level_int =
int(battery_level)
320 if not 0 <= battery_level_int <= 100:
324 "Received invalid battery level: %s for entity %s. Expected: 0-100",
335 if isinstance(fan_speed, TemplateError):
343 elif fan_speed == STATE_UNKNOWN:
347 "Received invalid fan speed: %s for entity %s. Expected: %s",
None _update_state(self, str|TemplateError result)
None async_run_script(self, Script script, *_VarsType|None run_variables=None, Context|None context=None)
None add_template_attribute(self, str attribute, Template template, Callable[[Any], Any]|None validator=None, Callable[[Any], None]|None on_update=None, bool none_on_template_error=False)
None async_locate(self, **Any kwargs)
None async_stop(self, **Any kwargs)
None async_set_fan_speed(self, str fan_speed, **Any kwargs)
None _async_setup_templates(self)
None async_return_to_base(self, **Any kwargs)
None async_clean_spot(self, **Any kwargs)
def _update_state(self, result)
def _update_battery_level(self, battery_level)
def _update_fan_speed(self, fan_speed)
def __init__(self, hass, object_id, config, unique_id)
dict[str, Any] rewrite_common_legacy_to_modern_conf(HomeAssistant hass, dict[str, Any] entity_cfg, dict[str, str]|None extra_legacy_fields=None)
def _async_create_entities(hass, config)
None async_setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback async_add_entities, DiscoveryInfoType|None discovery_info=None)
str async_generate_entity_id(str entity_id_format, str|None name, Iterable[str]|None current_ids=None, HomeAssistant|None hass=None)