Make supported_features of manual alarm_control_panel configurable (#119122)
This commit is contained in:
parent
7e1806229b
commit
0ca4314d48
2 changed files with 86 additions and 8 deletions
|
@ -42,6 +42,7 @@ import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
CONF_ARMING_STATES = "arming_states"
|
||||||
CONF_CODE_TEMPLATE = "code_template"
|
CONF_CODE_TEMPLATE = "code_template"
|
||||||
CONF_CODE_ARM_REQUIRED = "code_arm_required"
|
CONF_CODE_ARM_REQUIRED = "code_arm_required"
|
||||||
|
|
||||||
|
@ -71,6 +72,14 @@ SUPPORTED_ARMING_STATES = [
|
||||||
if state not in (STATE_ALARM_DISARMED, STATE_ALARM_TRIGGERED)
|
if state not in (STATE_ALARM_DISARMED, STATE_ALARM_TRIGGERED)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
SUPPORTED_ARMING_STATE_TO_FEATURE = {
|
||||||
|
STATE_ALARM_ARMED_AWAY: AlarmControlPanelEntityFeature.ARM_AWAY,
|
||||||
|
STATE_ALARM_ARMED_HOME: AlarmControlPanelEntityFeature.ARM_HOME,
|
||||||
|
STATE_ALARM_ARMED_NIGHT: AlarmControlPanelEntityFeature.ARM_NIGHT,
|
||||||
|
STATE_ALARM_ARMED_VACATION: AlarmControlPanelEntityFeature.ARM_VACATION,
|
||||||
|
STATE_ALARM_ARMED_CUSTOM_BYPASS: AlarmControlPanelEntityFeature.ARM_CUSTOM_BYPASS,
|
||||||
|
}
|
||||||
|
|
||||||
ATTR_PREVIOUS_STATE = "previous_state"
|
ATTR_PREVIOUS_STATE = "previous_state"
|
||||||
ATTR_NEXT_STATE = "next_state"
|
ATTR_NEXT_STATE = "next_state"
|
||||||
|
|
||||||
|
@ -128,6 +137,9 @@ PLATFORM_SCHEMA = vol.Schema(
|
||||||
vol.Optional(
|
vol.Optional(
|
||||||
CONF_DISARM_AFTER_TRIGGER, default=DEFAULT_DISARM_AFTER_TRIGGER
|
CONF_DISARM_AFTER_TRIGGER, default=DEFAULT_DISARM_AFTER_TRIGGER
|
||||||
): cv.boolean,
|
): cv.boolean,
|
||||||
|
vol.Optional(CONF_ARMING_STATES, default=SUPPORTED_ARMING_STATES): vol.All(
|
||||||
|
cv.ensure_list, [vol.In(SUPPORTED_ARMING_STATES)]
|
||||||
|
),
|
||||||
vol.Optional(STATE_ALARM_ARMED_AWAY, default={}): _state_schema(
|
vol.Optional(STATE_ALARM_ARMED_AWAY, default={}): _state_schema(
|
||||||
STATE_ALARM_ARMED_AWAY
|
STATE_ALARM_ARMED_AWAY
|
||||||
),
|
),
|
||||||
|
@ -188,14 +200,6 @@ class ManualAlarm(AlarmControlPanelEntity, RestoreEntity):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
_attr_should_poll = False
|
_attr_should_poll = False
|
||||||
_attr_supported_features = (
|
|
||||||
AlarmControlPanelEntityFeature.ARM_HOME
|
|
||||||
| AlarmControlPanelEntityFeature.ARM_AWAY
|
|
||||||
| AlarmControlPanelEntityFeature.ARM_NIGHT
|
|
||||||
| AlarmControlPanelEntityFeature.ARM_VACATION
|
|
||||||
| AlarmControlPanelEntityFeature.TRIGGER
|
|
||||||
| AlarmControlPanelEntityFeature.ARM_CUSTOM_BYPASS
|
|
||||||
)
|
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
|
@ -233,6 +237,12 @@ class ManualAlarm(AlarmControlPanelEntity, RestoreEntity):
|
||||||
state: config[state][CONF_ARMING_TIME] for state in SUPPORTED_ARMING_STATES
|
state: config[state][CONF_ARMING_TIME] for state in SUPPORTED_ARMING_STATES
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self._attr_supported_features = AlarmControlPanelEntityFeature.TRIGGER
|
||||||
|
for arming_state in config.get(CONF_ARMING_STATES, SUPPORTED_ARMING_STATES):
|
||||||
|
self._attr_supported_features |= SUPPORTED_ARMING_STATE_TO_FEATURE[
|
||||||
|
arming_state
|
||||||
|
]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def state(self) -> str:
|
def state(self) -> str:
|
||||||
"""Return the state of the device."""
|
"""Return the state of the device."""
|
||||||
|
|
|
@ -7,6 +7,7 @@ from freezegun import freeze_time
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components import alarm_control_panel
|
from homeassistant.components import alarm_control_panel
|
||||||
|
from homeassistant.components.alarm_control_panel import AlarmControlPanelEntityFeature
|
||||||
from homeassistant.components.demo import alarm_control_panel as demo
|
from homeassistant.components.demo import alarm_control_panel as demo
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_CODE,
|
ATTR_CODE,
|
||||||
|
@ -1456,3 +1457,70 @@ async def test_restore_state_triggered_long_ago(hass: HomeAssistant) -> None:
|
||||||
|
|
||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state == STATE_ALARM_DISARMED
|
assert state.state == STATE_ALARM_DISARMED
|
||||||
|
|
||||||
|
|
||||||
|
async def test_default_arming_states(hass: HomeAssistant) -> None:
|
||||||
|
"""Test default arming_states."""
|
||||||
|
assert await async_setup_component(
|
||||||
|
hass,
|
||||||
|
alarm_control_panel.DOMAIN,
|
||||||
|
{
|
||||||
|
"alarm_control_panel": {
|
||||||
|
"platform": "manual",
|
||||||
|
"name": "test",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
state = hass.states.get("alarm_control_panel.test")
|
||||||
|
assert state.attributes["supported_features"] == (
|
||||||
|
AlarmControlPanelEntityFeature.ARM_HOME
|
||||||
|
| AlarmControlPanelEntityFeature.ARM_AWAY
|
||||||
|
| AlarmControlPanelEntityFeature.ARM_NIGHT
|
||||||
|
| AlarmControlPanelEntityFeature.ARM_VACATION
|
||||||
|
| AlarmControlPanelEntityFeature.TRIGGER
|
||||||
|
| AlarmControlPanelEntityFeature.ARM_CUSTOM_BYPASS
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_arming_states(hass: HomeAssistant) -> None:
|
||||||
|
"""Test arming_states."""
|
||||||
|
assert await async_setup_component(
|
||||||
|
hass,
|
||||||
|
alarm_control_panel.DOMAIN,
|
||||||
|
{
|
||||||
|
"alarm_control_panel": {
|
||||||
|
"platform": "manual",
|
||||||
|
"name": "test",
|
||||||
|
"arming_states": ["armed_away", "armed_home"],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
state = hass.states.get("alarm_control_panel.test")
|
||||||
|
assert state.attributes["supported_features"] == (
|
||||||
|
AlarmControlPanelEntityFeature.ARM_HOME
|
||||||
|
| AlarmControlPanelEntityFeature.ARM_AWAY
|
||||||
|
| AlarmControlPanelEntityFeature.TRIGGER
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_invalid_arming_states(hass: HomeAssistant) -> None:
|
||||||
|
"""Test invalid arming_states."""
|
||||||
|
assert await async_setup_component(
|
||||||
|
hass,
|
||||||
|
alarm_control_panel.DOMAIN,
|
||||||
|
{
|
||||||
|
"alarm_control_panel": {
|
||||||
|
"platform": "manual",
|
||||||
|
"name": "test",
|
||||||
|
"arming_states": ["invalid", "armed_home"],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
state = hass.states.get("alarm_control_panel.test")
|
||||||
|
assert state is None
|
||||||
|
|
Loading…
Add table
Reference in a new issue