Commit 803f6973 authored by Eric Duminil's avatar Eric Duminil
Browse files

Merge branch 'experimental/docker'

parents c52ffac8 88ec369b
...@@ -6,6 +6,10 @@ ...@@ -6,6 +6,10 @@
dist/ dist/
docs/ docs/
*.egg-info *.egg-info
examples/
# Repo cache, e.g. during SimStadt tests # Repo cache, e.g. during SimStadt tests
**/.cache/ **/.cache/
# Generated workflow output (e.g. from examples/compose.yaml, tests, or manual runs)
**/output.proj/
...@@ -14,3 +14,6 @@ old/ ...@@ -14,3 +14,6 @@ old/
.cache .cache
.coverage .coverage
# Generated workflow output (e.g. from examples/compose.yaml, tests, or manual runs)
output.proj/
...@@ -49,9 +49,6 @@ COPY --chown=simstadt:simstadt pyproject.toml uv.lock README.md ./ ...@@ -49,9 +49,6 @@ COPY --chown=simstadt:simstadt pyproject.toml uv.lock README.md ./
RUN uv sync --frozen --no-install-project RUN uv sync --frozen --no-install-project
RUN uv pip install simstadt RUN uv pip install simstadt
# Lets `simstadt <template-name> <citygml>` work out of the box using the templates
# bundled with the PyPI package, without requiring users to mount/supply their own.
ENV SIMSTADT_TEMPLATE_PATH=/opt/venv/lib/python3.11/site-packages/simstadt/templates
RUN simstadt --install RUN simstadt --install
COPY --chown=simstadt:simstadt tests ./tests COPY --chown=simstadt:simstadt tests ./tests
......
...@@ -115,6 +115,51 @@ simstadt PV path/to/city.gml --verbose ...@@ -115,6 +115,51 @@ simstadt PV path/to/city.gml --verbose
regionchooser regionchooser
``` ```
## Docker
A ready-to-use image is published at [`simstadt/simstadt:cli`](https://hub.docker.com/r/simstadt/simstadt). It bundles Java, INSEL, and this package (installed from PyPI) with a real SimStadt install.
```bash
# Health check: shows the detected SimStadt version
docker run --rm simstadt/simstadt:cli
# Run a workflow against a mounted CityGML file
mkdir -p data
cp path/to/city.gml data/city.gml
docker run --rm -v "$(pwd)/data:/data" simstadt/simstadt:cli simstadt HeatDemand /data/city.gml -p /data/output --files
```
Results are written to `data/output.proj/` on the host:
```
HeatDemand for city.gml
Number of buildings : 137
Number of heated buildings : 91
Specific Heating demand : 95 kWh / (m² · a)
Heated area : 83034 m²
Footprint area : 19767 m²
Yearly Heating demand : 6598939 kWh / a
Total Yearly Heating + DHW demand : 7916193 kWh / a
Mean Uvalue : 1.3 W / (m² · K)
Year of construction : 1946
Storey number : 5
Output files:
/data/output.proj/20260921_0932_96on_HeatDemand.flow/02_WeatherProcessor.step/hourly_GHI_DHI_Ta_pvgis_SARAH3_2005_2023_N49_8__E9_9.prn
/data/output.proj/20260921_0932_96on_HeatDemand.flow/05_MonthlyEnergyBalance.step/city_DIN18599_HEATING.csv
/data/output.proj/20260921_0932_96on_HeatDemand.flow/05_MonthlyEnergyBalance.step/city_DIN18599_HEATING.log
```
Bring your own templates by keeping them alongside your data and pointing `SIMSTADT_TEMPLATE_PATH`
at them — a single mount. A complete, runnable example (with sample CityGML data and a template)
is in [`examples/`](examples/):
```bash
cd examples
docker compose run --rm simstadt simstadt MyTemplate /data/city.gml --project-path /data/output --save /data/my_simulation.csv --verbose
```
## Development ## Development
```bash ```bash
......
...@@ -26,8 +26,10 @@ ...@@ -26,8 +26,10 @@
* [ ] Readme and examples at https://hub.docker.com/repository/docker/simstadt/simstadt * [ ] Readme and examples at https://hub.docker.com/repository/docker/simstadt/simstadt
* [ ] Fix simstadt CLI, with easier template names * [x] Fix simstadt CLI, with easier template names
* [ ] Docker compose * [x] Docker compose
* [ ] Example with dataframe & KPIs * [x] Example with dataframe & KPIs
* [x] Is description correct?
* [x] Add Class name to result?
* [ ] Doc to https://simstadt.hft-stuttgart.de/ * [ ] Doc to https://simstadt.hft-stuttgart.de/
* [ ] latest tag as cli? * [ ] latest tag as cli?
services:
simstadt:
image: simstadt/simstadt:cli
volumes:
- ./data:/data
environment:
SIMSTADT_TEMPLATE_PATH: /data/templates
LOCALE: en_GB # optional, will set decimal separator to "."
MAX_RAM: 2g # optional. Default is 4GB, increase if needed
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.citygml.steps.ImportCityGml" id="ImportCityGml0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>startStep</string>
<void method="set">
<object idref="ImportCityGml0"/>
<boolean>true</boolean>
</void>
</void>
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="ImportCityGml0"/>
<string>01_Preprocessing.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.GeometricPreprocessorStep" id="GeometricPreprocessorStep0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>startStep</string>
<void method="set">
<object idref="GeometricPreprocessorStep0"/>
<boolean>true</boolean>
</void>
</void>
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="GeometricPreprocessorStep0"/>
<string>01_GeometricEstimator.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.GeometricEstimatorStep" id="GeometricEstimatorStep0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="GeometricEstimatorStep0"/>
<string>02_PhysicsPreprocessor.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.PhysicsPreprocessorStep" id="PhysicsPreprocessorStep0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="PhysicsPreprocessorStep0"/>
<string>03_UsagePreprocessor.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.UsagePreprocessorStep">
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.Preprocessing" id="Preprocessing0">
<void class="de.hftstuttgart.hierarchicworkflow.Workflow" method="getField">
<string>selectedStartStepPath</string>
<void method="set">
<object idref="Preprocessing0"/>
<string>00_GeometricPreprocessor.step</string>
</void>
</void>
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="Preprocessing0"/>
<string>02_WeatherProcessor.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.WeatherProcessorStep" id="WeatherProcessorStep0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="WeatherProcessorStep0"/>
<string>03_IrradianceProcessor.step</string>
</void>
</void>
<void property="inputFilename">
<string>METEONORM_FILE</string>
</void>
<void property="name">
<string>Base</string>
</void>
<void property="weatherDataSource">
<object class="java.lang.Enum" method="valueOf">
<class>de.hft.stuttgart.simstadt2.weather.WeatherDataSourceType</class>
<string>PVGIS_DATABASE</string>
</object>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.IrradianceProcessorStep" id="IrradianceProcessorStep0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="IrradianceProcessorStep0"/>
<string>04_RefurbishmentScenarioMaker.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="17.0.16" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.RefurbishmentScenarioMakerStep" id="RefurbishmentScenarioMakerStep0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="RefurbishmentScenarioMakerStep0"/>
<string>05_MonthlyEnergyBalance.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
<void property="selectedStrategy">
<int>1</int>
</void>
<void property="strategies">
<void method="add">
<object class="de.hft.stuttgart.simstadt.refurbishment.strategy.StrategyObjectXml">
<void property="globalStrategy">
<array class="double" length="10">
<void index="2">
<!-- GEG -->
<double>GEG_RATIO</double>
</void>
</array>
</void>
<void property="name">
<string>SanierungUndAufstockung</string>
</void>
</object>
</void>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.MonthlyEnergyBalanceStep">
<void property="name">
<string>Base</string>
</void>
<void property="calculationMode">
<object class="java.lang.Enum" method="valueOf">
<class>de.hft.stuttgart.simstadt2.buildingenergymodels.MonthlyBalanceDIN18599$CalculationMode</class>
<string>CALCULATION_MODE</string>
</object>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflows.CityGmlWorkflow" id="CityGmlWorkflow0">
<void class="de.hftstuttgart.hierarchicworkflow.Workflow" method="getField">
<string>selectedStartStepPath</string>
<void method="set">
<object idref="CityGmlWorkflow0"/>
<string>00_ImportCityGml.step</string>
</void>
</void>
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>startStep</string>
<void method="set">
<object idref="CityGmlWorkflow0"/>
<boolean>true</boolean>
</void>
</void>
<void property="name">
<string>CGSC_HeatDemand</string>
</void>
<void property="shortName">
<string>HeatDemand</string>
</void>
<void property="workflowProvider">
<object class="de.hftstuttgart.simstadtworkflows.energy.HeatDemandAnalysisWorkflowProvider"/>
</void>
</object>
</java>
...@@ -265,4 +265,6 @@ class SimStadtResults(ABC): ...@@ -265,4 +265,6 @@ class SimStadtResults(ABC):
provider, provider,
) )
return UnknownWorkflowResults(**kwargs) return UnknownWorkflowResults(**kwargs)
return cls._registry[provider](**kwargs) results = cls._registry[provider](**kwargs)
logger.debug("Type: %s", results.class_name)
return results
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment