Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
3ed7d1e
Adding updated `BdewStandardLoadProfiles`.
staudtMarius Apr 29, 2025
a91c505
fmt
staudtMarius May 6, 2025
cbd353b
Merge branch 'dev' into ms/#1292-add-updated-bdew-standard-load-profiles
staudtMarius May 7, 2025
5a63d66
Merge branch 'dev' into ms/#1292-add-updated-bdew-standard-load-profiles
staudtMarius May 8, 2025
e3376a6
Merge branch 'dev' into ms/#1292-add-updated-bdew-standard-load-profiles
staudtMarius May 9, 2025
505e18a
Adapted `CHANGELOG`.
staudtMarius May 9, 2025
bf69af7
Merge branch 'dev' into ms/#1292-add-updated-bdew-standard-load-profiles
staudtMarius May 23, 2025
a9f37a6
Merge branch 'dev' into ms/#1292-add-updated-bdew-standard-load-profiles
staudtMarius Jun 2, 2025
fe60de2
Enhancing load profile time series documentation.
staudtMarius Jul 11, 2025
2aba803
Merge branch 'dev' into ms/#1292-add-updated-bdew-standard-load-profiles
staudtMarius Jul 14, 2025
ac673db
Merge branch 'dev' into ms/#1292-add-updated-bdew-standard-load-profiles
staudtMarius Jul 14, 2025
bf029c1
Refactoring `BdewLoadValues`.
staudtMarius Jul 14, 2025
22a5c81
Simplify expected scheme in `BdewLoadProfileFactoryTest`
staudtMarius Jul 14, 2025
32d2e10
Refactoring getters in `BdewLoadValues`
staudtMarius Jul 16, 2025
794597d
fmt
staudtMarius Jul 16, 2025
4b20d8b
Fixing sonarqube issues.
staudtMarius Jul 17, 2025
f620aca
Merge branch 'dev' into ms/#1292-add-updated-bdew-standard-load-profiles
staudtMarius Jul 17, 2025
b612f00
Fixing sonarqube issues.
staudtMarius Jul 18, 2025
6b6d98c
Merge branch 'dev' into ms/#1292-add-updated-bdew-standard-load-profiles
staudtMarius Jul 23, 2025
175ba56
Merge branch 'dev' into ms/#1292-add-updated-bdew-standard-load-profiles
staudtMarius Jul 23, 2025
2e91707
Update CHANGELOG.
staudtMarius Jul 23, 2025
c3c38f7
Merge branch 'dev' into ms/#1292-add-updated-bdew-standard-load-profiles
staudtMarius Jul 25, 2025
0ec4ad8
Refactor calculation of max power for `BdewLoadValues`.
staudtMarius Jul 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased/Snapshot]

### Added
- Added updated `BdewStandardLoadProfiles` [#1292](https://github.com/ie3-institute/PowerSystemDataModel/issues/1292)

### 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)
Expand Down
5 changes: 4 additions & 1 deletion docs/readthedocs/io/csvfiles.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,11 @@ The following profiles are supported until now:
- Information
- Supported head line.
* - e.g.: H0
- BDEW standard load profiles ([source](https://www.bdew.de/energie/standardlastprofile-strom/))
- BDEW standard load profiles 1999 ([source](https://www.bdew.de/energie/standardlastprofile-strom/))
- Permissible head line: ``SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour``
* - e.g.: h25
- BDEW standard load profiles 2025 ([source](https://www.bdew.de/energie/standardlastprofile-strom/))
- Permissible head line: ``janSa,janSu,janWd,febSa,febSu,febWd,marSa,marSu,marWd,aprSa,aprSu,aprWd,maySa,maySu,mayWd,junSa,junSu,junWd,julSa,julSu,julWd,augSa,augSu,augWd,sepSa,sepSu,sepWd,octSa,octSu,octWd,novSa,novSu,novWd,decSa,decSu,decWd,quarterHour``
* - random
- A random load proile based on: ``Kays - Agent-based simulation environment for improving the planning of distribution grids``
- Permissible head line: ``kSa,kSu,kWd,mySa,mySu,myWd,sigmaSa,sigmaSu,sigmaWd,quarterHour``
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry;
import edu.ie3.datamodel.models.value.load.BdewLoadValues;
import edu.ie3.datamodel.models.value.load.BdewLoadValues.BDEW1999;
import edu.ie3.datamodel.models.value.load.BdewLoadValues.BDEW2025;
import edu.ie3.util.quantities.PowerSystemUnits;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Stream;
Expand All @@ -25,6 +28,7 @@

public class BdewLoadProfileFactory
extends LoadProfileFactory<BdewStandardLoadProfile, BdewLoadValues> {
// 1999 profile scheme
public static final String SUMMER_SATURDAY = "SuSa";
public static final String SUMMER_SUNDAY = "SuSu";
public static final String SUMMER_WEEKDAY = "SuWd";
Expand All @@ -35,6 +39,44 @@ public class BdewLoadProfileFactory
public static final String WINTER_SUNDAY = "WiSu";
public static final String WINTER_WEEKDAY = "WiWd";

// 2025 profile scheme
public static final String JANUARY_SATURDAY = "JanSa";
public static final String JANUARY_SUNDAY = "JanSu";
public static final String JANUARY_WEEKDAY = "JanWd";
public static final String FEBRUARY_SATURDAY = "FebSa";
public static final String FEBRUARY_SUNDAY = "FebSu";
public static final String FEBRUARY_WEEKDAY = "FebWd";
public static final String MARCH_SATURDAY = "MarSa";
public static final String MARCH_SUNDAY = "MarSu";
public static final String MARCH_WEEKDAY = "MarWd";
public static final String APRIL_SATURDAY = "AprSa";
public static final String APRIL_SUNDAY = "AprSu";
public static final String APRIL_WEEKDAY = "AprWd";
public static final String MAY_SATURDAY = "MaySa";
public static final String MAY_SUNDAY = "MaySu";
public static final String MAY_WEEKDAY = "MayWd";
public static final String JUNE_SATURDAY = "JunSa";
public static final String JUNE_SUNDAY = "JunSu";
public static final String JUNE_WEEKDAY = "JunWd";
public static final String JULY_SATURDAY = "JulSa";
public static final String JULY_SUNDAY = "JulSu";
public static final String JULY_WEEKDAY = "JulWd";
public static final String AUGUST_SATURDAY = "AugSa";
public static final String AUGUST_SUNDAY = "AugSu";
public static final String AUGUST_WEEKDAY = "AugWd";
public static final String SEPTEMBER_SATURDAY = "SepSa";
public static final String SEPTEMBER_SUNDAY = "SepSu";
public static final String SEPTEMBER_WEEKDAY = "SepWd";
public static final String OCTOBER_SATURDAY = "OctSa";
public static final String OCTOBER_SUNDAY = "OctSu";
public static final String OCTOBER_WEEKDAY = "OctWd";
public static final String NOVEMBER_SATURDAY = "NovSa";
public static final String NOVEMBER_SUNDAY = "NovSu";
public static final String NOVEMBER_WEEKDAY = "NovWd";
public static final String DECEMBER_SATURDAY = "DecSa";
public static final String DECEMBER_SUNDAY = "DecSu";
public static final String DECEMBER_WEEKDAY = "DecWd";

public BdewLoadProfileFactory() {
this(BdewLoadValues.class);
}
Expand All @@ -47,18 +89,64 @@ public BdewLoadProfileFactory(Class<BdewLoadValues> valueClass) {
protected LoadProfileEntry<BdewLoadValues> buildModel(LoadProfileData<BdewLoadValues> data) {
int quarterHour = data.getInt(QUARTER_HOUR);

return new LoadProfileEntry<>(
new BdewLoadValues(
data.getDouble(SUMMER_SATURDAY),
data.getDouble(SUMMER_SUNDAY),
data.getDouble(SUMMER_WEEKDAY),
data.getDouble(TRANSITION_SATURDAY),
data.getDouble(TRANSITION_SUNDAY),
data.getDouble(TRANSITION_WEEKDAY),
data.getDouble(WINTER_SATURDAY),
data.getDouble(WINTER_SUNDAY),
data.getDouble(WINTER_WEEKDAY)),
quarterHour);
boolean is1999Scheme = data.containsKey(SUMMER_SATURDAY);

BdewLoadValues values;

if (is1999Scheme) {
values =
new BDEW1999(
data.getDouble(SUMMER_SATURDAY),
data.getDouble(SUMMER_SUNDAY),
data.getDouble(SUMMER_WEEKDAY),
data.getDouble(TRANSITION_SATURDAY),
data.getDouble(TRANSITION_SUNDAY),
data.getDouble(TRANSITION_WEEKDAY),
data.getDouble(WINTER_SATURDAY),
data.getDouble(WINTER_SUNDAY),
data.getDouble(WINTER_WEEKDAY));
} else {
values =
new BDEW2025(
data.getDouble(JANUARY_SATURDAY),
data.getDouble(JANUARY_SUNDAY),
data.getDouble(JANUARY_WEEKDAY),
data.getDouble(FEBRUARY_SATURDAY),
data.getDouble(FEBRUARY_SUNDAY),
data.getDouble(FEBRUARY_WEEKDAY),
data.getDouble(MARCH_SATURDAY),
data.getDouble(MARCH_SUNDAY),
data.getDouble(MARCH_WEEKDAY),
data.getDouble(APRIL_SATURDAY),
data.getDouble(APRIL_SUNDAY),
data.getDouble(APRIL_WEEKDAY),
data.getDouble(MAY_SATURDAY),
data.getDouble(MAY_SUNDAY),
data.getDouble(MAY_WEEKDAY),
data.getDouble(JUNE_SATURDAY),
data.getDouble(JUNE_SUNDAY),
data.getDouble(JUNE_WEEKDAY),
data.getDouble(JULY_SATURDAY),
data.getDouble(JULY_SUNDAY),
data.getDouble(JULY_WEEKDAY),
data.getDouble(AUGUST_SATURDAY),
data.getDouble(AUGUST_SUNDAY),
data.getDouble(AUGUST_WEEKDAY),
data.getDouble(SEPTEMBER_SATURDAY),
data.getDouble(SEPTEMBER_SUNDAY),
data.getDouble(SEPTEMBER_WEEKDAY),
data.getDouble(OCTOBER_SATURDAY),
data.getDouble(OCTOBER_SUNDAY),
data.getDouble(OCTOBER_WEEKDAY),
data.getDouble(NOVEMBER_SATURDAY),
data.getDouble(NOVEMBER_SUNDAY),
data.getDouble(NOVEMBER_WEEKDAY),
data.getDouble(DECEMBER_SATURDAY),
data.getDouble(DECEMBER_SUNDAY),
data.getDouble(DECEMBER_WEEKDAY));
}

return new LoadProfileEntry<>(values, quarterHour);
}

@Override
Expand All @@ -74,7 +162,46 @@ protected List<Set<String>> getFields(Class<?> entityClass) {
TRANSITION_WEEKDAY,
WINTER_SATURDAY,
WINTER_SUNDAY,
WINTER_WEEKDAY));
WINTER_WEEKDAY),
newSet(
JANUARY_SATURDAY,
JANUARY_SUNDAY,
JANUARY_WEEKDAY,
FEBRUARY_SATURDAY,
FEBRUARY_SUNDAY,
FEBRUARY_WEEKDAY,
MARCH_SATURDAY,
MARCH_SUNDAY,
MARCH_WEEKDAY,
APRIL_SATURDAY,
APRIL_SUNDAY,
APRIL_WEEKDAY,
MAY_SATURDAY,
MAY_SUNDAY,
MAY_WEEKDAY,
JUNE_SATURDAY,
JUNE_SUNDAY,
JUNE_WEEKDAY,
JULY_SATURDAY,
JULY_SUNDAY,
JULY_WEEKDAY,
AUGUST_SATURDAY,
AUGUST_SUNDAY,
AUGUST_WEEKDAY,
SEPTEMBER_SATURDAY,
SEPTEMBER_SUNDAY,
SEPTEMBER_WEEKDAY,
OCTOBER_SATURDAY,
OCTOBER_SUNDAY,
OCTOBER_SUNDAY,
OCTOBER_WEEKDAY,
NOVEMBER_SATURDAY,
NOVEMBER_SUNDAY,
NOVEMBER_WEEKDAY,
DECEMBER_SATURDAY,
DECEMBER_SUNDAY,
DECEMBER_WEEKDAY,
QUARTER_HOUR));
}

@Override
Expand Down Expand Up @@ -106,12 +233,9 @@ public ComparableQuantity<Power> calculateMaxPower(
if (loadProfile == BdewStandardLoadProfile.H0) {
// maximum dynamization factor is on day 366 (leap year) or day 365 (regular year).
// The difference between day 365 and day 366 is negligible, thus pick 366
valueExtractor =
v ->
Stream.of(v.getWiSa(), v.getWiSu(), v.getWiWd())
.map(p -> BdewLoadValues.dynamization(p, 366));
valueExtractor = v -> v.lastDayOfYearValues().map(p -> BdewLoadValues.dynamization(p, 366));
} else {
valueExtractor = v -> v.values().stream();
valueExtractor = BdewLoadValues::values;
}

double maxPower =
Expand All @@ -123,4 +247,16 @@ public ComparableQuantity<Power> calculateMaxPower(

return Quantities.getQuantity(maxPower, WATT);
}

/** Returns the load profile energy scaling. The default value is 1000 kWh */
public ComparableQuantity<Energy> getLoadProfileEnergyScaling(
BdewStandardLoadProfile loadProfile) {

// the updated profiled are scaled to 1 million kWh -> 1000 MWh
// old profiles are scaled to 1000 kWh
return switch (loadProfile) {
case H25, G25, L25, P25, S25 -> Quantities.getQuantity(1000d, PowerSystemUnits.MEGAWATTHOUR);
default -> Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR);
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,13 @@ public class TimeSeriesProcessor<
new TimeSeriesProcessorKey(
IndividualTimeSeries.class, TimeBasedValue.class, HeatAndSValue.class),
new TimeSeriesProcessorKey(
BdewLoadProfileTimeSeries.class, LoadProfileEntry.class, BdewLoadValues.class),
BdewLoadProfileTimeSeries.class,
LoadProfileEntry.class,
BdewLoadValues.BDEW1999.class),
new TimeSeriesProcessorKey(
BdewLoadProfileTimeSeries.class,
LoadProfileEntry.class,
BdewLoadValues.BDEW2025.class),
new TimeSeriesProcessorKey(
RandomLoadProfileTimeSeries.class, LoadProfileEntry.class, RandomLoadValues.class));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,21 @@
*/
public enum BdewStandardLoadProfile implements StandardLoadProfile {
H0("h0"), // Households
H25("h25"), // household (Updated 2025)
L0("l0"), // Agricultural enterprises without further differentiation
L1("l1"), // Agricultural enterprises with dairy sector
L2("l2"), // Agricultural enterprises without dairy sector
L25("l25"), // Agricultural enterprises without further differentiation (Updated 2025)
G0("g0"), // Businesses without further differentiation
G1("g1"), // Workday businesses from 8 a.m. to 6 p.m.
G2("g2"), // Businesses with high consumption in evening hours
G3("g3"), // Businesses with enduring consumption
G4("g4"), // Vendor or barber shop
G5("g5"), // Bakery
G6("g6"); // Business with main consumption on weekends
G6("g6"), // Business with main consumption on weekends
G25("g25"), // Businesses without further differentiation (Updated 2025)
P25("p25"), // PV profile
S25("s25"); // Combined PV and storage profile

private final String key;

Expand Down
Loading