]> git.basschouten.com Git - openhab-addons.git/commitdiff
Fix for #10982 - Binding not working properly HANDLER_REGISTERING_ERROR (#11108)
authorJan Gustafsson <jannegpriv@gmail.com>
Mon, 16 Aug 2021 12:06:16 +0000 (14:06 +0200)
committerGitHub <noreply@github.com>
Mon, 16 Aug 2021 12:06:16 +0000 (14:06 +0200)
Signed-off-by: Jan Gustafsson <jannegpriv@gmail.com>
bundles/org.openhab.binding.verisure/src/main/java/org/openhab/binding/verisure/internal/VerisureSession.java
bundles/org.openhab.binding.verisure/src/main/java/org/openhab/binding/verisure/internal/handler/VerisureBridgeHandler.java

index feb094b95aac02724e378190afa532ad8d5fe4e0..bc87dcc2323898dfc80eb6e37e0491bcfa97cb37 100644 (file)
@@ -117,8 +117,11 @@ public class VerisureSession {
     public boolean refresh() {
         try {
             if (logIn()) {
-                updateStatus();
-                return true;
+                if (updateStatus()) {
+                    return true;
+                } else {
+                    return false;
+                }
             } else {
                 return false;
             }
@@ -246,13 +249,20 @@ public class VerisureSession {
     }
 
     public @Nullable String getPinCode(BigDecimal installationId) {
-        return verisureInstallations.get(installationId).getPinCode();
+        VerisureInstallation inst = verisureInstallations.get(installationId);
+        if (inst != null) {
+            return inst.getPinCode();
+        } else {
+            logger.debug("Installation is null!");
+            return null;
+        }
     }
 
     private void setPasswordFromCookie() {
         CookieStore c = httpClient.getCookieStore();
         List<HttpCookie> cookies = c.getCookies();
-        cookies.forEach(cookie -> {
+        final List<HttpCookie> unmodifiableList = List.of(cookies.toArray(new HttpCookie[] {}));
+        unmodifiableList.forEach(cookie -> {
             logger.trace("Response Cookie: {}", cookie);
             if (cookie.getName().equals(PASSWORD_NAME)) {
                 password = cookie.getValue();
@@ -347,6 +357,9 @@ public class VerisureSession {
                     // Maybe Verisure has switched API server in use?
                     logger.debug("Changed API server! Response: {}", content);
                     setApiServerInUse(getNextApiServer());
+                } else if (content.contains("\"message\":\"Request Failed")
+                        && content.contains("Invalid session cookie")) {
+                    throw new PostToAPIException("Invalid session cookie");
                 } else {
                     String contentChomped = content.trim();
                     logger.trace("Response body: {}", content);
@@ -515,9 +528,10 @@ public class VerisureSession {
         }
     }
 
-    private void updateStatus() {
+    private boolean updateStatus() {
         logger.debug("Update status");
-        verisureInstallations.forEach((installationId, installation) -> {
+        for (Map.Entry<BigDecimal, VerisureInstallation> verisureInstallations : verisureInstallations.entrySet()) {
+            VerisureInstallation installation = verisureInstallations.getValue();
             try {
                 configureInstallationInstance(installation.getInstallationId());
                 int httpResultCode = setSessionCookieAuthLogin();
@@ -534,11 +548,14 @@ public class VerisureSession {
                     updateGatewayStatus(installation);
                 } else {
                     logger.debug("Failed to set session cookie and auth login, HTTP result code: {}", httpResultCode);
+                    return false;
                 }
-            } catch (ExecutionException | InterruptedException | TimeoutException e) {
+            } catch (ExecutionException | InterruptedException | TimeoutException | PostToAPIException e) {
                 logger.debug("Failed to update status {}", e.getMessage());
+                return false;
             }
-        });
+        }
+        return true;
     }
 
     private String createOperationJSON(String operation, VariablesDTO variables, String query) {
@@ -549,7 +566,7 @@ public class VerisureSession {
         return gson.toJson(Collections.singletonList(operationJSON));
     }
 
-    private synchronized void updateAlarmStatus(VerisureInstallation installation) {
+    private synchronized void updateAlarmStatus(VerisureInstallation installation) throws PostToAPIException {
         BigDecimal installationId = installation.getInstallationId();
         String url = START_GRAPHQL;
         String operation = "ArmState";
@@ -567,8 +584,7 @@ public class VerisureSession {
             String deviceId = "alarm" + installationId;
             thing.setDeviceId(deviceId);
             notifyListenersIfChanged(thing, installation, deviceId);
-        } catch (ExecutionException | InterruptedException | TimeoutException | JsonSyntaxException
-                | PostToAPIException e) {
+        } catch (ExecutionException | InterruptedException | TimeoutException | JsonSyntaxException e) {
             logger.warn("Failed to send a POST to the API {}", e.getMessage());
         }
     }
index a5e68c43419be83f7d6c4d430106241496d82a01..5530a131cc78d9708f8ad9aee213daa272b06ed2 100644 (file)
@@ -129,6 +129,8 @@ public class VerisureBridgeHandler extends BaseBridgeHandler {
                             logger.warn("Failed to initialize bridge, please check your credentials!");
                             updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.HANDLER_REGISTERING_ERROR,
                                     "Failed to login to Verisure, please check your credentials!");
+                            dispose();
+                            initialize();
                             return;
                         }
                         startAutomaticRefresh();