Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[draytonwiser] Expose Smart Plug Power Metering, Improve null handling #9706

Merged
merged 2 commits into from
Jan 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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>