From 3c8ebf184459b7d647d2c163c8ed613133d3d160 Mon Sep 17 00:00:00 2001 From: brefra Date: Tue, 31 Dec 2019 15:46:02 +0100 Subject: [PATCH] Add light support to Velbus integration (#30323) * Add light support to Velbus integration * Add Velbus light.py to .coveragerc * Applied black formatting --- .coveragerc | 1 + homeassistant/components/velbus/__init__.py | 2 +- homeassistant/components/velbus/light.py | 77 +++++++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 homeassistant/components/velbus/light.py diff --git a/.coveragerc b/.coveragerc index 10d56c4701d..e96895429a6 100644 --- a/.coveragerc +++ b/.coveragerc @@ -758,6 +758,7 @@ omit = homeassistant/components/velbus/climate.py homeassistant/components/velbus/const.py homeassistant/components/velbus/cover.py + homeassistant/components/velbus/light.py homeassistant/components/velbus/sensor.py homeassistant/components/velbus/switch.py homeassistant/components/velux/* diff --git a/homeassistant/components/velbus/__init__.py b/homeassistant/components/velbus/__init__.py index 317c305254b..de48f846540 100644 --- a/homeassistant/components/velbus/__init__.py +++ b/homeassistant/components/velbus/__init__.py @@ -22,7 +22,7 @@ CONFIG_SCHEMA = vol.Schema( {DOMAIN: vol.Schema({vol.Required(CONF_PORT): cv.string})}, extra=vol.ALLOW_EXTRA ) -COMPONENT_TYPES = ["switch", "sensor", "binary_sensor", "cover", "climate"] +COMPONENT_TYPES = ["switch", "sensor", "binary_sensor", "cover", "climate", "light"] async def async_setup(hass, config): diff --git a/homeassistant/components/velbus/light.py b/homeassistant/components/velbus/light.py new file mode 100644 index 00000000000..6b34182e559 --- /dev/null +++ b/homeassistant/components/velbus/light.py @@ -0,0 +1,77 @@ +"""Support for Velbus light.""" +import logging + +from velbus.util import VelbusException + +from homeassistant.components.light import ( + ATTR_BRIGHTNESS, + ATTR_TRANSITION, + SUPPORT_BRIGHTNESS, + SUPPORT_TRANSITION, + Light, +) + +from . import VelbusEntity +from .const import DOMAIN + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): + """Old way.""" + pass + + +async def async_setup_entry(hass, entry, async_add_entities): + """Set up Velbus light based on config_entry.""" + cntrl = hass.data[DOMAIN][entry.entry_id]["cntrl"] + modules_data = hass.data[DOMAIN][entry.entry_id]["light"] + entities = [] + for address, channel in modules_data: + module = cntrl.get_module(address) + entities.append(VelbusLight(module, channel)) + async_add_entities(entities) + + +class VelbusLight(VelbusEntity, Light): + """Representation of a Velbus light.""" + + @property + def supported_features(self): + """Flag supported features.""" + return SUPPORT_BRIGHTNESS | SUPPORT_TRANSITION + + @property + def is_on(self): + """Return true if the light is on.""" + return self._module.is_on(self._channel) + + @property + def brightness(self): + """Return the brightness of the light.""" + return self._module.get_dimmer_state(self._channel) + + def turn_on(self, **kwargs): + """Instruct the Velbus light to turn on.""" + try: + if ATTR_BRIGHTNESS in kwargs: + self._module.set_dimmer_state( + self._channel, + kwargs[ATTR_BRIGHTNESS], + kwargs.get(ATTR_TRANSITION, 0), + ) + else: + self._module.restore_dimmer_state( + self._channel, kwargs.get(ATTR_TRANSITION, 0), + ) + except VelbusException as err: + _LOGGER.error("A Velbus error occurred: %s", err) + + def turn_off(self, **kwargs): + """Instruct the velbus light to turn off.""" + try: + self._module.set_dimmer_state( + self._channel, 0, kwargs.get(ATTR_TRANSITION, 0), + ) + except VelbusException as err: + _LOGGER.error("A Velbus error occurred: %s", err)