]> git.basschouten.com Git - openhab-addons.git/commitdiff
[hue] Improve color setting (#16436)
authorAndrew Fiddian-Green <software@whitebear.ch>
Wed, 3 Apr 2024 10:17:48 +0000 (11:17 +0100)
committerGitHub <noreply@github.com>
Wed, 3 Apr 2024 10:17:48 +0000 (12:17 +0200)
* [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 <software@whitebear.ch>
bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/api/dto/clip2/Resource.java
bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/api/dto/clip2/helper/Setters.java

index 35c9c6863042fa45d1bb3ba5b516111ae7cd952d..6cae9c1e5904ba175a2d72e767f7e5c62f54840c 100644 (file)
@@ -123,7 +123,7 @@ public class Resource {
     /**
      * 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.
      *
@@ -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
index e59b78482e9f9b37662970a14f4115b36f9b8c51..641bab0fd40709cd37886d1c5fd87fd62226aaa4 100644 (file)
@@ -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));