]> git.basschouten.com Git - openhab-addons.git/commitdiff
[homewizard] Fix issue with missing gas values (#11666)
authorDaniël van Os <daniel@supercell.nl>
Wed, 1 Dec 2021 20:53:11 +0000 (21:53 +0100)
committerGitHub <noreply@github.com>
Wed, 1 Dec 2021 20:53:11 +0000 (21:53 +0100)
This commit fixes a crash that happens when the smart meter does not provide gas values. The crash was caused by the empty timestamp.

Signed-off-by: Daniël van Os <daniel@supercell.nl>
bundles/org.openhab.binding.homewizard/src/main/java/org/openhab/binding/homewizard/internal/HomeWizardHandler.java
bundles/org.openhab.binding.homewizard/src/main/java/org/openhab/binding/homewizard/internal/P1Payload.java

index 3e47191f374219df49c44d1fb838f3ff4c27f9a2..9eeb5dc38f72012b5ffd520f0f2e6d51270e02aa 100644 (file)
@@ -13,6 +13,9 @@
 package org.openhab.binding.homewizard.internal;
 
 import java.io.IOException;
+import java.time.DateTimeException;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
@@ -29,6 +32,8 @@ import org.openhab.core.thing.ThingStatus;
 import org.openhab.core.thing.ThingStatusDetail;
 import org.openhab.core.thing.binding.BaseThingHandler;
 import org.openhab.core.types.Command;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.gson.FieldNamingPolicy;
 import com.google.gson.Gson;
@@ -43,6 +48,7 @@ import com.google.gson.GsonBuilder;
 @NonNullByDefault
 public class HomeWizardHandler extends BaseThingHandler {
 
+    private final Logger logger = LoggerFactory.getLogger(HomeWizardHandler.class);
     private final Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
             .create();
 
@@ -171,30 +177,40 @@ public class HomeWizardHandler extends BaseThingHandler {
         updateState(HomeWizardBindingConstants.CHANNEL_ACTIVE_POWER_L3,
                 new QuantityType<>(payload.getActivePowerL3W(), Units.WATT));
 
-        updateState(HomeWizardBindingConstants.CHANNEL_TOTAL_GAS,
-                new QuantityType<>(payload.getTotalGasM3(), SIUnits.CUBIC_METRE));
-
-        // 210119164000
+        // If no data from the gas meter is present, the json value will be null, which means gson ignores it,
+        // leaving the value in the payload object at 0.
         long dtv = payload.getGasTimestamp();
-        long seconds = dtv % 100;
+        if (dtv > 0) {
+            updateState(HomeWizardBindingConstants.CHANNEL_TOTAL_GAS,
+                    new QuantityType<>(payload.getTotalGasM3(), SIUnits.CUBIC_METRE));
+
+            // 210119164000
+            int seconds = (int) (dtv % 100);
 
-        dtv /= 100;
-        long minutes = dtv % 100;
+            dtv /= 100;
+            int minutes = (int) (dtv % 100);
 
-        dtv /= 100;
-        long hours = dtv % 100;
+            dtv /= 100;
+            int hours = (int) (dtv % 100);
 
-        dtv /= 100;
-        long day = dtv % 100;
+            dtv /= 100;
+            int day = (int) (dtv % 100);
 
-        dtv /= 100;
-        long month = dtv % 100;
+            dtv /= 100;
+            int month = (int) (dtv % 100);
 
-        dtv /= 100;
-        long year = dtv + 2000; // Where (When?) have I seen this before?
+            dtv /= 100;
+            int year = (int) (dtv + 2000);
 
-        DateTimeType dtt = DateTimeType
-                .valueOf(String.format("%04d-%02d-%02dT%02d:%02d:%02d", year, month, day, hours, minutes, seconds));
-        updateState(HomeWizardBindingConstants.CHANNEL_GAS_TIMESTAMP, dtt);
+            try {
+                DateTimeType dtt = new DateTimeType(
+                        ZonedDateTime.of(year, month, day, hours, minutes, seconds, 0, ZoneId.systemDefault()));
+                updateState(HomeWizardBindingConstants.CHANNEL_GAS_TIMESTAMP, dtt);
+                updateState(HomeWizardBindingConstants.CHANNEL_TOTAL_GAS,
+                        new QuantityType<>(payload.getTotalGasM3(), SIUnits.CUBIC_METRE));
+            } catch (DateTimeException e) {
+                logger.warn("Unable to parse Gas timestamp: {}", payload.getGasTimestamp());
+            }
+        }
     }
 }
index 6fd42b7e92ec99f0cc3fe285624283ac3c2c3d12..33c49b3a81615e3315e502b3a4ca8df7e3d8d727 100644 (file)
@@ -43,7 +43,7 @@ public class P1Payload {
     private double activePowerL2W;
     private double activePowerL3W;
     private double totalGasM3;
-    private long gasTimestamp;
+    private long gasTimestamp = 0;
 
     /**
      * Getter for the smart meter version