mirror of
https://github.com/home-assistant/core.git
synced 2025-07-29 16:17:20 +00:00
Add optimistic option to alarm control panel yaml (#149334)
This commit is contained in:
parent
aa1314c1d5
commit
8339516fb4
@ -49,6 +49,7 @@ from .helpers import (
|
|||||||
)
|
)
|
||||||
from .template_entity import (
|
from .template_entity import (
|
||||||
TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA,
|
TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA,
|
||||||
|
TEMPLATE_ENTITY_OPTIMISTIC_SCHEMA,
|
||||||
TemplateEntity,
|
TemplateEntity,
|
||||||
make_template_entity_common_modern_schema,
|
make_template_entity_common_modern_schema,
|
||||||
)
|
)
|
||||||
@ -113,8 +114,8 @@ ALARM_CONTROL_PANEL_COMMON_SCHEMA = vol.Schema(
|
|||||||
)
|
)
|
||||||
|
|
||||||
ALARM_CONTROL_PANEL_YAML_SCHEMA = ALARM_CONTROL_PANEL_COMMON_SCHEMA.extend(
|
ALARM_CONTROL_PANEL_YAML_SCHEMA = ALARM_CONTROL_PANEL_COMMON_SCHEMA.extend(
|
||||||
make_template_entity_common_modern_schema(DEFAULT_NAME).schema
|
TEMPLATE_ENTITY_OPTIMISTIC_SCHEMA
|
||||||
)
|
).extend(make_template_entity_common_modern_schema(DEFAULT_NAME).schema)
|
||||||
|
|
||||||
ALARM_CONTROL_PANEL_LEGACY_YAML_SCHEMA = vol.Schema(
|
ALARM_CONTROL_PANEL_LEGACY_YAML_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
@ -205,13 +206,12 @@ class AbstractTemplateAlarmControlPanel(
|
|||||||
"""Representation of a templated Alarm Control Panel features."""
|
"""Representation of a templated Alarm Control Panel features."""
|
||||||
|
|
||||||
_entity_id_format = ENTITY_ID_FORMAT
|
_entity_id_format = ENTITY_ID_FORMAT
|
||||||
|
_optimistic_entity = True
|
||||||
|
|
||||||
# The super init is not called because TemplateEntity and TriggerEntity will call AbstractTemplateEntity.__init__.
|
# The super init is not called because TemplateEntity and TriggerEntity will call AbstractTemplateEntity.__init__.
|
||||||
# This ensures that the __init__ on AbstractTemplateEntity is not called twice.
|
# This ensures that the __init__ on AbstractTemplateEntity is not called twice.
|
||||||
def __init__(self, config: dict[str, Any]) -> None: # pylint: disable=super-init-not-called
|
def __init__(self, config: dict[str, Any]) -> None: # pylint: disable=super-init-not-called
|
||||||
"""Initialize the features."""
|
"""Initialize the features."""
|
||||||
self._template = config.get(CONF_STATE)
|
|
||||||
|
|
||||||
self._attr_code_arm_required: bool = config[CONF_CODE_ARM_REQUIRED]
|
self._attr_code_arm_required: bool = config[CONF_CODE_ARM_REQUIRED]
|
||||||
self._attr_code_format = config[CONF_CODE_FORMAT].value
|
self._attr_code_format = config[CONF_CODE_FORMAT].value
|
||||||
|
|
||||||
@ -273,18 +273,14 @@ class AbstractTemplateAlarmControlPanel(
|
|||||||
|
|
||||||
async def _async_alarm_arm(self, state: Any, script: Script | None, code: Any):
|
async def _async_alarm_arm(self, state: Any, script: Script | None, code: Any):
|
||||||
"""Arm the panel to specified state with supplied script."""
|
"""Arm the panel to specified state with supplied script."""
|
||||||
optimistic_set = False
|
|
||||||
|
|
||||||
if self._template is None:
|
|
||||||
self._state = state
|
|
||||||
optimistic_set = True
|
|
||||||
|
|
||||||
if script:
|
if script:
|
||||||
await self.async_run_script(
|
await self.async_run_script(
|
||||||
script, run_variables={ATTR_CODE: code}, context=self._context
|
script, run_variables={ATTR_CODE: code}, context=self._context
|
||||||
)
|
)
|
||||||
|
|
||||||
if optimistic_set:
|
if self._attr_assumed_state:
|
||||||
|
self._state = state
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
|
|
||||||
async def async_alarm_arm_away(self, code: str | None = None) -> None:
|
async def async_alarm_arm_away(self, code: str | None = None) -> None:
|
||||||
|
@ -932,3 +932,44 @@ async def test_flow_preview(
|
|||||||
)
|
)
|
||||||
|
|
||||||
assert state["state"] == AlarmControlPanelState.DISARMED
|
assert state["state"] == AlarmControlPanelState.DISARMED
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("count", "panel_config"),
|
||||||
|
[
|
||||||
|
(
|
||||||
|
1,
|
||||||
|
{
|
||||||
|
"name": TEST_OBJECT_ID,
|
||||||
|
"state": "{{ states('alarm_control_panel.test') }}",
|
||||||
|
**OPTIMISTIC_TEMPLATE_ALARM_CONFIG,
|
||||||
|
"optimistic": True,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"style",
|
||||||
|
[ConfigurationStyle.MODERN, ConfigurationStyle.TRIGGER],
|
||||||
|
)
|
||||||
|
@pytest.mark.usefixtures("setup_panel")
|
||||||
|
async def test_optimistic(hass: HomeAssistant) -> None:
|
||||||
|
"""Test configuration with empty script."""
|
||||||
|
hass.states.async_set(TEST_STATE_ENTITY_ID, AlarmControlPanelState.DISARMED)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
ALARM_DOMAIN,
|
||||||
|
"alarm_arm_away",
|
||||||
|
{"entity_id": TEST_ENTITY_ID, "code": "1234"},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
state = hass.states.get(TEST_ENTITY_ID)
|
||||||
|
assert state.state == AlarmControlPanelState.ARMED_AWAY
|
||||||
|
|
||||||
|
hass.states.async_set(TEST_STATE_ENTITY_ID, AlarmControlPanelState.ARMED_HOME)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
state = hass.states.get(TEST_ENTITY_ID)
|
||||||
|
assert state.state == AlarmControlPanelState.ARMED_HOME
|
||||||
|
Loading…
x
Reference in New Issue
Block a user