diff --git a/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java index aed233546..54ca38b8a 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java @@ -16,6 +16,7 @@ import java.util.stream.Collectors; import org.gridsuite.modification.server.dto.*; +import org.gridsuite.modification.server.entities.equipment.modification.BatteryModificationEntity; import org.gridsuite.modification.server.entities.equipment.modification.GeneratorModificationEntity; import org.gridsuite.modification.server.entities.equipment.modification.LoadModificationEntity; import org.gridsuite.modification.server.entities.equipment.modification.VoltageLevelModificationEntity; @@ -47,6 +48,9 @@ public TabularModificationEntity(TabularModificationInfos tabularModificationInf case "LOAD_MODIFICATION": modifications = tabularModificationInfos.getModifications().stream().map(loadModificationInfos -> new LoadModificationEntity((LoadModificationInfos) loadModificationInfos)).collect(Collectors.toList()); break; + case "BATTERY_MODIFICATION": + modifications = tabularModificationInfos.getModifications().stream().map(batteryModificationInfos -> new BatteryModificationEntity((BatteryModificationInfos) batteryModificationInfos)).collect(Collectors.toList()); + break; case "VOLTAGE_LEVEL_MODIFICATION": modifications = tabularModificationInfos.getModifications().stream().map(voltageLevelModificationInfos -> new VoltageLevelModificationEntity((VoltageLevelModificationInfos) voltageLevelModificationInfos)).collect(Collectors.toList()); break; @@ -77,6 +81,9 @@ public void update(@NonNull ModificationInfos modificationInfos) { case "GENERATOR_MODIFICATION": modifications.addAll(tabularModificationInfos.getModifications().stream().map(generatorModificationInfos -> new GeneratorModificationEntity((GeneratorModificationInfos) generatorModificationInfos)).collect(Collectors.toList())); break; + case "BATTERY_MODIFICATION": + modifications.addAll(tabularModificationInfos.getModifications().stream().map(batteryModificationInfos -> new BatteryModificationEntity((BatteryModificationInfos) batteryModificationInfos)).collect(Collectors.toList())); + break; case "LOAD_MODIFICATION": modifications.addAll(tabularModificationInfos.getModifications().stream().map(loadModificationInfos -> new LoadModificationEntity((LoadModificationInfos) loadModificationInfos)).collect(Collectors.toList())); break; diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BatteryModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BatteryModificationEntity.java index 9fe51554c..5d9791d9d 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BatteryModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BatteryModificationEntity.java @@ -15,6 +15,8 @@ import org.gridsuite.modification.server.dto.ModificationInfos; import jakarta.persistence.*; +import org.springframework.util.CollectionUtils; + import java.util.List; import java.util.stream.Collectors; @@ -118,15 +120,14 @@ public BatteryModificationInfos toModificationInfos() { } private BatteryModificationInfos.BatteryModificationInfosBuilder toBatteryModificationInfosBuilder() { - List points = null; - if (getReactiveCapabilityCurvePoints() != null) { - points = getReactiveCapabilityCurvePoints() - .stream() - .map(value -> new ReactiveCapabilityCurveModificationInfos(value.getQminP(), value.getOldQminP(), - value.getQmaxP(), value.getOldQmaxP(), - value.getP(), value.getOldP())) - .collect(Collectors.toList()); - } + List pointsEmbeddable = !CollectionUtils.isEmpty(reactiveCapabilityCurvePoints) ? reactiveCapabilityCurvePoints : null; + List points = pointsEmbeddable != null ? getReactiveCapabilityCurvePoints() + .stream() + .map(value -> new ReactiveCapabilityCurveModificationInfos(value.getQminP(), value.getOldQminP(), + value.getQmaxP(), value.getOldQmaxP(), + value.getP(), value.getOldP())) + .collect(Collectors.toList()) : null; + return BatteryModificationInfos .builder() .uuid(getId()) @@ -147,5 +148,4 @@ public BatteryModificationInfos toModificationInfos() { .reactiveCapabilityCurve(toAttributeModification(getReactiveCapabilityCurve())) .reactiveCapabilityCurvePoints(points); } - } diff --git a/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java b/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java index b5f992747..d61123331 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java @@ -66,6 +66,9 @@ public void apply(Network network, Reporter subReporter) { case "LOAD_MODIFICATION": defaultMessage = "loads" + defaultMessage; break; + case "BATTERY_MODIFICATION": + defaultMessage = "batteries" + defaultMessage; + break; case "VOLTAGE_LEVEL_MODIFICATION": defaultMessage = "voltage levels" + defaultMessage; break; diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 7cf6083ea..45e302cda 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -1151,7 +1151,7 @@ public void shouldGetPosition() { var network2 = networkStoreService.getNetwork(TEST_NETWORK_MIXED_TOPOLOGY_ID, null); var vl = network.getVoltageLevel("v2"); var vl2 = network2.getVoltageLevel("v2"); - assertEquals(10, vl.getConnectableCount()); + assertEquals(11, vl.getConnectableCount()); assertEquals(0, vl2.getConnectableCount()); assertNotNull(network.getBusbarSection("1B")); assertNotNull(network.getBusbarSection("1.1")); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/BatteryModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/BatteryModificationTest.java index 8c9b2dea9..dab5e3372 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/BatteryModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/BatteryModificationTest.java @@ -68,7 +68,6 @@ protected ModificationInfos buildModificationUpdate() { .minActivePower(new AttributeModification<>(1., OperationType.SET)) .maxActivePower(new AttributeModification<>(102., OperationType.SET)) .reactiveCapabilityCurve(new AttributeModification<>(false, OperationType.SET)) - .reactiveCapabilityCurvePoints(List.of()) .build(); } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularBatteryModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularBatteryModificationsTest.java new file mode 100644 index 000000000..33efaeaef --- /dev/null +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularBatteryModificationsTest.java @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2023, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.gridsuite.modification.server.modifications.tabularmodifications; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.powsybl.iidm.network.Network; +import lombok.SneakyThrows; +import org.gridsuite.modification.server.ModificationType; +import org.gridsuite.modification.server.dto.AttributeModification; +import org.gridsuite.modification.server.dto.BatteryModificationInfos; +import org.gridsuite.modification.server.dto.ModificationInfos; +import org.gridsuite.modification.server.dto.OperationType; +import org.gridsuite.modification.server.dto.TabularModificationInfos; +import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; +import org.gridsuite.modification.server.utils.NetworkCreation; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static org.gridsuite.modification.server.utils.TestUtils.assertLogMessage; +import static org.junit.Assert.assertEquals; + +/** + * @author Franck Lecuyer + */ +@Tag("IntegrationTest") +public class TabularBatteryModificationsTest extends AbstractNetworkModificationTest { + @Override + protected Network createNetwork(UUID networkUuid) { + return NetworkCreation.create(networkUuid, true); + } + + @Override + protected ModificationInfos buildModification() { + List modifications = List.of( + BatteryModificationInfos.builder().equipmentId("v1Battery").maxActivePower(new AttributeModification<>(50., OperationType.SET)).build(), + BatteryModificationInfos.builder().equipmentId("v2Battery").minActivePower(new AttributeModification<>(5., OperationType.SET)).build(), + BatteryModificationInfos.builder().equipmentId("v3Battery").activePowerSetpoint(new AttributeModification<>(5., OperationType.SET)).build(), + BatteryModificationInfos.builder().equipmentId("unknownBattery").reactivePowerSetpoint(new AttributeModification<>(500., OperationType.SET)).build() + ); + return TabularModificationInfos.builder() + .modificationType("BATTERY_MODIFICATION") + .modifications(modifications) + .stashed(false) + .build(); + } + + @Override + protected ModificationInfos buildModificationUpdate() { + List modifications = List.of( + BatteryModificationInfos.builder().equipmentId("v1Battery").minActivePower(new AttributeModification<>(3., OperationType.SET)).build(), + BatteryModificationInfos.builder().equipmentId("v2Battery").maxActivePower(new AttributeModification<>(30., OperationType.SET)).build(), + BatteryModificationInfos.builder().equipmentId("v3Battery").activePowerSetpoint(new AttributeModification<>(6., OperationType.SET)).build() + ); + return TabularModificationInfos.builder() + .modificationType("BATTERY_MODIFICATION") + .modifications(modifications) + .stashed(false) + .build(); + } + + @Override + protected void assertAfterNetworkModificationCreation() { + assertEquals(50., getNetwork().getBattery("v1Battery").getMaxP(), 0.001); + assertEquals(5., getNetwork().getBattery("v2Battery").getMinP(), 0.001); + assertEquals(5., getNetwork().getBattery("v3Battery").getTargetP(), 0.001); + assertLogMessage("BATTERY_NOT_FOUND : Battery unknownBattery does not exist in network", ModificationType.BATTERY_MODIFICATION.name() + "1", reportService); + } + + @Override + protected void assertAfterNetworkModificationDeletion() { + assertEquals(15., getNetwork().getBattery("v1Battery").getMaxP(), 0.001); + assertEquals(0., getNetwork().getBattery("v2Battery").getMinP(), 0.001); + assertEquals(1., getNetwork().getBattery("v3Battery").getTargetP(), 0.001); + } + + @Override + @SneakyThrows + protected void testCreationModificationMessage(ModificationInfos modificationInfos) { + assertEquals("TABULAR_MODIFICATION", modificationInfos.getMessageType()); + Map createdValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { }); + Assertions.assertEquals("BATTERY_MODIFICATION", createdValues.get("tabularModificationType")); + } + + @Override + @SneakyThrows + protected void testUpdateModificationMessage(ModificationInfos modificationInfos) { + assertEquals("TABULAR_MODIFICATION", modificationInfos.getMessageType()); + Map updatedValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { }); + Assertions.assertEquals("BATTERY_MODIFICATION", updatedValues.get("tabularModificationType")); + } +} diff --git a/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java b/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java index 73c930cec..9b8f5d4a4 100644 --- a/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java +++ b/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java @@ -100,6 +100,14 @@ public static Network create(UUID uuid, boolean createHvdcLine, NetworkFactory n createSwitch(v3, "v3dCompensator", "v3dCompensator", SwitchKind.DISCONNECTOR, true, false, false, 0, 3); createSwitch(v3, "v3bCompensator", "v3bCompensator", SwitchKind.BREAKER, true, false, false, 3, 4); + createBattery(v1, "v1Battery", "v1Battery", 80, 0, 15, 6, 3); + createSwitch(v1, "v1dBattery", "v1dBattery", SwitchKind.DISCONNECTOR, true, false, false, 0, 81); + createSwitch(v1, "v1bBattery", "v1bBattery", SwitchKind.BREAKER, true, false, false, 81, 80); + + createBattery(v2, "v2Battery", "v2Battery", 50, 0, 20, 7, 11); + createSwitch(v2, "v2dBattery", "v2dBattery", SwitchKind.DISCONNECTOR, true, false, false, 0, 51); + createSwitch(v2, "v2bBattery", "v2bBattery", SwitchKind.BREAKER, true, false, false, 51, 50); + createBattery(v3, "v3Battery", "v3Battery", 6, 0, 10, 1, 1); createSwitch(v3, "v3dBattery", "v3dBattery", SwitchKind.DISCONNECTOR, true, false, false, 0, 5); createSwitch(v3, "v3bBattery", "v3bBattery", SwitchKind.BREAKER, true, false, false, 5, 6);