]> git.basschouten.com Git - openhab-addons.git/commitdiff
Adds a RepresentationProperty to discovery to avoid duplicate inobx entries (#11941)
authorDan Cunningham <dan@digitaldan.com>
Mon, 3 Jan 2022 08:22:45 +0000 (00:22 -0800)
committerGitHub <noreply@github.com>
Mon, 3 Jan 2022 08:22:45 +0000 (09:22 +0100)
Signed-off-by: Dan Cunningham <dan@digitaldan.com>
bundles/org.openhab.binding.harmonyhub/pom.xml
bundles/org.openhab.binding.harmonyhub/src/main/java/org/openhab/binding/harmonyhub/internal/HarmonyHubBindingConstants.java
bundles/org.openhab.binding.harmonyhub/src/main/java/org/openhab/binding/harmonyhub/internal/discovery/HarmonyHubDiscoveryService.java
bundles/org.openhab.binding.harmonyhub/src/main/java/org/openhab/binding/harmonyhub/internal/handler/HarmonyHubHandler.java

index 2a9a528582b7facfc670238136062dc9ba9a6002..a7025366063fcadfafe5b6249bec6eef0a81ca9e 100644 (file)
@@ -22,7 +22,7 @@
     <dependency>
       <groupId>com.github.digitaldan</groupId>
       <artifactId>harmony-client</artifactId>
-      <version>1.1.5</version>
+      <version>1.1.6</version>
       <scope>compile</scope>
     </dependency>
   </dependencies>
index d3757c29ca85bb0010181c592aeb841ba27222d3..a1b29acbc54cea41968fef36b9c3cb75e4f6f3c7 100644 (file)
@@ -42,7 +42,7 @@ public class HarmonyHubBindingConstants {
     public static final String DEVICE_PROPERTY_ID = "id";
     public static final String DEVICE_PROPERTY_NAME = "name";
 
-    public static final String HUB_PROPERTY_ID = "id";
+    public static final String HUB_PROPERTY_ID = "uuid";
     public static final String HUB_PROPERTY_HOST = "host";
     public static final String HUB_PROPERTY_NAME = "name";
 }
index 4ca2663a4cf1d5036399235408788c0d6b4274b7..a23f79d0a025f4b79a44046955ff07837fe0c6d3 100644 (file)
@@ -255,10 +255,12 @@ public class HarmonyHubDiscoveryService extends AbstractDiscoveryService {
                         String friendlyName = properties.get("friendlyName");
                         String hostName = properties.get("host_name");
                         String ip = properties.get("ip");
+                        String uuid = properties.get("uuid");
                         if (friendlyName != null && !friendlyName.isBlank() && hostName != null && !hostName.isBlank()
-                                && ip != null && !ip.isBlank() && !responses.contains(hostName)) {
+                                && ip != null && !ip.isBlank() && uuid != null && !uuid.isBlank()
+                                && !responses.contains(hostName)) {
                             responses.add(hostName);
-                            hubDiscovered(ip, friendlyName, hostName);
+                            hubDiscovered(ip, friendlyName, hostName, uuid);
                         }
                     }
                 } catch (IOException | IndexOutOfBoundsException e) {
@@ -270,7 +272,7 @@ public class HarmonyHubDiscoveryService extends AbstractDiscoveryService {
         }
     }
 
-    private void hubDiscovered(String ip, String friendlyName, String hostName) {
+    private void hubDiscovered(String ip, String friendlyName, String hostName, String uuid) {
         String thingId = hostName.replaceAll("[^A-Za-z0-9\\-_]", "");
         logger.trace("Adding HarmonyHub {} ({}) at host {}", friendlyName, thingId, ip);
         ThingUID uid = new ThingUID(HARMONY_HUB_THING_TYPE, thingId);
@@ -279,6 +281,8 @@ public class HarmonyHubDiscoveryService extends AbstractDiscoveryService {
                 .withLabel("HarmonyHub " + friendlyName)
                 .withProperty(HUB_PROPERTY_HOST, ip)
                 .withProperty(HUB_PROPERTY_NAME, friendlyName)
+                .withProperty(HUB_PROPERTY_ID, uuid)
+                .withRepresentationProperty(HUB_PROPERTY_ID)
                 .build());
         // @formatter:on
     }
index eb974d0f741330ccf5016f27224941702bcd37a8..8a421e87e2b28a86c72779b61782810719b44c67 100644 (file)
@@ -19,6 +19,7 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -59,6 +60,7 @@ import com.digitaldan.harmony.HarmonyClientListener;
 import com.digitaldan.harmony.config.Activity;
 import com.digitaldan.harmony.config.Activity.Status;
 import com.digitaldan.harmony.config.HarmonyConfig;
+import com.digitaldan.harmony.config.Ping;
 
 /**
  * The {@link HarmonyHubHandler} is responsible for handling commands for Harmony Hubs, which are
@@ -88,6 +90,7 @@ public class HarmonyHubHandler extends BaseBridgeHandler implements HarmonyClien
     private final HarmonyClient client;
     private @Nullable ScheduledFuture<?> retryJob;
     private @Nullable ScheduledFuture<?> heartBeatJob;
+    private boolean propertiesUpdated;
 
     private int heartBeatInterval;
 
@@ -183,7 +186,7 @@ public class HarmonyHubHandler extends BaseBridgeHandler implements HarmonyClien
         config = getConfigAs(HarmonyHubConfig.class);
         cancelRetry();
         updateStatus(ThingStatus.UNKNOWN);
-        retryJob = scheduler.schedule(this::connect, 0, TimeUnit.SECONDS);
+        scheduleRetry(0);
     }
 
     @Override
@@ -221,12 +224,18 @@ public class HarmonyHubHandler extends BaseBridgeHandler implements HarmonyClien
     public void hubConnected() {
         heartBeatJob = scheduler.scheduleWithFixedDelay(() -> {
             try {
-                client.sendPing();
+                Ping ping = client.sendPing().get();
+                if (!propertiesUpdated) {
+                    Map<String, String> properties = editProperties();
+                    properties.put(HUB_PROPERTY_ID, ping.getUuid());
+                    updateProperties(properties);
+                    propertiesUpdated = true;
+                }
             } catch (Exception e) {
                 logger.debug("heartbeat failed", e);
                 setOfflineAndReconnect("Hearbeat failed");
             }
-        }, heartBeatInterval, heartBeatInterval, TimeUnit.SECONDS);
+        }, 5, heartBeatInterval, TimeUnit.SECONDS);
         updateStatus(ThingStatus.ONLINE);
         getConfigFuture().thenAcceptAsync(harmonyConfig -> updateCurrentActivityChannel(harmonyConfig), scheduler)
                 .exceptionally(e -> {
@@ -294,7 +303,7 @@ public class HarmonyHubHandler extends BaseBridgeHandler implements HarmonyClien
 
     private void setOfflineAndReconnect(String error) {
         disconnectFromHub();
-        retryJob = scheduler.schedule(this::connect, RETRY_TIME, TimeUnit.SECONDS);
+        scheduleRetry(RETRY_TIME);
         updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, error);
     }
 
@@ -305,6 +314,11 @@ public class HarmonyHubHandler extends BaseBridgeHandler implements HarmonyClien
         }
     }
 
+    private synchronized void scheduleRetry(int retrySeconds) {
+        cancelRetry();
+        retryJob = scheduler.schedule(this::connect, retrySeconds, TimeUnit.SECONDS);
+    }
+
     private void updateState(@Nullable Activity activity) {
         if (activity != null) {
             logger.debug("Updating current activity to {}", activity.getLabel());