Skip to content
Open
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
83cf8d7
Correctly persist EmInput entities in CsvFileSink
pierrepetersmeier Sep 1, 2025
7c5936f
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
pierrepetersmeier Sep 8, 2025
87937f9
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
pierrepetersmeier Sep 19, 2025
d0b9e56
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
pierrepetersmeier Sep 24, 2025
ac5b72a
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
staudtMarius Sep 25, 2025
15eb11a
Add a test that reads in the persisted grid and compares it with the …
pierrepetersmeier Sep 29, 2025
175e758
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
pierrepetersmeier Sep 29, 2025
14416ca
Add em_inputs.csv for GridIoIT
pierrepetersmeier Oct 2, 2025
41ee164
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
pierrepetersmeier Oct 2, 2025
71c5159
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
pierrepetersmeier Feb 10, 2026
7a9cac3
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
danielfeismann Feb 10, 2026
5f6da26
Add test for persisting JointGridContainer with EmInput
pierrepetersmeier Feb 12, 2026
15686a3
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
pierrepetersmeier Feb 12, 2026
88b61d8
Refactor GridIoIT setup and cleanup methods for improved clarity beca…
pierrepetersmeier Feb 12, 2026
cc3605c
Merge remote-tracking branch 'origin/pp/#1337-eminputs-arent-written-…
pierrepetersmeier Feb 12, 2026
fdf5bbb
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
danielfeismann Feb 13, 2026
7fa92bc
reintroduce EnergyManagementUnits
danielfeismann Feb 18, 2026
1aa5e70
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
danielfeismann Feb 18, 2026
baa0e5a
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
danielfeismann Mar 10, 2026
3db2a86
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
danielfeismann Mar 10, 2026
2f56e84
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
staudtMarius Mar 18, 2026
9800c50
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
pierrepetersmeier Mar 18, 2026
226345c
Fix EmInput serialization in CsvFileSink.java.
pierrepetersmeier Mar 23, 2026
058966e
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
pierrepetersmeier Mar 24, 2026
0d6ea6e
add missing EmInput to SampleJointGrid data and fmt
pierrepetersmeier Mar 25, 2026
8bd4863
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
pierrepetersmeier Mar 25, 2026
c1c79ed
Refactor persistJointGrid to remove redundant set allocations
pierrepetersmeier Mar 25, 2026
79022d7
Merge remote-tracking branch 'origin/pp/#1337-eminputs-arent-written-…
pierrepetersmeier Mar 25, 2026
acc2321
add examples for emControlStrategy to docs
danielfeismann Mar 25, 2026
57a90c4
optimize imports
danielfeismann Mar 25, 2026
bd3f1e1
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
danielfeismann Mar 26, 2026
cad3c6b
Adres review comments
pierrepetersmeier Mar 26, 2026
e7c3d16
Adres review comments
pierrepetersmeier Apr 2, 2026
76576bb
Merge branch 'dev' into pp/#1337-eminputs-arent-written-while-persist…
danielfeismann Apr 2, 2026
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed handling of erroneous field values in `EntitySource.enrichWithDefault()` [#1511](https://github.com/ie3-institute/PowerSystemDataModel/issues/1511)
- Fixed some minor typos and inconsistencies in variable naming [#1542](https://github.com/ie3-institute/PowerSystemDataModel/issues/1542)
- Aligned temperature processing in `COSMO` and `ICON` factories to Kelvin [#1521](https://github.com/ie3-institute/PowerSystemDataModel/issues/1521)
- Correctly persist EmInput entities in CsvFileSink [#1337](https://github.com/ie3-institute/PowerSystemDataModel/issues/1337)

### Changed
- Updated CI-Pipeline to run task `Deploy` and `Staging` only for `Main` [#1403](https://github.com/ie3-institute/PowerSystemDataModel/issues/1403)
Expand Down
18 changes: 17 additions & 1 deletion src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import edu.ie3.datamodel.io.csv.BufferedCsvWriter;
import edu.ie3.datamodel.io.csv.CsvFileDefinition;
import edu.ie3.datamodel.io.extractor.Extractor;
import edu.ie3.datamodel.io.extractor.HasEm;
import edu.ie3.datamodel.io.extractor.NestedEntity;
import edu.ie3.datamodel.io.naming.FileNamingStrategy;
import edu.ie3.datamodel.io.processor.ProcessorProvider;
Expand Down Expand Up @@ -225,14 +226,29 @@ public void persistJointGrid(JointGridContainer jointGridContainer) {
.flatMap(Optional::stream)
.collect(Collectors.toSet());

// extract all EmInput entities
Set<EmInput> emInputs =
systemParticipants.allEntitiesAsList().stream()
.filter(HasEm.class::isInstance)
.map(HasEm.class::cast)
.map(HasEm::getControllingEm)
.flatMap(Optional::stream)
.flatMap(
em ->
Stream.iterate(
em, Objects::nonNull, current -> current.getControllingEm().orElse(null)))
.collect(Collectors.toSet());

// persist all entities
Stream.of(
rawGridElements.allEntitiesAsList(),
systemParticipants.allEntitiesAsList(),
graphicElements.allEntitiesAsList(),
types,
operators)
operators,
emInputs)
.flatMap(Collection::stream)
.collect(Collectors.toSet())
.forEach(this::persistIgnoreNested);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import edu.ie3.datamodel.io.processor.input.InputEntityProcessor
import edu.ie3.datamodel.io.processor.result.ResultEntityProcessor
import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessor
import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey
import edu.ie3.datamodel.io.source.csv.CsvJointGridContainerSource
import edu.ie3.datamodel.models.OperationTime
import edu.ie3.datamodel.models.StandardUnits
import edu.ie3.datamodel.models.input.EmInput
Expand Down Expand Up @@ -357,6 +358,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData {
testBaseFolderPath.resolve("storage_type_input.csv").toFile().exists()
testBaseFolderPath.resolve("transformer_2_w_input.csv").toFile().exists()
testBaseFolderPath.resolve("transformer_2_w_type_input.csv").toFile().exists()
testBaseFolderPath.resolve("em_input.csv").toFile().exists()

cleanup:
csvFileSink.shutdown()
Expand Down
64 changes: 56 additions & 8 deletions src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,12 @@ import edu.ie3.datamodel.io.naming.DefaultDirectoryHierarchy
import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy
import edu.ie3.datamodel.io.naming.FileNamingStrategy
import edu.ie3.datamodel.io.sink.CsvFileSink
import edu.ie3.datamodel.models.OperationTime
import edu.ie3.datamodel.models.input.EmInput
import edu.ie3.datamodel.models.input.OperatorInput
import edu.ie3.datamodel.models.input.container.JointGridContainer
import edu.ie3.datamodel.models.input.container.SystemParticipants
import edu.ie3.util.io.FileIOUtils
import spock.lang.Shared
import spock.lang.Specification

import java.nio.file.Files
Expand All @@ -23,16 +27,11 @@ import java.nio.file.Path
*/
class GridIoIT extends Specification implements CsvTestDataMeta {

@Shared
Path tempDirectory

@Shared
CsvFileSink sinkFlat

@Shared
CsvFileSink sinkHierarchic

def setupSpec() {
def setup() {
FileNamingStrategy hierarchicNamingStrategy = new FileNamingStrategy(
new EntityPersistenceNamingStrategy(),
new DefaultDirectoryHierarchy(Path.of("output"), "vn_simona"))
Expand All @@ -41,7 +40,7 @@ class GridIoIT extends Specification implements CsvTestDataMeta {
sinkHierarchic = new CsvFileSink(tempDirectory.toAbsolutePath(), hierarchicNamingStrategy, ",")
}

def cleanupSpec() {
def cleanup() {
sinkFlat.shutdown()
sinkHierarchic.shutdown()
FileIOUtils.deleteRecursively(tempDirectory)
Expand Down Expand Up @@ -93,4 +92,53 @@ class GridIoIT extends Specification implements CsvTestDataMeta {
then:
thrown(FileException)
}

def "Input flat JointGridContainer with EmInput equals Output flat JointGridContainer."() {
given:
def gridName = "vn_simona"
def separator = ","
def baseGrid = CsvJointGridContainerSource.read(gridName, separator, jointGridFolderPath, false)

def emInput = new EmInput(
UUID.randomUUID(),
"test_em",
OperatorInput.NO_OPERATOR_ASSIGNED,
OperationTime.notLimited(),
"control_strategy_test",
null
)

def participants = baseGrid.systemParticipants
def oldPv = participants.pvPlants.first()
def newPv = oldPv.copy().em(emInput).build()

def newPvs = (participants.pvPlants - oldPv + newPv)

def newParticipants = new SystemParticipants(
participants.bmPlants,
participants.chpPlants,
participants.evcs,
participants.evs,
participants.fixedFeedIns,
participants.heatPumps,
participants.loads,
newPvs,
participants.storages,
participants.wecPlants
)

def gridWithEm = new JointGridContainer(
baseGrid.gridName,
baseGrid.rawGrid,
newParticipants,
baseGrid.graphics
)

when:
sinkFlat.persistJointGrid(gridWithEm)
def readGrid = CsvJointGridContainerSource.read(gridName, separator, tempDirectory.toAbsolutePath(), false)

then:
gridWithEm == readGrid
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
uuid,id,operator,operates_from,operates_until,controlStrategy,controllingEm
4e2f47a6-40f4-4952-9b2f-7b7d2558a143,em_system_1,,,,"SelfConsumptionOptimized",
a3e8e4a3-7b1b-4b1e-9e7b-8d6e3f5a2b1d,em_system_2,,,,GridSupportive,4e2f47a6-40f4-4952-9b2f-7b7d2558a143
b8d9c5b2-6c2c-4c2d-8f8c-9e7f4a6b3c2e,em_system_3,,,,PriceReactive,4e2f47a6-40f4-4952-9b2f-7b7d2558a143
c7f0d6c1-5d3d-4d3e-7a9d-1f8a5b7c4d3f,em__system_4,,,,StoragePriority,4e2f47a6-40f4-4952-9b2f-7b7d2558a143
d6a1e7d0-4e4e-4e4f-6b0e-2a9b6c8d5e4a,em_system_5,,,,FeedInLimitation,4e2f47a6-40f4-4952-9b2f-7b7d2558a143