[hue] Fix edge cases for broken lights (#15999)

Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch>
This commit is contained in:
Andrew Fiddian-Green 2023-12-06 14:22:04 +00:00 committed by GitHub
parent c44c9dc67e
commit 4476e6dcd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 132 additions and 5 deletions

View File

@ -38,7 +38,8 @@ public class OnState {
throw new DTOPresentButEmptyException("'on' DTO is present but empty");
}
public void setOn(boolean on) {
public OnState setOn(boolean on) {
this.on = on;
return this;
}
}

View File

@ -205,10 +205,16 @@ public class Resource {
Dimming dimming = this.dimming;
if (Objects.nonNull(dimming)) {
try {
// if off the brightness is 0, otherwise it is dimming value
// if off the brightness is 0, otherwise it is the larger of dimming value or minimum dimming level
OnState on = this.on;
double brightness = Objects.nonNull(on) && !on.isOn() ? 0f
: Math.max(0f, Math.min(100f, dimming.getBrightness()));
double brightness;
if (Objects.nonNull(on) && !on.isOn()) {
brightness = 0f;
} else {
Double minimumDimmingLevel = dimming.getMinimumDimmingLevel();
brightness = Math.max(Objects.nonNull(minimumDimmingLevel) ? minimumDimmingLevel
: Dimming.DEFAULT_MINIMUM_DIMMIMG_LEVEL, Math.min(100f, dimming.getBrightness()));
}
return new PercentType(new BigDecimal(brightness, PERCENT_MATH_CONTEXT));
} catch (DTOPresentButEmptyException e) {
return UnDefType.UNDEF; // indicates the DTO is present but its inner fields are missing
@ -874,8 +880,9 @@ public class Resource {
return this;
}
public void setOnState(@Nullable OnState on) {
public Resource setOnState(@Nullable OnState on) {
this.on = on;
return this;
}
public Resource setRecallAction(SceneRecallAction recallAction) {

View File

@ -0,0 +1,119 @@
/**
* Copyright (c) 2010-2023 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.hue.internal.clip2;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
import java.math.BigDecimal;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.junit.jupiter.api.Test;
import org.openhab.binding.hue.internal.api.dto.clip2.Dimming;
import org.openhab.binding.hue.internal.api.dto.clip2.OnState;
import org.openhab.binding.hue.internal.api.dto.clip2.Resource;
import org.openhab.binding.hue.internal.api.dto.clip2.enums.ResourceType;
import org.openhab.core.library.types.PercentType;
import org.openhab.core.types.UnDefType;
/**
* JUnit test for edge cases of OnState and Dimming event and cache resources.
*
* @author Jacob Laursen - Initial contribution
*/
@NonNullByDefault
class OnStateDimmingEdgeCaseTest {
@Test
void getBrightnessStateWhenDimmingMissingReturnNull() {
assertThat(createLightResource(true, null).getBrightnessState(), is(equalTo(UnDefType.NULL)));
}
@Test
void getBrightnessStateWhenOnAndDimming75ReturnBrightness75() {
assertThat(createLightResource(true, 75.0).getBrightnessState(), is(equalTo(new PercentType(75))));
}
@Test
void getBrightnessStateWhenOnAndDimming125ReturnBrightness100() {
assertThat(createLightResource(true, 125.0).getBrightnessState(), is(equalTo(new PercentType(100))));
}
@Test
void getBrightnessStateWhenOffAndDimming100ReturnBrightness0() {
assertThat(createLightResource(false, 100.0).getBrightnessState(), is(equalTo(new PercentType(0))));
}
@Test
void getBrightnessStateWhenOnStateMissingAndDimming0ReturnMinimumBrightness0() {
assertThat(createLightResource(null, 0.0).getBrightnessState(),
is(equalTo(new PercentType(new BigDecimal(Dimming.DEFAULT_MINIMUM_DIMMIMG_LEVEL)))));
}
@Test
void getBrightnessStateWhenOnStateMissingAndDimming100ReturnBrightness100() {
assertThat(createLightResource(null, 100.0).getBrightnessState(), is(equalTo(new PercentType(100))));
}
@Test
void getBrightnessStateWhenOnStateMissingAndDimmingMinus1ReturnMinimumBrightness() {
assertThat(createLightResource(null, -1.0).getBrightnessState(),
is(equalTo(new PercentType(new BigDecimal(Dimming.DEFAULT_MINIMUM_DIMMIMG_LEVEL)))));
}
@Test
void getBrightnessStateWhenOnAndDimmingMinus1ReturnMinimumBrightness() {
assertThat(createLightResource(true, -1.0).getBrightnessState(),
is(equalTo(new PercentType(new BigDecimal(Dimming.DEFAULT_MINIMUM_DIMMIMG_LEVEL)))));
}
@Test
void getBrightnessStateWhenOnAndDimming0ReturnMinimumBrightness() {
assertThat(createLightResource(true, 0.0).getBrightnessState(),
is(equalTo(new PercentType(new BigDecimal(Dimming.DEFAULT_MINIMUM_DIMMIMG_LEVEL)))));
}
@Test
void getBrightnessStateWhenOnAndDimming0ReturnCustomMinimumBrightness() {
assertThat(createLightResource(true, 0.0, 2.0).getBrightnessState(), is(equalTo(new PercentType(2))));
}
private Resource createLightResource(@Nullable Boolean on, @Nullable Double brightness) {
return createLightResource(on, brightness, null);
}
private Resource createLightResource(@Nullable Boolean on, @Nullable Double brightness,
@Nullable Double minimumDimmingLevel) {
Resource resource = new Resource(ResourceType.LIGHT);
if (on != null) {
OnState onState = new OnState();
onState.setOn(on);
resource.setOnState(onState);
}
if (brightness != null) {
Dimming dimming = new Dimming();
dimming.setBrightness(brightness);
if (minimumDimmingLevel != null) {
dimming.setMinimumDimmingLevel(minimumDimmingLevel);
}
resource.setDimming(dimming);
}
return resource;
}
}