diff --git a/.coveragerc b/.coveragerc index 61a5eb7647e..940235c9028 100644 --- a/.coveragerc +++ b/.coveragerc @@ -633,7 +633,7 @@ omit = homeassistant/components/tomato/device_tracker.py homeassistant/components/toon/* homeassistant/components/torque/sensor.py - homeassistant/components/totalconnect/alarm_control_panel.py + homeassistant/components/totalconnect/* homeassistant/components/touchline/climate.py homeassistant/components/tplink/device_tracker.py homeassistant/components/tplink/light.py diff --git a/homeassistant/components/totalconnect/__init__.py b/homeassistant/components/totalconnect/__init__.py index 084846a8b85..f8926a79f4b 100644 --- a/homeassistant/components/totalconnect/__init__.py +++ b/homeassistant/components/totalconnect/__init__.py @@ -1 +1,54 @@ """The totalconnect component.""" +import logging + +import voluptuous as vol +from total_connect_client import TotalConnectClient + +import homeassistant.helpers.config_validation as cv +from homeassistant.helpers import discovery +from homeassistant.const import (CONF_PASSWORD, CONF_USERNAME) + + +_LOGGER = logging.getLogger(__name__) + +DOMAIN = 'totalconnect' + +CONFIG_SCHEMA = vol.Schema({ + DOMAIN: vol.Schema({ + vol.Required(CONF_USERNAME): cv.string, + vol.Required(CONF_PASSWORD): cv.string, + }), +}, extra=vol.ALLOW_EXTRA) + +TOTALCONNECT_PLATFORMS = ['alarm_control_panel'] + + +def setup(hass, config): + """Set up TotalConnect component.""" + conf = config[DOMAIN] + + username = conf[CONF_USERNAME] + password = conf[CONF_PASSWORD] + + client = TotalConnectClient.TotalConnectClient(username, password) + + if client.token is False: + _LOGGER.error("TotalConnect authentication failed") + return False + + hass.data[DOMAIN] = TotalConnectSystem(username, password, client) + + for platform in TOTALCONNECT_PLATFORMS: + discovery.load_platform(hass, platform, DOMAIN, {}, config) + + return True + + +class TotalConnectSystem: + """TotalConnect System class.""" + + def __init__(self, username, password, client): + """Initialize the TotalConnect system.""" + self._username = username + self._password = password + self.client = client diff --git a/homeassistant/components/totalconnect/alarm_control_panel.py b/homeassistant/components/totalconnect/alarm_control_panel.py index 6d4c7a9671a..981711d148b 100644 --- a/homeassistant/components/totalconnect/alarm_control_panel.py +++ b/homeassistant/components/totalconnect/alarm_control_panel.py @@ -1,53 +1,43 @@ """Interfaces with TotalConnect alarm control panels.""" import logging -import voluptuous as vol - -import homeassistant.helpers.config_validation as cv 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_ARMED_NIGHT, STATE_ALARM_DISARMED, - STATE_ALARM_ARMING, STATE_ALARM_DISARMING, STATE_ALARM_TRIGGERED, - CONF_NAME, STATE_ALARM_ARMED_CUSTOM_BYPASS) + STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_NIGHT, + STATE_ALARM_DISARMED, STATE_ALARM_ARMING, STATE_ALARM_DISARMING, + STATE_ALARM_TRIGGERED, STATE_ALARM_ARMED_CUSTOM_BYPASS) + +from . import DOMAIN as TOTALCONNECT_DOMAIN _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_entities, discovery_info=None): - """Set up a TotalConnect control panel.""" - name = config.get(CONF_NAME) - username = config.get(CONF_USERNAME) - password = config.get(CONF_PASSWORD) + """Set up an alarm control panel for a TotalConnect device.""" + if discovery_info is None: + return - total_connect = TotalConnect(name, username, password) - add_entities([total_connect], True) + alarms = [] + + client = hass.data[TOTALCONNECT_DOMAIN].client + + for location in client.locations: + location_id = location.get('LocationID') + name = location.get('LocationName') + alarms.append(TotalConnectAlarm(name, location_id, client)) + add_entities(alarms) -class TotalConnect(alarm.AlarmControlPanel): +class TotalConnectAlarm(alarm.AlarmControlPanel): """Represent an TotalConnect status.""" - def __init__(self, name, username, password): + def __init__(self, name, location_id, client): """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._location_id = location_id + self._client = client self._state = None self._device_state_attributes = {} - self._client = TotalConnectClient.TotalConnectClient( - username, password) @property def name(self): @@ -66,17 +56,36 @@ class TotalConnect(alarm.AlarmControlPanel): def update(self): """Return the state of the device.""" - status = self._client.get_armed_status() - attr = {'triggered_source': None, 'triggered_zone': None} + status = self._client.get_armed_status(self._name) + attr = { + 'location_name': self._name, + 'location_id': self._location_id, + 'ac_loss': self._client.ac_loss, + 'low_battery': self._client.low_battery, + 'triggered_source': None, + 'triggered_zone': None + } if status == self._client.DISARMED: state = STATE_ALARM_DISARMED + elif status == self._client.DISARMED_BYPASS: + 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 + elif status == self._client.ARMED_STAY_INSTANT: + state = STATE_ALARM_ARMED_HOME + elif status == self._client.ARMED_STAY_INSTANT_BYPASS: + state = STATE_ALARM_ARMED_HOME elif status == self._client.ARMED_STAY_NIGHT: state = STATE_ALARM_ARMED_NIGHT + elif status == self._client.ARMED_AWAY: + state = STATE_ALARM_ARMED_AWAY + elif status == self._client.ARMED_AWAY_BYPASS: + state = STATE_ALARM_ARMED_AWAY + elif status == self._client.ARMED_AWAY_INSTANT: + state = STATE_ALARM_ARMED_AWAY + elif status == self._client.ARMED_AWAY_INSTANT_BYPASS: + state = STATE_ALARM_ARMED_AWAY elif status == self._client.ARMED_CUSTOM_BYPASS: state = STATE_ALARM_ARMED_CUSTOM_BYPASS elif status == self._client.ARMING: @@ -102,16 +111,16 @@ class TotalConnect(alarm.AlarmControlPanel): def alarm_disarm(self, code=None): """Send disarm command.""" - self._client.disarm() + self._client.disarm(self._name) def alarm_arm_home(self, code=None): """Send arm home command.""" - self._client.arm_stay() + self._client.arm_stay(self._name) def alarm_arm_away(self, code=None): """Send arm away command.""" - self._client.arm_away() + self._client.arm_away(self._name) def alarm_arm_night(self, code=None): """Send arm night command.""" - self._client.arm_stay_night() + self._client.arm_stay_night(self._name) diff --git a/homeassistant/components/totalconnect/manifest.json b/homeassistant/components/totalconnect/manifest.json index 3ff3b5c5b46..e6bcd6dd00a 100644 --- a/homeassistant/components/totalconnect/manifest.json +++ b/homeassistant/components/totalconnect/manifest.json @@ -3,7 +3,7 @@ "name": "Totalconnect", "documentation": "https://www.home-assistant.io/components/totalconnect", "requirements": [ - "total_connect_client==0.27" + "total_connect_client==0.28" ], "dependencies": [], "codeowners": [] diff --git a/requirements_all.txt b/requirements_all.txt index 78b86b0819b..f990576a61a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1816,7 +1816,7 @@ todoist-python==7.0.17 toonapilib==3.2.4 # homeassistant.components.totalconnect -total_connect_client==0.27 +total_connect_client==0.28 # homeassistant.components.tplink_lte tp-connected==0.0.4