示例#1
0
    def test_color_rgb_to_rgbw(self):
        """Test color_rgb_to_rgbw."""
        assert (0, 0, 0, 0) == \
            color_util.color_rgb_to_rgbw(0, 0, 0)

        assert (0, 0, 0, 255) == \
            color_util.color_rgb_to_rgbw(255, 255, 255)

        assert (255, 0, 0, 0) == \
            color_util.color_rgb_to_rgbw(255, 0, 0)

        assert (0, 255, 0, 0) == \
            color_util.color_rgb_to_rgbw(0, 255, 0)

        assert (0, 0, 255, 0) == \
            color_util.color_rgb_to_rgbw(0, 0, 255)

        assert (255, 127, 0, 0) == \
            color_util.color_rgb_to_rgbw(255, 127, 0)

        assert (255, 0, 0, 253) == \
            color_util.color_rgb_to_rgbw(255, 127, 127)

        assert (0, 0, 0, 127) == \
            color_util.color_rgb_to_rgbw(127, 127, 127)
示例#2
0
    def test_color_rgb_to_rgbw(self):
        """Test color_rgb_to_rgbw."""
        self.assertEqual((0, 0, 0, 0),
                         color_util.color_rgb_to_rgbw(0, 0, 0))

        self.assertEqual((0, 0, 0, 255),
                         color_util.color_rgb_to_rgbw(255, 255, 255))

        self.assertEqual((255, 0, 0, 0),
                         color_util.color_rgb_to_rgbw(255, 0, 0))

        self.assertEqual((0, 255, 0, 0),
                         color_util.color_rgb_to_rgbw(0, 255, 0))

        self.assertEqual((0, 0, 255, 0),
                         color_util.color_rgb_to_rgbw(0, 0, 255))

        self.assertEqual((255, 127, 0, 0),
                         color_util.color_rgb_to_rgbw(255, 127, 0))

        self.assertEqual((255, 0, 0, 253),
                         color_util.color_rgb_to_rgbw(255, 127, 127))

        self.assertEqual((0, 0, 0, 127),
                         color_util.color_rgb_to_rgbw(127, 127, 127))
示例#3
0
    def turn_on(self, **kwargs):
        """Turn the device on."""
        rgbw = None

        if ATTR_COLOR_TEMP in kwargs:
            # Color temperature. With the AEOTEC ZW098 bulb, only two color
            # temperatures are supported. The warm and cold channel values
            # indicate brightness for warm/cold color temperature.
            if self._zw098:
                if kwargs[ATTR_COLOR_TEMP] > TEMP_MID_HASS:
                    self._ct = TEMP_WARM_HASS
                    rgbw = '#000000ff00'
                else:
                    self._ct = TEMP_COLD_HASS
                    rgbw = '#00000000ff'

        elif ATTR_RGB_COLOR in kwargs:
            self._rgb = kwargs[ATTR_RGB_COLOR]
            if (not self._zw098 and (
                    self._color_channels & COLOR_CHANNEL_WARM_WHITE or
                    self._color_channels & COLOR_CHANNEL_COLD_WHITE)):
                rgbw = '#'
                for colorval in color_rgb_to_rgbw(*self._rgb):
                    rgbw += format(colorval, '02x')
                rgbw += '00'
            else:
                rgbw = '#'
                for colorval in self._rgb:
                    rgbw += format(colorval, '02x')
                rgbw += '0000'

        if rgbw and self.values.color:
            self.values.color.data = rgbw

        super().turn_on(**kwargs)
示例#4
0
    def dmx_values(self):
        # Select which values to send over DMX

        if self._type == CONF_LIGHT_TYPE_RGB:
            # Scale the RGB colour value to the selected brightness
            return scale_rgb_to_brightness(self._rgb, self._brightness)
        elif self._type == CONF_LIGHT_TYPE_RGBW:
            rgbw = scale_rgb_to_brightness(self._rgb, self._brightness)
            rgbw.append(round(self._white_value * (self._brightness / 255)))
            return rgbw
        elif self._type == CONF_LIGHT_TYPE_RGBW_AUTO:
            # Split the white component out from the scaled RGB values
            scaled_rgb = scale_rgb_to_brightness(self._rgb, self._brightness)
            return color_rgb_to_rgbw(*scaled_rgb)
        elif self._type == CONF_LIGHT_TYPE_DRGB:
            drgb = [self._brightness]
            drgb.extend(self._rgb)
            return drgb
        elif self._type == CONF_LIGHT_TYPE_RGBWD:
            rgbwd = list()
            rgbwd.extend(self._rgb)
            rgbwd.append(self._white_value)
            rgbwd.append(self._brightness)
            return rgbwd
        else:
            return self._brightness
示例#5
0
    async def async_turn_on(self, **kwargs: Any) -> None:
        """Turn on the light."""
        data = {ATTR_ON: True, ATTR_SEGMENT_ID: self._segment}

        if ATTR_COLOR_TEMP in kwargs:
            mireds = color_util.color_temperature_kelvin_to_mired(
                kwargs[ATTR_COLOR_TEMP])
            data[ATTR_COLOR_PRIMARY] = tuple(
                map(int, color_util.color_temperature_to_rgb(mireds)))

        if ATTR_HS_COLOR in kwargs:
            hue, sat = kwargs[ATTR_HS_COLOR]
            data[ATTR_COLOR_PRIMARY] = color_util.color_hsv_to_RGB(
                hue, sat, 100)

        if ATTR_TRANSITION in kwargs:
            data[ATTR_TRANSITION] = kwargs[ATTR_TRANSITION]

        if ATTR_BRIGHTNESS in kwargs:
            data[ATTR_BRIGHTNESS] = kwargs[ATTR_BRIGHTNESS]

        if ATTR_EFFECT in kwargs:
            data[ATTR_EFFECT] = kwargs[ATTR_EFFECT]

        # Support for RGBW strips
        if self._rgbw and any(x in (ATTR_COLOR_TEMP, ATTR_HS_COLOR)
                              for x in kwargs):
            data[ATTR_COLOR_PRIMARY] = color_util.color_rgb_to_rgbw(
                *data[ATTR_COLOR_PRIMARY])

        try:
            await self.wled.light(**data)

            self._state = True

            if ATTR_BRIGHTNESS in kwargs:
                self._brightness = kwargs[ATTR_BRIGHTNESS]

            if ATTR_EFFECT in kwargs:
                self._effect = kwargs[ATTR_EFFECT]

            if ATTR_HS_COLOR in kwargs:
                self._color = kwargs[ATTR_HS_COLOR]

            if ATTR_COLOR_TEMP in kwargs:
                self._color = color_util.color_temperature_to_hs(mireds)

        except WLEDError:
            _LOGGER.error("An error occurred while turning on WLED light.")
            self._available = False
        self.async_schedule_update_ha_state()
示例#6
0
文件: test_color.py 项目: rikroe/core
def test_color_rgb_to_rgbw():
    """Test color_rgb_to_rgbw."""
    assert color_util.color_rgb_to_rgbw(0, 0, 0) == (0, 0, 0, 0)

    assert color_util.color_rgb_to_rgbw(255, 255, 255) == (0, 0, 0, 255)

    assert color_util.color_rgb_to_rgbw(255, 0, 0) == (255, 0, 0, 0)

    assert color_util.color_rgb_to_rgbw(0, 255, 0) == (0, 255, 0, 0)

    assert color_util.color_rgb_to_rgbw(0, 0, 255) == (0, 0, 255, 0)

    assert color_util.color_rgb_to_rgbw(255, 127, 0) == (255, 127, 0, 0)

    assert color_util.color_rgb_to_rgbw(255, 127, 127) == (255, 0, 0, 253)

    assert color_util.color_rgb_to_rgbw(127, 127, 127) == (0, 0, 0, 127)
示例#7
0
    def __getRGBWValueFromRGBValue(self, rgbColorValue):
        rgbwColorValue = [0, 0, 0, 0]

        if (self.__type == LightType.RGBW):
            rgbwColorValue = color_rgb_to_rgbw(
                rgbColorValue[0],
                rgbColorValue[1],
                rgbColorValue[2]
            )
        else:
            rgbwColorValue[0:3] = rgbColorValue

        ## Convert all elements from float to integer
        rgbwColorValue = list(map(lambda x: int(x), rgbwColorValue))

        return rgbwColorValue
示例#8
0
文件: light.py 项目: pr44/ipx800
    def turn_on(self, **kwargs):
        if ATTR_TRANSITION in kwargs:
            self._transition = int(kwargs.get(ATTR_TRANSITION) * 1000)

        if ATTR_RGB_COLOR in kwargs or ATTR_HS_COLOR in kwargs:
            if ATTR_RGB_COLOR in kwargs:
                self._rgb_color = kwargs.get(ATTR_RGB_COLOR)
            elif ATTR_HS_COLOR in kwargs:
                self._rgb_color = color_util.color_hs_to_RGB(
                    *kwargs.get(ATTR_HS_COLOR))
            rgbw = color_util.color_rgb_to_rgbw(*self._rgb_color)
            self.xpwm_rgbw_r.set_level(scaleto100(rgbw[0]), self._transition)
            self.xpwm_rgbw_g.set_level(scaleto100(rgbw[1]), self._transition)
            self.xpwm_rgbw_b.set_level(scaleto100(rgbw[2]), self._transition)
            self.xpwm_rgbw_w.set_level(scaleto100(rgbw[3]), self._transition)
        elif ATTR_WHITE_VALUE in kwargs:
            self._white_value = kwargs.get(ATTR_WHITE_VALUE)
            self.xpwm_rgbw_w.set_level(scaleto100(self._white_value),
                                       self._transition)
        elif ATTR_BRIGHTNESS in kwargs:
            self._brightness = kwargs.get(ATTR_BRIGHTNESS)
            if self._state:
                self.xpwm_rgbw_r.set_level(
                    scaleto100(self.xpwm_rgbw_r.level * self._brightness /
                               255),
                    self._transition,
                )
                self.xpwm_rgbw_g.set_level(
                    scaleto100(self.xpwm_rgbw_g.level * self._brightness /
                               255),
                    self._transition,
                )
                self.xpwm_rgbw_b.set_level(
                    scaleto100(self.xpwm_rgbw_b.level * self._brightness /
                               255),
                    self._transition,
                )
                self.xpwm_rgbw_w.set_level(
                    scaleto100(self.xpwm_rgbw_w.level * self._brightness /
                               255),
                    self._transition,
                )
            else:
                self.xpwm_rgbw_w.set_level(scaleto100(self._brightness),
                                           self._transition)
        else:
            self.xpwm_rgbw_w.on(self._transition)
示例#9
0
    def turn_on(self, **kwargs):
        """Turn the device on."""
        rgbw = None

        if ATTR_COLOR_TEMP in kwargs:
            # Color temperature. With the AEOTEC ZW098 bulb, only two color
            # temperatures are supported. The warm and cold channel values
            # indicate brightness for warm/cold color temperature.
            if self._zw098:
                if kwargs[ATTR_COLOR_TEMP] > TEMP_MID_HASS:
                    self._ct = TEMP_WARM_HASS
                    rgbw = b'#000000FF00'
                else:
                    self._ct = TEMP_COLD_HASS
                    rgbw = b'#00000000FF'

        elif ATTR_RGB_COLOR in kwargs:
            self._rgb = kwargs[ATTR_RGB_COLOR]
            if (not self._zw098 and (
                    self._color_channels & COLOR_CHANNEL_WARM_WHITE or
                    self._color_channels & COLOR_CHANNEL_COLD_WHITE)):
                rgbw = b'#'
                for colorval in color_rgb_to_rgbw(*self._rgb):
                    rgbw += format(colorval, '02x').encode('utf-8')
                rgbw += b'00'
            else:
                rgbw = b'#'
                for colorval in self._rgb:
                    rgbw += format(colorval, '02x').encode('utf-8')
                rgbw += b'0000'

        if rgbw is None:
            _LOGGER.warning("rgbw string was not generated for turn_on")
        else:
            self._value_color.node.set_rgbw(self._value_color.value_id, rgbw)

        super().turn_on(**kwargs)
示例#10
0
    def turn_on(self, **kwargs):
        """Turn the device on."""
        rgbw = None

        if ATTR_COLOR_TEMP in kwargs:
            # Color temperature. With the AEOTEC ZW098 bulb, only two color
            # temperatures are supported. The warm and cold channel values
            # indicate brightness for warm/cold color temperature.
            if self._zw098:
                if kwargs[ATTR_COLOR_TEMP] > TEMP_MID_HASS:
                    self._ct = TEMP_WARM_HASS
                    rgbw = b'#000000FF00'
                else:
                    self._ct = TEMP_COLD_HASS
                    rgbw = b'#00000000FF'

        elif ATTR_RGB_COLOR in kwargs:
            self._rgb = kwargs[ATTR_RGB_COLOR]
            if (not self._zw098 and (
                    self._color_channels & COLOR_CHANNEL_WARM_WHITE or
                    self._color_channels & COLOR_CHANNEL_COLD_WHITE)):
                rgbw = b'#'
                for colorval in color_rgb_to_rgbw(*self._rgb):
                    rgbw += format(colorval, '02x').encode('utf-8')
                rgbw += b'00'
            else:
                rgbw = b'#'
                for colorval in self._rgb:
                    rgbw += format(colorval, '02x').encode('utf-8')
                rgbw += b'0000'

        if rgbw is None:
            _LOGGER.warning("rgbw string was not generated for turn_on")
        else:
            self._value_color.node.set_rgbw(self._value_color.value_id, rgbw)

        super().turn_on(**kwargs)
示例#11
0
         params[ATTR_HS_COLOR] = color_util.color_xy_to_hs(*xy_color)
     elif (rgbw_color := params.pop(ATTR_RGBW_COLOR, None)) is not None:
         rgb_color = color_util.color_rgbw_to_rgb(*rgbw_color)
         params[ATTR_HS_COLOR] = color_util.color_RGB_to_hs(*rgb_color)
     elif (rgbww_color := params.pop(ATTR_RGBWW_COLOR,
                                     None)) is not None:
         rgb_color = color_util.color_rgbww_to_rgb(
             *rgbww_color, light.min_mireds, light.max_mireds)
         params[ATTR_HS_COLOR] = color_util.color_RGB_to_hs(*rgb_color)
 elif ATTR_HS_COLOR in params and ColorMode.HS not in supported_color_modes:
     hs_color = params.pop(ATTR_HS_COLOR)
     if ColorMode.RGB in supported_color_modes:
         params[ATTR_RGB_COLOR] = color_util.color_hs_to_RGB(*hs_color)
     elif ColorMode.RGBW in supported_color_modes:
         rgb_color = color_util.color_hs_to_RGB(*hs_color)
         params[ATTR_RGBW_COLOR] = color_util.color_rgb_to_rgbw(
             *rgb_color)
     elif ColorMode.RGBWW in supported_color_modes:
         rgb_color = color_util.color_hs_to_RGB(*hs_color)
         params[ATTR_RGBWW_COLOR] = color_util.color_rgb_to_rgbww(
             *rgb_color, light.min_mireds, light.max_mireds)
     elif ColorMode.XY in supported_color_modes:
         params[ATTR_XY_COLOR] = color_util.color_hs_to_xy(*hs_color)
 elif ATTR_RGB_COLOR in params and ColorMode.RGB not in supported_color_modes:
     rgb_color = params.pop(ATTR_RGB_COLOR)
     if ColorMode.RGBW in supported_color_modes:
         params[ATTR_RGBW_COLOR] = color_util.color_rgb_to_rgbw(
             *rgb_color)
     elif ColorMode.RGBWW in supported_color_modes:
         params[ATTR_RGBWW_COLOR] = color_util.color_rgb_to_rgbww(
             *rgb_color, light.min_mireds, light.max_mireds)
     elif ColorMode.HS in supported_color_modes:
示例#12
0
    def dmx_values(self):
        # Select which values to send over DMX

        if self._type == CONF_LIGHT_TYPE_RGB:
            # Scale the RGB colour value to the selected brightness
            return scale_rgb_to_brightness(self._rgb, self._brightness)
        elif self._type == CONF_LIGHT_TYPE_RGBA:
            # Split the white component out from the scaled RGB values
            rgba = scale_rgb_to_brightness(self._rgb, self._brightness)
            amber = rgba[0]
            if (amber > rgba[1] * 2):
                amber = rgba[1] * 2
            rgba[0] = rgba[0] - amber
            rgba[1] = round(rgba[1] - amber/2)
            rgba.append(amber)
            return rgba
        elif self._type == CONF_LIGHT_TYPE_RGBAW:
            # Split the white component out from the scaled RGB values
            values = scale_rgb_to_brightness(self._rgb, self._brightness)
            amber = values[0]
            if (amber > values[1] * 2):
                amber = values[1] * 2
            values[0] = values[0] - amber
            values[1] = round(values[1] - amber/2)
            values.append(amber)
            values.append(round(self._white_value * (self._brightness / 255)))
            return values
        elif self._type == CONF_LIGHT_TYPE_RGBW:
            rgbw = scale_rgb_to_brightness(self._rgb, self._brightness)
            rgbw.append(round(self._white_value * (self._brightness / 255)))
            return rgbw
        elif self._type == CONF_LIGHT_TYPE_RGBW_AUTO:
            # Split the white component out from the scaled RGB values
            scaled_rgb = scale_rgb_to_brightness(self._rgb, self._brightness)
            return color_rgb_to_rgbw(*scaled_rgb)
        elif self._type == CONF_LIGHT_TYPE_DRGB:
            drgb = [self._brightness]
            drgb.extend(self._rgb if self._brightness > 0 else [0, 0, 0])
            _LOGGER.debug("drgb: " + ', '.join([str(x) for x in drgb]));
            return drgb
        elif self._type == CONF_LIGHT_TYPE_DRGBW:
            drgbw = [self._brightness]
            drgbw.extend(self._rgb if self._brightness > 0 else [0, 0, 0])
            drgbw.append(self._white_value if self.brightness > 0 else 0)
            _LOGGER.debug("drgbw: " + ', '.join([str(x) for x in drgbw]));
            return drgbw
        elif self._type == CONF_LIGHT_TYPE_RGBWD:
            rgbwd = list()
            rgbwd.extend(self._rgb if self._brightness > 0 else [0, 0, 0])
            rgbwd.append(self._white_value if self._brightness > 0 else 0)
            rgbwd.append(self._brightness)
            _LOGGER.debug("rgbwd: " + ', '.join([str(x) for x in rgbwd]));
            return rgbwd
        elif self._type == CONF_LIGHT_TYPE_SWITCH:
            if self.is_on:
                return 255
            else:
                return 0
        elif self._type == CONF_LIGHT_TYPE_CUSTOM_WHITE:
            # d = dimmer
            # c = cool (scaled for brightness)
            # C = cool (not scaled)
            # h = hot (scaled for brightness)
            # H = hot (not scaled)
            # t = temperature (0 = hot, 255 = cold) 
            # T = temperature (255 = hot, 0 = cold)

            ww_fraction = (self._color_temp - self.min_mireds) / (
                           self.max_mireds - self.min_mireds)
            cw_fraction = 1 - ww_fraction
            max_fraction = max(ww_fraction, cw_fraction)

            switcher = {
                'd': self._brightness,
                't': 255 - (ww_fraction * 255),
                'T': ww_fraction * 255,
                'h': self.is_on * self._brightness * (ww_fraction / max_fraction),
                'c': self.is_on * self._brightness * (cw_fraction / max_fraction),
            }

            values = list()
            for channel in self._channel_setup:
                values.append(int(round(switcher.get(channel, 0))))

            return values
        else:
            return self._brightness