diff --git a/src/main/java/org/gridsuite/voltageinit/server/dto/BatteryModificationInfos.java b/src/main/java/org/gridsuite/voltageinit/server/dto/BatteryModificationInfos.java new file mode 100644 index 0000000..5934aa3 --- /dev/null +++ b/src/main/java/org/gridsuite/voltageinit/server/dto/BatteryModificationInfos.java @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2026, 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.voltageinit.server.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +/** + * @author Mathieu Deharbe + */ +@SuperBuilder +@Getter +@Setter +public class BatteryModificationInfos { + private String batteryId; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private Double targetV; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private Double targetQ; +} diff --git a/src/main/java/org/gridsuite/voltageinit/server/dto/VoltageInitModificationInfos.java b/src/main/java/org/gridsuite/voltageinit/server/dto/VoltageInitModificationInfos.java index a8732e4..9288e38 100644 --- a/src/main/java/org/gridsuite/voltageinit/server/dto/VoltageInitModificationInfos.java +++ b/src/main/java/org/gridsuite/voltageinit/server/dto/VoltageInitModificationInfos.java @@ -23,6 +23,8 @@ public class VoltageInitModificationInfos { private String type = "VOLTAGE_INIT_MODIFICATION"; + private List batteries = new ArrayList<>(); + private List generators = new ArrayList<>(); private List transformers = new ArrayList<>(); @@ -45,6 +47,10 @@ public void addGeneratorModification(GeneratorModificationInfos generatorModific generators.add(generatorModificationInfos); } + public void addBatteryModification(BatteryModificationInfos batteryModificationInfos) { + batteries.add(batteryModificationInfos); + } + public void addTransformerModification(TransformerModificationInfos transformerModificationInfos) { transformers.add(transformerModificationInfos); } diff --git a/src/main/java/org/gridsuite/voltageinit/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/voltageinit/server/service/NetworkModificationService.java index 05afc0a..e5f1400 100644 --- a/src/main/java/org/gridsuite/voltageinit/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/voltageinit/server/service/NetworkModificationService.java @@ -9,21 +9,11 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.powsybl.commons.PowsyblException; -import com.powsybl.iidm.network.Bus; -import com.powsybl.iidm.network.Identifiable; -import com.powsybl.iidm.network.Network; -import com.powsybl.iidm.network.ShuntCompensator; -import com.powsybl.iidm.network.Terminal; -import com.powsybl.iidm.network.TwoWindingsTransformer; +import com.powsybl.iidm.network.*; +import com.powsybl.iidm.network.extensions.VoltageRegulation; import com.powsybl.openreac.parameters.output.OpenReacResult; import org.gridsuite.computation.service.UuidGeneratorService; -import org.gridsuite.voltageinit.server.dto.BusModificationInfos; -import org.gridsuite.voltageinit.server.dto.GeneratorModificationInfos; -import org.gridsuite.voltageinit.server.dto.ShuntCompensatorModificationInfos; -import org.gridsuite.voltageinit.server.dto.StaticVarCompensatorModificationInfos; -import org.gridsuite.voltageinit.server.dto.TransformerModificationInfos; -import org.gridsuite.voltageinit.server.dto.VoltageInitModificationInfos; -import org.gridsuite.voltageinit.server.dto.VscConverterStationModificationInfos; +import org.gridsuite.voltageinit.server.dto.*; import org.jgrapht.alg.util.Pair; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; @@ -143,6 +133,36 @@ public UUID createVoltageInitModificationGroup(Network network, OpenReacResult r voltageInitModificationInfos.addTransformerModification(builder.build()); }); + // battery modifications + result.getBatteryModifications().forEach(batMod -> { + String batteryId = batMod.getBatteryId(); + targetV.set(null); + Battery battery = network.getBattery(batteryId); + if (battery != null) { + VoltageRegulation voltageRegulation = battery.getExtension(VoltageRegulation.class); + if (voltageRegulation != null) { + Optional bus = getRegulatingBus(voltageRegulation.getRegulatingTerminal()); + bus.ifPresent(b -> { + Pair busUpdate = voltageProfile.get(b.getId()); + if (busUpdate != null) { + targetV.set(busUpdate.getFirst() * b.getVoltageLevel().getNominalV()); + } + }); + } + } + + Double targetQ = batMod.getTargetQ(); + if (targetV.get() != null || targetQ != null) { + voltageInitModificationInfos.addBatteryModification( + BatteryModificationInfos.builder() + .batteryId(batteryId) + .targetV(targetV.get()) + .targetQ(targetQ) + .build() + ); + } + }); + // static var compensator modifications result.getSvcModifications().forEach(staticVarCompensatorModification -> { if (staticVarCompensatorModification.getVoltageSetpoint() != null || staticVarCompensatorModification.getReactivePowerSetpoint() != null) { diff --git a/src/test/java/org/gridsuite/voltageinit/server/VoltageInitControllerTest.java b/src/test/java/org/gridsuite/voltageinit/server/VoltageInitControllerTest.java index 5ea9a31..0cc0918 100644 --- a/src/test/java/org/gridsuite/voltageinit/server/VoltageInitControllerTest.java +++ b/src/test/java/org/gridsuite/voltageinit/server/VoltageInitControllerTest.java @@ -14,14 +14,10 @@ import com.powsybl.commons.report.ReportNode; import com.powsybl.computation.CompletableFutureTask; import com.powsybl.computation.ComputationManager; -import com.powsybl.iidm.modification.GeneratorModification; -import com.powsybl.iidm.modification.ShuntCompensatorModification; -import com.powsybl.iidm.modification.StaticVarCompensatorModification; -import com.powsybl.iidm.modification.VscConverterStationModification; +import com.powsybl.iidm.modification.*; import com.powsybl.iidm.modification.tapchanger.RatioTapPositionModification; -import com.powsybl.iidm.network.Country; -import com.powsybl.iidm.network.Network; -import com.powsybl.iidm.network.VariantManagerConstants; +import com.powsybl.iidm.network.*; +import com.powsybl.iidm.network.extensions.VoltageRegulationAdder; import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; import com.powsybl.network.store.client.NetworkStoreService; import com.powsybl.network.store.client.PreloadingStrategy; @@ -97,6 +93,8 @@ import java.util.*; import java.util.concurrent.ForkJoinPool; +import static com.powsybl.iidm.network.test.EurostagTutorialExample1Factory.NGEN; +import static com.powsybl.iidm.network.test.EurostagTutorialExample1Factory.VLGEN; import static com.powsybl.network.store.model.NetworkStoreApi.VERSION; import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.computation.s3.ComputationS3Service.METADATA_FILE_NAME; @@ -183,6 +181,7 @@ private OpenReacResult buildOpenReacResult() { GeneratorModification.Modifs m2 = new GeneratorModification.Modifs(); m2.setTargetQ(50.); openReacAmplIOFiles.getNetworkModifications().getGeneratorModifications().add(new GeneratorModification("GEN2", m2)); + openReacAmplIOFiles.getNetworkModifications().getBatteryModifications().add(new BatteryModification("BAT", 215., 51.)); openReacAmplIOFiles.getNetworkModifications().getTapPositionModifications().add(new RatioTapPositionModification("NHV2_NLOAD", 2)); openReacAmplIOFiles.getNetworkModifications().getTapPositionModifications().add(new RatioTapPositionModification("unknown2WT", 2)); @@ -275,10 +274,14 @@ void setUp(final MockWebServer server) throws JsonProcessingException { // network store service mocking network = EurostagTutorialExample1Factory.createWithMoreGenerators(new NetworkFactoryImpl()); - network.getVoltageLevel("VLGEN").newShuntCompensator() + + VoltageLevel vlgen = network.getVoltageLevel(VLGEN); + Bus ngen = vlgen.getBusBreakerView().getBus(NGEN); + + vlgen.newShuntCompensator() .setId("SHUNT_1") - .setBus("NGEN") - .setConnectableBus("NGEN") + .setBus(ngen.getId()) + .setConnectableBus(ngen.getId()) .setTargetV(30.) .setTargetDeadband(10) .setVoltageRegulatorOn(false) @@ -290,6 +293,20 @@ void setUp(final MockWebServer server) throws JsonProcessingException { .setSectionCount(1) .add(); + Battery bat = vlgen.newBattery() + .setId("BAT") + .setBus(ngen.getId()) + .setConnectableBus(ngen.getId()) + .setMinP(-9999.99) + .setMaxP(9999.99) + .setTargetP(607.0) + .setTargetQ(301.0) + .add(); + bat.newExtension(VoltageRegulationAdder.class) + .withTargetV(215.) + .withVoltageRegulatorOn(false) + .add(); + network.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, VARIANT_1_ID); network.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, VARIANT_2_ID); network.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, VARIANT_3_ID);