CgmesMeasurementsTest.java
/**
* 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/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.cgmes.measurements;
import com.powsybl.cgmes.conformity.CgmesConformity1ModifiedCatalog;
import com.powsybl.cgmes.conversion.CgmesImport;
import com.powsybl.cgmes.conversion.CgmesModelExtension;
import com.powsybl.commons.PowsyblException;
import com.powsybl.iidm.network.*;
import com.powsybl.iidm.network.extensions.DiscreteMeasurement;
import com.powsybl.iidm.network.extensions.DiscreteMeasurements;
import com.powsybl.iidm.network.extensions.Measurement;
import com.powsybl.iidm.network.extensions.Measurements;
import com.powsybl.triplestore.api.PropertyBag;
import com.powsybl.triplestore.api.PropertyBags;
import org.junit.jupiter.api.Test;
import java.util.Collections;
import java.util.Map;
import java.util.Properties;
import static org.junit.jupiter.api.Assertions.*;
/**
* @author Miora Ralambotiana {@literal <miora.ralambotiana at rte-france.com>}
*/
class CgmesMeasurementsTest {
@Test
void testBusBranch() {
Properties properties = new Properties();
properties.put("iidm.import.cgmes.post-processors", Collections.singletonList("measurements"));
Network network = new CgmesImport().importData(CgmesConformity1ModifiedCatalog.microGridBaseCaseMeasurements().dataSource(),
NetworkFactory.findDefault(), properties);
assertNotNull(network);
assertBusBranchMeasurements(network);
}
private void assertBusBranchMeasurements(Network network) {
Measurements<Line> measExt = network.getLine("b58bf21a-096a-4dae-9a01-3f03b60c24c7").getExtension(Measurements.class);
assertNotNull(measExt);
assertEquals(2, measExt.getMeasurements().size());
Measurement meas1 = measExt.getMeasurement("test_analog_1");
assertNotNull(meas1);
assertEquals(ThreeSides.TWO, meas1.getSide());
assertTrue(Double.isNaN(meas1.getValue()));
assertTrue(Double.isNaN(meas1.getStandardDeviation()));
assertFalse(meas1.isValid());
assertEquals(Measurement.Type.CURRENT, meas1.getType());
assertEquals(1, meas1.getPropertyNames().size());
String property = meas1.getProperty("cgmesType");
assertNotNull(property);
assertEquals("Current", property);
Measurement meas2 = measExt.getMeasurement("test_analog_2");
assertNotNull(meas2);
assertEquals(ThreeSides.TWO, meas2.getSide());
assertTrue(Double.isNaN(meas2.getValue()));
assertTrue(Double.isNaN(meas2.getStandardDeviation()));
assertFalse(meas2.isValid());
assertEquals(Measurement.Type.ACTIVE_POWER, meas2.getType());
assertEquals(1, meas2.getPropertyNames().size());
property = meas2.getProperty("cgmesType");
assertNotNull(property);
assertEquals("ThreePhaseActivePower", property);
assertTrue(measExt.getMeasurements(Measurement.Type.ACTIVE_POWER).contains(meas2));
assertEquals(1, measExt.getMeasurements(Measurement.Type.ACTIVE_POWER).size());
Measurements<Generator> measExt2 = network.getGenerator("3a3b27be-b18b-4385-b557-6735d733baf0").getExtension(Measurements.class);
assertNotNull(measExt2);
assertEquals(5, measExt2.getMeasurements().size());
Measurement meas = measExt2.getMeasurement("test_analog_3");
assertNotNull(meas);
assertEquals(Measurement.Type.REACTIVE_POWER, meas.getType());
assertNull(meas.getSide());
assertTrue(Double.isNaN(meas.getValue()));
assertTrue(Double.isNaN(meas.getStandardDeviation()));
assertFalse(meas.isValid());
assertEquals(1, meas.getPropertyNames().size());
property = meas.getProperty("cgmesType");
assertNotNull(property);
assertEquals("ThreePhaseReactivePower", property);
meas = measExt2.getMeasurement("test_analog_4");
assertNotNull(meas);
assertEquals(Measurement.Type.VOLTAGE, meas.getType());
assertNull(meas.getSide());
assertTrue(Double.isNaN(meas.getValue()));
assertTrue(Double.isNaN(meas.getStandardDeviation()));
assertFalse(meas.isValid());
assertEquals(1, meas.getPropertyNames().size());
property = meas.getProperty("cgmesType");
assertNotNull(property);
assertEquals("PhaseVoltage", property);
meas = measExt2.getMeasurement("test_analog_5");
assertNotNull(meas);
assertEquals(Measurement.Type.ANGLE, meas.getType());
assertNull(meas.getSide());
assertTrue(Double.isNaN(meas.getValue()));
assertTrue(Double.isNaN(meas.getStandardDeviation()));
assertFalse(meas.isValid());
assertEquals(1, meas.getPropertyNames().size());
property = meas.getProperty("cgmesType");
assertNotNull(property);
assertEquals("Angle", property);
meas = measExt2.getMeasurement("test_analog_6");
assertNotNull(meas);
assertEquals(Measurement.Type.OTHER, meas.getType());
assertNull(meas.getSide());
assertTrue(Double.isNaN(meas.getValue()));
assertTrue(Double.isNaN(meas.getStandardDeviation()));
assertFalse(meas.isValid());
assertEquals(1, meas.getPropertyNames().size());
property = meas.getProperty("cgmesType");
assertNotNull(property);
assertEquals("TestType", property);
meas = measExt2.getMeasurement("test_analog_7");
assertNotNull(meas);
assertEquals(Measurement.Type.FREQUENCY, meas.getType());
assertNull(meas.getSide());
assertTrue(Double.isNaN(meas.getValue()));
assertTrue(Double.isNaN(meas.getStandardDeviation()));
assertFalse(meas.isValid());
assertEquals(1, meas.getPropertyNames().size());
property = meas.getProperty("cgmesType");
assertNotNull(property);
assertEquals("Frequency", property);
DiscreteMeasurements<TwoWindingsTransformer> discMeasExt = network.getTwoWindingsTransformer("b94318f6-6d24-4f56-96b9-df2531ad6543").getExtension(DiscreteMeasurements.class);
assertNotNull(discMeasExt);
assertEquals(2, discMeasExt.getDiscreteMeasurements().size());
DiscreteMeasurement discrMeas1 = discMeasExt.getDiscreteMeasurement("test_discrete_1");
assertNotNull(discrMeas1);
assertEquals(DiscreteMeasurement.Type.TAP_POSITION, discrMeas1.getType());
assertEquals(DiscreteMeasurement.TapChanger.RATIO_TAP_CHANGER, discrMeas1.getTapChanger());
assertEquals(DiscreteMeasurement.ValueType.STRING, discrMeas1.getValueType());
assertNull(discrMeas1.getValueAsString());
try {
discrMeas1.getValueAsBoolean();
fail();
} catch (PowsyblException e) {
// Ignore
}
try {
discrMeas1.getValueAsInt();
fail();
} catch (PowsyblException e) {
// Ignore
}
assertFalse(discrMeas1.isValid());
assertEquals(1, discrMeas1.getPropertyNames().size());
property = discrMeas1.getProperty("cgmesType");
assertNotNull(property);
assertEquals("TapPosition", property);
DiscreteMeasurement discrMeas2 = discMeasExt.getDiscreteMeasurement("test_discrete_2");
assertNotNull(discrMeas2);
assertEquals(DiscreteMeasurement.Type.OTHER, discrMeas2.getType());
assertNull(discrMeas2.getTapChanger());
assertEquals(DiscreteMeasurement.ValueType.STRING, discrMeas2.getValueType());
assertNull(discrMeas2.getValueAsString());
assertFalse(discrMeas2.isValid());
assertEquals(1, discrMeas2.getPropertyNames().size());
property = discrMeas2.getProperty("cgmesType");
assertNotNull(property);
assertEquals("TestType", property);
DiscreteMeasurements<TwoWindingsTransformer> discMeasExt2 = network.getTwoWindingsTransformer("a708c3bc-465d-4fe7-b6ef-6fa6408a62b0").getExtension(DiscreteMeasurements.class);
assertNotNull(discMeasExt2);
assertEquals(1, discMeasExt2.getDiscreteMeasurements().size());
DiscreteMeasurement discrMeas3 = discMeasExt2.getDiscreteMeasurement("test_discrete_3");
assertNotNull(discrMeas3);
assertEquals(DiscreteMeasurement.Type.TAP_POSITION, discrMeas3.getType());
assertEquals(DiscreteMeasurement.TapChanger.PHASE_TAP_CHANGER, discrMeas3.getTapChanger());
assertEquals(DiscreteMeasurement.ValueType.STRING, discrMeas3.getValueType());
assertNull(discrMeas3.getValueAsString());
assertFalse(discrMeas3.isValid());
assertEquals(1, discrMeas3.getPropertyNames().size());
property = discrMeas3.getProperty("cgmesType");
assertNotNull(property);
assertEquals("TapPosition", property);
}
@Test
void testNodeBreaker() {
Properties properties = new Properties();
properties.put("iidm.import.cgmes.post-processors", Collections.singletonList("measurements"));
Network network = new CgmesImport().importData(CgmesConformity1ModifiedCatalog.miniNodeBreakerMeasurements().dataSource(),
NetworkFactory.findDefault(), properties);
assertNotNull(network);
VoltageLevel voltageLevel = network.getVoltageLevel("a43d15db-44a6-4fda-a525-2402ff43226f");
assertTrue(voltageLevel.hasProperty("CGMES.Analog_Angle"));
assertEquals("analog", voltageLevel.getProperty("CGMES.Analog_Angle"));
DiscreteMeasurements<VoltageLevel> ext = voltageLevel.getExtension(DiscreteMeasurements.class);
assertNotNull(ext);
assertEquals(1, ext.getDiscreteMeasurements().size());
DiscreteMeasurement meas = ext.getDiscreteMeasurement("discrete");
assertNotNull(meas);
assertEquals(DiscreteMeasurement.Type.OTHER, meas.getType());
assertEquals(DiscreteMeasurement.ValueType.STRING, meas.getValueType());
assertNull(meas.getValueAsString());
assertFalse(meas.isValid());
assertEquals(1, meas.getPropertyNames().size());
String property = meas.getProperty("cgmesType");
assertEquals("TestType", property);
}
@Test
void testDeprecated() {
Properties properties = new Properties();
Network network = new CgmesImport().importData(CgmesConformity1ModifiedCatalog.microGridBaseCaseMeasurements().dataSource(),
NetworkFactory.findDefault(), properties);
assertNotNull(network);
CgmesModelExtension cgmesModelExt = network.getExtensionByName("CgmesModel");
CgmesMeasurementsModel model = new CgmesMeasurementsModel(cgmesModelExt.getCgmesModel().tripleStore());
PropertyBags bays = model.bays();
for (PropertyBag analog : model.analogs()) {
CgmesAnalogPostProcessor.process(network, analog.getId("Analog"), analog.getId("Terminal"),
analog.getId("powerSystemResource"), analog.getId("type"), bays, Map.of());
}
for (PropertyBag discrete : model.discretes()) {
CgmesDiscretePostProcessor.process(network, discrete.getId("Discrete"), discrete.getId("Terminal"),
discrete.getId("powerSystemResource"), discrete.getId("type"), bays, Map.of());
}
assertBusBranchMeasurements(network);
}
}