]> git.basschouten.com Git - openhab-addons.git/commitdiff
[netatmo] Room-Thing offline after restart (#13467)
authorGaël L'hopital <gael@lhopital.org>
Sat, 1 Oct 2022 10:50:22 +0000 (12:50 +0200)
committerGitHub <noreply@github.com>
Sat, 1 Oct 2022 10:50:22 +0000 (12:50 +0200)
* Correcting issue by late loading of the capability.
* Handle MAXIMUM_USAGE_REACHED at ApiBridgeHandler level.

Signed-off-by: clinique <gael@lhopital.org>
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/action/RoomActions.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/ApiBridgeHandler.java

index 1ab991f3ac30f5c3c6e2498bd10cb699d70294ec..c4605833a87442eebae0b043b8b4e1e60ab8e8ee 100644 (file)
@@ -42,18 +42,24 @@ public class RoomActions implements ThingActions {
             SetpointMode.HOME);
 
     private @Nullable CommonInterface handler;
-    private Optional<EnergyCapability> energy = Optional.empty();
 
     public RoomActions() {
         logger.debug("Netatmo RoomActions service created");
     }
 
+    private Optional<EnergyCapability> getEnergyCapability() {
+        CommonInterface localHandler = handler;
+        if (localHandler != null) {
+            return localHandler.getHomeCapability(EnergyCapability.class);
+        }
+        return Optional.empty();
+    }
+
     @Override
     public void setThingHandler(@Nullable ThingHandler handler) {
         if (handler instanceof CommonInterface) {
             CommonInterface commonHandler = (CommonInterface) handler;
             this.handler = commonHandler;
-            energy = commonHandler.getHomeCapability(EnergyCapability.class);
         }
     }
 
@@ -77,7 +83,8 @@ public class RoomActions implements ThingActions {
             logger.info("Temperature provided but no endtime given, action ignored");
             return;
         }
-        energy.ifPresent(cap -> cap.setRoomThermTemp(roomHandler.getId(), temp, endTime, SetpointMode.MANUAL));
+        getEnergyCapability()
+                .ifPresent(cap -> cap.setRoomThermTemp(roomHandler.getId(), temp, endTime, SetpointMode.MANUAL));
     }
 
     @RuleAction(label = "@text/actionSetThermRoomModeSetpointLabel", description = "@text/actionSetThermRoomModeSetpointDesc")
@@ -116,7 +123,7 @@ public class RoomActions implements ThingActions {
 
         long setpointEnd = targetEndTime;
         SetpointMode setpointMode = targetMode;
-        energy.ifPresent(cap -> cap.setRoomThermTemp(roomHandler.getId(), 0, setpointEnd, setpointMode));
+        getEnergyCapability().ifPresent(cap -> cap.setRoomThermTemp(roomHandler.getId(), 0, setpointEnd, setpointMode));
     }
 
     public static void setThermRoomTempSetpoint(ThingActions actions, @Nullable Double temp, @Nullable Long endTime) {
index 87aa07526cd68d9c4ee0000c956ef53f661897fb..702c7820cfcf9c1e067cef476650af69ef8a9d39 100644 (file)
@@ -46,6 +46,7 @@ import org.openhab.binding.netatmo.internal.api.NetatmoException;
 import org.openhab.binding.netatmo.internal.api.RestManager;
 import org.openhab.binding.netatmo.internal.api.SecurityApi;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.Scope;
+import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.ServiceError;
 import org.openhab.binding.netatmo.internal.config.ApiHandlerConfiguration;
 import org.openhab.binding.netatmo.internal.config.BindingConfiguration;
 import org.openhab.binding.netatmo.internal.config.ConfigurationLevel;
@@ -245,6 +246,12 @@ public class ApiBridgeHandler extends BaseBridgeHandler {
                 throw new NetatmoException(error);
             }
             return deserializer.deserialize(clazz, responseBody);
+        } catch (NetatmoException e) {
+            if (e.getStatusCode() == ServiceError.MAXIMUM_USAGE_REACHED) {
+                updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage());
+                prepareReconnection(null, null);
+            }
+            throw e;
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
             updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage());