1 """Schema for config entries."""
3 from __future__
import annotations
7 import voluptuous
as vol
44 """Test if value is a string of digits, aka an integer."""
45 new_value =
str(value)
46 if new_value.isdigit():
48 raise vol.Invalid(
"Not a string with numbers")
51 CHANNEL_DATA_SCHEMA = vol.Schema(
53 vol.Optional(CONF_NAME): cv.string,
54 vol.Optional(CONF_FADE): vol.Coerce(float),
55 vol.Optional(CONF_TYPE, default=DEFAULT_CHANNEL_TYPE): vol.Any(
61 CHANNEL_SCHEMA = vol.Schema({num_string: CHANNEL_DATA_SCHEMA})
63 PRESET_DATA_SCHEMA = vol.Schema(
65 vol.Optional(CONF_NAME): cv.string,
66 vol.Optional(CONF_FADE): vol.Coerce(float),
67 vol.Optional(CONF_LEVEL): vol.Coerce(float),
71 PRESET_SCHEMA = vol.Schema({num_string: vol.Any(PRESET_DATA_SCHEMA,
None)})
73 TEMPLATE_ROOM_SCHEMA = vol.Schema(
74 {vol.Optional(CONF_ROOM_ON): num_string, vol.Optional(CONF_ROOM_OFF): num_string}
77 TEMPLATE_TIMECOVER_SCHEMA = vol.Schema(
79 vol.Optional(CONF_CHANNEL_COVER): num_string,
80 vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
81 vol.Optional(CONF_OPEN_PRESET): num_string,
82 vol.Optional(CONF_CLOSE_PRESET): num_string,
83 vol.Optional(CONF_STOP_PRESET): num_string,
84 vol.Optional(CONF_DURATION): vol.Coerce(float),
85 vol.Optional(CONF_TILT_TIME): vol.Coerce(float),
89 TEMPLATE_DATA_SCHEMA = vol.Any(TEMPLATE_ROOM_SCHEMA, TEMPLATE_TIMECOVER_SCHEMA)
91 TEMPLATE_SCHEMA = vol.Schema({str: TEMPLATE_DATA_SCHEMA})
95 """Validate that template parameters are only used if area is using the relevant template."""
97 for configs
in DEFAULT_TEMPLATES.values():
100 if config.get(CONF_TEMPLATE):
101 for conf
in DEFAULT_TEMPLATES[config[CONF_TEMPLATE]]:
102 conf_set.remove(conf)
103 for conf
in conf_set:
106 f
"{conf} should not be part of area {config[CONF_NAME]} config"
111 AREA_DATA_SCHEMA = vol.Schema(
114 vol.Required(CONF_NAME): cv.string,
115 vol.Optional(CONF_TEMPLATE): vol.In(DEFAULT_TEMPLATES),
116 vol.Optional(CONF_FADE): vol.Coerce(float),
117 vol.Optional(CONF_NO_DEFAULT): cv.boolean,
118 vol.Optional(CONF_CHANNEL): CHANNEL_SCHEMA,
119 vol.Optional(CONF_PRESET): PRESET_SCHEMA,
121 vol.Optional(CONF_ROOM_ON): num_string,
122 vol.Optional(CONF_ROOM_OFF): num_string,
123 vol.Optional(CONF_CHANNEL_COVER): num_string,
124 vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
125 vol.Optional(CONF_OPEN_PRESET): num_string,
126 vol.Optional(CONF_CLOSE_PRESET): num_string,
127 vol.Optional(CONF_STOP_PRESET): num_string,
128 vol.Optional(CONF_DURATION): vol.Coerce(float),
129 vol.Optional(CONF_TILT_TIME): vol.Coerce(float),
135 AREA_SCHEMA = vol.Schema({num_string: vol.Any(AREA_DATA_SCHEMA,
None)})
137 PLATFORM_DEFAULTS_SCHEMA = vol.Schema({vol.Optional(CONF_FADE): vol.Coerce(float)})
140 BRIDGE_SCHEMA = vol.Schema(
142 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
143 vol.Required(CONF_HOST): cv.string,
144 vol.Optional(CONF_PORT, default=DEFAULT_PORT): int,
145 vol.Optional(CONF_AUTO_DISCOVER, default=
False): vol.Coerce(bool),
146 vol.Optional(CONF_POLL_TIMER, default=1.0): vol.Coerce(float),
147 vol.Optional(CONF_AREA): AREA_SCHEMA,
148 vol.Optional(CONF_DEFAULT): PLATFORM_DEFAULTS_SCHEMA,
149 vol.Optional(CONF_ACTIVE, default=
False): vol.Any(
150 ACTIVE_ON, ACTIVE_OFF, ACTIVE_INIT, cv.boolean
152 vol.Optional(CONF_PRESET): PRESET_SCHEMA,
153 vol.Optional(CONF_TEMPLATE): TEMPLATE_SCHEMA,
str num_string(str|int value)
dict[str, Any] validate_area(dict[str, Any] config)