From 3ef193d5d4332f9e5a0bd25a018b53eea1782aa8 Mon Sep 17 00:00:00 2001 From: jlaur Date: Sat, 2 Oct 2021 19:57:22 +0200 Subject: [PATCH] [miele] Temperature channel improvements: UoM, categories and descriptions (#11329) * Improvements for temperature channels Fixes #11317 Signed-off-by: Jacob Laursen * Added jlaur as miele binding maintainer Signed-off-by: Jacob Laursen * Fix spinning speed for washing machines Fixes #11317 Signed-off-by: Jacob Laursen * Added time as category for DateTime-related channels Fixes #11317 Signed-off-by: Jacob Laursen * Elapsed/remaining time channels are no longer marked as advanced. Fixes #11317 Signed-off-by: Jacob Laursen * Fixed type for temperature item examples. Signed-off-by: Jacob Laursen * Document all states (cross-appliance). Signed-off-by: Jacob Laursen * Improved error handling for getTemperatureState Signed-off-by: Jacob Laursen * Split current/target temperature into two channel types for label reuse Signed-off-by: Jacob Laursen * Fix possible NullPointerException Signed-off-by: Jacob Laursen * Distinguish between oven program temperatures Signed-off-by: Jacob Laursen * Mark oven program temperature 1 and 2 as advanced. Fixes #11317 Signed-off-by: Jacob Laursen --- CODEOWNERS | 2 +- bundles/org.openhab.binding.miele/README.md | 4 +- .../internal/ExtendedDeviceStateUtil.java | 17 +++ .../miele/internal/MieleBindingConstants.java | 16 +++ .../handler/FridgeChannelSelector.java | 20 +++- .../handler/FridgeFreezerChannelSelector.java | 28 +++-- .../internal/handler/OvenChannelSelector.java | 28 +++-- .../WashingMachineChannelSelector.java | 17 ++- .../resources/OH-INF/thing/channeltypes.xml | 108 +++++++----------- .../main/resources/OH-INF/thing/fridge.xml | 8 +- .../resources/OH-INF/thing/fridgefreezer.xml | 16 ++- .../src/main/resources/OH-INF/thing/oven.xml | 19 ++- .../resources/OH-INF/thing/washingmachine.xml | 5 +- .../internal/ExtendedDeviceStateUtilTest.java | 23 ++++ 14 files changed, 202 insertions(+), 109 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 924e5a06d93b0..50b4cf34196e4 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -168,7 +168,7 @@ /bundles/org.openhab.binding.meteoalerte/ @clinique /bundles/org.openhab.binding.meteoblue/ @9037568 /bundles/org.openhab.binding.meteostick/ @cdjackson -/bundles/org.openhab.binding.miele/ @kgoderis +/bundles/org.openhab.binding.miele/ @kgoderis @jlaur /bundles/org.openhab.binding.mielecloud/ @BjoernLange /bundles/org.openhab.binding.mihome/ @pboos /bundles/org.openhab.binding.miio/ @marcelrv diff --git a/bundles/org.openhab.binding.miele/README.md b/bundles/org.openhab.binding.miele/README.md index e8e3a715eb8b3..1a71c52920e42 100644 --- a/bundles/org.openhab.binding.miele/README.md +++ b/bundles/org.openhab.binding.miele/README.md @@ -64,8 +64,8 @@ demo.items: ``` String MieleFridgeState (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:state"} Switch MieleFridgeSuperCool (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:supercool"} -Number MieleFridgeCurrent (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:current"} -Number MieleFridgeTarget (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:target"} +Number:Temperature MieleFridgeCurrent (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:current"} +Number:Temperature MieleFridgeTarget (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:target"} Contact MieleFridgeDoor (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:door"} Switch MieleFridgeStart (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:start"} ``` diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.java index f8c1692243ba0..dfe1fd0411c98 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.java @@ -14,6 +14,11 @@ import java.nio.charset.StandardCharsets; +import org.openhab.core.library.types.QuantityType; +import org.openhab.core.library.unit.SIUnits; +import org.openhab.core.types.State; +import org.openhab.core.types.UnDefType; + /** * The {@link ExtendedDeviceStateUtil} class contains utility methods for parsing * ExtendedDeviceState information @@ -22,6 +27,7 @@ */ public class ExtendedDeviceStateUtil { private static final byte[] HEX_ARRAY = "0123456789ABCDEF".getBytes(StandardCharsets.US_ASCII); + private static final String TEMPERATURE_UNDEFINED = "32768"; /** * Convert byte array to hex representation. @@ -46,4 +52,15 @@ public static String bytesToHex(byte[] bytes) { public static byte[] stringToBytes(String input) { return input.getBytes(StandardCharsets.ISO_8859_1); } + + /** + * Convert string to Number:Temperature state with unit Celcius + */ + public static State getTemperatureState(String s) throws NumberFormatException { + if (TEMPERATURE_UNDEFINED.equals(s)) { + return UnDefType.UNDEF; + } + int temperature = Integer.parseInt(s); + return new QuantityType<>(temperature, SIUnits.CELSIUS); + } } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java index 97af65635dbfa..d9fd24ae909b0 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java @@ -58,8 +58,24 @@ public class MieleBindingConstants { public static final String MIELE_DEVICE_CLASS_FRIDGE_FREEZER = "FridgeFreezer"; // Miele appliance states + public static final int STATE_UNKNOWN = 0; + public static final int STATE_OFF = 1; + public static final int STATE_STAND_BY = 2; + public static final int STATE_PROGRAMMED = 3; + public static final int STATE_WAITING_TO_START = 4; + public static final int STATE_RUNNING = 5; + public static final int STATE_PAUSED = 6; + public static final int STATE_END = 7; + public static final int STATE_FAILURE = 8; + public static final int STATE_ABORT = 9; + public static final int STATE_IDLE = 10; + public static final int STATE_RINSE_HOLD = 11; + public static final int STATE_SERVICE = 12; public static final int STATE_SUPER_FREEZING = 13; public static final int STATE_SUPER_COOLING = 14; + public static final int STATE_SUPER_HEATING = 15; + public static final int STATE_LOCKED = 145; + public static final int STATE_NOT_CONNECTED = 255; // Bridge config properties public static final String HOST = "ipAddress"; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java index 5efdd859d9078..6fc1244efb53e 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java @@ -17,10 +17,11 @@ import java.lang.reflect.Method; import java.util.Map.Entry; +import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData; -import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.OpenClosedType; +import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.types.StringType; import org.openhab.core.types.State; import org.openhab.core.types.Type; @@ -43,16 +44,16 @@ public enum FridgeChannelSelector implements ApplianceChannelSelector { COMPANY_ID("companyId", "companyId", StringType.class, true), STATE("state", "state", StringType.class, false), SUPERCOOL(null, SUPERCOOL_CHANNEL_ID, OnOffType.class, false), - FRIDGECURRENTTEMP("currentTemperature", "current", DecimalType.class, false) { + FRIDGECURRENTTEMP("currentTemperature", "current", QuantityType.class, false) { @Override public State getState(String s, DeviceMetaData dmd) { - return getState(s); + return getTemperatureState(s); } }, - FRIDGETARGETTEMP("targetTemperature", "target", DecimalType.class, false) { + FRIDGETARGETTEMP("targetTemperature", "target", QuantityType.class, false) { @Override public State getState(String s, DeviceMetaData dmd) { - return getState(s); + return getTemperatureState(s); } }, DOOR("signalDoor", "door", OpenClosedType.class, false) { @@ -142,6 +143,15 @@ public State getState(String s) { return null; } + public State getTemperatureState(String s) { + try { + return ExtendedDeviceStateUtil.getTemperatureState(s); + } catch (NumberFormatException e) { + logger.warn("An exception occurred while converting '{}' into a State", s); + return UnDefType.UNDEF; + } + } + public String getMieleEnum(String s, DeviceMetaData dmd) { if (dmd.MieleEnum != null) { for (Entry enumEntry : dmd.MieleEnum.entrySet()) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java index 26a32701408b1..60d76e29bbc5a 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java @@ -18,10 +18,11 @@ import java.lang.reflect.Method; import java.util.Map.Entry; +import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData; -import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.OpenClosedType; +import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.types.StringType; import org.openhab.core.types.State; import org.openhab.core.types.Type; @@ -48,28 +49,28 @@ public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector { FRIDGESTATE("fridgeState", "fridgestate", StringType.class, false), SUPERCOOL(null, SUPERCOOL_CHANNEL_ID, OnOffType.class, false), SUPERFREEZE(null, SUPERFREEZE_CHANNEL_ID, OnOffType.class, false), - FREEZERCURRENTTEMP("freezerCurrentTemperature", "freezercurrent", DecimalType.class, false) { + FREEZERCURRENTTEMP("freezerCurrentTemperature", "freezercurrent", QuantityType.class, false) { @Override public State getState(String s, DeviceMetaData dmd) { - return getState(s); + return getTemperatureState(s); } }, - FREEZERTARGETTEMP("freezerTargetTemperature", "freezertarget", DecimalType.class, false) { + FREEZERTARGETTEMP("freezerTargetTemperature", "freezertarget", QuantityType.class, false) { @Override public State getState(String s, DeviceMetaData dmd) { - return getState(s); + return getTemperatureState(s); } }, - FRIDGECURRENTTEMP("fridgeCurrentTemperature", "fridgecurrent", DecimalType.class, false) { + FRIDGECURRENTTEMP("fridgeCurrentTemperature", "fridgecurrent", QuantityType.class, false) { @Override public State getState(String s, DeviceMetaData dmd) { - return getState(s); + return getTemperatureState(s); } }, - FRIDGETARGETTEMP("fridgeTargetTemperature", "fridgetarget", DecimalType.class, false) { + FRIDGETARGETTEMP("fridgeTargetTemperature", "fridgetarget", QuantityType.class, false) { @Override public State getState(String s, DeviceMetaData dmd) { - return getState(s); + return getTemperatureState(s); } }, DOOR("signalDoor", "door", OpenClosedType.class, false) { @@ -160,6 +161,15 @@ public State getState(String s) { return null; } + public State getTemperatureState(String s) { + try { + return ExtendedDeviceStateUtil.getTemperatureState(s); + } catch (NumberFormatException e) { + logger.warn("An exception occurred while converting '{}' into a State", s); + return UnDefType.UNDEF; + } + } + public String getMieleEnum(String s, DeviceMetaData dmd) { if (dmd.MieleEnum != null) { for (Entry enumEntry : dmd.MieleEnum.entrySet()) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java index bf93d57e51566..4e8858e4157dd 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java @@ -18,11 +18,12 @@ import java.util.Map.Entry; import java.util.TimeZone; +import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData; import org.openhab.core.library.types.DateTimeType; -import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.OpenClosedType; +import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.types.StringType; import org.openhab.core.types.State; import org.openhab.core.types.Type; @@ -104,28 +105,28 @@ public State getState(String s, DeviceMetaData dmd) { return getState(dateFormatter.format(date)); } }, - TARGET_TEMP("targetTemperature", "target", DecimalType.class, false) { + TARGET_TEMP("targetTemperature", "target", QuantityType.class, false) { @Override public State getState(String s, DeviceMetaData dmd) { - return getState(s); + return getTemperatureState(s); } }, - MEASURED_TEMP("measuredTemperature", "measured", DecimalType.class, false) { + MEASURED_TEMP("measuredTemperature", "measured", QuantityType.class, false) { @Override public State getState(String s, DeviceMetaData dmd) { - return getState(s); + return getTemperatureState(s); } }, - DEVICE_TEMP_ONE("deviceTemperature1", "temp1", DecimalType.class, false) { + DEVICE_TEMP_ONE("deviceTemperature1", "temp1", QuantityType.class, false) { @Override public State getState(String s, DeviceMetaData dmd) { - return getState(s); + return getTemperatureState(s); } }, - DEVICE_TEMP_TWO("deviceTemperature2", "temp2", DecimalType.class, false) { + DEVICE_TEMP_TWO("deviceTemperature2", "temp2", QuantityType.class, false) { @Override public State getState(String s, DeviceMetaData dmd) { - return getState(s); + return getTemperatureState(s); } }, DOOR("signalDoor", "door", OpenClosedType.class, false) { @@ -216,6 +217,15 @@ public State getState(String s) { return null; } + public State getTemperatureState(String s) { + try { + return ExtendedDeviceStateUtil.getTemperatureState(s); + } catch (NumberFormatException e) { + logger.warn("An exception occurred while converting '{}' into a State", s); + return UnDefType.UNDEF; + } + } + public String getMieleEnum(String s, DeviceMetaData dmd) { if (dmd.MieleEnum != null) { for (Entry enumEntry : dmd.MieleEnum.entrySet()) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java index 18b50e4f7cf40..294cfb61af9b8 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java @@ -23,9 +23,9 @@ import java.util.TimeZone; import org.apache.commons.lang3.StringUtils; +import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData; import org.openhab.core.library.types.DateTimeType; -import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.OpenClosedType; import org.openhab.core.library.types.QuantityType; @@ -111,10 +111,10 @@ public State getState(String s, DeviceMetaData dmd) { return getState(dateFormatter.format(date)); } }, - TARGET_TEMP("targetTemperature", "target", DecimalType.class, false, false) { + TARGET_TEMP("targetTemperature", "target", QuantityType.class, false, false) { @Override public State getState(String s, DeviceMetaData dmd) { - return getState(s); + return getTemperatureState(s); } }, SPINNING_SPEED("spinningSpeed", "spinningspeed", StringType.class, false, false) { @@ -126,7 +126,7 @@ public State getState(String s, DeviceMetaData dmd) { if ("256".equals(s)) { return getState("Rinsing"); } - return getState(Integer.toString((Integer.valueOf(s) * 10))); + return getState(Integer.toString((Integer.valueOf(s)))); } }, DOOR("signalDoor", "door", OpenClosedType.class, false, false) { @@ -223,6 +223,15 @@ public State getState(String s) { return null; } + public State getTemperatureState(String s) { + try { + return ExtendedDeviceStateUtil.getTemperatureState(s); + } catch (NumberFormatException e) { + logger.warn("An exception occurred while converting '{}' into a State", s); + return UnDefType.UNDEF; + } + } + public String getMieleEnum(String s, DeviceMetaData dmd) { if (dmd.MieleEnum != null) { for (Entry enumEntry : dmd.MieleEnum.entrySet()) { diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/channeltypes.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/channeltypes.xml index 72721267faf53..92fde09740ff8 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/channeltypes.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/channeltypes.xml @@ -4,14 +4,14 @@ xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0" xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd"> - + String Current status of the appliance - + String Current program or function running on the appliance @@ -25,7 +25,7 @@ - + String Current phase of the program running on the appliance @@ -36,6 +36,7 @@ DateTime Programmed start time of the program + Time @@ -43,37 +44,40 @@ DateTime Duration of the program running on the appliance + Time - + DateTime Time elapsed in the program running on the appliance + Time - + DateTime Time to finish the program running on the appliance + Time - + Contact Current state of the door of the appliance - + Switch Switch the appliance on or off - + Switch Stop the appliance @@ -86,98 +90,66 @@ - - Number - - Target temperature to be reached by the oven - + + Number:Temperature + + Temperature reported by the appliance + Temperature + - - Number - - Actual measured temperature in the oven - + + Number:Temperature + + Current temperature of the appliance + Temperature + - - Number - - Program temperature in the oven - + + Number:Temperature + + Target temperature to be reached by the appliance + Temperature + - + Switch Start Super Cooling - - Number - - Current temperature in the fridge - - - - + String Current status of the freezer compartment - + String Current status of the fridge compartment - + Switch Start Super Freezing - - Number - - Current temperature in the freezer compartment - - - - - Number - - Target temperature to be reached by the freezer compartment - - - - - Number - - Current temperature in the fridge compartment - - - - - Number - - Target temperature to be reached by the fridge compartment - - - - + Number Number of heating zones/plates on the hob - + Number Power level of the heating zone/plate @@ -191,14 +163,14 @@ - + String Remaining time of the heating zone/plate - + Number Current ventilation power @@ -212,14 +184,14 @@ - + Number:Power Power consumption by the currently running program on the appliance - + Number:Volume Water consumption by the currently running program on the appliance diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridge.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridge.xml index a50007623b86b..ec2ed3ac6eaf8 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridge.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridge.xml @@ -16,8 +16,12 @@ - - + + Current temperature in the fridge + + + Target temperature to be reached by the fridge + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridgefreezer.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridgefreezer.xml index de6aa4371a525..d024ef00c58bc 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridgefreezer.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridgefreezer.xml @@ -19,10 +19,18 @@ - - - - + + Current temperature in the freezer compartment + + + Target temperature to be reached by the freezer compartment + + + Current temperature in the fridge compartment + + + Target temperature to be reached by the fridge compartment + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/oven.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/oven.xml index ac699106a29fb..3c935d4d97c02 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/oven.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/oven.xml @@ -22,10 +22,21 @@ - - - - + + Target temperature to be reached by the oven + + + + Actual measured temperature in the oven + + + + Program temperature in the oven + + + + Program temperature in the oven + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/washingmachine.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/washingmachine.xml index cb138659676ae..f7bf77e7ff846 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/washingmachine.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/washingmachine.xml @@ -24,7 +24,10 @@ - + + + Temperature of the selected program + diff --git a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtilTest.java b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtilTest.java index 5bb52b743e4a5..88c2518aa6536 100644 --- a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtilTest.java +++ b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtilTest.java @@ -15,7 +15,10 @@ import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; +import org.openhab.core.library.types.QuantityType; +import org.openhab.core.library.unit.SIUnits; import org.openhab.core.test.java.JavaTest; +import org.openhab.core.types.UnDefType; /** * This class provides test cases for {@link @@ -45,4 +48,24 @@ public void stringToBytesWhenTopBitIsUsedReturnsSingleByte() { byte[] actual = ExtendedDeviceStateUtil.stringToBytes("\u0000\u0080\u0000"); assertArrayEquals(expected, actual); } + + @Test + public void getTemperatureStateWellFormedValueReturnsQuantityType() throws NumberFormatException { + assertEquals(new QuantityType<>(42, SIUnits.CELSIUS), ExtendedDeviceStateUtil.getTemperatureState("42")); + } + + @Test + public void getTemperatureStateMagicValueReturnsUndefined() throws NumberFormatException { + assertEquals(UnDefType.UNDEF, ExtendedDeviceStateUtil.getTemperatureState("32768")); + } + + @Test + public void getTemperatureStateNonNumericValueThrowsNumberFormatException() { + assertThrows(NumberFormatException.class, () -> ExtendedDeviceStateUtil.getTemperatureState("A")); + } + + @Test + public void getTemperatureStateNullValueThrowsNumberFormatException() { + assertThrows(NumberFormatException.class, () -> ExtendedDeviceStateUtil.getTemperatureState(null)); + } }