Skip to content

Commit

Permalink
Add battery tabular modifications (#395)
Browse files Browse the repository at this point in the history
Signed-off-by: Franck LECUYER <[email protected]>
  • Loading branch information
FranckLecuyer authored Dec 19, 2023
1 parent 61f9dcb commit c535de6
Show file tree
Hide file tree
Showing 7 changed files with 129 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -118,15 +120,14 @@ public BatteryModificationInfos toModificationInfos() {
}

private BatteryModificationInfos.BatteryModificationInfosBuilder<?, ?> toBatteryModificationInfosBuilder() {
List<ReactiveCapabilityCurveModificationInfos> 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<ReactiveCapabilityCurveModificationEmbeddable> pointsEmbeddable = !CollectionUtils.isEmpty(reactiveCapabilityCurvePoints) ? reactiveCapabilityCurvePoints : null;
List<ReactiveCapabilityCurveModificationInfos> 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())
Expand All @@ -147,5 +148,4 @@ public BatteryModificationInfos toModificationInfos() {
.reactiveCapabilityCurve(toAttributeModification(getReactiveCapabilityCurve()))
.reactiveCapabilityCurvePoints(points);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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 <franck.lecuyer at rte-france.com>
*/
@Tag("IntegrationTest")
public class TabularBatteryModificationsTest extends AbstractNetworkModificationTest {
@Override
protected Network createNetwork(UUID networkUuid) {
return NetworkCreation.create(networkUuid, true);
}

@Override
protected ModificationInfos buildModification() {
List<ModificationInfos> 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<ModificationInfos> 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<String, String> 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<String, String> updatedValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { });
Assertions.assertEquals("BATTERY_MODIFICATION", updatedValues.get("tabularModificationType"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit c535de6

Please sign in to comment.