diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cf7c5a8c..d074434ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Changing from comparing strings to comparing uuids in `EntitySource.findFirstEntityByUuid` [#829](https://github.com/ie3-institute/PowerSystemDataModel/issues/829) - Adding JavaDoc to `EntitySource.safeMapGet` [#828](https://github.com/ie3-institute/PowerSystemDataModel/issues/828) - Abstracting some methods in `ValidationUtils` [#852](https://github.com/ie3-institute/PowerSystemDataModel/issues/852) -- `EmInput` should not be connected to the grid [#955](https://github.com/ie3-institute/PowerSystemDataModel/issues/955) +- Changes to Energy Management inputs: + - `EmInput` should not be connected to the grid [#955](https://github.com/ie3-institute/PowerSystemDataModel/issues/955) + - System participants now reference the em entity [#957](https://github.com/ie3-institute/PowerSystemDataModel/issues/957) - Enhancing the error message for coordinate sources with invalid column names [#670](https://github.com/ie3-institute/PowerSystemDataModel/issues/670) - Allowing for additional unused columns in sources [#839](https://github.com/ie3-institute/PowerSystemDataModel/issues/839) - Improving column name validation to only run once per source [#849](https://github.com/ie3-institute/PowerSystemDataModel/issues/849) diff --git a/docs/readthedocs/models/input/participant/bm.md b/docs/readthedocs/models/input/participant/bm.md index f318da626..ff1854e10 100644 --- a/docs/readthedocs/models/input/participant/bm.md +++ b/docs/readthedocs/models/input/participant/bm.md @@ -107,6 +107,12 @@ Model of a biomass power plant. - € / MWh - Fixed feed in tariff + * - em + - -- + - | UUID reference to an :ref:`Energy Management Unit` that is controlling + | this system participant. Field can be empty or missing, if this participant + | is not controlled. + ``` ## Caveats diff --git a/docs/readthedocs/models/input/participant/chp.md b/docs/readthedocs/models/input/participant/chp.md index 800774041..ad4ff729e 100644 --- a/docs/readthedocs/models/input/participant/chp.md +++ b/docs/readthedocs/models/input/participant/chp.md @@ -114,6 +114,12 @@ Combined heat and power plant. - | Whether to adapt output based on (volatile) | market price or not + * - em + - -- + - | UUID reference to an :ref:`Energy Management Unit` that is controlling + | this system participant. Field can be empty or missing, if this participant + | is not controlled. + ``` ## Caveats diff --git a/docs/readthedocs/models/input/participant/em.md b/docs/readthedocs/models/input/participant/em.md new file mode 100644 index 000000000..3e842e612 --- /dev/null +++ b/docs/readthedocs/models/input/participant/em.md @@ -0,0 +1,50 @@ +(em_model)= + +# Energy Management Unit + +A model of an Energy Management Unit that controls the power of connected system participants. +Participants are connected to an EM each via their `em` field. + +## Attributes, Units and Remarks + +```{eval-rst} +.. list-table:: + :widths: 33 33 33 + :header-rows: 0 + + + * - Attribute + - Unit + - Remarks + + * - uuid + - -- + - + + * - id + - -- + - Human readable identifier + + * - operator + - -- + - + + * - operationTime + - -- + - Timely restriction of operation + + * - controlStrategy + - -- + - String representation (e.g. name) of a control strategy + + * - parentEm + - -- + - | Reference to a superior Energy Management Unit that is controlling this EM. + | Field can be empty or missing, if this EM itself is not controlled. + +``` + +## Caveats + +Nothing - at least not known. +If you found something, please contact us! diff --git a/docs/readthedocs/models/input/participant/ev.md b/docs/readthedocs/models/input/participant/ev.md index f837ca60d..036a92312 100644 --- a/docs/readthedocs/models/input/participant/ev.md +++ b/docs/readthedocs/models/input/participant/ev.md @@ -93,6 +93,12 @@ Model of an electric vehicle, that is occasionally connected to the grid via an - -- - + * - em + - -- + - | UUID reference to an :ref:`Energy Management Unit` that is controlling + | this system participant. Field can be empty or missing, if this participant + | is not controlled. + ``` ## Caveats diff --git a/docs/readthedocs/models/input/participant/evcs.md b/docs/readthedocs/models/input/participant/evcs.md index 2a85644be..b97def9c3 100644 --- a/docs/readthedocs/models/input/participant/evcs.md +++ b/docs/readthedocs/models/input/participant/evcs.md @@ -59,6 +59,12 @@ station and has some limitations outlined below. - -- - :ref:`Charging station location types` + * - em + - -- + - | UUID reference to an :ref:`Energy Management Unit` that is controlling + | this system participant. Field can be empty or missing, if this participant + | is not controlled. + ``` ### Type Model diff --git a/docs/readthedocs/models/input/participant/fixedfeedin.md b/docs/readthedocs/models/input/participant/fixedfeedin.md index 3d31657ad..2098271de 100644 --- a/docs/readthedocs/models/input/participant/fixedfeedin.md +++ b/docs/readthedocs/models/input/participant/fixedfeedin.md @@ -49,6 +49,12 @@ model can be derived. - -- - Rated power factor + * - em + - -- + - | UUID reference to an :ref:`Energy Management Unit` that is controlling + | this system participant. Field can be empty or missing, if this participant + | is not controlled. + ``` ## Caveats diff --git a/docs/readthedocs/models/input/participant/hp.md b/docs/readthedocs/models/input/participant/hp.md index e4768e46c..71c8a1608 100644 --- a/docs/readthedocs/models/input/participant/hp.md +++ b/docs/readthedocs/models/input/participant/hp.md @@ -93,6 +93,12 @@ Model of a heat pump. - -- - + * - em + - -- + - | UUID reference to an :ref:`Energy Management Unit` that is controlling + | this system participant. Field can be empty or missing, if this participant + | is not controlled. + ``` diff --git a/docs/readthedocs/models/input/participant/load.md b/docs/readthedocs/models/input/participant/load.md index 70b56fff6..9c799c94e 100644 --- a/docs/readthedocs/models/input/participant/load.md +++ b/docs/readthedocs/models/input/participant/load.md @@ -60,6 +60,12 @@ Model of (mainly) domestic loads. - -- - Rated power factor + * - em + - -- + - | UUID reference to an :ref:`Energy Management Unit` that is controlling + | this system participant. Field can be empty or missing, if this participant + | is not controlled. + ``` ## Caveats diff --git a/docs/readthedocs/models/input/participant/pv.md b/docs/readthedocs/models/input/participant/pv.md index f9d4592b4..0746f0023 100644 --- a/docs/readthedocs/models/input/participant/pv.md +++ b/docs/readthedocs/models/input/participant/pv.md @@ -76,6 +76,12 @@ Detailed model of a photovoltaic power plant. - -- - Rated power factor + * - em + - -- + - | UUID reference to an :ref:`Energy Management Unit` that is controlling + | this system participant. Field can be empty or missing, if this participant + | is not controlled. + ``` ## Caveats diff --git a/docs/readthedocs/models/input/participant/storage.md b/docs/readthedocs/models/input/participant/storage.md index 09f7727bb..dc4d4857d 100644 --- a/docs/readthedocs/models/input/participant/storage.md +++ b/docs/readthedocs/models/input/participant/storage.md @@ -73,6 +73,12 @@ Model of an ideal electrical battery energy storage. - -- - Permissible amount of full cycles + * - em + - -- + - | UUID reference to an :ref:`Energy Management Unit` that is controlling + | this system participant. Field can be empty or missing, if this participant + | is not controlled. + ``` ### Entity Model diff --git a/docs/readthedocs/models/input/participant/wec.md b/docs/readthedocs/models/input/participant/wec.md index 7e01f043d..862cbbdcd 100644 --- a/docs/readthedocs/models/input/participant/wec.md +++ b/docs/readthedocs/models/input/participant/wec.md @@ -106,6 +106,12 @@ Model of a wind energy converter. - | Whether to adapt output based on (volatile) | market price or not + * - em + - -- + - | UUID reference to an :ref:`Energy Management Unit` that is controlling + | this system participant. Field can be empty or missing, if this participant + | is not controlled. + ``` ## Caveats diff --git a/docs/readthedocs/models/models.md b/docs/readthedocs/models/models.md index c0e70ab78..b6043f8e1 100644 --- a/docs/readthedocs/models/models.md +++ b/docs/readthedocs/models/models.md @@ -135,6 +135,7 @@ input/participant/wec input/participant/thermalbus input/participant/thermalhouse input/participant/cylindricalstorage +input/participant/em ``` ### Additional Data diff --git a/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java b/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java index f88d24423..6ed7dcb7e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java @@ -135,29 +135,6 @@ field, getField(field)), } } - /** - * Parses and returns an array of UUIDs from field value of given field name. Throws {@link - * FactoryException} if field does not exist or parsing fails. - * - * @param field field name - * @return UUID - */ - public UUID[] getUUIDs(String field) { - try { - String fieldValue = getField(field); - if (fieldValue.trim().isEmpty()) return new UUID[0]; - - String[] uuidFields = fieldValue.split(" "); - return Arrays.stream(uuidFields).map(UUID::fromString).toArray(UUID[]::new); - } catch (IllegalArgumentException iae) { - throw new FactoryException( - String.format( - "Exception while trying to parse UUIDs of field \"%s\" with value \"%s\"", - field, getField(field)), - iae); - } - } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java new file mode 100644 index 000000000..d001c405e --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java @@ -0,0 +1,70 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.input; + +import edu.ie3.datamodel.models.UniqueEntity; +import edu.ie3.datamodel.models.input.EmInput; +import edu.ie3.datamodel.models.input.OperatorInput; +import java.util.Map; +import java.util.Objects; + +/** + * Data used for the construction of {@link edu.ie3.datamodel.models.input.AssetInput} entities + * which also require an EM attribute. This data object can include additional information about the + * {@link EmInput}, which cannot be provided through the attribute map as it is a complex shared + * entity. + */ +public class EmAssetInputEntityData extends AssetInputEntityData { + + private final EmInput emUnit; + + public EmAssetInputEntityData( + Map fieldsToAttributes, + Class entityClass, + EmInput emUnit) { + super(fieldsToAttributes, entityClass); + this.emUnit = emUnit; + } + + public EmAssetInputEntityData( + Map fieldsToAttributes, + Class entityClass, + OperatorInput operator, + EmInput emUnit) { + super(fieldsToAttributes, entityClass, operator); + this.emUnit = emUnit; + } + + /** + * Creates a new EmAssetInputEntityData object based on a given {@link AssetInputEntityData} + * object and given em unit + * + * @param entityData The entity data object to use attributes of + * @param emUnit The em input to use + */ + public EmAssetInputEntityData(AssetInputEntityData entityData, EmInput emUnit) { + super(entityData, entityData.getOperatorInput()); + this.emUnit = emUnit; + } + + public EmInput getEmUnit() { + return emUnit; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + EmAssetInputEntityData that = (EmAssetInputEntityData) o; + return Objects.equals(emUnit, that.emUnit); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), emUnit); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java index 656e66361..8a1c58b9e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.BmInput; @@ -41,6 +42,7 @@ protected BmInput buildModel( ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); final BmTypeInput typeInput = data.getTypeInput(); final boolean marketReaction = data.getBoolean(MARKET_REACTION); final boolean costControlled = data.getBoolean(COST_CONTROLLED); @@ -54,6 +56,7 @@ protected BmInput buildModel( operationTime, node, qCharacteristics, + em, typeInput, marketReaction, costControlled, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java index 95b46c44c..81c11572a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.factory.input.participant; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.ChpInput; @@ -21,10 +22,11 @@ public class ChpInputEntityData extends SystemParticipantTypedEntityData fieldsToAttributes, NodeInput node, + EmInput em, ChpTypeInput typeInput, ThermalBusInput thermalBusInput, ThermalStorageInput thermalStorageInput) { - super(fieldsToAttributes, ChpInput.class, node, typeInput); + super(fieldsToAttributes, ChpInput.class, node, em, typeInput); this.thermalBusInput = thermalBusInput; this.thermalStorageInput = thermalStorageInput; } @@ -33,10 +35,11 @@ public ChpInputEntityData( Map fieldsToAttributes, OperatorInput operator, NodeInput node, + EmInput em, ChpTypeInput typeInput, ThermalBusInput thermalBusInput, ThermalStorageInput thermalStorageInput) { - super(fieldsToAttributes, ChpInput.class, operator, node, typeInput); + super(fieldsToAttributes, ChpInput.class, operator, node, em, typeInput); this.thermalBusInput = thermalBusInput; this.thermalStorageInput = thermalStorageInput; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java index fd6411508..d398f5a59 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.ChpInput; @@ -34,6 +35,7 @@ protected ChpInput buildModel( ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); final boolean marketReaction = data.getBoolean(MARKET_REACTION); return new ChpInput( @@ -44,6 +46,7 @@ protected ChpInput buildModel( node, data.getThermalBusInput(), qCharacteristics, + em, data.getTypeInput(), data.getThermalStorageInput(), marketReaction); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java index 457ff5d42..3c4590d6e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java @@ -5,55 +5,54 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.factory.input.AssetInputEntityData; import edu.ie3.datamodel.io.factory.input.AssetInputEntityFactory; -import edu.ie3.datamodel.models.ControlStrategy; +import edu.ie3.datamodel.io.factory.input.EmAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; import java.util.UUID; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -public class EmInputFactory extends AssetInputEntityFactory { - private static final Logger logger = LoggerFactory.getLogger(EmInputFactory.class); - - private static final String CONNECTED_ASSETS = "connectedAssets"; +public class EmInputFactory extends AssetInputEntityFactory { private static final String CONTROL_STRATEGY = "controlStrategy"; + public static final String PARENT_EM = "parentem"; + public EmInputFactory() { super(EmInput.class); } + @Override + protected List> getFields(Class entityClass) { + List> fields = new ArrayList<>(super.getFields(entityClass)); + + List> withEm = + fields.stream().map(f -> (Set) expandSet(f, PARENT_EM)).toList(); + + fields.addAll(withEm); + + return fields; + } + @Override protected String[] getAdditionalFields() { - return new String[] {CONNECTED_ASSETS, CONTROL_STRATEGY}; + return new String[] {CONTROL_STRATEGY}; } @Override protected EmInput buildModel( - AssetInputEntityData data, + EmAssetInputEntityData data, UUID uuid, String id, OperatorInput operator, OperationTime operationTime) { - ControlStrategy controlStrategy; - try { - controlStrategy = ControlStrategy.parse(data.getField(CONTROL_STRATEGY)); - } catch (ParsingException e) { - logger.warn( - "Cannot parse control strategy \"{}\" of energy management system \"{}\". Assign no control strategy instead.", - data.getField(CONTROL_STRATEGY), - id); - controlStrategy = ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY; - } - final UUID[] connectedAssets = data.getUUIDs(CONNECTED_ASSETS); - - if (connectedAssets.length == 0) - logger.warn("There are no connected assets for energy management system \"{}\".", id); - - return new EmInput(uuid, id, operator, operationTime, connectedAssets, controlStrategy); + String controlStrategy = data.getField(CONTROL_STRATEGY); + + EmInput parentEm = data.getEmUnit(); + + return new EmInput(uuid, id, operator, operationTime, controlStrategy, parentEm); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java index 1f0f8e80c..b2d492ce5 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.EvInput; @@ -35,7 +36,9 @@ protected EvInput buildModel( ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); + return new EvInput( - uuid, id, operator, operationTime, node, qCharacteristics, data.getTypeInput()); + uuid, id, operator, operationTime, node, qCharacteristics, em, data.getTypeInput()); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java index 3a4a76988..a0bc9e9c0 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java @@ -8,8 +8,8 @@ import edu.ie3.datamodel.exceptions.ChargingPointTypeException; import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.EvcsInput; @@ -21,14 +21,14 @@ import java.util.UUID; /** - * Factory to create instances of {@link EvcsInput}s based on {@link NodeAssetInputEntityData} and - * additional fields. + * Factory to create instances of {@link EvcsInput}s based on {@link SystemParticipantEntityData} + * and additional fields. * * @version 0.1 * @since 26.07.20 */ public class EvcsInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final String TYPE = "type"; private static final String CHARGING_POINTS = "chargingPoints"; @@ -47,14 +47,14 @@ protected String[] getAdditionalFields() { @Override protected EvcsInput buildModel( - NodeAssetInputEntityData data, + SystemParticipantEntityData data, UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { - + final EmInput em = data.getEm().orElse(null); final ChargingPointType type; try { type = ChargingPointTypeUtils.parse(data.getField(TYPE)); @@ -88,6 +88,7 @@ protected EvcsInput buildModel( operationTime, node, qCharacteristics, + em, type, chargingPoints, cosPhi, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java index 25adc14f0..f0b6e28a9 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java @@ -5,9 +5,9 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.FixedFeedInInput; @@ -17,7 +17,7 @@ import tech.units.indriya.ComparableQuantity; public class FixedFeedInInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final String S_RATED = "sRated"; private static final String COSPHI_RATED = "cosPhiRated"; @@ -33,17 +33,18 @@ protected String[] getAdditionalFields() { @Override protected FixedFeedInInput buildModel( - NodeAssetInputEntityData data, + SystemParticipantEntityData data, UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); final ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); final double cosPhiRated = data.getDouble(COSPHI_RATED); return new FixedFeedInInput( - uuid, id, operator, operationTime, node, qCharacteristics, sRated, cosPhiRated); + uuid, id, operator, operationTime, node, qCharacteristics, em, sRated, cosPhiRated); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java index f4ea57dfb..83f01970f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.factory.input.participant; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.HpInput; @@ -19,9 +20,10 @@ public class HpInputEntityData extends SystemParticipantTypedEntityData fieldsToAttributes, NodeInput node, + EmInput em, HpTypeInput typeInput, ThermalBusInput thermalBusInput) { - super(fieldsToAttributes, HpInput.class, node, typeInput); + super(fieldsToAttributes, HpInput.class, node, em, typeInput); this.thermalBusInput = thermalBusInput; } @@ -29,9 +31,10 @@ public HpInputEntityData( Map fieldsToAttributes, OperatorInput operator, NodeInput node, + EmInput em, HpTypeInput typeInput, ThermalBusInput thermalBusInput) { - super(fieldsToAttributes, HpInput.class, operator, node, typeInput); + super(fieldsToAttributes, HpInput.class, operator, node, em, typeInput); this.thermalBusInput = thermalBusInput; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java index cd814e044..b01ede298 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.HpInput; @@ -33,6 +34,8 @@ protected HpInput buildModel( ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); + return new HpInput( uuid, id, @@ -41,6 +44,7 @@ protected HpInput buildModel( node, data.getThermalBusInput(), qCharacteristics, + em, data.getTypeInput()); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java index 77ccfba64..6c1d295be 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java @@ -6,9 +6,9 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.LoadInput; @@ -22,7 +22,7 @@ import tech.units.indriya.ComparableQuantity; public class LoadInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final Logger logger = LoggerFactory.getLogger(LoadInputFactory.class); private static final String LOAD_PROFILE = "loadProfile"; @@ -42,7 +42,7 @@ protected String[] getAdditionalFields() { @Override protected LoadInput buildModel( - NodeAssetInputEntityData data, + SystemParticipantEntityData data, UUID uuid, String id, NodeInput node, @@ -59,6 +59,7 @@ protected LoadInput buildModel( id); loadProfile = LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE; } + final EmInput em = data.getEm().orElse(null); final boolean dsm = data.getBoolean(DSM); final ComparableQuantity eConsAnnual = data.getQuantity(E_CONS_ANNUAL, StandardUnits.ENERGY_IN); @@ -72,6 +73,7 @@ protected LoadInput buildModel( operationTime, node, qCharacteristics, + em, loadProfile, dsm, eConsAnnual, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java index ca7eb378d..6cb13b79f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java @@ -5,9 +5,9 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.PvInput; @@ -19,7 +19,7 @@ import tech.units.indriya.ComparableQuantity; public class PvInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final String ALBEDO = "albedo"; private static final String AZIMUTH = "azimuth"; private static final String ETA_CONV = "etaConv"; @@ -43,13 +43,14 @@ protected String[] getAdditionalFields() { @Override protected PvInput buildModel( - NodeAssetInputEntityData data, + SystemParticipantEntityData data, UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); final double albedo = data.getDouble(ALBEDO); final ComparableQuantity azimuth = data.getQuantity(AZIMUTH, StandardUnits.AZIMUTH); final ComparableQuantity etaConv = @@ -69,6 +70,7 @@ protected PvInput buildModel( operationTime, node, qCharacteristics, + em, albedo, azimuth, etaConv, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java index 04645c459..aea43ba85 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.StorageInput; @@ -35,7 +36,9 @@ protected StorageInput buildModel( ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); final StorageTypeInput typeInput = data.getTypeInput(); - return new StorageInput(uuid, id, operator, operationTime, node, qCharacteristics, typeInput); + return new StorageInput( + uuid, id, operator, operationTime, node, qCharacteristics, em, typeInput); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java new file mode 100644 index 000000000..971832be4 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java @@ -0,0 +1,113 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.input.participant; + +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; +import edu.ie3.datamodel.models.UniqueEntity; +import edu.ie3.datamodel.models.input.EmInput; +import edu.ie3.datamodel.models.input.NodeInput; +import edu.ie3.datamodel.models.input.OperatorInput; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +/** + * Data used for those classes of {@link + * edu.ie3.datamodel.models.input.system.SystemParticipantInput}, including an (optional) link to an + * {@link EmInput} entity. + */ +public class SystemParticipantEntityData extends NodeAssetInputEntityData { + + /** Energy management unit that is managing the system participant. Can be null. */ + private final EmInput em; + + /** + * Creates a new SystemParticipantEntityData object for an operated, always on system participant + * input + * + * @param fieldsToAttributes attribute map: field name to value + * @param entityClass class of the entity to be created with this data + * @param node input node + * @param em The energy management unit that is managing the system participant. Null, if the + * system participant is not managed. + */ + public SystemParticipantEntityData( + Map fieldsToAttributes, + Class entityClass, + NodeInput node, + EmInput em) { + super(fieldsToAttributes, entityClass, node); + this.em = em; + } + + public Optional getEm() { + return Optional.ofNullable(em); + } + + /** + * Creates a new SystemParticipantEntityData object for an operable system participant input + * + * @param fieldsToAttributes attribute map: field name to value + * @param entityClass class of the entity to be created with this data + * @param operator operator input + * @param node input node + * @param em The energy management unit that is managing the system participant. Null, if the + * system participant is not managed. + */ + public SystemParticipantEntityData( + Map fieldsToAttributes, + Class entityClass, + OperatorInput operator, + NodeInput node, + EmInput em) { + super(fieldsToAttributes, entityClass, operator, node); + this.em = em; + } + + /** + * Creates a new SystemParticipantEntityData object based on a given {@link + * NodeAssetInputEntityData} object and given energy management unit + * + * @param nodeAssetInputEntityData The node asset entity data object to use attributes of + * @param em The energy management unit that is managing the system participant. Null, if the + * system participant is not managed. + */ + public SystemParticipantEntityData( + NodeAssetInputEntityData nodeAssetInputEntityData, EmInput em) { + super(nodeAssetInputEntityData, nodeAssetInputEntityData.getNode()); + this.em = em; + } + + @Override + public String toString() { + return "SystemParticipantEntityData{" + + "em=" + + getEm().map(EmInput::toString).orElse("") + + ", node=" + + getNode().getUuid() + + ", operatorInput=" + + getOperatorInput().getUuid() + + ", fieldsToValues=" + + getFieldsToValues() + + ", targetClass=" + + getTargetClass() + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + SystemParticipantEntityData that = (SystemParticipantEntityData) o; + return getEm().equals(that.getEm()); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), getEm()); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java index 661399d47..298bdfe92 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java @@ -27,11 +27,13 @@ * @since 28.01.20 */ public abstract class SystemParticipantInputEntityFactory< - T extends SystemParticipantInput, D extends NodeAssetInputEntityData> + T extends SystemParticipantInput, D extends SystemParticipantEntityData> extends AssetInputEntityFactory { private static final String Q_CHARACTERISTICS = "qCharacteristics"; + public static final String EM = "em"; + protected SystemParticipantInputEntityFactory(Class... allowedClasses) { super(allowedClasses); } @@ -41,6 +43,10 @@ protected List> getFields(Class entityClass) { List> fields = new ArrayList<>(super.getFields(entityClass)); for (Set set : fields) set.add(Q_CHARACTERISTICS); + List> withEm = fields.stream().map(f -> (Set) expandSet(f, EM)).toList(); + + fields.addAll(withEm); + return fields; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java index 871c70bd0..ab0bbe4b3 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java @@ -5,8 +5,8 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.UniqueEntity; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.type.SystemParticipantTypeInput; @@ -22,7 +22,7 @@ * of the SystemParticipantInput */ public class SystemParticipantTypedEntityData - extends NodeAssetInputEntityData { + extends SystemParticipantEntityData { private final T typeInput; @@ -33,14 +33,17 @@ public class SystemParticipantTypedEntityData fieldsToAttributes, Class entityClass, NodeInput node, + EmInput em, T typeInput) { - super(fieldsToAttributes, entityClass, node); + super(fieldsToAttributes, entityClass, node, em); this.typeInput = typeInput; } @@ -52,6 +55,8 @@ public SystemParticipantTypedEntityData( * @param entityClass class of the entity to be created with this data * @param operator operator input * @param node input node + * @param em The energy management unit that is managing the system participant. Null, if the + * system participant is not managed. * @param typeInput type input */ public SystemParticipantTypedEntityData( @@ -59,21 +64,23 @@ public SystemParticipantTypedEntityData( Class entityClass, OperatorInput operator, NodeInput node, + EmInput em, T typeInput) { - super(fieldsToAttributes, entityClass, operator, node); + super(fieldsToAttributes, entityClass, operator, node, em); this.typeInput = typeInput; } /** * Creates a new SystemParticipantTypedEntityData object based on a given {@link - * NodeAssetInputEntityData} object and given type input + * SystemParticipantEntityData} object and given type input * - * @param nodeAssetEntityData The system participant entity data object to use attributes of + * @param systemParticipantEntityData The system participant entity data object to use attributes + * of * @param typeInput type input */ public SystemParticipantTypedEntityData( - NodeAssetInputEntityData nodeAssetEntityData, T typeInput) { - super(nodeAssetEntityData, nodeAssetEntityData.getNode()); + SystemParticipantEntityData systemParticipantEntityData, T typeInput) { + super(systemParticipantEntityData, systemParticipantEntityData.getEm().orElse(null)); this.typeInput = typeInput; } @@ -86,6 +93,8 @@ public String toString() { return "SystemParticipantTypedEntityData{" + "typeInput=" + typeInput.getUuid() + + ", em=" + + getEm().map(EmInput::toString).orElse("") + ", node=" + getNode().getUuid() + ", operatorInput=" diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java index dfb2a8f8e..5d8fbca71 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.WecInput; @@ -37,9 +38,10 @@ protected WecInput buildModel( OperatorInput operator, OperationTime operationTime) { WecTypeInput typeInput = data.getTypeInput(); + EmInput em = data.getEm().orElse(null); final boolean marketReaction = data.getBoolean(MARKET_REACTION); return new WecInput( - uuid, id, operator, operationTime, node, qCharacteristics, typeInput, marketReaction); + uuid, id, operator, operationTime, node, qCharacteristics, em, typeInput, marketReaction); } } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 830fbef02..163d51b74 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -8,7 +8,6 @@ import edu.ie3.datamodel.exceptions.EntityProcessorException; import edu.ie3.datamodel.io.factory.input.NodeInputFactory; import edu.ie3.datamodel.io.processor.result.ResultEntityProcessor; -import edu.ie3.datamodel.models.ControlStrategy; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.UniqueEntity; @@ -236,10 +235,12 @@ protected String processMethodResult(Object methodReturnObject, Method method, S ((Optional) methodReturnObject) .map( o -> { - if (o instanceof Quantity) { + if (o instanceof Quantity quantity) { return Try.of( - () -> handleQuantity((Quantity) o, fieldName), + () -> handleQuantity(quantity, fieldName), EntityProcessorException.class); + } else if (o instanceof UniqueEntity entity) { + return Try.of(entity::getUuid, EntityProcessorException.class); } else { return Failure.of( new EntityProcessorException( @@ -274,8 +275,8 @@ protected String processMethodResult(Object methodReturnObject, Method method, S "TimeSeries", "Transformer2WTypeInput", "Transformer3WTypeInput", - "WecTypeInput" -> resultStringBuilder.append( - ((UniqueEntity) methodReturnObject).getUuid()); + "WecTypeInput", + "EmInput" -> resultStringBuilder.append(((UniqueEntity) methodReturnObject).getUuid()); case "OperatorInput" -> resultStringBuilder.append( ((OperatorInput) methodReturnObject).getId().equalsIgnoreCase("NO_OPERATOR_ASSIGNED") ? "" @@ -289,9 +290,6 @@ protected String processMethodResult(Object methodReturnObject, Method method, S "ReactivePowerCharacteristic", "CharacteristicInput" -> resultStringBuilder.append( ((CharacteristicInput) methodReturnObject).serialize()); - case "UUID[]" -> resultStringBuilder.append(processUUIDArray((UUID[]) methodReturnObject)); - case "ControlStrategy" -> resultStringBuilder.append( - ((ControlStrategy) methodReturnObject).getKey()); default -> throw new EntityProcessorException( "Unable to process value for attribute/field '" + fieldName @@ -372,12 +370,6 @@ protected String handleQuantity(Quantity quantity, String fieldName) protected abstract Try handleProcessorSpecificQuantity( Quantity quantity, String fieldName); - protected String processUUIDArray(UUID[] uuids) { - StringBuilder strb = new StringBuilder(); - for (UUID uuid : uuids) strb.append(uuid.toString()).append(" "); - return strb.toString().strip(); - } - /** * Handling of elements of type {@link OperationTime} * diff --git a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java index 898ae9a3c..acca23634 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java @@ -5,27 +5,31 @@ */ package edu.ie3.datamodel.io.source; +import static edu.ie3.datamodel.io.factory.input.participant.EmInputFactory.PARENT_EM; + import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.io.factory.input.AssetInputEntityData; +import edu.ie3.datamodel.io.factory.input.EmAssetInputEntityData; import edu.ie3.datamodel.io.factory.input.participant.EmInputFactory; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.container.EnergyManagementUnits; -import edu.ie3.datamodel.models.input.system.EmInput; +import edu.ie3.datamodel.utils.Try; +import java.util.List; import java.util.Map; -import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class EnergyManagementSource extends EntitySource { private final TypeSource typeSource; - private final EmInputFactory emInputFactory; + private static final EmInputFactory emInputFactory = new EmInputFactory(); public EnergyManagementSource(TypeSource typeSource, DataSource dataSource) { super(dataSource); this.typeSource = typeSource; - - this.emInputFactory = new EmInputFactory(); } @Override @@ -38,11 +42,11 @@ public void validate() throws ValidationException { * *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link * java.util.UUID} uniqueness of the provided {@link EmInput} which has to be checked manually, as - * {@link EmInput#equals(Object)} is NOT restricted on the uuid of {@link EmInput}. + * {@link EmInput#equals(Object)} is NOT restricted on the UUID of {@link EmInput}. * - * @return a set of object and uuid unique {@link EmInput} entities + * @return a map of UUID to {@link EmInput} entities */ - public EnergyManagementUnits getEmUnits() throws SourceException { + public Map getEmUnits() throws SourceException { Map operators = typeSource.getOperators(); return getEmUnits(operators); } @@ -50,7 +54,7 @@ public EnergyManagementUnits getEmUnits() throws SourceException { /** * This set has to be unique in the sense of object uniqueness but also in the sense of {@link * java.util.UUID} uniqueness of the provided {@link EmInput} which has to be checked manually, as - * {@link EmInput#equals(Object)} is NOT restricted on the uuid of {@link EmInput}. + * {@link EmInput#equals(Object)} is NOT restricted on the UUID of {@link EmInput}. * *

In contrast to {@link #getEmUnits()} this method provides the ability to pass in an already * existing set of {@link OperatorInput} entities, the {@link EmInput} instances depend on. Doing @@ -60,16 +64,139 @@ public EnergyManagementUnits getEmUnits() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a map of UUID to object and uuid unique {@link OperatorInput} that should be - * used for the returning instances - * @return a set of object and uuid unique {@link EmInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @return a map of UUID to {@link EmInput} entities + */ + public Map getEmUnits(Map operators) throws SourceException { + return createEmInputs(buildAssetInputEntityData(EmInput.class, operators)); + } + + /** + * Since each EM can itself be controlled by another EM, it does not suffice to link {@link + * EmInput}s via {@link EntitySource#optionallyEnrichEntityData} as we do for system participants + * in {@link SystemParticipantSource}. Instead, we use a recursive approach, starting with EMs at + * root level (which are not EM-controlled themselves). + * + * @param assetEntityDataStream the data stream of {@link AssetInputEntityData} {@link Try} + * objects + * @return a map of UUID to {@link EmInput} entities */ - public EnergyManagementUnits getEmUnits(Map operators) + private static Map createEmInputs( + Stream> assetEntityDataStream) throws SourceException { - Set emUnits = - unpackSet( - buildAssetInputEntityData(EmInput.class, operators).map(emInputFactory::get), + + // Split stream by failures and EMs that are themselves EM-controlled on one side, and EMs at + // root position (that have not failed so far) on the other side, which do not have parents per + // definition. + Map>> split = + assetEntityDataStream.collect( + Collectors.partitioningBy( + dataTry -> + dataTry + .map( + data -> + data.containsKey(PARENT_EM) && !data.getField(PARENT_EM).isBlank()) + .getOrElse(() -> true))); + + List> rootEmsEntityData = split.get(false); + List> others = split.get(true); + + // at the start, this is only root ems + Map allEms = + unpackMap( + rootEmsEntityData.stream() + .parallel() + .map( + entityDataTry -> + entityDataTry.map( + entityData -> new EmAssetInputEntityData(entityData, null))) + .map(emInputFactory::get), EmInput.class); - return new EnergyManagementUnits(emUnits); + + if (!others.isEmpty()) { + // there's more EM levels beyond root level. Build them recursively + Stream othersWithParentUuid = + // We try to keep the Tries as long as possible so that as many failures as possible can + // be reported. At this point however, we need to "unpack" (and throw, if applicable), + // because without valid parent EM UUID, we cannot proceed. + unpack( + others.stream() + .map( + dataTry -> + dataTry.flatMap( + data -> { + // we already filtered out those entities that do not have a parent, + // so the field should exist + String uuidString = data.getField(PARENT_EM); + return Try.of( + () -> UUID.fromString(uuidString), + IllegalArgumentException.class) + .transformF( + iae -> + new SourceException( + String.format( + "Exception while trying to parse UUID of field \"%s\" with value \"%s\"", + PARENT_EM, uuidString), + iae)) + // failed UUID parses are filtered out at this point. We save + // the parsed UUID with the asset data + .map( + parentUuid -> + new AssetDataAndValidParentUuid(data, parentUuid)); + })), + AssetDataAndValidParentUuid.class); + + allEms.putAll(createHierarchicalEmInputs(othersWithParentUuid, allEms)); + } + + return allEms; } + + private static Map createHierarchicalEmInputs( + Stream assetEntityDataStream, Map lastLevelEms) + throws SourceException { + + // Split stream by assets whose parent is already built (which can be built at this level), and + // those whose parents are not built yet (which have to be built at some lower recursion level + // or not at all) + Map> split = + assetEntityDataStream.collect( + Collectors.partitioningBy(data -> lastLevelEms.containsKey(data.parentEm))); + + List toBeBuiltAtThisLevel = split.get(true); + List toBeBuiltAtNextLevel = split.get(false); + + if (toBeBuiltAtThisLevel.isEmpty()) { + // Since we only start a new recursion step if the asset data stream is not empty, there have + // to be EMs to be built at next level. This does not work if there's no EMs at the current + // recursion level. + throw new SourceException( + "EMs " + toBeBuiltAtNextLevel + " were assigned a parent EM that does not exist."); + } else { + // New EMs can be built at this level + Map newEms = + unpackMap( + toBeBuiltAtThisLevel.stream() + .map( + data -> { + // exists because we checked above + EmInput parentEm = lastLevelEms.get(data.parentEm); + return emInputFactory.get( + new EmAssetInputEntityData(data.entityData, parentEm)); + }), + EmInput.class); + + if (!toBeBuiltAtNextLevel.isEmpty()) { + // If there's more EMs left to build, the new EMs have to function as parents there + newEms.putAll(createHierarchicalEmInputs(toBeBuiltAtNextLevel.stream(), newEms)); + } + return newEms; + } + } + + /** + * Helper data record that holds an {@link AssetInputEntityData} and the UUID successfully parsed + * from {@link EmInputFactory#PARENT_EM} field + */ + private record AssetDataAndValidParentUuid(AssetInputEntityData entityData, UUID parentEm) {} } diff --git a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java index 8656ec783..873575e2c 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java @@ -8,6 +8,7 @@ import edu.ie3.datamodel.exceptions.*; import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.io.factory.input.participant.*; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.container.SystemParticipants; @@ -32,6 +33,7 @@ public class SystemParticipantSource extends EntitySource { private final TypeSource typeSource; private final RawGridSource rawGridSource; private final ThermalSource thermalSource; + private final EnergyManagementSource energyManagementSource; // factories private final BmInputFactory bmInputFactory; @@ -49,12 +51,14 @@ public SystemParticipantSource( TypeSource typeSource, ThermalSource thermalSource, RawGridSource rawGridSource, + EnergyManagementSource energyManagementSource, DataSource dataSource) { super(dataSource); this.typeSource = typeSource; this.rawGridSource = rawGridSource; this.thermalSource = thermalSource; + this.energyManagementSource = energyManagementSource; // init factories this.bmInputFactory = new BmInputFactory(); @@ -151,6 +155,7 @@ public SystemParticipants getSystemParticipants( Map hpTypes = typeSource.getHpTypes(); Map storageTypes = typeSource.getStorageTypes(); Map wecTypes = typeSource.getWecTypes(); + Map emUnits = energyManagementSource.getEmUnits(); /// go on with the thermal assets Map thermalBuses = thermalSource.getThermalBuses(operators); @@ -158,27 +163,29 @@ public SystemParticipants getSystemParticipants( thermalSource.getThermalStorages(operators, thermalBuses); Try, SourceException> fixedFeedInInputs = - Try.of(() -> getFixedFeedIns(operators, nodes), SourceException.class); + Try.of(() -> getFixedFeedIns(operators, nodes, emUnits), SourceException.class); Try, SourceException> pvInputs = - Try.of(() -> getPvPlants(operators, nodes), SourceException.class); + Try.of(() -> getPvPlants(operators, nodes, emUnits), SourceException.class); Try, SourceException> loads = - Try.of(() -> getLoads(operators, nodes), SourceException.class); + Try.of(() -> getLoads(operators, nodes, emUnits), SourceException.class); Try, SourceException> bmInputs = - Try.of(() -> getBmPlants(operators, nodes, bmTypes), SourceException.class); + Try.of(() -> getBmPlants(operators, nodes, emUnits, bmTypes), SourceException.class); Try, SourceException> storages = - Try.of(() -> getStorages(operators, nodes, storageTypes), SourceException.class); + Try.of(() -> getStorages(operators, nodes, emUnits, storageTypes), SourceException.class); Try, SourceException> wecInputs = - Try.of(() -> getWecPlants(operators, nodes, wecTypes), SourceException.class); + Try.of(() -> getWecPlants(operators, nodes, emUnits, wecTypes), SourceException.class); Try, SourceException> evs = - Try.of(() -> getEvs(operators, nodes, evTypes), SourceException.class); + Try.of(() -> getEvs(operators, nodes, emUnits, evTypes), SourceException.class); Try, SourceException> evcs = - Try.of(() -> getEvcs(operators, nodes), SourceException.class); + Try.of(() -> getEvcs(operators, nodes, emUnits), SourceException.class); Try, SourceException> chpInputs = Try.of( - () -> getChpPlants(operators, nodes, chpTypes, thermalBuses, thermalStorages), + () -> getChpPlants(operators, nodes, emUnits, chpTypes, thermalBuses, thermalStorages), SourceException.class); Try, SourceException> hpInputs = - Try.of(() -> getHeatPumps(operators, nodes, hpTypes, thermalBuses), SourceException.class); + Try.of( + () -> getHeatPumps(operators, nodes, emUnits, hpTypes, thermalBuses), + SourceException.class); List exceptions = Try.getExceptions( @@ -228,7 +235,8 @@ public SystemParticipants getSystemParticipants( */ public Set getFixedFeedIns() throws SourceException { Map operators = typeSource.getOperators(); - return getFixedFeedIns(operators, rawGridSource.getNodes(operators)); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getFixedFeedIns(operators, rawGridSource.getNodes(operators), emUnits); } /** @@ -247,12 +255,14 @@ public Set getFixedFeedIns() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @return a set of object- and uuid-unique {@link FixedFeedInInput} entities */ public Set getFixedFeedIns( - Map operators, Map nodes) throws SourceException { + Map operators, Map nodes, Map emUnits) + throws SourceException { return unpackSet( - buildNodeAssetEntityData(FixedFeedInInput.class, operators, nodes) + buildSystemParticipantEntityData(FixedFeedInInput.class, operators, nodes, emUnits) .map(fixedFeedInInputFactory::get), FixedFeedInInput.class); } @@ -268,7 +278,8 @@ public Set getFixedFeedIns( */ public Set getPvPlants() throws SourceException { Map operators = typeSource.getOperators(); - return getPvPlants(operators, rawGridSource.getNodes(operators)); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getPvPlants(operators, rawGridSource.getNodes(operators), emUnits); } /** @@ -287,12 +298,15 @@ public Set getPvPlants() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @return a set of object- and uuid-unique {@link PvInput} entities */ - public Set getPvPlants(Map operators, Map nodes) + public Set getPvPlants( + Map operators, Map nodes, Map emUnits) throws SourceException { return unpackSet( - buildNodeAssetEntityData(PvInput.class, operators, nodes).map(pvInputFactory::get), + buildSystemParticipantEntityData(PvInput.class, operators, nodes, emUnits) + .map(pvInputFactory::get), PvInput.class); } @@ -307,7 +321,8 @@ public Set getPvPlants(Map operators, Map getLoads() throws SourceException { Map operators = typeSource.getOperators(); - return getLoads(operators, rawGridSource.getNodes(operators)); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getLoads(operators, rawGridSource.getNodes(operators), emUnits); } /** @@ -326,12 +341,15 @@ public Set getLoads() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @return a set of object- and uuid-unique {@link LoadInput} entities */ - public Set getLoads(Map operators, Map nodes) + public Set getLoads( + Map operators, Map nodes, Map emUnits) throws SourceException { return unpackSet( - buildNodeAssetEntityData(LoadInput.class, operators, nodes).map(loadInputFactory::get), + buildSystemParticipantEntityData(LoadInput.class, operators, nodes, emUnits) + .map(loadInputFactory::get), LoadInput.class); } @@ -346,7 +364,8 @@ public Set getLoads(Map operators, Map getEvcs() throws SourceException { Map operators = typeSource.getOperators(); - return getEvcs(operators, rawGridSource.getNodes(operators)); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getEvcs(operators, rawGridSource.getNodes(operators), emUnits); } /** @@ -365,12 +384,15 @@ public Set getEvcs() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @return a set of object- and uuid-unique {@link EvcsInput} entities */ - public Set getEvcs(Map operators, Map nodes) + public Set getEvcs( + Map operators, Map nodes, Map emUnits) throws SourceException { return unpackSet( - buildNodeAssetEntityData(EvcsInput.class, operators, nodes).map(evcsInputFactory::get), + buildSystemParticipantEntityData(EvcsInput.class, operators, nodes, emUnits) + .map(evcsInputFactory::get), EvcsInput.class); } @@ -385,7 +407,9 @@ public Set getEvcs(Map operators, Map getBmPlants() throws SourceException { Map operators = typeSource.getOperators(); - return getBmPlants(operators, rawGridSource.getNodes(operators), typeSource.getBmTypes()); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getBmPlants( + operators, rawGridSource.getNodes(operators), emUnits, typeSource.getBmTypes()); } /** @@ -404,14 +428,18 @@ public Set getBmPlants() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link BmTypeInput} entities * @return a set of object- and uuid-unique {@link BmInput} entities */ public Set getBmPlants( - Map operators, Map nodes, Map types) + Map operators, + Map nodes, + Map emUnits, + Map types) throws SourceException { return unpackSet( - buildTypedSystemParticipantEntityData(BmInput.class, operators, nodes, types) + buildTypedSystemParticipantEntityData(BmInput.class, operators, nodes, emUnits, types) .map(bmInputFactory::get), BmInput.class); } @@ -428,7 +456,9 @@ public Set getBmPlants( */ public Set getStorages() throws SourceException { Map operators = typeSource.getOperators(); - return getStorages(operators, rawGridSource.getNodes(operators), typeSource.getStorageTypes()); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getStorages( + operators, rawGridSource.getNodes(operators), emUnits, typeSource.getStorageTypes()); } /** @@ -448,16 +478,18 @@ public Set getStorages() throws SourceException { * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} that should be * used for the returning instances * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link StorageTypeInput} entities * @return a set of object- and uuid-unique {@link StorageInput} entities */ public Set getStorages( Map operators, Map nodes, + Map emUnits, Map types) throws SourceException { return unpackSet( - buildTypedSystemParticipantEntityData(StorageInput.class, operators, nodes, types) + buildTypedSystemParticipantEntityData(StorageInput.class, operators, nodes, emUnits, types) .map(storageInputFactory::get), StorageInput.class); } @@ -473,7 +505,9 @@ public Set getStorages( */ public Set getWecPlants() throws SourceException { Map operators = typeSource.getOperators(); - return getWecPlants(operators, rawGridSource.getNodes(operators), typeSource.getWecTypes()); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getWecPlants( + operators, rawGridSource.getNodes(operators), emUnits, typeSource.getWecTypes()); } /** @@ -492,14 +526,18 @@ public Set getWecPlants() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link WecTypeInput} entities * @return a set of object- and uuid-unique {@link WecInput} entities */ public Set getWecPlants( - Map operators, Map nodes, Map types) + Map operators, + Map nodes, + Map emUnits, + Map types) throws SourceException { return unpackSet( - buildTypedSystemParticipantEntityData(WecInput.class, operators, nodes, types) + buildTypedSystemParticipantEntityData(WecInput.class, operators, nodes, emUnits, types) .map(wecInputFactory::get), WecInput.class); } @@ -515,7 +553,8 @@ public Set getWecPlants( */ public Set getEvs() throws SourceException { Map operators = typeSource.getOperators(); - return getEvs(operators, rawGridSource.getNodes(operators), typeSource.getEvTypes()); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getEvs(operators, rawGridSource.getNodes(operators), emUnits, typeSource.getEvTypes()); } /** @@ -534,24 +573,30 @@ public Set getEvs() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link EvTypeInput} entities * @return a set of object- and uuid-unique {@link EvInput} entities */ public Set getEvs( - Map operators, Map nodes, Map types) + Map operators, + Map nodes, + Map emUnits, + Map types) throws SourceException { return unpackSet( - buildTypedSystemParticipantEntityData(EvInput.class, operators, nodes, types) + buildTypedSystemParticipantEntityData(EvInput.class, operators, nodes, emUnits, types) .map(evInputFactory::get), EvInput.class); } public Set getChpPlants() throws SourceException { Map operators = typeSource.getOperators(); + Map emUnits = energyManagementSource.getEmUnits(operators); Map thermalBuses = thermalSource.getThermalBuses(operators); return getChpPlants( operators, rawGridSource.getNodes(operators), + emUnits, typeSource.getChpTypes(), thermalBuses, thermalSource.getThermalStorages(operators, thermalBuses)); @@ -569,6 +614,7 @@ public Set getChpPlants() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link ChpTypeInput} entities * @param thermalBuses a map of UUID to object- and uuid-unique {@link ThermalBusInput} entities * @param thermalStorages a map of UUID to object- and uuid-unique {@link ThermalStorageInput} @@ -578,13 +624,15 @@ public Set getChpPlants() throws SourceException { public Set getChpPlants( Map operators, Map nodes, + Map emUnits, Map types, Map thermalBuses, Map thermalStorages) throws SourceException { return unpackSet( chpEntityStream( - buildTypedSystemParticipantEntityData(ChpInput.class, operators, nodes, types), + buildTypedSystemParticipantEntityData( + ChpInput.class, operators, nodes, emUnits, types), thermalStorages, thermalBuses) .map(chpInputFactory::get), @@ -593,9 +641,11 @@ public Set getChpPlants( public Set getHeatPumps() throws SourceException { Map operators = typeSource.getOperators(); + Map emUnits = energyManagementSource.getEmUnits(operators); return getHeatPumps( operators, rawGridSource.getNodes(operators), + emUnits, typeSource.getHpTypes(), thermalSource.getThermalBuses()); } @@ -612,6 +662,7 @@ public Set getHeatPumps() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link HpTypeInput} entities * @param thermalBuses a map of UUID to object- and uuid-unique {@link ThermalBusInput} entities * @return a set of object- and uuid-unique {@link HpInput} entities @@ -619,12 +670,14 @@ public Set getHeatPumps() throws SourceException { public Set getHeatPumps( Map operators, Map nodes, + Map emUnits, Map types, Map thermalBuses) throws SourceException { return unpackSet( hpEntityStream( - buildTypedSystemParticipantEntityData(HpInput.class, operators, nodes, types), + buildTypedSystemParticipantEntityData( + HpInput.class, operators, nodes, emUnits, types), thermalBuses) .map(hpInputFactory::get), HpInput.class); @@ -694,17 +747,19 @@ private static Stream> hpEntityStream( Class entityClass, Map operators, Map nodes, + Map emUnits, Map types) { return typedSystemParticipantEntityStream( - buildNodeAssetEntityData(entityClass, operators, nodes), types); + buildSystemParticipantEntityData(entityClass, operators, nodes, emUnits), types); } /** - * Enriches a given stream of {@link NodeAssetInputEntityData} {@link Try} objects with a type of - * {@link SystemParticipantTypeInput} based on the provided collection of types and the fields to - * values mapping that inside the already provided {@link NodeAssetInputEntityData} instance. + * Enriches a given stream of {@link SystemParticipantEntityData} {@link Try} objects with a type + * of {@link SystemParticipantTypeInput} based on the provided collection of types and the fields + * to values mapping that inside the already provided {@link SystemParticipantEntityData} + * instance. * - * @param systemParticipantEntityDataStream the data stream of {@link NodeAssetInputEntityData} + * @param systemParticipantEntityDataStream the data stream of {@link SystemParticipantEntityData} * {@link Try} objects * @param types the types that should be used for enrichment and to build {@link * SystemParticipantTypedEntityData} from @@ -715,7 +770,7 @@ private static Stream> hpEntityStream( private static Stream, SourceException>> typedSystemParticipantEntityStream( - Stream> + Stream> systemParticipantEntityDataStream, Map types) { return systemParticipantEntityDataStream @@ -730,4 +785,43 @@ private static Stream> hpEntityStream( types, SystemParticipantTypedEntityData::new))); } + + private Stream> + buildSystemParticipantEntityData( + Class entityClass, + Map operators, + Map nodes, + Map emUnits) { + return systemParticipantEntityStream( + buildNodeAssetEntityData(entityClass, operators, nodes), emUnits); + } + + /** + * Enriches a given stream of {@link NodeAssetInputEntityData} {@link Try} objects with a type of + * {@link EmInput} based on the provided collection of EMs and the fields to values mapping that + * inside the already provided {@link NodeAssetInputEntityData} instance. + * + * @param nodeAssetEntityDataStream the data stream of {@link NodeAssetInputEntityData} {@link + * Try} objects + * @param emUnits the energy management units that should be used for enrichment and to build + * {@link SystemParticipantEntityData} from + * @return a stream of tries of {@link SystemParticipantEntityData} instances + */ + private static Stream> + systemParticipantEntityStream( + Stream> nodeAssetEntityDataStream, + Map emUnits) { + return nodeAssetEntityDataStream + .parallel() + .map( + nodeAssetInputEntityDataTry -> + nodeAssetInputEntityDataTry.flatMap( + nodeAssetInputEntityData -> + optionallyEnrichEntityData( + nodeAssetInputEntityData, + SystemParticipantInputEntityFactory.EM, + emUnits, + null, + SystemParticipantEntityData::new))); + } } 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 492eea04d..294f5b808 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 @@ -50,9 +50,9 @@ public static JointGridContainer read( TypeSource typeSource = new TypeSource(dataSource); RawGridSource rawGridSource = new RawGridSource(typeSource, dataSource); ThermalSource thermalSource = new ThermalSource(typeSource, dataSource); - SystemParticipantSource systemParticipantSource = - new SystemParticipantSource(typeSource, thermalSource, rawGridSource, dataSource); EnergyManagementSource emSource = new EnergyManagementSource(typeSource, dataSource); + SystemParticipantSource systemParticipantSource = + new SystemParticipantSource(typeSource, thermalSource, rawGridSource, emSource, dataSource); GraphicSource graphicSource = new GraphicSource(typeSource, rawGridSource, dataSource); /* validating sources */ @@ -80,8 +80,6 @@ public static JointGridContainer read( Try.of( () -> systemParticipantSource.getSystemParticipants(operators, nodes), SourceException.class); - Try emUnits = - Try.of(() -> emSource.getEmUnits(operators), SourceException.class); Try graphicElements = Try.of(() -> graphicSource.getGraphicElements(nodes, lines), SourceException.class); @@ -98,7 +96,6 @@ public static JointGridContainer read( gridName, rawGridElements.getOrThrow(), systemParticipants.getOrThrow(), - emUnits.getOrThrow(), graphicElements.getOrThrow()); } } diff --git a/src/main/java/edu/ie3/datamodel/models/ControlStrategy.java b/src/main/java/edu/ie3/datamodel/models/ControlStrategy.java deleted file mode 100644 index 61ad82ddf..000000000 --- a/src/main/java/edu/ie3/datamodel/models/ControlStrategy.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * © 2022. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models; - -import edu.ie3.datamodel.exceptions.ParsingException; -import java.io.Serializable; -import java.util.Arrays; - -public interface ControlStrategy extends Serializable { - String getKey(); - - static ControlStrategy parse(String key) throws ParsingException { - if (key == null || key.isEmpty()) - return ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY; - - String filterKey = key.toLowerCase().replace("-", "_"); - return Arrays.stream(EmControlStrategy.values()) - .filter(profile -> profile.getKey().equals(filterKey)) - .findFirst() - .orElseThrow( - () -> new ParsingException("Cannot parse \"" + key + "\" to a valid control strategy")); - } - - enum DefaultControlStrategies implements ControlStrategy { - NO_CONTROL_STRATEGY; - - @Override - public String getKey() { - return "No control strategy assigned"; - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/EmControlStrategy.java b/src/main/java/edu/ie3/datamodel/models/EmControlStrategy.java deleted file mode 100644 index ffb216a35..000000000 --- a/src/main/java/edu/ie3/datamodel/models/EmControlStrategy.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * © 2022. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models; - -import java.util.Arrays; -import java.util.Locale; -import java.util.stream.Collectors; - -public enum EmControlStrategy implements ControlStrategy { - SELF_OPTIMIZATION("self_optimization"); - - private final String key; - - EmControlStrategy(String key) { - this.key = key.toLowerCase(Locale.ROOT); - } - - public static EmControlStrategy get(String key) { - return Arrays.stream(EmControlStrategy.values()) - .filter(controlStrategy -> controlStrategy.key.equalsIgnoreCase(key)) - .findFirst() - .orElseThrow( - () -> - new IllegalArgumentException( - "No predefined energy management control strategy '" - + key - + "' found. Please provide one of the following keys: " - + Arrays.stream(EmControlStrategy.values()) - .map(EmControlStrategy::getKey) - .collect(Collectors.joining(", ")))); - } - - @Override - public String getKey() { - return key; - } - - @Override - public String toString() { - return "EmControlStrategy{" + "key='" + key + '\'' + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/input/EmInput.java b/src/main/java/edu/ie3/datamodel/models/input/EmInput.java new file mode 100644 index 000000000..1376caa1c --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/input/EmInput.java @@ -0,0 +1,139 @@ +/* + * © 2022. 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; + +import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.UniqueEntity; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +public class EmInput extends AssetInput { + + /** Reference to the control strategy to be used for this model */ + private final String controlStrategy; + + /** + * Optional UUID of the parent {@link EmInput} that is controlling this em unit. If null, this em + * unit is not em-controlled. + */ + private final EmInput parentEm; + + /** + * Constructor for an operated energy management system + * + * @param uuid of the input entity + * @param id of the asset + * @param operator of the asset + * @param operationTime time for which the entity is operated + * @param emControlStrategy the control strategy + * @param parentEm The {@link EmInput} controlling this em unit. Null, if not applicable. + */ + public EmInput( + UUID uuid, + String id, + OperatorInput operator, + OperationTime operationTime, + String emControlStrategy, + EmInput parentEm) { + super(uuid, id, operator, operationTime); + this.controlStrategy = emControlStrategy; + this.parentEm = parentEm; + } + + /** + * Constructor for an operated energy management system + * + * @param uuid of the input entity + * @param id of the asset + * @param emControlStrategy the control strategy + * @param parentEm The {@link EmInput} controlling this em unit. Null, if not applicable. + */ + public EmInput(UUID uuid, String id, String emControlStrategy, EmInput parentEm) { + super(uuid, id); + this.controlStrategy = emControlStrategy; + this.parentEm = parentEm; + } + + public String getControlStrategy() { + return controlStrategy; + } + + public Optional getParentEm() { + return Optional.ofNullable(parentEm); + } + + @Override + public EmInputCopyBuilder copy() { + return new EmInputCopyBuilder(this); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof EmInput emInput)) return false; + if (!super.equals(o)) return false; + return Objects.equals(controlStrategy, emInput.controlStrategy) + && Objects.equals(parentEm, emInput.parentEm); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), controlStrategy, parentEm); + } + + @Override + public String toString() { + return "EmInput{" + + "uuid=" + + getUuid() + + ", id='" + + getId() + + ", operator=" + + getOperator().getUuid() + + ", operationTime=" + + getOperationTime() + + ", controlStrategy=" + + getControlStrategy() + + ", parentEm=" + + getParentEm().map(UniqueEntity::getUuid).map(UUID::toString).orElse("") + + '}'; + } + + public static class EmInputCopyBuilder extends AssetInputCopyBuilder { + + private String controlStrategy; + + private EmInput parentEm; + + protected EmInputCopyBuilder(EmInput entity) { + super(entity); + this.controlStrategy = entity.getControlStrategy(); + this.parentEm = entity.parentEm; + } + + public EmInputCopyBuilder controlStrategy(String controlStrategy) { + this.controlStrategy = controlStrategy; + return this; + } + + public EmInputCopyBuilder parentEm(EmInput parentEm) { + this.parentEm = parentEm; + return thisInstance(); + } + + @Override + public EmInput build() { + return new EmInput( + getUuid(), getId(), getOperator(), getOperationTime(), controlStrategy, parentEm); + } + + @Override + protected EmInputCopyBuilder thisInstance() { + return this; + } + } +} 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 deleted file mode 100644 index 4142a745d..000000000 --- a/src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * © 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.system.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 { - - protected 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(); - } - - // TODO useful once #957 is implemented - 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 java docs of {@link - * EnergyManagementUnits} - */ - public static class EnergyManagementUnitsCopyBuilder - implements 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); - } - } -} 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 12f5b7c9d..3c076cfff 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 @@ -15,8 +15,6 @@ public abstract class GridContainer implements InputContainer { protected final RawGridElements rawGrid; /** 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; @@ -24,13 +22,11 @@ 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; } @@ -39,7 +35,6 @@ 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); } @@ -60,10 +55,6 @@ public SystemParticipants getSystemParticipants() { return systemParticipants; } - public EnergyManagementUnits getEmUnits() { - return emUnits; - } - public GraphicElements getGraphics() { return graphics; } @@ -75,13 +66,12 @@ 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, emUnits, graphics); + return Objects.hash(gridName, rawGrid, systemParticipants, graphics); } @Override @@ -101,7 +91,6 @@ protected abstract static class GridContainerCopyBuilder feedInTariff) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.type = type; this.marketReaction = marketReaction; this.costControlled = costControlled; @@ -70,6 +73,7 @@ public BmInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of BM * @param marketReaction Is this asset market oriented? * @param costControlled Does this plant increase the output power if the revenues exceed the @@ -81,11 +85,12 @@ public BmInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, BmTypeInput type, boolean marketReaction, boolean costControlled, ComparableQuantity feedInTariff) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.type = type; this.marketReaction = marketReaction; this.costControlled = costControlled; @@ -144,8 +149,9 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + '\'' - + "type=" + + "', em=" + + getEm() + + ", type=" + type.getUuid() + ", marketReaction=" + marketReaction @@ -208,6 +214,7 @@ public BmInput build() { getOperationTime(), getNode(), getqCharacteristics(), + getEm(), type, marketReaction, costControlled, diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java index 422817ecb..1478c949b 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java @@ -9,6 +9,7 @@ import edu.ie3.datamodel.io.extractor.HasThermalStorage; import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -41,6 +42,7 @@ public class ChpInput extends SystemParticipantInput * @param thermalBus The thermal bus, this model is connected to (normally equal to the thermal * bus of the provided thermal storage!) * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of CHP * @param thermalStorage Thermal storage model * @param marketReaction Is this asset market oriented? @@ -53,10 +55,11 @@ public ChpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, + EmInput em, ChpTypeInput type, ThermalStorageInput thermalStorage, boolean marketReaction) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.thermalBus = thermalBus; this.type = type; this.thermalStorage = thermalStorage; @@ -72,6 +75,7 @@ public ChpInput( * @param thermalBus The thermal bus, this model is connected to (normally equal to the thermal * bus of the provided thermal storage!) * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of CHP * @param thermalStorage Thermal storage model * @param marketReaction Is this asset market oriented? @@ -82,10 +86,11 @@ public ChpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, + EmInput em, ChpTypeInput type, ThermalStorageInput thermalStorage, boolean marketReaction) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.thermalBus = thermalBus; this.type = type; this.thermalStorage = thermalStorage; @@ -145,7 +150,8 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + '\'' + + "', em=" + + getEm() + ", thermalBus=" + thermalBus.getUuid() + ", type=" @@ -190,6 +196,7 @@ public ChpInput build() { getNode(), thermalBus, getqCharacteristics(), + getEm(), type, thermalStorage, marketReaction); diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java deleted file mode 100644 index f9bbbaa9f..000000000 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * © 2022. 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.system; - -import edu.ie3.datamodel.models.ControlStrategy; -import edu.ie3.datamodel.models.EmControlStrategy; -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.AssetInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.Arrays; -import java.util.Objects; -import java.util.UUID; - -public class EmInput extends AssetInput { - - /** Reference via UUID to all SystemParticipantInputs connected to this model */ - private final UUID[] connectedAssets; - - /** Reference to the control strategy to be used for this model */ - private final ControlStrategy controlStrategy; - /** - * Constructor for an operated energy management system - * - * @param uuid of the input entity - * @param id of the asset - * @param operator of the asset - * @param operationTime time for which the entity is operated - * @param connectedAssets array of all connected assets - * @param controlStrategy control strategy used for this model - */ - public EmInput( - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime, - UUID[] connectedAssets, - ControlStrategy controlStrategy) { - super(uuid, id, operator, operationTime); - this.connectedAssets = connectedAssets; - this.controlStrategy = controlStrategy; - } - - /** - * Constructor for an operated energy management system - * - * @param uuid of the input entity - * @param id of the asset - * @param operator of the asset - * @param operationTime time for which the entity is operated - * @param connectedAssets array of all connected assets - * @param emControlStrategy {@link edu.ie3.datamodel.models.EmControlStrategy} control strategy - * key - */ - public EmInput( - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime, - UUID[] connectedAssets, - String emControlStrategy) { - super(uuid, id, operator, operationTime); - this.connectedAssets = connectedAssets; - this.controlStrategy = EmControlStrategy.get(emControlStrategy); - } - - /** - * Constructor for an operated energy management system - * - * @param uuid of the input entity - * @param id of the asset - * @param connectedAssets array of all connected assets - * @param controlStrategy control strategy used for this model - */ - public EmInput(UUID uuid, String id, UUID[] connectedAssets, ControlStrategy controlStrategy) { - super(uuid, id); - this.connectedAssets = connectedAssets; - this.controlStrategy = controlStrategy; - } - - /** - * Constructor for an operated energy management system - * - * @param uuid of the input entity - * @param id of the asset - * @param connectedAssets array of all connected assets - * @param emControlStrategy {@link edu.ie3.datamodel.models.EmControlStrategy} control strategy - * key - */ - public EmInput(UUID uuid, String id, UUID[] connectedAssets, String emControlStrategy) { - super(uuid, id); - this.connectedAssets = connectedAssets; - this.controlStrategy = EmControlStrategy.get(emControlStrategy); - } - - public UUID[] getConnectedAssets() { - return connectedAssets; - } - - public ControlStrategy getControlStrategy() { - return controlStrategy; - } - - @Override - public EmInputCopyBuilder copy() { - return new EmInputCopyBuilder(this); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof EmInput emInput)) return false; - if (!super.equals(o)) return false; - return Arrays.equals(connectedAssets, emInput.connectedAssets) - && controlStrategy == emInput.controlStrategy; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), Arrays.hashCode(connectedAssets), controlStrategy); - } - - @Override - public String toString() { - return "EmInput{" - + "uuid=" - + getUuid() - + ", id='" - + getId() - + ", operator=" - + getOperator().getUuid() - + ", operationTime=" - + getOperationTime() - + ", connectedAssets=" - + Arrays.toString(connectedAssets) - + ", controlStrategy=" - + controlStrategy - + '}'; - } - - public static class EmInputCopyBuilder extends AssetInputCopyBuilder { - - private UUID[] connectedAssets; - - private ControlStrategy controlStrategy; - - protected EmInputCopyBuilder(EmInput entity) { - super(entity); - this.connectedAssets = entity.getConnectedAssets(); - this.controlStrategy = entity.getControlStrategy(); - } - - public EmInputCopyBuilder connectedAssets(UUID[] connectedAssets) { - this.connectedAssets = connectedAssets; - return this; - } - - public EmInputCopyBuilder controlStrategy(ControlStrategy controlStrategy) { - this.controlStrategy = controlStrategy; - return this; - } - - @Override - public EmInput build() { - return new EmInput( - getUuid(), getId(), getOperator(), getOperationTime(), connectedAssets, controlStrategy); - } - - @Override - protected EmInputCopyBuilder thisInstance() { - return this; - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java index 5f2edeae9..b4796b844 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -28,6 +29,7 @@ public class EvInput extends SystemParticipantInput implements HasType { * @param operationTime Time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of EV */ public EvInput( @@ -37,8 +39,9 @@ public EvInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, EvTypeInput type) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.type = type; } @@ -49,6 +52,7 @@ public EvInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of EV */ public EvInput( @@ -56,8 +60,9 @@ public EvInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, EvTypeInput type) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.type = type; } @@ -98,7 +103,8 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + '\'' + + "', em=" + + getEm() + ", type=" + type.getUuid() + '}'; @@ -130,6 +136,7 @@ public EvInput build() { getOperationTime(), getNode(), getqCharacteristics(), + getEm(), type); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java index e3f3c381f..8513edd5c 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.models.input.system; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -38,6 +39,7 @@ public class EvcsInput extends SystemParticipantInput { * @param operationTime Time for which the entity is operated * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type type of the charging points available to this charging station * @param chargingPoints number of charging points available at this charging station * @param cosPhiRated rated cos phi @@ -51,12 +53,13 @@ public EvcsInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, ChargingPointType type, int chargingPoints, double cosPhiRated, EvcsLocationType locationType, boolean v2gSupport) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.type = type; this.chargingPoints = chargingPoints; this.cosPhiRated = cosPhiRated; @@ -71,6 +74,7 @@ public EvcsInput( * @param operationTime Time for which the entity is operated * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type type of the charging points available to this charging station * @param cosPhiRated rated cos phi * @param locationType the location type @@ -83,6 +87,7 @@ public EvcsInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, ChargingPointType type, double cosPhiRated, EvcsLocationType locationType, @@ -94,6 +99,7 @@ public EvcsInput( operationTime, node, qCharacteristics, + em, type, 1, cosPhiRated, @@ -105,6 +111,7 @@ public EvcsInput( * @param id Human readable identifier * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type type of the charging points available to this charging station * @param chargingPoints number of charging points available at this charging station * @param cosPhiRated rated cos phi @@ -116,12 +123,13 @@ public EvcsInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, ChargingPointType type, int chargingPoints, double cosPhiRated, EvcsLocationType locationType, boolean v2gSupport) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.type = type; this.chargingPoints = chargingPoints; this.cosPhiRated = cosPhiRated; @@ -134,6 +142,7 @@ public EvcsInput( * @param id Human readable identifier * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type type of the charging points available to this charging station * @param cosPhiRated rated cos phi * @param locationType the location type @@ -144,11 +153,12 @@ public EvcsInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, ChargingPointType type, double cosPhiRated, EvcsLocationType locationType, boolean v2gSupport) { - this(uuid, id, node, qCharacteristics, type, 1, cosPhiRated, locationType, v2gSupport); + this(uuid, id, node, qCharacteristics, em, type, 1, cosPhiRated, locationType, v2gSupport); } public ChargingPointType getType() { @@ -208,6 +218,8 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() + + "', em=" + + getEm() + ", type=" + type + ", chargingPoints=" @@ -280,6 +292,7 @@ public EvcsInput build() { getOperationTime(), getNode(), getqCharacteristics(), + getEm(), type, chargingPoints, cosPhiRated, diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java index 16ba19dc7..b765ca695 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -31,6 +32,7 @@ public class FixedFeedInInput extends SystemParticipantInput { * @param operationTime Time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param sRated Rated apparent power * @param cosPhiRated Power factor */ @@ -41,9 +43,10 @@ public FixedFeedInInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.sRated = sRated.to(StandardUnits.S_RATED); this.cosPhiRated = cosPhiRated; } @@ -55,6 +58,7 @@ public FixedFeedInInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param sRated Rated apparent power * @param cosPhiRated Power factor */ @@ -63,9 +67,10 @@ public FixedFeedInInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.sRated = sRated.to(StandardUnits.S_RATED); this.cosPhiRated = cosPhiRated; } @@ -110,7 +115,8 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + '\'' + + "', em=" + + getEm() + ", sRated=" + sRated + ", cosphiRated=" @@ -147,6 +153,7 @@ public FixedFeedInInput build() { getOperationTime(), getNode(), getqCharacteristics(), + getEm(), sRated, cosPhiRated); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java index ef5bf7fea..89771ae58 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java @@ -8,6 +8,7 @@ import edu.ie3.datamodel.io.extractor.HasThermalBus; import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -33,6 +34,7 @@ public class HpInput extends SystemParticipantInput implements HasType, HasTherm * @param node the asset is connected to * @param thermalBus The thermal bus, this model is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of HP */ public HpInput( @@ -43,8 +45,9 @@ public HpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, + EmInput em, HpTypeInput type) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.thermalBus = thermalBus; this.type = type; } @@ -57,6 +60,7 @@ public HpInput( * @param node the asset is connected to * @param thermalBus The thermal bus, this model is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of HP */ public HpInput( @@ -65,8 +69,9 @@ public HpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, + EmInput em, HpTypeInput type) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.thermalBus = thermalBus; this.type = type; } @@ -113,7 +118,8 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + '\'' + + "', em=" + + getEm() + ", type=" + type.getUuid() + ", thermalBus=" @@ -150,6 +156,7 @@ public HpInput build() { getNode(), thermalBus, getqCharacteristics(), + getEm(), type); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java index 9f320d851..196952d65 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.models.*; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -47,6 +48,7 @@ public class LoadInput extends SystemParticipantInput { * @param operationTime Time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param loadProfile Load profile to use for this model * @param dsm True, if demand side management is activated for this load * @param eConsAnnual Annually consumed energy (typically in kWh) @@ -60,12 +62,13 @@ public LoadInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, LoadProfile loadProfile, boolean dsm, ComparableQuantity eConsAnnual, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.loadProfile = loadProfile; this.dsm = dsm; this.eConsAnnual = eConsAnnual.to(StandardUnits.ENERGY_IN); @@ -82,6 +85,7 @@ public LoadInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param loadProfileKey Load profile key corresponding to {@link * edu.ie3.datamodel.models.profile.BdewStandardLoadProfile} or {@link * edu.ie3.datamodel.models.profile.NbwTemperatureDependantLoadProfile} @@ -97,6 +101,7 @@ public LoadInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, String loadProfileKey, boolean dsm, ComparableQuantity eConsAnnual, @@ -111,6 +116,7 @@ public LoadInput( operationTime, node, qCharacteristics, + em, LoadProfile.parse(loadProfileKey), dsm, eConsAnnual, @@ -125,6 +131,7 @@ public LoadInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param loadProfile Standard load profile to use for this model * @param dsm True, if demand side management is activated for this load * @param eConsAnnual Annually consumed energy (typically in kWh) @@ -136,12 +143,13 @@ public LoadInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, LoadProfile loadProfile, boolean dsm, ComparableQuantity eConsAnnual, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.loadProfile = loadProfile; this.dsm = dsm; this.eConsAnnual = eConsAnnual.to(StandardUnits.ENERGY_IN); @@ -156,6 +164,7 @@ public LoadInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param loadProfileKey load profile key corresponding to {@link * edu.ie3.datamodel.models.profile.BdewStandardLoadProfile} or {@link * edu.ie3.datamodel.models.profile.NbwTemperatureDependantLoadProfile} @@ -169,6 +178,7 @@ public LoadInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, String loadProfileKey, boolean dsm, ComparableQuantity eConsAnnual, @@ -180,6 +190,7 @@ public LoadInput( id, node, qCharacteristics, + em, LoadProfile.parse(loadProfileKey), dsm, eConsAnnual, @@ -243,7 +254,8 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + '\'' + + "', em=" + + getEm() + ", dsm=" + dsm + ", eConsAnnual=" @@ -314,6 +326,7 @@ public LoadInput build() { getOperationTime(), getNode(), getqCharacteristics(), + getEm(), loadProfile, dsm, eConsAnnual, diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java index 49a68253f..2117ef313 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -48,6 +49,7 @@ public class PvInput extends SystemParticipantInput { * @param operationTime Time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param albedo Albedo value (typically a value between 0 and 1) * @param azimuth Inclination in a compass direction (typically °: South 0◦; West 90◦; East -90◦) * @param etaConv Efficiency of converter (typically in %) @@ -65,6 +67,7 @@ public PvInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, double albedo, ComparableQuantity azimuth, ComparableQuantity etaConv, @@ -74,7 +77,7 @@ public PvInput( boolean marketReaction, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.albedo = albedo; this.azimuth = azimuth.to(StandardUnits.AZIMUTH); this.etaConv = etaConv.to(StandardUnits.EFFICIENCY); @@ -93,6 +96,7 @@ public PvInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param albedo Albedo value (typically a value between 0 and 1) * @param azimuth Inclination in a compass direction (typically °: South 0◦; West 90◦; East -90◦) * @param etaConv Efficiency of converter (typically in %) @@ -108,6 +112,7 @@ public PvInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, double albedo, ComparableQuantity azimuth, ComparableQuantity etaConv, @@ -117,7 +122,7 @@ public PvInput( boolean marketReaction, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.albedo = albedo; this.azimuth = azimuth.to(StandardUnits.AZIMUTH); this.etaConv = etaConv.to(StandardUnits.EFFICIENCY); @@ -215,7 +220,8 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + '\'' + + "', em=" + + getEm() + ", albedo=" + albedo + ", azimuth=" @@ -324,6 +330,7 @@ public PvInput build() { getOperationTime(), getNode(), getqCharacteristics(), + getEm(), albedo, azimuth, etaConv, diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java index 26726cb03..ed37c1448 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -28,6 +29,7 @@ public class StorageInput extends SystemParticipantInput implements HasType { * @param operationTime time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic for integrated inverter + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of storage */ public StorageInput( @@ -37,8 +39,9 @@ public StorageInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, StorageTypeInput type) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.type = type; } @@ -49,6 +52,7 @@ public StorageInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of storage */ public StorageInput( @@ -56,8 +60,9 @@ public StorageInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, StorageTypeInput type) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.type = type; } @@ -98,7 +103,8 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + '\'' + + "', em=" + + getEm() + ", type=" + type.getUuid() + '}'; @@ -130,6 +136,7 @@ public StorageInput build() { getOperationTime(), getNode(), getqCharacteristics(), + getEm(), type); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java index 9fa4a00a6..eea7df273 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java @@ -7,7 +7,9 @@ import edu.ie3.datamodel.io.extractor.HasNodes; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.AssetInput; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -22,6 +24,12 @@ public abstract class SystemParticipantInput extends AssetInput implements HasNo /** Description of a reactive power characteristic. For details see further documentation */ private final ReactivePowerCharacteristic qCharacteristics; + /** + * Optional {@link EmInput} that is controlling this system participant. If null, this system + * participant is not em-controlled. + */ + private final EmInput em; + /** * Constructor for an operated system participant * @@ -31,6 +39,7 @@ public abstract class SystemParticipantInput extends AssetInput implements HasNo * @param operationTime Time for which the entity is operated * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. */ protected SystemParticipantInput( UUID uuid, @@ -38,10 +47,12 @@ protected SystemParticipantInput( OperatorInput operator, OperationTime operationTime, NodeInput node, - ReactivePowerCharacteristic qCharacteristics) { + ReactivePowerCharacteristic qCharacteristics, + EmInput em) { super(uuid, id, operator, operationTime); this.node = node; this.qCharacteristics = qCharacteristics; + this.em = em; } /** @@ -51,20 +62,30 @@ protected SystemParticipantInput( * @param id of the asset * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. */ protected SystemParticipantInput( - UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics) { + UUID uuid, + String id, + NodeInput node, + ReactivePowerCharacteristic qCharacteristics, + EmInput em) { super(uuid, id); this.node = node; this.qCharacteristics = qCharacteristics; + this.em = em; + } + + public NodeInput getNode() { + return node; } public ReactivePowerCharacteristic getqCharacteristics() { return qCharacteristics; } - public NodeInput getNode() { - return node; + public Optional getEm() { + return Optional.ofNullable(em); } @Override @@ -81,12 +102,13 @@ public boolean equals(Object o) { if (!(o instanceof SystemParticipantInput that)) return false; if (!super.equals(o)) return false; return Objects.equals(node, that.node) - && Objects.equals(qCharacteristics, that.qCharacteristics); + && Objects.equals(qCharacteristics, that.qCharacteristics) + && Objects.equals(em, that.em); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), node, qCharacteristics); + return Objects.hash(super.hashCode(), node, qCharacteristics, em); } @Override @@ -104,7 +126,8 @@ public String toString() { + node.getUuid() + ", qCharacteristics='" + qCharacteristics - + '\'' + + "', em=" + + getEm().map(UniqueEntity::getUuid).map(UUID::toString).orElse("") + '}'; } @@ -121,11 +144,13 @@ public abstract static class SystemParticipantInputCopyBuilder< private NodeInput node; private ReactivePowerCharacteristic qCharacteristics; + private EmInput em; protected SystemParticipantInputCopyBuilder(SystemParticipantInput entity) { super(entity); this.node = entity.getNode(); this.qCharacteristics = entity.getqCharacteristics(); + this.em = entity.getEm().orElse(null); } public B node(NodeInput node) { @@ -138,6 +163,11 @@ public B qCharacteristics(ReactivePowerCharacteristic qCharacteristics) { return thisInstance(); } + public B em(EmInput em) { + this.em = em; + return thisInstance(); + } + protected NodeInput getNode() { return node; } @@ -146,6 +176,11 @@ protected ReactivePowerCharacteristic getqCharacteristics() { return qCharacteristics; } + /** @return The {@link EmInput} controlling this system participant. CAN BE NULL. */ + public EmInput getEm() { + return em; + } + @Override public abstract SystemParticipantInput build(); diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java index d5c5122d5..05d170e59 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -31,6 +32,7 @@ public class WecInput extends SystemParticipantInput implements HasType { * @param operationTime Time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of this WEC * @param marketReaction Is this asset market oriented? */ @@ -41,9 +43,10 @@ public WecInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, WecTypeInput type, boolean marketReaction) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.type = type; this.marketReaction = marketReaction; } @@ -55,6 +58,7 @@ public WecInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of this WEC * @param marketReaction Is this asset market oriented? */ @@ -63,9 +67,10 @@ public WecInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + EmInput em, WecTypeInput type, boolean marketReaction) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.type = type; this.marketReaction = marketReaction; } @@ -112,7 +117,8 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + '\'' + + "', em=" + + getEm() + ", type=" + type.getUuid() + ", marketReaction=" @@ -148,6 +154,7 @@ public WecInput build() { getOperationTime(), getNode(), getqCharacteristics(), + getEm(), type, marketReaction); } diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java index d27667b8f..0935b4b5b 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java @@ -5,12 +5,13 @@ */ package edu.ie3.datamodel.models.result.system; +import edu.ie3.datamodel.models.input.EmInput; import java.time.ZonedDateTime; import java.util.UUID; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; -/** Represents calculation results of an {@link edu.ie3.datamodel.models.input.system.EmInput} */ +/** Represents calculation results of an {@link EmInput} */ public class EmResult extends SystemParticipantResult { /** diff --git a/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java b/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java index a482ce658..4778fabea 100644 --- a/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java +++ b/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java @@ -77,7 +77,6 @@ public static JointGridContainer updateGridWithNodes( grid.getGridName(), updatedEntities.rawGridElements(), updatedEntities.systemParticipants(), - grid.getEmUnits(), updatedEntities.graphicElements()); } @@ -113,7 +112,6 @@ public static SubGridContainer updateGridWithNodes( grid.getSubnet(), updatedEntities.rawGridElements(), updatedEntities.systemParticipants(), - grid.getEmUnits(), updatedEntities.graphicElements()); } diff --git a/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java b/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java index eb8d431ff..5033221a2 100644 --- a/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java @@ -501,7 +501,6 @@ 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 @@ -510,8 +509,7 @@ public static SubGridTopologyGraph buildSubGridTopologyGraph( /* Build the single sub grid models */ HashMap subgrids = - buildSubGridContainers( - gridName, subnetNumbers, rawGrid, systemParticipants, energyManagementUnits, graphics); + buildSubGridContainers(gridName, subnetNumbers, rawGrid, systemParticipants, graphics); /* Build the graph structure denoting the topology of the grid */ return buildSubGridTopologyGraph(subgrids, rawGrid); @@ -542,7 +540,6 @@ private static HashMap buildSubGridContainers( SortedSet subnetNumbers, RawGridElements rawGrid, SystemParticipants systemParticipants, - EnergyManagementUnits energyManagementUnits, GraphicElements graphics) throws InvalidGridException { HashMap subGrids = new HashMap<>(subnetNumbers.size()); @@ -555,12 +552,7 @@ private static HashMap buildSubGridContainers( subGrids.put( subnetNumber, new SubGridContainer( - gridName, - subnetNumber, - rawGridElements, - systemParticipantElements, - energyManagementUnits, - graphicElements)); + gridName, subnetNumber, rawGridElements, systemParticipantElements, graphicElements)); } return subGrids; } @@ -812,9 +804,6 @@ 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() @@ -823,12 +812,7 @@ public static JointGridContainer combineToJointGrid( SubGridTopologyGraph subGridTopologyGraph = buildSubGridTopologyGraph(subGridMapping, rawGrid); return new JointGridContainer( - gridName, - rawGrid, - systemParticipants, - energyManagementUnits, - graphicElements, - subGridTopologyGraph); + gridName, rawGrid, systemParticipants, graphicElements, subGridTopologyGraph); } /** @@ -1001,7 +985,6 @@ 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/extractor/ExtractorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy index 20d14f658..c380d2418 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy @@ -145,7 +145,7 @@ class ExtractorTest extends Specification { given: def sampleFixedFeedInput = new FixedFeedInInput(UUID.fromString("717af017-cc69-406f-b452-e022d7fb516a"), "test_fixedFeedInInput", OperatorInput.NO_OPERATOR_ASSIGNED, - sptd.fixedFeedInInput.operationTime, sptd.fixedFeedInInput.node, sptd.fixedFeedInInput.qCharacteristics, + sptd.fixedFeedInInput.operationTime, sptd.fixedFeedInInput.node, sptd.fixedFeedInInput.qCharacteristics, sptd.fixedFeedInInput.em.orElse(null), sptd.fixedFeedInInput.sRated,sptd.fixedFeedInInput.cosPhiRated) expect: Extractor.extractElements(sampleFixedFeedInput) as Set == [ diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy index 48b7a5410..bd9e10266 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy @@ -9,6 +9,7 @@ import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.BmInput @@ -48,11 +49,12 @@ class BmInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = BmInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(BmTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) then: input.success @@ -72,6 +74,7 @@ class BmInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput assert !marketReaction assert costControlled diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy index eba32b0f9..aedb04fce 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy @@ -8,6 +8,7 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.ChpInput @@ -47,13 +48,14 @@ class ChpInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = ChpInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(ChpTypeInput) def thermalBusInput = Mock(ThermalBusInput) def thermalStorageInput = Mock(ThermalStorageInput) when: Try input = inputFactory.get( - new ChpInputEntityData(parameter, operatorInput, nodeInput, typeInput, thermalBusInput, thermalStorageInput)) + new ChpInputEntityData(parameter, operatorInput, nodeInput, emUnit, typeInput, thermalBusInput, thermalStorageInput)) then: input.success @@ -73,6 +75,7 @@ class ChpInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput assert marketReaction } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy index 707a71ccd..673185c12 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy @@ -6,16 +6,13 @@ package edu.ie3.datamodel.io.factory.input.participant import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.AssetInputEntityData -import edu.ie3.datamodel.models.ControlStrategy -import edu.ie3.datamodel.models.EmControlStrategy +import edu.ie3.datamodel.io.factory.input.EmAssetInputEntityData +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.utils.Try import spock.lang.Specification import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless class EmInputFactoryTest extends Specification { @@ -28,7 +25,7 @@ class EmInputFactoryTest extends Specification { inputFactory.supportedClasses == expectedClasses } - def "A EmInputFactory should parse a valid EmInput correctly"() { + def "A EmInputFactory should parse a valid EmInput with parent EM correctly"() { given: def inputFactory = new EmInputFactory() Map parameter = [ @@ -36,15 +33,15 @@ class EmInputFactoryTest extends Specification { "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", "id" : "TestID", - "connectedassets" : "4e840ea0-fb72-422e-942f-4111312e9914 a17aa6f0-e663-4186-ac34-a7b68573938b", - "controlstrategy" : "self_optimization" + "controlstrategy" : "no_control" ] def inputClass = EmInput def operatorInput = Mock(OperatorInput) + def parentEmUnit = Mock(EmInput) when: Try input = inputFactory.get( - new AssetInputEntityData(parameter, inputClass, operatorInput)) + new EmAssetInputEntityData(parameter, inputClass, operatorInput, parentEmUnit)) then: input.success @@ -57,15 +54,12 @@ class EmInputFactoryTest extends Specification { assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) assert operator == operatorInput assert id == parameter["id"] - assert connectedAssets == [ - UUID.fromString("4e840ea0-fb72-422e-942f-4111312e9914"), - UUID.fromString("a17aa6f0-e663-4186-ac34-a7b68573938b") - ] as UUID[] - assert controlStrategy == EmControlStrategy.SELF_OPTIMIZATION + assert controlStrategy == parameter["controlstrategy"] + assert parentEm == Optional.of(parentEmUnit) } } - def "A EmInputFactory should parse a valid EmInput with zero connected assets correctly"() { + def "A EmInputFactory should parse a valid EmInput without parent EM correctly"() { given: def inputFactory = new EmInputFactory() Map parameter = [ @@ -73,15 +67,14 @@ class EmInputFactoryTest extends Specification { "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", "id" : "TestID", - "connectedassets" : "", - "controlstrategy" : "self_optimization" + "controlstrategy" : "no_control" ] def inputClass = EmInput def operatorInput = Mock(OperatorInput) when: Try input = inputFactory.get( - new AssetInputEntityData(parameter, inputClass, operatorInput)) + new EmAssetInputEntityData(parameter, inputClass, operatorInput, null)) then: input.success @@ -94,40 +87,28 @@ class EmInputFactoryTest extends Specification { assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) assert operator == operatorInput assert id == parameter["id"] - assert connectedAssets == [] as UUID[] - assert controlStrategy == EmControlStrategy.SELF_OPTIMIZATION + assert controlStrategy == parameter["controlstrategy"] + assert parentEm == Optional.empty() } } - def "A EmInputFactory should use a default control strategy if value cannot be parsed"() { + def "A EmInputFactory should fail when passing an invalid UUID"() { given: def inputFactory = new EmInputFactory() Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "uuid" : "- broken -", "id" : "TestID", - "connectedassets" : "4e840ea0-fb72-422e-942f-4111312e9914", - "controlstrategy" : " -- invalid --" + "controlstrategy" : "no_control" ] def inputClass = EmInput def operatorInput = Mock(OperatorInput) when: Try input = inputFactory.get( - new AssetInputEntityData(parameter, inputClass, operatorInput)) + new EmAssetInputEntityData(parameter, inputClass, operatorInput, null)) then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.empty - assert operationTime.endDate.empty - assert operator == operatorInput - assert id == parameter["id"] - assert connectedAssets == [ - UUID.fromString("4e840ea0-fb72-422e-942f-4111312e9914") - ] as UUID[] - assert controlStrategy == ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY - } + input.failure + input.exception.get().cause.message == "Exception while trying to parse UUID of field \"uuid\" with value \"- broken -\"" } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy index 34a68ea5c..b9c492de7 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy @@ -8,6 +8,7 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.EvInput @@ -44,11 +45,12 @@ class EvInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(EvTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) then: input.success @@ -68,6 +70,7 @@ class EvInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy index 5aecd6b73..c7faf7697 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.input.participant import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.EvcsInput @@ -55,10 +55,11 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvcsInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) + new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) then: input.success @@ -78,6 +79,7 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PowerSystemUnits.PU), Quantities.getQuantity(1d, PowerSystemUnits.PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == ChargingPointTypeUtils.HouseholdSocket assert chargingPoints == Integer.parseInt(parameter["chargingpoints"]) assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) @@ -104,10 +106,11 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvcsInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) + new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) then: input.failure @@ -132,10 +135,11 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvcsInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) + new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) then: input.failure diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy index 9a3701d58..c7c8bbfa3 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy @@ -8,8 +8,8 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.FixedFeedInInput @@ -47,9 +47,10 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe def inputClass = FixedFeedInInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) when: - Try input = inputFactory.get(new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) + Try input = inputFactory.get(new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) then: input.success @@ -68,6 +69,7 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) } @@ -88,6 +90,10 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe "0: [cosPhiRated, id, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, q_characteristics, s_rated, uuid]\n" + "1: [cosPhiRated, id, operatesFrom, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_from, q_characteristics, s_rated, uuid]\n" + "2: [cosPhiRated, id, operatesUntil, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_until, q_characteristics, s_rated, uuid]\n" + - "3: [cosPhiRated, id, operatesFrom, operatesUntil, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_from, operates_until, q_characteristics, s_rated, uuid]\n" + "3: [cosPhiRated, id, operatesFrom, operatesUntil, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_from, operates_until, q_characteristics, s_rated, uuid]\n" + + "4: [cosPhiRated, em, id, qCharacteristics, sRated, uuid] or [cos_phi_rated, em, id, q_characteristics, s_rated, uuid]\n" + + "5: [cosPhiRated, em, id, operatesFrom, qCharacteristics, sRated, uuid] or [cos_phi_rated, em, id, operates_from, q_characteristics, s_rated, uuid]\n" + + "6: [cosPhiRated, em, id, operatesUntil, qCharacteristics, sRated, uuid] or [cos_phi_rated, em, id, operates_until, q_characteristics, s_rated, uuid]\n" + + "7: [cosPhiRated, em, id, operatesFrom, operatesUntil, qCharacteristics, sRated, uuid] or [cos_phi_rated, em, id, operates_from, operates_until, q_characteristics, s_rated, uuid]\n" } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy index a24587257..550a088fc 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy @@ -8,6 +8,7 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.HpInput @@ -45,12 +46,13 @@ class HpInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = HpInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(HpTypeInput) def thermalBusInput = Mock(ThermalBusInput) when: Try input = inputFactory.get( - new HpInputEntityData(parameter, operatorInput, nodeInput, typeInput, thermalBusInput)) + new HpInputEntityData(parameter, operatorInput, nodeInput, emUnit, typeInput, thermalBusInput)) then: input.success @@ -70,6 +72,7 @@ class HpInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput assert thermalBus == thermalBusInput } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy index 910d59195..c0bc33bfa 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy @@ -8,9 +8,9 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.LoadInput @@ -38,6 +38,7 @@ class LoadInputFactoryTest extends Specification implements FactoryTestHelper { given: "a system participant input type factory and model data" def inputClass = LoadInput def nodeInput = Mock(NodeInput) + def emUnit = Mock(EmInput) when: def inputFactory = new LoadInputFactory() @@ -52,7 +53,7 @@ class LoadInputFactoryTest extends Specification implements FactoryTestHelper { "cosphirated" : "5" ] Try input = inputFactory.get( - new NodeAssetInputEntityData(parameter, inputClass, nodeInput)) + new SystemParticipantEntityData(parameter, inputClass, nodeInput, emUnit)) then: input.success @@ -69,6 +70,7 @@ class LoadInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert loadProfile == profile assert dsm assert eConsAnnual == getQuant(parameter["econsannual"], StandardUnits.ENERGY_IN) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy index a3a6d42ae..8ea8a4cf8 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy @@ -8,8 +8,8 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.PvInput @@ -54,10 +54,11 @@ class PvInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = PvInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) + new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) then: input.success @@ -77,6 +78,7 @@ class PvInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert albedo == Double.parseDouble(parameter["albedo"]) assert azimuth == getQuant(parameter["azimuth"], StandardUnits.AZIMUTH) assert etaConv == getQuant(parameter["etaconv"], StandardUnits.EFFICIENCY) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy index 453e294f2..d20685662 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy @@ -8,6 +8,7 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.StorageInput @@ -44,11 +45,12 @@ class StorageInputFactoryTest extends Specification implements FactoryTestHelper def inputClass = StorageInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(StorageTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) then: input.success @@ -68,6 +70,7 @@ class StorageInputFactoryTest extends Specification implements FactoryTestHelper new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy index e97d47a09..d258837ec 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy @@ -8,6 +8,7 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.WecInput @@ -45,11 +46,12 @@ class WecInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = WecInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(WecTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) then: input.success @@ -68,6 +70,7 @@ class WecInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput assert marketReaction } diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index f3e89647b..f34873c24 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.naming import edu.ie3.datamodel.io.source.TimeSeriesMappingSource +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.RandomLoadParameters @@ -20,7 +21,6 @@ import edu.ie3.datamodel.models.input.graphics.LineGraphicInput import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput import edu.ie3.datamodel.models.input.system.BmInput import edu.ie3.datamodel.models.input.system.ChpInput -import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.models.input.system.EvInput import edu.ie3.datamodel.models.input.system.EvcsInput import edu.ie3.datamodel.models.input.system.FixedFeedInInput diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index 5fffb0fa1..296be7a8c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -11,6 +11,7 @@ import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy index ac2c24ab9..0f25a83ba 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy @@ -9,6 +9,7 @@ import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.RandomLoadParameters @@ -143,9 +144,10 @@ class InputEntityProcessorTest extends Specification { def processingResult = processor.handleEntity(validInput) then: "make sure that the result is as expected " - processingResult.forEach { k, v -> + processingResult.forEach { + k, v -> if (k != "nodeInternal") // the internal 3w node is always randomly generated, hence we can skip to test on this - assert (v == expectedResult.get(k)) + assert (v == expectedResult.get(k)) } where: @@ -159,7 +161,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.fixedFeedInInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.fixedFeedInInput.operator.getUuid().toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "sRated" : SystemParticipantTestData.fixedFeedInInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString() + "sRated" : SystemParticipantTestData.fixedFeedInInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString(), + "em" : SystemParticipantTestData.fixedFeedInInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] PvInput | SystemParticipantTestData.pvInput || [ "uuid" : SystemParticipantTestData.pvInput.uuid.toString(), @@ -177,7 +180,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.pvInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.pvInput.operator.getUuid().toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "sRated" : SystemParticipantTestData.pvInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString() + "sRated" : SystemParticipantTestData.pvInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString(), + "em" : SystemParticipantTestData.pvInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] WecInput | SystemParticipantTestData.wecInput || [ "uuid" : SystemParticipantTestData.wecInput.uuid.toString(), @@ -188,7 +192,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.wecInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.wecInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.cosPhiPSerialized, - "type" : SystemParticipantTestData.wecInput.type.uuid.toString() + "type" : SystemParticipantTestData.wecInput.type.uuid.toString(), + "em" : SystemParticipantTestData.wecInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] ChpInput | SystemParticipantTestData.chpInput || [ "uuid" : SystemParticipantTestData.chpInput.uuid.toString(), @@ -202,6 +207,7 @@ class InputEntityProcessorTest extends Specification { "thermalBus" : SystemParticipantTestData.chpInput.thermalBus.uuid.toString(), "thermalStorage" : SystemParticipantTestData.chpInput.thermalStorage.uuid.toString(), "type" : SystemParticipantTestData.chpInput.type.uuid.toString(), + "em" : SystemParticipantTestData.chpInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] BmInput | SystemParticipantTestData.bmInput || [ "uuid" : SystemParticipantTestData.bmInput.uuid.toString(), @@ -214,7 +220,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.bmInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.bmInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.qVSerialized, - "type" : SystemParticipantTestData.bmInput.type.uuid.toString() + "type" : SystemParticipantTestData.bmInput.type.uuid.toString(), + "em" : SystemParticipantTestData.bmInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] EvInput | SystemParticipantTestData.evInput || [ "uuid" : SystemParticipantTestData.evInput.uuid.toString(), @@ -224,7 +231,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.evInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.evInput.operator.getUuid().toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "type" : SystemParticipantTestData.evInput.type.getUuid().toString() + "type" : SystemParticipantTestData.evInput.type.getUuid().toString(), + "em" : SystemParticipantTestData.evInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] LoadInput | SystemParticipantTestData.loadInput || [ @@ -239,7 +247,8 @@ class InputEntityProcessorTest extends Specification { "operator" : SystemParticipantTestData.loadInput.operator.uuid.toString(), "qCharacteristics" : SystemParticipantTestData.cosPhiFixedSerialized, "sRated" : SystemParticipantTestData.loadInput.sRated.getValue().doubleValue().toString(), - "loadProfile" : SystemParticipantTestData.loadInput.loadProfile.key + "loadProfile" : SystemParticipantTestData.loadInput.loadProfile.key, + "em" : SystemParticipantTestData.loadInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] StorageInput | SystemParticipantTestData.storageInput || [ "uuid" : SystemParticipantTestData.storageInput.uuid.toString(), @@ -249,7 +258,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.storageInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.storageInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "type" : SystemParticipantTestData.storageInput.type.uuid.toString() + "type" : SystemParticipantTestData.storageInput.type.uuid.toString(), + "em" : SystemParticipantTestData.storageInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] HpInput | SystemParticipantTestData.hpInput || [ "uuid" : SystemParticipantTestData.hpInput.uuid.toString(), @@ -260,7 +270,8 @@ class InputEntityProcessorTest extends Specification { "operator" : SystemParticipantTestData.hpInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, "thermalBus" : SystemParticipantTestData.hpInput.thermalBus.uuid.toString(), - "type" : SystemParticipantTestData.hpInput.type.uuid.toString() + "type" : SystemParticipantTestData.hpInput.type.uuid.toString(), + "em" : SystemParticipantTestData.hpInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] EvcsInput | SystemParticipantTestData.evcsInput || [ "uuid" : SystemParticipantTestData.evcsInput.uuid.toString(), @@ -274,7 +285,8 @@ class InputEntityProcessorTest extends Specification { "cosPhiRated" : SystemParticipantTestData.evcsInput.cosPhiRated.toString(), "chargingPoints" : SystemParticipantTestData.evcsInput.chargingPoints.toString(), "locationType" : SystemParticipantTestData.evcsInput.locationType.name(), - "v2gSupport" : SystemParticipantTestData.evcsInput.v2gSupport.toString() + "v2gSupport" : SystemParticipantTestData.evcsInput.v2gSupport.toString(), + "em" : SystemParticipantTestData.evcsInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] } @@ -354,18 +366,18 @@ class InputEntityProcessorTest extends Specification { given: InputEntityProcessor processor = new InputEntityProcessor(RandomLoadParameters) RandomLoadParameters parameters = new RandomLoadParameters( - UUID.fromString("a5b0f432-27b5-4b3e-b87a-61867b9edd79"), - 4, - 1.2, - 2.3, - 3.4, - 4.5, - 5.6, - 6.7, - 7.8, - 8.9, - 9.10 - ) + UUID.fromString("a5b0f432-27b5-4b3e-b87a-61867b9edd79"), + 4, + 1.2, + 2.3, + 3.4, + 4.5, + 5.6, + 6.7, + 7.8, + 8.9, + 9.10 + ) Map expected = [ "uuid" : "a5b0f432-27b5-4b3e-b87a-61867b9edd79", "quarterHour": "4", @@ -617,14 +629,14 @@ class InputEntityProcessorTest extends Specification { given: InputEntityProcessor processor = new InputEntityProcessor(NodeInput) def nodeWithOutOperator = new NodeInput( - UUID.fromString("6e0980e0-10f2-4e18-862b-eb2b7c90509b"), "node_d", OperatorInput.NO_OPERATOR_ASSIGNED, - OperationTime.notLimited() - , - Quantities.getQuantity(1d, PU), - false, - null, - GermanVoltageLevelUtils.MV_20KV, - 4) + UUID.fromString("6e0980e0-10f2-4e18-862b-eb2b7c90509b"), "node_d", OperatorInput.NO_OPERATOR_ASSIGNED, + OperationTime.notLimited() + , + Quantities.getQuantity(1d, PU), + false, + null, + GermanVoltageLevelUtils.MV_20KV, + 4) Map expected = [ "geoPosition" : "", 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 6c98e7b53..21c527359 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -17,6 +17,7 @@ import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.connector.LineInput @@ -25,7 +26,6 @@ import edu.ie3.datamodel.models.input.connector.type.LineTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput import edu.ie3.datamodel.models.input.graphics.LineGraphicInput import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput -import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.models.input.system.EvcsInput import edu.ie3.datamodel.models.input.system.LoadInput import edu.ie3.datamodel.models.input.system.PvInput @@ -45,7 +45,6 @@ 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.EnergyManagementTestData import edu.ie3.test.common.GridTestData import edu.ie3.test.common.SampleJointGrid import edu.ie3.test.common.SystemParticipantTestData @@ -171,7 +170,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { ThermalUnitInputTestData.thermalHouseInput, SystemParticipantTestData.evcsInput, SystemParticipantTestData.loadInput, - EnergyManagementTestData.emInput + SystemParticipantTestData.emInput ]) csvFileSink.shutdown() @@ -252,6 +251,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { OperationTime.notLimited(), Mock(NodeInput), new CosPhiFixed("cosPhiFixed:{(0.0,0.95)}"), + Mock(EmInput), 0.2, Quantities.getQuantity(-8.926613807678223, DEGREE_GEOM), Quantities.getQuantity(95d, PERCENT), diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy new file mode 100644 index 000000000..288c6be0a --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy @@ -0,0 +1,284 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.source + +import static edu.ie3.test.helper.EntityMap.map + +import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.exceptions.SourceException +import edu.ie3.datamodel.io.factory.input.AssetInputEntityData +import edu.ie3.datamodel.models.input.EmInput +import edu.ie3.datamodel.utils.Try +import spock.lang.Specification + +import java.util.stream.Stream + +class EnergyManagementSourceTest extends Specification { + + def "An EnergyManagementSource should construct hierarchical EmInputs with two branches as expected"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-0", + "id": "root", + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "child 1", + "parentem" : "0-0-0-0-0", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-11", + "id": "child 1-1", + "parentem" : "0-0-0-0-1", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "child 2", + "parentem" : "0-0-0-0-0", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-21", + "id": "child 2-1", + "parentem" : "0-0-0-0-2", + "controlstrategy" : ""], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException)) + + expect: + def emUnits = EnergyManagementSource.createEmInputs(assetEntityDataStream) + + def expectedRootEm = new EmInput( + UUID.fromString("0-0-0-0-0"), + "root", + "", + null + ) + def expectedEm1 = new EmInput( + UUID.fromString("0-0-0-0-1"), + "child 1", + "", + expectedRootEm + ) + def expectedEm11 = new EmInput( + UUID.fromString("0-0-0-0-11"), + "child 1-1", + "", + expectedEm1 + ) + def expectedEm2 = new EmInput( + UUID.fromString("0-0-0-0-2"), + "child 2", + "", + expectedRootEm + ) + def expectedEm21 = new EmInput( + UUID.fromString("0-0-0-0-21"), + "child 2-1", + "", + expectedEm2 + ) + + emUnits == map([expectedRootEm, expectedEm1, expectedEm11, expectedEm2, expectedEm21]) + } + + def "An EnergyManagementSource should construct flat EmInputs without hierarchy as expected"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "em 2", + "parentem" : "", + "controlstrategy" : "strat_b"], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-3", + "id": "em 3", + "parentem" : "", + "controlstrategy" : "other"], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException)) + + expect: + def emUnits = EnergyManagementSource.createEmInputs(assetEntityDataStream) + + def expectedEm1 = new EmInput( + UUID.fromString("0-0-0-0-1"), + "em 1", + "", + null + ) + def expectedEm2 = new EmInput( + UUID.fromString("0-0-0-0-2"), + "em 2", + "strat_b", + null + ) + def expectedEm3 = new EmInput( + UUID.fromString("0-0-0-0-3"), + "em 3", + "other", + null + ) + + emUnits == map([expectedEm1, expectedEm2, expectedEm3]) + } + + def "An EnergyManagementSource should fail if any entity data already failed before"() { + given: + def assetEntityDataStream = Stream.of( + new Try.Success(new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "", + "controlstrategy" : ""], + EmInput + )), + new Try.Success(new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "em 2", + "parentem" : "", + "controlstrategy" : ""], + EmInput + )), + new Try.Failure(new SourceException("test failure abc")) + ) + + when: + EnergyManagementSource.createEmInputs(assetEntityDataStream) + + then: + def exc = thrown(SourceException) + exc.cause.message.contains("test failure abc") + } + + def "An EnergyManagementSource should fail if a parent EM UUID is malformed"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "em 2", + "parentem" : "not-a-uuid", + "controlstrategy" : ""], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException)) + + when: + EnergyManagementSource.createEmInputs(assetEntityDataStream) + + then: + def exc = thrown(SourceException) + exc.cause.message.contains("Exception while trying to parse UUID of field \"parentem\" with value \"not-a-uuid\"") + } + + def "An EnergyManagementSource should fail if the factory fails for one EM"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", // id is missing + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException)) + + when: + EnergyManagementSource.createEmInputs(assetEntityDataStream) + + then: + def exc = thrown(SourceException) + exc.cause.message.contains("An error occurred when creating instance of EmInput") + exc.cause.cause.class == FactoryException + } + + def "An EnergyManagementSource should fail if a parent em is not provided"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "em 2", + "parentem" : "1-2-3-4-5", // does not exist + "controlstrategy" : ""], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException)) + + when: + EnergyManagementSource.createEmInputs(assetEntityDataStream) + + then: + def exc = thrown(SourceException) + exc.message.contains("were assigned a parent EM that does not exist.") + } + + def "An EnergyManagementSource should fail if no parent ems are provided"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "1-2-3-4-5", // does not exist + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "em 2", + "parentem" : "1-2-3-4-5", // does not exist + "controlstrategy" : ""], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException)) + + when: + EnergyManagementSource.createEmInputs(assetEntityDataStream) + + then: + def exc = thrown(SourceException) + exc.message.contains("were assigned a parent EM that does not exist.") + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy index befb7154c..f5cbc5bc0 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy @@ -16,6 +16,7 @@ import edu.ie3.datamodel.io.factory.input.participant.ChpInputEntityData import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantTypedEntityData import edu.ie3.datamodel.io.source.csv.CsvDataSource import edu.ie3.datamodel.models.input.AssetInput +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.system.ChpInput import edu.ie3.datamodel.models.input.system.type.ChpTypeInput @@ -81,7 +82,7 @@ class EntitySourceTest extends Specification { "t_bus" : sptd.thermalBus.uuid.toString(), "t_storage" : sptd.thermalStorage.uuid.toString() ] - def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput, sptd.participantNode, sptd.chpTypeInput) + def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput, sptd.participantNode, null, sptd.chpTypeInput) Map busMap = map([sptd.thermalBus]) Map storageMap = map([sptd.thermalStorage]) @@ -99,7 +100,7 @@ class EntitySourceTest extends Specification { "t_bus" : sptd.thermalBus.uuid.toString(), "t_storage" : "8851813b-3a7d-4fee-874b-4df9d724e4b4" ] - def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput, sptd.participantNode, sptd.chpTypeInput) + def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput, sptd.participantNode, null, sptd.chpTypeInput) Map busMap = map([sptd.thermalBus]) Map storageMap = map([sptd.thermalStorage]) @@ -115,34 +116,34 @@ class EntitySourceTest extends Specification { def "An EntitySource should find a linked entity, if it was provided"() { given: Map parameter = [ - "linked_entity" : sptd.chpTypeInput.uuid.toString(), + "linked_entity" : sptd.emInput.uuid.toString(), ] def entityData = new EntityData(parameter, AssetInput) - Map entityMap = map([sptd.chpTypeInput]) + Map entityMap = map([sptd.emInput]) when: def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) then: - result == new Try.Success(sptd.chpTypeInput) + result == new Try.Success(sptd.emInput) } def "An EntitySource trying to find a linked entity should fail, if no matching linked entity was provided"() { given: Map parameter = [ - "linked_entity" : "5ebd8f7e-dedb-4017-bb86-6373c4b60000", + "linked_entity" : sptd.parentEm.uuid.toString(), ] def entityData = new EntityData(parameter, AssetInput) - Map entityMap = map([sptd.chpTypeInput]) + Map entityMap = map([sptd.emInput]) when: def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) then: result.isFailure() - result.getException().get().message == "Linked linked_entity with UUID 5ebd8f7e-dedb-4017-bb86-6373c4b60000 was not found for entity EntityData{fieldsToAttributes={linked_entity=5ebd8f7e-dedb-4017-bb86-6373c4b60000}, targetClass=class edu.ie3.datamodel.models.input.AssetInput}" + result.getException().get().message == "Linked linked_entity with UUID 897bfc17-8e54-43d0-8d98-740786fd94dd was not found for entity EntityData{fieldsToAttributes={linked_entity=897bfc17-8e54-43d0-8d98-740786fd94dd}, targetClass=class edu.ie3.datamodel.models.input.AssetInput}" } def "An EntitySource trying to find a linked entity should fail, if corresponding UUID is malformed"() { @@ -152,7 +153,7 @@ class EntitySourceTest extends Specification { ] def entityData = new EntityData(parameter, AssetInput) - Map entityMap = map([sptd.chpTypeInput]) + Map entityMap = map([sptd.emInput]) when: def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy index 402b657be..57e7a5566 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy @@ -10,6 +10,7 @@ import static edu.ie3.test.helper.EntityMap.map import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.io.factory.input.participant.ChpInputEntityData import edu.ie3.datamodel.io.factory.input.participant.HpInputEntityData +import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantEntityData import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantTypedEntityData import edu.ie3.datamodel.models.input.system.ChpInput import edu.ie3.datamodel.models.input.system.HpInput @@ -23,9 +24,33 @@ import java.util.stream.Stream class SystemParticipantSourceTest extends Specification { + def "A SystemParticipantSource should build system participant entity from valid and invalid input data as expected"() { + given: + def nodeAssetInputEntityData = Stream.of(new Try.Success<>(new NodeAssetInputEntityData(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node))) + + when: + def sysPartEntityDataStream = SystemParticipantSource.systemParticipantEntityStream(nodeAssetInputEntityData, map(emUnits)) + + then: + def element = sysPartEntityDataStream.findFirst().get() + element.success == resultIsPresent + element.data.ifPresent({ + typedEntityData -> + assert (typedEntityData == resultData) + }) + + where: + emUnits | fieldsToAttributes || resultIsPresent || resultData + [] | ["em": "977157f4-25e5-4c72-bf34-440edc778792"] || false || null + [SystemParticipantTestData.emInput] | ["bla": "foo"] || true || new SystemParticipantEntityData(["bla": "foo"], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null) + [SystemParticipantTestData.emInput] | [:] || true || new SystemParticipantEntityData([:], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null) + [SystemParticipantTestData.emInput] | ["em": "977157f4-25e5-4c72-bf34-440edc778793"] || false || null + [SystemParticipantTestData.emInput] | ["em": "977157f4-25e5-4c72-bf34-440edc778792"] || true || new SystemParticipantEntityData([:], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.emInput) + } + def "A SystemParticipantSource should build typed entity from valid and invalid input data as expected"() { given: - def systemParticipantEntityData = Stream.of(new Try.Success<>(new NodeAssetInputEntityData(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node))) + def systemParticipantEntityData = Stream.of(new Try.Success<>(new SystemParticipantEntityData(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null))) when: def typedEntityDataStream = SystemParticipantSource.typedSystemParticipantEntityStream(systemParticipantEntityData, map(types)) @@ -44,12 +69,12 @@ class SystemParticipantSourceTest extends Specification { [SystemParticipantTestData.chpTypeInput] | ["bla": "foo"] || false || null [SystemParticipantTestData.chpTypeInput] | [:] || false || null [SystemParticipantTestData.chpTypeInput] | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb9"] || false || null - [SystemParticipantTestData.chpTypeInput] | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb8"] || true || new SystemParticipantTypedEntityData<>([:], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.chpTypeInput) + [SystemParticipantTestData.chpTypeInput] | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb8"] || true || new SystemParticipantTypedEntityData<>([:], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null, SystemParticipantTestData.chpTypeInput) } def "A SystemParticipantSource should build hp input entity from valid and invalid input data as expected"() { given: - def sysPartTypedEntityData = Stream.of(new Try.Success<>(new SystemParticipantTypedEntityData<>(fieldsToAttributes, HpInput, SystemParticipantTestData.hpInput.operator, SystemParticipantTestData.hpInput.node, SystemParticipantTestData.hpTypeInput))) + def sysPartTypedEntityData = Stream.of(new Try.Success<>(new SystemParticipantTypedEntityData<>(fieldsToAttributes, HpInput, SystemParticipantTestData.hpInput.operator, SystemParticipantTestData.hpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.hpTypeInput))) when: def hpInputEntityDataOpt = SystemParticipantSource.hpEntityStream(sysPartTypedEntityData, map(thermalBuses)) @@ -68,12 +93,12 @@ class SystemParticipantSourceTest extends Specification { [SystemParticipantTestData.hpInput.thermalBus] | ["bla": "foo"] || false || null [SystemParticipantTestData.hpInput.thermalBus] | [:] || false || null [SystemParticipantTestData.hpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384f"] || false || null - [SystemParticipantTestData.hpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e"] || true || new HpInputEntityData([:], SystemParticipantTestData.hpInput.operator, SystemParticipantTestData.hpInput.node, SystemParticipantTestData.hpTypeInput, SystemParticipantTestData.hpInput.thermalBus) + [SystemParticipantTestData.hpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e"] || true || new HpInputEntityData([:], SystemParticipantTestData.hpInput.operator, SystemParticipantTestData.hpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.hpTypeInput, SystemParticipantTestData.hpInput.thermalBus) } def "A SystemParticipantSource should build chp input entity from valid and invalid input data as expected"(List thermalStorages, List thermalBuses, Map fieldsToAttributes, boolean resultIsPresent, ChpInputEntityData resultData) { given: - def sysPartTypedEntityData = Stream.of(new Try.Success<>(new SystemParticipantTypedEntityData<>(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.chpTypeInput))) + def sysPartTypedEntityData = Stream.of(new Try.Success<>(new SystemParticipantTypedEntityData<>(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.chpTypeInput))) when: def hpInputEntityDataOpt = SystemParticipantSource.chpEntityStream(sysPartTypedEntityData, map(thermalStorages), map(thermalBuses)) @@ -91,6 +116,6 @@ class SystemParticipantSourceTest extends Specification { [] | [] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e", "thermalStorage": "8851813b-3a7d-4fee-874b-4df9d724e4b3"] || false | null [SystemParticipantTestData.chpInput.thermalStorage] | [SystemParticipantTestData.chpInput.thermalBus] | ["bla": "foo"] || false | null [SystemParticipantTestData.chpInput.thermalStorage] | [SystemParticipantTestData.chpInput.thermalBus] | [:] || false | null - [SystemParticipantTestData.chpInput.thermalStorage] | [SystemParticipantTestData.chpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e", "thermalStorage": "8851813b-3a7d-4fee-874b-4df9d724e4b3"] || true | new ChpInputEntityData([:], SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.chpTypeInput, SystemParticipantTestData.chpInput.thermalBus, SystemParticipantTestData.chpInput.thermalStorage) + [SystemParticipantTestData.chpInput.thermalStorage] | [SystemParticipantTestData.chpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e", "thermalStorage": "8851813b-3a7d-4fee-874b-4df9d724e4b3"] || true | new ChpInputEntityData([:], SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.chpTypeInput, SystemParticipantTestData.chpInput.thermalBus, SystemParticipantTestData.chpInput.thermalStorage) } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy index 9f39f91f3..66b4f193f 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy @@ -90,7 +90,8 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { "q_characteristics", "e_cons_annual", "operator", - "dsm" + "dsm", + "em" ] as Set } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy index 15e528a93..7f5cb7124 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy @@ -12,7 +12,7 @@ import edu.ie3.datamodel.io.source.EnergyManagementSource import edu.ie3.datamodel.io.source.TypeSource import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.utils.Try -import edu.ie3.test.common.EnergyManagementTestData +import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification class CsvEnergyManagementSourceTest extends Specification implements CsvTestDataMeta { @@ -23,13 +23,13 @@ class CsvEnergyManagementSourceTest extends Specification implements CsvTestData Mock(TypeSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - Map operatorMap = map([EnergyManagementTestData.emInput.operator]) + Map operatorMap = map([SystemParticipantTestData.emInput.operator]) expect: def emUnits = Try.of(() -> csvEnergyManagementSource.getEmUnits(operatorMap), SourceException) emUnits.success - emUnits.data.get().emUnits.size() == 1 - emUnits.data.get().emUnits == [EnergyManagementTestData.emInput] as Set + emUnits.data.get().size() == 2 + emUnits.data.get() == map([SystemParticipantTestData.emInput, SystemParticipantTestData.parentEm]) } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy index 6d409422e..91486c5eb 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy @@ -23,10 +23,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, fileNamingStrategy)) def thermalSource = new ThermalSource(typeSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def rawGridSource = new RawGridSource(typeSource, new CsvDataSource(csvSep, gridDefaultFolderPath, fileNamingStrategy)) + def energyManagementSource = new EnergyManagementSource(typeSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def csvSystemParticipantSource = new SystemParticipantSource( typeSource, thermalSource, rawGridSource, + energyManagementSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) when: @@ -59,10 +61,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat getNodes() >> [:] getNodes(_) >> [:] } as RawGridSource + def energyManagementSource = new EnergyManagementSource(typeSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def csvSystemParticipantSource = new SystemParticipantSource( typeSource, thermalSource, rawGridSource, + energyManagementSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) when: @@ -86,50 +90,52 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - def nodeMap = map([sptd.participantNode]) def operatorMap = map([sptd.operator]) + def nodeMap = map([sptd.participantNode]) + def emUnitsMap = map([sptd.emInput]) def thermalBusMap = map([sptd.thermalBus]) def thermalStorageMap = map([sptd.thermalStorage]) expect: - def heatPumps = Try.of(() -> csvSystemParticipantSource.getHeatPumps(operatorMap, nodeMap, map([sptd.hpTypeInput]), thermalBusMap), SourceException) + def heatPumps = Try.of(() -> csvSystemParticipantSource.getHeatPumps(operatorMap, nodeMap, emUnitsMap, map([sptd.hpTypeInput]), thermalBusMap), SourceException) heatPumps.success heatPumps.data.get() == [sptd.hpInput] as Set - def chpUnits = Try.of(() -> csvSystemParticipantSource.getChpPlants(operatorMap, nodeMap, map([sptd.chpTypeInput]), thermalBusMap, thermalStorageMap), SourceException) + def chpUnits = Try.of(() -> csvSystemParticipantSource.getChpPlants(operatorMap, nodeMap, emUnitsMap, map([sptd.chpTypeInput]), thermalBusMap, thermalStorageMap), SourceException) chpUnits.success chpUnits.data.get() == [sptd.chpInput] as Set - def evs = Try.of(() -> csvSystemParticipantSource.getEvs(operatorMap, nodeMap, map([sptd.evTypeInput])), SourceException) + def evs = Try.of(() -> csvSystemParticipantSource.getEvs(operatorMap, nodeMap, emUnitsMap, map([sptd.evTypeInput])), SourceException) evs.success evs.data.get() == [sptd.evInput] as Set - def wecs = Try.of(() -> csvSystemParticipantSource.getWecPlants(operatorMap, nodeMap, map([sptd.wecType])), SourceException) + def wecs = Try.of(() -> csvSystemParticipantSource.getWecPlants(operatorMap, nodeMap, emUnitsMap, map([sptd.wecType])), SourceException) wecs.success wecs.data.get() == [sptd.wecInput] as Set - def storages = Try.of(() -> csvSystemParticipantSource.getStorages(operatorMap, nodeMap, map([sptd.storageTypeInput])), SourceException) + def storages = Try.of(() -> csvSystemParticipantSource.getStorages(operatorMap, nodeMap, emUnitsMap, map([sptd.storageTypeInput])), SourceException) storages.success storages.data.get() == [sptd.storageInput] as Set - def bms = Try.of(() -> csvSystemParticipantSource.getBmPlants(operatorMap, nodeMap, map([sptd.bmTypeInput])), SourceException) + def bms = Try.of(() -> csvSystemParticipantSource.getBmPlants(operatorMap, nodeMap, emUnitsMap, map([sptd.bmTypeInput])), SourceException) bms.success bms.data.get() == [sptd.bmInput] as Set - def evcs = Try.of(() -> csvSystemParticipantSource.getEvcs(operatorMap, nodeMap), SourceException) + def evcs = Try.of(() -> csvSystemParticipantSource.getEvcs(operatorMap, nodeMap, emUnitsMap), SourceException) evcs.success evcs.data.get() == [sptd.evcsInput] as Set - def loads = Try.of(() -> csvSystemParticipantSource.getLoads(operatorMap, nodeMap), SourceException) + def loads = Try.of(() -> csvSystemParticipantSource.getLoads(operatorMap, nodeMap, emUnitsMap), SourceException) loads.success loads.data.get() == [sptd.loadInput] as Set - def pvs = Try.of(() -> csvSystemParticipantSource.getPvPlants(operatorMap, nodeMap), SourceException) + def pvs = Try.of(() -> csvSystemParticipantSource.getPvPlants(operatorMap, nodeMap, emUnitsMap), SourceException) pvs.success pvs.data.get() == [sptd.pvInput] as Set - def fixedFeedIns = Try.of(() -> csvSystemParticipantSource.getFixedFeedIns(operatorMap, nodeMap), SourceException) + def fixedFeedIns = Try.of(() -> csvSystemParticipantSource.getFixedFeedIns(operatorMap, nodeMap, emUnitsMap), SourceException) fixedFeedIns.success fixedFeedIns.data.get() == [sptd.fixedFeedInInput] as Set } @@ -140,18 +146,20 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def nodeMap = map([sptd.participantNode]) + def emUnitsMap = map([sptd.emInput]) expect: - def heatPumps = Try.of(() -> csvSystemParticipantSource.getHeatPumps(map(operators), nodeMap, map(types), map(thermalBuses)), SourceException) + def heatPumps = Try.of(() -> csvSystemParticipantSource.getHeatPumps(map(operators), nodeMap, emUnitsMap, map(types), map(thermalBuses)), SourceException) heatPumps.failure heatPumps.exception.get().class == SourceException where: operators | types | thermalBuses || resultingSize | resultingSet - [] | [sptd.hpInput.type] | [sptd.hpInput.thermalBus] || 1 | [new HpInput(sptd.hpInput.uuid, sptd.hpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.hpInput.operationTime, sptd.hpInput.node, sptd.hpInput.thermalBus, sptd.hpInput.qCharacteristics, sptd.hpInput.type)] + [] | [sptd.hpInput.type] | [sptd.hpInput.thermalBus] || 1 | [new HpInput(sptd.hpInput.uuid, sptd.hpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.hpInput.operationTime, sptd.hpInput.node, sptd.hpInput.thermalBus, sptd.hpInput.qCharacteristics, sptd.emInput, sptd.hpInput.type)] [] | [] | [] || 0 | [] [] | [] | [] || 0 | [] [sptd.hpInput.operator] | [] | [] || 0 | [] @@ -164,18 +172,20 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def nodeMap = map([sptd.participantNode]) + def emUnitsMap = map([sptd.emInput]) expect: - def chpUnits = Try.of(() -> csvSystemParticipantSource.getChpPlants(map(operators), nodeMap, map(types), map(thermalBuses), map(thermalStorages)), SourceException) + def chpUnits = Try.of(() -> csvSystemParticipantSource.getChpPlants(map(operators), nodeMap, emUnitsMap, map(types), map(thermalBuses), map(thermalStorages)), SourceException) chpUnits.failure chpUnits.exception.get().class == SourceException where: operators | types | thermalBuses | thermalStorages || resultingSet - [] | [sptd.chpInput.type] | [sptd.chpInput.thermalBus] | [sptd.chpInput.thermalStorage] || [new ChpInput(sptd.chpInput.uuid, sptd.chpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.chpInput.operationTime, sptd.chpInput.node, sptd.chpInput.thermalBus, sptd.chpInput.qCharacteristics, sptd.chpInput.type, sptd.chpInput.thermalStorage, sptd.chpInput.marketReaction)] + [] | [sptd.chpInput.type] | [sptd.chpInput.thermalBus] | [sptd.chpInput.thermalStorage] || [new ChpInput(sptd.chpInput.uuid, sptd.chpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.chpInput.operationTime, sptd.chpInput.node, sptd.chpInput.thermalBus, sptd.chpInput.qCharacteristics, sptd.emInput, sptd.chpInput.type, sptd.chpInput.thermalStorage, sptd.chpInput.marketReaction)] [] | [] | [] | [] as List || [] [] | [] | [] | [] as List || [] [sptd.chpInput.operator] | [] | [] | [] as List || [] @@ -188,18 +198,20 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def nodeMap = map([sptd.participantNode]) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getEvs(map(operators), nodeMap, map(types)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getEvs(map(operators), nodeMap, emUnitsMap, map(types)), SourceException) sysParts.failure sysParts.exception.get().class == SourceException where: operators | types || resultingSet - [] | [sptd.evInput.type] || [new EvInput(sptd.evInput.uuid, sptd.evInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evInput.operationTime, sptd.evInput.node, sptd.evInput.qCharacteristics, sptd.evInput.type)] + [] | [sptd.evInput.type] || [new EvInput(sptd.evInput.uuid, sptd.evInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evInput.operationTime, sptd.evInput.node, sptd.evInput.qCharacteristics, sptd.emInput, sptd.evInput.type)] [sptd.evInput.operator] | [] || [] [] | [] || [] } @@ -210,18 +222,20 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def nodeMap = map([sptd.participantNode]) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getWecPlants(map(operators), nodeMap, map(types)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getWecPlants(map(operators), nodeMap, emUnitsMap, map(types)), SourceException) sysParts.failure sysParts.exception.get().class == SourceException where: operators | types || resultingSet - [] | [sptd.wecInput.type] || [new WecInput(sptd.wecInput.uuid, sptd.wecInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.wecInput.operationTime, sptd.wecInput.node, sptd.wecInput.qCharacteristics, sptd.wecInput.type, sptd.wecInput.marketReaction)] + [] | [sptd.wecInput.type] || [new WecInput(sptd.wecInput.uuid, sptd.wecInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.wecInput.operationTime, sptd.wecInput.node, sptd.wecInput.qCharacteristics, sptd.emInput, sptd.wecInput.type, sptd.wecInput.marketReaction)] [sptd.wecInput.operator] | [] || [] [] | [] || [] } @@ -232,18 +246,20 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def nodeMap = map([sptd.participantNode]) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getStorages(map(operators), nodeMap, map(types)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getStorages(map(operators), nodeMap, emUnitsMap, map(types)), SourceException) sysParts.failure sysParts.exception.get().class == SourceException where: operators | types || resultingSet - [] | [sptd.storageInput.type] || [new StorageInput(sptd.storageInput.uuid, sptd.storageInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.storageInput.operationTime, sptd.storageInput.node, sptd.storageInput.qCharacteristics, sptd.storageInput.type)] + [] | [sptd.storageInput.type] || [new StorageInput(sptd.storageInput.uuid, sptd.storageInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.storageInput.operationTime, sptd.storageInput.node, sptd.storageInput.qCharacteristics, sptd.emInput, sptd.storageInput.type)] [sptd.storageInput.operator] | [] || [] [] | [] || [] } @@ -254,18 +270,20 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def nodeMap = map([sptd.participantNode]) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getBmPlants(map(operators), nodeMap, map(types)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getBmPlants(map(operators), nodeMap, emUnitsMap, map(types)), SourceException) sysParts.failure sysParts.exception.get().class == SourceException where: operators | types || resultingSet - [] | [sptd.bmInput.type] || [new BmInput(sptd.bmInput.uuid, sptd.bmInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.bmInput.operationTime, sptd.bmInput.node, sptd.bmInput.qCharacteristics, sptd.bmInput.type, sptd.bmInput.marketReaction, sptd.bmInput.costControlled, sptd.bmInput.feedInTariff)] + [] | [sptd.bmInput.type] || [new BmInput(sptd.bmInput.uuid, sptd.bmInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.bmInput.operationTime, sptd.bmInput.node, sptd.bmInput.qCharacteristics, sptd.emInput, sptd.bmInput.type, sptd.bmInput.marketReaction, sptd.bmInput.costControlled, sptd.bmInput.feedInTariff)] [sptd.bmInput.operator] | [] || [] [] | [] || [] [] | [] || [] @@ -277,17 +295,19 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getEvcs(map(operators), map(nodes)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getEvcs(map(operators), map(nodes), emUnitsMap), SourceException) sysParts.failure sysParts.exception.get().class == SourceException where: nodes | operators || resultingSet - [sptd.evcsInput.node] | [] || [new EvcsInput(sptd.evcsInput.uuid, sptd.evcsInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evcsInput.operationTime, sptd.evcsInput.node, sptd.evcsInput.qCharacteristics, sptd.evcsInput.type, sptd.evcsInput.chargingPoints, sptd.evcsInput.cosPhiRated, sptd.evcsInput.locationType, sptd.evcsInput.v2gSupport)] + [sptd.evcsInput.node] | [] || [new EvcsInput(sptd.evcsInput.uuid, sptd.evcsInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evcsInput.operationTime, sptd.evcsInput.node, sptd.evcsInput.qCharacteristics, sptd.emInput, sptd.evcsInput.type, sptd.evcsInput.chargingPoints, sptd.evcsInput.cosPhiRated, sptd.evcsInput.locationType, sptd.evcsInput.v2gSupport)] [] | [sptd.evcsInput.operator] || [] [] | [] || [] } @@ -298,17 +318,19 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getLoads(map(operators), map(nodes)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getLoads(map(operators), map(nodes), emUnitsMap), SourceException) sysParts.failure sysParts.exception.get().class == SourceException where: nodes | operators || resultingSet - [sptd.loadInput.node] | [] || [new LoadInput(sptd.loadInput.uuid, sptd.loadInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.loadInput.operationTime, sptd.loadInput.node, sptd.loadInput.qCharacteristics, sptd.loadInput.loadProfile, sptd.loadInput.dsm, sptd.loadInput.eConsAnnual, sptd.loadInput.sRated, sptd.loadInput.cosPhiRated)] + [sptd.loadInput.node] | [] || [new LoadInput(sptd.loadInput.uuid, sptd.loadInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.loadInput.operationTime, sptd.loadInput.node, sptd.loadInput.qCharacteristics, sptd.emInput, sptd.loadInput.loadProfile, sptd.loadInput.dsm, sptd.loadInput.eConsAnnual, sptd.loadInput.sRated, sptd.loadInput.cosPhiRated)] [] | [sptd.loadInput.operator] || [] [] | [] || [] } @@ -319,17 +341,19 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getPvPlants(map(operators), map(nodes)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getPvPlants(map(operators), map(nodes), emUnitsMap), SourceException) sysParts.failure sysParts.exception.get().class == SourceException where: nodes | operators || resultingSet - [sptd.pvInput.node] | [] || [new PvInput(sptd.pvInput.uuid, sptd.pvInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.pvInput.operationTime, sptd.pvInput.node, sptd.pvInput.qCharacteristics, sptd.pvInput.albedo, sptd.pvInput.azimuth, sptd.pvInput.etaConv, sptd.pvInput.elevationAngle, sptd.pvInput.kG, sptd.pvInput.kT, sptd.pvInput.marketReaction, sptd.pvInput.sRated, sptd.pvInput.cosPhiRated)] + [sptd.pvInput.node] | [] || [new PvInput(sptd.pvInput.uuid, sptd.pvInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.pvInput.operationTime, sptd.pvInput.node, sptd.pvInput.qCharacteristics, sptd.emInput, sptd.pvInput.albedo, sptd.pvInput.azimuth, sptd.pvInput.etaConv, sptd.pvInput.elevationAngle, sptd.pvInput.kG, sptd.pvInput.kT, sptd.pvInput.marketReaction, sptd.pvInput.sRated, sptd.pvInput.cosPhiRated)] [] | [sptd.pvInput.operator] || [] [] | [] || [] } @@ -340,17 +364,19 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getFixedFeedIns(map(operators), map(nodes)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getFixedFeedIns(map(operators), map(nodes), emUnitsMap), SourceException) sysParts.failure sysParts.exception.get().class == SourceException where: nodes | operators || resultingSet - [sptd.fixedFeedInInput.node] | [] as List || [new FixedFeedInInput(sptd.fixedFeedInInput.uuid, sptd.fixedFeedInInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.fixedFeedInInput.operationTime, sptd.fixedFeedInInput.node, sptd.fixedFeedInInput.qCharacteristics, sptd.fixedFeedInInput.sRated, sptd.fixedFeedInInput.cosPhiRated)] + [sptd.fixedFeedInInput.node] | [] as List || [new FixedFeedInInput(sptd.fixedFeedInInput.uuid, sptd.fixedFeedInInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.fixedFeedInInput.operationTime, sptd.fixedFeedInInput.node, sptd.fixedFeedInInput.qCharacteristics, sptd.emInput, sptd.fixedFeedInInput.sRated, sptd.fixedFeedInInput.cosPhiRated)] [] | [sptd.fixedFeedInInput.operator] as List || [] [] | [] as List || [] } diff --git a/src/test/groovy/edu/ie3/datamodel/models/EmControlStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/EmControlStrategyTest.groovy deleted file mode 100644 index ea13b2f35..000000000 --- a/src/test/groovy/edu/ie3/datamodel/models/EmControlStrategyTest.groovy +++ /dev/null @@ -1,45 +0,0 @@ -/* - * © 2022. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.models - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData -import edu.ie3.datamodel.io.factory.input.participant.FixedFeedInInputFactory -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.system.FixedFeedInInput -import spock.lang.Specification - -import java.util.stream.Collectors - -class EmControlStrategyTest extends Specification { - - def "An em control strategy should be gotten by their key"() { - given: - EmControlStrategy actual = EmControlStrategy.get(key) - - expect: - actual == expected - - where: - key || expected - EmControlStrategy.SELF_OPTIMIZATION.getKey() || EmControlStrategy.SELF_OPTIMIZATION - } - - def "An em control strategy should throw an exception when calling get on unkown key"() { - given: - String unknownKey = "nobody_knows_me" - - when: - EmControlStrategy _ = EmControlStrategy.get(unknownKey) - - then: - IllegalArgumentException ex = thrown() - ex.message == "No predefined energy management control strategy '" + - unknownKey + - "' found. Please provide one of the following keys: " + - Arrays.stream(EmControlStrategy.values()).map(EmControlStrategy::getKey).collect(Collectors.joining(", ")) - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/container/EnergyManagementUnitsTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/container/EnergyManagementUnitsTest.groovy deleted file mode 100644 index 7bb2e6902..000000000 --- a/src/test/groovy/edu/ie3/datamodel/models/input/container/EnergyManagementUnitsTest.groovy +++ /dev/null @@ -1,29 +0,0 @@ -/* - * © 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.test.common.EnergyManagementTestData -import spock.lang.Specification - -class EnergyManagementUnitsTest extends Specification { - - def "An EnergyManagementUnits' copy method should work as expected"() { - given: - def energyManagementUnits = new EnergyManagementUnits( - Collections.singleton(EnergyManagementTestData.emInput) - ) - - def modifiedEmInput = EnergyManagementTestData.emInput.copy().id("modified").build() - - when: - def modifiedEnergyManagementUnits = energyManagementUnits.copy() - .emUnits(Set.of(modifiedEmInput)) - .build() - - then: - modifiedEnergyManagementUnits.emUnits.first() == modifiedEmInput - } -} 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 21bc87957..5b8147f20 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,10 +5,8 @@ */ 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 @@ -31,7 +29,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, emptyEnergyManagementUnits, GRAPHIC_ELEMENTS) + def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, GRAPHIC_ELEMENTS) then: noExceptionThrown() @@ -40,10 +38,9 @@ class JointGridContainerTest extends Specification { def "A JointGridContainer's copy method should work as expected"() { given: - def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, emptyEnergyManagementUnits, GRAPHIC_ELEMENTS) + def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, 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: @@ -51,7 +48,6 @@ class JointGridContainerTest extends Specification { .gridName("new grid name") .rawGrid(rawGrid) .systemParticipants(systemParticipants) - .emUnits(emUnits) .graphics(graphics) .build() @@ -59,7 +55,6 @@ 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/models/input/system/BmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy index 877a35be1..6088e7218 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy @@ -33,6 +33,7 @@ class BmInputTest extends Specification { assert qCharacteristics == bmInput.qCharacteristics assert feedInTariff == Quantities.getQuantity(15, EURO_PER_MEGAWATTHOUR) assert type == SystemParticipantTestData.bmTypeInput + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy index 69dcb4f92..b21f73dfe 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy @@ -29,6 +29,7 @@ class ChpInputTest extends Specification { assert thermalStorage == SystemParticipantTestData.thermalStorage assert marketReaction assert type == SystemParticipantTestData.chpTypeInput + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy index 755699e22..3c1c6f706 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy @@ -5,10 +5,8 @@ */ package edu.ie3.datamodel.models.input.system -import static edu.ie3.datamodel.models.ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY - -import edu.ie3.datamodel.models.ControlStrategy -import edu.ie3.test.common.EnergyManagementTestData +import edu.ie3.datamodel.models.input.EmInput +import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification class EmInputTest extends Specification { @@ -18,67 +16,68 @@ class EmInputTest extends Specification { def emInput = new EmInput( UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), "test_emInput", - EnergyManagementTestData.connectedAssets, - EnergyManagementTestData.emControlStrategy + SystemParticipantTestData.emControlStrategy, + SystemParticipantTestData.parentEm ) then: emInput.with { assert uuid == UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792") assert id == "test_emInput" - assert connectedAssets == EnergyManagementTestData.connectedAssets - assert controlStrategy.key == EnergyManagementTestData.emControlStrategy + assert controlStrategy == SystemParticipantTestData.emControlStrategy } } def "EmInputs are comparable"() { given: - def emInputA = EnergyManagementTestData.emInput + def emInputA = SystemParticipantTestData.emInput expect: (emInputA == emInputB) == isEqual where: - emInputB || isEqual - EnergyManagementTestData.emInput || true - EnergyManagementTestData.emInput.copy().build() || true - EnergyManagementTestData.emInput.copy().id("otherId").build() || false + emInputB || isEqual + SystemParticipantTestData.emInput || true + SystemParticipantTestData.emInput.copy().build() || true + SystemParticipantTestData.emInput.copy().id("otherId").build() || false } def "The EmInput to String method work as expected"() { given: - def emInputToString = EnergyManagementTestData.emInput.toString() + def emInputToString = SystemParticipantTestData.emInput.toString() expect: emInputToString == "EmInput{" + "uuid=" + - EnergyManagementTestData.emInput.uuid + + SystemParticipantTestData.emInput.uuid + ", id='" + - EnergyManagementTestData.emInput.id + + SystemParticipantTestData.emInput.id + ", operator=" + - EnergyManagementTestData.emInput.operator.uuid + + SystemParticipantTestData.emInput.operator.uuid + ", operationTime=" + - EnergyManagementTestData.emInput.operationTime + - ", connectedAssets=" + - Arrays.toString(EnergyManagementTestData.emInput.connectedAssets) + + SystemParticipantTestData.emInput.operationTime + ", controlStrategy=" + - EnergyManagementTestData.emInput.controlStrategy + + SystemParticipantTestData.emInput.controlStrategy + + ", parentEm=" + + SystemParticipantTestData.parentEm.uuid + '}' } def "A EmInput copy method should work as expected"() { given: - def emInput = EnergyManagementTestData.emInput - def newConnectedAssets = [ - UUID.randomUUID(), - UUID.randomUUID() - ] as UUID[] - + def emInput = SystemParticipantTestData.emInput + def newStrat = "new_strat" + def givenParentEm = new EmInput( + UUID.fromString("cfc0639b-65bc-47e5-a8e5-82703de3c650"), + "testParent", + "controlStrat", + null + ) when: - def alteredUnit = emInput.copy().connectedAssets(newConnectedAssets).controlStrategy(ControlStrategy.parse("")).build() + def alteredUnit = emInput.copy().controlStrategy(newStrat).parentEm(givenParentEm).build() then: alteredUnit.with { @@ -86,8 +85,8 @@ class EmInputTest extends Specification { assert operationTime == emInput.operationTime assert operator == emInput.operator assert id == emInput.id - assert connectedAssets == newConnectedAssets - assert controlStrategy == NO_CONTROL_STRATEGY + assert controlStrategy == newStrat + assert parentEm == Optional.of(givenParentEm) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy index f31375f45..507384dcb 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy @@ -26,6 +26,7 @@ class EvInputTest extends Specification { assert id == ev.id assert qCharacteristics == ev.qCharacteristics assert type == SystemParticipantTestData.evTypeInput + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy index 65dd93c14..eadd65ea7 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy @@ -36,6 +36,7 @@ class EvcsInputTest extends Specification { assert chargingPoints == 1 assert locationType == EvcsLocationType.CHARGING_HUB_HIGHWAY assert v2gSupport + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy index 500da895b..5c29f2544 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy @@ -29,6 +29,7 @@ class FixedFeedInInputTest extends Specification { assert qCharacteristics == ffIn.qCharacteristics assert sRated == Quantities.getQuantity(10d, PowerSystemUnits.VOLTAMPERE) assert cosPhiRated == 0.8d + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy index 9e40de6d6..98a15d0df 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy @@ -28,6 +28,7 @@ class HpInputTest extends Specification { assert qCharacteristics == hpInput.qCharacteristics assert thermalBus == SystemParticipantTestData.thermalBus assert type == SystemParticipantTestData.hpTypeInput + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy index a1d04cc30..166406e36 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy @@ -41,6 +41,7 @@ class LoadInputTest extends Specification { assert eConsAnnual == Quantities.getQuantity(6000, KILOWATTHOUR) assert sRated == Quantities.getQuantity(0d, KILOVOLTAMPERE) assert cosPhiRated == 0.8d + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy index ea9a0262d..5506582e8 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy @@ -40,6 +40,7 @@ class PvInputTest extends Specification { assert elevationAngle == Quantities.getQuantity(50, DEGREE_GEOM) assert kG == 10 assert kT == 5 + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy index 0bea4865f..da2e9d233 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy @@ -26,6 +26,7 @@ class StorageInputTest extends Specification { assert id == storageInput.id assert qCharacteristics == storageInput.qCharacteristics assert type == SystemParticipantTestData.storageTypeInput + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy index 9d8b823af..135adc2fb 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy @@ -27,6 +27,7 @@ class WecInputTest extends Specification { assert qCharacteristics == wec.qCharacteristics assert type == SystemParticipantTestData.wecType assert marketReaction + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy index 72461b659..c07ff0d54 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy @@ -294,7 +294,6 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticipants = ComplexTopology.grid.systemParticipants - EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics HashMap expectedSubGrids = ComplexTopology.expectedSubGrids @@ -305,7 +304,6 @@ class ContainerUtilsTest extends Specification { subNetNumbers, rawGrid, systemParticipants, - emUnits, graphics) then: @@ -325,7 +323,6 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGridInput= ComplexTopology.grid.rawGrid SystemParticipants systemParticipantsInput = ComplexTopology.grid.systemParticipants - EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphicsInput = ComplexTopology.grid.graphics HashMap unmodifiedSubGrids = ComplexTopology.expectedSubGrids @@ -335,7 +332,6 @@ class ContainerUtilsTest extends Specification { subNetNumbers, rawGridInput, systemParticipantsInput, - emUnits, graphicsInput) when: @@ -390,14 +386,12 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticipants = ComplexTopology.grid.systemParticipants - EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics Map subgrids = ContainerUtils.buildSubGridContainers( gridName, subNetNumbers, rawGrid, systemParticipants, - emUnits, graphics) SubGridTopologyGraph expectedSubGridTopology = ComplexTopology.expectedSubGridTopology @@ -415,7 +409,6 @@ class ContainerUtilsTest extends Specification { String gridName = ComplexTopology.gridName RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticpants = ComplexTopology.grid.systemParticipants - EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics SubGridTopologyGraph expectedSubGridTopology = ComplexTopology.expectedSubGridTopology @@ -424,7 +417,6 @@ class ContainerUtilsTest extends Specification { gridName, rawGrid, systemParticpants, - emUnits, graphics) then: diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy index 9aee7acf6..e8f27b4df 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy @@ -13,7 +13,7 @@ import java.time.ZonedDateTime class InvalidSystemParticipantInput extends SystemParticipantInput { InvalidSystemParticipantInput(NodeInput node) { - super(UUID.randomUUID(), "invalid_system_participant", node, CosPhiFixed.CONSTANT_CHARACTERISTIC) + super(UUID.randomUUID(), "invalid_system_participant", node, CosPhiFixed.CONSTANT_CHARACTERISTIC, null) } @Override diff --git a/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy b/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy index 172675589..1c56b3838 100644 --- a/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy +++ b/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy @@ -5,7 +5,6 @@ */ 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 @@ -46,7 +45,6 @@ class ComplexTopology extends GridTestData { gridName, rawGrid, emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set)) @@ -67,7 +65,6 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -84,7 +81,6 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -101,7 +97,6 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -118,7 +113,6 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -138,7 +132,6 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -158,7 +151,6 @@ 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 deleted file mode 100644 index 4d8714c6b..000000000 --- a/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy +++ /dev/null @@ -1,30 +0,0 @@ -/* - * © 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.container.EnergyManagementUnits -import edu.ie3.datamodel.models.input.system.EmInput - -class EnergyManagementTestData { - - public static final UUID[] connectedAssets = new UUID[]{ - SystemParticipantTestData.loadInput.uuid, - SystemParticipantTestData.pvInput.uuid - } - public static final String emControlStrategy = "self_optimization" - - public static final emInput = new EmInput( - UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), - "test_emInput", - SystemParticipantTestData.operator, - SystemParticipantTestData.operationTime, - connectedAssets, - emControlStrategy - ) - - 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 44243df05..ea7ea00ec 100644 --- a/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy +++ b/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy @@ -15,7 +15,6 @@ 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 @@ -48,7 +47,6 @@ class SampleJointGrid extends SystemParticipantTestData { "sampleGrid", rawGridElements, systemParticipants(rawGridElements), - new EnergyManagementUnits(Collections.emptySet()), new GraphicElements(Collections.emptySet())) } @@ -72,6 +70,7 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, albedo, azimuth, etaConv, @@ -91,6 +90,7 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, standardLoadProfile, false, eConsAnnual, @@ -105,6 +105,7 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, standardLoadProfile, false, eConsAnnual, @@ -120,6 +121,7 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, storageTypeInput) return new SystemParticipants( diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index bd0f2bf43..dbcc06e33 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -8,6 +8,7 @@ package edu.ie3.test.common import static edu.ie3.datamodel.models.StandardUnits.* import edu.ie3.datamodel.models.OperationTime +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.container.SystemParticipants @@ -55,6 +56,25 @@ class SystemParticipantTestData { private static final ComparableQuantity opex = Quantities.getQuantity(50d, ENERGY_PRICE) static final ComparableQuantity etaConv = Quantities.getQuantity(98d, EFFICIENCY) + // EmInput + public static final String emControlStrategy = "self_optimization" + public static final EmInput parentEm = new EmInput( + UUID.fromString("897bfc17-8e54-43d0-8d98-740786fd94dd"), + "test_parentEmInput", + SystemParticipantTestData.operator, + SystemParticipantTestData.operationTime, + emControlStrategy, + null + ) + + public static final EmInput emInput = new EmInput( + UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), + "test_emInput", + SystemParticipantTestData.operator, + SystemParticipantTestData.operationTime, + emControlStrategy, + parentEm + ) // FixedFeedInput public static final FixedFeedInInput fixedFeedInInput = new FixedFeedInInput( @@ -64,6 +84,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, sRated, cosPhiRated ) @@ -81,6 +102,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, albedo, azimuth, etaConv, @@ -117,6 +139,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiP, + emInput, wecType, false ) @@ -172,6 +195,7 @@ class SystemParticipantTestData { participantNode, thermalBus, cosPhiFixed, + emInput, chpTypeInput, thermalStorage, false @@ -198,6 +222,7 @@ class SystemParticipantTestData { operationTime, participantNode, qV, + emInput, bmTypeInput, false, false, @@ -223,6 +248,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, evTypeInput ) @@ -236,6 +262,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, standardLoadProfile, false, eConsAnnual, @@ -272,6 +299,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, storageTypeInput ) @@ -294,6 +322,7 @@ class SystemParticipantTestData { participantNode, thermalBus, cosPhiFixed, + emInput, hpTypeInput ) @@ -306,6 +335,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, ChargingPointTypeUtils.HouseholdSocket, 4, cosPhiRated, diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/bm_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/bm_input.csv index ce7d8b2b6..ab92413aa 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/bm_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/bm_input.csv @@ -1,2 +1,2 @@ -uuid,cost_controlled,feed_in_tariff,id,market_reaction,node,operates_from,operates_until,operator,q_characteristics,type -d06e5bb7-a3c7-4749-bdd1-4581ff2f6f4d,false,10.0,test_bmInput,false,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"qV:{(0.90,-0.30),(0.95,0.00),(1.05,0.00),(1.10,0.30)}",5ebd8f7e-dedb-4017-bb86-6373c4b68eb8 +uuid,cost_controlled,feed_in_tariff,id,market_reaction,node,operates_from,operates_until,operator,q_characteristics,type,em +d06e5bb7-a3c7-4749-bdd1-4581ff2f6f4d,false,10.0,test_bmInput,false,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"qV:{(0.90,-0.30),(0.95,0.00),(1.05,0.00),(1.10,0.30)}",5ebd8f7e-dedb-4017-bb86-6373c4b68eb8,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/chp_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/chp_input.csv index 71a873f1a..587209298 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/chp_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/chp_input.csv @@ -1,2 +1,2 @@ -uuid,id,market_reaction,node,operates_from,operates_until,operator,q_characteristics,thermal_bus,thermal_storage,type -9981b4d7-5a8e-4909-9602-e2e7ef4fca5c,test_chpInput,false,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",0d95d7f2-49fb-4d49-8636-383a5220384e,8851813b-3a7d-4fee-874b-4df9d724e4b3,5ebd8f7e-dedb-4017-bb86-6373c4b68eb8 +uuid,id,market_reaction,node,operates_from,operates_until,operator,q_characteristics,thermal_bus,thermal_storage,type,em +9981b4d7-5a8e-4909-9602-e2e7ef4fca5c,test_chpInput,false,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",0d95d7f2-49fb-4d49-8636-383a5220384e,8851813b-3a7d-4fee-874b-4df9d724e4b3,5ebd8f7e-dedb-4017-bb86-6373c4b68eb8,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv index 4a11cda89..325d29445 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv @@ -1,2 +1,2 @@ -uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,thermal_bus -8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e +uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,thermal_bus,em +8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv index 5cc111444..e1bd3d5fa 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv @@ -1,2 +1,3 @@ -uuid,connected_assets,control_strategy,id,operates_from,operates_until,operator -977157f4-25e5-4c72-bf34-440edc778792,eaf77f7e-9001-479f-94ca-7fb657766f5f d56f15b7-8293-4b98-b5bd-58f6273ce229,self_optimization,test_emInput,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510 +uuid,control_strategy,id,operates_from,operates_until,operator,parent_em +977157f4-25e5-4c72-bf34-440edc778792,self_optimization,test_emInput,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,897bfc17-8e54-43d0-8d98-740786fd94dd +897bfc17-8e54-43d0-8d98-740786fd94dd,self_optimization,test_parentEmInput,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510, \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/ev_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/ev_input.csv index 586c162ca..ca1a1609f 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/ev_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/ev_input.csv @@ -1,2 +1,2 @@ -uuid,id,node,operates_from,operates_until,operator,q_characteristics,type -a17be20f-c7a7-471d-8ffe-015487c9d022,test_evInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",5ebd8f7e-dedb-4017-bb86-6373c4b68eb8 +uuid,id,node,operates_from,operates_until,operator,q_characteristics,type,em +a17be20f-c7a7-471d-8ffe-015487c9d022,test_evInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",5ebd8f7e-dedb-4017-bb86-6373c4b68eb8,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/evcs_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/evcs_input.csv index 0f8c9375e..f5260fd87 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/evcs_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/evcs_input.csv @@ -1,2 +1,2 @@ -uuid,id,operator,operates_from,operates_until,node,q_characteristics,cos_phi_rated,type,charging_points,location_type,v2g_support -798028b5-caff-4da7-bcd9-1750fdd8742c,test_csInput,8f9682df-0744-4b58-a122-f0dc730f6510,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],4ca90220-74c2-4369-9afa-a18bf068840d,cosPhiFixed:{(0.0,0.95)},0.95,hhs,4,HOME,false \ No newline at end of file +uuid,id,operator,operates_from,operates_until,node,q_characteristics,cos_phi_rated,type,charging_points,location_type,v2g_support,em +798028b5-caff-4da7-bcd9-1750fdd8742c,test_csInput,8f9682df-0744-4b58-a122-f0dc730f6510,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],4ca90220-74c2-4369-9afa-a18bf068840d,cosPhiFixed:{(0.0,0.95)},0.95,hhs,4,HOME,false,977157f4-25e5-4c72-bf34-440edc778792 \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/fixed_feed_in_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/fixed_feed_in_input.csv index b96a7bb37..f34ea1235 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/fixed_feed_in_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/fixed_feed_in_input.csv @@ -1,2 +1,2 @@ -uuid,cos_phi_rated,id,node,operates_from,operates_until,operator,q_characteristics,s_rated -717af017-cc69-406f-b452-e022d7fb516a,0.95,test_fixedFeedInInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",25.0 +uuid,cos_phi_rated,id,node,operates_from,operates_until,operator,q_characteristics,s_rated,em +717af017-cc69-406f-b452-e022d7fb516a,0.95,test_fixedFeedInInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",25.0,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/hp_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/hp_input.csv index d99bf92b8..ab904335b 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/hp_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/hp_input.csv @@ -1,2 +1,2 @@ -uuid,id,node,operates_from,operates_until,operator,q_characteristics,thermal_bus,type -798028b5-caff-4da7-bcd9-1750fdd8742b,test_hpInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",0d95d7f2-49fb-4d49-8636-383a5220384e,5ebd8f7e-dedb-4017-bb86-6373c4b68eb8 +uuid,id,node,operates_from,operates_until,operator,q_characteristics,thermal_bus,type,em +798028b5-caff-4da7-bcd9-1750fdd8742b,test_hpInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",0d95d7f2-49fb-4d49-8636-383a5220384e,5ebd8f7e-dedb-4017-bb86-6373c4b68eb8,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv index c35f3fe6a..644ae6375 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv @@ -1,2 +1,2 @@ -uuid,cos_phi_rated,dsm,e_cons_annual,id,node,operates_from,operates_until,operator,q_characteristics,s_rated,load_profile -eaf77f7e-9001-479f-94ca-7fb657766f5f,0.95,false,4000.0,test_loadInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",25.0,h0 +uuid,cos_phi_rated,dsm,e_cons_annual,id,node,operates_from,operates_until,operator,q_characteristics,s_rated,load_profile,em +eaf77f7e-9001-479f-94ca-7fb657766f5f,0.95,false,4000.0,test_loadInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",25.0,h0,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/pv_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/pv_input.csv index 795d9a173..c93d6e94d 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/pv_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/pv_input.csv @@ -1,2 +1,2 @@ -uuid,albedo,azimuth,cos_phi_rated,eta_conv,elevation_angle,id,k_g,k_t,market_reaction,node,operates_from,operates_until,operator,q_characteristics,s_rated -d56f15b7-8293-4b98-b5bd-58f6273ce229,0.20000000298023224,-8.926613807678223,0.95,98.0,41.01871871948242,test_pvInput,0.8999999761581421,1.0,false,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",25.0 +uuid,albedo,azimuth,cos_phi_rated,eta_conv,elevation_angle,id,k_g,k_t,market_reaction,node,operates_from,operates_until,operator,q_characteristics,s_rated,em +d56f15b7-8293-4b98-b5bd-58f6273ce229,0.20000000298023224,-8.926613807678223,0.95,98.0,41.01871871948242,test_pvInput,0.8999999761581421,1.0,false,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",25.0,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/storage_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/storage_input.csv index 124265a29..44021c3cb 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/storage_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/storage_input.csv @@ -1,2 +1,2 @@ -uuid,id,node,operates_from,operates_until,operator,q_characteristics,type -06b58276-8350-40fb-86c0-2414aa4a0452,test_storageInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",5ebd8f7e-dedb-4017-bb86-6373c4b68eb8 +uuid,id,node,operates_from,operates_until,operator,q_characteristics,type,em +06b58276-8350-40fb-86c0-2414aa4a0452,test_storageInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",5ebd8f7e-dedb-4017-bb86-6373c4b68eb8,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/wec_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/wec_input.csv index 28b063b88..2be6f5f3a 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/wec_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/wec_input.csv @@ -1,2 +1,2 @@ -uuid,id,market_reaction,node,operates_from,operates_until,operator,q_characteristics,type -ee7e2e37-a5ad-4def-a832-26a317567ca1,test_wecInput,false,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiP:{(0.00,1.00),(0.90,1.00),(1.20,-0.30)}",5ebd8f7e-dedb-4017-bb86-6373c4b68eb8 +uuid,id,market_reaction,node,operates_from,operates_until,operator,q_characteristics,type,em +ee7e2e37-a5ad-4def-a832-26a317567ca1,test_wecInput,false,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiP:{(0.00,1.00),(0.90,1.00),(1.20,-0.30)}",5ebd8f7e-dedb-4017-bb86-6373c4b68eb8,977157f4-25e5-4c72-bf34-440edc778792