[e3dc] Add performance ratio channels (#19763)

* add performance ratio

Signed-off-by: Bernd Weymann <bernd.weymann@gmail.com>
This commit is contained in:
Bernd Weymann
2025-12-12 09:55:52 +01:00
committed by GitHub
parent 9147e5251d
commit 6c019cb75c
13 changed files with 176 additions and 58 deletions
@@ -84,6 +84,7 @@ The E3DC device offers quite an amount of channels. For clustering 4 Channel Gro
| Channel Label | Channel Group ID | Channel ID | Type | Description |
|-------------------------------|-------------------|------------------------------|------------------------|----------------------------------------------------------------------------------------|
| PV Output | power | pv-power-supply | Number:Power | Photovoltaic Power Production |
| PV Performance Ratio | power | pv-perf-ratio | Number:Dimensionless | Performance ratio of actual energy produced and installed kWp |
| Battery Discharge | power | battery-power-supply | Number:Power | Battery discharges and provides Power |
| Battery Charge | power | battery-power-consumption | Number:Power | Battery charges and consumes Power |
| Household Consumption | power | household-power-consumption | Number:Power | Household consuming Power |
@@ -98,17 +99,15 @@ The E3DC device offers quite an amount of channels. For clustering 4 Channel Gro
### Channel Group _String Details Block_
| Channel Label | Channel Group ID | Channel ID | Type | Description |
|-----------------------|------------------|--------------------|---------------------------|----------------------------|
| String 1 Potential | strings | string1-dc-voltage | Number:ElectricPotential | Voltage on String 1 |
| String 2 Potential | strings | string2-dc-voltage | Number:ElectricPotential | Voltage on String 2 |
| String 3 Potential | strings | string3-dc-voltage | Number:ElectricPotential | Voltage on String 3 |
| String 1 Current | strings | string1-dc-current | Number:ElectricCurrent | Current on String 1 |
| String 2 Current | strings | string2-dc-current | Number:ElectricCurrent | Current on String 2 |
| String 3 Current | strings | string3-dc-current | Number:ElectricCurrent | Current on String 3 |
| String 1 Power | strings | string1-dc-output | Number:Power | Power produced by String 1 |
| String 2 Power | strings | string2-dc-output | Number:Power | Power produced by String 2 |
| String 3 Power | strings | string3-dc-output | Number:Power | Power produced by String 3 |
E3DC power plant supports up to 3 photovoltaic strings.
Each string X = 1,2 or 3 provides following channels:
| Channel Label | Channel Group ID | Channel ID | Type | Description |
|-----------------------|------------------|--------------------|---------------------------|---------------------------------------------------------------|
| String X Potential | strings | stringX-dc-voltage | Number:ElectricPotential | Voltage on String X |
| String X Current | strings | stringX-dc-current | Number:ElectricCurrent | Current on String X |
| String X Power | strings | stringX-dc-output | Number:Power | Power produced by String X |
| String X Ratio | strings | stringX-perf-ratio | Number:Dimensionless | Performance ratio of actual energy produced and installed kWp |
### Channel _EMS Block_
@@ -178,6 +177,7 @@ Number:Power E3DC_GridSupply "E3DC Power from Grid" (e3dc
Number:Power E3DC_ExternalSupply "E3DC External Supply" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#external-power-supply" }
Number:Power E3DC_WallboxConsumption "E3DC Wallbox Consumption" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#wallbox-power-consumption" }
Number:Power E3DC_WallboxPVConsumption "E3DC Wallbox PV Consumption" (e3dc) { channel="modbus:e3dc:device:powerplant:power#wallbox-pv-power-consumption" }
Number:Dimensionless E3DC_PV_Performance "E3DC PV Performance" (e3dc) { channel="modbus:e3dc:device:powerplant:power#pv-perf-ratio" }
Number:Dimensionless E3DC_AutarkyLevel "E3DC Autarky Level" (e3dc) { channel="modbus:e3dc:device:powerplant:power#autarky" }
Number:Dimensionless E3DC_SelfConsumptionLevel "E3DC Self Consumption Level" (e3dc) { channel="modbus:e3dc:device:powerplant:power#self-consumption" }
Number:Dimensionless E3DC_BatterySOC "E3DC Battery SOC" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#battery-soc" }
@@ -205,6 +205,9 @@ Number:ElectricCurrent E3DC_String3A "E3DC String 3 Ampere"
Number:Power E3DC_String1W "E3DC String 1 Watt" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:strings#string1-dc-output" }
Number:Power E3DC_String2W "E3DC String 2 Watt" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:strings#string2-dc-output" }
Number:Power E3DC_String3W "E3DC String 3 Watt" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:strings#string3-dc-output" }
Number:Dimensionless E3DC_String1_Performance "E3DC String 1 Performance" (e3dc) { channel="modbus:e3dc:device:powerplant:strings#string1-perf-ratio" }
Number:Dimensionless E3DC_String2_Performance "E3DC String 2 Performance" (e3dc) { channel="modbus:e3dc:device:powerplant:strings#string2-perf-ratio" }
Number:Dimensionless E3DC_String3_Performance "E3DC String 3 Performance" (e3dc) { channel="modbus:e3dc:device:powerplant:strings#string3-perf-ratio" }
String E3DC_EMS_Status "E3DC EMS Status" (e3dc) { channel="modbus:e3dc:device:powerplant:emergency#emergency-power-status" }
Switch E3DC_EMS_BatteryChargingLock "E3DC EMS Battery Charging Locked" (e3dc) { channel="modbus:e3dc:device:powerplant:emergency#battery-charging-lock" }
@@ -42,6 +42,7 @@ public class E3DCBindingConstants {
// Channels for Power Block
public static final String PV_POWER_SUPPLY_CHANNEL = "pv-power-supply";
public static final String PV_POWER_PERFORMANCE_RATIO_CHANNEL = "pv-perf-ratio";
public static final String BATTERY_POWER_SUPPLY_CHANNEL = "battery-power-supply";
public static final String BATTERY_POWER_CONSUMPTION = "battery-power-consumption";
public static final String HOUSEHOLD_POWER_CONSUMPTION_CHANNEL = "household-power-consumption";
@@ -81,6 +82,9 @@ public class E3DCBindingConstants {
public static final String STRING3_DC_VOLTAGE_CHANNEL = "string3-dc-voltage";
public static final String STRING3_DC_CURRENT_CHANNEL = "string3-dc-current";
public static final String STRING3_DC_OUTPUT_CHANNEL = "string3-dc-output";
public static final String STRING1_PERFORMANCE_RATIO_CHANNEL = "string1-perf-ratio";
public static final String STRING2_PERFORMANCE_RATIO_CHANNEL = "string2-perf-ratio";
public static final String STRING3_PERFORMANCE_RATIO_CHANNEL = "string3-perf-ratio";
// Channels for Emergency Status
public static final String EMERGENCY_POWER_STATUS = "emergency-power-status";
@@ -10,7 +10,7 @@
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.modbus.e3dc.internal;
package org.openhab.binding.modbus.e3dc.internal.config;
import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -24,4 +24,7 @@ public class E3DCConfiguration {
public int refresh = 2000;
public double batteryCapacity = -1;
public double string1Kwp = 0;
public double string2Kwp = 0;
public double string3Kwp = 0;
}
@@ -10,7 +10,7 @@
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.modbus.e3dc.internal;
package org.openhab.binding.modbus.e3dc.internal.config;
import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -19,10 +19,11 @@ import java.util.ArrayList;
import java.util.Optional;
import javax.measure.quantity.Energy;
import javax.measure.quantity.Power;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.modbus.e3dc.internal.E3DCConfiguration;
import org.openhab.binding.modbus.e3dc.internal.config.E3DCConfiguration;
import org.openhab.binding.modbus.e3dc.internal.dto.EmergencyBlock;
import org.openhab.binding.modbus.e3dc.internal.dto.InfoBlock;
import org.openhab.binding.modbus.e3dc.internal.dto.PowerBlock;
@@ -39,6 +40,7 @@ import org.openhab.core.io.transport.modbus.ModbusReadFunctionCode;
import org.openhab.core.io.transport.modbus.ModbusReadRequestBlueprint;
import org.openhab.core.io.transport.modbus.PollTask;
import org.openhab.core.library.types.QuantityType;
import org.openhab.core.library.unit.MetricPrefix;
import org.openhab.core.library.unit.Units;
import org.openhab.core.thing.Bridge;
import org.openhab.core.thing.ChannelUID;
@@ -91,6 +93,7 @@ public class E3DCThingHandler extends BaseBridgeHandler {
private ChannelUID dischargeLockTimeChannel;
private ChannelUID pvPowerSupplyChannel;
private ChannelUID pvPowerRatioChannel;
private ChannelUID batteryPowerSupplyChannel;
private ChannelUID batteryPowerConsumptionChannel;
private ChannelUID householdPowerConsumptionChannel;
@@ -114,6 +117,9 @@ public class E3DCThingHandler extends BaseBridgeHandler {
private ChannelUID string3AmpereChannel;
private ChannelUID string3VoltChannel;
private ChannelUID string3WattChannel;
private ChannelUID string1RatioChannel;
private ChannelUID string2RatioChannel;
private ChannelUID string3RatioChannel;
private final ArrayList<E3DCWallboxThingHandler> listeners = new ArrayList<>();
private final Logger logger = LoggerFactory.getLogger(E3DCThingHandler.class);
@@ -121,9 +127,10 @@ public class E3DCThingHandler extends BaseBridgeHandler {
private ReadStatus dataRead = ReadStatus.NOT_RECEIVED;
private final Parser infoParser = new Parser(DataType.INFO);
private ReadStatus infoRead = ReadStatus.NOT_RECEIVED;
private E3DCConfiguration config = new E3DCConfiguration();
private double totalKwp = 0;
private @Nullable PollTask infoPoller;
private @Nullable PollTask dataPoller;
private @Nullable E3DCConfiguration config;
/**
* Communication interface to the slave endpoint we're connecting to
@@ -152,6 +159,7 @@ public class E3DCThingHandler extends BaseBridgeHandler {
dischargeLockTimeChannel = channelUID(thing, EMERGENCY_GROUP, DISCHARGE_LOCK_TIME);
pvPowerSupplyChannel = channelUID(thing, POWER_GROUP, PV_POWER_SUPPLY_CHANNEL);
pvPowerRatioChannel = channelUID(thing, POWER_GROUP, PV_POWER_PERFORMANCE_RATIO_CHANNEL);
batteryPowerSupplyChannel = channelUID(thing, POWER_GROUP, BATTERY_POWER_SUPPLY_CHANNEL);
batteryPowerConsumptionChannel = channelUID(thing, POWER_GROUP, BATTERY_POWER_CONSUMPTION);
householdPowerConsumptionChannel = channelUID(thing, POWER_GROUP, HOUSEHOLD_POWER_CONSUMPTION_CHANNEL);
@@ -175,6 +183,10 @@ public class E3DCThingHandler extends BaseBridgeHandler {
string3AmpereChannel = channelUID(thing, STRINGS_GROUP, STRING3_DC_CURRENT_CHANNEL);
string3VoltChannel = channelUID(thing, STRINGS_GROUP, STRING3_DC_VOLTAGE_CHANNEL);
string3WattChannel = channelUID(thing, STRINGS_GROUP, STRING3_DC_OUTPUT_CHANNEL);
string1RatioChannel = channelUID(thing, STRINGS_GROUP, STRING1_PERFORMANCE_RATIO_CHANNEL);
string2RatioChannel = channelUID(thing, STRINGS_GROUP, STRING2_PERFORMANCE_RATIO_CHANNEL);
string3RatioChannel = channelUID(thing, STRINGS_GROUP, STRING3_PERFORMANCE_RATIO_CHANNEL);
}
public @Nullable ModbusCommunicationInterface getComms() {
@@ -194,8 +206,8 @@ public class E3DCThingHandler extends BaseBridgeHandler {
public void initialize() {
updateStatus(ThingStatus.UNKNOWN);
scheduler.execute(() -> {
E3DCConfiguration localConfig = getConfigAs(E3DCConfiguration.class);
config = localConfig;
config = getConfigAs(E3DCConfiguration.class);
totalKwp = config.string1Kwp + config.string2Kwp + config.string3Kwp;
ModbusCommunicationInterface localComms = connectEndpoint();
if (localComms != null) {
// register low speed info poller
@@ -207,13 +219,8 @@ public class E3DCThingHandler extends BaseBridgeHandler {
ModbusReadRequestBlueprint dataRequest = new ModbusReadRequestBlueprint(slaveId,
ModbusReadFunctionCode.READ_MULTIPLE_REGISTERS, POWER_REG_START,
REGISTER_LENGTH - INFO_REG_SIZE, 3);
if (config != null) {
dataPoller = localComms.registerRegularPoll(dataRequest, localConfig.refresh, 0,
this::handleDataResult, this::handleDataFailure);
} else {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR,
"E3DC Configuration missing");
}
dataPoller = localComms.registerRegularPoll(dataRequest, config.refresh, 0, this::handleDataResult,
this::handleDataFailure);
} // else state handling performed in connectEndPoint function
});
}
@@ -228,7 +235,6 @@ public class E3DCThingHandler extends BaseBridgeHandler {
ModbusEndpointThingHandler slaveEndpointThingHandler = getEndpointThingHandler();
if (slaveEndpointThingHandler == null) {
@SuppressWarnings("null")
String label = Optional.ofNullable(getBridge()).map(b -> b.getLabel()).orElse("<null>");
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_OFFLINE,
String.format("Bridge '%s' is offline", label));
@@ -243,7 +249,6 @@ public class E3DCThingHandler extends BaseBridgeHandler {
return null;
}
if (comms == null) {
@SuppressWarnings("null")
String label = Optional.ofNullable(getBridge()).map(b -> b.getLabel()).orElse("<null>");
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_OFFLINE,
String.format("Bridge '%s' not completely initialized", label));
@@ -367,17 +372,16 @@ public class E3DCThingHandler extends BaseBridgeHandler {
updateState(autarkyChannel, block.autarky);
updateState(selfConsumptionChannel, block.selfConsumption);
updateState(batterySOCChannel, block.batterySOC);
if (config != null) {
if (config.batteryCapacity > 0) {
double soc = block.batterySOC.doubleValue();
QuantityType<Energy> charged = QuantityType.valueOf(soc * config.batteryCapacity / 100,
Units.KILOWATT_HOUR);
updateState(batteryChargedChannel, charged);
QuantityType<Energy> uncharged = QuantityType
.valueOf((100 - soc) * config.batteryCapacity / 100, Units.KILOWATT_HOUR);
updateState(batteryUnchargedChannel, uncharged);
}
if (config.batteryCapacity > 0) {
double soc = block.batterySOC.doubleValue();
QuantityType<Energy> charged = QuantityType.valueOf(soc * config.batteryCapacity / 100,
Units.KILOWATT_HOUR);
updateState(batteryChargedChannel, charged);
QuantityType<Energy> uncharged = QuantityType.valueOf((100 - soc) * config.batteryCapacity / 100,
Units.KILOWATT_HOUR);
updateState(batteryUnchargedChannel, uncharged);
}
calculatePerformanceRatio(block.pvPowerSupply, totalKwp, pvPowerRatioChannel);
} else {
logger.debug("Unable to get {} from provider {}", DataType.POWER, dataParser.toString());
}
@@ -397,6 +401,9 @@ public class E3DCThingHandler extends BaseBridgeHandler {
updateState(string3AmpereChannel, block.string3Ampere);
updateState(string3VoltChannel, block.string3Volt);
updateState(string3WattChannel, block.string3Watt);
calculatePerformanceRatio(block.string1Watt, config.string1Kwp, string1RatioChannel);
calculatePerformanceRatio(block.string2Watt, config.string2Kwp, string2RatioChannel);
calculatePerformanceRatio(block.string3Watt, config.string3Kwp, string3RatioChannel);
} else {
logger.debug("Unable to get {} from provider {}", DataType.STRINGS, dataParser.toString());
}
@@ -407,6 +414,18 @@ public class E3DCThingHandler extends BaseBridgeHandler {
});
}
private void calculatePerformanceRatio(QuantityType<Power> power, double stringKwp, ChannelUID channel) {
if (stringKwp > 0) {
QuantityType<?> kiloWattPower = power.toUnit(MetricPrefix.KILO(Units.WATT));
if (kiloWattPower == null) {
logger.warn("Cannot convert {} to kW", power);
return;
}
double ratio = kiloWattPower.doubleValue() / stringKwp * 100;
updateState(channel, QuantityType.valueOf(ratio, Units.PERCENT));
}
}
void handleDataFailure(AsyncModbusFailure<ModbusReadRequestBlueprint> result) {
if (dataRead != ReadStatus.READ_FAILED) {
// update status only if bit switches
@@ -21,7 +21,7 @@ import java.util.OptionalInt;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.modbus.e3dc.internal.E3DCWallboxConfiguration;
import org.openhab.binding.modbus.e3dc.internal.config.E3DCWallboxConfiguration;
import org.openhab.binding.modbus.e3dc.internal.dto.DataConverter;
import org.openhab.binding.modbus.e3dc.internal.dto.WallboxArray;
import org.openhab.binding.modbus.e3dc.internal.dto.WallboxBlock;
@@ -9,8 +9,16 @@ thing-type.modbus.e3dc.description = Provide Power values, String Details, Emerg
thing-type.config.modbus.e3dc-wallbox.wallboxId.label = Wallbox ID
thing-type.config.modbus.e3dc-wallbox.wallboxId.description = E3DC supports up to 8 Wallboxes - select a value from 0 to 7
thing-type.config.modbus.e3dc.batteryCapacity.label = Battery Capacity
thing-type.config.modbus.e3dc.batteryCapacity.description = Capacity of the built in battery in kWh
thing-type.config.modbus.e3dc.refresh.label = Refresh Interval
thing-type.config.modbus.e3dc.refresh.description = Refresh Rate of E3DC values in Milliseconds
thing-type.config.modbus.e3dc.string1Kwp.label = String 1 kWp
thing-type.config.modbus.e3dc.string1Kwp.description = String 1 kilowatt peak installed
thing-type.config.modbus.e3dc.string2Kwp.label = String 2 kWp
thing-type.config.modbus.e3dc.string2Kwp.description = String 2 kilowatt peak installed
thing-type.config.modbus.e3dc.string3Kwp.label = String 3 kWp
thing-type.config.modbus.e3dc.string3Kwp.description = String 3 kilowatt peak installed
# channel group types
@@ -20,13 +28,23 @@ channel-group-type.modbus.info-values.label = Information
channel-group-type.modbus.info-values.description = Basic Information of your E3DC Device like Model Name, Serial Number and Software Versions
channel-group-type.modbus.power-values.label = Power Values
channel-group-type.modbus.power-values.description = Provides values of your attached electrical Producers (Photovoltaic, Battery, ... and Consumers (Household, Wallbox, ...)
channel-group-type.modbus.power-values.channel.pv-perf-ratio.label = PV Performance Ratio
channel-group-type.modbus.power-values.channel.pv-perf-ratio.description = Performance ratio of actual energy produced and installed kWp
channel-group-type.modbus.string-values.label = String Details
channel-group-type.modbus.string-values.description = Provide detailed values of your attached Photovoltaic Strings. Evaluate how much Power each String provides
channel-group-type.modbus.string-values.channel.string1-perf-ratio.label = String 1 Ratio
channel-group-type.modbus.string-values.channel.string1-perf-ratio.description = Performance ratio of actual energy produced and installed kWp
channel-group-type.modbus.string-values.channel.string2-perf-ratio.label = String 2 Ratio
channel-group-type.modbus.string-values.channel.string2-perf-ratio.description = Performance ratio of actual energy produced and installed kWp
channel-group-type.modbus.string-values.channel.string3-perf-ratio.label = String 3 Ratio
channel-group-type.modbus.string-values.channel.string3-perf-ratio.description = Performance ratio of actual energy produced and installed kWp
# channel types
channel-type.modbus.autarky-channel.label = Autarky
channel-type.modbus.autarky-channel.description = Your current Autarky Level in Percent
channel-type.modbus.battery-charged-channel.label = Battery Charge
channel-type.modbus.battery-charged-channel.description = Charged energy of battery
channel-type.modbus.battery-charging-lock-channel.label = Battery Charge Locked
channel-type.modbus.battery-charging-lock-channel.description = Battery charging is locked
channel-type.modbus.battery-discharging-lock-channel.label = Battery Discharge Locked
@@ -37,8 +55,6 @@ channel-type.modbus.battery-power-supply-channel.label = Battery Discharge
channel-type.modbus.battery-power-supply-channel.description = Battery discharges and provides Power
channel-type.modbus.battery-soc-channel.label = Battery State Of Charge
channel-type.modbus.battery-soc-channel.description = Charge Level of your attached Battery in Percent
channel-type.modbus.battery-charged-channel.label = Battery Charge
channel-type.modbus.battery-charged-channel.description = Charged energy of battery
channel-type.modbus.battery-uncharged-channel.label = Battery Open Capacity
channel-type.modbus.battery-uncharged-channel.description = Open energy capacity of battery
channel-type.modbus.charge-lock-time-channel.label = Charge Lock Time Active
@@ -67,6 +83,7 @@ channel-type.modbus.modbus-id-channel.label = Modbus-ID
channel-type.modbus.modbus-id-channel.description = Modbus ID / Magic Byte of E3DC
channel-type.modbus.model-name-channel.label = Model Name
channel-type.modbus.model-name-channel.description = Name of the E3DC Model
channel-type.modbus.perf-ratio-channel.label = Performance Ratio
channel-type.modbus.pv-power-supply-channel.label = PV Output
channel-type.modbus.pv-power-supply-channel.description = Photovoltaic Power Production
channel-type.modbus.regulation-status-channel.label = Grid Power Supply Regulation
@@ -16,16 +16,33 @@
<channel-group id="strings" typeId="string-values"/>
<channel-group id="emergency" typeId="emergency-values"/>
</channel-groups>
<properties>
<property name="thingTypeVersion">1</property>
</properties>
<config-description>
<parameter name="refresh" type="integer" min="1000" unit="ms">
<label>Refresh Interval</label>
<description>Refresh Rate of E3DC values in Milliseconds</description>
<default>2000</default>
</parameter>
<parameter name="batteryCapacity" type="decimal">
<parameter name="batteryCapacity" type="decimal" step="0.001">
<label>Battery Capacity</label>
<description>Capacity of the built in battery in kWh</description>
</parameter>
<parameter name="string1Kwp" type="decimal" step="0.001">
<label>String 1 kWp</label>
<description>String 1 kilowatt peak installed</description>
</parameter>
<parameter name="string2Kwp" type="decimal" step="0.001">
<label>String 2 kWp</label>
<description>String 2 kilowatt peak installed</description>
</parameter>
<parameter name="string3Kwp" type="decimal" step="0.001">
<label>String 3 kWp</label>
<description>String 3 kilowatt peak installed</description>
</parameter>
</config-description>
</bridge-type>
</thing:thing-descriptions>
@@ -9,6 +9,10 @@
(Household, Wallbox, ...)</description>
<channels>
<channel id="pv-power-supply" typeId="pv-power-supply-channel"/>
<channel id="pv-perf-ratio" typeId="perf-ratio-channel">
<label>PV Performance Ratio</label>
<description>Performance ratio of actual energy produced and installed kWp</description>
</channel>
<channel id="battery-power-supply" typeId="battery-power-supply-channel"/>
<channel id="battery-power-consumption" typeId="battery-power-consumption-channel"/>
<channel id="household-power-consumption" typeId="household-power-consumption-channel"/>
@@ -11,7 +11,7 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="battery-power-supply-channel">
<item-type>Number:Power</item-type>
@@ -21,7 +21,7 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="battery-power-consumption-channel">
<item-type>Number:Power</item-type>
@@ -31,7 +31,7 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="household-power-consumption-channel">
<item-type>Number:Power</item-type>
@@ -41,7 +41,7 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="grid-power-consumption-channel">
<item-type>Number:Power</item-type>
@@ -51,7 +51,7 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="grid-power-supply-channel">
<item-type>Number:Power</item-type>
@@ -61,7 +61,7 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="external-power-supply-channel">
<item-type>Number:Power</item-type>
@@ -71,7 +71,7 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="wallbox-power-consumption-channel">
<item-type>Number:Power</item-type>
@@ -81,7 +81,7 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="wallbox-pv-power-consumption-channel">
<item-type>Number:Power</item-type>
@@ -91,19 +91,19 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="autarky-channel">
<item-type>Number:Dimensionless</item-type>
<label>Autarky</label>
<description>Your current Autarky Level in Percent</description>
<state pattern="%d %%" readOnly="true"/>
<state pattern="%.0f %%" readOnly="true"/>
</channel-type>
<channel-type id="self-consumption-channel">
<item-type>Number:Dimensionless</item-type>
<label>Self Consumtion</label>
<description>Your current Photovoltaic Self Consumption Level in Percent</description>
<state pattern="%d %%" readOnly="true"/>
<state pattern="%.0f %%" readOnly="true"/>
</channel-type>
<channel-type id="battery-soc-channel">
<item-type>Number:Dimensionless</item-type>
@@ -113,7 +113,7 @@
<tag>Status</tag>
<tag>Energy</tag>
</tags>
<state pattern="%d %%" readOnly="true"/>
<state pattern="%.0f %%" readOnly="true"/>
</channel-type>
<channel-type id="battery-charged-channel">
<item-type>Number:Energy</item-type>
@@ -135,4 +135,12 @@
</tags>
<state pattern="%.3f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="perf-ratio-channel">
<item-type>Number:Dimensionless</item-type>
<label>Performance Ratio</label>
<tags>
<tag>Measurement</tag>
</tags>
<state pattern="%.1f %unit%" readOnly="true"/>
</channel-type>
</thing:thing-descriptions>
@@ -17,6 +17,18 @@
<channel id="string1-dc-output" typeId="string1-dc-output-channel"/>
<channel id="string2-dc-output" typeId="string2-dc-output-channel"/>
<channel id="string3-dc-output" typeId="string3-dc-output-channel"/>
<channel id="string1-perf-ratio" typeId="perf-ratio-channel">
<label>String 1 Ratio</label>
<description>Performance ratio of actual energy produced and installed kWp</description>
</channel>
<channel id="string2-perf-ratio" typeId="perf-ratio-channel">
<label>String 2 Ratio</label>
<description>Performance ratio of actual energy produced and installed kWp</description>
</channel>
<channel id="string3-perf-ratio" typeId="perf-ratio-channel">
<label>String 3 Ratio</label>
<description>Performance ratio of actual energy produced and installed kWp</description>
</channel>
</channels>
</channel-group-type>
</thing:thing-descriptions>
@@ -11,7 +11,7 @@
<tag>Measurement</tag>
<tag>Voltage</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="string2-dc-voltage-channel">
<item-type>Number:ElectricPotential</item-type>
@@ -21,7 +21,7 @@
<tag>Measurement</tag>
<tag>Voltage</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="string3-dc-voltage-channel">
<item-type>Number:ElectricPotential</item-type>
@@ -31,7 +31,7 @@
<tag>Measurement</tag>
<tag>Voltage</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="string1-dc-current-channel">
<item-type>Number:ElectricCurrent</item-type>
@@ -71,7 +71,7 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="string2-dc-output-channel">
<item-type>Number:Power</item-type>
@@ -81,7 +81,7 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="string3-dc-output-channel">
<item-type>Number:Power</item-type>
@@ -91,6 +91,6 @@
<tag>Measurement</tag>
<tag>Power</tag>
</tags>
<state pattern="%d %unit%" readOnly="true"/>
<state pattern="%.0f %unit%" readOnly="true"/>
</channel-type>
</thing:thing-descriptions>
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<update:update-descriptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:update="https://openhab.org/schemas/update-description/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/update-description/v1.0.0 https://openhab.org/schemas/update-description-1.0.0.xsd">
<thing-type uid="modbus:e3dc">
<instruction-set targetVersion="1">
<add-channel id="pv-perf-ratio" groupIds="power">
<type>modbus:perf-ratio-channel</type>
<label>PV Performance Ratio</label>
<description>Performance ratio of actual energy produced and installed kWp</description>
</add-channel>
<add-channel id="string1-perf-ratio" groupIds="strings">
<type>modbus:perf-ratio-channel</type>
<label>String 1 Ratio</label>
<description>Performance ratio of actual energy produced and installed kWp</description>
</add-channel>
<add-channel id="string2-perf-ratio" groupIds="strings">
<type>modbus:perf-ratio-channel</type>
<label>String 2 Ratio</label>
<description>Performance ratio of actual energy produced and installed kWp</description>
</add-channel>
<add-channel id="string3-perf-ratio" groupIds="strings">
<type>modbus:perf-ratio-channel</type>
<label>String 3 Ratio</label>
<description>Performance ratio of actual energy produced and installed kWp</description>
</add-channel>
</instruction-set>
</thing-type>
</update:update-descriptions>