Move totalconnect from platform to component config (#24427)

* Move totalconnect component toward being a multi-platform integration.  Bump total_connect_client to 0.28.

* add missing total-connect alarm state mappings

* Made recommended changes of MartinHjelmare at
https://github.com/home-assistant/home-assistant/pull/24427

* Update __init__.py

* Updates per MartinHjelmare comments

* flake8/pydocstyle fixes

* removed . at end of log message

* added blank line between logging and voluptuous

* more fixes
This commit is contained in:
Austin Mroczek 2019-07-14 00:24:40 -07:00 committed by Martin Hjelmare
parent b77d060304
commit 369e6a3905
5 changed files with 104 additions and 42 deletions

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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": []

View file

@ -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