From 6e4f78458d143ced35485241ab1ec87c0990dcc9 Mon Sep 17 00:00:00 2001 From: Andreas Lanz Date: Wed, 5 Oct 2022 07:49:31 +0200 Subject: [PATCH] [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 --- .../README.md | 19 +++++++++-------- .../sunspec/internal/InverterStatus.java | 21 ++++++++++--------- .../sunspec/internal/SunSpecConstants.java | 1 + .../internal/handler/InverterHandler.java | 13 ++++++------ .../resources/OH-INF/i18n/sunspec.properties | 7 +++++++ .../OH-INF/thing/inverter-channel-groups.xml | 1 + .../OH-INF/thing/inverter-channel-types.xml | 12 +++++++++++ 7 files changed, 49 insertions(+), 25 deletions(-) diff --git a/bundles/org.openhab.binding.modbus.sunspec/README.md b/bundles/org.openhab.binding.modbus.sunspec/README.md index df9c9e5d00..5ae9122b16 100644 --- a/bundles/org.openhab.binding.modbus.sunspec/README.md +++ b/bundles/org.openhab.binding.modbus.sunspec/README.md @@ -65,13 +65,14 @@ Different things support a subset of the following groups. 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: | +| status-vendor | Number | Vendor Specific Status Code | Supported by: all inverter things @@ -157,8 +158,8 @@ acPhaseC: available only for meter-wye-phase and meter-delta-phase meters type i | 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) | diff --git a/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/InverterStatus.java b/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/InverterStatus.java index f3f7ea88ba..6340e9e9ad 100644 --- a/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/InverterStatus.java +++ b/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/InverterStatus.java @@ -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 status = Arrays.stream(InverterStatus.values()).filter(s -> s.code == code) + .findFirst(); + return status.orElse(InverterStatus.UNKNOWN); } } diff --git a/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/SunSpecConstants.java b/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/SunSpecConstants.java index 0b231c21c1..81ce50a736 100644 --- a/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/SunSpecConstants.java +++ b/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/SunSpecConstants.java @@ -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"; diff --git a/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/handler/InverterHandler.java b/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/handler/InverterHandler.java index e352cbbcf3..a88ab2f75a 100644 --- a/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/handler/InverterHandler.java +++ b/bundles/org.openhab.binding.modbus.sunspec/src/main/java/org/openhab/binding/modbus/sunspec/internal/handler/InverterHandler.java @@ -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. 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)); diff --git a/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/i18n/sunspec.properties b/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/i18n/sunspec.properties index bc9f9f00c6..10a4d1211c 100644 --- a/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/i18n/sunspec.properties +++ b/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/i18n/sunspec.properties @@ -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 diff --git a/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/thing/inverter-channel-groups.xml b/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/thing/inverter-channel-groups.xml index ad7fb5a157..1e0cbef754 100644 --- a/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/thing/inverter-channel-groups.xml +++ b/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/thing/inverter-channel-groups.xml @@ -12,6 +12,7 @@ + diff --git a/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/thing/inverter-channel-types.xml b/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/thing/inverter-channel-types.xml index 0ee3ccb918..e40ae0b522 100644 --- a/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/thing/inverter-channel-types.xml +++ b/bundles/org.openhab.binding.modbus.sunspec/src/main/resources/OH-INF/thing/inverter-channel-types.xml @@ -116,8 +116,20 @@ + + + + + + + + Number + + Vendor-defined device status and error codes. + + -- 2.47.3