ecoengine 3.1.1__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.1 → ecoengine-3.1.2}/PKG-INFO +1 -1
  2. {ecoengine-3.1.1 → ecoengine-3.1.2}/pyproject.toml +1 -1
  3. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/interfaces/EcosizerEngine.py +53 -5
  4. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/MP_RTPInSeriesSystem.py +2 -2
  5. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/SP_RTPInParallelSystem.py +1 -1
  6. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/SP_RTPInSeriesSystem.py +2 -2
  7. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/utils.py +10 -6
  8. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/simulation/SimulationRun.py +1 -1
  9. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine.egg-info/PKG-INFO +1 -1
  10. {ecoengine-3.1.1 → ecoengine-3.1.2}/README.md +0 -0
  11. {ecoengine-3.1.1 → ecoengine-3.1.2}/setup.cfg +0 -0
  12. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/__init__.py +0 -0
  13. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/constants/__init__.py +0 -0
  14. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/constants/constants.py +0 -0
  15. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/__init__.py +0 -0
  16. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/DryBulbTemperatures_ByClimateZone.csv +0 -0
  17. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/InletWaterTemperatures_ByClimateZone.csv +0 -0
  18. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/WeatherStation_ClimateZone_Lookup.csv +0 -0
  19. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/ZipCode_ClimateZone_Lookup.csv +0 -0
  20. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/__init__.py +0 -0
  21. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/kGperkWh_ByClimateZone.csv +0 -0
  22. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/__init__.py +0 -0
  23. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/apartment.json +0 -0
  24. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/elementary_school.json +0 -0
  25. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/food_service_a.json +0 -0
  26. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/food_service_b.json +0 -0
  27. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/junior_high.json +0 -0
  28. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/mens_dorm.json +0 -0
  29. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/motel.json +0 -0
  30. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/multi_family.json +0 -0
  31. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/nursing_home.json +0 -0
  32. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/office_building.json +0 -0
  33. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/senior_high.json +0 -0
  34. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/womens_dorm.json +0 -0
  35. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/__init__.py +0 -0
  36. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/maps.json +0 -0
  37. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH3_SP_bounds.pkl +0 -0
  38. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH3_SP_capacity_interpolator.pkl +0 -0
  39. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH3_SP_power_in_interpolator.pkl +0 -0
  40. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH4_MP_bounds.pkl +0 -0
  41. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH4_MP_capacity_interpolator.pkl +0 -0
  42. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH4_MP_power_in_interpolator.pkl +0 -0
  43. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/__init__.py +0 -0
  44. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/interfaces/Simulator.py +0 -0
  45. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/interfaces/__init__.py +0 -0
  46. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/__init__.py +0 -0
  47. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/building/Building.py +0 -0
  48. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/building/ClimateZone.py +0 -0
  49. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/building/UtilityCostTracker.py +0 -0
  50. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/building/__init__.py +0 -0
  51. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/components/__init__.py +0 -0
  52. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/Controls.py +0 -0
  53. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/PerformanceMap.py +0 -0
  54. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/WaterHeater.py +0 -0
  55. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/__init__.py +0 -0
  56. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/EnergyTank.py +0 -0
  57. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/MixedStorageTank.py +0 -0
  58. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/SlugOverlayTank.py +0 -0
  59. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/StorageTank.py +0 -0
  60. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/StratifiedTank.py +0 -0
  61. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/__init__.py +0 -0
  62. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/DHWSystem.py +0 -0
  63. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/InstantWHSystem.py +0 -0
  64. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/MPNoRecircSystem.py +0 -0
  65. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/__init__.py +0 -0
  66. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/ParallelLoopSystem.py +0 -0
  67. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/RecircSystem.py +0 -0
  68. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/SwingDualFuelSystem.py +0 -0
  69. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/SwingERTrdOffSystem.py +0 -0
  70. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/SwingSystem.py +0 -0
  71. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/__init__.py +0 -0
  72. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/MultiPassRTPSystem.py +0 -0
  73. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/RTPSystem.py +0 -0
  74. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/SinglePassRTPSystem.py +0 -0
  75. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/__init__.py +0 -0
  76. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/objects/simulation/__init__.py +0 -0
  77. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/tests/__init__.py +0 -0
  78. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/tests/test_buildings.py +0 -0
  79. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/tests/test_dhw_system.py +0 -0
  80. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/tests/test_ecosizer_engine_dual_fuel.py +0 -0
  81. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/tests/test_mixing_valve.py +0 -0
  82. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/tests/test_performance_map.py +0 -0
  83. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/tests/test_sp_rtp_in_series.py +0 -0
  84. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/tests/test_sprtp_simulation.py +0 -0
  85. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/tests/test_storage_tanks.py +0 -0
  86. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine/tests/test_utility_cost_tracker.py +0 -0
  87. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine.egg-info/SOURCES.txt +0 -0
  88. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine.egg-info/dependency_links.txt +0 -0
  89. {ecoengine-3.1.1 → ecoengine-3.1.2}/src/ecoengine.egg-info/requires.txt +0 -0
  90. {ecoengine-3.1.1 → 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.1
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.1"
7
+ version = "3.1.2"
8
8
  requires-python = ">=3.11"
9
9
  dependencies = ["numpy", "scipy", "plotly>=4.12.0"]
10
10
 
@@ -1351,7 +1351,7 @@ class EcosizerEngine:
1351
1351
 
1352
1352
  if self.schematic in ["primary_no_recirc", "singlepass_norecirc"]:
1353
1353
  from ecoengine.objects.dhwsystems.DHWSystem import DHWSystem
1354
- return DHWSystem(
1354
+ system = DHWSystem(
1355
1355
  water_heaters=water_heaters,
1356
1356
  storage_tank=_primary_tank(),
1357
1357
  supply_temp_f=self.supply_temp_f,
@@ -1359,6 +1359,9 @@ class EcosizerEngine:
1359
1359
  max_daily_run_hr=self.max_daily_run_hr,
1360
1360
  defrost_factor=self.defrost_factor,
1361
1361
  )
1362
+ system._minimum_capacity_kbtuh = self.heating_capacity_kbtuh
1363
+ system._minimum_storage_storageT_gal = self.storage_volume_storageT_gal
1364
+ return system
1362
1365
 
1363
1366
  if self.schematic in ["parallel_loop", "paralleltank"]:
1364
1367
  from ecoengine.objects.dhwsystems.recirc_systems.ParallelLoopSystem import ParallelLoopSystem
@@ -1373,7 +1376,7 @@ class EcosizerEngine:
1373
1376
  off_trigger_t_f=self.tm_off_temp_f,
1374
1377
  outlet_temp_f=self.tm_off_temp_f,
1375
1378
  )
1376
- return ParallelLoopSystem(
1379
+ system = ParallelLoopSystem(
1377
1380
  water_heaters=water_heaters,
1378
1381
  storage_tank=_primary_tank(),
1379
1382
  supply_temp_f=self.supply_temp_f,
@@ -1390,6 +1393,11 @@ class EcosizerEngine:
1390
1393
  max_daily_run_hr=self.max_daily_run_hr,
1391
1394
  defrost_factor=self.defrost_factor,
1392
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
1393
1401
 
1394
1402
  if self.schematic in ["swing_tank", "swingtank"]:
1395
1403
  from ecoengine.objects.dhwsystems.recirc_systems.SwingSystem import SwingSystem, _ELEMENT_DEADBAND_F
@@ -1415,6 +1423,10 @@ class EcosizerEngine:
1415
1423
  max_daily_run_hr=self.max_daily_run_hr,
1416
1424
  defrost_factor=self.defrost_factor,
1417
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
1418
1430
  system.tm_storage_tank = MixedStorageTank(total_volume_gal=self.tm_storage_vol)
1419
1431
  system.tm_water_heater = self._build_tm_water_heater(tm_controls, force_electric_resistance = True)
1420
1432
  return system
@@ -1426,7 +1438,7 @@ class EcosizerEngine:
1426
1438
  from ecoengine.objects.components.storage.EnergyTank import EnergyTank
1427
1439
  self._require_recirc_params()
1428
1440
  cold_temp_f = self._building.get_design_inlet_water_temp_f() or 50.0
1429
- return SinglePassRTPSystem(
1441
+ system = SinglePassRTPSystem(
1430
1442
  water_heaters=water_heaters,
1431
1443
  storage_tank=EnergyTank(
1432
1444
  total_volume_gal=self.storage_volume_storageT_gal,
@@ -1442,6 +1454,9 @@ class EcosizerEngine:
1442
1454
  defrost_factor=self.defrost_factor,
1443
1455
  tm_safety_factor=self.tm_safety_factor,
1444
1456
  )
1457
+ system._minimum_capacity_kbtuh = self.heating_capacity_kbtuh
1458
+ system._minimum_storage_storageT_gal = self.storage_volume_storageT_gal
1459
+ return system
1445
1460
 
1446
1461
  if self.schematic in ["multi_pass_rtp", "mprtp"]:
1447
1462
  from ecoengine.objects.dhwsystems.rtp_systems.MultiPassRTPSystem import (
@@ -1450,7 +1465,7 @@ class EcosizerEngine:
1450
1465
  from ecoengine.objects.components.storage.SlugOverlayTank import SlugOverlayTank
1451
1466
  self._require_recirc_params()
1452
1467
  cold_temp_f = self._building.get_design_inlet_water_temp_f() or 50.0
1453
- return MultiPassRTPSystem(
1468
+ system = MultiPassRTPSystem(
1454
1469
  water_heaters=water_heaters,
1455
1470
  storage_tank=SlugOverlayTank(
1456
1471
  total_volume_gal=self.storage_volume_storageT_gal,
@@ -1468,6 +1483,9 @@ class EcosizerEngine:
1468
1483
  defrost_factor=self.defrost_factor,
1469
1484
  tm_safety_factor=self.tm_safety_factor,
1470
1485
  )
1486
+ system._minimum_capacity_kbtuh = self.heating_capacity_kbtuh
1487
+ system._minimum_storage_storageT_gal = self.storage_volume_storageT_gal
1488
+ return system
1471
1489
 
1472
1490
  if self.schematic == "instant_wh":
1473
1491
  from ecoengine.objects.dhwsystems.InstantWHSystem import InstantWHSystem
@@ -1636,6 +1654,8 @@ class EcosizerEngine:
1636
1654
  )
1637
1655
  system._minimum_capacity_kbtuh = self.heating_capacity_kbtuh
1638
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
1639
1659
  system.tm_storage_tank = MixedStorageTank(total_volume_gal=self.tm_storage_vol)
1640
1660
  system.tm_water_heater = self._build_tm_water_heater(tm_controls, force_electric_resistance=True)
1641
1661
  return system
@@ -1808,6 +1828,7 @@ class EcosizerEngine:
1808
1828
  strat_slope: float = 2.8,
1809
1829
  return_as_div: bool = False,
1810
1830
  return_with_x_y_points: bool = False,
1831
+ highlight_x_value: float | None = None,
1811
1832
  ):
1812
1833
  """
1813
1834
  Return a Plotly figure of the sizing curve for the built system.
@@ -1852,6 +1873,15 @@ class EcosizerEngine:
1852
1873
  instead of just the figure/div, where ``x_values`` and ``y_values``
1853
1874
  are the plot coordinates and ``start_index`` is the recommended
1854
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).
1855
1885
 
1856
1886
  Returns
1857
1887
  -------
@@ -1886,9 +1916,15 @@ class EcosizerEngine:
1886
1916
  curve = self._dhw_system.get_sizing_curve(self._building, strat_slope=strat_slope)
1887
1917
  if curve is None:
1888
1918
  raise NotImplementedError(
1889
- f"Gas backup sizing curve is not yet implemented for schematic "
1919
+ f"Supplementary sizing curve is not yet implemented for schematic "
1890
1920
  f"{self.schematic!r} ({type(self._dhw_system).__name__})."
1891
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
+ )
1892
1928
  x_vals = curve["storages_gal"]
1893
1929
  y_vals = curve["capacities_kbtuh"]
1894
1930
  start_index = curve["recommended_index"]
@@ -1903,12 +1939,24 @@ class EcosizerEngine:
1903
1939
  strat_slope = strat_slope,
1904
1940
  load_shift_percent = self.load_shift_percent,
1905
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
+ )
1906
1948
  x_vals = [p * 100.0 for p in curve["load_shift_percent"]]
1907
1949
  y_vals = curve["storage_storageT_gal"]
1908
1950
  start_index = curve["recommended_index"]
1909
1951
  fig = self._dhw_system._build_sizing_curve_figure(curve, is_ls, title, filepath)
1910
1952
  else:
1911
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
+ )
1912
1960
  x_vals = curve["storage_storageT_gal"][::-1]
1913
1961
  y_vals = curve["capacity_kbtuh"][::-1]
1914
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.1
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