From d5f0e317a7f45ebe26c85d5ffa72e5f756dc91ab Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Wed, 3 Apr 2024 11:17:48 +0100 Subject: [PATCH] [hue] Improve color setting (#16436) * [hue] fix xy conversion when B is 0 * [hue] remove gamut correction; let Hue bridge do it instead * [hue] fix gamma round trips; modernize instanceof syntax Signed-off-by: Andrew Fiddian-Green Signed-off-by: Ciprian Pascu --- .../hue/internal/api/dto/clip2/Resource.java | 10 ++---- .../api/dto/clip2/helper/Setters.java | 32 ++++++++----------- 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/api/dto/clip2/Resource.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/api/dto/clip2/Resource.java index 35c9c686304..6cae9c1e590 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/api/dto/clip2/Resource.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/api/dto/clip2/Resource.java @@ -123,7 +123,7 @@ public class Resource { /** * Check if light or grouped_light resource contains any * relevant fields to process according to its type. - * + * * As an example, {@link #colorTemperature} is relevant for a light * resource because it's needed for updating the color-temperature channels. * @@ -285,9 +285,7 @@ public class Resource { 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 @@ -354,9 +352,7 @@ public class Resource { 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 diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/api/dto/clip2/helper/Setters.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/api/dto/clip2/helper/Setters.java index e59b78482e9..641bab0fd40 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/api/dto/clip2/helper/Setters.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/api/dto/clip2/helper/Setters.java @@ -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)); } @@ -98,8 +98,7 @@ public class Setters { */ 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); @@ -109,9 +108,8 @@ public class Setters { 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; } @@ -141,7 +139,7 @@ public class Setters { * @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; @@ -149,7 +147,7 @@ public class Setters { 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; @@ -168,13 +166,10 @@ public class Setters { * @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; } @@ -191,11 +186,10 @@ public class Setters { * @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)); } @@ -219,8 +213,8 @@ public class Setters { * @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));