From 94245b627dca273b10097cc0593a60f73223dbd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20L=27hopital?= Date: Mon, 9 Nov 2020 17:55:35 +0100 Subject: [PATCH] [OpenUV] Correcting a SAT finding. (#8967) * Correcting a SAT finding. Adding alert levels compatible with MeteoAlarm and Vigicrues * Adressing code review. * spotless apply Signed-off-by: clinique --- .../internal/OpenUVBindingConstants.java | 1 + .../openuv/internal/OpenUVException.java | 9 +++- .../openuv/internal/OpenUVHandlerFactory.java | 4 -- .../internal/handler/OpenUVReportHandler.java | 53 ++++++++++++++----- .../openuv/internal/json/OpenUVResult.java | 17 +++--- .../resources/OH-INF/thing/thing-types.xml | 30 ++++++++--- 6 files changed, 79 insertions(+), 35 deletions(-) diff --git a/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVBindingConstants.java b/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVBindingConstants.java index 9383e8709..ee0559fae 100644 --- a/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVBindingConstants.java +++ b/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVBindingConstants.java @@ -39,6 +39,7 @@ public class OpenUVBindingConstants { // List of all Channel id's public static final String UV_INDEX = "UVIndex"; + public static final String ALERT_LEVEL = "Alert"; public static final String UV_COLOR = "UVColor"; public static final String UV_MAX = "UVMax"; public static final String UV_MAX_TIME = "UVMaxTime"; diff --git a/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVException.java b/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVException.java index e51aeb42c..a3bee7cc4 100644 --- a/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVException.java +++ b/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVException.java @@ -29,11 +29,16 @@ public class OpenUVException extends Exception { super(message); } + private boolean checkMatches(String message) { + String currentMessage = getMessage(); + return currentMessage != null && currentMessage.startsWith(message); + } + public boolean isApiKeyError() { - return this.getMessage().startsWith(ERROR_WRONG_KEY); + return checkMatches(ERROR_WRONG_KEY); } public boolean isQuotaError() { - return this.getMessage().startsWith(ERROR_QUOTA_EXCEEDED); + return checkMatches(ERROR_QUOTA_EXCEEDED); } } diff --git a/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVHandlerFactory.java b/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVHandlerFactory.java index 3e66d08db..04486c3b7 100644 --- a/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVHandlerFactory.java +++ b/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/OpenUVHandlerFactory.java @@ -22,7 +22,6 @@ import org.openhab.binding.openuv.internal.handler.OpenUVBridgeHandler; import org.openhab.binding.openuv.internal.handler.OpenUVReportHandler; import org.openhab.core.i18n.LocationProvider; import org.openhab.core.i18n.TimeZoneProvider; -import org.openhab.core.library.types.DecimalType; import org.openhab.core.thing.Bridge; import org.openhab.core.thing.Thing; import org.openhab.core.thing.ThingTypeUID; @@ -56,9 +55,6 @@ public class OpenUVHandlerFactory extends BaseThingHandlerFactory { @Reference LocationProvider locationProvider) { this.locationProvider = locationProvider; this.gson = new GsonBuilder() - .registerTypeAdapter(DecimalType.class, - (JsonDeserializer) (json, type, jsonDeserializationContext) -> DecimalType - .valueOf(json.getAsJsonPrimitive().getAsString())) .registerTypeAdapter(ZonedDateTime.class, (JsonDeserializer) (json, type, jsonDeserializationContext) -> ZonedDateTime .parse(json.getAsJsonPrimitive().getAsString()) diff --git a/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/handler/OpenUVReportHandler.java b/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/handler/OpenUVReportHandler.java index 582e3ca67..f0622f345 100644 --- a/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/handler/OpenUVReportHandler.java +++ b/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/handler/OpenUVReportHandler.java @@ -17,6 +17,7 @@ import static org.openhab.binding.openuv.internal.OpenUVBindingConstants.*; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; +import java.util.Map; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -28,6 +29,7 @@ import org.openhab.binding.openuv.internal.config.ReportConfiguration; import org.openhab.binding.openuv.internal.config.SafeExposureConfiguration; import org.openhab.binding.openuv.internal.json.OpenUVResult; import org.openhab.core.library.types.DateTimeType; +import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.HSBType; import org.openhab.core.library.types.PointType; import org.openhab.core.library.types.QuantityType; @@ -56,6 +58,17 @@ import org.slf4j.LoggerFactory; */ @NonNullByDefault public class OpenUVReportHandler extends BaseThingHandler { + private static final DecimalType ALERT_GREEN = DecimalType.ZERO; + private static final DecimalType ALERT_YELLOW = new DecimalType(1); + private static final DecimalType ALERT_ORANGE = new DecimalType(2); + private static final DecimalType ALERT_RED = new DecimalType(3); + private static final DecimalType ALERT_PURPLE = new DecimalType(4); + private static final State ALERT_UNDEF = HSBType.fromRGB(179, 179, 179); + + private static final Map ALERT_COLORS = Map.of(ALERT_GREEN, HSBType.fromRGB(85, 139, 47), + ALERT_YELLOW, HSBType.fromRGB(249, 168, 37), ALERT_ORANGE, HSBType.fromRGB(239, 108, 0), ALERT_RED, + HSBType.fromRGB(183, 28, 28), ALERT_PURPLE, HSBType.fromRGB(106, 27, 154)); + private final Logger logger = LoggerFactory.getLogger(OpenUVReportHandler.class); private @NonNullByDefault({}) OpenUVBridgeHandler bridgeHandler; @@ -195,13 +208,17 @@ public class OpenUVReportHandler extends BaseThingHandler { if (channelTypeUID != null) { switch (channelTypeUID.getId()) { case UV_INDEX: - updateState(channelUID, openUVData.getUv()); + updateState(channelUID, asDecimalType(openUVData.getUv())); + break; + case ALERT_LEVEL: + updateState(channelUID, asAlertLevel(openUVData.getUv())); break; case UV_COLOR: - updateState(channelUID, getAsHSB(openUVData.getUv().intValue())); + updateState(channelUID, + ALERT_COLORS.getOrDefault(asAlertLevel(openUVData.getUv()), ALERT_UNDEF)); break; case UV_MAX: - updateState(channelUID, openUVData.getUvMax()); + updateState(channelUID, asDecimalType(openUVData.getUvMax())); break; case OZONE: updateState(channelUID, new QuantityType<>(openUVData.getOzone(), SmartHomeUnits.DOBSON_UNIT)); @@ -228,17 +245,25 @@ public class OpenUVReportHandler extends BaseThingHandler { } } - private State getAsHSB(int uv) { - if (uv >= 11) { - return HSBType.fromRGB(106, 27, 154); - } else if (uv >= 8) { - return HSBType.fromRGB(183, 28, 28); - } else if (uv >= 6) { - return HSBType.fromRGB(239, 108, 0); - } else if (uv >= 3) { - return HSBType.fromRGB(249, 168, 37); - } else { - return HSBType.fromRGB(85, 139, 47); + private State asDecimalType(int uv) { + if (uv >= 1) { + return new DecimalType(uv); } + return UnDefType.NULL; + } + + private State asAlertLevel(int uv) { + if (uv >= 11) { + return ALERT_PURPLE; + } else if (uv >= 8) { + return ALERT_RED; + } else if (uv >= 6) { + return ALERT_ORANGE; + } else if (uv >= 3) { + return ALERT_YELLOW; + } else if (uv >= 1) { + return ALERT_GREEN; + } + return UnDefType.NULL; } } diff --git a/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/json/OpenUVResult.java b/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/json/OpenUVResult.java index b6a07e23f..88b8dd334 100644 --- a/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/json/OpenUVResult.java +++ b/bundles/org.openhab.binding.openuv/src/main/java/org/openhab/binding/openuv/internal/json/OpenUVResult.java @@ -18,7 +18,6 @@ import java.time.ZonedDateTime; import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.core.library.types.DateTimeType; -import org.openhab.core.library.types.DecimalType; import org.openhab.core.types.State; import org.openhab.core.types.UnDefType; @@ -31,23 +30,23 @@ import org.openhab.core.types.UnDefType; @NonNullByDefault public class OpenUVResult { private final ZonedDateTime DEFAULT_ZDT = ZonedDateTime.of(LocalDateTime.MIN, ZoneId.systemDefault()); - private DecimalType uv = new DecimalType(0); + private double uv; private ZonedDateTime uvTime = DEFAULT_ZDT; - private DecimalType uvMax = new DecimalType(0); + private double uvMax; private ZonedDateTime uvMaxTime = DEFAULT_ZDT; - private DecimalType ozone = new DecimalType(0); + private double ozone; private ZonedDateTime ozoneTime = DEFAULT_ZDT; private SafeExposureTime safeExposureTime = new SafeExposureTime(); - public DecimalType getUv() { - return uv; + public int getUv() { + return (int) uv; } - public DecimalType getUvMax() { - return uvMax; + public int getUvMax() { + return (int) uvMax; } - public DecimalType getOzone() { + public double getOzone() { return ozone; } diff --git a/bundles/org.openhab.binding.openuv/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.openuv/src/main/resources/OH-INF/thing/thing-types.xml index 51ed38d85..dc96bb92c 100644 --- a/bundles/org.openhab.binding.openuv/src/main/resources/OH-INF/thing/thing-types.xml +++ b/bundles/org.openhab.binding.openuv/src/main/resources/OH-INF/thing/thing-types.xml @@ -35,6 +35,7 @@ + @@ -66,14 +67,14 @@ Number UV Index - + Number Max UV Index for the day (at solar noon) - + @@ -86,7 +87,8 @@ DateTime - Latest OMI ozone update time + Latest OMI ozone update timestamp. + time @@ -94,20 +96,22 @@ DateTime Max UV Index time (solar noon) + time DateTime - UV Index time + UV Index timestamp. + time Color - - Color associated to given UV Index. + + Color associated to given UV Index alert level. @@ -147,4 +151,18 @@ Triggers when current UV Index reaches maximum of the day + + Number + + + + + + + + + + + +