From 3e43f4e58e36db6b460b48382efd174279650e88 Mon Sep 17 00:00:00 2001 From: Nicko van Someren Date: Sat, 13 Jan 2018 11:11:20 -0700 Subject: [PATCH] Adding support for Lutron covers (#11602) * Adding support for Lutron Radio RA2 shades as cover components. * Adding initial version of the Lutron shades component. * Fixed line-length violation detected by Hound. --- homeassistant/components/cover/lutron.py | 76 ++++++++++++++++++++++++ homeassistant/components/lutron.py | 9 ++- 2 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 homeassistant/components/cover/lutron.py diff --git a/homeassistant/components/cover/lutron.py b/homeassistant/components/cover/lutron.py new file mode 100644 index 00000000000..08a2ef8c5ad --- /dev/null +++ b/homeassistant/components/cover/lutron.py @@ -0,0 +1,76 @@ +""" +Support for Lutron shades. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/cover.lutron/ +""" +import logging + +from homeassistant.components.cover import ( + CoverDevice, SUPPORT_OPEN, SUPPORT_CLOSE, SUPPORT_SET_POSITION, + ATTR_POSITION) +from homeassistant.components.lutron import ( + LutronDevice, LUTRON_DEVICES, LUTRON_CONTROLLER) + +_LOGGER = logging.getLogger(__name__) + +DEPENDENCIES = ['lutron'] + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up the Lutron shades.""" + devs = [] + for (area_name, device) in hass.data[LUTRON_DEVICES]['cover']: + dev = LutronCover(area_name, device, hass.data[LUTRON_CONTROLLER]) + devs.append(dev) + + add_devices(devs, True) + return True + + +class LutronCover(LutronDevice, CoverDevice): + """Representation of a Lutron shade.""" + + @property + def supported_features(self): + """Flag supported features.""" + return SUPPORT_OPEN | SUPPORT_CLOSE | SUPPORT_SET_POSITION + + @property + def is_closed(self): + """Return if the cover is closed.""" + return self._lutron_device.last_level() < 1 + + @property + def current_cover_position(self): + """Return the current position of cover.""" + return self._lutron_device.last_level() + + def close_cover(self, **kwargs): + """Close the cover.""" + self._lutron_device.level = 0 + + def open_cover(self, **kwargs): + """Open the cover.""" + self._lutron_device.level = 100 + + def set_cover_position(self, **kwargs): + """Move the shade to a specific position.""" + if ATTR_POSITION in kwargs: + position = kwargs[ATTR_POSITION] + self._lutron_device.level = position + + def update(self): + """Call when forcing a refresh of the device.""" + # Reading the property (rather than last_level()) fetchs value + level = self._lutron_device.level + _LOGGER.debug("Lutron ID: %d updated to %f", + self._lutron_device.id, level) + + @property + def device_state_attributes(self): + """Return the state attributes.""" + attr = {} + attr['Lutron Integration ID'] = self._lutron_device.id + return attr diff --git a/homeassistant/components/lutron.py b/homeassistant/components/lutron.py index 819844325d1..bef821220b3 100644 --- a/homeassistant/components/lutron.py +++ b/homeassistant/components/lutron.py @@ -37,7 +37,7 @@ def setup(hass, base_config): from pylutron import Lutron hass.data[LUTRON_CONTROLLER] = None - hass.data[LUTRON_DEVICES] = {'light': []} + hass.data[LUTRON_DEVICES] = {'light': [], 'cover': []} config = base_config.get(DOMAIN) hass.data[LUTRON_CONTROLLER] = Lutron( @@ -50,9 +50,12 @@ def setup(hass, base_config): # Sort our devices into types for area in hass.data[LUTRON_CONTROLLER].areas: for output in area.outputs: - hass.data[LUTRON_DEVICES]['light'].append((area.name, output)) + if output.type == 'SYSTEM_SHADE': + hass.data[LUTRON_DEVICES]['cover'].append((area.name, output)) + else: + hass.data[LUTRON_DEVICES]['light'].append((area.name, output)) - for component in ('light',): + for component in ('light', 'cover'): discovery.load_platform(hass, component, DOMAIN, None, base_config) return True