diff --git a/src/omotes_simulator_core/adapter/transforms/controller_mapper.py b/src/omotes_simulator_core/adapter/transforms/controller_mapper.py index 7a96e7d2..8fdfaaa3 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) @@ -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: @@ -201,7 +195,7 @@ def assets_to_networks( assets: list[ ControllerConsumer | ControllerProducer - | ControllerAtestStorage + | ControllerAtesStorage | ControllerIdealHeatStorage ], ) -> None: @@ -264,6 +258,27 @@ def heat_transfer_assets_to_network( ) return network_list + def convert_heat_storages_and_ates( + self, esdl_object: EsdlObject + ) -> 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 = [ + 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/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__( 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..2c8c4ade 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,10 @@ def is_heat_transfer_asset(self) -> bool: self.esdl_asset, esdl.HeatExchange ) + def get_esdl_type(self) -> str: + """Returns the ESDL type of the asset as a string.""" + return StringEsdlAssetMapper().to_entity(type(self.esdl_asset)) + def get_return_temperature(esdl_port: esdl.Port) -> float: """Get the temperature of the port.""" 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 89a2c231..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 @@ -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 ( + ControllerAtesStorage, + ControllerIdealHeatStorage, +) 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,49 @@ 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) + + 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) 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,