Fix flux_led only-white controllers (and remove explicit declaration as RGBW in automatic add) (#22210)

* Remove explicit declaration of automatic found devices as RGBW

* fixes for Magic Home only-white controllers

* mode is now set to None instead of removed entirely

* flux_led now changes no values when turned on from off state.

* better checking for changed values in turn_on

* Reduce waiting time to 1 second

* Correction of turn on logic

* Remove accidentally inserted 'not'

* Remove lint

* Remove redundant code
pull/23130/head
Sidney 2019-04-16 02:07:15 +02:00 committed by Paulus Schoutsen
parent 6a2da9f9a5
commit 48138189b3
1 changed files with 38 additions and 49 deletions

View File

@ -144,7 +144,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
if ipaddr in light_ips: if ipaddr in light_ips:
continue continue
device['name'] = '{} {}'.format(device['id'], ipaddr) device['name'] = '{} {}'.format(device['id'], ipaddr)
device[ATTR_MODE] = MODE_RGBW device[ATTR_MODE] = None
device[CONF_PROTOCOL] = None device[CONF_PROTOCOL] = None
device[CONF_CUSTOM_EFFECT] = None device[CONF_CUSTOM_EFFECT] = None
light = FluxLight(device) light = FluxLight(device)
@ -251,16 +251,15 @@ class FluxLight(Light):
for effect, code in EFFECT_MAP.items(): for effect, code in EFFECT_MAP.items():
if current_mode == code: if current_mode == code:
return effect return effect
return None return None
async def async_turn_on(self, **kwargs): async def async_turn_on(self, **kwargs):
"""Turn the specified or all lights on and wait for state.""" """Turn the specified or all lights on and wait for state."""
await self.hass.async_add_executor_job(partial(self._turn_on, await self.hass.async_add_executor_job(partial(self._turn_on,
**kwargs)) **kwargs))
# The bulb needs a second to tell its new values, # The bulb needs a bit to tell its new values,
# so we wait 2 seconds before updating # so we wait 1 second before updating
await sleep(2) await sleep(1)
def _turn_on(self, **kwargs): def _turn_on(self, **kwargs):
"""Turn the specified or all lights on.""" """Turn the specified or all lights on."""
@ -271,55 +270,47 @@ class FluxLight(Light):
effect = kwargs.get(ATTR_EFFECT) effect = kwargs.get(ATTR_EFFECT)
white = kwargs.get(ATTR_WHITE_VALUE) white = kwargs.get(ATTR_WHITE_VALUE)
# Show warning if effect set with rgb, brightness, or white level if all(item is None for item in [hs_color, brightness, effect, white]):
if effect and (brightness or white or hs_color):
_LOGGER.warning("RGB, brightness and white level are ignored when"
" an effect is specified for a flux bulb")
# Random color effect
if effect == EFFECT_RANDOM:
self._bulb.setRgb(random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255))
return return
if effect == EFFECT_CUSTOM:
if self._custom_effect:
self._bulb.setCustomPattern(
self._custom_effect[CONF_COLORS],
self._custom_effect[CONF_SPEED_PCT],
self._custom_effect[CONF_TRANSITION])
return
# Effect selection
if effect in EFFECT_MAP:
self._bulb.setPresetPattern(EFFECT_MAP[effect], 50)
return
# Preserve current brightness on color/white level change
if brightness is None:
brightness = self.brightness
if hs_color:
self._color = (hs_color[0], hs_color[1], brightness / 255 * 100)
elif brightness and (hs_color is None) and self._mode != MODE_WHITE:
self._color = (self._color[0], self._color[1],
brightness / 255 * 100)
# handle W only mode (use brightness instead of white value) # handle W only mode (use brightness instead of white value)
if self._mode == MODE_WHITE: if self._mode == MODE_WHITE:
self._bulb.setRgbw(0, 0, 0, w=brightness) if brightness is not None:
self._bulb.setWarmWhite255(brightness)
return
if effect is not None:
# Random color effect
if effect == EFFECT_RANDOM:
self._bulb.setRgb(random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255))
elif effect == EFFECT_CUSTOM:
if self._custom_effect:
self._bulb.setCustomPattern(
self._custom_effect[CONF_COLORS],
self._custom_effect[CONF_SPEED_PCT],
self._custom_effect[CONF_TRANSITION])
# Effect selection
elif effect in EFFECT_MAP:
self._bulb.setPresetPattern(EFFECT_MAP[effect], 50)
return
# Preserve current brightness on color/white level change
if hs_color is not None:
if brightness is None:
brightness = self.brightness
color = (hs_color[0], hs_color[1], brightness / 255 * 100)
elif brightness is not None:
color = (self._color[0], self._color[1],
brightness / 255 * 100)
# handle RGBW mode # handle RGBW mode
elif self._mode == MODE_RGBW: if self._mode == MODE_RGBW:
if white is None: if white is None:
self._bulb.setRgbw(*color_util.color_hsv_to_RGB(*self._color)) self._bulb.setRgbw(*color_util.color_hsv_to_RGB(*color))
else: else:
self._bulb.setRgbw(w=white) self._bulb.setRgbw(w=white)
# handle RGB mode # handle RGB mode
else: else:
self._bulb.setRgb(*color_util.color_hsv_to_RGB(*self._color)) self._bulb.setRgb(*color_util.color_hsv_to_RGB(*color))
return
def turn_off(self, **kwargs): def turn_off(self, **kwargs):
"""Turn the specified or all lights off.""" """Turn the specified or all lights off."""
@ -331,10 +322,6 @@ class FluxLight(Light):
try: try:
self._connect() self._connect()
self._error_reported = False self._error_reported = False
if self._bulb.getRgb() != (0, 0, 0):
color = self._bulb.getRgbw()
self._color = color_util.color_RGB_to_hsv(*color[0:3])
self._white_value = color[3]
except socket.error: except socket.error:
self._disconnect() self._disconnect()
if not self._error_reported: if not self._error_reported:
@ -343,7 +330,9 @@ class FluxLight(Light):
self._error_reported = True self._error_reported = True
return return
self._bulb.update_state(retry=2) self._bulb.update_state(retry=2)
if self._bulb.getRgb() != (0, 0, 0): if self._mode != MODE_WHITE and self._bulb.getRgb() != (0, 0, 0):
color = self._bulb.getRgbw() color = self._bulb.getRgbw()
self._color = color_util.color_RGB_to_hsv(*color[0:3]) self._color = color_util.color_RGB_to_hsv(*color[0:3])
self._white_value = color[3] self._white_value = color[3]
elif self._mode == MODE_WHITE:
self._white_value = self._bulb.getRgbw()[3]