[miele] Temperature channel improvements: UoM, categories and descriptions (#11329)

* Improvements for temperature channels

Fixes #11317

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>

* Added jlaur as miele binding maintainer

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>

* Fix spinning speed for washing machines

Fixes #11317

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>

* Added time as category for DateTime-related channels

Fixes #11317

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>

* Elapsed/remaining time channels are no longer marked as advanced.

Fixes #11317

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>

* Fixed type for temperature item examples.

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>

* Document all states (cross-appliance).

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>

* Improved error handling for getTemperatureState

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>

* Split current/target temperature into two channel types for label reuse

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>

* Fix possible NullPointerException

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>

* Distinguish between oven program temperatures

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>

* Mark oven program temperature 1 and 2 as advanced.

Fixes #11317

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
This commit is contained in:
jlaur 2021-10-02 19:57:22 +02:00 committed by GitHub
parent b1f412377f
commit 8d38276dce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 205 additions and 112 deletions

View File

@ -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

View File

@ -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"}
```

View File

@ -14,6 +14,11 @@ package org.openhab.binding.miele.internal;
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 @@ import java.nio.charset.StandardCharsets;
*/
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 class ExtendedDeviceStateUtil {
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);
}
}

View File

@ -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";

View File

@ -17,10 +17,11 @@ import static org.openhab.binding.miele.internal.MieleBindingConstants.SUPERCOOL
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 enum FridgeChannelSelector implements ApplianceChannelSelector {
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<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {

View File

@ -18,10 +18,11 @@ import static org.openhab.binding.miele.internal.MieleBindingConstants.SUPERFREE
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 enum FridgeFreezerChannelSelector implements ApplianceChannelSelector {
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<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {

View File

@ -18,11 +18,12 @@ import java.util.Date;
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 enum OvenChannelSelector implements ApplianceChannelSelector {
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 enum OvenChannelSelector implements ApplianceChannelSelector {
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<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {

View File

@ -23,9 +23,9 @@ import java.util.Map.Entry;
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 enum WashingMachineChannelSelector implements ApplianceChannelSelector {
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 enum WashingMachineChannelSelector implements ApplianceChannelSelector {
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 enum WashingMachineChannelSelector implements ApplianceChannelSelector {
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<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {

View File

@ -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">
<channel-type id="state" advanced="false">
<channel-type id="state">
<item-type>String</item-type>
<label>Status</label>
<description>Current status of the appliance</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="program" advanced="false">
<channel-type id="program">
<item-type>String</item-type>
<label>Program</label>
<description>Current program or function running on the appliance</description>
@ -25,7 +25,7 @@
<state readOnly="true"></state>
</channel-type>
<channel-type id="phase" advanced="false">
<channel-type id="phase">
<item-type>String</item-type>
<label>Phase</label>
<description>Current phase of the program running on the appliance</description>
@ -36,6 +36,7 @@
<item-type>DateTime</item-type>
<label>Start Time</label>
<description>Programmed start time of the program</description>
<category>Time</category>
<state readOnly="true" pattern="%1$tH:%1$tM"></state>
</channel-type>
@ -43,37 +44,40 @@
<item-type>DateTime</item-type>
<label>Duration</label>
<description>Duration of the program running on the appliance</description>
<category>Time</category>
<state readOnly="true" pattern="%1$tH:%1$tM"></state>
</channel-type>
<channel-type id="elapsed" advanced="true">
<channel-type id="elapsed">
<item-type>DateTime</item-type>
<label>Elapsed Time</label>
<description>Time elapsed in the program running on the appliance</description>
<category>Time</category>
<state readOnly="true" pattern="%1$tH:%1$tM"></state>
</channel-type>
<channel-type id="finish" advanced="true">
<channel-type id="finish">
<item-type>DateTime</item-type>
<label>Finish Time</label>
<description>Time to finish the program running on the appliance</description>
<category>Time</category>
<state readOnly="true" pattern="%1$tH:%1$tM"></state>
</channel-type>
<channel-type id="door" advanced="false">
<channel-type id="door">
<item-type>Contact</item-type>
<label>Door</label>
<description>Current state of the door of the appliance</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="switch" advanced="false">
<channel-type id="switch">
<item-type>Switch</item-type>
<label>Switch</label>
<description>Switch the appliance on or off</description>
</channel-type>
<channel-type id="stop" advanced="false">
<channel-type id="stop">
<item-type>Switch</item-type>
<label>Stop</label>
<description>Stop the appliance</description>
@ -86,98 +90,66 @@
<state readOnly="true"></state>
</channel-type>
<channel-type id="target" advanced="true">
<item-type>Number</item-type>
<label>Target Temperature</label>
<description>Target temperature to be reached by the oven</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="measured" advanced="true">
<item-type>Number</item-type>
<label>Measured Temperature</label>
<description>Actual measured temperature in the oven</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="temp" advanced="true">
<item-type>Number</item-type>
<channel-type id="temperature" advanced="true">
<item-type>Number:Temperature</item-type>
<label>Temperature</label>
<description>Program temperature in the oven</description>
<state readOnly="true"></state>
<description>Temperature reported by the appliance</description>
<category>Temperature</category>
<state readOnly="true" pattern="%.0f %unit%"/>
</channel-type>
<channel-type id="supercool" advanced="false">
<channel-type id="currentTemperature">
<item-type>Number:Temperature</item-type>
<label>Current Temperature</label>
<description>Current temperature of the appliance</description>
<category>Temperature</category>
<state readOnly="true" pattern="%.0f %unit%"/>
</channel-type>
<channel-type id="targetTemperature">
<item-type>Number:Temperature</item-type>
<label>Target Temperature</label>
<description>Target temperature to be reached by the appliance</description>
<category>Temperature</category>
<state readOnly="true" pattern="%.0f %unit%"/>
</channel-type>
<channel-type id="supercool">
<item-type>Switch</item-type>
<label>Super Cool</label>
<description>Start Super Cooling</description>
<state readOnly="false"></state>
</channel-type>
<channel-type id="current" advanced="false">
<item-type>Number</item-type>
<label>Current Temperature</label>
<description>Current temperature in the fridge</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="freezerstate" advanced="false">
<channel-type id="freezerstate">
<item-type>String</item-type>
<label>Status</label>
<description>Current status of the freezer compartment</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="fridgestate" advanced="false">
<channel-type id="fridgestate">
<item-type>String</item-type>
<label>Status</label>
<description>Current status of the fridge compartment</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="superfreeze" advanced="false">
<channel-type id="superfreeze">
<item-type>Switch</item-type>
<label>Super Freeze</label>
<description>Start Super Freezing</description>
<state readOnly="false"></state>
</channel-type>
<channel-type id="freezercurrent" advanced="false">
<item-type>Number</item-type>
<label>Current Temperature</label>
<description>Current temperature in the freezer compartment</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="freezertarget" advanced="true">
<item-type>Number</item-type>
<label>Target Temperature</label>
<description>Target temperature to be reached by the freezer compartment</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="fridgecurrent" advanced="false">
<item-type>Number</item-type>
<label>Current Temperature</label>
<description>Current temperature in the fridge compartment</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="fridgetarget" advanced="true">
<item-type>Number</item-type>
<label>Target Temperature</label>
<description>Target temperature to be reached by the fridge compartment</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="plates" advanced="false">
<channel-type id="plates">
<item-type>Number</item-type>
<label>Plates</label>
<description>Number of heating zones/plates on the hob</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="power" advanced="false">
<channel-type id="power">
<item-type>Number</item-type>
<label>Power Step</label>
<description>Power level of the heating zone/plate</description>
@ -191,14 +163,14 @@
<state readOnly="true"></state>
</channel-type>
<channel-type id="time" advanced="true">
<channel-type id="time">
<item-type>String</item-type>
<label>Remaining Time</label>
<description>Remaining time of the heating zone/plate</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="ventilation" advanced="false">
<channel-type id="ventilation">
<item-type>Number</item-type>
<label>Ventilation Power</label>
<description>Current ventilation power</description>
@ -212,14 +184,14 @@
<state readOnly="true"></state>
</channel-type>
<channel-type id="powerConsumption" advanced="false">
<channel-type id="powerConsumption">
<item-type>Number:Power</item-type>
<label>Power Consumption</label>
<description>Power consumption by the currently running program on the appliance</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="waterConsumption" advanced="false">
<channel-type id="waterConsumption">
<item-type>Number:Volume</item-type>
<label>Water Consumption</label>
<description>Water consumption by the currently running program on the appliance</description>

View File

@ -16,8 +16,12 @@
<channels>
<channel id="state" typeId="state"/>
<channel id="supercool" typeId="supercool"/>
<channel id="current" typeId="current"/>
<channel id="target" typeId="target"/>
<channel id="current" typeId="currentTemperature">
<description>Current temperature in the fridge</description>
</channel>
<channel id="target" typeId="targetTemperature">
<description>Target temperature to be reached by the fridge</description>
</channel>
<channel id="door" typeId="door"/>
<channel id="start" typeId="switch"/>
</channels>

View File

@ -19,10 +19,18 @@
<channel id="fridgestate" typeId="fridgestate"/>
<channel id="supercool" typeId="supercool"/>
<channel id="superfreeze" typeId="superfreeze"/>
<channel id="freezercurrent" typeId="freezercurrent"/>
<channel id="freezertarget" typeId="freezertarget"/>
<channel id="fridgecurrent" typeId="fridgecurrent"/>
<channel id="fridgetarget" typeId="fridgetarget"/>
<channel id="freezercurrent" typeId="currentTemperature">
<description>Current temperature in the freezer compartment</description>
</channel>
<channel id="freezertarget" typeId="targetTemperature">
<description>Target temperature to be reached by the freezer compartment</description>
</channel>
<channel id="fridgecurrent" typeId="currentTemperature">
<description>Current temperature in the fridge compartment</description>
</channel>
<channel id="fridgetarget" typeId="targetTemperature">
<description>Target temperature to be reached by the fridge compartment</description>
</channel>
<channel id="door" typeId="door"/>
<channel id="start" typeId="switch"/>
</channels>

View File

@ -22,10 +22,21 @@
<channel id="duration" typeId="duration"/>
<channel id="elapsed" typeId="elapsed"/>
<channel id="finish" typeId="finish"/>
<channel id="target" typeId="target"/>
<channel id="measured" typeId="measured"/>
<channel id="temp1" typeId="temp"/>
<channel id="temp2" typeId="temp"/>
<channel id="target" typeId="targetTemperature">
<description>Target temperature to be reached by the oven</description>
</channel>
<channel id="measured" typeId="currentTemperature">
<label>Measured Temperature</label>
<description>Actual measured temperature in the oven</description>
</channel>
<channel id="temp1" typeId="temperature">
<label>Program Temperature 1</label>
<description>Program temperature in the oven</description>
</channel>
<channel id="temp2" typeId="temperature">
<label>Program Temperature 2</label>
<description>Program temperature in the oven</description>
</channel>
<channel id="door" typeId="door"/>
<channel id="stop" typeId="stop"/>
<channel id="switch" typeId="switch"/>

View File

@ -24,7 +24,10 @@
<channel id="finish" typeId="finish"/>
<channel id="door" typeId="door"/>
<channel id="switch" typeId="switch"/>
<channel id="target" typeId="target"/>
<channel id="target" typeId="targetTemperature">
<label>Temperature</label>
<description>Temperature of the selected program</description>
</channel>
<channel id="spinningspeed" typeId="spinningspeed"/>
<channel id="powerConsumption" typeId="powerConsumption"/>
<channel id="waterConsumption" typeId="waterConsumption"/>

View File

@ -15,7 +15,10 @@ package org.openhab.binding.miele.internal;
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 class ExtendedDeviceStateUtilTest extends JavaTest {
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));
}
}