Skip to content

Commit 3a1e75d

Browse files
committed
Ensure we calculate net capacity even when blower fan heat is provided. Update tests/docs.
1 parent 58f6db9 commit 3a1e75d

File tree

4 files changed

+35
-16
lines changed

4 files changed

+35
-16
lines changed

HPXMLtoOpenStudio/measure.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<schema_version>3.1</schema_version>
44
<name>hpxm_lto_openstudio</name>
55
<uid>b1543b30-9465-45ff-ba04-1d1f85e763bc</uid>
6-
<version_id>5081c516-4862-41dd-9c9b-a53be19985ea</version_id>
7-
<version_modified>2024-06-17T19:50:27Z</version_modified>
6+
<version_id>e3cf35e9-a352-4b87-9862-1b4c43330a84</version_id>
7+
<version_modified>2024-06-17T22:16:28Z</version_modified>
88
<xml_checksum>D8922A73</xml_checksum>
99
<class_name>HPXMLtoOpenStudio</class_name>
1010
<display_name>HPXML to OpenStudio Translator</display_name>
@@ -387,7 +387,7 @@
387387
<filename>hvac_sizing.rb</filename>
388388
<filetype>rb</filetype>
389389
<usage_type>resource</usage_type>
390-
<checksum>8A45B2BB</checksum>
390+
<checksum>C4D7EF6D</checksum>
391391
</file>
392392
<file>
393393
<filename>lighting.rb</filename>
@@ -669,7 +669,7 @@
669669
<filename>test_hvac_sizing.rb</filename>
670670
<filetype>rb</filetype>
671671
<usage_type>test</usage_type>
672-
<checksum>75B3319A</checksum>
672+
<checksum>36E97140</checksum>
673673
</file>
674674
<file>
675675
<filename>test_lighting.rb</filename>

HPXMLtoOpenStudio/resources/hvac_sizing.rb

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ def self.calculate(runner, weather, hpxml_bldg, hvac_systems, update_hpxml: true
7979
apply_hvac_equipment_adjustments(mj, runner, hvac_sizings, weather, hvac_heating, hvac_cooling, hvac_system, hpxml_bldg)
8080
apply_hvac_installation_quality(mj, hvac_sizings, hvac_heating, hvac_cooling, frac_zone_heat_load_served, frac_zone_cool_load_served, hpxml_bldg)
8181
apply_hvac_autosizing_factors_and_limits(hvac_sizings, hvac_heating, hvac_cooling)
82-
apply_hvac_fixed_capacities(hvac_sizings, hvac_heating, hvac_cooling, hpxml_bldg)
82+
apply_hvac_final_capacities(hvac_sizings, hvac_heating, hvac_cooling, hpxml_bldg)
83+
apply_hvac_final_airflows(hvac_sizings, hvac_heating, hvac_cooling)
8384
apply_hvac_ground_loop(mj, runner, hvac_sizings, weather, hvac_cooling)
84-
apply_hvac_finalize_airflows(hvac_sizings, hvac_heating, hvac_cooling)
8585
@all_hvac_sizings[hvac_system] = hvac_sizings
8686

8787
if update_hpxml
@@ -1605,9 +1605,11 @@ def self.get_hvac_size_limits(hvac_cooling)
16051605
# @param hvac_loads [TODO] TODO
16061606
# @return [TODO] TODO
16071607
def self.apply_hvac_loads_to_hvac_sizings(hvac_sizings, hvac_loads)
1608-
hvac_sizings.Cool_Load_Sens = hvac_loads.Cool_Sens
1608+
# Note: We subtract the blower heat below because we want to calculate a net capacity,
1609+
# not a gross capacity.
1610+
hvac_sizings.Cool_Load_Sens = hvac_loads.Cool_Sens - hvac_loads.Cool_BlowerHeat
16091611
hvac_sizings.Cool_Load_Lat = hvac_loads.Cool_Lat
1610-
hvac_sizings.Cool_Load_Tot = hvac_loads.Cool_Tot
1612+
hvac_sizings.Cool_Load_Tot = hvac_loads.Cool_Tot - hvac_loads.Cool_BlowerHeat
16111613
hvac_sizings.Heat_Load = hvac_loads.Heat_Tot
16121614
hvac_sizings.Heat_Load_Supp = hvac_loads.Heat_Tot
16131615
end
@@ -2606,15 +2608,15 @@ def self.apply_hvac_autosizing_factors_and_limits(hvac_sizings, hvac_heating, hv
26062608
end
26072609
end
26082610

2609-
# Fixed Sizing Equipment
2611+
# Finalize Capacity Calculations
26102612
#
26112613
# @param hvac_sizings [TODO] TODO
26122614
# @param hvac_heating [TODO] TODO
26132615
# @param hvac_cooling [TODO] TODO
26142616
# @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit
26152617
# @return [TODO] TODO
2616-
def self.apply_hvac_fixed_capacities(hvac_sizings, hvac_heating, hvac_cooling, hpxml_bldg)
2617-
# Override HVAC capacities if values are provided
2618+
def self.apply_hvac_final_capacities(hvac_sizings, hvac_heating, hvac_cooling, hpxml_bldg)
2619+
# Cooling
26182620
if not hvac_cooling.nil?
26192621
fixed_cooling_capacity = hvac_cooling.cooling_capacity
26202622
end
@@ -2627,6 +2629,8 @@ def self.apply_hvac_fixed_capacities(hvac_sizings, hvac_heating, hvac_cooling, h
26272629
hvac_sizings.Cool_Capacity_Sens *= fixed_cooling_capacity / autosized_cooling_capacity
26282630
end
26292631
end
2632+
2633+
# Heating
26302634
if not hvac_heating.nil?
26312635
fixed_heating_capacity = hvac_heating.heating_capacity
26322636
elsif (not hvac_cooling.nil?) && hvac_cooling.has_integrated_heating
@@ -2640,6 +2644,8 @@ def self.apply_hvac_fixed_capacities(hvac_sizings, hvac_heating, hvac_cooling, h
26402644
hvac_sizings.Heat_Airflow *= fixed_heating_capacity / autosized_heating_capacity
26412645
end
26422646
end
2647+
2648+
# Heat pump backup heating
26432649
if hvac_heating.is_a? HPXML::HeatPump
26442650
if not hvac_heating.backup_heating_capacity.nil?
26452651
fixed_supp_heating_capacity = hvac_heating.backup_heating_capacity
@@ -2808,13 +2814,13 @@ def self.get_valid_num_bores(g_functions_json)
28082814
return valid_num_bores
28092815
end
28102816

2811-
# Finalize Sizing Calculations
2817+
# Finalize Airflow Calculations
28122818
#
28132819
# @param hvac_sizings [TODO] TODO
28142820
# @param hvac_heating [TODO] TODO
28152821
# @param hvac_cooling [TODO] TODO
28162822
# @return [TODO] TODO
2817-
def self.apply_hvac_finalize_airflows(hvac_sizings, hvac_heating, hvac_cooling)
2823+
def self.apply_hvac_final_airflows(hvac_sizings, hvac_heating, hvac_cooling)
28182824
if (not hvac_heating.nil?) && hvac_heating.respond_to?(:airflow_defect_ratio)
28192825
if hvac_sizings.Heat_Airflow > 0
28202826
hvac_sizings.Heat_Airflow *= (1.0 + hvac_heating.airflow_defect_ratio.to_f)

HPXMLtoOpenStudio/tests/test_hvac_sizing.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1177,11 +1177,20 @@ def test_manual_j_detailed_sizing_inputs
11771177

11781178
# Test blower fan heat input
11791179
args_hash['hpxml_path'] = File.absolute_path(@tmp_hpxml_path)
1180-
hpxml, hpxml_bldg = _create_hpxml('base.xml')
1180+
hpxml, hpxml_bldg = _create_hpxml('base-hvac-autosize.xml')
11811181
hpxml_bldg.hvac_distributions[0].manualj_blower_fan_heat_btuh = 1234.0
11821182
XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
11831183
_model, _test_hpxml, test_hpxml_bldg = _test_measure(args_hash)
11841184
assert_equal(1234.0, test_hpxml_bldg.hvac_plant.cdl_sens_blowerheat)
1185+
orig_cooling_capacity = test_hpxml_bldg.cooling_systems[0].cooling_capacity
1186+
1187+
# Test blower fan heat input 2
1188+
# Check the autosized equipment capacity (net) doesn't change
1189+
hpxml_bldg.hvac_distributions[0].manualj_blower_fan_heat_btuh = 0.0
1190+
XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
1191+
_model, _test_hpxml, test_hpxml_bldg = _test_measure(args_hash)
1192+
assert_equal(0.0, test_hpxml_bldg.hvac_plant.cdl_sens_blowerheat)
1193+
assert_equal(orig_cooling_capacity, test_hpxml_bldg.cooling_systems[0].cooling_capacity)
11851194

11861195
# Test boiler hot water piping input
11871196
args_hash['hpxml_path'] = File.absolute_path(@tmp_hpxml_path)

docs/source/workflow_inputs.rst

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3097,7 +3097,7 @@ Each air distribution system is entered as a ``/HPXML/Building/BuildingDetails/S
30973097
``DistributionSystemType/AirDistribution/DuctLeakageMeasurement[DuctType="return"]`` element See [#]_ Return duct leakage value
30983098
``DistributionSystemType/AirDistribution/Ducts`` element No Supply/return ducts; multiple are allowed [#]_
30993099
``DistributionSystemType/AirDistribution/NumberofReturnRegisters`` integer >= 0 No See [#]_ Number of return registers
3100-
``DistributionSystemType/AirDistribution/extension/ManualJInputs/BlowerFanHeatBtuh`` double Btu/hr >= 0 No 0 Blower fan heat for ACCA Manual J design loads
3100+
``DistributionSystemType/AirDistribution/extension/ManualJInputs/BlowerFanHeatBtuh`` double Btu/hr >= 0 No 0 Blower fan heat for ACCA Manual J design loads [#]_
31013101
``ConditionedFloorAreaServed`` double ft2 > 0 See [#]_ Conditioned floor area served
31023102
==================================================================================== ======= ======= =========== ======== ========= ==========================
31033103

@@ -3106,6 +3106,8 @@ Each air distribution system is entered as a ``/HPXML/Building/BuildingDetails/S
31063106
.. [#] Return duct leakage required if AirDistributionType is "regular velocity" or "gravity" and optional if AirDistributionType is "fan coil".
31073107
.. [#] Provide a Ducts element for each supply duct and each return duct.
31083108
.. [#] If NumberofReturnRegisters not provided and return ducts are present, defaults to one return register per conditioned floor per `ASHRAE Standard 152 <https://www.energy.gov/eere/buildings/downloads/ashrae-standard-152-spreadsheet>`_, rounded up to the nearest integer if needed.
3109+
.. [#] BlowerFanHeatBtuh should only be provided when calculating design loads for HVAC equipment whose performance data has not been adjusted for blower heat.
3110+
When provided, it can be calculated according to Manual J Section 25 or the default of 1707 Btu/hr (500 W) can be used.
31093111
.. [#] ConditionedFloorAreaServed required only when duct surface area is defaulted (i.e., ``AirDistribution/Ducts`` are present without ``DuctSurfaceArea`` child elements).
31103112
31113113
Additional information is entered in each ``DuctLeakageMeasurement``.
@@ -3186,10 +3188,12 @@ Each hydronic distribution system is entered as a ``/HPXML/Building/BuildingDeta
31863188
``SystemIdentifier`` id Yes Unique identifier
31873189
``DistributionSystemType/HydronicDistribution`` element Yes Type of distribution system
31883190
``DistributionSystemType/HydronicDistribution/HydronicDistributionType`` string See [#]_ Yes Type of hydronic distribution system
3189-
``DistributionSystemType/HydronicDistribution/extension/ManualJInputs/HotWaterPipingBtuh`` double Btu/hr >= 0 No 0 Piping load for ACCA Manual J design loads
3191+
``DistributionSystemType/HydronicDistribution/extension/ManualJInputs/HotWaterPipingBtuh`` double Btu/hr >= 0 No 0 Piping load for ACCA Manual J design loads [#]_
31903192
========================================================================================== ======= ======= =========== ======== ========= ====================================
31913193

31923194
.. [#] HydronicDistributionType choices are "radiator", "baseboard", "radiant floor", "radiant ceiling", or "water loop".
3195+
.. [#] HotWaterPipingBtuh should only be provided when hydronic distribution pipes run through unconditioned spaces.
3196+
When provided, it can be calculated according to Manual J Section 26.
31933197
31943198
.. _hvac_distribution_dse:
31953199

0 commit comments

Comments
 (0)