diff --git a/homeassistant/components/manual/alarm_control_panel.py b/homeassistant/components/manual/alarm_control_panel.py index 648368db6d07..d29da80e8514 100644 --- a/homeassistant/components/manual/alarm_control_panel.py +++ b/homeassistant/components/manual/alarm_control_panel.py @@ -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 diff --git a/tests/components/manual/test_alarm_control_panel.py b/tests/components/manual/test_alarm_control_panel.py index fa9248e8f383..80555219ed21 100644 --- a/tests/components/manual/test_alarm_control_panel.py +++ b/tests/components/manual/test_alarm_control_panel.py @@ -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", [