Fix scene channel updates (#16018)

Fixes #16000

Also-by: Andrew Fiddian-Green <software@whitebear.ch>

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
This commit is contained in:
Jacob Laursen 2023-12-12 08:46:29 +01:00 committed by GitHub
parent ccdb851085
commit f45630064a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 3 deletions

View 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);
}
});
}

View 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.
*/
public void onResource(Resource resource) {
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).
*/
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);