From ec732c896d6f62c736a6440ad50e1966ace4e0c1 Mon Sep 17 00:00:00 2001 From: majuss Date: Wed, 7 Nov 2018 11:51:12 +0000 Subject: [PATCH] Add support for Lupusec alarm control panel (#17691) * Adds support for Lupusec alarm control panel * fixed various mostly cosmetic issues * fixed generic type of binary sensors * fixed some formatting; removed scan interval completely -> defaults now to 2 secs * removed unused data caches; added check if binary sensor class exists * cosmetics * generic type fix * small fix * small fixes * guard clause added * small fixes --- .coveragerc | 3 + .../components/alarm_control_panel/lupusec.py | 67 +++++++++++++ .../components/binary_sensor/lupusec.py | 53 +++++++++++ homeassistant/components/lupusec.py | 94 +++++++++++++++++++ homeassistant/components/switch/lupusec.py | 53 +++++++++++ requirements_all.txt | 3 + 6 files changed, 273 insertions(+) create mode 100644 homeassistant/components/alarm_control_panel/lupusec.py create mode 100644 homeassistant/components/binary_sensor/lupusec.py create mode 100644 homeassistant/components/lupusec.py create mode 100644 homeassistant/components/switch/lupusec.py diff --git a/.coveragerc b/.coveragerc index 1538435f564..eee5bcf8c49 100644 --- a/.coveragerc +++ b/.coveragerc @@ -203,6 +203,9 @@ omit = homeassistant/components/logi_circle.py homeassistant/components/*/logi_circle.py + homeassistant/components/lupusec.py + homeassistant/components/*/lupusec.py + homeassistant/components/lutron.py homeassistant/components/*/lutron.py diff --git a/homeassistant/components/alarm_control_panel/lupusec.py b/homeassistant/components/alarm_control_panel/lupusec.py new file mode 100644 index 00000000000..44d8a068ce2 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/lupusec.py @@ -0,0 +1,67 @@ +""" +This component provides HA alarm_control_panel support for Lupusec System. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/alarm_control_panel.lupusec/ +""" + +from datetime import timedelta + +from homeassistant.components.alarm_control_panel import AlarmControlPanel +from homeassistant.components.lupusec import DOMAIN as LUPUSEC_DOMAIN +from homeassistant.components.lupusec import LupusecDevice +from homeassistant.const import (STATE_ALARM_ARMED_AWAY, + STATE_ALARM_ARMED_HOME, + STATE_ALARM_DISARMED) + +DEPENDENCIES = ['lupusec'] + +ICON = 'mdi:security' + +SCAN_INTERVAL = timedelta(seconds=2) + + +def setup_platform(hass, config, add_entities, discovery_info=None): + """Set up an alarm control panel for a Lupusec device.""" + if discovery_info is None: + return + + data = hass.data[LUPUSEC_DOMAIN] + + alarm_devices = [LupusecAlarm(data, data.lupusec.get_alarm())] + + add_entities(alarm_devices) + + +class LupusecAlarm(LupusecDevice, AlarmControlPanel): + """An alarm_control_panel implementation for Lupusec.""" + + @property + def icon(self): + """Return the icon.""" + return ICON + + @property + def state(self): + """Return the state of the device.""" + if self._device.is_standby: + state = STATE_ALARM_DISARMED + elif self._device.is_away: + state = STATE_ALARM_ARMED_AWAY + elif self._device.is_home: + state = STATE_ALARM_ARMED_HOME + else: + state = None + return state + + def alarm_arm_away(self, code=None): + """Send arm away command.""" + self._device.set_away() + + def alarm_disarm(self, code=None): + """Send disarm command.""" + self._device.set_standby() + + def alarm_arm_home(self, code=None): + """Send arm home command.""" + self._device.set_home() diff --git a/homeassistant/components/binary_sensor/lupusec.py b/homeassistant/components/binary_sensor/lupusec.py new file mode 100644 index 00000000000..df8210df026 --- /dev/null +++ b/homeassistant/components/binary_sensor/lupusec.py @@ -0,0 +1,53 @@ +""" +This component provides HA binary_sensor support for Lupusec Security System. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/binary_sensor.lupusec/ +""" +import logging +from datetime import timedelta + +from homeassistant.components.lupusec import (LupusecDevice, + DOMAIN as LUPUSEC_DOMAIN) +from homeassistant.components.binary_sensor import (BinarySensorDevice, + DEVICE_CLASSES) + +DEPENDENCIES = ['lupusec'] + +SCAN_INTERVAL = timedelta(seconds=2) + +_LOGGER = logging.getLogger(__name__) + + +def setup_platform(hass, config, add_entities, discovery_info=None): + """Set up a sensor for an Lupusec device.""" + if discovery_info is None: + return + + import lupupy.constants as CONST + + data = hass.data[LUPUSEC_DOMAIN] + + device_types = [CONST.TYPE_OPENING] + + devices = [] + for device in data.lupusec.get_devices(generic_type=device_types): + devices.append(LupusecBinarySensor(data, device)) + + add_entities(devices) + + +class LupusecBinarySensor(LupusecDevice, BinarySensorDevice): + """A binary sensor implementation for Lupusec device.""" + + @property + def is_on(self): + """Return True if the binary sensor is on.""" + return self._device.is_on + + @property + def device_class(self): + """Return the class of the binary sensor.""" + if self._device.generic_type not in DEVICE_CLASSES: + return None + return self._device.generic_type diff --git a/homeassistant/components/lupusec.py b/homeassistant/components/lupusec.py new file mode 100644 index 00000000000..162b49ef9b2 --- /dev/null +++ b/homeassistant/components/lupusec.py @@ -0,0 +1,94 @@ +""" +This component provides basic support for Lupusec Home Security system. + +For more details about this component, please refer to the documentation at +https://home-assistant.io/components/lupusec +""" + +import logging + +import voluptuous as vol + +from homeassistant.helpers import config_validation as cv +from homeassistant.helpers import discovery +from homeassistant.const import (CONF_USERNAME, CONF_PASSWORD, + CONF_NAME, CONF_IP_ADDRESS) +from homeassistant.helpers.entity import Entity +_LOGGER = logging.getLogger(__name__) + +REQUIREMENTS = ['lupupy==0.0.10'] + +DOMAIN = 'lupusec' + +NOTIFICATION_ID = 'lupusec_notification' +NOTIFICATION_TITLE = 'Lupusec Security Setup' + +CONFIG_SCHEMA = vol.Schema({ + DOMAIN: vol.Schema({ + vol.Required(CONF_USERNAME): cv.string, + vol.Required(CONF_PASSWORD): cv.string, + vol.Required(CONF_IP_ADDRESS): cv.string, + vol.Optional(CONF_NAME): cv.string + }), +}, extra=vol.ALLOW_EXTRA) + +LUPUSEC_PLATFORMS = [ + 'alarm_control_panel', 'binary_sensor', 'switch' +] + + +def setup(hass, config): + """Set up Lupusec component.""" + from lupupy.exceptions import LupusecException + + conf = config[DOMAIN] + username = conf[CONF_USERNAME] + password = conf[CONF_PASSWORD] + ip_address = conf[CONF_IP_ADDRESS] + name = conf.get(CONF_NAME) + + try: + hass.data[DOMAIN] = LupusecSystem(username, password, ip_address, name) + except LupusecException as ex: + _LOGGER.error(ex) + + hass.components.persistent_notification.create( + 'Error: {}
' + 'You will need to restart hass after fixing.' + ''.format(ex), + title=NOTIFICATION_TITLE, + notification_id=NOTIFICATION_ID) + return False + + for platform in LUPUSEC_PLATFORMS: + discovery.load_platform(hass, platform, DOMAIN, {}, config) + + return True + + +class LupusecSystem: + """Lupusec System class.""" + + def __init__(self, username, password, ip_address, name): + """Initialize the system.""" + import lupupy + self.lupusec = lupupy.Lupusec(username, password, ip_address) + self.name = name + + +class LupusecDevice(Entity): + """Representation of a Lupusec device.""" + + def __init__(self, data, device): + """Initialize a sensor for Lupusec device.""" + self._data = data + self._device = device + + def update(self): + """Update automation state.""" + self._device.refresh() + + @property + def name(self): + """Return the name of the sensor.""" + return self._device.name diff --git a/homeassistant/components/switch/lupusec.py b/homeassistant/components/switch/lupusec.py new file mode 100644 index 00000000000..35744160f24 --- /dev/null +++ b/homeassistant/components/switch/lupusec.py @@ -0,0 +1,53 @@ +""" +This component provides HA switch support for Lupusec Security System. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/switch.lupusec/ +""" +import logging +from datetime import timedelta + +from homeassistant.components.lupusec import (LupusecDevice, + DOMAIN as LUPUSEC_DOMAIN) +from homeassistant.components.switch import SwitchDevice + +DEPENDENCIES = ['lupusec'] + +SCAN_INTERVAL = timedelta(seconds=2) + +_LOGGER = logging.getLogger(__name__) + + +def setup_platform(hass, config, add_entities, discovery_info=None): + """Set up Lupusec switch devices.""" + if discovery_info is None: + return + + import lupupy.constants as CONST + + data = hass.data[LUPUSEC_DOMAIN] + + devices = [] + + for device in data.lupusec.get_devices(generic_type=CONST.TYPE_SWITCH): + + devices.append(LupusecSwitch(data, device)) + + add_entities(devices) + + +class LupusecSwitch(LupusecDevice, SwitchDevice): + """Representation of a Lupusec switch.""" + + def turn_on(self, **kwargs): + """Turn on the device.""" + self._device.switch_on() + + def turn_off(self, **kwargs): + """Turn off the device.""" + self._device.switch_off() + + @property + def is_on(self): + """Return true if device is on.""" + return self._device.is_on diff --git a/requirements_all.txt b/requirements_all.txt index 1854fc0de98..d391346710e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -596,6 +596,9 @@ logi_circle==0.1.7 # homeassistant.components.luftdaten luftdaten==0.3.4 +# homeassistant.components.lupusec +lupupy==0.0.10 + # homeassistant.components.light.lw12wifi lw12==0.9.2