diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/AbstractGoodWeEtCharger.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/AbstractGoodWeEtCharger.java index 2e32ec0273e..d00e710dfdb 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/AbstractGoodWeEtCharger.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/AbstractGoodWeEtCharger.java @@ -9,7 +9,6 @@ import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent; import io.openems.edge.bridge.modbus.api.ModbusComponent; import io.openems.edge.bridge.modbus.api.ModbusProtocol; -import io.openems.edge.bridge.modbus.api.element.UnsignedDoublewordElement; import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement; import io.openems.edge.bridge.modbus.api.task.FC3ReadRegistersTask; import io.openems.edge.common.component.OpenemsComponent; @@ -52,19 +51,38 @@ protected ModbusProtocol defineModbusProtocol() { new FC3ReadRegistersTask(startAddress, Priority.HIGH, // m(EssDcCharger.ChannelId.VOLTAGE, new UnsignedWordElement(startAddress), // SCALE_FACTOR_2), // - m(EssDcCharger.ChannelId.CURRENT, new UnsignedWordElement(startAddress + 1), SCALE_FACTOR_2), - m(EssDcCharger.ChannelId.ACTUAL_POWER, new UnsignedDoublewordElement(startAddress + 2)))); + m(EssDcCharger.ChannelId.CURRENT, new UnsignedWordElement(startAddress + 1), SCALE_FACTOR_2))); } @Override public void handleEvent(Event event) { switch (event.getTopic()) { case EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE: + this.calculatePower(); this.calculateEnergy(); this.updateState(); break; } } + + /** + * Calculate the ActivePower from Current and Voltage. + */ + private void calculatePower() { + var voltage = this.getVoltage().get(); + var current = this.getCurrent().get(); + if (voltage == null || current == null) { + return; + } + int milliAmpere = current; + int milliVolt = voltage; + long powerMicrowatt = (long) milliAmpere * (long) milliVolt; // mA * mV = µW + int powerWatt = (int) (powerMicrowatt / 1_000_000L); // µW -> W + var actualPower = this.getActualPower().get(); + if (actualPower == null || actualPower != powerWatt) { + this._setActualPower(powerWatt); + } + } /** * Calculate the Energy values from ActivePower. diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV4.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV4.java new file mode 100644 index 00000000000..bc6bec6fa46 --- /dev/null +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV4.java @@ -0,0 +1,38 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +import io.openems.edge.goodwe.GoodWeConstants; + +@ObjectClassDefinition(// + name = "GoodWe Charger PV4", // + description = "Implements the GoodWe-ET Charger 4.") + +@interface ConfigPV4 { + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "charger3"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter", description = "ID of GoodWe Energy Storage System or Battery-Inverter.") + String essOrBatteryInverter_id() default "batteryInverter0"; + + @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter target filter", description = "This is auto-generated by 'GoodWe ESS or Battery-Inverter'.") + String essOrBatteryInverter_target() default "(enabled=true)"; + + @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus bridge.") + String modbus_id() default "modbus0"; + + @AttributeDefinition(name = "Modbus Unit-ID", description = "The Unit-ID of the Modbus device.") + int modbusUnitId() default GoodWeConstants.DEFAULT_UNIT_ID; + + @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") + String Modbus_target() default "(enabled=true)"; + + String webconsole_configurationFactory_nameHint() default "GoodWe Charger PV4 [{id}]"; +} diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV5.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV5.java new file mode 100644 index 00000000000..8011bf20d51 --- /dev/null +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV5.java @@ -0,0 +1,38 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +import io.openems.edge.goodwe.GoodWeConstants; + +@ObjectClassDefinition(// + name = "GoodWe Charger PV5", // + description = "Implements the GoodWe-ET Charger 5.") + +@interface ConfigPV5 { + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "charger4"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter", description = "ID of GoodWe Energy Storage System or Battery-Inverter.") + String essOrBatteryInverter_id() default "batteryInverter0"; + + @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter target filter", description = "This is auto-generated by 'GoodWe ESS or Battery-Inverter'.") + String essOrBatteryInverter_target() default "(enabled=true)"; + + @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus bridge.") + String modbus_id() default "modbus0"; + + @AttributeDefinition(name = "Modbus Unit-ID", description = "The Unit-ID of the Modbus device.") + int modbusUnitId() default GoodWeConstants.DEFAULT_UNIT_ID; + + @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") + String Modbus_target() default "(enabled=true)"; + + String webconsole_configurationFactory_nameHint() default "GoodWe Charger PV5 [{id}]"; +} diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV6.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV6.java new file mode 100644 index 00000000000..5e558817356 --- /dev/null +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV6.java @@ -0,0 +1,38 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +import io.openems.edge.goodwe.GoodWeConstants; + +@ObjectClassDefinition(// + name = "GoodWe Charger PV6", // + description = "Implements the GoodWe-ET Charger 6.") + +@interface ConfigPV6 { + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "charger5"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter", description = "ID of GoodWe Energy Storage System or Battery-Inverter.") + String essOrBatteryInverter_id() default "batteryInverter0"; + + @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter target filter", description = "This is auto-generated by 'GoodWe ESS or Battery-Inverter'.") + String essOrBatteryInverter_target() default "(enabled=true)"; + + @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus bridge.") + String modbus_id() default "modbus0"; + + @AttributeDefinition(name = "Modbus Unit-ID", description = "The Unit-ID of the Modbus device.") + int modbusUnitId() default GoodWeConstants.DEFAULT_UNIT_ID; + + @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") + String Modbus_target() default "(enabled=true)"; + + String webconsole_configurationFactory_nameHint() default "GoodWe Charger PV6 [{id}]"; +} diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV7.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV7.java new file mode 100644 index 00000000000..ade2841f2b7 --- /dev/null +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV7.java @@ -0,0 +1,38 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +import io.openems.edge.goodwe.GoodWeConstants; + +@ObjectClassDefinition(// + name = "GoodWe Charger PV7", // + description = "Implements the GoodWe-ET Charger 7.") + +@interface ConfigPV7 { + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "charger6"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter", description = "ID of GoodWe Energy Storage System or Battery-Inverter.") + String essOrBatteryInverter_id() default "batteryInverter0"; + + @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter target filter", description = "This is auto-generated by 'GoodWe ESS or Battery-Inverter'.") + String essOrBatteryInverter_target() default "(enabled=true)"; + + @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus bridge.") + String modbus_id() default "modbus0"; + + @AttributeDefinition(name = "Modbus Unit-ID", description = "The Unit-ID of the Modbus device.") + int modbusUnitId() default GoodWeConstants.DEFAULT_UNIT_ID; + + @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") + String Modbus_target() default "(enabled=true)"; + + String webconsole_configurationFactory_nameHint() default "GoodWe Charger PV7 [{id}]"; +} diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV8.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV8.java new file mode 100644 index 00000000000..764d3205fb4 --- /dev/null +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/ConfigPV8.java @@ -0,0 +1,38 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +import io.openems.edge.goodwe.GoodWeConstants; + +@ObjectClassDefinition(// + name = "GoodWe Charger PV8", // + description = "Implements the GoodWe-ET Charger 8.") + +@interface ConfigPV8 { + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "charger7"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter", description = "ID of GoodWe Energy Storage System or Battery-Inverter.") + String essOrBatteryInverter_id() default "batteryInverter0"; + + @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter target filter", description = "This is auto-generated by 'GoodWe ESS or Battery-Inverter'.") + String essOrBatteryInverter_target() default "(enabled=true)"; + + @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus bridge.") + String modbus_id() default "modbus0"; + + @AttributeDefinition(name = "Modbus Unit-ID", description = "The Unit-ID of the Modbus device.") + int modbusUnitId() default GoodWeConstants.DEFAULT_UNIT_ID; + + @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") + String Modbus_target() default "(enabled=true)"; + + String webconsole_configurationFactory_nameHint() default "GoodWe Charger PV8 [{id}]"; +} diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv1.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv1.java index b1346c45324..52d4ba5f032 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv1.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv1.java @@ -53,9 +53,6 @@ protected void setModbus(BridgeModbus modbus) { super.setModbus(modbus); } - public GoodWeChargerPv1() { - } - @Activate private void activate(ComponentContext context, ConfigPV1 config) throws OpenemsException { if (super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv2.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv2.java index afa237e9e76..2c774caeb9f 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv2.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv2.java @@ -53,9 +53,6 @@ protected void setModbus(BridgeModbus modbus) { super.setModbus(modbus); } - public GoodWeChargerPv2() { - } - @Activate private void activate(ComponentContext context, ConfigPV2 config) throws OpenemsException { if (super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv3.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv3.java index bb1cba2036f..521f7554034 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv3.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv3.java @@ -44,7 +44,7 @@ public class GoodWeChargerPv3 extends AbstractGoodWeEtCharger @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) private GoodWe essOrBatteryInverter; - @Reference(policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.OPTIONAL) + @Reference(policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.OPTIONAL) private volatile Timedata timedata = null; @Override @@ -73,7 +73,9 @@ private void activate(ComponentContext context, ConfigPV3 config) throws Openems @Override @Deactivate protected void deactivate() { - this.essOrBatteryInverter.removeCharger(this); + if (this.essOrBatteryInverter != null) { + this.essOrBatteryInverter.removeCharger(this); + } super.deactivate(); } diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv4.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv4.java new file mode 100644 index 00000000000..fae8d4b4a87 --- /dev/null +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv4.java @@ -0,0 +1,96 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.service.event.EventHandler; +import org.osgi.service.event.propertytypes.EventTopics; +import org.osgi.service.metatype.annotations.Designate; + +import io.openems.common.exceptions.OpenemsException; +import io.openems.edge.bridge.modbus.api.BridgeModbus; +import io.openems.edge.bridge.modbus.api.ModbusComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.event.EdgeEventConstants; +import io.openems.edge.ess.dccharger.api.EssDcCharger; +import io.openems.edge.goodwe.charger.AbstractGoodWeEtCharger; +import io.openems.edge.goodwe.charger.GoodWeCharger; +import io.openems.edge.goodwe.common.GoodWe; +import io.openems.edge.timedata.api.Timedata; +import io.openems.edge.timedata.api.TimedataProvider; + +@Designate(ocd = ConfigPV4.class, factory = true) +@Component(// + name = "GoodWe.Charger-PV4", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE // +) +@EventTopics({ // + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE // +}) +public class GoodWeChargerPv4 extends AbstractGoodWeEtCharger + implements GoodWeCharger, EssDcCharger, ModbusComponent, OpenemsComponent, EventHandler, TimedataProvider { + + @Reference + private ConfigurationAdmin cm; + + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + private GoodWe essOrBatteryInverter; + + @Reference(policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.OPTIONAL) + private volatile Timedata timedata = null; + + @Override + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + protected void setModbus(BridgeModbus modbus) { + super.setModbus(modbus); + } + + @Activate + private void activate(ComponentContext context, ConfigPV4 config) throws OpenemsException { + if (super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, + "Modbus", config.modbus_id())) { + return; + } + + if (OpenemsComponent.updateReferenceFilter(this.cm, this.servicePid(), "essOrBatteryInverter", + config.essOrBatteryInverter_id())) { + return; + } + + if (this.essOrBatteryInverter != null) { + this.essOrBatteryInverter.addCharger(this); + } + } + + @Override + @Deactivate + protected void deactivate() { + if (this.essOrBatteryInverter != null) { + this.essOrBatteryInverter.removeCharger(this); + } + super.deactivate(); + } + + @Override + protected int getStartAddress() { + return 35115; + } + + @Override + public Timedata getTimedata() { + return this.timedata; + } + + @Override + protected GoodWe getEssOrBatteryInverter() { + return this.essOrBatteryInverter; + } +} diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv5.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv5.java new file mode 100644 index 00000000000..553d75056d9 --- /dev/null +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv5.java @@ -0,0 +1,96 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.service.event.EventHandler; +import org.osgi.service.event.propertytypes.EventTopics; +import org.osgi.service.metatype.annotations.Designate; + +import io.openems.common.exceptions.OpenemsException; +import io.openems.edge.bridge.modbus.api.BridgeModbus; +import io.openems.edge.bridge.modbus.api.ModbusComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.event.EdgeEventConstants; +import io.openems.edge.ess.dccharger.api.EssDcCharger; +import io.openems.edge.goodwe.charger.AbstractGoodWeEtCharger; +import io.openems.edge.goodwe.charger.GoodWeCharger; +import io.openems.edge.goodwe.common.GoodWe; +import io.openems.edge.timedata.api.Timedata; +import io.openems.edge.timedata.api.TimedataProvider; + +@Designate(ocd = ConfigPV5.class, factory = true) +@Component(// + name = "GoodWe.Charger-PV5", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE // +) +@EventTopics({ // + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE // +}) +public class GoodWeChargerPv5 extends AbstractGoodWeEtCharger + implements GoodWeCharger, EssDcCharger, ModbusComponent, OpenemsComponent, EventHandler, TimedataProvider { + + @Reference + private ConfigurationAdmin cm; + + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + private GoodWe essOrBatteryInverter; + + @Reference(policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.OPTIONAL) + private volatile Timedata timedata = null; + + @Override + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + protected void setModbus(BridgeModbus modbus) { + super.setModbus(modbus); + } + + @Activate + private void activate(ComponentContext context, ConfigPV5 config) throws OpenemsException { + if (super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, + "Modbus", config.modbus_id())) { + return; + } + + if (OpenemsComponent.updateReferenceFilter(this.cm, this.servicePid(), "essOrBatteryInverter", + config.essOrBatteryInverter_id())) { + return; + } + + if (this.essOrBatteryInverter != null) { + this.essOrBatteryInverter.addCharger(this); + } + } + + @Override + @Deactivate + protected void deactivate() { + if (this.essOrBatteryInverter != null) { + this.essOrBatteryInverter.removeCharger(this); + } + super.deactivate(); + } + + @Override + protected int getStartAddress() { + return 35304; + } + + @Override + public Timedata getTimedata() { + return this.timedata; + } + + @Override + protected GoodWe getEssOrBatteryInverter() { + return this.essOrBatteryInverter; + } +} diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv6.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv6.java new file mode 100644 index 00000000000..c3e7084ed98 --- /dev/null +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv6.java @@ -0,0 +1,96 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.service.event.EventHandler; +import org.osgi.service.event.propertytypes.EventTopics; +import org.osgi.service.metatype.annotations.Designate; + +import io.openems.common.exceptions.OpenemsException; +import io.openems.edge.bridge.modbus.api.BridgeModbus; +import io.openems.edge.bridge.modbus.api.ModbusComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.event.EdgeEventConstants; +import io.openems.edge.ess.dccharger.api.EssDcCharger; +import io.openems.edge.goodwe.charger.AbstractGoodWeEtCharger; +import io.openems.edge.goodwe.charger.GoodWeCharger; +import io.openems.edge.goodwe.common.GoodWe; +import io.openems.edge.timedata.api.Timedata; +import io.openems.edge.timedata.api.TimedataProvider; + +@Designate(ocd = ConfigPV6.class, factory = true) +@Component(// + name = "GoodWe.Charger-PV6", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE // +) +@EventTopics({ // + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE // +}) +public class GoodWeChargerPv6 extends AbstractGoodWeEtCharger + implements GoodWeCharger, EssDcCharger, ModbusComponent, OpenemsComponent, EventHandler, TimedataProvider { + + @Reference + private ConfigurationAdmin cm; + + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + private GoodWe essOrBatteryInverter; + + @Reference(policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.OPTIONAL) + private volatile Timedata timedata = null; + + @Override + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + protected void setModbus(BridgeModbus modbus) { + super.setModbus(modbus); + } + + @Activate + private void activate(ComponentContext context, ConfigPV6 config) throws OpenemsException { + if (super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, + "Modbus", config.modbus_id())) { + return; + } + + if (OpenemsComponent.updateReferenceFilter(this.cm, this.servicePid(), "essOrBatteryInverter", + config.essOrBatteryInverter_id())) { + return; + } + + if (this.essOrBatteryInverter != null) { + this.essOrBatteryInverter.addCharger(this); + } + } + + @Override + @Deactivate + protected void deactivate() { + if (this.essOrBatteryInverter != null) { + this.essOrBatteryInverter.removeCharger(this); + } + super.deactivate(); + } + + @Override + protected int getStartAddress() { + return 35306; + } + + @Override + public Timedata getTimedata() { + return this.timedata; + } + + @Override + protected GoodWe getEssOrBatteryInverter() { + return this.essOrBatteryInverter; + } +} diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv7.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv7.java new file mode 100644 index 00000000000..383dc49c4a4 --- /dev/null +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv7.java @@ -0,0 +1,96 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.service.event.EventHandler; +import org.osgi.service.event.propertytypes.EventTopics; +import org.osgi.service.metatype.annotations.Designate; + +import io.openems.common.exceptions.OpenemsException; +import io.openems.edge.bridge.modbus.api.BridgeModbus; +import io.openems.edge.bridge.modbus.api.ModbusComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.event.EdgeEventConstants; +import io.openems.edge.ess.dccharger.api.EssDcCharger; +import io.openems.edge.goodwe.charger.AbstractGoodWeEtCharger; +import io.openems.edge.goodwe.charger.GoodWeCharger; +import io.openems.edge.goodwe.common.GoodWe; +import io.openems.edge.timedata.api.Timedata; +import io.openems.edge.timedata.api.TimedataProvider; + +@Designate(ocd = ConfigPV7.class, factory = true) +@Component(// + name = "GoodWe.Charger-PV7", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE // +) +@EventTopics({ // + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE // +}) +public class GoodWeChargerPv7 extends AbstractGoodWeEtCharger + implements GoodWeCharger, EssDcCharger, ModbusComponent, OpenemsComponent, EventHandler, TimedataProvider { + + @Reference + private ConfigurationAdmin cm; + + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + private GoodWe essOrBatteryInverter; + + @Reference(policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.OPTIONAL) + private volatile Timedata timedata = null; + + @Override + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + protected void setModbus(BridgeModbus modbus) { + super.setModbus(modbus); + } + + @Activate + private void activate(ComponentContext context, ConfigPV7 config) throws OpenemsException { + if (super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, + "Modbus", config.modbus_id())) { + return; + } + + if (OpenemsComponent.updateReferenceFilter(this.cm, this.servicePid(), "essOrBatteryInverter", + config.essOrBatteryInverter_id())) { + return; + } + + if (this.essOrBatteryInverter != null) { + this.essOrBatteryInverter.addCharger(this); + } + } + + @Override + @Deactivate + protected void deactivate() { + if (this.essOrBatteryInverter != null) { + this.essOrBatteryInverter.removeCharger(this); + } + super.deactivate(); + } + + @Override + protected int getStartAddress() { + return 35308; + } + + @Override + public Timedata getTimedata() { + return this.timedata; + } + + @Override + protected GoodWe getEssOrBatteryInverter() { + return this.essOrBatteryInverter; + } +} diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv8.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv8.java new file mode 100644 index 00000000000..d65e1ca1785 --- /dev/null +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv8.java @@ -0,0 +1,96 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.service.event.EventHandler; +import org.osgi.service.event.propertytypes.EventTopics; +import org.osgi.service.metatype.annotations.Designate; + +import io.openems.common.exceptions.OpenemsException; +import io.openems.edge.bridge.modbus.api.BridgeModbus; +import io.openems.edge.bridge.modbus.api.ModbusComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.event.EdgeEventConstants; +import io.openems.edge.ess.dccharger.api.EssDcCharger; +import io.openems.edge.goodwe.charger.AbstractGoodWeEtCharger; +import io.openems.edge.goodwe.charger.GoodWeCharger; +import io.openems.edge.goodwe.common.GoodWe; +import io.openems.edge.timedata.api.Timedata; +import io.openems.edge.timedata.api.TimedataProvider; + +@Designate(ocd = ConfigPV8.class, factory = true) +@Component(// + name = "GoodWe.Charger-PV8", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE // +) +@EventTopics({ // + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE // +}) +public class GoodWeChargerPv8 extends AbstractGoodWeEtCharger + implements GoodWeCharger, EssDcCharger, ModbusComponent, OpenemsComponent, EventHandler, TimedataProvider { + + @Reference + private ConfigurationAdmin cm; + + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + private GoodWe essOrBatteryInverter; + + @Reference(policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.OPTIONAL) + private volatile Timedata timedata = null; + + @Override + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + protected void setModbus(BridgeModbus modbus) { + super.setModbus(modbus); + } + + @Activate + private void activate(ComponentContext context, ConfigPV8 config) throws OpenemsException { + if (super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, + "Modbus", config.modbus_id())) { + return; + } + + if (OpenemsComponent.updateReferenceFilter(this.cm, this.servicePid(), "essOrBatteryInverter", + config.essOrBatteryInverter_id())) { + return; + } + + if (this.essOrBatteryInverter != null) { + this.essOrBatteryInverter.addCharger(this); + } + } + + @Override + @Deactivate + protected void deactivate() { + if (this.essOrBatteryInverter != null) { + this.essOrBatteryInverter.removeCharger(this); + } + super.deactivate(); + } + + @Override + protected int getStartAddress() { + return 35310; + } + + @Override + public Timedata getTimedata() { + return this.timedata; + } + + @Override + protected GoodWe getEssOrBatteryInverter() { + return this.essOrBatteryInverter; + } +} diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv1Test.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv1Test.java index cc3743e396a..13a5bd91603 100644 --- a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv1Test.java +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv1Test.java @@ -4,7 +4,9 @@ import io.openems.common.test.DummyConfigurationAdmin; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; +import io.openems.edge.common.test.AbstractComponentTest.TestCase; import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.ess.dccharger.api.EssDcCharger; public class GoodWeChargerPv1Test { @@ -17,6 +19,11 @@ public void test() throws Exception { .setId("charger0") // .setBatteryInverterId("ess0") // .setModbusId("modbus0") // - .build()); + .build()) // + .next(new TestCase().input(EssDcCharger.ChannelId.VOLTAGE, 50_000) // 50 V + .input(EssDcCharger.ChannelId.CURRENT, 2_000)) // 2 A + .next(new TestCase() // + .output(EssDcCharger.ChannelId.ACTUAL_POWER, 100)) // 100 W + .deactivate(); } } diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv2Test.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv2Test.java index 1e55c8a6c8b..0912ccc54e5 100644 --- a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv2Test.java +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv2Test.java @@ -4,7 +4,9 @@ import io.openems.common.test.DummyConfigurationAdmin; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; +import io.openems.edge.common.test.AbstractComponentTest.TestCase; import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.ess.dccharger.api.EssDcCharger; public class GoodWeChargerPv2Test { @@ -17,6 +19,11 @@ public void test() throws Exception { .setId("charger0") // .setBatteryInverterId("ess0") // .setModbusId("modbus0") // - .build()); + .build()) // + .next(new TestCase().input(EssDcCharger.ChannelId.VOLTAGE, 50_000) // 50 V + .input(EssDcCharger.ChannelId.CURRENT, 2_000)) // 2 A + .next(new TestCase() // + .output(EssDcCharger.ChannelId.ACTUAL_POWER, 100)) // 100 W + .deactivate(); } } diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv3Test.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv3Test.java new file mode 100644 index 00000000000..be4b12e6fb9 --- /dev/null +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv3Test.java @@ -0,0 +1,29 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.junit.Test; + +import io.openems.common.test.DummyConfigurationAdmin; +import io.openems.edge.bridge.modbus.test.DummyModbusBridge; +import io.openems.edge.common.test.AbstractComponentTest.TestCase; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.ess.dccharger.api.EssDcCharger; + +public class GoodWeChargerPv3Test { + + @Test + public void test() throws Exception { + new ComponentTest(new GoodWeChargerPv3()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("setModbus", new DummyModbusBridge("modbus0")) // + .activate(MyConfig.create() // + .setId("charger0") // + .setBatteryInverterId("ess0") // + .setModbusId("modbus0") // + .build()) // + .next(new TestCase().input(EssDcCharger.ChannelId.VOLTAGE, 50_000) // 50 V + .input(EssDcCharger.ChannelId.CURRENT, 2_000)) // 2 A + .next(new TestCase() // + .output(EssDcCharger.ChannelId.ACTUAL_POWER, 100)) // 100 W + .deactivate(); + } +} diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv4Test.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv4Test.java new file mode 100644 index 00000000000..d85cc64230b --- /dev/null +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv4Test.java @@ -0,0 +1,29 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.junit.Test; + +import io.openems.common.test.DummyConfigurationAdmin; +import io.openems.edge.bridge.modbus.test.DummyModbusBridge; +import io.openems.edge.common.test.AbstractComponentTest.TestCase; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.ess.dccharger.api.EssDcCharger; + +public class GoodWeChargerPv4Test { + + @Test + public void test() throws Exception { + new ComponentTest(new GoodWeChargerPv4()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("setModbus", new DummyModbusBridge("modbus0")) // + .activate(MyConfig.create() // + .setId("charger0") // + .setBatteryInverterId("ess0") // + .setModbusId("modbus0") // + .build()) // + .next(new TestCase().input(EssDcCharger.ChannelId.VOLTAGE, 50_000) // 50 V + .input(EssDcCharger.ChannelId.CURRENT, 2_000)) // 2 A + .next(new TestCase() // + .output(EssDcCharger.ChannelId.ACTUAL_POWER, 100)) // 100 W + .deactivate(); + } +} diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv5Test.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv5Test.java new file mode 100644 index 00000000000..1aaae4a353e --- /dev/null +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv5Test.java @@ -0,0 +1,29 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.junit.Test; + +import io.openems.common.test.DummyConfigurationAdmin; +import io.openems.edge.bridge.modbus.test.DummyModbusBridge; +import io.openems.edge.common.test.AbstractComponentTest.TestCase; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.ess.dccharger.api.EssDcCharger; + +public class GoodWeChargerPv5Test { + + @Test + public void test() throws Exception { + new ComponentTest(new GoodWeChargerPv5()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("setModbus", new DummyModbusBridge("modbus0")) // + .activate(MyConfig.create() // + .setId("charger0") // + .setBatteryInverterId("ess0") // + .setModbusId("modbus0") // + .build()) // + .next(new TestCase().input(EssDcCharger.ChannelId.VOLTAGE, 50_000) // 50 V + .input(EssDcCharger.ChannelId.CURRENT, 2_000)) // 2 A + .next(new TestCase() // + .output(EssDcCharger.ChannelId.ACTUAL_POWER, 100)) // 100 W + .deactivate(); + } +} diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv6Test.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv6Test.java new file mode 100644 index 00000000000..cc2dea51c7b --- /dev/null +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv6Test.java @@ -0,0 +1,29 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.junit.Test; + +import io.openems.common.test.DummyConfigurationAdmin; +import io.openems.edge.bridge.modbus.test.DummyModbusBridge; +import io.openems.edge.common.test.AbstractComponentTest.TestCase; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.ess.dccharger.api.EssDcCharger; + +public class GoodWeChargerPv6Test { + + @Test + public void test() throws Exception { + new ComponentTest(new GoodWeChargerPv6()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("setModbus", new DummyModbusBridge("modbus0")) // + .activate(MyConfig.create() // + .setId("charger0") // + .setBatteryInverterId("ess0") // + .setModbusId("modbus0") // + .build()) // + .next(new TestCase().input(EssDcCharger.ChannelId.VOLTAGE, 50_000) // 50 V + .input(EssDcCharger.ChannelId.CURRENT, 2_000)) // 2 A + .next(new TestCase() // + .output(EssDcCharger.ChannelId.ACTUAL_POWER, 100)) // 100 W + .deactivate(); + } +} diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv7Test.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv7Test.java new file mode 100644 index 00000000000..55ff415b5b2 --- /dev/null +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv7Test.java @@ -0,0 +1,29 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.junit.Test; + +import io.openems.common.test.DummyConfigurationAdmin; +import io.openems.edge.bridge.modbus.test.DummyModbusBridge; +import io.openems.edge.common.test.AbstractComponentTest.TestCase; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.ess.dccharger.api.EssDcCharger; + +public class GoodWeChargerPv7Test { + + @Test + public void test() throws Exception { + new ComponentTest(new GoodWeChargerPv7()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("setModbus", new DummyModbusBridge("modbus0")) // + .activate(MyConfig.create() // + .setId("charger0") // + .setBatteryInverterId("ess0") // + .setModbusId("modbus0") // + .build()) // + .next(new TestCase().input(EssDcCharger.ChannelId.VOLTAGE, 50_000) // 50 V + .input(EssDcCharger.ChannelId.CURRENT, 2_000)) // 2 A + .next(new TestCase() // + .output(EssDcCharger.ChannelId.ACTUAL_POWER, 100)) // 100 W + .deactivate(); + } +} diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv8Test.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv8Test.java new file mode 100644 index 00000000000..e63d487332c --- /dev/null +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/GoodWeChargerPv8Test.java @@ -0,0 +1,29 @@ +package io.openems.edge.goodwe.charger.singlestring; + +import org.junit.Test; + +import io.openems.common.test.DummyConfigurationAdmin; +import io.openems.edge.bridge.modbus.test.DummyModbusBridge; +import io.openems.edge.common.test.AbstractComponentTest.TestCase; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.ess.dccharger.api.EssDcCharger; + +public class GoodWeChargerPv8Test { + + @Test + public void test() throws Exception { + new ComponentTest(new GoodWeChargerPv8()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("setModbus", new DummyModbusBridge("modbus0")) // + .activate(MyConfig.create() // + .setId("charger0") // + .setBatteryInverterId("ess0") // + .setModbusId("modbus0") // + .build()) // + .next(new TestCase().input(EssDcCharger.ChannelId.VOLTAGE, 50_000) // 50 V + .input(EssDcCharger.ChannelId.CURRENT, 2_000)) // 2 A + .next(new TestCase() // + .output(EssDcCharger.ChannelId.ACTUAL_POWER, 100)) // 100 W + .deactivate(); + } +} diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/MyConfig.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/MyConfig.java index 84a46bba00c..17e11dc768d 100644 --- a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/MyConfig.java +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/singlestring/MyConfig.java @@ -4,7 +4,7 @@ import io.openems.common.utils.ConfigUtils; @SuppressWarnings("all") -public class MyConfig extends AbstractComponentConfig implements ConfigPV1, ConfigPV2 { +public class MyConfig extends AbstractComponentConfig implements ConfigPV1, ConfigPV2, ConfigPV3, ConfigPV4, ConfigPV5, ConfigPV6, ConfigPV7, ConfigPV8 { public static class Builder { private String id;