Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[hue] Changed default color mode for color commands to XY #10608

Merged
merged 2 commits into from
May 9, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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