From 5090077653919ddea099472335edc083845d0234 Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Mon, 20 Apr 2026 15:07:11 -0600 Subject: [PATCH 01/11] First pass on re-implementing 120V HPWHs (from #1534) --- HPXMLtoOpenStudio/measure.xml | 14 +- HPXMLtoOpenStudio/resources/defaults.rb | 59 +- .../resources/hotwater_appliances.rb | 13 +- HPXMLtoOpenStudio/resources/hpxml.rb | 7 + HPXMLtoOpenStudio/resources/waterheater.rb | 41 +- HPXMLtoOpenStudio/tests/test_defaults.rb | 31 +- docs/source/workflow_inputs.rst | 13 +- tasks.rb | 5 + workflow/hpxml_inputs.json | 6 + ...base-dhw-tank-heat-pump-120v-dedicated.xml | 517 ++++++++++++++++++ .../base-dhw-tank-heat-pump-120v.xml | 517 ++++++++++++++++++ 11 files changed, 1178 insertions(+), 45 deletions(-) create mode 100644 workflow/sample_files/base-dhw-tank-heat-pump-120v-dedicated.xml create mode 100644 workflow/sample_files/base-dhw-tank-heat-pump-120v.xml diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml index a92783eb69..676a0a59ae 100644 --- a/HPXMLtoOpenStudio/measure.xml +++ b/HPXMLtoOpenStudio/measure.xml @@ -3,8 +3,8 @@ 3.1 hpxm_lto_openstudio b1543b30-9465-45ff-ba04-1d1f85e763bc - 15d59d32-5b88-48b6-b54a-d12cfc56a689 - 2026-04-20T15:02:40Z + 5d713bd1-7112-4476-b90c-345beb3c2396 + 2026-04-20T20:53:16Z D8922A73 HPXMLtoOpenStudio HPXML to OpenStudio Translator @@ -367,7 +367,7 @@ defaults.rb rb resource - F91B9101 + 75C2D076 electric_panel.rb @@ -397,13 +397,13 @@ hotwater_appliances.rb rb resource - 5F185DC6 + 4C480CE0 hpxml.rb rb resource - BF5902DA + 2DDC012A hpxml_schema/HPXML.xsd @@ -715,7 +715,7 @@ waterheater.rb rb resource - 096F8A5F + 49BD8C89 weather.rb @@ -751,7 +751,7 @@ test_defaults.rb rb test - 989C355A + F52F773E test_electric_panel.rb diff --git a/HPXMLtoOpenStudio/resources/defaults.rb b/HPXMLtoOpenStudio/resources/defaults.rb index f61654e997..bcb4c57e90 100644 --- a/HPXMLtoOpenStudio/resources/defaults.rb +++ b/HPXMLtoOpenStudio/resources/defaults.rb @@ -3358,15 +3358,31 @@ def self.apply_water_heaters(hpxml_bldg, eri_version, schedules_file) end elsif water_heating_system.water_heater_type == HPXML::WaterHeaterTypeHeatPump + + if water_heating_system.hpwh_voltage.nil? + water_heating_system.hpwh_voltage = HPXML::HPWHVoltage240 + water_heating_system.hpwh_voltage_isdefaulted = true + end + water_heating_system.additional_properties.cop = get_water_heater_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 + if water_heating_system.hpwh_voltage == HPXML::HPWHVoltage240 + water_heating_system.heating_capacity = (UnitConversions.convert(0.5, 'kW', 'Btu/hr') * water_heating_system.additional_properties.cop).round + elsif water_heating_system.hpwh_voltage == HPXML::HPWHVoltage120Dedicated + water_heating_system.heating_capacity = (UnitConversions.convert(0.422, 'kW', 'Btu/hr') * water_heating_system.additional_properties.cop).round + else # 120V shared + water_heating_system.heating_capacity = (UnitConversions.convert(0.357, 'kW', 'Btu/hr') * water_heating_system.additional_properties.cop).round + end 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 + if water_heating_system.hpwh_voltage == HPXML::HPWHVoltage240 + water_heating_system.backup_heating_capacity = UnitConversions.convert(4.5, 'kW', 'Btu/hr').round + else + water_heating_system.backup_heating_capacity = 0.0 # No backup elements + end water_heating_system.backup_heating_capacity_isdefaulted = true end @@ -6120,6 +6136,7 @@ def self.get_water_heater_location(hpxml_bldg, iecc_zone = nil) # @param eri_version [String] Version of the ANSI/RESNET/ICC 301 Standard to use for equations/assumptions # @return [Double] Water heater setpoint temperature (F) def self.get_water_heater_temperature(eri_version) + # FIXME: Should we default to a different value for 120V HPWHs? if Constants::ERIVersions.index(eri_version) >= Constants::ERIVersions.index('2014A') # 2014 w/ Addendum A or newer return 125.0 @@ -6268,22 +6285,28 @@ def self.get_water_heater_tank_volume(fuel, is_hpwh, nbeds, nbaths, n_occ) # @param water_heating_system [HPXML::WaterHeatingSystem] The HPXML water heating system of interest # @return [Double] COP of the heat pump (W/W) def self.get_water_heater_heat_pump_cop(water_heating_system) - # Based on simulations of the UEF test procedure at varying COPs - if not water_heating_system.energy_factor.nil? - uef = (0.60522 + water_heating_system.energy_factor) / 1.2101 - cop = 1.174536058 * uef - elsif not water_heating_system.uniform_energy_factor.nil? - uef = water_heating_system.uniform_energy_factor - case water_heating_system.usage_bin - when 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.' - when HPXML::WaterHeaterUsageBinLow - cop = 1.0005 * uef - 0.0789 - when HPXML::WaterHeaterUsageBinMedium - cop = 1.0909 * uef - 0.0868 - when HPXML::WaterHeaterUsageBinHigh - cop = 1.1022 * uef - 0.0877 - end + if water_heating_system.hpwh_voltage == HPXML::HPWHVoltage240 + # Based on simulations of the UEF test procedure at varying COPs + if not water_heating_system.energy_factor.nil? + uef = (0.60522 + water_heating_system.energy_factor) / 1.2101 + cop = 1.174536058 * uef + elsif not water_heating_system.uniform_energy_factor.nil? + uef = water_heating_system.uniform_energy_factor + case water_heating_system.usage_bin + when 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.' + when HPXML::WaterHeaterUsageBinLow + cop = 1.0005 * uef - 0.0789 + when HPXML::WaterHeaterUsageBinMedium + cop = 1.0909 * uef - 0.0868 + when HPXML::WaterHeaterUsageBinHigh + cop = 1.1022 * uef - 0.0877 + end + end + elsif water_heating_system.hpwh_voltage == HPXML::HPWHVoltage120Dedicated + cop = 3.6 + else # 120V shared + cop = 4.2 end return cop end diff --git a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb index 4dc67aeb15..be107963b1 100644 --- a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +++ b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb @@ -352,6 +352,15 @@ def self.apply(runner, model, weather, spaces, hpxml_bldg, hpxml_header, schedul limits: EPlus::ScheduleTypeLimitsTemperature ) + # FIXME: Use HPXML HasMixingValve and MixingValueSetpoint elements? + # FIXME: Should this be min(125.0, t_set)? + hw_temp_schedule = Model.add_schedule_constant( + model, + name: 'hot water temperature schedule', + value: UnitConversions.convert(125.0, 'F', 'C'), + limits: EPlus::ScheduleTypeLimitsTemperature + ) + water_heating = hpxml_bldg.water_heating # Create schedule @@ -489,7 +498,7 @@ def self.apply(runner, model, weather, spaces, hpxml_bldg, hpxml_header, schedul peak_flow_rate: unit_multiplier * cw_peak_flow * gpd_frac * non_solar_fraction, flow_rate_schedule: water_cw_schedule, water_use_connections: water_use_connections[water_heating_system.id], - target_temperature_schedule: nil + target_temperature_schedule: hw_temp_schedule ) cw_wue.additionalProperties.setFeature('HPXML_ID', water_heating_system.id) # Used by reporting measure end @@ -526,7 +535,7 @@ def self.apply(runner, model, weather, spaces, hpxml_bldg, hpxml_header, schedul peak_flow_rate: unit_multiplier * dw_peak_flow * gpd_frac * non_solar_fraction, flow_rate_schedule: water_dw_schedule, water_use_connections: water_use_connections[water_heating_system.id], - target_temperature_schedule: nil + target_temperature_schedule: hw_temp_schedule ) dw_wue.additionalProperties.setFeature('HPXML_ID', water_heating_system.id) # Used by reporting measure end diff --git a/HPXMLtoOpenStudio/resources/hpxml.rb b/HPXMLtoOpenStudio/resources/hpxml.rb index 1b1634b35c..3e653e2330 100644 --- a/HPXMLtoOpenStudio/resources/hpxml.rb +++ b/HPXMLtoOpenStudio/resources/hpxml.rb @@ -224,6 +224,10 @@ class HPXML < Object HeatPumpSizingACCA = 'ACCA' HeatPumpSizingHERS = 'HERS' HeatPumpSizingMaxLoad = 'MaxLoad' + HPWHVoltage240 = '240V' + HPWHVoltage120 = '120V' + HPWHVoltage120Dedicated = '120V dedicated circuit' + HPWHVoltage120Shared = '120V shared circuit' HVACCompressorTypeSingleStage = 'single stage' HVACCompressorTypeTwoStage = 'two stage' HVACCompressorTypeVariableSpeed = 'variable speed' @@ -8595,6 +8599,7 @@ class WaterHeatingSystem < BaseElement :energy_factor, # [Double] EnergyFactor (frac) :uniform_energy_factor, # [Double] UniformEnergyFactor (frac) :hpwh_operating_mode, # [String] HPWHOperatingMode (HPXML::WaterHeaterHPWHOperatingModeXXX) + :hpwh_voltage, # [String] HPWHVoltage (HPXML::HPWHVoltageXXX) :hpwh_ducting_supply, # [String] HPWHDucting/SupplyAirSource (HPXML::LocationXXX) :hpwh_ducting_exhaust, # [String] HPWHDucting/ExhaustAirTermination (HPXML::LocationXXX) :first_hour_rating, # [Double] FirstHourRating (gal/hr) @@ -8698,6 +8703,7 @@ def to_doc(building) 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', @hpwh_operating_mode, :string, @hpwh_operating_mode_isdefaulted) unless @hpwh_operating_mode.nil? + XMLHelper.add_element(water_heating_system, 'HPWHVoltage', @hpwh_voltage, :string, @hpwh_voltage_isdefaulted) unless @hpwh_voltage.nil? if (not @hpwh_ducting_exhaust.nil?) || (not @hpwh_ducting_supply.nil?) hpwh_ducting = XMLHelper.add_element(water_heating_system, 'HPWHDucting') XMLHelper.add_element(hpwh_ducting, 'SupplyAirSource', @hpwh_ducting_supply, :string, @hpwh_ducting_supply_isdefaulted) unless @hpwh_ducting_supply.nil? @@ -8753,6 +8759,7 @@ def from_doc(water_heating_system) @energy_factor = XMLHelper.get_value(water_heating_system, 'EnergyFactor', :float) @uniform_energy_factor = XMLHelper.get_value(water_heating_system, 'UniformEnergyFactor', :float) @hpwh_operating_mode = XMLHelper.get_value(water_heating_system, 'HPWHOperatingMode', :string) + @hpwh_voltage = XMLHelper.get_value(water_heating_system, 'HPWHVoltage', :string) @hpwh_ducting_supply = XMLHelper.get_value(water_heating_system, 'HPWHDucting/SupplyAirSource', :string) @hpwh_ducting_exhaust = XMLHelper.get_value(water_heating_system, 'HPWHDucting/ExhaustAirTermination', :string) @first_hour_rating = XMLHelper.get_value(water_heating_system, 'FirstHourRating', :float) diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index 54f0425e73..ef50477bd2 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -194,8 +194,13 @@ def self.apply_hpwh(runner, model, spaces, hpxml_bldg, hpxml_header, water_heati end airflow_rate = 200.0 # cfm, average value measured across a few different units - min_temp = 42.0 # F - max_temp = 120.0 # F + if water_heating_system.hpwh_voltage == HPXML::HPWHVoltage240 + min_temp = 42.0 # F + max_temp = 120.0 # F + else # 120V + min_temp = 37.0 # F, from spec sheet + max_temp = 145.0 # F, from spec sheet + end # Coil:WaterHeating:AirToWaterHeatPump:Wrapped coil = apply_hpwh_dxcoil(runner, model, water_heating_system, hpxml_bldg.elevation, obj_name, airflow_rate, unit_multiplier) @@ -219,7 +224,7 @@ def self.apply_hpwh(runner, model, spaces, hpxml_bldg, hpxml_header, water_heati fan.additionalProperties.setFeature('ObjectType', Constants::ObjectTypeWaterHeater) # Used by reporting measure # WaterHeater:HeatPump:WrappedCondenser - hpwh = apply_hpwh_wrapped_condenser(model, obj_name, coil, tank, fan, airflow_rate, hpwh_tamb, hpwh_rhamb, min_temp, max_temp, control_setpoint_schedule, unit_multiplier) + hpwh = apply_hpwh_wrapped_condenser(model, obj_name, water_heating_system, coil, tank, fan, airflow_rate, hpwh_tamb, hpwh_rhamb, min_temp, max_temp, control_setpoint_schedule, unit_multiplier) hpwh.additionalProperties.setFeature('HPXML_ID', water_heating_system.id) # Used by infiltration program # Get ducting info @@ -914,6 +919,7 @@ def self.apply_solar_thermal(model, spaces, hpxml_bldg, plantloop_map) # # @param model [OpenStudio::Model::Model] OpenStudio Model object # @param obj_name [String] Name for the OpenStudio object + # @param water_heating_system [HPXML::WaterHeatingSystem] The HPXML water heating system of interest # @param coil [OpenStudio::Model::CoilWaterHeatingAirToWaterHeatPumpWrapped] The HPWH DX coil # @param tank [OpenStudio::Model::WaterHeaterStratified] The HPWH storage tank # @param fan [OpenStudio::Model::FanSystemModel] The HPWH fan @@ -925,10 +931,14 @@ def self.apply_solar_thermal(model, spaces, hpxml_bldg, plantloop_map) # @param control_setpoint_schedule [OpenStudio::Model::ScheduleConstant or OpenStudio::Model::ScheduleRuleset] Setpoint temperature schedule (controlled) # @param unit_multiplier [Integer] Number of similar dwelling units # @return [OpenStudio::Model::WaterHeaterHeatPumpWrappedCondenser] The HPWH object - def self.apply_hpwh_wrapped_condenser(model, obj_name, coil, tank, fan, airflow_rate, hpwh_tamb, hpwh_rhamb, min_temp, max_temp, control_setpoint_schedule, unit_multiplier) + def self.apply_hpwh_wrapped_condenser(model, obj_name, water_heating_system, coil, tank, fan, airflow_rate, hpwh_tamb, hpwh_rhamb, min_temp, max_temp, control_setpoint_schedule, unit_multiplier) hpwh = OpenStudio::Model::WaterHeaterHeatPumpWrappedCondenser.new(model, coil, tank, fan, control_setpoint_schedule, model.alwaysOnDiscreteSchedule) hpwh.setName("#{obj_name} hpwh") - hpwh.setDeadBandTemperatureDifference(3.89) + if water_heating_system.hpwh_voltage == HPXML::HPWHVoltage240 + hpwh.setDeadBandTemperatureDifference(3.89) + else + hpwh.setDeadBandTemperatureDifference(5.0) + end hpwh.setCondenserBottomLocation((1.0 - (12 - 0.5) / 12.0) * tank.tankHeight.get) # in the 12th node of a 12-node tank (counting from top) hpwh.setCondenserTopLocation((1.0 - (6 - 0.5) / 12.0) * tank.tankHeight.get) # in the 6th node of a 12-node tank (counting from top) hpwh.setEvaporatorAirFlowRate(UnitConversions.convert(airflow_rate * unit_multiplier, 'ft^3/min', 'm^3/s')) @@ -945,7 +955,11 @@ def self.apply_hpwh_wrapped_condenser(model, obj_name, coil, tank, fan, airflow_ hpwh.setParasiticHeatRejectionLocation('Outdoors') hpwh.setTankElementControlLogic('MutuallyExclusive') hpwh.setControlSensor1HeightInStratifiedTank((1.0 - (3 - 0.5) / 12.0) * tank.tankHeight.get) # in the 3rd node of a 12-node tank (counting from top) - hpwh.setControlSensor1Weight(0.75) + if water_heating_system.hpwh_voltage == HPXML::HPWHVoltage240 + hpwh.setControlSensor1Weight(0.75) + else + hpwh.setControlSensor1Weight(0.5) + end hpwh.setControlSensor2HeightInStratifiedTank((1.0 - (9 - 0.5) / 12.0) * tank.tankHeight.get) # in the 9th node of a 12-node tank (counting from top) return hpwh @@ -963,17 +977,27 @@ def self.apply_hpwh_wrapped_condenser(model, obj_name, coil, tank, fan, airflow_ # @return [OpenStudio::Model::CoilWaterHeatingAirToWaterHeatPumpWrapped] The HPWH DX coil def self.apply_hpwh_dxcoil(runner, model, water_heating_system, elevation, obj_name, airflow_rate, unit_multiplier) # Curves + if water_heating_system.hpwh_voltage == HPXML::HPWHVoltage240 + cap_coeff = [0.563, 0.0437, 0.000039, 0.0055, -0.000148, -0.000145] + cop_coeff = [1.1332, 0.063, -0.0000979, -0.00972, -0.0000214, -0.000686] + elsif water_heating_system.hpwh_voltage == HPXML::HPWHVoltage120Dedicated + cap_coeff = [0.636, 0.0227, 0.000406, -0.000437, 0.0, 0.0] + cop_coeff = [1.1798, 0.030, 0.0002063, -0.01935, 0.0001341, -0.000303] + else # 120V shared + cap_coeff = [0.813, 0.0160, 0.000537, 0.002032, -0.000086, -0.000069] + cop_coeff = [1.0132, 0.044, 0.0000117, -0.01113, 0.0000369, -0.000498] + end hpwh_cap = Model.add_curve_biquadratic( model, name: 'HPWH-Cap-fT', - coeff: [0.563, 0.0437, 0.000039, 0.0055, -0.000148, -0.000145], + coeff: cap_coeff, min_x: 0, max_x: 100, min_y: 0, max_y: 100 ) hpwh_cop = Model.add_curve_biquadratic( model, name: 'HPWH-COP-fT', - coeff: [1.1332, 0.063, -0.0000979, -0.00972, -0.0000214, -0.000686], + coeff: cop_coeff, min_x: 0, max_x: 100, min_y: 0, max_y: 100 ) @@ -1063,6 +1087,7 @@ def self.apply_hpwh_stratified_tank(model, water_heating_system, obj_name, solar # https://neea.org/img/documents/hpwh-lab-report_ao-smith_hptu_12-09-2015.pdf. # More recent products do not show much change to UA values, see 2021 report: # https://neea.org/img/documents/Laboratory-Assessment-of-Rheem-Generation-5-Series-HPWH.pdf. + # FIXME: Is this close enough to the right value for 120V, or do we need new UA values? if water_heating_system.tank_volume <= 58.0 tank_ua = 3.6 # Btu/hr-F elsif water_heating_system.tank_volume <= 73.0 diff --git a/HPXMLtoOpenStudio/tests/test_defaults.rb b/HPXMLtoOpenStudio/tests/test_defaults.rb index b993752f7b..b11bf8cc71 100644 --- a/HPXMLtoOpenStudio/tests/test_defaults.rb +++ b/HPXMLtoOpenStudio/tests/test_defaults.rb @@ -3633,31 +3633,51 @@ def test_heat_pump_water_heaters hpxml_bldg.water_heating_systems[0].hpwh_containment_volume = 800.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::WaterHeaterHPWHOperatingModeHeatPumpOnly, 4000.0, 5000.0, true]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [44.0, HPXML::WaterHeaterHPWHOperatingModeHeatPumpOnly, HPXML::HPWHVoltage240, 4000.0, 5000.0, true]) # Test defaults hpxml_bldg.water_heating_systems[0].tank_volume = nil hpxml_bldg.water_heating_systems[0].hpwh_operating_mode = nil + hpxml_bldg.water_heating_systems[0].hpwh_voltage = nil hpxml_bldg.water_heating_systems[0].heating_capacity = nil hpxml_bldg.water_heating_systems[0].backup_heating_capacity = nil hpxml_bldg.water_heating_systems[0].hpwh_confined_space_without_mitigation = 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, 6366.0, 15355.0, false]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage240, 6366.0, 15355.0, false]) + + # Test defaults w/ 120V dedicated circuit + hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120Dedicated + 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120Dedicated, 5184.0, 0.0, false]) + + # Test defaults w/ 120V shared circuit + hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120Shared + 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120Shared, 5116.0, 0.0, false]) + + # Test defaults w/ 120V (unspecified circuit) + hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120 + 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120, 5116.0, 0.0, false]) # Test defaults w/ num occupants = 1, num bedrooms = 1 + hpxml_bldg.water_heating_systems[0].hpwh_voltage = nil hpxml_bldg.building_construction.number_of_bedrooms = 1 hpxml_bldg.building_occupancy.number_of_residents = 1 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::WaterHeaterHPWHOperatingModeHybridAuto, 6366.0, 15355.0, false]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [50.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage240, 6366.0, 15355.0, false]) # Test defaults w/ num occupants = 10, num bedrooms = 1 hpxml_bldg.building_construction.number_of_bedrooms = 1 hpxml_bldg.building_occupancy.number_of_residents = 10 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, [80.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, 6366.0, 15355.0, false]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [80.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage240, 6366.0, 15355.0, false]) end def test_indirect_water_heaters @@ -6358,10 +6378,11 @@ 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, htg_cap, backup_htg_cap, hpwh_confined_space_without_mitigation = expected_wh_values[idx] + tank_volume, operating_mode, voltage, htg_cap, backup_htg_cap, hpwh_confined_space_without_mitigation = expected_wh_values[idx] assert_equal(tank_volume, wh_system.tank_volume) assert_equal(operating_mode, wh_system.hpwh_operating_mode) + assert_equal(voltage, wh_system.hpwh_voltage) assert_in_epsilon(htg_cap, wh_system.heating_capacity, 0.01) assert_in_epsilon(backup_htg_cap, wh_system.backup_heating_capacity, 0.01) assert_equal(hpwh_confined_space_without_mitigation, wh_system.hpwh_confined_space_without_mitigation) diff --git a/docs/source/workflow_inputs.rst b/docs/source/workflow_inputs.rst index 6f431c9db6..aafded8f3a 100644 --- a/docs/source/workflow_inputs.rst +++ b/docs/source/workflow_inputs.rst @@ -4247,10 +4247,11 @@ Each heat pump water heater is entered as a ``/HPXML/Building/BuildingDetails/Sy ``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 + ``BackupHeatingCapacity`` double Btu/hr >= 0 No See [#]_ 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 HPWH operating mode [#]_ + ``HPWHVoltage`` string See [#]_ No 240V HPWH voltage ``HPWHDucting/ExhaustAirTermination`` string See [#]_ No The location where HPWH exhaust air is ducted to - ``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 [#]_ @@ -4277,11 +4278,13 @@ 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. - .. [#] OpenStudio-HPXML currently only supports ExhaustAirTermination="outside" for heat pump water heaters located in conditioned space. - Any other combination of ExhaustAirTermination value and water heater location will be ignored w/ a warning. + .. [#] If HeatingCapacity not provided, defaults to the Btu/hr equivalent of the heat pump COP multiplied by 0.5 kW if HPWHVoltage="240V", 0.422 kW if HPWHVoltage="120V dedicated circuit", or 0.357 if HPWHVoltage="120V shared circuit" or "120V". + .. [#] If BackupHeatingCapacity not provided, defaults to 15355 (4.5 kW) if HPWHVoltage="240V" or 0 (no backup elements) for 120V systems. .. [#] HPWHOperatingMode choices are "hybrid/auto" or "heat pump only". .. [#] The heat pump water heater operating mode can alternatively be defined using :ref:`schedules_detailed`. + .. [#] HPWHVoltage choices are "240V", "120V", "120V dedicated circuit", or "120V shared circuit". + .. [#] OpenStudio-HPXML currently only supports ExhaustAirTermination="outside" for heat pump water heaters located in conditioned space. + Any other combination of ExhaustAirTermination value and water heater location will be ignored w/ a warning. .. [#] UsageBin choices are "very small", "low", "medium", or "high". .. [#] UsageBin/FirstHourRating are only used for water heaters that use UniformEnergyFactor. If neither UsageBin nor FirstHourRating provided, UsageBin defaults to "medium". diff --git a/tasks.rb b/tasks.rb index 71b473be1b..3c0b24ed9d 100644 --- a/tasks.rb +++ b/tasks.rb @@ -2372,6 +2372,11 @@ def apply_hpxml_modification_sample_files(hpxml_path, hpxml) elsif ['base-dhw-tank-gas-fhr.xml'].include? hpxml_file hpxml_bldg.water_heating_systems[0].first_hour_rating = 56.0 hpxml_bldg.water_heating_systems[0].usage_bin = nil + # FIXME: Add 120V options to BuildResidentialHPXML measure? + elsif ['base-dhw-tank-heat-pump-120v.xml'].include? hpxml_file + hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120 + elsif ['base-dhw-tank-heat-pump-120v-dedicated-circuit.xml'].include? hpxml_file + hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120Dedicated elsif ['base-dhw-tank-heat-pump-confined-space.xml'].include? hpxml_file hpxml_bldg.water_heating_systems[0].hpwh_confined_space_without_mitigation = true hpxml_bldg.water_heating_systems[0].hpwh_containment_volume = 453 diff --git a/workflow/hpxml_inputs.json b/workflow/hpxml_inputs.json index 4dbcdb5804..49865ad982 100644 --- a/workflow/hpxml_inputs.json +++ b/workflow/hpxml_inputs.json @@ -952,6 +952,12 @@ "parent_hpxml": "sample_files/base.xml", "dhw_water_heater": "Electricity, Heat Pump, UEF 3.50" }, + "sample_files/base-dhw-tank-heat-pump-120v.xml": { + "parent_hpxml": "sample_files/base-dhw-tank-heat-pump.xml" + }, + "sample_files/base-dhw-tank-heat-pump-120v-dedicated-circuit.xml": { + "parent_hpxml": "sample_files/base-dhw-tank-heat-pump.xml" + }, "sample_files/base-dhw-tank-heat-pump-confined-space.xml": { "parent_hpxml": "sample_files/base-dhw-tank-heat-pump.xml" }, diff --git a/workflow/sample_files/base-dhw-tank-heat-pump-120v-dedicated.xml b/workflow/sample_files/base-dhw-tank-heat-pump-120v-dedicated.xml new file mode 100644 index 0000000000..2be1d31e5e --- /dev/null +++ b/workflow/sample_files/base-dhw-tank-heat-pump-120v-dedicated.xml @@ -0,0 +1,517 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + + Default + + + + + + + + +
+ CO +
+
+ + proposed workscope + + + + + 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 + + + + + + + + + false + + + + + + + + + + + + + true + + + + + + + + + + + attic - unvented + 1509.3 + asphalt or fiberglass shingles + light + 6.0 + + + 2.3 + + + + + + + outside + basement - conditioned + 115.6 + wood siding + medium + + + 13.9 + + + + + + + outside + conditioned space + + + + 1200.0 + wood siding + medium + + + 22.7 + + + + + outside + attic - unvented + gable + + + + 225.0 + wood siding + medium + + + 4.0 + + + + + + + ground + basement - conditioned + solid concrete + 8.0 + 1200.0 + 7.0 + + + + continuous - exterior + 10.0 + + + continuous - interior + 0.0 + + + + + + + + attic - unvented + conditioned space + ceiling + + + + 1350.0 + + + 39.6 + + + + + + + basement - conditioned + 1350.0 + 150.0 + + + + 0.0 + 0.0 + + + + + + 0.0 + 0.0 + + + + 0.0 + 0.0 + + + + + + + 108.0 + 0 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + 72.0 + 90 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + 108.0 + 180 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + 72.0 + 270 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + + + + 40.0 + 180 + 4.4 + + + + + + + + + + + + + + + + + natural gas + 35000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 24000.0 + single stage + 1.0 + + SEER2 + 13.4 + + + + + + 68.0 + 78.0 + + + + + + regular velocity + + supply + + CFM25 + 81.0 + to outside + + + + return + + CFM25 + 27.0 + to outside + + + + + supply + 4.0 + attic - unvented + 0.75 + + + + return + 4.0 + attic - unvented + 0.75 + + + + supply + 0.0 + conditioned space + 0.25 + + + + return + 0.0 + conditioned space + 0.25 + + + + 2700.0 + + + + + + electricity + heat pump water heater + conditioned space + 1.0 + 3.5 + 120V dedicated circuit + + + + + + + + 0.0 + + + + + shower head + false + + + + faucet + false + + + + + + + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + electricity + conventional + 3.73 + + + + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + 650.0 + + + + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + interior + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.4 + + + + + + + exterior + 0.1 + + + + + + + exterior + 0.25 + + + + + + + + + TV other + + + + other + + + +
+
\ No newline at end of file diff --git a/workflow/sample_files/base-dhw-tank-heat-pump-120v.xml b/workflow/sample_files/base-dhw-tank-heat-pump-120v.xml new file mode 100644 index 0000000000..4fa1092ff4 --- /dev/null +++ b/workflow/sample_files/base-dhw-tank-heat-pump-120v.xml @@ -0,0 +1,517 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + + Default + + + + + + + + +
+ CO +
+
+ + proposed workscope + + + + + 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 + + + + + + + + + false + + + + + + + + + + + + + true + + + + + + + + + + + attic - unvented + 1509.3 + asphalt or fiberglass shingles + light + 6.0 + + + 2.3 + + + + + + + outside + basement - conditioned + 115.6 + wood siding + medium + + + 13.9 + + + + + + + outside + conditioned space + + + + 1200.0 + wood siding + medium + + + 22.7 + + + + + outside + attic - unvented + gable + + + + 225.0 + wood siding + medium + + + 4.0 + + + + + + + ground + basement - conditioned + solid concrete + 8.0 + 1200.0 + 7.0 + + + + continuous - exterior + 10.0 + + + continuous - interior + 0.0 + + + + + + + + attic - unvented + conditioned space + ceiling + + + + 1350.0 + + + 39.6 + + + + + + + basement - conditioned + 1350.0 + 150.0 + + + + 0.0 + 0.0 + + + + + + 0.0 + 0.0 + + + + 0.0 + 0.0 + + + + + + + 108.0 + 0 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + 72.0 + 90 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + 108.0 + 180 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + 72.0 + 270 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + + + + 40.0 + 180 + 4.4 + + + + + + + + + + + + + + + + + natural gas + 35000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 24000.0 + single stage + 1.0 + + SEER2 + 13.4 + + + + + + 68.0 + 78.0 + + + + + + regular velocity + + supply + + CFM25 + 81.0 + to outside + + + + return + + CFM25 + 27.0 + to outside + + + + + supply + 4.0 + attic - unvented + 0.75 + + + + return + 4.0 + attic - unvented + 0.75 + + + + supply + 0.0 + conditioned space + 0.25 + + + + return + 0.0 + conditioned space + 0.25 + + + + 2700.0 + + + + + + electricity + heat pump water heater + conditioned space + 1.0 + 3.5 + 120V + + + + + + + + 0.0 + + + + + shower head + false + + + + faucet + false + + + + + + + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + electricity + conventional + 3.73 + + + + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + 650.0 + + + + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + interior + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.4 + + + + + + + exterior + 0.1 + + + + + + + exterior + 0.25 + + + + + + + + + TV other + + + + other + + + +
+
\ No newline at end of file From 691ac202cf2eaa98ace236e695ab77532091bc23 Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Mon, 20 Apr 2026 15:16:05 -0600 Subject: [PATCH 02/11] Add changelog [ci skip] --- Changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.md b/Changelog.md index 3293871a4b..2ad9bd7298 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,7 @@ __New Features__ - HVAC updates: - Dual-fuel heat pumps with switchover temperatures > 25F are now autosized based on 25F to allow some additional heating capacity buffer. - Improves handling of duct leakage specified using cfm25/cfm50. +- Allows modeling 120V HPWHs (including dedicated vs shared circuits) using `WaterHeatingSystem/HPWHVoltage`. - Allows "other" for `SoilType`; adds variation to dry/wet soil conductivity and diffusivity values for unknown/other/loam soil types. - Output updates: - **Breaking change**: Annual peak load outputs for heating and cooling now use units of Btu/h instead of kBtu/h for consistency with other outputs. From 5406d3fa91bcdb600341bf7bf87965e1ded85bd1 Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Tue, 21 Apr 2026 08:56:01 -0600 Subject: [PATCH 03/11] Electric panel defaults. --- HPXMLtoOpenStudio/measure.xml | 8 ++++---- HPXMLtoOpenStudio/resources/defaults.rb | 13 +++++++++++-- HPXMLtoOpenStudio/tests/test_electric_panel.rb | 12 ++++++++++++ docs/source/workflow_inputs.rst | 2 +- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml index 676a0a59ae..9caf2d45bd 100644 --- a/HPXMLtoOpenStudio/measure.xml +++ b/HPXMLtoOpenStudio/measure.xml @@ -3,8 +3,8 @@ 3.1 hpxm_lto_openstudio b1543b30-9465-45ff-ba04-1d1f85e763bc - 5d713bd1-7112-4476-b90c-345beb3c2396 - 2026-04-20T20:53:16Z + bb53f278-16ba-4c25-83fd-2f3720cbc46f + 2026-04-21T14:47:16Z D8922A73 HPXMLtoOpenStudio HPXML to OpenStudio Translator @@ -367,7 +367,7 @@ defaults.rb rb resource - 75C2D076 + 56544C23
electric_panel.rb @@ -757,7 +757,7 @@ test_electric_panel.rb rb test - AA418017 + 136492CA test_enclosure.rb diff --git a/HPXMLtoOpenStudio/resources/defaults.rb b/HPXMLtoOpenStudio/resources/defaults.rb index bcb4c57e90..7daaafd046 100644 --- a/HPXMLtoOpenStudio/resources/defaults.rb +++ b/HPXMLtoOpenStudio/resources/defaults.rb @@ -6849,8 +6849,17 @@ def self.get_branch_circuit_voltage_default_values(branch_circuit) end elsif component.is_a?(HPXML::PVSystem) voltages << HPXML::ElectricPanelVoltage240 - elsif component.is_a?(HPXML::WaterHeatingSystem) || - component.is_a?(HPXML::ClothesDryer) || + elsif component.is_a?(HPXML::WaterHeatingSystem) + if component.fuel_type == HPXML::FuelTypeElectricity + if component.hpwh_voltage.nil? # Not HPWH + voltages << HPXML::ElectricPanelVoltage240 + elsif component.hpwh_voltage == HPXML::HPWHVoltage240 + voltages << HPXML::ElectricPanelVoltage240 + else # 120V HPWH + voltages << HPXML::ElectricPanelVoltage120 + end + end + elsif component.is_a?(HPXML::ClothesDryer) || component.is_a?(HPXML::CookingRange) if component.fuel_type == HPXML::FuelTypeElectricity voltages << HPXML::ElectricPanelVoltage240 diff --git a/HPXMLtoOpenStudio/tests/test_electric_panel.rb b/HPXMLtoOpenStudio/tests/test_electric_panel.rb index 999f7b45aa..87b4fa7e18 100644 --- a/HPXMLtoOpenStudio/tests/test_electric_panel.rb +++ b/HPXMLtoOpenStudio/tests/test_electric_panel.rb @@ -636,6 +636,18 @@ def test_water_heater_hpwh_without_backup _test_occupied_spaces(hpxml_bldg, [HPXML::ElectricPanelLoadTypeWaterHeater], 2) end + def test_water_heater_hpwh_120v + args_hash = { 'hpxml_path' => File.absolute_path(@tmp_hpxml_path), + 'skip_validation' => true } + + hpxml, _hpxml_bldg = _create_hpxml('base-dhw-tank-heat-pump-120v.xml') + XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path) + _model, _hpxml, hpxml_bldg = _test_measure(args_hash) + + _test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeWaterHeater, 1218) + _test_occupied_spaces(hpxml_bldg, [HPXML::ElectricPanelLoadTypeWaterHeater], 1) + end + def test_clothes_dryer_conventional args_hash = { 'hpxml_path' => File.absolute_path(@tmp_hpxml_path), 'skip_validation' => true } diff --git a/docs/source/workflow_inputs.rst b/docs/source/workflow_inputs.rst index aafded8f3a..eaf79fd9b0 100644 --- a/docs/source/workflow_inputs.rst +++ b/docs/source/workflow_inputs.rst @@ -4820,7 +4820,7 @@ Individual branch circuits entered in ``BranchCircuits/BranchCircuit``. \- ``HeatPump[HeatPumpFuel="electricity"]``: 240 - \- ``WaterHeatingSystem[FuelType="electricity"]``: 240 + \- ``WaterHeatingSystem[FuelType="electricity"]``: 240, or 120 if a heat pump water heater with HPWHVoltage=120V \- ``ClothesDryer[FuelType="electricity"]``: 240 From ea6c9c8529b60c584f989773d45a80a8ebb86e80 Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Tue, 21 Apr 2026 11:34:52 -0600 Subject: [PATCH 04/11] Address CI errors --- HPXMLtoOpenStudio/measure.xml | 6 +++--- HPXMLtoOpenStudio/tests/test_schedules.rb | 4 ++-- workflow/tests/util.rb | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml index 9caf2d45bd..583f3ff12d 100644 --- a/HPXMLtoOpenStudio/measure.xml +++ b/HPXMLtoOpenStudio/measure.xml @@ -3,8 +3,8 @@ 3.1 hpxm_lto_openstudio b1543b30-9465-45ff-ba04-1d1f85e763bc - bb53f278-16ba-4c25-83fd-2f3720cbc46f - 2026-04-21T14:47:16Z + df932244-d83e-467f-8b3d-10bf748b17e1 + 2026-04-21T17:27:19Z D8922A73 HPXMLtoOpenStudio HPXML to OpenStudio Translator @@ -817,7 +817,7 @@ test_schedules.rb rb test - D5468D70 + 351A6D6D test_simcontrols.rb diff --git a/HPXMLtoOpenStudio/tests/test_schedules.rb b/HPXMLtoOpenStudio/tests/test_schedules.rb index c778b8af54..b883d22e4d 100644 --- a/HPXMLtoOpenStudio/tests/test_schedules.rb +++ b/HPXMLtoOpenStudio/tests/test_schedules.rb @@ -50,7 +50,7 @@ def test_default_schedules args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base.xml')) model, _hpxml, _hpxml_bldg = _test_measure(args_hash) - schedule_constants = 13 + schedule_constants = 14 schedule_rulesets = 16 schedule_fixed_intervals = 0 schedule_files = 0 @@ -80,7 +80,7 @@ def test_simple_schedules args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base-schedules-simple.xml')) model, _hpxml, _hpxml_bldg = _test_measure(args_hash) - schedule_constants = 12 + schedule_constants = 13 schedule_rulesets = 20 schedule_fixed_intervals = 0 schedule_files = 0 diff --git a/workflow/tests/util.rb b/workflow/tests/util.rb index a6fc9d3bd6..04ae789678 100644 --- a/workflow/tests/util.rb +++ b/workflow/tests/util.rb @@ -357,6 +357,7 @@ def _verify_outputs(rundir, hpxml_path, results, hpxml, unit_multiplier) next if message.include?('setupIHGOutputs: Output variables=Zone Other Equipment') && message.include?('are not available.') next if message.include?('setupIHGOutputs: Output variables=Space Other Equipment') && message.include?('are not available') next if message.include? 'Multiple speed fan will be applied to this unit. The speed number is determined by load.' + next if message.include? 'Target water temperature should be less than or equal to the hot water temperature' # FIXME: Temporary # HPWHs if hpxml.buildings.any? { |hpxml_bldg| hpxml_bldg.water_heating_systems.count { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump } > 0 } From bd553d2749c5c287b734bed9470f313a9a2220f3 Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Fri, 24 Apr 2026 10:53:46 -0600 Subject: [PATCH 05/11] Require water heater setpoint between 105F and 160F. --- .../resources/hpxml_schematron/EPvalidator.sch | 10 ++-------- HPXMLtoOpenStudio/tests/test_validation.rb | 12 ++++++++---- docs/source/workflow_inputs.rst | 10 +++++----- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch index 1bff796892..ce5b133bc1 100644 --- a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch +++ b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch @@ -2079,6 +2079,8 @@ Expected ../HotWaterDistribution Expected ../WaterFixture Expected WaterHeaterType to be 'storage water heater' or 'instantaneous water heater' or 'heat pump water heater' or 'space-heating boiler with storage tank' or 'space-heating boiler with tankless coil' + Expected HotWaterTemperature to be greater than or equal to 105 deg-F + Expected HotWaterTemperature to be less than or equal to 160 deg-F @@ -2100,7 +2102,6 @@ UniformEnergyFactor should typically be greater than or equal to 0.45. EnergyFactor should typically be greater than or equal to 0.45. Heating capacity should typically be greater than or equal to 1000 Btu/hr. - Hot water setpoint should typically be greater than or equal to 110 deg-F. @@ -2123,7 +2124,6 @@ UniformEnergyFactor should typically be greater than or equal to 0.45. EnergyFactor should typically be greater than or equal to 0.45. - Hot water setpoint should typically be greater than or equal to 110 deg-F. @@ -2142,8 +2142,6 @@ Expected extension/HPWHInConfinedSpaceWithoutMitigation to be 'true' or 'false' extension/OperatingMode has been replaced by HPWHOperatingMode - - Hot water setpoint should typically be greater than or equal to 110 deg-F. @@ -2169,8 +2167,6 @@ Expected no RecoveryEfficiency Expected no UsesDesuperheater=true Expected RelatedHVACSystem - - Hot water setpoint should typically be greater than or equal to 110 deg-F. @@ -2189,8 +2185,6 @@ Expected no StandbyLoss[Units="F/hr"]/Value Expected no UsesDesuperheater=true Expected RelatedHVACSystem - - Hot water setpoint should typically be greater than or equal to 110 deg-F. diff --git a/HPXMLtoOpenStudio/tests/test_validation.rb b/HPXMLtoOpenStudio/tests/test_validation.rb index f7cc2fd8d1..f591945b01 100644 --- a/HPXMLtoOpenStudio/tests/test_validation.rb +++ b/HPXMLtoOpenStudio/tests/test_validation.rb @@ -76,6 +76,8 @@ def test_schema_schematron_error_messages 'dhw-frac-load-served' => ['Expected sum(FractionDHWLoadServed) to be 1 [context: /HPXML/Building/BuildingDetails, id: "MyBuilding"]'], 'dhw-invalid-ef-tank' => ['Expected EnergyFactor to be less than 1 [context: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem[WaterHeaterType="storage water heater"], id: "WaterHeatingSystem1"]'], 'dhw-invalid-uef-tank-heat-pump' => ['Expected UniformEnergyFactor to be greater than 1 [context: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem[WaterHeaterType="heat pump water heater"], id: "WaterHeatingSystem1"]'], + 'dhw-setpoint-low' => ['Expected HotWaterTemperature to be greater than or equal to 105 deg-F'], + 'dhw-setpoint-high' => ['Expected HotWaterTemperature to be less than or equal to 160 deg-F'], 'dishwasher-location' => ['A location is specified as "garage" but no surfaces were found adjacent to this space type.'], 'duct-leakage-cfm25' => ["The value '-2.0' is less than the minimum value allowed", "The value '-3.0' is less than the minimum value allowed"], @@ -326,6 +328,12 @@ def test_schema_schematron_error_messages when 'dhw-invalid-uef-tank-heat-pump' hpxml, hpxml_bldg = _create_hpxml('base-dhw-tank-heat-pump.xml') hpxml_bldg.water_heating_systems[0].uniform_energy_factor = 1.0 + when 'dhw-setpoint-low' + hpxml, hpxml_bldg = _create_hpxml('base.xml') + hpxml_bldg.water_heating_systems[0].temperature = 100 + when 'dhw-setpoint-high' + hpxml, hpxml_bldg = _create_hpxml('base.xml') + hpxml_bldg.water_heating_systems[0].temperature = 200 when 'dishwasher-location' hpxml, hpxml_bldg = _create_hpxml('base.xml') hpxml_bldg.dishwashers[0].location = HPXML::LocationGarage @@ -991,7 +999,6 @@ def test_schema_schematron_warning_messages 'EnergyFactor should typically be greater than or equal to 0.45.', 'EnergyFactor should typically be greater than or equal to 0.45.', 'No space cooling specified, the model will not include space cooling energy use.'], - '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.'], 'ev-charging-methods' => ['Electric vehicle charging was specified as both a PlugLoad and a Vehicle, the latter will be ignored.'], @@ -1094,9 +1101,6 @@ def test_schema_schematron_warning_messages water_heating_system.energy_factor = 0.1 end end - when 'dhw-setpoint-low' - hpxml, hpxml_bldg = _create_hpxml('base.xml') - hpxml_bldg.water_heating_systems[0].temperature = 100 when 'erv-atre-low' hpxml, hpxml_bldg = _create_hpxml('base-mechvent-erv-atre-asre.xml') hpxml_bldg.ventilation_fans[0].total_recovery_efficiency_adjusted = 0.1 diff --git a/docs/source/workflow_inputs.rst b/docs/source/workflow_inputs.rst index 0e9a92a28f..df97c23432 100644 --- a/docs/source/workflow_inputs.rst +++ b/docs/source/workflow_inputs.rst @@ -4146,7 +4146,7 @@ Each conventional storage water heater is entered as a ``/HPXML/Building/Buildin ``UsageBin`` or ``FirstHourRating`` string or double str or gal/hr See [#]_ or > 0 No See [#]_ EnergyGuide label usage bin/first hour rating ``RecoveryEfficiency`` double frac > 0, <= 1 [#]_ No See [#]_ Recovery efficiency ``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 [#]_ + ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_ ``extension/TankModelType`` string See [#]_ No mixed Tank model type ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly @@ -4202,7 +4202,7 @@ Each instantaneous tankless water heater is entered as a ``/HPXML/Building/Build ``PerformanceAdjustment`` double frac >= 0, <= 1 No See [#]_ Multiplier on efficiency, typically to account for cycling ``FractionDHWLoadServed`` double frac >= 0, <= 1 [#]_ Yes Fraction of hot water load served [#]_ ``UniformEnergyFactor`` or ``EnergyFactor`` double frac < 1 Yes EnergyGuide label rated efficiency - ``HotWaterTemperature`` double F > 0 No 125 Water heater setpoint [#]_ + ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_ ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly =========================================== ======= ============ ========================== ============ ======== ========================================================== @@ -4250,7 +4250,7 @@ Each heat pump water heater is entered as a ``/HPXML/Building/BuildingDetails/Sy ``HPWHDucting/ExhaustAirTermination`` string See [#]_ No The location where HPWH exhaust air is ducted to ``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 [#]_ + ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_ ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly ``extension/HPWHInConfinedSpaceWithoutMitigation`` boolean No false Whether HPWH is installed in confined space without mitigation [#]_ @@ -4316,7 +4316,7 @@ Each combination boiler w/ storage tank (sometimes referred to as an indirect wa ``FractionDHWLoadServed`` double frac >= 0, <= 1 [#]_ Yes Fraction of hot water load served [#]_ ``WaterHeaterInsulation/Jacket/JacketRValue`` double F-ft2-hr/Btu >= 0 No 0 R-value of additional storage tank insulation wrap ``StandbyLoss[Units="F/hr"]/Value`` double F/hr > 0 No See [#]_ Storage tank standby losses - ``HotWaterTemperature`` double F > 0 No 125 Water heater setpoint [#]_ + ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ ``RelatedHVACSystem`` idref See [#]_ Yes ID of boiler ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly ============================================= ======= ============ ====================================== ============ ======== ================================================== @@ -4355,7 +4355,7 @@ Each combination boiler w/ tankless coil is entered as a ``/HPXML/Building/Build ``Location`` string See [#]_ No See [#]_ Water heater location ``IsSharedSystem`` boolean No false Whether it serves multiple dwelling units or shared laundry room ``FractionDHWLoadServed`` double frac >= 0, <= 1 [#]_ Yes Fraction of hot water load served [#]_ - ``HotWaterTemperature`` double F > 0 No 125 Water heater setpoint [#]_ + ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ ``RelatedHVACSystem`` idref See [#]_ Yes ID of boiler ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly ==================================== ======= ===== ======================================= ============ ======== ================================================== From 785b97bbf44ca3053c7fdaec443f1d8206935fae Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Fri, 24 Apr 2026 12:50:56 -0600 Subject: [PATCH 06/11] Connect model to mixing value inputs, add sample file. Add defaults and tests. --- HPXMLtoOpenStudio/measure.xml | 20 +- HPXMLtoOpenStudio/resources/defaults.rb | 16 + .../resources/hotwater_appliances.rb | 19 +- HPXMLtoOpenStudio/resources/hpxml.rb | 6 + .../hpxml_schematron/EPvalidator.sch | 14 +- HPXMLtoOpenStudio/tests/test_defaults.rb | 51 +- .../tests/test_hotwater_appliance.rb | 36 ++ HPXMLtoOpenStudio/tests/test_validation.rb | 15 +- HPXMLtoOpenStudio/tests/test_water_heater.rb | 158 ++---- docs/source/workflow_inputs.rst | 138 +++-- tasks.rb | 4 +- workflow/hpxml_inputs.json | 3 + ...-dhw-setpoint-temperature-mixing-valve.xml | 519 ++++++++++++++++++ ...tank-heat-pump-120v-dedicated-circuit.xml} | 0 14 files changed, 782 insertions(+), 217 deletions(-) create mode 100644 workflow/sample_files/base-dhw-setpoint-temperature-mixing-valve.xml rename workflow/sample_files/{base-dhw-tank-heat-pump-120v-dedicated.xml => base-dhw-tank-heat-pump-120v-dedicated-circuit.xml} (100%) diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml index 7b328f8863..fede0de212 100644 --- a/HPXMLtoOpenStudio/measure.xml +++ b/HPXMLtoOpenStudio/measure.xml @@ -3,8 +3,8 @@ 3.1 hpxml_to_openstudio b1543b30-9465-45ff-ba04-1d1f85e763bc - 1a7d66ea-1ceb-4654-9c76-32706e9c0976 - 2026-04-24T17:00:12Z + c980a5fe-f488-4bf0-b4d9-0ffc67d8ed04 + 2026-04-24T18:49:10Z D8922A73 HPXMLToOpenStudio HPXML to OpenStudio Translator @@ -367,7 +367,7 @@ defaults.rb rb resource - 56544C23 + 93CB275C electric_panel.rb @@ -397,13 +397,13 @@ hotwater_appliances.rb rb resource - 4C480CE0 + 82516F0C hpxml.rb rb resource - 2DDC012A + 3C44E95B hpxml_schema/HPXML.xsd @@ -421,7 +421,7 @@ hpxml_schematron/EPvalidator.sch sch resource - EE85C191 + 28F4F984 hpxml_schematron/iso-schematron.xsd @@ -751,7 +751,7 @@ test_defaults.rb rb test - DF687C7C + A92459FD test_electric_panel.rb @@ -775,7 +775,7 @@ test_hotwater_appliance.rb rb test - 6DBBC0A9 + 0A4D986F test_hvac.rb @@ -829,7 +829,7 @@ test_validation.rb rb test - B0031C19 + 5CB53465 test_vehicle.rb @@ -841,7 +841,7 @@ test_water_heater.rb rb test - 8DBA3BD3 + 61A61CD2 test_weather.rb diff --git a/HPXMLtoOpenStudio/resources/defaults.rb b/HPXMLtoOpenStudio/resources/defaults.rb index 7daaafd046..f418a84427 100644 --- a/HPXMLtoOpenStudio/resources/defaults.rb +++ b/HPXMLtoOpenStudio/resources/defaults.rb @@ -3403,6 +3403,22 @@ def self.apply_water_heaters(hpxml_bldg, eri_version, schedules_file) end end + + if water_heating_system.has_mixing_valve.nil? + if water_heating_system.water_heater_type == HPXML::WaterHeaterTypeHeatPump && water_heating_system.hpwh_voltage != HPXML::HPWHVoltage240 + # 120V HPWH + water_heating_system.has_mixing_valve = true + else + water_heating_system.has_mixing_valve = false + end + water_heating_system.has_mixing_valve_isdefaulted = true + end + + if water_heating_system.has_mixing_valve && water_heating_system.mixing_valve_setpoint.nil? + water_heating_system.mixing_valve_setpoint = [125.0, water_heating_system.temperature].min + water_heating_system.mixing_valve_setpoint_isdefaulted = true + end + next unless water_heating_system.location.nil? iecc_zone = hpxml_bldg.climate_and_risk_zones.climate_zone_ieccs.empty? ? nil : hpxml_bldg.climate_and_risk_zones.climate_zone_ieccs[0].zone diff --git a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb index be107963b1..c0b71d90d8 100644 --- a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +++ b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb @@ -352,15 +352,6 @@ def self.apply(runner, model, weather, spaces, hpxml_bldg, hpxml_header, schedul limits: EPlus::ScheduleTypeLimitsTemperature ) - # FIXME: Use HPXML HasMixingValve and MixingValueSetpoint elements? - # FIXME: Should this be min(125.0, t_set)? - hw_temp_schedule = Model.add_schedule_constant( - model, - name: 'hot water temperature schedule', - value: UnitConversions.convert(125.0, 'F', 'C'), - limits: EPlus::ScheduleTypeLimitsTemperature - ) - water_heating = hpxml_bldg.water_heating # Create schedule @@ -389,6 +380,16 @@ def self.apply(runner, model, weather, spaces, hpxml_bldg, hpxml_header, schedul hpxml_bldg.water_heating_systems.each do |water_heating_system| non_solar_fraction = 1.0 - Waterheater.get_water_heater_solar_fraction(water_heating_system, hpxml_bldg) + hw_temp_schedule = nil + if water_heating_system.has_mixing_valve + hw_temp_schedule = Model.add_schedule_constant( + model, + name: 'hot water temperature schedule', + value: UnitConversions.convert(water_heating_system.mixing_valve_setpoint, 'F', 'C'), + limits: EPlus::ScheduleTypeLimitsTemperature + ) + end + gpd_frac = water_heating_system.fraction_dhw_load_served # Fixtures fraction if gpd_frac > 0 diff --git a/HPXMLtoOpenStudio/resources/hpxml.rb b/HPXMLtoOpenStudio/resources/hpxml.rb index 3e653e2330..741921c214 100644 --- a/HPXMLtoOpenStudio/resources/hpxml.rb +++ b/HPXMLtoOpenStudio/resources/hpxml.rb @@ -8609,6 +8609,8 @@ class WaterHeatingSystem < BaseElement :standby_loss_units, # [String] StandbyLoss/Units (HPXML::UnitsXXX) :standby_loss_value, # [Double] StandbyLoss/Value :temperature, # [Double] HotWaterTemperature (F) + :has_mixing_valve, # [Boolean] HasMixingValve + :mixing_valve_setpoint, # [Double] MixingValveSetpoint (F) :uses_desuperheater, # [Boolean] UsesDesuperheater :related_hvac_idref, # [String] RelatedHVACSystem/@idref :tank_model_type, # [String] extension/TankModelType (HPXML::WaterHeaterTankModelTypeXXX) @@ -8723,6 +8725,8 @@ def to_doc(building) XMLHelper.add_element(standby_loss, 'Value', @standby_loss_value, :float, @standby_loss_value_isdefaulted) end XMLHelper.add_element(water_heating_system, 'HotWaterTemperature', @temperature, :float, @temperature_isdefaulted) unless @temperature.nil? + XMLHelper.add_element(water_heating_system, 'HasMixingValve', @has_mixing_valve, :boolean, @has_mixing_valve_isdefaulted) unless @has_mixing_valve.nil? + XMLHelper.add_element(water_heating_system, 'MixingValveSetpoint', @mixing_valve_setpoint, :float, @mixing_valve_setpoint_isdefaulted) unless @mixing_valve_setpoint.nil? XMLHelper.add_element(water_heating_system, 'UsesDesuperheater', @uses_desuperheater, :boolean) unless @uses_desuperheater.nil? if not @related_hvac_idref.nil? related_hvac_idref_el = XMLHelper.add_element(water_heating_system, 'RelatedHVACSystem') @@ -8769,6 +8773,8 @@ def from_doc(water_heating_system) @standby_loss_units = XMLHelper.get_value(water_heating_system, 'StandbyLoss/Units', :string) @standby_loss_value = XMLHelper.get_value(water_heating_system, 'StandbyLoss/Value', :float) @temperature = XMLHelper.get_value(water_heating_system, 'HotWaterTemperature', :float) + @has_mixing_valve = XMLHelper.get_value(water_heating_system, 'HasMixingValve', :boolean) + @mixing_valve_setpoint = XMLHelper.get_value(water_heating_system, 'MixingValveSetpoint', :float) @uses_desuperheater = XMLHelper.get_value(water_heating_system, 'UsesDesuperheater', :boolean) @related_hvac_idref = HPXML::get_idref(XMLHelper.get_element(water_heating_system, 'RelatedHVACSystem')) @tank_model_type = XMLHelper.get_value(water_heating_system, 'extension/TankModelType', :string) diff --git a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch index ce5b133bc1..36d49f543e 100644 --- a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch +++ b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch @@ -2079,8 +2079,12 @@ Expected ../HotWaterDistribution Expected ../WaterFixture Expected WaterHeaterType to be 'storage water heater' or 'instantaneous water heater' or 'heat pump water heater' or 'space-heating boiler with storage tank' or 'space-heating boiler with tankless coil' + Expected Location to be 'conditioned space' or 'basement - unconditioned' or 'basement - conditioned' or 'attic - unvented' or 'attic - vented' or 'garage' or 'crawlspace - unvented' or 'crawlspace - vented' or 'crawlspace - conditioned' or 'other exterior' or 'other housing unit' or 'other heated space' or 'other multifamily buffer space' or 'other non-freezing space' + Expected FractionDHWLoadServed Expected HotWaterTemperature to be greater than or equal to 105 deg-F Expected HotWaterTemperature to be less than or equal to 160 deg-F + Expected MixingValveSetpoint to be greater than or equal to 105 deg-F + Expected MixingValveSetpoint to be less than or equal to HotWaterTemperature @@ -2088,8 +2092,6 @@ [WaterHeatingSystemType=Tank] Expected FuelType to be 'natural gas' or 'fuel oil' or 'fuel oil 1' or 'fuel oil 2' or 'fuel oil 4' or 'fuel oil 5/6' or 'diesel' or 'propane' or 'kerosene' or 'coal' or 'coke' or 'bituminous coal' or 'anthracite coal' or 'electricity' or 'wood' or 'wood pellets' - Expected Location to be 'conditioned space' or 'basement - unconditioned' or 'basement - conditioned' or 'attic - unvented' or 'attic - vented' or 'garage' or 'crawlspace - unvented' or 'crawlspace - vented' or 'crawlspace - conditioned' or 'other exterior' or 'other housing unit' or 'other heated space' or 'other multifamily buffer space' or 'other non-freezing space' - Expected FractionDHWLoadServed Expected HeatingCapacity to be greater than 0. Expected UniformEnergyFactor or EnergyFactor but not both Expected UniformEnergyFactor to be less than 1 @@ -2116,8 +2118,6 @@ [WaterHeatingSystemType=Tankless] Expected FuelType to be 'natural gas' or 'fuel oil' or 'fuel oil 1' or 'fuel oil 2' or 'fuel oil 4' or 'fuel oil 5/6' or 'diesel' or 'propane' or 'kerosene' or 'coal' or 'coke' or 'bituminous coal' or 'anthracite coal' or 'electricity' or 'wood' or 'wood pellets' - Expected Location to be 'conditioned space' or 'basement - unconditioned' or 'basement - conditioned' or 'attic - unvented' or 'attic - vented' or 'garage' or 'crawlspace - unvented' or 'crawlspace - vented' or 'crawlspace - conditioned' or 'other exterior' or 'other housing unit' or 'other heated space' or 'other multifamily buffer space' or 'other non-freezing space' - Expected FractionDHWLoadServed Expected UniformEnergyFactor or EnergyFactor but not both Expected UniformEnergyFactor to be less than 1 Expected EnergyFactor to be less than 1 @@ -2131,8 +2131,6 @@ [WaterHeatingSystemType=HPWH] Expected FuelType to be 'electricity' - Expected Location to be 'conditioned space' or 'basement - unconditioned' or 'basement - conditioned' or 'attic - unvented' or 'attic - vented' or 'garage' or 'crawlspace - unvented' or 'crawlspace - vented' or 'crawlspace - conditioned' or 'other exterior' or 'other housing unit' or 'other heated space' or 'other multifamily buffer space' or 'other non-freezing space' - Expected FractionDHWLoadServed Expected HeatingCapacity to be greater than 0. Expected UniformEnergyFactor or EnergyFactor but not both Expected UniformEnergyFactor to be greater than 1 @@ -2159,8 +2157,6 @@ [WaterHeatingSystemType=CombiIndirect] Expected no FuelType - Expected Location to be 'conditioned space' or 'basement - unconditioned' or 'basement - conditioned' or 'attic - unvented' or 'attic - vented' or 'garage' or 'crawlspace - unvented' or 'crawlspace - vented' or 'crawlspace - conditioned' or 'other exterior' or 'other housing unit' or 'other heated space' or 'other multifamily buffer space' or 'other non-freezing space' - Expected FractionDHWLoadServed Expected no HeatingCapacity Expected no UniformEnergyFactor Expected no EnergyFactor @@ -2174,9 +2170,7 @@ [WaterHeatingSystemType=CombiTanklessCoil] Expected no FuelType - Expected Location to be 'conditioned space' or 'basement - unconditioned' or 'basement - conditioned' or 'attic - unvented' or 'attic - vented' or 'garage' or 'crawlspace - unvented' or 'crawlspace - vented' or 'crawlspace - conditioned' or 'other exterior' or 'other housing unit' or 'other heated space' or 'other multifamily buffer space' or 'other non-freezing space' Expected no TankVolume - Expected FractionDHWLoadServed Expected no HeatingCapacity Expected no UniformEnergyFactor Expected no EnergyFactor diff --git a/HPXMLtoOpenStudio/tests/test_defaults.rb b/HPXMLtoOpenStudio/tests/test_defaults.rb index a1e0070348..4169545ef5 100644 --- a/HPXMLtoOpenStudio/tests/test_defaults.rb +++ b/HPXMLtoOpenStudio/tests/test_defaults.rb @@ -3520,11 +3520,13 @@ def test_storage_water_heaters wh.tank_model_type = HPXML::WaterHeaterTankModelTypeStratified wh.first_hour_rating = nil wh.usage_bin = nil + wh.has_mixing_valve = true + wh.mixing_valve_setpoint = 108 end XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path) _default_hpxml, default_hpxml_bldg = _test_measure() _test_default_storage_water_heater_values(default_hpxml_bldg, - [true, 15000.0, 44.0, 0.95, HPXML::LocationConditionedSpace, 111, 0.90, HPXML::WaterHeaterTankModelTypeStratified]) + [true, 15000.0, 44.0, 0.95, HPXML::LocationConditionedSpace, 111, 0.90, HPXML::WaterHeaterTankModelTypeStratified, true, 108]) # Test inputs not overridden by defaults w/ Usage Bin hpxml_bldg.water_heating_systems.each do |wh| @@ -3557,11 +3559,12 @@ def test_storage_water_heaters wh.tank_model_type = nil wh.first_hour_rating = nil wh.usage_bin = nil + wh.mixing_valve_setpoint = nil end XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path) _default_hpxml, default_hpxml_bldg = _test_measure() _test_default_storage_water_heater_values(default_hpxml_bldg, - [false, 18766.7, 50.0, 0.98, HPXML::LocationBasementConditioned, 125, 0.9, HPXML::WaterHeaterTankModelTypeMixed]) + [false, 18766.7, 50.0, 0.98, HPXML::LocationBasementConditioned, 125, 0.9, HPXML::WaterHeaterTankModelTypeMixed, true, 125]) # Test defaults w/ 5-bedroom house & electric storage water heater hpxml, hpxml_bldg = _create_hpxml('base-enclosure-beds-5.xml') @@ -3573,11 +3576,12 @@ def test_storage_water_heaters wh.location = nil wh.temperature = nil wh.tank_model_type = nil + wh.has_mixing_valve = nil end XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path) _default_hpxml, default_hpxml_bldg = _test_measure() _test_default_storage_water_heater_values(default_hpxml_bldg, - [false, 18766.7, 66.0, 0.98, HPXML::LocationBasementConditioned, 125, 0.94, HPXML::WaterHeaterTankModelTypeMixed]) + [false, 18766.7, 66.0, 0.98, HPXML::LocationBasementConditioned, 125, 0.94, HPXML::WaterHeaterTankModelTypeMixed, false, nil]) # Test defaults w/ 3-bedroom house & 2 storage water heaters (1 electric and 1 natural gas) hpxml, hpxml_bldg = _create_hpxml('base-dhw-multiple.xml') @@ -3591,12 +3595,13 @@ def test_storage_water_heaters wh.location = nil wh.temperature = nil wh.tank_model_type = nil + wh.has_mixing_valve = nil end XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path) _default_hpxml, default_hpxml_bldg = _test_measure() _test_default_storage_water_heater_values(default_hpxml_bldg, - [false, 15354.6, 50.0, 0.98, HPXML::LocationBasementConditioned, 125, 0.94, HPXML::WaterHeaterTankModelTypeMixed], - [false, 36000.0, 40.0, 0.757, HPXML::LocationBasementConditioned, 125, 0.59, HPXML::WaterHeaterTankModelTypeMixed]) + [false, 15354.6, 50.0, 0.98, HPXML::LocationBasementConditioned, 125, 0.94, HPXML::WaterHeaterTankModelTypeMixed, false, nil], + [false, 36000.0, 40.0, 0.757, HPXML::LocationBasementConditioned, 125, 0.59, HPXML::WaterHeaterTankModelTypeMixed, false, nil]) end def test_tankless_water_heaters @@ -3631,9 +3636,11 @@ def test_heat_pump_water_heaters hpxml_bldg.water_heating_systems[0].backup_heating_capacity = 5000.0 hpxml_bldg.water_heating_systems[0].hpwh_confined_space_without_mitigation = true hpxml_bldg.water_heating_systems[0].hpwh_containment_volume = 800.0 + hpxml_bldg.water_heating_systems[0].has_mixing_valve = true + hpxml_bldg.water_heating_systems[0].mixing_valve_setpoint = 120 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::WaterHeaterHPWHOperatingModeHeatPumpOnly, HPXML::HPWHVoltage240, 4000.0, 5000.0, true]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [44.0, HPXML::WaterHeaterHPWHOperatingModeHeatPumpOnly, HPXML::HPWHVoltage240, 4000.0, 5000.0, true, true, 120]) # Test defaults hpxml_bldg.water_heating_systems[0].tank_volume = nil @@ -3642,27 +3649,29 @@ def test_heat_pump_water_heaters hpxml_bldg.water_heating_systems[0].heating_capacity = nil hpxml_bldg.water_heating_systems[0].backup_heating_capacity = nil hpxml_bldg.water_heating_systems[0].hpwh_confined_space_without_mitigation = nil + hpxml_bldg.water_heating_systems[0].mixing_valve_setpoint = 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage240, 6366.0, 15355.0, false]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage240, 6366.0, 15355.0, false, true, 125]) # Test defaults w/ 120V dedicated circuit hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120Dedicated + hpxml_bldg.water_heating_systems[0].has_mixing_valve = 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120Dedicated, 5184.0, 0.0, false]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120Dedicated, 5184.0, 0.0, false, false, nil]) # Test defaults w/ 120V shared circuit hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120Shared 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120Shared, 5116.0, 0.0, false]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120Shared, 5116.0, 0.0, false, false, nil]) # Test defaults w/ 120V (unspecified circuit) hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120, 5116.0, 0.0, false]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120, 5116.0, 0.0, false, false, nil]) # Test defaults w/ num occupants = 1, num bedrooms = 1 hpxml_bldg.water_heating_systems[0].hpwh_voltage = nil @@ -3670,14 +3679,14 @@ def test_heat_pump_water_heaters hpxml_bldg.building_occupancy.number_of_residents = 1 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::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage240, 6366.0, 15355.0, false]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [50.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage240, 6366.0, 15355.0, false, false, nil]) # Test defaults w/ num occupants = 10, num bedrooms = 1 hpxml_bldg.building_construction.number_of_bedrooms = 1 hpxml_bldg.building_occupancy.number_of_residents = 10 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, [80.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage240, 6366.0, 15355.0, false]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [80.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage240, 6366.0, 15355.0, false, false, nil]) end def test_indirect_water_heaters @@ -6347,7 +6356,7 @@ def _test_default_storage_water_heater_values(hpxml_bldg, *expected_wh_values) storage_water_heaters = hpxml_bldg.water_heating_systems.select { |w| w.water_heater_type == HPXML::WaterHeaterTypeStorage } assert_equal(expected_wh_values.size, storage_water_heaters.size) storage_water_heaters.each_with_index do |wh_system, idx| - is_shared, heating_capacity, tank_volume, recovery_efficiency, location, temperature, efficiency, tank_model_type = expected_wh_values[idx] + is_shared, heating_capacity, tank_volume, recovery_efficiency, location, temperature, efficiency, tank_model_type, has_mix_valve, mix_valve_setpoint = expected_wh_values[idx] assert_equal(is_shared, wh_system.is_shared_system) assert_in_epsilon(heating_capacity, wh_system.heating_capacity, 0.01) @@ -6361,6 +6370,12 @@ def _test_default_storage_water_heater_values(hpxml_bldg, *expected_wh_values) assert_equal(efficiency, wh_system.energy_factor) end assert_equal(tank_model_type, wh_system.tank_model_type) + assert_equal(has_mix_valve, wh_system.has_mixing_valve) + if mix_valve_setpoint.nil? + assert_nil(wh_system.mixing_valve_setpoint) + else + assert_equal(mix_valve_setpoint, wh_system.mixing_valve_setpoint) + end end end @@ -6378,14 +6393,20 @@ 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, voltage, htg_cap, backup_htg_cap, hpwh_confined_space_without_mitigation = expected_wh_values[idx] + tank_volume, operating_mode, voltage, htg_cap, backup_htg_cap, hpwh_confined, has_mix_valve, mix_valve_setpoint = expected_wh_values[idx] assert_equal(tank_volume, wh_system.tank_volume) assert_equal(operating_mode, wh_system.hpwh_operating_mode) assert_equal(voltage, wh_system.hpwh_voltage) assert_in_epsilon(htg_cap, wh_system.heating_capacity, 0.01) assert_in_epsilon(backup_htg_cap, wh_system.backup_heating_capacity, 0.01) - assert_equal(hpwh_confined_space_without_mitigation, wh_system.hpwh_confined_space_without_mitigation) + assert_equal(hpwh_confined, wh_system.hpwh_confined_space_without_mitigation) + assert_equal(has_mix_valve, wh_system.has_mixing_valve) + if mix_valve_setpoint.nil? + assert_nil(wh_system.mixing_valve_setpoint) + else + assert_equal(mix_valve_setpoint, wh_system.mixing_valve_setpoint) + end end end diff --git a/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb b/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb index 128bd04100..736c240676 100644 --- a/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +++ b/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb @@ -109,6 +109,21 @@ def get_wu_gpd(model, name) end end + def get_wu_target_temp(model, name) + target_temps = [] + model.getWaterUseEquipments.each do |wue| + next unless wue.waterUseEquipmentDefinition.endUseSubcategory.start_with? name + next unless wue.waterUseEquipmentDefinition.targetTemperatureSchedule.is_initialized + + target_temps << UnitConversions.convert(wue.waterUseEquipmentDefinition.targetTemperatureSchedule.get.to_ScheduleConstant.get.value, 'C', 'F') + end + if target_temps.empty? + return + else + return target_temps.sum(0.0) / target_temps.size + end + end + def test_base hpxml_names = ['base.xml', 'base-misc-usage-multiplier.xml'] @@ -179,6 +194,13 @@ def test_base assert_in_delta(23.15, model.getSiteWaterMainsTemperature.maximumDifferenceInMonthlyAverageOutdoorAirTemperatures.get, 0.01) assert_in_delta(1.0, model.getSiteWaterMainsTemperature.temperatureMultiplier, 0.01) assert_in_delta(0.0, model.getSiteWaterMainsTemperature.temperatureOffset, 0.01) + + # target temperatures + mw_temp = 105 # deg-F + assert_in_delta(mw_temp, get_wu_target_temp(model, Constants::ObjectTypeFixtures), 0.01) + assert_in_delta(mw_temp, get_wu_target_temp(model, Constants::ObjectTypeDistributionWaste), 0.01) + assert_nil(get_wu_target_temp(model, Constants::ObjectTypeDishwasher)) + assert_nil(get_wu_target_temp(model, Constants::ObjectTypeClothesWasher)) end end @@ -466,6 +488,20 @@ def test_dhw_recirc_temp assert_in_delta(pump_kwh_yr, get_ee_kwh(model, Constants::ObjectTypeHotWaterRecircPump), 0.1) end + def test_dhw_mixing_valve + args_hash = {} + args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base-dhw-setpoint-temperature-mixing-valve.xml')) + model, _hpxml, hpxml_bldg = _test_measure(args_hash) + + # target temperatures + mw_temp = 105 # deg-F + hw_temp = hpxml_bldg.water_heating_systems[0].mixing_valve_setpoint + assert_in_delta(mw_temp, get_wu_target_temp(model, Constants::ObjectTypeFixtures), 0.01) + assert_in_delta(mw_temp, get_wu_target_temp(model, Constants::ObjectTypeDistributionWaste), 0.01) + assert_in_delta(hw_temp, get_wu_target_temp(model, Constants::ObjectTypeDishwasher), 0.01) + assert_in_delta(hw_temp, get_wu_target_temp(model, Constants::ObjectTypeClothesWasher), 0.01) + end + def test_appliances_none args_hash = {} args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base-appliances-none.xml')) diff --git a/HPXMLtoOpenStudio/tests/test_validation.rb b/HPXMLtoOpenStudio/tests/test_validation.rb index f591945b01..d1f7a7a0d7 100644 --- a/HPXMLtoOpenStudio/tests/test_validation.rb +++ b/HPXMLtoOpenStudio/tests/test_validation.rb @@ -76,8 +76,10 @@ def test_schema_schematron_error_messages 'dhw-frac-load-served' => ['Expected sum(FractionDHWLoadServed) to be 1 [context: /HPXML/Building/BuildingDetails, id: "MyBuilding"]'], 'dhw-invalid-ef-tank' => ['Expected EnergyFactor to be less than 1 [context: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem[WaterHeaterType="storage water heater"], id: "WaterHeatingSystem1"]'], 'dhw-invalid-uef-tank-heat-pump' => ['Expected UniformEnergyFactor to be greater than 1 [context: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem[WaterHeaterType="heat pump water heater"], id: "WaterHeatingSystem1"]'], - 'dhw-setpoint-low' => ['Expected HotWaterTemperature to be greater than or equal to 105 deg-F'], + 'dhw-mixing-valve-setpoint-high' => ['Expected MixingValveSetpoint to be less than or equal to HotWaterTemperature'], + 'dhw-mixing-valve-setpoint-low' => ['Expected MixingValveSetpoint to be greater than or equal to 105 deg-F'], 'dhw-setpoint-high' => ['Expected HotWaterTemperature to be less than or equal to 160 deg-F'], + 'dhw-setpoint-low' => ['Expected HotWaterTemperature to be greater than or equal to 105 deg-F'], 'dishwasher-location' => ['A location is specified as "garage" but no surfaces were found adjacent to this space type.'], 'duct-leakage-cfm25' => ["The value '-2.0' is less than the minimum value allowed", "The value '-3.0' is less than the minimum value allowed"], @@ -328,12 +330,19 @@ def test_schema_schematron_error_messages when 'dhw-invalid-uef-tank-heat-pump' hpxml, hpxml_bldg = _create_hpxml('base-dhw-tank-heat-pump.xml') hpxml_bldg.water_heating_systems[0].uniform_energy_factor = 1.0 - when 'dhw-setpoint-low' + when 'dhw-mixing-valve-setpoint-high' hpxml, hpxml_bldg = _create_hpxml('base.xml') - hpxml_bldg.water_heating_systems[0].temperature = 100 + hpxml_bldg.water_heating_systems[0].temperature = 130 + hpxml_bldg.water_heating_systems[0].mixing_valve_setpoint = 131 + when 'dhw-mixing-valve-setpoint-low' + hpxml, hpxml_bldg = _create_hpxml('base.xml') + hpxml_bldg.water_heating_systems[0].mixing_valve_setpoint = 100 when 'dhw-setpoint-high' hpxml, hpxml_bldg = _create_hpxml('base.xml') hpxml_bldg.water_heating_systems[0].temperature = 200 + when 'dhw-setpoint-low' + hpxml, hpxml_bldg = _create_hpxml('base.xml') + hpxml_bldg.water_heating_systems[0].temperature = 100 when 'dishwasher-location' hpxml, hpxml_bldg = _create_hpxml('base.xml') hpxml_bldg.dishwashers[0].location = HPXML::LocationGarage diff --git a/HPXMLtoOpenStudio/tests/test_water_heater.rb b/HPXMLtoOpenStudio/tests/test_water_heater.rb index f176b1209b..09c6502df0 100644 --- a/HPXMLtoOpenStudio/tests/test_water_heater.rb +++ b/HPXMLtoOpenStudio/tests/test_water_heater.rb @@ -944,117 +944,59 @@ def test_tank_combi_tankless end def test_tank_heat_pump - args_hash = {} - args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base-dhw-tank-heat-pump.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.926 - ther_eff = 1.0 - cop = 3.731 - tank_height = 1.3343 - cap = 500.0 * cop # W - backup_cap = 4500.0 # 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.01) - assert_in_epsilon(tank_height, wh.tankHeight.get, 0.01) - assert_in_epsilon(backup_cap, wh.heater1Capacity.get, 0.01) - assert_in_epsilon(backup_cap, wh.heater2Capacity, 0.01) - assert_in_epsilon(u, wh.uniformSkinLossCoefficientperUnitAreatoAmbientTemperature.get, 0.01) - assert_in_epsilon(ther_eff, wh.heaterThermalEfficiency, 0.01) - - # Check heat pump cooling coil cop - assert_in_epsilon(cop, coil.ratedCOP, 0.01) - assert_in_epsilon(cap, coil.ratedHeatingCapacity, 0.01) - end - - def test_tank_heat_pump_ef - args_hash = {} - args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base-dhw-tank-heat-pump-ef.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.92 - ther_eff = 1.0 - cop = 3.60 - tank_height = 1.5975 - cap = 500.0 * cop # W - backup_cap = 4500.0 # 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.01) - assert_in_epsilon(tank_height, wh.tankHeight.get, 0.01) - assert_in_epsilon(backup_cap, wh.heater1Capacity.get, 0.01) - assert_in_epsilon(backup_cap, wh.heater2Capacity, 0.01) - assert_in_epsilon(u, wh.uniformSkinLossCoefficientperUnitAreatoAmbientTemperature.get, 0.01) - assert_in_epsilon(ther_eff, wh.heaterThermalEfficiency, 0.01) - - # Check heat pump cooling coil cop - assert_in_epsilon(cop, coil.ratedCOP, 0.01) - assert_in_epsilon(cap, coil.ratedHeatingCapacity, 0.01) - end - - def test_tank_heat_pump_capacities - args_hash = {} - args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, '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] + ['base-dhw-tank-heat-pump.xml', + 'base-dhw-tank-heat-pump-ef.xml', + 'base-dhw-tank-heat-pump-120v.xml', + 'base-dhw-tank-heat-pump-120v-dedicated-circuit.xml', + 'base-dhw-tank-heat-pump-capacities.xml'].each do |hpxml_name| + args_hash = {} + args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, hpxml_name)) + model, _hpxml, hpxml_bldg = _test_measure(args_hash) - # 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.926 - ther_eff = 1.0 - cop = 3.731 - tank_height = 1.3343 - 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 + # Get HPXML values + water_heating_system = hpxml_bldg.water_heating_systems[0] - # 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.01) - assert_in_epsilon(tank_height, wh.tankHeight.get, 0.01) - assert_in_epsilon(backup_cap, wh.heater1Capacity.get, 0.01) - assert_in_epsilon(backup_cap, wh.heater2Capacity, 0.01) - assert_in_epsilon(u, wh.uniformSkinLossCoefficientperUnitAreatoAmbientTemperature.get, 0.01) - assert_in_epsilon(ther_eff, wh.heaterThermalEfficiency, 0.01) + # 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) + 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 + if hpxml_name == 'base-dhw-tank-heat-pump-ef.xml' + u = 0.92 + cop = 3.60 + tank_height = 1.5975 + else + u = 0.926 + if hpxml_name == 'base-dhw-tank-heat-pump-120v.xml' + cop = 4.2 + elsif hpxml_name == 'base-dhw-tank-heat-pump-120v-dedicated-circuit.xml' + cop = 3.6 + else + cop = 3.731 + end + tank_height = 1.3343 + end + ther_eff = 1.0 - # Check heat pump cooling coil cop - assert_in_epsilon(cop, coil.ratedCOP, 0.01) - assert_in_epsilon(cap, coil.ratedHeatingCapacity, 0.01) + # 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.01) + assert_in_epsilon(tank_height, wh.tankHeight.get, 0.01) + assert_in_epsilon(backup_cap, wh.heater1Capacity.get, 0.01) + assert_in_epsilon(backup_cap, wh.heater2Capacity, 0.01) + assert_in_epsilon(u, wh.uniformSkinLossCoefficientperUnitAreatoAmbientTemperature.get, 0.01) + assert_in_epsilon(ther_eff, wh.heaterThermalEfficiency, 0.01) + + # Check heat pump cooling coil cop + assert_in_epsilon(cop, coil.ratedCOP, 0.01) + assert_in_epsilon(cap, coil.ratedHeatingCapacity, 0.01) + end end def test_tank_heat_pump_containment_volume_adjustment diff --git a/docs/source/workflow_inputs.rst b/docs/source/workflow_inputs.rst index df97c23432..5e0b0da203 100644 --- a/docs/source/workflow_inputs.rst +++ b/docs/source/workflow_inputs.rst @@ -4131,26 +4131,28 @@ Conventional Storage Each conventional storage 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 See [#]_ Yes Fuel type - ``WaterHeaterType`` string storage 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 capacity - ``UniformEnergyFactor`` or ``EnergyFactor`` double frac < 1 Yes EnergyGuide label rated efficiency - ``UsageBin`` or ``FirstHourRating`` string or double str or gal/hr See [#]_ or > 0 No See [#]_ EnergyGuide label usage bin/first hour rating - ``RecoveryEfficiency`` double frac > 0, <= 1 [#]_ No See [#]_ Recovery efficiency - ``WaterHeaterInsulation/Jacket/JacketRValue`` double F-ft2-hr/Btu >= 0 No 0 R-value of additional tank insulation wrap - ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ - ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_ - ``extension/TankModelType`` string See [#]_ No mixed Tank model type - ``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 See [#]_ Yes Fuel type + ``WaterHeaterType`` string storage 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 capacity + ``UniformEnergyFactor`` or ``EnergyFactor`` double frac < 1 Yes EnergyGuide label rated efficiency + ``UsageBin`` or ``FirstHourRating`` string or double str or gal/hr See [#]_ or > 0 No See [#]_ EnergyGuide label usage bin/first hour rating + ``RecoveryEfficiency`` double frac > 0, <= 1 [#]_ No See [#]_ Recovery efficiency + ``WaterHeaterInsulation/Jacket/JacketRValue`` double F-ft2-hr/Btu >= 0 No 0 R-value of additional tank insulation wrap + ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ + ``HasMixingValve`` boolean No false Presence of a water heater mixing value? + ``MixingValveSetpoint`` double F >= 105, <= HotWaterTemperature No See [#]_ Temperature setpoint for the mixing valve + ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_ + ``extension/TankModelType`` string See [#]_ No mixed Tank model type + ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly + ============================================= ================= ============= ============================== ======== ======== ============================================= .. [#] FuelType choices are "natural gas", "fuel oil", "fuel oil 1", "fuel oil 2", "fuel oil 4", "fuel oil 5/6", "diesel", "propane", "kerosene", "coal", "coke", "bituminous coal", "anthracite coal", "electricity", "wood", or "wood pellets". .. [#] 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". @@ -4178,6 +4180,7 @@ Each conventional storage water heater is entered as a ``/HPXML/Building/Buildin \- **Non-electric, EnergyFactor >= 0.75**: 0.561 * EnergyFactor + 0.439 .. [#] The water heater setpoint can alternatively be defined using :ref:`schedules_detailed`. + .. [#] If MixingValveSetpoint not provided and HasMixingValve=true, defaults to the lesser of 125 deg-F and HotWaterTemperature. .. [#] Additional desuperheater inputs are described in :ref:`water_heater_desuperheater`. .. [#] TankModelType choices are "mixed" or "stratified". Only currently allowed if FuelType is "electricity". .. [#] NumberofBedroomsServed only required if IsSharedSystem is true. @@ -4191,21 +4194,23 @@ Tankless Each instantaneous tankless 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 See [#]_ Yes Fuel type - ``WaterHeaterType`` string instantaneous 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 - ``PerformanceAdjustment`` double frac >= 0, <= 1 No See [#]_ Multiplier on efficiency, typically to account for cycling - ``FractionDHWLoadServed`` double frac >= 0, <= 1 [#]_ Yes Fraction of hot water load served [#]_ - ``UniformEnergyFactor`` or ``EnergyFactor`` double frac < 1 Yes EnergyGuide label rated efficiency - ``HotWaterTemperature`` double F >= 105, <= 160 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 See [#]_ Yes Fuel type + ``WaterHeaterType`` string instantaneous 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 + ``PerformanceAdjustment`` double frac >= 0, <= 1 No See [#]_ Multiplier on efficiency, typically to account for cycling + ``FractionDHWLoadServed`` double frac >= 0, <= 1 [#]_ Yes Fraction of hot water load served [#]_ + ``UniformEnergyFactor`` or ``EnergyFactor`` double frac < 1 Yes EnergyGuide label rated efficiency + ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ + ``HasMixingValve`` boolean No false Presence of a water heater mixing value? + ``MixingValveSetpoint`` double F >= 105, <= HotWaterTemperature No See [#]_ Temperature setpoint for the mixing valve + ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_ + ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly + =========================================== ======= ============ ============================== ============ ======== ========================================================== .. [#] FuelType choices are "natural gas", "fuel oil", "fuel oil 1", "fuel oil 2", "fuel oil 4", "fuel oil 5/6", "diesel", "propane", "kerosene", "coal", "coke", "bituminous coal", "anthracite coal", "electricity", "wood", or "wood pellets". .. [#] 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". @@ -4221,6 +4226,7 @@ Each instantaneous tankless water heater is entered as a ``/HPXML/Building/Build .. [#] 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). .. [#] The water heater setpoint can alternatively be defined using :ref:`schedules_detailed`. + .. [#] If MixingValveSetpoint not provided and HasMixingValve=true, defaults to the lesser of 125 deg-F and HotWaterTemperature. .. [#] Additional desuperheater inputs are described in :ref:`water_heater_desuperheater`. .. [#] NumberofBedroomsServed only required if IsSharedSystem is true. Each dwelling unit w/zero bedrooms should be counted as 1 bedroom -- e.g., a value of 3 should be entered for a shared system serving 3 studio (zero bedroom) apartments. @@ -4232,30 +4238,32 @@ 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 [#]_ - ``HeatingCapacity`` double Btu/hr > 0 No See [#]_ Heating output capacity - ``BackupHeatingCapacity`` double Btu/hr >= 0 No See [#]_ 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 HPWH operating mode [#]_ - ``HPWHVoltage`` string See [#]_ No 240V HPWH voltage - ``HPWHDucting/ExhaustAirTermination`` string See [#]_ No The location where HPWH exhaust air is ducted to - ``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 >= 105, <= 160 No 125 Water heater setpoint [#]_ - ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_ - ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly - ``extension/HPWHInConfinedSpaceWithoutMitigation`` boolean No false Whether HPWH is installed in confined space without mitigation [#]_ - ``extension/HPWHContainmentVolume`` double ft3 > 0 See [#]_ Containment volume of the space where HPWH is installed - =================================================== ================ ============= ====================== ======== ============== ============================================= + =================================================== ================ ============= ============================== ======== ============== ============================================= + 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 See [#]_ 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 HPWH operating mode [#]_ + ``HPWHVoltage`` string See [#]_ No 240V HPWH voltage + ``HPWHDucting/ExhaustAirTermination`` string See [#]_ No The location where HPWH exhaust air is ducted to + ``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 >= 105, <= 160 No 125 Water heater setpoint [#]_ + ``HasMixingValve`` boolean No See [#]_ Presence of a water heater mixing value? + ``MixingValveSetpoint`` double F >= 105, <= HotWaterTemperature No See [#]_ Temperature setpoint for the mixing valve + ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_ + ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly + ``extension/HPWHInConfinedSpaceWithoutMitigation`` boolean No false Whether HPWH is installed in confined space without mitigation [#]_ + ``extension/HPWHContainmentVolume`` double ft3 > 0 See [#]_ Containment volume of the space where HPWH is installed + =================================================== ================ ============= ============================== ======== ============== ============================================= .. [#] 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. @@ -4274,8 +4282,8 @@ 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 the Btu/hr equivalent of the heat pump COP multiplied by 0.5 kW if HPWHVoltage="240V", 0.422 kW if HPWHVoltage="120V dedicated circuit", or 0.357 if HPWHVoltage="120V shared circuit" or "120V". - .. [#] If BackupHeatingCapacity not provided, defaults to 15355 (4.5 kW) if HPWHVoltage="240V" or 0 (no backup elements) for 120V systems. + .. [#] If HeatingCapacity not provided, defaults to the Btu/hr equivalent of the heat pump COP multiplied by 0.5 kW for 240V HPWHs, 0.422 kW for 120V HPWHs with a dedicated circuit, or 0.357 for all other 120V HPWHs. + .. [#] If BackupHeatingCapacity not provided, defaults to 15355 (4.5 kW) for 240V HPWHs or 0 (no backup elements) for 120V HPWHs. .. [#] HPWHOperatingMode choices are "hybrid/auto" or "heat pump only". .. [#] The heat pump water heater operating mode can alternatively be defined using :ref:`schedules_detailed`. .. [#] HPWHVoltage choices are "240V", "120V", "120V dedicated circuit", or "120V shared circuit". @@ -4286,6 +4294,8 @@ Each heat pump water heater is entered as a ``/HPXML/Building/BuildingDetails/Sy If neither UsageBin nor FirstHourRating provided, UsageBin defaults to "medium". If FirstHourRating provided and UsageBin not provided, UsageBin is determined based on the FirstHourRating value. .. [#] The water heater setpoint can alternatively be defined using :ref:`schedules_detailed`. + .. [#] If HasMixingValve not provided, defaults to true for a 120V HPWH and otherwise false. + .. [#] If MixingValveSetpoint not provided and HasMixingValve=true, defaults to the lesser of 125 deg-F and HotWaterTemperature. .. [#] Additional desuperheater inputs are described in :ref:`water_heater_desuperheater`. .. [#] NumberofBedroomsServed only required if IsSharedSystem is true. Tank losses will be apportioned to the dwelling unit using its number of bedrooms divided by the total number of bedrooms served by the water heating system per `ANSI/RESNET/ICC 301-2022 `_. @@ -4317,6 +4327,8 @@ Each combination boiler w/ storage tank (sometimes referred to as an indirect wa ``WaterHeaterInsulation/Jacket/JacketRValue`` double F-ft2-hr/Btu >= 0 No 0 R-value of additional storage tank insulation wrap ``StandbyLoss[Units="F/hr"]/Value`` double F/hr > 0 No See [#]_ Storage tank standby losses ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ + ``HasMixingValve`` boolean No false Presence of a water heater mixing value? + ``MixingValveSetpoint`` double F >= 105, <= HotWaterTemperature No See [#]_ Temperature setpoint for the mixing valve ``RelatedHVACSystem`` idref See [#]_ Yes ID of boiler ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly ============================================= ======= ============ ====================================== ============ ======== ================================================== @@ -4335,6 +4347,7 @@ Each combination boiler w/ storage tank (sometimes referred to as an indirect wa Additional hot water load from clothes washers/dishwashers will be automatically assigned to the appropriate water heater(s). .. [#] If StandbyLoss not provided, defaults based on a regression analysis of `AHRI Directory of Certified Product Performance `_. .. [#] The water heater setpoint can alternatively be defined using :ref:`schedules_detailed`. + .. [#] If MixingValveSetpoint not provided and HasMixingValve=true, defaults to the lesser of 125 deg-F and HotWaterTemperature. .. [#] RelatedHVACSystem must reference a ``HeatingSystem`` (Boiler). .. [#] NumberofBedroomsServed only required if IsSharedSystem is true. Tank losses will be apportioned to the dwelling unit using its number of bedrooms divided by the total number of bedrooms served by the water heating system per `ANSI/RESNET/ICC 301-2022 `_. @@ -4356,6 +4369,8 @@ Each combination boiler w/ tankless coil is entered as a ``/HPXML/Building/Build ``IsSharedSystem`` boolean No false Whether it serves multiple dwelling units or shared laundry room ``FractionDHWLoadServed`` double frac >= 0, <= 1 [#]_ Yes Fraction of hot water load served [#]_ ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ + ``HasMixingValve`` boolean No false Presence of a water heater mixing value? + ``MixingValveSetpoint`` double F >= 105, <= HotWaterTemperature No See [#]_ Temperature setpoint for the mixing valve ``RelatedHVACSystem`` idref See [#]_ Yes ID of boiler ``extension/NumberofBedroomsServed`` integer > NumberofBedrooms See [#]_ Number of bedrooms served directly or indirectly ==================================== ======= ===== ======================================= ============ ======== ================================================== @@ -4372,6 +4387,7 @@ Each combination boiler w/ tankless coil is entered as a ``/HPXML/Building/Build .. [#] 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). .. [#] The water heater setpoint can alternatively be defined using :ref:`schedules_detailed`. + .. [#] If MixingValveSetpoint not provided and HasMixingValve=true, defaults to the lesser of 125 deg-F and HotWaterTemperature. .. [#] RelatedHVACSystem must reference a ``HeatingSystem`` (Boiler). .. [#] NumberofBedroomsServed only required if IsSharedSystem is true. Each dwelling unit w/zero bedrooms should be counted as 1 bedroom -- e.g., a value of 3 should be entered for a shared system serving 3 studio (zero bedroom) apartments. diff --git a/tasks.rb b/tasks.rb index f648d9689c..2599b39962 100644 --- a/tasks.rb +++ b/tasks.rb @@ -2373,11 +2373,13 @@ def apply_hpxml_modification_sample_files(hpxml_path, hpxml) elsif ['base-dhw-tank-gas-fhr.xml'].include? hpxml_file hpxml_bldg.water_heating_systems[0].first_hour_rating = 56.0 hpxml_bldg.water_heating_systems[0].usage_bin = nil - # FIXME: Add 120V options to BuildResidentialHPXML measure? elsif ['base-dhw-tank-heat-pump-120v.xml'].include? hpxml_file hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120 elsif ['base-dhw-tank-heat-pump-120v-dedicated-circuit.xml'].include? hpxml_file hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120Dedicated + elsif ['base-dhw-setpoint-temperature-mixing-valve.xml'].include? hpxml_file + hpxml_bldg.water_heating_systems[0].has_mixing_valve = true + hpxml_bldg.water_heating_systems[0].mixing_valve_setpoint = 120 elsif ['base-dhw-tank-heat-pump-confined-space.xml'].include? hpxml_file hpxml_bldg.water_heating_systems[0].hpwh_confined_space_without_mitigation = true hpxml_bldg.water_heating_systems[0].hpwh_containment_volume = 453 diff --git a/workflow/hpxml_inputs.json b/workflow/hpxml_inputs.json index 4644306868..c4034b7fae 100644 --- a/workflow/hpxml_inputs.json +++ b/workflow/hpxml_inputs.json @@ -1047,6 +1047,9 @@ "parent_hpxml": "sample_files/base.xml", "dhw_water_heater": "Detailed Example: Electricity, Tank, UEF 0.94, 135F" }, + "sample_files/base-dhw-setpoint-temperature-mixing-valve.xml": { + "parent_hpxml": "sample_files/base-dhw-setpoint-temperature.xml" + }, "sample_files/base-detailed-electric-panel.xml": { "parent_hpxml": "sample_files/base.xml", "geometry_unit_conditioned_floor_area": "1228", diff --git a/workflow/sample_files/base-dhw-setpoint-temperature-mixing-valve.xml b/workflow/sample_files/base-dhw-setpoint-temperature-mixing-valve.xml new file mode 100644 index 0000000000..b4e9a22bf7 --- /dev/null +++ b/workflow/sample_files/base-dhw-setpoint-temperature-mixing-valve.xml @@ -0,0 +1,519 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + + Default + + + + + + + + +
+ CO +
+
+ + proposed workscope + + + + + 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 + + + + + + + + + false + + + + + + + + + + + + + true + + + + + + + + + + + attic - unvented + 1509.3 + asphalt or fiberglass shingles + light + 6.0 + + + 2.3 + + + + + + + outside + basement - conditioned + 115.6 + wood siding + medium + + + 13.9 + + + + + + + outside + conditioned space + + + + 1200.0 + wood siding + medium + + + 22.7 + + + + + outside + attic - unvented + gable + + + + 225.0 + wood siding + medium + + + 4.0 + + + + + + + ground + basement - conditioned + solid concrete + 8.0 + 1200.0 + 7.0 + + + + continuous - exterior + 10.0 + + + continuous - interior + 0.0 + + + + + + + + attic - unvented + conditioned space + ceiling + + + + 1350.0 + + + 39.6 + + + + + + + basement - conditioned + 1350.0 + 150.0 + + + + 0.0 + 0.0 + + + + + + 0.0 + 0.0 + + + + 0.0 + 0.0 + + + + + + + 108.0 + 0 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + 72.0 + 90 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + 108.0 + 180 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + 72.0 + 270 + 0.35 + 0.44 + + + light curtains + + 0.67 + + + + + + + + 40.0 + 180 + 4.4 + + + + + + + + + + + + + + + + + natural gas + 35000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 24000.0 + single stage + 1.0 + + SEER2 + 13.4 + + + + + + 68.0 + 78.0 + + + + + + regular velocity + + supply + + CFM25 + 81.0 + to outside + + + + return + + CFM25 + 27.0 + to outside + + + + + supply + 4.0 + attic - unvented + 0.75 + + + + return + 4.0 + attic - unvented + 0.75 + + + + supply + 0.0 + conditioned space + 0.25 + + + + return + 0.0 + conditioned space + 0.25 + + + + 2700.0 + + + + + + electricity + storage water heater + conditioned space + 1.0 + 0.94 + 135.0 + true + 120.0 + + + + + + + + 0.0 + + + + + shower head + false + + + + faucet + false + + + + + + + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + electricity + conventional + 3.73 + + + + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + 650.0 + + + + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + interior + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.4 + + + + + + + exterior + 0.1 + + + + + + + exterior + 0.25 + + + + + + + + + TV other + + + + other + + + +
+
\ No newline at end of file diff --git a/workflow/sample_files/base-dhw-tank-heat-pump-120v-dedicated.xml b/workflow/sample_files/base-dhw-tank-heat-pump-120v-dedicated-circuit.xml similarity index 100% rename from workflow/sample_files/base-dhw-tank-heat-pump-120v-dedicated.xml rename to workflow/sample_files/base-dhw-tank-heat-pump-120v-dedicated-circuit.xml From d100342f1642e76f34ffea5f2c985b3592c11fde Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Fri, 24 Apr 2026 12:54:59 -0600 Subject: [PATCH 07/11] Remove warning (sample file uses mixing valve temp < WH setpoint temp so warning is not triggered) --- workflow/tests/util.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/workflow/tests/util.rb b/workflow/tests/util.rb index 3024184f77..e2affbd2fd 100644 --- a/workflow/tests/util.rb +++ b/workflow/tests/util.rb @@ -350,7 +350,6 @@ def _verify_outputs(rundir, hpxml_path, results, hpxml, unit_multiplier) next if message.include?('setupIHGOutputs: Output variables=Zone Other Equipment') && message.include?('are not available.') next if message.include?('setupIHGOutputs: Output variables=Space Other Equipment') && message.include?('are not available') next if message.include? 'Multiple speed fan will be applied to this unit. The speed number is determined by load.' - next if message.include? 'Target water temperature should be less than or equal to the hot water temperature' # FIXME: Temporary # HPWHs if hpxml.buildings.any? { |hpxml_bldg| hpxml_bldg.water_heating_systems.count { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump } > 0 } From a1ebfb3cf9c307fdb517c5ee228631bd11374ab7 Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Fri, 24 Apr 2026 14:05:54 -0600 Subject: [PATCH 08/11] Address CI errors --- HPXMLtoOpenStudio/measure.xml | 8 ++++---- HPXMLtoOpenStudio/tests/test_defaults.rb | 12 +++++++----- HPXMLtoOpenStudio/tests/test_schedules.rb | 4 ++-- workflow/tests/util.rb | 12 ++++++++---- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml index fede0de212..ab23912f18 100644 --- a/HPXMLtoOpenStudio/measure.xml +++ b/HPXMLtoOpenStudio/measure.xml @@ -3,8 +3,8 @@ 3.1 hpxml_to_openstudio b1543b30-9465-45ff-ba04-1d1f85e763bc - c980a5fe-f488-4bf0-b4d9-0ffc67d8ed04 - 2026-04-24T18:49:10Z + 0b45a851-c1ad-44c4-8039-3bd3fb73c910 + 2026-04-24T20:05:35Z D8922A73 HPXMLToOpenStudio HPXML to OpenStudio Translator @@ -751,7 +751,7 @@ test_defaults.rb rb test - A92459FD + C8BD974C
test_electric_panel.rb @@ -817,7 +817,7 @@ test_schedules.rb rb test - 11324D91 + F16EAD8C test_simcontrols.rb diff --git a/HPXMLtoOpenStudio/tests/test_defaults.rb b/HPXMLtoOpenStudio/tests/test_defaults.rb index 4169545ef5..513b2efaa9 100644 --- a/HPXMLtoOpenStudio/tests/test_defaults.rb +++ b/HPXMLtoOpenStudio/tests/test_defaults.rb @@ -3649,29 +3649,31 @@ def test_heat_pump_water_heaters hpxml_bldg.water_heating_systems[0].heating_capacity = nil hpxml_bldg.water_heating_systems[0].backup_heating_capacity = nil hpxml_bldg.water_heating_systems[0].hpwh_confined_space_without_mitigation = nil + hpxml_bldg.water_heating_systems[0].has_mixing_valve = nil hpxml_bldg.water_heating_systems[0].mixing_valve_setpoint = 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage240, 6366.0, 15355.0, false, true, 125]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage240, 6366.0, 15355.0, false, false, nil]) # Test defaults w/ 120V dedicated circuit hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120Dedicated - hpxml_bldg.water_heating_systems[0].has_mixing_valve = nil + hpxml_bldg.water_heating_systems[0].mixing_valve_setpoint = 120 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120Dedicated, 5184.0, 0.0, false, false, nil]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120Dedicated, 5184.0, 0.0, false, true, 120]) # Test defaults w/ 120V shared circuit hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120Shared + hpxml_bldg.water_heating_systems[0].mixing_valve_setpoint = 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120Shared, 5116.0, 0.0, false, false, nil]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120Shared, 5116.0, 0.0, false, true, 125]) # Test defaults w/ 120V (unspecified circuit) hpxml_bldg.water_heating_systems[0].hpwh_voltage = HPXML::HPWHVoltage120 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, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120, 5116.0, 0.0, false, false, nil]) + _test_default_heat_pump_water_heater_values(default_hpxml_bldg, [66.0, HPXML::WaterHeaterHPWHOperatingModeHybridAuto, HPXML::HPWHVoltage120, 5116.0, 0.0, false, true, 125]) # Test defaults w/ num occupants = 1, num bedrooms = 1 hpxml_bldg.water_heating_systems[0].hpwh_voltage = nil diff --git a/HPXMLtoOpenStudio/tests/test_schedules.rb b/HPXMLtoOpenStudio/tests/test_schedules.rb index 00ac66fb4b..e7695907a8 100644 --- a/HPXMLtoOpenStudio/tests/test_schedules.rb +++ b/HPXMLtoOpenStudio/tests/test_schedules.rb @@ -50,7 +50,7 @@ def test_default_schedules args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base.xml')) model, _hpxml, _hpxml_bldg = _test_measure(args_hash) - schedule_constants = 14 + schedule_constants = 13 schedule_rulesets = 16 schedule_fixed_intervals = 0 schedule_files = 0 @@ -80,7 +80,7 @@ def test_simple_schedules args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base-schedules-simple.xml')) model, _hpxml, _hpxml_bldg = _test_measure(args_hash) - schedule_constants = 13 + schedule_constants = 12 schedule_rulesets = 20 schedule_fixed_intervals = 0 schedule_files = 0 diff --git a/workflow/tests/util.rb b/workflow/tests/util.rb index e2affbd2fd..ee20d8d4e2 100644 --- a/workflow/tests/util.rb +++ b/workflow/tests/util.rb @@ -351,6 +351,9 @@ def _verify_outputs(rundir, hpxml_path, results, hpxml, unit_multiplier) next if message.include?('setupIHGOutputs: Output variables=Space Other Equipment') && message.include?('are not available') next if message.include? 'Multiple speed fan will be applied to this unit. The speed number is determined by load.' + # FIXME: Temporary + next if message.include? 'Heating COP Function of Temperature Curve Name = HPWH-COP-FT output is not equal to 1.0 (+ or - 10%) at rated conditions.' + # HPWHs if hpxml.buildings.any? { |hpxml_bldg| hpxml_bldg.water_heating_systems.count { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump } > 0 } next if message.include? 'Recovery Efficiency and Energy Factor could not be calculated during the test for standard ratings' @@ -363,14 +366,15 @@ def _verify_outputs(rundir, hpxml_path, results, hpxml, unit_multiplier) if hpxml.buildings.any? { |hpxml_bldg| hpxml_bldg.water_heating_systems.count { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump && wh.location == HPXML::LocationOtherExterior } > 0 } next if message.include? 'Water heater tank set point temperature is greater than or equal to the cut-in temperature of the heat pump water heater.' end + # WHs w/ mixing valves + if hpxml.buildings.any? { |hpxml_bldg| hpxml_bldg.water_heating_systems.count { |wh| wh.has_mixing_valve } > 0 } + next if message.include? 'Target water temperature is greater than the hot water temperature' + next if message.include? 'Target water temperature should be less than or equal to the hot water temperature' + end # Stratified tank WHs if hpxml.buildings.any? { |hpxml_bldg| hpxml_bldg.water_heating_systems.count { |wh| wh.tank_model_type == HPXML::WaterHeaterTankModelTypeStratified } > 0 } next if message.include? 'Recovery Efficiency and Energy Factor could not be calculated during the test for standard ratings' end - # HP defrost curves - if hpxml.buildings.any? { |hpxml_bldg| hpxml_bldg.heat_pumps.count { |hp| [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit, HPXML::HVACTypeHeatPumpPTHP, HPXML::HVACTypeHeatPumpRoom].include? hp.heat_pump_type } > 0 } - next if message.include?('GetDXCoils: Coil:Heating:DX') && message.include?('curve values') && message.include?('Defrost Energy Input Ratio Function of Temperature Curve') - end # variable system SHR adjustment if hpxml.buildings.any? { |hpxml_bldg| (hpxml_bldg.heat_pumps + hpxml_bldg.cooling_systems).count { |hp| hp.compressor_type == HPXML::HVACCompressorTypeVariableSpeed } > 0 } next if message.include?('CalcCBF: SHR adjusted to achieve valid outlet air properties and the simulation continues.') From 104dc265102ee9d1ce65990b23abf857436a7288 Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Fri, 24 Apr 2026 17:08:09 -0600 Subject: [PATCH 09/11] Curve name can change. --- workflow/tests/util.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/tests/util.rb b/workflow/tests/util.rb index ee20d8d4e2..68a0be04cc 100644 --- a/workflow/tests/util.rb +++ b/workflow/tests/util.rb @@ -352,7 +352,7 @@ def _verify_outputs(rundir, hpxml_path, results, hpxml, unit_multiplier) next if message.include? 'Multiple speed fan will be applied to this unit. The speed number is determined by load.' # FIXME: Temporary - next if message.include? 'Heating COP Function of Temperature Curve Name = HPWH-COP-FT output is not equal to 1.0 (+ or - 10%) at rated conditions.' + next if message.include?('Heating COP Function of Temperature Curve Name') && message.include?('output is not equal to 1.0 (+ or - 10%) at rated conditions.') # HPWHs if hpxml.buildings.any? { |hpxml_bldg| hpxml_bldg.water_heating_systems.count { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump } > 0 } From b635ea6727c0bcea8b690033d77faacad77eca9d Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Mon, 27 Apr 2026 10:07:06 -0600 Subject: [PATCH 10/11] Revert max setpoint temp. --- HPXMLtoOpenStudio/measure.xml | 8 ++++---- .../resources/hpxml_schematron/EPvalidator.sch | 1 - HPXMLtoOpenStudio/tests/test_validation.rb | 4 ---- docs/source/workflow_inputs.rst | 10 +++++----- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml index ab23912f18..cc65a45947 100644 --- a/HPXMLtoOpenStudio/measure.xml +++ b/HPXMLtoOpenStudio/measure.xml @@ -3,8 +3,8 @@ 3.1 hpxml_to_openstudio b1543b30-9465-45ff-ba04-1d1f85e763bc - 0b45a851-c1ad-44c4-8039-3bd3fb73c910 - 2026-04-24T20:05:35Z + e3879ee8-dd46-4587-bf50-45f7b0eb092f + 2026-04-27T16:06:36Z D8922A73 HPXMLToOpenStudio HPXML to OpenStudio Translator @@ -421,7 +421,7 @@ hpxml_schematron/EPvalidator.sch sch resource - 28F4F984 + B163569D hpxml_schematron/iso-schematron.xsd @@ -829,7 +829,7 @@ test_validation.rb rb test - 5CB53465 + 3A631903 test_vehicle.rb diff --git a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch index 36d49f543e..da7c3bd134 100644 --- a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch +++ b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.sch @@ -2082,7 +2082,6 @@ Expected Location to be 'conditioned space' or 'basement - unconditioned' or 'basement - conditioned' or 'attic - unvented' or 'attic - vented' or 'garage' or 'crawlspace - unvented' or 'crawlspace - vented' or 'crawlspace - conditioned' or 'other exterior' or 'other housing unit' or 'other heated space' or 'other multifamily buffer space' or 'other non-freezing space' Expected FractionDHWLoadServed Expected HotWaterTemperature to be greater than or equal to 105 deg-F - Expected HotWaterTemperature to be less than or equal to 160 deg-F Expected MixingValveSetpoint to be greater than or equal to 105 deg-F Expected MixingValveSetpoint to be less than or equal to HotWaterTemperature diff --git a/HPXMLtoOpenStudio/tests/test_validation.rb b/HPXMLtoOpenStudio/tests/test_validation.rb index d1f7a7a0d7..bb1fa7fa99 100644 --- a/HPXMLtoOpenStudio/tests/test_validation.rb +++ b/HPXMLtoOpenStudio/tests/test_validation.rb @@ -78,7 +78,6 @@ def test_schema_schematron_error_messages 'dhw-invalid-uef-tank-heat-pump' => ['Expected UniformEnergyFactor to be greater than 1 [context: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem[WaterHeaterType="heat pump water heater"], id: "WaterHeatingSystem1"]'], 'dhw-mixing-valve-setpoint-high' => ['Expected MixingValveSetpoint to be less than or equal to HotWaterTemperature'], 'dhw-mixing-valve-setpoint-low' => ['Expected MixingValveSetpoint to be greater than or equal to 105 deg-F'], - 'dhw-setpoint-high' => ['Expected HotWaterTemperature to be less than or equal to 160 deg-F'], 'dhw-setpoint-low' => ['Expected HotWaterTemperature to be greater than or equal to 105 deg-F'], 'dishwasher-location' => ['A location is specified as "garage" but no surfaces were found adjacent to this space type.'], 'duct-leakage-cfm25' => ["The value '-2.0' is less than the minimum value allowed", @@ -337,9 +336,6 @@ def test_schema_schematron_error_messages when 'dhw-mixing-valve-setpoint-low' hpxml, hpxml_bldg = _create_hpxml('base.xml') hpxml_bldg.water_heating_systems[0].mixing_valve_setpoint = 100 - when 'dhw-setpoint-high' - hpxml, hpxml_bldg = _create_hpxml('base.xml') - hpxml_bldg.water_heating_systems[0].temperature = 200 when 'dhw-setpoint-low' hpxml, hpxml_bldg = _create_hpxml('base.xml') hpxml_bldg.water_heating_systems[0].temperature = 100 diff --git a/docs/source/workflow_inputs.rst b/docs/source/workflow_inputs.rst index 5e0b0da203..801f5d472f 100644 --- a/docs/source/workflow_inputs.rst +++ b/docs/source/workflow_inputs.rst @@ -4146,7 +4146,7 @@ Each conventional storage water heater is entered as a ``/HPXML/Building/Buildin ``UsageBin`` or ``FirstHourRating`` string or double str or gal/hr See [#]_ or > 0 No See [#]_ EnergyGuide label usage bin/first hour rating ``RecoveryEfficiency`` double frac > 0, <= 1 [#]_ No See [#]_ Recovery efficiency ``WaterHeaterInsulation/Jacket/JacketRValue`` double F-ft2-hr/Btu >= 0 No 0 R-value of additional tank insulation wrap - ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ + ``HotWaterTemperature`` double F >= 105 No 125 Water heater setpoint [#]_ ``HasMixingValve`` boolean No false Presence of a water heater mixing value? ``MixingValveSetpoint`` double F >= 105, <= HotWaterTemperature No See [#]_ Temperature setpoint for the mixing valve ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_ @@ -4205,7 +4205,7 @@ Each instantaneous tankless water heater is entered as a ``/HPXML/Building/Build ``PerformanceAdjustment`` double frac >= 0, <= 1 No See [#]_ Multiplier on efficiency, typically to account for cycling ``FractionDHWLoadServed`` double frac >= 0, <= 1 [#]_ Yes Fraction of hot water load served [#]_ ``UniformEnergyFactor`` or ``EnergyFactor`` double frac < 1 Yes EnergyGuide label rated efficiency - ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ + ``HotWaterTemperature`` double F >= 105 No 125 Water heater setpoint [#]_ ``HasMixingValve`` boolean No false Presence of a water heater mixing value? ``MixingValveSetpoint`` double F >= 105, <= HotWaterTemperature No See [#]_ Temperature setpoint for the mixing valve ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_ @@ -4256,7 +4256,7 @@ Each heat pump water heater is entered as a ``/HPXML/Building/BuildingDetails/Sy ``HPWHDucting/ExhaustAirTermination`` string See [#]_ No The location where HPWH exhaust air is ducted to ``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 >= 105, <= 160 No 125 Water heater setpoint [#]_ + ``HotWaterTemperature`` double F >= 105 No 125 Water heater setpoint [#]_ ``HasMixingValve`` boolean No See [#]_ Presence of a water heater mixing value? ``MixingValveSetpoint`` double F >= 105, <= HotWaterTemperature No See [#]_ Temperature setpoint for the mixing valve ``UsesDesuperheater`` boolean No false Presence of desuperheater? [#]_ @@ -4326,7 +4326,7 @@ Each combination boiler w/ storage tank (sometimes referred to as an indirect wa ``FractionDHWLoadServed`` double frac >= 0, <= 1 [#]_ Yes Fraction of hot water load served [#]_ ``WaterHeaterInsulation/Jacket/JacketRValue`` double F-ft2-hr/Btu >= 0 No 0 R-value of additional storage tank insulation wrap ``StandbyLoss[Units="F/hr"]/Value`` double F/hr > 0 No See [#]_ Storage tank standby losses - ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ + ``HotWaterTemperature`` double F >= 105 No 125 Water heater setpoint [#]_ ``HasMixingValve`` boolean No false Presence of a water heater mixing value? ``MixingValveSetpoint`` double F >= 105, <= HotWaterTemperature No See [#]_ Temperature setpoint for the mixing valve ``RelatedHVACSystem`` idref See [#]_ Yes ID of boiler @@ -4368,7 +4368,7 @@ Each combination boiler w/ tankless coil is entered as a ``/HPXML/Building/Build ``Location`` string See [#]_ No See [#]_ Water heater location ``IsSharedSystem`` boolean No false Whether it serves multiple dwelling units or shared laundry room ``FractionDHWLoadServed`` double frac >= 0, <= 1 [#]_ Yes Fraction of hot water load served [#]_ - ``HotWaterTemperature`` double F >= 105, <= 160 No 125 Water heater setpoint [#]_ + ``HotWaterTemperature`` double F >= 105 No 125 Water heater setpoint [#]_ ``HasMixingValve`` boolean No false Presence of a water heater mixing value? ``MixingValveSetpoint`` double F >= 105, <= HotWaterTemperature No See [#]_ Temperature setpoint for the mixing valve ``RelatedHVACSystem`` idref See [#]_ Yes ID of boiler From 0932903b9c8ca9fd22c37b1b182295ae7dfb8236 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Mon, 27 Apr 2026 17:07:34 +0000 Subject: [PATCH 11/11] Latest results. [skip ci] --- workflow/tests/base_results/results_simulations_bills.csv | 3 +++ workflow/tests/base_results/results_simulations_energy.csv | 3 +++ workflow/tests/base_results/results_simulations_hvac.csv | 3 +++ workflow/tests/base_results/results_simulations_loads.csv | 3 +++ workflow/tests/base_results/results_simulations_misc.csv | 3 +++ workflow/tests/base_results/results_simulations_panel.csv | 3 +++ 6 files changed, 18 insertions(+) diff --git a/workflow/tests/base_results/results_simulations_bills.csv b/workflow/tests/base_results/results_simulations_bills.csv index 82ce9754b8..e3a10c1ddc 100644 --- a/workflow/tests/base_results/results_simulations_bills.csv +++ b/workflow/tests/base_results/results_simulations_bills.csv @@ -107,6 +107,7 @@ base-dhw-recirc-manual.xml,1983.0,144.0,1378.8,0.0,1522.8,144.0,316.2,460.2,0.0, base-dhw-recirc-nocontrol.xml,2507.75,144.0,1903.55,0.0,2047.55,144.0,316.2,460.2,0.0,0.0,0.0,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-temperature.xml,2329.08,144.0,1724.88,0.0,1868.88,144.0,316.2,460.2,0.0,0.0,0.0,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-timer.xml,2507.75,144.0,1903.55,0.0,2047.55,144.0,316.2,460.2,0.0,0.0,0.0,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-setpoint-temperature-mixing-valve.xml,2046.43,144.0,1443.51,0.0,1587.51,144.0,314.92,458.92,0.0,0.0,0.0,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-setpoint-temperature.xml,2056.45,144.0,1453.53,0.0,1597.53,144.0,314.92,458.92,0.0,0.0,0.0,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-solar-direct-evacuated-tube.xml,1803.18,144.0,1198.98,0.0,1342.98,144.0,316.2,460.2,0.0,0.0,0.0,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-solar-direct-flat-plate.xml,1736.31,144.0,1132.2,0.0,1276.2,144.0,316.11,460.11,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -121,6 +122,8 @@ base-dhw-tank-gas-ef.xml,1828.35,144.0,1050.23,0.0,1194.23,144.0,490.12,634.12,0 base-dhw-tank-gas-fhr.xml,1822.21,144.0,1048.93,0.0,1192.93,144.0,485.28,629.28,0.0,0.0,0.0,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-outside.xml,1829.38,144.0,1042.1,0.0,1186.1,144.0,499.28,643.28,0.0,0.0,0.0,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,1822.21,144.0,1048.93,0.0,1192.93,144.0,485.28,629.28,0.0,0.0,0.0,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-120v-dedicated-circuit.xml,1837.86,144.0,1174.72,0.0,1318.72,144.0,375.14,519.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-120v.xml,1815.57,144.0,1145.73,0.0,1289.73,144.0,381.84,525.84,0.0,0.0,0.0,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,1803.37,144.0,1129.36,0.0,1273.36,144.0,386.01,530.01,0.0,0.0,0.0,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-confined-space.xml,1818.34,144.0,1149.31,0.0,1293.31,144.0,381.03,525.03,0.0,0.0,0.0,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,1824.21,144.0,1152.08,0.0,1296.08,144.0,384.13,528.13,0.0,0.0,0.0,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 8c3ab982e3..0d5d1a5603 100644 --- a/workflow/tests/base_results/results_simulations_energy.csv +++ b/workflow/tests/base_results/results_simulations_energy.csv @@ -107,6 +107,7 @@ base-dhw-recirc-manual.xml,70.185,70.185,37.547,37.547,32.638,0.0,0.0,0.0,0.0,0. base-dhw-recirc-nocontrol.xml,84.475,84.475,51.837,51.837,32.638,0.0,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.216,1.204,21.895,1.495,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,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,32.638,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-temperature.xml,79.609,79.609,46.972,46.972,32.638,0.0,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.216,1.204,18.274,0.249,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,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,32.638,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-timer.xml,84.475,84.475,51.837,51.837,32.638,0.0,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.216,1.204,21.895,1.495,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,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,32.638,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-setpoint-temperature-mixing-valve.xml,71.815,71.815,39.309,39.309,32.506,0.0,0.0,0.0,0.0,0.0,0.0,1.012,0.0,0.0,5.232,1.209,10.846,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,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,32.506,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-setpoint-temperature.xml,72.088,72.088,39.582,39.582,32.506,0.0,0.0,0.0,0.0,0.0,0.0,1.012,0.0,0.0,5.232,1.209,11.118,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,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,32.506,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-solar-direct-evacuated-tube.xml,65.289,65.289,32.65,32.65,32.638,0.0,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.218,1.205,3.874,0.0,0.325,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,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,32.638,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-solar-direct-flat-plate.xml,63.461,63.461,30.832,30.832,32.629,0.0,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.234,1.209,2.049,0.0,0.313,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,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,32.629,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 @@ -121,6 +122,8 @@ base-dhw-tank-gas-ef.xml,79.19,79.19,28.6,28.6,50.591,0.0,0.0,0.0,0.0,0.0,0.0,1. base-dhw-tank-gas-fhr.xml,78.655,78.655,28.564,28.564,50.091,0.0,0.0,0.0,0.0,0.0,0.0,1.041,0.0,0.0,5.289,1.223,0.0,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,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,33.453,0.0,16.638,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-outside.xml,79.914,79.914,28.378,28.378,51.536,0.0,0.0,0.0,0.0,0.0,0.0,1.039,0.0,0.0,5.144,1.185,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.284,0.347,1.436,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,33.385,0.0,18.151,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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,78.655,78.655,28.564,28.564,50.091,0.0,0.0,0.0,0.0,0.0,0.0,1.041,0.0,0.0,5.289,1.223,0.0,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,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,33.453,0.0,16.638,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-120v-dedicated-circuit.xml,70.712,70.712,31.99,31.99,38.722,0.0,0.0,0.0,0.0,0.0,0.0,1.205,0.0,0.0,4.644,1.052,4.085,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.066,0.0,0.0,0.284,0.347,1.436,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,38.722,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-120v.xml,70.614,70.614,31.2,31.2,39.414,0.0,0.0,0.0,0.0,0.0,0.0,1.227,0.0,0.0,4.589,1.038,3.345,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.065,0.0,0.0,0.284,0.347,1.436,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,39.414,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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,70.599,70.599,30.754,30.754,39.844,0.0,0.0,0.0,0.0,0.0,0.0,1.24,0.0,0.0,4.553,1.028,2.931,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.065,0.0,0.0,0.284,0.347,1.436,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,39.844,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-confined-space.xml,70.628,70.628,31.298,31.298,39.33,0.0,0.0,0.0,0.0,0.0,0.0,1.224,0.0,0.0,4.607,1.043,3.422,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.065,0.0,0.0,0.284,0.347,1.436,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,39.33,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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,71.023,71.023,31.373,31.373,39.65,0.0,0.0,0.0,0.0,0.0,0.0,1.234,0.0,0.0,4.693,1.06,3.385,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.064,0.0,0.0,0.284,0.347,1.436,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,39.65,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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 b4120122d2..c4c5eb7732 100644 --- a/workflow/tests/base_results/results_simulations_hvac.csv +++ b/workflow/tests/base_results/results_simulations_hvac.csv @@ -107,6 +107,7 @@ base-dhw-recirc-manual.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0, base-dhw-recirc-nocontrol.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 base-dhw-recirc-temperature.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 base-dhw-recirc-timer.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 +base-dhw-setpoint-temperature-mixing-valve.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 base-dhw-setpoint-temperature.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 base-dhw-solar-direct-evacuated-tube.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 base-dhw-solar-direct-flat-plate.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 @@ -121,6 +122,8 @@ base-dhw-tank-gas-ef.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0. base-dhw-tank-gas-fhr.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 base-dhw-tank-gas-outside.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 base-dhw-tank-gas.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 +base-dhw-tank-heat-pump-120v-dedicated-circuit.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 +base-dhw-tank-heat-pump-120v.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 base-dhw-tank-heat-pump-capacities.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 base-dhw-tank-heat-pump-confined-space.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.0,-661.0,0.0,800.0 base-dhw-tank-heat-pump-detailed-schedules.xml,6.8,91.76,35000.0,24000.0,0.0,41543.0,17659.0,7963.0,0.0,575.0,6833.0,0.0,0.0,1738.0,2155.0,4620.0,0.0,0.0,27993.0,13311.0,7750.0,0.0,207.0,507.0,0.0,0.0,0.0,2276.0,622.0,0.0,3320.0,0.0,0.0,265.0,126.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 f72c71ddfb..03abf5bea5 100644 --- a/workflow/tests/base_results/results_simulations_loads.csv +++ b/workflow/tests/base_results/results_simulations_loads.csv @@ -107,6 +107,7 @@ base-dhw-recirc-manual.xml,31.045,0.0,20.512,8.416,0.849,0.0,0.0,0.0,3.243,3.875 base-dhw-recirc-nocontrol.xml,31.045,0.0,20.512,8.416,0.849,0.0,0.0,0.0,3.243,3.875,0.882,7.07,0.676,11.539,-12.828,0.0,0.0,0.0,8.304,-0.111,5.504,0.0,0.509,0.0,13.466,-8.481,-2.634,0.0,-0.072,-0.246,-0.022,2.446,0.018,-0.381,12.67,0.0,0.0,0.0,-6.428,-0.107,-0.932,-4.178,-0.085,0.0,8.615,7.311,1.873 base-dhw-recirc-temperature.xml,31.045,0.0,20.512,8.416,0.849,0.0,0.0,0.0,3.243,3.875,0.882,7.07,0.676,11.539,-12.828,0.0,0.0,0.0,8.304,-0.111,5.504,0.0,0.509,0.0,13.466,-8.481,-2.634,0.0,-0.072,-0.246,-0.022,2.446,0.018,-0.381,12.67,0.0,0.0,0.0,-6.428,-0.107,-0.932,-4.178,-0.085,0.0,8.615,7.311,1.873 base-dhw-recirc-timer.xml,31.045,0.0,20.512,8.416,0.849,0.0,0.0,0.0,3.243,3.875,0.882,7.07,0.676,11.539,-12.828,0.0,0.0,0.0,8.304,-0.111,5.504,0.0,0.509,0.0,13.466,-8.481,-2.634,0.0,-0.072,-0.246,-0.022,2.446,0.018,-0.381,12.67,0.0,0.0,0.0,-6.428,-0.107,-0.932,-4.178,-0.085,0.0,8.615,7.311,1.873 +base-dhw-setpoint-temperature-mixing-valve.xml,30.919,0.0,20.587,9.827,1.01,0.0,0.0,0.0,3.243,3.874,0.882,7.068,0.676,11.538,-12.813,0.0,0.0,0.0,8.305,-0.113,5.502,0.0,0.509,0.0,13.418,-8.564,-2.633,0.0,-0.076,-0.249,-0.022,2.44,0.018,-0.386,12.685,0.0,0.0,0.0,-6.433,-0.109,-0.935,-4.189,-0.085,0.0,8.638,7.389,1.874 base-dhw-setpoint-temperature.xml,30.919,0.0,20.586,10.098,1.01,0.0,0.0,0.0,3.243,3.874,0.882,7.068,0.676,11.538,-12.813,0.0,0.0,0.0,8.305,-0.113,5.502,0.0,0.509,0.0,13.418,-8.564,-2.633,0.0,-0.076,-0.249,-0.022,2.44,0.018,-0.386,12.685,0.0,0.0,0.0,-6.433,-0.109,-0.935,-4.189,-0.085,0.0,8.638,7.389,1.874 base-dhw-solar-direct-evacuated-tube.xml,31.045,0.0,20.521,9.926,0.856,0.0,6.91,0.0,3.243,3.875,0.882,7.07,0.676,11.539,-12.828,0.0,0.0,0.0,8.304,-0.111,5.504,0.0,0.509,0.0,13.466,-8.481,-2.634,0.0,-0.072,-0.246,-0.022,2.446,0.018,-0.381,12.67,0.0,0.0,0.0,-6.428,-0.107,-0.932,-4.178,-0.085,0.0,8.618,7.319,1.873 base-dhw-solar-direct-flat-plate.xml,31.036,0.0,20.598,10.011,0.933,0.0,8.897,0.0,3.243,3.876,0.882,7.07,0.676,11.54,-12.828,0.0,0.0,0.0,8.305,-0.111,5.504,0.0,0.509,0.0,13.463,-8.488,-2.634,0.0,-0.073,-0.247,-0.022,2.445,0.018,-0.382,12.67,0.0,0.0,0.0,-6.43,-0.107,-0.932,-4.185,-0.085,0.0,8.641,7.388,1.873 @@ -121,6 +122,8 @@ base-dhw-tank-gas-ef.xml,31.463,0.0,21.007,9.917,3.592,0.0,0.0,0.0,3.236,3.875,0 base-dhw-tank-gas-fhr.xml,31.82,0.0,20.828,9.917,2.944,0.0,0.0,0.0,3.234,3.879,0.883,7.064,0.677,11.559,-12.828,0.0,0.0,0.0,8.291,-0.119,6.629,0.0,0.509,0.0,13.773,-9.123,-2.636,0.0,-0.073,-0.243,-0.02,2.441,0.02,-0.362,12.67,0.0,0.0,0.0,-6.443,-0.115,-1.154,-4.177,-0.084,0.0,8.723,7.748,1.871 base-dhw-tank-gas-outside.xml,31.756,0.0,20.16,9.917,4.114,0.0,0.0,0.0,3.239,3.882,0.884,7.062,0.677,11.555,-12.874,0.0,0.0,0.0,8.298,-0.115,5.517,0.0,0.51,0.0,13.739,-8.01,-2.64,0.0,-0.052,-0.232,-0.018,2.46,0.021,-0.342,12.623,0.0,0.0,0.0,-6.407,-0.11,-0.916,-4.12,-0.083,0.0,8.508,6.932,1.867 base-dhw-tank-gas.xml,31.82,0.0,20.828,9.917,2.944,0.0,0.0,0.0,3.234,3.879,0.883,7.064,0.677,11.559,-12.828,0.0,0.0,0.0,8.291,-0.119,6.629,0.0,0.509,0.0,13.773,-9.123,-2.636,0.0,-0.073,-0.243,-0.02,2.441,0.02,-0.362,12.67,0.0,0.0,0.0,-6.443,-0.115,-1.154,-4.177,-0.084,0.0,8.723,7.748,1.871 +base-dhw-tank-heat-pump-120v-dedicated-circuit.xml,36.827,0.0,17.888,9.917,0.0,0.0,0.0,0.0,3.208,3.939,0.898,7.021,0.687,11.697,-13.288,0.0,0.0,0.0,8.317,-0.129,5.628,0.0,0.517,0.0,15.615,-4.623,-2.71,0.0,0.082,-0.127,0.008,2.561,0.044,-0.039,12.21,0.0,0.0,0.0,-6.192,-0.125,-0.794,-3.769,-0.068,0.0,7.775,4.526,1.797 +base-dhw-tank-heat-pump-120v.xml,37.483,0.0,17.642,9.917,0.0,0.0,0.0,0.0,3.201,3.942,0.899,7.02,0.687,11.695,-13.324,0.0,0.0,0.0,8.319,-0.124,5.635,0.0,0.517,0.0,15.857,-4.174,-2.714,0.0,0.095,-0.119,0.01,2.574,0.045,-0.025,12.174,0.0,0.0,0.0,-6.17,-0.12,-0.788,-3.734,-0.068,0.0,7.693,4.291,1.793 base-dhw-tank-heat-pump-capacities.xml,37.902,0.0,17.498,9.964,0.0,0.0,0.0,0.0,3.191,3.94,0.899,7.008,0.687,11.701,-13.332,0.0,0.0,0.0,8.332,-0.134,5.641,0.0,0.517,0.0,15.984,-3.856,-2.72,0.0,0.094,-0.118,0.01,2.569,0.046,-0.011,12.166,0.0,0.0,0.0,-6.147,-0.13,-0.783,-3.731,-0.067,0.0,7.637,4.161,1.787 base-dhw-tank-heat-pump-confined-space.xml,37.403,0.0,17.744,9.976,1.439,0.0,0.0,0.0,3.205,3.944,0.9,7.012,0.689,11.704,-13.324,0.0,0.0,0.0,8.314,-0.132,5.639,0.0,0.517,0.0,15.817,-4.244,-2.712,0.0,0.093,-0.118,0.01,2.563,0.046,-0.019,12.173,0.0,0.0,0.0,-6.179,-0.128,-0.784,-3.744,-0.068,0.0,7.724,4.362,1.795 base-dhw-tank-heat-pump-detailed-schedules.xml,37.716,0.0,18.016,10.081,1.854,0.0,0.0,0.0,3.188,3.934,0.902,6.941,0.696,11.784,-13.194,0.0,0.0,0.0,8.248,-0.234,5.655,0.0,0.516,0.0,15.979,-4.02,-2.704,0.0,0.076,-0.122,0.014,2.496,0.055,0.079,12.303,0.0,0.0,0.0,-6.22,-0.23,-0.762,-3.631,-0.07,0.0,7.861,4.356,1.803 diff --git a/workflow/tests/base_results/results_simulations_misc.csv b/workflow/tests/base_results/results_simulations_misc.csv index 8b39f82681..4750497ad3 100644 --- a/workflow/tests/base_results/results_simulations_misc.csv +++ b/workflow/tests/base_results/results_simulations_misc.csv @@ -107,6 +107,7 @@ base-dhw-recirc-manual.xml,0.0,87.0,0.0,1286.4,890.5,11468.6,1281.2,2248.1,3763. base-dhw-recirc-nocontrol.xml,0.0,87.0,0.0,1286.4,890.5,11468.6,1281.2,3108.4,4386.6,4386.6,3108.4,4386.6,4386.6,33304.0,23005.0,0.0 base-dhw-recirc-temperature.xml,0.0,87.0,0.0,1286.4,890.5,11468.6,1281.2,2754.8,4179.7,4179.7,2754.8,4179.7,4179.7,33304.0,23005.0,0.0 base-dhw-recirc-timer.xml,0.0,87.0,0.0,1286.4,890.5,11468.6,1281.2,3108.4,4386.6,4386.6,3108.4,4386.6,4386.6,33304.0,23005.0,0.0 +base-dhw-setpoint-temperature-mixing-valve.xml,0.0,90.0,0.0,1035.3,716.6,9980.5,3430.8,2340.6,3775.7,3775.7,2340.6,3775.7,3775.7,33273.0,23006.0,0.0 base-dhw-setpoint-temperature.xml,0.0,90.0,0.0,1286.4,890.5,9980.5,3430.8,2315.6,3887.6,3887.6,2315.6,3887.6,3887.6,33275.0,23006.0,0.0 base-dhw-solar-direct-evacuated-tube.xml,0.0,88.0,0.0,1286.3,890.4,11388.2,3914.7,2337.6,3383.6,3383.6,2337.6,3383.6,3383.6,33304.0,23005.0,0.0 base-dhw-solar-direct-flat-plate.xml,0.0,90.0,0.0,1286.0,890.2,10691.6,3675.2,2200.1,3383.6,3383.6,2200.1,3383.6,3383.6,33303.0,23006.0,0.0 @@ -121,6 +122,8 @@ base-dhw-tank-gas-ef.xml,0.0,101.0,0.0,1286.4,890.5,11468.9,3942.4,1482.2,3351.7 base-dhw-tank-gas-fhr.xml,0.0,96.0,0.0,1286.4,890.5,11468.8,3942.4,1483.0,3351.7,3351.7,1483.0,3351.7,3351.7,33901.0,23012.0,0.0 base-dhw-tank-gas-outside.xml,0.0,81.0,0.0,1286.4,890.5,11468.6,3942.3,1479.2,3351.6,3351.6,1479.2,3351.6,3351.6,33478.0,23000.0,0.0 base-dhw-tank-gas.xml,0.0,96.0,0.0,1286.4,890.5,11468.8,3942.4,1483.0,3351.7,3351.7,1483.0,3351.7,3351.7,33901.0,23012.0,0.0 +base-dhw-tank-heat-pump-120v-dedicated-circuit.xml,0.0,51.0,0.0,1129.9,781.6,10094.8,3470.1,1960.0,3730.9,3730.9,1960.0,3730.9,3730.9,33379.0,22747.0,0.0 +base-dhw-tank-heat-pump-120v.xml,0.0,50.0,0.0,1129.8,781.7,10094.4,3469.9,1871.9,3704.8,3704.8,1871.9,3704.8,3704.8,33824.0,22738.0,0.0 base-dhw-tank-heat-pump-capacities.xml,0.0,59.0,0.0,1286.4,890.5,11076.4,3807.5,1716.0,3353.3,3353.3,1716.0,3353.3,3353.3,32954.0,22790.0,0.0 base-dhw-tank-heat-pump-confined-space.xml,0.0,54.0,0.0,1286.4,890.5,10972.3,3771.7,1973.3,3750.6,3750.6,1973.3,3750.6,3750.6,35754.0,23036.0,0.0 base-dhw-tank-heat-pump-detailed-schedules.xml,0.0,64.0,0.0,1286.4,890.5,10054.2,3456.1,1839.6,3608.9,3608.9,1839.6,3608.9,3608.9,36443.0,22997.0,0.0 diff --git a/workflow/tests/base_results/results_simulations_panel.csv b/workflow/tests/base_results/results_simulations_panel.csv index 357adcc5fc..28b9447b97 100644 --- a/workflow/tests/base_results/results_simulations_panel.csv +++ b/workflow/tests/base_results/results_simulations_panel.csv @@ -107,6 +107,7 @@ base-dhw-recirc-manual.xml,0.0,0.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-nocontrol.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-temperature.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-timer.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-setpoint-temperature-mixing-valve.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-setpoint-temperature.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-solar-direct-evacuated-tube.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-solar-direct-flat-plate.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 @@ -121,6 +122,8 @@ base-dhw-tank-gas-ef.xml,0.0,0.0,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-fhr.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-outside.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-120v-dedicated-circuit.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-120v.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-confined-space.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0