[wemo] Add dimensions for power/energy channel types for Insight Switch. (#11208)

* Add dimensions for power/energy channel types for Insight Switch.

Fixes #11207

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
This commit is contained in:
jlaur 2021-09-08 20:36:03 +02:00 committed by GitHub
parent 5ae581f4e1
commit 8f836a08ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 83 additions and 76 deletions

View File

@ -40,59 +40,59 @@ MZ100 94103EA2B278xxxx [ deviceID="94103EA2B278xxxx" ]
Devices support some of the following channels: Devices support some of the following channels:
| Channel Type | Item Type | Description | Available on Thing | | Channel Type | Item Type | Description | Available on Thing |
|---------------------|-----------|---------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------| |---------------------|---------------|----------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------|
| motionDetection | Switch | On if motion is detected, off otherwise. (Motion Sensor only) | Motion | | motionDetection | Switch | On if motion is detected, off otherwise. (Motion Sensor only) | Motion |
| lastMotionDetected | DateTime | Date and Time when the last motion was detected. (Motion Sensor only) | Motion | | lastMotionDetected | DateTime | Date and Time when the last motion was detected. (Motion Sensor only) | Motion |
| state | Switch | This channel controls the actual binary State of a Device or represents Motion Detection. | All but Dimmer, Crockpot, Airpurifier and Humidifier | | state | Switch | This channel controls the actual binary State of a Device or represents Motion Detection. | All but Dimmer, Crockpot, Airpurifier and Humidifier |
| lastChangedAt | DateTime | Date and Time the device was last turned on or of. | Insight | | lastChangedAt | DateTime | Date and Time the device was last turned on or of. | Insight |
| lastOnFor | Number | Time in seconds an Insight device was last turned on for. | Insight | | lastOnFor | Number | Time in seconds an Insight device was last turned on for. | Insight |
| onToday | Number | Time in seconds an Insight device has been switched on today. | Insight | | onToday | Number | Time in seconds an Insight device has been switched on today. | Insight |
| onTotal | Number | Time in seconds an Insight device has been switched on totally. | Insight | | onTotal | Number | Time in seconds an Insight device has been switched on totally. | Insight |
| timespan | Number | Time in seconds over which onTotal applies. Typically 2 weeks except first used. | Insight | | timespan | Number | Time in seconds over which onTotal applies. Typically 2 weeks except first used. | Insight |
| averagePower | Number | Average power consumption in Watts. | Insight | | averagePower | Number:Power | Average power consumption in Watts. | Insight |
| currentPower | Number | Current power consumption of an Insight device. 0 if switched off. | Insight | | currentPower | Number:Power | Current power consumption of an Insight device. 0 if switched off. | Insight |
| energyToday | Number | Energy in Wh used today. | Insight | | energyToday | Number:Energy | Energy in Wh used today. | Insight |
| energyTotal | Number | Energy in Wh used in total. | Insight | | energyTotal | Number:Energy | Energy in Wh used in total. | Insight |
| standbyLimit | Number | Minimum energy draw in W to register device as switched on (default 8W, configurable via WeMo App). | Insight | | standbyLimit | Number:Power | Minimum energy draw in W to register device as switched on (default 8W, configurable via WeMo App). | Insight |
| onStandBy | Switch | Read-only indication of whether or not the device plugged in to the insight switch is drawing more than the standby limit. | Insight | | onStandBy | Switch | Read-only indication of whether or not the device plugged in to the insight switch is drawing more than the standby limit. | Insight |
| relay | Switch | Switches the integrated relay contact close/open | Maker | | relay | Switch | Switches the integrated relay contact close/open | Maker |
| sensor | Switch | Shows the state of the integrated sensor | Maker | | sensor | Switch | Shows the state of the integrated sensor | Maker |
| coffeeMode | String | Operation mode of a WeMo Coffee Maker | CoffeeMaker | | coffeeMode | String | Operation mode of a WeMo Coffee Maker | CoffeeMaker |
| modeTime | Number | Current amount of time, in minutes, that the Coffee Maker has been in the current mode | CoffeeMaker | | modeTime | Number | Current amount of time, in minutes, that the Coffee Maker has been in the current mode | CoffeeMaker |
| timeRemaining | Number | Remaining brewing time of a WeMo Coffee Maker | CoffeeMaker | | timeRemaining | Number | Remaining brewing time of a WeMo Coffee Maker | CoffeeMaker |
| waterLevelReached | Switch | Indicates if the WeMo Coffee Maker needs to be refilled | CoffeeMaker | | waterLevelReached | Switch | Indicates if the WeMo Coffee Maker needs to be refilled | CoffeeMaker |
| cleanAdvise | Switch | Indicates if a WeMo Coffee Maker needs to be cleaned | CoffeeMaker | | cleanAdvise | Switch | Indicates if a WeMo Coffee Maker needs to be cleaned | CoffeeMaker |
| filterAdvise | Switch | Indicates if a WeMo Coffee Maker needs to have the filter changed | CoffeeMaker | | filterAdvise | Switch | Indicates if a WeMo Coffee Maker needs to have the filter changed | CoffeeMaker |
| brewed | DateTime | Date/time the coffee maker last completed brewing coffee | CoffeeMaker | | brewed | DateTime | Date/time the coffee maker last completed brewing coffee | CoffeeMaker |
| lastCleaned | DateTime | Date/time the coffee maker last completed cleaning | CoffeeMaker | | lastCleaned | DateTime | Date/time the coffee maker last completed cleaning | CoffeeMaker |
| brightness | Number | Brightness of a WeMo LED od Dimmwer. | LED, DimmerSwitch | | brightness | Number | Brightness of a WeMo LED od Dimmwer. | LED, DimmerSwitch |
| faderCountDownTime | Number | Dimmer fading duration time in minutes | DimmerSwitch | | faderCountDownTime | Number | Dimmer fading duration time in minutes | DimmerSwitch |
| faderEnabled | Switch | Switch the fader ON/OFF | DimmerSwitch | | faderEnabled | Switch | Switch the fader ON/OFF | DimmerSwitch |
| timerStart | Switch | Switch the fading timer ON/OFF | DimmerSwitch | | timerStart | Switch | Switch the fading timer ON/OFF | DimmerSwitch |
| nightMode | Switch | Switch the nightMode ON/OFF | DimmerSwitch | | nightMode | Switch | Switch the nightMode ON/OFF | DimmerSwitch |
| startTime | DateTime | Time when the nightMode starts | DimmerSwitch | | startTime | DateTime | Time when the nightMode starts | DimmerSwitch |
| endTime | DateTime | Time when the nightMode ends | DimmerSwitch | | endTime | DateTime | Time when the nightMode ends | DimmerSwitch |
| nightModeBrightness | Number | Brightness used in nightMode | DimmerSwitch | | nightModeBrightness | Number | Brightness used in nightMode | DimmerSwitch |
| cookMode | String | Shows the operation mode of a WeMo Crockpot (OFF, WARM, LOW, HIGH | Crockpot | | cookMode | String | Shows the operation mode of a WeMo Crockpot (OFF, WARM, LOW, HIGH | Crockpot |
| warmCookTime | Number | Shows the timer settings for warm cooking mode | Crockpot | | warmCookTime | Number | Shows the timer settings for warm cooking mode | Crockpot |
| lowCookTime | Number | Shows the timer settings for low cooking mode | Crockpot | | lowCookTime | Number | Shows the timer settings for low cooking mode | Crockpot |
| highCookTime | Number | Shows the timer settings for high cooking mode | Crockpot | | highCookTime | Number | Shows the timer settings for high cooking mode | Crockpot |
| cookedTime | Number | Shows the elapsed cooking time | Crockpot | | cookedTime | Number | Shows the elapsed cooking time | Crockpot |
| purifierMode | String | Runmode of Air Purifier (OFF, LOW, MED, HIGH, AUTO) | Air Purifier | | purifierMode | String | Runmode of Air Purifier (OFF, LOW, MED, HIGH, AUTO) | Air Purifier |
| airQuality | String | Air quality (POOR, MODERATE, GOOD) | Air Purifier | | airQuality | String | Air quality (POOR, MODERATE, GOOD) | Air Purifier |
| ionizer | Switch | Indicates whether the ionizer is switched ON or OFF | Air Purifier | | ionizer | Switch | Indicates whether the ionizer is switched ON or OFF | Air Purifier |
| filterLife | Number | Indicates the remaining filter lifetime in Percent | Air Purifier, Humidifier | | filterLife | Number | Indicates the remaining filter lifetime in Percent | Air Purifier, Humidifier |
| expiredFilterTime | Number | Indicates whether the filter lifetime has expired or not | Air Purifier, Humidifier | | expiredFilterTime | Number | Indicates whether the filter lifetime has expired or not | Air Purifier, Humidifier |
| filterPresent | Switch | Indicates the presence of an air filter | Air Purifier | | filterPresent | Switch | Indicates the presence of an air filter | Air Purifier |
| humidifierMode | String | Runmode of Humidifier (OFF, MIN, LOW, MED, HIGH, MAX) | Humidifier | | humidifierMode | String | Runmode of Humidifier (OFF, MIN, LOW, MED, HIGH, MAX) | Humidifier |
| desiredHumidity | Number | Shows desired humidity in Percent | Humidifier | | desiredHumidity | Number | Shows desired humidity in Percent | Humidifier |
| currentHumidity | Number | Shows current humidity in Percent | Humidifier | | currentHumidity | Number | Shows current humidity in Percent | Humidifier |
| heaterMode | String | Runmode of Heater (OFF, FROSTPROTECT, HIGH, LOW, ECO) | Heater | | heaterMode | String | Runmode of Heater (OFF, FROSTPROTECT, HIGH, LOW, ECO) | Heater |
| currentTemp | Number | Shows current temperature | Heater | | currentTemp | Number | Shows current temperature | Heater |
| targetTemp | Number | Shows target temperature | Heater | | targetTemp | Number | Shows target temperature | Heater |
| autoOffTime | DateTime | Time when the heater switches off | Heater | | autoOffTime | DateTime | Time when the heater switches off | Heater |
| heatingRemaining | Number | Shows the remaining heating time | Heater | | heatingRemaining | Number | Shows the remaining heating time | Heater |
## Full Example ## Full Example
@ -124,7 +124,7 @@ DateTime MotionDetected { channel="wemo:Motion:Sensor1:lastMotionDetected"
// Insight // Insight
Switch InsightSwitch { channel="wemo:insight:Insight-1_0-xxxxxxxxxxxxxx:state" } Switch InsightSwitch { channel="wemo:insight:Insight-1_0-xxxxxxxxxxxxxx:state" }
Number InsightPower { channel="wemo:insight:Insight-1_0-xxxxxxxxxxxxxx:currentPower" } Number:Power InsightPower { channel="wemo:insight:Insight-1_0-xxxxxxxxxxxxxx:currentPower" }
Number InsightLastOn { channel="wemo:insight:Insight-1_0-xxxxxxxxxxxxxx:lastOnFor" } Number InsightLastOn { channel="wemo:insight:Insight-1_0-xxxxxxxxxxxxxx:lastOnFor" }
Number InsightToday { channel="wemo:insight:Insight-1_0-xxxxxxxxxxxxxx:onToday" } Number InsightToday { channel="wemo:insight:Insight-1_0-xxxxxxxxxxxxxx:onToday" }
Number InsightTotal { channel="wemo:insight:Insight-1_0-xxxxxxxxxxxxxx:onTotal" } Number InsightTotal { channel="wemo:insight:Insight-1_0-xxxxxxxxxxxxxx:onTotal" }

View File

@ -39,6 +39,8 @@ import org.openhab.core.io.transport.upnp.UpnpIOService;
import org.openhab.core.library.types.DateTimeType; import org.openhab.core.library.types.DateTimeType;
import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.OnOffType;
import org.openhab.core.library.types.QuantityType;
import org.openhab.core.library.unit.Units;
import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing; import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus; import org.openhab.core.thing.ThingStatus;
@ -245,13 +247,16 @@ public class WemoHandler extends AbstractWemoHandler implements UpnpIOParticipan
logger.trace("New InsightParam timespan '{}' for device '{}' received", timespan, getThing().getUID()); logger.trace("New InsightParam timespan '{}' for device '{}' received", timespan, getThing().getUID());
updateState(CHANNEL_TIMESPAN, timespan); updateState(CHANNEL_TIMESPAN, timespan);
State averagePower = DecimalType.valueOf(splitInsightParams[6]); // natively given in W State averagePower = new QuantityType<>(DecimalType.valueOf(splitInsightParams[6]), Units.WATT); // natively
// given
// in W
logger.trace("New InsightParam averagePower '{}' for device '{}' received", averagePower, logger.trace("New InsightParam averagePower '{}' for device '{}' received", averagePower,
getThing().getUID()); getThing().getUID());
updateState(CHANNEL_AVERAGEPOWER, averagePower); updateState(CHANNEL_AVERAGEPOWER, averagePower);
BigDecimal currentMW = new BigDecimal(splitInsightParams[7]); BigDecimal currentMW = new BigDecimal(splitInsightParams[7]);
State currentPower = new DecimalType(currentMW.divide(new BigDecimal(1000), RoundingMode.HALF_UP)); // recalculate State currentPower = new QuantityType<>(currentMW.divide(new BigDecimal(1000), 0, RoundingMode.HALF_UP),
Units.WATT); // recalculate
// mW to W // mW to W
logger.trace("New InsightParam currentPower '{}' for device '{}' received", currentPower, logger.trace("New InsightParam currentPower '{}' for device '{}' received", currentPower,
getThing().getUID()); getThing().getUID());
@ -259,29 +264,30 @@ public class WemoHandler extends AbstractWemoHandler implements UpnpIOParticipan
BigDecimal energyTodayMWMin = new BigDecimal(splitInsightParams[8]); BigDecimal energyTodayMWMin = new BigDecimal(splitInsightParams[8]);
// recalculate mW-mins to Wh // recalculate mW-mins to Wh
State energyToday = new DecimalType( State energyToday = new QuantityType<>(
energyTodayMWMin.divide(new BigDecimal(60000), RoundingMode.HALF_UP)); energyTodayMWMin.divide(new BigDecimal(60000), 0, RoundingMode.HALF_UP), Units.WATT_HOUR);
logger.trace("New InsightParam energyToday '{}' for device '{}' received", energyToday, logger.trace("New InsightParam energyToday '{}' for device '{}' received", energyToday,
getThing().getUID()); getThing().getUID());
updateState(CHANNEL_ENERGYTODAY, energyToday); updateState(CHANNEL_ENERGYTODAY, energyToday);
BigDecimal energyTotalMWMin = new BigDecimal(splitInsightParams[9]); BigDecimal energyTotalMWMin = new BigDecimal(splitInsightParams[9]);
// recalculate mW-mins to Wh // recalculate mW-mins to Wh
State energyTotal = new DecimalType( State energyTotal = new QuantityType<>(
energyTotalMWMin.divide(new BigDecimal(60000), RoundingMode.HALF_UP)); energyTotalMWMin.divide(new BigDecimal(60000), 0, RoundingMode.HALF_UP), Units.WATT_HOUR);
logger.trace("New InsightParam energyTotal '{}' for device '{}' received", energyTotal, logger.trace("New InsightParam energyTotal '{}' for device '{}' received", energyTotal,
getThing().getUID()); getThing().getUID());
updateState(CHANNEL_ENERGYTOTAL, energyTotal); updateState(CHANNEL_ENERGYTOTAL, energyTotal);
BigDecimal standByLimitMW = new BigDecimal(splitInsightParams[10]); BigDecimal standByLimitMW = new BigDecimal(splitInsightParams[10]);
State standByLimit = new DecimalType(standByLimitMW.divide(new BigDecimal(1000), RoundingMode.HALF_UP)); // recalculate State standByLimit = new QuantityType<>(
standByLimitMW.divide(new BigDecimal(1000), 0, RoundingMode.HALF_UP), Units.WATT); // recalculate
// mW to W // mW to W
logger.trace("New InsightParam standByLimit '{}' for device '{}' received", standByLimit, logger.trace("New InsightParam standByLimit '{}' for device '{}' received", standByLimit,
getThing().getUID()); getThing().getUID());
updateState(CHANNEL_STANDBYLIMIT, standByLimit); updateState(CHANNEL_STANDBYLIMIT, standByLimit);
if (currentMW.divide(new BigDecimal(1000), RoundingMode.HALF_UP).intValue() > standByLimitMW if (currentMW.divide(new BigDecimal(1000), 0, RoundingMode.HALF_UP).intValue() > standByLimitMW
.divide(new BigDecimal(1000), RoundingMode.HALF_UP).intValue()) { .divide(new BigDecimal(1000), 0, RoundingMode.HALF_UP).intValue()) {
updateState(CHANNEL_ONSTANDBY, OnOffType.OFF); updateState(CHANNEL_ONSTANDBY, OnOffType.OFF);
} else { } else {
updateState(CHANNEL_ONSTANDBY, OnOffType.ON); updateState(CHANNEL_ONSTANDBY, OnOffType.ON);

View File

@ -236,43 +236,43 @@
</channel-type> </channel-type>
<channel-type id="averagePower" advanced="true"> <channel-type id="averagePower" advanced="true">
<item-type>Number</item-type> <item-type>Number:Power</item-type>
<label>Average Power</label> <label>Average Power</label>
<description>The average power consumption</description> <description>The average power consumption</description>
<category>Energy</category> <category>Energy</category>
<state pattern="%.1f W"/> <state pattern="%.0f %unit%"/>
</channel-type> </channel-type>
<channel-type id="currentPower"> <channel-type id="currentPower">
<item-type>Number</item-type> <item-type>Number:Power</item-type>
<label>Power</label> <label>Power</label>
<description>The current power consumption</description> <description>The current power consumption</description>
<category>Energy</category> <category>Energy</category>
<state pattern="%.1f W"/> <state pattern="%.0f %unit%"/>
</channel-type> </channel-type>
<channel-type id="energyToday" advanced="true"> <channel-type id="energyToday" advanced="true">
<item-type>Number</item-type> <item-type>Number:Energy</item-type>
<label>Energy Today</label> <label>Energy Today</label>
<description>Todays power consumption</description> <description>Todays power consumption</description>
<category>Energy</category> <category>Energy</category>
<state pattern="%.1f Wh"/> <state pattern="%.0f %unit%"/>
</channel-type> </channel-type>
<channel-type id="energyTotal" advanced="true"> <channel-type id="energyTotal" advanced="true">
<item-type>Number</item-type> <item-type>Number:Energy</item-type>
<label>Energy Total</label> <label>Energy Total</label>
<description>Total power consumption</description> <description>Total power consumption</description>
<category>Energy</category> <category>Energy</category>
<state pattern="%.1f Wh"/> <state pattern="%.0f %unit%"/>
</channel-type> </channel-type>
<channel-type id="standByLimit" advanced="true"> <channel-type id="standByLimit" advanced="true">
<item-type>Number</item-type> <item-type>Number:Power</item-type>
<label>StandBy Limit</label> <label>StandBy Limit</label>
<description>Total power consumption</description> <description>Minimum energy draw to register device as switched on</description>
<category>Energy</category> <category>Energy</category>
<state pattern="%.1f W"/> <state pattern="%.0f %unit%"/>
</channel-type> </channel-type>
<channel-type id="onStandBy" advanced="true"> <channel-type id="onStandBy" advanced="true">
@ -392,7 +392,6 @@
<description>Allows to switch the timer ON/OFF</description> <description>Allows to switch the timer ON/OFF</description>
</channel-type> </channel-type>
<channel-type id="nightMode" advanced="true"> <channel-type id="nightMode" advanced="true">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>NightMode OFF/ON</label> <label>NightMode OFF/ON</label>

View File

@ -25,6 +25,8 @@ import org.openhab.binding.wemo.internal.handler.WemoHandler;
import org.openhab.binding.wemo.internal.http.WemoHttpCall; import org.openhab.binding.wemo.internal.http.WemoHttpCall;
import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.OnOffType;
import org.openhab.core.library.types.QuantityType;
import org.openhab.core.library.unit.Units;
import org.openhab.core.thing.Thing; import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus; import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.ThingStatusDetail; import org.openhab.core.thing.ThingStatusDetail;
@ -122,7 +124,7 @@ public class WemoHandlerTest {
@Test @Test
public void assertThatChannelAVERAGEPOWERIsUpdatedOnReceivedValue() { public void assertThatChannelAVERAGEPOWERIsUpdatedOnReceivedValue() {
insightParams.avgPower = POWER_PARAM; insightParams.avgPower = POWER_PARAM;
State expectedStateType = new DecimalType(POWER_PARAM); State expectedStateType = new QuantityType<>(POWER_PARAM, Units.WATT);
String expectedChannel = CHANNEL_AVERAGEPOWER; String expectedChannel = CHANNEL_AVERAGEPOWER;
testOnValueReceived(expectedChannel, expectedStateType, insightParams.toString()); testOnValueReceived(expectedChannel, expectedStateType, insightParams.toString());