Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions homeassistant/components/cover/lutron.py
Original file line number Diff line number Diff line change
@@ -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
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nothing is checking this return value.



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
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't seem to do anything.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It force the update on client library

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

_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
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

State attributes should be lowercase snakecase.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I named it this way for consistency with the light\lutron.py component. If snakecase is the policy then we should change it in both places but for the purpose of this new code I though it best not to make too many changes to what was already there in case it broke existing deployments.

return attr
9 changes: 6 additions & 3 deletions homeassistant/components/lutron.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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

Expand Down