]> git.basschouten.com Git - openhab-addons.git/commitdiff
Fix scene channel updates (#16018)
authorJacob Laursen <jacob-github@vindvejr.dk>
Tue, 12 Dec 2023 07:46:29 +0000 (08:46 +0100)
committerGitHub <noreply@github.com>
Tue, 12 Dec 2023 07:46:29 +0000 (08:46 +0100)
Fixes #16000

Also-by: Andrew Fiddian-Green <software@whitebear.ch>
Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2BridgeHandler.java
bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java

index e6dd7181ea26a1dea23485ecf0ef5976f1db3499..d0374e362b03492ac3846c39d13abf8f078fc5de 100644 (file)
@@ -537,7 +537,7 @@ public class Clip2BridgeHandler extends BaseBridgeHandler {
         }
         getThing().getThings().forEach(thing -> {
             if (thing.getHandler() instanceof Clip2ThingHandler clip2ThingHandler) {
-                resources.forEach(resource -> clip2ThingHandler.onResource(resource));
+                clip2ThingHandler.onResources(resources);
             }
         });
     }
index 30a49dc3c195df630de162295b2d92c909a21970..f3e1291bcf67de5aeea741216869cd703393143f 100644 (file)
@@ -631,12 +631,38 @@ public class Clip2ThingHandler extends BaseThingHandler {
         }
     }
 
+    /**
+     * Update the channel state depending on new resources sent from the bridge.
+     *
+     * @param resources a collection of Resource objects containing the new state.
+     */
+    public void onResources(Collection<Resource> resources) {
+        boolean sceneActivated = resources.stream().anyMatch(r -> sceneContributorsCache.containsKey(r.getId())
+                && (r.getSceneActive().orElse(false) || r.getSmartSceneActive().orElse(false)));
+        for (Resource resource : resources) {
+            // Skip scene deactivation when we have also received a scene activation.
+            boolean updateChannels = !sceneActivated || !sceneContributorsCache.containsKey(resource.getId())
+                    || resource.getSceneActive().orElse(false) || resource.getSmartSceneActive().orElse(false);
+            onResource(resource, updateChannels);
+        }
+    }
+
+    /**
+     * Update the channel state depending on a new resource sent from the bridge.
+     *
+     * @param resource a Resource object containing the new state.
+     */
+    private void onResource(Resource resource) {
+        onResource(resource, true);
+    }
+
     /**
      * Update the channel state depending on a new resource sent from the bridge.
      *
      * @param resource a Resource object containing the new state.
+     * @param updateChannels update channels (otherwise only update cache/properties).
      */
-    public void onResource(Resource resource) {
+    private void onResource(Resource resource, boolean updateChannels) {
         if (disposing) {
             return;
         }
@@ -658,7 +684,7 @@ public class Clip2ThingHandler extends BaseThingHandler {
             Resource cachedResource = getResourceFromCache(resource);
             if (cachedResource != null) {
                 Setters.setResource(resource, cachedResource);
-                resourceConsumed = updateChannels(resource);
+                resourceConsumed = updateChannels && updateChannels(resource);
                 putResourceToCache(resource);
                 if (ResourceType.LIGHT == resource.getType() && !updateLightPropertiesDone) {
                     updateLightProperties(resource);