From c5574c2684f1956c0007f86c34fa74bb55ce7269 Mon Sep 17 00:00:00 2001
From: "Craig J. Ward" <ward.craig.j@gmail.com>
Date: Tue, 4 Apr 2017 05:21:53 -0500
Subject: [PATCH] total connect alarm support (#6887)

* total connect alarm support

* linting fixes

* linting fixes

* docstring

* docstring

* use sync and update coveragerc

* remove unused import

* changes as per notes

* Update HA code style
---
 .coveragerc                                   |  1 +
 .../alarm_control_panel/totalconnect.py       | 87 +++++++++++++++++++
 requirements_all.txt                          |  3 +
 3 files changed, 91 insertions(+)
 create mode 100644 homeassistant/components/alarm_control_panel/totalconnect.py

diff --git a/.coveragerc b/.coveragerc
index 939565ed43a..0c7f17f3098 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -152,6 +152,7 @@ omit =
     homeassistant/components/alarm_control_panel/concord232.py
     homeassistant/components/alarm_control_panel/nx584.py
     homeassistant/components/alarm_control_panel/simplisafe.py
+    homeassistant/components/alarm_control_panel/totalconnect.py
     homeassistant/components/apiai.py
     homeassistant/components/binary_sensor/arest.py
     homeassistant/components/binary_sensor/concord232.py
diff --git a/homeassistant/components/alarm_control_panel/totalconnect.py b/homeassistant/components/alarm_control_panel/totalconnect.py
new file mode 100644
index 00000000000..a69e260c053
--- /dev/null
+++ b/homeassistant/components/alarm_control_panel/totalconnect.py
@@ -0,0 +1,87 @@
+"""Interfaces with TotalConnect alarm control panels."""
+import logging
+
+import voluptuous as vol
+
+import homeassistant.components.alarm_control_panel as alarm
+from homeassistant.components.alarm_control_panel import PLATFORM_SCHEMA
+from homeassistant.const import (
+    CONF_PASSWORD, CONF_USERNAME, STATE_ALARM_ARMED_AWAY,
+    STATE_ALARM_ARMED_HOME, STATE_ALARM_DISARMED, STATE_UNKNOWN,
+    CONF_NAME)
+import homeassistant.helpers.config_validation as cv
+
+REQUIREMENTS = ['total_connect_client==0.7']
+
+_LOGGER = logging.getLogger(__name__)
+
+DEFAULT_NAME = 'Total Connect'
+
+PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
+    vol.Required(CONF_PASSWORD): cv.string,
+    vol.Required(CONF_USERNAME): cv.string,
+    vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
+})
+
+
+def setup_platform(hass, config, add_devices, discovery_info=None):
+    """Setup a TotalConnect control panel."""
+    name = config.get(CONF_NAME)
+    username = config.get(CONF_USERNAME)
+    password = config.get(CONF_PASSWORD)
+
+    total_connect = TotalConnect(name, username, password)
+    add_devices([total_connect], True)
+
+
+class TotalConnect(alarm.AlarmControlPanel):
+    """Represent an TotalConnect status."""
+
+    def __init__(self, name, username, password):
+        """Initialize the TotalConnect status."""
+        from total_connect_client import TotalConnectClient
+
+        _LOGGER.debug('Setting up TotalConnect...')
+        self._name = name
+        self._username = username
+        self._password = password
+        self._state = STATE_UNKNOWN
+        self._client = TotalConnectClient.TotalConnectClient(username,
+                                                             password)
+
+    @property
+    def name(self):
+        """Return the name of the device."""
+        return self._name
+
+    @property
+    def state(self):
+        """Return the state of the device."""
+        return self._state
+
+    def update(self):
+        """Return the state of the device."""
+        status = self._client.get_armed_status()
+
+        if status == self._client.DISARMED:
+            state = STATE_ALARM_DISARMED
+        elif status == self._client.ARMED_STAY:
+            state = STATE_ALARM_ARMED_HOME
+        elif status == self._client.ARMED_AWAY:
+            state = STATE_ALARM_ARMED_AWAY
+        else:
+            state = STATE_UNKNOWN
+
+        self._state = state
+
+    def alarm_disarm(self, code=None):
+        """Send disarm command."""
+        self._client.disarm()
+
+    def alarm_arm_home(self, code=None):
+        """Send arm home command."""
+        self._client.arm_stay()
+
+    def alarm_arm_away(self, code=None):
+        """Send arm away command."""
+        self._client.arm_away()
diff --git a/requirements_all.txt b/requirements_all.txt
index 18ea883cc0a..8cb9cf2fa3b 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -742,6 +742,9 @@ thingspeak==0.4.1
 # homeassistant.components.light.tikteck
 tikteck==0.4
 
+# homeassistant.components.alarm_control_panel.totalconnect
+total_connect_client==0.7
+
 # homeassistant.components.sensor.transmission
 # homeassistant.components.switch.transmission
 transmissionrpc==0.11
-- 
GitLab