diff --git a/BuildResidentialHPXML/README.md b/BuildResidentialHPXML/README.md
index 1fab36eadd..c322c00d0e 100644
--- a/BuildResidentialHPXML/README.md
+++ b/BuildResidentialHPXML/README.md
@@ -3795,7 +3795,7 @@ Ratio of energy delivered to water heater to the energy content of the fuel cons
**Water Heater: Heating Capacity**
-Heating capacity. Only applies to storage water heater. If not provided, the OS-HPXML default (see Conventional Storage) is used.
+Heating capacity. Only applies to storage water heater and heat pump water heater (compressor). If not provided, the OS-HPXML default (see Conventional Storage, Heat Pump) is used.
- **Name:** ``water_heater_heating_capacity``
- **Type:** ``Double``
@@ -3806,6 +3806,19 @@ Heating capacity. Only applies to storage water heater. If not provided, the OS-
+**Water Heater: Backup Heating Capacity**
+
+Backup heating capacity for a heat pump water heater. If not provided, the OS-HPXML default (see Heat Pump) is used.
+
+- **Name:** ``water_heater_backup_heating_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr``
+
+- **Required:** ``false``
+
+
+
**Water Heater: Standby Loss**
The standby loss of water heater. Only applies to space-heating boilers. If not provided, the OS-HPXML default (see Combi Boiler w/ Storage) is used.
diff --git a/BuildResidentialHPXML/measure.rb b/BuildResidentialHPXML/measure.rb
index e513e47341..b819408084 100644
--- a/BuildResidentialHPXML/measure.rb
+++ b/BuildResidentialHPXML/measure.rb
@@ -2273,7 +2273,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_heating_capacity', false)
arg.setDisplayName('Water Heater: Heating Capacity')
- arg.setDescription("Heating capacity. Only applies to #{HPXML::WaterHeaterTypeStorage}. If not provided, the OS-HPXML default (see Conventional Storage) is used.")
+ arg.setDescription("Heating capacity. Only applies to #{HPXML::WaterHeaterTypeStorage} and #{HPXML::WaterHeaterTypeHeatPump} (compressor). If not provided, the OS-HPXML default (see Conventional Storage, Heat Pump) is used.")
+ arg.setUnits('Btu/hr')
+ args << arg
+
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_backup_heating_capacity', false)
+ arg.setDisplayName('Water Heater: Backup Heating Capacity')
+ arg.setDescription("Backup heating capacity for a #{HPXML::WaterHeaterTypeHeatPump}. If not provided, the OS-HPXML default (see Heat Pump) is used.")
arg.setUnits('Btu/hr')
args << arg
@@ -6609,6 +6615,8 @@ def self.set_water_heating_systems(hpxml_bldg, args)
heating_capacity = args[:water_heater_heating_capacity]
tank_model_type = args[:water_heater_tank_model_type]
elsif [HPXML::WaterHeaterTypeHeatPump].include? water_heater_type
+ heating_capacity = args[:water_heater_heating_capacity]
+ backup_heating_capacity = args[:water_heater_backup_heating_capacity]
operating_mode = args[:water_heater_operating_mode]
end
@@ -6629,6 +6637,7 @@ def self.set_water_heating_systems(hpxml_bldg, args)
jacket_r_value: jacket_r_value,
temperature: args[:water_heater_setpoint_temperature],
heating_capacity: heating_capacity,
+ backup_heating_capacity: backup_heating_capacity,
is_shared_system: is_shared_system,
number_of_bedrooms_served: number_of_bedrooms_served,
tank_model_type: tank_model_type,
diff --git a/BuildResidentialHPXML/measure.xml b/BuildResidentialHPXML/measure.xml
index 7d36c5968d..7ca4ef9098 100644
--- a/BuildResidentialHPXML/measure.xml
+++ b/BuildResidentialHPXML/measure.xml
@@ -3,8 +3,8 @@
3.1
build_residential_hpxml
a13a8983-2b01-4930-8af2-42030b6e4233
- 2f4fbbe3-a36f-4d03-a5f5-87c150890550
- 2024-10-13T19:48:25Z
+ 8dfdc271-772e-46a3-a611-71ca703a96c2
+ 2024-10-14T23:23:50Z
2C38F48B
BuildResidentialHPXML
HPXML Builder
@@ -4696,7 +4696,16 @@
water_heater_heating_capacity
Water Heater: Heating Capacity
- Heating capacity. Only applies to storage water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.8.1/workflow_inputs.html#conventional-storage'>Conventional Storage</a>) is used.
+ Heating capacity. Only applies to storage water heater and heat pump water heater (compressor). If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.8.1/workflow_inputs.html#conventional-storage'>Conventional Storage</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.8.1/workflow_inputs.html#heat-pump'>Heat Pump</a>) is used.
+ Double
+ Btu/hr
+ false
+ false
+
+
+ water_heater_backup_heating_capacity
+ Water Heater: Backup Heating Capacity
+ Backup heating capacity for a heat pump water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.8.1/workflow_inputs.html#heat-pump'>Heat Pump</a>) is used.
Double
Btu/hr
false
@@ -7518,7 +7527,7 @@
README.md
md
readme
- 9F5858F9
+ 25110074
README.md.erb
@@ -7535,7 +7544,7 @@
measure.rb
rb
script
- C1F50EA1
+ F2C64E58
constants.rb
diff --git a/Changelog.md b/Changelog.md
index a426d90ffe..b88eab1e19 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -3,7 +3,7 @@
__New Features__
- Updates to HPXML v4.0 final release.
- Allows `Site/Address/ZipCode` to be provided instead of `ClimateandRiskZones/WeatherStation/extension/EPWFilePath`, in which case the closest TMY3 weather station will be automatically selected.
-- Adds inputs for modeling skylight curbs and/or shafts.
+- Allows optional inputs for modeling skylight curbs and/or shafts.
- Allows modeling exterior horizontal insulation for a slab-on-grade foundation (or basement/crawlspace floor).
- Allows alternative infiltration input `AirInfiltrationMeasurement/LeakinessDescription`, in which the infiltration level is estimated using age of home, climate zone, foundation type, etc.
- Window shading enhancements:
@@ -15,6 +15,7 @@ __New Features__
- Updates hot water usage based on FSEC study.
- Updates misc/tv plug load usage based on RECS 2020 data.
- Updates relationship between number of bedrooms and number of occupants to use RECS 2020 instead of RECS 2015.
+- Allows optional `HeatingCapacity` and `BackupHeatingCapacity` inputs for heat pump water heaters (HPWHs).
- Central Fan Integrated Supply (CFIS) mechanical ventilation enhancements:
- CFIS systems with no strategy to meet remainder of ventilation target (`CFISControls/AdditionalRuntimeOperatingMode="none"`).
- HVAC Manual J design load and sizing calculations:
diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml
index 17dc245037..1bae06f8cc 100644
--- a/HPXMLtoOpenStudio/measure.xml
+++ b/HPXMLtoOpenStudio/measure.xml
@@ -3,8 +3,8 @@
3.1
hpxm_lto_openstudio
b1543b30-9465-45ff-ba04-1d1f85e763bc
- b5f6daaa-2d62-4c04-8442-5dd880a2a3eb
- 2024-10-14T15:59:52Z
+ 5c60d469-73ac-415f-b37f-8b8401c8d5f3
+ 2024-10-16T17:32:33Z
D8922A73
HPXMLtoOpenStudio
HPXML to OpenStudio Translator
@@ -327,7 +327,7 @@
defaults.rb
rb
resource
- DF462CB6
+ 1B4820ED
energyplus.rb
@@ -357,7 +357,7 @@
hpxml.rb
rb
resource
- D8F0176E
+ F866C769
hpxml_schema/HPXML.xsd
@@ -375,7 +375,7 @@
hpxml_schematron/EPvalidator.xml
xml
resource
- 5238EC23
+ BD9733AC
hpxml_schematron/iso-schematron.xsd
@@ -603,7 +603,7 @@
unit_conversions.rb
rb
resource
- 1AB34E95
+ 8BAAF04E
util.rb
@@ -627,7 +627,7 @@
waterheater.rb
rb
resource
- EA8D60B3
+ 6F8A18EC
weather.rb
@@ -663,7 +663,7 @@
test_defaults.rb
rb
test
- 05F155DA
+ 9DD97EAF
test_enclosure.rb
@@ -735,13 +735,13 @@
test_validation.rb
rb
test
- 2E4AE571
+ 7CB39E62
test_water_heater.rb
rb
test
- 3F35600F
+ A293B678
test_weather.rb
diff --git a/HPXMLtoOpenStudio/resources/defaults.rb b/HPXMLtoOpenStudio/resources/defaults.rb
index dfe8200afa..30d03cafb2 100644
--- a/HPXMLtoOpenStudio/resources/defaults.rb
+++ b/HPXMLtoOpenStudio/resources/defaults.rb
@@ -2912,6 +2912,15 @@ def self.apply_water_heaters(hpxml_bldg, eri_version, schedules_file)
end
end
if (water_heating_system.water_heater_type == HPXML::WaterHeaterTypeHeatPump)
+ Waterheater.set_heat_pump_cop(water_heating_system)
+ if water_heating_system.heating_capacity.nil?
+ water_heating_system.heating_capacity = (UnitConversions.convert(0.5, 'kW', 'Btu/hr') * water_heating_system.additional_properties.cop).round
+ water_heating_system.heating_capacity_isdefaulted = true
+ end
+ if water_heating_system.backup_heating_capacity.nil?
+ water_heating_system.backup_heating_capacity = UnitConversions.convert(4.5, 'kW', 'Btu/hr').round
+ water_heating_system.backup_heating_capacity_isdefaulted = true
+ end
if water_heating_system.tank_volume.nil?
water_heating_system.tank_volume = get_water_heater_tank_volume(water_heating_system.fuel_type, nbeds, nbaths)
water_heating_system.tank_volume_isdefaulted = true
diff --git a/HPXMLtoOpenStudio/resources/hpxml.rb b/HPXMLtoOpenStudio/resources/hpxml.rb
index 54884d2e64..f79f2b67d0 100644
--- a/HPXMLtoOpenStudio/resources/hpxml.rb
+++ b/HPXMLtoOpenStudio/resources/hpxml.rb
@@ -8374,6 +8374,7 @@ class WaterHeatingSystem < BaseElement
:tank_volume, # [Double] TankVolume (gal)
:fraction_dhw_load_served, # [Double] FractionDHWLoadServed (frac)
:heating_capacity, # [Double] HeatingCapacity (Btu/hr)
+ :backup_heating_capacity, # [Double] BackupHeatingCapacity (Btu/hr)
:energy_factor, # [Double] EnergyFactor (frac)
:uniform_energy_factor, # [Double] UniformEnergyFactor (frac)
:operating_mode, # [String] HPWHOperatingMode (HPXML::WaterHeaterOperatingModeXXX)
@@ -8457,6 +8458,7 @@ def to_doc(building)
XMLHelper.add_element(water_heating_system, 'TankVolume', @tank_volume, :float, @tank_volume_isdefaulted) unless @tank_volume.nil?
XMLHelper.add_element(water_heating_system, 'FractionDHWLoadServed', @fraction_dhw_load_served, :float) unless @fraction_dhw_load_served.nil?
XMLHelper.add_element(water_heating_system, 'HeatingCapacity', @heating_capacity, :float, @heating_capacity_isdefaulted) unless @heating_capacity.nil?
+ XMLHelper.add_element(water_heating_system, 'BackupHeatingCapacity', @backup_heating_capacity, :float, @backup_heating_capacity_isdefaulted) unless @backup_heating_capacity.nil?
XMLHelper.add_element(water_heating_system, 'EnergyFactor', @energy_factor, :float, @energy_factor_isdefaulted) unless @energy_factor.nil?
XMLHelper.add_element(water_heating_system, 'UniformEnergyFactor', @uniform_energy_factor, :float) unless @uniform_energy_factor.nil?
XMLHelper.add_element(water_heating_system, 'HPWHOperatingMode', @operating_mode, :string, @operating_mode_isdefaulted) unless @operating_mode.nil?
@@ -8504,6 +8506,7 @@ def from_doc(water_heating_system)
@tank_volume = XMLHelper.get_value(water_heating_system, 'TankVolume', :float)
@fraction_dhw_load_served = XMLHelper.get_value(water_heating_system, 'FractionDHWLoadServed', :float)
@heating_capacity = XMLHelper.get_value(water_heating_system, 'HeatingCapacity', :float)
+ @backup_heating_capacity = XMLHelper.get_value(water_heating_system, 'BackupHeatingCapacity', :float)
@energy_factor = XMLHelper.get_value(water_heating_system, 'EnergyFactor', :float)
@uniform_energy_factor = XMLHelper.get_value(water_heating_system, 'UniformEnergyFactor', :float)
@operating_mode = XMLHelper.get_value(water_heating_system, 'HPWHOperatingMode', :string)
diff --git a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml
index dc804f9724..7fac85970b 100644
--- a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml
+++ b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml
@@ -2155,6 +2155,7 @@
Expected 0 or 1 element(s) for xpath: TankVolume
Expected 1 element(s) for xpath: FractionDHWLoadServed
Expected 0 or 1 element(s) for xpath: HeatingCapacity
+ Expected HeatingCapacity to be greater than 0.
Expected 1 element(s) for xpath: UniformEnergyFactor | EnergyFactor
Expected UniformEnergyFactor to be less than 1
Expected EnergyFactor to be less than 1
@@ -2206,6 +2207,9 @@
Expected 0 or 1 element(s) for xpath: IsSharedSystem
Expected 0 or 1 element(s) for xpath: TankVolume
Expected 1 element(s) for xpath: FractionDHWLoadServed
+ Expected 0 or 1 element(s) for xpath: HeatingCapacity
+ Expected HeatingCapacity to be greater than 0.
+ Expected 0 or 1 element(s) for xpath: BackupHeatingCapacity
Expected 1 element(s) for xpath: UniformEnergyFactor | EnergyFactor
Expected UniformEnergyFactor to be greater than 1
Expected EnergyFactor to be greater than 1
diff --git a/HPXMLtoOpenStudio/resources/unit_conversions.rb b/HPXMLtoOpenStudio/resources/unit_conversions.rb
index c7651e860f..b1f3d3f6c6 100644
--- a/HPXMLtoOpenStudio/resources/unit_conversions.rb
+++ b/HPXMLtoOpenStudio/resources/unit_conversions.rb
@@ -47,6 +47,7 @@ module UnitConversions
['ton', 'kbtu/hr'] => 12.0,
['ton', 'w'] => 3516.85284207,
['w', 'btu/hr'] => 3.412141633127942,
+ ['kw', 'btu/hr'] => 3412.141633127942,
['kbtu/hr', 'kw'] => 0.2930710701722222,
# Power Flux
diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb
index 44771a9c0d..003b113a8f 100644
--- a/HPXMLtoOpenStudio/resources/waterheater.rb
+++ b/HPXMLtoOpenStudio/resources/waterheater.rb
@@ -965,7 +965,7 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n
)
# Assumptions and values
- cap = 0.5 * unit_multiplier # kW
+ cap = UnitConversions.convert(water_heating_system.heating_capacity, 'Btu/hr', 'W') * unit_multiplier # kW
shr = 0.88 # unitless
# Calculate an altitude adjusted rated evaporator wetbulb temperature
@@ -979,26 +979,11 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n
w_adj = Psychrometrics.w_fT_Twb_P(dp_rated, dp_rated, p_atm)
twb_adj = Psychrometrics.Twb_fT_w_P(runner, rated_edb_F, w_adj, p_atm)
- # Calculate the COP based on EF
- if not water_heating_system.energy_factor.nil?
- uef = (0.60522 + water_heating_system.energy_factor) / 1.2101
- cop = 1.174536058 * uef # Based on simulation of the UEF test procedure at varying COPs
- elsif not water_heating_system.uniform_energy_factor.nil?
- uef = water_heating_system.uniform_energy_factor
- if water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinVerySmall
- fail 'It is unlikely that a heat pump water heater falls into the very small bin of the First Hour Rating (FHR) test. Double check input.'
- elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinLow
- cop = 1.0005 * uef - 0.0789
- elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinMedium
- cop = 1.0909 * uef - 0.0868
- elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinHigh
- cop = 1.1022 * uef - 0.0877
- end
- end
+ cop = water_heating_system.additional_properties.cop
coil = OpenStudio::Model::CoilWaterHeatingAirToWaterHeatPumpWrapped.new(model)
coil.setName("#{obj_name} coil")
- coil.setRatedHeatingCapacity(UnitConversions.convert(cap, 'kW', 'W') * cop)
+ coil.setRatedHeatingCapacity(cap)
coil.setRatedCOP(cop)
coil.setRatedSensibleHeatRatio(shr)
coil.setRatedEvaporatorInletAirDryBulbTemperature(rated_edb)
@@ -1015,6 +1000,30 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n
return coil
end
+ # Calculates the HPWH compressor COP based on UEF regressions.
+ #
+ # @param water_heating_system [HPXML::WaterHeatingSystem] The HPXML water heating system of interest
+ # return [Double] COP of the HPWH compressor
+ def self.set_heat_pump_cop(water_heating_system)
+ # Calculate the COP based on EF
+ if not water_heating_system.energy_factor.nil?
+ uef = (0.60522 + water_heating_system.energy_factor) / 1.2101
+ cop = 1.174536058 * uef # Based on simulation of the UEF test procedure at varying COPs
+ elsif not water_heating_system.uniform_energy_factor.nil?
+ uef = water_heating_system.uniform_energy_factor
+ if water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinVerySmall
+ fail 'It is unlikely that a heat pump water heater falls into the very small bin of the First Hour Rating (FHR) test. Double check input.'
+ elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinLow
+ cop = 1.0005 * uef - 0.0789
+ elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinMedium
+ cop = 1.0909 * uef - 0.0868
+ elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinHigh
+ cop = 1.1022 * uef - 0.0877
+ end
+ end
+ water_heating_system.additional_properties.cop = cop
+ end
+
# TODO
#
# @param model [OpenStudio::Model::Model] OpenStudio Model object
@@ -1034,7 +1043,7 @@ def self.setup_hpwh_stratified_tank(model, water_heating_system, obj_name, solar
v_actual = calc_storage_tank_actual_vol(water_heating_system.tank_volume, water_heating_system.fuel_type) # gal
a_tank, a_side = calc_tank_areas(v_actual, UnitConversions.convert(h_tank, 'm', 'ft')) # sqft
- e_cap = 4.5 # kW
+ e_cap = UnitConversions.convert(water_heating_system.backup_heating_capacity, 'Btu/hr', 'W') # W
parasitics = 3.0 # W
# Based on Ecotope lab testing of most recent AO Smith HPWHs (series HPTU)
if water_heating_system.tank_volume <= 58.0
@@ -1061,12 +1070,12 @@ def self.setup_hpwh_stratified_tank(model, water_heating_system, obj_name, solar
tank.setHeaterPriorityControl('MasterSlave')
tank.heater1SetpointTemperatureSchedule.remove
tank.setHeater1SetpointTemperatureSchedule(hpwh_top_element_sp)
- tank.setHeater1Capacity(UnitConversions.convert(e_cap, 'kW', 'W'))
+ tank.setHeater1Capacity(e_cap)
tank.setHeater1Height((1.0 - (3 - 0.5) / 12.0) * h_tank) # in the 3rd node of a 12-node tank (counting from top)
tank.setHeater1DeadbandTemperatureDifference(18.5)
tank.heater2SetpointTemperatureSchedule.remove
tank.setHeater2SetpointTemperatureSchedule(hpwh_bottom_element_sp)
- tank.setHeater2Capacity(UnitConversions.convert(e_cap, 'kW', 'W'))
+ tank.setHeater2Capacity(e_cap)
tank.setHeater2Height((1.0 - (10 - 0.5) / 12.0) * h_tank) # in the 10th node of a 12-node tank (counting from top)
tank.setHeater2DeadbandTemperatureDifference(3.89)
tank.setHeaterFuelType(EPlus::FuelTypeElectricity)
diff --git a/HPXMLtoOpenStudio/tests/test_defaults.rb b/HPXMLtoOpenStudio/tests/test_defaults.rb
index 6b6488347e..ebc5cd8371 100644
--- a/HPXMLtoOpenStudio/tests/test_defaults.rb
+++ b/HPXMLtoOpenStudio/tests/test_defaults.rb
@@ -3262,16 +3262,20 @@ def test_heat_pump_water_heaters
hpxml, hpxml_bldg = _create_hpxml('base-dhw-tank-heat-pump.xml')
hpxml_bldg.water_heating_systems[0].tank_volume = 44.0
hpxml_bldg.water_heating_systems[0].operating_mode = HPXML::WaterHeaterOperatingModeHeatPumpOnly
+ hpxml_bldg.water_heating_systems[0].heating_capacity = 4000.0
+ hpxml_bldg.water_heating_systems[0].backup_heating_capacity = 5000.0
XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_default_hpxml, default_hpxml_bldg = _test_measure()
- _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [44.0, HPXML::WaterHeaterOperatingModeHeatPumpOnly])
+ _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [44.0, HPXML::WaterHeaterOperatingModeHeatPumpOnly, 4000.0, 5000.0])
# Test defaults
hpxml_bldg.water_heating_systems[0].tank_volume = nil
hpxml_bldg.water_heating_systems[0].operating_mode = nil
+ hpxml_bldg.water_heating_systems[0].heating_capacity = nil
+ hpxml_bldg.water_heating_systems[0].backup_heating_capacity = nil
XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_default_hpxml, default_hpxml_bldg = _test_measure()
- _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [50.0, HPXML::WaterHeaterOperatingModeHybridAuto])
+ _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [50.0, HPXML::WaterHeaterOperatingModeHybridAuto, 4811.0, 15355.0])
end
def test_indirect_water_heaters
@@ -5528,10 +5532,12 @@ def _test_default_heat_pump_water_heater_values(hpxml_bldg, *expected_wh_values)
heat_pump_water_heaters = hpxml_bldg.water_heating_systems.select { |w| w.water_heater_type == HPXML::WaterHeaterTypeHeatPump }
assert_equal(expected_wh_values.size, heat_pump_water_heaters.size)
heat_pump_water_heaters.each_with_index do |wh_system, idx|
- tank_volume, operating_mode = expected_wh_values[idx]
+ tank_volume, operating_mode, htg_cap, backup_htg_cap = expected_wh_values[idx]
assert_equal(tank_volume, wh_system.tank_volume)
assert_equal(operating_mode, wh_system.operating_mode)
+ assert_in_epsilon(htg_cap, wh_system.heating_capacity, 0.01)
+ assert_in_epsilon(backup_htg_cap, wh_system.backup_heating_capacity, 0.01)
end
end
diff --git a/HPXMLtoOpenStudio/tests/test_validation.rb b/HPXMLtoOpenStudio/tests/test_validation.rb
index 1843962214..538f12a0f1 100644
--- a/HPXMLtoOpenStudio/tests/test_validation.rb
+++ b/HPXMLtoOpenStudio/tests/test_validation.rb
@@ -223,6 +223,8 @@ def test_schema_schematron_error_messages
'invalid-ventilation-fan' => ['Expected 1 element(s) for xpath: UsedForWholeBuildingVentilation[text()="true"] | UsedForLocalVentilation[text()="true"] | UsedForSeasonalCoolingLoadReduction[text()="true"] | UsedForGarageVentilation[text()="true"]'],
'invalid-ventilation-recovery' => ['Expected 0 element(s) for xpath: TotalRecoveryEfficiency | AdjustedTotalRecoveryEfficiency',
'Expected 0 element(s) for xpath: SensibleRecoveryEfficiency | AdjustedSensibleRecoveryEfficiency'],
+ 'invalid-water-heater-heating-capacity' => ['Expected HeatingCapacity to be greater than 0.'],
+ 'invalid-water-heater-heating-capacity2' => ['Expected HeatingCapacity to be greater than 0.'],
'invalid-window-height' => ['Expected DistanceToBottomOfWindow to be greater than DistanceToTopOfWindow [context: /HPXML/Building/BuildingDetails/Enclosure/Windows/Window/Overhangs[number(Depth) > 0], id: "Window2"]'],
'leakiness-description-missing-year-built' => ['Expected 1 element(s) for xpath: BuildingSummary/BuildingConstruction/YearBuilt'],
'lighting-fractions' => ['Expected sum(LightingGroup/FractionofUnitsInLocation) for Location="interior" to be less than or equal to 1 [context: /HPXML/Building/BuildingDetails/Lighting, id: "MyBuilding"]'],
@@ -670,6 +672,12 @@ def test_schema_schematron_error_messages
hpxml, hpxml_bldg = _create_hpxml('base-mechvent-exhaust.xml')
hpxml_bldg.ventilation_fans[0].sensible_recovery_efficiency = 0.72
hpxml_bldg.ventilation_fans[0].total_recovery_efficiency = 0.48
+ elsif ['invalid-water-heater-heating-capacity'].include? error_case
+ hpxml, hpxml_bldg = _create_hpxml('base-dhw-tank-gas.xml')
+ hpxml_bldg.water_heating_systems[0].heating_capacity = 0
+ elsif ['invalid-water-heater-heating-capacity2'].include? error_case
+ hpxml, hpxml_bldg = _create_hpxml('base-dhw-tank-heat-pump.xml')
+ hpxml_bldg.water_heating_systems[0].heating_capacity = 0
elsif ['invalid-window-height'].include? error_case
hpxml, hpxml_bldg = _create_hpxml('base-enclosure-overhangs.xml')
hpxml_bldg.windows[1].overhangs_distance_to_bottom_of_window = 1.0
diff --git a/HPXMLtoOpenStudio/tests/test_water_heater.rb b/HPXMLtoOpenStudio/tests/test_water_heater.rb
index 4c458ab66f..50677c78d3 100644
--- a/HPXMLtoOpenStudio/tests/test_water_heater.rb
+++ b/HPXMLtoOpenStudio/tests/test_water_heater.rb
@@ -950,6 +950,8 @@ def test_tank_heat_pump
ther_eff = 1.0
cop = 2.820
tank_height = 1.598
+ cap = 500.0 * cop # W
+ backup_cap = 4500.0 # W
# Check water heater
assert_equal(1, model.getWaterHeaterHeatPumpWrappedCondensers.size)
@@ -961,13 +963,14 @@ def test_tank_heat_pump
assert_equal('Schedule', wh.ambientTemperatureIndicator)
assert_in_epsilon(tank_volume, wh.tankVolume.get, 0.001)
assert_in_epsilon(tank_height, wh.tankHeight.get, 0.001)
- assert_in_epsilon(4500.0, wh.heater1Capacity.get, 0.001)
- assert_in_epsilon(4500.0, wh.heater2Capacity, 0.001)
+ assert_in_epsilon(backup_cap, wh.heater1Capacity.get, 0.001)
+ assert_in_epsilon(backup_cap, wh.heater2Capacity, 0.001)
assert_in_epsilon(u, wh.uniformSkinLossCoefficientperUnitAreatoAmbientTemperature.get, 0.001)
assert_in_epsilon(ther_eff, wh.heaterThermalEfficiency, 0.001)
# Check heat pump cooling coil cop
assert_in_epsilon(cop, coil.ratedCOP, 0.001)
+ assert_in_epsilon(cap, coil.ratedHeatingCapacity, 0.001)
end
def test_tank_heat_pump_uef
@@ -985,6 +988,8 @@ def test_tank_heat_pump_uef
ther_eff = 1.0
cop = 4.004
tank_height = 1.0335
+ cap = 500.0 * cop # W
+ backup_cap = 4500.0 # W
# Check water heater
assert_equal(1, model.getWaterHeaterHeatPumpWrappedCondensers.size)
@@ -996,13 +1001,52 @@ def test_tank_heat_pump_uef
assert_equal('Schedule', wh.ambientTemperatureIndicator)
assert_in_epsilon(tank_volume, wh.tankVolume.get, 0.001)
assert_in_epsilon(tank_height, wh.tankHeight.get, 0.001)
- assert_in_epsilon(4500.0, wh.heater1Capacity.get, 0.001)
- assert_in_epsilon(4500.0, wh.heater2Capacity, 0.001)
+ assert_in_epsilon(backup_cap, wh.heater1Capacity.get, 0.001)
+ assert_in_epsilon(backup_cap, wh.heater2Capacity, 0.001)
assert_in_epsilon(u, wh.uniformSkinLossCoefficientperUnitAreatoAmbientTemperature.get, 0.001)
assert_in_epsilon(ther_eff, wh.heaterThermalEfficiency, 0.001)
# Check heat pump cooling coil cop
assert_in_epsilon(cop, coil.ratedCOP, 0.001)
+ assert_in_epsilon(cap, coil.ratedHeatingCapacity, 0.001)
+ end
+
+ def test_tank_heat_pump_capacities
+ args_hash = {}
+ args_hash['hpxml_path'] = File.absolute_path(File.join(sample_files_dir, 'base-dhw-tank-heat-pump-capacities.xml'))
+ model, _hpxml, hpxml_bldg = _test_measure(args_hash)
+
+ # Get HPXML values
+ water_heating_system = hpxml_bldg.water_heating_systems[0]
+
+ # Expected value
+ tank_volume = UnitConversions.convert(water_heating_system.tank_volume * 0.9, 'gal', 'm^3') # convert to actual volume
+ fuel = EPlus.fuel_type(water_heating_system.fuel_type)
+ u = 0.925
+ ther_eff = 1.0
+ cop = 2.820
+ tank_height = 1.598
+ cap = UnitConversions.convert(water_heating_system.heating_capacity, 'Btu/hr', 'W') # W
+ backup_cap = UnitConversions.convert(water_heating_system.backup_heating_capacity, 'Btu/hr', 'W') # W
+
+ # Check water heater
+ assert_equal(1, model.getWaterHeaterHeatPumpWrappedCondensers.size)
+ assert_equal(1, model.getWaterHeaterStratifieds.size)
+ hpwh = model.getWaterHeaterHeatPumpWrappedCondensers[0]
+ wh = hpwh.tank.to_WaterHeaterStratified.get
+ coil = hpwh.dXCoil.to_CoilWaterHeatingAirToWaterHeatPumpWrapped.get
+ assert_equal(fuel, wh.heaterFuelType)
+ assert_equal('Schedule', wh.ambientTemperatureIndicator)
+ assert_in_epsilon(tank_volume, wh.tankVolume.get, 0.001)
+ assert_in_epsilon(tank_height, wh.tankHeight.get, 0.001)
+ assert_in_epsilon(backup_cap, wh.heater1Capacity.get, 0.001)
+ assert_in_epsilon(backup_cap, wh.heater2Capacity, 0.001)
+ assert_in_epsilon(u, wh.uniformSkinLossCoefficientperUnitAreatoAmbientTemperature.get, 0.001)
+ assert_in_epsilon(ther_eff, wh.heaterThermalEfficiency, 0.001)
+
+ # Check heat pump cooling coil cop
+ assert_in_epsilon(cop, coil.ratedCOP, 0.001)
+ assert_in_epsilon(cap, coil.ratedHeatingCapacity, 0.001)
end
def test_tank_jacket
@@ -1098,6 +1142,8 @@ def test_shared_water_heater_heat_pump
ther_eff = 1.0
cop = 2.820
tank_height = 2.3495
+ cap = 500.0 * cop # W
+ backup_cap = 4500.0 # W
# Check water heater
assert_equal(1, model.getWaterHeaterHeatPumpWrappedCondensers.size)
@@ -1109,13 +1155,14 @@ def test_shared_water_heater_heat_pump
assert_equal('Schedule', wh.ambientTemperatureIndicator)
assert_in_epsilon(tank_volume, wh.tankVolume.get, 0.001)
assert_in_epsilon(tank_height, wh.tankHeight.get, 0.001)
- assert_in_epsilon(4500.0, wh.heater1Capacity.get, 0.001)
- assert_in_epsilon(4500.0, wh.heater2Capacity, 0.001)
+ assert_in_epsilon(backup_cap, wh.heater1Capacity.get, 0.001)
+ assert_in_epsilon(backup_cap, wh.heater2Capacity, 0.001)
assert_in_epsilon(u, wh.uniformSkinLossCoefficientperUnitAreatoAmbientTemperature.get, 0.001)
assert_in_epsilon(ther_eff, wh.heaterThermalEfficiency, 0.001)
# Check heat pump cooling coil cop
assert_in_epsilon(cop, coil.ratedCOP, 0.001)
+ assert_in_epsilon(cap, coil.ratedHeatingCapacity, 0.001)
end
def test_shared_laundry_room
@@ -1163,6 +1210,8 @@ def test_tank_heat_pump_operating_mode_heat_pump_only
ther_eff = 1.0
cop = 4.004
tank_height = 1.0335
+ cap = 500.0 * cop # W
+ backup_cap = 4500.0 # W
# Check water heater
assert_equal(1, model.getWaterHeaterHeatPumpWrappedCondensers.size)
@@ -1174,13 +1223,14 @@ def test_tank_heat_pump_operating_mode_heat_pump_only
assert_equal('Schedule', wh.ambientTemperatureIndicator)
assert_in_epsilon(tank_volume, wh.tankVolume.get, 0.001)
assert_in_epsilon(tank_height, wh.tankHeight.get, 0.001)
- assert_in_epsilon(4500.0, wh.heater1Capacity.get, 0.001)
- assert_in_epsilon(4500.0, wh.heater2Capacity, 0.001)
+ assert_in_epsilon(backup_cap, wh.heater1Capacity.get, 0.001)
+ assert_in_epsilon(backup_cap, wh.heater2Capacity, 0.001)
assert_in_epsilon(u, wh.uniformSkinLossCoefficientperUnitAreatoAmbientTemperature.get, 0.001)
assert_in_epsilon(ther_eff, wh.heaterThermalEfficiency, 0.001)
# Check heat pump cooling coil cop
assert_in_epsilon(cop, coil.ratedCOP, 0.001)
+ assert_in_epsilon(cap, coil.ratedHeatingCapacity, 0.001)
end
def test_tank_stratified
diff --git a/docs/source/workflow_inputs.rst b/docs/source/workflow_inputs.rst
index 2e7c8f112c..abc2601f34 100644
--- a/docs/source/workflow_inputs.rst
+++ b/docs/source/workflow_inputs.rst
@@ -4032,24 +4032,26 @@ Heat Pump
Each heat pump water heater is entered as a ``/HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem``.
- ============================================= ================ ============= ====================== ======== =========== =============================================
- Element Type Units Constraints Required Default Notes
- ============================================= ================ ============= ====================== ======== =========== =============================================
- ``SystemIdentifier`` id Yes Unique identifier
- ``FuelType`` string electricity Yes Fuel type
- ``WaterHeaterType`` string heat pump water heater Yes Type of water heater
- ``Location`` string See [#]_ No See [#]_ Water heater location
- ``IsSharedSystem`` boolean No false Whether it serves multiple dwelling units or shared laundry room
- ``TankVolume`` double gal > 0 No See [#]_ Nominal tank volume
- ``FractionDHWLoadServed`` double frac >= 0, <= 1 [#]_ Yes Fraction of hot water load served [#]_
- ``UniformEnergyFactor`` or ``EnergyFactor`` double frac > 1, <= 5 Yes EnergyGuide label rated efficiency
- ``HPWHOperatingMode`` string See [#]_ No hybrid/auto Operating mode [#]_
- ``UsageBin`` or ``FirstHourRating`` string or double str or gal/hr See [#]_ or > 0 No See [#]_ EnergyGuide label usage bin/first hour rating
- ``WaterHeaterInsulation/Jacket/JacketRValue`` double F-ft2-hr/Btu >= 0 No 0 R-value of additional tank insulation wrap
- ``HotWaterTemperature`` double F > 0 No 125 Water heater setpoint [#]_
- ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_
- ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly
- ============================================= ================ ============= ====================== ======== =========== =============================================
+ ============================================= ================ ============= ====================== ======== ============== =============================================
+ Element Type Units Constraints Required Default Notes
+ ============================================= ================ ============= ====================== ======== ============== =============================================
+ ``SystemIdentifier`` id Yes Unique identifier
+ ``FuelType`` string electricity Yes Fuel type
+ ``WaterHeaterType`` string heat pump water heater Yes Type of water heater
+ ``Location`` string See [#]_ No See [#]_ Water heater location
+ ``IsSharedSystem`` boolean No false Whether it serves multiple dwelling units or shared laundry room
+ ``TankVolume`` double gal > 0 No See [#]_ Nominal tank volume
+ ``FractionDHWLoadServed`` double frac >= 0, <= 1 [#]_ Yes Fraction of hot water load served [#]_
+ ``HeatingCapacity`` double Btu/hr > 0 No See [#]_ Heating output capacity
+ ``BackupHeatingCapacity`` double Btu/hr >= 0 No 15355 (4.5 kW) Heating capacity of the electric resistance backup
+ ``UniformEnergyFactor`` or ``EnergyFactor`` double frac > 1, <= 5 Yes EnergyGuide label rated efficiency
+ ``HPWHOperatingMode`` string See [#]_ No hybrid/auto Operating mode [#]_
+ ``UsageBin`` or ``FirstHourRating`` string or double str or gal/hr See [#]_ or > 0 No See [#]_ EnergyGuide label usage bin/first hour rating
+ ``WaterHeaterInsulation/Jacket/JacketRValue`` double F-ft2-hr/Btu >= 0 No 0 R-value of additional tank insulation wrap
+ ``HotWaterTemperature`` double F > 0 No 125 Water heater setpoint [#]_
+ ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_
+ ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly
+ ============================================= ================ ============= ====================== ======== ============== =============================================
.. [#] Location choices are "conditioned space", "basement - unconditioned", "basement - conditioned", "attic - unvented", "attic - vented", "garage", "crawlspace - unvented", "crawlspace - vented", "crawlspace - conditioned", "other exterior", "other housing unit", "other heated space", "other multifamily buffer space", or "other non-freezing space".
See :ref:`hpxml_locations` for descriptions.
@@ -4063,6 +4065,7 @@ Each heat pump water heater is entered as a ``/HPXML/Building/BuildingDetails/Sy
.. [#] The sum of all ``FractionDHWLoadServed`` (across all WaterHeatingSystems) must equal to 1.
.. [#] FractionDHWLoadServed represents only the fraction of the hot water load associated with the hot water **fixtures**.
Additional hot water load from clothes washers/dishwashers will be automatically assigned to the appropriate water heater(s).
+ .. [#] If HeatingCapacity not provided, defaults to 1706 Btu/hr (0.5 kW) multiplied by the heat pump COP.
.. [#] HPWHOperatingMode choices are "hybrid/auto" or "heat pump only".
.. [#] The heat pump water heater operating mode can alternatively be defined using :ref:`schedules_detailed`.
.. [#] UsageBin choices are "very small", "low", "medium", or "high".
diff --git a/workflow/hpxml_inputs.json b/workflow/hpxml_inputs.json
index df6d576453..342eede201 100644
--- a/workflow/hpxml_inputs.json
+++ b/workflow/hpxml_inputs.json
@@ -1282,7 +1282,8 @@
"water_heater_type": "heat pump water heater",
"water_heater_tank_volume": 120,
"water_heater_efficiency": 2.3,
- "water_heater_num_bedrooms_served": 18
+ "water_heater_num_bedrooms_served": 18,
+ "water_heater_heating_capacity": null
},
"sample_files/base-bldgtype-mf-unit-shared-water-heater-recirc.xml": {
"parent_hpxml": "sample_files/base-bldgtype-mf-unit-shared-water-heater.xml"
@@ -1497,7 +1498,14 @@
"parent_hpxml": "sample_files/base.xml",
"water_heater_type": "heat pump water heater",
"water_heater_tank_volume": 80,
- "water_heater_efficiency": 2.3
+ "water_heater_efficiency": 2.3,
+ "water_heater_heating_capacity": null
+ },
+ "sample_files/base-dhw-tank-heat-pump-capacities.xml": {
+ "parent_hpxml": "sample_files/base-dhw-tank-heat-pump.xml",
+ "water_heater_type": "heat pump water heater",
+ "water_heater_heating_capacity": 3000,
+ "water_heater_backup_heating_capacity": 0
},
"sample_files/base-dhw-tank-heat-pump-outside.xml": {
"parent_hpxml": "sample_files/base-dhw-tank-heat-pump.xml",
diff --git a/workflow/real_homes/house039.xml b/workflow/real_homes/house039.xml
index 4400dde8b9..697413867e 100644
--- a/workflow/real_homes/house039.xml
+++ b/workflow/real_homes/house039.xml
@@ -425,7 +425,6 @@
conditioned space
50.0
1.0
- 15359.0
2.0
1.0
diff --git a/workflow/sample_files/base-dhw-tank-heat-pump-capacities.xml b/workflow/sample_files/base-dhw-tank-heat-pump-capacities.xml
new file mode 100644
index 0000000000..c4142bbf36
--- /dev/null
+++ b/workflow/sample_files/base-dhw-tank-heat-pump-capacities.xml
@@ -0,0 +1,552 @@
+
+
+
+ HPXML
+ tasks.rb
+ 2000-01-01T00:00:00-07:00
+ create
+
+
+
+
+ 60
+
+
+
+ Bills
+
+
+
+
+
+
+
+
+
+ CO
+
+
+
+ proposed workscope
+
+
+
+
+ suburban
+ stand-alone
+ no units above or below
+ 180
+
+ electricity
+ natural gas
+
+
+
+ single-family detached
+ 2.0
+ 1.0
+ 8.0
+ 3
+ 2
+ 2700.0
+ 21600.0
+
+
+
+
+ 2006
+ 5B
+
+
+
+ USA_CO_Denver.Intl.AP.725650_TMY3
+
+ USA_CO_Denver.Intl.AP.725650_TMY3.epw
+
+
+
+
+
+
+
+ 50.0
+
+ ACH
+ 3.0
+
+ 21600.0
+
+
+
+
+
+
+
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+ attic - unvented
+ 1509.3
+ asphalt or fiberglass shingles
+ 0.7
+ 0.92
+ 6.0
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ basement - conditioned
+ 115.6
+ wood siding
+ 0.7
+ 0.92
+
+
+ 23.0
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1200.0
+ wood siding
+ 0.7
+ 0.92
+
+ gypsum board
+
+
+
+ 23.0
+
+
+
+
+ outside
+ attic - unvented
+ gable
+
+
+
+ 225.0
+ wood siding
+ 0.7
+ 0.92
+
+
+ 4.0
+
+
+
+
+
+
+ ground
+ basement - conditioned
+ 8.0
+ 1200.0
+ 8.0
+ 7.0
+
+ gypsum board
+
+
+
+
+ continuous - exterior
+ 8.9
+ 0.0
+ 8.0
+
+
+ continuous - interior
+ 0.0
+
+
+
+
+
+
+
+ attic - unvented
+ conditioned space
+ ceiling
+
+
+
+ 1350.0
+
+ gypsum board
+
+
+
+ 39.3
+
+
+
+
+
+
+ basement - conditioned
+ 1350.0
+ 4.0
+ 150.0
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+ 108.0
+ 0
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 72.0
+ 90
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 108.0
+ 180
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 72.0
+ 270
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+
+
+
+ 40.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ natural gas
+ 36000.0
+
+ AFUE
+ 0.92
+
+ 1.0
+
+
+
+
+ central air conditioner
+ electricity
+ 24000.0
+ single stage
+ 1.0
+
+ SEER
+ 13.0
+
+ 0.73
+
+
+
+
+ 68.0
+ 78.0
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ CFM25
+ 75.0
+ to outside
+
+
+
+ return
+
+ CFM25
+ 25.0
+ to outside
+
+
+
+
+ supply
+ 4.0
+ attic - unvented
+ 150.0
+
+
+
+ return
+ 0.0
+ attic - unvented
+ 50.0
+
+
+
+
+
+
+
+
+ electricity
+ heat pump water heater
+ conditioned space
+ 80.0
+ 1.0
+ 3000.0
+ 0.0
+ 2.3
+ 125.0
+
+
+
+
+
+ 50.0
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ true
+
+
+
+ faucet
+ false
+
+
+
+
+
+
+ conditioned space
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ conditioned space
+ electricity
+ 3.73
+ true
+ 150.0
+
+
+
+ conditioned space
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ conditioned space
+ 650.0
+
+
+
+ conditioned space
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+
+
+ TV other
+
+ kWh/year
+ 620.0
+
+
+
+
+ other
+
+ kWh/year
+ 2457.0
+
+
+ 0.855
+ 0.045
+
+
+
+
+
+
\ No newline at end of file
diff --git a/workflow/tests/base_results/results_simulations_bills.csv b/workflow/tests/base_results/results_simulations_bills.csv
index 51189ee85c..53776741fb 100644
--- a/workflow/tests/base_results/results_simulations_bills.csv
+++ b/workflow/tests/base_results/results_simulations_bills.csv
@@ -109,6 +109,7 @@ base-dhw-tank-gas-outside.xml,1693.09,144.0,973.19,0.0,1117.19,144.0,431.9,575.9
base-dhw-tank-gas-uef-fhr.xml,1675.64,144.0,979.47,0.0,1123.47,144.0,408.17,552.17,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
base-dhw-tank-gas-uef.xml,1675.64,144.0,979.47,0.0,1123.47,144.0,408.17,552.17,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
base-dhw-tank-gas.xml,1679.86,144.0,980.72,0.0,1124.72,144.0,411.14,555.14,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+base-dhw-tank-heat-pump-capacities.xml,1665.87,144.0,1082.5,0.0,1226.5,144.0,295.37,439.37,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
base-dhw-tank-heat-pump-detailed-schedules.xml,1638.9,144.0,1046.75,0.0,1190.75,144.0,304.15,448.15,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml,1632.93,144.0,1040.4,0.0,1184.4,144.0,304.53,448.53,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
base-dhw-tank-heat-pump-outside.xml,1760.52,144.0,1218.72,0.0,1362.72,144.0,253.8,397.8,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
diff --git a/workflow/tests/base_results/results_simulations_energy.csv b/workflow/tests/base_results/results_simulations_energy.csv
index 2f7148fe8e..ba35da4c6c 100644
--- a/workflow/tests/base_results/results_simulations_energy.csv
+++ b/workflow/tests/base_results/results_simulations_energy.csv
@@ -88,7 +88,7 @@ base-dhw-jacket-gas.xml,65.499,65.499,26.894,26.894,38.605,0.0,0.0,0.0,0.0,0.0,0
base-dhw-jacket-hpwh.xml,57.91,57.91,29.6,29.6,28.31,0.0,0.0,0.0,0.0,0.0,0.0,0.702,0.0,0.0,3.922,0.572,3.274,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.063,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,28.31,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-jacket-indirect.xml,53.766,53.766,21.363,21.363,32.403,0.0,0.0,0.0,0.0,0.0,0.0,0.147,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.151,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,19.422,0.0,12.981,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-low-flow-fixtures.xml,59.397,59.397,35.581,35.581,23.816,0.0,0.0,0.0,0.0,0.0,0.0,0.591,0.0,0.0,4.398,0.662,8.793,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.072,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,23.816,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
-base-dhw-multiple.xml,48.031,48.031,23.297,23.297,24.735,0.0,0.0,0.0,0.0,0.0,0.0,0.158,0.0,0.0,0.0,0.0,1.927,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.147,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,20.806,0.0,3.928,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
+base-dhw-multiple.xml,48.032,48.032,23.297,23.297,24.735,0.0,0.0,0.0,0.0,0.0,0.0,0.158,0.0,0.0,0.0,0.0,1.927,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.147,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,20.806,0.0,3.928,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-none.xml,48.676,48.676,24.487,24.487,24.19,0.0,0.0,0.0,0.0,0.0,0.0,0.6,0.0,0.0,4.303,0.644,0.0,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.07,0.0,0.0,0.0,0.0,0.0,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,24.19,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-recirc-demand-scheduled.xml,59.569,59.569,35.753,35.753,23.816,0.0,0.0,0.0,0.0,0.0,0.0,0.591,0.0,0.0,4.398,0.662,8.94,0.026,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.072,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,23.816,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-recirc-demand.xml,59.569,59.569,35.753,35.753,23.816,0.0,0.0,0.0,0.0,0.0,0.0,0.591,0.0,0.0,4.398,0.662,8.94,0.026,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.072,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,23.816,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
@@ -109,6 +109,7 @@ base-dhw-tank-gas-outside.xml,67.995,67.995,26.736,26.736,41.259,0.0,0.0,0.0,0.0
base-dhw-tank-gas-uef-fhr.xml,65.901,65.901,26.909,26.909,38.992,0.0,0.0,0.0,0.0,0.0,0.0,0.602,0.0,0.0,4.49,0.679,0.0,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.072,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,24.279,0.0,14.713,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-tank-gas-uef.xml,65.901,65.901,26.909,26.909,38.992,0.0,0.0,0.0,0.0,0.0,0.0,0.602,0.0,0.0,4.49,0.679,0.0,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.072,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,24.279,0.0,14.713,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-tank-gas.xml,66.219,66.219,26.943,26.943,39.275,0.0,0.0,0.0,0.0,0.0,0.0,0.595,0.0,0.0,4.524,0.686,0.0,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.073,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,23.994,0.0,15.282,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
+base-dhw-tank-heat-pump-capacities.xml,57.955,57.955,29.739,29.739,28.216,0.0,0.0,0.0,0.0,0.0,0.0,0.7,0.0,0.0,3.93,0.574,3.407,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.063,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,28.216,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-tank-heat-pump-detailed-schedules.xml,57.813,57.813,28.757,28.757,29.056,0.0,0.0,0.0,0.0,0.0,0.0,0.721,0.0,0.0,3.874,0.564,2.472,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.061,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,29.056,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml,57.674,57.674,28.583,28.583,29.091,0.0,0.0,0.0,0.0,0.0,0.0,0.722,0.0,0.0,3.843,0.558,2.333,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.062,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,29.091,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-tank-heat-pump-outside.xml,57.727,57.727,33.482,33.482,24.245,0.0,0.0,0.0,0.0,0.0,0.0,0.602,0.0,0.0,4.347,0.652,6.745,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.071,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,24.245,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
diff --git a/workflow/tests/base_results/results_simulations_hvac.csv b/workflow/tests/base_results/results_simulations_hvac.csv
index 70f98885b9..0cf2dec354 100644
--- a/workflow/tests/base_results/results_simulations_hvac.csv
+++ b/workflow/tests/base_results/results_simulations_hvac.csv
@@ -109,6 +109,7 @@ base-dhw-tank-gas-outside.xml,6.8,91.76,36000.0,24000.0,0.0,32239.0,8709.0,7508.
base-dhw-tank-gas-uef-fhr.xml,6.8,91.76,36000.0,24000.0,0.0,32239.0,8709.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,4620.0,0.0,0.0,20039.0,6112.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,622.0,0.0,3320.0,0.0,0.0,139.0,0.0,-661.0,0.0,800.0
base-dhw-tank-gas-uef.xml,6.8,91.76,36000.0,24000.0,0.0,32239.0,8709.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,4620.0,0.0,0.0,20039.0,6112.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,622.0,0.0,3320.0,0.0,0.0,139.0,0.0,-661.0,0.0,800.0
base-dhw-tank-gas.xml,6.8,91.76,36000.0,24000.0,0.0,32239.0,8709.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,4620.0,0.0,0.0,20039.0,6112.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,622.0,0.0,3320.0,0.0,0.0,139.0,0.0,-661.0,0.0,800.0
+base-dhw-tank-heat-pump-capacities.xml,6.8,91.76,36000.0,24000.0,0.0,32239.0,8709.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,4620.0,0.0,0.0,20039.0,6112.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,622.0,0.0,3320.0,0.0,0.0,139.0,0.0,-661.0,0.0,800.0
base-dhw-tank-heat-pump-detailed-schedules.xml,6.8,91.76,36000.0,24000.0,0.0,32239.0,8709.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,4620.0,0.0,0.0,20039.0,6112.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,622.0,0.0,3320.0,0.0,0.0,139.0,0.0,-661.0,0.0,800.0
base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml,6.8,91.76,36000.0,24000.0,0.0,32239.0,8709.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,4620.0,0.0,0.0,20039.0,6112.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,622.0,0.0,3320.0,0.0,0.0,139.0,0.0,-661.0,0.0,800.0
base-dhw-tank-heat-pump-outside.xml,6.8,91.76,36000.0,24000.0,0.0,32239.0,8709.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,4620.0,0.0,0.0,20039.0,6112.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,622.0,0.0,3320.0,0.0,0.0,139.0,0.0,-661.0,0.0,800.0
diff --git a/workflow/tests/base_results/results_simulations_loads.csv b/workflow/tests/base_results/results_simulations_loads.csv
index e95e85e0cf..91a83e765a 100644
--- a/workflow/tests/base_results/results_simulations_loads.csv
+++ b/workflow/tests/base_results/results_simulations_loads.csv
@@ -88,7 +88,7 @@ base-dhw-jacket-gas.xml,23.058,0.0,14.047,9.071,2.73,0.0,0.0,0.0,3.82,3.89,0.546
base-dhw-jacket-hpwh.xml,26.748,0.0,11.906,9.135,1.281,0.0,0.0,0.0,3.85,3.947,0.553,7.505,0.691,10.903,-14.096,0.0,0.0,0.0,8.438,-0.119,5.362,0.0,0.783,0.0,6.199,-4.89,-2.753,0.0,0.175,-0.069,0.002,2.94,0.058,-0.318,10.318,0.0,0.0,0.0,-5.838,-0.115,-0.718,-3.54,-0.091,0.0,2.772,4.713,1.754
base-dhw-jacket-indirect.xml,16.396,0.0,0.0,9.097,1.92,0.0,0.0,0.0,4.054,3.833,0.539,7.563,0.673,10.626,-13.372,0.0,0.0,0.0,8.211,-0.1,5.03,0.0,0.763,0.0,0.0,-9.142,-2.628,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-low-flow-fixtures.xml,22.503,0.0,13.745,8.834,0.615,0.0,0.0,0.0,3.819,3.882,0.545,7.57,0.682,10.76,-13.574,0.0,0.0,0.0,8.363,-0.116,5.259,0.0,0.77,0.0,5.323,-8.475,-2.662,0.0,0.029,-0.188,-0.014,2.827,0.035,-0.632,10.839,0.0,0.0,0.0,-6.138,-0.112,-0.847,-3.884,-0.117,0.0,3.113,7.106,1.845
-base-dhw-multiple.xml,17.623,0.0,0.0,9.063,2.823,0.0,5.891,0.0,4.075,3.853,0.542,7.539,0.677,10.682,-13.446,0.0,0.0,0.0,8.17,-0.113,6.186,0.0,0.765,0.0,0.0,-9.01,-2.642,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
+base-dhw-multiple.xml,17.623,0.0,0.0,9.063,2.823,0.0,5.891,0.0,4.076,3.853,0.542,7.537,0.677,10.681,-13.446,0.0,0.0,0.0,8.165,-0.113,6.186,0.0,0.765,0.0,0.0,-9.007,-2.641,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-dhw-none.xml,22.856,0.0,13.375,0.0,0.0,0.0,0.0,0.0,3.82,3.887,0.546,7.554,0.685,10.79,-13.614,0.0,0.0,0.0,8.356,-0.126,5.818,0.0,0.0,0.0,5.398,-7.933,-2.675,0.0,0.047,-0.173,-0.012,2.842,0.04,-0.571,10.799,0.0,0.0,0.0,-6.103,-0.122,-0.927,-3.828,0.0,0.0,3.04,6.633,1.832
base-dhw-recirc-demand-scheduled.xml,22.503,0.0,13.745,9.013,0.615,0.0,0.0,0.0,3.819,3.882,0.545,7.57,0.682,10.76,-13.574,0.0,0.0,0.0,8.363,-0.116,5.259,0.0,0.77,0.0,5.323,-8.475,-2.662,0.0,0.029,-0.188,-0.014,2.827,0.035,-0.632,10.839,0.0,0.0,0.0,-6.138,-0.112,-0.847,-3.884,-0.117,0.0,3.113,7.106,1.845
base-dhw-recirc-demand.xml,22.503,0.0,13.745,9.013,0.615,0.0,0.0,0.0,3.819,3.882,0.545,7.57,0.682,10.76,-13.574,0.0,0.0,0.0,8.363,-0.116,5.259,0.0,0.77,0.0,5.323,-8.475,-2.662,0.0,0.029,-0.188,-0.014,2.827,0.035,-0.632,10.839,0.0,0.0,0.0,-6.138,-0.112,-0.847,-3.884,-0.117,0.0,3.113,7.106,1.845
@@ -109,6 +109,7 @@ base-dhw-tank-gas-outside.xml,22.909,0.0,13.535,9.071,5.067,0.0,0.0,0.0,3.816,3.
base-dhw-tank-gas-uef-fhr.xml,22.94,0.0,14.108,9.071,2.983,0.0,0.0,0.0,3.819,3.887,0.546,7.571,0.684,10.781,-13.562,0.0,0.0,0.0,8.337,-0.119,6.392,0.0,0.771,0.0,5.423,-9.275,-2.667,0.0,0.028,-0.186,-0.014,2.82,0.036,-0.621,10.852,0.0,0.0,0.0,-6.177,-0.115,-1.056,-3.905,-0.116,0.0,3.186,7.651,1.84
base-dhw-tank-gas-uef.xml,22.94,0.0,14.108,9.071,2.983,0.0,0.0,0.0,3.819,3.887,0.546,7.571,0.684,10.781,-13.562,0.0,0.0,0.0,8.337,-0.119,6.392,0.0,0.771,0.0,5.423,-9.275,-2.667,0.0,0.028,-0.186,-0.014,2.82,0.036,-0.621,10.852,0.0,0.0,0.0,-6.177,-0.115,-1.056,-3.905,-0.116,0.0,3.186,7.651,1.84
base-dhw-tank-gas.xml,22.67,0.0,14.249,9.071,3.629,0.0,0.0,0.0,3.814,3.88,0.545,7.574,0.683,10.763,-13.523,0.0,0.0,0.0,8.331,-0.119,6.38,0.0,0.77,0.0,5.365,-9.486,-2.657,0.0,0.015,-0.197,-0.015,2.811,0.033,-0.651,10.89,0.0,0.0,0.0,-6.197,-0.115,-1.071,-3.933,-0.118,0.0,3.211,7.852,1.85
+base-dhw-tank-heat-pump-capacities.xml,26.659,0.0,11.948,9.115,0.0,0.0,0.0,0.0,3.835,3.937,0.552,7.504,0.69,10.885,-14.036,0.0,0.0,0.0,8.434,-0.121,5.352,0.0,0.781,0.0,6.168,-4.937,-2.744,0.0,0.158,-0.08,0.0,2.935,0.056,-0.341,10.377,0.0,0.0,0.0,-5.852,-0.117,-0.728,-3.547,-0.093,0.0,2.776,4.759,1.763
base-dhw-tank-heat-pump-detailed-schedules.xml,27.444,0.0,11.715,9.213,1.386,0.0,0.0,0.0,3.831,3.936,0.552,7.47,0.691,10.953,-14.05,0.0,0.0,0.0,8.382,-0.18,5.373,0.0,0.781,0.0,6.343,-4.283,-2.747,0.0,0.171,-0.069,0.003,2.933,0.06,-0.234,10.363,0.0,0.0,0.0,-5.854,-0.176,-0.695,-3.426,-0.092,0.0,2.708,4.363,1.76
base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml,27.471,0.0,11.596,9.136,1.286,0.0,0.0,0.0,3.837,3.946,0.553,7.493,0.693,10.929,-14.096,0.0,0.0,0.0,8.441,-0.128,5.373,0.0,0.784,0.0,6.349,-4.289,-2.764,0.0,0.179,-0.062,0.003,2.957,0.062,-0.266,10.318,0.0,0.0,0.0,-5.807,-0.124,-0.704,-3.493,-0.088,0.0,2.708,4.337,1.743
base-dhw-tank-heat-pump-outside.xml,22.909,0.0,13.535,9.1,2.505,0.0,0.0,0.0,3.816,3.885,0.546,7.568,0.683,10.77,-13.61,0.0,0.0,0.0,8.371,-0.116,5.266,0.0,0.77,0.0,5.409,-8.135,-2.67,0.0,0.038,-0.18,-0.013,2.843,0.037,-0.604,10.803,0.0,0.0,0.0,-6.108,-0.113,-0.836,-3.842,-0.115,0.0,3.076,6.83,1.837
diff --git a/workflow/tests/base_results/results_simulations_misc.csv b/workflow/tests/base_results/results_simulations_misc.csv
index 2625ed12e8..65f1d410ed 100644
--- a/workflow/tests/base_results/results_simulations_misc.csv
+++ b/workflow/tests/base_results/results_simulations_misc.csv
@@ -57,7 +57,7 @@ base-bldgtype-mf-unit-shared-mechvent-preconditioning.xml,0.0,0.0,1354.7,998.0,1
base-bldgtype-mf-unit-shared-mechvent.xml,0.0,0.0,1354.7,998.0,11171.5,3093.4,1564.8,2386.7,2386.7,6.049,8.526,0.0
base-bldgtype-mf-unit-shared-pv-battery.xml,0.0,0.0,1354.7,998.0,11171.5,3093.4,1645.6,2090.8,2090.8,3.848,7.747,41.283
base-bldgtype-mf-unit-shared-pv.xml,0.0,0.0,1354.7,998.0,11171.5,3093.4,1600.2,2088.7,2088.7,3.848,7.747,0.0
-base-bldgtype-mf-unit-shared-water-heater-heat-pump.xml,0.0,0.0,1354.7,998.0,10522.6,2913.7,1290.4,1607.3,1607.3,5.567,7.703,0.0
+base-bldgtype-mf-unit-shared-water-heater-heat-pump.xml,0.0,0.0,1354.7,998.0,10522.6,2913.7,1290.5,1607.3,1607.3,5.567,7.703,0.0
base-bldgtype-mf-unit-shared-water-heater-recirc-beds-0.xml,0.0,0.0,732.1,456.9,3657.3,0.0,818.9,1467.6,1467.6,4.376,7.22,0.0
base-bldgtype-mf-unit-shared-water-heater-recirc-scheduled.xml,0.0,0.0,1354.7,998.0,11171.6,3093.4,943.5,1655.2,1655.2,4.039,7.78,0.0
base-bldgtype-mf-unit-shared-water-heater-recirc.xml,0.0,0.0,1354.7,998.0,11171.6,3093.4,943.5,1655.2,1655.2,4.039,7.78,0.0
@@ -85,10 +85,10 @@ base-dhw-indirect-with-solar-fraction.xml,0.0,0.0,390.1,285.6,3157.8,724.6,1295.
base-dhw-indirect.xml,0.0,0.0,1070.2,771.5,8872.7,2036.0,1294.9,1163.3,1294.9,16.535,0.0,0.0
base-dhw-jacket-electric.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2077.4,3480.3,3480.3,23.764,18.692,0.0
base-dhw-jacket-gas.xml,0.0,0.0,1354.7,998.0,11171.7,2563.6,1429.0,3213.8,3213.8,24.233,19.126,0.0
-base-dhw-jacket-hpwh.xml,0.0,0.0,1354.7,998.0,10683.2,2451.5,1849.6,3635.1,3635.1,24.22,18.777,0.0
+base-dhw-jacket-hpwh.xml,0.0,0.0,1354.7,998.0,10683.2,2451.5,1849.6,3635.2,3635.2,24.22,18.777,0.0
base-dhw-jacket-indirect.xml,0.0,0.0,1075.8,776.9,8924.0,2047.8,1295.0,1163.2,1295.0,16.584,0.0,0.0
base-dhw-low-flow-fixtures.xml,0.0,0.0,1354.7,998.0,10829.6,2485.1,2080.9,3485.8,3485.8,23.709,18.744,0.0
-base-dhw-multiple.xml,0.0,0.0,472.1,347.7,3917.6,899.0,1883.5,1933.1,1989.4,17.068,0.0,0.0
+base-dhw-multiple.xml,0.0,0.0,472.1,347.7,3917.7,899.0,1883.5,1933.1,1989.4,17.068,0.0,0.0
base-dhw-none.xml,0.0,0.0,0.0,0.0,0.0,0.0,1324.3,3037.3,3037.3,23.81,18.402,0.0
base-dhw-recirc-demand-scheduled.xml,0.0,0.0,1354.7,998.0,11171.5,2460.6,2078.6,3487.0,3487.0,23.709,18.744,0.0
base-dhw-recirc-demand.xml,0.0,0.0,1354.7,998.0,11171.5,2460.6,2078.6,3487.0,3487.0,23.709,18.744,0.0
@@ -109,13 +109,14 @@ base-dhw-tank-gas-outside.xml,0.0,0.0,1354.7,998.0,11171.6,2563.5,1426.1,3161.8,
base-dhw-tank-gas-uef-fhr.xml,0.0,0.0,1354.7,998.0,11171.8,2563.6,1428.7,3216.7,3216.7,24.197,19.154,0.0
base-dhw-tank-gas-uef.xml,0.0,0.0,1354.7,998.0,11171.8,2563.6,1428.7,3216.7,3216.7,24.197,19.154,0.0
base-dhw-tank-gas.xml,0.0,0.0,1354.7,998.0,11171.8,2563.6,1428.2,3224.1,3224.1,24.125,19.223,0.0
+base-dhw-tank-heat-pump-capacities.xml,0.0,0.0,1354.7,998.0,10843.5,2488.3,1700.0,3383.5,3383.5,23.472,18.354,0.0
base-dhw-tank-heat-pump-detailed-schedules.xml,0.0,0.0,1354.7,998.0,9985.2,2291.3,1857.0,3153.8,3153.8,27.442,18.597,0.0
base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml,0.0,0.0,1354.7,998.0,10679.5,2450.6,1823.3,3231.4,3231.4,25.961,17.573,0.0
base-dhw-tank-heat-pump-outside.xml,0.0,0.0,1354.7,998.0,10966.9,2516.6,2990.0,3443.3,3443.3,23.814,18.643,0.0
base-dhw-tank-heat-pump-uef.xml,0.0,0.0,1354.7,998.0,10679.5,2450.6,1823.3,3231.4,3231.4,25.961,17.573,0.0
base-dhw-tank-heat-pump-with-solar-fraction.xml,0.0,0.0,474.2,349.3,3796.5,871.2,1846.4,3171.1,3171.1,25.864,18.703,0.0
base-dhw-tank-heat-pump-with-solar.xml,0.0,0.0,1354.4,997.6,11663.2,2676.3,1860.6,3223.3,3223.3,24.008,19.19,0.0
-base-dhw-tank-heat-pump.xml,0.0,0.0,1354.7,998.0,10750.0,2466.8,1856.7,3649.6,3649.6,24.427,18.865,0.0
+base-dhw-tank-heat-pump.xml,0.0,0.0,1354.7,998.0,10750.0,2466.8,1856.8,3649.6,3649.6,24.427,18.865,0.0
base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml,0.0,0.0,1354.7,998.0,10791.3,2476.3,4762.4,5444.6,5444.6,31.718,18.721,0.0
base-dhw-tank-model-type-stratified.xml,0.0,0.0,1354.7,998.0,10775.1,2472.6,1958.7,3512.1,3512.1,23.798,18.659,0.0
base-dhw-tank-oil.xml,0.0,0.0,1354.7,998.0,11171.8,2563.6,1428.2,3224.1,3224.1,24.125,19.223,0.0