diff --git a/homeassistant/components/template/alarm_control_panel.py b/homeassistant/components/template/alarm_control_panel.py index ae26e58ac04..132e9fb0ca5 100644 --- a/homeassistant/components/template/alarm_control_panel.py +++ b/homeassistant/components/template/alarm_control_panel.py @@ -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( diff --git a/tests/components/template/test_alarm_control_panel.py b/tests/components/template/test_alarm_control_panel.py index 8f9ab39f7c0..9e51b48dcc6 100644 --- a/tests/components/template/test_alarm_control_panel.py +++ b/tests/components/template/test_alarm_control_panel.py @@ -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", ], )