async def validate_configs(hass, entity_configs): """Validate that entities exist and ensure templates are ready to use.""" entity_registry = await hass.helpers.entity_registry.async_get_registry() for entity_id, entity_config in entity_configs.items(): state = hass.states.get(entity_id) if state is None: _LOGGER.debug("Entity not found: %s", entity_id) continue entity = entity_registry.async_get(entity_id) if entity: entity_config[CONF_UNIQUE_ID] = get_system_unique_id(entity) else: entity_config[CONF_UNIQUE_ID] = entity_id if CONF_POWER in entity_config: power_val = entity_config[CONF_POWER] if isinstance(power_val, str) and is_template_string(power_val): entity_config[CONF_POWER] = Template(power_val, hass) elif isinstance(power_val, Template): entity_config[CONF_POWER].hass = hass elif CONF_POWER_ENTITY in entity_config: power_val = entity_config[CONF_POWER_ENTITY] if hass.states.get(power_val) is None: _LOGGER.debug("Sensor Entity not found: %s", power_val) else: entity_config[CONF_POWER] = power_val elif state.domain == SENSOR_DOMAIN: pass elif ATTR_CURRENT_POWER_W in state.attributes: pass else: _LOGGER.debug("No power value defined for: %s", entity_id)
def dynamic_template(value: Any | None) -> template_helper.Template: """Validate a dynamic (non static) jinja2 template.""" if value is None: raise vol.Invalid("template value is None") if isinstance(value, (list, dict, template_helper.Template)): raise vol.Invalid("template value should be a string") if not template_helper.is_template_string(str(value)): raise vol.Invalid("template value does not contain a dynamic template") template_value = template_helper.Template(str(value)) # type: ignore try: template_value.ensure_valid() return template_value except TemplateError as ex: raise vol.Invalid(f"invalid template ({ex})") from ex
def template_complex(value: Any) -> Any: """Validate a complex jinja2 template.""" if isinstance(value, list): return_list = value.copy() for idx, element in enumerate(return_list): return_list[idx] = template_complex(element) return return_list if isinstance(value, dict): return { template_complex(key): template_complex(element) for key, element in value.items() } if isinstance(value, str) and template_helper.is_template_string(value): return template(value) return value
async def async_step_user( self, user_input=None ): # pylint: disable=dangerous-default-value """Handle a flow initialized by the user.""" self._errors = {} if user_input is not None: if user_input["additional_costs"] == "": user_input["additional_costs"] = DEFAULT_TEMPLATE else: # Lets try to remove the most common mistakes, this will still fail if the template # was writte in notepad or something like that.. user_input["additional_costs"] = re.sub(r"\s{2,}", '', user_input["additional_costs"]) if not is_template_string(user_input["additional_costs"]): raise return self.async_create_entry(title="Nordpool", data=user_input) data_schema = { vol.Required("region", default=None): vol.In(regions), vol.Optional("friendly_name", default=""): str, vol.Optional("currency", default=""): vol.In(currencys), vol.Optional("VAT", default=True): bool, vol.Optional("precision", default=3): vol.Coerce(int), vol.Optional("low_price_cutoff", default=1.0): vol.Coerce(float), vol.Optional("price_in_cents", default=False): bool, vol.Optional("price_type", default="kWh"): vol.In(price_types), vol.Optional("additional_costs", default=""): str } placeholders = { "region": regions, "currency": currencys, "price_type": price_types, "additional_costs": "{{0}}" } return self.async_show_form( step_id="user", data_schema=vol.Schema(data_schema), description_placeholders=placeholders, errors=self._errors, )
async def validate_configs(hass, entity_configs): """Validate that entities exist and ensure templates are ready to use.""" entity_registry = await hass.helpers.entity_registry.async_get_registry() for entity_id, entity_config in entity_configs.items(): if (state := hass.states.get(entity_id)) is None: _LOGGER.debug("Entity not found: %s", entity_id) continue if entity := entity_registry.async_get(entity_id): entity_config[CONF_UNIQUE_ID] = get_system_unique_id(entity) else: entity_config[CONF_UNIQUE_ID] = entity_id if CONF_POWER in entity_config: power_val = entity_config[CONF_POWER] if isinstance(power_val, str) and is_template_string(power_val): entity_config[CONF_POWER] = Template(power_val, hass) elif isinstance(power_val, Template): entity_config[CONF_POWER].hass = hass elif CONF_POWER_ENTITY in entity_config: power_val = entity_config[CONF_POWER_ENTITY] if hass.states.get(power_val) is None: _LOGGER.debug("Sensor Entity not found: %s", power_val) else: entity_config[CONF_POWER] = power_val elif state.domain == SENSOR_DOMAIN: pass else: _LOGGER.debug("No power value defined for: %s", entity_id)
if (notifications := hass.data.get(DOMAIN)) is None: notifications = hass.data[DOMAIN] = {} if notification_id is not None: entity_id = ENTITY_ID_FORMAT.format(slugify(notification_id)) else: entity_id = async_generate_entity_id(ENTITY_ID_FORMAT, DEFAULT_OBJECT_ID, hass=hass) notification_id = entity_id.split(".")[1] warn = False attr: dict[str, str] = {} if title is not None: if is_template_string(title): warn = True try: title = cast( str, Template(title, hass).async_render( parse_result=False) # type: ignore[no-untyped-call] ) except TemplateError as ex: _LOGGER.error("Error rendering title %s: %s", title, ex) attr[ATTR_TITLE] = title attr[ATTR_FRIENDLY_NAME] = title if is_template_string(message): warn = True