From 4bbe628022ac4790cc8e53ce5ac5135c5d753cd9 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 3 Jul 2025 18:28:33 +0200 Subject: [PATCH 1/4] Extend Validation to EnergyManagement Systems --- CHANGELOG.md | 3 + .../EnergyManagementValidationUtils.java | 58 +++++++++++++++++++ .../utils/validation/ValidationUtils.java | 19 +++--- .../validation/EmValidationUtilsTest.groovy | 41 +++++++++++++ .../edu/ie3/test/common/GridTestData.groovy | 10 ++++ 5 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java create mode 100644 src/test/groovy/edu/ie3/datamodel/utils/validation/EmValidationUtilsTest.groovy diff --git a/CHANGELOG.md b/CHANGELOG.md index a7593a97d..479009ac0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased/Snapshot] +### Added +- Extend Validation to EnergyManagement Systems. [#1356](https://github.com/ie3-institute/PowerSystemDataModel/issues/1356) + ### Fixed - Fixed handling of `CongestionResult.InputModelType` in `EntityProcessor` [#1325](https://github.com/ie3-institute/PowerSystemDataModel/issues/1325) - -Fixed em fields in input models [#1331](https://github.com/ie3-institute/PowerSystemDataModel/issues/1331) diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java new file mode 100644 index 000000000..661c7659f --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java @@ -0,0 +1,58 @@ +/* + * © 2021. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.utils.validation; + +import edu.ie3.datamodel.exceptions.InvalidEntityException; +import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.models.input.EmInput; +import edu.ie3.datamodel.utils.Try; +import java.util.ArrayList; +import java.util.List; + +public class EnergyManagementValidationUtils extends ValidationUtils { + + /** Private Constructor as this class is not meant to be instantiated */ + private EnergyManagementValidationUtils() { + throw new IllegalStateException("Don't try and instantiate a Utility class."); + } + + /** + * Validates a energy management unit if: + * + * + * + * A "distribution" method, that forwards the check request to specific implementations to fulfill + * the checking task, based on the class of the given object. + * + * @param energyManagement EmInput to validate + * @return a list of try objects either containing an {@link ValidationException} or an empty + * Success + */ + protected static List> check(EmInput energyManagement) { + List> exceptions = new ArrayList<>(); + + exceptions.add( + Try.ofVoid( + energyManagement.getControlStrategy() == null, + () -> + new InvalidEntityException( + "No control strategy of energy management defined for", energyManagement))); + + exceptions.add( + Try.ofVoid( + !(energyManagement.getControlStrategy().equals("PRIORITIZED") + || energyManagement.getControlStrategy().equals("PROPORTIONAL")), + () -> + new InvalidEntityException( + "Control strategy of energy management system must be one of the following: PRIORITIZED, PROPORTIONAL.", + energyManagement))); + + return exceptions; + } +} diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java index 80006953b..6d664aba1 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java @@ -5,12 +5,12 @@ */ package edu.ie3.datamodel.utils.validation; -import edu.ie3.datamodel.exceptions.*; +import edu.ie3.datamodel.exceptions.FailedValidationException; +import edu.ie3.datamodel.exceptions.InvalidEntityException; +import edu.ie3.datamodel.exceptions.UnsafeEntityException; +import edu.ie3.datamodel.exceptions.ValidationException; import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.AssetInput; -import edu.ie3.datamodel.models.input.AssetTypeInput; -import edu.ie3.datamodel.models.input.MeasurementUnitInput; -import edu.ie3.datamodel.models.input.NodeInput; +import edu.ie3.datamodel.models.input.*; import edu.ie3.datamodel.models.input.connector.ConnectorInput; import edu.ie3.datamodel.models.input.connector.type.LineTypeInput; import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput; @@ -22,8 +22,11 @@ import edu.ie3.datamodel.models.input.system.type.SystemParticipantTypeInput; import edu.ie3.datamodel.models.input.thermal.ThermalUnitInput; import edu.ie3.datamodel.utils.Try; -import edu.ie3.datamodel.utils.Try.*; -import java.util.*; +import edu.ie3.datamodel.utils.Try.Failure; +import edu.ie3.datamodel.utils.Try.Success; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; import javax.measure.Quantity; @@ -157,6 +160,8 @@ else if (ThermalUnitInput.class.isAssignableFrom(assetInput.getClass())) exceptions.addAll(ThermalValidationUtils.check((ThermalUnitInput) assetInput)); else if (ThermalGrid.class.isAssignableFrom(assetInput.getClass())) exceptions.addAll(ThermalValidationUtils.check((ThermalUnitInput) assetInput)); + else if (EmInput.class.isAssignableFrom(assetInput.getClass())) + exceptions.addAll(EnergyManagementValidationUtils.check((EmInput) assetInput)); else { logNotImplemented(assetInput); } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/EmValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/EmValidationUtilsTest.groovy new file mode 100644 index 000000000..b4615a66d --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/EmValidationUtilsTest.groovy @@ -0,0 +1,41 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.utils.validation + +import edu.ie3.datamodel.exceptions.InvalidEntityException +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.utils.Try +import edu.ie3.test.common.GridTestData +import spock.lang.Specification + +class EmValidationUtilsTest extends Specification { + + def "Smoke Test: Correct energy management system throws no exception"() { + given: + def em = GridTestData.energyManagementInput + + when: + List> tries = EnergyManagementValidationUtils.check(em) + + then: + tries.every { it.success } + } + + def "The check method recognizes all potential errors for an energy management input"() { + when: + List> exceptions = EnergyManagementValidationUtils.check(invalidEm).stream().filter { it -> it.failure }.toList() + + then: + exceptions.size() == expectedSize + Exception ex = exceptions.get(0).exception.get() + ex.class == expectedException.class + ex.message == expectedException.message + + where: + invalidEm || expectedSize || expectedException + GridTestData.energyManagementInput.copy().controlStrategy("invalid").build() || 1 || new InvalidEntityException("Control strategy of energy management system must be one of the following: PRIORITIZED, PROPORTIONAL.", invalidEm) + } +} diff --git a/src/test/groovy/edu/ie3/test/common/GridTestData.groovy b/src/test/groovy/edu/ie3/test/common/GridTestData.groovy index 2ca15217c..87c13de89 100644 --- a/src/test/groovy/edu/ie3/test/common/GridTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/GridTestData.groovy @@ -9,6 +9,7 @@ import static edu.ie3.datamodel.models.StandardUnits.* import static edu.ie3.util.quantities.PowerSystemUnits.* import edu.ie3.datamodel.models.OperationTime +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 @@ -387,4 +388,13 @@ class GridTestData { true, true ) + + public static final EmInput energyManagementInput = new EmInput( + UUID.fromString("4bef6955-5e31-4283-8920-5e4cae267a23"), + "test_energyManagement", + profBroccoli, + defaultOperationTime, + "PRIORITIZED", + null, + ) } From 9088286ff844a9b25d26fea46f0d6493aa31ea2c Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 4 Jul 2025 12:31:02 +0200 Subject: [PATCH 2/4] remove validation for emInput.controllStrategy --- .../validation/EnergyManagementValidationUtils.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java index 661c7659f..762c91f13 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java @@ -24,7 +24,6 @@ private EnergyManagementValidationUtils() { * *
    *
  • its control strategy is not null - *
  • its control strategy matches the supported strategies *
* * A "distribution" method, that forwards the check request to specific implementations to fulfill @@ -44,14 +43,6 @@ private EnergyManagementValidationUtils() { new InvalidEntityException( "No control strategy of energy management defined for", energyManagement))); - exceptions.add( - Try.ofVoid( - !(energyManagement.getControlStrategy().equals("PRIORITIZED") - || energyManagement.getControlStrategy().equals("PROPORTIONAL")), - () -> - new InvalidEntityException( - "Control strategy of energy management system must be one of the following: PRIORITIZED, PROPORTIONAL.", - energyManagement))); return exceptions; } From 9f9034db5f19c7a73aec6d222e549d9f64b5323a Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 4 Jul 2025 12:31:16 +0200 Subject: [PATCH 3/4] fmt --- .../utils/validation/EnergyManagementValidationUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java index 762c91f13..9b2894cca 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/EnergyManagementValidationUtils.java @@ -43,7 +43,6 @@ private EnergyManagementValidationUtils() { new InvalidEntityException( "No control strategy of energy management defined for", energyManagement))); - return exceptions; } } From 6afd362048167b963f6a261512e97ca6a6830335 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 4 Jul 2025 12:35:35 +0200 Subject: [PATCH 4/4] adapted test --- .../ie3/datamodel/utils/validation/EmValidationUtilsTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/EmValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/EmValidationUtilsTest.groovy index b4615a66d..ed5139031 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/EmValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/EmValidationUtilsTest.groovy @@ -36,6 +36,6 @@ class EmValidationUtilsTest extends Specification { where: invalidEm || expectedSize || expectedException - GridTestData.energyManagementInput.copy().controlStrategy("invalid").build() || 1 || new InvalidEntityException("Control strategy of energy management system must be one of the following: PRIORITIZED, PROPORTIONAL.", invalidEm) + GridTestData.energyManagementInput.copy().controlStrategy(null).build() || 1 || new InvalidEntityException("No control strategy of energy management defined for", invalidEm) } }