diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/BatteryImpl.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/BatteryImpl.java index 247decbb8f7..916ad25cf67 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/BatteryImpl.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/BatteryImpl.java @@ -95,7 +95,13 @@ public double getTargetQ() { @Override public Battery setTargetQ(double targetQ) { - return this.setLocalTargetQ(targetQ); + NetworkImpl network = getNetwork(); + int variantIndex = network.getVariantIndex(); + double oldValue = getTargetQ(); + setLocalTargetQ(targetQ); + String variantId = network.getVariantManager().getVariantId(variantIndex); + notifyUpdate("targetQ", variantId, oldValue, targetQ); + return this; } /** @@ -123,7 +129,7 @@ public Battery setLocalTargetQ(double targetQ) { double oldValue = this.localTargetQ.set(variantIndex, targetQ); String variantId = network.getVariantManager().getVariantId(variantIndex); network.invalidateValidationLevel(); - notifyUpdate("targetQ", variantId, oldValue, targetQ); + notifyUpdate("localTargetQ", variantId, oldValue, targetQ); return this; } diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/GeneratorImpl.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/GeneratorImpl.java index ab6767ff616..24dde7c59db 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/GeneratorImpl.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/GeneratorImpl.java @@ -211,7 +211,12 @@ public GeneratorImpl setLocalTargetQ(double localTargetQ) { @Override public GeneratorImpl setTargetQ(double targetQ) { - return this.setLocalTargetQ(targetQ); + int variantIndex = network.get().getVariantIndex(); + double oldValue = getTargetQ(); + setLocalTargetQ(targetQ); + String variantId = network.get().getVariantManager().getVariantId(variantIndex); + notifyUpdate("targetQ", variantId, oldValue, targetQ); + return this; } @Override @@ -245,16 +250,18 @@ public double getLocalTargetV() { @Override public GeneratorImpl setTargetV(double targetV) { ValidationUtil.checkDoublePositive(this, targetV, TARGET_V); + int variantIndex = network.get().getVariantIndex(); + String variantId = network.get().getVariantManager().getVariantId(variantIndex); + double oldValueTargetV = getTargetV(); + double oldEquivalentLocalTargetV = getEquivalentLocalTargetV(); if (voltageRegulation != null && hasRegulatingTerminal() && isWithMode(RegulationMode.VOLTAGE)) { - int variantIndex = network.get().getVariantIndex(); - String variantId = network.get().getVariantManager().getVariantId(variantIndex); - double oldValueTargetV = getTargetV(); getVoltageRegulation().setTargetValue(targetV); - notifyUpdate(TARGET_V, variantId, oldValueTargetV, targetV); getNetwork().invalidateValidationLevel(); } else { setLocalTargetV(targetV); } + notifyUpdate(TARGET_V, variantId, oldValueTargetV, targetV); + notifyUpdate("equivalentLocalTargetV", variantId, oldEquivalentLocalTargetV, getEquivalentLocalTargetV()); return this; } @@ -262,17 +269,15 @@ public GeneratorImpl setTargetV(double targetV) { public GeneratorImpl setTargetV(double targetV, double equivalentLocalTargetV) { int variantIndex = network.get().getVariantIndex(); String variantId = network.get().getVariantManager().getVariantId(variantIndex); - double oldLocalTargetV = getLocalTargetV(); + double oldTargetV = getTargetV(); + double oldEquivalentLocalTargetV = getEquivalentLocalTargetV(); if (voltageRegulation != null) { if (hasRegulatingTerminal() && isWithMode(RegulationMode.VOLTAGE)) { - double oldTargetV = getVoltageRegulation().getTargetValue(); + oldTargetV = getVoltageRegulation().getTargetValue(); setLocalTargetV(equivalentLocalTargetV); getVoltageRegulation().setTargetValue(targetV); - notifyUpdate(LOCAL_TARGET_V, variantId, oldTargetV, equivalentLocalTargetV); - notifyUpdate(TARGET_V, variantId, oldLocalTargetV, targetV); } else { setLocalTargetV(targetV); - notifyUpdate(LOCAL_TARGET_V, variantId, oldLocalTargetV, equivalentLocalTargetV); } } else { newVoltageRegulation() @@ -281,9 +286,9 @@ public GeneratorImpl setTargetV(double targetV, double equivalentLocalTargetV) { .withRegulating(false) .build(); setLocalTargetV(equivalentLocalTargetV); - notifyUpdate(LOCAL_TARGET_V, variantId, oldLocalTargetV, equivalentLocalTargetV); - notifyUpdate(TARGET_V, variantId, oldLocalTargetV, targetV); } + notifyUpdate(TARGET_V, variantId, oldTargetV, targetV); + notifyUpdate("equivalentLocalTargetV", variantId, oldEquivalentLocalTargetV, getEquivalentLocalTargetV()); getNetwork().invalidateValidationLevel(); return this; } diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/ShuntCompensatorImpl.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/ShuntCompensatorImpl.java index 5abc14d1a21..81df1a844fa 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/ShuntCompensatorImpl.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/ShuntCompensatorImpl.java @@ -63,16 +63,18 @@ public TerminalExt getTerminal() { } @Override - public ShuntCompensator setLocalTargetV(double targetV) { + public ShuntCompensator setLocalTargetV(double newLocalTargetV) { + double oldTargetV = getLocalTargetV(); ValidationUtil.checkLocalTargetQandV(this, ShuntCompensator.class, - targetV, + newLocalTargetV, Double.NaN, getVoltageRegulation(), getNetwork().getMinValidationLevel(), getNetwork().getReportNodeContext().getReportNode()); - this.localTargetV.set(getCurrentIndex(), targetV); + this.localTargetV.set(getCurrentIndex(), newLocalTargetV); getNetwork().invalidateValidationLevel(); + notifyUpdate("localTargetV", oldTargetV, newLocalTargetV); return this; } diff --git a/iidm/iidm-tck/src/test/java/com/powsybl/iidm/network/tck/voltage/regulation/backward/compatibility/AbstractVoltageRegulationBackwardCompatibilityOnBatteryTest.java b/iidm/iidm-tck/src/test/java/com/powsybl/iidm/network/tck/voltage/regulation/backward/compatibility/AbstractVoltageRegulationBackwardCompatibilityOnBatteryTest.java index fdd519f3ca2..93557b7a494 100644 --- a/iidm/iidm-tck/src/test/java/com/powsybl/iidm/network/tck/voltage/regulation/backward/compatibility/AbstractVoltageRegulationBackwardCompatibilityOnBatteryTest.java +++ b/iidm/iidm-tck/src/test/java/com/powsybl/iidm/network/tck/voltage/regulation/backward/compatibility/AbstractVoltageRegulationBackwardCompatibilityOnBatteryTest.java @@ -9,6 +9,9 @@ import com.powsybl.iidm.network.Battery; import com.powsybl.iidm.network.BatteryAdder; +import com.powsybl.iidm.network.NetworkEventRecorder; +import com.powsybl.iidm.network.events.NetworkEvent; +import com.powsybl.iidm.network.events.UpdateNetworkEvent; import com.powsybl.iidm.network.regulation.RegulationMode; import org.junit.jupiter.api.Test; @@ -108,4 +111,31 @@ public void testBatteryFullDeprecatedMethodAndNewMethods() { assertFalse(battery.isRegulating()); } + @Test + void testNotifyUpdateOnSetTargetQ() { + // GIVEN + Battery battery = network.getBatteryStream().toList().getFirst(); + String id = battery.getId(); + double newTargetQ = 123.0; + double oldTargetQ = battery.getTargetQ(); + NetworkEventRecorder listener = new NetworkEventRecorder(); + network.addListener(listener); + // WHEN + battery.setTargetQ(newTargetQ); + // THEN + assertEquals(2, listener.getEvents().size()); + NetworkEvent firstEvent = listener.getEvents().getFirst(); + assertEquals(NetworkEvent.Type.UPDATE, firstEvent.getType()); + assertEquals("localTargetQ", ((UpdateNetworkEvent) firstEvent).attribute()); + assertEquals(newTargetQ, ((UpdateNetworkEvent) firstEvent).newValue()); + assertEquals(oldTargetQ, ((UpdateNetworkEvent) firstEvent).oldValue()); + assertEquals(id, ((UpdateNetworkEvent) firstEvent).id()); + NetworkEvent secondEvent = listener.getEvents().get(1); + assertEquals(NetworkEvent.Type.UPDATE, secondEvent.getType()); + assertEquals("targetQ", ((UpdateNetworkEvent) secondEvent).attribute()); + assertEquals(newTargetQ, ((UpdateNetworkEvent) secondEvent).newValue()); + assertEquals(oldTargetQ, ((UpdateNetworkEvent) secondEvent).oldValue()); + assertEquals(id, ((UpdateNetworkEvent) secondEvent).id()); + } + } diff --git a/iidm/iidm-tck/src/test/java/com/powsybl/iidm/network/tck/voltage/regulation/backward/compatibility/AbstractVoltageRegulationBackwardCompatibilityOnGeneratorTest.java b/iidm/iidm-tck/src/test/java/com/powsybl/iidm/network/tck/voltage/regulation/backward/compatibility/AbstractVoltageRegulationBackwardCompatibilityOnGeneratorTest.java index 82853724178..5deffd55495 100644 --- a/iidm/iidm-tck/src/test/java/com/powsybl/iidm/network/tck/voltage/regulation/backward/compatibility/AbstractVoltageRegulationBackwardCompatibilityOnGeneratorTest.java +++ b/iidm/iidm-tck/src/test/java/com/powsybl/iidm/network/tck/voltage/regulation/backward/compatibility/AbstractVoltageRegulationBackwardCompatibilityOnGeneratorTest.java @@ -9,6 +9,9 @@ import com.powsybl.iidm.network.Generator; import com.powsybl.iidm.network.GeneratorAdder; +import com.powsybl.iidm.network.NetworkEventRecorder; +import com.powsybl.iidm.network.events.NetworkEvent; +import com.powsybl.iidm.network.events.UpdateNetworkEvent; import com.powsybl.iidm.network.regulation.RegulationMode; import org.junit.jupiter.api.Test; @@ -291,4 +294,105 @@ public void testGeneratorLocalVoltageRegulationOnWithPartialDeprecatedMethodsWit assertTrue(generator.isVoltageRegulatorOn()); } + @Test + void testNotifyUpdateOnSetTargetQ() { + // GIVEN + Generator generator = voltageLevel.getGeneratorStream().toList().getFirst(); + String id = generator.getId(); + double newTargetQ = 123.0; + double oldTargetQ = generator.getTargetQ(); + NetworkEventRecorder listener = new NetworkEventRecorder(); + network.addListener(listener); + // WHEN + generator.setTargetQ(newTargetQ); + // THEN + assertEquals(2, listener.getEvents().size()); + NetworkEvent firstEvent = listener.getEvents().getFirst(); + assertEquals(NetworkEvent.Type.UPDATE, firstEvent.getType()); + assertEquals("localTargetQ", ((UpdateNetworkEvent) firstEvent).attribute()); + assertEquals(newTargetQ, ((UpdateNetworkEvent) firstEvent).newValue()); + assertEquals(oldTargetQ, ((UpdateNetworkEvent) firstEvent).oldValue()); + assertEquals(id, ((UpdateNetworkEvent) firstEvent).id()); + NetworkEvent secondEvent = listener.getEvents().get(1); + assertEquals(NetworkEvent.Type.UPDATE, secondEvent.getType()); + assertEquals("targetQ", ((UpdateNetworkEvent) secondEvent).attribute()); + assertEquals(newTargetQ, ((UpdateNetworkEvent) secondEvent).newValue()); + assertEquals(oldTargetQ, ((UpdateNetworkEvent) secondEvent).oldValue()); + assertEquals(id, ((UpdateNetworkEvent) secondEvent).id()); + } + + @Test + void testNotifyUpdateOnSetTargetV() { + // GIVEN + Generator generator = voltageLevel.getGeneratorStream().toList().getFirst(); + String id = generator.getId(); + double newTargetV = 123.0; + double oldTargetV = generator.getTargetV(); + NetworkEventRecorder listener = new NetworkEventRecorder(); + network.addListener(listener); + // WHEN + generator.setTargetV(newTargetV); + // THEN + assertEquals(3, listener.getEvents().size()); + NetworkEvent firstEvent = listener.getEvents().getFirst(); + assertEquals(NetworkEvent.Type.UPDATE, firstEvent.getType()); + assertEquals("localTargetV", ((UpdateNetworkEvent) firstEvent).attribute()); + assertEquals(newTargetV, ((UpdateNetworkEvent) firstEvent).newValue()); + assertEquals(oldTargetV, ((UpdateNetworkEvent) firstEvent).oldValue()); + assertEquals(id, ((UpdateNetworkEvent) firstEvent).id()); + NetworkEvent secondEvent = listener.getEvents().get(1); + assertEquals(NetworkEvent.Type.UPDATE, secondEvent.getType()); + assertEquals("targetV", ((UpdateNetworkEvent) secondEvent).attribute()); + assertEquals(newTargetV, ((UpdateNetworkEvent) secondEvent).newValue()); + assertEquals(oldTargetV, ((UpdateNetworkEvent) secondEvent).oldValue()); + assertEquals(id, ((UpdateNetworkEvent) secondEvent).id()); + NetworkEvent thirdEvent = listener.getEvents().get(2); + assertEquals(NetworkEvent.Type.UPDATE, thirdEvent.getType()); + assertEquals("equivalentLocalTargetV", ((UpdateNetworkEvent) thirdEvent).attribute()); + assertEquals(newTargetV, ((UpdateNetworkEvent) thirdEvent).newValue()); + assertEquals(oldTargetV, ((UpdateNetworkEvent) thirdEvent).oldValue()); + assertEquals(id, ((UpdateNetworkEvent) thirdEvent).id()); + } + + @Test + void testNotifyUpdateOnSetTargetVAndEquivalentTargetV() { + // GIVEN + Generator generator = voltageLevel.getGeneratorStream().toList().getFirst(); + String id = generator.getId(); + double newTargetV = 123.0; + double newEquivalentTargetV = 12.0; + double oldTargetV = generator.getTargetV(); + generator.setRegulatingTerminal(remoteTerminal); + NetworkEventRecorder listener = new NetworkEventRecorder(); + network.addListener(listener); + // WHEN + generator.setTargetV(newTargetV, newEquivalentTargetV); + // THEN + assertEquals(4, listener.getEvents().size()); + NetworkEvent firstEvent = listener.getEvents().getFirst(); + assertEquals(NetworkEvent.Type.UPDATE, firstEvent.getType()); + assertEquals("localTargetV", ((UpdateNetworkEvent) firstEvent).attribute()); + assertEquals(newEquivalentTargetV, ((UpdateNetworkEvent) firstEvent).newValue()); + assertEquals(oldTargetV, ((UpdateNetworkEvent) firstEvent).oldValue()); + assertEquals(id, ((UpdateNetworkEvent) firstEvent).id()); + NetworkEvent secondEvent = listener.getEvents().get(1); + assertEquals(NetworkEvent.Type.UPDATE, secondEvent.getType()); + assertEquals("VoltageRegulation.TargetValue", ((UpdateNetworkEvent) secondEvent).attribute()); + assertEquals(newTargetV, ((UpdateNetworkEvent) secondEvent).newValue()); + assertEquals(oldTargetV, ((UpdateNetworkEvent) secondEvent).oldValue()); + assertEquals(id, ((UpdateNetworkEvent) secondEvent).id()); + NetworkEvent thirdEvent = listener.getEvents().get(2); + assertEquals(NetworkEvent.Type.UPDATE, thirdEvent.getType()); + assertEquals("targetV", ((UpdateNetworkEvent) thirdEvent).attribute()); + assertEquals(newTargetV, ((UpdateNetworkEvent) thirdEvent).newValue()); + assertEquals(oldTargetV, ((UpdateNetworkEvent) thirdEvent).oldValue()); + assertEquals(id, ((UpdateNetworkEvent) thirdEvent).id()); + NetworkEvent fourthEvent = listener.getEvents().get(3); + assertEquals(NetworkEvent.Type.UPDATE, fourthEvent.getType()); + assertEquals("equivalentLocalTargetV", ((UpdateNetworkEvent) fourthEvent).attribute()); + assertEquals(newEquivalentTargetV, ((UpdateNetworkEvent) fourthEvent).newValue()); + assertEquals(oldTargetV, ((UpdateNetworkEvent) fourthEvent).oldValue()); + assertEquals(id, ((UpdateNetworkEvent) fourthEvent).id()); + } + }