This group contains general operational information about the device.
-| Channel ID | Item Type | Description |
-|-------------------------|-----------------------|------------------------------------------------------------------------------------|
-| cabinet-temperature | Number:Temperature | Temperature of the cabinet if supported in Celsius |
-| heatsink-temperature | Number:Temperature | Device heat sink temperature in Celsius |
-| transformer-temperature | Number:Temperature | Temperature of the transformer in Celsius |
-| other-temperature | Number:Temperature | Any other temperature reading not covered by the above items if available. Celsius |
-| status | String | Device status: OFF=Off, SLEEP=Sleeping/night mode, ON=On - producing power |
+| Channel ID | Item Type | Description |
+|-------------------------|-----------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| cabinet-temperature | Number:Temperature | Temperature of the cabinet if supported in Celsius |
+| heatsink-temperature | Number:Temperature | Device heat sink temperature in Celsius |
+| transformer-temperature | Number:Temperature | Temperature of the transformer in Celsius |
+| other-temperature | Number:Temperature | Any other temperature reading not covered by the above items if available. Celsius |
+| status | String | Device status: <ul><li>OFF=Off</li><li>SLEEP=Sleeping/night mode</li><li>STARTING=Grid Monitoring/wake-up</li><li>ON=On - producing power (also called MPPT by Specification)</li><li>THROTTLED=Production (curtailed)<li>SHUTTING_DOWN=Shutting down<li>FAULT=Fault<li> STANDBY=Standby/Maintenance/Setup</ul> |
+| status-vendor | Number | Vendor Specific Status Code |
Supported by: all inverter things
| ac-voltage-to-n | Number:ElectricPotential | Voltage of this line relative to the neutral line |
| ac-voltage-to-next | Number:ElectricPotential | Voltage of this line relative to the next line |
| ac-real-power | Number:Power | AC Real Power value (W) |
-| ac-apparent-power | Number:Power | AC Apparent Power value |
-| ac-reactive-power | Number:Power | AC Reactive Power value |
+| ac-apparent-power | Number:Power | AC Apparent Power value (VA) |
+| ac-reactive-power | Number:Power | AC Reactive Power value (VAR) |
| ac-power-factor | Number:Dimensionless | AC Power Factor (%) |
| ac-exported-real-energy | Number:Energy | Real Energy Exported (Wh |
| ac-imported-real-energy | Number:Energy | Real Energy Imported (Wh) |
*/
package org.openhab.binding.modbus.sunspec.internal;
+import java.util.Arrays;
+import java.util.Optional;
+
/**
* Possible values for an inverter's status field
*
OFF(1),
SLEEP(2),
+ STARTING(3),
ON(4),
+ THROTTLED(5),
+ SHUTTING_DOWN(6),
+ FAULT(7),
+ STANDBY(8),
UNKNOWN(-1);
private final int code;
}
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);
}
}
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";
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;
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));
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));
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
<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>
<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>