From 62e67b4aa4dd7a6d25c0c5cae8981ce415985bee Mon Sep 17 00:00:00 2001 From: lsiepel Date: Sat, 27 Jan 2024 20:48:59 +0100 Subject: [PATCH] [smartmeter] Prevent NumberFormatException (#16183) * Fix NumberFormatException * Fix logger comment --------- Signed-off-by: Leo Siepel Signed-off-by: Ciprian Pascu --- .../internal/conformity/negate/NegateHandler.java | 11 ++++++++++- .../org/openhab/binding/smartmeter/TestNegateBit.java | 10 ++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.smartmeter/src/main/java/org/openhab/binding/smartmeter/internal/conformity/negate/NegateHandler.java b/bundles/org.openhab.binding.smartmeter/src/main/java/org/openhab/binding/smartmeter/internal/conformity/negate/NegateHandler.java index 0ba18391d7a..64393645f1b 100644 --- a/bundles/org.openhab.binding.smartmeter/src/main/java/org/openhab/binding/smartmeter/internal/conformity/negate/NegateHandler.java +++ b/bundles/org.openhab.binding.smartmeter/src/main/java/org/openhab/binding/smartmeter/internal/conformity/negate/NegateHandler.java @@ -17,6 +17,8 @@ import java.util.function.Function; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.smartmeter.internal.MeterValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Handles the Negate Bit property for a specific meter value. @@ -26,6 +28,7 @@ import org.openhab.binding.smartmeter.internal.MeterValue; */ @NonNullByDefault public class NegateHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(NegateHandler.class); /** * Gets whether negation should be applied for the given negateProperty and the {@link MeterValue} @@ -64,7 +67,13 @@ public class NegateHandler { * @return Whether the given bit is set or not */ public static boolean isNegateSet(String value, int negatePosition) { - long longValue = Long.parseLong(value); + long longValue = 0; + try { + longValue = (long) Double.parseDouble(value); + } catch (NumberFormatException e) { + LOGGER.warn("Failed to parse value: {} when determining isNegateSet, assuming false", value); + return false; + } return (longValue & (1L << negatePosition)) != 0; } } diff --git a/bundles/org.openhab.binding.smartmeter/src/test/java/org/openhab/binding/smartmeter/TestNegateBit.java b/bundles/org.openhab.binding.smartmeter/src/test/java/org/openhab/binding/smartmeter/TestNegateBit.java index 1b59dceb618..4b6de5643c5 100644 --- a/bundles/org.openhab.binding.smartmeter/src/test/java/org/openhab/binding/smartmeter/TestNegateBit.java +++ b/bundles/org.openhab.binding.smartmeter/src/test/java/org/openhab/binding/smartmeter/TestNegateBit.java @@ -46,6 +46,16 @@ public class TestNegateBit { assertTrue(negateState); } + @Test + public void testNegateHandlingDecimalTrue() { + String negateProperty = "1-0_16-7-0:31:0"; + + boolean negateStateDot = NegateHandler.shouldNegateState(negateProperty, + obis -> new MeterValue<>(obis, "49.0", null)); + + assertTrue(negateStateDot); + } + @Test public void testNegateHandlingFalse() { String negateProperty = "1-0_1-8-0:5:1";