1 """Template config validator."""
3 from contextlib
import suppress
6 import voluptuous
as vol
10 BLUEPRINT_INSTANCE_FIELDS,
11 is_blueprint_instance_config,
35 binary_sensor
as binary_sensor_platform,
36 button
as button_platform,
37 image
as image_platform,
38 number
as number_platform,
39 select
as select_platform,
40 sensor
as sensor_platform,
41 weather
as weather_platform,
51 from .helpers
import async_get_blueprints
53 PACKAGE_MERGE_HINT =
"list"
55 CONFIG_SECTION_SCHEMA = vol.Schema(
57 vol.Optional(CONF_UNIQUE_ID): cv.string,
58 vol.Optional(CONF_TRIGGER): cv.TRIGGER_SCHEMA,
59 vol.Optional(CONF_CONDITION): cv.CONDITIONS_SCHEMA,
60 vol.Optional(CONF_ACTION): cv.SCRIPT_SCHEMA,
61 vol.Optional(CONF_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA,
62 vol.Optional(NUMBER_DOMAIN): vol.All(
63 cv.ensure_list, [number_platform.NUMBER_SCHEMA]
65 vol.Optional(SENSOR_DOMAIN): vol.All(
66 cv.ensure_list, [sensor_platform.SENSOR_SCHEMA]
68 vol.Optional(CONF_SENSORS): cv.schema_with_slug_keys(
69 sensor_platform.LEGACY_SENSOR_SCHEMA
71 vol.Optional(BINARY_SENSOR_DOMAIN): vol.All(
72 cv.ensure_list, [binary_sensor_platform.BINARY_SENSOR_SCHEMA]
74 vol.Optional(CONF_BINARY_SENSORS): cv.schema_with_slug_keys(
75 binary_sensor_platform.LEGACY_BINARY_SENSOR_SCHEMA
77 vol.Optional(SELECT_DOMAIN): vol.All(
78 cv.ensure_list, [select_platform.SELECT_SCHEMA]
80 vol.Optional(BUTTON_DOMAIN): vol.All(
81 cv.ensure_list, [button_platform.BUTTON_SCHEMA]
83 vol.Optional(IMAGE_DOMAIN): vol.All(
84 cv.ensure_list, [image_platform.IMAGE_SCHEMA]
86 vol.Optional(WEATHER_DOMAIN): vol.All(
87 cv.ensure_list, [weather_platform.WEATHER_SCHEMA]
92 TEMPLATE_BLUEPRINT_INSTANCE_SCHEMA = vol.Schema(
94 vol.Optional(CONF_NAME): cv.string,
95 vol.Optional(CONF_UNIQUE_ID): cv.string,
97 ).extend(BLUEPRINT_INSTANCE_FIELDS.schema)
104 """If a config item requires a blueprint, resolve that item to an actual config."""
106 raw_blueprint_inputs =
None
108 with suppress(ValueError):
109 raw_config =
dict(config)
115 blueprint_inputs = await blueprints.async_inputs_from_config(config)
116 raw_blueprint_inputs = blueprint_inputs.config_with_inputs
118 config = blueprint_inputs.async_substitute()
120 platforms = [platform
for platform
in PLATFORMS
if platform
in config]
121 if len(platforms) > 1:
122 raise vol.Invalid(
"more than one platform defined per blueprint")
123 if len(platforms) == 1:
124 platform = platforms.pop()
125 for prop
in (CONF_NAME, CONF_UNIQUE_ID, CONF_VARIABLES):
127 config[platform][prop] = config.pop(prop)
128 raw_config =
dict(config)
131 template_config.raw_blueprint_inputs = raw_blueprint_inputs
132 template_config.raw_config = raw_config
134 return template_config
138 hass: HomeAssistant, config: ConfigType
140 """Validate an entire config section for the template integration."""
144 if CONF_TRIGGER
in validated_config:
146 hass, validated_config[CONF_TRIGGER]
149 if CONF_CONDITION
in validated_config:
151 hass, validated_config[CONF_CONDITION]
154 return validated_config
158 """Validate config."""
159 if DOMAIN
not in config:
164 for cfg
in cv.ensure_list(config[DOMAIN]):
169 except vol.Invalid
as err:
174 legacy_warn_printed =
False
176 for old_key, new_key, transform
in (
180 sensor_platform.rewrite_legacy_to_modern_conf,
184 BINARY_SENSOR_DOMAIN,
185 binary_sensor_platform.rewrite_legacy_to_modern_conf,
188 if old_key
not in template_config:
191 if not legacy_warn_printed:
192 legacy_warn_printed =
True
193 logging.getLogger(__name__).warning(
194 "The entity definition format under template: differs from the"
196 "configuration format. See "
197 "https://www.home-assistant.io/integrations/template#configuration-for-trigger-based-template-sensors"
201 list(template_config[new_key])
if new_key
in template_config
else []
203 definitions.extend(transform(hass, template_config[old_key]))
204 template_config =
TemplateConfig({**template_config, new_key: definitions})
206 config_sections.append(template_config)
211 config[DOMAIN] = config_sections
blueprint.DomainBlueprints async_get_blueprints(HomeAssistant hass)
bool is_blueprint_instance_config(Any config)
ConfigType async_validate_trigger_config(HomeAssistant hass, ConfigType config)
TEMPLATE_BLUEPRINT_INSTANCE_SCHEMA
TemplateConfig async_validate_config_section(HomeAssistant hass, ConfigType config)
TemplateConfig _async_resolve_blueprints(HomeAssistant hass, ConfigType config)
ConfigType async_validate_config(HomeAssistant hass, ConfigType config)
None async_log_schema_error(vol.Invalid exc, str domain, dict config, HomeAssistant hass, str|None link=None)
ConfigType config_without_domain(ConfigType config, str domain)
list[ConfigType|Template] async_validate_conditions_config(HomeAssistant hass, list[ConfigType] conditions)
None async_notify_setup_error(HomeAssistant hass, str component, str|None display_link=None)