mirror of
https://github.com/home-assistant/core.git
synced 2026-09-01 02:34:44 -05:00
Fix manual alarm panel crash on restore with invalid state (#171016)
This commit is contained in:
@@ -455,12 +455,15 @@ class ManualAlarm(AlarmControlPanelEntity, RestoreEntity):
|
||||
await super().async_added_to_hass()
|
||||
if state := await self.async_get_last_state():
|
||||
self._state_ts = state.last_updated
|
||||
if next_state := state.attributes.get(ATTR_NEXT_STATE):
|
||||
# If in arming or pending state we record the transition,
|
||||
# not the current state
|
||||
self._state = AlarmControlPanelState(next_state)
|
||||
else:
|
||||
self._state = AlarmControlPanelState(state.state)
|
||||
try:
|
||||
if next_state := state.attributes.get(ATTR_NEXT_STATE):
|
||||
# If in arming or pending state we record the transition,
|
||||
# not the current state
|
||||
self._state = AlarmControlPanelState(next_state)
|
||||
else:
|
||||
self._state = AlarmControlPanelState(state.state)
|
||||
except ValueError:
|
||||
return
|
||||
|
||||
if prev_state := state.attributes.get(ATTR_PREVIOUS_STATE):
|
||||
self._previous_state = prev_state
|
||||
|
||||
@@ -1338,6 +1338,33 @@ async def test_restore_state(hass: HomeAssistant, expected_state) -> None:
|
||||
assert state.state == expected_state
|
||||
|
||||
|
||||
async def test_restore_state_invalid(hass: HomeAssistant) -> None:
|
||||
"""Ensure invalid restored state does not crash entity setup."""
|
||||
mock_restore_cache(hass, (State("alarm_control_panel.test", "unknown"),))
|
||||
|
||||
hass.set_state(CoreState.starting)
|
||||
mock_component(hass, "recorder")
|
||||
|
||||
assert await async_setup_component(
|
||||
hass,
|
||||
alarm_control_panel.DOMAIN,
|
||||
{
|
||||
"alarm_control_panel": {
|
||||
"platform": "manual",
|
||||
"name": "test",
|
||||
"arming_time": 0,
|
||||
"trigger_time": 0,
|
||||
"disarm_after_trigger": False,
|
||||
}
|
||||
},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get("alarm_control_panel.test")
|
||||
assert state
|
||||
assert state.state == AlarmControlPanelState.DISARMED
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"expected_state",
|
||||
[
|
||||
|
||||
Reference in New Issue
Block a user