Skip to content

Commit

Permalink
[hue] Changed default color mode for color commands to XY (openhab#10608
Browse files Browse the repository at this point in the history
)

* 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>
Signed-off-by: John Marshall <john.marshall.au@gmail.com>
  • Loading branch information
cweitkamp authored and themillhousegroup committed May 10, 2021
1 parent 4884e3a commit b2e8e35
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -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));
Expand All @@ -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));
Expand All @@ -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));
}
}
Expand Down Expand Up @@ -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));
Expand All @@ -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();
Expand Down

0 comments on commit b2e8e35

Please sign in to comment.