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] Improve color setting (API v2) #16436

Merged
merged 10 commits into from
Apr 3, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ public Resource(@Nullable ResourceType resourceType) {
/**
* Check if <code>light</code> or <code>grouped_light</code> resource contains any
* relevant fields to process according to its type.
*
*
* As an example, {@link #colorTemperature} is relevant for a <code>light</code>
* resource because it's needed for updating the color-temperature channels.
*
Expand Down Expand Up @@ -285,9 +285,7 @@ public State getColorState() {
ColorXy color = this.color;
if (Objects.nonNull(color)) {
try {
Gamut gamut = color.getGamut();
gamut = Objects.nonNull(gamut) ? gamut : ColorUtil.DEFAULT_GAMUT;
HSBType hsb = ColorUtil.xyToHsb(color.getXY(), gamut);
HSBType hsb = ColorUtil.xyToHsb(color.getXY());
OnState on = this.on;
Dimming dimming = this.dimming;
double brightness = Objects.nonNull(on) && !on.isOn() ? 0
Expand Down Expand Up @@ -354,9 +352,7 @@ public State getColorXyState() {
ColorXy color = this.color;
if (Objects.nonNull(color)) {
try {
Gamut gamut = color.getGamut();
gamut = Objects.nonNull(gamut) ? gamut : ColorUtil.DEFAULT_GAMUT;
HSBType hsb = ColorUtil.xyToHsb(color.getXY(), gamut);
HSBType hsb = ColorUtil.xyToHsb(color.getXY());
return new HSBType(hsb.getHue(), hsb.getSaturation(), PercentType.HUNDRED);
} catch (DTOPresentButEmptyException e) {
return UnDefType.UNDEF; // indicates the DTO is present but its inner fields are missing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,10 @@ public class Setters {
* @return the target resource.
*/
public static Resource setAlert(Resource target, Command command, @Nullable Resource source) {
if ((command instanceof StringType) && Objects.nonNull(source)) {
if ((command instanceof StringType alert) && Objects.nonNull(source)) {
Alerts otherAlert = source.getAlerts();
if (Objects.nonNull(otherAlert)) {
ActionType actionType = ActionType.of(((StringType) command).toString());
ActionType actionType = ActionType.of(alert.toString());
if (otherAlert.getActionValues().contains(actionType)) {
target.setAlerts(new Alerts().setAction(actionType));
}
Expand All @@ -98,8 +98,7 @@ public static Resource setAlert(Resource target, Command command, @Nullable Reso
*/
public static Resource setColorTemperatureAbsolute(Resource target, Command command, @Nullable Resource source) {
QuantityType<?> mirek;
if (command instanceof QuantityType<?>) {
QuantityType<?> quantity = (QuantityType<?>) command;
if (command instanceof QuantityType<?> quantity) {
Unit<?> unit = quantity.getUnit();
if (Units.KELVIN.equals(unit)) {
mirek = quantity.toInvertibleUnit(Units.MIRED);
Expand All @@ -109,9 +108,8 @@ public static Resource setColorTemperatureAbsolute(Resource target, Command comm
QuantityType<?> kelvin = quantity.toInvertibleUnit(Units.KELVIN);
mirek = Objects.nonNull(kelvin) ? kelvin.toInvertibleUnit(Units.MIRED) : null;
}
} else if (command instanceof DecimalType) {
mirek = QuantityType.valueOf(((DecimalType) command).doubleValue(), Units.KELVIN)
.toInvertibleUnit(Units.MIRED);
} else if (command instanceof DecimalType decimal) {
mirek = QuantityType.valueOf(decimal.doubleValue(), Units.KELVIN).toInvertibleUnit(Units.MIRED);
} else {
mirek = null;
}
Expand Down Expand Up @@ -141,15 +139,15 @@ public static Resource setColorTemperatureAbsolute(Resource target, Command comm
* @return the target resource.
*/
public static Resource setColorTemperaturePercent(Resource target, Command command, @Nullable Resource source) {
if (command instanceof PercentType) {
if (command instanceof PercentType mirek) {
MirekSchema schema = target.getMirekSchema();
schema = Objects.nonNull(schema) ? schema : Objects.nonNull(source) ? source.getMirekSchema() : null;
schema = Objects.nonNull(schema) ? schema : MirekSchema.DEFAULT_SCHEMA;
ColorTemperature colorTemperature = target.getColorTemperature();
colorTemperature = Objects.nonNull(colorTemperature) ? colorTemperature : new ColorTemperature();
double min = schema.getMirekMinimum();
double max = schema.getMirekMaximum();
double val = min + ((max - min) * ((PercentType) command).doubleValue() / 100f);
double val = min + ((max - min) * mirek.doubleValue() / 100f);
target.setColorTemperature(colorTemperature.setMirek(val));
}
return target;
Expand All @@ -168,13 +166,10 @@ public static Resource setColorTemperaturePercent(Resource target, Command comma
* @return the target resource.
*/
public static Resource setColorXy(Resource target, Command command, @Nullable Resource source) {
if (command instanceof HSBType) {
Gamut gamut = target.getGamut();
gamut = Objects.nonNull(gamut) ? gamut : Objects.nonNull(source) ? source.getGamut() : null;
gamut = Objects.nonNull(gamut) ? gamut : ColorUtil.DEFAULT_GAMUT;
HSBType hsb = (HSBType) command;
if (command instanceof HSBType hsb) {
hsb = new HSBType(hsb.getHue(), hsb.getSaturation(), PercentType.HUNDRED);
ColorXy color = target.getColorXy();
target.setColorXy((Objects.nonNull(color) ? color : new ColorXy()).setXY(ColorUtil.hsbToXY(hsb, gamut)));
target.setColorXy((Objects.nonNull(color) ? color : new ColorXy()).setXY(ColorUtil.hsbToXY(hsb)));
}
return target;
}
Expand All @@ -191,11 +186,10 @@ public static Resource setColorXy(Resource target, Command command, @Nullable Re
* @return the target resource.
*/
public static Resource setDimming(Resource target, Command command, @Nullable Resource source) {
if (command instanceof PercentType) {
if (command instanceof PercentType brightness) {
Double min = target.getMinimumDimmingLevel();
min = Objects.nonNull(min) ? min : Objects.nonNull(source) ? source.getMinimumDimmingLevel() : null;
min = Objects.nonNull(min) ? min : Dimming.DEFAULT_MINIMUM_DIMMIMG_LEVEL;
PercentType brightness = (PercentType) command;
if (brightness.doubleValue() < min.doubleValue()) {
brightness = new PercentType(new BigDecimal(min, Resource.PERCENT_MATH_CONTEXT));
}
Expand All @@ -219,8 +213,8 @@ public static Resource setDimming(Resource target, Command command, @Nullable Re
* @return the target resource.
*/
public static Resource setEffect(Resource target, Command command, @Nullable Resource source) {
if ((command instanceof StringType) && Objects.nonNull(source)) {
EffectType commandEffectType = EffectType.of(((StringType) command).toString());
if ((command instanceof StringType effect) && Objects.nonNull(source)) {
EffectType commandEffectType = EffectType.of(effect.toString());
Effects sourceFixedEffects = source.getFixedEffects();
if (Objects.nonNull(sourceFixedEffects) && sourceFixedEffects.allows(commandEffectType)) {
target.setFixedEffects(new Effects().setEffect(commandEffectType));
Expand Down