From a86852fe908bb0a44ef267a75b9446ddcaf03f6e Mon Sep 17 00:00:00 2001 From: "Alfie \"Azelphur\" Day" Date: Tue, 19 May 2015 00:27:09 +0100 Subject: [PATCH 1/6] Add basic support for LimitlessLED --- .../components/light/limitlessled.py | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 homeassistant/components/light/limitlessled.py diff --git a/homeassistant/components/light/limitlessled.py b/homeassistant/components/light/limitlessled.py new file mode 100644 index 00000000000..53411d319d7 --- /dev/null +++ b/homeassistant/components/light/limitlessled.py @@ -0,0 +1,102 @@ +""" +homeassistant.components.light.limitlessled +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Support for LimitlessLED bulbs, also known as... + +EasyBulb +AppLight +AppLamp +MiLight +LEDme +dekolight +iLight + +""" +import random +import logging + +from homeassistant.helpers.entity import ToggleEntity +from homeassistant.const import STATE_ON, STATE_OFF, DEVICE_DEFAULT_NAME +from homeassistant.components.light import ATTR_BRIGHTNESS + +_LOGGER = logging.getLogger(__name__) + + +def setup_platform(hass, config, add_devices_callback, discovery_info=None): + try: + import ledcontroller + except ImportError: + _LOGGER.exception("Error while importing dependency ledcontroller.") + return + + led = ledcontroller.LedController(config['host']) + + lights = [] + for i in range(1, 5): + if 'group_%d_name' % (i) in config: + lights.append( + LimitlessLED( + led, + i, + config['group_%d_name' % (i)], + STATE_OFF + ) + ) + + add_devices_callback(lights) + + +class LimitlessLED(ToggleEntity): + def __init__(self, led, group, name, state, brightness=180): + self.led = led + self.group = group + + # LimitlessLEDs don't report state, we have track it ourselves. + self.led.off(self.group) + + self._name = name or DEVICE_DEFAULT_NAME + self._state = state + self._brightness = brightness + + @property + def should_poll(self): + """ No polling needed for a demo light. """ + return False + + @property + def name(self): + """ Returns the name of the device if any. """ + return self._name + + @property + def state(self): + """ Returns the name of the device if any. """ + return self._state + + @property + def state_attributes(self): + """ Returns optional state attributes. """ + if self.is_on: + return { + ATTR_BRIGHTNESS: self._brightness, + } + + @property + def is_on(self): + """ True if device is on. """ + return self._state == STATE_ON + + def turn_on(self, **kwargs): + """ Turn the device on. """ + self._state = STATE_ON + + if ATTR_BRIGHTNESS in kwargs: + self._brightness = kwargs[ATTR_BRIGHTNESS] + + self.led.set_brightness(self._brightness, self.group) + + def turn_off(self, **kwargs): + """ Turn the device off. """ + self._state = STATE_OFF + self.led.off(self.group) From 9c7f1d94c0edef95d3d08293e321c243585e4a11 Mon Sep 17 00:00:00 2001 From: "Alfie \"Azelphur\" Day" Date: Tue, 19 May 2015 01:55:37 +0100 Subject: [PATCH 2/6] Add configuration.yaml example in the header --- homeassistant/components/light/limitlessled.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/homeassistant/components/light/limitlessled.py b/homeassistant/components/light/limitlessled.py index 53411d319d7..3525d0a20c8 100644 --- a/homeassistant/components/light/limitlessled.py +++ b/homeassistant/components/light/limitlessled.py @@ -12,6 +12,14 @@ LEDme dekolight iLight +light: + platform: limitlessled + host: 192.168.1.10 + group_1_name: Living Room + group_2_name: Bedroom + group_3_name: Office + group_4_name: Kitchen + """ import random import logging From c43e0143046eeeced2e3260146b325bdcf206799 Mon Sep 17 00:00:00 2001 From: "Alfie \"Azelphur\" Day" Date: Tue, 19 May 2015 01:58:16 +0100 Subject: [PATCH 3/6] Add ledcontroller to requirements.txt --- requirements.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/requirements.txt b/requirements.txt index 8bc2c4616ee..63e3f3d5022 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,6 +14,9 @@ pyephem>=3.7 # lights.hue phue>=0.8 +# lights.limitlessled +ledcontroller>=1.0.7 + # media_player.cast pychromecast>=0.5 From e2b08a175856b82967c06d268416db1839c40532 Mon Sep 17 00:00:00 2001 From: "Alfie \"Azelphur\" Day" Date: Tue, 19 May 2015 02:09:34 +0100 Subject: [PATCH 4/6] Fix some code styling violations --- homeassistant/components/light/limitlessled.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/light/limitlessled.py b/homeassistant/components/light/limitlessled.py index 3525d0a20c8..ba9ac9b3a05 100644 --- a/homeassistant/components/light/limitlessled.py +++ b/homeassistant/components/light/limitlessled.py @@ -21,7 +21,6 @@ light: group_4_name: Kitchen """ -import random import logging from homeassistant.helpers.entity import ToggleEntity @@ -32,6 +31,7 @@ _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_devices_callback, discovery_info=None): + """ Gets the LimitlessLED lights. """ try: import ledcontroller except ImportError: @@ -56,6 +56,8 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): class LimitlessLED(ToggleEntity): + """ Represents a LimitlessLED light """ + def __init__(self, led, group, name, state, brightness=180): self.led = led self.group = group From cb54fb5a6411d12f96bed22b505224d0138210fa Mon Sep 17 00:00:00 2001 From: "Alfie \"Azelphur\" Day" Date: Tue, 19 May 2015 02:31:30 +0100 Subject: [PATCH 5/6] More pylint fixes --- homeassistant/components/light/limitlessled.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/light/limitlessled.py b/homeassistant/components/light/limitlessled.py index ba9ac9b3a05..36492d4d10f 100644 --- a/homeassistant/components/light/limitlessled.py +++ b/homeassistant/components/light/limitlessled.py @@ -47,8 +47,7 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): LimitlessLED( led, i, - config['group_%d_name' % (i)], - STATE_OFF + config['group_%d_name' % (i)] ) ) @@ -58,7 +57,7 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): class LimitlessLED(ToggleEntity): """ Represents a LimitlessLED light """ - def __init__(self, led, group, name, state, brightness=180): + def __init__(self, led, group, name): self.led = led self.group = group @@ -66,7 +65,7 @@ class LimitlessLED(ToggleEntity): self.led.off(self.group) self._name = name or DEVICE_DEFAULT_NAME - self._state = state + self._state = STATE_OFF self._brightness = brightness @property From 7087c20c4f2b1296d3a380de23e40b219a924b57 Mon Sep 17 00:00:00 2001 From: "Alfie \"Azelphur\" Day" Date: Tue, 19 May 2015 02:33:37 +0100 Subject: [PATCH 6/6] And fix the part where I'm being stupid --- homeassistant/components/light/limitlessled.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/light/limitlessled.py b/homeassistant/components/light/limitlessled.py index 36492d4d10f..deb98e2428e 100644 --- a/homeassistant/components/light/limitlessled.py +++ b/homeassistant/components/light/limitlessled.py @@ -66,7 +66,7 @@ class LimitlessLED(ToggleEntity): self._name = name or DEVICE_DEFAULT_NAME self._state = STATE_OFF - self._brightness = brightness + self._brightness = 100 @property def should_poll(self):