"""TemplateEntity utility class.""" from __future__ import annotations import itertools from typing import Any import voluptuous as vol from homeassistant.const import ( CONF_ENTITY_PICTURE_TEMPLATE, CONF_FRIENDLY_NAME, CONF_ICON, CONF_ICON_TEMPLATE, CONF_NAME, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.template import Template from homeassistant.helpers.template_entity import ( # noqa: F401 pylint: disable=unused-import TEMPLATE_ENTITY_BASE_SCHEMA, TemplateEntity, ) from .const import ( CONF_ATTRIBUTE_TEMPLATES, CONF_ATTRIBUTES, CONF_AVAILABILITY, CONF_AVAILABILITY_TEMPLATE, CONF_PICTURE, ) TEMPLATE_ENTITY_AVAILABILITY_SCHEMA = vol.Schema( { vol.Optional(CONF_AVAILABILITY): cv.template, } ) TEMPLATE_ENTITY_ICON_SCHEMA = vol.Schema( { vol.Optional(CONF_ICON): cv.template, } ) TEMPLATE_ENTITY_COMMON_SCHEMA = vol.Schema( { vol.Optional(CONF_ATTRIBUTES): vol.Schema({cv.string: cv.template}), vol.Optional(CONF_AVAILABILITY): cv.template, } ).extend(TEMPLATE_ENTITY_BASE_SCHEMA.schema) TEMPLATE_ENTITY_ATTRIBUTES_SCHEMA_LEGACY = vol.Schema( { vol.Optional(CONF_ATTRIBUTE_TEMPLATES, default={}): vol.Schema( {cv.string: cv.template} ), } ) TEMPLATE_ENTITY_AVAILABILITY_SCHEMA_LEGACY = vol.Schema( { vol.Optional(CONF_AVAILABILITY_TEMPLATE): cv.template, } ) TEMPLATE_ENTITY_COMMON_SCHEMA_LEGACY = vol.Schema( { vol.Optional(CONF_ENTITY_PICTURE_TEMPLATE): cv.template, vol.Optional(CONF_ICON_TEMPLATE): cv.template, } ).extend(TEMPLATE_ENTITY_AVAILABILITY_SCHEMA_LEGACY.schema) LEGACY_FIELDS = { CONF_ICON_TEMPLATE: CONF_ICON, CONF_ENTITY_PICTURE_TEMPLATE: CONF_PICTURE, CONF_AVAILABILITY_TEMPLATE: CONF_AVAILABILITY, CONF_ATTRIBUTE_TEMPLATES: CONF_ATTRIBUTES, CONF_FRIENDLY_NAME: CONF_NAME, } def rewrite_common_legacy_to_modern_conf( entity_cfg: dict[str, Any], extra_legacy_fields: dict[str, str] | None = None ) -> dict[str, Any]: """Rewrite legacy config.""" entity_cfg = {**entity_cfg} if extra_legacy_fields is None: extra_legacy_fields = {} for from_key, to_key in itertools.chain( LEGACY_FIELDS.items(), extra_legacy_fields.items() ): if from_key not in entity_cfg or to_key in entity_cfg: continue val = entity_cfg.pop(from_key) if isinstance(val, str): val = Template(val) entity_cfg[to_key] = val if CONF_NAME in entity_cfg and isinstance(entity_cfg[CONF_NAME], str): entity_cfg[CONF_NAME] = Template(entity_cfg[CONF_NAME]) return entity_cfg