diff --git a/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/handler/RemoteopenhabBridgeHandler.java b/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/handler/RemoteopenhabBridgeHandler.java index ff82b1045..bc3a199df 100644 --- a/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/handler/RemoteopenhabBridgeHandler.java +++ b/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/handler/RemoteopenhabBridgeHandler.java @@ -22,7 +22,9 @@ import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -112,6 +114,8 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler private @Nullable ScheduledFuture checkConnectionJob; private RemoteopenhabRestClient restClient; + private Map channelsLastStates = new HashMap<>(); + public RemoteopenhabBridgeHandler(Bridge bridge, HttpClient httpClient, HttpClient httpClientTrustingCert, ClientBuilder clientBuilder, SseEventSourceFactory eventSourceFactory, RemoteopenhabChannelTypeProvider channelTypeProvider, @@ -181,6 +185,7 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler logger.debug("Disposing remote openHAB handler for bridge {}", getThing().getUID()); stopStreamingUpdates(); stopCheckConnectionJob(); + channelsLastStates.clear(); } @Override @@ -192,7 +197,7 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler try { if (command instanceof RefreshType) { String state = restClient.getRemoteItemState(channelUID.getId()); - updateChannelState(channelUID.getId(), null, state); + updateChannelState(channelUID.getId(), null, state, false); } else if (isLinked(channelUID)) { restClient.sendCommandToRemoteItem(channelUID.getId(), command); String commandStr = command.toFullString(); @@ -332,7 +337,7 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler try { items = restClient.getRemoteItems("name,state"); for (RemoteopenhabItem item : items) { - updateChannelState(item.name, null, item.state); + updateChannelState(item.name, null, item.state, false); } } catch (RemoteopenhabException e) { logger.debug("{}", e.getMessage()); @@ -411,8 +416,8 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler } @Override - public void onItemStateEvent(String itemName, String stateType, String state) { - updateChannelState(itemName, stateType, state); + public void onItemStateEvent(String itemName, String stateType, String state, boolean onlyIfStateChanged) { + updateChannelState(itemName, stateType, state, onlyIfStateChanged); } @Override @@ -435,7 +440,8 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler } } - private void updateChannelState(String itemName, @Nullable String stateType, String state) { + private void updateChannelState(String itemName, @Nullable String stateType, String state, + boolean onlyIfStateChanged) { Channel channel = getThing().getChannel(itemName); if (channel == null) { logger.trace("No channel for item {}", itemName); @@ -555,6 +561,12 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler } } if (channelState != null) { + if (onlyIfStateChanged && channelState.equals(channelsLastStates.get(channel.getUID()))) { + logger.trace("ItemStateChangedEvent ignored for item {} as state is identical to the last state", + itemName); + return; + } + channelsLastStates.put(channel.getUID(), channelState); updateState(channel.getUID(), channelState); String channelStateStr = channelState.toFullString(); logger.debug("updateState {} with {}", channel.getUID(), diff --git a/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/listener/RemoteopenhabItemsDataListener.java b/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/listener/RemoteopenhabItemsDataListener.java index eb4e502d4..ca9f217ef 100644 --- a/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/listener/RemoteopenhabItemsDataListener.java +++ b/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/listener/RemoteopenhabItemsDataListener.java @@ -27,7 +27,7 @@ public interface RemoteopenhabItemsDataListener { /** * A new ItemStateEvent was published. */ - void onItemStateEvent(String itemName, String stateType, String state); + void onItemStateEvent(String itemName, String stateType, String state, boolean onlyIfStateChanged); /** * A new ItemAddedEvent was published. diff --git a/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/rest/RemoteopenhabRestClient.java b/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/rest/RemoteopenhabRestClient.java index 84ded5715..fc6e4a5de 100644 --- a/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/rest/RemoteopenhabRestClient.java +++ b/bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/rest/RemoteopenhabRestClient.java @@ -359,14 +359,20 @@ public class RemoteopenhabRestClient { case "ItemStateEvent": itemName = extractItemNameFromTopic(event.topic, event.type, "state"); payload = jsonParser.fromJson(event.payload, RemoteopenhabEventPayload.class); - itemsListeners - .forEach(listener -> listener.onItemStateEvent(itemName, payload.type, payload.value)); + itemsListeners.forEach( + listener -> listener.onItemStateEvent(itemName, payload.type, payload.value, false)); + break; + case "ItemStateChangedEvent": + itemName = extractItemNameFromTopic(event.topic, event.type, "statechanged"); + payload = jsonParser.fromJson(event.payload, RemoteopenhabEventPayload.class); + itemsListeners.forEach( + listener -> listener.onItemStateEvent(itemName, payload.type, payload.value, true)); break; case "GroupItemStateChangedEvent": itemName = extractItemNameFromTopic(event.topic, event.type, "statechanged"); payload = jsonParser.fromJson(event.payload, RemoteopenhabEventPayload.class); - itemsListeners - .forEach(listener -> listener.onItemStateEvent(itemName, payload.type, payload.value)); + itemsListeners.forEach( + listener -> listener.onItemStateEvent(itemName, payload.type, payload.value, false)); break; case "ItemAddedEvent": itemName = extractItemNameFromTopic(event.topic, event.type, "added"); @@ -414,7 +420,6 @@ public class RemoteopenhabRestClient { .forEach(listener -> listener.onChannelTriggered(triggerEvent.channel, triggerEvent.event)); break; case "ItemStatePredictedEvent": - case "ItemStateChangedEvent": case "ItemCommandEvent": case "ThingStatusInfoEvent": case "ThingUpdatedEvent":