From ecf3a9cb3677df3b84aefc3005f770e9b39fdf52 Mon Sep 17 00:00:00 2001 From: Open Home Automation Date: Fri, 7 Jul 2017 07:24:25 +0200 Subject: [PATCH] Implement KNX dimming functionality (#8371) * Implement KNX dimming functionality * Formatting * Formatting * Formatting --- homeassistant/components/light/knx.py | 77 ++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/light/knx.py b/homeassistant/components/light/knx.py index 6d5cd12c23e..d89d45e99a7 100644 --- a/homeassistant/components/light/knx.py +++ b/homeassistant/components/light/knx.py @@ -4,15 +4,22 @@ Support KNX Lighting actuators. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/Light.knx/ """ +import logging import voluptuous as vol -from homeassistant.components.knx import (KNXConfig, KNXGroupAddress) -from homeassistant.components.light import (Light, PLATFORM_SCHEMA) +from homeassistant.components.knx import (KNXConfig, KNXMultiAddressDevice) +from homeassistant.components.light import (Light, PLATFORM_SCHEMA, + SUPPORT_BRIGHTNESS, + ATTR_BRIGHTNESS) from homeassistant.const import CONF_NAME import homeassistant.helpers.config_validation as cv CONF_ADDRESS = 'address' CONF_STATE_ADDRESS = 'state_address' +CONF_BRIGHTNESS_ADDRESS = 'brightness_address' +CONF_BRIGHTNESS_STATE_ADDRESS = 'brightness_state_address' + +_LOGGER = logging.getLogger(__name__) DEFAULT_NAME = 'KNX Light' DEPENDENCIES = ['knx'] @@ -21,6 +28,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_ADDRESS): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_STATE_ADDRESS): cv.string, + vol.Optional(CONF_BRIGHTNESS_ADDRESS): cv.string, + vol.Optional(CONF_BRIGHTNESS_STATE_ADDRESS): cv.string, }) @@ -29,16 +38,41 @@ def setup_platform(hass, config, add_devices, discovery_info=None): add_devices([KNXLight(hass, KNXConfig(config))]) -class KNXLight(KNXGroupAddress, Light): +class KNXLight(KNXMultiAddressDevice, Light): """Representation of a KNX Light device.""" + def __init__(self, hass, config): + """Initialize the cover.""" + KNXMultiAddressDevice.__init__( + self, hass, config, + [], # required + optional=['state', 'brightness', 'brightness_state'] + ) + self._hass = hass + self._supported_features = 0 + + if CONF_BRIGHTNESS_ADDRESS in config.config: + _LOGGER.debug("%s is dimmable", self.name) + self._supported_features = self._supported_features | \ + SUPPORT_BRIGHTNESS + self._brightness = None + def turn_on(self, **kwargs): """Turn the switch on. This sends a value 1 to the group address of the device """ - self.group_write(1) - self._state = [1] + _LOGGER.debug("%s: turn on", self.name) + self.set_value('base', [1]) + self._state = 1 + + if ATTR_BRIGHTNESS in kwargs: + self._brightness = kwargs[ATTR_BRIGHTNESS] + _LOGGER.debug("turn_on requested brightness for light: %s is: %s ", + self.name, self._brightness) + assert self._brightness <= 255 + self.set_value("brightness", [self._brightness]) + if not self.should_poll: self.schedule_update_ha_state() @@ -47,7 +81,36 @@ class KNXLight(KNXGroupAddress, Light): This sends a value 1 to the group address of the device """ - self.group_write(0) - self._state = [0] + _LOGGER.debug("%s: turn off", self.name) + self.set_value('base', [0]) + self._state = 0 if not self.should_poll: self.schedule_update_ha_state() + + @property + def is_on(self): + """Return True if the value is not 0 is on, else False.""" + return self._state != 0 + + @property + def supported_features(self): + """Flag supported features.""" + return self._supported_features + + def update(self): + """Update device state.""" + super().update() + if self.has_attribute('brightness_state'): + value = self.value('brightness_state') + if value is not None: + self._brightness = int.from_bytes(value, byteorder='little') + _LOGGER.debug("%s: brightness = %d", + self.name, self._brightness) + + if self.has_attribute('state'): + self._state = self.value("state")[0] + _LOGGER.debug("%s: state = %d", self.name, self._state) + + def should_poll(self): + """No polling needed for a KNX light.""" + return False