]> git.basschouten.com Git - openhab-addons.git/commitdiff
[netatmo] Enhance errored modules handling (#15866)
authorGaël L'hopital <gael@lhopital.org>
Fri, 17 Nov 2023 17:41:59 +0000 (18:41 +0100)
committerGitHub <noreply@github.com>
Fri, 17 Nov 2023 17:41:59 +0000 (18:41 +0100)
* Resolves issue #15858
* Enhance null control in DTO

---------

Signed-off-by: clinique <gael@lhopital.org>
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/deserialization/NAObjectMap.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/CommonInterface.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/EnergyCapability.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/HomeCapability.java

index 59861c4dd5b4b470e7feb0e2f9fed0c73a628ef4..5583bc4aef831635f81d09dfed7c8ba50294f3b9 100644 (file)
@@ -35,24 +35,26 @@ public class NAHomeStatus {
         private @Nullable NAObjectMap<HomeStatusModule> modules;
 
         public NAObjectMap<HomeStatusModule> getModules() {
-            NAObjectMap<HomeStatusModule> localModules = modules;
-            return localModules != null ? localModules : new NAObjectMap<>();
+            NAObjectMap<HomeStatusModule> local = modules;
+            return local != null ? local : new NAObjectMap<>();
         }
     }
 
     public class Energy extends HomeStatus {
-        private NAObjectMap<Room> rooms = new NAObjectMap<>();
+        private @Nullable NAObjectMap<Room> rooms;
 
         public NAObjectMap<Room> getRooms() {
-            return rooms;
+            NAObjectMap<Room> local = rooms;
+            return local != null ? local : new NAObjectMap<>();
         }
     }
 
     public class Security extends HomeStatus {
-        private NAObjectMap<HomeStatusPerson> persons = new NAObjectMap<>();
+        private @Nullable NAObjectMap<HomeStatusPerson> persons;
 
         public NAObjectMap<HomeStatusPerson> getPersons() {
-            return persons;
+            NAObjectMap<HomeStatusPerson> local = persons;
+            return local != null ? local : new NAObjectMap<>();
         }
     }
 
index c4357e6d40a1e15f1eaa87085cd2008f6546345c..4251c4f439e9b3db5e78d7987d30e25677c22500 100644 (file)
@@ -33,7 +33,7 @@ public class NAObjectMap<T extends NAObject> extends HashMap<String, T> {
         return super.put(thing.getId(), thing);
     }
 
-    public Optional<T> getOpt(String key) {
-        return Optional.ofNullable(super.get(key));
+    public Optional<T> getOpt(@Nullable String key) {
+        return Optional.ofNullable(key != null ? super.get(key) : null);
     }
 }
index 1a6c973692b21f6f59908e71266393f890fcb164..85ba84c9078fd522eed9f440bd6b32126e5f7bc8 100644 (file)
@@ -128,6 +128,26 @@ public interface CommonInterface {
                 : recurseUpToHomeHandler(handler.getBridgeHandler());
     }
 
+    /**
+     * Recurses down in the home/module/device tree
+     *
+     * @param bridge
+     * @return the list of childs of the bridge
+     */
+    default List<CommonInterface> getAllActiveChildren(Bridge bridge) {
+        List<CommonInterface> result = new ArrayList<>();
+        bridge.getThings().stream().filter(Thing::isEnabled).map(Thing::getHandler).forEach(childHandler -> {
+            if (childHandler != null) {
+                Thing childThing = childHandler.getThing();
+                if (childThing instanceof Bridge bridgeChild) {
+                    result.addAll(getAllActiveChildren(bridgeChild));
+                }
+                result.add((CommonInterface) childHandler);
+            }
+        });
+        return result;
+    }
+
     default List<CommonInterface> getActiveChildren() {
         Thing thing = getThing();
         if (thing instanceof Bridge bridge) {
index 832d2252dcd0adc529cefccacb119c2849685aff..39752014ec589365d6920b9e09df310a37814a3f 100644 (file)
@@ -91,11 +91,19 @@ public class EnergyCapability extends RestCapability<EnergyApi> {
             NAObjectMap<HomeStatusModule> modules = energyStatus.getModules();
             handler.getActiveChildren(FeatureArea.ENERGY).forEach(childHandler -> {
                 String childId = childHandler.getId();
-                rooms.getOpt(childId).ifPresentOrElse(roomData -> childHandler.setNewData(roomData), () -> {
+                logger.trace("childId: {}", childId);
+                rooms.getOpt(childId).ifPresentOrElse(roomData -> {
+                    logger.trace("roomData: {}", roomData);
+                    childHandler.setNewData(roomData);
+                }, () -> {
                     modules.getOpt(childId).ifPresent(moduleData -> {
+                        logger.trace("moduleData: {}", moduleData);
                         childHandler.setNewData(moduleData);
                         modules.values().stream().filter(module -> childId.equals(module.getBridge()))
-                                .forEach(bridgedModule -> childHandler.setNewData(bridgedModule));
+                                .forEach(bridgedModule -> {
+                                    logger.trace("bridgedModule: {}", bridgedModule);
+                                    childHandler.setNewData(bridgedModule);
+                                });
                     });
                 });
             });
index f9e281ab5ddaa358ea053c49c35d5a6247082dbd..4b7a62ef0422099730d7a24781e613c564b4793d 100644 (file)
@@ -32,6 +32,7 @@ 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;
 import org.openhab.binding.netatmo.internal.providers.NetatmoDescriptionProvider;
+import org.openhab.core.thing.Bridge;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -105,10 +106,14 @@ public class HomeCapability extends RestCapability<HomeApi> {
         return featureAreas.contains(searched);
     }
 
+    /**
+     * Errored equipments are reported at home level - so we need to explore all the tree to identify modules
+     * depending from a child device.
+     */
     @Override
     protected void updateErrors(NAError error) {
-        handler.getActiveChildren().stream().filter(handler -> handler.getId().equals(error.getId())).findFirst()
-                .ifPresent(handler -> handler.setNewData(error));
+        handler.getAllActiveChildren((Bridge) thing).stream().filter(handler -> handler.getId().equals(error.getId()))
+                .findFirst().ifPresent(handler -> handler.setNewData(error));
     }
 
     @Override
@@ -123,11 +128,11 @@ public class HomeCapability extends RestCapability<HomeApi> {
                 }
 
                 api.getHomeStatus(id).ifPresent(body -> {
-                    body.getHomeStatus().ifPresent(homeStatus -> result.add(homeStatus));
+                    body.getHomeStatus().ifPresent(result::add);
                     result.addAll(body.getErrors());
                 });
             } catch (NetatmoException e) {
-                logger.warn("Error getting Home informations : {}", e.getMessage());
+                logger.warn("Error getting Home informations: {}", e.getMessage());
             }
         });
         return result;