diff --git a/CHANGELOG.md b/CHANGELOG.md index 17b4083bb..e872a9bb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed handling of erroneous field values in `EntitySource.enrichWithDefault()` [#1511](https://github.com/ie3-institute/PowerSystemDataModel/issues/1511) - Fixed some minor typos and inconsistencies in variable naming [#1542](https://github.com/ie3-institute/PowerSystemDataModel/issues/1542) - Aligned temperature processing in `COSMO` and `ICON` factories to Kelvin [#1521](https://github.com/ie3-institute/PowerSystemDataModel/issues/1521) +- Correctly persist EmInput entities in CsvFileSink [#1337](https://github.com/ie3-institute/PowerSystemDataModel/issues/1337) ### Changed - Updated CI-Pipeline to run task `Deploy` and `Staging` only for `Main` [#1403](https://github.com/ie3-institute/PowerSystemDataModel/issues/1403) diff --git a/docs/readthedocs/models/input/em.md b/docs/readthedocs/models/input/em.md index 02e168d0d..787170578 100644 --- a/docs/readthedocs/models/input/em.md +++ b/docs/readthedocs/models/input/em.md @@ -35,7 +35,7 @@ Participants are connected to an EM each via their `em` field. * - controlStrategy - - - String representation (e.g. name) of a control strategy + - String representation (e.g. name) of a control strategy. E.g.: PRIORITIZED or PROPORTIONAL * - controllingEm - diff --git a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java index 9588dabe2..14d3f4898 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java @@ -233,6 +233,7 @@ public void persistJointGrid(JointGridContainer jointGridContainer) { rawGridElements.allEntitiesAsList(), systemParticipants.allEntitiesAsList(), graphicElements.allEntitiesAsList(), + jointGridContainer.getEmUnits().getEmUnits().stream().toList(), types, operators) .flatMap(Collection::stream) diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java index 5796454a8..bd2e6fee4 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java @@ -82,6 +82,10 @@ public static JointGridContainer read( Try.of( () -> systemParticipantSource.getSystemParticipants(operators, nodes), SourceException.class); + Try emUnits = + Try.of( + () -> new EnergyManagementUnits(new HashSet<>(emSource.getEmUnits(operators).values())), + SourceException.class); Try graphicElements = Try.of(() -> graphicSource.getGraphicElements(nodes, lines), SourceException.class); @@ -97,6 +101,7 @@ public static JointGridContainer read( gridName, rawGridElements.getOrThrow(), systemParticipants.getOrThrow(), + emUnits.getOrThrow(), graphicElements.getOrThrow()); } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java b/src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java new file mode 100644 index 000000000..1b9a0454a --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java @@ -0,0 +1,103 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.input.container; + +import edu.ie3.datamodel.models.input.EmInput; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** Represents the accumulation of energy management units */ +public class EnergyManagementUnits implements InputContainer { + + private final Map emUnits; + + public EnergyManagementUnits(Set emUnits) { + this.emUnits = + emUnits.stream().collect(Collectors.toMap(EmInput::getUuid, Function.identity())); + } + + /** + * Combine different already existing containers + * + * @param emUnits already existing containers + */ + public EnergyManagementUnits(Collection emUnits) { + this.emUnits = + emUnits.stream() + .flatMap(units -> units.emUnits.entrySet().stream()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + public Set getEmUnits() { + return new HashSet<>(emUnits.values()); + } + + @Override + public List allEntitiesAsList() { + return emUnits.values().stream().toList(); + } + + public Map getEmUnitsMap() { + return emUnits; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof EnergyManagementUnits that)) return false; + return Objects.equals(emUnits, that.emUnits); + } + + @Override + public int hashCode() { + return Objects.hash(emUnits); + } + + @Override + public EnergyManagementUnitsCopyBuilder copy() { + return new EnergyManagementUnitsCopyBuilder(this); + } + + /** + * A builder pattern based approach to create copies of {@link EnergyManagementUnits} containers + * with altered field values. For detailed field descriptions refer to Javadocs of {@link + * EnergyManagementUnits} + */ + public static class EnergyManagementUnitsCopyBuilder extends InputContainerCopyBuilder { + protected Set emUnits; + + /** + * Constructor for {@link EnergyManagementUnits.EnergyManagementUnitsCopyBuilder} + * + * @param energyManagementUnits instance of {@link EnergyManagementUnits} + */ + protected EnergyManagementUnitsCopyBuilder(EnergyManagementUnits energyManagementUnits) { + this.emUnits = energyManagementUnits.getEmUnits(); + } + + /** + * Method to alter the {@link EmInput}s + * + * @param emUnits set of altered {@link EmInput}s + * @return this instance of {@link EnergyManagementUnits.EnergyManagementUnitsCopyBuilder} + */ + public EnergyManagementUnits.EnergyManagementUnitsCopyBuilder emUnits(Set emUnits) { + this.emUnits = emUnits; + return this; + } + + @Override + public EnergyManagementUnits build() { + return new EnergyManagementUnits(emUnits); + } + + @Override + public InputContainerCopyBuilder thisInstance() { + return this; + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java b/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java index 46f50ae97..94670cce4 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java +++ b/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java @@ -18,6 +18,9 @@ public abstract class GridContainer implements InputContainer /** Accumulated system participant elements */ protected final SystemParticipants systemParticipants; + /** Accumulated energy management units */ + protected final EnergyManagementUnits emUnits; + /** Accumulated graphic data entities (node graphics, line graphics) */ protected final GraphicElements graphics; @@ -25,11 +28,13 @@ protected GridContainer( String gridName, RawGridElements rawGrid, SystemParticipants systemParticipants, + EnergyManagementUnits emUnits, GraphicElements graphics) { this.gridName = gridName; this.rawGrid = rawGrid; this.systemParticipants = systemParticipants; + this.emUnits = emUnits; this.graphics = graphics; } @@ -38,6 +43,7 @@ public List allEntitiesAsList() { List allEntities = new LinkedList<>(); allEntities.addAll(rawGrid.allEntitiesAsList()); allEntities.addAll(systemParticipants.allEntitiesAsList()); + allEntities.addAll(emUnits.allEntitiesAsList()); allEntities.addAll(graphics.allEntitiesAsList()); return Collections.unmodifiableList(allEntities); } @@ -58,6 +64,10 @@ public SystemParticipants getSystemParticipants() { return systemParticipants; } + public EnergyManagementUnits getEmUnits() { + return emUnits; + } + public GraphicElements getGraphics() { return graphics; } @@ -69,12 +79,13 @@ public boolean equals(Object o) { return gridName.equals(that.gridName) && rawGrid.equals(that.rawGrid) && systemParticipants.equals(that.systemParticipants) + && emUnits.equals(that.emUnits) && graphics.equals(that.graphics); } @Override public int hashCode() { - return Objects.hash(gridName, rawGrid, systemParticipants, graphics); + return Objects.hash(gridName, rawGrid, systemParticipants, emUnits, graphics); } @Override @@ -94,6 +105,7 @@ protected abstract static class GridContainerCopyBuilder update3wTransformers( * new nodes mapping affects at least one transformer. This is necessary because by policy, the * geoPosition of a transformer is determined by its nodeA. If multiple transformers are now * chained together e.g. nodeA - trafoAtoD - nodeD - trafoDtoG - nodeG than all transformer nodes - * needs to be updated if at least one of the provided nodes is affected. Otherwise inconsistency + * needs to be updated if at least one of the provided nodes is affected. Otherwise, inconsistency * would occur because transformers would end up with multiple geoPositions which is physically * not possible. * diff --git a/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java b/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java index 82f54cda2..a3d1d8000 100644 --- a/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java @@ -473,6 +473,7 @@ public static SubGridTopologyGraph buildSubGridTopologyGraph( String gridName, RawGridElements rawGrid, SystemParticipants systemParticipants, + EnergyManagementUnits energyManagementUnits, GraphicElements graphics) throws InvalidGridException { /* Collect the different sub nets. Through the validation of lines, it is ensured, that no galvanically connected @@ -480,11 +481,12 @@ public static SubGridTopologyGraph buildSubGridTopologyGraph( SortedSet subnetNumbers = determineSubnetNumbers(rawGrid.getNodes()); /* Build the single sub grid models */ - HashMap subgrids = - buildSubGridContainers(gridName, subnetNumbers, rawGrid, systemParticipants, graphics); + HashMap subGrids = + buildSubGridContainers( + gridName, subnetNumbers, rawGrid, systemParticipants, energyManagementUnits, graphics); /* Build the graph structure denoting the topology of the grid */ - return buildSubGridTopologyGraph(subgrids, rawGrid); + return buildSubGridTopologyGraph(subGrids, rawGrid); } /** @@ -512,6 +514,7 @@ private static HashMap buildSubGridContainers( SortedSet subnetNumbers, RawGridElements rawGrid, SystemParticipants systemParticipants, + EnergyManagementUnits energyManagementUnits, GraphicElements graphics) throws InvalidGridException { HashMap subGrids = new HashMap<>(subnetNumbers.size()); @@ -524,7 +527,12 @@ private static HashMap buildSubGridContainers( subGrids.put( subnetNumber, new SubGridContainer( - gridName, subnetNumber, rawGridElements, systemParticipantElements, graphicElements)); + gridName, + subnetNumber, + rawGridElements, + systemParticipantElements, + energyManagementUnits, + graphicElements)); } return subGrids; } @@ -695,6 +703,9 @@ public static JointGridContainer combineToJointGrid( GraphicElements graphicElements = new GraphicElements( subGridContainers.stream().map(GridContainer::getGraphics).collect(Collectors.toSet())); + EnergyManagementUnits energyManagementUnits = + new EnergyManagementUnits( + subGridContainers.stream().map(GridContainer::getEmUnits).collect(Collectors.toSet())); Map subGridMapping = subGridContainers.stream() @@ -703,7 +714,12 @@ public static JointGridContainer combineToJointGrid( SubGridTopologyGraph subGridTopologyGraph = buildSubGridTopologyGraph(subGridMapping, rawGrid); return new JointGridContainer( - gridName, rawGrid, systemParticipants, graphicElements, subGridTopologyGraph); + gridName, + rawGrid, + systemParticipants, + energyManagementUnits, + graphicElements, + subGridTopologyGraph); } /** @@ -876,6 +892,7 @@ public static SubGridContainer withTrafoNodeAsSlack(final SubGridContainer subGr subGridContainer.getRawGrid().getSwitches(), subGridContainer.getRawGrid().getMeasurementUnits()), subGridContainer.getSystemParticipants(), + subGridContainer.getEmUnits(), new GraphicElements(newNodeGraphics, subGridContainer.getGraphics().getLineGraphics())); } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index cb18b3901..bcb880658 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -34,24 +34,14 @@ import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalBusInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput -import edu.ie3.datamodel.models.result.system.EmResult -import edu.ie3.datamodel.models.result.system.EnergyBoundariesFlexOptionsResult -import edu.ie3.datamodel.models.result.system.EvResult -import edu.ie3.datamodel.models.result.system.EvcsResult -import edu.ie3.datamodel.models.result.system.PowerLimitFlexOptionsResult -import edu.ie3.datamodel.models.result.system.PvResult -import edu.ie3.datamodel.models.result.system.WecResult +import edu.ie3.datamodel.models.result.system.* import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.datamodel.models.value.Value -import edu.ie3.test.common.GridTestData -import edu.ie3.test.common.SampleJointGrid -import edu.ie3.test.common.SystemParticipantTestData -import edu.ie3.test.common.ThermalUnitInputTestData -import edu.ie3.test.common.TimeSeriesTestData +import edu.ie3.test.common.* import edu.ie3.util.TimeUtil import edu.ie3.util.io.FileIOUtils import spock.lang.Shared @@ -363,6 +353,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { testBaseFolderPath.resolve("storage_type_input.csv").toFile().exists() testBaseFolderPath.resolve("transformer_2_w_input.csv").toFile().exists() testBaseFolderPath.resolve("transformer_2_w_type_input.csv").toFile().exists() + testBaseFolderPath.resolve("em_input.csv").toFile().exists() cleanup: csvFileSink.shutdown() diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy index 4b8ebf9c3..2c33c5797 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy @@ -11,7 +11,6 @@ import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.sink.CsvFileSink import edu.ie3.util.io.FileIOUtils -import spock.lang.Shared import spock.lang.Specification import java.nio.file.Files @@ -23,16 +22,11 @@ import java.nio.file.Path */ class GridIoIT extends Specification implements CsvTestDataMeta { - @Shared Path tempDirectory - - @Shared CsvFileSink sinkFlat - - @Shared CsvFileSink sinkHierarchic - def setupSpec() { + def setup() { FileNamingStrategy hierarchicNamingStrategy = new FileNamingStrategy( new EntityPersistenceNamingStrategy(), new DefaultDirectoryHierarchy(Path.of("output"), "vn_simona")) @@ -41,7 +35,7 @@ class GridIoIT extends Specification implements CsvTestDataMeta { sinkHierarchic = new CsvFileSink(tempDirectory.toAbsolutePath(), hierarchicNamingStrategy, ",") } - def cleanupSpec() { + def cleanup() { sinkFlat.shutdown() sinkHierarchic.shutdown() FileIOUtils.deleteRecursively(tempDirectory) diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy index 5b8147f20..21bc87957 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy @@ -5,8 +5,10 @@ */ package edu.ie3.datamodel.models.input.container +import static edu.ie3.test.common.EnergyManagementTestData.emptyEnergyManagementUnits import static edu.ie3.test.common.SystemParticipantTestData.emptySystemParticipants +import edu.ie3.test.common.EnergyManagementTestData import edu.ie3.test.common.GridTestData import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification @@ -29,7 +31,7 @@ class JointGridContainerTest extends Specification { def "A single subgrid can be used to build a JointGridContainer"() { when: - def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, GRAPHIC_ELEMENTS) + def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, emptyEnergyManagementUnits, GRAPHIC_ELEMENTS) then: noExceptionThrown() @@ -38,9 +40,10 @@ class JointGridContainerTest extends Specification { def "A JointGridContainer's copy method should work as expected"() { given: - def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, GRAPHIC_ELEMENTS) + def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, emptyEnergyManagementUnits, GRAPHIC_ELEMENTS) def rawGrid = new RawGridElements(List.of(GridTestData.lineAtoB, GridTestData.transformerAtoBtoC)) def systemParticipants = new SystemParticipants(List.of(SystemParticipantTestData.bmInput)) + def emUnits = new EnergyManagementUnits(Set.of(EnergyManagementTestData.emInput)) def graphics = new GraphicElements(Set.of(GridTestData.nodeGraphicD), Set.of(GridTestData.lineGraphicCtoD)) when: @@ -48,6 +51,7 @@ class JointGridContainerTest extends Specification { .gridName("new grid name") .rawGrid(rawGrid) .systemParticipants(systemParticipants) + .emUnits(emUnits) .graphics(graphics) .build() @@ -55,6 +59,7 @@ class JointGridContainerTest extends Specification { modifiedJointGridContainer.gridName == "new grid name" modifiedJointGridContainer.rawGrid == rawGrid modifiedJointGridContainer.systemParticipants == systemParticipants + modifiedJointGridContainer.emUnits == emUnits modifiedJointGridContainer.graphics == graphics } } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy index 7ab698d6a..8a81036cf 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy @@ -294,6 +294,7 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticipants = ComplexTopology.grid.systemParticipants + EnergyManagementUnits energyManagementUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics HashMap expectedSubGrids = ComplexTopology.expectedSubGrids @@ -304,6 +305,7 @@ class ContainerUtilsTest extends Specification { subNetNumbers, rawGrid, systemParticipants, + energyManagementUnits, graphics) then: @@ -323,6 +325,7 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGridInput= ComplexTopology.grid.rawGrid SystemParticipants systemParticipantsInput = ComplexTopology.grid.systemParticipants + EnergyManagementUnits energyManagementUnits = ComplexTopology.grid.emUnits GraphicElements graphicsInput = ComplexTopology.grid.graphics HashMap unmodifiedSubGrids = ComplexTopology.expectedSubGrids @@ -332,6 +335,7 @@ class ContainerUtilsTest extends Specification { subNetNumbers, rawGridInput, systemParticipantsInput, + energyManagementUnits, graphicsInput) when: @@ -386,12 +390,14 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticipants = ComplexTopology.grid.systemParticipants + EnergyManagementUnits energyManagementUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics Map subgrids = ContainerUtils.buildSubGridContainers( gridName, subNetNumbers, rawGrid, systemParticipants, + energyManagementUnits, graphics) SubGridTopologyGraph expectedSubGridTopology = ComplexTopology.expectedSubGridTopology @@ -409,6 +415,7 @@ class ContainerUtilsTest extends Specification { String gridName = ComplexTopology.gridName RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticpants = ComplexTopology.grid.systemParticipants + EnergyManagementUnits energyManagementUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics SubGridTopologyGraph expectedSubGridTopology = ComplexTopology.expectedSubGridTopology @@ -417,6 +424,7 @@ class ContainerUtilsTest extends Specification { gridName, rawGrid, systemParticpants, + energyManagementUnits, graphics) then: diff --git a/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy b/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy index 1c56b3838..172675589 100644 --- a/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy +++ b/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy @@ -5,6 +5,7 @@ */ package edu.ie3.test.common +import static edu.ie3.test.common.EnergyManagementTestData.emptyEnergyManagementUnits import static edu.ie3.test.common.SystemParticipantTestData.emptySystemParticipants import edu.ie3.datamodel.graph.SubGridGate @@ -45,6 +46,7 @@ class ComplexTopology extends GridTestData { gridName, rawGrid, emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set)) @@ -65,6 +67,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -81,6 +84,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -97,6 +101,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -113,6 +118,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -132,6 +138,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -151,6 +158,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) diff --git a/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy b/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy new file mode 100644 index 000000000..832387557 --- /dev/null +++ b/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy @@ -0,0 +1,25 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.test.common + +import edu.ie3.datamodel.models.input.EmInput +import edu.ie3.datamodel.models.input.container.EnergyManagementUnits + +class EnergyManagementTestData { + public static final String emControlStrategy = "PRIORITIZED" + + public static final emInput = new EmInput( + UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), + "test_emInput", + SystemParticipantTestData.operator, + SystemParticipantTestData.operationTime, + emControlStrategy, + null , + ) + + public static EnergyManagementUnits emptyEnergyManagementUnits = + new EnergyManagementUnits([] as List) +} diff --git a/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy b/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy index f4f155534..6b9beaee5 100644 --- a/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy +++ b/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy @@ -15,6 +15,7 @@ import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput import edu.ie3.datamodel.models.input.connector.type.LineTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput +import edu.ie3.datamodel.models.input.container.EnergyManagementUnits import edu.ie3.datamodel.models.input.container.GraphicElements import edu.ie3.datamodel.models.input.container.JointGridContainer import edu.ie3.datamodel.models.input.container.RawGridElements @@ -47,6 +48,7 @@ class SampleJointGrid extends SystemParticipantTestData { "sampleGrid", rawGridElements, systemParticipants(rawGridElements), + new EnergyManagementUnits(Collections.singleton(emInput)), new GraphicElements(Collections.emptySet())) } diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/em_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/em_input.csv new file mode 100644 index 000000000..4c960d870 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/em_input.csv @@ -0,0 +1,6 @@ +uuid,id,operator,operates_from,operates_until,controlStrategy,controllingEm +4e2f47a6-40f4-4952-9b2f-7b7d2558a143,em_system_1,,,,"SelfConsumptionOptimized", +a3e8e4a3-7b1b-4b1e-9e7b-8d6e3f5a2b1d,em_system_2,,,,GridSupportive,4e2f47a6-40f4-4952-9b2f-7b7d2558a143 +b8d9c5b2-6c2c-4c2d-8f8c-9e7f4a6b3c2e,em_system_3,,,,PriceReactive,4e2f47a6-40f4-4952-9b2f-7b7d2558a143 +c7f0d6c1-5d3d-4d3e-7a9d-1f8a5b7c4d3f,em__system_4,,,,StoragePriority,4e2f47a6-40f4-4952-9b2f-7b7d2558a143 +d6a1e7d0-4e4e-4e4f-6b0e-2a9b6c8d5e4a,em_system_5,,,,FeedInLimitation,4e2f47a6-40f4-4952-9b2f-7b7d2558a143 \ No newline at end of file