From 4212f52eb3fa0a935440fdf798b55abb232b18a7 Mon Sep 17 00:00:00 2001 From: Sam van der Zwan Date: Thu, 12 Feb 2026 10:40:15 +0100 Subject: [PATCH 1/7] Add4ed additional check to only include heatstorages and not ates --- .../adapter/transforms/controller_mapper.py | 29 ++++++++++++++----- .../entities/assets/esdl_asset_object.py | 4 +++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/omotes_simulator_core/adapter/transforms/controller_mapper.py b/src/omotes_simulator_core/adapter/transforms/controller_mapper.py index 7a96e7d2..2633c96d 100644 --- a/src/omotes_simulator_core/adapter/transforms/controller_mapper.py +++ b/src/omotes_simulator_core/adapter/transforms/controller_mapper.py @@ -123,13 +123,7 @@ def to_entity( if esdl_asset.get_number_of_ports() == 2 ] - storages = [ - ControllerIdealHeatStorageMapper().to_entity(esdl_asset=esdl_asset) - for esdl_asset in esdl_object.get_all_assets_of_type(OmotesAssetLabels.STORAGE) - ] + [ - ControllerAtesStorageMapper().to_entity(esdl_asset=esdl_asset) - for esdl_asset in esdl_object.get_all_assets_of_type(OmotesAssetLabels.ATES) - ] + storages = self.convert_heat_storages_and_ates(esdl_object) # if there are no heat transfer assets, all assets can be stored into one network. if not heat_transfer_assets: @@ -264,6 +258,27 @@ def heat_transfer_assets_to_network( ) return network_list + def convert_heat_storages_and_ates( + self, esdl_object: EsdlObject + ) -> list[ControllerAtestStorage | ControllerIdealHeatStorage]: + """Method to convert heat storages and ates to controller storage objects.""" + esdl_storages = esdl_object.get_all_assets_of_type(OmotesAssetLabels.STORAGE) + esdl_storages = [ + storage + for storage in esdl_storages + if storage.get_esdl_type() == OmotesAssetLabels.STORAGE + ] + esdl_ates = esdl_object.get_all_assets_of_type(OmotesAssetLabels.ATES) + + storages = [ + ControllerIdealHeatStorageMapper().to_entity(esdl_asset=esdl_asset) + for esdl_asset in esdl_storages + ] + [ + ControllerAtesStorageMapper().to_entity(esdl_asset=esdl_asset) + for esdl_asset in esdl_ates + ] + return storages + def belongs_to_network(id: str, network: NetworkItems, graph: Graph) -> bool: """Check if the id is connected to a heat transfer asset in the network. diff --git a/src/omotes_simulator_core/entities/assets/esdl_asset_object.py b/src/omotes_simulator_core/entities/assets/esdl_asset_object.py index 13ea7fea..419d95f0 100644 --- a/src/omotes_simulator_core/entities/assets/esdl_asset_object.py +++ b/src/omotes_simulator_core/entities/assets/esdl_asset_object.py @@ -20,6 +20,7 @@ import pandas as pd from esdl import esdl +from omotes_simulator_core.adapter.transforms.string_to_esdl import StringEsdlAssetMapper from omotes_simulator_core.adapter.transforms.transform_utils import Port, PortType, sort_ports from omotes_simulator_core.entities.assets.controller.profile_interpolation import ( ProfileInterpolationMethod, @@ -194,6 +195,9 @@ def is_heat_transfer_asset(self) -> bool: self.esdl_asset, esdl.HeatExchange ) + def get_esdl_type(self) -> str: + return StringEsdlAssetMapper().to_entity(type(self.esdl_asset)) + def get_return_temperature(esdl_port: esdl.Port) -> float: """Get the temperature of the port.""" From 1294b97de1e5251d8fc106c230b589d0fc37bca6 Mon Sep 17 00:00:00 2001 From: Sam van der Zwan Date: Thu, 12 Feb 2026 10:44:20 +0100 Subject: [PATCH 2/7] Added doc string to method --- src/omotes_simulator_core/entities/assets/esdl_asset_object.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/omotes_simulator_core/entities/assets/esdl_asset_object.py b/src/omotes_simulator_core/entities/assets/esdl_asset_object.py index 419d95f0..2c8c4ade 100644 --- a/src/omotes_simulator_core/entities/assets/esdl_asset_object.py +++ b/src/omotes_simulator_core/entities/assets/esdl_asset_object.py @@ -196,6 +196,7 @@ def is_heat_transfer_asset(self) -> bool: ) def get_esdl_type(self) -> str: + """Returns the ESDL type of the asset as a string.""" return StringEsdlAssetMapper().to_entity(type(self.esdl_asset)) From 841a1e03d12683d886c46b9f7598ee068d0ba484 Mon Sep 17 00:00:00 2001 From: Sam van der Zwan Date: Thu, 12 Feb 2026 11:23:52 +0100 Subject: [PATCH 3/7] Fixed naming error --- .../adapter/transforms/controller_mapper.py | 12 ++++++------ .../controller_mappers/controller_storage_mapper.py | 6 +++--- .../entities/assets/controller/__init__.py | 2 +- .../entities/assets/controller/controller_network.py | 6 +++--- .../entities/assets/controller/controller_storage.py | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/omotes_simulator_core/adapter/transforms/controller_mapper.py b/src/omotes_simulator_core/adapter/transforms/controller_mapper.py index 2633c96d..c832fffb 100644 --- a/src/omotes_simulator_core/adapter/transforms/controller_mapper.py +++ b/src/omotes_simulator_core/adapter/transforms/controller_mapper.py @@ -29,7 +29,7 @@ from omotes_simulator_core.adapter.transforms.string_to_esdl import OmotesAssetLabels from omotes_simulator_core.adapter.utility.graph import Graph from omotes_simulator_core.entities.assets.controller import ( - ControllerAtestStorage, + ControllerAtesStorage, ControllerConsumer, ControllerHeatTransferAsset, ControllerIdealHeatStorage, @@ -51,7 +51,7 @@ class NetworkItems: heat_transfer_secondary: list[ControllerHeatTransferAsset] consumer: list[ControllerConsumer] producer: list[ControllerProducer] - storage: list[ControllerAtestStorage | ControllerIdealHeatStorage] + storage: list[ControllerAtesStorage | ControllerIdealHeatStorage] def add( self, @@ -62,7 +62,7 @@ def add( self.consumer.append(asset) elif isinstance(asset, ControllerProducer): self.producer.append(asset) - elif isinstance(asset, ControllerAtestStorage) or isinstance( + elif isinstance(asset, ControllerAtesStorage) or isinstance( asset, ControllerIdealHeatStorage ): self.storage.append(asset) @@ -195,9 +195,9 @@ def assets_to_networks( assets: list[ ControllerConsumer | ControllerProducer - | ControllerAtestStorage + | ControllerAtesStorage | ControllerIdealHeatStorage - ], + ], ) -> None: """Method to move assets to networks. @@ -260,7 +260,7 @@ def heat_transfer_assets_to_network( def convert_heat_storages_and_ates( self, esdl_object: EsdlObject - ) -> list[ControllerAtestStorage | ControllerIdealHeatStorage]: + ) -> list[ControllerAtesStorage | ControllerIdealHeatStorage]: """Method to convert heat storages and ates to controller storage objects.""" esdl_storages = esdl_object.get_all_assets_of_type(OmotesAssetLabels.STORAGE) esdl_storages = [ diff --git a/src/omotes_simulator_core/adapter/transforms/controller_mappers/controller_storage_mapper.py b/src/omotes_simulator_core/adapter/transforms/controller_mappers/controller_storage_mapper.py index 069c6cb9..fc423d3c 100644 --- a/src/omotes_simulator_core/adapter/transforms/controller_mappers/controller_storage_mapper.py +++ b/src/omotes_simulator_core/adapter/transforms/controller_mappers/controller_storage_mapper.py @@ -24,7 +24,7 @@ AssetControllerAbstract, ) from omotes_simulator_core.entities.assets.controller.controller_storage import ( - ControllerAtestStorage, + ControllerAtesStorage, ControllerIdealHeatStorage, ) from omotes_simulator_core.entities.assets.controller.profile_interpolation import ( @@ -43,7 +43,7 @@ def to_esdl(self, entity: AssetControllerAbstract) -> EsdlAssetObject: def to_entity( self, esdl_asset: EsdlAssetObject, timestep: Optional[int] = None - ) -> ControllerAtestStorage: + ) -> ControllerAtesStorage: """Method to map an esdl asset to a Ates Storage entity class. :param EsdlAssetObject model: Object to be converted to an asset entity. @@ -59,7 +59,7 @@ def to_entity( ) resampled_profile = self.profile_interpolator.get_resampled_profile() - return ControllerAtestStorage( + return ControllerAtesStorage( name=esdl_asset.esdl_asset.name, identifier=esdl_asset.esdl_asset.id, temperature_in=esdl_asset.get_temperature("In", "Supply"), diff --git a/src/omotes_simulator_core/entities/assets/controller/__init__.py b/src/omotes_simulator_core/entities/assets/controller/__init__.py index 3eb3af91..1e3bccf3 100644 --- a/src/omotes_simulator_core/entities/assets/controller/__init__.py +++ b/src/omotes_simulator_core/entities/assets/controller/__init__.py @@ -20,7 +20,7 @@ from omotes_simulator_core.entities.assets.controller.controller_network import ControllerNetwork from omotes_simulator_core.entities.assets.controller.controller_producer import ControllerProducer from omotes_simulator_core.entities.assets.controller.controller_storage import ( - ControllerAtestStorage, + ControllerAtesStorage, ControllerIdealHeatStorage, ControllerStorageAbstract, ) diff --git a/src/omotes_simulator_core/entities/assets/controller/controller_network.py b/src/omotes_simulator_core/entities/assets/controller/controller_network.py index 31b1bf83..17442f89 100644 --- a/src/omotes_simulator_core/entities/assets/controller/controller_network.py +++ b/src/omotes_simulator_core/entities/assets/controller/controller_network.py @@ -28,7 +28,7 @@ ) from omotes_simulator_core.entities.assets.controller.controller_producer import ControllerProducer from omotes_simulator_core.entities.assets.controller.controller_storage import ( - ControllerAtestStorage, + ControllerAtesStorage, ControllerIdealHeatStorage, ) @@ -47,7 +47,7 @@ class ControllerNetwork: """List of all consumers in the network.""" producers: list[ControllerProducer] """List of all producers in the network.""" - storages: list[ControllerAtestStorage | ControllerIdealHeatStorage] + storages: list[ControllerAtesStorage | ControllerIdealHeatStorage] """List of all storages in the network.""" factor_to_first_network: float """Factor to calculate power in the first network in the list of networks.""" @@ -60,7 +60,7 @@ def __init__( heat_transfer_assets_sec_in: list[ControllerHeatTransferAsset], consumers_in: list[ControllerConsumer], producers_in: list[ControllerProducer], - storages_in: list[ControllerAtestStorage | ControllerIdealHeatStorage], + storages_in: list[ControllerAtesStorage | ControllerIdealHeatStorage], factor_to_first_network: float = 1, ) -> None: """Constructor of the class, which sets all attributes.""" diff --git a/src/omotes_simulator_core/entities/assets/controller/controller_storage.py b/src/omotes_simulator_core/entities/assets/controller/controller_storage.py index d123d1ee..deecbc3d 100644 --- a/src/omotes_simulator_core/entities/assets/controller/controller_storage.py +++ b/src/omotes_simulator_core/entities/assets/controller/controller_storage.py @@ -138,7 +138,7 @@ def get_effective_max_charge_power( return self.effective_max_charge_power -class ControllerAtestStorage(ControllerStorageAbstract): +class ControllerAtesStorage(ControllerStorageAbstract): """Class to store the storage for the controller asset.""" def __init__( From 7d2daafec90fde9fa0ab040918c25426e1f862de Mon Sep 17 00:00:00 2001 From: Sam van der Zwan Date: Thu, 12 Feb 2026 11:44:24 +0100 Subject: [PATCH 4/7] Added test for conversion of idealstroage and ates controller --- .../test_esdl_controller_mapper.py | 30 +++++++++++++++++++ .../controller/test_controller_storage.py | 4 +-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py b/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py index 89a2c231..8ca3c05d 100644 --- a/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py +++ b/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py @@ -17,6 +17,10 @@ from pathlib import Path from omotes_simulator_core.adapter.transforms.controller_mapper import EsdlControllerMapper +from omotes_simulator_core.entities.assets.controller import ( + ControllerIdealHeatStorage, + ControllerAtesStorage, +) from omotes_simulator_core.entities.esdl_object import EsdlObject from omotes_simulator_core.entities.network_controller import NetworkController from omotes_simulator_core.infrastructure.utils import pyesdl_from_file @@ -45,3 +49,29 @@ def test_to_entity(self): self.assertEqual(result.networks[0].path, []) self.assertEqual(result.networks[1].path, ["1", "0"]) self.assertEqual(result.networks[2].path, ["2", "1", "0"]) + + def test_ideal_heat_storage_conversion(self): + # Arrange + esdl_file_path = ( + Path(__file__).parent / ".." / ".." / ".." / ".." / "testdata" / "test_buffer.esdl" + ) + esdl_object = EsdlObject(pyesdl_from_file(esdl_file_path)) + mapper = EsdlControllerMapper() + # Act + storages = mapper.convert_heat_storages_and_ates(esdl_object) + # Assert + self.assertEqual(len(storages), 1) + self.assertIsInstance(storages[0], ControllerIdealHeatStorage) + + def test_ates_conversion(self): + # Arrange + esdl_file_path = ( + Path(__file__).parent / ".." / ".." / ".." / ".." / "testdata" / "test_ates.esdl" + ) + esdl_object = EsdlObject(pyesdl_from_file(esdl_file_path)) + mapper = EsdlControllerMapper() + # Act + storages = mapper.convert_heat_storages_and_ates(esdl_object) + # Assert + self.assertEqual(len(storages), 1) + self.assertIsInstance(storages[0], ControllerAtesStorage) diff --git a/unit_test/entities/controller/test_controller_storage.py b/unit_test/entities/controller/test_controller_storage.py index 32a7a697..67864133 100644 --- a/unit_test/entities/controller/test_controller_storage.py +++ b/unit_test/entities/controller/test_controller_storage.py @@ -29,7 +29,7 @@ PROPERTY_TIMESTEP, ) from omotes_simulator_core.entities.assets.controller.controller_storage import ( - ControllerAtestStorage, + ControllerAtesStorage, ControllerIdealHeatStorage, ControllerStorageAbstract, ) @@ -105,7 +105,7 @@ class ControllerAtestStorageTest(unittest.TestCase): def setUp(self): """Set up the test case.""" - self.storage = ControllerAtestStorage( + self.storage = ControllerAtesStorage( "storage", "id", temperature_out=DEFAULT_TEMPERATURE + DEFAULT_TEMPERATURE_DIFFERENCE, From 5928420096c3067943ce37eedfa3843fee0a8eb0 Mon Sep 17 00:00:00 2001 From: Sam van der Zwan Date: Thu, 12 Feb 2026 11:50:32 +0100 Subject: [PATCH 5/7] Added test with ates and heatstroages --- testdata/test_ates_and_storages.esdl | 301 ++++++++++++++++++ .../test_esdl_controller_mapper.py | 20 ++ 2 files changed, 321 insertions(+) create mode 100644 testdata/test_ates_and_storages.esdl diff --git a/testdata/test_ates_and_storages.esdl b/testdata/test_ates_and_storages.esdl new file mode 100644 index 00000000..a26f3f79 --- /dev/null +++ b/testdata/test_ates_and_storages.esdl @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py b/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py index 8ca3c05d..399df296 100644 --- a/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py +++ b/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py @@ -75,3 +75,23 @@ def test_ates_conversion(self): # Assert self.assertEqual(len(storages), 1) self.assertIsInstance(storages[0], ControllerAtesStorage) + + def test_ates_and_heat_storages_conversion(self): + # Arrange + esdl_file_path = ( + Path(__file__).parent + / ".." + / ".." + / ".." + / ".." + / "testdata" + / "test_ates_and_storages.esdl" + ) + esdl_object = EsdlObject(pyesdl_from_file(esdl_file_path)) + mapper = EsdlControllerMapper() + # Act + storages = mapper.convert_heat_storages_and_ates(esdl_object) + # Assert + self.assertEqual(len(storages), 2) + self.assertIsInstance(storages[0], ControllerIdealHeatStorage) + self.assertIsInstance(storages[1], ControllerAtesStorage) From 37a06a38bac67ce85115065b50bdd344a6f36f59 Mon Sep 17 00:00:00 2001 From: Sam van der Zwan Date: Thu, 12 Feb 2026 11:52:43 +0100 Subject: [PATCH 6/7] Fixing typing issue --- .../adapter/transforms/controller_mapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/omotes_simulator_core/adapter/transforms/controller_mapper.py b/src/omotes_simulator_core/adapter/transforms/controller_mapper.py index c832fffb..8fdfaaa3 100644 --- a/src/omotes_simulator_core/adapter/transforms/controller_mapper.py +++ b/src/omotes_simulator_core/adapter/transforms/controller_mapper.py @@ -197,7 +197,7 @@ def assets_to_networks( | ControllerProducer | ControllerAtesStorage | ControllerIdealHeatStorage - ], + ], ) -> None: """Method to move assets to networks. From 564de7c0160f118acc1cf65d515ff8d27506c2e2 Mon Sep 17 00:00:00 2001 From: Sam van der Zwan Date: Thu, 12 Feb 2026 11:54:04 +0100 Subject: [PATCH 7/7] Formatinn correction --- .../controller_mappers/test_esdl_controller_mapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py b/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py index 399df296..9a315bdf 100644 --- a/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py +++ b/unit_test/adapters/transforms/controller_mappers/test_esdl_controller_mapper.py @@ -18,8 +18,8 @@ from omotes_simulator_core.adapter.transforms.controller_mapper import EsdlControllerMapper from omotes_simulator_core.entities.assets.controller import ( - ControllerIdealHeatStorage, ControllerAtesStorage, + ControllerIdealHeatStorage, ) from omotes_simulator_core.entities.esdl_object import EsdlObject from omotes_simulator_core.entities.network_controller import NetworkController