Skip to content

Commit c1d6b47

Browse files
committed
Require CompressorType for central and mini-split air conditioners and heat pumps.
1 parent 2550da7 commit c1d6b47

File tree

141 files changed

+190
-82
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

141 files changed

+190
-82
lines changed

BuildResidentialHPXML/measure.xml

+3-3
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>e73520e9-0ba0-40e1-8699-5c6b1695d7cd</version_id>
7-
<version_modified>2025-03-04T16:25:28Z</version_modified>
6+
<version_id>020d1d1d-0117-4844-b1cc-93e3fd338e60</version_id>
7+
<version_modified>2025-03-11T22:20:08Z</version_modified>
88
<xml_checksum>2C38F48B</xml_checksum>
99
<class_name>BuildResidentialHPXML</class_name>
1010
<display_name>HPXML Builder</display_name>
@@ -7723,7 +7723,7 @@
77237723
<filename>test_build_residential_hpxml.rb</filename>
77247724
<filetype>rb</filetype>
77257725
<usage_type>test</usage_type>
7726-
<checksum>BAC58C3D</checksum>
7726+
<checksum>8790CE3B</checksum>
77277727
</file>
77287728
</files>
77297729
</measure>

BuildResidentialHPXML/tests/test_build_residential_hpxml.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -818,7 +818,7 @@ def _set_measure_argument_values(hpxml_file, args)
818818
args['heating_system_type'] = Constants::None
819819
args['cooling_system_type'] = Constants::None
820820
args['heat_pump_type'] = HPXML::HVACTypeHeatPumpMiniSplit
821-
args.delete('heat_pump_cooling_compressor_type')
821+
args['heat_pump_cooling_compressor_type'] = HPXML::HVACCompressorTypeVariableSpeed
822822
args['heat_pump_heating_efficiency'] = 10.0
823823
args['heat_pump_cooling_efficiency'] = 19.0
824824
args['heat_pump_heating_capacity'] = 48000.0
@@ -1169,7 +1169,7 @@ def _set_measure_argument_values(hpxml_file, args)
11691169
args['heating_system_type'] = Constants::None
11701170
args['cooling_system_type'] = Constants::None
11711171
args['heat_pump_type'] = HPXML::HVACTypeHeatPumpMiniSplit
1172-
args.delete('heat_pump_cooling_compressor_type')
1172+
args['heat_pump_cooling_compressor_type'] = HPXML::HVACCompressorTypeVariableSpeed
11731173
args['heat_pump_is_ducted'] = true
11741174
args['heat_pump_backup_type'] = HPXML::HeatPumpBackupTypeSeparate
11751175
args['heating_system_2_type'] = HPXML::HVACTypeFurnace

Changelog.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
## OpenStudio-HPXML v1.10.0
22

33
__New Features__
4+
- HVAC modeling updates:
5+
- **Breaking Change**: `CompressorType` required for central and mini-split air conditioners and heat pumps.
46
- Electric vehicle enhancements:
57
- Allows detailed modeling of electric vehicles (batteries and charging/discharging) using `Vehicles` as an alternative to the simple EV charging `PlugLoad`.
68
- Adds EV driving unmet hours output.

HPXMLtoOpenStudio/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>hpxm_lto_openstudio</name>
55
<uid>b1543b30-9465-45ff-ba04-1d1f85e763bc</uid>
6-
<version_id>098dfa7a-1a48-4e8b-8760-f33182629cf3</version_id>
7-
<version_modified>2025-03-11T15:55:27Z</version_modified>
6+
<version_id>192feda3-4fab-4214-8f7e-d15ba97c141d</version_id>
7+
<version_modified>2025-03-11T23:07:56Z</version_modified>
88
<xml_checksum>D8922A73</xml_checksum>
99
<class_name>HPXMLtoOpenStudio</class_name>
1010
<display_name>HPXML to OpenStudio Translator</display_name>
@@ -333,7 +333,7 @@
333333
<filename>defaults.rb</filename>
334334
<filetype>rb</filetype>
335335
<usage_type>resource</usage_type>
336-
<checksum>49F9C868</checksum>
336+
<checksum>340037BD</checksum>
337337
</file>
338338
<file>
339339
<filename>energyplus.rb</filename>
@@ -381,7 +381,7 @@
381381
<filename>hpxml_schematron/EPvalidator.xml</filename>
382382
<filetype>xml</filetype>
383383
<usage_type>resource</usage_type>
384-
<checksum>6D661DE4</checksum>
384+
<checksum>E3EC7B98</checksum>
385385
</file>
386386
<file>
387387
<filename>hpxml_schematron/iso-schematron.xsd</filename>
@@ -393,7 +393,7 @@
393393
<filename>hvac.rb</filename>
394394
<filetype>rb</filetype>
395395
<usage_type>resource</usage_type>
396-
<checksum>4051AA19</checksum>
396+
<checksum>FB9ACEF1</checksum>
397397
</file>
398398
<file>
399399
<filename>hvac_sizing.rb</filename>
@@ -711,7 +711,7 @@
711711
<filename>test_defaults.rb</filename>
712712
<filetype>rb</filetype>
713713
<usage_type>test</usage_type>
714-
<checksum>3BF1E52A</checksum>
714+
<checksum>F1AC47B0</checksum>
715715
</file>
716716
<file>
717717
<filename>test_enclosure.rb</filename>

HPXMLtoOpenStudio/resources/defaults.rb

+3-16
Original file line numberDiff line numberDiff line change
@@ -1921,13 +1921,13 @@ def self.apply_hvac(runner, hpxml_bldg, weather, convert_shared_systems, unit_nu
19211921
hpxml_bldg.cooling_systems.each do |cooling_system|
19221922
next unless cooling_system.compressor_type.nil?
19231923

1924-
cooling_system.compressor_type = get_hvac_compressor_type(cooling_system.cooling_system_type, cooling_system.cooling_efficiency_seer)
1924+
cooling_system.compressor_type = get_hvac_compressor_type(cooling_system.cooling_system_type)
19251925
cooling_system.compressor_type_isdefaulted = true
19261926
end
19271927
hpxml_bldg.heat_pumps.each do |heat_pump|
19281928
next unless heat_pump.compressor_type.nil?
19291929

1930-
heat_pump.compressor_type = get_hvac_compressor_type(heat_pump.heat_pump_type, heat_pump.cooling_efficiency_seer)
1930+
heat_pump.compressor_type = get_hvac_compressor_type(heat_pump.heat_pump_type)
19311931
heat_pump.compressor_type_isdefaulted = true
19321932
end
19331933

@@ -5446,22 +5446,9 @@ def self.get_window_ufactor_shgc(window)
54465446
# Gets the default compressor type for a HVAC system.
54475447
#
54485448
# @param hvac_type [String] The type of cooling system or heat pump (HPXML::HVACTypeXXX)
5449-
# @param seer [Double] Cooling efficiency
54505449
# @return [String] Compressor type (HPXML::HVACCompressorTypeXXX)
5451-
def self.get_hvac_compressor_type(hvac_type, seer)
5450+
def self.get_hvac_compressor_type(hvac_type)
54525451
case hvac_type
5453-
when HPXML::HVACTypeCentralAirConditioner,
5454-
HPXML::HVACTypeHeatPumpAirToAir
5455-
if seer <= 15
5456-
return HPXML::HVACCompressorTypeSingleStage
5457-
elsif seer <= 21
5458-
return HPXML::HVACCompressorTypeTwoStage
5459-
elsif seer > 21
5460-
return HPXML::HVACCompressorTypeVariableSpeed
5461-
end
5462-
when HPXML::HVACTypeMiniSplitAirConditioner,
5463-
HPXML::HVACTypeHeatPumpMiniSplit
5464-
return HPXML::HVACCompressorTypeVariableSpeed
54655452
when HPXML::HVACTypePTAC,
54665453
HPXML::HVACTypeHeatPumpPTHP,
54675454
HPXML::HVACTypeHeatPumpRoom,

HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml

+4-6
Original file line numberDiff line numberDiff line change
@@ -1270,7 +1270,7 @@
12701270
<sch:assert role='ERROR' test='count(h:CoolingSystemFuel) = 1'>Expected 1 element(s) for xpath: CoolingSystemFuel</sch:assert>
12711271
<sch:assert role='ERROR' test='h:CoolingSystemFuel[text()="electricity"] or not(h:CoolingSystemFuel)'>Expected CoolingSystemFuel to be 'electricity'</sch:assert>
12721272
<sch:assert role='ERROR' test='count(h:CoolingCapacity) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CoolingCapacity</sch:assert>
1273-
<sch:assert role='ERROR' test='count(h:CompressorType) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CompressorType</sch:assert>
1273+
<sch:assert role='ERROR' test='count(h:CompressorType) = 1'>Expected 1 element(s) for xpath: CompressorType</sch:assert>
12741274
<sch:assert role='ERROR' test='h:CompressorType[text()="single stage" or text()="two stage" or text()="variable speed"] or not(h:CompressorType)'>Expected CompressorType to be 'single stage' or 'two stage' or 'variable speed'</sch:assert>
12751275
<sch:assert role='ERROR' test='count(h:FractionCoolLoadServed) = 1'>Expected 1 element(s) for xpath: FractionCoolLoadServed</sch:assert>
12761276
<sch:assert role='ERROR' test='count(h:AnnualCoolingEfficiency[h:Units="SEER" or h:Units="SEER2"]/h:Value) = 1'>Expected 1 element(s) for xpath: AnnualCoolingEfficiency[Units="SEER" or Units="SEER2"]/Value</sch:assert>
@@ -1340,7 +1340,7 @@
13401340
<sch:assert role='ERROR' test='count(h:CoolingSystemFuel) = 1'>Expected 1 element(s) for xpath: CoolingSystemFuel</sch:assert>
13411341
<sch:assert role='ERROR' test='h:CoolingSystemFuel[text()="electricity"] or not(h:CoolingSystemFuel)'>Expected CoolingSystemFuel to be 'electricity'</sch:assert>
13421342
<sch:assert role='ERROR' test='count(h:CoolingCapacity) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CoolingCapacity</sch:assert>
1343-
<sch:assert role='ERROR' test='count(h:CompressorType) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CompressorType</sch:assert>
1343+
<sch:assert role='ERROR' test='count(h:CompressorType) = 1'>Expected 1 element(s) for xpath: CompressorType</sch:assert>
13441344
<sch:assert role='ERROR' test='h:CompressorType[text()="variable speed"] or not(h:CompressorType)'>Expected CompressorType to be 'variable speed'</sch:assert>
13451345
<sch:assert role='ERROR' test='count(h:FractionCoolLoadServed) = 1'>Expected 1 element(s) for xpath: FractionCoolLoadServed</sch:assert>
13461346
<sch:assert role='ERROR' test='count(h:AnnualCoolingEfficiency[h:Units="SEER" or h:Units="SEER2"]/h:Value) = 1'>Expected 1 element(s) for xpath: AnnualCoolingEfficiency[Units="SEER" or Units="SEER2"]/Value</sch:assert>
@@ -1466,7 +1466,7 @@
14661466
<sch:assert role='ERROR' test='count(h:extension/h:HeatingCapacityRetention) + count(h:HeatingCapacity17F) &lt;= 1'>Expected 0 or 1 element(s) for xpath: extension/HeatingCapacityRetention | HeatingCapacity17F</sch:assert> <!-- See [HeatPumpCapacityRetention] -->
14671467
<sch:assert role='ERROR' test='number(h:HeatingCapacity17F) &lt;= number(h:HeatingCapacity) or not(h:HeatingCapacity17F) or not(h:HeatingCapacity)'>Expected HeatingCapacity17F to be less than or equal to HeatingCapacity</sch:assert>
14681468
<sch:assert role='ERROR' test='count(h:CoolingCapacity) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CoolingCapacity</sch:assert>
1469-
<sch:assert role='ERROR' test='count(h:CompressorType) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CompressorType</sch:assert>
1469+
<sch:assert role='ERROR' test='count(h:CompressorType) = 1'>Expected 1 element(s) for xpath: CompressorType</sch:assert>
14701470
<sch:assert role='ERROR' test='h:CompressorType[text()="single stage" or text()="two stage" or text()="variable speed"] or not(h:CompressorType)'>Expected CompressorType to be 'single stage' or 'two stage' or 'variable speed'</sch:assert>
14711471
<sch:assert role='ERROR' test='count(h:CompressorLockoutTemperature) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CompressorLockoutTemperature</sch:assert>
14721472
<sch:assert role='ERROR' test='count(h:CoolingSensibleHeatFraction) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CoolingSensibleHeatFraction</sch:assert>
@@ -1511,7 +1511,7 @@
15111511
<sch:assert role='ERROR' test='count(h:extension/h:HeatingCapacityRetention) + count(h:HeatingCapacity17F) &lt;= 1'>Expected 0 or 1 element(s) for xpath: extension/HeatingCapacityRetention | HeatingCapacity17F</sch:assert> <!-- See [HeatPumpCapacityRetention] -->
15121512
<sch:assert role='ERROR' test='number(h:HeatingCapacity17F) &lt;= number(h:HeatingCapacity) or not(h:HeatingCapacity17F) or not(h:HeatingCapacity)'>Expected HeatingCapacity17F to be less than or equal to HeatingCapacity</sch:assert>
15131513
<sch:assert role='ERROR' test='count(h:CoolingCapacity) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CoolingCapacity</sch:assert>
1514-
<sch:assert role='ERROR' test='count(h:CompressorType) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CompressorType</sch:assert>
1514+
<sch:assert role='ERROR' test='count(h:CompressorType) = 1'>Expected 1 element(s) for xpath: CompressorType</sch:assert>
15151515
<sch:assert role='ERROR' test='h:CompressorType[text()="variable speed"] or not(h:CompressorType)'>Expected CompressorType to be 'variable speed'</sch:assert>
15161516
<sch:assert role='ERROR' test='count(h:CompressorLockoutTemperature) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CompressorLockoutTemperature</sch:assert>
15171517
<sch:assert role='ERROR' test='count(h:CoolingSensibleHeatFraction) &lt;= 1'>Expected 0 or 1 element(s) for xpath: CoolingSensibleHeatFraction</sch:assert>
@@ -1694,7 +1694,6 @@
16941694
<sch:pattern>
16951695
<sch:title>[HeatingDetailedPerformanceData]</sch:title>
16961696
<sch:rule context='/h:HPXML/h:Building/h:BuildingDetails/h:Systems/h:HVAC/h:HVACPlant/*/h:HeatingDetailedPerformanceData'>
1697-
<sch:assert role='ERROR' test='count(../h:CompressorType[text()="variable speed"]) = 1'>Expected 1 element(s) for xpath: ../CompressorType[text()="variable speed"]</sch:assert>
16981697
<sch:assert role='ERROR' test='count(h:PerformanceDataPoint[h:OutdoorTemperature=47 and h:CapacityDescription="minimum"]) = 1'>Expected 1 element(s) for xpath: PerformanceDataPoint[OutdoorTemperature=47 and CapacityDescription="minimum"]</sch:assert> <!-- See [PerformanceDataPoint] -->
16991698
<sch:assert role='ERROR' test='count(h:PerformanceDataPoint[h:OutdoorTemperature=47 and h:CapacityDescription="maximum"]) = 1'>Expected 1 element(s) for xpath: PerformanceDataPoint[OutdoorTemperature=47 and CapacityDescription="maximum"]</sch:assert> <!-- See [PerformanceDataPoint] -->
17001699
<sch:assert role='ERROR' test='count(h:PerformanceDataPoint[h:OutdoorTemperature!=47 and h:CapacityDescription="minimum"]) &gt;= 1'>Expected 1 or more element(s) for xpath: PerformanceDataPoint[OutdoorTemperature!=47 and CapacityDescription="minimum"]</sch:assert> <!-- See [PerformanceDataPoint] -->
@@ -1705,7 +1704,6 @@
17051704
<sch:pattern>
17061705
<sch:title>[CoolingDetailedPerformanceData]</sch:title>
17071706
<sch:rule context='/h:HPXML/h:Building/h:BuildingDetails/h:Systems/h:HVAC/h:HVACPlant/*/h:CoolingDetailedPerformanceData'>
1708-
<sch:assert role='ERROR' test='count(../h:CompressorType[text()="variable speed"]) = 1'>Expected 1 element(s) for xpath: ../CompressorType[text()="variable speed"]</sch:assert>
17091707
<sch:assert role='ERROR' test='count(h:PerformanceDataPoint[h:OutdoorTemperature=95 and h:CapacityDescription="minimum"]) = 1'>Expected 1 element(s) for xpath: PerformanceDataPoint[OutdoorTemperature=95 and CapacityDescription="minimum"]</sch:assert> <!-- See [PerformanceDataPoint] -->
17101708
<sch:assert role='ERROR' test='count(h:PerformanceDataPoint[h:OutdoorTemperature=95 and h:CapacityDescription="maximum"]) = 1'>Expected 1 element(s) for xpath: PerformanceDataPoint[OutdoorTemperature=95 and CapacityDescription="maximum"]</sch:assert> <!-- See [PerformanceDataPoint] -->
17111709
<sch:assert role='ERROR' test='count(h:PerformanceDataPoint[h:OutdoorTemperature!=95 and h:CapacityDescription="minimum"]) &gt;= 1'>Expected 1 or more element(s) for xpath: PerformanceDataPoint[OutdoorTemperature!=95 and CapacityDescription="minimum"]</sch:assert> <!-- See [PerformanceDataPoint] -->

HPXMLtoOpenStudio/resources/hvac.rb

+1
Original file line numberDiff line numberDiff line change
@@ -5317,6 +5317,7 @@ def self.apply_shared_cooling_systems(hpxml_bldg)
53175317
cooling_system.cooling_efficiency_seer = seer_eq.round(2)
53185318
cooling_system.cooling_efficiency_kw_per_ton = nil
53195319
cooling_system.cooling_capacity = nil # Autosize the equipment
5320+
cooling_system.compressor_type = HPXML::HVACCompressorTypeSingleStage
53205321
cooling_system.is_shared_system = false
53215322
cooling_system.number_of_units_served = nil
53225323
cooling_system.shared_loop_watts = nil

0 commit comments

Comments
 (0)