From b2e8e358e6db19f0b655c3bd8beef4b4ad799c4c Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Sun, 9 May 2021 20:08:18 +0200 Subject: [PATCH] [hue] Changed default color mode for color commands to XY (#10608) * Changed default color mode for color commands to XY Signed-off-by: Christoph Weitkamp * Incorporated comments from review Signed-off-by: Christoph Weitkamp Signed-off-by: John Marshall --- .../internal/handler/LightStateConverter.java | 6 ++- .../hue/internal/LightStateConverterTest.java | 45 +++++++++++++++---- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/LightStateConverter.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/LightStateConverter.java index 4057df83ae7bd..81179cccb541f 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/LightStateConverter.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/LightStateConverter.java @@ -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) { diff --git a/bundles/org.openhab.binding.hue/src/test/java/org/openhab/binding/hue/internal/LightStateConverterTest.java b/bundles/org.openhab.binding.hue/src/test/java/org/openhab/binding/hue/internal/LightStateConverterTest.java index 9d151d7eb7bf3..d4c9baecc1d87 100644 --- a/bundles/org.openhab.binding.hue/src/test/java/org/openhab/binding/hue/internal/LightStateConverterTest.java +++ b/bundles/org.openhab.binding.hue/src/test/java/org/openhab/binding/hue/internal/LightStateConverterTest.java @@ -70,7 +70,7 @@ public void brightnessOfZeroIsZero() { 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 void brightnessLightStateConverterConversionIsBijective() { 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 void colorWithBightnessOfZeroIsZero() { // 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 void colorLightStateConverterForBrightnessConversionIsBijective() { 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 void hsbHueAlwaysGreaterThanZeroAndLessThan360() { @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 void colorLightStateConverterForSaturationConversionIsBijective() { @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();