1 """Shared schemas for MQTT discovery and YAML config items."""
3 from __future__
import annotations
7 import voluptuous
as vol
28 CONF_AVAILABILITY_MODE,
29 CONF_AVAILABILITY_TEMPLATE,
30 CONF_AVAILABILITY_TOPIC,
33 CONF_CONFIGURATION_URL,
35 CONF_DEPRECATED_VIA_HUB,
36 CONF_ENABLED_BY_DEFAULT,
41 CONF_JSON_ATTRS_TEMPLATE,
42 CONF_JSON_ATTRS_TOPIC,
46 CONF_PAYLOAD_AVAILABLE,
47 CONF_PAYLOAD_NOT_AVAILABLE,
56 DEFAULT_PAYLOAD_AVAILABLE,
57 DEFAULT_PAYLOAD_NOT_AVAILABLE,
61 from .util
import valid_publish_topic, valid_qos_schema, valid_subscribe_topic
66 CONF_AVAILABILITY_MODE,
67 CONF_AVAILABILITY_TEMPLATE,
68 CONF_AVAILABILITY_TOPIC,
70 CONF_PAYLOAD_AVAILABLE,
71 CONF_PAYLOAD_NOT_AVAILABLE,
75 MQTT_ORIGIN_INFO_SCHEMA = vol.All(
78 vol.Required(CONF_NAME): cv.string,
79 vol.Optional(CONF_SW_VERSION): cv.string,
80 vol.Optional(CONF_SUPPORT_URL): cv.configuration_url,
85 _MQTT_AVAILABILITY_SINGLE_SCHEMA = vol.Schema(
87 vol.Exclusive(CONF_AVAILABILITY_TOPIC,
"availability"): valid_subscribe_topic,
88 vol.Optional(CONF_AVAILABILITY_TEMPLATE): cv.template,
90 CONF_PAYLOAD_AVAILABLE, default=DEFAULT_PAYLOAD_AVAILABLE
93 CONF_PAYLOAD_NOT_AVAILABLE, default=DEFAULT_PAYLOAD_NOT_AVAILABLE
98 _MQTT_AVAILABILITY_LIST_SCHEMA = vol.Schema(
100 vol.Optional(CONF_AVAILABILITY_MODE, default=AVAILABILITY_LATEST): vol.All(
101 cv.string, vol.In(AVAILABILITY_MODES)
103 vol.Exclusive(CONF_AVAILABILITY,
"availability"): vol.All(
107 vol.Required(CONF_TOPIC): valid_subscribe_topic,
109 CONF_PAYLOAD_AVAILABLE, default=DEFAULT_PAYLOAD_AVAILABLE
112 CONF_PAYLOAD_NOT_AVAILABLE,
113 default=DEFAULT_PAYLOAD_NOT_AVAILABLE,
115 vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
122 _MQTT_AVAILABILITY_SCHEMA = _MQTT_AVAILABILITY_SINGLE_SCHEMA.extend(
123 _MQTT_AVAILABILITY_LIST_SCHEMA.schema
128 """Validate that a device info entry has at least one identifying value."""
129 if value.get(CONF_IDENTIFIERS)
or value.get(CONF_CONNECTIONS):
132 "Device must have at least one identifying value in "
133 "'identifiers' and/or 'connections'"
137 MQTT_ENTITY_DEVICE_INFO_SCHEMA = vol.All(
138 cv.deprecated(CONF_DEPRECATED_VIA_HUB, CONF_VIA_DEVICE),
141 vol.Optional(CONF_IDENTIFIERS, default=list): vol.All(
142 cv.ensure_list, [cv.string]
144 vol.Optional(CONF_CONNECTIONS, default=list): vol.All(
145 cv.ensure_list, [vol.All(vol.Length(2), [cv.string])]
147 vol.Optional(CONF_MANUFACTURER): cv.string,
148 vol.Optional(CONF_MODEL): cv.string,
149 vol.Optional(CONF_MODEL_ID): cv.string,
150 vol.Optional(CONF_NAME): cv.string,
151 vol.Optional(CONF_HW_VERSION): cv.string,
152 vol.Optional(CONF_SERIAL_NUMBER): cv.string,
153 vol.Optional(CONF_SW_VERSION): cv.string,
154 vol.Optional(CONF_VIA_DEVICE): cv.string,
155 vol.Optional(CONF_SUGGESTED_AREA): cv.string,
156 vol.Optional(CONF_CONFIGURATION_URL): cv.configuration_url,
159 validate_device_has_at_least_one_identifier,
163 MQTT_ORIGIN_INFO_SCHEMA = vol.All(
166 vol.Required(CONF_NAME): cv.string,
167 vol.Optional(CONF_SW_VERSION): cv.string,
168 vol.Optional(CONF_SUPPORT_URL): cv.configuration_url,
173 MQTT_ENTITY_COMMON_SCHEMA = _MQTT_AVAILABILITY_SCHEMA.extend(
175 vol.Optional(CONF_DEVICE): MQTT_ENTITY_DEVICE_INFO_SCHEMA,
176 vol.Optional(CONF_ENTITY_PICTURE): cv.url,
177 vol.Optional(CONF_ORIGIN): MQTT_ORIGIN_INFO_SCHEMA,
178 vol.Optional(CONF_ENABLED_BY_DEFAULT, default=
True): cv.boolean,
179 vol.Optional(CONF_ENTITY_CATEGORY): ENTITY_CATEGORIES_SCHEMA,
180 vol.Optional(CONF_ICON): cv.icon,
181 vol.Optional(CONF_JSON_ATTRS_TOPIC): valid_subscribe_topic,
182 vol.Optional(CONF_JSON_ATTRS_TEMPLATE): cv.template,
183 vol.Optional(CONF_OBJECT_ID): cv.string,
184 vol.Optional(CONF_UNIQUE_ID): cv.string,
188 _UNIQUE_ID_SCHEMA = vol.Schema(
189 {vol.Required(CONF_UNIQUE_ID): cv.string},
190 ).extend({}, extra=
True)
194 """Check if a unique ID is set in case an entity platform is configured."""
195 platform = config[CONF_PLATFORM]
196 if platform
in ENTITY_PLATFORMS
and len(config.keys()) > 1:
201 _COMPONENT_CONFIG_SCHEMA = vol.All(
203 {vol.Required(CONF_PLATFORM): vol.In(SUPPORTED_COMPONENTS)},
204 ).extend({}, extra=
True),
208 DEVICE_DISCOVERY_SCHEMA = _MQTT_AVAILABILITY_SCHEMA.extend(
210 vol.Required(CONF_DEVICE): MQTT_ENTITY_DEVICE_INFO_SCHEMA,
211 vol.Required(CONF_COMPONENTS): vol.Schema({str: _COMPONENT_CONFIG_SCHEMA}),
212 vol.Required(CONF_ORIGIN): MQTT_ORIGIN_INFO_SCHEMA,
213 vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic,
214 vol.Optional(CONF_COMMAND_TOPIC): valid_publish_topic,
215 vol.Optional(CONF_QOS): valid_qos_schema,
216 vol.Optional(CONF_ENCODING): cv.string,
dict[str, Any] check_unique_id(dict[str, Any] config)
ConfigType validate_device_has_at_least_one_identifier(ConfigType value)