Skip to content

Commit 956d81a

Browse files
committed
Adding a timeseries for voltage values.
1 parent 4ee9d54 commit 956d81a

File tree

18 files changed

+278
-48
lines changed

18 files changed

+278
-48
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77
## [Unreleased/Snapshot]
88

99
### Added
10+
- Adding timeseries for voltage values [#1128](https://github.com/ie3-institute/PowerSystemDataModel/issues/1128)
1011

1112
### Fixed
1213

src/main/java/edu/ie3/datamodel/exceptions/EntityProcessorException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
package edu.ie3.datamodel.exceptions;
77

88
/**
9-
* Is thrown, when an something went wrong during entity field mapping creation in a {@link
9+
* Is thrown, when something went wrong during entity field mapping creation in a {@link
1010
* edu.ie3.datamodel.io.processor.EntityProcessor}
1111
*/
1212
public class EntityProcessorException extends Exception {

src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
import edu.ie3.util.TimeUtil;
1515
import java.time.ZonedDateTime;
1616
import java.time.format.DateTimeFormatter;
17-
import java.util.*;
17+
import java.util.Arrays;
18+
import java.util.Collections;
19+
import java.util.List;
20+
import java.util.Set;
1821

1922
public class TimeBasedSimpleValueFactory<V extends Value>
2023
extends TimeBasedValueFactory<SimpleTimeBasedValueData<V>, V> {
@@ -26,6 +29,10 @@ public class TimeBasedSimpleValueFactory<V extends Value>
2629
private static final String REACTIVE_POWER = "q";
2730
private static final String HEAT_DEMAND = "heatDemand";
2831

32+
/* voltage */
33+
private static final String VMAG = "vMag";
34+
private static final String VANG = "VAng";
35+
2936
private final TimeUtil timeUtil;
3037

3138
public TimeBasedSimpleValueFactory(Class<? extends V> valueClasses) {
@@ -78,6 +85,17 @@ protected TimeBasedValue<V> buildModel(SimpleTimeBasedValueData<V> data) {
7885
data.getQuantity(REACTIVE_POWER, REACTIVE_POWER_IN));
7986
} else if (PValue.class.isAssignableFrom(data.getTargetClass())) {
8087
value = (V) new PValue(data.getQuantity(ACTIVE_POWER, ACTIVE_POWER_IN));
88+
} else if (VoltageValue.class.isAssignableFrom(data.getTargetClass())) {
89+
90+
try {
91+
value =
92+
(V)
93+
new VoltageValue(
94+
data.getQuantity(VMAG, VOLTAGE_MAGNITUDE),
95+
data.getQuantity(VANG, VOLTAGE_ANGLE));
96+
} catch (FactoryException e) {
97+
value = (V) new VoltageValue(data.getQuantity(VMAG, VOLTAGE_MAGNITUDE));
98+
}
8199
} else {
82100
throw new FactoryException(
83101
"The given factory cannot handle target class '" + data.getTargetClass() + "'.");

src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
*/
66
package edu.ie3.datamodel.io.factory.timeseries;
77

8+
import edu.ie3.datamodel.exceptions.FactoryException;
89
import edu.ie3.datamodel.io.factory.EntityData;
910
import edu.ie3.datamodel.io.factory.EntityFactory;
1011
import edu.ie3.datamodel.io.source.TimeSeriesMappingSource;
11-
import java.util.Collections;
1212
import java.util.List;
1313
import java.util.Set;
1414
import java.util.UUID;
@@ -17,6 +17,7 @@
1717

1818
public class TimeSeriesMappingFactory
1919
extends EntityFactory<TimeSeriesMappingSource.MappingEntry, EntityData> {
20+
private static final String ENTITY = "entity";
2021
private static final String PARTICIPANT = "participant";
2122
private static final String TIME_SERIES = "timeSeries";
2223

@@ -26,14 +27,21 @@ public TimeSeriesMappingFactory() {
2627

2728
@Override
2829
protected List<Set<String>> getFields(Class<?> entityClass) {
29-
return Collections.singletonList(
30+
return List.of(
31+
Stream.of(ENTITY, TIME_SERIES).collect(Collectors.toSet()),
3032
Stream.of(PARTICIPANT, TIME_SERIES).collect(Collectors.toSet()));
3133
}
3234

3335
@Override
3436
protected TimeSeriesMappingSource.MappingEntry buildModel(EntityData data) {
35-
UUID participant = data.getUUID(PARTICIPANT);
3637
UUID timeSeries = data.getUUID(TIME_SERIES);
37-
return new TimeSeriesMappingSource.MappingEntry(participant, timeSeries);
38+
39+
try {
40+
UUID entity = data.getUUID(ENTITY);
41+
return new TimeSeriesMappingSource.EntityMappingEntry(entity, timeSeries);
42+
} catch (FactoryException e) {
43+
UUID participant = data.getUUID(PARTICIPANT);
44+
return new TimeSeriesMappingSource.ParticipantMappingEntry(participant, timeSeries);
45+
}
3846
}
3947
}

src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ public enum ColumnScheme {
1919
HEAT_DEMAND("h", HeatDemandValue.class),
2020
ACTIVE_POWER_AND_HEAT_DEMAND("ph", HeatAndPValue.class),
2121
APPARENT_POWER_AND_HEAT_DEMAND("pqh", HeatAndSValue.class),
22-
WEATHER("weather", WeatherValue.class);
22+
WEATHER("weather", WeatherValue.class),
23+
VOLTAGE("v", VoltageValue.class);
2324

2425
private final String scheme;
2526
private final Class<? extends Value> valueClass;
@@ -57,6 +58,7 @@ public static <V extends Value> Optional<ColumnScheme> parse(Class<V> valueClass
5758
if (PValue.class.isAssignableFrom(valueClass)) return Optional.of(ACTIVE_POWER);
5859
if (HeatDemandValue.class.isAssignableFrom(valueClass)) return Optional.of(HEAT_DEMAND);
5960
if (WeatherValue.class.isAssignableFrom(valueClass)) return Optional.of(WEATHER);
61+
if (VoltageValue.class.isAssignableFrom(valueClass)) return Optional.of(VOLTAGE);
6062
return Optional.empty();
6163
}
6264
}

src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ protected EntityProcessor(Class<? extends T> registeredClass) throws EntityProce
5555
* during processing
5656
*/
5757
public LinkedHashMap<String, String> handleEntity(T entity) throws EntityProcessorException {
58-
if (!registeredClass.equals(entity.getClass()))
58+
if (!registeredClass.isAssignableFrom(entity.getClass()))
5959
throw new EntityProcessorException(
6060
"Cannot process "
6161
+ entity.getClass().getSimpleName()

src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import edu.ie3.datamodel.io.factory.EntityData;
1212
import edu.ie3.datamodel.io.factory.timeseries.TimeSeriesMappingFactory;
1313
import edu.ie3.datamodel.models.input.InputEntity;
14-
import edu.ie3.datamodel.models.input.system.SystemParticipantInput;
1514
import edu.ie3.datamodel.models.timeseries.TimeSeries;
1615
import edu.ie3.datamodel.utils.Try;
1716
import edu.ie3.datamodel.utils.Try.*;
@@ -47,7 +46,7 @@ public Map<UUID, UUID> getMapping() throws SourceException {
4746
.filter(Try::isSuccess)
4847
.map(t -> (Success<MappingEntry, FactoryException>) t)
4948
.map(Success::get)
50-
.collect(Collectors.toMap(MappingEntry::participant, MappingEntry::timeSeries));
49+
.collect(Collectors.toMap(MappingEntry::getEntity, MappingEntry::getTimeSeries));
5150
}
5251

5352
/**
@@ -80,12 +79,19 @@ private Try<MappingEntry, FactoryException> createMappingEntry(
8079

8180
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
8281

83-
/** Class to represent one entry within the participant to time series mapping */
84-
public record MappingEntry(UUID participant, UUID timeSeries) implements InputEntity {
82+
/** Class to represent one entry within the entity to time series mapping */
83+
public abstract static class MappingEntry implements InputEntity {
84+
protected final UUID entity;
85+
private final UUID timeSeries;
8586

86-
/** Returns the {@link UUID} of the {@link SystemParticipantInput}. */
87-
public UUID getParticipant() {
88-
return participant;
87+
public MappingEntry(UUID entity, UUID timeSeries) {
88+
this.entity = entity;
89+
this.timeSeries = timeSeries;
90+
}
91+
92+
/** Returns the {@link UUID} of the {@link edu.ie3.datamodel.models.UniqueEntity}. */
93+
public UUID getEntity() {
94+
return entity;
8995
}
9096

9197
/** Returns the {@link UUID} of the {@link TimeSeries}. */
@@ -97,17 +103,56 @@ public UUID getTimeSeries() {
97103
public boolean equals(Object o) {
98104
if (this == o) return true;
99105
if (!(o instanceof MappingEntry that)) return false;
100-
return participant.equals(that.participant) && timeSeries.equals(that.timeSeries);
106+
return entity.equals(that.entity) && timeSeries.equals(that.timeSeries);
101107
}
102108

103109
@Override
104110
public int hashCode() {
105-
return Objects.hash(participant, timeSeries);
111+
return Objects.hash(entity, timeSeries);
112+
}
113+
114+
@Override
115+
public String toString() {
116+
return "MappingEntry{" + "entity=" + entity + ", timeSeries=" + timeSeries + '}';
117+
}
118+
}
119+
120+
/** Class to represent one entry within the entity to time series mapping */
121+
public static class EntityMappingEntry extends MappingEntry {
122+
123+
public EntityMappingEntry(UUID entity, UUID timeSeries) {
124+
super(entity, timeSeries);
125+
}
126+
127+
@Override
128+
public String toString() {
129+
return "EntityMappingEntry{" + "entity=" + entity + ", timeSeries=" + getTimeSeries() + '}';
130+
}
131+
}
132+
133+
/** Class to represent one entry within the participant to time series mapping */
134+
public static class ParticipantMappingEntry extends MappingEntry {
135+
136+
public ParticipantMappingEntry(UUID participant, UUID timeSeries) {
137+
super(participant, timeSeries);
138+
}
139+
140+
/**
141+
* Returns the {@link UUID} of the {@link
142+
* edu.ie3.datamodel.models.input.system.SystemParticipantInput}.
143+
*/
144+
public UUID getParticipant() {
145+
return entity;
106146
}
107147

108148
@Override
109149
public String toString() {
110-
return "MappingEntry{" + "participant=" + participant + ", timeSeries=" + timeSeries + '}';
150+
return "ParticipantMappingEntry{"
151+
+ "participant="
152+
+ entity
153+
+ ", timeSeries="
154+
+ getTimeSeries()
155+
+ '}';
111156
}
112157
}
113158
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* © 2024. 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.models.value;
7+
8+
import static edu.ie3.datamodel.models.StandardUnits.VOLTAGE_ANGLE;
9+
import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM;
10+
import static edu.ie3.util.quantities.PowerSystemUnits.PU;
11+
import static java.lang.Math.*;
12+
13+
import java.util.Objects;
14+
import java.util.Optional;
15+
import javax.measure.quantity.Angle;
16+
import javax.measure.quantity.Dimensionless;
17+
import tech.units.indriya.ComparableQuantity;
18+
import tech.units.indriya.quantity.Quantities;
19+
20+
/** Describes a voltage value as a pair of magnitude and angle */
21+
public class VoltageValue implements Value {
22+
23+
/** Magnitude of the voltage in p.u. */
24+
private final ComparableQuantity<Dimensionless> magnitude;
25+
/** Angle of the voltage in degree */
26+
private final ComparableQuantity<Angle> angle;
27+
28+
/**
29+
* @param magnitude of the voltage in p.u.
30+
* @param angle of the voltage in degree
31+
*/
32+
public VoltageValue(
33+
ComparableQuantity<Dimensionless> magnitude, ComparableQuantity<Angle> angle) {
34+
this.magnitude = magnitude;
35+
this.angle = angle;
36+
}
37+
38+
/**
39+
* This constructor will set the angle to 0°
40+
*
41+
* @param magnitude of the voltage in p.u.
42+
*/
43+
public VoltageValue(ComparableQuantity<Dimensionless> magnitude) {
44+
this.magnitude = magnitude;
45+
this.angle = Quantities.getQuantity(0.0, VOLTAGE_ANGLE);
46+
}
47+
48+
public Optional<ComparableQuantity<Dimensionless>> getMagnitude() {
49+
return Optional.ofNullable(magnitude);
50+
}
51+
52+
public Optional<ComparableQuantity<Angle>> getAngle() {
53+
return Optional.ofNullable(angle);
54+
}
55+
56+
public Optional<ComparableQuantity<Dimensionless>> getRealPart() {
57+
double mag = magnitude.to(PU).getValue().doubleValue();
58+
double ang = angle.to(DEGREE_GEOM).getValue().doubleValue();
59+
60+
double eInPu = mag * cos(toRadians(ang));
61+
return Optional.of(Quantities.getQuantity(eInPu, PU));
62+
}
63+
64+
public Optional<ComparableQuantity<Dimensionless>> getImagPart() {
65+
double mag = magnitude.to(PU).getValue().doubleValue();
66+
double ang = angle.to(DEGREE_GEOM).getValue().doubleValue();
67+
68+
double eInPu = mag * sin(toRadians(ang));
69+
return Optional.of(Quantities.getQuantity(eInPu, PU));
70+
}
71+
72+
@Override
73+
public boolean equals(Object o) {
74+
if (this == o) return true;
75+
if (o == null || getClass() != o.getClass()) return false;
76+
VoltageValue that = (VoltageValue) o;
77+
return Objects.equals(magnitude, that.magnitude) && Objects.equals(angle, that.angle);
78+
}
79+
80+
@Override
81+
public int hashCode() {
82+
return Objects.hash(magnitude, angle);
83+
}
84+
85+
@Override
86+
public String toString() {
87+
return "VoltageValue{" + "magnitude=" + magnitude + ", angle=" + angle + '}';
88+
}
89+
}

src/main/java/edu/ie3/datamodel/utils/TimeSeriesUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ public class TimeSeriesUtils {
2525
ENERGY_PRICE,
2626
APPARENT_POWER_AND_HEAT_DEMAND,
2727
ACTIVE_POWER_AND_HEAT_DEMAND,
28-
HEAT_DEMAND);
28+
HEAT_DEMAND,
29+
VOLTAGE);
2930

3031
/** Private Constructor as this class is not meant to be instantiated */
3132
private TimeSeriesUtils() {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class UniquenessValidationUtils extends ValidationUtils {
3333
protected static final FieldSetSupplier<CongestionResult> congestionResultFieldSupplier =
3434
entity -> Set.of(entity.getTime(), entity.getSubgrid());
3535
protected static final FieldSetSupplier<MappingEntry> mappingFieldSupplier =
36-
entity -> Set.of(entity.participant());
36+
entity -> Set.of(entity.getEntity());
3737
protected static final FieldSetSupplier<IdCoordinateInput> idCoordinateSupplier =
3838
entity -> Set.of(entity.id(), entity.point());
3939
protected static final FieldSetSupplier<TimeBasedValue<WeatherValue>> weatherValueFieldSupplier =

0 commit comments

Comments
 (0)