Bläddra i källkod

Replace light constants with enums.

- SUPPORT_* replaced with LightEntityFeature enum
- COLOR_MODE_* replaced with ColorMode enum

This is the final change to complete issue #167.
Jason Rumney 3 år sedan
förälder
incheckning
edf10ea2ce

+ 26 - 30
custom_components/tuya_local/generic/light.py

@@ -4,20 +4,14 @@ Initially based on the secondary panel lighting control on some climate
 devices, so only providing simple on/off control.
 """
 from homeassistant.components.light import (
-    LightEntity,
     ATTR_BRIGHTNESS,
     ATTR_COLOR_MODE,
     ATTR_COLOR_TEMP,
     ATTR_EFFECT,
     ATTR_RGBW_COLOR,
-    COLOR_MODE_BRIGHTNESS,
-    COLOR_MODE_COLOR_TEMP,
-    COLOR_MODE_ONOFF,
-    COLOR_MODE_RGBW,
-    COLOR_MODE_UNKNOWN,
-    COLOR_MODE_WHITE,
-    SUPPORT_EFFECT,
-    VALID_COLOR_MODES,
+    ColorMode,
+    LightEntity,
+    LightEntityFeature,
 )
 import homeassistant.util.color as color_util
 
@@ -55,22 +49,24 @@ class TuyaLocalLight(TuyaLocalEntity, LightEntity):
         """Return the supported color modes for this light."""
         if self._color_mode_dps:
             return [
-                mode
+                ColorMode(mode)
                 for mode in self._color_mode_dps.values(self._device)
-                if mode in VALID_COLOR_MODES
+                if hasattr(ColorMode, mode.upper())
             ]
         else:
-            mode = self.color_mode
-            if mode and mode != COLOR_MODE_UNKNOWN:
-                return [mode]
-
+            try:
+                mode = ColorMode(self.color_mode)
+                if mode and mode != ColorMode.UNKNOWN:
+                    return [mode]
+            except ValueError:
+                _LOGGER.warning(f"Unrecognised color mode {self.color_mode} ignored")
         return []
 
     @property
     def supported_features(self):
         """Return the supported features for this light."""
         if self.effect_list:
-            return SUPPORT_EFFECT
+            return LightEntityFeature.EFFECT
         else:
             return 0
 
@@ -79,19 +75,19 @@ class TuyaLocalLight(TuyaLocalEntity, LightEntity):
         """Return the color mode of the light"""
         if self._color_mode_dps:
             mode = self._color_mode_dps.get_value(self._device)
-            if mode in VALID_COLOR_MODES:
-                return mode
+            if hasattr(ColorMode, mode.upper()):
+                return ColorMode(mode)
 
         if self._rgbhsv_dps:
-            return COLOR_MODE_RGBW
+            return ColorMode.RGBW
         elif self._color_temp_dps:
-            return COLOR_MODE_COLOR_TEMP
+            return ColorMode.COLOR_TEMP
         elif self._brightness_dps:
-            return COLOR_MODE_BRIGHTNESS
+            return ColorMode.BRIGHTNESS
         elif self._switch_dps:
-            return COLOR_MODE_ONOFF
+            return ColorMode.ONOFF
         else:
-            return COLOR_MODE_UNKNOWN
+            return ColorMode.UNKNOWN
 
     @property
     def color_temp(self):
@@ -174,7 +170,7 @@ class TuyaLocalLight(TuyaLocalEntity, LightEntity):
             return [
                 effect
                 for effect in self._color_mode_dps.values(self._device)
-                if effect not in VALID_COLOR_MODES
+                if not hasattr(ColorMode, effect.upper())
             ]
 
     @property
@@ -184,7 +180,7 @@ class TuyaLocalLight(TuyaLocalEntity, LightEntity):
             return self._effect_dps.get_value(self._device)
         elif self._color_mode_dps:
             mode = self._color_mode_dps.get_value(self._device)
-            if mode not in VALID_COLOR_MODES:
+            if not hasattr(ColorMode, mode.upper()):
                 return mode
 
     async def async_turn_on(self, **params):
@@ -193,9 +189,9 @@ class TuyaLocalLight(TuyaLocalEntity, LightEntity):
 
         if self._color_temp_dps and ATTR_COLOR_TEMP in params:
             if ATTR_COLOR_MODE not in params:
-                color_mode = COLOR_MODE_WHITE
+                color_mode = ColorMode.COLOR_TEMP
             if self._color_mode_dps:
-                _LOGGER.debug("Auto setting color mode to WHITE for color temp")
+                _LOGGER.debug("Auto setting color mode to COLOR_TEMP")
                 settings = {
                     **settings,
                     **self._color_mode_dps.get_values_to_set(self._device, color_mode),
@@ -215,10 +211,10 @@ class TuyaLocalLight(TuyaLocalEntity, LightEntity):
             }
         elif self._rgbhsv_dps and (
             ATTR_RGBW_COLOR in params
-            or (ATTR_BRIGHTNESS in params and color_mode == COLOR_MODE_RGBW)
+            or (ATTR_BRIGHTNESS in params and color_mode == ColorMode.RGBW)
         ):
             if ATTR_COLOR_MODE not in params:
-                color_mode = COLOR_MODE_RGBW
+                color_mode = ColorMode.RGBW
             if self._color_mode_dps:
                 _LOGGER.debug("Auto setting color mode to RGBW")
                 settings = {
@@ -284,7 +280,7 @@ class TuyaLocalLight(TuyaLocalEntity, LightEntity):
 
         if (
             ATTR_BRIGHTNESS in params
-            and color_mode != COLOR_MODE_RGBW
+            and color_mode != ColorMode.RGBW
             and self._brightness_dps
         ):
             bright = params.get(ATTR_BRIGHTNESS)

+ 3 - 3
tests/devices/test_arlec_fan_light.py

@@ -6,7 +6,7 @@ from homeassistant.components.fan import (
 from homeassistant.components.light import (
     ATTR_BRIGHTNESS,
     ATTR_COLOR_TEMP,
-    COLOR_MODE_COLOR_TEMP,
+    ColorMode,
 )
 from ..const import ARLEC_FAN_LIGHT_PAYLOAD
 from ..helpers import assert_device_properties_set
@@ -127,11 +127,11 @@ class TestArlecFan(SwitchableTests, BasicSelectTests, TuyaDeviceTestCase):
     def test_light_supported_color_modes(self):
         self.assertCountEqual(
             self.light.supported_color_modes,
-            [COLOR_MODE_COLOR_TEMP],
+            [ColorMode.COLOR_TEMP],
         )
 
     def test_light_color_mode(self):
-        self.assertEqual(self.light.color_mode, COLOR_MODE_COLOR_TEMP)
+        self.assertEqual(self.light.color_mode, ColorMode.COLOR_TEMP)
 
     def test_light_brightness(self):
         self.dps[BRIGHTNESS_DPS] = 50

+ 0 - 1
tests/devices/test_deta_fan.py

@@ -1,5 +1,4 @@
 from homeassistant.components.fan import FanEntityFeature
-from homeassistant.components.light import COLOR_MODE_ONOFF
 
 from ..const import DETA_FAN_PAYLOAD
 from ..helpers import assert_device_properties_set

+ 14 - 15
tests/devices/test_digoo_dgsp01_dual_nightlight_switch.py

@@ -1,11 +1,10 @@
 """Tests for the switch entity."""
 from homeassistant.components.switch import SwitchDeviceClass
 from homeassistant.components.light import (
-    COLOR_MODE_RGBW,
-    COLOR_MODE_WHITE,
+    ColorMode,
     EFFECT_COLORLOOP,
     EFFECT_RANDOM,
-    SUPPORT_EFFECT,
+    LightEntityFeature,
 )
 from ..const import DIGOO_DGSP01_SOCKET_PAYLOAD
 from ..helpers import assert_device_properties_set
@@ -51,21 +50,21 @@ class TestDigooNightlightSwitch(BasicSwitchTests, TuyaDeviceTestCase):
 
     def test_light_color_mode(self):
         self.dps[COLORMODE_DPS] = "colour"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
         self.dps[COLORMODE_DPS] = "white"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_WHITE)
+        self.assertEqual(self.light.color_mode, ColorMode.WHITE)
         self.dps[COLORMODE_DPS] = "scene"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
         self.dps[COLORMODE_DPS] = "music"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
         self.dps[COLORMODE_DPS] = "scene_1"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
         self.dps[COLORMODE_DPS] = "scene_2"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
         self.dps[COLORMODE_DPS] = "scene_3"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
         self.dps[COLORMODE_DPS] = "scene_4"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
 
     def test_light_rgbw_color(self):
         self.dps[RGBW_DPS] = "ffff00003c6464"
@@ -108,11 +107,11 @@ class TestDigooNightlightSwitch(BasicSwitchTests, TuyaDeviceTestCase):
     def test_light_supported_color_modes(self):
         self.assertCountEqual(
             self.light.supported_color_modes,
-            {COLOR_MODE_RGBW, COLOR_MODE_WHITE},
+            {ColorMode.RGBW, ColorMode.WHITE},
         )
 
     def test_light_supported_features(self):
-        self.assertEqual(self.light.supported_features, SUPPORT_EFFECT)
+        self.assertEqual(self.light.supported_features, LightEntityFeature.EFFECT)
 
     async def test_turn_on(self):
         async with assert_device_properties_set(
@@ -135,7 +134,7 @@ class TestDigooNightlightSwitch(BasicSwitchTests, TuyaDeviceTestCase):
                 BRIGHTNESS_DPS: 128,
             },
         ):
-            await self.light.async_turn_on(color_mode=COLOR_MODE_WHITE, brightness=128)
+            await self.light.async_turn_on(color_mode=ColorMode.WHITE, brightness=128)
 
     async def test_set_rgbw(self):
         async with assert_device_properties_set(
@@ -147,7 +146,7 @@ class TestDigooNightlightSwitch(BasicSwitchTests, TuyaDeviceTestCase):
             },
         ):
             await self.light.async_turn_on(
-                color_mode=COLOR_MODE_RGBW, rgbw_color=(255, 0, 0, 255)
+                color_mode=ColorMode.RGBW, rgbw_color=(255, 0, 0, 255)
             )
 
     def test_extra_state_attributes_set(self):

+ 3 - 3
tests/devices/test_goldair_dehumidifier.py

@@ -7,7 +7,7 @@ from homeassistant.components.climate.const import (
     FAN_LOW,
     HVACMode,
 )
-from homeassistant.components.light import COLOR_MODE_ONOFF
+from homeassistant.components.light import ColorMode
 from homeassistant.components.sensor import SensorDeviceClass
 from homeassistant.const import TEMP_CELSIUS, TIME_HOURS
 
@@ -487,11 +487,11 @@ class TestGoldairDehumidifier(
     def test_light_supported_color_modes(self):
         self.assertCountEqual(
             self.light.supported_color_modes,
-            [COLOR_MODE_ONOFF],
+            [ColorMode.ONOFF],
         )
 
     def test_light_color_mode(self):
-        self.assertEqual(self.light.color_mode, COLOR_MODE_ONOFF)
+        self.assertEqual(self.light.color_mode, ColorMode.ONOFF)
 
     def test_light_icon(self):
         self.dps[LIGHTOFF_DPS] = False

+ 6 - 6
tests/devices/test_kogan_kashmfp20ba_heater.py

@@ -3,8 +3,8 @@ from homeassistant.components.climate.const import (
     HVACMode,
 )
 from homeassistant.components.light import (
-    COLOR_MODE_UNKNOWN,
-    SUPPORT_EFFECT,
+    ColorMode,
+    LightEntityFeature,
 )
 
 from ..const import KOGAN_KASHMFP20BA_HEATER_PAYLOAD
@@ -130,12 +130,12 @@ class TestKoganKASHMF20BAHeater(TargetTemperatureTests, TuyaDeviceTestCase):
         self.assertCountEqual(self.flame.supported_color_modes, [])
 
     def test_lighting_supported_features(self):
-        self.assertEqual(self.backlight.supported_features, SUPPORT_EFFECT)
-        self.assertEqual(self.flame.supported_features, SUPPORT_EFFECT)
+        self.assertEqual(self.backlight.supported_features, LightEntityFeature.EFFECT)
+        self.assertEqual(self.flame.supported_features, LightEntityFeature.EFFECT)
 
     def test_lighting_color_mode(self):
-        self.assertEqual(self.backlight.color_mode, COLOR_MODE_UNKNOWN)
-        self.assertEqual(self.flame.color_mode, COLOR_MODE_UNKNOWN)
+        self.assertEqual(self.backlight.color_mode, ColorMode.UNKNOWN)
+        self.assertEqual(self.flame.color_mode, ColorMode.UNKNOWN)
 
     def test_lighting_is_on(self):
         self.assertTrue(self.backlight.is_on)

+ 13 - 14
tests/devices/test_moes_rgb_socket.py

@@ -1,9 +1,8 @@
 """Tests for the MoesHouse RGBW smart socket."""
 from homeassistant.components.light import (
-    COLOR_MODE_RGBW,
-    COLOR_MODE_WHITE,
+    ColorMode,
     EFFECT_COLORLOOP,
-    SUPPORT_EFFECT,
+    LightEntityFeature,
 )
 from homeassistant.components.sensor import SensorDeviceClass
 from homeassistant.components.switch import SwitchDeviceClass
@@ -112,19 +111,19 @@ class TestMoesRGBWSocket(
 
     def test_light_color_mode(self):
         self.dps[MODE_DPS] = "colour"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
         self.dps[MODE_DPS] = "white"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_WHITE)
+        self.assertEqual(self.light.color_mode, ColorMode.WHITE)
         self.dps[MODE_DPS] = "scene"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
         self.dps[MODE_DPS] = "scene_1"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
         self.dps[MODE_DPS] = "scene_2"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
         self.dps[MODE_DPS] = "scene_3"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
         self.dps[MODE_DPS] = "scene_4"
-        self.assertEqual(self.light.color_mode, COLOR_MODE_RGBW)
+        self.assertEqual(self.light.color_mode, ColorMode.RGBW)
 
     def test_light_rgbw_color(self):
         self.dps[RGBW_DPS] = "ffff00003cffff"
@@ -160,11 +159,11 @@ class TestMoesRGBWSocket(
     def test_light_supported_color_modes(self):
         self.assertCountEqual(
             self.light.supported_color_modes,
-            {COLOR_MODE_RGBW, COLOR_MODE_WHITE},
+            {ColorMode.RGBW, ColorMode.WHITE},
         )
 
     def test_light_supported_features(self):
-        self.assertEqual(self.light.supported_features, SUPPORT_EFFECT)
+        self.assertEqual(self.light.supported_features, LightEntityFeature.EFFECT)
 
     async def test_turn_on(self):
         async with assert_device_properties_set(self.light._device, {LIGHT_DPS: True}):
@@ -183,7 +182,7 @@ class TestMoesRGBWSocket(
                 BRIGHTNESS_DPS: 128,
             },
         ):
-            await self.light.async_turn_on(color_mode=COLOR_MODE_WHITE, brightness=128)
+            await self.light.async_turn_on(color_mode=ColorMode.WHITE, brightness=128)
 
     async def test_set_rgbw(self):
         async with assert_device_properties_set(
@@ -195,7 +194,7 @@ class TestMoesRGBWSocket(
             },
         ):
             await self.light.async_turn_on(
-                color_mode=COLOR_MODE_RGBW, rgbw_color=(255, 0, 0, 255)
+                color_mode=ColorMode.RGBW, rgbw_color=(255, 0, 0, 255)
             )
 
     def test_extra_state_attributes_set(self):

+ 3 - 3
tests/devices/test_purline_m100_heater.py

@@ -4,7 +4,7 @@ from homeassistant.components.climate.const import (
     SWING_OFF,
     SWING_VERTICAL,
 )
-from homeassistant.components.light import COLOR_MODE_ONOFF
+from homeassistant.components.light import ColorMode
 
 from ..const import PURLINE_M100_HEATER_PAYLOAD
 from ..helpers import (
@@ -174,11 +174,11 @@ class TestPulineM100Heater(
     def test_light_supported_color_modes(self):
         self.assertCountEqual(
             self.light.supported_color_modes,
-            [COLOR_MODE_ONOFF],
+            [ColorMode.ONOFF],
         )
 
     def test_light_color_mode(self):
-        self.assertEqual(self.light.color_mode, COLOR_MODE_ONOFF)
+        self.assertEqual(self.light.color_mode, ColorMode.ONOFF)
 
     def test_light_icon(self):
         self.dps[LIGHTOFF_DPS] = False

+ 0 - 1
tests/devices/test_wetair_wch750_heater.py

@@ -5,7 +5,6 @@ from homeassistant.components.climate.const import (
     PRESET_COMFORT,
     PRESET_BOOST,
 )
-from homeassistant.components.light import COLOR_MODE_BRIGHTNESS
 from homeassistant.const import TIME_MINUTES
 
 from ..const import WETAIR_WCH750_HEATER_PAYLOAD

+ 5 - 6
tests/mixins/light.py

@@ -1,7 +1,6 @@
 # Mixins for testing lights
 from homeassistant.components.light import (
-    COLOR_MODE_BRIGHTNESS,
-    COLOR_MODE_ONOFF,
+    ColorMode,
 )
 
 from ..helpers import assert_device_properties_set
@@ -20,11 +19,11 @@ class BasicLightTests:
     def test_basic_light_supported_color_modes(self):
         self.assertCountEqual(
             self.basicLight.supported_color_modes,
-            [COLOR_MODE_ONOFF],
+            [ColorMode.ONOFF],
         )
 
     def test_basic_light_color_mode(self):
-        self.assertEqual(self.basicLight.color_mode, COLOR_MODE_ONOFF)
+        self.assertEqual(self.basicLight.color_mode, ColorMode.ONOFF)
 
     def test_basic_light_has_no_brightness(self):
         self.assertIsNone(self.basicLight.brightness)
@@ -96,12 +95,12 @@ class MultiLightTests:
         for light in self.multiLight.values():
             self.assertCountEqual(
                 light.supported_color_modes,
-                [COLOR_MODE_ONOFF],
+                [ColorMode.ONOFF],
             )
 
     def test_multi_light_color_mode(self):
         for light in self.multiLight.values():
-            self.assertEqual(light.color_mode, COLOR_MODE_ONOFF)
+            self.assertEqual(light.color_mode, ColorMode.ONOFF)
 
     def test_multi_lights_have_no_brightness(self):
         for light in self.multiLight.values():