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.
- {ecoengine-3.1.0 → ecoengine-3.1.2}/PKG-INFO +1 -1
- {ecoengine-3.1.0 → ecoengine-3.1.2}/pyproject.toml +1 -1
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/interfaces/EcosizerEngine.py +56 -5
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/MP_RTPInSeriesSystem.py +2 -2
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/SP_RTPInParallelSystem.py +1 -1
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/SP_RTPInSeriesSystem.py +2 -2
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/utils.py +10 -6
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/simulation/SimulationRun.py +1 -1
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine.egg-info/PKG-INFO +1 -1
- {ecoengine-3.1.0 → ecoengine-3.1.2}/README.md +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/setup.cfg +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/constants/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/constants/constants.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/DryBulbTemperatures_ByClimateZone.csv +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/InletWaterTemperatures_ByClimateZone.csv +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/WeatherStation_ClimateZone_Lookup.csv +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/ZipCode_ClimateZone_Lookup.csv +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/kGperkWh_ByClimateZone.csv +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/apartment.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/elementary_school.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/food_service_a.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/food_service_b.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/junior_high.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/mens_dorm.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/motel.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/multi_family.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/nursing_home.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/office_building.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/senior_high.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/load_shapes/womens_dorm.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/maps.json +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH3_SP_bounds.pkl +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH3_SP_capacity_interpolator.pkl +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH3_SP_power_in_interpolator.pkl +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH4_MP_bounds.pkl +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH4_MP_capacity_interpolator.pkl +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/GenericHPWH4_MP_power_in_interpolator.pkl +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/preformanceMaps/pkls/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/interfaces/Simulator.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/interfaces/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/building/Building.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/building/ClimateZone.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/building/UtilityCostTracker.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/building/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/Controls.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/PerformanceMap.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/WaterHeater.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/EnergyTank.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/MixedStorageTank.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/SlugOverlayTank.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/StorageTank.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/StratifiedTank.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/DHWSystem.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/InstantWHSystem.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/MPNoRecircSystem.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/ParallelLoopSystem.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/RecircSystem.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/SwingDualFuelSystem.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/SwingERTrdOffSystem.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/SwingSystem.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/MultiPassRTPSystem.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/RTPSystem.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/SinglePassRTPSystem.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/simulation/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/__init__.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_buildings.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_dhw_system.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_ecosizer_engine_dual_fuel.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_mixing_valve.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_performance_map.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_sp_rtp_in_series.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_sprtp_simulation.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_storage_tanks.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/tests/test_utility_cost_tracker.py +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine.egg-info/SOURCES.txt +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine.egg-info/dependency_links.txt +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine.egg-info/requires.txt +0 -0
- {ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine.egg-info/top_level.txt +0 -0
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"
|
|
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
|
-
"
|
|
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 = "
|
|
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 = "
|
|
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
|
-
"
|
|
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 = "
|
|
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 = "
|
|
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
|
-
"
|
|
504
|
-
"
|
|
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="
|
|
546
|
-
yaxis_title="
|
|
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="
|
|
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
|
)
|
|
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
|
{ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/ZipCode_ClimateZone_Lookup.csv
RENAMED
|
File without changes
|
|
File without changes
|
{ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/data/climate_data/kGperkWh_ByClimateZone.csv
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/heating/PerformanceMap.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/MixedStorageTank.py
RENAMED
|
File without changes
|
{ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/SlugOverlayTank.py
RENAMED
|
File without changes
|
|
File without changes
|
{ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/components/storage/StratifiedTank.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/RecircSystem.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/SwingSystem.py
RENAMED
|
File without changes
|
{ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/recirc_systems/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/RTPSystem.py
RENAMED
|
File without changes
|
|
File without changes
|
{ecoengine-3.1.0 → ecoengine-3.1.2}/src/ecoengine/objects/dhwsystems/rtp_systems/__init__.py
RENAMED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|