[SunSpec] Add missing Inverter Status, Add Channel for Vendor-Specific Status (#13480)

* [SunSpec] Added missing InverterStatus

See e.g., https://github.com/sunspec/models/blob/master/json/model_101.json#L307

* [SunSpec] Added Channel for Vendor Specific Status

* [SunSpec] Fixing two old TODOs

VA and VAR are defined as alternate unit for WATT so no breaking change.

Signed-off-by: Andreas Lanz <alanz@gmx.de>
This commit is contained in:
Andreas Lanz
2022-10-05 07:49:31 +02:00
committed by GitHub
parent 232cef371a
commit 6e4f78458d
7 changed files with 49 additions and 25 deletions

View File

@@ -12,6 +12,9 @@
*/
package org.openhab.binding.modbus.sunspec.internal;
import java.util.Arrays;
import java.util.Optional;
/**
* Possible values for an inverter's status field
*
@@ -21,7 +24,12 @@ public enum InverterStatus {
OFF(1),
SLEEP(2),
STARTING(3),
ON(4),
THROTTLED(5),
SHUTTING_DOWN(6),
FAULT(7),
STANDBY(8),
UNKNOWN(-1);
private final int code;
@@ -35,15 +43,8 @@ public enum InverterStatus {
}
public static InverterStatus getByCode(int code) {
switch (code) {
case 1:
return InverterStatus.OFF;
case 2:
return InverterStatus.SLEEP;
case 4:
return InverterStatus.ON;
default:
return InverterStatus.UNKNOWN;
}
Optional<InverterStatus> status = Arrays.stream(InverterStatus.values()).filter(s -> s.code == code)
.findFirst();
return status.orElse(InverterStatus.UNKNOWN);
}
}

View File

@@ -92,6 +92,7 @@ public class SunSpecConstants {
public static final String CHANNEL_TRANSFORMER_TEMPERATURE = "transformer-temperature";
public static final String CHANNEL_OTHER_TEMPERATURE = "other-temperature";
public static final String CHANNEL_STATUS = "status";
public static final String CHANNEL_STATUS_VENDOR = "status-vendor";
// List of channel ids in AC general group for inverter
public static final String CHANNEL_AC_TOTAL_CURRENT = "ac-total-current";

View File

@@ -23,8 +23,10 @@ import org.openhab.binding.modbus.sunspec.internal.InverterStatus;
import org.openhab.binding.modbus.sunspec.internal.dto.InverterModelBlock;
import org.openhab.binding.modbus.sunspec.internal.parser.InverterModelParser;
import org.openhab.core.io.transport.modbus.ModbusRegisterArray;
import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.thing.Thing;
import org.openhab.core.types.State;
import org.openhab.core.types.UnDefType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -82,6 +84,9 @@ public class InverterHandler extends AbstractSunSpecHandler {
updateState(channelUID(GROUP_DEVICE_INFO, CHANNEL_STATUS),
status == null ? UnDefType.UNDEF : new StringType(status.name()));
updateState(channelUID(GROUP_DEVICE_INFO, CHANNEL_STATUS_VENDOR),
block.statusVendor.<State> map(DecimalType::new).orElse(UnDefType.UNDEF));
// AC General group
updateState(channelUID(GROUP_AC_GENERAL, CHANNEL_AC_TOTAL_CURRENT),
getScaled(block.acCurrentTotal, block.acCurrentSF, AMPERE));
@@ -92,14 +97,10 @@ public class InverterHandler extends AbstractSunSpecHandler {
getScaled(block.acFrequency, block.acFrequencySF, HERTZ));
updateState(channelUID(GROUP_AC_GENERAL, CHANNEL_AC_APPARENT_POWER),
getScaled(block.acApparentPower, block.acApparentPowerSF, WATT)); // TODO: VA currently not supported,
// see:
// https://github.com/openhab/openhab-core/pull/1347
getScaled(block.acApparentPower, block.acApparentPowerSF, VOLT_AMPERE));
updateState(channelUID(GROUP_AC_GENERAL, CHANNEL_AC_REACTIVE_POWER),
getScaled(block.acReactivePower, block.acReactivePowerSF, WATT)); // TODO: var currently not supported,
// see:
// https://github.com/openhab/openhab-core/pull/1347
getScaled(block.acReactivePower, block.acReactivePowerSF, VAR));
updateState(channelUID(GROUP_AC_GENERAL, CHANNEL_AC_POWER_FACTOR),
getScaled(block.acPowerFactor, block.acPowerFactorSF, PERCENT));

View File

@@ -97,5 +97,12 @@ channel-type.modbus.status-type.label = Status
channel-type.modbus.status-type.description = Device status
channel-type.modbus.status-type.state.option.OFF = Off
channel-type.modbus.status-type.state.option.SLEEP = Sleeping / Night mode
channel-type.modbus.status-type.state.option.STARTING=Grid Monitoring/wake-up
channel-type.modbus.status-type.state.option.ON = On - producing power
channel-type.modbus.status-type.state.option.THROTTLED=Production (curtailed)
channel-type.modbus.status-type.state.option.SHUTTING_DOWN=Shutting down
channel-type.modbus.status-type.state.option.FAULT=Fault
channel-type.modbus.status-type.state.option.STANDBY=Standby/Maintenance/Setup
channel-type.modbus.status-vendor-type.label = Vendor-defined Status
channel-type.modbus.status-vendor-type.description = Vendor-defined device status and error codes
channel-type.modbus.transformer-temperature-type.label = Transformer Temperature

View File

@@ -12,6 +12,7 @@
<channel id="transformer-temperature" typeId="transformer-temperature-type"/>
<channel id="other-temperature" typeId="other-temperature-type"/>
<channel id="status" typeId="status-type"/>
<channel id="status-vendor" typeId="status-vendor-type"/>
</channels>
</channel-group-type>

View File

@@ -116,8 +116,20 @@
<options>
<option value="OFF">Off</option>
<option value="SLEEP">Sleeping / Night mode</option>
<option value="STARTING">Grid Monitoring/wake-up</option>
<option value="ON">On - producing power</option>
<option value="THROTTLED">Production (curtailed)</option>
<option value="SHUTTING_DOWN">Shutting down</option>
<option value="FAULT">Fault</option>
<option value="STANDBY">Standby/Maintenance/Setup</option>
</options>
</state>
</channel-type>
<channel-type id="status-vendor-type">
<item-type>Number</item-type>
<label>Vendor-defined Status</label>
<description>Vendor-defined device status and error codes.</description>
<state readOnly="true" pattern="%d"/>
</channel-type>
</thing:thing-descriptions>