diff --git a/src/main/java/org/gridsuite/modification/modifications/BatteryModification.java b/src/main/java/org/gridsuite/modification/modifications/BatteryModification.java index afe08ba6..894e7f01 100644 --- a/src/main/java/org/gridsuite/modification/modifications/BatteryModification.java +++ b/src/main/java/org/gridsuite/modification/modifications/BatteryModification.java @@ -27,14 +27,12 @@ /** * @author Ghazwa Rehili */ -public class BatteryModification extends AbstractModification { - - private final BatteryModificationInfos modificationInfos; +public class BatteryModification extends AbstractInjectionModification { public static final String ERROR_MESSAGE = "Battery '%s' : "; public BatteryModification(BatteryModificationInfos modificationInfos) { - this.modificationInfos = modificationInfos; + super(modificationInfos); } @Override @@ -42,15 +40,17 @@ public void check(Network network) throws NetworkModificationException { if (modificationInfos == null) { throw new NetworkModificationException(MODIFY_BATTERY_ERROR, "Missing required attributes to modify the equipment"); } - Battery battery = ModificationUtils.getInstance().getBattery(network, modificationInfos.getEquipmentId()); - String errorMessage = "Battery '" + modificationInfos.getEquipmentId() + "' : "; - ModificationUtils.getInstance().checkVoltageLevelModification(network, modificationInfos.getVoltageLevelId(), - modificationInfos.getBusOrBusbarSectionId(), battery.getTerminal()); - ModificationUtils.getInstance().checkReactiveLimit(battery, modificationInfos.getMinQ(), modificationInfos.getMaxQ(), - modificationInfos.getReactiveCapabilityCurvePoints(), MODIFY_BATTERY_ERROR, errorMessage); - checkActivePowerZeroOrBetweenMinAndMaxActivePowerBattery(modificationInfos, battery, MODIFY_BATTERY_ERROR, errorMessage); - if (modificationInfos.getDroop() != null) { - checkIsPercentage(errorMessage, modificationInfos.getDroop().getValue(), MODIFY_BATTERY_ERROR, "Droop"); + + BatteryModificationInfos batteryModificationInfos = (BatteryModificationInfos) modificationInfos; + Battery battery = ModificationUtils.getInstance().getBattery(network, batteryModificationInfos.getEquipmentId()); + String errorMessage = "Battery '" + batteryModificationInfos.getEquipmentId() + "' : "; + ModificationUtils.getInstance().checkVoltageLevelModification(network, batteryModificationInfos.getVoltageLevelId(), + batteryModificationInfos.getBusOrBusbarSectionId(), battery.getTerminal()); + ModificationUtils.getInstance().checkReactiveLimit(battery, batteryModificationInfos.getMinQ(), batteryModificationInfos.getMaxQ(), + batteryModificationInfos.getReactiveCapabilityCurvePoints(), MODIFY_BATTERY_ERROR, errorMessage); + checkActivePowerZeroOrBetweenMinAndMaxActivePowerBattery(batteryModificationInfos, battery, MODIFY_BATTERY_ERROR, errorMessage); + if (batteryModificationInfos.getDroop() != null) { + checkIsPercentage(errorMessage, batteryModificationInfos.getDroop().getValue(), MODIFY_BATTERY_ERROR, "Droop"); } } @@ -71,7 +71,7 @@ private void checkActivePowerZeroOrBetweenMinAndMaxActivePowerBattery(BatteryMod public void apply(Network network, ReportNode subReportNode) { Battery battery = ModificationUtils.getInstance().getBattery(network, modificationInfos.getEquipmentId()); // modify the battery in the network - modifyBattery(battery, modificationInfos, subReportNode); + modifyBattery(battery, subReportNode); } @Override @@ -79,29 +79,31 @@ public String getName() { return "BatteryModification"; } - private void modifyBattery(Battery battery, BatteryModificationInfos modificationInfos, ReportNode subReportNode) { + private void modifyBattery(Battery battery, ReportNode subReportNode) { + BatteryModificationInfos batteryModificationInfos = (BatteryModificationInfos) modificationInfos; subReportNode.newReportNode() .withMessageTemplate("network.modification.batteryModification") - .withUntypedValue("id", modificationInfos.getEquipmentId()) + .withUntypedValue("id", batteryModificationInfos.getEquipmentId()) .withSeverity(TypedValue.INFO_SEVERITY) .add(); - if (modificationInfos.getEquipmentName() != null && modificationInfos.getEquipmentName().getValue() != null) { - ModificationUtils.getInstance().applyElementaryModifications(battery::setName, () -> battery.getOptionalName().orElse("No value"), modificationInfos.getEquipmentName(), subReportNode, "Name"); + if (batteryModificationInfos.getEquipmentName() != null && batteryModificationInfos.getEquipmentName().getValue() != null) { + ModificationUtils.getInstance().applyElementaryModifications(battery::setName, () -> battery.getOptionalName().orElse("No value"), batteryModificationInfos.getEquipmentName(), subReportNode, "Name"); } - modifyBatteryVoltageLevelBusOrBusBarSectionAttributes(modificationInfos, battery, subReportNode); - modifyBatteryLimitsAttributes(modificationInfos, battery, subReportNode); + modifyBatteryVoltageLevelBusOrBusBarSectionAttributes(batteryModificationInfos, battery, subReportNode); + modifyBatteryLimitsAttributes(batteryModificationInfos, battery, subReportNode); modifyBatterySetpointsAttributes( - modificationInfos.getTargetP(), modificationInfos.getTargetQ(), - modificationInfos.getParticipate(), modificationInfos.getDroop(), + batteryModificationInfos.getTargetP(), batteryModificationInfos.getTargetQ(), + batteryModificationInfos.getParticipate(), batteryModificationInfos.getDroop(), battery, subReportNode); - modifyBatteryConnectivityAttributes(modificationInfos, battery, subReportNode); - ModificationUtils.getInstance().modifyShortCircuitExtension(modificationInfos.getDirectTransX(), - modificationInfos.getStepUpTransformerX(), + modifyBatteryConnectivityAttributes(batteryModificationInfos, battery, subReportNode); + updateMeasurements(battery, batteryModificationInfos, subReportNode); + ModificationUtils.getInstance().modifyShortCircuitExtension(batteryModificationInfos.getDirectTransX(), + batteryModificationInfos.getStepUpTransformerX(), battery.getExtension(BatteryShortCircuit.class), () -> battery.newExtension(BatteryShortCircuitAdder.class), subReportNode); - PropertiesUtils.applyProperties(battery, subReportNode, modificationInfos.getProperties(), "network.modification.BatteryProperties"); + PropertiesUtils.applyProperties(battery, subReportNode, batteryModificationInfos.getProperties(), "network.modification.BatteryProperties"); } public static void modifyBatterySetpointsAttributes(AttributeModification targetP, diff --git a/src/test/java/org/gridsuite/modification/modifications/BatteryModificationTest.java b/src/test/java/org/gridsuite/modification/modifications/BatteryModificationTest.java index b146a435..ae247ab4 100644 --- a/src/test/java/org/gridsuite/modification/modifications/BatteryModificationTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/BatteryModificationTest.java @@ -13,6 +13,8 @@ import com.powsybl.iidm.network.ReactiveLimitsKind; import com.powsybl.iidm.network.extensions.ActivePowerControl; import com.powsybl.iidm.network.extensions.BatteryShortCircuit; +import com.powsybl.iidm.network.extensions.Measurement; +import com.powsybl.iidm.network.extensions.Measurements; import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.*; import org.gridsuite.modification.utils.NetworkCreation; @@ -23,6 +25,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.stream.IntStream; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; /** @@ -32,6 +35,10 @@ class BatteryModificationTest extends AbstractInjectionModificationTest { private static final String PROPERTY_NAME = "property-name"; private static final String PROPERTY_VALUE = "property-value"; + private static final Double MEASUREMENT_P_VALUE = 10.0; + private static final Boolean MEASUREMENT_P_VALID = false; + private static final Double MEASUREMENT_Q_VALUE = 0.5; + private static final Boolean MEASUREMENT_Q_VALID = true; @Override public void checkModification() { @@ -90,8 +97,12 @@ protected BatteryModificationInfos buildModification() { .stepUpTransformerX(new AttributeModification<>(0.2, OperationType.SET)) .participate(new AttributeModification<>(true, OperationType.SET)) .reactiveCapabilityCurve(new AttributeModification<>(true, OperationType.SET)) + .pMeasurementValue(new AttributeModification<>(MEASUREMENT_P_VALUE, OperationType.SET)) + .pMeasurementValidity(new AttributeModification<>(MEASUREMENT_P_VALID, OperationType.SET)) + .qMeasurementValue(new AttributeModification<>(MEASUREMENT_Q_VALUE, OperationType.SET)) + .qMeasurementValidity(new AttributeModification<>(MEASUREMENT_Q_VALID, OperationType.SET)) .properties(List.of(FreePropertyInfos.builder().name(PROPERTY_NAME) - .value(PROPERTY_VALUE).build())) + .value(PROPERTY_VALUE).build())) .build(); } @@ -129,6 +140,7 @@ protected void assertAfterNetworkModificationApplication() { assertNotNull(batteryShortCircuit); assertEquals(0.1, batteryShortCircuit.getDirectTransX()); assertEquals(0.2, batteryShortCircuit.getStepUpTransformerX()); + assertMeasurements(modifiedBattery); } @Test @@ -224,4 +236,15 @@ void testConnectionError() { String message = assertThrows(NetworkModificationException.class, () -> batteryModificationInfos.toModification().apply(getNetwork())).getMessage(); assertEquals("INJECTION_MODIFICATION_ERROR : Could not connect equipment 'v3Battery'", message); } + + private void assertMeasurements(Battery battery) { + Measurements measurements = (Measurements) battery.getExtension(Measurements.class); + assertNotNull(measurements); + Collection activePowerMeasurements = measurements.getMeasurements(Measurement.Type.ACTIVE_POWER).stream().toList(); + Collection reactivePowerMeasurements = measurements.getMeasurements(Measurement.Type.REACTIVE_POWER).stream().toList(); + assertThat(activePowerMeasurements).isNotEmpty(); + assertThat(reactivePowerMeasurements).isNotEmpty(); + assertThat(activePowerMeasurements).allMatch(m -> m.getValue() == MEASUREMENT_P_VALUE && m.isValid() == MEASUREMENT_P_VALID); + assertThat(reactivePowerMeasurements).allMatch(m -> m.getValue() == MEASUREMENT_Q_VALUE && m.isValid() == MEASUREMENT_Q_VALID); + } }