ecoengine 3.1.0__tar.gz → 3.1.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 (90) hide show
  1. {ecoengine-3.1.0 → ecoengine-3.1.2}/PKG-INFO +1 -1
  2. {ecoengine-3.1.0 → ecoengine-3.1.2}/pyproject.toml +1 -1
  3. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/interfaces/EcosizerEngine.py +56 -5
  4. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/MP_RTPInSeriesSystem.py +2 -2
  5. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/SP_RTPInParallelSystem.py +1 -1
  6. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/SP_RTPInSeriesSystem.py +2 -2
  7. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/utils.py +10 -6
  8. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/simulation/SimulationRun.py +1 -1
  9. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine.egg-info/PKG-INFO +1 -1
  10. {ecoengine-3.1.0 → ecoengine-3.1.2}/README.md +0 -0
  11. {ecoengine-3.1.0 → ecoengine-3.1.2}/setup.cfg +0 -0
  12. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/__init__.py +0 -0
  13. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/constants/__init__.py +0 -0
  14. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/constants/constants.py +0 -0
  15. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/__init__.py +0 -0
  16. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/DryBulbTemperatures_ByClimateZone.csv +0 -0
  17. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/InletWaterTemperatures_ByClimateZone.csv +0 -0
  18. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/WeatherStation_ClimateZone_Lookup.csv +0 -0
  19. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/ZipCode_ClimateZone_Lookup.csv +0 -0
  20. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/__init__.py +0 -0
  21. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/kGperkWh_ByClimateZone.csv +0 -0
  22. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/__init__.py +0 -0
  23. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/apartment.json +0 -0
  24. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/elementary_school.json +0 -0
  25. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/food_service_a.json +0 -0
  26. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/food_service_b.json +0 -0
  27. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/junior_high.json +0 -0
  28. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/mens_dorm.json +0 -0
  29. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/motel.json +0 -0
  30. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/multi_family.json +0 -0
  31. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/nursing_home.json +0 -0
  32. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/office_building.json +0 -0
  33. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/senior_high.json +0 -0
  34. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/womens_dorm.json +0 -0
  35. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/__init__.py +0 -0
  36. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/maps.json +0 -0
  37. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH3_SP_bounds.pkl +0 -0
  38. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH3_SP_capacity_interpolator.pkl +0 -0
  39. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH3_SP_power_in_interpolator.pkl +0 -0
  40. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH4_MP_bounds.pkl +0 -0
  41. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH4_MP_capacity_interpolator.pkl +0 -0
  42. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH4_MP_power_in_interpolator.pkl +0 -0
  43. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/__init__.py +0 -0
  44. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/interfaces/Simulator.py +0 -0
  45. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/interfaces/__init__.py +0 -0
  46. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/__init__.py +0 -0
  47. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/building/Building.py +0 -0
  48. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/building/ClimateZone.py +0 -0
  49. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/building/UtilityCostTracker.py +0 -0
  50. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/building/__init__.py +0 -0
  51. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/__init__.py +0 -0
  52. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/Controls.py +0 -0
  53. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/PerformanceMap.py +0 -0
  54. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/WaterHeater.py +0 -0
  55. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/__init__.py +0 -0
  56. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/EnergyTank.py +0 -0
  57. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/MixedStorageTank.py +0 -0
  58. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/SlugOverlayTank.py +0 -0
  59. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/StorageTank.py +0 -0
  60. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/StratifiedTank.py +0 -0
  61. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/__init__.py +0 -0
  62. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/DHWSystem.py +0 -0
  63. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/InstantWHSystem.py +0 -0
  64. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/MPNoRecircSystem.py +0 -0
  65. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/__init__.py +0 -0
  66. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/ParallelLoopSystem.py +0 -0
  67. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/RecircSystem.py +0 -0
  68. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/SwingDualFuelSystem.py +0 -0
  69. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/SwingERTrdOffSystem.py +0 -0
  70. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/SwingSystem.py +0 -0
  71. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/__init__.py +0 -0
  72. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/MultiPassRTPSystem.py +0 -0
  73. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/RTPSystem.py +0 -0
  74. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/SinglePassRTPSystem.py +0 -0
  75. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/__init__.py +0 -0
  76. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/simulation/__init__.py +0 -0
  77. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/__init__.py +0 -0
  78. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_buildings.py +0 -0
  79. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_dhw_system.py +0 -0
  80. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_ecosizer_engine_dual_fuel.py +0 -0
  81. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_mixing_valve.py +0 -0
  82. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_performance_map.py +0 -0
  83. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_sp_rtp_in_series.py +0 -0
  84. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_sprtp_simulation.py +0 -0
  85. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_storage_tanks.py +0 -0
  86. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_utility_cost_tracker.py +0 -0
  87. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine.egg-info/SOURCES.txt +0 -0
  88. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine.egg-info/dependency_links.txt +0 -0
  89. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine.egg-info/requires.txt +0 -0
  90. {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ecoengine
3
- Version: 3.1.0
3
+ Version: 3.1.2
4
4
  Requires-Python: >=3.11
5
5
  Requires-Dist: numpy
6
6
  Requires-Dist: scipy
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ecoengine"
7
- version = "3.1.0"
7
+ version = "3.1.2"
8
8
  requires-python = ">=3.11"
9
9
  dependencies = ["numpy", "scipy", "plotly>=4.12.0"]
10
10
 
@@ -1309,6 +1309,9 @@ class EcosizerEngine:
1309
1309
  from ecoengine.objects.components.storage.StratifiedTank import StratifiedTank
1310
1310
 
1311
1311
  control_schedule, control_map = self._build_control_map()
1312
+ if self.schematic in _DUAL_FUEL_SCHEMATICS:
1313
+ from ecoengine.objects.dhwsystems.utils import set_dual_fuel_shed_controls
1314
+ control_map = set_dual_fuel_shed_controls(control_map)
1312
1315
  if self.hpwh_model is not None:
1313
1316
  design_inlet_temp_f = self._building.get_design_inlet_water_temp_f() or 50.0
1314
1317
  # Use num_units instead of N separate objects — all units share the
@@ -1348,7 +1351,7 @@ class EcosizerEngine:
1348
1351
 
1349
1352
  if self.schematic in ["primary_no_recirc", "singlepass_norecirc"]:
1350
1353
  from ecoengine.objects.dhwsystems.DHWSystem import DHWSystem
1351
- return DHWSystem(
1354
+ system = DHWSystem(
1352
1355
  water_heaters=water_heaters,
1353
1356
  storage_tank=_primary_tank(),
1354
1357
  supply_temp_f=self.supply_temp_f,
@@ -1356,6 +1359,9 @@ class EcosizerEngine:
1356
1359
  max_daily_run_hr=self.max_daily_run_hr,
1357
1360
  defrost_factor=self.defrost_factor,
1358
1361
  )
1362
+ system._minimum_capacity_kbtuh = self.heating_capacity_kbtuh
1363
+ system._minimum_storage_storageT_gal = self.storage_volume_storageT_gal
1364
+ return system
1359
1365
 
1360
1366
  if self.schematic in ["parallel_loop", "paralleltank"]:
1361
1367
  from ecoengine.objects.dhwsystems.recirc_systems.ParallelLoopSystem import ParallelLoopSystem
@@ -1370,7 +1376,7 @@ class EcosizerEngine:
1370
1376
  off_trigger_t_f=self.tm_off_temp_f,
1371
1377
  outlet_temp_f=self.tm_off_temp_f,
1372
1378
  )
1373
- return ParallelLoopSystem(
1379
+ system = ParallelLoopSystem(
1374
1380
  water_heaters=water_heaters,
1375
1381
  storage_tank=_primary_tank(),
1376
1382
  supply_temp_f=self.supply_temp_f,
@@ -1387,6 +1393,11 @@ class EcosizerEngine:
1387
1393
  max_daily_run_hr=self.max_daily_run_hr,
1388
1394
  defrost_factor=self.defrost_factor,
1389
1395
  )
1396
+ system._minimum_capacity_kbtuh = self.heating_capacity_kbtuh
1397
+ system._minimum_storage_storageT_gal = self.storage_volume_storageT_gal
1398
+ system._minimum_tm_volume_gal = self.tm_storage_vol
1399
+ system._minimum_tm_capacity_kbtuh = self.tm_capacity_kbtuh
1400
+ return system
1390
1401
 
1391
1402
  if self.schematic in ["swing_tank", "swingtank"]:
1392
1403
  from ecoengine.objects.dhwsystems.recirc_systems.SwingSystem import SwingSystem, _ELEMENT_DEADBAND_F
@@ -1412,6 +1423,10 @@ class EcosizerEngine:
1412
1423
  max_daily_run_hr=self.max_daily_run_hr,
1413
1424
  defrost_factor=self.defrost_factor,
1414
1425
  )
1426
+ system._minimum_capacity_kbtuh = self.heating_capacity_kbtuh
1427
+ system._minimum_storage_storageT_gal = self.storage_volume_storageT_gal
1428
+ system._minimum_tm_volume_gal = self.tm_storage_vol
1429
+ system._minimum_tm_capacity_kbtuh = self.tm_capacity_kbtuh
1415
1430
  system.tm_storage_tank = MixedStorageTank(total_volume_gal=self.tm_storage_vol)
1416
1431
  system.tm_water_heater = self._build_tm_water_heater(tm_controls, force_electric_resistance = True)
1417
1432
  return system
@@ -1423,7 +1438,7 @@ class EcosizerEngine:
1423
1438
  from ecoengine.objects.components.storage.EnergyTank import EnergyTank
1424
1439
  self._require_recirc_params()
1425
1440
  cold_temp_f = self._building.get_design_inlet_water_temp_f() or 50.0
1426
- return SinglePassRTPSystem(
1441
+ system = SinglePassRTPSystem(
1427
1442
  water_heaters=water_heaters,
1428
1443
  storage_tank=EnergyTank(
1429
1444
  total_volume_gal=self.storage_volume_storageT_gal,
@@ -1439,6 +1454,9 @@ class EcosizerEngine:
1439
1454
  defrost_factor=self.defrost_factor,
1440
1455
  tm_safety_factor=self.tm_safety_factor,
1441
1456
  )
1457
+ system._minimum_capacity_kbtuh = self.heating_capacity_kbtuh
1458
+ system._minimum_storage_storageT_gal = self.storage_volume_storageT_gal
1459
+ return system
1442
1460
 
1443
1461
  if self.schematic in ["multi_pass_rtp", "mprtp"]:
1444
1462
  from ecoengine.objects.dhwsystems.rtp_systems.MultiPassRTPSystem import (
@@ -1447,7 +1465,7 @@ class EcosizerEngine:
1447
1465
  from ecoengine.objects.components.storage.SlugOverlayTank import SlugOverlayTank
1448
1466
  self._require_recirc_params()
1449
1467
  cold_temp_f = self._building.get_design_inlet_water_temp_f() or 50.0
1450
- return MultiPassRTPSystem(
1468
+ system = MultiPassRTPSystem(
1451
1469
  water_heaters=water_heaters,
1452
1470
  storage_tank=SlugOverlayTank(
1453
1471
  total_volume_gal=self.storage_volume_storageT_gal,
@@ -1465,6 +1483,9 @@ class EcosizerEngine:
1465
1483
  defrost_factor=self.defrost_factor,
1466
1484
  tm_safety_factor=self.tm_safety_factor,
1467
1485
  )
1486
+ system._minimum_capacity_kbtuh = self.heating_capacity_kbtuh
1487
+ system._minimum_storage_storageT_gal = self.storage_volume_storageT_gal
1488
+ return system
1468
1489
 
1469
1490
  if self.schematic == "instant_wh":
1470
1491
  from ecoengine.objects.dhwsystems.InstantWHSystem import InstantWHSystem
@@ -1633,6 +1654,8 @@ class EcosizerEngine:
1633
1654
  )
1634
1655
  system._minimum_capacity_kbtuh = self.heating_capacity_kbtuh
1635
1656
  system._minimum_storage_storageT_gal = self.storage_volume_storageT_gal
1657
+ system._minimum_tm_volume_gal = self.tm_storage_vol
1658
+ system._minimum_tm_capacity_kbtuh = self.tm_capacity_kbtuh
1636
1659
  system.tm_storage_tank = MixedStorageTank(total_volume_gal=self.tm_storage_vol)
1637
1660
  system.tm_water_heater = self._build_tm_water_heater(tm_controls, force_electric_resistance=True)
1638
1661
  return system
@@ -1805,6 +1828,7 @@ class EcosizerEngine:
1805
1828
  strat_slope: float = 2.8,
1806
1829
  return_as_div: bool = False,
1807
1830
  return_with_x_y_points: bool = False,
1831
+ highlight_x_value: float | None = None,
1808
1832
  ):
1809
1833
  """
1810
1834
  Return a Plotly figure of the sizing curve for the built system.
@@ -1849,6 +1873,15 @@ class EcosizerEngine:
1849
1873
  instead of just the figure/div, where ``x_values`` and ``y_values``
1850
1874
  are the plot coordinates and ``start_index`` is the recommended
1851
1875
  slider position. Default False.
1876
+ highlight_x_value : float, optional
1877
+ If provided, highlight the curve point whose x-value is closest
1878
+ to this value instead of the engine's own recommended point.
1879
+ Units match the returned ``x_values`` for the curve type being
1880
+ plotted (storage gallons for normal and dual-fuel curves,
1881
+ percent for load-shift curves). Useful for re-rendering a curve
1882
+ for a point the caller already chose (e.g. from an earlier,
1883
+ interactive rendering of the same curve). Default None (use the
1884
+ engine's recommended point).
1852
1885
 
1853
1886
  Returns
1854
1887
  -------
@@ -1883,9 +1916,15 @@ class EcosizerEngine:
1883
1916
  curve = self._dhw_system.get_sizing_curve(self._building, strat_slope=strat_slope)
1884
1917
  if curve is None:
1885
1918
  raise NotImplementedError(
1886
- f"Gas backup sizing curve is not yet implemented for schematic "
1919
+ f"Supplementary sizing curve is not yet implemented for schematic "
1887
1920
  f"{self.schematic!r} ({type(self._dhw_system).__name__})."
1888
1921
  )
1922
+ if highlight_x_value is not None:
1923
+ curve = dict(curve)
1924
+ curve["recommended_index"] = min(
1925
+ range(len(curve["storages_gal"])),
1926
+ key=lambda i: abs(curve["storages_gal"][i] - highlight_x_value),
1927
+ )
1889
1928
  x_vals = curve["storages_gal"]
1890
1929
  y_vals = curve["capacities_kbtuh"]
1891
1930
  start_index = curve["recommended_index"]
@@ -1900,12 +1939,24 @@ class EcosizerEngine:
1900
1939
  strat_slope = strat_slope,
1901
1940
  load_shift_percent = self.load_shift_percent,
1902
1941
  )
1942
+ if highlight_x_value is not None:
1943
+ curve = dict(curve)
1944
+ curve["recommended_index"] = min(
1945
+ range(len(curve["load_shift_percent"])),
1946
+ key=lambda i: abs(curve["load_shift_percent"][i] * 100.0 - highlight_x_value),
1947
+ )
1903
1948
  x_vals = [p * 100.0 for p in curve["load_shift_percent"]]
1904
1949
  y_vals = curve["storage_storageT_gal"]
1905
1950
  start_index = curve["recommended_index"]
1906
1951
  fig = self._dhw_system._build_sizing_curve_figure(curve, is_ls, title, filepath)
1907
1952
  else:
1908
1953
  curve = self._dhw_system.get_sizing_curve(self._building, strat_slope=strat_slope)
1954
+ if highlight_x_value is not None:
1955
+ curve = dict(curve)
1956
+ curve["recommended_index"] = min(
1957
+ range(len(curve["storage_storageT_gal"])),
1958
+ key=lambda i: abs(curve["storage_storageT_gal"][i] - highlight_x_value),
1959
+ )
1909
1960
  x_vals = curve["storage_storageT_gal"][::-1]
1910
1961
  y_vals = curve["capacity_kbtuh"][::-1]
1911
1962
  start_index = len(x_vals) - 1 - curve["recommended_index"]
@@ -251,14 +251,14 @@ class MP_RTPInSeriesSystem(MultiPassRTPSystem):
251
251
  """
252
252
  if not getattr(self, "outage_volume_gal", None):
253
253
  raise RuntimeError(
254
- "Gas backup outage data is not available. Call from_size() first."
254
+ "In Series outage data is not available. Call from_size() first."
255
255
  )
256
256
  return get_ashrae_sizing_curve(self.outage_volume_gal, self.outage_temp_delta_f)
257
257
 
258
258
  def plot_sizing_curve(
259
259
  self,
260
260
  building: Building,
261
- title: str = "Gas Backup Sizing Curve — MP RTP In-Series",
261
+ title: str = "In Series Sizing Curve — MP RTP In-Series",
262
262
  ) -> "plotly.graph_objects.Figure":
263
263
  """
264
264
  Return a Plotly sizing-curve figure for the gas backup system.
@@ -356,7 +356,7 @@ class SP_RTPInParallelSystem(SinglePassRTPSystem):
356
356
  def plot_sizing_curve(
357
357
  self,
358
358
  building: Building,
359
- title: str = "Gas Backup Sizing Curve — SP RTP In-Parallel",
359
+ title: str = "Parallel Heating Sizing Curve — SP RTP In-Parallel",
360
360
  ) -> "plotly.graph_objects.Figure":
361
361
  """
362
362
  TODO: revisit. See ``get_sizing_curve``.
@@ -254,14 +254,14 @@ class SP_RTPInSeriesSystem(SinglePassRTPSystem):
254
254
  """
255
255
  if not getattr(self, "outage_volume_gal", None):
256
256
  raise RuntimeError(
257
- "Gas backup outage data is not available. Call from_size() first."
257
+ "In series outage data is not available. Call from_size() first."
258
258
  )
259
259
  return get_ashrae_sizing_curve(self.outage_volume_gal, self.outage_temp_delta_f)
260
260
 
261
261
  def plot_sizing_curve(
262
262
  self,
263
263
  building: Building,
264
- title: str = "Gas Backup Sizing Curve — SP RTP In-Series",
264
+ title: str = "In Series Sizing Curve — SP RTP In-Series",
265
265
  ) -> "plotly.graph_objects.Figure":
266
266
  """
267
267
  Return a Plotly sizing-curve figure for the gas backup system.
@@ -324,7 +324,7 @@ def size_supplemental_heating_and_storage(
324
324
  best_outage_temp_delta_f = run_temp_delta_f
325
325
 
326
326
  building.avg_load_shape = _original_avg_load_shape
327
-
327
+
328
328
  total_outage_min = sum(1 for v in best_outage_volume_gal if v > 0.0)
329
329
  if total_outage_min <= _MIN_OUTAGE_MIN and best_max_delta <= _MIN_DEFICIT_F:
330
330
  raise ValueError(
@@ -459,7 +459,7 @@ def get_ashrae_sizing_curve(
459
459
 
460
460
  def plot_ashrae_sizing_curve(
461
461
  curve: dict,
462
- title: str = "Gas Backup Sizing Curve",
462
+ title: str = "Supplementary Sizing Curve",
463
463
  ) -> "plotly.graph_objects.Figure":
464
464
  """
465
465
  Build a Plotly sizing-curve figure from the dict returned by
@@ -500,8 +500,8 @@ def plot_ashrae_sizing_curve(
500
500
 
501
501
  hover = (
502
502
  "Window: <b>%{customdata} min</b><br>"
503
- "Gas storage: <b>%{x:.1f} gal</b><br>"
504
- "Gas capacity: <b>%{y:.1f} kBTU/hr</b>"
503
+ "Supplementary storage: <b>%{x:.1f} gal</b><br>"
504
+ "Supplementary capacity: <b>%{y:.1f} kBTU/hr</b>"
505
505
  "<extra></extra>"
506
506
  )
507
507
 
@@ -540,10 +540,14 @@ def plot_ashrae_sizing_curve(
540
540
  args=[{"visible": visibility}],
541
541
  ))
542
542
 
543
+ axis_label_type="Supplementary"
544
+ if "Swing Tank" in title:
545
+ axis_label_type="Swing Tank"
546
+
543
547
  fig.update_layout(
544
548
  title=title,
545
- xaxis_title="Gas Storage Volume (gal)",
546
- yaxis_title="Gas Heating Capacity (kBTU/hr)",
549
+ xaxis_title=f"{axis_label_type} Storage Volume (gal)",
550
+ yaxis_title=f"{axis_label_type} Heating Capacity (kBTU/hr)",
547
551
  showlegend=False,
548
552
  sliders=[dict(
549
553
  steps=steps,
@@ -478,7 +478,7 @@ class SimulationRun:
478
478
  ]
479
479
  fig.add_trace(
480
480
  go.Scatter(x=gas_time, y=gas_gph,
481
- name="Gas Heater Generation (gal/hr at Supply Temperature)",
481
+ name="Suppl. Heater Generation (gal/hr at Supply Temperature)",
482
482
  line=dict(color="darkorange", width=1)),
483
483
  secondary_y=False,
484
484
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ecoengine
3
- Version: 3.1.0
3
+ Version: 3.1.2
4
4
  Requires-Python: >=3.11
5
5
  Requires-Dist: numpy
6
6
  Requires-Dist: scipy
File without changes
File without changes