From b3dfba8cf5bb727a2efde3ef99e10315789af45a Mon Sep 17 00:00:00 2001 From: Holger Friedrich Date: Fri, 14 Apr 2023 20:23:32 +0200 Subject: [PATCH] [knx] Improve rounding when encoding DPT 232.60000 (#14772) * [knx] Improve rounding when encoding DPT 232.60000 * [knx] SAT and warnings Signed-off-by: Holger Friedrich --- .../knx/internal/client/AbstractKNXClient.java | 4 ++-- .../binding/knx/internal/dpt/ValueDecoder.java | 4 ++-- .../binding/knx/internal/dpt/ValueEncoder.java | 16 +++++++++++----- .../knx/internal/handler/DeviceThingHandler.java | 4 ++-- .../internal/handler/IPBridgeThingHandler.java | 11 ++++++----- .../handler/SerialBridgeThingHandler.java | 6 +++--- .../binding/knx/internal/dpt/DPTTest.java | 4 ++++ 7 files changed, 30 insertions(+), 19 deletions(-) diff --git a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/client/AbstractKNXClient.java b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/client/AbstractKNXClient.java index df3d42e34..0c8879836 100644 --- a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/client/AbstractKNXClient.java +++ b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/client/AbstractKNXClient.java @@ -251,7 +251,7 @@ public abstract class AbstractKNXClient implements NetworkLinkListener, KNXClien state = ClientState.RUNNING; return true; } catch (InterruptedException e) { - final var lastState = state; + ClientState lastState = state; state = ClientState.INTERRUPTED; logger.trace("Bridge {}, connection interrupted", thingUID); @@ -458,7 +458,7 @@ public abstract class AbstractKNXClient implements NetworkLinkListener, KNXClien @Override public boolean isConnected() { - final var tmpLink = link; + KNXNetworkLink tmpLink = link; return tmpLink != null && tmpLink.isOpen(); } diff --git a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/dpt/ValueDecoder.java b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/dpt/ValueDecoder.java index 7aa716130..28d3ecae9 100644 --- a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/dpt/ValueDecoder.java +++ b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/dpt/ValueDecoder.java @@ -310,8 +310,8 @@ public class ValueDecoder { if (stringY == null) { return ColorUtil.xyToHsb(new double[] { x, y }); } else { - double Y = Double.parseDouble(stringY.replace(",", ".")); - return ColorUtil.xyToHsb(new double[] { x, y, Y }); + double pY = Double.parseDouble(stringY.replace(",", ".")); + return ColorUtil.xyToHsb(new double[] { x, y, pY }); } } } diff --git a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/dpt/ValueEncoder.java b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/dpt/ValueEncoder.java index 23b056e05..f7ad538e2 100644 --- a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/dpt/ValueEncoder.java +++ b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/dpt/ValueEncoder.java @@ -154,7 +154,7 @@ public class ValueEncoder { case "232.60000": // MDT specific: mis-use 232.600 for hsv instead of rgb int hue = hsb.getHue().toBigDecimal().multiply(BigDecimal.valueOf(255)) - .divide(BigDecimal.valueOf(360), 2, RoundingMode.HALF_UP).intValue(); + .divide(BigDecimal.valueOf(360), 0, RoundingMode.HALF_UP).intValue(); return "r:" + hue + " g:" + convertPercentToByte(hsb.getSaturation()) + " b:" + convertPercentToByte(hsb.getBrightness()); case "242.600": @@ -188,14 +188,20 @@ public class ValueEncoder { || DPTXlator2ByteFloat.DPT_KELVIN_PER_PERCENT.getID().equals(dptId)) { // match unicode character or °C if (value.toString().contains(SIUnits.CELSIUS.getSymbol()) || value.toString().contains("°C")) { - unit = unit.replace("K", "°C"); + if (unit != null) { + unit = unit.replace("K", "°C"); + } } else if (value.toString().contains("°F")) { - unit = unit.replace("K", "°F"); + if (unit != null) { + unit = unit.replace("K", "°F"); + } value = ((QuantityType) value).multiply(BigDecimal.valueOf(5.0 / 9.0)); } } else if (DPTXlator4ByteFloat.DPT_LIGHT_QUANTITY.getID().equals(dptId)) { if (!value.toString().contains("J")) { - unit = unit.replace("J", "lm*s"); + if (unit != null) { + unit = unit.replace("J", "lm*s"); + } } } else if (DPTXlator4ByteFloat.DPT_ELECTRIC_FLUX.getID().equals(dptId)) { // use alternate definition of flux @@ -250,6 +256,6 @@ public class ValueEncoder { */ private static int convertPercentToByte(PercentType percent) { return percent.toBigDecimal().multiply(BigDecimal.valueOf(255)) - .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).intValue(); + .divide(BigDecimal.valueOf(100), 0, RoundingMode.HALF_UP).intValue(); } } diff --git a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/DeviceThingHandler.java b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/DeviceThingHandler.java index be5828a82..040e16a72 100644 --- a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/DeviceThingHandler.java +++ b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/DeviceThingHandler.java @@ -505,12 +505,12 @@ public class DeviceThingHandler extends BaseThingHandler implements GroupAddress } protected void detachFromClient() { - final var pollingJobSynced = pollingJob; + ScheduledFuture pollingJobSynced = pollingJob; if (pollingJobSynced != null) { pollingJobSynced.cancel(true); pollingJob = null; } - final var descriptionJobSynced = descriptionJob; + ScheduledFuture descriptionJobSynced = descriptionJob; if (descriptionJobSynced != null) { descriptionJobSynced.cancel(true); descriptionJob = null; diff --git a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/IPBridgeThingHandler.java b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/IPBridgeThingHandler.java index e2067d7f3..dbd2f1dfd 100644 --- a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/IPBridgeThingHandler.java +++ b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/IPBridgeThingHandler.java @@ -171,12 +171,13 @@ public class IPBridgeThingHandler extends KNXBridgeBaseThingHandler { if (!config.getLocalIp().isEmpty()) { localEndPoint = new InetSocketAddress(config.getLocalIp(), 0); } else { - if (networkAddressService == null) { + NetworkAddressService localNetworkAddressService = networkAddressService; + if (localNetworkAddressService == null) { logger.debug("NetworkAddressService not available, cannot create bridge {}", thing.getUID()); updateStatus(ThingStatus.OFFLINE); return; } else { - localEndPoint = new InetSocketAddress(networkAddressService.getPrimaryIpv4HostAddress(), 0); + localEndPoint = new InetSocketAddress(localNetworkAddressService.getPrimaryIpv4HostAddress(), 0); } } @@ -186,7 +187,7 @@ public class IPBridgeThingHandler extends KNXBridgeBaseThingHandler { secureTunnel.user, secureTunnel.userKey, thing.getUID(), config.getResponseTimeout(), config.getReadingPause(), config.getReadRetriesLimit(), getScheduler(), this); - final var tmpClient = client; + IPClient tmpClient = client; if (tmpClient != null) { tmpClient.initialize(); } @@ -196,7 +197,7 @@ public class IPBridgeThingHandler extends KNXBridgeBaseThingHandler { @Override public void dispose() { - final var tmpInitJob = initJob; + Future tmpInitJob = initJob; if (tmpInitJob != null) { while (!tmpInitJob.isDone()) { logger.trace("Bridge {}, shutdown during init, trying to cancel", thing.getUID()); @@ -209,7 +210,7 @@ public class IPBridgeThingHandler extends KNXBridgeBaseThingHandler { } initJob = null; } - final var tmpClient = client; + IPClient tmpClient = client; if (tmpClient != null) { tmpClient.dispose(); client = null; diff --git a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/SerialBridgeThingHandler.java b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/SerialBridgeThingHandler.java index a97538165..0c66934ac 100644 --- a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/SerialBridgeThingHandler.java +++ b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/handler/SerialBridgeThingHandler.java @@ -65,7 +65,7 @@ public class SerialBridgeThingHandler extends KNXBridgeBaseThingHandler { } public void initializeLater() { - final var tmpClient = client; + SerialClient tmpClient = client; if (tmpClient != null) { tmpClient.initialize(); } @@ -73,7 +73,7 @@ public class SerialBridgeThingHandler extends KNXBridgeBaseThingHandler { @Override public void dispose() { - final var tmpInitJob = initJob; + Future tmpInitJob = initJob; if (tmpInitJob != null) { if (!tmpInitJob.isDone()) { logger.trace("Bridge {}, shutdown during init, trying to cancel", thing.getUID()); @@ -87,7 +87,7 @@ public class SerialBridgeThingHandler extends KNXBridgeBaseThingHandler { initJob = null; } - final var tmpClient = client; + SerialClient tmpClient = client; if (tmpClient != null) { tmpClient.dispose(); client = null; diff --git a/bundles/org.openhab.binding.knx/src/test/java/org/openhab/binding/knx/internal/dpt/DPTTest.java b/bundles/org.openhab.binding.knx/src/test/java/org/openhab/binding/knx/internal/dpt/DPTTest.java index b61f55e7d..79b328a9f 100644 --- a/bundles/org.openhab.binding.knx/src/test/java/org/openhab/binding/knx/internal/dpt/DPTTest.java +++ b/bundles/org.openhab.binding.knx/src/test/java/org/openhab/binding/knx/internal/dpt/DPTTest.java @@ -326,6 +326,10 @@ class DPTTest { assertEquals(173.6, hsbType.getHue().doubleValue(), 0.1); assertEquals(17.6, hsbType.getSaturation().doubleValue(), 0.1); assertEquals(26.3, hsbType.getBrightness().doubleValue(), 0.1); + + String encoded = ValueEncoder.encode(hsbType, "232.60000"); + assertNotNull(encoded); + assertEquals(encoded, "r:" + data[0] + " g:" + data[1] + " b:" + data[2]); } @Test