Skip to content

Commit b9e3429

Browse files
authored
Merge pull request #1904 from NREL/datapoint_extrapolation
Datapoint extrapolation
2 parents df1499e + 259226a commit b9e3429

19 files changed

+643
-390
lines changed

Diff for: BuildResidentialHPXML/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -2628,7 +2628,7 @@ Type of capacity values for detailed performance data if available. Applies only
26282628

26292629
**HVAC Detailed Performance Data: Heating Outdoor Temperatures**
26302630

2631-
Outdoor temperatures of heating detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). One of the outdoor temperatures must be 47 F. At least two performance data points are required using a comma-separated list.
2631+
Outdoor temperatures of heating detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). Outdoor temperatures must be 47F, 17F, and 5F (and one optional temperature less than 5F). At least two performance data points are required using a comma-separated list.
26322632

26332633
- **Name:** ``hvac_perf_data_heating_outdoor_temperatures``
26342634
- **Type:** ``String``
@@ -2683,7 +2683,7 @@ Maximum speed efficiency COP values of heating detailed performance data if avai
26832683

26842684
**HVAC Detailed Performance Data: Cooling Outdoor Temperatures**
26852685

2686-
Outdoor temperatures of cooling detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). One of the outdoor temperatures must be 95 F. At least two performance data points are required using a comma-separated list.
2686+
Outdoor temperatures of cooling detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). Outdoor temperatures must be 82F and 95F (and one optional temperature greater than 95F). At least two performance data points are required using a comma-separated list.
26872687

26882688
- **Name:** ``hvac_perf_data_cooling_outdoor_temperatures``
26892689
- **Type:** ``String``

Diff for: BuildResidentialHPXML/measure.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -1584,7 +1584,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
15841584

15851585
arg = OpenStudio::Measure::OSArgument.makeStringArgument('hvac_perf_data_heating_outdoor_temperatures', false)
15861586
arg.setDisplayName('HVAC Detailed Performance Data: Heating Outdoor Temperatures')
1587-
arg.setDescription('Outdoor temperatures of heating detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). One of the outdoor temperatures must be 47 F. At least two performance data points are required using a comma-separated list.')
1587+
arg.setDescription('Outdoor temperatures of heating detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). Outdoor temperatures must be 47F, 17F, and 5F (and one optional temperature less than 5F). At least two performance data points are required using a comma-separated list.')
15881588
arg.setUnits('F')
15891589
args << arg
15901590

@@ -1614,7 +1614,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
16141614

16151615
arg = OpenStudio::Measure::OSArgument.makeStringArgument('hvac_perf_data_cooling_outdoor_temperatures', false)
16161616
arg.setDisplayName('HVAC Detailed Performance Data: Cooling Outdoor Temperatures')
1617-
arg.setDescription('Outdoor temperatures of cooling detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). One of the outdoor temperatures must be 95 F. At least two performance data points are required using a comma-separated list.')
1617+
arg.setDescription('Outdoor temperatures of cooling detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). Outdoor temperatures must be 82F and 95F (and one optional temperature greater than 95F). At least two performance data points are required using a comma-separated list.')
16181618
arg.setUnits('F')
16191619
args << arg
16201620

Diff for: BuildResidentialHPXML/measure.xml

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<schema_version>3.1</schema_version>
44
<name>build_residential_hpxml</name>
55
<uid>a13a8983-2b01-4930-8af2-42030b6e4233</uid>
6-
<version_id>95c9cd41-0567-4b3c-a0d5-4ccdcac03f37</version_id>
7-
<version_modified>2025-01-16T05:23:16Z</version_modified>
6+
<version_id>e05933ee-362c-46ac-8e6c-ce330b9a6177</version_id>
7+
<version_modified>2025-01-16T05:27:23Z</version_modified>
88
<xml_checksum>2C38F48B</xml_checksum>
99
<class_name>BuildResidentialHPXML</class_name>
1010
<display_name>HPXML Builder</display_name>
@@ -3242,7 +3242,7 @@
32423242
<argument>
32433243
<name>hvac_perf_data_heating_outdoor_temperatures</name>
32443244
<display_name>HVAC Detailed Performance Data: Heating Outdoor Temperatures</display_name>
3245-
<description>Outdoor temperatures of heating detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). One of the outdoor temperatures must be 47 F. At least two performance data points are required using a comma-separated list.</description>
3245+
<description>Outdoor temperatures of heating detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). Outdoor temperatures must be 47F, 17F, and 5F (and one optional temperature less than 5F). At least two performance data points are required using a comma-separated list.</description>
32463246
<type>String</type>
32473247
<units>F</units>
32483248
<required>false</required>
@@ -3287,7 +3287,7 @@
32873287
<argument>
32883288
<name>hvac_perf_data_cooling_outdoor_temperatures</name>
32893289
<display_name>HVAC Detailed Performance Data: Cooling Outdoor Temperatures</display_name>
3290-
<description>Outdoor temperatures of cooling detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). One of the outdoor temperatures must be 95 F. At least two performance data points are required using a comma-separated list.</description>
3290+
<description>Outdoor temperatures of cooling detailed performance data if available. Applies only to variable-speed air-source HVAC systems (central air conditioners, mini-split air conditioners, air-to-air heat pumps, and mini-split heat pumps). Outdoor temperatures must be 82F and 95F (and one optional temperature greater than 95F). At least two performance data points are required using a comma-separated list.</description>
32913291
<type>String</type>
32923292
<units>F</units>
32933293
<required>false</required>
@@ -7527,7 +7527,7 @@
75277527
<filename>README.md</filename>
75287528
<filetype>md</filetype>
75297529
<usage_type>readme</usage_type>
7530-
<checksum>ECAEDA1E</checksum>
7530+
<checksum>99C4792F</checksum>
75317531
</file>
75327532
<file>
75337533
<filename>README.md.erb</filename>
@@ -7544,7 +7544,7 @@
75447544
<filename>measure.rb</filename>
75457545
<filetype>rb</filetype>
75467546
<usage_type>script</usage_type>
7547-
<checksum>CD62272E</checksum>
7547+
<checksum>745930C3</checksum>
75487548
</file>
75497549
<file>
75507550
<filename>constants.rb</filename>

Diff for: Changelog.md

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ __New Features__
44
- HVAC modeling updates:
55
- Updated DX heat pump and air conditioner models per RESNET MINHERS Addendum 82.
66
- Allows optional EER or EER2 inputs for central air conditioners/heat pumps and mini-splits.
7+
- **Breaking Change**: Detailed performance datapoints must now use `OutdoorTemperature` values of:
8+
- Heating: 47F, 17F, and 5F (plus an optional user-specified temperature <5F)
9+
- Cooling: 82F and 95F (plus an optional user-specified temperature >95F)
710

811
__Bugfixes__
912
- Fixes zero occupants specified for one unit in a whole MF building from being treated like zero occupants for every unit.

Diff for: HPXMLtoOpenStudio/measure.xml

+8-8
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>d7ee087e-0335-492e-ba85-c87caad50eff</version_id>
7-
<version_modified>2025-01-11T01:57:51Z</version_modified>
6+
<version_id>9fa5c41d-db3c-43aa-98c4-2969644a9dfa</version_id>
7+
<version_modified>2025-01-17T16:15:49Z</version_modified>
88
<xml_checksum>D8922A73</xml_checksum>
99
<class_name>HPXMLtoOpenStudio</class_name>
1010
<display_name>HPXML to OpenStudio Translator</display_name>
@@ -327,7 +327,7 @@
327327
<filename>defaults.rb</filename>
328328
<filetype>rb</filetype>
329329
<usage_type>resource</usage_type>
330-
<checksum>7646CD36</checksum>
330+
<checksum>3299B5AF</checksum>
331331
</file>
332332
<file>
333333
<filename>energyplus.rb</filename>
@@ -357,7 +357,7 @@
357357
<filename>hpxml.rb</filename>
358358
<filetype>rb</filetype>
359359
<usage_type>resource</usage_type>
360-
<checksum>DC04D304</checksum>
360+
<checksum>BD9723FA</checksum>
361361
</file>
362362
<file>
363363
<filename>hpxml_schema/HPXML.xsd</filename>
@@ -375,7 +375,7 @@
375375
<filename>hpxml_schematron/EPvalidator.xml</filename>
376376
<filetype>xml</filetype>
377377
<usage_type>resource</usage_type>
378-
<checksum>0AC30606</checksum>
378+
<checksum>A25F3562</checksum>
379379
</file>
380380
<file>
381381
<filename>hpxml_schematron/iso-schematron.xsd</filename>
@@ -387,13 +387,13 @@
387387
<filename>hvac.rb</filename>
388388
<filetype>rb</filetype>
389389
<usage_type>resource</usage_type>
390-
<checksum>1839975D</checksum>
390+
<checksum>3B489022</checksum>
391391
</file>
392392
<file>
393393
<filename>hvac_sizing.rb</filename>
394394
<filetype>rb</filetype>
395395
<usage_type>resource</usage_type>
396-
<checksum>8F69ECDF</checksum>
396+
<checksum>6E3654CA</checksum>
397397
</file>
398398
<file>
399399
<filename>internal_gains.rb</filename>
@@ -741,7 +741,7 @@
741741
<filename>test_validation.rb</filename>
742742
<filetype>rb</filetype>
743743
<usage_type>test</usage_type>
744-
<checksum>DEFF0AA8</checksum>
744+
<checksum>4F7B35EB</checksum>
745745
</file>
746746
<file>
747747
<filename>test_water_heater.rb</filename>

Diff for: HPXMLtoOpenStudio/resources/defaults.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -2434,7 +2434,8 @@ def self.apply_detailed_performance_data_for_var_speed_systems(hpxml_bldg)
24342434
# Calculate heating capacity retention at 5F outdoor drybulb
24352435
target_odb = 5.0
24362436
max_capacity_47 = hvac_system.heating_detailed_performance_data.find { |dp| dp.outdoor_temperature == HVAC::AirSourceHeatRatedODB && dp.capacity_description == HPXML::CapacityDescriptionMaximum }.capacity
2437-
hvac_system.heating_capacity_retention_fraction = (HVAC.interpolate_to_odb_table_point(hvac_system.heating_detailed_performance_data, HPXML::CapacityDescriptionMaximum, target_odb, :capacity) / max_capacity_47).round(5)
2437+
max_capacity_5 = HVAC.extrapolate_data_point(hvac_system.heating_detailed_performance_data, HPXML::CapacityDescriptionMaximum, :outdoor_temperature, target_odb, :capacity)
2438+
hvac_system.heating_capacity_retention_fraction = (max_capacity_5 / max_capacity_47).round(5)
24382439
hvac_system.heating_capacity_retention_fraction = 0.0 if hvac_system.heating_capacity_retention_fraction < 0
24392440
hvac_system.heating_capacity_retention_temp = target_odb
24402441
hvac_system.heating_capacity_retention_fraction_isdefaulted = true

Diff for: HPXMLtoOpenStudio/resources/hpxml.rb

+46-10
Original file line numberDiff line numberDiff line change
@@ -11147,15 +11147,31 @@ def add(**kwargs)
1114711147
# @return [Array<String>] List of error messages
1114811148
def check_for_errors
1114911149
errors = []
11150-
# For every unique outdoor temperature, check we have exactly one minimum and one maximum datapoint
11150+
1115111151
outdoor_temps = self.select { |dp| [HPXML::CapacityDescriptionMinimum, HPXML::CapacityDescriptionMaximum].include? dp.capacity_description }.map { |dp| dp.outdoor_temperature }.uniq
1115211152
outdoor_temps.each do |outdoor_temp|
11153-
num_min = count { |dp| dp.capacity_description == HPXML::CapacityDescriptionMinimum && dp.outdoor_temperature == outdoor_temp }
11154-
num_max = count { |dp| dp.capacity_description == HPXML::CapacityDescriptionMaximum && dp.outdoor_temperature == outdoor_temp }
11155-
if (num_min != 1) || (num_max != 1)
11153+
min_dps = self.select { |dp| dp.capacity_description == HPXML::CapacityDescriptionMinimum && dp.outdoor_temperature == outdoor_temp }
11154+
max_dps = self.select { |dp| dp.capacity_description == HPXML::CapacityDescriptionMaximum && dp.outdoor_temperature == outdoor_temp }
11155+
# For every unique outdoor temperature, check we have exactly one minimum and one maximum datapoint
11156+
if (min_dps.size != 1) || (max_dps.size != 1)
1115611157
errors << "Cooling detailed performance data for outdoor temperature = #{outdoor_temp} is incomplete; there must be exactly one minimum and one maximum capacity datapoint."
11158+
else
11159+
min_capacity = min_dps[0].capacity.nil? ? min_dps[0].capacity_fraction_of_nominal : min_dps[0].capacity
11160+
max_capacity = max_dps[0].capacity.nil? ? max_dps[0].capacity_fraction_of_nominal : max_dps[0].capacity
11161+
min_cop = min_dps[0].efficiency_cop
11162+
max_cop = max_dps[0].efficiency_cop
11163+
11164+
# Check power at minimum capacity <= power at maximum capacity
11165+
if min_capacity / min_cop > max_capacity / max_cop
11166+
errors << "Cooling detailed performance data for outdoor temperature = #{outdoor_temp} is invalid; Power (capacity / COP) at minimum capacity must be less than power at maximum capacity."
11167+
end
11168+
# Check minimum capacity <= maximum capacity
11169+
if min_capacity > max_capacity
11170+
errors << "Cooling detailed performance data for outdoor temperature = #{outdoor_temp} is invalid; Maximum capacity must be greater than minimum capacity."
11171+
end
1115711172
end
1115811173
end
11174+
1115911175
return errors
1116011176
end
1116111177

@@ -11183,7 +11199,9 @@ class CoolingPerformanceDataPoint < BaseElement
1118311199
:capacity_description, # [String] CapacityDescription (HPXML::CapacityDescriptionXXX)
1118411200
:efficiency_cop, # [Double] Efficiency[Units="COP"]/Value (W/W)
1118511201
:gross_capacity, # FUTURE: Not in HPXML schema, should move to additional_properties
11186-
:gross_efficiency_cop] # FUTURE: Not in HPXML schema, should move to additional_properties
11202+
:gross_efficiency_cop, # FUTURE: Not in HPXML schema, should move to additional_properties
11203+
:gross_input_power, # FUTURE: Not in HPXML schema, should move to additional_properties
11204+
:input_power] # FUTURE: Not in HPXML schema, should move to additional_properties
1118711205
attr_accessor(*ATTRS)
1118811206

1118911207
# Deletes the current object from the array.
@@ -11255,15 +11273,31 @@ def add(**kwargs)
1125511273
# @return [Array<String>] List of error messages
1125611274
def check_for_errors
1125711275
errors = []
11258-
# For every unique outdoor temperature, check we have exactly one minimum and one maximum datapoint
11276+
1125911277
outdoor_temps = self.select { |dp| [HPXML::CapacityDescriptionMinimum, HPXML::CapacityDescriptionMaximum].include? dp.capacity_description }.map { |dp| dp.outdoor_temperature }.uniq
1126011278
outdoor_temps.each do |outdoor_temp|
11261-
num_min = count { |dp| dp.capacity_description == HPXML::CapacityDescriptionMinimum && dp.outdoor_temperature == outdoor_temp }
11262-
num_max = count { |dp| dp.capacity_description == HPXML::CapacityDescriptionMaximum && dp.outdoor_temperature == outdoor_temp }
11263-
if (num_min != 1) || (num_max != 1)
11279+
min_dps = self.select { |dp| dp.capacity_description == HPXML::CapacityDescriptionMinimum && dp.outdoor_temperature == outdoor_temp }
11280+
max_dps = self.select { |dp| dp.capacity_description == HPXML::CapacityDescriptionMaximum && dp.outdoor_temperature == outdoor_temp }
11281+
# For every unique outdoor temperature, check we have exactly one minimum and one maximum datapoint
11282+
if (min_dps.size != 1) || (max_dps.size != 1)
1126411283
errors << "Heating detailed performance data for outdoor temperature = #{outdoor_temp} is incomplete; there must be exactly one minimum and one maximum capacity datapoint."
11284+
else
11285+
min_capacity = min_dps[0].capacity.nil? ? min_dps[0].capacity_fraction_of_nominal : min_dps[0].capacity
11286+
max_capacity = max_dps[0].capacity.nil? ? max_dps[0].capacity_fraction_of_nominal : max_dps[0].capacity
11287+
min_cop = min_dps[0].efficiency_cop
11288+
max_cop = max_dps[0].efficiency_cop
11289+
11290+
# Check power at minimum capacity <= power at maximum capacity
11291+
if min_capacity / min_cop > max_capacity / max_cop
11292+
errors << "Heating detailed performance data for outdoor temperature = #{outdoor_temp} is invalid; Power (capacity / COP) at minimum capacity must be less than power at maximum capacity."
11293+
end
11294+
# Check minimum capacity <= maximum capacity
11295+
if min_capacity > max_capacity
11296+
errors << "Heating detailed performance data for outdoor temperature = #{outdoor_temp} is invalid; Maximum capacity must be greater than minimum capacity."
11297+
end
1126511298
end
1126611299
end
11300+
1126711301
return errors
1126811302
end
1126911303

@@ -11290,7 +11324,9 @@ class HeatingPerformanceDataPoint < BaseElement
1129011324
:capacity_description, # [String] CapacityDescription (HPXML::CapacityDescriptionXXX)
1129111325
:efficiency_cop, # [Double] Efficiency[Units="COP"]/Value (W/W)
1129211326
:gross_capacity, # FUTURE: Not in HPXML schema, should move to additional_properties
11293-
:gross_efficiency_cop] # FUTURE: Not in HPXML schema, should move to additional_properties
11327+
:gross_efficiency_cop, # FUTURE: Not in HPXML schema, should move to additional_properties
11328+
:gross_input_power, # FUTURE: Not in HPXML schema, should move to additional_properties
11329+
:input_power] # FUTURE: Not in HPXML schema, should move to additional_properties
1129411330
attr_accessor(*ATTRS)
1129511331

1129611332
# Deletes the current object from the array.

0 commit comments

Comments
 (0)