Skip to content

Commit 4bbe628

Browse files
Extend Validation to EnergyManagement Systems
1 parent 863de29 commit 4bbe628

File tree

5 files changed

+124
-7
lines changed

5 files changed

+124
-7
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased/Snapshot]
88

9+
### Added
10+
- Extend Validation to EnergyManagement Systems. [#1356](https://github.com/ie3-institute/PowerSystemDataModel/issues/1356)
11+
912
### Fixed
1013
- Fixed handling of `CongestionResult.InputModelType` in `EntityProcessor` [#1325](https://github.com/ie3-institute/PowerSystemDataModel/issues/1325)
1114
- -Fixed em fields in input models [#1331](https://github.com/ie3-institute/PowerSystemDataModel/issues/1331)
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* © 2021. TU Dortmund University,
3+
* Institute of Energy Systems, Energy Efficiency and Energy Economics,
4+
* Research group Distribution grid planning and operation
5+
*/
6+
package edu.ie3.datamodel.utils.validation;
7+
8+
import edu.ie3.datamodel.exceptions.InvalidEntityException;
9+
import edu.ie3.datamodel.exceptions.ValidationException;
10+
import edu.ie3.datamodel.models.input.EmInput;
11+
import edu.ie3.datamodel.utils.Try;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
public class EnergyManagementValidationUtils extends ValidationUtils {
16+
17+
/** Private Constructor as this class is not meant to be instantiated */
18+
private EnergyManagementValidationUtils() {
19+
throw new IllegalStateException("Don't try and instantiate a Utility class.");
20+
}
21+
22+
/**
23+
* Validates a energy management unit if:
24+
*
25+
* <ul>
26+
* <li>its control strategy is not null
27+
* <li>its control strategy matches the supported strategies
28+
* </ul>
29+
*
30+
* A "distribution" method, that forwards the check request to specific implementations to fulfill
31+
* the checking task, based on the class of the given object.
32+
*
33+
* @param energyManagement EmInput to validate
34+
* @return a list of try objects either containing an {@link ValidationException} or an empty
35+
* Success
36+
*/
37+
protected static List<Try<Void, ? extends ValidationException>> check(EmInput energyManagement) {
38+
List<Try<Void, ? extends ValidationException>> exceptions = new ArrayList<>();
39+
40+
exceptions.add(
41+
Try.ofVoid(
42+
energyManagement.getControlStrategy() == null,
43+
() ->
44+
new InvalidEntityException(
45+
"No control strategy of energy management defined for", energyManagement)));
46+
47+
exceptions.add(
48+
Try.ofVoid(
49+
!(energyManagement.getControlStrategy().equals("PRIORITIZED")
50+
|| energyManagement.getControlStrategy().equals("PROPORTIONAL")),
51+
() ->
52+
new InvalidEntityException(
53+
"Control strategy of energy management system must be one of the following: PRIORITIZED, PROPORTIONAL.",
54+
energyManagement)));
55+
56+
return exceptions;
57+
}
58+
}

src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
*/
66
package edu.ie3.datamodel.utils.validation;
77

8-
import edu.ie3.datamodel.exceptions.*;
8+
import edu.ie3.datamodel.exceptions.FailedValidationException;
9+
import edu.ie3.datamodel.exceptions.InvalidEntityException;
10+
import edu.ie3.datamodel.exceptions.UnsafeEntityException;
11+
import edu.ie3.datamodel.exceptions.ValidationException;
912
import edu.ie3.datamodel.models.UniqueEntity;
10-
import edu.ie3.datamodel.models.input.AssetInput;
11-
import edu.ie3.datamodel.models.input.AssetTypeInput;
12-
import edu.ie3.datamodel.models.input.MeasurementUnitInput;
13-
import edu.ie3.datamodel.models.input.NodeInput;
13+
import edu.ie3.datamodel.models.input.*;
1414
import edu.ie3.datamodel.models.input.connector.ConnectorInput;
1515
import edu.ie3.datamodel.models.input.connector.type.LineTypeInput;
1616
import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput;
@@ -22,8 +22,11 @@
2222
import edu.ie3.datamodel.models.input.system.type.SystemParticipantTypeInput;
2323
import edu.ie3.datamodel.models.input.thermal.ThermalUnitInput;
2424
import edu.ie3.datamodel.utils.Try;
25-
import edu.ie3.datamodel.utils.Try.*;
26-
import java.util.*;
25+
import edu.ie3.datamodel.utils.Try.Failure;
26+
import edu.ie3.datamodel.utils.Try.Success;
27+
import java.util.ArrayList;
28+
import java.util.Arrays;
29+
import java.util.List;
2730
import java.util.function.Predicate;
2831
import java.util.stream.Collectors;
2932
import javax.measure.Quantity;
@@ -157,6 +160,8 @@ else if (ThermalUnitInput.class.isAssignableFrom(assetInput.getClass()))
157160
exceptions.addAll(ThermalValidationUtils.check((ThermalUnitInput) assetInput));
158161
else if (ThermalGrid.class.isAssignableFrom(assetInput.getClass()))
159162
exceptions.addAll(ThermalValidationUtils.check((ThermalUnitInput) assetInput));
163+
else if (EmInput.class.isAssignableFrom(assetInput.getClass()))
164+
exceptions.addAll(EnergyManagementValidationUtils.check((EmInput) assetInput));
160165
else {
161166
logNotImplemented(assetInput);
162167
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* © 2025. TU Dortmund University,
3+
* Institute of Energy Systems, Energy Efficiency and Energy Economics,
4+
* Research group Distribution grid planning and operation
5+
*/
6+
package edu.ie3.datamodel.utils.validation
7+
8+
import edu.ie3.datamodel.exceptions.InvalidEntityException
9+
import edu.ie3.datamodel.exceptions.ValidationException
10+
import edu.ie3.datamodel.utils.Try
11+
import edu.ie3.test.common.GridTestData
12+
import spock.lang.Specification
13+
14+
class EmValidationUtilsTest extends Specification {
15+
16+
def "Smoke Test: Correct energy management system throws no exception"() {
17+
given:
18+
def em = GridTestData.energyManagementInput
19+
20+
when:
21+
List<Try<Void, ? extends ValidationException>> tries = EnergyManagementValidationUtils.check(em)
22+
23+
then:
24+
tries.every { it.success }
25+
}
26+
27+
def "The check method recognizes all potential errors for an energy management input"() {
28+
when:
29+
List<Try<Void, ? extends ValidationException>> exceptions = EnergyManagementValidationUtils.check(invalidEm).stream().filter { it -> it.failure }.toList()
30+
31+
then:
32+
exceptions.size() == expectedSize
33+
Exception ex = exceptions.get(0).exception.get()
34+
ex.class == expectedException.class
35+
ex.message == expectedException.message
36+
37+
where:
38+
invalidEm || expectedSize || expectedException
39+
GridTestData.energyManagementInput.copy().controlStrategy("invalid").build() || 1 || new InvalidEntityException("Control strategy of energy management system must be one of the following: PRIORITIZED, PROPORTIONAL.", invalidEm)
40+
}
41+
}

src/test/groovy/edu/ie3/test/common/GridTestData.groovy

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import static edu.ie3.datamodel.models.StandardUnits.*
99
import static edu.ie3.util.quantities.PowerSystemUnits.*
1010

1111
import edu.ie3.datamodel.models.OperationTime
12+
import edu.ie3.datamodel.models.input.EmInput
1213
import edu.ie3.datamodel.models.input.MeasurementUnitInput
1314
import edu.ie3.datamodel.models.input.NodeInput
1415
import edu.ie3.datamodel.models.input.OperatorInput
@@ -387,4 +388,13 @@ class GridTestData {
387388
true,
388389
true
389390
)
391+
392+
public static final EmInput energyManagementInput = new EmInput(
393+
UUID.fromString("4bef6955-5e31-4283-8920-5e4cae267a23"),
394+
"test_energyManagement",
395+
profBroccoli,
396+
defaultOperationTime,
397+
"PRIORITIZED",
398+
null,
399+
)
390400
}

0 commit comments

Comments
 (0)