Add vacation mode to Template Alarm Control Panel (#74261)

This commit is contained in:
mbo18 2022-06-30 21:22:03 +02:00 committed by GitHub
parent 7656ca8313
commit 24d2d62121
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 0 deletions

View File

@ -21,6 +21,7 @@ from homeassistant.const import (
STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_HOME,
STATE_ALARM_ARMED_NIGHT,
STATE_ALARM_ARMED_VACATION,
STATE_ALARM_ARMING,
STATE_ALARM_DISARMED,
STATE_ALARM_PENDING,
@ -43,6 +44,7 @@ _VALID_STATES = [
STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_HOME,
STATE_ALARM_ARMED_NIGHT,
STATE_ALARM_ARMED_VACATION,
STATE_ALARM_ARMING,
STATE_ALARM_DISARMED,
STATE_ALARM_PENDING,
@ -53,6 +55,7 @@ _VALID_STATES = [
CONF_ARM_AWAY_ACTION = "arm_away"
CONF_ARM_HOME_ACTION = "arm_home"
CONF_ARM_NIGHT_ACTION = "arm_night"
CONF_ARM_VACATION_ACTION = "arm_vacation"
CONF_DISARM_ACTION = "disarm"
CONF_ALARM_CONTROL_PANELS = "panels"
CONF_CODE_ARM_REQUIRED = "code_arm_required"
@ -74,6 +77,7 @@ ALARM_CONTROL_PANEL_SCHEMA = vol.Schema(
vol.Optional(CONF_ARM_AWAY_ACTION): cv.SCRIPT_SCHEMA,
vol.Optional(CONF_ARM_HOME_ACTION): cv.SCRIPT_SCHEMA,
vol.Optional(CONF_ARM_NIGHT_ACTION): cv.SCRIPT_SCHEMA,
vol.Optional(CONF_ARM_VACATION_ACTION): cv.SCRIPT_SCHEMA,
vol.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean,
vol.Optional(CONF_CODE_FORMAT, default=TemplateCodeFormat.number.name): cv.enum(
TemplateCodeFormat
@ -157,6 +161,9 @@ class AlarmControlPanelTemplate(TemplateEntity, AlarmControlPanelEntity):
self._arm_night_script = None
if (arm_night_action := config.get(CONF_ARM_NIGHT_ACTION)) is not None:
self._arm_night_script = Script(hass, arm_night_action, name, DOMAIN)
self._arm_vacation_script = None
if (arm_vacation_action := config.get(CONF_ARM_VACATION_ACTION)) is not None:
self._arm_vacation_script = Script(hass, arm_vacation_action, name, DOMAIN)
self._state: str | None = None
@ -184,6 +191,11 @@ class AlarmControlPanelTemplate(TemplateEntity, AlarmControlPanelEntity):
supported_features | AlarmControlPanelEntityFeature.ARM_AWAY
)
if self._arm_vacation_script is not None:
supported_features = (
supported_features | AlarmControlPanelEntityFeature.ARM_VACATION
)
return supported_features
@property
@ -257,6 +269,12 @@ class AlarmControlPanelTemplate(TemplateEntity, AlarmControlPanelEntity):
STATE_ALARM_ARMED_NIGHT, script=self._arm_night_script, code=code
)
async def async_alarm_arm_vacation(self, code: str | None = None) -> None:
"""Arm the panel to Vacation."""
await self._async_alarm_arm(
STATE_ALARM_ARMED_VACATION, script=self._arm_vacation_script, code=code
)
async def async_alarm_disarm(self, code: str | None = None) -> None:
"""Disarm the panel."""
await self._async_alarm_arm(

View File

@ -10,6 +10,7 @@ from homeassistant.const import (
STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_HOME,
STATE_ALARM_ARMED_NIGHT,
STATE_ALARM_ARMED_VACATION,
STATE_ALARM_ARMING,
STATE_ALARM_DISARMED,
STATE_ALARM_PENDING,
@ -56,6 +57,11 @@ OPTIMISTIC_TEMPLATE_ALARM_CONFIG = {
"entity_id": "alarm_control_panel.test",
"data": {"code": "{{ this.entity_id }}"},
},
"arm_vacation": {
"service": "alarm_control_panel.alarm_arm_vacation",
"entity_id": "alarm_control_panel.test",
"data": {"code": "{{ this.entity_id }}"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
@ -89,6 +95,7 @@ async def test_template_state_text(hass, start_ha):
STATE_ALARM_ARMED_HOME,
STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_NIGHT,
STATE_ALARM_ARMED_VACATION,
STATE_ALARM_ARMING,
STATE_ALARM_DISARMED,
STATE_ALARM_PENDING,
@ -128,6 +135,7 @@ async def test_optimistic_states(hass, start_ha):
("alarm_arm_away", STATE_ALARM_ARMED_AWAY),
("alarm_arm_home", STATE_ALARM_ARMED_HOME),
("alarm_arm_night", STATE_ALARM_ARMED_NIGHT),
("alarm_arm_vacation", STATE_ALARM_ARMED_VACATION),
("alarm_disarm", STATE_ALARM_DISARMED),
]:
await hass.services.async_call(
@ -250,6 +258,7 @@ async def test_name(hass, start_ha):
"alarm_arm_home",
"alarm_arm_away",
"alarm_arm_night",
"alarm_arm_vacation",
"alarm_disarm",
],
)