Skip to content

Commit 33cc257

Browse files
authored
Consolidate template integration's config schemas (home-assistant#149018)
1 parent 3877a62 commit 33cc257

File tree

18 files changed

+378
-246
lines changed

18 files changed

+378
-246
lines changed

homeassistant/components/template/alarm_control_panel.py

Lines changed: 43 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from homeassistant.config_entries import ConfigEntry
2222
from homeassistant.const import (
2323
ATTR_CODE,
24-
CONF_DEVICE_ID,
2524
CONF_NAME,
2625
CONF_STATE,
2726
CONF_UNIQUE_ID,
@@ -31,7 +30,7 @@
3130
)
3231
from homeassistant.core import HomeAssistant, callback
3332
from homeassistant.exceptions import TemplateError
34-
from homeassistant.helpers import config_validation as cv, selector, template
33+
from homeassistant.helpers import config_validation as cv, template
3534
from homeassistant.helpers.entity_platform import (
3635
AddConfigEntryEntitiesCallback,
3736
AddEntitiesCallback,
@@ -43,8 +42,16 @@
4342
from .const import DOMAIN
4443
from .coordinator import TriggerUpdateCoordinator
4544
from .entity import AbstractTemplateEntity
46-
from .helpers import async_setup_template_platform
47-
from .template_entity import TemplateEntity, make_template_entity_common_modern_schema
45+
from .helpers import (
46+
async_setup_template_entry,
47+
async_setup_template_platform,
48+
async_setup_template_preview,
49+
)
50+
from .template_entity import (
51+
TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA,
52+
TemplateEntity,
53+
make_template_entity_common_modern_schema,
54+
)
4855
from .trigger_entity import TriggerEntity
4956

5057
_LOGGER = logging.getLogger(__name__)
@@ -88,27 +95,7 @@ class TemplateCodeFormat(Enum):
8895

8996
DEFAULT_NAME = "Template Alarm Control Panel"
9097

91-
ALARM_CONTROL_PANEL_SCHEMA = vol.All(
92-
vol.Schema(
93-
{
94-
vol.Optional(CONF_ARM_AWAY_ACTION): cv.SCRIPT_SCHEMA,
95-
vol.Optional(CONF_ARM_CUSTOM_BYPASS_ACTION): cv.SCRIPT_SCHEMA,
96-
vol.Optional(CONF_ARM_HOME_ACTION): cv.SCRIPT_SCHEMA,
97-
vol.Optional(CONF_ARM_NIGHT_ACTION): cv.SCRIPT_SCHEMA,
98-
vol.Optional(CONF_ARM_VACATION_ACTION): cv.SCRIPT_SCHEMA,
99-
vol.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean,
100-
vol.Optional(
101-
CONF_CODE_FORMAT, default=TemplateCodeFormat.number.name
102-
): cv.enum(TemplateCodeFormat),
103-
vol.Optional(CONF_DISARM_ACTION): cv.SCRIPT_SCHEMA,
104-
vol.Optional(CONF_STATE): cv.template,
105-
vol.Optional(CONF_TRIGGER_ACTION): cv.SCRIPT_SCHEMA,
106-
}
107-
).extend(make_template_entity_common_modern_schema(DEFAULT_NAME).schema)
108-
)
109-
110-
111-
LEGACY_ALARM_CONTROL_PANEL_SCHEMA = vol.Schema(
98+
ALARM_CONTROL_PANEL_COMMON_SCHEMA = vol.Schema(
11299
{
113100
vol.Optional(CONF_ARM_AWAY_ACTION): cv.SCRIPT_SCHEMA,
114101
vol.Optional(CONF_ARM_CUSTOM_BYPASS_ACTION): cv.SCRIPT_SCHEMA,
@@ -120,22 +107,16 @@ class TemplateCodeFormat(Enum):
120107
TemplateCodeFormat
121108
),
122109
vol.Optional(CONF_DISARM_ACTION): cv.SCRIPT_SCHEMA,
123-
vol.Optional(CONF_NAME): cv.string,
110+
vol.Optional(CONF_STATE): cv.template,
124111
vol.Optional(CONF_TRIGGER_ACTION): cv.SCRIPT_SCHEMA,
125-
vol.Optional(CONF_UNIQUE_ID): cv.string,
126-
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
127112
}
128113
)
129114

130-
PLATFORM_SCHEMA = ALARM_CONTROL_PANEL_PLATFORM_SCHEMA.extend(
131-
{
132-
vol.Required(CONF_ALARM_CONTROL_PANELS): cv.schema_with_slug_keys(
133-
LEGACY_ALARM_CONTROL_PANEL_SCHEMA
134-
),
135-
}
115+
ALARM_CONTROL_PANEL_YAML_SCHEMA = ALARM_CONTROL_PANEL_COMMON_SCHEMA.extend(
116+
make_template_entity_common_modern_schema(DEFAULT_NAME).schema
136117
)
137118

138-
ALARM_CONTROL_PANEL_CONFIG_SCHEMA = vol.Schema(
119+
ALARM_CONTROL_PANEL_LEGACY_YAML_SCHEMA = vol.Schema(
139120
{
140121
vol.Optional(CONF_ARM_AWAY_ACTION): cv.SCRIPT_SCHEMA,
141122
vol.Optional(CONF_ARM_CUSTOM_BYPASS_ACTION): cv.SCRIPT_SCHEMA,
@@ -146,23 +127,25 @@ class TemplateCodeFormat(Enum):
146127
vol.Optional(CONF_CODE_FORMAT, default=TemplateCodeFormat.number.name): cv.enum(
147128
TemplateCodeFormat
148129
),
149-
vol.Optional(CONF_DEVICE_ID): selector.DeviceSelector(),
150130
vol.Optional(CONF_DISARM_ACTION): cv.SCRIPT_SCHEMA,
151-
vol.Required(CONF_NAME): cv.template,
152-
vol.Optional(CONF_STATE): cv.template,
131+
vol.Optional(CONF_NAME): cv.string,
153132
vol.Optional(CONF_TRIGGER_ACTION): cv.SCRIPT_SCHEMA,
133+
vol.Optional(CONF_UNIQUE_ID): cv.string,
134+
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
154135
}
155136
)
156137

138+
PLATFORM_SCHEMA = ALARM_CONTROL_PANEL_PLATFORM_SCHEMA.extend(
139+
{
140+
vol.Required(CONF_ALARM_CONTROL_PANELS): cv.schema_with_slug_keys(
141+
ALARM_CONTROL_PANEL_LEGACY_YAML_SCHEMA
142+
),
143+
}
144+
)
157145

158-
def rewrite_options_to_modern_conf(option_config: dict[str, dict]) -> dict[str, dict]:
159-
"""Rewrite option configuration to modern configuration."""
160-
option_config = {**option_config}
161-
162-
if CONF_VALUE_TEMPLATE in option_config:
163-
option_config[CONF_STATE] = option_config.pop(CONF_VALUE_TEMPLATE)
164-
165-
return option_config
146+
ALARM_CONTROL_PANEL_CONFIG_ENTRY_SCHEMA = ALARM_CONTROL_PANEL_COMMON_SCHEMA.extend(
147+
TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA.schema
148+
)
166149

167150

168151
async def async_setup_entry(
@@ -171,18 +154,13 @@ async def async_setup_entry(
171154
async_add_entities: AddConfigEntryEntitiesCallback,
172155
) -> None:
173156
"""Initialize config entry."""
174-
_options = dict(config_entry.options)
175-
_options.pop("template_type")
176-
_options = rewrite_options_to_modern_conf(_options)
177-
validated_config = ALARM_CONTROL_PANEL_CONFIG_SCHEMA(_options)
178-
async_add_entities(
179-
[
180-
StateAlarmControlPanelEntity(
181-
hass,
182-
validated_config,
183-
config_entry.entry_id,
184-
)
185-
]
157+
await async_setup_template_entry(
158+
hass,
159+
config_entry,
160+
async_add_entities,
161+
StateAlarmControlPanelEntity,
162+
ALARM_CONTROL_PANEL_CONFIG_ENTRY_SCHEMA,
163+
True,
186164
)
187165

188166

@@ -211,11 +189,14 @@ def async_create_preview_alarm_control_panel(
211189
hass: HomeAssistant, name: str, config: dict[str, Any]
212190
) -> StateAlarmControlPanelEntity:
213191
"""Create a preview alarm control panel."""
214-
updated_config = rewrite_options_to_modern_conf(config)
215-
validated_config = ALARM_CONTROL_PANEL_CONFIG_SCHEMA(
216-
updated_config | {CONF_NAME: name}
192+
return async_setup_template_preview(
193+
hass,
194+
name,
195+
config,
196+
StateAlarmControlPanelEntity,
197+
ALARM_CONTROL_PANEL_CONFIG_ENTRY_SCHEMA,
198+
True,
217199
)
218-
return StateAlarmControlPanelEntity(hass, validated_config, None)
219200

220201

221202
class AbstractTemplateAlarmControlPanel(

homeassistant/components/template/binary_sensor.py

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
ATTR_ENTITY_ID,
2323
ATTR_FRIENDLY_NAME,
2424
CONF_DEVICE_CLASS,
25-
CONF_DEVICE_ID,
2625
CONF_ENTITY_PICTURE_TEMPLATE,
2726
CONF_FRIENDLY_NAME_TEMPLATE,
2827
CONF_ICON_TEMPLATE,
@@ -38,7 +37,7 @@
3837
)
3938
from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback
4039
from homeassistant.exceptions import TemplateError
41-
from homeassistant.helpers import config_validation as cv, selector, template
40+
from homeassistant.helpers import config_validation as cv, template
4241
from homeassistant.helpers.entity_platform import (
4342
AddConfigEntryEntitiesCallback,
4443
AddEntitiesCallback,
@@ -50,8 +49,16 @@
5049

5150
from . import TriggerUpdateCoordinator
5251
from .const import CONF_AVAILABILITY_TEMPLATE
53-
from .helpers import async_setup_template_platform
54-
from .template_entity import TEMPLATE_ENTITY_COMMON_SCHEMA, TemplateEntity
52+
from .helpers import (
53+
async_setup_template_entry,
54+
async_setup_template_platform,
55+
async_setup_template_preview,
56+
)
57+
from .template_entity import (
58+
TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA,
59+
TEMPLATE_ENTITY_COMMON_SCHEMA,
60+
TemplateEntity,
61+
)
5562
from .trigger_entity import TriggerEntity
5663

5764
CONF_DELAY_ON = "delay_on"
@@ -64,7 +71,7 @@
6471
CONF_VALUE_TEMPLATE: CONF_STATE,
6572
}
6673

67-
BINARY_SENSOR_SCHEMA = vol.Schema(
74+
BINARY_SENSOR_COMMON_SCHEMA = vol.Schema(
6875
{
6976
vol.Optional(CONF_AUTO_OFF): vol.Any(cv.positive_time_period, cv.template),
7077
vol.Optional(CONF_DELAY_OFF): vol.Any(cv.positive_time_period, cv.template),
@@ -73,15 +80,17 @@
7380
vol.Required(CONF_STATE): cv.template,
7481
vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string,
7582
}
76-
).extend(TEMPLATE_ENTITY_COMMON_SCHEMA.schema)
83+
)
7784

78-
BINARY_SENSOR_CONFIG_SCHEMA = BINARY_SENSOR_SCHEMA.extend(
79-
{
80-
vol.Optional(CONF_DEVICE_ID): selector.DeviceSelector(),
81-
}
85+
BINARY_SENSOR_YAML_SCHEMA = BINARY_SENSOR_COMMON_SCHEMA.extend(
86+
TEMPLATE_ENTITY_COMMON_SCHEMA.schema
8287
)
8388

84-
LEGACY_BINARY_SENSOR_SCHEMA = vol.All(
89+
BINARY_SENSOR_CONFIG_ENTRY_SCHEMA = BINARY_SENSOR_COMMON_SCHEMA.extend(
90+
TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA.schema
91+
)
92+
93+
BINARY_SENSOR_LEGACY_YAML_SCHEMA = vol.All(
8594
cv.deprecated(ATTR_ENTITY_ID),
8695
vol.Schema(
8796
{
@@ -106,7 +115,7 @@
106115
PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend(
107116
{
108117
vol.Required(CONF_SENSORS): cv.schema_with_slug_keys(
109-
LEGACY_BINARY_SENSOR_SCHEMA
118+
BINARY_SENSOR_LEGACY_YAML_SCHEMA
110119
),
111120
}
112121
)
@@ -138,11 +147,12 @@ async def async_setup_entry(
138147
async_add_entities: AddConfigEntryEntitiesCallback,
139148
) -> None:
140149
"""Initialize config entry."""
141-
_options = dict(config_entry.options)
142-
_options.pop("template_type")
143-
validated_config = BINARY_SENSOR_CONFIG_SCHEMA(_options)
144-
async_add_entities(
145-
[StateBinarySensorEntity(hass, validated_config, config_entry.entry_id)]
150+
await async_setup_template_entry(
151+
hass,
152+
config_entry,
153+
async_add_entities,
154+
StateBinarySensorEntity,
155+
BINARY_SENSOR_CONFIG_ENTRY_SCHEMA,
146156
)
147157

148158

@@ -151,8 +161,9 @@ def async_create_preview_binary_sensor(
151161
hass: HomeAssistant, name: str, config: dict[str, Any]
152162
) -> StateBinarySensorEntity:
153163
"""Create a preview sensor."""
154-
validated_config = BINARY_SENSOR_CONFIG_SCHEMA(config | {CONF_NAME: name})
155-
return StateBinarySensorEntity(hass, validated_config, None)
164+
return async_setup_template_preview(
165+
hass, name, config, StateBinarySensorEntity, BINARY_SENSOR_CONFIG_ENTRY_SCHEMA
166+
)
156167

157168

158169
class StateBinarySensorEntity(TemplateEntity, BinarySensorEntity, RestoreEntity):

homeassistant/components/template/button.py

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,39 +14,41 @@
1414
ButtonEntity,
1515
)
1616
from homeassistant.config_entries import ConfigEntry
17-
from homeassistant.const import CONF_DEVICE_CLASS, CONF_DEVICE_ID, CONF_NAME
17+
from homeassistant.const import CONF_DEVICE_CLASS
1818
from homeassistant.core import HomeAssistant
19-
from homeassistant.helpers import config_validation as cv, selector
19+
from homeassistant.helpers import config_validation as cv
2020
from homeassistant.helpers.entity_platform import (
2121
AddConfigEntryEntitiesCallback,
2222
AddEntitiesCallback,
2323
)
2424
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
2525

2626
from .const import CONF_PRESS, DOMAIN
27-
from .helpers import async_setup_template_platform
28-
from .template_entity import TemplateEntity, make_template_entity_common_modern_schema
27+
from .helpers import async_setup_template_entry, async_setup_template_platform
28+
from .template_entity import (
29+
TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA,
30+
TemplateEntity,
31+
make_template_entity_common_modern_schema,
32+
)
2933

3034
_LOGGER = logging.getLogger(__name__)
3135

3236
DEFAULT_NAME = "Template Button"
3337
DEFAULT_OPTIMISTIC = False
3438

35-
BUTTON_SCHEMA = vol.Schema(
39+
BUTTON_YAML_SCHEMA = vol.Schema(
3640
{
3741
vol.Required(CONF_PRESS): cv.SCRIPT_SCHEMA,
3842
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
3943
}
4044
).extend(make_template_entity_common_modern_schema(DEFAULT_NAME).schema)
4145

42-
CONFIG_BUTTON_SCHEMA = vol.Schema(
46+
BUTTON_CONFIG_ENTRY_SCHEMA = vol.Schema(
4347
{
44-
vol.Optional(CONF_NAME): cv.template,
4548
vol.Optional(CONF_PRESS): cv.SCRIPT_SCHEMA,
4649
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
47-
vol.Optional(CONF_DEVICE_ID): selector.DeviceSelector(),
4850
}
49-
)
51+
).extend(TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA.schema)
5052

5153

5254
async def async_setup_platform(
@@ -73,11 +75,12 @@ async def async_setup_entry(
7375
async_add_entities: AddConfigEntryEntitiesCallback,
7476
) -> None:
7577
"""Initialize config entry."""
76-
_options = dict(config_entry.options)
77-
_options.pop("template_type")
78-
validated_config = CONFIG_BUTTON_SCHEMA(_options)
79-
async_add_entities(
80-
[StateButtonEntity(hass, validated_config, config_entry.entry_id)]
78+
await async_setup_template_entry(
79+
hass,
80+
config_entry,
81+
async_add_entities,
82+
StateButtonEntity,
83+
BUTTON_CONFIG_ENTRY_SCHEMA,
8184
)
8285

8386

0 commit comments

Comments
 (0)