]> git.basschouten.com Git - openhab-addons.git/commitdiff
[hue] Changed default color mode for color commands to XY (#10608)
authorChristoph Weitkamp <github@christophweitkamp.de>
Sun, 9 May 2021 18:08:18 +0000 (20:08 +0200)
committerGitHub <noreply@github.com>
Sun, 9 May 2021 18:08:18 +0000 (20:08 +0200)
* Changed default color mode for color commands to XY

Signed-off-by: Christoph Weitkamp <github@christophweitkamp.de>
* Incorporated comments from review

Signed-off-by: Christoph Weitkamp <github@christophweitkamp.de>
bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/LightStateConverter.java
bundles/org.openhab.binding.hue/src/test/java/org/openhab/binding/hue/internal/LightStateConverterTest.java

index 4057df83ae7bdcb8c22350dd06ad983bc1287e29..81179cccb541f6705c7fa0fc4292eb5c99fb5e8b 100644 (file)
@@ -68,8 +68,10 @@ public class LightStateConverter {
      * @return light state representing the {@link HSBType}.
      */
     public static StateUpdate toColorLightState(HSBType hsbType, State lightState) {
-        StateUpdate stateUpdate = ColorMode.XY.equals(lightState.getColorMode()) ? toXYColorLightState(hsbType)
-                : toHSBColorLightState(hsbType);
+        // XY color is the implicit default: Use XY color mode if i) no color mode is set or ii) if the bulb is in
+        // CT mode or iii) already in XY mode. Only if the bulb is in HS mode, use this one.
+        StateUpdate stateUpdate = ColorMode.HS.equals(lightState.getColorMode()) ? toHSBColorLightState(hsbType)
+                : toXYColorLightState(hsbType);
 
         int brightness = (int) Math.floor(hsbType.getBrightness().doubleValue() * BRIGHTNESS_FACTOR);
         if (brightness > 0) {
index 9d151d7eb7bf30d837b380b9f0784a0ad17c5939..d4c9baecc1d874ce63e3238d9be3a5f45358aa3d 100644 (file)
@@ -70,7 +70,7 @@ public class LightStateConverterTest {
         final State lightState = new State();
         // 0 percent should not be sent to the Hue interface
         StateUpdate stateUpdate = LightStateConverter.toBrightnessLightState(PercentType.ZERO);
-        assertThat(stateUpdate.commands.size(), is(1));
+        assertThat(stateUpdate.commands, hasSize(1));
         // a brightness of 0 should result in 0 percent
         lightState.bri = 0;
         assertThat(LightStateConverter.toBrightnessPercentType(lightState), is(PercentType.ZERO));
@@ -81,7 +81,7 @@ public class LightStateConverterTest {
         final State lightState = new State();
         for (int percent = 1; percent <= 100; ++percent) {
             StateUpdate stateUpdate = LightStateConverter.toBrightnessLightState(new PercentType(percent));
-            assertThat(stateUpdate.commands.size(), is(2));
+            assertThat(stateUpdate.commands, hasSize(2));
             assertThat(stateUpdate.commands.get(1).key, is("bri"));
             lightState.bri = Integer.parseInt(stateUpdate.commands.get(1).value.toString());
             assertThat(LightStateConverter.toBrightnessPercentType(lightState).intValue(), is(percent));
@@ -105,7 +105,7 @@ public class LightStateConverterTest {
         // 0 percent should not be sent to the Hue interface
         final HSBType hsbType = new HSBType(DecimalType.ZERO, PercentType.ZERO, PercentType.ZERO);
         StateUpdate stateUpdate = LightStateConverter.toColorLightState(hsbType, lightState);
-        assertThat(stateUpdate.commands.size(), is(2));
+        assertThat(stateUpdate.commands, hasSize(1));
         // a brightness of 0 should result in 0 percent
         lightState.bri = 0;
         assertThat(LightStateConverter.toHSBType(lightState).getBrightness(), is(PercentType.ZERO));
@@ -118,9 +118,9 @@ public class LightStateConverterTest {
         for (int percent = 1; percent <= 100; ++percent) {
             final HSBType hsbType = new HSBType(DecimalType.ZERO, PercentType.ZERO, new PercentType(percent));
             StateUpdate stateUpdate = LightStateConverter.toColorLightState(hsbType, lightState);
-            assertThat(stateUpdate.commands.size(), is(3));
-            assertThat(stateUpdate.commands.get(2).key, is("bri"));
-            lightState.bri = Integer.parseInt(stateUpdate.commands.get(2).value.toString());
+            assertThat(stateUpdate.commands, hasSize(2));
+            assertThat(stateUpdate.commands.get(1).key, is("bri"));
+            lightState.bri = Integer.parseInt(stateUpdate.commands.get(1).value.toString());
             assertThat(LightStateConverter.toHSBType(lightState).getBrightness().intValue(), is(percent));
         }
     }
@@ -149,11 +149,11 @@ public class LightStateConverterTest {
     @Test
     public void colorLightStateConverterForSaturationConversionIsBijective() {
         final State lightState = new State();
-        lightState.colormode = ColorMode.CT.toString();
+        lightState.colormode = ColorMode.HS.toString();
         for (int percent = 0; percent <= 100; ++percent) {
             final HSBType hsbType = new HSBType(DecimalType.ZERO, new PercentType(percent), PercentType.HUNDRED);
             StateUpdate stateUpdate = LightStateConverter.toColorLightState(hsbType, lightState);
-            assertThat(stateUpdate.commands.size(), is(3));
+            assertThat(stateUpdate.commands, hasSize(3));
             assertThat(stateUpdate.commands.get(1).key, is("sat"));
             lightState.sat = Integer.parseInt(stateUpdate.commands.get(1).value.toString());
             assertThat(LightStateConverter.toHSBType(lightState).getSaturation().intValue(), is(percent));
@@ -163,16 +163,43 @@ public class LightStateConverterTest {
     @Test
     public void colorLightStateConverterForHueConversionIsBijective() {
         final State lightState = new State();
+        lightState.colormode = ColorMode.HS.toString();
         for (int hue = 0; hue < 360; ++hue) {
             final HSBType hsbType = new HSBType(new DecimalType(hue), PercentType.HUNDRED, PercentType.HUNDRED);
             StateUpdate stateUpdate = LightStateConverter.toColorLightState(hsbType, lightState);
-            assertThat(stateUpdate.commands.size(), is(3));
+            assertThat(stateUpdate.commands, hasSize(3));
             assertThat(stateUpdate.commands.get(0).key, is("hue"));
             lightState.hue = Integer.parseInt(stateUpdate.commands.get(0).value.toString());
             assertThat(LightStateConverter.toHSBType(lightState).getHue().intValue(), is(hue));
         }
     }
 
+    @Test
+    public void colorLightStateConverterColorModeSelection() {
+        final State lightState = new State();
+        final HSBType hsbType = new HSBType(PercentType.HUNDRED, PercentType.HUNDRED, PercentType.HUNDRED);
+
+        lightState.colormode = null;
+        StateUpdate stateUpdate = LightStateConverter.toColorLightState(hsbType, lightState);
+        assertThat(stateUpdate.commands, hasSize(2));
+        assertThat(stateUpdate.commands.get(0).key, is("xy"));
+
+        lightState.colormode = ColorMode.CT.toString();
+        stateUpdate = LightStateConverter.toColorLightState(hsbType, lightState);
+        assertThat(stateUpdate.commands, hasSize(2));
+        assertThat(stateUpdate.commands.get(0).key, is("xy"));
+
+        lightState.colormode = ColorMode.HS.toString();
+        stateUpdate = LightStateConverter.toColorLightState(hsbType, lightState);
+        assertThat(stateUpdate.commands, hasSize(3));
+        assertThat(stateUpdate.commands.get(0).key, is("hue"));
+
+        lightState.colormode = ColorMode.XY.toString();
+        stateUpdate = LightStateConverter.toColorLightState(hsbType, lightState);
+        assertThat(stateUpdate.commands, hasSize(2));
+        assertThat(stateUpdate.commands.get(0).key, is("xy"));
+    }
+
     @Test
     public void hsbSaturationAlwaysGreaterThanZero() {
         final State lightState = new State();