Skip to content

Commit 97fa6af

Browse files
authored
create activePowerControl even if droop is null (#126)
Signed-off-by: Etienne LESOT <[email protected]>
1 parent 68551f3 commit 97fa6af

File tree

5 files changed

+124
-66
lines changed

5 files changed

+124
-66
lines changed

src/main/java/org/gridsuite/modification/modifications/BatteryCreation.java

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@
66
*/
77
package org.gridsuite.modification.modifications;
88

9-
import com.powsybl.commons.PowsyblException;
109
import com.powsybl.commons.report.ReportNode;
1110
import com.powsybl.commons.report.TypedValue;
1211
import com.powsybl.iidm.network.*;
1312
import com.powsybl.iidm.network.extensions.ActivePowerControlAdder;
1413
import com.powsybl.iidm.network.extensions.BatteryShortCircuitAdder;
1514
import org.gridsuite.modification.NetworkModificationException;
1615
import org.gridsuite.modification.dto.BatteryCreationInfos;
17-
import org.gridsuite.modification.report.NetworkModificationReportResourceBundle;
1816
import org.gridsuite.modification.utils.ModificationUtils;
1917
import org.gridsuite.modification.utils.PropertiesUtils;
2018

@@ -132,7 +130,10 @@ private void addExtensionsToBattery(BatteryCreationInfos batteryCreationInfos, B
132130
ReportNode subReportNodeLimits = reportBatteryActiveLimits(batteryCreationInfos, subReportNode);
133131
ModificationUtils.getInstance().createReactiveLimits(batteryCreationInfos, battery, subReportNodeLimits);
134132
ReportNode subReportNodeSetpoints = reportBatterySetPoints(batteryCreationInfos, subReportNode);
135-
createBatteryActivePowerControl(batteryCreationInfos, battery, subReportNodeSetpoints);
133+
ModificationUtils.getInstance().createNewActivePowerControlForInjectionCreation(battery.newExtension(ActivePowerControlAdder.class),
134+
batteryCreationInfos.getParticipate(),
135+
batteryCreationInfos.getDroop(),
136+
subReportNodeSetpoints);
136137
ModificationUtils.getInstance().createShortCircuitExtension(batteryCreationInfos.getStepUpTransformerX(),
137138
batteryCreationInfos.getDirectTransX(), batteryCreationInfos.getEquipmentId(),
138139
battery.newExtension(BatteryShortCircuitAdder.class), subReportNode, "battery");
@@ -159,31 +160,4 @@ private ReportNode reportBatteryActiveLimits(BatteryCreationInfos batteryCreatio
159160
ModificationUtils.getInstance().reportModifications(subReportNodeLimits, limitsReports, "network.modification.ActiveLimitsCreated");
160161
return subReportNodeLimits;
161162
}
162-
163-
private void createBatteryActivePowerControl(BatteryCreationInfos batteryCreationInfos, Battery battery, ReportNode subReporter) {
164-
if (batteryCreationInfos.getParticipate() != null && batteryCreationInfos.getDroop() != null) {
165-
List<ReportNode> activePowerRegulationReports = new ArrayList<>();
166-
try {
167-
battery.newExtension(ActivePowerControlAdder.class)
168-
.withParticipate(batteryCreationInfos.getParticipate())
169-
.withDroop(batteryCreationInfos.getDroop())
170-
.add();
171-
activePowerRegulationReports.add(ModificationUtils.getInstance().buildCreationReport(
172-
batteryCreationInfos.getParticipate(),
173-
"Participate"));
174-
activePowerRegulationReports.add(ModificationUtils.getInstance().buildCreationReport(
175-
batteryCreationInfos.getDroop(),
176-
"Droop"));
177-
} catch (PowsyblException e) {
178-
activePowerRegulationReports.add(ReportNode.newRootReportNode()
179-
.withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME)
180-
.withMessageTemplate("network.modification.activePowerExtensionAddError.battery")
181-
.withUntypedValue("id", batteryCreationInfos.getEquipmentId())
182-
.withUntypedValue("message", e.getMessage())
183-
.withSeverity(TypedValue.ERROR_SEVERITY)
184-
.build());
185-
}
186-
ModificationUtils.getInstance().reportModifications(subReporter, activePowerRegulationReports, "network.modification.ActivePowerRegulationCreated");
187-
}
188-
}
189163
}

src/main/java/org/gridsuite/modification/modifications/GeneratorCreation.java

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,10 @@ private void addExtensionsToGenerator(GeneratorCreationInfos generatorCreationIn
142142
ModificationUtils.getInstance().createReactiveLimits(generatorCreationInfos, generator, subReporterLimits);
143143
ReportNode subReporterSetpoints = reportGeneratorSetPoints(generatorCreationInfos, subReportNode);
144144
createGeneratorVoltageRegulation(generatorCreationInfos, generator, voltageLevel, subReporterSetpoints);
145-
createGeneratorActivePowerControl(generatorCreationInfos, generator, subReporterSetpoints);
145+
ModificationUtils.getInstance().createNewActivePowerControlForInjectionCreation(generator.newExtension(ActivePowerControlAdder.class),
146+
generatorCreationInfos.getParticipate(),
147+
generatorCreationInfos.getDroop(),
148+
subReporterSetpoints);
146149
ModificationUtils.getInstance().createShortCircuitExtension(generatorCreationInfos.getStepUpTransformerX(),
147150
generatorCreationInfos.getDirectTransX(), generatorCreationInfos.getEquipmentId(),
148151
generator.newExtension(GeneratorShortCircuitAdder.class), subReportNode, "generator");
@@ -253,34 +256,6 @@ private ReportNode reportGeneratorActiveLimits(GeneratorCreationInfos generatorC
253256
return subReportNodeLimits;
254257
}
255258

256-
private void createGeneratorActivePowerControl(GeneratorCreationInfos generatorCreationInfos, Generator generator, ReportNode subReportNode) {
257-
if (generatorCreationInfos.getParticipate() != null && generatorCreationInfos.getDroop() != null) {
258-
List<ReportNode> activePowerRegulationReports = new ArrayList<>();
259-
try {
260-
generator.newExtension(ActivePowerControlAdder.class)
261-
.withParticipate(generatorCreationInfos.getParticipate())
262-
.withDroop(generatorCreationInfos.getDroop())
263-
.add();
264-
activePowerRegulationReports.add(ModificationUtils.getInstance().buildCreationReport(
265-
generatorCreationInfos.getParticipate(),
266-
"Participate"));
267-
activePowerRegulationReports.add(ModificationUtils.getInstance().buildCreationReport(
268-
generatorCreationInfos.getDroop(),
269-
"Droop"));
270-
} catch (PowsyblException e) {
271-
activePowerRegulationReports.add(ReportNode.newRootReportNode()
272-
.withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME)
273-
.withMessageTemplate("network.modification.activePowerExtensionAddError.generator")
274-
.withUntypedValue("id", generatorCreationInfos.getEquipmentId())
275-
.withUntypedValue("message", e.getMessage())
276-
.withSeverity(TypedValue.ERROR_SEVERITY)
277-
.build());
278-
279-
}
280-
ModificationUtils.getInstance().reportModifications(subReportNode, activePowerRegulationReports, "network.modification.ActivePowerRegulationCreated");
281-
}
282-
}
283-
284259
private void createGeneratorStartUp(GeneratorCreationInfos generatorCreationInfos, Generator generator, ReportNode subReportNode) {
285260
if (generatorCreationInfos.getPlannedActivePowerSetPoint() != null
286261
|| generatorCreationInfos.getMarginalCost() != null

src/main/java/org/gridsuite/modification/utils/ModificationUtils.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ public final class ModificationUtils {
6161
public static final String NOT_EXIST_IN_NETWORK = " does not exist in network";
6262
public static final String TRANSIENT_REACTANCE = "Transient reactance";
6363
public static final String TRANSFORMER_REACTANCE = "Transformer reactance";
64+
private static final String DROOP = "Droop";
65+
private static final String PARTICIPATE = "Participate";
6466

6567
private static final String COULD_NOT_ACTION_EQUIPMENT = "Could not %s equipment '%s'";
6668
private static final String COULD_NOT_ACTION_EQUIPMENT_ON_SIDE = COULD_NOT_ACTION_EQUIPMENT + " on side %s";
@@ -1334,14 +1336,14 @@ private void modifyExistingActivePowerControl(ActivePowerControl<?> activePowerC
13341336
Optional.ofNullable(participateInfo).ifPresent(info -> {
13351337
activePowerControl.setParticipate(info.getValue());
13361338
if (reports != null) {
1337-
reports.add(buildModificationReport(oldParticipate, info.getValue(), "Participate"));
1339+
reports.add(buildModificationReport(oldParticipate, info.getValue(), PARTICIPATE));
13381340
}
13391341
});
13401342

13411343
Optional.ofNullable(droopInfo).ifPresent(info -> {
13421344
activePowerControl.setDroop(info.getValue());
13431345
if (reports != null) {
1344-
reports.add(buildModificationReport(oldDroop, info.getValue(), "Droop"));
1346+
reports.add(buildModificationReport(oldDroop, info.getValue(), DROOP));
13451347
}
13461348
});
13471349
}
@@ -1355,13 +1357,13 @@ private void createNewActivePowerControl(ActivePowerControlAdder<?> adder,
13551357
Boolean participate = Optional.ofNullable(participateInfo).map(AttributeModification::getValue).orElse(null);
13561358
Float droop = Optional.ofNullable(droopInfo).map(AttributeModification::getValue).orElse(null);
13571359
checkActivePowerControl(participate, droop, exceptionType, errorMessage);
1358-
if (participate != null && droop != null) {
1360+
if (participate != null) {
13591361
adder.withParticipate(participate)
1360-
.withDroop(droop)
1362+
.withDroop(droop != null ? droop : Double.NaN)
13611363
.add();
13621364
if (reports != null) {
1363-
reports.add(buildModificationReport(null, participate, "Participate"));
1364-
reports.add(buildModificationReport(Double.NaN, droop, "Droop"));
1365+
reports.add(buildModificationReport(null, participate, PARTICIPATE));
1366+
reports.add(buildModificationReport(Double.NaN, droop, DROOP));
13651367
}
13661368
}
13671369
}
@@ -2040,5 +2042,17 @@ public void modifyShortCircuitExtension(AttributeModification<Double> directTran
20402042
reportModifications(subReportNode, reports, "network.modification.shortCircuitAttributesModified");
20412043
}
20422044
}
2045+
2046+
public void createNewActivePowerControlForInjectionCreation(ActivePowerControlAdder<?> adder, Boolean participate, Float droop, ReportNode subReporter) {
2047+
if (participate != null) {
2048+
List<ReportNode> activePowerRegulationReports = new ArrayList<>();
2049+
double droopNotNull = droop != null ? droop : Double.NaN;
2050+
adder.withParticipate(participate).withDroop(droopNotNull).add();
2051+
activePowerRegulationReports.add(ModificationUtils.getInstance().buildCreationReport(participate, PARTICIPATE));
2052+
activePowerRegulationReports.add(ModificationUtils.getInstance().buildCreationReport(droopNotNull, DROOP));
2053+
reportModifications(subReporter, activePowerRegulationReports, "network.modification.ActivePowerRegulationCreated");
2054+
}
2055+
2056+
}
20432057
}
20442058

src/test/java/org/gridsuite/modification/modifications/BatteryCreationInBusBreakerTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
package org.gridsuite.modification.modifications;
88

99
import com.fasterxml.jackson.core.type.TypeReference;
10+
import com.powsybl.iidm.network.Battery;
1011
import com.powsybl.iidm.network.Network;
12+
import com.powsybl.iidm.network.extensions.ActivePowerControl;
1113
import com.powsybl.iidm.network.extensions.ConnectablePosition;
1214
import org.gridsuite.modification.NetworkModificationException;
1315
import org.gridsuite.modification.dto.BatteryCreationInfos;
@@ -92,5 +94,39 @@ protected void testCreationModificationMessage(ModificationInfos modificationInf
9294
assertEquals("BATTERY_CREATION", modificationInfos.getMessageType());
9395
Map<String, String> createdValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { });
9496
assertEquals("idBattery2", createdValues.get("equipmentId"));
97+
Battery battery = getNetwork().getBattery("idBattery2");
98+
assertNotNull(battery.getExtension(ActivePowerControl.class));
99+
ActivePowerControl activePowerControl = battery.getExtension(ActivePowerControl.class);
100+
assertEquals(5, activePowerControl.getDroop());
101+
assertTrue(activePowerControl.isParticipate());
102+
}
103+
104+
@Test
105+
void testCreateWithDroopNull() {
106+
Network network = getNetwork();
107+
BatteryCreationInfos batteryCreationInfos = BatteryCreationInfos.builder()
108+
.stashed(false)
109+
.equipmentId("idBattery2")
110+
.equipmentName("nameBattery2")
111+
.voltageLevelId("v1")
112+
.busOrBusbarSectionId("bus1")
113+
.minP(100.0)
114+
.maxP(600.0)
115+
.targetP(400.)
116+
.targetQ(50.)
117+
.minQ(20.0)
118+
.maxQ(25.0)
119+
.droop(null)
120+
.participate(false)
121+
.reactiveCapabilityCurve(false)
122+
.connectionName("top")
123+
.connectionDirection(ConnectablePosition.Direction.TOP)
124+
.build();
125+
batteryCreationInfos.toModification().apply(network);
126+
Battery battery = network.getBattery("idBattery2");
127+
assertNotNull(battery.getExtension(ActivePowerControl.class));
128+
ActivePowerControl activePowerControl = battery.getExtension(ActivePowerControl.class);
129+
assertEquals(Double.NaN, activePowerControl.getDroop());
130+
assertFalse(activePowerControl.isParticipate());
95131
}
96132
}

src/test/java/org/gridsuite/modification/modifications/BatteryCreationInNodeBreakerTest.java

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,16 @@
99
import com.fasterxml.jackson.core.type.TypeReference;
1010
import com.powsybl.commons.PowsyblException;
1111
import com.powsybl.commons.report.ReportNode;
12+
import com.powsybl.iidm.network.Battery;
1213
import com.powsybl.iidm.network.Network;
1314
import com.powsybl.iidm.network.ValidationException;
15+
import com.powsybl.iidm.network.extensions.ActivePowerControl;
1416
import com.powsybl.iidm.network.extensions.ConnectablePosition;
1517
import org.gridsuite.modification.NetworkModificationException;
16-
import org.gridsuite.modification.dto.*;
18+
import org.gridsuite.modification.dto.BatteryCreationInfos;
19+
import org.gridsuite.modification.dto.FreePropertyInfos;
20+
import org.gridsuite.modification.dto.ModificationInfos;
21+
import org.gridsuite.modification.dto.ReactiveCapabilityCurvePointsInfos;
1722
import org.gridsuite.modification.report.NetworkModificationReportResourceBundle;
1823
import org.gridsuite.modification.utils.NetworkCreation;
1924
import org.junit.jupiter.api.Test;
@@ -111,6 +116,11 @@ protected void assertAfterNetworkModificationApplication() {
111116
assertEquals(1, getNetwork().getVoltageLevel("v2").getBatteryStream()
112117
.filter(transformer -> transformer.getId().equals("idBattery1")).count());
113118
assertEquals(PROPERTY_VALUE, getNetwork().getBattery("idBattery1").getProperty(PROPERTY_NAME));
119+
Battery battery = getNetwork().getBattery("idBattery1");
120+
assertNotNull(battery.getExtension(ActivePowerControl.class));
121+
ActivePowerControl activePowerControl = battery.getExtension(ActivePowerControl.class);
122+
assertEquals(5, activePowerControl.getDroop());
123+
assertTrue(activePowerControl.isParticipate());
114124
}
115125

116126
@Test
@@ -194,4 +204,53 @@ void testCreateWithShortCircuitErrors() {
194204
batteryCreationInfos.toModification().apply(getNetwork(), report);
195205
assertLogMessage("cannot add short-circuit extension on battery with id=idBattery1 : Undefined directTransX", "network.modification.ShortCircuitExtensionAddError", report);
196206
}
207+
208+
@Test
209+
void testCreateWithDroopNull() {
210+
Network network = getNetwork();
211+
BatteryCreationInfos batteryCreationInfos = BatteryCreationInfos.builder()
212+
.stashed(false)
213+
.equipmentId("idBattery3")
214+
.voltageLevelId("v2")
215+
.busOrBusbarSectionId("1B")
216+
.minP(100.0)
217+
.maxP(600.0)
218+
.targetP(400.)
219+
.targetQ(50.)
220+
.minQ(20.0)
221+
.maxQ(25.0)
222+
.droop(null)
223+
.participate(false)
224+
.reactiveCapabilityCurve(false)
225+
.connectionName("top")
226+
.connectionDirection(ConnectablePosition.Direction.TOP)
227+
.build();
228+
batteryCreationInfos.toModification().apply(network);
229+
Battery battery = network.getBattery("idBattery3");
230+
assertNotNull(battery.getExtension(ActivePowerControl.class));
231+
ActivePowerControl activePowerControl = battery.getExtension(ActivePowerControl.class);
232+
assertEquals(Double.NaN, activePowerControl.getDroop());
233+
assertFalse(activePowerControl.isParticipate());
234+
235+
BatteryCreationInfos batteryCreationInfos2 = BatteryCreationInfos.builder()
236+
.stashed(false)
237+
.equipmentId("idBattery4")
238+
.voltageLevelId("v2")
239+
.busOrBusbarSectionId("1B")
240+
.minP(100.0)
241+
.maxP(600.0)
242+
.targetP(400.)
243+
.targetQ(50.)
244+
.minQ(20.0)
245+
.maxQ(25.0)
246+
.droop(5f)
247+
.participate(null)
248+
.reactiveCapabilityCurve(false)
249+
.connectionName("top")
250+
.connectionDirection(ConnectablePosition.Direction.TOP)
251+
.build();
252+
batteryCreationInfos2.toModification().apply(network);
253+
Battery battery2 = network.getBattery("idBattery4");
254+
assertNull(battery2.getExtension(ActivePowerControl.class));
255+
}
197256
}

0 commit comments

Comments
 (0)