]> git.basschouten.com Git - openhab-addons.git/commitdiff
Changed default color mode for color commands to XY (#11036)
authorChristoph Weitkamp <github@christophweitkamp.de>
Sat, 24 Jul 2021 19:23:51 +0000 (21:23 +0200)
committerGitHub <noreply@github.com>
Sat, 24 Jul 2021 19:23:51 +0000 (21:23 +0200)
Signed-off-by: Christoph Weitkamp <github@christophweitkamp.de>
bundles/org.openhab.binding.deconz/README.md
bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/GroupAction.java
bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/GroupThingHandler.java
bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/LightThingHandler.java
bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/ThingConfig.java
bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/config/config.xml
bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/thing/group-thing-types.xml

index ef762dfa51ecd077bc5ffcf3633d06a4c0626875..22ef7af1e7fd43f73a0f3ebac807e98d179f9b4a 100644 (file)
@@ -89,7 +89,7 @@ The transition time is the time to move between two states and is configured in
 The resolution provided is 1/10s.
 If no value is provided, the default value of the device is used.
 
-`extendedcolorlight` and `colorlight` have different modes for setting the color.
+`extendedcolorlight`, `colorlight` and `lightgroup` have different modes for setting the color.
 Some devices accept only XY, others HSB, others both modes and the binding tries to autodetect the correct mode.
 If this fails, the advanced `colormode` parameter can be set to `xy` or `hs`.
 
index 87fa4a10dcff58ed891731ec2e03f52056319105..3044ec7d8252ba7cd78b67aca5a57967a856b123 100644 (file)
@@ -33,14 +33,16 @@ public class GroupAction {
     public @Nullable Integer ct;
     public double @Nullable [] xy;
     public @Nullable String alert;
+    public @Nullable String colormode;
     public @Nullable String effect;
     public @Nullable Integer colorloopspeed;
     public @Nullable Integer transitiontime;
 
     @Override
     public String toString() {
-        return "GroupAction{" + "on=" + on + ", toggle=" + toggle + ", bri=" + bri + ", hue=" + hue + ", sat=" + sat
-                + ", ct=" + ct + ", xy=" + Arrays.toString(xy) + ", alert='" + alert + '\'' + ", effect='" + effect
-                + '\'' + ", colorloopspeed=" + colorloopspeed + ", transitiontime=" + transitiontime + '}';
+        return "GroupAction{on=" + on + ", toggle=" + toggle + ", bri=" + bri + ", hue=" + hue + ", sat=" + sat
+                + ", ct=" + ct + ", xy=" + Arrays.toString(xy) + ", alert='" + alert + "', colormode='" + colormode
+                + "', effect='" + effect + "', colorloopspeed=" + colorloopspeed + ", transitiontime=" + transitiontime
+                + "}";
     }
 }
index 7a30eb98d04ab8b1adc9fd539ea3c8a4bb3d1f9f..d1642cfb967c1c0f7ceae17b7772808fee85caa9 100644 (file)
@@ -59,6 +59,7 @@ public class GroupThingHandler extends DeconzBaseThingHandler {
 
     private Map<String, String> scenes = Map.of();
     private GroupState groupStateCache = new GroupState();
+    private String colorMode = "";
 
     public GroupThingHandler(Thing thing, Gson gson,
             DeconzDynamicCommandDescriptionProvider commandDescriptionProvider) {
@@ -66,6 +67,14 @@ public class GroupThingHandler extends DeconzBaseThingHandler {
         this.commandDescriptionProvider = commandDescriptionProvider;
     }
 
+    @Override
+    public void initialize() {
+        ThingConfig thingConfig = getConfigAs(ThingConfig.class);
+        colorMode = thingConfig.colormode;
+
+        super.initialize();
+    }
+
     @Override
     public void handleCommand(ChannelUID channelUID, Command command) {
         String channelId = channelUID.getId();
@@ -89,11 +98,17 @@ public class GroupThingHandler extends DeconzBaseThingHandler {
             case CHANNEL_COLOR:
                 if (command instanceof HSBType) {
                     HSBType hsbCommand = (HSBType) command;
-                    Integer bri = Util.fromPercentType(hsbCommand.getBrightness());
-                    newGroupAction.bri = bri;
-                    if (bri > 0) {
+                    // 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.
+                    if ("hs".equals(colorMode)) {
                         newGroupAction.hue = (int) (hsbCommand.getHue().doubleValue() * HUE_FACTOR);
                         newGroupAction.sat = Util.fromPercentType(hsbCommand.getSaturation());
+                    } else {
+                        PercentType[] xy = hsbCommand.toXY();
+                        if (xy.length < 2) {
+                            logger.warn("Failed to convert {} to xy-values", command);
+                        }
+                        newGroupAction.xy = new double[] { xy[0].doubleValue() / 100.0, xy[1].doubleValue() / 100.0 };
                     }
                 } else if (command instanceof PercentType) {
                     newGroupAction.bri = Util.fromPercentType((PercentType) command);
@@ -172,6 +187,16 @@ public class GroupThingHandler extends DeconzBaseThingHandler {
                 thing.getChannels().stream().map(c -> c.getUID().getId()).forEach(c -> valueUpdated(c, groupState));
                 groupStateCache = groupState;
             }
+            GroupAction groupAction = groupMessage.action;
+            if (groupAction != null) {
+                if (colorMode.isEmpty()) {
+                    String cmode = groupAction.colormode;
+                    if (cmode != null && ("hs".equals(cmode) || "xy".equals(cmode))) {
+                        // only set the color mode if it is hs or xy, not ct
+                        colorMode = cmode;
+                    }
+                }
+            }
         }
     }
 }
index 4a6a81328b48165e9ab251792c043f1d0e03d7b4..3a5594629b57b8e787637e813d67613d8c6f15f6 100644 (file)
@@ -210,19 +210,19 @@ public class LightThingHandler extends DeconzBaseThingHandler {
                     }
                 } else if (command instanceof HSBType) {
                     HSBType hsbCommand = (HSBType) command;
-                    if ("xy".equals(colorMode)) {
+                    // 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.
+                    if ("hs".equals(colorMode)) {
+                        newLightState.hue = (int) (hsbCommand.getHue().doubleValue() * HUE_FACTOR);
+                        newLightState.sat = Util.fromPercentType(hsbCommand.getSaturation());
+                    } else {
                         PercentType[] xy = hsbCommand.toXY();
                         if (xy.length < 2) {
                             logger.warn("Failed to convert {} to xy-values", command);
                         }
                         newLightState.xy = new double[] { xy[0].doubleValue() / 100.0, xy[1].doubleValue() / 100.0 };
-                        newLightState.bri = Util.fromPercentType(hsbCommand.getBrightness());
-                    } else {
-                        // default is colormode "hs" (used when colormode "hs" is set or colormode is unknown)
-                        newLightState.bri = Util.fromPercentType(hsbCommand.getBrightness());
-                        newLightState.hue = (int) (hsbCommand.getHue().doubleValue() * HUE_FACTOR);
-                        newLightState.sat = Util.fromPercentType(hsbCommand.getSaturation());
                     }
+                    newLightState.bri = Util.fromPercentType(hsbCommand.getBrightness());
                 } else if (command instanceof PercentType) {
                     newLightState.bri = Util.fromPercentType((PercentType) command);
                 } else if (command instanceof DecimalType) {
index 9d26ba31dc55c4126ebf134ef00d4123f0006bfa..a3c69e82a700b3fc4ea6f44dc16b8b061f05a904 100644 (file)
@@ -23,7 +23,7 @@ import org.eclipse.jdt.annotation.Nullable;
 @NonNullByDefault
 public class ThingConfig {
     public String id = "";
-    public int lastSeenPolling = 1440;
     public @Nullable Double transitiontime;
     public String colormode = "";
+    public int lastSeenPolling = 1440;
 }
index dc7cc066551097d4b0e3c95f29f01094d00daaca..bd0b4fab2fc77b7a22d73c57b3915e3be6709dc0 100644 (file)
                        <context>network-address</context>
                        <description>IP address or host name of deCONZ interface.</description>
                </parameter>
-               <parameter name="httpPort" type="integer" required="false" min="1" max="65535">
+               <parameter name="httpPort" type="integer" min="1" max="65535">
                        <label>HTTP Port</label>
                        <description>Port of the deCONZ HTTP interface.</description>
                        <default>80</default>
                </parameter>
-               <parameter name="port" type="integer" required="false" min="1" max="65535">
+               <parameter name="port" type="integer" min="1" max="65535">
                        <label>Websocket Port</label>
                        <description>Port of the deCONZ Websocket.</description>
                        <advanced>true</advanced>
                </parameter>
-               <parameter name="apikey" type="text" required="false">
+               <parameter name="apikey" type="text">
                        <label>API Key</label>
                        <context>password</context>
                        <description>If no API Key is provided, a new one will be requested. You need to authorize the access on the deCONZ
                                web interface.</description>
                </parameter>
-               <parameter name="timeout" type="integer" required="false" unit="ms" min="0">
+               <parameter name="timeout" type="integer" unit="ms" min="0">
                        <label>Timeout</label>
                        <description>Timeout for asynchronous HTTP requests (in milliseconds).</description>
                        <advanced>true</advanced>
@@ -52,7 +52,7 @@
                        <label>Device ID</label>
                        <description>The deCONZ bridge assigns an integer number ID to each device.</description>
                </parameter>
-               <parameter name="transitiontime" type="decimal" required="false" min="0" unit="s">
+               <parameter name="transitiontime" type="decimal" min="0" unit="s">
                        <label>Transition Time</label>
                        <description>Time to move between two states. If empty, the default of the device is used. Resolution is 1/10 second.</description>
                </parameter>
                        <label>Device ID</label>
                        <description>The deCONZ bridge assigns an integer number ID to each device.</description>
                </parameter>
-               <parameter name="transitiontime" type="decimal" required="false" min="0" unit="s">
+               <parameter name="transitiontime" type="decimal" min="0" unit="s">
                        <label>Transition Time</label>
                        <description>Time to move between two states. If empty, the default of the device is used. Resolution is 1/10 second.</description>
                </parameter>
-               <parameter name="colormode" type="text" required="false">
+               <parameter name="colormode" type="text">
                        <label>Color Mode</label>
                        <description>Override the default color mode (auto-detect)</description>
                        <options>
                </parameter>
        </config-description>
 
+       <config-description uri="thing-type:deconz:lightgroup">
+               <parameter name="id" type="text" required="true">
+                       <label>Device ID</label>
+                       <description>The deCONZ bridge assigns an integer number ID to each group.</description>
+               </parameter>
+               <parameter name="colormode" type="text">
+                       <label>Color Mode</label>
+                       <description>Override the default color mode (auto-detect)</description>
+                       <options>
+                               <option value="hs">HSB</option>
+                               <option value="xy">XY</option>
+                       </options>
+                       <advanced>true</advanced>
+               </parameter>
+       </config-description>
 </config-description:config-descriptions>
index dda79246633f2f4f69cd92bd08a3733e3467d3eb..7a0fb8266e98285c7c69e3ba7cf36b197377e118 100644 (file)
@@ -21,7 +21,7 @@
 
                <representation-property>uid</representation-property>
 
-               <config-description-ref uri="thing-type:deconz:sensor"/>
+               <config-description-ref uri="thing-type:deconz:lightgroup"/>
        </thing-type>
 
        <channel-type id="all_on">