diff --git a/BuildResidentialHPXML/measure.rb b/BuildResidentialHPXML/measure.rb
index 56a2d47364..5dc681627f 100644
--- a/BuildResidentialHPXML/measure.rb
+++ b/BuildResidentialHPXML/measure.rb
@@ -2935,44 +2935,44 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg.setDescription('Multiplier on the pool heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
args << arg
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('hot_tub_present', true)
- arg.setDisplayName('Hot Tub: Present')
- arg.setDescription('Whether there is a hot tub.')
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('permanent_spa_present', true)
+ arg.setDisplayName('Permanent Spa: Present')
+ arg.setDescription('Whether there is a permanent spa.')
arg.setDefaultValue(false)
args << arg
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_pump_annual_kwh', false)
- arg.setDisplayName('Hot Tub: Pump Annual kWh')
- arg.setDescription('The annual energy consumption of the hot tub pump. If not provided, the OS-HPXML default is used.')
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_pump_annual_kwh', false)
+ arg.setDisplayName('Permanent Spa: Pump Annual kWh')
+ arg.setDescription('The annual energy consumption of the permanent spa pump. If not provided, the OS-HPXML default is used.')
arg.setUnits('kWh/yr')
args << arg
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_pump_usage_multiplier', false)
- arg.setDisplayName('Hot Tub: Pump Usage Multiplier')
- arg.setDescription('Multiplier on the hot tub pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_pump_usage_multiplier', false)
+ arg.setDisplayName('Permanent Spa: Pump Usage Multiplier')
+ arg.setDescription('Multiplier on the permanent spa pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
args << arg
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('hot_tub_heater_type', heater_type_choices, true)
- arg.setDisplayName('Hot Tub: Heater Type')
- arg.setDescription("The type of hot tub heater. Use '#{HPXML::TypeNone}' if there is no hot tub heater.")
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('permanent_spa_heater_type', heater_type_choices, true)
+ arg.setDisplayName('Permanent Spa: Heater Type')
+ arg.setDescription("The type of permanent spa heater. Use '#{HPXML::TypeNone}' if there is no permanent spa heater.")
arg.setDefaultValue(HPXML::TypeNone)
args << arg
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_annual_kwh', false)
- arg.setDisplayName('Hot Tub: Heater Annual kWh')
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} hot tub heater. If not provided, the OS-HPXML default is used.")
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_heater_annual_kwh', false)
+ arg.setDisplayName('Permanent Spa: Heater Annual kWh')
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} permanent spa heater. If not provided, the OS-HPXML default is used.")
arg.setUnits('kWh/yr')
args << arg
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_annual_therm', false)
- arg.setDisplayName('Hot Tub: Heater Annual therm')
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} hot tub heater. If not provided, the OS-HPXML default is used.")
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_heater_annual_therm', false)
+ arg.setDisplayName('Permanent Spa: Heater Annual therm')
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} permanent spa heater. If not provided, the OS-HPXML default is used.")
arg.setUnits('therm/yr')
args << arg
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_usage_multiplier', false)
- arg.setDisplayName('Hot Tub: Heater Usage Multiplier')
- arg.setDescription('Multiplier on the hot tub heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_heater_usage_multiplier', false)
+ arg.setDisplayName('Permanent Spa: Heater Usage Multiplier')
+ arg.setDescription('Multiplier on the permanent spa heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
args << arg
arg = OpenStudio::Measure::OSArgument.makeStringArgument('emissions_scenario_names', false)
@@ -3427,7 +3427,7 @@ def self.create(runner, model, args, epw_path, hpxml_path)
set_misc_fuel_loads_lighting(hpxml, args)
set_misc_fuel_loads_fireplace(hpxml, args)
set_pool(hpxml, args)
- set_hot_tub(hpxml, args)
+ set_permanent_spa(hpxml, args)
collapse_surfaces(hpxml, args)
renumber_hpxml_ids(hpxml)
@@ -6357,46 +6357,46 @@ def self.set_pool(hpxml, args)
heater_usage_multiplier: heater_usage_multiplier)
end
- def self.set_hot_tub(hpxml, args)
- return unless args[:hot_tub_present]
+ def self.set_permanent_spa(hpxml, args)
+ return unless args[:permanent_spa_present]
- if args[:hot_tub_pump_annual_kwh].is_initialized
- pump_kwh_per_year = args[:hot_tub_pump_annual_kwh].get
+ if args[:permanent_spa_pump_annual_kwh].is_initialized
+ pump_kwh_per_year = args[:permanent_spa_pump_annual_kwh].get
end
- if args[:hot_tub_pump_usage_multiplier].is_initialized
- pump_usage_multiplier = args[:hot_tub_pump_usage_multiplier].get
+ if args[:permanent_spa_pump_usage_multiplier].is_initialized
+ pump_usage_multiplier = args[:permanent_spa_pump_usage_multiplier].get
end
- hot_tub_heater_type = args[:hot_tub_heater_type]
+ permanent_spa_heater_type = args[:permanent_spa_heater_type]
- if [HPXML::HeaterTypeElectricResistance, HPXML::HeaterTypeHeatPump].include?(hot_tub_heater_type)
- if args[:hot_tub_heater_annual_kwh].is_initialized
+ if [HPXML::HeaterTypeElectricResistance, HPXML::HeaterTypeHeatPump].include?(permanent_spa_heater_type)
+ if args[:permanent_spa_heater_annual_kwh].is_initialized
heater_load_units = HPXML::UnitsKwhPerYear
- heater_load_value = args[:hot_tub_heater_annual_kwh].get
+ heater_load_value = args[:permanent_spa_heater_annual_kwh].get
end
end
- if [HPXML::HeaterTypeGas].include?(hot_tub_heater_type)
- if args[:hot_tub_heater_annual_therm].is_initialized
+ if [HPXML::HeaterTypeGas].include?(permanent_spa_heater_type)
+ if args[:permanent_spa_heater_annual_therm].is_initialized
heater_load_units = HPXML::UnitsThermPerYear
- heater_load_value = args[:hot_tub_heater_annual_therm].get
+ heater_load_value = args[:permanent_spa_heater_annual_therm].get
end
end
- if args[:hot_tub_heater_usage_multiplier].is_initialized
- heater_usage_multiplier = args[:hot_tub_heater_usage_multiplier].get
+ if args[:permanent_spa_heater_usage_multiplier].is_initialized
+ heater_usage_multiplier = args[:permanent_spa_heater_usage_multiplier].get
end
- hpxml.hot_tubs.add(id: "HotTub#{hpxml.hot_tubs.size + 1}",
- type: HPXML::TypeUnknown,
- pump_type: HPXML::TypeUnknown,
- pump_kwh_per_year: pump_kwh_per_year,
- pump_usage_multiplier: pump_usage_multiplier,
- heater_type: hot_tub_heater_type,
- heater_load_units: heater_load_units,
- heater_load_value: heater_load_value,
- heater_usage_multiplier: heater_usage_multiplier)
+ hpxml.permanent_spas.add(id: "PermanentSpa#{hpxml.permanent_spas.size + 1}",
+ type: HPXML::TypeUnknown,
+ pump_type: HPXML::TypeUnknown,
+ pump_kwh_per_year: pump_kwh_per_year,
+ pump_usage_multiplier: pump_usage_multiplier,
+ heater_type: permanent_spa_heater_type,
+ heater_load_units: heater_load_units,
+ heater_load_value: heater_load_value,
+ heater_usage_multiplier: heater_usage_multiplier)
end
def self.collapse_surfaces(hpxml, args)
diff --git a/BuildResidentialHPXML/measure.xml b/BuildResidentialHPXML/measure.xml
index 40fbd2ca81..b22ab9ff04 100644
--- a/BuildResidentialHPXML/measure.xml
+++ b/BuildResidentialHPXML/measure.xml
@@ -3,8 +3,8 @@
3.1
build_residential_hpxml
a13a8983-2b01-4930-8af2-42030b6e4233
- 7c849980-9e94-4592-9cc8-c87acb1b90bc
- 2023-09-14T23:51:55Z
+ 33151973-6b3c-43c9-a7d3-a0f32bdd8926
+ 2023-09-26T16:58:47Z
2C38F48B
BuildResidentialHPXML
HPXML Builder
@@ -6284,9 +6284,9 @@
false
- hot_tub_present
- Hot Tub: Present
- Whether there is a hot tub.
+ permanent_spa_present
+ Permanent Spa: Present
+ Whether there is a permanent spa.
Boolean
true
false
@@ -6303,26 +6303,26 @@
- hot_tub_pump_annual_kwh
- Hot Tub: Pump Annual kWh
- The annual energy consumption of the hot tub pump. If not provided, the OS-HPXML default is used.
+ permanent_spa_pump_annual_kwh
+ Permanent Spa: Pump Annual kWh
+ The annual energy consumption of the permanent spa pump. If not provided, the OS-HPXML default is used.
Double
kWh/yr
false
false
- hot_tub_pump_usage_multiplier
- Hot Tub: Pump Usage Multiplier
- Multiplier on the hot tub pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ permanent_spa_pump_usage_multiplier
+ Permanent Spa: Pump Usage Multiplier
+ Multiplier on the permanent spa pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
Double
false
false
- hot_tub_heater_type
- Hot Tub: Heater Type
- The type of hot tub heater. Use 'none' if there is no hot tub heater.
+ permanent_spa_heater_type
+ Permanent Spa: Heater Type
+ The type of permanent spa heater. Use 'none' if there is no permanent spa heater.
Choice
true
false
@@ -6347,27 +6347,27 @@
- hot_tub_heater_annual_kwh
- Hot Tub: Heater Annual kWh
- The annual energy consumption of the electric resistance hot tub heater. If not provided, the OS-HPXML default is used.
+ permanent_spa_heater_annual_kwh
+ Permanent Spa: Heater Annual kWh
+ The annual energy consumption of the electric resistance permanent spa heater. If not provided, the OS-HPXML default is used.
Double
kWh/yr
false
false
- hot_tub_heater_annual_therm
- Hot Tub: Heater Annual therm
- The annual energy consumption of the gas fired hot tub heater. If not provided, the OS-HPXML default is used.
+ permanent_spa_heater_annual_therm
+ Permanent Spa: Heater Annual therm
+ The annual energy consumption of the gas fired permanent spa heater. If not provided, the OS-HPXML default is used.
Double
therm/yr
false
false
- hot_tub_heater_usage_multiplier
- Hot Tub: Heater Usage Multiplier
- Multiplier on the hot tub heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ permanent_spa_heater_usage_multiplier
+ Permanent Spa: Heater Usage Multiplier
+ Multiplier on the permanent spa heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
Double
false
false
@@ -6740,7 +6740,7 @@
measure.rb
rb
script
- 9519F913
+ 9CF40C8C
geometry.rb
@@ -6752,7 +6752,7 @@
build_residential_hpxml_test.rb
rb
test
- 9CC9525F
+ 151CD1BB
diff --git a/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb b/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb
index 1cd627457c..55995b3982 100644
--- a/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb
+++ b/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb
@@ -608,8 +608,8 @@ def _set_measure_argument_values(hpxml_file, args)
args['misc_fuel_loads_fireplace_fuel_type'] = HPXML::FuelTypeNaturalGas
args['pool_present'] = false
args['pool_heater_type'] = HPXML::HeaterTypeElectricResistance
- args['hot_tub_present'] = false
- args['hot_tub_heater_type'] = HPXML::HeaterTypeElectricResistance
+ args['permanent_spa_present'] = false
+ args['permanent_spa_heater_type'] = HPXML::HeaterTypeElectricResistance
elsif ['base-sfa.xml'].include? hpxml_file
args['geometry_unit_type'] = HPXML::ResidentialTypeSFA
args['geometry_unit_cfa'] = 1800.0
@@ -774,9 +774,9 @@ def _set_measure_argument_values(hpxml_file, args)
args['pool_heater_type'] = HPXML::HeaterTypeGas
args['pool_heater_annual_kwh'] = 0
elsif ['extra-gas-hot-tub-heater-with-zero-kwh.xml'].include? hpxml_file
- args['hot_tub_present'] = true
- args['hot_tub_heater_type'] = HPXML::HeaterTypeGas
- args['hot_tub_heater_annual_kwh'] = 0
+ args['permanent_spa_present'] = true
+ args['permanent_spa_heater_type'] = HPXML::HeaterTypeGas
+ args['permanent_spa_heater_annual_kwh'] = 0
elsif ['extra-no-rim-joists.xml'].include? hpxml_file
args.delete('geometry_rim_joist_height')
args.delete('rim_joist_assembly_r')
diff --git a/Changelog.md b/Changelog.md
index 4953e49f30..e9339e2283 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,10 +1,13 @@
## OpenStudio-HPXML v1.7.0
__New Features__
-- **Breaking change**: Updates to newer proposed HPXML v4.0:
+- **Breaking change**: Updates to official HPXML v4.0:
+ - HPXML namespace changed from http://hpxmlonline.com/2019/10 to http://hpxmlonline.com/2023/09
+ - Replaces `HotTubs/HotTub` with `Spas/PermanentSpa`.
- Replaces `PortableHeater` and `FixedHeater` with `SpaceHeater`.
- Adds manufactured home belly as a foundation type and allows modeling ducts in a manufactured home belly.
- Output updates:
+ - **Breaking change**: "Hot Tub" outputs renamed to "Permanent Spa".
- Adds "Peak Electricity: Annual Total (W)" output.
- Adds battery resilience hours output; allows requesting timeseries output.
- ReportUtilityBills measure: Allows reporting monthly utility bills in addition to (or instead of) annual bills.
diff --git a/HPXMLtoOpenStudio/measure.rb b/HPXMLtoOpenStudio/measure.rb
index 0d584a9447..b16cf2895a 100644
--- a/HPXMLtoOpenStudio/measure.rb
+++ b/HPXMLtoOpenStudio/measure.rb
@@ -219,8 +219,8 @@ def self.create(hpxml, runner, model, hpxml_path, epw_path, weather, output_dir,
add_mfls(runner, model, spaces)
add_lighting(runner, model, epw_file, spaces)
- # Pools & Hot Tubs
- add_pools_and_hot_tubs(runner, model, spaces)
+ # Pools & Permanent Spas
+ add_pools_and_permanent_spas(runner, model, spaces)
# Other
add_cooling_season(model, weather)
@@ -1621,27 +1621,27 @@ def self.add_lighting(runner, model, epw_file, spaces)
@schedules_file, @cfa, @hpxml.header.unavailable_periods)
end
- def self.add_pools_and_hot_tubs(runner, model, spaces)
+ def self.add_pools_and_permanent_spas(runner, model, spaces)
@hpxml.pools.each do |pool|
next if pool.type == HPXML::TypeNone
- MiscLoads.apply_pool_or_hot_tub_heater(runner, model, pool, Constants.ObjectNameMiscPoolHeater, spaces[HPXML::LocationLivingSpace],
- @schedules_file, @hpxml.header.unavailable_periods)
+ MiscLoads.apply_pool_or_permanent_spa_heater(runner, model, pool, Constants.ObjectNameMiscPoolHeater, spaces[HPXML::LocationLivingSpace],
+ @schedules_file, @hpxml.header.unavailable_periods)
next if pool.pump_type == HPXML::TypeNone
- MiscLoads.apply_pool_or_hot_tub_pump(runner, model, pool, Constants.ObjectNameMiscPoolPump, spaces[HPXML::LocationLivingSpace],
- @schedules_file, @hpxml.header.unavailable_periods)
+ MiscLoads.apply_pool_or_permanent_spa_pump(runner, model, pool, Constants.ObjectNameMiscPoolPump, spaces[HPXML::LocationLivingSpace],
+ @schedules_file, @hpxml.header.unavailable_periods)
end
- @hpxml.hot_tubs.each do |hot_tub|
- next if hot_tub.type == HPXML::TypeNone
+ @hpxml.permanent_spas.each do |spa|
+ next if spa.type == HPXML::TypeNone
- MiscLoads.apply_pool_or_hot_tub_heater(runner, model, hot_tub, Constants.ObjectNameMiscHotTubHeater, spaces[HPXML::LocationLivingSpace],
- @schedules_file, @hpxml.header.unavailable_periods)
- next if hot_tub.pump_type == HPXML::TypeNone
+ MiscLoads.apply_pool_or_permanent_spa_heater(runner, model, spa, Constants.ObjectNameMiscPermanentSpaHeater, spaces[HPXML::LocationLivingSpace],
+ @schedules_file, @hpxml.header.unavailable_periods)
+ next if spa.pump_type == HPXML::TypeNone
- MiscLoads.apply_pool_or_hot_tub_pump(runner, model, hot_tub, Constants.ObjectNameMiscHotTubPump, spaces[HPXML::LocationLivingSpace],
- @schedules_file, @hpxml.header.unavailable_periods)
+ MiscLoads.apply_pool_or_permanent_spa_pump(runner, model, spa, Constants.ObjectNameMiscPermanentSpaPump, spaces[HPXML::LocationLivingSpace],
+ @schedules_file, @hpxml.header.unavailable_periods)
end
end
diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml
index bd37f63f57..626554e6c2 100644
--- a/HPXMLtoOpenStudio/measure.xml
+++ b/HPXMLtoOpenStudio/measure.xml
@@ -3,8 +3,8 @@
3.1
hpxm_lto_openstudio
b1543b30-9465-45ff-ba04-1d1f85e763bc
- 5b3130f2-b6cd-4fd4-ba8d-1cb3be263f93
- 2023-09-19T21:08:31Z
+ 97d8f422-c0c4-44dd-912b-b6cf36b5b119
+ 2023-09-27T16:03:53Z
D8922A73
HPXMLtoOpenStudio
HPXML to OpenStudio Translator
@@ -130,7 +130,7 @@
measure.rb
rb
script
- E8D802F6
+ F9EA7D75
airflow.rb
@@ -148,7 +148,7 @@
constants.rb
rb
resource
- D202A548
+ F03A106D
constructions.rb
@@ -208,7 +208,7 @@
data/unavailable_periods.csv
csv
resource
- EEB2FB66
+ 1E3D66E6
energyplus.rb
@@ -238,19 +238,19 @@
hpxml.rb
rb
resource
- 1679048E
+ AEBF2FA9
hpxml_defaults.rb
rb
resource
- AC964052
+ ABA90C37
hpxml_schema/HPXML.xsd
xsd
resource
- 06374251
+ 5E58BBFC
hpxml_schema/README.md
@@ -262,7 +262,7 @@
hpxml_schematron/EPvalidator.xml
xml
resource
- 1DE8759B
+ 63AF635B
hpxml_schematron/iso-schematron.xsd
@@ -316,13 +316,13 @@
misc_loads.rb
rb
resource
- 581B499D
+ D4F1A388
output.rb
rb
resource
- 1744C3AF
+ C83B7F83
psychrometrics.rb
@@ -346,7 +346,7 @@
schedule_files/occupancy-non-stochastic.csv
csv
resource
- 1362DD15
+ BB0B9176
schedule_files/occupancy-stochastic-10-mins.csv
@@ -424,7 +424,7 @@
schedules.rb
rb
resource
- 85C70F45
+ DD62935D
simcontrols.rb
@@ -496,7 +496,7 @@
test_defaults.rb
rb
test
- 87CEB349
+ A8C411A0
test_enclosure.rb
@@ -544,7 +544,7 @@
test_miscloads.rb
rb
test
- 308C1B0D
+ 4A39E77E
test_pv.rb
@@ -568,7 +568,7 @@
test_validation.rb
rb
test
- 7B23CDE1
+ A279D502
test_water_heater.rb
diff --git a/HPXMLtoOpenStudio/resources/constants.rb b/HPXMLtoOpenStudio/resources/constants.rb
index 5d65f66905..6037ba12c0 100644
--- a/HPXMLtoOpenStudio/resources/constants.rb
+++ b/HPXMLtoOpenStudio/resources/constants.rb
@@ -338,12 +338,12 @@ def self.ObjectNameMiscPoolPump
return 'misc pool pump'
end
- def self.ObjectNameMiscHotTubHeater
- return 'misc hot tub heater'
+ def self.ObjectNameMiscPermanentSpaHeater
+ return 'misc permanent spa heater'
end
- def self.ObjectNameMiscHotTubPump
- return 'misc hot tub pump'
+ def self.ObjectNameMiscPermanentSpaPump
+ return 'misc permanent spa pump'
end
def self.ObjectNameMiscPlugLoads
diff --git a/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv b/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv
index 2dd57c3305..4f913d5415 100644
--- a/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv
+++ b/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv
@@ -21,8 +21,8 @@ fuel_loads_lighting,1,1
fuel_loads_fireplace,1,1
pool_pump,0,1
pool_heater,0,1
-hot_tub_pump,0,1
-hot_tub_heater,0,1
+permanent_spa_pump,0,1
+permanent_spa_heater,0,1
hot_water_fixtures,1,1
hvac,0,1
water_heater,0,1
diff --git a/HPXMLtoOpenStudio/resources/hpxml.rb b/HPXMLtoOpenStudio/resources/hpxml.rb
index 13679fc1cf..3a8e7fde14 100644
--- a/HPXMLtoOpenStudio/resources/hpxml.rb
+++ b/HPXMLtoOpenStudio/resources/hpxml.rb
@@ -57,10 +57,10 @@ class HPXML < Object
:water_heating, :solar_thermal_systems, :pv_systems, :inverters, :generators,
:batteries, :clothes_washers, :clothes_dryers, :dishwashers, :refrigerators,
:freezers, :dehumidifiers, :cooking_ranges, :ovens, :lighting_groups, :lighting,
- :ceiling_fans, :pools, :hot_tubs, :plug_loads, :fuel_loads]
+ :ceiling_fans, :pools, :permanent_spas, :portable_spas, :plug_loads, :fuel_loads]
attr_reader(*HPXML_ATTRS, :doc, :errors, :warnings, :hpxml_path)
- NameSpace = 'http://hpxmlonline.com/2019/10'
+ NameSpace = 'http://hpxmlonline.com/2023/09'
# Constants
# FUTURE: Move some of these to within child classes (e.g., HPXML::Attic class)
@@ -136,9 +136,10 @@ class HPXML < Object
FloorTypeSIP = 'StructuralInsulatedPanel'
FloorTypeSteelFrame = 'SteelFrame'
FloorTypeConcrete = 'SolidConcrete'
+ FuelLoadTypeFireplace = 'fireplace'
FuelLoadTypeGrill = 'grill'
FuelLoadTypeLighting = 'lighting'
- FuelLoadTypeFireplace = 'fireplace'
+ FuelLoadTypeOther = 'other'
FuelTypeCoal = 'coal'
FuelTypeCoalAnthracite = 'anthracite coal'
FuelTypeCoalBituminous = 'bituminous coal'
@@ -255,9 +256,16 @@ class HPXML < Object
OrientationSoutheast = 'southeast'
OrientationSouthwest = 'southwest'
OrientationWest = 'west'
+ PlugLoadTypeAquarium = 'aquarium'
+ PlugLoadTypeComputer = 'computer'
PlugLoadTypeElectricVehicleCharging = 'electric vehicle charging'
PlugLoadTypeOther = 'other'
+ PlugLoadTypeSauna = 'sauna'
+ PlugLoadTypeSpaceHeater = 'space heater'
PlugLoadTypeTelevision = 'TV other'
+ PlugLoadTypeTelevisionCRT = 'TV CRT'
+ PlugLoadTypeTelevisionPlasma = 'TV plasma'
+ PlugLoadTypeWaterBed = 'water bed'
PlugLoadTypeWellPump = 'well pump'
PVAnnualExcessSellbackRateTypeRetailElectricityCost = 'Retail Electricity Cost'
PVAnnualExcessSellbackRateTypeUserSpecified = 'User-Specified'
@@ -765,7 +773,8 @@ def to_oga()
@ceiling_fans.to_oga(@doc)
@lighting.to_oga(@doc)
@pools.to_oga(@doc)
- @hot_tubs.to_oga(@doc)
+ @permanent_spas.to_oga(@doc)
+ @portable_spas.to_oga(@doc)
@plug_loads.to_oga(@doc)
@fuel_loads.to_oga(@doc)
return @doc
@@ -821,7 +830,8 @@ def from_oga(hpxml)
@ceiling_fans = CeilingFans.new(self, hpxml)
@lighting = Lighting.new(self, hpxml)
@pools = Pools.new(self, hpxml)
- @hot_tubs = HotTubs.new(self, hpxml)
+ @permanent_spas = PermanentSpas.new(self, hpxml)
+ @portable_spas = PortableSpas.new(self, hpxml)
@plug_loads = PlugLoads.new(self, hpxml)
@fuel_loads = FuelLoads.new(self, hpxml)
end
@@ -6482,8 +6492,8 @@ def to_oga(doc)
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(pool, 'Type', @type, :string) unless @type.nil?
if @type != HPXML::TypeNone
- pumps = XMLHelper.add_element(pool, 'PoolPumps')
- pool_pump = XMLHelper.add_element(pumps, 'PoolPump')
+ pumps = XMLHelper.add_element(pool, 'Pumps')
+ pool_pump = XMLHelper.add_element(pumps, 'Pump')
sys_id = XMLHelper.add_element(pool_pump, 'SystemIdentifier')
if not @pump_id.nil?
XMLHelper.add_attribute(sys_id, 'id', @pump_id)
@@ -6527,7 +6537,7 @@ def to_oga(doc)
def from_oga(pool)
@id = HPXML::get_id(pool)
@type = XMLHelper.get_value(pool, 'Type', :string)
- pool_pump = XMLHelper.get_element(pool, 'PoolPumps/PoolPump')
+ pool_pump = XMLHelper.get_element(pool, 'Pumps/Pump')
if not pool_pump.nil?
@pump_id = HPXML::get_id(pool_pump)
@pump_type = XMLHelper.get_value(pool_pump, 'Type', :string)
@@ -6551,21 +6561,21 @@ def from_oga(pool)
end
end
- class HotTubs < BaseArrayElement
+ class PermanentSpas < BaseArrayElement
def add(**kwargs)
- self << HotTub.new(@hpxml_object, **kwargs)
+ self << PermanentSpa.new(@hpxml_object, **kwargs)
end
def from_oga(hpxml)
return if hpxml.nil?
- XMLHelper.get_elements(hpxml, 'Building/BuildingDetails/HotTubs/HotTub').each do |hot_tub|
- self << HotTub.new(@hpxml_object, hot_tub)
+ XMLHelper.get_elements(hpxml, 'Building/BuildingDetails/Spas/PermanentSpa').each do |spa|
+ self << PermanentSpa.new(@hpxml_object, spa)
end
end
end
- class HotTub < BaseElement
+ class PermanentSpa < BaseElement
ATTRS = [:id, :type, :heater_id, :heater_type, :heater_load_units, :heater_load_value, :heater_usage_multiplier,
:pump_id, :pump_type, :pump_kwh_per_year, :pump_usage_multiplier,
:heater_weekday_fractions, :heater_weekend_fractions, :heater_monthly_multipliers,
@@ -6573,7 +6583,7 @@ class HotTub < BaseElement
attr_accessor(*ATTRS)
def delete
- @hpxml_object.hot_tubs.delete(self)
+ @hpxml_object.permanent_spas.delete(self)
end
def check_for_errors
@@ -6584,33 +6594,33 @@ def check_for_errors
def to_oga(doc)
return if nil?
- hot_tubs = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'HotTubs'])
- hot_tub = XMLHelper.add_element(hot_tubs, 'HotTub')
- sys_id = XMLHelper.add_element(hot_tub, 'SystemIdentifier')
+ spas = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Spas'])
+ spa = XMLHelper.add_element(spas, 'PermanentSpa')
+ sys_id = XMLHelper.add_element(spa, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
- XMLHelper.add_element(hot_tub, 'Type', @type, :string) unless @type.nil?
+ XMLHelper.add_element(spa, 'Type', @type, :string) unless @type.nil?
if @type != HPXML::TypeNone
- pumps = XMLHelper.add_element(hot_tub, 'HotTubPumps')
- hot_tub_pump = XMLHelper.add_element(pumps, 'HotTubPump')
- sys_id = XMLHelper.add_element(hot_tub_pump, 'SystemIdentifier')
+ pumps = XMLHelper.add_element(spa, 'Pumps')
+ spa_pump = XMLHelper.add_element(pumps, 'Pump')
+ sys_id = XMLHelper.add_element(spa_pump, 'SystemIdentifier')
if not @pump_id.nil?
XMLHelper.add_attribute(sys_id, 'id', @pump_id)
else
XMLHelper.add_attribute(sys_id, 'id', @id + 'Pump')
end
- XMLHelper.add_element(hot_tub_pump, 'Type', @pump_type, :string)
+ XMLHelper.add_element(spa_pump, 'Type', @pump_type, :string)
if @pump_type != HPXML::TypeNone
if not @pump_kwh_per_year.nil?
- load = XMLHelper.add_element(hot_tub_pump, 'Load')
+ load = XMLHelper.add_element(spa_pump, 'Load')
XMLHelper.add_element(load, 'Units', UnitsKwhPerYear, :string)
XMLHelper.add_element(load, 'Value', @pump_kwh_per_year, :float, @pump_kwh_per_year_isdefaulted)
end
- XMLHelper.add_extension(hot_tub_pump, 'UsageMultiplier', @pump_usage_multiplier, :float, @pump_usage_multiplier_isdefaulted) unless @pump_usage_multiplier.nil?
- XMLHelper.add_extension(hot_tub_pump, 'WeekdayScheduleFractions', @pump_weekday_fractions, :string, @pump_weekday_fractions_isdefaulted) unless @pump_weekday_fractions.nil?
- XMLHelper.add_extension(hot_tub_pump, 'WeekendScheduleFractions', @pump_weekend_fractions, :string, @pump_weekend_fractions_isdefaulted) unless @pump_weekend_fractions.nil?
- XMLHelper.add_extension(hot_tub_pump, 'MonthlyScheduleMultipliers', @pump_monthly_multipliers, :string, @pump_monthly_multipliers_isdefaulted) unless @pump_monthly_multipliers.nil?
+ XMLHelper.add_extension(spa_pump, 'UsageMultiplier', @pump_usage_multiplier, :float, @pump_usage_multiplier_isdefaulted) unless @pump_usage_multiplier.nil?
+ XMLHelper.add_extension(spa_pump, 'WeekdayScheduleFractions', @pump_weekday_fractions, :string, @pump_weekday_fractions_isdefaulted) unless @pump_weekday_fractions.nil?
+ XMLHelper.add_extension(spa_pump, 'WeekendScheduleFractions', @pump_weekend_fractions, :string, @pump_weekend_fractions_isdefaulted) unless @pump_weekend_fractions.nil?
+ XMLHelper.add_extension(spa_pump, 'MonthlyScheduleMultipliers', @pump_monthly_multipliers, :string, @pump_monthly_multipliers_isdefaulted) unless @pump_monthly_multipliers.nil?
end
- heater = XMLHelper.add_element(hot_tub, 'Heater')
+ heater = XMLHelper.add_element(spa, 'Heater')
sys_id = XMLHelper.add_element(heater, 'SystemIdentifier')
if not @heater_id.nil?
XMLHelper.add_attribute(sys_id, 'id', @heater_id)
@@ -6632,20 +6642,20 @@ def to_oga(doc)
end
end
- def from_oga(hot_tub)
- @id = HPXML::get_id(hot_tub)
- @type = XMLHelper.get_value(hot_tub, 'Type', :string)
- hot_tub_pump = XMLHelper.get_element(hot_tub, 'HotTubPumps/HotTubPump')
- if not hot_tub_pump.nil?
- @pump_id = HPXML::get_id(hot_tub_pump)
- @pump_type = XMLHelper.get_value(hot_tub_pump, 'Type', :string)
- @pump_kwh_per_year = XMLHelper.get_value(hot_tub_pump, "Load[Units='#{UnitsKwhPerYear}']/Value", :float)
- @pump_usage_multiplier = XMLHelper.get_value(hot_tub_pump, 'extension/UsageMultiplier', :float)
- @pump_weekday_fractions = XMLHelper.get_value(hot_tub_pump, 'extension/WeekdayScheduleFractions', :string)
- @pump_weekend_fractions = XMLHelper.get_value(hot_tub_pump, 'extension/WeekendScheduleFractions', :string)
- @pump_monthly_multipliers = XMLHelper.get_value(hot_tub_pump, 'extension/MonthlyScheduleMultipliers', :string)
+ def from_oga(spa)
+ @id = HPXML::get_id(spa)
+ @type = XMLHelper.get_value(spa, 'Type', :string)
+ spa_pump = XMLHelper.get_element(spa, 'Pumps/Pump')
+ if not spa_pump.nil?
+ @pump_id = HPXML::get_id(spa_pump)
+ @pump_type = XMLHelper.get_value(spa_pump, 'Type', :string)
+ @pump_kwh_per_year = XMLHelper.get_value(spa_pump, "Load[Units='#{UnitsKwhPerYear}']/Value", :float)
+ @pump_usage_multiplier = XMLHelper.get_value(spa_pump, 'extension/UsageMultiplier', :float)
+ @pump_weekday_fractions = XMLHelper.get_value(spa_pump, 'extension/WeekdayScheduleFractions', :string)
+ @pump_weekend_fractions = XMLHelper.get_value(spa_pump, 'extension/WeekendScheduleFractions', :string)
+ @pump_monthly_multipliers = XMLHelper.get_value(spa_pump, 'extension/MonthlyScheduleMultipliers', :string)
end
- heater = XMLHelper.get_element(hot_tub, 'Heater')
+ heater = XMLHelper.get_element(spa, 'Heater')
if not heater.nil?
@heater_id = HPXML::get_id(heater)
@heater_type = XMLHelper.get_value(heater, 'Type', :string)
@@ -6659,6 +6669,47 @@ def from_oga(hot_tub)
end
end
+ class PortableSpas < BaseArrayElement
+ def add(**kwargs)
+ self << PortableSpa.new(@hpxml_object, **kwargs)
+ end
+
+ def from_oga(hpxml)
+ return if hpxml.nil?
+
+ XMLHelper.get_elements(hpxml, 'Building/BuildingDetails/Spas/PortableSpa').each do |spa|
+ self << PortableSpa.new(@hpxml_object, spa)
+ end
+ end
+ end
+
+ class PortableSpa < BaseElement
+ ATTRS = [:id]
+ attr_accessor(*ATTRS)
+
+ def delete
+ @hpxml_object.portable_spas.delete(self)
+ end
+
+ def check_for_errors
+ errors = []
+ return errors
+ end
+
+ def to_oga(doc)
+ return if nil?
+
+ spas = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Spas'])
+ spa = XMLHelper.add_element(spas, 'PortableSpa')
+ sys_id = XMLHelper.add_element(spa, 'SystemIdentifier')
+ XMLHelper.add_attribute(sys_id, 'id', @id)
+ end
+
+ def from_oga(spa)
+ @id = HPXML::get_id(spa)
+ end
+ end
+
class PlugLoads < BaseArrayElement
def add(**kwargs)
self << PlugLoad.new(@hpxml_object, **kwargs)
@@ -6789,8 +6840,6 @@ def _create_oga_document()
doc = XMLHelper.create_doc('1.0', 'UTF-8')
hpxml = XMLHelper.add_element(doc, 'HPXML')
XMLHelper.add_attribute(hpxml, 'xmlns', NameSpace)
- XMLHelper.add_attribute(hpxml, 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')
- XMLHelper.add_attribute(hpxml, 'xsi:schemaLocation', NameSpace)
XMLHelper.add_attribute(hpxml, 'schemaVersion', Version::HPXML_Version)
return doc
end
diff --git a/HPXMLtoOpenStudio/resources/hpxml_defaults.rb b/HPXMLtoOpenStudio/resources/hpxml_defaults.rb
index 7bce91a419..549d053aab 100644
--- a/HPXMLtoOpenStudio/resources/hpxml_defaults.rb
+++ b/HPXMLtoOpenStudio/resources/hpxml_defaults.rb
@@ -57,7 +57,7 @@ def self.apply(runner, hpxml, eri_version, weather, epw_file: nil, schedules_fil
apply_appliances(hpxml, nbeds, eri_version, schedules_file)
apply_lighting(hpxml, schedules_file)
apply_ceiling_fans(hpxml, nbeds, weather, schedules_file)
- apply_pools_and_hot_tubs(hpxml, cfa, schedules_file)
+ apply_pools_and_permanent_spas(hpxml, cfa, schedules_file)
apply_plug_loads(hpxml, cfa, schedules_file)
apply_fuel_loads(hpxml, cfa, schedules_file)
apply_pv_systems(hpxml)
@@ -2490,7 +2490,7 @@ def self.apply_ceiling_fans(hpxml, nbeds, weather, schedules_file)
end
end
- def self.apply_pools_and_hot_tubs(hpxml, cfa, schedules_file)
+ def self.apply_pools_and_permanent_spas(hpxml, cfa, schedules_file)
nbeds = hpxml.building_construction.additional_properties.adjusted_number_of_bedrooms
hpxml.pools.each do |pool|
next if pool.type == HPXML::TypeNone
@@ -2548,59 +2548,59 @@ def self.apply_pools_and_hot_tubs(hpxml, cfa, schedules_file)
end
end
- hpxml.hot_tubs.each do |hot_tub|
- next if hot_tub.type == HPXML::TypeNone
+ hpxml.permanent_spas.each do |spa|
+ next if spa.type == HPXML::TypeNone
- if hot_tub.pump_type != HPXML::TypeNone
+ if spa.pump_type != HPXML::TypeNone
# Pump
- if hot_tub.pump_kwh_per_year.nil?
- hot_tub.pump_kwh_per_year = MiscLoads.get_hot_tub_pump_default_values(cfa, nbeds)
- hot_tub.pump_kwh_per_year_isdefaulted = true
+ if spa.pump_kwh_per_year.nil?
+ spa.pump_kwh_per_year = MiscLoads.get_permanent_spa_pump_default_values(cfa, nbeds)
+ spa.pump_kwh_per_year_isdefaulted = true
end
- if hot_tub.pump_usage_multiplier.nil?
- hot_tub.pump_usage_multiplier = 1.0
- hot_tub.pump_usage_multiplier_isdefaulted = true
+ if spa.pump_usage_multiplier.nil?
+ spa.pump_usage_multiplier = 1.0
+ spa.pump_usage_multiplier_isdefaulted = true
end
- schedules_file_includes_hot_tub_pump = (schedules_file.nil? ? false : schedules_file.includes_col_name(SchedulesFile::ColumnHotTubPump))
- if hot_tub.pump_weekday_fractions.nil? && !schedules_file_includes_hot_tub_pump
- hot_tub.pump_weekday_fractions = Schedule.HotTubPumpWeekdayFractions
- hot_tub.pump_weekday_fractions_isdefaulted = true
+ schedules_file_includes_permanent_spa_pump = (schedules_file.nil? ? false : schedules_file.includes_col_name(SchedulesFile::ColumnPermanentSpaPump))
+ if spa.pump_weekday_fractions.nil? && !schedules_file_includes_permanent_spa_pump
+ spa.pump_weekday_fractions = Schedule.PermanentSpaPumpWeekdayFractions
+ spa.pump_weekday_fractions_isdefaulted = true
end
- if hot_tub.pump_weekend_fractions.nil? && !schedules_file_includes_hot_tub_pump
- hot_tub.pump_weekend_fractions = Schedule.HotTubPumpWeekendFractions
- hot_tub.pump_weekend_fractions_isdefaulted = true
+ if spa.pump_weekend_fractions.nil? && !schedules_file_includes_permanent_spa_pump
+ spa.pump_weekend_fractions = Schedule.PermanentSpaPumpWeekendFractions
+ spa.pump_weekend_fractions_isdefaulted = true
end
- if hot_tub.pump_monthly_multipliers.nil? && !schedules_file_includes_hot_tub_pump
- hot_tub.pump_monthly_multipliers = Schedule.HotTubPumpMonthlyMultipliers
- hot_tub.pump_monthly_multipliers_isdefaulted = true
+ if spa.pump_monthly_multipliers.nil? && !schedules_file_includes_permanent_spa_pump
+ spa.pump_monthly_multipliers = Schedule.PermanentSpaPumpMonthlyMultipliers
+ spa.pump_monthly_multipliers_isdefaulted = true
end
end
- next unless hot_tub.heater_type != HPXML::TypeNone
+ next unless spa.heater_type != HPXML::TypeNone
# Heater
- if hot_tub.heater_load_value.nil?
- default_heater_load_units, default_heater_load_value = MiscLoads.get_hot_tub_heater_default_values(cfa, nbeds, hot_tub.heater_type)
- hot_tub.heater_load_units = default_heater_load_units
- hot_tub.heater_load_value = default_heater_load_value
- hot_tub.heater_load_value_isdefaulted = true
- end
- if hot_tub.heater_usage_multiplier.nil?
- hot_tub.heater_usage_multiplier = 1.0
- hot_tub.heater_usage_multiplier_isdefaulted = true
- end
- schedules_file_includes_hot_tub_heater = (schedules_file.nil? ? false : schedules_file.includes_col_name(SchedulesFile::ColumnHotTubHeater))
- if hot_tub.heater_weekday_fractions.nil? && !schedules_file_includes_hot_tub_heater
- hot_tub.heater_weekday_fractions = Schedule.HotTubHeaterWeekdayFractions
- hot_tub.heater_weekday_fractions_isdefaulted = true
- end
- if hot_tub.heater_weekend_fractions.nil? && !schedules_file_includes_hot_tub_heater
- hot_tub.heater_weekend_fractions = Schedule.HotTubHeaterWeekendFractions
- hot_tub.heater_weekend_fractions_isdefaulted = true
- end
- if hot_tub.heater_monthly_multipliers.nil? && !schedules_file_includes_hot_tub_heater
- hot_tub.heater_monthly_multipliers = Schedule.HotTubHeaterMonthlyMultipliers
- hot_tub.heater_monthly_multipliers_isdefaulted = true
+ if spa.heater_load_value.nil?
+ default_heater_load_units, default_heater_load_value = MiscLoads.get_permanent_spa_heater_default_values(cfa, nbeds, spa.heater_type)
+ spa.heater_load_units = default_heater_load_units
+ spa.heater_load_value = default_heater_load_value
+ spa.heater_load_value_isdefaulted = true
+ end
+ if spa.heater_usage_multiplier.nil?
+ spa.heater_usage_multiplier = 1.0
+ spa.heater_usage_multiplier_isdefaulted = true
+ end
+ schedules_file_includes_permanent_spa_heater = (schedules_file.nil? ? false : schedules_file.includes_col_name(SchedulesFile::ColumnPermanentSpaHeater))
+ if spa.heater_weekday_fractions.nil? && !schedules_file_includes_permanent_spa_heater
+ spa.heater_weekday_fractions = Schedule.PermanentSpaHeaterWeekdayFractions
+ spa.heater_weekday_fractions_isdefaulted = true
+ end
+ if spa.heater_weekend_fractions.nil? && !schedules_file_includes_permanent_spa_heater
+ spa.heater_weekend_fractions = Schedule.PermanentSpaHeaterWeekendFractions
+ spa.heater_weekend_fractions_isdefaulted = true
+ end
+ if spa.heater_monthly_multipliers.nil? && !schedules_file_includes_permanent_spa_heater
+ spa.heater_monthly_multipliers = Schedule.PermanentSpaHeaterMonthlyMultipliers
+ spa.heater_monthly_multipliers_isdefaulted = true
end
end
end
diff --git a/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd b/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd
index f13f2ad658..cf825dc0af 100644
--- a/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd
+++ b/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd
@@ -1,4 +1,4 @@
-
+
@@ -1081,6 +1081,8 @@
+
+
@@ -1187,6 +1189,8 @@
+
+
@@ -2537,196 +2541,128 @@
-
+
-
+
+
+
+ Indicates if the pool or spa is above or below ground.
+
+
+
+
+ [gal] Volume of pool or spa.
+
+
+
+
+ Months per year pool or spa is in operation.
+
+
+
+
+ [in]
+
+
+
+
+ [in]
+
+
+
+
+ Type of filter used, if any.
+
+
+
-
-
-
- Indicates if the pool is above or below ground.
-
-
-
-
- [gal] Volume of pool.
-
-
-
-
- Months per year pool is in operation.
-
-
-
-
- [in]
-
-
-
+
- [in]
-
-
-
-
- Type of filter used, if any.
+ Pool or spa pump: a mechanical assembly consisting of a “wet-end,” which houses the impeller and a motor. The pump increases the “head” and “flow” of the water (ENERGY STAR, 2013).
-
-
-
+
+
+
+
+
+ Manufacturer of pool or spa pump.
+
+
+
+
+ Serial number of pool or spa pump.
+
+
+
+
+ Model number of pool or spa pump.
+
+
+
+
+ Independent organization has verified that product or appliance meets or exceeds the standard in question (ENERGY STAR, CEE, or other)
+
+
+
+
+ [gal/Wh] The measure of overall pool or spa filter pump efficiency in units of gallons per watt-hour, as determined using the applicable test method in Section 4.1.2. Energy factor is analogous to other energy factors such as miles per gallon. Energy factor (EF) is calculated as: EF (gal/Wh) = flow rate (gpm) * 60 ÷ power (watts) (ANSI/APSP/ICC-15 2011).
+
+
+
+
+ The speed setting at which the Energy Factor was measured (ENERGY STAR, 2013).
+
+
+
- Pool pump: a mechanical assembly consisting of a “wet-end,” which houses the impeller and a motor. The pump increases the “head” and
- “flow” of the water (ENERGY STAR, 2013).
+ The motor power output designed by the manufacturer for a rated RPM, voltage and frequency. May be less than total horsepower where the service factor is greater than 1.0, or equal to total horsepower where the service factor = 1.0 (ANSI/APSP/ICC-15 2011).
+
+
+
+ The total horsepower, or product of the rated horsepower and the service factor of a motor used on a pool or spa pump (also known as SFHP) based on the maximum continuous duty motor power output rating allowable for the nameplate ambient rating and motor insulation class (e.g., total horsepower = rated horsepower * service factor) (ANSI/APSP/ICC-15 2011).
+
+
+
+
+ A multiplier applied to the rated horsepower of a pump motor to indicate the percent above nameplate horsepower at which the motor can operate continuously without exceeding its allowable insulation class temperature limit, provided that other design parameters, such rated voltage, frequency and ambient temperature, are within limits. A 1.5 hp pump with a 1.65 service factor produces 2.475 hp (total horsepower) at the maximum service factor point (ANSI/APSP/ICC-15 2011).
+
+
+
-
-
-
-
-
- Manufacturer of pool pump.
-
-
-
-
- Serial number of pool pump.
-
-
-
-
- Model number of pool pump.
-
-
-
-
- Independent organization has verified that product or appliance meets or exceeds the standard in question (ENERGY STAR, CEE,
- or other)
-
-
-
+
- [gal/Wh] The measure of overall pool filter pump efficiency in units of gallons per watt-hour, as determined using the
- applicable test method in Section 4.1.2. Energy factor is analogous to other energy factors such as miles per gallon. Energy factor (EF) is
- calculated as: EF (gal/Wh) = flow rate (gpm) * 60 ÷ power (watts) (ANSI/APSP/ICC-15 2011).
-
-
-
-
- The speed setting at which the Energy Factor was measured (ENERGY STAR, 2013).
+ [W]
-
+
- The motor power output designed by the manufacturer for a rated RPM, voltage and frequency. May be less than total horsepower
- where the service factor is greater than 1.0, or equal to total horsepower where the service factor = 1.0 (ANSI/APSP/ICC-15
- 2011).
+ [Rev/min] The number of revolutions of the motor shaft in a given unit of time, expressed as revolutions per minute (RPM) (ENERGY STAR, 2013).
-
+
- The total horsepower, or product of the rated horsepower and the service factor of a motor used on a pool pump (also known as
- SFHP) based on the maximum continuous duty motor power output rating allowable for the nameplate ambient rating and motor insulation class
- (e.g., total horsepower = rated horsepower * service factor) (ANSI/APSP/ICC-15 2011).
+ [gal/min] The volume of water flowing through the filtration system in a given time, usually measured in gallons per minute (gpm) (ANSI/APSP/ICC-15 2011).
-
+
- A multiplier applied to the rated horsepower of a pump motor to indicate the percent above nameplate horsepower at which the
- motor can operate continuously without exceeding its allowable insulation class temperature limit, provided that other design parameters,
- such rated voltage, frequency and ambient temperature, are within limits. A 1.5 hp pump with a 1.65 service factor produces 2.475 hp (total
- horsepower) at the maximum service factor point (ANSI/APSP/ICC-15 2011).
+ [hours] Number of hours per day a pool pump operates at a particular speed setting.
-
-
-
-
-
- [W]
-
-
-
-
- [Rev/min] The number of revolutions of the motor shaft in a given unit of time, expressed as revolutions per
- minute (RPM) (ENERGY STAR, 2013).
-
-
-
-
- [gal/min] The volume of water flowing through the filtration system in a given time, usually measured in gallons
- per minute (gpm) (ANSI/APSP/ICC-15 2011).
-
-
-
-
- [hours] Number of hours per day a pool pump operates at a particular speed setting.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Type of pool cleaner used, if any.
-
-
-
-
- Hours per day pool cleaner is used.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Type of heater used to heat pool, if any.
-
-
-
-
- Hours per day pool heater is used.
-
-
-
+
@@ -2736,211 +2672,51 @@
-
-
-
-
-
-
-
+
-
-
- Indicates if the hot tub is above or below ground.
-
-
-
-
- [gal] Volume of hot tub.
-
-
-
+
+
- Months per year hot tub is in operation.
+ Type of pool or spa cleaner used, if any.
-
+
- [in]
+ Hours per day pool or spa cleaner is used.
-
+
+
+
+
+
+
+
+
+
+
+
- [in]
+ Type of heater used to heat pool or spa, if any.
-
+
- Type of filter used, if any.
+ Hours per day pool or spa heater is used.
-
-
-
-
-
- Pool pump: a mechanical assembly consisting of a “wet-end,” which houses the impeller and a motor. The pump increases the “head” and
- “flow” of the water (ENERGY STAR, 2013).
-
-
-
-
-
-
-
-
- Manufacturer of hot tub pump.
-
-
-
-
- Serial number of hot tub pump.
-
-
-
-
- Model number of hot tub pump.
-
-
-
-
- Independent organization has verified that product or appliance meets or exceeds the standard in question (ENERGY STAR, CEE,
- or other)
-
-
-
-
- [gal/Wh] The measure of overall hot tub filter pump efficiency in units of gallons per watt-hour, as determined using the
- applicable test method in Section 4.1.2. Energy factor is analogous to other energy factors such as miles per gallon. Energy factor (EF) is
- calculated as: EF (gal/Wh) = flow rate (gpm) * 60 ÷ power (watts) (ANSI/APSP/ICC-15 2011).
-
-
-
-
- The speed setting at which the Energy Factor was measured (ENERGY STAR, 2013).
-
-
-
-
- The motor power output designed by the manufacturer for a rated RPM, voltage and frequency. May be less than total horsepower
- where the service factor is greater than 1.0, or equal to total horsepower where the service factor = 1.0 (ANSI/APSP/ICC-15
- 2011).
-
-
-
-
- The total horsepower, or product of the rated horsepower and the service factor of a motor used on a hot tub pump (also known as
- SFHP) based on the maximum continuous duty motor power output rating allowable for the nameplate ambient rating and motor insulation class
- (e.g., total horsepower = rated horsepower * service factor) (ANSI/APSP/ICC-15 2011).
-
-
-
-
- A multiplier applied to the rated horsepower of a pump motor to indicate the percent above nameplate horsepower at which the
- motor can operate continuously without exceeding its allowable insulation class temperature limit, provided that other design parameters,
- such rated voltage, frequency and ambient temperature, are within limits. A 1.5 hp pump with a 1.65 service factor produces 2.475 hp (total
- horsepower) at the maximum service factor point (ANSI/APSP/ICC-15 2011).
-
-
-
-
-
-
-
- [W]
-
-
-
-
- [Rev/min] The number of revolutions of the motor shaft in a given unit of time, expressed as revolutions per
- minute (RPM) (ENERGY STAR, 2013).
-
-
-
-
- [gal/min] The volume of water flowing through the filtration system in a given time, usually measured in gallons
- per minute (gpm) (ANSI/APSP/ICC-15 2011).
-
-
-
-
- [hours] Number of hours per day a pool pump operates at a particular speed setting.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Type of hot tub cleaner used, if any.
-
-
-
-
- Hours per day hot tub cleaner is used.
-
-
-
-
-
-
-
-
+
-
-
-
-
- Type of heater used to heat hot tub, if any.
-
-
-
-
- Hours per day hot tub heater is used.
-
-
-
-
-
-
-
-
-
-
-
+
+
-
@@ -2951,6 +2727,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4624,7 +4416,85 @@
-
+
+
+
+
+
+ A permanently constructed spa where piping and equipment are an integral part of the structure, and not intended to be moved.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A factory-built electric spa or hot tub, supplied with piping and equipment for temperature-controlled circulated water at the time of sale or sold separately for subsequent attachment.
+
+
+
+
+
+
+
+
+ Number of people
+
+
+
+
+ [gal] Rated volume of portable spa
+
+
+
+
+ [W] Standby Power as measured by ANSI/APSP/ICC-14
+
+
+
+
+ [W] Maximum standby power allowed for this size spa under ANSI/APSP/ICC-14
+
+
+
+
+ [kWh] Total annual power consumption in standby mode, based on test procedure in ANSI/APSP/ICC-14. Typically standby power * 8760.
+
+
+
+
+
+
+
+
+
+
+
+
+ Months per year portable spa is in operation.
+
+
+
+
+ Type of filter used, if any.
+
+
+
+
+
+
+
+
+
+
+
@@ -7938,7 +7808,6 @@
-
diff --git a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml
index 2c02fee958..102f587498 100644
--- a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml
+++ b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml
@@ -1,7 +1,7 @@
HPXML Schematron Validator: EnergyPlus Simulation
-
+
[Root]
@@ -261,7 +261,7 @@
Expected 0 or 1 element(s) for xpath: Lighting
Expected 0 or 1 element(s) for xpath: Lighting/CeilingFan
Expected 0 or 1 element(s) for xpath: Pools/Pool
- Expected 0 or 1 element(s) for xpath: HotTubs/HotTub
+ Expected 0 or 1 element(s) for xpath: Spas/PermanentSpa
Expected 1 element(s) for xpath: MiscLoads/PlugLoad[PlugLoadType[text()="other"]]
Expected 0 or 1 element(s) for xpath: MiscLoads/PlugLoad[PlugLoadType[text()="TV other"]]
Expected 0 or 1 element(s) for xpath: MiscLoads/PlugLoad[PlugLoadType[text()="electric vehicle charging"]]
@@ -289,6 +289,15 @@
No interior lighting specified, the model will not include interior lighting energy use.
No exterior lighting specified, the model will not include exterior lighting energy use.
No garage lighting specified, the model will not include garage lighting energy use.
+ Plug load type 'sauna' is not currently handled, the plug load will not be modeled.
+ Plug load type 'aquarium' is not currently handled, the plug load will not be modeled.
+ Plug load type 'water bed' is not currently handled, the plug load will not be modeled.
+ Plug load type 'space heater' is not currently handled, the plug load will not be modeled.
+ Plug load type 'computer' is not currently handled, the plug load will not be modeled.
+ Plug load type 'TV CRT' is not currently handled, the plug load will not be modeled.
+ Plug load type 'TV plasma' is not currently handled, the plug load will not be modeled.
+ Fuel load type 'other' is not currently handled, the fuel load will not be modeled.
+ Portable spa is not currently handled, the portable spa will not be modeled.
@@ -2123,14 +2132,14 @@
[Pool]
Expected 1 element(s) for xpath: Type
- Expected 0 or 1 element(s) for xpath: PoolPumps/PoolPump
+ Expected 0 or 1 element(s) for xpath: Pumps/Pump
Expected 0 or 1 element(s) for xpath: Heater
[PoolPump]
-
+
Expected 1 element(s) for xpath: Type
Expected 0 or 1 element(s) for xpath: Load[Units="kWh/year"]/Value
Expected 0 or 1 element(s) for xpath: extension/UsageMultiplier
@@ -2154,17 +2163,17 @@
- [HotTub]
-
+ [PermanentSpa]
+
Expected 1 element(s) for xpath: Type
- Expected 0 or 1 element(s) for xpath: HotTubPumps/HotTubPump
- Expected 0 or 1 element(s) for xpath: Heater
+ Expected 0 or 1 element(s) for xpath: Pumps/Pump
+ Expected 0 or 1 element(s) for xpath: Heater
- [HotTubPump]
-
+ [PermanentSpaPump]
+
Expected 1 element(s) for xpath: Type
Expected 0 or 1 element(s) for xpath: Load[Units="kWh/year"]/Value
Expected 0 or 1 element(s) for xpath: extension/UsageMultiplier
@@ -2173,10 +2182,10 @@
Expected 0 or 1 element(s) for xpath: extension/MonthlyScheduleMultipliers
-
+
- [HotTubHeater]
-
+ [PermanentSpaHeater]
+
Expected 1 element(s) for xpath: Type
Expected Type to be 'gas fired' or 'electric resistance' or 'heat pump'
Expected 0 or 1 element(s) for xpath: Load[Units="kWh/year" or Units="therm/year"]/Value
diff --git a/HPXMLtoOpenStudio/resources/misc_loads.rb b/HPXMLtoOpenStudio/resources/misc_loads.rb
index 8ef17754ed..9fc795ded9 100644
--- a/HPXMLtoOpenStudio/resources/misc_loads.rb
+++ b/HPXMLtoOpenStudio/resources/misc_loads.rb
@@ -110,31 +110,31 @@ def self.apply_fuel(model, runner, fuel_load, obj_name, living_space, schedules_
mfl.setSchedule(sch)
end
- def self.apply_pool_or_hot_tub_heater(runner, model, pool_or_hot_tub, obj_name, living_space, schedules_file, unavailable_periods)
- return if pool_or_hot_tub.heater_type == HPXML::TypeNone
+ def self.apply_pool_or_permanent_spa_heater(runner, model, pool_or_spa, obj_name, living_space, schedules_file, unavailable_periods)
+ return if pool_or_spa.heater_type == HPXML::TypeNone
heater_kwh = 0
heater_therm = 0
# Create schedule
heater_sch = nil
- col_name = (obj_name.include?('pool') ? 'pool_heater' : 'hot_tub_heater')
+ col_name = (obj_name.include?('pool') ? 'pool_heater' : 'permanent_spa_heater')
if not schedules_file.nil?
heater_sch = schedules_file.create_schedule_file(col_name: col_name)
end
if heater_sch.nil?
col_unavailable_periods = Schedule.get_unavailable_periods(runner, col_name, unavailable_periods)
- heater_sch = MonthWeekdayWeekendSchedule.new(model, obj_name + ' schedule', pool_or_hot_tub.heater_weekday_fractions, pool_or_hot_tub.heater_weekend_fractions, pool_or_hot_tub.heater_monthly_multipliers, Constants.ScheduleTypeLimitsFraction, unavailable_periods: col_unavailable_periods)
+ heater_sch = MonthWeekdayWeekendSchedule.new(model, obj_name + ' schedule', pool_or_spa.heater_weekday_fractions, pool_or_spa.heater_weekend_fractions, pool_or_spa.heater_monthly_multipliers, Constants.ScheduleTypeLimitsFraction, unavailable_periods: col_unavailable_periods)
else
- runner.registerWarning("Both '#{col_name}' schedule file and weekday fractions provided; the latter will be ignored.") if !pool_or_hot_tub.heater_weekday_fractions.nil?
- runner.registerWarning("Both '#{col_name}' schedule file and weekend fractions provided; the latter will be ignored.") if !pool_or_hot_tub.heater_weekend_fractions.nil?
- runner.registerWarning("Both '#{col_name}' schedule file and monthly multipliers provided; the latter will be ignored.") if !pool_or_hot_tub.heater_monthly_multipliers.nil?
+ runner.registerWarning("Both '#{col_name}' schedule file and weekday fractions provided; the latter will be ignored.") if !pool_or_spa.heater_weekday_fractions.nil?
+ runner.registerWarning("Both '#{col_name}' schedule file and weekend fractions provided; the latter will be ignored.") if !pool_or_spa.heater_weekend_fractions.nil?
+ runner.registerWarning("Both '#{col_name}' schedule file and monthly multipliers provided; the latter will be ignored.") if !pool_or_spa.heater_monthly_multipliers.nil?
end
- if pool_or_hot_tub.heater_load_units == HPXML::UnitsKwhPerYear
- heater_kwh = pool_or_hot_tub.heater_load_value * pool_or_hot_tub.heater_usage_multiplier
- elsif pool_or_hot_tub.heater_load_units == HPXML::UnitsThermPerYear
- heater_therm = pool_or_hot_tub.heater_load_value * pool_or_hot_tub.heater_usage_multiplier
+ if pool_or_spa.heater_load_units == HPXML::UnitsKwhPerYear
+ heater_kwh = pool_or_spa.heater_load_value * pool_or_spa.heater_usage_multiplier
+ elsif pool_or_spa.heater_load_units == HPXML::UnitsThermPerYear
+ heater_therm = pool_or_spa.heater_load_value * pool_or_spa.heater_usage_multiplier
end
if heater_kwh > 0
@@ -183,26 +183,26 @@ def self.apply_pool_or_hot_tub_heater(runner, model, pool_or_hot_tub, obj_name,
end
end
- def self.apply_pool_or_hot_tub_pump(runner, model, pool_or_hot_tub, obj_name, living_space, schedules_file, unavailable_periods)
+ def self.apply_pool_or_permanent_spa_pump(runner, model, pool_or_spa, obj_name, living_space, schedules_file, unavailable_periods)
pump_kwh = 0
# Create schedule
pump_sch = nil
- col_name = (obj_name.include?('pool') ? 'pool_pump' : 'hot_tub_pump')
+ col_name = (obj_name.include?('pool') ? 'pool_pump' : 'permanent_spa_pump')
if not schedules_file.nil?
pump_sch = schedules_file.create_schedule_file(col_name: col_name)
end
if pump_sch.nil?
col_unavailable_periods = Schedule.get_unavailable_periods(runner, col_name, unavailable_periods)
- pump_sch = MonthWeekdayWeekendSchedule.new(model, obj_name + ' schedule', pool_or_hot_tub.pump_weekday_fractions, pool_or_hot_tub.pump_weekend_fractions, pool_or_hot_tub.pump_monthly_multipliers, Constants.ScheduleTypeLimitsFraction, unavailable_periods: col_unavailable_periods)
+ pump_sch = MonthWeekdayWeekendSchedule.new(model, obj_name + ' schedule', pool_or_spa.pump_weekday_fractions, pool_or_spa.pump_weekend_fractions, pool_or_spa.pump_monthly_multipliers, Constants.ScheduleTypeLimitsFraction, unavailable_periods: col_unavailable_periods)
else
- runner.registerWarning("Both '#{col_name}' schedule file and weekday fractions provided; the latter will be ignored.") if !pool_or_hot_tub.pump_weekday_fractions.nil?
- runner.registerWarning("Both '#{col_name}' schedule file and weekend fractions provided; the latter will be ignored.") if !pool_or_hot_tub.pump_weekend_fractions.nil?
- runner.registerWarning("Both '#{col_name}' schedule file and monthly multipliers provided; the latter will be ignored.") if !pool_or_hot_tub.pump_monthly_multipliers.nil?
+ runner.registerWarning("Both '#{col_name}' schedule file and weekday fractions provided; the latter will be ignored.") if !pool_or_spa.pump_weekday_fractions.nil?
+ runner.registerWarning("Both '#{col_name}' schedule file and weekend fractions provided; the latter will be ignored.") if !pool_or_spa.pump_weekend_fractions.nil?
+ runner.registerWarning("Both '#{col_name}' schedule file and monthly multipliers provided; the latter will be ignored.") if !pool_or_spa.pump_monthly_multipliers.nil?
end
- if not pool_or_hot_tub.pump_kwh_per_year.nil?
- pump_kwh = pool_or_hot_tub.pump_kwh_per_year * pool_or_hot_tub.pump_usage_multiplier
+ if not pool_or_spa.pump_kwh_per_year.nil?
+ pump_kwh = pool_or_spa.pump_kwh_per_year * pool_or_spa.pump_usage_multiplier
end
if pump_kwh > 0
@@ -266,11 +266,11 @@ def self.get_pool_heater_default_values(cfa, nbeds, type)
return load_units, load_value
end
- def self.get_hot_tub_pump_default_values(cfa, nbeds)
+ def self.get_permanent_spa_pump_default_values(cfa, nbeds)
return 59.5 / 0.059 * (0.5 + 0.25 * nbeds / 3.0 + 0.25 * cfa / 1920.0) # kWh/yr
end
- def self.get_hot_tub_heater_default_values(cfa, nbeds, type)
+ def self.get_permanent_spa_heater_default_values(cfa, nbeds, type)
load_units = nil
load_value = nil
if [HPXML::HeaterTypeElectricResistance, HPXML::HeaterTypeHeatPump].include? type
diff --git a/HPXMLtoOpenStudio/resources/output.rb b/HPXMLtoOpenStudio/resources/output.rb
index 5bf05bc91d..7f20d51282 100644
--- a/HPXMLtoOpenStudio/resources/output.rb
+++ b/HPXMLtoOpenStudio/resources/output.rb
@@ -49,8 +49,8 @@ class EUT
WellPump = 'Well Pump'
PoolHeater = 'Pool Heater'
PoolPump = 'Pool Pump'
- HotTubHeater = 'Hot Tub Heater'
- HotTubPump = 'Hot Tub Pump'
+ PermanentSpaHeater = 'Permanent Spa Heater'
+ PermanentSpaPump = 'Permanent Spa Pump'
Grill = 'Grill'
Lighting = 'Lighting'
Fireplace = 'Fireplace'
diff --git a/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv b/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv
index a530858df0..f18bf8d678 100644
--- a/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv
+++ b/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv
@@ -1,4 +1,4 @@
-lighting_exterior,lighting_exterior_holiday,refrigerator,extra_refrigerator,freezer,plug_loads_vehicle,plug_loads_well_pump,fuel_loads_grill,fuel_loads_lighting,fuel_loads_fireplace,pool_pump,pool_heater,hot_tub_pump,hot_tub_heater
+lighting_exterior,lighting_exterior_holiday,refrigerator,extra_refrigerator,freezer,plug_loads_vehicle,plug_loads_well_pump,fuel_loads_grill,fuel_loads_lighting,fuel_loads_fireplace,pool_pump,pool_heater,permanent_spa_pump,permanent_spa_heater
0.559,0,0.611,0.611,0.611,1,0.509,0.0248,0.509,0.509,0.0235,0.0235,0.151,0.145
0.517,0,0.596,0.596,0.596,1,0.266,0.00621,0.266,0.266,0.0235,0.0235,0.183,0.176
0.517,0,0.58,0.58,0.58,1,0.22,0.00621,0.22,0.22,0.0235,0.0235,0.151,0.145
diff --git a/HPXMLtoOpenStudio/resources/schedules.rb b/HPXMLtoOpenStudio/resources/schedules.rb
index b904168ec6..7f9bc4979d 100644
--- a/HPXMLtoOpenStudio/resources/schedules.rb
+++ b/HPXMLtoOpenStudio/resources/schedules.rb
@@ -1098,27 +1098,27 @@ def self.PoolHeaterMonthlyMultipliers
return '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154'
end
- def self.HotTubPumpWeekdayFractions
+ def self.PermanentSpaPumpWeekdayFractions
return '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
end
- def self.HotTubPumpWeekendFractions
+ def self.PermanentSpaPumpWeekendFractions
return '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
end
- def self.HotTubPumpMonthlyMultipliers
+ def self.PermanentSpaPumpMonthlyMultipliers
return '0.921, 0.928, 0.921, 0.915, 0.921, 1.160, 1.158, 1.158, 1.160, 0.921, 0.915, 0.921'
end
- def self.HotTubHeaterWeekdayFractions
+ def self.PermanentSpaHeaterWeekdayFractions
return '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
end
- def self.HotTubHeaterWeekendFractions
+ def self.PermanentSpaHeaterWeekendFractions
return '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
end
- def self.HotTubHeaterMonthlyMultipliers
+ def self.PermanentSpaHeaterMonthlyMultipliers
return '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837'
end
@@ -1353,8 +1353,8 @@ class SchedulesFile
ColumnFuelLoadsFireplace = 'fuel_loads_fireplace'
ColumnPoolPump = 'pool_pump'
ColumnPoolHeater = 'pool_heater'
- ColumnHotTubPump = 'hot_tub_pump'
- ColumnHotTubHeater = 'hot_tub_heater'
+ ColumnPermanentSpaPump = 'permanent_spa_pump'
+ ColumnPermanentSpaHeater = 'permanent_spa_heater'
ColumnHotWaterDishwasher = 'hot_water_dishwasher'
ColumnHotWaterClothesWasher = 'hot_water_clothes_washer'
ColumnHotWaterFixtures = 'hot_water_fixtures'
@@ -1749,8 +1749,8 @@ def self.OccupancyColumnNames
ColumnFuelLoadsFireplace,
ColumnPoolPump,
ColumnPoolHeater,
- ColumnHotTubPump,
- ColumnHotTubHeater,
+ ColumnPermanentSpaPump,
+ ColumnPermanentSpaHeater,
ColumnHotWaterDishwasher,
ColumnHotWaterClothesWasher,
ColumnHotWaterFixtures
diff --git a/HPXMLtoOpenStudio/tests/test_defaults.rb b/HPXMLtoOpenStudio/tests/test_defaults.rb
index 9ad27ea3c4..90bd63a628 100644
--- a/HPXMLtoOpenStudio/tests/test_defaults.rb
+++ b/HPXMLtoOpenStudio/tests/test_defaults.rb
@@ -3273,62 +3273,62 @@ def test_pools
_test_default_pool_pump_values(hpxml_default.pools[0], 2496, 1.0, Schedule.PoolPumpWeekdayFractions, Schedule.PoolPumpWeekendFractions, Schedule.PoolPumpMonthlyMultipliers)
end
- def test_hot_tubs
+ def test_permanent_spas
# Test inputs not overridden by defaults
hpxml = _create_hpxml('base-misc-loads-large-uncommon.xml')
- hot_tub = hpxml.hot_tubs[0]
- hot_tub.heater_load_units = HPXML::UnitsThermPerYear
- hot_tub.heater_load_value = 1000
- hot_tub.heater_usage_multiplier = 0.8
- hot_tub.heater_weekday_fractions = ConstantDaySchedule
- hot_tub.heater_weekend_fractions = ConstantDaySchedule
- hot_tub.heater_monthly_multipliers = ConstantMonthSchedule
- hot_tub.pump_kwh_per_year = 3000
- hot_tub.pump_usage_multiplier = 0.7
- hot_tub.pump_weekday_fractions = ConstantDaySchedule
- hot_tub.pump_weekend_fractions = ConstantDaySchedule
- hot_tub.pump_monthly_multipliers = ConstantMonthSchedule
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
- hpxml_default = _test_measure()
- _test_default_hot_tub_heater_values(hpxml_default.hot_tubs[0], HPXML::UnitsThermPerYear, 1000, 0.8, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
- _test_default_hot_tub_pump_values(hpxml_default.hot_tubs[0], 3000, 0.7, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
+ spa = hpxml.permanent_spas[0]
+ spa.heater_load_units = HPXML::UnitsThermPerYear
+ spa.heater_load_value = 1000
+ spa.heater_usage_multiplier = 0.8
+ spa.heater_weekday_fractions = ConstantDaySchedule
+ spa.heater_weekend_fractions = ConstantDaySchedule
+ spa.heater_monthly_multipliers = ConstantMonthSchedule
+ spa.pump_kwh_per_year = 3000
+ spa.pump_usage_multiplier = 0.7
+ spa.pump_weekday_fractions = ConstantDaySchedule
+ spa.pump_weekend_fractions = ConstantDaySchedule
+ spa.pump_monthly_multipliers = ConstantMonthSchedule
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
+ hpxml_default = _test_measure()
+ _test_default_permanent_spa_heater_values(hpxml_default.permanent_spas[0], HPXML::UnitsThermPerYear, 1000, 0.8, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
+ _test_default_permanent_spa_pump_values(hpxml_default.permanent_spas[0], 3000, 0.7, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
# Test defaults
- hot_tub = hpxml.hot_tubs[0]
- hot_tub.heater_load_units = nil
- hot_tub.heater_load_value = nil
- hot_tub.heater_usage_multiplier = nil
- hot_tub.heater_weekday_fractions = nil
- hot_tub.heater_weekend_fractions = nil
- hot_tub.heater_monthly_multipliers = nil
- hot_tub.pump_kwh_per_year = nil
- hot_tub.pump_usage_multiplier = nil
- hot_tub.pump_weekday_fractions = nil
- hot_tub.pump_weekend_fractions = nil
- hot_tub.pump_monthly_multipliers = nil
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
- hpxml_default = _test_measure()
- _test_default_hot_tub_heater_values(hpxml_default.hot_tubs[0], HPXML::UnitsKwhPerYear, 1125, 1.0, Schedule.HotTubHeaterWeekdayFractions, Schedule.HotTubHeaterWeekendFractions, Schedule.HotTubHeaterMonthlyMultipliers)
- _test_default_hot_tub_pump_values(hpxml_default.hot_tubs[0], 1111, 1.0, Schedule.HotTubPumpWeekdayFractions, Schedule.HotTubPumpWeekendFractions, Schedule.HotTubPumpMonthlyMultipliers)
+ spa = hpxml.permanent_spas[0]
+ spa.heater_load_units = nil
+ spa.heater_load_value = nil
+ spa.heater_usage_multiplier = nil
+ spa.heater_weekday_fractions = nil
+ spa.heater_weekend_fractions = nil
+ spa.heater_monthly_multipliers = nil
+ spa.pump_kwh_per_year = nil
+ spa.pump_usage_multiplier = nil
+ spa.pump_weekday_fractions = nil
+ spa.pump_weekend_fractions = nil
+ spa.pump_monthly_multipliers = nil
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
+ hpxml_default = _test_measure()
+ _test_default_permanent_spa_heater_values(hpxml_default.permanent_spas[0], HPXML::UnitsKwhPerYear, 1125, 1.0, Schedule.PermanentSpaHeaterWeekdayFractions, Schedule.PermanentSpaHeaterWeekendFractions, Schedule.PermanentSpaHeaterMonthlyMultipliers)
+ _test_default_permanent_spa_pump_values(hpxml_default.permanent_spas[0], 1111, 1.0, Schedule.PermanentSpaPumpWeekdayFractions, Schedule.PermanentSpaPumpWeekendFractions, Schedule.PermanentSpaPumpMonthlyMultipliers)
# Test defaults 2
hpxml = _create_hpxml('base-misc-loads-large-uncommon2.xml')
- hot_tub = hpxml.hot_tubs[0]
- hot_tub.heater_load_units = nil
- hot_tub.heater_load_value = nil
- hot_tub.heater_usage_multiplier = nil
- hot_tub.heater_weekday_fractions = nil
- hot_tub.heater_weekend_fractions = nil
- hot_tub.heater_monthly_multipliers = nil
- hot_tub.pump_kwh_per_year = nil
- hot_tub.pump_usage_multiplier = nil
- hot_tub.pump_weekday_fractions = nil
- hot_tub.pump_weekend_fractions = nil
- hot_tub.pump_monthly_multipliers = nil
+ spa = hpxml.permanent_spas[0]
+ spa.heater_load_units = nil
+ spa.heater_load_value = nil
+ spa.heater_usage_multiplier = nil
+ spa.heater_weekday_fractions = nil
+ spa.heater_weekend_fractions = nil
+ spa.heater_monthly_multipliers = nil
+ spa.pump_kwh_per_year = nil
+ spa.pump_usage_multiplier = nil
+ spa.pump_weekday_fractions = nil
+ spa.pump_weekend_fractions = nil
+ spa.pump_monthly_multipliers = nil
XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
hpxml_default = _test_measure()
- _test_default_hot_tub_heater_values(hpxml_default.hot_tubs[0], HPXML::UnitsKwhPerYear, 225, 1.0, Schedule.HotTubHeaterWeekdayFractions, Schedule.HotTubHeaterWeekendFractions, Schedule.HotTubHeaterMonthlyMultipliers)
- _test_default_hot_tub_pump_values(hpxml_default.hot_tubs[0], 1111, 1.0, Schedule.HotTubPumpWeekdayFractions, Schedule.HotTubPumpWeekendFractions, Schedule.HotTubPumpMonthlyMultipliers)
+ _test_default_permanent_spa_heater_values(hpxml_default.permanent_spas[0], HPXML::UnitsKwhPerYear, 225, 1.0, Schedule.PermanentSpaHeaterWeekdayFractions, Schedule.PermanentSpaHeaterWeekendFractions, Schedule.PermanentSpaHeaterMonthlyMultipliers)
+ _test_default_permanent_spa_pump_values(hpxml_default.permanent_spas[0], 1111, 1.0, Schedule.PermanentSpaPumpWeekdayFractions, Schedule.PermanentSpaPumpWeekendFractions, Schedule.PermanentSpaPumpMonthlyMultipliers)
end
def test_plug_loads
@@ -4805,45 +4805,45 @@ def _test_default_pool_pump_values(pool, kwh_per_year, usage_multiplier, weekday
assert_equal(monthly_mults, pool.pump_monthly_multipliers)
end
- def _test_default_hot_tub_heater_values(hot_tub, load_units, load_value, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
+ def _test_default_permanent_spa_heater_values(spa, load_units, load_value, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
if load_units.nil?
- assert_nil(hot_tub.heater_load_units)
+ assert_nil(spa.heater_load_units)
else
- assert_equal(load_units, hot_tub.heater_load_units)
+ assert_equal(load_units, spa.heater_load_units)
end
if load_value.nil?
- assert_nil(hot_tub.heater_load_value)
+ assert_nil(spa.heater_load_value)
else
- assert_in_epsilon(load_value, hot_tub.heater_load_value, 0.01)
+ assert_in_epsilon(load_value, spa.heater_load_value, 0.01)
end
if usage_multiplier.nil?
- assert_nil(hot_tub.heater_usage_multiplier)
+ assert_nil(spa.heater_usage_multiplier)
else
- assert_equal(usage_multiplier, hot_tub.heater_usage_multiplier)
+ assert_equal(usage_multiplier, spa.heater_usage_multiplier)
end
if weekday_sch.nil?
- assert_nil(hot_tub.heater_weekday_fractions)
+ assert_nil(spa.heater_weekday_fractions)
else
- assert_equal(weekday_sch, hot_tub.heater_weekday_fractions)
+ assert_equal(weekday_sch, spa.heater_weekday_fractions)
end
if weekend_sch.nil?
- assert_nil(hot_tub.heater_weekend_fractions)
+ assert_nil(spa.heater_weekend_fractions)
else
- assert_equal(weekend_sch, hot_tub.heater_weekend_fractions)
+ assert_equal(weekend_sch, spa.heater_weekend_fractions)
end
if monthly_mults.nil?
- assert_nil(hot_tub.heater_monthly_multipliers)
+ assert_nil(spa.heater_monthly_multipliers)
else
- assert_equal(monthly_mults, hot_tub.heater_monthly_multipliers)
+ assert_equal(monthly_mults, spa.heater_monthly_multipliers)
end
end
- def _test_default_hot_tub_pump_values(hot_tub, kwh_per_year, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
- assert_in_epsilon(kwh_per_year, hot_tub.pump_kwh_per_year, 0.01)
- assert_equal(usage_multiplier, hot_tub.pump_usage_multiplier)
- assert_equal(weekday_sch, hot_tub.pump_weekday_fractions)
- assert_equal(weekend_sch, hot_tub.pump_weekend_fractions)
- assert_equal(monthly_mults, hot_tub.pump_monthly_multipliers)
+ def _test_default_permanent_spa_pump_values(spa, kwh_per_year, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
+ assert_in_epsilon(kwh_per_year, spa.pump_kwh_per_year, 0.01)
+ assert_equal(usage_multiplier, spa.pump_usage_multiplier)
+ assert_equal(weekday_sch, spa.pump_weekday_fractions)
+ assert_equal(weekend_sch, spa.pump_weekend_fractions)
+ assert_equal(monthly_mults, spa.pump_monthly_multipliers)
end
def _test_default_plug_load_values(hpxml, load_type, kwh_per_year, frac_sensible, frac_latent, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
diff --git a/HPXMLtoOpenStudio/tests/test_miscloads.rb b/HPXMLtoOpenStudio/tests/test_miscloads.rb
index b57638b585..ea303b76f0 100644
--- a/HPXMLtoOpenStudio/tests/test_miscloads.rb
+++ b/HPXMLtoOpenStudio/tests/test_miscloads.rb
@@ -56,8 +56,8 @@ def test_misc_loads
Constants.ObjectNameMiscWellPump,
Constants.ObjectNameMiscPoolPump,
Constants.ObjectNameMiscPoolHeater,
- Constants.ObjectNameMiscHotTubPump,
- Constants.ObjectNameMiscHotTubHeater,
+ Constants.ObjectNameMiscPermanentSpaPump,
+ Constants.ObjectNameMiscPermanentSpaHeater,
Constants.ObjectNameMiscGrill,
Constants.ObjectNameMiscLighting,
Constants.ObjectNameMiscFireplace]
@@ -103,13 +103,13 @@ def test_large_uncommon_loads
assert_equal(0, kwh_yr)
assert_in_epsilon(500, therm_yr, 0.1)
- # Check hot tub pump
- kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscHotTubPump)
+ # Check permanent spa pump
+ kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscPermanentSpaPump)
assert_in_epsilon(1000, kwh_yr, 0.1)
assert_equal(0, therm_yr)
- # Check hot tub heater
- kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscHotTubHeater)
+ # Check permanent spa heater
+ kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscPermanentSpaHeater)
assert_in_epsilon(1300, kwh_yr, 0.1)
assert_equal(0, therm_yr)
@@ -164,13 +164,13 @@ def test_large_uncommon_loads2
assert_equal(0, kwh_yr)
assert_equal(0, therm_yr)
- # Check hot tub pump
- kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscHotTubPump)
+ # Check permanent spa pump
+ kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscPermanentSpaPump)
assert_in_epsilon(1000, kwh_yr, 0.1)
assert_equal(0, therm_yr)
- # Check hot tub heater
- kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscHotTubHeater)
+ # Check permanent spa heater
+ kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscPermanentSpaHeater)
assert_in_epsilon(260, kwh_yr, 0.1)
assert_equal(0, therm_yr)
@@ -225,13 +225,13 @@ def test_operational_defaults
assert_equal(0, kwh_yr)
assert_in_epsilon(0, therm_yr, 0.1)
- # Check hot tub pump
- kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscHotTubPump)
+ # Check permanent spa pump
+ kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscPermanentSpaPump)
assert_in_epsilon(0, kwh_yr, 0.1)
assert_equal(0, therm_yr)
- # Check hot tub heater
- kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscHotTubHeater)
+ # Check permanent spa heater
+ kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscPermanentSpaHeater)
assert_in_epsilon(0, kwh_yr, 0.1)
assert_equal(0, therm_yr)
@@ -286,13 +286,13 @@ def test_operational_large_uncommon_loads
assert_equal(0, kwh_yr)
assert_in_epsilon(186, therm_yr, 0.1)
- # Check hot tub pump
- kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscHotTubPump)
+ # Check permanent spa pump
+ kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscPermanentSpaPump)
assert_in_epsilon(877, kwh_yr, 0.1)
assert_equal(0, therm_yr)
- # Check hot tub heater
- kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscHotTubHeater)
+ # Check permanent spa heater
+ kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscPermanentSpaHeater)
assert_in_epsilon(889, kwh_yr, 0.1)
assert_equal(0, therm_yr)
@@ -347,13 +347,13 @@ def test_operational_large_uncommon_loads2
assert_equal(0, kwh_yr)
assert_equal(0, therm_yr)
- # Check hot tub pump
- kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscHotTubPump)
+ # Check permanent spa pump
+ kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscPermanentSpaPump)
assert_in_epsilon(877, kwh_yr, 0.1)
assert_equal(0, therm_yr)
- # Check hot tub heater
- kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscHotTubHeater)
+ # Check permanent spa heater
+ kwh_yr, therm_yr = get_kwh_therm_per_year(model, Constants.ObjectNameMiscPermanentSpaHeater)
assert_in_epsilon(178, kwh_yr, 0.1)
assert_equal(0, therm_yr)
diff --git a/HPXMLtoOpenStudio/tests/test_validation.rb b/HPXMLtoOpenStudio/tests/test_validation.rb
index 5e6ddfdf2a..94dc477373 100644
--- a/HPXMLtoOpenStudio/tests/test_validation.rb
+++ b/HPXMLtoOpenStudio/tests/test_validation.rb
@@ -632,6 +632,7 @@ def test_schema_schematron_warning_messages
'dhw-setpoint-low' => ['Hot water setpoint should typically be greater than or equal to 110 deg-F.'],
'erv-atre-low' => ['Adjusted total recovery efficiency should typically be at least half of the adjusted sensible recovery efficiency.'],
'erv-tre-low' => ['Total recovery efficiency should typically be at least half of the sensible recovery efficiency.'],
+ 'fuel-load-type-other' => ["Fuel load type 'other' is not currently handled, the fuel load will not be modeled."],
'garage-ventilation' => ['Ventilation fans for the garage are not currently modeled.'],
'heat-pump-low-backup-switchover-temp' => ['BackupHeatingSwitchoverTemperature is below 30 deg-F; this may result in significant unmet hours if the heat pump does not have sufficient capacity.'],
'heat-pump-low-backup-lockout-temp' => ['BackupHeatingLockoutTemperature is below 30 deg-F; this may result in significant unmet hours if the heat pump does not have sufficient capacity.'],
@@ -680,6 +681,14 @@ def test_schema_schematron_warning_messages
'No exterior lighting specified, the model will not include exterior lighting energy use.',
'No garage lighting specified, the model will not include garage lighting energy use.'],
'missing-attached-surfaces' => ['ResidentialFacilityType is single-family attached or apartment unit, but no attached surfaces were found. This may result in erroneous results (e.g., for infiltration).'],
+ 'plug-load-type-sauna' => ["Plug load type 'sauna' is not currently handled, the plug load will not be modeled."],
+ 'plug-load-type-aquarium' => ["Plug load type 'aquarium' is not currently handled, the plug load will not be modeled."],
+ 'plug-load-type-water-bed' => ["Plug load type 'water bed' is not currently handled, the plug load will not be modeled."],
+ 'plug-load-type-space-heater' => ["Plug load type 'space heater' is not currently handled, the plug load will not be modeled."],
+ 'plug-load-type-computer' => ["Plug load type 'computer' is not currently handled, the plug load will not be modeled."],
+ 'plug-load-type-tv-crt' => ["Plug load type 'TV CRT' is not currently handled, the plug load will not be modeled."],
+ 'plug-load-type-tv-plasma' => ["Plug load type 'TV plasma' is not currently handled, the plug load will not be modeled."],
+ 'portable-spa' => ['Portable spa is not currently handled, the portable spa will not be modeled.'],
'slab-zero-exposed-perimeter' => ['Slab has zero exposed perimeter, this may indicate an input error.'],
'wrong-units' => ['Thickness is greater than 12 inches; this may indicate incorrect units.',
'Thickness is less than 1 inch; this may indicate incorrect units.',
@@ -715,6 +724,9 @@ def test_schema_schematron_warning_messages
elsif ['erv-atre-low'].include? warning_case
hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base-mechvent-erv-atre-asre.xml'))
hpxml.ventilation_fans[0].total_recovery_efficiency_adjusted = 0.1
+ elsif ['fuel-load-type-other'].include? warning_case
+ hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base-misc-loads-large-uncommon.xml'))
+ hpxml.fuel_loads[0].fuel_load_type = HPXML::FuelLoadTypeOther
elsif ['erv-tre-low'].include? warning_case
hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base-mechvent-erv.xml'))
hpxml.ventilation_fans[0].total_recovery_efficiency = 0.1
@@ -794,6 +806,30 @@ def test_schema_schematron_warning_messages
hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base.xml'))
hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
hpxml.air_infiltration_measurements[0].infiltration_type = HPXML::InfiltrationTypeUnitExterior
+ elsif ['plug-load-type-sauna'].include? warning_case
+ hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base.xml'))
+ hpxml.plug_loads[0].plug_load_type = HPXML::PlugLoadTypeSauna
+ elsif ['plug-load-type-aquarium'].include? warning_case
+ hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base.xml'))
+ hpxml.plug_loads[0].plug_load_type = HPXML::PlugLoadTypeAquarium
+ elsif ['plug-load-type-water-bed'].include? warning_case
+ hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base.xml'))
+ hpxml.plug_loads[0].plug_load_type = HPXML::PlugLoadTypeWaterBed
+ elsif ['plug-load-type-space-heater'].include? warning_case
+ hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base.xml'))
+ hpxml.plug_loads[0].plug_load_type = HPXML::PlugLoadTypeSpaceHeater
+ elsif ['plug-load-type-computer'].include? warning_case
+ hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base.xml'))
+ hpxml.plug_loads[0].plug_load_type = HPXML::PlugLoadTypeComputer
+ elsif ['plug-load-type-tv-crt'].include? warning_case
+ hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base.xml'))
+ hpxml.plug_loads[0].plug_load_type = HPXML::PlugLoadTypeTelevisionCRT
+ elsif ['plug-load-type-tv-plasma'].include? warning_case
+ hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base.xml'))
+ hpxml.plug_loads[0].plug_load_type = HPXML::PlugLoadTypeTelevisionPlasma
+ elsif ['portable-spa'].include? warning_case
+ hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base.xml'))
+ hpxml.portable_spas.add(id: 'PorableSpa')
elsif ['slab-zero-exposed-perimeter'].include? warning_case
hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, 'base.xml'))
hpxml.slabs[0].exposed_perimeter = 0
@@ -1343,12 +1379,12 @@ def test_ruby_warning_messages
"Both 'pool_heater' schedule file and weekday fractions provided; the latter will be ignored.",
"Both 'pool_heater' schedule file and weekend fractions provided; the latter will be ignored.",
"Both 'pool_heater' schedule file and monthly multipliers provided; the latter will be ignored.",
- "Both 'hot_tub_pump' schedule file and weekday fractions provided; the latter will be ignored.",
- "Both 'hot_tub_pump' schedule file and weekend fractions provided; the latter will be ignored.",
- "Both 'hot_tub_pump' schedule file and monthly multipliers provided; the latter will be ignored.",
- "Both 'hot_tub_heater' schedule file and weekday fractions provided; the latter will be ignored.",
- "Both 'hot_tub_heater' schedule file and weekend fractions provided; the latter will be ignored.",
- "Both 'hot_tub_heater' schedule file and monthly multipliers provided; the latter will be ignored."],
+ "Both 'permanent_spa_pump' schedule file and weekday fractions provided; the latter will be ignored.",
+ "Both 'permanent_spa_pump' schedule file and weekend fractions provided; the latter will be ignored.",
+ "Both 'permanent_spa_pump' schedule file and monthly multipliers provided; the latter will be ignored.",
+ "Both 'permanent_spa_heater' schedule file and weekday fractions provided; the latter will be ignored.",
+ "Both 'permanent_spa_heater' schedule file and weekend fractions provided; the latter will be ignored.",
+ "Both 'permanent_spa_heater' schedule file and monthly multipliers provided; the latter will be ignored."],
'schedule-file-and-setpoints' => ["Both 'heating_setpoint' schedule file and heating setpoint temperature provided; the latter will be ignored.",
"Both 'cooling_setpoint' schedule file and cooling setpoint temperature provided; the latter will be ignored.",
"Both 'water_heater_setpoint' schedule file and setpoint temperature provided; the latter will be ignored."],
diff --git a/ReportSimulationOutput/measure.rb b/ReportSimulationOutput/measure.rb
index 2cf62c168a..acbd87c242 100644
--- a/ReportSimulationOutput/measure.rb
+++ b/ReportSimulationOutput/measure.rb
@@ -2272,8 +2272,8 @@ def get_timeseries_units_from_fuel_type(fuel_type)
@end_uses[[FT::Elec, EUT::WellPump]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::WellPump]))
@end_uses[[FT::Elec, EUT::PoolHeater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::PoolHeater]))
@end_uses[[FT::Elec, EUT::PoolPump]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::PoolPump]))
- @end_uses[[FT::Elec, EUT::HotTubHeater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::HotTubHeater]))
- @end_uses[[FT::Elec, EUT::HotTubPump]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::HotTubPump]))
+ @end_uses[[FT::Elec, EUT::PermanentSpaHeater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::PermanentSpaHeater]))
+ @end_uses[[FT::Elec, EUT::PermanentSpaPump]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::PermanentSpaPump]))
@end_uses[[FT::Elec, EUT::PV]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::PV]),
is_negative: true)
@end_uses[[FT::Elec, EUT::Generator]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::Generator]),
@@ -2287,7 +2287,7 @@ def get_timeseries_units_from_fuel_type(fuel_type)
@end_uses[[FT::Gas, EUT::RangeOven]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::RangeOven]))
@end_uses[[FT::Gas, EUT::MechVentPreheat]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::MechVentPreheat]))
@end_uses[[FT::Gas, EUT::PoolHeater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::PoolHeater]))
- @end_uses[[FT::Gas, EUT::HotTubHeater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::HotTubHeater]))
+ @end_uses[[FT::Gas, EUT::PermanentSpaHeater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::PermanentSpaHeater]))
@end_uses[[FT::Gas, EUT::Grill]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::Grill]))
@end_uses[[FT::Gas, EUT::Lighting]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::Lighting]))
@end_uses[[FT::Gas, EUT::Fireplace]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::Fireplace]))
@@ -2768,8 +2768,8 @@ def get_object_output_variables_by_key(model, object, sys_id, class_name)
Constants.ObjectNameMiscTelevision => EUT::Television,
Constants.ObjectNameMiscPoolHeater => EUT::PoolHeater,
Constants.ObjectNameMiscPoolPump => EUT::PoolPump,
- Constants.ObjectNameMiscHotTubHeater => EUT::HotTubHeater,
- Constants.ObjectNameMiscHotTubPump => EUT::HotTubPump,
+ Constants.ObjectNameMiscPermanentSpaHeater => EUT::PermanentSpaHeater,
+ Constants.ObjectNameMiscPermanentSpaPump => EUT::PermanentSpaPump,
Constants.ObjectNameMiscElectricVehicleCharging => EUT::Vehicle,
Constants.ObjectNameMiscWellPump => EUT::WellPump }[object.to_ElectricEquipment.get.endUseSubcategory]
if not end_use.nil?
@@ -2784,7 +2784,7 @@ def get_object_output_variables_by_key(model, object, sys_id, class_name)
Constants.ObjectNameMiscLighting => EUT::Lighting,
Constants.ObjectNameMiscFireplace => EUT::Fireplace,
Constants.ObjectNameMiscPoolHeater => EUT::PoolHeater,
- Constants.ObjectNameMiscHotTubHeater => EUT::HotTubHeater,
+ Constants.ObjectNameMiscPermanentSpaHeater => EUT::PermanentSpaHeater,
Constants.ObjectNameMechanicalVentilationPreheating => EUT::MechVentPreheat,
Constants.ObjectNameMechanicalVentilationPrecooling => EUT::MechVentPrecool }[object.to_OtherEquipment.get.endUseSubcategory]
if not end_use.nil?
diff --git a/ReportSimulationOutput/measure.xml b/ReportSimulationOutput/measure.xml
index fc562e9727..07f65f6ee6 100644
--- a/ReportSimulationOutput/measure.xml
+++ b/ReportSimulationOutput/measure.xml
@@ -3,8 +3,8 @@
3.1
report_simulation_output
df9d170c-c21a-4130-866d-0d46b06073fd
- af7039e6-f6d9-4c7a-bf2b-6715ae8c3e77
- 2023-07-26T21:30:09Z
+ beb2fd62-3713-4650-8ef4-6e8dda4fda6b
+ 2023-09-26T16:58:53Z
9BF1E6AC
ReportSimulationOutput
HPXML Simulation Output Report
@@ -1004,16 +1004,16 @@
false
@@ -1088,9 +1088,9 @@
false
@@ -1917,13 +1917,13 @@
measure.rb
rb
script
- AA9428A1
+ 22876E5C
output_report_test.rb
rb
test
- B0D05C50
+ 93FBCC66
diff --git a/ReportSimulationOutput/tests/output_report_test.rb b/ReportSimulationOutput/tests/output_report_test.rb
index 62a25c9ac4..17d343afa6 100644
--- a/ReportSimulationOutput/tests/output_report_test.rb
+++ b/ReportSimulationOutput/tests/output_report_test.rb
@@ -70,8 +70,8 @@ def teardown
"End Use: #{FT::Elec}: #{EUT::WellPump} (MBtu)",
"End Use: #{FT::Elec}: #{EUT::PoolHeater} (MBtu)",
"End Use: #{FT::Elec}: #{EUT::PoolPump} (MBtu)",
- "End Use: #{FT::Elec}: #{EUT::HotTubHeater} (MBtu)",
- "End Use: #{FT::Elec}: #{EUT::HotTubPump} (MBtu)",
+ "End Use: #{FT::Elec}: #{EUT::PermanentSpaHeater} (MBtu)",
+ "End Use: #{FT::Elec}: #{EUT::PermanentSpaPump} (MBtu)",
"End Use: #{FT::Elec}: #{EUT::PV} (MBtu)",
"End Use: #{FT::Elec}: #{EUT::Generator} (MBtu)",
"End Use: #{FT::Elec}: #{EUT::Battery} (MBtu)",
@@ -82,7 +82,7 @@ def teardown
"End Use: #{FT::Gas}: #{EUT::ClothesDryer} (MBtu)",
"End Use: #{FT::Gas}: #{EUT::RangeOven} (MBtu)",
"End Use: #{FT::Gas}: #{EUT::PoolHeater} (MBtu)",
- "End Use: #{FT::Gas}: #{EUT::HotTubHeater} (MBtu)",
+ "End Use: #{FT::Gas}: #{EUT::PermanentSpaHeater} (MBtu)",
"End Use: #{FT::Gas}: #{EUT::Grill} (MBtu)",
"End Use: #{FT::Gas}: #{EUT::Lighting} (MBtu)",
"End Use: #{FT::Gas}: #{EUT::Fireplace} (MBtu)",
@@ -458,8 +458,8 @@ def emission_annual_cols
"Emissions: #{scenario}: #{FT::Elec}: #{EUT::WellPump} (lb)",
"Emissions: #{scenario}: #{FT::Elec}: #{EUT::PoolHeater} (lb)",
"Emissions: #{scenario}: #{FT::Elec}: #{EUT::PoolPump} (lb)",
- "Emissions: #{scenario}: #{FT::Elec}: #{EUT::HotTubHeater} (lb)",
- "Emissions: #{scenario}: #{FT::Elec}: #{EUT::HotTubPump} (lb)",
+ "Emissions: #{scenario}: #{FT::Elec}: #{EUT::PermanentSpaHeater} (lb)",
+ "Emissions: #{scenario}: #{FT::Elec}: #{EUT::PermanentSpaPump} (lb)",
"Emissions: #{scenario}: #{FT::Elec}: #{EUT::PV} (lb)",
"Emissions: #{scenario}: #{FT::Elec}: #{EUT::Generator} (lb)",
"Emissions: #{scenario}: #{FT::Elec}: #{EUT::Battery} (lb)",
@@ -469,7 +469,7 @@ def emission_annual_cols
"Emissions: #{scenario}: #{FT::Gas}: #{EUT::ClothesDryer} (lb)",
"Emissions: #{scenario}: #{FT::Gas}: #{EUT::RangeOven} (lb)",
"Emissions: #{scenario}: #{FT::Gas}: #{EUT::PoolHeater} (lb)",
- "Emissions: #{scenario}: #{FT::Gas}: #{EUT::HotTubHeater} (lb)",
+ "Emissions: #{scenario}: #{FT::Gas}: #{EUT::PermanentSpaHeater} (lb)",
"Emissions: #{scenario}: #{FT::Gas}: #{EUT::Grill} (lb)",
"Emissions: #{scenario}: #{FT::Gas}: #{EUT::Lighting} (lb)",
"Emissions: #{scenario}: #{FT::Gas}: #{EUT::Fireplace} (lb)",
diff --git a/docs/source/workflow_inputs.rst b/docs/source/workflow_inputs.rst
index 4e2849655c..18a646ee2f 100644
--- a/docs/source/workflow_inputs.rst
+++ b/docs/source/workflow_inputs.rst
@@ -220,8 +220,8 @@ The column names available in the schedule CSV files are:
``fuel_loads_fireplace`` frac Fireplace fuel load energy use schedule. No
``pool_pump`` frac Pool pump energy use schedule. No
``pool_heater`` frac Pool heater energy use schedule. No
- ``hot_tub_pump`` frac Hot tub pump energy use schedule. No
- ``hot_tub_heater`` frac Hot tub heater energy use schedule. No
+ ``permanent_spa_pump`` frac Permanent spa pump energy use schedule. No
+ ``permanent_spa_heater`` frac Permanent spa heater energy use schedule. No
``hot_water_dishwasher`` frac Dishwasher hot water use schedule. Yes
``hot_water_clothes_washer`` frac Clothes washer hot water use schedule. Yes
``hot_water_fixtures`` frac Fixtures (sinks, showers, baths) hot water use schedule. Yes
@@ -3334,8 +3334,8 @@ Ceiling fan energy use is calculated per the Energy Rating Rated Home in `ANSI/R
A reduced cooling setpoint can be specified for months when ceiling fans are operating.
See :ref:`hvac_control` for more information.
-HPXML Pools & Hot Tubs
-----------------------
+HPXML Pools & Permanent Spas
+----------------------------
HPXML Pools
***********
@@ -3356,8 +3356,8 @@ If not entered, the simulation will not include a pool.
Pool Pump
~~~~~~~~~
-If a pool is specified, a single pool pump can be entered as a ``Pool/PoolPumps/PoolPump``.
-If not entered, the simulation will not include a pool heater.
+If a pool is specified, a single pool pump can be entered as a ``Pool/Pumps/Pump``.
+If not entered, the simulation will not include a pool pump.
======================================== ======= ====== =========== ======== ============ ======================================
Element Type Units Constraints Required Default Notes
@@ -3406,67 +3406,67 @@ If not entered, the simulation will not include a pool heater.
.. [#] If WeekdayScheduleFractions or WeekendScheduleFractions not provided (and :ref:`detailedschedules` not used), default values from Figure 23 of the `2010 BAHSP `_ are used: "0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003".
.. [#] If MonthlyScheduleMultipliers not provided (and :ref:`detailedschedules` not used), default values from Figure 24 of the `2010 BAHSP `_ are used: "1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154".
-HPXML Hot Tubs
-**************
+HPXML Permanent Spas
+********************
-A single hot tub can be entered as a ``/HPXML/Building/BuildingDetails/HotTubs/HotTub``.
-If not entered, the simulation will not include a hot tub.
+A single permanent spa can be entered as a ``/HPXML/Building/BuildingDetails/Spas/PermanentSpa``.
+If not entered, the simulation will not include a permanent spa.
==================== ======= ====== =========== ======== ============ =================
Element Type Units Constraints Required Default Notes
==================== ======= ====== =========== ======== ============ =================
``SystemIdentifier`` id Yes Unique identifier
- ``Type`` string See [#]_ Yes Hot tub type
+ ``Type`` string See [#]_ Yes Permanent spa type
==================== ======= ====== =========== ======== ============ =================
.. [#] Type choices are "in ground", "on ground", "above ground", "other", "unknown", or "none".
- If "none" is entered, the simulation will not include a hot tub.
+ If "none" is entered, the simulation will not include a permanent spa.
-Hot Tub Pump
-~~~~~~~~~~~~
+Permanent Spa Pump
+~~~~~~~~~~~~~~~~~~
-If a hot tub is specified, a single hot tub pump can be entered as a ``HotTub/HotTubPumps/HotTubPump``.
-If not entered, the simulation will not include a hot tub pump.
+If a permanent spa is specified, a single permanent spa pump can be entered as a ``PermanentSpa/Pumps/Pump``.
+If not entered, the simulation will not include a permanent spa pump.
======================================== ======= ====== =========== ======== ============ ======================================
Element Type Units Constraints Required Default Notes
======================================== ======= ====== =========== ======== ============ ======================================
``SystemIdentifier`` id Yes Unique identifier
- ``Type`` string See [#]_ Yes Hot tub pump type
- ``Load[Units="kWh/year"]/Value`` double kWh/yr >= 0 No See [#]_ Hot tub pump energy use
- ``extension/UsageMultiplier`` double >= 0 No 1.0 Multiplier on hot tub pump energy use
+ ``Type`` string See [#]_ Yes Permanent spa pump type
+ ``Load[Units="kWh/year"]/Value`` double kWh/yr >= 0 No See [#]_ Permanent spa pump energy use
+ ``extension/UsageMultiplier`` double >= 0 No 1.0 Multiplier on permanent spa pump energy use
``extension/WeekdayScheduleFractions`` array No See [#]_ 24 comma-separated weekday fractions
``extension/WeekendScheduleFractions`` array No 24 comma-separated weekend fractions
``extension/MonthlyScheduleMultipliers`` array No See [#]_ 12 comma-separated monthly multipliers
======================================== ======= ====== =========== ======== ============ ======================================
.. [#] Type choices are "single speed", "multi speed", "variable speed", "variable flow", "other", "unknown", or "none".
- If "none" is entered, the simulation will not include a hot tub pump.
+ If "none" is entered, the simulation will not include a permanent spa pump.
.. [#] If Value not provided, defaults based on the `2010 BAHSP `_: 59.5 / 0.059 * (0.5 + 0.25 * NumberofBedrooms / 3 + 0.25 * ConditionedFloorArea / 1920).
If NumberofResidents provided, this value will be adjusted using the :ref:`buildingoccupancy`.
.. [#] If WeekdayScheduleFractions or WeekendScheduleFractions not provided (and :ref:`detailedschedules` not used), default values from Figure 23 of the `2010 BAHSP `_ are used: "0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024".
.. [#] If MonthlyScheduleMultipliers not provided (and :ref:`detailedschedules` not used), default values from Figure 24 of the `2010 BAHSP `_ are used: "0.921, 0.928, 0.921, 0.915, 0.921, 1.160, 1.158, 1.158, 1.160, 0.921, 0.915, 0.921".
-Hot Tub Heater
-~~~~~~~~~~~~~~
+Permanent Spa Heater
+~~~~~~~~~~~~~~~~~~~~
-If a hot tub is specified, a hot tub heater can be entered as a ``HotTub/Heater``.
-If not entered, the simulation will not include a hot tub heater.
+If a permanent spa is specified, a permanent spa heater can be entered as a ``PermanentSpa/Heater``.
+If not entered, the simulation will not include a permanent spa heater.
====================================================== ======= ================== =========== ======== ======== =======================================
Element Type Units Constraints Required Default Notes
====================================================== ======= ================== =========== ======== ======== =======================================
``SystemIdentifier`` id Yes Unique identifier
- ``Type`` string See [#]_ Yes Hot tub heater type
- ``Load[Units="kWh/year" or Units="therm/year"]/Value`` double kWh/yr or therm/yr >= 0 No See [#]_ Hot tub heater energy use
- ``extension/UsageMultiplier`` double >= 0 No 1.0 Multiplier on hot tub heater energy use
+ ``Type`` string See [#]_ Yes Permanent spa heater type
+ ``Load[Units="kWh/year" or Units="therm/year"]/Value`` double kWh/yr or therm/yr >= 0 No See [#]_ Permanent spa heater energy use
+ ``extension/UsageMultiplier`` double >= 0 No 1.0 Multiplier on permanent spa heater energy use
``extension/WeekdayScheduleFractions`` array No See [#]_ 24 comma-separated weekday fractions
``extension/WeekendScheduleFractions`` array No 24 comma-separated weekend fractions
``extension/MonthlyScheduleMultipliers`` array No See [#]_ 12 comma-separated monthly multipliers
====================================================== ======= ================== =========== ======== ======== =======================================
.. [#] Type choices are "none, "gas fired", "electric resistance", or "heat pump".
- If "none" is entered, the simulation will not include a hot tub heater.
+ If "none" is entered, the simulation will not include a permanent spa heater.
.. [#] | If Value not provided, defaults as follows:
| - **gas fired [therm/year]**: 0.87 / 0.011 * (0.5 + 0.25 * NumberofBedrooms / 3 + 0.25 * ConditionedFloorArea / 1920) (based on the `2010 BAHSP `_)
| - **electric resistance [kWh/year]**: 49.0 / 0.048 * (0.5 + 0.25 * NumberofBedrooms / 3 + 0.25 * ConditionedFloorArea / 1920) (based on the `2010 BAHSP `_)
diff --git a/docs/source/workflow_outputs.rst b/docs/source/workflow_outputs.rst
index ffe33175d2..895f8eef55 100644
--- a/docs/source/workflow_outputs.rst
+++ b/docs/source/workflow_outputs.rst
@@ -157,8 +157,8 @@ So the sum of all end uses for a given fuel (e.g., sum of all "End Use: Natural
End Use: Electricity: Well Pump (MBtu)
End Use: Electricity: Pool Heater (MBtu)
End Use: Electricity: Pool Pump (MBtu)
- End Use: Electricity: Hot Tub Heater (MBtu)
- End Use: Electricity: Hot Tub Pump (MBtu)
+ End Use: Electricity: Permanent Spa Heater (MBtu)
+ End Use: Electricity: Permanent Spa Pump (MBtu)
End Use: Electricity: PV (MBtu) Negative value for any power produced
End Use: Electricity: Generator (MBtu) Negative value for any power produced
End Use: Electricity: Battery (MBtu) Positive value for charging (including efficiency losses); negative value for discharging
@@ -169,7 +169,7 @@ So the sum of all end uses for a given fuel (e.g., sum of all "End Use: Natural
End Use: Natural Gas: Range/Oven (MBtu)
End Use: Natural Gas: Mech Vent Preheating (MBtu)
End Use: Natural Gas: Pool Heater (MBtu)
- End Use: Natural Gas: Hot Tub Heater (MBtu)
+ End Use: Natural Gas: Permanent Spa Heater (MBtu)
End Use: Natural Gas: Grill (MBtu)
End Use: Natural Gas: Lighting (MBtu)
End Use: Natural Gas: Fireplace (MBtu)
diff --git a/tasks.rb b/tasks.rb
index b18e22cda2..6d0229cd5c 100644
--- a/tasks.rb
+++ b/tasks.rb
@@ -119,11 +119,13 @@ def create_hpxmls
puts "\n"
# Print warnings about extra files
- dirs.each do |dir|
- Dir["#{workflow_dir}/#{dir}/*.xml"].each do |hpxml|
- next if abs_hpxml_files.include? File.absolute_path(hpxml)
+ if abs_hpxml_files.size == json_inputs.size
+ dirs.each do |dir|
+ Dir["#{workflow_dir}/#{dir}/*.xml"].each do |hpxml|
+ next if abs_hpxml_files.include? File.absolute_path(hpxml)
- puts "Warning: Extra HPXML file found at #{File.absolute_path(hpxml)}"
+ puts "Warning: Extra HPXML file found at #{File.absolute_path(hpxml)}"
+ end
end
end
end
@@ -2052,12 +2054,12 @@ def apply_hpxml_modification(hpxml_file, hpxml)
hpxml.pools[0].heater_weekday_fractions = '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003'
hpxml.pools[0].heater_weekend_fractions = '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003'
hpxml.pools[0].heater_monthly_multipliers = '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154'
- hpxml.hot_tubs[0].pump_weekday_fractions = '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
- hpxml.hot_tubs[0].pump_weekend_fractions = '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
- hpxml.hot_tubs[0].pump_monthly_multipliers = '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837'
- hpxml.hot_tubs[0].heater_weekday_fractions = '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
- hpxml.hot_tubs[0].heater_weekend_fractions = '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
- hpxml.hot_tubs[0].heater_monthly_multipliers = '0.921, 0.928, 0.921, 0.915, 0.921, 1.160, 1.158, 1.158, 1.160, 0.921, 0.915, 0.921'
+ hpxml.permanent_spas[0].pump_weekday_fractions = '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
+ hpxml.permanent_spas[0].pump_weekend_fractions = '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
+ hpxml.permanent_spas[0].pump_monthly_multipliers = '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837'
+ hpxml.permanent_spas[0].heater_weekday_fractions = '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
+ hpxml.permanent_spas[0].heater_weekend_fractions = '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
+ hpxml.permanent_spas[0].heater_monthly_multipliers = '0.921, 0.928, 0.921, 0.915, 0.921, 1.160, 1.158, 1.158, 1.160, 0.921, 0.915, 0.921'
end
if ['base-bldgtype-multifamily-shared-laundry-room.xml',
'base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml'].include? hpxml_file
diff --git a/workflow/hpxml_inputs.json b/workflow/hpxml_inputs.json
index 3a008ad3a3..3c3e6eb4d1 100644
--- a/workflow/hpxml_inputs.json
+++ b/workflow/hpxml_inputs.json
@@ -205,8 +205,8 @@
"misc_fuel_loads_fireplace_fuel_type": "natural gas",
"pool_present": false,
"pool_heater_type": "none",
- "hot_tub_present": false,
- "hot_tub_heater_type": "none",
+ "permanent_spa_present": false,
+ "permanent_spa_heater_type": "none",
"combine_like_surfaces": false
},
"tests/ASHRAE_Standard_140/L110AC.xml": {
@@ -607,8 +607,8 @@
"misc_fuel_loads_fireplace_fuel_type": "natural gas",
"pool_present": false,
"pool_heater_type": "none",
- "hot_tub_present": false,
- "hot_tub_heater_type": "none",
+ "permanent_spa_present": false,
+ "permanent_spa_heater_type": "none",
"utility_bill_scenario_names": "Bills",
"combine_like_surfaces": true
},
@@ -3113,18 +3113,18 @@
"pool_pump_annual_kwh": 2700,
"pool_heater_type": "gas fired",
"pool_heater_annual_therm": 500,
- "hot_tub_present": true,
- "hot_tub_pump_annual_kwh": 1000,
- "hot_tub_heater_type": "electric resistance",
- "hot_tub_heater_annual_kwh": 1300
+ "permanent_spa_present": true,
+ "permanent_spa_pump_annual_kwh": 1000,
+ "permanent_spa_heater_type": "electric resistance",
+ "permanent_spa_heater_annual_kwh": 1300
},
"sample_files/base-misc-loads-large-uncommon2.xml": {
"parent_hpxml": "sample_files/base-misc-loads-large-uncommon.xml",
"misc_fuel_loads_grill_fuel_type": "fuel oil",
"misc_fuel_loads_fireplace_fuel_type": "wood pellets",
"pool_heater_type": "none",
- "hot_tub_heater_type": "heat pump",
- "hot_tub_heater_annual_kwh": 260
+ "permanent_spa_heater_type": "heat pump",
+ "permanent_spa_heater_annual_kwh": 260
},
"sample_files/base-misc-loads-none.xml": {
"parent_hpxml": "sample_files/base.xml",
@@ -3184,12 +3184,12 @@
"pool_heater_type": "gas fired",
"pool_heater_annual_therm": 500,
"pool_heater_usage_multiplier": 0.9,
- "hot_tub_present": true,
- "hot_tub_pump_annual_kwh": 1000,
- "hot_tub_pump_usage_multiplier": 0.9,
- "hot_tub_heater_type": "electric resistance",
- "hot_tub_heater_annual_kwh": 1300,
- "hot_tub_heater_usage_multiplier": 0.9
+ "permanent_spa_present": true,
+ "permanent_spa_pump_annual_kwh": 1000,
+ "permanent_spa_pump_usage_multiplier": 0.9,
+ "permanent_spa_heater_type": "electric resistance",
+ "permanent_spa_heater_annual_kwh": 1300,
+ "permanent_spa_heater_usage_multiplier": 0.9
},
"sample_files/base-multiple-buildings.xml": {
"parent_hpxml": "sample_files/base.xml",
@@ -3309,8 +3309,8 @@
"misc_fuel_loads_fireplace_annual_therm": null,
"pool_pump_annual_kwh": null,
"pool_heater_annual_therm": null,
- "hot_tub_pump_annual_kwh": null,
- "hot_tub_heater_annual_kwh": null
+ "permanent_spa_pump_annual_kwh": null,
+ "permanent_spa_heater_annual_kwh": null
},
"sample_files/base-residents-1-misc-loads-large-uncommon2.xml": {
"parent_hpxml": "sample_files/base-misc-loads-large-uncommon2.xml",
@@ -3324,8 +3324,8 @@
"misc_fuel_loads_fireplace_annual_therm": null,
"pool_pump_annual_kwh": null,
"pool_heater_annual_therm": null,
- "hot_tub_pump_annual_kwh": null,
- "hot_tub_heater_annual_kwh": null
+ "permanent_spa_pump_annual_kwh": null,
+ "permanent_spa_heater_annual_kwh": null
},
"sample_files/base-residents-5.xml": {
"parent_hpxml": "sample_files/base-misc-defaults.xml",
diff --git a/workflow/real_homes/house001.xml b/workflow/real_homes/house001.xml
index f7c007b20a..400d98bee2 100644
--- a/workflow/real_homes/house001.xml
+++ b/workflow/real_homes/house001.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house002.xml b/workflow/real_homes/house002.xml
index 8f4bed55eb..fd46524677 100644
--- a/workflow/real_homes/house002.xml
+++ b/workflow/real_homes/house002.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house003.xml b/workflow/real_homes/house003.xml
index 32debfd0ab..15bb60079e 100644
--- a/workflow/real_homes/house003.xml
+++ b/workflow/real_homes/house003.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house004.xml b/workflow/real_homes/house004.xml
index 181b233c8d..98bfd953db 100644
--- a/workflow/real_homes/house004.xml
+++ b/workflow/real_homes/house004.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house005.xml b/workflow/real_homes/house005.xml
index 063347cbf5..49c40760f7 100644
--- a/workflow/real_homes/house005.xml
+++ b/workflow/real_homes/house005.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house006.xml b/workflow/real_homes/house006.xml
index 3da7758e3e..86f2c2f4c3 100644
--- a/workflow/real_homes/house006.xml
+++ b/workflow/real_homes/house006.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house007.xml b/workflow/real_homes/house007.xml
index 0e7fdc7569..9002f728da 100644
--- a/workflow/real_homes/house007.xml
+++ b/workflow/real_homes/house007.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house008.xml b/workflow/real_homes/house008.xml
index 497d0e807f..b24de18cd0 100644
--- a/workflow/real_homes/house008.xml
+++ b/workflow/real_homes/house008.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house009.xml b/workflow/real_homes/house009.xml
index af00fee599..a7f03d599e 100644
--- a/workflow/real_homes/house009.xml
+++ b/workflow/real_homes/house009.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house010.xml b/workflow/real_homes/house010.xml
index f7f850036c..9dd79a9a54 100644
--- a/workflow/real_homes/house010.xml
+++ b/workflow/real_homes/house010.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house011.xml b/workflow/real_homes/house011.xml
index 03127b4939..e267161823 100644
--- a/workflow/real_homes/house011.xml
+++ b/workflow/real_homes/house011.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house012.xml b/workflow/real_homes/house012.xml
index 431874e728..56a5836099 100644
--- a/workflow/real_homes/house012.xml
+++ b/workflow/real_homes/house012.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house013.xml b/workflow/real_homes/house013.xml
index a5a716b87f..b1efb1d9c2 100644
--- a/workflow/real_homes/house013.xml
+++ b/workflow/real_homes/house013.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house014.xml b/workflow/real_homes/house014.xml
index b78aa69990..2e40a54df2 100644
--- a/workflow/real_homes/house014.xml
+++ b/workflow/real_homes/house014.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house015.xml b/workflow/real_homes/house015.xml
index a5a716b87f..b1efb1d9c2 100644
--- a/workflow/real_homes/house015.xml
+++ b/workflow/real_homes/house015.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house016.xml b/workflow/real_homes/house016.xml
index 8134ec11c9..7cc77fa6e5 100644
--- a/workflow/real_homes/house016.xml
+++ b/workflow/real_homes/house016.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house017.xml b/workflow/real_homes/house017.xml
index 086f1153ce..3bb9e77648 100644
--- a/workflow/real_homes/house017.xml
+++ b/workflow/real_homes/house017.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house018.xml b/workflow/real_homes/house018.xml
index f6cfbb75a2..9c20b8a229 100644
--- a/workflow/real_homes/house018.xml
+++ b/workflow/real_homes/house018.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house019.xml b/workflow/real_homes/house019.xml
index bdeab0c715..69b35a608c 100644
--- a/workflow/real_homes/house019.xml
+++ b/workflow/real_homes/house019.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house020.xml b/workflow/real_homes/house020.xml
index 7f7d777852..51153e125c 100644
--- a/workflow/real_homes/house020.xml
+++ b/workflow/real_homes/house020.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house021.xml b/workflow/real_homes/house021.xml
index 6e317f11ac..0d36c07452 100644
--- a/workflow/real_homes/house021.xml
+++ b/workflow/real_homes/house021.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house022.xml b/workflow/real_homes/house022.xml
index 8ee921358f..ac6492a85d 100644
--- a/workflow/real_homes/house022.xml
+++ b/workflow/real_homes/house022.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house023.xml b/workflow/real_homes/house023.xml
index d7e9313bdf..b82dec9d99 100644
--- a/workflow/real_homes/house023.xml
+++ b/workflow/real_homes/house023.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house024.xml b/workflow/real_homes/house024.xml
index 760f6fd5cb..f1ea9fe2d8 100644
--- a/workflow/real_homes/house024.xml
+++ b/workflow/real_homes/house024.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house025.xml b/workflow/real_homes/house025.xml
index 3b9876e9c4..4b48368f66 100644
--- a/workflow/real_homes/house025.xml
+++ b/workflow/real_homes/house025.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house026.xml b/workflow/real_homes/house026.xml
index 5f37e30683..0ef082d128 100644
--- a/workflow/real_homes/house026.xml
+++ b/workflow/real_homes/house026.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house027.xml b/workflow/real_homes/house027.xml
index 06b24bdf58..f6a2e422da 100644
--- a/workflow/real_homes/house027.xml
+++ b/workflow/real_homes/house027.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house028.xml b/workflow/real_homes/house028.xml
index 0803774428..b52c95a8af 100644
--- a/workflow/real_homes/house028.xml
+++ b/workflow/real_homes/house028.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house029.xml b/workflow/real_homes/house029.xml
index ebd4a78a17..95773c8370 100644
--- a/workflow/real_homes/house029.xml
+++ b/workflow/real_homes/house029.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house030.xml b/workflow/real_homes/house030.xml
index 5a2abafc34..89e341ba6e 100644
--- a/workflow/real_homes/house030.xml
+++ b/workflow/real_homes/house030.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house031.xml b/workflow/real_homes/house031.xml
index 71216ef257..40b7be172e 100644
--- a/workflow/real_homes/house031.xml
+++ b/workflow/real_homes/house031.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house032.xml b/workflow/real_homes/house032.xml
index 12f495c225..924bd4250e 100644
--- a/workflow/real_homes/house032.xml
+++ b/workflow/real_homes/house032.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house033.xml b/workflow/real_homes/house033.xml
index b22ce8fc72..540f385cdf 100644
--- a/workflow/real_homes/house033.xml
+++ b/workflow/real_homes/house033.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house034.xml b/workflow/real_homes/house034.xml
index 236881ba87..77a0fa737f 100644
--- a/workflow/real_homes/house034.xml
+++ b/workflow/real_homes/house034.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house035.xml b/workflow/real_homes/house035.xml
index 2eebcb04f4..5e10963662 100644
--- a/workflow/real_homes/house035.xml
+++ b/workflow/real_homes/house035.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house036.xml b/workflow/real_homes/house036.xml
index 29a57a0408..1e104c9029 100644
--- a/workflow/real_homes/house036.xml
+++ b/workflow/real_homes/house036.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house037.xml b/workflow/real_homes/house037.xml
index 82027c68b4..2b1ed8da32 100644
--- a/workflow/real_homes/house037.xml
+++ b/workflow/real_homes/house037.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house038.xml b/workflow/real_homes/house038.xml
index 5719218b2f..a7226a988a 100644
--- a/workflow/real_homes/house038.xml
+++ b/workflow/real_homes/house038.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
@@ -594,12 +594,12 @@
unknown
-
-
+
+
single speed
-
-
+
+
none
diff --git a/workflow/real_homes/house039.xml b/workflow/real_homes/house039.xml
index c25c792a2f..b5a1f730a3 100644
--- a/workflow/real_homes/house039.xml
+++ b/workflow/real_homes/house039.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house040.xml b/workflow/real_homes/house040.xml
index 0ea27dc4c0..81eedbb248 100644
--- a/workflow/real_homes/house040.xml
+++ b/workflow/real_homes/house040.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house041.xml b/workflow/real_homes/house041.xml
index a83ecbcd83..7afbb2f54b 100644
--- a/workflow/real_homes/house041.xml
+++ b/workflow/real_homes/house041.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house042.xml b/workflow/real_homes/house042.xml
index f540efc1e2..b7e6b2d4f3 100644
--- a/workflow/real_homes/house042.xml
+++ b/workflow/real_homes/house042.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house043.xml b/workflow/real_homes/house043.xml
index 16262a1d8e..8245d71e60 100644
--- a/workflow/real_homes/house043.xml
+++ b/workflow/real_homes/house043.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house044.xml b/workflow/real_homes/house044.xml
index e3b960fca5..1d0c35f476 100644
--- a/workflow/real_homes/house044.xml
+++ b/workflow/real_homes/house044.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house045.xml b/workflow/real_homes/house045.xml
index 29fd43a87f..1d09467134 100644
--- a/workflow/real_homes/house045.xml
+++ b/workflow/real_homes/house045.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house046.xml b/workflow/real_homes/house046.xml
index 067060aaf7..dfcaf4c717 100644
--- a/workflow/real_homes/house046.xml
+++ b/workflow/real_homes/house046.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house047.xml b/workflow/real_homes/house047.xml
index ca41a5ba0d..7815c39e18 100644
--- a/workflow/real_homes/house047.xml
+++ b/workflow/real_homes/house047.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house048.xml b/workflow/real_homes/house048.xml
index c937db40ce..599686318c 100644
--- a/workflow/real_homes/house048.xml
+++ b/workflow/real_homes/house048.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house049.xml b/workflow/real_homes/house049.xml
index 4075cf7bee..eda1636c17 100644
--- a/workflow/real_homes/house049.xml
+++ b/workflow/real_homes/house049.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/real_homes/house050.xml b/workflow/real_homes/house050.xml
index 4a8a6770c6..4d17985932 100644
--- a/workflow/real_homes/house050.xml
+++ b/workflow/real_homes/house050.xml
@@ -1,5 +1,5 @@
-
+
HPXML
redacted
diff --git a/workflow/sample_files/base-appliances-coal.xml b/workflow/sample_files/base-appliances-coal.xml
index e22ea10035..04062d2212 100644
--- a/workflow/sample_files/base-appliances-coal.xml
+++ b/workflow/sample_files/base-appliances-coal.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml b/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml
index 44f6ff6319..e60e08a981 100644
--- a/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml
+++ b/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml b/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml
index c45707476a..b80b734cee 100644
--- a/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml
+++ b/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-dehumidifier-multiple.xml b/workflow/sample_files/base-appliances-dehumidifier-multiple.xml
index 2cdb640d95..dc5733b6b8 100644
--- a/workflow/sample_files/base-appliances-dehumidifier-multiple.xml
+++ b/workflow/sample_files/base-appliances-dehumidifier-multiple.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-dehumidifier.xml b/workflow/sample_files/base-appliances-dehumidifier.xml
index 75b766ad1e..3946de3278 100644
--- a/workflow/sample_files/base-appliances-dehumidifier.xml
+++ b/workflow/sample_files/base-appliances-dehumidifier.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-gas.xml b/workflow/sample_files/base-appliances-gas.xml
index 35bc1ec823..79445bb3ca 100644
--- a/workflow/sample_files/base-appliances-gas.xml
+++ b/workflow/sample_files/base-appliances-gas.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-modified.xml b/workflow/sample_files/base-appliances-modified.xml
index 5df6c07a11..0cc55d20c0 100644
--- a/workflow/sample_files/base-appliances-modified.xml
+++ b/workflow/sample_files/base-appliances-modified.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-none.xml b/workflow/sample_files/base-appliances-none.xml
index 8abef9998b..b0c1e1931d 100644
--- a/workflow/sample_files/base-appliances-none.xml
+++ b/workflow/sample_files/base-appliances-none.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-oil-location-miami-fl.xml b/workflow/sample_files/base-appliances-oil-location-miami-fl.xml
index 31e0d5c85b..8af082cee2 100644
--- a/workflow/sample_files/base-appliances-oil-location-miami-fl.xml
+++ b/workflow/sample_files/base-appliances-oil-location-miami-fl.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-oil.xml b/workflow/sample_files/base-appliances-oil.xml
index e1b62288b9..4420f45758 100644
--- a/workflow/sample_files/base-appliances-oil.xml
+++ b/workflow/sample_files/base-appliances-oil.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-propane-location-portland-or.xml b/workflow/sample_files/base-appliances-propane-location-portland-or.xml
index 91db05b6ca..2d766722ef 100644
--- a/workflow/sample_files/base-appliances-propane-location-portland-or.xml
+++ b/workflow/sample_files/base-appliances-propane-location-portland-or.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-propane.xml b/workflow/sample_files/base-appliances-propane.xml
index 3601ea241d..6e1631ec60 100644
--- a/workflow/sample_files/base-appliances-propane.xml
+++ b/workflow/sample_files/base-appliances-propane.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-appliances-wood.xml b/workflow/sample_files/base-appliances-wood.xml
index 2ea920ac76..aeebfc3bf4 100644
--- a/workflow/sample_files/base-appliances-wood.xml
+++ b/workflow/sample_files/base-appliances-wood.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-atticroof-cathedral.xml b/workflow/sample_files/base-atticroof-cathedral.xml
index a34a1c9457..0cfbec54c4 100644
--- a/workflow/sample_files/base-atticroof-cathedral.xml
+++ b/workflow/sample_files/base-atticroof-cathedral.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-atticroof-conditioned.xml b/workflow/sample_files/base-atticroof-conditioned.xml
index b3144015c0..7edc26a38c 100644
--- a/workflow/sample_files/base-atticroof-conditioned.xml
+++ b/workflow/sample_files/base-atticroof-conditioned.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-atticroof-flat.xml b/workflow/sample_files/base-atticroof-flat.xml
index 4100ba1184..47ed53bf44 100644
--- a/workflow/sample_files/base-atticroof-flat.xml
+++ b/workflow/sample_files/base-atticroof-flat.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-atticroof-radiant-barrier.xml b/workflow/sample_files/base-atticroof-radiant-barrier.xml
index bca892038b..d267290de0 100644
--- a/workflow/sample_files/base-atticroof-radiant-barrier.xml
+++ b/workflow/sample_files/base-atticroof-radiant-barrier.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml b/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml
index 6ee25879fc..afb10bb02b 100644
--- a/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml
+++ b/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-atticroof-vented.xml b/workflow/sample_files/base-atticroof-vented.xml
index 8345afeb6c..8d5a4b2a43 100644
--- a/workflow/sample_files/base-atticroof-vented.xml
+++ b/workflow/sample_files/base-atticroof-vented.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-battery-scheduled.xml b/workflow/sample_files/base-battery-scheduled.xml
index 326e21e896..345384278e 100644
--- a/workflow/sample_files/base-battery-scheduled.xml
+++ b/workflow/sample_files/base-battery-scheduled.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-battery.xml b/workflow/sample_files/base-battery.xml
index ba3b234ed2..d4265416a0 100644
--- a/workflow/sample_files/base-battery.xml
+++ b/workflow/sample_files/base-battery.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-bldgtype-attached-2stories.xml b/workflow/sample_files/base-bldgtype-attached-2stories.xml
index 300c49b028..f94a6e62bc 100644
--- a/workflow/sample_files/base-bldgtype-attached-2stories.xml
+++ b/workflow/sample_files/base-bldgtype-attached-2stories.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-bldgtype-attached-atticroof-cathedral.xml b/workflow/sample_files/base-bldgtype-attached-atticroof-cathedral.xml
index c494b0444e..1359607b9b 100644
--- a/workflow/sample_files/base-bldgtype-attached-atticroof-cathedral.xml
+++ b/workflow/sample_files/base-bldgtype-attached-atticroof-cathedral.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-bldgtype-attached-infil-compartmentalization-test.xml b/workflow/sample_files/base-bldgtype-attached-infil-compartmentalization-test.xml
index 6068c2b097..f0afb3b8e3 100644
--- a/workflow/sample_files/base-bldgtype-attached-infil-compartmentalization-test.xml
+++ b/workflow/sample_files/base-bldgtype-attached-infil-compartmentalization-test.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-bldgtype-attached.xml b/workflow/sample_files/base-bldgtype-attached.xml
index 4b4243acc3..a3566e67fd 100644
--- a/workflow/sample_files/base-bldgtype-attached.xml
+++ b/workflow/sample_files/base-bldgtype-attached.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml b/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml
index 5f6e0ae5fe..ba749e37d0 100644
--- a/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml
+++ b/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml b/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml
index 8fbf564c06..750505bf5e 100644
--- a/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml
+++ b/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml b/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml
index 17ac7d0635..a9bde87dc4 100644
--- a/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml
+++ b/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml b/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml
index 0f9130c7dd..162d388808 100644
--- a/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml
+++ b/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml b/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml
index bcf2f1da05..bda18579cf 100644
--- a/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml
+++ b/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-bldgtype-multifamily-infil-compartmentalization-test.xml b/workflow/sample_files/base-bldgtype-multifamily-infil-compartmentalization-test.xml
index f1c4eb6bf6..aea5dde450 100644
--- a/workflow/sample_files/base-bldgtype-multifamily-infil-compartmentalization-test.xml
+++ b/workflow/sample_files/base-bldgtype-multifamily-infil-compartmentalization-test.xml
@@ -1,5 +1,5 @@
-
+
HPXML
tasks.rb
diff --git a/workflow/sample_files/base-bldgtype-multifamily-residents-1.xml b/workflow/sample_files/base-bldgtype-multifamily-residents-1.xml
index 8958d6ed9c..ad5d5bc603 100644
--- a/workflow/sample_files/base-bldgtype-multifamily-residents-1.xml
+++ b/workflow/sample_files/base-bldgtype-multifamily-residents-1.xml
@@ -1,5 +1,5 @@
-
+