From bc99ed4abcebf00bc3b4f5c234127c43214ee94f Mon Sep 17 00:00:00 2001 From: James Melville Date: Wed, 6 Jan 2021 23:09:11 +0000 Subject: [PATCH] [draytonwiser] Expose Smart Plug Power Metering, Improve null handling (#9706) * [draytonwiser] Expose Smart Plug Power Metering * [draytonwiser] Handle null values from offline devices Signed-off-by: James Melville --- .../README.md | 12 ++++++----- .../DraytonWiserBindingConstants.java | 17 +++++++++++----- .../internal/handler/RoomStatHandler.java | 9 ++++++--- .../internal/handler/SmartPlugHandler.java | 20 +++++++++++++++++-- .../internal/handler/TRVHandler.java | 12 +++++++---- .../internal/model/DeviceDTO.java | 4 ++-- .../internal/model/SmartPlugDTO.java | 10 ++++++++++ .../resources/OH-INF/thing/thing-types.xml | 16 +++++++++++++++ 8 files changed, 79 insertions(+), 21 deletions(-) diff --git a/bundles/org.openhab.binding.draytonwiser/README.md b/bundles/org.openhab.binding.draytonwiser/README.md index 6a05d3b5c0d23..57c63b90a3fe5 100644 --- a/bundles/org.openhab.binding.draytonwiser/README.md +++ b/bundles/org.openhab.binding.draytonwiser/README.md @@ -111,11 +111,13 @@ The `awaySetPoint` defines the temperature in degrees Celsius that will be sent #### Smart Plug -| Channel | Item Type | Description | -|---------------------|-----------|------------------------------------| -| `currentSignalRSSI` | Number | Relative Signal Strength Indicator | -| `currentSignalLQI` | Number | Link Quality Indicator | -| `zigbeeConnected` | Switch | Is the TRV joined to network | +| Channel | Item Type | Description | +|--------------------------|---------------|--------------------------------------------| +| `currentSignalRSSI` | Number | Relative Signal Strength Indicator | +| `currentSignalLQI` | Number | Link Quality Indicator | +| `zigbeeConnected` | Switch | Is the TRV joined to network | +| `plugInstantaneousPower` | Number:Power | Current Power being drawn through the plug | +| `plugEnergyDelivered` | Number:Energy | Cumulative energy drawn through the plug | ### Command Channels diff --git a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/DraytonWiserBindingConstants.java b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/DraytonWiserBindingConstants.java index 340498b68844f..aecc1d0ac95ce 100644 --- a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/DraytonWiserBindingConstants.java +++ b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/DraytonWiserBindingConstants.java @@ -18,6 +18,7 @@ import java.util.Set; import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; import org.openhab.core.library.types.DecimalType; import org.openhab.core.thing.ThingTypeUID; import org.openhab.core.types.State; @@ -105,6 +106,8 @@ public class DraytonWiserBindingConstants { public static final String CHANNEL_SMARTPLUG_OUTPUT_STATE = "plugOutputState"; public static final String CHANNEL_SMARTPLUG_AWAY_ACTION = "plugAwayAction"; public static final String CHANNEL_COMFORT_MODE_STATE = "comfortModeState"; + public static final String CHANNEL_SMARTPLUG_INSTANTANEOUS_POWER = "plugInstantaneousPower"; + public static final String CHANNEL_SMARTPLUG_ENERGY_DELIVERED = "plugEnergyDelivered"; public static final Set SUPPORTED_THING_TYPES_UIDS = Collections .unmodifiableSet(new HashSet<>(Arrays.asList(THING_TYPE_CONTROLLER, THING_TYPE_ROOM, THING_TYPE_ROOMSTAT, @@ -149,11 +152,15 @@ private BatteryLevel(final int batteryLevel) { this.batteryLevel = batteryLevel; } - public static State toBatteryLevel(final String level) { - try { - return new DecimalType(BatteryLevel.valueOf(level.toUpperCase()).batteryLevel); - } catch (final IllegalArgumentException e) { - // Catch unrecognized values. + public static State toBatteryLevel(final @Nullable String level) { + if (level != null) { + try { + return new DecimalType(BatteryLevel.valueOf(level.toUpperCase()).batteryLevel); + } catch (final IllegalArgumentException e) { + // Catch unrecognized values. + return UnDefType.UNDEF; + } + } else { return UnDefType.UNDEF; } } diff --git a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/RoomStatHandler.java b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/RoomStatHandler.java index 05abfffd8c136..e636300aa42d8 100644 --- a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/RoomStatHandler.java +++ b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/RoomStatHandler.java @@ -104,11 +104,13 @@ private State getTemperature() { } private State getSignalRSSI() { - return new DecimalType(getData().device.getRssi()); + final Integer rssi = getData().device.getRssi(); + return rssi == null ? UnDefType.UNDEF : new QuantityType<>(rssi, Units.DECIBEL_MILLIWATTS); } private State getSignalLQI() { - return new DecimalType(getData().device.getLqi()); + final Integer lqi = getData().device.getLqi(); + return lqi == null ? UnDefType.UNDEF : new DecimalType(lqi); } private State getWiserSignalStrength() { @@ -120,7 +122,8 @@ private State getSignalStrength() { } private State getBatteryVoltage() { - return new QuantityType<>(getData().device.getBatteryVoltage() / 10.0, Units.VOLT); + final Integer voltage = getData().device.getBatteryVoltage(); + return voltage == null ? UnDefType.UNDEF : new QuantityType<>(voltage / 10.0, Units.VOLT); } private State getWiserBatteryLevel() { diff --git a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/SmartPlugHandler.java b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/SmartPlugHandler.java index fc7ea58fae78e..674c4dabf8577 100644 --- a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/SmartPlugHandler.java +++ b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/SmartPlugHandler.java @@ -23,6 +23,8 @@ import org.openhab.binding.draytonwiser.internal.model.SmartPlugDTO; import org.openhab.core.library.types.DecimalType; 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.types.Command; import org.openhab.core.types.State; @@ -79,6 +81,8 @@ protected void refresh() { updateState(CHANNEL_ZIGBEE_CONNECTED, this::getZigbeeConnected); updateState(CHANNEL_DEVICE_LOCKED, this::getDeviceLocked); updateState(CHANNEL_MANUAL_MODE_STATE, this::getManualModeState); + updateState(CHANNEL_SMARTPLUG_INSTANTANEOUS_POWER, this::getInstantaneousDemand); + updateState(CHANNEL_SMARTPLUG_ENERGY_DELIVERED, this::getCurrentSummationDelivered); } @Override @@ -100,11 +104,13 @@ private State getOutputState() { } private State getSignalRSSI() { - return new DecimalType(getData().device.getRssi()); + final Integer rssi = getData().device.getRssi(); + return rssi == null ? UnDefType.UNDEF : new QuantityType<>(rssi, Units.DECIBEL_MILLIWATTS); } private State getSignalLQI() { - return new DecimalType(getData().device.getLqi()); + final Integer lqi = getData().device.getLqi(); + return lqi == null ? UnDefType.UNDEF : new DecimalType(lqi); } private State getZigbeeConnected() { @@ -136,6 +142,16 @@ private void setAwayAction(final Boolean awayAction) throws DraytonWiserApiExcep getApi().setSmartPlugAwayAction(getData().smartPlug.getId(), awayAction); } + private State getInstantaneousDemand() { + final Integer demand = getData().smartPlug.getInstantaneousDemand(); + return demand == null ? UnDefType.UNDEF : new QuantityType<>(demand, Units.WATT); + } + + private State getCurrentSummationDelivered() { + final Integer delivered = getData().smartPlug.getCurrentSummationDelivered(); + return delivered == null ? UnDefType.UNDEF : new QuantityType<>(delivered, Units.WATT_HOUR); + } + static class SmartPlugData { public final SmartPlugDTO smartPlug; public final DeviceDTO device; diff --git a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/TRVHandler.java b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/TRVHandler.java index b2c2bd37e6eab..a4fb275486872 100644 --- a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/TRVHandler.java +++ b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/handler/TRVHandler.java @@ -93,7 +93,8 @@ private State getSetPoint() { } private State getDemand() { - return new QuantityType<>(getData().smartValve.getPercentageDemand(), Units.PERCENT); + final Integer demand = getData().smartValve.getPercentageDemand(); + return demand == null ? UnDefType.UNDEF : new QuantityType<>(demand, Units.PERCENT); } private State getTemperature() { @@ -104,11 +105,13 @@ private State getTemperature() { } private State getSignalRSSI() { - return new DecimalType(getData().device.getRssi()); + final Integer rssi = getData().device.getRssi(); + return rssi == null ? UnDefType.UNDEF : new QuantityType<>(rssi, Units.DECIBEL_MILLIWATTS); } private State getSignalLQI() { - return new DecimalType(getData().device.getLqi()); + final Integer lqi = getData().device.getLqi(); + return lqi == null ? UnDefType.UNDEF : new DecimalType(lqi); } private State getWiserSignalStrength() { @@ -120,7 +123,8 @@ private State getSignalStrength() { } private State getBatteryVoltage() { - return new QuantityType<>(getData().device.getBatteryVoltage() / 10.0, Units.VOLT); + final Integer voltage = getData().device.getBatteryVoltage(); + return voltage == null ? UnDefType.UNDEF : new QuantityType<>(voltage / 10.0, Units.VOLT); } private State getWiserBatteryLevel() { diff --git a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/model/DeviceDTO.java b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/model/DeviceDTO.java index b6b216362f94e..c7b81ff442d21 100644 --- a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/model/DeviceDTO.java +++ b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/model/DeviceDTO.java @@ -88,8 +88,8 @@ public String getDisplayedSignalStrength() { return displayedSignalStrength; } - public int getBatteryVoltage() { - return batteryVoltage == null ? Integer.MIN_VALUE : batteryVoltage; + public Integer getBatteryVoltage() { + return batteryVoltage; } public String getBatteryLevel() { diff --git a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/model/SmartPlugDTO.java b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/model/SmartPlugDTO.java index 419409303fc66..9e4f7261455dc 100644 --- a/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/model/SmartPlugDTO.java +++ b/bundles/org.openhab.binding.draytonwiser/src/main/java/org/openhab/binding/draytonwiser/internal/model/SmartPlugDTO.java @@ -31,6 +31,8 @@ public class SmartPlugDTO { private String targetState; private Integer debounceCount; private String overrideState; + private Integer currentSummationDelivered; + private Integer instantaneousDemand; public Integer getId() { return id; @@ -75,4 +77,12 @@ public String getOverrideState() { public String getMode() { return mode; } + + public Integer getCurrentSummationDelivered() { + return currentSummationDelivered; + } + + public Integer getInstantaneousDemand() { + return instantaneousDemand; + } } diff --git a/bundles/org.openhab.binding.draytonwiser/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.draytonwiser/src/main/resources/OH-INF/thing/thing-types.xml index 6fd046ace695b..e87d7a6f85cdb 100644 --- a/bundles/org.openhab.binding.draytonwiser/src/main/resources/OH-INF/thing/thing-types.xml +++ b/bundles/org.openhab.binding.draytonwiser/src/main/resources/OH-INF/thing/thing-types.xml @@ -219,6 +219,8 @@ + + serialNumber @@ -429,4 +431,18 @@ Should the room pre-heat to achieve the desired temperature + + Number:Power + + Current Power being drawn through the plug + + + + + Number:Energy + + Cumulative energy drawn through the plug + + +