From 7e53167967c75a5875be45ab267425c9b7c14ead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20L=27hopital?= Date: Sun, 8 Oct 2023 09:35:41 +0200 Subject: [PATCH] [Netatmo] Avoid double refresh of weather channels (#15686) * Solves issue #15684 * Removing excessive usage of inline typecast --------- Signed-off-by: clinique --- .../internal/handler/capability/Capability.java | 1 - .../handler/capability/MeasureCapability.java | 8 ++++++++ .../channelhelper/HumidityChannelHelper.java | 16 +++++++--------- .../netatmo/internal/utils/ChannelTypeUtils.java | 15 +++++---------- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/Capability.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/Capability.java index 5799e9507..5ad70ae25 100644 --- a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/Capability.java +++ b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/Capability.java @@ -47,7 +47,6 @@ import org.openhab.core.types.Command; */ @NonNullByDefault public class Capability { - protected final Thing thing; protected final CommonInterface handler; protected final ModuleType moduleType; diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/MeasureCapability.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/MeasureCapability.java index 738ae2acf..b6598d9f3 100644 --- a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/MeasureCapability.java +++ b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/MeasureCapability.java @@ -25,6 +25,7 @@ import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.netatmo.internal.api.NetatmoException; import org.openhab.binding.netatmo.internal.api.WeatherApi; import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass; +import org.openhab.binding.netatmo.internal.api.dto.Device; import org.openhab.binding.netatmo.internal.api.dto.NAObject; import org.openhab.binding.netatmo.internal.config.MeasureConfiguration; import org.openhab.binding.netatmo.internal.handler.CommonInterface; @@ -56,6 +57,13 @@ public class MeasureCapability extends CacheWeatherCapability { measureChannelHelper.setMeasures(measures); } + @Override + protected void updateNADevice(Device newData) { + // Resolution of issue #15684 : + // Do not transfer newData to superclass - MeasureCapability pulls its own data based on measurement channels + // configuration and store them in 'measures' for the channel helper. + } + private void updateMeasures(WeatherApi api, String deviceId, @Nullable String moduleId) { measures.clear(); handler.getActiveChannels().filter(channel -> !channel.getConfiguration().getProperties().isEmpty()) diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/HumidityChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/HumidityChannelHelper.java index 09f507cb1..934bf6066 100644 --- a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/HumidityChannelHelper.java +++ b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/HumidityChannelHelper.java @@ -40,14 +40,12 @@ public class HumidityChannelHelper extends ChannelHelper { @Override protected @Nullable State internalGetDashboard(String channelId, Dashboard dashboard) { - switch (channelId) { - case CHANNEL_HUMIDEX: - return new DecimalType(humidex(dashboard.getTemperature(), dashboard.getHumidity())); - case CHANNEL_HUMIDEX_SCALE: - return new DecimalType(humidexScale(humidex(dashboard.getTemperature(), dashboard.getHumidity()))); - case CHANNEL_VALUE: - return toQuantityType(dashboard.getHumidity(), MeasureClass.HUMIDITY); - } - return null; + return switch (channelId) { + case CHANNEL_HUMIDEX -> new DecimalType(humidex(dashboard.getTemperature(), dashboard.getHumidity())); + case CHANNEL_HUMIDEX_SCALE -> + new DecimalType(humidexScale(humidex(dashboard.getTemperature(), dashboard.getHumidity()))); + case CHANNEL_VALUE -> toQuantityType(dashboard.getHumidity(), MeasureClass.HUMIDITY); + default -> null; + }; } } diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/utils/ChannelTypeUtils.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/utils/ChannelTypeUtils.java index 40b56700b..78a5a9a39 100644 --- a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/utils/ChannelTypeUtils.java +++ b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/utils/ChannelTypeUtils.java @@ -25,7 +25,6 @@ import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.Measure; import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass; import org.openhab.core.io.net.http.HttpUtil; import org.openhab.core.library.types.DateTimeType; -import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.types.RawType; import org.openhab.core.library.types.StringType; @@ -75,16 +74,12 @@ public class ChannelTypeUtils { return zonedDateTime.map(zdt -> (State) new DateTimeType(zdt)).orElse(UnDefType.NULL); } - public static State toQuantityType(@Nullable Double value, @Nullable MeasureClass measureClass) { + public static State toQuantityType(@Nullable Double value, MeasureClass measureClass) { if (value != null && !value.isNaN()) { - if (measureClass != null) { - Measure measureDef = measureClass.measureDefinition; - BigDecimal measure = new BigDecimal(Math.min(measureDef.maxValue, Math.max(measureDef.minValue, value))) - .setScale(measureDef.scale, RoundingMode.HALF_UP); - return new QuantityType<>(measure, measureDef.unit); - } else { - return new DecimalType(value); - } + Measure measureDef = measureClass.measureDefinition; + BigDecimal measure = new BigDecimal(Math.min(measureDef.maxValue, Math.max(measureDef.minValue, value))) + .setScale(measureDef.scale, RoundingMode.HALF_UP); + return new QuantityType<>(measure, measureDef.unit); } return UnDefType.NULL; }