From e1836de7397ec7c291d5e3d8562ecb7ad31a3d54 Mon Sep 17 00:00:00 2001 From: aan Date: Sun, 3 Nov 2024 08:15:19 +0100 Subject: [PATCH 1/4] feat: add CLI. --- .github/workflows/docs.yaml | 6 +- .github/workflows/tests-runner.yaml | 6 +- docs/getting-started/installation.md | 16 +- docs_src/getting_started/installation.py | 8 +- poetry.lock | 24 +-- pyproject.toml | 9 +- trano/exceptions.py | 6 + trano/main.py | 193 ++++++++++++++++++++--- trano/simulate/simulate.py | 32 +++- trano/verification.yaml | 114 +++++++++++++ 10 files changed, 349 insertions(+), 65 deletions(-) create mode 100755 trano/verification.yaml diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 1e0e1f9..68c036f 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -18,11 +18,7 @@ jobs: python-version: '3.10' - name: Install Poetry - run: | - curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python3 - cd /usr/local/bin - ln -s /opt/poetry/bin/poetry - poetry config virtualenvs.create false + uses: snok/install-poetry@v1 - name: Install dependencies run: | diff --git a/.github/workflows/tests-runner.yaml b/.github/workflows/tests-runner.yaml index e4ea4d9..80da5e2 100644 --- a/.github/workflows/tests-runner.yaml +++ b/.github/workflows/tests-runner.yaml @@ -18,11 +18,7 @@ jobs: python-version: "3.10" - name: Install Poetry - run: | - curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python3 - cd /usr/local/bin - ln -s /opt/poetry/bin/poetry - poetry config virtualenvs.create false + uses: snok/install-poetry@v1 - name: Install dependencies run: poetry install diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index 9892822..2558cbd 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -1,13 +1,18 @@ # Installation ## Python package -Trano is a Python package that can be easily installed via pip. + +!!! warning + Trano requires python 3.9 or higher and docker to be installed on the system. + + +Trano is a Python package that can be installed via pip. ```bash pip install trano ``` - + Trano can also be utilized with Poetry. @@ -15,10 +20,11 @@ Trano can also be utilized with Poetry. ```bash poetry add trano ``` + - -The Python package enables the generation of Modelica models from YAML configuration input. To simulate the model, ensure that Docker is installed on your system. +The Python package enables the generation of a Modelica model from YAML configuration input. To simulate the model, Docker must be installed on the system. ## Docker -To simulate the Modelica model, you need to install Docker on your system. You can find installation instructions on the [official Docker website](https://docs.docker.com/engine/install/). +To simulate the Modelica model, you must install Docker on your system. You can find installation instructions on the [official Docker website](https://docs.docker.com/engine/install/). + diff --git a/docs_src/getting_started/installation.py b/docs_src/getting_started/installation.py index 265ad58..5b48a61 100644 --- a/docs_src/getting_started/installation.py +++ b/docs_src/getting_started/installation.py @@ -1,12 +1,18 @@ from pathlib import Path -from docs_src.utils import CleanedText, DisplayObject, TitleText, Tutorial +from docs_src.utils import CleanedText, DisplayObject, TitleText, Tutorial, Text INSTALLATIONS = [ Tutorial( title="Installation", contents=[ TitleText(content="""Python package"""), + Text( + content=""" +!!! warning + Trano requires python 3.9 or higher and docker to be installed on the system. + """ + ), CleanedText( content="""Trano is a python package that can be installed using pip.""" ), diff --git a/poetry.lock b/poetry.lock index afd425f..57b818d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2093,18 +2093,6 @@ files = [ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] -[[package]] -name = "mat4py" -version = "0.6.0" -description = "Load and save data in the Matlab (TM) MAT-file format." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "mat4py-0.6.0-py2.py3-none-any.whl", hash = "sha256:1c15f39c7df092f01506044f65999fc9c7d71306f8fc850b1003e15ed64c6bae"}, - {file = "mat4py-0.6.0.tar.gz", hash = "sha256:438927e6c16831a337596f593eb0b391c4cf6c982280b635ae412e80dff7fd07"}, -] - [[package]] name = "matplotlib" version = "3.9.2" @@ -3972,14 +3960,14 @@ files = [ [[package]] name = "rich" -version = "13.9.3" +version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "main" optional = false python-versions = ">=3.8.0" files = [ - {file = "rich-13.9.3-py3-none-any.whl", hash = "sha256:9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283"}, - {file = "rich-13.9.3.tar.gz", hash = "sha256:bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e"}, + {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, + {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, ] [package.dependencies] @@ -5043,13 +5031,13 @@ files = [ [[package]] name = "yattag" -version = "1.16.0" +version = "1.16.1" description = "Generate HTML or XML in a pythonic way. Pure python alternative to web template engines.Can fill HTML forms with default values and error messages." category = "main" optional = false python-versions = "*" files = [ - {file = "yattag-1.16.0.tar.gz", hash = "sha256:0978247b9754d9f44e3703c64374ab9fa872d18de95ac5772fdfdd3c3f0d0706"}, + {file = "yattag-1.16.1.tar.gz", hash = "sha256:baa8f254e7ea5d3e0618281ad2ff5610e0e5360b3608e695c29bfb3b29d051f4"}, ] [[package]] @@ -5075,4 +5063,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "569a0c1f8c23d8f9d85a8c1a0a964f49d28ce97ccf26afc89bec47c60741f0b4" +content-hash = "179f3694970e2a9a107d32c7156d88835cac44e8e03627738ae32a5b11488143" diff --git a/pyproject.toml b/pyproject.toml index 6472bbc..6d41a93 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,10 +33,7 @@ matplotlib = "^3.8.2" uuid = "^1.30" docker = "^7.0.0" jinja2 = "^3.1.2" -pytest = "^7.4.3" pyvis = "^0.3.2" -scipy = "^1.13.1" -mat4py = "^0.6.0" pandas = "^2.2.2" buildingspy = "^5.1.0" plotly = "^5.22.0" @@ -47,10 +44,12 @@ linkml = "^1.8.1" cruft = "^2.15.0" rdflib = "^7.0.0" pyyaml-include = "^2.1" +typer = "^0.12.5" +[tool.poetry.scripts] +trano = "trano.main:app" [tool.poetry.group.dev.dependencies] -pytest = "^7.4.3" mypy = "^1.8.0" nox = "^2023.4.22" ruff = "^0.3.0" @@ -65,7 +64,7 @@ types-pyyaml = "^6.0.12.20240808" isort = "^5.13.2" jsf = "^0.11.2" black = "^24.10.0" - +pytest = "^7.4.3" [tool.poetry.group.docs.dependencies] diff --git a/trano/exceptions.py b/trano/exceptions.py index 8a0f074..cb2bf6d 100644 --- a/trano/exceptions.py +++ b/trano/exceptions.py @@ -7,3 +7,9 @@ class ControllerBusPortError(Exception): class IncompatiblePortsError(Exception): ... + + +class DockerNotInstalledError(Exception): ... + + +class DockerClientError(Exception): ... diff --git a/trano/main.py b/trano/main.py index c16d562..62036ef 100644 --- a/trano/main.py +++ b/trano/main.py @@ -1,6 +1,10 @@ +import tempfile import webbrowser +from enum import Enum from pathlib import Path - +from typing import Optional, Annotated +from rich import print +import typer from trano.data_models.conversion import convert_network from trano.library.library import Library from trano.reporting.html import to_html_reporting @@ -9,6 +13,16 @@ from trano.simulate.simulate import SimulationLibraryOptions, simulate from trano.topology import Network from trano.utils.utils import is_success +from rich.progress import Progress, SpinnerColumn, TextColumn + +app = typer.Typer() +CHECKMARK = "[green]✔[/green]" +CROSS_MARK = "[red]✘[/red]" + + +class LibraryChoice(str, Enum): + ideas = "IDEAS" + buildings = "Buildings" def _create_network(model: Path | str, library: str) -> Network: @@ -17,34 +31,159 @@ def _create_network(model: Path | str, library: str) -> Network: return convert_network(model.stem, model, library=library_) -def create_model(model: Path | str, library: str = "Buildings") -> None: - network = _create_network(model, library) - modelica_model = network.model() - Path(model).resolve().with_suffix(".mo").write_text(modelica_model) - +@app.command() +def create_model( + model: Annotated[ + Path | str, + typer.Argument(help="Local path to the '.yaml' model configuration file"), + ], + library: Annotated[ + LibraryChoice, + typer.Argument(help="Library to be used for simulation."), + ] = LibraryChoice.buildings, +) -> None: + with Progress( + SpinnerColumn(), + TextColumn("[progress.description]{task.description}"), + transient=True, + ) as progress: + task = progress.add_task( + description=f"Generating model {Path(model).with_suffix('mo').name} with library {library}", + total=None, + ) + network = _create_network(model, library) + modelica_model = network.model() + progress.update(task, completed=True) + task = progress.add_task(description="Writing model to file...", total=None) + modelica_model_path = Path(model).resolve().with_suffix(".mo") + modelica_model_path.write_text(modelica_model) + progress.update( + task, + completed=True, + description=f"Modelica model generated at {modelica_model_path}", + ) -def simulate_model(model: Path | str, options: SimulationLibraryOptions) -> None: - network = _create_network(model, options.library_name) - model = Path(model).resolve() - results = simulate( - model.parent, - network, - options=options, +@app.command() +def simulate_model( + model: Annotated[ + Path | str, + typer.Argument(help="Local path to the '.yaml' model configuration file."), + ], + library: Annotated[ + Optional[LibraryChoice], + typer.Argument(help="Library to be used for simulation."), + ] = LibraryChoice.buildings, + start: Annotated[Optional[int], typer.Argument(help="Start simulation time.")] = 0, + end: Annotated[Optional[int], typer.Argument(help="End simulation time.")] = 2 + * 3600 + * 24 + * 7, + tolerance: Annotated[ + Optional[float], typer.Argument(help="Simulation tolerance.") + ] = 1e-4, +) -> None: + options = SimulationLibraryOptions( + start_time=start, + end_time=end, + tolerance=tolerance, + library_name=library, ) - if not is_success(results): - raise ValueError("Simulation failed") + with Progress( + SpinnerColumn(), + TextColumn("[progress.description]{task.description}"), + transient=True, + ) as progress: + task = progress.add_task( + description=f"Generating model {Path(model).with_suffix('mo').name} with library {options.library_name}", + total=None, + ) + network = _create_network(model, options.library_name) + model = Path(model).resolve() + progress.update(task, completed=True) + task = progress.add_task( + description="Simulating model ...", + total=None, + ) + results = simulate( + model.parent, + network, + options=options, + ) - reporting = ModelDocumentation.from_network( - network, - result=ResultFile( - path=Path(model.parent) / "results" / f"{model.stem}.building_res.mat" - ), - ) - html = to_html_reporting(reporting) - report_path = Path(model.parent / f"{model.stem}.html") - report_path.write_text(html) - webbrowser.open(f"file://{report_path}") + if not is_success(results): + print(f"{CROSS_MARK} Simulation failed. See logs for more information.") + return + + result_path = Path(model.parent) / "results" / f"{model.stem}.building_res.mat" + if not result_path.exists(): + print( + f"{CROSS_MARK} Simulation failed. Result file not found in {result_path}." + ) + return + progress.update( + task, + completed=True, + description=f"Simulation results available at {result_path}", + ) + + task = progress.add_task( + description="Creating report ...", + total=None, + ) + reporting = ModelDocumentation.from_network( + network, + result=ResultFile(path=result_path), + ) + html = to_html_reporting(reporting) + report_path = Path(model.parent / f"{model.stem}.html") + report_path.write_text(html) + webbrowser.open(f"file://{report_path}") + progress.update( + task, + completed=True, + description=f"Simulation successful. Report available at {report_path}", + ) + + +@app.command() +def verify() -> None: + model_path = Path(__file__).parent / "verification.yaml" + options = SimulationLibraryOptions(end_time=3600) + with Progress( + SpinnerColumn(), + TextColumn("[progress.description]{task.description}"), + transient=True, + ) as progress: + task = progress.add_task( + description="Verify generating model...", + total=None, + ) + network = _create_network(model_path, options.library_name) + progress.update( + task, + completed=True, + description="Model generated successfully. Your system is compatible for model generation.", + ) + task = progress.add_task( + description="Verify simulation...", + total=None, + ) + with tempfile.NamedTemporaryFile() as temp_file: + try: + simulate( + Path(temp_file.name), + network, + options=options, + ) + except Exception as e: + print(f"{CROSS_MARK} Simulation failed. Reason {e}.") + return + progress.update( + task, + completed=True, + description="Model simulated successfully. Your system is compatible for simulation.", + ) def report(model: Path | str, options: SimulationLibraryOptions) -> None: @@ -62,3 +201,7 @@ def report(model: Path | str, options: SimulationLibraryOptions) -> None: report_path = Path(model.parent / f"{model.stem}.html") report_path.write_text(html) webbrowser.open(f"file://{report_path}") + + +if __name__ == "__main__": + app() diff --git a/trano/simulate/simulate.py b/trano/simulate/simulate.py index c7b980e..1f1fcb6 100644 --- a/trano/simulate/simulate.py +++ b/trano/simulate/simulate.py @@ -1,4 +1,6 @@ +import platform import shutil +import subprocess import tempfile from contextlib import contextmanager from pathlib import Path @@ -8,11 +10,39 @@ from jinja2 import Environment from pydantic import BaseModel, Field +from trano.exceptions import DockerNotInstalledError, DockerClientError from trano.topology import Network +def check_docker_installed() -> None: + try: + subprocess.run( + ["docker", "--version"], # noqa: S603, S607 + check=True, + ) + except (subprocess.CalledProcessError, FileNotFoundError) as e: + raise DockerNotInstalledError( + "Docker is not installed on the system. Simulation cannot be run." + ) from e + + def client() -> docker.DockerClient: - client = docker.DockerClient(base_url="unix:///var/run/docker.sock") + check_docker_installed() + system = platform.system() + + if system in ("Linux", "Darwin"): + base_url = "unix:///var/run/docker.sock" + elif system == "Windows": + base_url = "npipe:////./pipe/docker_engine" + else: + raise NotImplementedError(f"Unsupported platform: {system}") + try: + client = docker.DockerClient(base_url=base_url) + except Exception as e: + raise DockerClientError( + f"Docker client cannot be initialized with base url: '{base_url}'. " + f"Simulation cannot be run on your {system} system." + ) from e return client diff --git a/trano/verification.yaml b/trano/verification.yaml new file mode 100755 index 0000000..6d1819a --- /dev/null +++ b/trano/verification.yaml @@ -0,0 +1,114 @@ +material: + - id: MATERIAL:001 + thermal_conductivity: 0.045 + density: 2100.0 + specific_heat_capacity: 900.0 + - id: MATERIAL:002 + thermal_conductivity: 0.04 + density: 1950.0 + specific_heat_capacity: 950.0 + - id: MATERIAL:003 + thermal_conductivity: 0.038 + density: 2050.0 + specific_heat_capacity: 920.0 + +constructions: + - id: CONSTRUCTION:001 + layers: + - material: MATERIAL:001 + thickness: 0.12 + - material: MATERIAL:002 + thickness: 0.08 + - material: MATERIAL:003 + thickness: 0.1 + +glass_material: + - density: 2500.0 + id: GLASS:001 + longwave_emissivity: 0.82 + shortwave_emissivity: 0.65 + specific_heat_capacity: 860.0 + thermal_conductivity: 1.1 + +gas: + - density: 1.18 + id: AIR:001 + longwave_emissivity: 0.0 + shortwave_emissivity: 0.0 + specific_heat_capacity: 1005.0 + thermal_conductivity: 0.026 + +glazings: + - id: INS2AR2020:001 + layers: + - glass: GLASS:001 + thickness: 0.005 + - gas: AIR:001 + thickness: 0.014 + - glass: GLASS:001 + thickness: 0.005 + +spaces: + - parameters: + floor_area: 80.0 # Smaller room + average_room_height: 2.5 + id: SPACE:001 + external_boundaries: + external_walls: + - surface: 90.0 + azimuth: 180.0 + tilt: wall + construction: CONSTRUCTION:001 + - surface: 70.0 + azimuth: 90.0 + tilt: wall + construction: CONSTRUCTION:001 + - surface: 160.0 + azimuth: 270.0 + tilt: wall + construction: CONSTRUCTION:001 + floor_on_grounds: + - surface: 80.0 + construction: CONSTRUCTION:001 + windows: + - surface: 1.5 + azimuth: 180.0 + tilt: wall + construction: INS2AR2020:001 + width: 1.5 + height: 1.0 + + - parameters: + floor_area: 120.0 # Larger room with different shape + average_room_height: 2.7 + id: SPACE:002 + external_boundaries: + external_walls: + - surface: 120.0 + azimuth: 180.0 + tilt: wall + construction: CONSTRUCTION:001 + - surface: 100.0 + azimuth: 90.0 + tilt: wall + construction: CONSTRUCTION:001 + - surface: 220.0 + azimuth: 0.0 + tilt: wall + construction: CONSTRUCTION:001 + floor_on_grounds: + - surface: 120.0 + construction: CONSTRUCTION:001 + windows: + - surface: 2.0 + azimuth: 180.0 + tilt: wall + construction: INS2AR2020:001 + width: 2.0 + height: 1.2 + +internal_walls: + - space_1: SPACE:002 + space_2: SPACE:001 + construction: CONSTRUCTION:001 + surface: 18.0 From 7483dd1d744a648894ef102b5bee1a8195cdb309 Mon Sep 17 00:00:00 2001 From: aan Date: Sun, 3 Nov 2024 17:25:35 +0100 Subject: [PATCH 2/4] feat: add CLI. --- trano/main.py | 75 +++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 39 deletions(-) mode change 100644 => 100755 trano/main.py diff --git a/trano/main.py b/trano/main.py old mode 100644 new mode 100755 index 62036ef..65c079a --- a/trano/main.py +++ b/trano/main.py @@ -25,16 +25,16 @@ class LibraryChoice(str, Enum): buildings = "Buildings" -def _create_network(model: Path | str, library: str) -> Network: +def _create_network(model: str, library: str) -> Network: library_ = Library.from_configuration(library) - model = Path(model).resolve() - return convert_network(model.stem, model, library=library_) + model_ = Path(model).resolve() + return convert_network(str(model_.stem), model_, library=library_) @app.command() def create_model( model: Annotated[ - Path | str, + str, typer.Argument(help="Local path to the '.yaml' model configuration file"), ], library: Annotated[ @@ -47,27 +47,24 @@ def create_model( TextColumn("[progress.description]{task.description}"), transient=True, ) as progress: + modelica_model_path = Path(model).resolve().with_suffix(".mo") task = progress.add_task( - description=f"Generating model {Path(model).with_suffix('mo').name} with library {library}", + description=f"Generating model {modelica_model_path.name} with library {library}", total=None, ) network = _create_network(model, library) modelica_model = network.model() progress.update(task, completed=True) task = progress.add_task(description="Writing model to file...", total=None) - modelica_model_path = Path(model).resolve().with_suffix(".mo") modelica_model_path.write_text(modelica_model) - progress.update( - task, - completed=True, - description=f"Modelica model generated at {modelica_model_path}", - ) + progress.remove_task(task) + print(f"{CHECKMARK} Model generated at {modelica_model_path}") @app.command() def simulate_model( model: Annotated[ - Path | str, + str, typer.Argument(help="Local path to the '.yaml' model configuration file."), ], library: Annotated[ @@ -95,18 +92,19 @@ def simulate_model( transient=True, ) as progress: task = progress.add_task( - description=f"Generating model {Path(model).with_suffix('mo').name} with library {options.library_name}", + description=f"Generating model {Path(model).stem} with library {options.library_name}", total=None, ) network = _create_network(model, options.library_name) - model = Path(model).resolve() - progress.update(task, completed=True) + model_ = Path(model).resolve() + progress.remove_task(task) + print(f"{CHECKMARK} Model generated successfully.") task = progress.add_task( description="Simulating model ...", total=None, ) results = simulate( - model.parent, + model_.parent, network, options=options, ) @@ -115,17 +113,16 @@ def simulate_model( print(f"{CROSS_MARK} Simulation failed. See logs for more information.") return - result_path = Path(model.parent) / "results" / f"{model.stem}.building_res.mat" + result_path = ( + Path(model_.parent) / "results" / f"{model_.stem}.building_res.mat" + ) if not result_path.exists(): print( f"{CROSS_MARK} Simulation failed. Result file not found in {result_path}." ) return - progress.update( - task, - completed=True, - description=f"Simulation results available at {result_path}", - ) + progress.remove_task(task) + print(f"{CHECKMARK} Simulation results available at {result_path}") task = progress.add_task( description="Creating report ...", @@ -136,14 +133,11 @@ def simulate_model( result=ResultFile(path=result_path), ) html = to_html_reporting(reporting) - report_path = Path(model.parent / f"{model.stem}.html") + report_path = Path(model_.parent / f"{model_.stem}.html") report_path.write_text(html) webbrowser.open(f"file://{report_path}") - progress.update( - task, - completed=True, - description=f"Simulation successful. Report available at {report_path}", - ) + progress.remove_task(task) + print(f"{CHECKMARK} Report available at {report_path}") @app.command() @@ -159,30 +153,33 @@ def verify() -> None: description="Verify generating model...", total=None, ) - network = _create_network(model_path, options.library_name) - progress.update( + network = _create_network(str(model_path), options.library_name) + + progress.remove_task( task, - completed=True, - description="Model generated successfully. Your system is compatible for model generation.", ) - task = progress.add_task( + print( + f"{CHECKMARK} Model generated successfully. Your system is compatible for model generation." + ) + task_ = progress.add_task( description="Verify simulation...", total=None, ) - with tempfile.NamedTemporaryFile() as temp_file: + with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as project_path: try: simulate( - Path(temp_file.name), + Path(project_path), network, options=options, ) except Exception as e: print(f"{CROSS_MARK} Simulation failed. Reason {e}.") return - progress.update( - task, - completed=True, - description="Model simulated successfully. Your system is compatible for simulation.", + progress.remove_task( + task_, + ) + print( + f"{CHECKMARK} Model simulated successfully. Your system is compatible for simulation." ) From a97a4e78a2ee59603f8d482919a35fd8b7d95c29 Mon Sep 17 00:00:00 2001 From: aan Date: Sun, 3 Nov 2024 17:27:09 +0100 Subject: [PATCH 3/4] feat: linting. --- trano/__init__.py | 0 trano/data/default.yaml | 0 trano/data/include.py | 0 trano/data_models/__init__.py | 0 trano/data_models/conversion.py | 0 trano/data_models/converter.py | 0 trano/data_models/parameters.yaml | 0 trano/data_models/trano.yaml | 0 trano/data_models/trano_final.yaml | 0 trano/elements/__init__.py | 0 trano/elements/base.py | 0 trano/elements/boundary.py | 0 trano/elements/bus.py | 0 trano/elements/components.py | 0 trano/elements/connection.py | 0 trano/elements/construction.py | 0 trano/elements/control.py | 0 trano/elements/controller_bus.py | 0 trano/elements/element.yaml | 0 trano/elements/envelope.py | 0 trano/elements/figure.py | 0 trano/elements/inputs.py | 0 trano/elements/models/ahu_control.yaml | 0 trano/elements/models/air_handling_unit.yaml | 0 trano/elements/models/boiler.yaml | 0 trano/elements/models/boiler_control.yaml | 0 trano/elements/models/boundary.yaml | 0 trano/elements/models/collector_control.yaml | 0 trano/elements/models/data_bus.yaml | 0 trano/elements/models/duct.yaml | 0 trano/elements/models/emission_control.yaml | 0 trano/elements/models/external_wall.yaml | 0 trano/elements/models/floor_on_ground.yaml | 0 trano/elements/models/internal_element.yaml | 0 trano/elements/models/merged_windows.yaml | 0 trano/elements/models/occupancy.yaml | 0 trano/elements/models/pump.yaml | 0 trano/elements/models/radiator.yaml | 0 trano/elements/models/space.yaml | 0 trano/elements/models/split_valve.yaml | 0 trano/elements/models/temperature_sensor.yaml | 0 trano/elements/models/three_way_valve.yaml | 0 trano/elements/models/three_way_valve_control.yaml | 0 trano/elements/models/valve.yaml | 0 trano/elements/models/vav.yaml | 0 trano/elements/models/vav_control.yaml | 0 trano/elements/models/weather.yaml | 0 trano/elements/models/window.yaml | 0 trano/elements/parameters.py | 0 trano/elements/space.py | 0 trano/elements/system.py | 0 trano/elements/types.py | 0 trano/elements/utils.py | 0 trano/exceptions.py | 0 trano/library/library.py | 0 trano/library/library.yaml | 0 trano/plot/__init__.py | 0 trano/plot/plot.py | 0 trano/reporting/__init__.py | 0 trano/reporting/docx.py | 0 trano/reporting/html.py | 0 trano/reporting/reporting.py | 0 trano/reporting/types.py | 0 trano/reporting/utils.py | 0 trano/scripts/__init__.py | 0 trano/scripts/parse.py | 0 trano/scripts/schema.py | 0 trano/simulate/__init__.py | 0 trano/simulate/simulate.py | 0 trano/templates/Trano.jinja2 | 0 trano/templates/base.jinja2 | 0 trano/templates/macros.jinja2 | 0 trano/topology.py | 0 trano/utils/__init__.py | 0 trano/utils/utils.py | 0 75 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 trano/__init__.py mode change 100644 => 100755 trano/data/default.yaml mode change 100644 => 100755 trano/data/include.py mode change 100644 => 100755 trano/data_models/__init__.py mode change 100644 => 100755 trano/data_models/conversion.py mode change 100644 => 100755 trano/data_models/converter.py mode change 100644 => 100755 trano/data_models/parameters.yaml mode change 100644 => 100755 trano/data_models/trano.yaml mode change 100644 => 100755 trano/data_models/trano_final.yaml mode change 100644 => 100755 trano/elements/__init__.py mode change 100644 => 100755 trano/elements/base.py mode change 100644 => 100755 trano/elements/boundary.py mode change 100644 => 100755 trano/elements/bus.py mode change 100644 => 100755 trano/elements/components.py mode change 100644 => 100755 trano/elements/connection.py mode change 100644 => 100755 trano/elements/construction.py mode change 100644 => 100755 trano/elements/control.py mode change 100644 => 100755 trano/elements/controller_bus.py mode change 100644 => 100755 trano/elements/element.yaml mode change 100644 => 100755 trano/elements/envelope.py mode change 100644 => 100755 trano/elements/figure.py mode change 100644 => 100755 trano/elements/inputs.py mode change 100644 => 100755 trano/elements/models/ahu_control.yaml mode change 100644 => 100755 trano/elements/models/air_handling_unit.yaml mode change 100644 => 100755 trano/elements/models/boiler.yaml mode change 100644 => 100755 trano/elements/models/boiler_control.yaml mode change 100644 => 100755 trano/elements/models/boundary.yaml mode change 100644 => 100755 trano/elements/models/collector_control.yaml mode change 100644 => 100755 trano/elements/models/data_bus.yaml mode change 100644 => 100755 trano/elements/models/duct.yaml mode change 100644 => 100755 trano/elements/models/emission_control.yaml mode change 100644 => 100755 trano/elements/models/external_wall.yaml mode change 100644 => 100755 trano/elements/models/floor_on_ground.yaml mode change 100644 => 100755 trano/elements/models/internal_element.yaml mode change 100644 => 100755 trano/elements/models/merged_windows.yaml mode change 100644 => 100755 trano/elements/models/occupancy.yaml mode change 100644 => 100755 trano/elements/models/pump.yaml mode change 100644 => 100755 trano/elements/models/radiator.yaml mode change 100644 => 100755 trano/elements/models/space.yaml mode change 100644 => 100755 trano/elements/models/split_valve.yaml mode change 100644 => 100755 trano/elements/models/temperature_sensor.yaml mode change 100644 => 100755 trano/elements/models/three_way_valve.yaml mode change 100644 => 100755 trano/elements/models/three_way_valve_control.yaml mode change 100644 => 100755 trano/elements/models/valve.yaml mode change 100644 => 100755 trano/elements/models/vav.yaml mode change 100644 => 100755 trano/elements/models/vav_control.yaml mode change 100644 => 100755 trano/elements/models/weather.yaml mode change 100644 => 100755 trano/elements/models/window.yaml mode change 100644 => 100755 trano/elements/parameters.py mode change 100644 => 100755 trano/elements/space.py mode change 100644 => 100755 trano/elements/system.py mode change 100644 => 100755 trano/elements/types.py mode change 100644 => 100755 trano/elements/utils.py mode change 100644 => 100755 trano/exceptions.py mode change 100644 => 100755 trano/library/library.py mode change 100644 => 100755 trano/library/library.yaml mode change 100644 => 100755 trano/plot/__init__.py mode change 100644 => 100755 trano/plot/plot.py mode change 100644 => 100755 trano/reporting/__init__.py mode change 100644 => 100755 trano/reporting/docx.py mode change 100644 => 100755 trano/reporting/html.py mode change 100644 => 100755 trano/reporting/reporting.py mode change 100644 => 100755 trano/reporting/types.py mode change 100644 => 100755 trano/reporting/utils.py mode change 100644 => 100755 trano/scripts/__init__.py mode change 100644 => 100755 trano/scripts/parse.py mode change 100644 => 100755 trano/scripts/schema.py mode change 100644 => 100755 trano/simulate/__init__.py mode change 100644 => 100755 trano/simulate/simulate.py mode change 100644 => 100755 trano/templates/Trano.jinja2 mode change 100644 => 100755 trano/templates/base.jinja2 mode change 100644 => 100755 trano/templates/macros.jinja2 mode change 100644 => 100755 trano/topology.py mode change 100644 => 100755 trano/utils/__init__.py mode change 100644 => 100755 trano/utils/utils.py diff --git a/trano/__init__.py b/trano/__init__.py old mode 100644 new mode 100755 diff --git a/trano/data/default.yaml b/trano/data/default.yaml old mode 100644 new mode 100755 diff --git a/trano/data/include.py b/trano/data/include.py old mode 100644 new mode 100755 diff --git a/trano/data_models/__init__.py b/trano/data_models/__init__.py old mode 100644 new mode 100755 diff --git a/trano/data_models/conversion.py b/trano/data_models/conversion.py old mode 100644 new mode 100755 diff --git a/trano/data_models/converter.py b/trano/data_models/converter.py old mode 100644 new mode 100755 diff --git a/trano/data_models/parameters.yaml b/trano/data_models/parameters.yaml old mode 100644 new mode 100755 diff --git a/trano/data_models/trano.yaml b/trano/data_models/trano.yaml old mode 100644 new mode 100755 diff --git a/trano/data_models/trano_final.yaml b/trano/data_models/trano_final.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/__init__.py b/trano/elements/__init__.py old mode 100644 new mode 100755 diff --git a/trano/elements/base.py b/trano/elements/base.py old mode 100644 new mode 100755 diff --git a/trano/elements/boundary.py b/trano/elements/boundary.py old mode 100644 new mode 100755 diff --git a/trano/elements/bus.py b/trano/elements/bus.py old mode 100644 new mode 100755 diff --git a/trano/elements/components.py b/trano/elements/components.py old mode 100644 new mode 100755 diff --git a/trano/elements/connection.py b/trano/elements/connection.py old mode 100644 new mode 100755 diff --git a/trano/elements/construction.py b/trano/elements/construction.py old mode 100644 new mode 100755 diff --git a/trano/elements/control.py b/trano/elements/control.py old mode 100644 new mode 100755 diff --git a/trano/elements/controller_bus.py b/trano/elements/controller_bus.py old mode 100644 new mode 100755 diff --git a/trano/elements/element.yaml b/trano/elements/element.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/envelope.py b/trano/elements/envelope.py old mode 100644 new mode 100755 diff --git a/trano/elements/figure.py b/trano/elements/figure.py old mode 100644 new mode 100755 diff --git a/trano/elements/inputs.py b/trano/elements/inputs.py old mode 100644 new mode 100755 diff --git a/trano/elements/models/ahu_control.yaml b/trano/elements/models/ahu_control.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/air_handling_unit.yaml b/trano/elements/models/air_handling_unit.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/boiler.yaml b/trano/elements/models/boiler.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/boiler_control.yaml b/trano/elements/models/boiler_control.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/boundary.yaml b/trano/elements/models/boundary.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/collector_control.yaml b/trano/elements/models/collector_control.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/data_bus.yaml b/trano/elements/models/data_bus.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/duct.yaml b/trano/elements/models/duct.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/emission_control.yaml b/trano/elements/models/emission_control.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/external_wall.yaml b/trano/elements/models/external_wall.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/floor_on_ground.yaml b/trano/elements/models/floor_on_ground.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/internal_element.yaml b/trano/elements/models/internal_element.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/merged_windows.yaml b/trano/elements/models/merged_windows.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/occupancy.yaml b/trano/elements/models/occupancy.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/pump.yaml b/trano/elements/models/pump.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/radiator.yaml b/trano/elements/models/radiator.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/space.yaml b/trano/elements/models/space.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/split_valve.yaml b/trano/elements/models/split_valve.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/temperature_sensor.yaml b/trano/elements/models/temperature_sensor.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/three_way_valve.yaml b/trano/elements/models/three_way_valve.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/three_way_valve_control.yaml b/trano/elements/models/three_way_valve_control.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/valve.yaml b/trano/elements/models/valve.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/vav.yaml b/trano/elements/models/vav.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/vav_control.yaml b/trano/elements/models/vav_control.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/weather.yaml b/trano/elements/models/weather.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/models/window.yaml b/trano/elements/models/window.yaml old mode 100644 new mode 100755 diff --git a/trano/elements/parameters.py b/trano/elements/parameters.py old mode 100644 new mode 100755 diff --git a/trano/elements/space.py b/trano/elements/space.py old mode 100644 new mode 100755 diff --git a/trano/elements/system.py b/trano/elements/system.py old mode 100644 new mode 100755 diff --git a/trano/elements/types.py b/trano/elements/types.py old mode 100644 new mode 100755 diff --git a/trano/elements/utils.py b/trano/elements/utils.py old mode 100644 new mode 100755 diff --git a/trano/exceptions.py b/trano/exceptions.py old mode 100644 new mode 100755 diff --git a/trano/library/library.py b/trano/library/library.py old mode 100644 new mode 100755 diff --git a/trano/library/library.yaml b/trano/library/library.yaml old mode 100644 new mode 100755 diff --git a/trano/plot/__init__.py b/trano/plot/__init__.py old mode 100644 new mode 100755 diff --git a/trano/plot/plot.py b/trano/plot/plot.py old mode 100644 new mode 100755 diff --git a/trano/reporting/__init__.py b/trano/reporting/__init__.py old mode 100644 new mode 100755 diff --git a/trano/reporting/docx.py b/trano/reporting/docx.py old mode 100644 new mode 100755 diff --git a/trano/reporting/html.py b/trano/reporting/html.py old mode 100644 new mode 100755 diff --git a/trano/reporting/reporting.py b/trano/reporting/reporting.py old mode 100644 new mode 100755 diff --git a/trano/reporting/types.py b/trano/reporting/types.py old mode 100644 new mode 100755 diff --git a/trano/reporting/utils.py b/trano/reporting/utils.py old mode 100644 new mode 100755 diff --git a/trano/scripts/__init__.py b/trano/scripts/__init__.py old mode 100644 new mode 100755 diff --git a/trano/scripts/parse.py b/trano/scripts/parse.py old mode 100644 new mode 100755 diff --git a/trano/scripts/schema.py b/trano/scripts/schema.py old mode 100644 new mode 100755 diff --git a/trano/simulate/__init__.py b/trano/simulate/__init__.py old mode 100644 new mode 100755 diff --git a/trano/simulate/simulate.py b/trano/simulate/simulate.py old mode 100644 new mode 100755 diff --git a/trano/templates/Trano.jinja2 b/trano/templates/Trano.jinja2 old mode 100644 new mode 100755 diff --git a/trano/templates/base.jinja2 b/trano/templates/base.jinja2 old mode 100644 new mode 100755 diff --git a/trano/templates/macros.jinja2 b/trano/templates/macros.jinja2 old mode 100644 new mode 100755 diff --git a/trano/topology.py b/trano/topology.py old mode 100644 new mode 100755 diff --git a/trano/utils/__init__.py b/trano/utils/__init__.py old mode 100644 new mode 100755 diff --git a/trano/utils/utils.py b/trano/utils/utils.py old mode 100644 new mode 100755 From 7b321a75bcb667c914e2bd3b0990d301edf2da19 Mon Sep 17 00:00:00 2001 From: aan Date: Sun, 3 Nov 2024 17:34:13 +0100 Subject: [PATCH 4/4] feat: Add codeowners --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..77990a6 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @andoludo \ No newline at end of file