Skip to content

Commit

Permalink
[draytonwiser] Expose Smart Plug Power Metering, Improve null handling (
Browse files Browse the repository at this point in the history
#9706)

* [draytonwiser] Expose Smart Plug Power Metering
* [draytonwiser] Handle null values from offline devices

Signed-off-by: James Melville <jamesmelville@gmail.com>
  • Loading branch information
jamesmelville committed Jan 6, 2021
1 parent 6c648c4 commit ae7eb26
Show file tree
Hide file tree
Showing 8 changed files with 79 additions and 21 deletions.
12 changes: 7 additions & 5 deletions bundles/org.openhab.binding.draytonwiser/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Collections
.unmodifiableSet(new HashSet<>(Arrays.asList(THING_TYPE_CONTROLLER, THING_TYPE_ROOM, THING_TYPE_ROOMSTAT,
Expand Down Expand Up @@ -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;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand All @@ -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() {
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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() {
Expand All @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -75,4 +77,12 @@ public String getOverrideState() {
public String getMode() {
return mode;
}

public Integer getCurrentSummationDelivered() {
return currentSummationDelivered;
}

public Integer getInstantaneousDemand() {
return instantaneousDemand;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,8 @@
<channel id="zigbeeConnected" typeId="zigbeeConnected-channel"/>
<channel id="deviceLocked" typeId="deviceLocked-channel"/>
<channel id="manualModeState" typeId="manualModeState-channel"/>
<channel id="plugInstantaneousPower" typeId="plugInstantaneousPower-channel"/>
<channel id="plugEnergyDelivered" typeId="plugEnergyDelivered-channel"/>
</channels>

<representation-property>serialNumber</representation-property>
Expand Down Expand Up @@ -429,4 +431,18 @@
<description>Should the room pre-heat to achieve the desired temperature</description>
</channel-type>

<channel-type id="plugInstantaneousPower-channel">
<item-type>Number:Power</item-type>
<label>Plug Instantaneous Power</label>
<description>Current Power being drawn through the plug</description>
<state readOnly="true" pattern="%d %unit%"/>
</channel-type>

<channel-type id="plugEnergyDelivered-channel">
<item-type>Number:Energy</item-type>
<label>Plug Energy Delivered</label>
<description>Cumulative energy drawn through the plug</description>
<state readOnly="true" pattern="%d %unit%"/>
</channel-type>

</thing:thing-descriptions>

0 comments on commit ae7eb26

Please sign in to comment.