diff --git a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/BatteryField.java b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/BatteryField.java index abbdbe18..8095396f 100644 --- a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/BatteryField.java +++ b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/BatteryField.java @@ -10,6 +10,8 @@ import com.powsybl.iidm.network.Battery; import com.powsybl.iidm.network.extensions.ActivePowerControl; import com.powsybl.iidm.network.extensions.ActivePowerControlAdder; +import com.powsybl.iidm.network.extensions.BatteryShortCircuit; +import com.powsybl.iidm.network.extensions.BatteryShortCircuitAdder; import jakarta.validation.constraints.NotNull; import org.gridsuite.modification.dto.AttributeModification; import org.gridsuite.modification.dto.OperationType; @@ -17,6 +19,7 @@ import static org.gridsuite.modification.NetworkModificationException.Type.MODIFY_BATTERY_ERROR; import static org.gridsuite.modification.modifications.BatteryModification.*; +import static org.gridsuite.modification.utils.ModificationUtils.parseDoubleOrNaNIfNull; /** * @author Seddik Yengui @@ -27,10 +30,13 @@ public enum BatteryField { MAXIMUM_ACTIVE_POWER, ACTIVE_POWER_SET_POINT, REACTIVE_POWER_SET_POINT, - DROOP; + DROOP, + TRANSIENT_REACTANCE, + STEP_UP_TRANSFORMER_REACTANCE; public static String getReferenceValue(Battery battery, String batteryField) { ActivePowerControl activePowerControl = battery.getExtension(ActivePowerControl.class); + BatteryShortCircuit batteryShortCircuit = battery.getExtension(BatteryShortCircuit.class); BatteryField field = BatteryField.valueOf(batteryField); return switch (field) { case MINIMUM_ACTIVE_POWER -> String.valueOf(battery.getMinP()); @@ -38,27 +44,28 @@ public static String getReferenceValue(Battery battery, String batteryField) { case ACTIVE_POWER_SET_POINT -> String.valueOf(battery.getTargetP()); case REACTIVE_POWER_SET_POINT -> String.valueOf(battery.getTargetQ()); case DROOP -> activePowerControl != null ? String.valueOf(activePowerControl.getDroop()) : null; + case TRANSIENT_REACTANCE -> batteryShortCircuit != null ? String.valueOf(batteryShortCircuit.getDirectTransX()) : null; + case STEP_UP_TRANSFORMER_REACTANCE -> batteryShortCircuit != null ? String.valueOf(batteryShortCircuit.getStepUpTransformerX()) : null; }; } public static void setNewValue(Battery battery, String batteryField, @NotNull String newValue) { BatteryField field = BatteryField.valueOf(batteryField); String errorMessage = String.format(ERROR_MESSAGE, battery.getId()); - final AttributeModification attributeModification = new AttributeModification<>(Double.parseDouble(newValue), OperationType.SET); switch (field) { case MINIMUM_ACTIVE_POWER -> - modifyBatteryActiveLimitsAttributes(null, attributeModification, battery, null); + modifyBatteryActiveLimitsAttributes(null, new AttributeModification<>(Double.parseDouble(newValue), OperationType.SET), battery, null); case MAXIMUM_ACTIVE_POWER -> - modifyBatteryActiveLimitsAttributes(attributeModification, null, battery, null); + modifyBatteryActiveLimitsAttributes(new AttributeModification<>(Double.parseDouble(newValue), OperationType.SET), null, battery, null); case ACTIVE_POWER_SET_POINT -> { ModificationUtils.getInstance().checkActivePowerZeroOrBetweenMinAndMaxActivePower( - attributeModification, null, null, battery.getMinP(), + new AttributeModification<>(Double.parseDouble(newValue), OperationType.SET), null, null, battery.getMinP(), battery.getMaxP(), battery.getTargetP(), MODIFY_BATTERY_ERROR, errorMessage ); - modifyBatterySetpointsAttributes(attributeModification, null, null, null, battery, null); + modifyBatterySetpointsAttributes(new AttributeModification<>(Double.parseDouble(newValue), OperationType.SET), null, null, null, battery, null); } case REACTIVE_POWER_SET_POINT -> modifyBatterySetpointsAttributes( - null, attributeModification, null, null, battery, null); + null, new AttributeModification<>(Double.parseDouble(newValue), OperationType.SET), null, null, battery, null); case DROOP -> { Float droopValue = Float.parseFloat(newValue); ModificationUtils.checkIsPercentage(errorMessage, droopValue, MODIFY_BATTERY_ERROR, "Droop"); @@ -69,6 +76,12 @@ public static void setNewValue(Battery battery, String batteryField, @NotNull St new AttributeModification<>(droopValue, OperationType.SET), null, null, MODIFY_BATTERY_ERROR, errorMessage); } + case TRANSIENT_REACTANCE -> ModificationUtils.getInstance().modifyShortCircuitExtension(new AttributeModification<>(parseDoubleOrNaNIfNull(newValue), OperationType.SET), + null, battery.getExtension(BatteryShortCircuit.class), + () -> battery.newExtension(BatteryShortCircuitAdder.class), null); + case STEP_UP_TRANSFORMER_REACTANCE -> ModificationUtils.getInstance().modifyShortCircuitExtension(null, + new AttributeModification<>(parseDoubleOrNaNIfNull(newValue), OperationType.SET), battery.getExtension(BatteryShortCircuit.class), + () -> battery.newExtension(BatteryShortCircuitAdder.class), null); } } } diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/BatteryModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/BatteryModificationByAssignmentTest.java index 544c588b..c8207ab6 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/BatteryModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/BatteryModificationByAssignmentTest.java @@ -9,6 +9,7 @@ import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.extensions.ActivePowerControl; import com.powsybl.iidm.network.extensions.ActivePowerControlAdder; +import com.powsybl.iidm.network.extensions.BatteryShortCircuit; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.FilterEquipments; import org.gridsuite.modification.dto.IdentifiableAttributes; @@ -23,8 +24,7 @@ import java.util.UUID; import static org.gridsuite.modification.utils.NetworkUtil.createBattery; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; @@ -140,8 +140,20 @@ protected List> getAssignmentInfos() { .value(2.) .build(); + DoubleAssignmentInfos assignmentInfos6 = DoubleAssignmentInfos.builder() + .filters(List.of(filter4)) + .editedField(BatteryField.TRANSIENT_REACTANCE.name()) + .value(3.) + .build(); + + DoubleAssignmentInfos assignmentInfos7 = DoubleAssignmentInfos.builder() + .filters(List.of(filter4)) + .editedField(BatteryField.STEP_UP_TRANSFORMER_REACTANCE.name()) + .value(4.) + .build(); + List> infosList = super.getAssignmentInfos(); - infosList.addAll(List.of(assignmentInfos1, assignmentInfos2, assignmentInfos3, assignmentInfos4, assignmentInfos5)); + infosList.addAll(List.of(assignmentInfos1, assignmentInfos2, assignmentInfos3, assignmentInfos4, assignmentInfos5, assignmentInfos6, assignmentInfos7)); return infosList; } @@ -167,6 +179,16 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(2, activePowerControl5.getDroop(), 0); assertEquals(30, getNetwork().getBattery(BATTERY_ID_6).getMinP(), 0); + + assertNotNull(getNetwork().getBattery(BATTERY_ID_5).getExtension(BatteryShortCircuit.class)); + BatteryShortCircuit batteryShortCircuit5 = getNetwork().getBattery(BATTERY_ID_5).getExtension(BatteryShortCircuit.class); + assertEquals(3, batteryShortCircuit5.getDirectTransX()); + assertEquals(4, batteryShortCircuit5.getStepUpTransformerX()); + + assertNotNull(getNetwork().getBattery(BATTERY_ID_1).getExtension(BatteryShortCircuit.class)); + BatteryShortCircuit batteryShortCircuit1 = getNetwork().getBattery(BATTERY_ID_5).getExtension(BatteryShortCircuit.class); + assertEquals(3, batteryShortCircuit1.getDirectTransX()); + assertEquals(4, batteryShortCircuit1.getStepUpTransformerX()); } @Override