From 73641f985e44a626eaf054c0e1e322150e82488e Mon Sep 17 00:00:00 2001 From: Guille Date: Fri, 14 Jun 2024 06:09:24 +0200 Subject: [PATCH] implement idf generator --- hub_api/config.py | 68 +++++++++++++++++++++++++ hub_api/energy_plus/idf_generator.py | 4 ++ hub_api/persistence/retrofit_results.py | 3 ++ 3 files changed, 75 insertions(+) diff --git a/hub_api/config.py b/hub_api/config.py index e69de29..3bf6fe3 100644 --- a/hub_api/config.py +++ b/hub_api/config.py @@ -0,0 +1,68 @@ +""" +Config +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2023 Project Peter Yefi peteryefi@gmail.com +""" +import distutils +import os +import platform +from pathlib import Path + +import hub.helpers.dictionaries +from hub.persistence.db_control import DBControl +from hub.persistence.repository import Repository +from hub.catalog_factories.energy_systems_catalog_factory import EnergySystemsCatalogFactory + + +class Config: + + def __init__(self): + dotenv_path = "{}/.local/etc/hub_api/.env".format(os.path.expanduser('~')) + if platform.system() == 'Linux': + dotenv_path = Path(dotenv_path).resolve() + + environment = 'PROD' + database_name = 'montreal_retrofit' + self._database = DBControl(db_name=database_name, app_env=environment, dotenv_path=dotenv_path) + self._repository = Repository(db_name=database_name, app_env=environment, dotenv_path=dotenv_path) + self._energy_systems_catalog = EnergySystemsCatalogFactory('montreal_custom').catalog + self._dictionaries = { + 'pluto': hub.helpers.dictionaries.Dictionaries().pluto_function_to_hub_function, + 'htf': hub.helpers.dictionaries.Dictionaries().hft_function_to_hub_function, + 'montreal': hub.helpers.dictionaries.Dictionaries().montreal_function_to_hub_function, + 'alkis': hub.helpers.dictionaries.Dictionaries().alkis_function_to_hub_function, + 'eilat': hub.helpers.dictionaries.Dictionaries().eilat_function_to_hub_function + } + + @property + def database(self): + return self._database + + @property + def repository(self): + return self._repository + + @property + def energy_systems_catalog(self): + return self._energy_systems_catalog + + @staticmethod + def max_file_size(): + return 10 * 1024 * 1024 # 10 MB + + @property + def function_dictionary(self, dictionary): + return self._dictionaries[dictionary] + + @property + def insel(self): + return distutils.spawn.find_executable('insel') + + @property + def sra(self): + return distutils.spawn.find_executable('sra') + + @property + def base_uri(self): + return self._base_uri + diff --git a/hub_api/energy_plus/idf_generator.py b/hub_api/energy_plus/idf_generator.py index dc89a68..c289c46 100644 --- a/hub_api/energy_plus/idf_generator.py +++ b/hub_api/energy_plus/idf_generator.py @@ -1,3 +1,4 @@ +import datetime import json import os from pathlib import Path @@ -21,6 +22,7 @@ class IdfGenerator(Resource, Config): """ API call generate the IDF file for the input data """ + start = datetime.datetime.now() session_id = request.headers.get('session-id', None) token = request.headers.get('token', None) application_uuid = request.headers.get('application-uuid', None) @@ -31,6 +33,7 @@ class IdfGenerator(Resource, Config): token = _session['token'] application_id = session(session_id)['application_id'] user_id = session(session_id)['user_id'] + tmp_path = (self._tmp_path / token).resolve() try: os.mkdir(tmp_path) @@ -39,6 +42,7 @@ class IdfGenerator(Resource, Config): payload = request.get_json() for key, value in payload.items(): db_city = self.database.get_city(self.database.building(value, user_id, application_id, key).city_id) + print(f'{datetime.datetime.now() - start}') if version != db_city.hub_release: return Response(json.dumps({ 'error': 'The selected building belongs to an old hub release and cannot be loaded.' diff --git a/hub_api/persistence/retrofit_results.py b/hub_api/persistence/retrofit_results.py index 842b786..bbdee20 100644 --- a/hub_api/persistence/retrofit_results.py +++ b/hub_api/persistence/retrofit_results.py @@ -84,6 +84,7 @@ class RetrofitResults(Resource, Config): API call for requesting a specified list of enriched persistence """ # todo: cost and co2 libraries are using default canadians values, in the future need to be optionally API configurable + start = datetime.datetime.now() session_id = request.headers.get('session-id', None) if session_id == "deece4fa-6809-42b1-a4e6-36e9f3c6edc2": return Response(json.dumps(dic), status=200) @@ -104,6 +105,7 @@ class RetrofitResults(Resource, Config): # no data found for the given parameters return Response(json.dumps({'result': 'succeed', 'results': results}), status=200, headers=token) # deserialize the response to return pure json + print(f'session {datetime.datetime.now() - start}') start = datetime.datetime.now() t = [] for scenario in results: @@ -117,4 +119,5 @@ class RetrofitResults(Resource, Config): f.start() for f in t: f.join() + print(f'calculated {datetime.datetime.now() - start}') return Response(json.dumps({'result': 'succeed', 'results': results}), status=200, headers=token)