From 3c68db32d6e80fa774ca72d4ac82361ffab66876 Mon Sep 17 00:00:00 2001 From: liaanvdm <43240119+liaanvdm@users.noreply.github.com> Date: Thu, 25 Oct 2018 12:21:20 +0200 Subject: [PATCH] Restore manual alarm-control-panel state using async_get_last_state (#17521) * Restore manual alarm-control-panel state using async_get_last_state This is to address issue #10793 * Added tests for restoring manual alarm state on startup * Cleaned up test formatting * Fixed more linting errors * Changed async methods to use asynch/await syntax * Removed unused asyncio import --- .../components/alarm_control_panel/manual.py | 8 +++ .../alarm_control_panel/test_manual.py | 55 +++++++++++++++++-- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/alarm_control_panel/manual.py b/homeassistant/components/alarm_control_panel/manual.py index 41f7d6988a8..362923a4ce2 100644 --- a/homeassistant/components/alarm_control_panel/manual.py +++ b/homeassistant/components/alarm_control_panel/manual.py @@ -21,6 +21,7 @@ from homeassistant.const import ( import homeassistant.helpers.config_validation as cv from homeassistant.helpers.event import track_point_in_time import homeassistant.util.dt as dt_util +from homeassistant.helpers.restore_state import async_get_last_state _LOGGER = logging.getLogger(__name__) @@ -306,3 +307,10 @@ class ManualAlarm(alarm.AlarmControlPanel): state_attr[ATTR_POST_PENDING_STATE] = self._state return state_attr + + async def async_added_to_hass(self): + """Run when entity about to be added to hass.""" + state = await async_get_last_state(self.hass, self.entity_id) + if state: + self._state = state.state + self._state_ts = state.last_updated diff --git a/tests/components/alarm_control_panel/test_manual.py b/tests/components/alarm_control_panel/test_manual.py index 7d87d05b58f..b39d4ecbbe9 100644 --- a/tests/components/alarm_control_panel/test_manual.py +++ b/tests/components/alarm_control_panel/test_manual.py @@ -3,18 +3,17 @@ from datetime import timedelta import unittest from unittest.mock import patch, MagicMock from homeassistant.components.alarm_control_panel import demo - - -from homeassistant.setup import setup_component +from homeassistant.setup import setup_component, async_setup_component from homeassistant.const import ( STATE_ALARM_DISARMED, STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_NIGHT, STATE_ALARM_ARMED_CUSTOM_BYPASS, STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED) from homeassistant.components import alarm_control_panel import homeassistant.util.dt as dt_util - -from tests.common import fire_time_changed, get_test_home_assistant +from tests.common import (fire_time_changed, get_test_home_assistant, + mock_component, mock_restore_cache) from tests.components.alarm_control_panel import common +from homeassistant.core import State, CoreState CODE = 'HELLO_CODE' @@ -1319,3 +1318,49 @@ class TestAlarmControlPanelManual(unittest.TestCase): state = self.hass.states.get(entity_id) assert STATE_ALARM_TRIGGERED == state.state + + +async def test_restore_armed_state(hass): + """Ensure armed state is restored on startup.""" + mock_restore_cache(hass, ( + State('alarm_control_panel.test', STATE_ALARM_ARMED_AWAY), + )) + + hass.state = CoreState.starting + mock_component(hass, 'recorder') + + assert await async_setup_component(hass, alarm_control_panel.DOMAIN, { + 'alarm_control_panel': { + 'platform': 'manual', + 'name': 'test', + 'pending_time': 0, + 'trigger_time': 0, + 'disarm_after_trigger': False + }}) + + state = hass.states.get('alarm_control_panel.test') + assert state + assert state.state == STATE_ALARM_ARMED_AWAY + + +async def test_restore_disarmed_state(hass): + """Ensure disarmed state is restored on startup.""" + mock_restore_cache(hass, ( + State('alarm_control_panel.test', STATE_ALARM_DISARMED), + )) + + hass.state = CoreState.starting + mock_component(hass, 'recorder') + + assert await async_setup_component(hass, alarm_control_panel.DOMAIN, { + 'alarm_control_panel': { + 'platform': 'manual', + 'name': 'test', + 'pending_time': 0, + 'trigger_time': 0, + 'disarm_after_trigger': False + }}) + + state = hass.states.get('alarm_control_panel.test') + assert state + assert state.state == STATE_ALARM_DISARMED