From 1b7ce2146c21262d2a0c2eda7569ce980ba426d9 Mon Sep 17 00:00:00 2001 From: sfam Date: Tue, 13 Oct 2015 00:56:24 +0000 Subject: [PATCH] replace sleeps with track_point_in_time --- .../alarm_control_panel/__init__.py | 28 ++++--- .../components/alarm_control_panel/manual.py | 77 ++++++++++++------- .../components/alarm_control_panel/mqtt.py | 5 +- .../alarm_control_panel/verisure.py | 5 +- 4 files changed, 69 insertions(+), 46 deletions(-) diff --git a/homeassistant/components/alarm_control_panel/__init__.py b/homeassistant/components/alarm_control_panel/__init__.py index f922ecdacc0..802faaac958 100644 --- a/homeassistant/components/alarm_control_panel/__init__.py +++ b/homeassistant/components/alarm_control_panel/__init__.py @@ -73,40 +73,44 @@ def setup(hass, config): return True -def alarm_disarm(hass, code, entity_id=None): +def alarm_disarm(hass, code=None, entity_id=None): """ Send the alarm the command for disarm. """ - data = {ATTR_CODE: code} - + data = {} + if code: + data[ATTR_CODE] = code if entity_id: data[ATTR_ENTITY_ID] = entity_id hass.services.call(DOMAIN, SERVICE_ALARM_DISARM, data) -def alarm_arm_home(hass, code, entity_id=None): +def alarm_arm_home(hass, code=None, entity_id=None): """ Send the alarm the command for arm home. """ - data = {ATTR_CODE: code} - + data = {} + if code: + data[ATTR_CODE] = code if entity_id: data[ATTR_ENTITY_ID] = entity_id hass.services.call(DOMAIN, SERVICE_ALARM_ARM_HOME, data) -def alarm_arm_away(hass, code, entity_id=None): +def alarm_arm_away(hass, code=None, entity_id=None): """ Send the alarm the command for arm away. """ - data = {ATTR_CODE: code} - + data = {} + if code: + data[ATTR_CODE] = code if entity_id: data[ATTR_ENTITY_ID] = entity_id hass.services.call(DOMAIN, SERVICE_ALARM_ARM_AWAY, data) -def alarm_trigger(hass, code, entity_id=None): +def alarm_trigger(hass, code=None, entity_id=None): """ Send the alarm the command for trigger. """ - data = {ATTR_CODE: code} - + data = {} + if code: + data[ATTR_CODE] = code if entity_id: data[ATTR_ENTITY_ID] = entity_id diff --git a/homeassistant/components/alarm_control_panel/manual.py b/homeassistant/components/alarm_control_panel/manual.py index e83a2e9da2f..eaeda59719b 100644 --- a/homeassistant/components/alarm_control_panel/manual.py +++ b/homeassistant/components/alarm_control_panel/manual.py @@ -33,8 +33,10 @@ Default is 120 seconds. """ import logging -import time +import datetime import homeassistant.components.alarm_control_panel as alarm +from homeassistant.helpers.event import track_point_in_time +import homeassistant.util.dt as dt_util from homeassistant.const import ( STATE_ALARM_DISARMED, STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_AWAY, @@ -62,6 +64,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): # pylint: disable=too-many-arguments, too-many-instance-attributes +# pylint: disable=abstract-method class ManualAlarm(alarm.AlarmControlPanel): """ represents an alarm status within home assistant. """ @@ -70,8 +73,9 @@ class ManualAlarm(alarm.AlarmControlPanel): self._hass = hass self._name = name self._code = code - self._pending_time = pending_time - self._trigger_time = trigger_time + self._pending_time = datetime.timedelta(seconds=pending_time) + self._trigger_time = datetime.timedelta(seconds=trigger_time) + self._state_ts = None self._pending_to = None @property @@ -94,49 +98,70 @@ class ManualAlarm(alarm.AlarmControlPanel): """ One or more characters """ return None if self._code is None else '.+' - def change_alarm_state(self, begin, end, delay=0): + def update_state(self, state, pending_to): """ changes between state with delay """ - self._state = begin - self._pending_to = end + self._state = state + self._state_ts = dt_util.utcnow() + self._pending_to = pending_to self.update_ha_state() - time.sleep(delay) - if self._pending_to == end and begin != end: - self._state = end - self._pending_to = None - self.update_ha_state() def alarm_disarm(self, code=None): """ Send disarm command. """ if code == str(self._code) or self.code_format is None: - self.change_alarm_state( - STATE_ALARM_DISARMED, STATE_ALARM_DISARMED) + self.update_state(STATE_ALARM_DISARMED, None) else: _LOGGER.warning("Wrong code entered while disarming!") def alarm_arm_home(self, code=None): """ Send arm home command. """ if code == str(self._code) or self.code_format is None: - self.change_alarm_state( - STATE_ALARM_PENDING, STATE_ALARM_ARMED_HOME, - self._pending_time) + self.update_state(STATE_ALARM_PENDING, STATE_ALARM_ARMED_HOME) + + def delayed_alarm_arm_home(event_time): + """ callback for delayed action """ + if self._pending_to == STATE_ALARM_ARMED_HOME and \ + dt_util.utcnow() - self._state_ts >= self._pending_time: + self.update_state(STATE_ALARM_ARMED_HOME, None) + track_point_in_time( + self._hass, delayed_alarm_arm_home, + dt_util.utcnow() + self._pending_time) else: _LOGGER.warning("Wrong code entered while arming home!") def alarm_arm_away(self, code=None): """ Send arm away command. """ if code == str(self._code) or self.code_format is None: - self.change_alarm_state( - STATE_ALARM_PENDING, STATE_ALARM_ARMED_AWAY, - self._pending_time) + self.update_state(STATE_ALARM_PENDING, STATE_ALARM_ARMED_AWAY) + + def delayed_alarm_arm_away(event_time): + """ callback for delayed action """ + if self._pending_to == STATE_ALARM_ARMED_AWAY and \ + dt_util.utcnow() - self._state_ts >= self._pending_time: + self.update_state(STATE_ALARM_ARMED_AWAY, None) + track_point_in_time( + self._hass, delayed_alarm_arm_away, + dt_util.utcnow() + self._pending_time) else: _LOGGER.warning("Wrong code entered while arming away!") def alarm_trigger(self, code=None): """ Send alarm trigger command. No code needed. """ - self.change_alarm_state( - STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED, - self._pending_time) - if self._state == STATE_ALARM_TRIGGERED: - self.change_alarm_state( - STATE_ALARM_TRIGGERED, STATE_ALARM_DISARMED, - self._trigger_time) + self.update_state(STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED) + + def delayed_alarm_trigger(event_time): + """ callback for delayed action """ + if self._pending_to == STATE_ALARM_TRIGGERED and \ + dt_util.utcnow() - self._state_ts >= self._pending_time: + self.update_state(STATE_ALARM_TRIGGERED, STATE_ALARM_DISARMED) + + def delayed_alarm_disarm(event_time): + """ callback for delayed action """ + if self._pending_to == STATE_ALARM_DISARMED and \ + dt_util.utcnow() - self._state_ts >= self._trigger_time: + self.update_state(STATE_ALARM_DISARMED, None) + track_point_in_time( + self._hass, delayed_alarm_disarm, + dt_util.utcnow() + self._trigger_time) + track_point_in_time( + self._hass, delayed_alarm_trigger, + dt_util.utcnow() + self._pending_time) diff --git a/homeassistant/components/alarm_control_panel/mqtt.py b/homeassistant/components/alarm_control_panel/mqtt.py index 27e78cb38fe..cd71e223481 100644 --- a/homeassistant/components/alarm_control_panel/mqtt.py +++ b/homeassistant/components/alarm_control_panel/mqtt.py @@ -100,6 +100,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): # pylint: disable=too-many-arguments, too-many-instance-attributes +# pylint: disable=abstract-method class MqttAlarm(alarm.AlarmControlPanel): """ represents a MQTT alarm status within home assistant. """ @@ -166,7 +167,3 @@ class MqttAlarm(alarm.AlarmControlPanel): self._payload_arm_away, self._qos) else: _LOGGER.warning("Wrong code entered while arming away!") - - def alarm_trigger(self, code=None): - """ Send alarm trigger command. No code needed. """ - return diff --git a/homeassistant/components/alarm_control_panel/verisure.py b/homeassistant/components/alarm_control_panel/verisure.py index f590d462e9b..b2c10e6114e 100644 --- a/homeassistant/components/alarm_control_panel/verisure.py +++ b/homeassistant/components/alarm_control_panel/verisure.py @@ -33,6 +33,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): add_devices(alarms) +# pylint: disable=abstract-method class VerisureAlarm(alarm.AlarmControlPanel): """ represents a Verisure alarm status within home assistant. """ @@ -91,7 +92,3 @@ class VerisureAlarm(alarm.AlarmControlPanel): code, verisure.MY_PAGES.ALARM_ARMED_AWAY) _LOGGER.warning('arming away') - - def alarm_trigger(self, code=None): - """ Send alarm trigger command. No code needed. """ - return