]> git.basschouten.com Git - openhab-addons.git/commitdiff
[velux] softer initialization if bridge unreachable (#14817)
authorAndrew Fiddian-Green <software@whitebear.ch>
Thu, 11 May 2023 14:26:25 +0000 (15:26 +0100)
committerGitHub <noreply@github.com>
Thu, 11 May 2023 14:26:25 +0000 (16:26 +0200)
Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch>
bundles/org.openhab.binding.velux/src/main/java/org/openhab/binding/velux/internal/handler/VeluxBridgeHandler.java

index 80a46c9658e764dcc1d8698e5204057eca6cbe1a..c85fca7a87774d42960617f3904043d43e7e4451 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.velux.internal.handler;
 
+import java.io.IOException;
+import java.net.InetAddress;
 import java.time.Duration;
 import java.time.Instant;
 import java.util.Collection;
@@ -163,6 +165,7 @@ public class VeluxBridgeHandler extends ExtendedBaseBridgeHandler implements Vel
     private VeluxBridgeConfiguration veluxBridgeConfiguration = new VeluxBridgeConfiguration();
 
     private Duration offlineDelay = Duration.ofMinutes(5);
+    private int initializeRetriesDone = 0;
 
     /*
      * ************************
@@ -298,6 +301,8 @@ public class VeluxBridgeHandler extends ExtendedBaseBridgeHandler implements Vel
         offlineDelay = Duration.ofMillis(
                 ((long) Math.pow(2, veluxBridgeConfiguration.retries + 1) - 1) * veluxBridgeConfiguration.refreshMSecs);
 
+        initializeRetriesDone = 0;
+
         scheduler.execute(() -> {
             disposing = false;
             initializeSchedulerJob();
@@ -316,6 +321,17 @@ public class VeluxBridgeHandler extends ExtendedBaseBridgeHandler implements Vel
             logger.trace("initializeSchedulerJob(): adopt new bridge configuration parameters.");
             bridgeParamsUpdated();
 
+            if ((thing.getStatus() == ThingStatus.OFFLINE)
+                    && (thing.getStatusInfo().getStatusDetail() == ThingStatusDetail.COMMUNICATION_ERROR)) {
+                if (initializeRetriesDone <= veluxBridgeConfiguration.retries) {
+                    initializeRetriesDone++;
+                    scheduler.schedule(() -> initializeSchedulerJob(),
+                            ((long) Math.pow(2, initializeRetriesDone) * veluxBridgeConfiguration.timeoutMsecs),
+                            TimeUnit.MILLISECONDS);
+                }
+                return;
+            }
+
             long mSecs = veluxBridgeConfiguration.refreshMSecs;
             logger.trace("initializeSchedulerJob(): scheduling refresh at {} milliseconds.", mSecs);
             refreshSchedulerJob = scheduler.scheduleWithFixedDelay(() -> {
@@ -448,7 +464,16 @@ public class VeluxBridgeHandler extends ExtendedBaseBridgeHandler implements Vel
             logger.trace("bridgeParamsUpdated() done.");
             return;
         }
-
+        try {
+            InetAddress bridgeAddress = InetAddress.getByName(veluxBridgeConfiguration.ipAddress);
+            if (!bridgeAddress.isReachable(veluxBridgeConfiguration.timeoutMsecs)) {
+                throw new IOException();
+            }
+        } catch (IOException e) {
+            logger.debug("bridgeParamsUpdated(): Bridge ip address not reachable.");
+            updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR);
+            return;
+        }
         logger.trace("bridgeParamsUpdated(): Trying to authenticate towards bridge.");
 
         if (!thisBridge.bridgeLogin()) {