]> git.basschouten.com Git - openhab-addons.git/commitdiff
[remoteopenhab] Consider ItemStateChangedEvent events when relevant (#9243)
authorlolodomo <lg.hc@free.fr>
Wed, 9 Dec 2020 18:58:34 +0000 (19:58 +0100)
committerGitHub <noreply@github.com>
Wed, 9 Dec 2020 18:58:34 +0000 (19:58 +0100)
Fix #9190

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/handler/RemoteopenhabBridgeHandler.java
bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/listener/RemoteopenhabItemsDataListener.java
bundles/org.openhab.binding.remoteopenhab/src/main/java/org/openhab/binding/remoteopenhab/internal/rest/RemoteopenhabRestClient.java

index ff82b104504572ff6a04f71f9c8a41f1bf6fcad6..bc3a199dfbfa9d5c9a3ab540d87306b96d7d6133 100644 (file)
@@ -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<ChannelUID, State> 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(),
index eb4e502d4273b4953aeec22c9e4fcf5271187520..ca9f217ef34f1e0e429da2ebad2134c716fcf10d 100644 (file)
@@ -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.
index 84ded57155eaff8da49bf7b505e3223d2e232cb9..fc6e4a5de28cd07c84946b6f11a81df078af6a98 100644 (file)
@@ -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":