From 6afa3f3f20d8e699df79c28bbbeebbf226bde36f Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Fri, 12 Apr 2024 14:58:31 -0600 Subject: [PATCH] Updates to Pub 002-2024. Uses duct effective R-values instead of nominal R-values for DSE tests. --- tasks.rb | 40 +++++++++++++------ .../tests/RESNET_Tests/4.5_DSE/HVAC3a.xml | 4 +- .../tests/RESNET_Tests/4.5_DSE/HVAC3b.xml | 4 +- .../tests/RESNET_Tests/4.5_DSE/HVAC3c.xml | 4 +- .../tests/RESNET_Tests/4.5_DSE/HVAC3d.xml | 4 +- .../tests/RESNET_Tests/4.5_DSE/HVAC3e.xml | 4 +- .../tests/RESNET_Tests/4.5_DSE/HVAC3f.xml | 4 +- .../tests/RESNET_Tests/4.5_DSE/HVAC3g.xml | 4 +- .../tests/RESNET_Tests/4.5_DSE/HVAC3h.xml | 4 +- workflow/tests/util.rb | 30 ++++++-------- 10 files changed, 56 insertions(+), 46 deletions(-) diff --git a/tasks.rb b/tasks.rb index c27a065d8..49acd7f14 100644 --- a/tasks.rb +++ b/tasks.rb @@ -565,8 +565,8 @@ def set_hpxml_roofs(hpxml_file, hpxml_bldg) def set_hpxml_rim_joists(hpxml_file, hpxml_bldg) if ['RESNET_Tests/4.5_DSE/HVAC3a.xml'].include? hpxml_file - for i in 0..hpxml_bldg.rim_joists.size - 1 - hpxml_bldg.rim_joists[i].interior_adjacent_to = HPXML::LocationBasementUnconditioned + hpxml_bldg.rim_joists.each do |rim_joist| + rim_joist.interior_adjacent_to = HPXML::LocationBasementUnconditioned end elsif hpxml_file.include?('EPA_Tests/SF') if ['EPA_Tests/SF_National_3.1/SFNHv31_CZ2_FL_elec_slab.xml', @@ -822,8 +822,8 @@ def set_hpxml_foundation_walls(hpxml_file, hpxml_bldg) end end elsif ['RESNET_Tests/4.5_DSE/HVAC3a.xml'].include? hpxml_file - for i in 0..hpxml_bldg.foundation_walls.size - 1 - hpxml_bldg.foundation_walls[i].interior_adjacent_to = HPXML::LocationBasementUnconditioned + hpxml_bldg.foundation_walls.each do |foundation_wall| + foundation_wall.interior_adjacent_to = HPXML::LocationBasementUnconditioned end elsif hpxml_file.include?('EPA_Tests') if hpxml_file.include?('EPA_Tests/SF') @@ -1677,8 +1677,8 @@ def set_hpxml_hvac_distributions(hpxml_file, hpxml_bldg) elsif ['RESNET_Tests/4.5_DSE/HVAC3d.xml', 'RESNET_Tests/4.5_DSE/HVAC3h.xml'].include? hpxml_file # Supply and return duct leakage = 125 cfm each - for i in 0..hpxml_bldg.hvac_distributions[0].duct_leakage_measurements.size - 1 - hpxml_bldg.hvac_distributions[0].duct_leakage_measurements[i].duct_leakage_value = 125 + hpxml_bldg.hvac_distributions[0].duct_leakage_measurements.each do |duct_leakage_measurement| + duct_leakage_measurement.duct_leakage_value = 125 end elsif hpxml_file.include?('EPA_Tests') tot_cfm25 = 4.0 * hpxml_bldg.building_construction.conditioned_floor_area / 100.0 @@ -1718,19 +1718,19 @@ def set_hpxml_hvac_distributions(hpxml_file, hpxml_bldg) duct_surface_area: 77) elsif ['RESNET_Tests/4.5_DSE/HVAC3b.xml'].include? hpxml_file # Change to Duct Location = 100% in basement - for i in 0..hpxml_bldg.hvac_distributions[0].ducts.size - 1 - hpxml_bldg.hvac_distributions[0].ducts[i].duct_location = HPXML::LocationBasementUnconditioned + hpxml_bldg.hvac_distributions[0].ducts.each do |duct| + duct.duct_location = HPXML::LocationBasementUnconditioned end elsif ['RESNET_Tests/4.5_DSE/HVAC3f.xml'].include? hpxml_file # Change to Duct Location = 100% in attic - for i in 0..hpxml_bldg.hvac_distributions[0].ducts.size - 1 - hpxml_bldg.hvac_distributions[0].ducts[i].duct_location = HPXML::LocationAtticVented + hpxml_bldg.hvac_distributions[0].ducts.each do |duct| + duct.duct_location = HPXML::LocationAtticVented end elsif ['RESNET_Tests/4.5_DSE/HVAC3c.xml', 'RESNET_Tests/4.5_DSE/HVAC3g.xml'].include? hpxml_file # Change to Duct R-val = 6 - for i in 0..hpxml_bldg.hvac_distributions[0].ducts.size - 1 - hpxml_bldg.hvac_distributions[0].ducts[i].duct_insulation_r_value = 6 + hpxml_bldg.hvac_distributions[0].ducts.each do |duct| + duct.duct_insulation_r_value = 6 end elsif hpxml_file.include?('EPA_Tests') supply_area = 0.27 * hpxml_bldg.building_construction.conditioned_floor_area @@ -1796,6 +1796,22 @@ def set_hpxml_hvac_distributions(hpxml_file, hpxml_bldg) duct_surface_area: (return_area * non_attic_frac).round(2)) end end + # For DSE tests, use effective R-values instead of nominal R-values to match the test specs. + if hpxml_file.include? '4.5_DSE' + hpxml_bldg.hvac_distributions[0].ducts.each do |duct| + next if duct.duct_insulation_r_value.nil? + + if duct.duct_insulation_r_value == 0 + duct.duct_insulation_r_value = nil + duct.duct_effective_r_value = 1.5 + elsif duct.duct_insulation_r_value == 6 + duct.duct_insulation_r_value = nil + duct.duct_effective_r_value = 7 + else + fail 'Unexpected error.' + end + end + end # CFA served if hpxml_bldg.hvac_distributions.size == 1 diff --git a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3a.xml b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3a.xml index 8bda37a70..459b61251 100644 --- a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3a.xml +++ b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3a.xml @@ -592,14 +592,14 @@ supply - 0.0 + 1.5 conditioned space 308.0 return - 0.0 + 1.5 conditioned space 77.0 diff --git a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3b.xml b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3b.xml index c020c4502..a58dc4ec7 100644 --- a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3b.xml +++ b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3b.xml @@ -592,14 +592,14 @@ supply - 0.0 + 1.5 basement - unconditioned 308.0 return - 0.0 + 1.5 basement - unconditioned 77.0 diff --git a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3c.xml b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3c.xml index a9a23e3bc..b2727b3ef 100644 --- a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3c.xml +++ b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3c.xml @@ -592,14 +592,14 @@ supply - 6.0 + 7.0 basement - unconditioned 308.0 return - 6.0 + 7.0 basement - unconditioned 77.0 diff --git a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3d.xml b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3d.xml index 22c298caa..2bf4c07cf 100644 --- a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3d.xml +++ b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3d.xml @@ -592,14 +592,14 @@ supply - 6.0 + 7.0 basement - unconditioned 308.0 return - 6.0 + 7.0 basement - unconditioned 77.0 diff --git a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3e.xml b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3e.xml index 46bce808e..90c8c5486 100644 --- a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3e.xml +++ b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3e.xml @@ -410,14 +410,14 @@ supply - 0.0 + 1.5 conditioned space 308.0 return - 0.0 + 1.5 conditioned space 77.0 diff --git a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3f.xml b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3f.xml index 0f43912d9..2a822a0c8 100644 --- a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3f.xml +++ b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3f.xml @@ -410,14 +410,14 @@ supply - 0.0 + 1.5 attic - vented 308.0 return - 0.0 + 1.5 attic - vented 77.0 diff --git a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3g.xml b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3g.xml index e81663562..41058c9a9 100644 --- a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3g.xml +++ b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3g.xml @@ -410,14 +410,14 @@ supply - 6.0 + 7.0 attic - vented 308.0 return - 6.0 + 7.0 attic - vented 77.0 diff --git a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3h.xml b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3h.xml index 6c5390714..4d6694f27 100644 --- a/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3h.xml +++ b/workflow/tests/RESNET_Tests/4.5_DSE/HVAC3h.xml @@ -410,14 +410,14 @@ supply - 6.0 + 7.0 attic - vented 308.0 return - 6.0 + 7.0 attic - vented 77.0 diff --git a/workflow/tests/util.rb b/workflow/tests/util.rb index d45cfb568..a0b85b733 100644 --- a/workflow/tests/util.rb +++ b/workflow/tests/util.rb @@ -417,7 +417,7 @@ def _get_simulation_hvac_energy_results(csv_path, is_heat, is_electric_heat) end def _check_ashrae_140_results(htg_loads, clg_loads) - # Proposed acceptance criteria as of 3/18/2024 + # Pub 002-2024 htg_min = [48.07, 74.30, 35.98, 39.74, 45.72, 39.13, 42.17, 48.30, 58.15, 121.76, 126.71, 24.59, 27.72, 57.57, 48.33] htg_max = [61.35, 82.96, 48.09, 49.95, 51.97, 55.54, 58.15, 63.40, 74.24, 137.68, 146.84, 81.73, 70.27, 91.66, 56.47] htg_dt_min = [17.53, -16.08, -12.92, -12.14, -10.90, -0.56, -1.96, 8.15, 71.16, 3.20, -25.78, -3.14, 7.79, 5.49] @@ -425,7 +425,7 @@ def _check_ashrae_140_results(htg_loads, clg_loads) clg_min = [42.50, 47.72, 41.15, 31.54, 21.03, 50.55, 36.63, 52.26, 34.16, 57.07, 50.19] clg_max = [58.66, 61.33, 51.69, 41.85, 29.35, 73.48, 59.72, 68.60, 47.58, 73.51, 60.72] clg_dt_min = [0.69, -8.24, -18.53, -30.58, 7.51, -16.52, 6.75, -12.95, 11.62, 5.12] - clg_dt_max = [6.91, -0.22, -9.74, -20.47, 15.77, -11.15, 12.76, -6.58, 17.59, 14.14] + clg_dt_max = [6.91, -0.22, -9.74, -20.48, 15.77, -11.15, 12.76, -6.58, 17.59, 14.14] # Annual Heating Loads assert_operator(htg_loads['L100AC'], :<=, htg_max[0]) @@ -615,8 +615,7 @@ def _get_reference_home_components(hpxml, test_num) results['East window area (ft2)'] = win_areas[90].round(2) results['West window area (ft2)'] = win_areas[270].round(2) results['Window U-Factor'] = win_u.round(2) - results['Window SHGCo (heating)'] = win_shgc_htg.round(2) - results['Window SHGCo (cooling)'] = win_shgc_clg.round(2) + results['Window SHGCo'] = ((win_shgc_htg + win_shgc_clg) / 2.0).round(2) # Infiltration sla, _ach50 = _get_infiltration(hpxml_bldg) @@ -826,10 +825,8 @@ def _check_reference_home_components(results, test_num, version) assert_equal(0.35, results['Window U-Factor']) end if version == '2022C' - # FIXME: Expected values changed due to different internal shading coefficients - # in 301-2022 Addendum C. - assert_equal(0.33, results['Window SHGCo (heating)']) - assert_equal(0.33, results['Window SHGCo (cooling)']) + # Pub 002-2024 + assert_equal(0.33, results['Window SHGCo']) else assert_equal(0.34, results['Window SHGCo (heating)']) assert_equal(0.28, results['Window SHGCo (cooling)']) @@ -840,6 +837,7 @@ def _check_reference_home_components(results, test_num, version) # Internal gains if version == '2022C' + # Pub 002-2024 # FIXME: Expected values changed due to rounded F_sensible values in 301-2022 # Addendum C relative to previously prescribed internal gains. Values below # do not match Pub 002, as it has not yet been updated. @@ -892,7 +890,7 @@ def _check_reference_home_components(results, test_num, version) # Mechanical ventilation mv_kwh_yr = nil if version == '2022C' - # FIXME: Updated values per 301-2022 Addendum C + # Pub 002-2024 mv_kwh_yr = { 1 => 0.0, 2 => 223.9, 3 => 288.1, 4 => 763.4 }[test_num] elsif version == '2019' mv_kwh_yr = { 1 => 0.0, 2 => 222.1, 3 => 288.1, 4 => 763.4 }[test_num] @@ -1377,8 +1375,8 @@ def _check_method_results(results, test_num, has_tankless_water_heater, version) end def _check_hvac_test_results(energy) - # Proposed acceptance criteria as of 3/18/2024 - min = [-24.59, -13.13, -42.73, 57.35] + # Pub 002-2024 + min = [-24.59, -13.13, -42.73, 59.35] max = [-18.18, -12.60, -15.88, 110.25] # Cooling cases @@ -1397,7 +1395,7 @@ def _check_hvac_test_results(energy) end def _check_dse_test_results(energy) - # Proposed acceptance criteria as of 3/18/2024 + # Pub 002-2024 htg_min = [9.45, 3.11, 7.40] htg_max = [25.72, 6.53, 19.77] clg_min = [18.69, 5.23, 16.32] @@ -1406,12 +1404,8 @@ def _check_dse_test_results(energy) # Heating cases assert_operator((energy['HVAC3b'] - energy['HVAC3a']) / energy['HVAC3a'] * 100, :>, htg_min[0]) assert_operator((energy['HVAC3b'] - energy['HVAC3a']) / energy['HVAC3a'] * 100, :<, htg_max[0]) - # Note: OS-ERI does not pass this test because of differences in duct insulation - # R-values; see get_duct_insulation_rvalue() in airflow.rb. - # See https://github.com/resnet-us/software-consistency-inquiries/issues/21 - # Set Pub 002 effective R-value in test cases? - # assert_operator((energy['HVAC3c'] - energy['HVAC3a']) / energy['HVAC3a'] * 100, :>, htg_min[1]) - # assert_operator((energy['HVAC3c'] - energy['HVAC3a']) / energy['HVAC3a'] * 100, :<, htg_max[1]) + assert_operator((energy['HVAC3c'] - energy['HVAC3a']) / energy['HVAC3a'] * 100, :>, htg_min[1]) + assert_operator((energy['HVAC3c'] - energy['HVAC3a']) / energy['HVAC3a'] * 100, :<, htg_max[1]) assert_operator((energy['HVAC3d'] - energy['HVAC3a']) / energy['HVAC3a'] * 100, :>, htg_min[2]) assert_operator((energy['HVAC3d'] - energy['HVAC3a']) / energy['HVAC3a'] * 100, :<, htg_max[2])