Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace HasFlueOrChimneyInConditionedSpace input #1778

Draft
wants to merge 5 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion BuildResidentialHPXML/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1892,9 +1892,20 @@ The heating load served by the heating system.

<br/>

**Heating System: Atmospheric Burner**

Whether the heating system has an atmospheric burner. Applies only to Furnace, WallFurnace, FloorFurnace, Boiler, Stove, and SpaceHeater with non-electric fuel type. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.8.1/workflow_inputs.html#hpxml-heating-systems'>HPXML Heating Systems</a>) is used.

- **Name:** ``heating_system_atmospheric_burner``
- **Type:** ``Boolean``

- **Required:** ``false``

<br/>

**Heating System: Pilot Light**

The fuel usage of the pilot light. Applies only to Furnace, WallFurnace, FloorFurnace, Stove, Boiler, and Fireplace with non-electric fuel type. If not provided, assumes no pilot light.
The fuel usage of the pilot light. Applies only to Furnace, WallFurnace, FloorFurnace, Boiler, Fireplace, Stove, and SpaceHeater with non-electric fuel type. If not provided, assumes no pilot light.

- **Name:** ``heating_system_pilot_light``
- **Type:** ``Double``
Expand Down
12 changes: 11 additions & 1 deletion BuildResidentialHPXML/measure.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1187,9 +1187,16 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg.setDefaultValue(1)
args << arg

# FIXME: Change to a more generic argument (heating_system_sub_type?) that allows atmospheric, direct vent, power vent, condensing, etc?
# Could apply for water heaters too.
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('heating_system_atmospheric_burner', false)
arg.setDisplayName('Heating System: Atmospheric Burner')
arg.setDescription("Whether the heating system has an atmospheric burner. Applies only to #{HPXML::HVACTypeFurnace}, #{HPXML::HVACTypeWallFurnace}, #{HPXML::HVACTypeFloorFurnace}, #{HPXML::HVACTypeBoiler}, #{HPXML::HVACTypeStove}, and #{HPXML::HVACTypeSpaceHeater} with non-electric fuel type. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-heating-systems'>HPXML Heating Systems</a>) is used.")
args << arg

arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_pilot_light', false)
arg.setDisplayName('Heating System: Pilot Light')
arg.setDescription("The fuel usage of the pilot light. Applies only to #{HPXML::HVACTypeFurnace}, #{HPXML::HVACTypeWallFurnace}, #{HPXML::HVACTypeFloorFurnace}, #{HPXML::HVACTypeStove}, #{HPXML::HVACTypeBoiler}, and #{HPXML::HVACTypeFireplace} with non-electric fuel type. If not provided, assumes no pilot light.")
arg.setDescription("The fuel usage of the pilot light. Applies only to #{HPXML::HVACTypeFurnace}, #{HPXML::HVACTypeWallFurnace}, #{HPXML::HVACTypeFloorFurnace}, #{HPXML::HVACTypeBoiler}, #{HPXML::HVACTypeFireplace}, #{HPXML::HVACTypeStove}, and #{HPXML::HVACTypeSpaceHeater} with non-electric fuel type. If not provided, assumes no pilot light.")
arg.setUnits('Btuh')
args << arg

Expand Down Expand Up @@ -5476,6 +5483,8 @@ def self.set_heating_systems(hpxml_bldg, args)
if pilot_light_btuh > 0
pilot_light = true
end

atmospheric_burner = args[:heating_system_atmospheric_burner]
end

fraction_heat_load_served = args[:heating_system_fraction_heat_load_served]
Expand All @@ -5500,6 +5509,7 @@ def self.set_heating_systems(hpxml_bldg, args)
heating_efficiency_afue: heating_efficiency_afue,
heating_efficiency_percent: heating_efficiency_percent,
airflow_defect_ratio: airflow_defect_ratio,
atmospheric_burner: atmospheric_burner,
pilot_light: pilot_light,
pilot_light_btuh: pilot_light_btuh,
is_shared_system: is_shared_system,
Expand Down
28 changes: 23 additions & 5 deletions BuildResidentialHPXML/measure.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
<schema_version>3.1</schema_version>
<name>build_residential_hpxml</name>
<uid>a13a8983-2b01-4930-8af2-42030b6e4233</uid>
<version_id>635a8ab6-45f1-4969-b2c5-f308519438f8</version_id>
<version_modified>2024-07-11T16:09:59Z</version_modified>
<version_id>45dfafaf-fa1a-4c1c-9f94-b71d9b8b360a</version_id>
<version_modified>2024-07-15T17:33:10Z</version_modified>
<xml_checksum>2C38F48B</xml_checksum>
<class_name>BuildResidentialHPXML</class_name>
<display_name>HPXML Builder</display_name>
Expand Down Expand Up @@ -2412,10 +2412,28 @@
<model_dependent>false</model_dependent>
<default_value>1</default_value>
</argument>
<argument>
<name>heating_system_atmospheric_burner</name>
<display_name>Heating System: Atmospheric Burner</display_name>
<description>Whether the heating system has an atmospheric burner. Applies only to Furnace, WallFurnace, FloorFurnace, Boiler, Stove, and SpaceHeater with non-electric fuel type. If not provided, the OS-HPXML default (see &lt;a href='https://openstudio-hpxml.readthedocs.io/en/v1.8.1/workflow_inputs.html#hpxml-heating-systems'&gt;HPXML Heating Systems&lt;/a&gt;) is used.</description>
<type>Boolean</type>
<required>false</required>
<model_dependent>false</model_dependent>
<choices>
<choice>
<value>true</value>
<display_name>true</display_name>
</choice>
<choice>
<value>false</value>
<display_name>false</display_name>
</choice>
</choices>
</argument>
<argument>
<name>heating_system_pilot_light</name>
<display_name>Heating System: Pilot Light</display_name>
<description>The fuel usage of the pilot light. Applies only to Furnace, WallFurnace, FloorFurnace, Stove, Boiler, and Fireplace with non-electric fuel type. If not provided, assumes no pilot light.</description>
<description>The fuel usage of the pilot light. Applies only to Furnace, WallFurnace, FloorFurnace, Boiler, Fireplace, Stove, and SpaceHeater with non-electric fuel type. If not provided, assumes no pilot light.</description>
<type>Double</type>
<units>Btuh</units>
<required>false</required>
Expand Down Expand Up @@ -7389,7 +7407,7 @@
<filename>README.md</filename>
<filetype>md</filetype>
<usage_type>readme</usage_type>
<checksum>BD785B9E</checksum>
<checksum>86DCDD93</checksum>
</file>
<file>
<filename>README.md.erb</filename>
Expand All @@ -7406,7 +7424,7 @@
<filename>measure.rb</filename>
<filetype>rb</filetype>
<usage_type>script</usage_type>
<checksum>F41033B3</checksum>
<checksum>DA1AEB5C</checksum>
</file>
<file>
<filename>geometry.rb</filename>
Expand Down
3 changes: 3 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
## OpenStudio-HPXML v1.9.0

__New Features__
- **Breaking change**: Deprecates `HasFlueOrChimneyInConditionedSpace` input.
- Allows optional `AtmosphericBurner` inputs for furnaces, boilers, stoves, space heaters, and storage water heaters.
- Adds inputs for modeling skylight curbs and/or shafts.
- Allows alternative infiltration input `AirInfiltrationMeasurement/LeakinessDescription`, in which the infiltration level is estimated using age of home, climate zone, foundation type, etc.
- Allows optional `CondensingSystem` and `PowerBurner` inputs for storage water heaters.
- Central Fan Integrated Supply (CFIS) mechanical ventilation enhancements:
- Allows modeling systems with no strategy to meet remainder of ventilation target (`CFISControls/AdditionalRuntimeOperatingMode="none"`).
- HVAC Manual J design load and sizing calculations:
Expand Down
16 changes: 8 additions & 8 deletions HPXMLtoOpenStudio/measure.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
<schema_version>3.1</schema_version>
<name>hpxm_lto_openstudio</name>
<uid>b1543b30-9465-45ff-ba04-1d1f85e763bc</uid>
<version_id>7d48e13e-9c50-42a9-ac2d-1b75a6d9bcf2</version_id>
<version_modified>2024-07-12T20:19:53Z</version_modified>
<version_id>7b5c4511-5ab6-4d80-bcd4-a624c9613c3e</version_id>
<version_modified>2024-07-16T14:26:35Z</version_modified>
<xml_checksum>D8922A73</xml_checksum>
<class_name>HPXMLtoOpenStudio</class_name>
<display_name>HPXML to OpenStudio Translator</display_name>
Expand Down Expand Up @@ -345,19 +345,19 @@
<filename>hpxml.rb</filename>
<filetype>rb</filetype>
<usage_type>resource</usage_type>
<checksum>B559442B</checksum>
<checksum>55BFEAD9</checksum>
</file>
<file>
<filename>hpxml_defaults.rb</filename>
<filetype>rb</filetype>
<usage_type>resource</usage_type>
<checksum>6EC41272</checksum>
<checksum>A8BD276A</checksum>
</file>
<file>
<filename>hpxml_schema/HPXML.xsd</filename>
<filetype>xsd</filetype>
<usage_type>resource</usage_type>
<checksum>DE05BDEC</checksum>
<checksum>481B24A9</checksum>
</file>
<file>
<filename>hpxml_schema/README.md</filename>
Expand All @@ -369,7 +369,7 @@
<filename>hpxml_schematron/EPvalidator.xml</filename>
<filetype>xml</filetype>
<usage_type>resource</usage_type>
<checksum>B74AF2B5</checksum>
<checksum>88615EC5</checksum>
</file>
<file>
<filename>hpxml_schematron/iso-schematron.xsd</filename>
Expand Down Expand Up @@ -603,7 +603,7 @@
<filename>waterheater.rb</filename>
<filetype>rb</filetype>
<usage_type>resource</usage_type>
<checksum>8C128200</checksum>
<checksum>7DF07B1D</checksum>
</file>
<file>
<filename>weather.rb</filename>
Expand Down Expand Up @@ -639,7 +639,7 @@
<filename>test_defaults.rb</filename>
<filetype>rb</filetype>
<usage_type>test</usage_type>
<checksum>018D40ED</checksum>
<checksum>99C7128A</checksum>
</file>
<file>
<filename>test_enclosure.rb</filename>
Expand Down
23 changes: 20 additions & 3 deletions HPXMLtoOpenStudio/resources/hpxml.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5005,7 +5005,7 @@ def initialize(hpxml_object, *args, **kwargs)
:shared_loop_watts, :shared_loop_motor_efficiency, :fan_coil_watts, :fan_watts_per_cfm,
:airflow_defect_ratio, :fan_watts, :heating_airflow_cfm, :location, :primary_system,
:pilot_light, :pilot_light_btuh, :electric_resistance_distribution, :heating_autosizing_factor,
:heating_autosizing_limit]
:heating_autosizing_limit, :atmospheric_burner]
attr_accessor(*ATTRS)
attr_reader(:heating_detailed_performance_data)

Expand Down Expand Up @@ -5117,9 +5117,18 @@ def to_doc(building) # rubocop:disable Style/DocumentationMethod
if [HPXML::HVACTypeFurnace,
HPXML::HVACTypeWallFurnace,
HPXML::HVACTypeFloorFurnace,
HPXML::HVACTypeBoiler,
HPXML::HVACTypeStove,
HPXML::HVACTypeSpaceHeater].include? @heating_system_type
XMLHelper.add_element(type_el, 'AtmosphericBurner', @atmospheric_burner, :boolean, @atmospheric_burner_isdefaulted) unless @atmospheric_burner.nil?
end
if [HPXML::HVACTypeFurnace,
HPXML::HVACTypeWallFurnace,
HPXML::HVACTypeFloorFurnace,
HPXML::HVACTypeBoiler,
HPXML::HVACTypeFireplace,
HPXML::HVACTypeStove,
HPXML::HVACTypeBoiler].include? @heating_system_type
HPXML::HVACTypeSpaceHeater].include? @heating_system_type
XMLHelper.add_element(type_el, 'PilotLight', @pilot_light, :boolean, @pilot_light_isdefaulted) unless @pilot_light.nil?
if @pilot_light
XMLHelper.add_extension(type_el, 'PilotLightBtuh', @pilot_light_btuh, :float, @pilot_light_btuh_isdefaulted) unless @pilot_light_btuh.nil?
Expand Down Expand Up @@ -5173,6 +5182,7 @@ def from_doc(heating_system) # rubocop:disable Style/DocumentationMethod
@number_of_units_served = XMLHelper.get_value(heating_system, 'NumberofUnitsServed', :integer)
@heating_system_type = XMLHelper.get_child_name(heating_system, 'HeatingSystemType')
@heating_system_fuel = XMLHelper.get_value(heating_system, 'HeatingSystemFuel', :string)
@atmospheric_burner = XMLHelper.get_value(heating_system, "HeatingSystemType/#{@heating_system_type}/AtmosphericBurner", :boolean)
@pilot_light = XMLHelper.get_value(heating_system, "HeatingSystemType/#{@heating_system_type}/PilotLight", :boolean)
if @pilot_light
@pilot_light_btuh = XMLHelper.get_value(heating_system, "HeatingSystemType/#{@heating_system_type}/extension/PilotLightBtuh", :float)
Expand Down Expand Up @@ -6630,7 +6640,8 @@ class WaterHeatingSystem < BaseElement
:tank_volume, :fraction_dhw_load_served, :heating_capacity, :energy_factor, :usage_bin,
:uniform_energy_factor, :first_hour_rating, :recovery_efficiency, :uses_desuperheater, :jacket_r_value,
:related_hvac_idref, :third_party_certification, :standby_loss_units, :standby_loss_value,
:temperature, :is_shared_system, :number_of_bedrooms_served, :tank_model_type, :operating_mode]
:temperature, :is_shared_system, :number_of_bedrooms_served, :tank_model_type, :operating_mode,
:condensing_system, :atmospheric_burner, :power_burner]
attr_accessor(*ATTRS)

# TODO
Expand Down Expand Up @@ -6705,6 +6716,9 @@ def to_doc(building) # rubocop:disable Style/DocumentationMethod
end
XMLHelper.add_element(water_heating_system, 'HotWaterTemperature', @temperature, :float, @temperature_isdefaulted) unless @temperature.nil?
XMLHelper.add_element(water_heating_system, 'UsesDesuperheater', @uses_desuperheater, :boolean) unless @uses_desuperheater.nil?
XMLHelper.add_element(water_heating_system, 'CondensingSystem', @condensing_system, :boolean, @condensing_system_isdefaulted) unless @condensing_system.nil?
XMLHelper.add_element(water_heating_system, 'AtmosphericBurner', @atmospheric_burner, :boolean, @atmospheric_burner_isdefaulted) unless @atmospheric_burner.nil?
XMLHelper.add_element(water_heating_system, 'PowerBurner', @power_burner, :boolean, @power_burner_isdefaulted) unless @power_burner.nil?
if not @related_hvac_idref.nil?
related_hvac_idref_el = XMLHelper.add_element(water_heating_system, 'RelatedHVACSystem')
XMLHelper.add_attribute(related_hvac_idref_el, 'idref', @related_hvac_idref)
Expand Down Expand Up @@ -6741,6 +6755,9 @@ def from_doc(water_heating_system) # rubocop:disable Style/DocumentationMethod
@standby_loss_value = XMLHelper.get_value(water_heating_system, 'StandbyLoss/Value', :float)
@temperature = XMLHelper.get_value(water_heating_system, 'HotWaterTemperature', :float)
@uses_desuperheater = XMLHelper.get_value(water_heating_system, 'UsesDesuperheater', :boolean)
@condensing_system = XMLHelper.get_value(water_heating_system, 'CondensingSystem', :boolean)
@atmospheric_burner = XMLHelper.get_value(water_heating_system, 'AtmosphericBurner', :boolean)
@power_burner = XMLHelper.get_value(water_heating_system, 'PowerBurner', :boolean)
@related_hvac_idref = HPXML::get_idref(XMLHelper.get_element(water_heating_system, 'RelatedHVACSystem'))
@tank_model_type = XMLHelper.get_value(water_heating_system, 'extension/TankModelType', :string)
@number_of_bedrooms_served = XMLHelper.get_value(water_heating_system, 'extension/NumberofBedroomsServed', :integer)
Expand Down
60 changes: 45 additions & 15 deletions HPXMLtoOpenStudio/resources/hpxml_defaults.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2030,12 +2030,14 @@ def self.apply_hvac(runner, hpxml, hpxml_bldg, weather, convert_shared_systems)

# Pilot Light
hpxml_bldg.heating_systems.each do |heating_system|
next if heating_system.heating_system_fuel == HPXML::FuelTypeElectricity
next unless [HPXML::HVACTypeFurnace,
HPXML::HVACTypeWallFurnace,
HPXML::HVACTypeFloorFurnace,
HPXML::HVACTypeBoiler,
HPXML::HVACTypeFireplace,
HPXML::HVACTypeStove,
HPXML::HVACTypeBoiler].include? heating_system.heating_system_type
HPXML::HVACTypeSpaceHeater].include? heating_system.heating_system_type

if heating_system.pilot_light.nil?
heating_system.pilot_light = false
Expand All @@ -2047,6 +2049,25 @@ def self.apply_hvac(runner, hpxml, hpxml_bldg, weather, convert_shared_systems)
end
end

# Atmospheric Burner
hpxml_bldg.heating_systems.each do |heating_system|
next unless heating_system.atmospheric_burner.nil?
next if heating_system.heating_system_fuel == HPXML::FuelTypeElectricity
next unless [HPXML::HVACTypeFurnace,
HPXML::HVACTypeWallFurnace,
HPXML::HVACTypeFloorFurnace,
HPXML::HVACTypeBoiler,
HPXML::HVACTypeStove,
HPXML::HVACTypeSpaceHeater].include? heating_system.heating_system_type

if not heating_system.heating_efficiency_afue.nil?
heating_system.atmospheric_burner = (heating_system.heating_efficiency_afue < 0.89)
elsif not heating_system.heating_efficiency_percent.nil?
heating_system.atmospheric_burner = (heating_system.heating_efficiency_percent < 0.89)
end
heating_system.atmospheric_burner_isdefaulted = true
end

# Detailed HVAC performance
hpxml_bldg.cooling_systems.each do |cooling_system|
clg_ap = cooling_system.additional_properties
Expand Down Expand Up @@ -2683,6 +2704,27 @@ def self.apply_water_heaters(hpxml_bldg, nbeds, eri_version, schedules_file)
water_heating_system.tank_model_type = HPXML::WaterHeaterTankModelTypeMixed
water_heating_system.tank_model_type_isdefaulted = true
end
# FIXME: Use SealedCombustion too?
if water_heating_system.atmospheric_burner.nil? && water_heating_system.fuel_type != HPXML::FuelTypeElectricity
if not water_heating_system.energy_factor.nil?
water_heating_system.atmospheric_burner = (water_heating_system.energy_factor < 0.63)
elsif not water_heating_system.uniform_energy_factor.nil?
water_heating_system.atmospheric_burner = (Waterheater.calc_ef_from_uef(water_heating_system) < 0.63)
end
water_heating_system.atmospheric_burner_isdefaulted = true
end
if water_heating_system.power_burner.nil? && water_heating_system.fuel_type != HPXML::FuelTypeElectricity
water_heating_system.power_burner = (not water_heating_system.atmospheric_burner)
water_heating_system.power_burner_isdefaulted = true
end
if water_heating_system.condensing_system.nil? && water_heating_system.fuel_type != HPXML::FuelTypeElectricity
if not water_heating_system.energy_factor.nil?
water_heating_system.condensing_system = (water_heating_system.energy_factor >= 0.77 && water_heating_system.power_burner)
elsif not water_heating_system.uniform_energy_factor.nil?
water_heating_system.condensing_system = (Waterheater.calc_ef_from_uef(water_heating_system) >= 0.77 && water_heating_system.power_burner)
end
water_heating_system.condensing_system_isdefaulted = true
end
end
if (water_heating_system.water_heater_type == HPXML::WaterHeaterTypeHeatPump)
schedules_file_includes_water_heater_operating_mode = (schedules_file.nil? ? false : schedules_file.includes_col_name(SchedulesFile::Columns[:WaterHeaterOperatingMode].name))
Expand Down Expand Up @@ -3868,13 +3910,7 @@ def self.get_default_flue_or_chimney_in_conditioned_space(hpxml_bldg)
HPXML::HVACTypeFloorFurnace,
HPXML::HVACTypeStove,
HPXML::HVACTypeSpaceHeater].include? heating_system.heating_system_type
if not heating_system.heating_efficiency_afue.nil?
next if heating_system.heating_efficiency_afue >= 0.89
elsif not heating_system.heating_efficiency_percent.nil?
next if heating_system.heating_efficiency_percent >= 0.89
end

return true
return heating_system.atmospheric_burner
elsif [HPXML::HVACTypeFireplace].include? heating_system.heating_system_type
return true
end
Expand All @@ -3885,13 +3921,7 @@ def self.get_default_flue_or_chimney_in_conditioned_space(hpxml_bldg)
next if water_heating_system.fuel_type == HPXML::FuelTypeElectricity
next unless HPXML::conditioned_locations_this_unit.include? water_heating_system.location

if not water_heating_system.energy_factor.nil?
next if water_heating_system.energy_factor >= 0.63
elsif not water_heating_system.uniform_energy_factor.nil?
next if Waterheater.calc_ef_from_uef(water_heating_system) >= 0.63
end

return true
return water_heating_system.atmospheric_burner
end
return false
end
Expand Down
Loading