Skip to content

Commit d720110

Browse files
Enhance ValidationUtils for load profile
1 parent 863de29 commit d720110

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313
### Changed
1414
- Updated dependabot workflow and added CODEOWNERS [#1328](https://github.com/ie3-institute/PowerSystemDataModel/issues/1328)
1515
- Extend azimuth angle range to [-180°, 180°] for PV inputs [#1330](https://github.com/ie3-institute/PowerSystemDataModel/issues/1330)
16+
- Enhanced `ValidationUtils` for `LoadModel` to check for correct profile naming [#1357](https://github.com/ie3-institute/PowerSystemDataModel/issues/1357)
1617

1718
## [7.0.0] - 2025-05-08
1819

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
*/
66
package edu.ie3.datamodel.utils.validation;
77

8-
import static edu.ie3.datamodel.models.StandardUnits.*;
8+
import static edu.ie3.datamodel.models.StandardUnits.AZIMUTH;
9+
import static edu.ie3.datamodel.models.StandardUnits.SOLAR_ELEVATION_ANGLE;
910

1011
import edu.ie3.datamodel.exceptions.InvalidEntityException;
1112
import edu.ie3.datamodel.exceptions.TryException;
1213
import edu.ie3.datamodel.models.input.UniqueInputEntity;
1314
import edu.ie3.datamodel.models.input.system.*;
1415
import edu.ie3.datamodel.models.input.system.type.*;
16+
import edu.ie3.datamodel.models.profile.LoadProfile;
1517
import edu.ie3.datamodel.utils.Try;
1618
import edu.ie3.datamodel.utils.Try.Failure;
1719
import java.util.ArrayList;
@@ -375,6 +377,28 @@ private static List<Try<Void, InvalidEntityException>> checkLoad(LoadInput loadI
375377
new InvalidEntityException(
376378
"No standard load profile defined for load", loadInput)));
377379

380+
String regexPattern = "^(h0|g[0-6]|l[0-2]|ep1|ez2)$";
381+
LoadProfile profile = loadInput.getLoadProfile();
382+
383+
exceptions.add(
384+
Try.ofVoid(
385+
profile.equals(LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE)
386+
|| profile.equals(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE)
387+
|| !profile.toString().matches(regexPattern),
388+
() ->
389+
new InvalidEntityException(
390+
"Load profile must contain at least one valid entry: h0, g[0-6], l[0-3], ep1, ez2 or NO_LOAD_PROFILE",
391+
loadInput)));
392+
393+
exceptions.addAll(
394+
Try.ofVoid(
395+
InvalidEntityException.class,
396+
() ->
397+
detectNegativeQuantities(
398+
new Quantity<?>[] {loadInput.getsRated(), loadInput.geteConsAnnual()},
399+
loadInput),
400+
() -> checkRatedPowerFactor(loadInput, loadInput.getCosPhiRated())));
401+
378402
exceptions.addAll(
379403
Try.ofVoid(
380404
InvalidEntityException.class,

src/test/groovy/edu/ie3/datamodel/utils/validation/SystemParticipantValidationUtilsTest.groovy

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import edu.ie3.datamodel.exceptions.InvalidEntityException
1414
import edu.ie3.datamodel.models.input.system.characteristic.WecCharacteristicInput
1515
import edu.ie3.datamodel.models.input.system.type.*
1616
import edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointType
17+
import edu.ie3.datamodel.models.profile.StandardLoadProfile
1718
import edu.ie3.datamodel.utils.Try
1819
import edu.ie3.test.common.SystemParticipantTestData
1920
import edu.ie3.util.quantities.interfaces.Currency
@@ -336,6 +337,35 @@ class SystemParticipantValidationUtilsTest extends Specification {
336337
SystemParticipantTestData.loadInput.copy().loadprofile(null).build() || 1 || new InvalidEntityException("No standard load profile defined for load", invalidLoad)
337338
SystemParticipantTestData.loadInput.copy().sRated(Quantities.getQuantity(-25d, ACTIVE_POWER_IN)).eConsAnnual(Quantities.getQuantity(-4000, ENERGY_IN)).build() || 1 || new InvalidEntityException("The following quantities have to be zero or positive: -25 kVA, -4000 kWh", invalidLoad)
338339
SystemParticipantTestData.loadInput.copy().cosPhiRated(2).build() || 1 || new InvalidEntityException("Rated power factor of LoadInput must be between 0 and 1", invalidLoad)
340+
SystemParticipantTestData.loadInput.copy().loadprofile(createInvalidStandardLoadProfile("h1")).build() || 1 || new InvalidEntityException("Load profile must contain at least one valid entry: h0, g[0-6], l[0-3], ep1, ez2 or NO_LOAD_PROFILE", invalidLoad)
341+
SystemParticipantTestData.loadInput.copy().loadprofile(createInvalidStandardLoadProfile("g7")).build() || 1 || new InvalidEntityException("Load profile must contain at least one valid entry: h0, g[0-6], l[0-3], ep1, ez2 or NO_LOAD_PROFILE", invalidLoad)
342+
SystemParticipantTestData.loadInput.copy().loadprofile(createInvalidStandardLoadProfile("l3")).build() || 1 || new InvalidEntityException("Load profile must contain at least one valid entry: h0, g[0-6], l[0-3], ep1, ez2 or NO_LOAD_PROFILE", invalidLoad)
343+
SystemParticipantTestData.loadInput.copy().loadprofile(createInvalidStandardLoadProfile("invalid")).build() || 1 || new InvalidEntityException("Load profile must contain at least one valid entry: h0, g[0-6], l[0-3], ep1, ez2 or NO_LOAD_PROFILE", invalidLoad)
344+
}
345+
346+
// Helper method to create invalid standard load profiles for testing
347+
private StandardLoadProfile createInvalidStandardLoadProfile(String profileName) {
348+
return new StandardLoadProfile() {
349+
@Override
350+
String getKey() {
351+
return profileName
352+
}
353+
354+
@Override
355+
String toString() {
356+
return profileName
357+
}
358+
359+
@Override
360+
boolean equals(Object obj) {
361+
return false // Ensure it doesn't match any default profiles
362+
}
363+
364+
@Override
365+
int hashCode() {
366+
return profileName.hashCode()
367+
}
368+
}
339369
}
340370

341371
// PV

0 commit comments

Comments
 (0)