Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,30 +27,30 @@
/**
* @author Ghazwa Rehili <ghazwa.rehili at rte-france.com>
*/
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
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");
}
}

Expand All @@ -71,37 +71,39 @@ 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
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<Double> targetP,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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.*;

/**
Expand All @@ -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() {
Expand Down Expand Up @@ -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();
}

Expand Down Expand Up @@ -129,6 +140,7 @@ protected void assertAfterNetworkModificationApplication() {
assertNotNull(batteryShortCircuit);
assertEquals(0.1, batteryShortCircuit.getDirectTransX());
assertEquals(0.2, batteryShortCircuit.getStepUpTransformerX());
assertMeasurements(modifiedBattery);
}

@Test
Expand Down Expand Up @@ -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<Measurement> activePowerMeasurements = measurements.getMeasurements(Measurement.Type.ACTIVE_POWER).stream().toList();
Collection<Measurement> 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);
}
}
Loading