From a74cdc7b0da9d56ad85bb3f45d104fd3a832e2f8 Mon Sep 17 00:00:00 2001 From: William Scanlon Date: Sat, 2 Jul 2016 14:21:15 -0400 Subject: [PATCH] SimpliSafe Alarm (#2409) --- .coveragerc | 1 + .../alarm_control_panel/simplisafe.py | 111 ++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 115 insertions(+) create mode 100644 homeassistant/components/alarm_control_panel/simplisafe.py diff --git a/.coveragerc b/.coveragerc index 51d6d81179f..7873da5a31a 100644 --- a/.coveragerc +++ b/.coveragerc @@ -89,6 +89,7 @@ omit = homeassistant/components/alarm_control_panel/alarmdotcom.py homeassistant/components/alarm_control_panel/nx584.py + homeassistant/components/alarm_control_panel/simplisafe.py homeassistant/components/binary_sensor/arest.py homeassistant/components/binary_sensor/rest.py homeassistant/components/browser.py diff --git a/homeassistant/components/alarm_control_panel/simplisafe.py b/homeassistant/components/alarm_control_panel/simplisafe.py new file mode 100644 index 00000000000..561c8c3468d --- /dev/null +++ b/homeassistant/components/alarm_control_panel/simplisafe.py @@ -0,0 +1,111 @@ +""" +Interfaces with SimpliSafe alarm control panel. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/simplisafe/ +""" +import logging + +import homeassistant.components.alarm_control_panel as alarm + +from homeassistant.const import ( + CONF_PASSWORD, CONF_USERNAME, STATE_UNKNOWN, + STATE_ALARM_DISARMED, STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_AWAY) + +_LOGGER = logging.getLogger(__name__) +REQUIREMENTS = ['https://github.com/w1ll1am23/simplisafe-python/archive/' + '586fede0e85fd69e56e516aaa8e97eb644ca8866.zip#' + 'simplisafe-python==0.0.1'] + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up the SimpliSafe platform.""" + username = config.get(CONF_USERNAME) + password = config.get(CONF_PASSWORD) + + if username is None or password is None: + _LOGGER.error('Must specify username and password!') + return False + + add_devices([SimpliSafeAlarm( + config.get('name', "SimpliSafe"), + username, + password, + config.get('code'))]) + + +# pylint: disable=abstract-method +class SimpliSafeAlarm(alarm.AlarmControlPanel): + """Represents a SimpliSafe alarm status.""" + + def __init__(self, name, username, password, code): + """Initialize the SimpliSafe alaram.""" + from simplisafe import SimpliSafe + self.simplisafe = SimpliSafe(username, password) + self._name = name + self._code = str(code) if code else None + self._id = self.simplisafe.get_id() + status = self.simplisafe.get_state() + if status == 'Off': + self._state = STATE_ALARM_DISARMED + elif status == 'Home': + self._state = STATE_ALARM_ARMED_HOME + elif status == 'Away': + self._state = STATE_ALARM_ARMED_AWAY + else: + self._state = STATE_UNKNOWN + + @property + def should_poll(self): + """Poll the SimpliSafe API.""" + return True + + @property + def name(self): + """Return the name of the device.""" + if self._name is not None: + return self._name + else: + return 'Alarm {}'.format(self._id) + + @property + def code_format(self): + """One or more characters if code is defined.""" + return None if self._code is None else '.+' + + @property + def state(self): + """Return the state of the device.""" + return self._state + + def update(self): + """Update alarm status.""" + self.simplisafe.get_location() + status = self.simplisafe.get_state() + + if status == 'Off': + self._state = STATE_ALARM_DISARMED + elif status == 'Home': + self._state = STATE_ALARM_ARMED_HOME + elif status == 'Away': + self._state = STATE_ALARM_ARMED_AWAY + else: + self._state = STATE_UNKNOWN + + def alarm_disarm(self, code=None): + """Send disarm command.""" + self.simplisafe.set_state('off') + _LOGGER.info('SimpliSafe alarm disarming') + self.update() + + def alarm_arm_home(self, code=None): + """Send arm home command.""" + self.simplisafe.set_state('home') + _LOGGER.info('SimpliSafe alarm arming home') + self.update() + + def alarm_arm_away(self, code=None): + """Send arm away command.""" + self.simplisafe.set_state('away') + _LOGGER.info('SimpliSafe alarm arming away') + self.update() diff --git a/requirements_all.txt b/requirements_all.txt index f5b51f1ae4d..d591ab7c91d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -158,6 +158,9 @@ https://github.com/theolind/pymysensors/archive/cc5d0b325e13c2b623fa934f69eea7cd # homeassistant.components.notify.googlevoice https://github.com/w1ll1am23/pygooglevoice-sms/archive/7c5ee9969b97a7992fc86a753fe9f20e3ffa3f7c.zip#pygooglevoice-sms==0.0.1 +# homeassistant.components.alarm_control_panel.simplisafe +https://github.com/w1ll1am23/simplisafe-python/archive/586fede0e85fd69e56e516aaa8e97eb644ca8866.zip#simplisafe-python==0.0.1 + # homeassistant.components.media_player.lg_netcast https://github.com/wokar/pylgnetcast/archive/v0.2.0.zip#pylgnetcast==0.2.0