epinterface 1.0.0__tar.gz → 1.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. {epinterface-1.0.0 → epinterface-1.0.2}/PKG-INFO +1 -1
  2. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/constants/__init__.py +19 -14
  3. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/builder.py +83 -40
  4. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/flat_model.py +1 -1
  5. {epinterface-1.0.0 → epinterface-1.0.2}/notebooks/idf-demo.py +1 -1
  6. {epinterface-1.0.0 → epinterface-1.0.2}/pyproject.toml +1 -1
  7. {epinterface-1.0.0 → epinterface-1.0.2}/tests/test_components/test_builder.py +1 -1
  8. {epinterface-1.0.0 → epinterface-1.0.2}/uv.lock +1 -1
  9. {epinterface-1.0.0 → epinterface-1.0.2}/.editorconfig +0 -0
  10. {epinterface-1.0.0 → epinterface-1.0.2}/.github/actions/setup-python-env/action.yml +0 -0
  11. {epinterface-1.0.0 → epinterface-1.0.2}/.github/workflows/main.yml +0 -0
  12. {epinterface-1.0.0 → epinterface-1.0.2}/.github/workflows/on-release-main.yml +0 -0
  13. {epinterface-1.0.0 → epinterface-1.0.2}/.github/workflows/validate-codecov-config.yml +0 -0
  14. {epinterface-1.0.0 → epinterface-1.0.2}/.gitignore +0 -0
  15. {epinterface-1.0.0 → epinterface-1.0.2}/.pre-commit-config.yaml +0 -0
  16. {epinterface-1.0.0 → epinterface-1.0.2}/.prettierignore +0 -0
  17. {epinterface-1.0.0 → epinterface-1.0.2}/.python-version +0 -0
  18. {epinterface-1.0.0 → epinterface-1.0.2}/.vscode/settings.json +0 -0
  19. {epinterface-1.0.0 → epinterface-1.0.2}/CONTRIBUTING.md +0 -0
  20. {epinterface-1.0.0 → epinterface-1.0.2}/LICENSE +0 -0
  21. {epinterface-1.0.0 → epinterface-1.0.2}/Makefile +0 -0
  22. {epinterface-1.0.0 → epinterface-1.0.2}/README.md +0 -0
  23. {epinterface-1.0.0 → epinterface-1.0.2}/codecov.yaml +0 -0
  24. {epinterface-1.0.0 → epinterface-1.0.2}/docs/cli.md +0 -0
  25. {epinterface-1.0.0 → epinterface-1.0.2}/docs/index.md +0 -0
  26. {epinterface-1.0.0 → epinterface-1.0.2}/docs/modules/actions.md +0 -0
  27. {epinterface-1.0.0 → epinterface-1.0.2}/docs/modules/builder.md +0 -0
  28. {epinterface-1.0.0 → epinterface-1.0.2}/docs/modules/climate-studio.md +0 -0
  29. {epinterface-1.0.0 → epinterface-1.0.2}/docs/modules/geometry.md +0 -0
  30. {epinterface-1.0.0 → epinterface-1.0.2}/docs/modules/interface.md +0 -0
  31. {epinterface-1.0.0 → epinterface-1.0.2}/docs/modules/sbem/components.md +0 -0
  32. {epinterface-1.0.0 → epinterface-1.0.2}/docs/modules/sbem/composer.md +0 -0
  33. {epinterface-1.0.0 → epinterface-1.0.2}/docs/modules/sbem/index.md +0 -0
  34. {epinterface-1.0.0 → epinterface-1.0.2}/docs/modules/weather.md +0 -0
  35. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/__init__.py +0 -0
  36. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/actions.py +0 -0
  37. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/builder.py +0 -0
  38. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/cli.py +0 -0
  39. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/climate_studio/__init__.py +0 -0
  40. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/climate_studio/builder.py +0 -0
  41. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/climate_studio/interface.py +0 -0
  42. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/data/Minimal.idf +0 -0
  43. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/data/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2009-2023.ddy +0 -0
  44. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/data/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2009-2023.epw +0 -0
  45. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/data/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2009-2023.zip +0 -0
  46. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/data/__init__.py +0 -0
  47. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/data/res_schedules.parquet +0 -0
  48. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/ddy_injector_bayes.py +0 -0
  49. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/ddy_interface_bayes.py +0 -0
  50. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/geometry.py +0 -0
  51. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/interface.py +0 -0
  52. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/py.typed +0 -0
  53. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/__init__.py +0 -0
  54. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/annotations.py +0 -0
  55. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/common.py +0 -0
  56. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/components/__init__.py +0 -0
  57. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/components/composer.py +0 -0
  58. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/components/envelope.py +0 -0
  59. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/components/materials.py +0 -0
  60. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/components/operations.py +0 -0
  61. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/components/schedules.py +0 -0
  62. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/components/space_use.py +0 -0
  63. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/components/systems.py +0 -0
  64. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/components/zones.py +0 -0
  65. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/exceptions.py +0 -0
  66. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/fields/__init__.py +0 -0
  67. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/fields/spec.py +0 -0
  68. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/interface.py +0 -0
  69. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/model_graph_structure.md +0 -0
  70. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/client.py +0 -0
  71. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/migrations/20250309133033_create_initial_schema/migration.sql +0 -0
  72. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/migrations/20250310162045_switch_to_using_one_week_per_month/migration.sql +0 -0
  73. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/migrations/20250317202733_change_names_ventilation/migration.sql +0 -0
  74. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/migrations/20250325185158_add_mutually_exclusive_ventilation_techtypes/migration.sql +0 -0
  75. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/migrations/20250326141941_reduce_naming_complexity_ventilation/migration.sql +0 -0
  76. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/migrations/20250331141910_add_support_for_attic_and_basement_constructions/migration.sql +0 -0
  77. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/migrations/20250919152559_decouple_basement_infiltration/migration.sql +0 -0
  78. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/migrations/migration_lock.toml +0 -0
  79. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/partial_types.py +0 -0
  80. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/schema.prisma +0 -0
  81. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/prisma/seed_fns.py +0 -0
  82. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/sbem/utils.py +0 -0
  83. {epinterface-1.0.0 → epinterface-1.0.2}/epinterface/weather.py +0 -0
  84. {epinterface-1.0.0 → epinterface-1.0.2}/mkdocs.yml +0 -0
  85. {epinterface-1.0.0 → epinterface-1.0.2}/notebooks/everett_lib.json +0 -0
  86. {epinterface-1.0.0 → epinterface-1.0.2}/notebooks/everett_lib_v2.ipynb +0 -0
  87. {epinterface-1.0.0 → epinterface-1.0.2}/notebooks/everett_retrofit_actions.ipynb +0 -0
  88. {epinterface-1.0.0 → epinterface-1.0.2}/notebooks/everett_retrofits.yaml +0 -0
  89. {epinterface-1.0.0 → epinterface-1.0.2}/notebooks/idf-demo.ipynb +0 -0
  90. {epinterface-1.0.0 → epinterface-1.0.2}/notebooks/view-geo.ipynb +0 -0
  91. {epinterface-1.0.0 → epinterface-1.0.2}/scripts/gridsim.py +0 -0
  92. {epinterface-1.0.0 → epinterface-1.0.2}/tests/conftest.py +0 -0
  93. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/20251001_Template_MAWebApp.xlsx +0 -0
  94. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/USA_MA_Chicopee-Westover.Metro.AP.744910_TMYx.2009-2023.zip +0 -0
  95. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/component-map-ma.yml +0 -0
  96. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/components-ma.db +0 -0
  97. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/old/0318_Template_MAWebApp.xlsx +0 -0
  98. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/old/Template_MAWebApp.xlsx +0 -0
  99. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/old/component-map-ma.yml +0 -0
  100. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/old/components-ma-old.db +0 -0
  101. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/old/components-ma.db +0 -0
  102. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/old/components-ma.db Kopie +0 -0
  103. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/old/components-ma.db Kopie 2 +0 -0
  104. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/old/components-ma.db Kopie 3 +0 -0
  105. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/old/semantic-fields-ma.yml +0 -0
  106. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/semantic-fields-ma.yml +0 -0
  107. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/test_lib.json +0 -0
  108. {epinterface-1.0.0 → epinterface-1.0.2}/tests/data/tester_lib.xlsx +0 -0
  109. {epinterface-1.0.0 → epinterface-1.0.2}/tests/test_actions.py +0 -0
  110. {epinterface-1.0.0 → epinterface-1.0.2}/tests/test_components/test_component_lib.py +0 -0
  111. {epinterface-1.0.0 → epinterface-1.0.2}/tests/test_components/test_envelope_comps.py +0 -0
  112. {epinterface-1.0.0 → epinterface-1.0.2}/tests/test_components/test_operations.py +0 -0
  113. {epinterface-1.0.0 → epinterface-1.0.2}/tests/test_components/test_space_use_comps.py +0 -0
  114. {epinterface-1.0.0 → epinterface-1.0.2}/tests/test_composer.py +0 -0
  115. {epinterface-1.0.0 → epinterface-1.0.2}/tests/test_db.py +0 -0
  116. {epinterface-1.0.0 → epinterface-1.0.2}/tests/test_example.py +0 -0
  117. {epinterface-1.0.0 → epinterface-1.0.2}/tests/test_geometry.py +0 -0
  118. {epinterface-1.0.0 → epinterface-1.0.2}/tests/test_weather.py +0 -0
  119. {epinterface-1.0.0 → epinterface-1.0.2}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: epinterface
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: This is a repository for dynamically generating energy models within Python, relying on Archetypal and Eppy for most of its functionality.
5
5
  Project-URL: Homepage, https://github.com/szvsw/epinterface
6
6
  Project-URL: Documentation, https://szvsw.github.io/epinterface
@@ -34,21 +34,26 @@ class AssumedConstants(BaseModel, frozen=True):
34
34
  FractionLostEquipment: float = Field(default=0, ge=0, le=1)
35
35
 
36
36
  MetabolicRate_met: float = Field(default=1.2, ge=0, frozen=True)
37
+ # SiteGroundTemperature_degC: list[float] = Field(
38
+ # default=[
39
+ # 18.3,
40
+ # 18.2,
41
+ # 18.3,
42
+ # 18.4,
43
+ # 20.1,
44
+ # 22.0,
45
+ # 22.3,
46
+ # 22.5,
47
+ # 22.5,
48
+ # 20.7,
49
+ # 18.9,
50
+ # 18.5,
51
+ # ],
52
+ # frozen=True,
53
+ # )
54
+
37
55
  SiteGroundTemperature_degC: list[float] = Field(
38
- default=[
39
- 18.3,
40
- 18.2,
41
- 18.3,
42
- 18.4,
43
- 20.1,
44
- 22.0,
45
- 22.3,
46
- 22.5,
47
- 22.5,
48
- 20.7,
49
- 18.9,
50
- 18.5,
51
- ],
56
+ default=[23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23],
52
57
  frozen=True,
53
58
  )
54
59
  Sensible_Heat_Recovery_Effectiveness: float = Field(
@@ -45,6 +45,13 @@ DESIRED_METERS = (
45
45
  "WaterSystems:DistrictHeating",
46
46
  )
47
47
 
48
+ # TODO: add the meters for HVAC systems
49
+ DESIRED_VARIABLES = (
50
+ "Zone Mean Air Temperature",
51
+ "Zone Air Relative Humidity",
52
+ "Site Outdoor Air Drybulb Temperature",
53
+ )
54
+
48
55
 
49
56
  class SimulationPathConfig(BaseModel):
50
57
  """The configuration for the simulation's pathing."""
@@ -815,13 +822,33 @@ class Model(BaseWeather, validate_assignment=True):
815
822
  target_base_filepath = config.output_dir / "Minimal.idf"
816
823
  shutil.copy(base_filepath, target_base_filepath)
817
824
  epw_path, ddy_path = asyncio.run(self.fetch_weather(config.weather_dir))
818
- output_meters = [
819
- {"key": "OUTPUT:METER", "Key_Name": meter, "Reporting_Frequency": "Monthly"}
820
- for meter in DESIRED_METERS
821
- ] + [
822
- {"key": "OUTPUT:METER", "Key_Name": meter, "Reporting_Frequency": "Hourly"}
823
- for meter in DESIRED_METERS
824
- ]
825
+ output_meters = (
826
+ [
827
+ {
828
+ "key": "OUTPUT:METER",
829
+ "Key_Name": meter,
830
+ "Reporting_Frequency": "Monthly",
831
+ }
832
+ for meter in DESIRED_METERS
833
+ ]
834
+ + [
835
+ {
836
+ "key": "OUTPUT:METER",
837
+ "Key_Name": meter,
838
+ "Reporting_Frequency": "Hourly",
839
+ }
840
+ for meter in DESIRED_METERS
841
+ ]
842
+ + [
843
+ {
844
+ "key": "OUTPUT:VARIABLE",
845
+ "Key_Value": "*",
846
+ "Variable_Name": variable,
847
+ "Reporting_Frequency": "Hourly",
848
+ }
849
+ for variable in DESIRED_VARIABLES
850
+ ]
851
+ )
825
852
  idf = IDF(
826
853
  target_base_filepath.as_posix(),
827
854
  as_version="22.2", # pyright: ignore [reportArgumentType]
@@ -983,7 +1010,7 @@ class Model(BaseWeather, validate_assignment=True):
983
1010
  """
984
1011
  err_files = filter(
985
1012
  lambda x: x.suffix == ".err",
986
- [idf.output_directory / Path(f) for f in idf.simulation_files],
1013
+ [Path(f) for f in idf.simulation_files],
987
1014
  )
988
1015
  err_text = "\n".join([f.read_text() for f in err_files])
989
1016
  return err_text
@@ -1228,20 +1255,29 @@ class Model(BaseWeather, validate_assignment=True):
1228
1255
  self,
1229
1256
  weather_dir: Path | None = None,
1230
1257
  post_geometry_callback: Callable[[IDF], IDF] | None = None,
1231
- ) -> tuple[IDF, pd.Series, str]:
1258
+ eplus_parent_dir: Path | None = None,
1259
+ ) -> tuple[IDF, pd.Series, str, Sql, Path | None]:
1232
1260
  """Build and simualte the idf model.
1233
1261
 
1234
1262
  Args:
1235
1263
  weather_dir (Path): The directory to store the weather files.
1236
1264
  post_geometry_callback (Callable[[IDF],IDF] | None): A callback to run after the geometry is added.
1265
+ eplus_parent_dir (Path | None): The parent directory to store the eplus working directory. If None, a temporary directory will be used.
1237
1266
 
1238
1267
  Returns:
1239
1268
  idf (IDF): The built energy model.
1240
- results (dict[str, pd.Series]): The postprocessed results.
1269
+ results (pd.Series): The postprocessed results including energy, peak, and temperature data.
1241
1270
  err_text (str): The warning text.
1271
+ sql (Sql): The SQL results file with simulation data.
1272
+ eplus_dir (Path | None): The path to the eplus artifact directory (None if a temporary directory was used).
1242
1273
  """
1243
- with tempfile.TemporaryDirectory() as temp_dir:
1244
- output_dir = Path(temp_dir)
1274
+ with tempfile.TemporaryDirectory() as output_dir_name:
1275
+ output_dir = (
1276
+ Path(output_dir_name)
1277
+ if eplus_parent_dir is None
1278
+ else eplus_parent_dir / "eplus_simulation"
1279
+ )
1280
+ output_dir.mkdir(parents=True, exist_ok=True)
1245
1281
  config = (
1246
1282
  SimulationPathConfig(
1247
1283
  output_dir=output_dir,
@@ -1257,8 +1293,11 @@ class Model(BaseWeather, validate_assignment=True):
1257
1293
  )
1258
1294
  results = self.standard_results_postprocess(sql)
1259
1295
  err_text = self.get_warnings(idf)
1296
+
1260
1297
  gc.collect()
1261
- return idf, results, err_text
1298
+ # if eplus_parent_dir is not None, we return the path to the output directory
1299
+ output_dir_result = output_dir if eplus_parent_dir is not None else None
1300
+ return idf, results, err_text, sql, output_dir_result
1262
1301
 
1263
1302
 
1264
1303
  if __name__ == "__main__":
@@ -1271,8 +1310,10 @@ if __name__ == "__main__":
1271
1310
  from epinterface.sbem.prisma.client import PrismaSettings
1272
1311
 
1273
1312
  with tempfile.TemporaryDirectory() as temp_dir:
1274
- database_path = Path("tests") / "data" / "components-ma.db"
1275
- component_map_path = Path("tests") / "data" / "component-map-ma.yml"
1313
+ database_path = Path("/Users/daryaguettler/globi/data/Brazil/components-lib.db")
1314
+ component_map_path = Path(
1315
+ "/Users/daryaguettler/globi/data/Brazil/component-map.yaml"
1316
+ )
1276
1317
  settings = PrismaSettings(
1277
1318
  database_path=database_path,
1278
1319
  auto_register=False,
@@ -1289,32 +1330,17 @@ if __name__ == "__main__":
1289
1330
  selector = SelectorModel.model_validate(component_map_yaml)
1290
1331
  db = settings.db
1291
1332
  context = {
1292
- "Region": "MA",
1293
- "Typology": "SFH",
1294
- "Age_bracket": "pre_1975",
1295
- "AtticVentilation": "UnventilatedAttic",
1296
- "AtticFloorInsulation": "NoInsulation",
1297
- "RoofInsulation": "UninsulatedRoof",
1298
- "BasementCeilingInsulation": "InsulatedCeiling",
1299
- "BasementWallsInsulation": "UninsulatedWalls",
1300
- "GroundSlabInsulation": "UninsulatedGroundSlab",
1301
- "Walls": "SomeInsulationWalls",
1302
- "Weatherization": "SomewhatLeakyEnvelope",
1303
- "Windows": "DoublePaneLowE",
1304
- "Heating": "ASHPHeating",
1305
- "Cooling": "ASHPCooling",
1306
- "Distribution": "Steam",
1307
- "DHW": "NaturalGasDHW",
1308
- "Lighting": "NoLED",
1309
- "Equipment": "LowEfficiencyEquipment",
1310
- "Thermostat": "NoControls",
1333
+ "region": "SP",
1334
+ "income": "Low",
1335
+ "typology": "Residential",
1336
+ "scenario": "withAC",
1311
1337
  }
1312
1338
  with settings.db:
1313
1339
  zone = cast(ZoneComponent, selector.get_component(context=context, db=db))
1314
1340
 
1315
1341
  model = Model(
1316
1342
  Weather=(
1317
- "https://climate.onebuilding.org/WMO_Region_4_North_and_Central_America/USA_United_States_of_America/MA_Massachusetts/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2009-2023.zip"
1343
+ "https://climate.onebuilding.org/WMO_Region_3_South_America/BRA_Brazil/SP_Sao_Paulo/BRA_SP_Guaratingueta.AP.837080_TMYx.2009-2023.zip"
1318
1344
  ), # pyright: ignore [reportArgumentType]
1319
1345
  Zone=zone,
1320
1346
  Attic=AtticAssumptions(
@@ -1328,10 +1354,10 @@ if __name__ == "__main__":
1328
1354
  geometry=ShoeboxGeometry(
1329
1355
  x=0,
1330
1356
  y=0,
1331
- w=14,
1332
- d=14,
1357
+ w=20,
1358
+ d=20,
1333
1359
  h=3,
1334
- wwr=0.2,
1360
+ wwr=0.3,
1335
1361
  num_stories=3,
1336
1362
  basement=False,
1337
1363
  zoning="by_storey",
@@ -1341,10 +1367,27 @@ if __name__ == "__main__":
1341
1367
  )
1342
1368
 
1343
1369
  # post_geometry_callback = lambda x: x.saveas("notebooks/badgeo.idf")
1344
- _idf, results, _err_text = model.run(
1370
+
1371
+ _idf, results, _err_text, _sql, _ = model.run(
1345
1372
  # post_geometry_callback=post_geometry_callback,
1346
1373
  )
1374
+
1375
+ # temp_config = TemperatureOutputConfig(mode="hours_above_threshold", threshold=26.0)
1376
+ # _idf, results, _err_text, _sql = model.run(temp_config=temp_config)
1347
1377
  # _idf.saveas("test-out.idf")
1348
1378
  print(_err_text)
1349
1379
  print(results)
1350
- print(results.Energy.Raw.groupby("Meter").sum())
1380
+
1381
+ if "Temperature" in results.index.get_level_values("Measurement"):
1382
+ zone_temp_results = results.loc["Temperature"]
1383
+ print("Zone Temperature Results:")
1384
+ print(zone_temp_results)
1385
+ else:
1386
+ print("No temperature data found in results")
1387
+ print(
1388
+ f"Available measurements: {results.index.get_level_values('Measurement').unique().tolist()}"
1389
+ )
1390
+
1391
+ energy_raw = results.loc["Energy"].loc["Raw"]
1392
+ print("Energy Raw Results:")
1393
+ print(energy_raw.groupby(level=0).sum())
@@ -2126,7 +2126,7 @@ class FlatModel(BaseModel):
2126
2126
  """Simulate the model and return the IDF, result, and error."""
2127
2127
  model, cb = self.to_model()
2128
2128
 
2129
- idf, result, err = model.run(post_geometry_callback=cb)
2129
+ idf, result, err, _sql, _ = model.run(post_geometry_callback=cb)
2130
2130
 
2131
2131
  return idf, result, err
2132
2132
 
@@ -921,7 +921,7 @@ if __name__ == "__main__":
921
921
 
922
922
  model = params.to_model()
923
923
 
924
- idf, results, err_text = model.run()
924
+ idf, results, err_text, *_ = model.run()
925
925
  idf.saveas("model.idf")
926
926
  results.to_csv("results.csv")
927
927
  agg_results = results.groupby(["Meter", "Aggregation"]).sum()
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "epinterface"
3
- version = "v1.0.0"
3
+ version = "v1.0.2"
4
4
  description = "This is a repository for dynamically generating energy models within Python, relying on Archetypal and Eppy for most of its functionality."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -39,7 +39,7 @@ def test_builder(preseeded_readonly_db: Prisma):
39
39
  ),
40
40
  )
41
41
 
42
- _idf, results, _err_text = model.run()
42
+ _idf, _results, _err_text, _sql, _ = model.run()
43
43
 
44
44
 
45
45
  # TODO: add parameterized tests for different attic/basement configurations
@@ -598,7 +598,7 @@ wheels = [
598
598
 
599
599
  [[package]]
600
600
  name = "epinterface"
601
- version = "1.0.0"
601
+ version = "1.0.2"
602
602
  source = { editable = "." }
603
603
  dependencies = [
604
604
  { name = "archetypal" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes