diff --git a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java index e73b31db..a303ebcf 100644 --- a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java +++ b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java @@ -37,10 +37,12 @@ public enum TwoWindingsTransformerField { RATED_S, TARGET_V, RATIO_LOW_TAP_POSITION, + RATIO_HIGH_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND, REGULATION_VALUE, PHASE_LOW_TAP_POSITION, + PHASE_HIGH_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND, SELECTED_OPERATIONAL_LIMITS_GROUP_ID1, @@ -82,6 +84,7 @@ public static boolean isEquipmentEditable(TwoWindingsTransformer twoWindingsTran } yield isEditable; } + case RATIO_HIGH_TAP_POSITION, PHASE_HIGH_TAP_POSITION -> false; default -> true; }; @@ -102,6 +105,8 @@ public static String getReferenceValue(TwoWindingsTransformer transformer, Strin case TARGET_V -> ratioTapChanger != null ? String.valueOf(ratioTapChanger.getTargetV()) : null; case RATIO_LOW_TAP_POSITION -> ratioTapChanger != null ? String.valueOf(ratioTapChanger.getLowTapPosition()) : null; + case RATIO_HIGH_TAP_POSITION -> + ratioTapChanger != null ? String.valueOf(ratioTapChanger.getHighTapPosition()) : null; case RATIO_TAP_POSITION -> ratioTapChanger != null ? String.valueOf(ratioTapChanger.getTapPosition()) : null; case RATIO_TARGET_DEADBAND -> @@ -110,6 +115,8 @@ public static String getReferenceValue(TwoWindingsTransformer transformer, Strin phaseTapChanger != null ? String.valueOf(phaseTapChanger.getRegulationValue()) : null; case PHASE_LOW_TAP_POSITION -> phaseTapChanger != null ? String.valueOf(phaseTapChanger.getLowTapPosition()) : null; + case PHASE_HIGH_TAP_POSITION -> + phaseTapChanger != null ? String.valueOf(phaseTapChanger.getHighTapPosition()) : null; case PHASE_TAP_POSITION -> phaseTapChanger != null ? String.valueOf(phaseTapChanger.getTapPosition()) : null; case PHASE_TARGET_DEADBAND -> @@ -131,6 +138,8 @@ public static void setNewValue(TwoWindingsTransformer transformer, String twoWin PHASE_TARGET_DEADBAND -> setNewDoubleValue(transformer, field, newValue, errorMessage); case SELECTED_OPERATIONAL_LIMITS_GROUP_ID1, SELECTED_OPERATIONAL_LIMITS_GROUP_ID2 -> setNewStringValue(transformer, field, newValue, errorMessage); + case RATIO_HIGH_TAP_POSITION, PHASE_HIGH_TAP_POSITION -> + throw new IllegalArgumentException(String.format("field %s is not editable", field)); } } diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java index 3b45da28..628cfb2c 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java @@ -6,6 +6,7 @@ */ package org.gridsuite.modification.modifications.byfilter.assignment; +import com.powsybl.commons.report.ReportNode; import com.powsybl.iidm.network.*; import com.powsybl.iidm.network.extensions.ConnectablePosition; import org.gridsuite.filter.utils.EquipmentType; @@ -19,6 +20,7 @@ import org.gridsuite.modification.dto.byfilter.equipmentfield.TwoWindingsTransformerField; import org.junit.jupiter.api.Test; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.UUID; @@ -118,6 +120,32 @@ void testModifyTwtWithWarning() throws Exception { assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getRatioTapChanger()); } + @Test + void isEquipmentEditableShouldBeFalseForHighTapPositions() { + TwoWindingsTransformer twtRatio = getNetwork().getTwoWindingsTransformer(TWT_ID_1); + TwoWindingsTransformer twtPhase = getNetwork().getTwoWindingsTransformer(TWT_ID_4); + + List equipReports = new ArrayList<>(); + boolean editableRatioHigh = TwoWindingsTransformerField.isEquipmentEditable(twtRatio, TwoWindingsTransformerField.RATIO_HIGH_TAP_POSITION.name(), equipReports); + boolean editablePhaseHigh = TwoWindingsTransformerField.isEquipmentEditable(twtPhase, TwoWindingsTransformerField.PHASE_HIGH_TAP_POSITION.name(), equipReports); + + assertFalse(editableRatioHigh); + assertFalse(editablePhaseHigh); + } + + @Test + void setNewValueShouldThrowForNonEditableHighTapPositions() { + TwoWindingsTransformer twtRatio = getNetwork().getTwoWindingsTransformer(TWT_ID_1); + TwoWindingsTransformer twtPhase = getNetwork().getTwoWindingsTransformer(TWT_ID_4); + + assertThrows(IllegalArgumentException.class, () -> + TwoWindingsTransformerField.setNewValue(twtRatio, TwoWindingsTransformerField.RATIO_HIGH_TAP_POSITION.name(), "10") + ); + assertThrows(IllegalArgumentException.class, () -> + TwoWindingsTransformerField.setNewValue(twtPhase, TwoWindingsTransformerField.PHASE_HIGH_TAP_POSITION.name(), "10") + ); + } + @Override protected void createEquipments() { Substation s1 = getNetwork().getSubstation("s1"); @@ -317,6 +345,20 @@ protected List> getAssignmentInfos() { .value("") .build(); + // High tap position is always equals to lowTapPosition + steps.size() - 1 and its modification is ignored + IntegerAssignmentInfos assignmentInfos20 = IntegerAssignmentInfos.builder() + .filters(List.of(filter1)) + .editedField(TwoWindingsTransformerField.RATIO_HIGH_TAP_POSITION.name()) + .value(10) + .build(); + + // High tap position is always equals to lowTapPosition + steps.size() - 1 and its modification is ignored + IntegerAssignmentInfos assignmentInfos21 = IntegerAssignmentInfos.builder() + .filters(List.of(filter3)) + .editedField(TwoWindingsTransformerField.PHASE_HIGH_TAP_POSITION.name()) + .value(10) + .build(); + List> infosList = super.getAssignmentInfos(); infosList.addAll(List.of(assignmentInfos1, assignmentInfos2, @@ -336,7 +378,9 @@ protected List> getAssignmentInfos() { assignmentInfos16, assignmentInfos17, assignmentInfos18, - assignmentInfos19)); + assignmentInfos19, + assignmentInfos20, + assignmentInfos21)); return infosList; } @@ -359,6 +403,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(2, ratioTapChanger1.getTargetV(), 0); assertEquals(4, ratioTapChanger1.getLowTapPosition()); assertEquals(8, ratioTapChanger1.getTapPosition()); + assertEquals(9, ratioTapChanger1.getHighTapPosition()); assertEquals(5, ratioTapChanger1.getTargetDeadband(), 0); assertEquals(20, twt1.getX(), 0); assertEquals(2.5, twt1.getB(), 0); @@ -378,6 +423,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(2, ratioTapChanger2.getTargetV(), 0); assertEquals(3, ratioTapChanger2.getLowTapPosition()); assertEquals(4, ratioTapChanger2.getTapPosition()); + assertEquals(8, ratioTapChanger2.getHighTapPosition()); assertEquals(5, ratioTapChanger2.getTargetDeadband(), 0); assertEquals(20, twt2.getX(), 0); assertEquals(2.5, twt2.getB(), 0); @@ -409,6 +455,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(2, phaseTapChanger4.getRegulationValue(), 0); assertEquals(2, phaseTapChanger4.getLowTapPosition()); assertEquals(3, phaseTapChanger4.getTapPosition()); + assertEquals(7, phaseTapChanger4.getHighTapPosition()); assertEquals(10, phaseTapChanger4.getTargetDeadband(), 0); assertEquals(2, twt4.getR(), 0); assertEquals(20, twt4.getX(), 0); @@ -422,9 +469,10 @@ protected void assertAfterNetworkModificationApplication() { TwoWindingsTransformer twt5 = getNetwork().getTwoWindingsTransformer(TWT_ID_5); PhaseTapChanger phaseTapChanger5 = twt5.getPhaseTapChanger(); - assertNotNull(phaseTapChanger4); + assertNotNull(phaseTapChanger5); assertEquals(2, phaseTapChanger5.getLowTapPosition()); assertEquals(2, phaseTapChanger5.getTapPosition()); + assertEquals(7, phaseTapChanger5.getHighTapPosition()); assertEquals(2, twt5.getR(), 0); assertEquals(2.5, twt5.getB(), 0); assertEquals(0.5, twt5.getRatedU2(), 0); @@ -433,7 +481,7 @@ protected void assertAfterNetworkModificationApplication() { TwoWindingsTransformer twt6 = getNetwork().getTwoWindingsTransformer(TWT_ID_6); PhaseTapChanger phaseTapChanger6 = twt6.getPhaseTapChanger(); - assertNotNull(phaseTapChanger4); + assertNotNull(phaseTapChanger6); assertEquals(2, phaseTapChanger6.getRegulationValue(), 0); assertEquals(10, phaseTapChanger6.getTargetDeadband(), 0); assertEquals(20, twt6.getX(), 0); diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java index 651d0fe3..ed318c70 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java @@ -17,6 +17,7 @@ import org.gridsuite.modification.dto.byfilter.formula.Operator; import org.gridsuite.modification.dto.byfilter.formula.ReferenceFieldOrValue; import org.junit.jupiter.api.Test; + import java.util.List; import java.util.Map; import java.util.UUID; @@ -195,7 +196,17 @@ protected Map getTestFilters() { new IdentifiableAttributes(TWT_ID_6, getIdentifiableType(), 7.0) )).build(); - return Map.of(FILTER_ID_1, filter1, FILTER_ID_2, filter2, FILTER_ID_3, filter3, FILTER_ID_4, filter4); + FilterEquipments filter5 = FilterEquipments.builder().filterId(FILTER_ID_5).identifiableAttributes(List.of( + new IdentifiableAttributes(TWT_ID_2, getIdentifiableType(), 2.0) + )).build(); + + FilterEquipments filter6 = FilterEquipments.builder().filterId(FILTER_ID_6).identifiableAttributes(List.of( + new IdentifiableAttributes(TWT_ID_6, getIdentifiableType(), 7.0) + )).build(); + + return Map.of(FILTER_ID_1, filter1, FILTER_ID_2, filter2, FILTER_ID_3, filter3, FILTER_ID_4, filter4, + FILTER_ID_5, filter5, FILTER_ID_6, filter6); + } @Override @@ -290,6 +301,32 @@ protected List getFormulaInfos() { ReferenceFieldOrValue.builder().value(200.).build(), ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.RATED_S.name()).build()); + // High tap position is always equals to lowTapPosition + steps.size() - 1 and its modification is ignored + FormulaInfos formulaInfos16 = getFormulaInfo(TwoWindingsTransformerField.RATIO_HIGH_TAP_POSITION.name(), + List.of(filter1), + Operator.ADDITION, + ReferenceFieldOrValue.builder().value(2.).build(), + ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name()).build()); + + // High tap position is always equals to lowTapPosition + steps.size() - 1 and its modification is ignored + FormulaInfos formulaInfos17 = getFormulaInfo(TwoWindingsTransformerField.PHASE_HIGH_TAP_POSITION.name(), + List.of(filter3), + Operator.ADDITION, + ReferenceFieldOrValue.builder().value(2.).build(), + ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()).build()); + + FormulaInfos formulaInfos18 = getFormulaInfo(TwoWindingsTransformerField.RATIO_TAP_POSITION.name(), + List.of(filter5), + Operator.SUBTRACTION, + ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.RATIO_HIGH_TAP_POSITION.name()).build(), + ReferenceFieldOrValue.builder().value(2.).build()); + + FormulaInfos formulaInfos19 = getFormulaInfo(TwoWindingsTransformerField.PHASE_TAP_POSITION.name(), + List.of(filter6), + Operator.SUBTRACTION, + ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.PHASE_HIGH_TAP_POSITION.name()).build(), + ReferenceFieldOrValue.builder().value(2.).build()); + return List.of(formulaInfos1, formulaInfos2, formulaInfos3, @@ -304,7 +341,11 @@ protected List getFormulaInfos() { formulaInfos12, formulaInfos13, formulaInfos14, - formulaInfos15); + formulaInfos15, + formulaInfos16, + formulaInfos17, + formulaInfos18, + formulaInfos19); } @Override @@ -325,6 +366,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(100, ratioTapChanger1.getTargetV(), 0); assertEquals(1, ratioTapChanger1.getLowTapPosition()); assertEquals(5, ratioTapChanger1.getTapPosition()); + assertEquals(6, ratioTapChanger1.getHighTapPosition()); assertEquals(11, ratioTapChanger1.getTargetDeadband(), 0); assertEquals(60, twt1.getX(), 0); assertEquals(150, twt1.getB(), 0); @@ -339,7 +381,8 @@ protected void assertAfterNetworkModificationApplication() { assertNotNull(ratioTapChanger2); assertEquals(106, ratioTapChanger2.getTargetV(), 0); assertEquals(3, ratioTapChanger2.getLowTapPosition()); - assertEquals(4, ratioTapChanger2.getTapPosition()); + assertEquals(6, ratioTapChanger2.getTapPosition()); + assertEquals(8, ratioTapChanger2.getHighTapPosition()); assertEquals(11.6, ratioTapChanger2.getTargetDeadband(), 0); assertEquals(65, twt2.getX(), 0); assertEquals(162.5, twt2.getB(), 0); @@ -363,6 +406,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(90, phaseTapChanger4.getRegulationValue(), 0); assertEquals(2, phaseTapChanger4.getLowTapPosition()); assertEquals(5, phaseTapChanger4.getTapPosition()); + assertEquals(7, phaseTapChanger4.getHighTapPosition()); assertEquals(24, phaseTapChanger4.getTargetDeadband(), 0); assertEquals(90, twt4.getR(), 0); assertEquals(75, twt4.getX(), 0); @@ -374,16 +418,18 @@ protected void assertAfterNetworkModificationApplication() { TwoWindingsTransformer twt5 = getNetwork().getTwoWindingsTransformer(TWT_ID_5); PhaseTapChanger phaseTapChanger5 = twt5.getPhaseTapChanger(); - assertNotNull(phaseTapChanger4); + assertNotNull(phaseTapChanger5); assertEquals(4, phaseTapChanger5.getLowTapPosition()); assertEquals(6, phaseTapChanger5.getTapPosition()); + assertEquals(9, phaseTapChanger5.getHighTapPosition()); assertEquals(100, twt5.getR(), 0); assertEquals(200, twt5.getB(), 0); assertEquals(20, twt5.getRatedU2(), 0); TwoWindingsTransformer twt6 = getNetwork().getTwoWindingsTransformer(TWT_ID_6); PhaseTapChanger phaseTapChanger6 = twt6.getPhaseTapChanger(); - assertNotNull(phaseTapChanger4); + assertNotNull(phaseTapChanger6); + assertEquals(4, phaseTapChanger6.getTapPosition()); assertEquals(94, phaseTapChanger6.getRegulationValue(), 0); assertEquals(26, phaseTapChanger6.getTargetDeadband(), 0); assertEquals(85, twt6.getX(), 0);