]> git.basschouten.com Git - openhab-addons.git/commitdiff
[netatmo] Take in account errored modules/devices for Security/Energy areas (#15587)
authorGaël L'hopital <gael@lhopital.org>
Mon, 25 Sep 2023 17:21:55 +0000 (19:21 +0200)
committerGitHub <noreply@github.com>
Mon, 25 Sep 2023 17:21:55 +0000 (19:21 +0200)
* Netatmo binding has to take in account errored modules/devices provided by HomeStatus api.

---------

Signed-off-by: clinique <gael@lhopital.org>
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/HomeApi.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/data/NetatmoConstants.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/dto/NAError.java [new file with mode: 0644]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/dto/NAHomeStatus.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/Capability.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/ChannelHelperCapability.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/HomeCapability.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/SecurityCapability.java
bundles/org.openhab.binding.netatmo/src/main/resources/OH-INF/i18n/netatmo.properties

index 39adb3e6a794620c78d72d0b855856921090ae98..092821b156b8541a3a12233af75ab0ec651a7007 100644 (file)
@@ -15,6 +15,7 @@ package org.openhab.binding.netatmo.internal.api;
 import static org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.*;
 
 import java.util.Collection;
+import java.util.Optional;
 import java.util.Set;
 
 import javax.ws.rs.core.UriBuilder;
@@ -25,7 +26,6 @@ import org.openhab.binding.netatmo.internal.api.data.ModuleType;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.FeatureArea;
 import org.openhab.binding.netatmo.internal.api.dto.HomeData;
 import org.openhab.binding.netatmo.internal.api.dto.NAHomeStatus;
-import org.openhab.binding.netatmo.internal.api.dto.NAHomeStatus.HomeStatus;
 import org.openhab.binding.netatmo.internal.api.dto.NAHomeStatus.NAHomeStatusResponse;
 import org.openhab.binding.netatmo.internal.handler.ApiBridgeHandler;
 
@@ -43,12 +43,10 @@ public class HomeApi extends RestManager {
         super(apiClient, FeatureArea.NONE);
     }
 
-    public @Nullable HomeStatus getHomeStatus(String homeId) throws NetatmoException {
+    public Optional<NAHomeStatus> getHomeStatus(String homeId) throws NetatmoException {
         UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_HOMESTATUS, PARAM_HOME_ID, homeId);
 
-        NAHomeStatusResponse response = get(uriBuilder, NAHomeStatusResponse.class);
-        NAHomeStatus body = response.getBody();
-        return body != null ? body.getHomeStatus().orElse(null) : null;
+        return Optional.ofNullable(get(uriBuilder, NAHomeStatusResponse.class).getBody());
     }
 
     public @Nullable HomeData getHomeData(String homeId) throws NetatmoException {
index 38de0898cb894f54447c7d275a4895d0737f221c..5f7cbae1e4cd764ecb9d4156332d435fcbc5b5b7 100644 (file)
@@ -431,4 +431,27 @@ public class NetatmoConstants {
         @SerializedName("41")
         DEVICE_IS_UNREACHABLE
     }
+
+    public enum HomeStatusError {
+        @SerializedName("1")
+        UNKNOWN_ERROR("homestatus-unknown-error"),
+        @SerializedName("2")
+        INTERNAL_ERROR("homestatus-internal-error"),
+        @SerializedName("3")
+        PARSER_ERROR("homestatus-parser-error"),
+        @SerializedName("4")
+        COMMAND_UNKNOWN_NODE_MODULE_ERROR("homestatus-command-unknown"),
+        @SerializedName("5")
+        COMMAND_INVALID_PARAMS("homestatus-invalid-params"),
+        @SerializedName("6")
+        UNREACHABLE("device-not-connected"),
+        UNKNOWN("deserialization-unknow");
+
+        // Associated error message that can be found in properties files
+        public final String message;
+
+        HomeStatusError(String message) {
+            this.message = message;
+        }
+    }
 }
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/dto/NAError.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/dto/NAError.java
new file mode 100644 (file)
index 0000000..cdc36e8
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2010-2023 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.netatmo.internal.api.dto;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.HomeStatusError;
+
+/**
+ * The {@link NAError} class is the base class for errors returned by the Netatmo API
+ * regarding a given thing.
+ *
+ * @author Gaël L'hopital - Initial contribution
+ *
+ */
+@NonNullByDefault
+public class NAError extends NAObject {
+    private HomeStatusError code = HomeStatusError.UNKNOWN;
+
+    public HomeStatusError getCode() {
+        return code;
+    }
+}
index f13e2d97644e2c7c8938c8aadc6389518bdc909b..59861c4dd5b4b470e7feb0e2f9fed0c73a628ef4 100644 (file)
@@ -12,6 +12,7 @@
  */
 package org.openhab.binding.netatmo.internal.api.dto;
 
+import java.util.List;
 import java.util.Optional;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -56,8 +57,13 @@ public class NAHomeStatus {
     }
 
     private @Nullable HomeStatus home;
+    private List<NAError> errors = List.of();
 
     public Optional<HomeStatus> getHomeStatus() {
         return Optional.ofNullable(home);
     }
+
+    public List<NAError> getErrors() {
+        return errors;
+    }
 }
index e21f5f39da9bc6002038cf95515d44da8c62a8a0..5799e950712624a1c0d931346fa9da8591b60aa8 100644 (file)
@@ -28,6 +28,7 @@ import org.openhab.binding.netatmo.internal.api.dto.Event;
 import org.openhab.binding.netatmo.internal.api.dto.HomeData;
 import org.openhab.binding.netatmo.internal.api.dto.HomeEvent;
 import org.openhab.binding.netatmo.internal.api.dto.HomeStatusModule;
+import org.openhab.binding.netatmo.internal.api.dto.NAError;
 import org.openhab.binding.netatmo.internal.api.dto.NAHomeStatus.HomeStatus;
 import org.openhab.binding.netatmo.internal.api.dto.NAMain;
 import org.openhab.binding.netatmo.internal.api.dto.NAObject;
@@ -63,32 +64,37 @@ public class Capability {
 
     public final @Nullable String setNewData(NAObject newData) {
         beforeNewData();
-        if (newData instanceof HomeData homeData) {
-            updateHomeData(homeData);
-        }
-        if (newData instanceof HomeStatus homeStatus) {
-            updateHomeStatus(homeStatus);
-        }
-        if (newData instanceof HomeStatusModule homeStatusModule) {
-            updateHomeStatusModule(homeStatusModule);
-        }
+        if (newData instanceof NAError error) {
+            updateErrors(error);
+        } else {
+            if (newData instanceof HomeData homeData) {
+                updateHomeData(homeData);
+            }
+            if (newData instanceof HomeStatus homeStatus) {
+                updateHomeStatus(homeStatus);
+            }
+            if (newData instanceof HomeStatusModule homeStatusModule) {
+                updateHomeStatusModule(homeStatusModule);
+            }
 
-        if (newData instanceof HomeEvent homeEvent) {
-            updateHomeEvent(homeEvent);
-        } else if (newData instanceof WebhookEvent webhookEvent && webhookEvent.getEventType().validFor(moduleType)) {
-            updateWebhookEvent(webhookEvent);
-        } else if (newData instanceof Event event) {
-            updateEvent(event);
-        }
+            if (newData instanceof HomeEvent homeEvent) {
+                updateHomeEvent(homeEvent);
+            } else if (newData instanceof WebhookEvent webhookEvent
+                    && webhookEvent.getEventType().validFor(moduleType)) {
+                updateWebhookEvent(webhookEvent);
+            } else if (newData instanceof Event event) {
+                updateEvent(event);
+            }
 
-        if (newData instanceof NAThing naThing) {
-            updateNAThing(naThing);
-        }
-        if (newData instanceof NAMain naMain) {
-            updateNAMain(naMain);
-        }
-        if (newData instanceof Device device) {
-            updateNADevice(device);
+            if (newData instanceof NAThing naThing) {
+                updateNAThing(naThing);
+            }
+            if (newData instanceof NAMain naMain) {
+                updateNAMain(naMain);
+            }
+            if (newData instanceof Device device) {
+                updateNADevice(device);
+            }
         }
         afterNewData(newData);
         return statusReason;
@@ -152,6 +158,10 @@ public class Capability {
         // do nothing by default, can be overridden by subclasses
     }
 
+    protected void updateErrors(NAError error) {
+        // do nothing by default, can be overridden by subclasses
+    }
+
     public void initialize() {
         // do nothing by default, can be overridden by subclasses
     }
index 04f0e0563c787319c62b36cf18c3d9829d11e2ce..deed510bb4df19be086a206b5f5c73f70f4f4b94 100644 (file)
@@ -16,6 +16,7 @@ import java.util.List;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.netatmo.internal.api.dto.NAError;
 import org.openhab.binding.netatmo.internal.api.dto.NAObject;
 import org.openhab.binding.netatmo.internal.handler.CommonInterface;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.ChannelHelper;
@@ -25,6 +26,7 @@ import org.openhab.core.types.State;
 
 /**
  * {@link ChannelHelperCapability} give the capability to dispatch incoming data across the channel helpers.
+ * This capability is common to all things
  *
  * @author Gaël L'hopital - Initial contribution
  *
@@ -56,4 +58,11 @@ public class ChannelHelperCapability extends Capability {
             }
         });
     }
+
+    @Override
+    protected void updateErrors(NAError error) {
+        if (error.getId().equals(handler.getId())) {
+            statusReason = "@text/%s".formatted(error.getCode().message);
+        }
+    }
 }
index 537c1dfa6fd07e76839a316ab91d397723db59bf..f9e281ab5ddaa358ea053c49c35d5a6247082dbd 100644 (file)
@@ -27,7 +27,7 @@ import org.openhab.binding.netatmo.internal.api.NetatmoException;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.FeatureArea;
 import org.openhab.binding.netatmo.internal.api.dto.HomeData;
 import org.openhab.binding.netatmo.internal.api.dto.Location;
-import org.openhab.binding.netatmo.internal.api.dto.NAHomeStatus.HomeStatus;
+import org.openhab.binding.netatmo.internal.api.dto.NAError;
 import org.openhab.binding.netatmo.internal.api.dto.NAObject;
 import org.openhab.binding.netatmo.internal.config.HomeConfiguration;
 import org.openhab.binding.netatmo.internal.handler.CommonInterface;
@@ -105,6 +105,12 @@ public class HomeCapability extends RestCapability<HomeApi> {
         return featureAreas.contains(searched);
     }
 
+    @Override
+    protected void updateErrors(NAError error) {
+        handler.getActiveChildren().stream().filter(handler -> handler.getId().equals(error.getId())).findFirst()
+                .ifPresent(handler -> handler.setNewData(error));
+    }
+
     @Override
     protected List<NAObject> updateReadings(HomeApi api) {
         List<NAObject> result = new ArrayList<>();
@@ -115,10 +121,11 @@ public class HomeCapability extends RestCapability<HomeApi> {
                     result.add(homeData);
                     featureAreas.addAll(homeData.getFeatures());
                 }
-                HomeStatus homeStatus = api.getHomeStatus(id);
-                if (homeStatus != null) {
-                    result.add(homeStatus);
-                }
+
+                api.getHomeStatus(id).ifPresent(body -> {
+                    body.getHomeStatus().ifPresent(homeStatus -> result.add(homeStatus));
+                    result.addAll(body.getErrors());
+                });
             } catch (NetatmoException e) {
                 logger.warn("Error getting Home informations : {}", e.getMessage());
             }
index 3cecf7f63e7da9b61cbba9ea5b9a927611e0d7c3..f412ce57baf998ad7e17ff3236b941133dad4614 100644 (file)
@@ -116,7 +116,7 @@ class SecurityCapability extends RestCapability<SecurityApi> {
             return;
         }
         handler.getActiveChildren(FeatureArea.SECURITY).filter(child -> child.getId().equals(objectId))
-                .forEach(child -> child.setNewData(homeEvent.ignoringForThingUpdate()));
+                .forEach(child -> child.setNewData(homeEvent));
     }
 
     @Override
index c67f080b420cfec370c5619d4be200719f0ac6e4..239d4397169ae55a795014cd87196fa09e07c76c 100644 (file)
@@ -462,6 +462,13 @@ status-bridge-offline = Bridge is not connected to Netatmo API
 device-not-connected = Thing is not reachable
 data-over-limit = Data seems quite old
 request-time-out = Request timed out - will attempt reconnection later
+deserialization-unknow = Deserialization lead to an unknown code
+
+homestatus-unknown-error = Unknown error
+homestatus-internal-error = Internal error
+homestatus-parser-error = Parser error
+homestatus-command-unknown = Command unknown node module error
+homestatus-invalid-params = Command invalid params
 
 # actions