Skip to content
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright (c) 2025, 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 com.powsybl.openrao.data.crac.api.networkaction;

/**
* @author Roxane Chen {@literal <roxane.chen at rte-france.com>}
*/
public interface AcEmulationDeactivationActionAdder extends SingleNetworkElementActionAdder<AcEmulationDeactivationActionAdder> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,7 @@ public interface NetworkActionAdder extends RemedialActionAdder<NetworkActionAdd

SwitchPairAdder newSwitchPair();

AcEmulationDeactivationActionAdder newAcEmulationDeactivationAction();

NetworkAction add();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Copyright (c) 2025, 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 com.powsybl.openrao.data.crac.impl;

import com.powsybl.action.Action;
import com.powsybl.action.HvdcActionBuilder;
import com.powsybl.openrao.data.crac.api.networkaction.AcEmulationDeactivationActionAdder;

/**
* @author Roxane Chen {@literal <roxane.chen at rte-france.com>}
*/
public class AcEmulationDeactivationActionAdderImpl extends AbstractSingleNetworkElementActionAdderImpl<AcEmulationDeactivationActionAdder> implements AcEmulationDeactivationActionAdder {

AcEmulationDeactivationActionAdderImpl(NetworkActionAdderImpl ownerAdder) {
super(ownerAdder);
}

protected Action buildAction() {
return new HvdcActionBuilder()
.withId(String.format("%s_%s_%s", getActionName(), networkElementId, "DEACTIVATE"))
.withHvdcId(networkElementId)
.withAcEmulationEnabled(false)
.build();
}

protected void assertSpecificAttributes() {
// Nothing to be done here attributes are always non null
}

protected String getActionName() {
return "AcEmulationDeactivationAction";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,7 @@
import com.powsybl.openrao.commons.OpenRaoException;
import com.powsybl.openrao.commons.logs.OpenRaoLoggerProvider;
import com.powsybl.openrao.data.crac.api.NetworkElement;
import com.powsybl.openrao.data.crac.api.networkaction.DanglingLineActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.GeneratorActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.LoadActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.NetworkAction;
import com.powsybl.openrao.data.crac.api.networkaction.NetworkActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.PhaseTapChangerTapPositionActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.ShuntCompensatorPositionActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.SwitchActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.SwitchPairAdder;
import com.powsybl.openrao.data.crac.api.networkaction.TerminalsConnectionActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.*;

import java.util.Collections;
import java.util.HashSet;
Expand Down Expand Up @@ -87,6 +78,10 @@ public SwitchPairAdder newSwitchPair() {
return new SwitchPairAdderImpl(this);
}

@Override
public AcEmulationDeactivationActionAdder newAcEmulationDeactivationAction() {
return new AcEmulationDeactivationActionAdderImpl(this); }

@Override
public NetworkAction add() {
checkId();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* Copyright (c) 2025, 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 com.powsybl.openrao.data.crac.impl;

import com.powsybl.action.HvdcAction;
import com.powsybl.openrao.commons.OpenRaoException;
import com.powsybl.openrao.data.crac.api.Crac;
import com.powsybl.openrao.data.crac.api.networkaction.AcEmulationDeactivationActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.NetworkAction;
import com.powsybl.openrao.data.crac.api.networkaction.NetworkActionAdder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

/**
* @author Roxane Chen {@literal <roxane.chen at rte-france.com>}
*/
public class AcEmulationDeactivationActionAdderImplTest {

Check warning on line 24 in data/crac/crac-impl/src/test/java/com/powsybl/openrao/data/crac/impl/AcEmulationDeactivationActionAdderImplTest.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this 'public' modifier.

See more on https://sonarcloud.io/project/issues?id=com.powsybl%3Aopen-rao&issues=AZpJTYzIZiJawz63H40L&open=AZpJTYzIZiJawz63H40L&pullRequest=1538
private Crac crac;
private NetworkActionAdder networkActionAdder;

@BeforeEach
public void setUp() {

Check warning on line 29 in data/crac/crac-impl/src/test/java/com/powsybl/openrao/data/crac/impl/AcEmulationDeactivationActionAdderImplTest.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this 'public' modifier.

See more on https://sonarcloud.io/project/issues?id=com.powsybl%3Aopen-rao&issues=AZpJTYzIZiJawz63H40K&open=AZpJTYzIZiJawz63H40K&pullRequest=1538
crac = new CracImplFactory().create("cracId");
networkActionAdder = crac.newNetworkAction()
.withId("networkActionId")
.withName("networkActionName")
.withOperator("operator");
}

@Test
void testOk() {
NetworkAction networkAction = networkActionAdder.newAcEmulationDeactivationAction()
.withNetworkElement("hvdcLineElementId")
.add()
.add();

HvdcAction hvdcAction = (HvdcAction) networkAction.getElementaryActions().iterator().next();
assertEquals("hvdcLineElementId", hvdcAction.getHvdcId());
assertFalse(hvdcAction.isAcEmulationEnabled().get());

// check that network element has been added in CracImpl
assertEquals(1, ((CracImpl) crac).getNetworkElements().size());
assertNotNull(((CracImpl) crac).getNetworkElement("hvdcLineElementId"));
}

@Test
void testNoNetworkElement() {
AcEmulationDeactivationActionAdder acEmulationDeactivationActionAdder = networkActionAdder.newAcEmulationDeactivationAction();
assertThrows(OpenRaoException.class, acEmulationDeactivationActionAdder::add);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,23 @@ public static Crac create(CracFactory cracFactory) {
.newOnContingencyStateUsageRule().withContingency(contingency2Id).withInstant(CURATIVE_INSTANT_ID).add()
.add();

// network actions with one ac emulation deactivation action
crac.newNetworkAction().withId("acEmulationDeactivationId")
.withName("acEmulationDeactivationName")
.withOperator("RTE")
.newAcEmulationDeactivationAction().withNetworkElement("hvdc").add()
.newOnFlowConstraintInCountryUsageRule().withInstant(PREVENTIVE_INSTANT_ID).withCountry(Country.FR).add()
.add();

crac.newNetworkAction().withId("acEmulationDeactivationId2")
.withName("acEmulationDeactivationName2")
.withOperator("RTE")
.newAcEmulationDeactivationAction().withNetworkElement("hvdc2").add()
.newOnContingencyStateUsageRule().withContingency("contingency1Id").withInstant(CURATIVE_INSTANT_ID).add()
.newOnContingencyStateUsageRule().withContingency("contingency2Id").withInstant(CURATIVE_INSTANT_ID).add()
.newOnConstraintUsageRule().withInstant(PREVENTIVE_INSTANT_ID).withCnec("cnec3curId").add()
.add();

// range actions
crac.newPstRangeAction().withId("pstRange1Id")
.withName("pstRange1Name")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public final class JsonSerializationConstants {
private JsonSerializationConstants() {
}

public static final String CRAC_IO_VERSION = "2.8";
public static final String CRAC_IO_VERSION = "2.9";
/*
v1.1: addition of switchPairs
v1.2: addition of injectionRangeAction
Expand All @@ -63,6 +63,7 @@ private JsonSerializationConstants() {
v2.6: addition of activation-cost and variation-costs for remedial actions
v2.7: addition of timestamp
v2.8: removal of range actions' initial set-point and FlowCNECs' iMax, optional ranges for PST range actions, deletion of usage methods
v2.9: add acEmulationDeactivationAction
*/

// headers
Expand Down Expand Up @@ -122,6 +123,7 @@ private JsonSerializationConstants() {
public static final String PST_SETPOINTS = "pstSetpoints";
public static final String INJECTION_SETPOINTS = "injectionSetpoints";
public static final String TERMINALS_CONNECTION_ACTIONS = "terminalsConnectionActions";
public static final String AC_EMULATION_DEACTIVATION_ACTIONS = "acEmulationDeactivationActions";
public static final String SWITCH_ACTIONS = "switchActions";
public static final String GENERATOR_ACTIONS = "generatorActions";
public static final String LOAD_ACTIONS = "loadActions";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright (c) 2021, 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 com.powsybl.openrao.data.crac.io.json.deserializers;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.powsybl.openrao.commons.OpenRaoException;
import com.powsybl.openrao.data.crac.api.networkaction.AcEmulationDeactivationActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.NetworkActionAdder;

import java.io.IOException;
import java.util.Map;

import static com.powsybl.openrao.data.crac.io.json.JsonSerializationConstants.*;

/**
* @author Roxane Chen {@literal <roxane.chen at rte-france.com>}
*/
public final class AcEmulationDeactivationActionDeserializer {
private AcEmulationDeactivationActionDeserializer() {
}

public static void deserialize(JsonParser jsonParser, NetworkActionAdder ownerAdder, Map<String, String> networkElementsNamesPerId) throws IOException {
if (networkElementsNamesPerId == null) {
throw new OpenRaoException(String.format("Cannot deserialize %s before %s", AC_EMULATION_DEACTIVATION_ACTIONS, NETWORK_ELEMENTS_NAME_PER_ID));
}
while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
AcEmulationDeactivationActionAdder adder = ownerAdder.newAcEmulationDeactivationAction();
while (!jsonParser.nextToken().isStructEnd()) {
switch (jsonParser.getCurrentName()) {

Check warning on line 35 in data/crac/crac-io/crac-io-json/src/main/java/com/powsybl/openrao/data/crac/io/json/deserializers/AcEmulationDeactivationActionDeserializer.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this use of "getCurrentName"; it is deprecated.

See more on https://sonarcloud.io/project/issues?id=com.powsybl%3Aopen-rao&issues=AZpJTY0lZiJawz63H40N&open=AZpJTY0lZiJawz63H40N&pullRequest=1538

Check warning on line 35 in data/crac/crac-io/crac-io-json/src/main/java/com/powsybl/openrao/data/crac/io/json/deserializers/AcEmulationDeactivationActionDeserializer.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this "switch" statement by "if" statements to increase readability.

See more on https://sonarcloud.io/project/issues?id=com.powsybl%3Aopen-rao&issues=AZpJTY0lZiJawz63H40M&open=AZpJTY0lZiJawz63H40M&pullRequest=1538
case NETWORK_ELEMENT_ID:
deserializeNetworkElement(jsonParser.nextTextValue(), networkElementsNamesPerId, adder);
break;
default:
throw new OpenRaoException("Unexpected field in AcEmulationDeactivationAction: " + jsonParser.getCurrentName());

Check warning on line 40 in data/crac/crac-io/crac-io-json/src/main/java/com/powsybl/openrao/data/crac/io/json/deserializers/AcEmulationDeactivationActionDeserializer.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this use of "getCurrentName"; it is deprecated.

See more on https://sonarcloud.io/project/issues?id=com.powsybl%3Aopen-rao&issues=AZpJTY0lZiJawz63H40O&open=AZpJTY0lZiJawz63H40O&pullRequest=1538
}
}
adder.add();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ public static void deserialize(JsonParser jsonParser, String version, Crac crac,
jsonParser.nextToken();
TerminalsConnectionActionArrayDeserializer.deserialize(jsonParser, networkActionAdder, networkElementsNamesPerId);
break;
case JsonSerializationConstants.AC_EMULATION_DEACTIVATION_ACTIONS:
jsonParser.nextToken();
AcEmulationDeactivationActionDeserializer.deserialize(jsonParser, networkActionAdder, networkElementsNamesPerId);
break;
case JsonSerializationConstants.SWITCH_ACTIONS:
jsonParser.nextToken();
SwitchActionArrayDeserializer.deserialize(jsonParser, networkActionAdder, networkElementsNamesPerId);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* Copyright (c) 2025, 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 com.powsybl.openrao.data.crac.io.json.serializers;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.powsybl.action.HvdcAction;
import com.powsybl.openrao.data.crac.io.json.JsonSerializationConstants;

import java.io.IOException;

/**
* @author Roxane Chen {@literal <roxane.chen at rte-france.com>}
*/
public class AcEmulationDeactivationActionSerializer extends AbstractJsonSerializer<HvdcAction> {
@Override
public void serialize(HvdcAction value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
gen.writeStartObject();
gen.writeStringField(JsonSerializationConstants.NETWORK_ELEMENT_ID, value.getHvdcId());
gen.writeEndObject();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ public CracJsonSerializerModule() {
this.addSerializer(StandardRange.class, new StandardRangeSerializer());
this.addSerializer(NetworkAction.class, new NetworkActionSerializer());
this.addSerializer(TerminalsConnectionAction.class, new TerminalsConnectionActionSerializer());
this.addSerializer(HvdcAction.class, new AcEmulationDeactivationActionSerializer());
this.addSerializer(SwitchAction.class, new SwitchActionSerializer());
this.addSerializer(PhaseTapChangerTapPositionAction.class, new PhaseTapChangerTapPositionActionSerializer());
this.addSerializer(GeneratorAction.class, new GeneratorActionSerializer());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public void serialize(NetworkAction value, JsonGenerator gen, SerializerProvider
serializeElementaryActions(value, DanglingLineAction.class, JsonSerializationConstants.DANGLINGLINE_ACTIONS, gen);
serializeElementaryActions(value, ShuntCompensatorPositionAction.class, JsonSerializationConstants.SHUNTCOMPENSATOR_POSITION_ACTIONS, gen);
serializeElementaryActions(value, SwitchPair.class, JsonSerializationConstants.SWITCH_PAIRS, gen);
serializeElementaryActions(value, HvdcAction.class, JsonSerializationConstants.AC_EMULATION_DEACTIVATION_ACTIONS, gen);
serializeRemedialActionSpeed(value, gen);
gen.writeEndObject();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema#",
"$id": "https://www.powsybl.org?open-rao-crac-schema=ac-emulation-deactivation-action-v2.9.json",
"type": "object",
"properties": {
"networkElementId": {
"type": "string"
}
},
"additionalProperties": false,
"required": [
"networkElementId"
]
}
Loading