From edd5db296d63a93b63bf5712c768625c73019e8f Mon Sep 17 00:00:00 2001 From: dramamoose Date: Thu, 2 Mar 2017 00:54:45 -0700 Subject: [PATCH] Update Formulas in Convert XY to RGB (#6322) * Update to Current RGB D65 Conversion As per Philips Hue https://developers.meethue.com/documentation/color-conversions-rgb-xy * Update the source of the XYZ to RGB formulas * Fix Whitespace * Update Whitespace * Update Tests for new Formulas * Update Tests * Update XY_Brightness_to_hsv tests * Update test_color.py --- homeassistant/util/color.py | 11 +++++------ tests/components/light/test_demo.py | 2 +- tests/util/test_color.py | 12 ++++++------ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/homeassistant/util/color.py b/homeassistant/util/color.py index 5a7c3b12e04..52d7a9f63aa 100644 --- a/homeassistant/util/color.py +++ b/homeassistant/util/color.py @@ -217,9 +217,8 @@ def color_RGB_to_xy(iR: int, iG: int, iB: int) -> Tuple[float, float, int]: return round(x, 3), round(y, 3), brightness -# taken from -# https://github.com/benknight/hue-python-rgb-converter/blob/master/rgb_cie.py -# Copyright (c) 2014 Benjamin Knight / MIT License. +# Converted to Python from Obj-C, original source from: +# http://www.developers.meethue.com/documentation/color-conversions-rgb-xy def color_xy_brightness_to_RGB(vX: float, vY: float, ibrightness: int) -> Tuple[int, int, int]: """Convert from XYZ to RGB.""" @@ -236,9 +235,9 @@ def color_xy_brightness_to_RGB(vX: float, vY: float, Z = (Y / vY) * (1 - vX - vY) # Convert to RGB using Wide RGB D65 conversion. - r = X * 1.612 - Y * 0.203 - Z * 0.302 - g = -X * 0.509 + Y * 1.412 + Z * 0.066 - b = X * 0.026 - Y * 0.072 + Z * 0.962 + r = X * 1.656492 - Y * 0.354851 - Z * 0.255038 + g = -X * 0.707196 + Y * 1.655397 + Z * 0.036152 + b = X * 0.051713 - Y * 0.121364 + Z * 1.011530 # Apply reverse gamma correction. r, g, b = map( diff --git a/tests/components/light/test_demo.py b/tests/components/light/test_demo.py index 391a6d05903..de89d434e89 100644 --- a/tests/components/light/test_demo.py +++ b/tests/components/light/test_demo.py @@ -39,7 +39,7 @@ class TestDemoLight(unittest.TestCase): self.assertEqual((.4, .6), state.attributes.get(light.ATTR_XY_COLOR)) self.assertEqual(25, state.attributes.get(light.ATTR_BRIGHTNESS)) self.assertEqual( - (82, 91, 0), state.attributes.get(light.ATTR_RGB_COLOR)) + (76, 95, 0), state.attributes.get(light.ATTR_RGB_COLOR)) self.assertEqual('rainbow', state.attributes.get(light.ATTR_EFFECT)) light.turn_on( self.hass, ENTITY_LIGHT, rgb_color=(251, 252, 253), diff --git a/tests/util/test_color.py b/tests/util/test_color.py index ada7ccc072e..d7560d4f7bf 100644 --- a/tests/util/test_color.py +++ b/tests/util/test_color.py @@ -27,16 +27,16 @@ class TestColorUtil(unittest.TestCase): self.assertEqual((0, 0, 0), color_util.color_xy_brightness_to_RGB(1, 1, 0)) - self.assertEqual((255, 235, 214), + self.assertEqual((255, 243, 222), color_util.color_xy_brightness_to_RGB(.35, .35, 255)) - self.assertEqual((255, 0, 45), + self.assertEqual((255, 0, 60), color_util.color_xy_brightness_to_RGB(1, 0, 255)) self.assertEqual((0, 255, 0), color_util.color_xy_brightness_to_RGB(0, 1, 255)) - self.assertEqual((0, 83, 255), + self.assertEqual((0, 63, 255), color_util.color_xy_brightness_to_RGB(0, 0, 255)) def test_color_RGB_to_hsv(self): @@ -61,16 +61,16 @@ class TestColorUtil(unittest.TestCase): self.assertEqual(color_util.color_RGB_to_hsv(0, 0, 0), color_util.color_xy_brightness_to_hsv(1, 1, 0)) - self.assertEqual(color_util.color_RGB_to_hsv(255, 235, 214), + self.assertEqual(color_util.color_RGB_to_hsv(255, 243, 222), color_util.color_xy_brightness_to_hsv(.35, .35, 255)) - self.assertEqual(color_util.color_RGB_to_hsv(255, 0, 45), + self.assertEqual(color_util.color_RGB_to_hsv(255, 0, 60), color_util.color_xy_brightness_to_hsv(1, 0, 255)) self.assertEqual(color_util.color_RGB_to_hsv(0, 255, 0), color_util.color_xy_brightness_to_hsv(0, 1, 255)) - self.assertEqual(color_util.color_RGB_to_hsv(0, 83, 255), + self.assertEqual(color_util.color_RGB_to_hsv(0, 63, 255), color_util.color_xy_brightness_to_hsv(0, 0, 255)) def test_rgb_hex_to_rgb_list(self):