Fix manual alarm panel crash on restore with invalid state (#171016)

This commit is contained in:
Franck Nijhof
2026-05-19 08:33:40 +00:00
parent a314f7bf64
commit d39775ac34
2 changed files with 36 additions and 6 deletions
@@ -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",
[