From 290085a496db2bbcceb082d1b5d86053d47a4373 Mon Sep 17 00:00:00 2001 From: Jeff Maguire Date: Tue, 31 Oct 2023 17:28:04 -0600 Subject: [PATCH 01/13] Initial add of 120V HPWH parameters --- HPXMLtoOpenStudio/resources/waterheater.rb | 208 +++++++++++++++------ 1 file changed, 154 insertions(+), 54 deletions(-) diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index 70c99b18c7..d18d645e37 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -59,6 +59,10 @@ def self.apply_tankless(model, runner, loc_space, loc_schedule, water_heating_sy end def self.apply_heatpump(model, runner, loc_space, loc_schedule, weather, water_heating_system, ec_adj, solar_thermal_system, conditioned_zone, eri_version, schedules_file, unavailable_periods) + #TODO: flag for testing, need to add whether this is 120 V or 240 V, shared or dedicated circuit, to the HPXML files. Extension elements? + hpwh_120V = true + hpwh_120V_type = 'dedicated' #'shared' + obj_name_hpwh = Constants.ObjectNameWaterHeater solar_fraction = get_water_heater_solar_fraction(water_heating_system, solar_thermal_system) t_set_c = get_t_set_c(water_heating_system.temperature, water_heating_system.water_heater_type) @@ -80,6 +84,11 @@ def self.apply_heatpump(model, runner, loc_space, loc_schedule, weather, water_h top_element_setpoint_schedule.setName("#{obj_name_hpwh} TopElementSetpoint") bottom_element_setpoint_schedule = OpenStudio::Model::ScheduleConstant.new(model) bottom_element_setpoint_schedule.setName("#{obj_name_hpwh} BottomElementSetpoint") + + if hpwh_120V #no elements, HP only + top_element_setpoint_schedule.setValue(0.0) + bottom_element_setpoint_schedule.setValue(0.0) + end setpoint_schedule = nil if not schedules_file.nil? @@ -103,15 +112,20 @@ def self.apply_heatpump(model, runner, loc_space, loc_schedule, weather, water_h runner.registerWarning("Both '#{SchedulesFile::ColumnWaterHeaterSetpoint}' schedule file and setpoint temperature provided; the latter will be ignored.") if !t_set_c.nil? end + if hpwh_120V + min_temp = 37.0 # F, from spec sheet + max_temp = 145.0 # F, from spec sheet + else + min_temp = 42.0 # F + max_temp = 120.0 # F + end airflow_rate = 181.0 # cfm - min_temp = 42.0 # F - max_temp = 120.0 # F # Coil:WaterHeating:AirToWaterHeatPump:Wrapped - coil = setup_hpwh_dxcoil(model, runner, water_heating_system, weather, obj_name_hpwh, airflow_rate) + coil = setup_hpwh_dxcoil(model, runner, water_heating_system, weather, obj_name_hpwh, airflow_rate, hpwh_120V, hpwh_120V_type) # WaterHeater:Stratified - tank = setup_hpwh_stratified_tank(model, water_heating_system, obj_name_hpwh, h_tank, solar_fraction, hpwh_tamb, bottom_element_setpoint_schedule, top_element_setpoint_schedule) + tank = setup_hpwh_stratified_tank(model, water_heating_system, obj_name_hpwh, h_tank, solar_fraction, hpwh_tamb, bottom_element_setpoint_schedule, top_element_setpoint_schedule, hpwh_120V, hpwh_120V_type) loop.addSupplyBranchForComponent(tank) add_desuperheater(model, runner, water_heating_system, tank, loc_space, loc_schedule, loop) @@ -120,7 +134,7 @@ def self.apply_heatpump(model, runner, loc_space, loc_schedule, weather, water_h fan = setup_hpwh_fan(model, water_heating_system, obj_name_hpwh, airflow_rate) # WaterHeater:HeatPump:WrappedCondenser - hpwh = setup_hpwh_wrapped_condenser(model, obj_name_hpwh, coil, tank, fan, h_tank, airflow_rate, hpwh_tamb, hpwh_rhamb, min_temp, max_temp, control_setpoint_schedule) + hpwh = setup_hpwh_wrapped_condenser(model, obj_name_hpwh, coil, tank, fan, h_tank, airflow_rate, hpwh_tamb, hpwh_rhamb, min_temp, max_temp, control_setpoint_schedule, hpwh_120V, hpwh_120V_type) # Amb temp & RH sensors, temp sensor shared across programs amb_temp_sensor, amb_rh_sensors = get_loc_temp_rh_sensors(model, obj_name_hpwh, loc_schedule, loc_space, conditioned_zone) @@ -128,13 +142,16 @@ def self.apply_heatpump(model, runner, loc_space, loc_schedule, weather, water_h # EMS for the HPWH control logic op_mode = water_heating_system.operating_mode - hpwh_ctrl_program = add_hpwh_control_program(model, runner, obj_name_hpwh, amb_temp_sensor, top_element_setpoint_schedule, bottom_element_setpoint_schedule, min_temp, max_temp, op_mode, setpoint_schedule, control_setpoint_schedule, schedules_file) - + if not hpwh_120V #No EMS required when there's no elements + hpwh_ctrl_program = add_hpwh_control_program(model, runner, obj_name_hpwh, amb_temp_sensor, top_element_setpoint_schedule, bottom_element_setpoint_schedule, min_temp, max_temp, op_mode, setpoint_schedule, control_setpoint_schedule, schedules_file) + end # ProgramCallingManagers program_calling_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model) program_calling_manager.setName("#{obj_name_hpwh} ProgramManager") program_calling_manager.setCallingPoint('InsideHVACSystemIterationLoop') - program_calling_manager.addProgram(hpwh_ctrl_program) + if not hpwh_120V + program_calling_manager.addProgram(hpwh_ctrl_program) + end program_calling_manager.addProgram(hpwh_inlet_air_program) add_ec_adj(model, hpwh, ec_adj, loc_space, water_heating_system) @@ -634,7 +651,7 @@ def self.apply_solar_thermal(model, loc_space, loc_schedule, solar_thermal_syste private - def self.setup_hpwh_wrapped_condenser(model, obj_name_hpwh, coil, tank, fan, h_tank, airflow_rate, hpwh_tamb, hpwh_rhamb, min_temp, max_temp, setpoint_schedule) + def self.setup_hpwh_wrapped_condenser(model, obj_name_hpwh, coil, tank, fan, h_tank, airflow_rate, hpwh_tamb, hpwh_rhamb, min_temp, max_temp, setpoint_schedule, hpwh_120V, hpwh_120V_type) h_condtop = (1.0 - (5.5 / 12.0)) * h_tank # in the 6th node of the tank (counting from top) h_condbot = 0.01 # bottom node h_hpctrl_up = (1.0 - (2.5 / 12.0)) * h_tank # in the 3rd node of the tank @@ -642,7 +659,11 @@ def self.setup_hpwh_wrapped_condenser(model, obj_name_hpwh, coil, tank, fan, h_t hpwh = OpenStudio::Model::WaterHeaterHeatPumpWrappedCondenser.new(model, coil, tank, fan, setpoint_schedule, model.alwaysOnDiscreteSchedule) hpwh.setName("#{obj_name_hpwh} hpwh") - hpwh.setDeadBandTemperatureDifference(3.89) + if hpwh_120V + hpwh.setDeadBandTemperatureDifference(5.0) + else + hpwh.setDeadBandTemperatureDifference(3.89) + end hpwh.setCondenserBottomLocation(h_condbot) hpwh.setCondenserTopLocation(h_condtop) hpwh.setEvaporatorAirFlowRate(UnitConversions.convert(airflow_rate, 'ft^3/min', 'm^3/s')) @@ -659,43 +680,108 @@ def self.setup_hpwh_wrapped_condenser(model, obj_name_hpwh, coil, tank, fan, h_t hpwh.setParasiticHeatRejectionLocation('Outdoors') hpwh.setTankElementControlLogic('MutuallyExclusive') hpwh.setControlSensor1HeightInStratifiedTank(h_hpctrl_up) - hpwh.setControlSensor1Weight(0.75) + if hpwh_120V + hpwh.setControlSensor1Weight(0.5) + else + hpwh.setControlSensor1Weight(0.75) + end hpwh.setControlSensor2HeightInStratifiedTank(h_hpctrl_low) return hpwh end - def self.setup_hpwh_dxcoil(model, runner, water_heating_system, weather, obj_name_hpwh, airflow_rate) + def self.setup_hpwh_dxcoil(model, runner, water_heating_system, weather, obj_name_hpwh, airflow_rate, hpwh_120V, hpwh_120V_type) # Curves - hpwh_cap = OpenStudio::Model::CurveBiquadratic.new(model) - hpwh_cap.setName('HPWH-Cap-fT') - hpwh_cap.setCoefficient1Constant(0.563) - hpwh_cap.setCoefficient2x(0.0437) - hpwh_cap.setCoefficient3xPOW2(0.000039) - hpwh_cap.setCoefficient4y(0.0055) - hpwh_cap.setCoefficient5yPOW2(-0.000148) - hpwh_cap.setCoefficient6xTIMESY(-0.000145) - hpwh_cap.setMinimumValueofx(0) - hpwh_cap.setMaximumValueofx(100) - hpwh_cap.setMinimumValueofy(0) - hpwh_cap.setMaximumValueofy(100) - - hpwh_cop = OpenStudio::Model::CurveBiquadratic.new(model) - hpwh_cop.setName('HPWH-COP-fT') - hpwh_cop.setCoefficient1Constant(1.1332) - hpwh_cop.setCoefficient2x(0.063) - hpwh_cop.setCoefficient3xPOW2(-0.0000979) - hpwh_cop.setCoefficient4y(-0.00972) - hpwh_cop.setCoefficient5yPOW2(-0.0000214) - hpwh_cop.setCoefficient6xTIMESY(-0.000686) - hpwh_cop.setMinimumValueofx(0) - hpwh_cop.setMaximumValueofx(100) - hpwh_cop.setMinimumValueofy(0) - hpwh_cop.setMaximumValueofy(100) - + if hpwh_120V + if hpwh_120V_type == 'dedicated' + cap = 0.422 # kW + + hpwh_cap = OpenStudio::Model::CurveBiquadratic.new(model) + hpwh_cap.setName('HPWH-Cap-fT') + hpwh_cap.setCoefficient1Constant(0.636) + hpwh_cap.setCoefficient2x(0.0227) + hpwh_cap.setCoefficient3xPOW2(0.000406) + hpwh_cap.setCoefficient4y(-0.000437) + hpwh_cap.setCoefficient5yPOW2(0.0) + hpwh_cap.setCoefficient6xTIMESY(0.0) + hpwh_cap.setMinimumValueofx(0) + hpwh_cap.setMaximumValueofx(100) + hpwh_cap.setMinimumValueofy(0) + hpwh_cap.setMaximumValueofy(100) + + hpwh_cop = OpenStudio::Model::CurveBiquadratic.new(model) + hpwh_cop.setName('HPWH-COP-fT') + hpwh_cop.setCoefficient1Constant(1.0877) + hpwh_cop.setCoefficient2x(0.02076) + hpwh_cop.setCoefficient3xPOW2(0.0004093) + hpwh_cop.setCoefficient4y(-0.01123) + hpwh_cop.setCoefficient5yPOW2(0.00007281) + hpwh_cop.setCoefficient6xTIMESY(-0.0004776) + hpwh_cop.setMinimumValueofx(0) + hpwh_cop.setMaximumValueofx(100) + hpwh_cop.setMinimumValueofy(0) + hpwh_cop.setMaximumValueofy(100) + else + #FIXME: Update when performance mapping of shared circuit 120V HPWH is complete + cap = 0.3 # kW + hpwh_cap = OpenStudio::Model::CurveBiquadratic.new(model) + hpwh_cap.setName('HPWH-Cap-fT') + hpwh_cap.setCoefficient1Constant(0.636) + hpwh_cap.setCoefficient2x(0.0227) + hpwh_cap.setCoefficient3xPOW2(0.000406) + hpwh_cap.setCoefficient4y(-0.000437) + hpwh_cap.setCoefficient5yPOW2(0.0) + hpwh_cap.setCoefficient6xTIMESY(0.0) + hpwh_cap.setMinimumValueofx(0) + hpwh_cap.setMaximumValueofx(100) + hpwh_cap.setMinimumValueofy(0) + hpwh_cap.setMaximumValueofy(100) + + hpwh_cop = OpenStudio::Model::CurveBiquadratic.new(model) + hpwh_cop.setName('HPWH-COP-fT') + hpwh_cop.setCoefficient1Constant(1.0877) + hpwh_cop.setCoefficient2x(0.02076) + hpwh_cop.setCoefficient3xPOW2(0.0004093) + hpwh_cop.setCoefficient4y(-0.01123) + hpwh_cop.setCoefficient5yPOW2(0.00007281) + hpwh_cop.setCoefficient6xTIMESY(-0.0004776) + hpwh_cop.setMinimumValueofx(0) + hpwh_cop.setMaximumValueofx(100) + hpwh_cop.setMinimumValueofy(0) + hpwh_cop.setMaximumValueofy(100) + end + else + cap = 0.5 # kW + hpwh_cap = OpenStudio::Model::CurveBiquadratic.new(model) + hpwh_cap.setName('HPWH-Cap-fT') + hpwh_cap.setCoefficient1Constant(0.563) + hpwh_cap.setCoefficient2x(0.0437) + hpwh_cap.setCoefficient3xPOW2(0.000039) + hpwh_cap.setCoefficient4y(0.0055) + hpwh_cap.setCoefficient5yPOW2(-0.000148) + hpwh_cap.setCoefficient6xTIMESY(-0.000145) + hpwh_cap.setMinimumValueofx(0) + hpwh_cap.setMaximumValueofx(100) + hpwh_cap.setMinimumValueofy(0) + hpwh_cap.setMaximumValueofy(100) + + hpwh_cop = OpenStudio::Model::CurveBiquadratic.new(model) + hpwh_cop.setName('HPWH-COP-fT') + hpwh_cop.setCoefficient1Constant(1.1332) + hpwh_cop.setCoefficient2x(0.063) + hpwh_cop.setCoefficient3xPOW2(-0.0000979) + hpwh_cop.setCoefficient4y(-0.00972) + hpwh_cop.setCoefficient5yPOW2(-0.0000214) + hpwh_cop.setCoefficient6xTIMESY(-0.000686) + hpwh_cop.setMinimumValueofx(0) + hpwh_cop.setMaximumValueofx(100) + hpwh_cop.setMinimumValueofy(0) + hpwh_cop.setMaximumValueofy(100) + end + # Assumptions and values - cap = 0.5 # kW shr = 0.88 # unitless + # Calculate an altitude adjusted rated evaporator wetbulb temperature rated_ewb_F = 56.4 @@ -708,19 +794,27 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, weather, obj_nam twb_adj = Psychrometrics.Twb_fT_w_P(runner, rated_edb_F, w_adj, p_atm) # Calculate the COP based on EF - if not water_heating_system.energy_factor.nil? - uef = (0.60522 + water_heating_system.energy_factor) / 1.2101 - cop = 1.174536058 * uef # Based on simulation of the UEF test procedure at varying COPs - elsif not water_heating_system.uniform_energy_factor.nil? - uef = water_heating_system.uniform_energy_factor - if water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinVerySmall - fail 'It is unlikely that a heat pump water heater falls into the very small bin of the First Hour Rating (FHR) test. Double check input.' - elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinLow - cop = 1.0005 * uef - 0.0789 - elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinMedium - cop = 1.0909 * uef - 0.0868 - elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinHigh - cop = 1.1022 * uef - 0.0877 + if hpwh_120V + if hpwh_120V_type == 'dedicated' + cop = 3.6 + else + cop = 3.6 + end + else + if not water_heating_system.energy_factor.nil? + uef = (0.60522 + water_heating_system.energy_factor) / 1.2101 + cop = 1.174536058 * uef # Based on simulation of the UEF test procedure at varying COPs + elsif not water_heating_system.uniform_energy_factor.nil? + uef = water_heating_system.uniform_energy_factor + if water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinVerySmall + fail 'It is unlikely that a heat pump water heater falls into the very small bin of the First Hour Rating (FHR) test. Double check input.' + elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinLow + cop = 1.0005 * uef - 0.0789 + elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinMedium + cop = 1.0909 * uef - 0.0868 + elsif water_heating_system.usage_bin == HPXML::WaterHeaterUsageBinHigh + cop = 1.1022 * uef - 0.0877 + end end end @@ -743,14 +837,20 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, weather, obj_nam return coil end - def self.setup_hpwh_stratified_tank(model, water_heating_system, obj_name_hpwh, h_tank, solar_fraction, hpwh_tamb, hpwh_bottom_element_sp, hpwh_top_element_sp) + def self.setup_hpwh_stratified_tank(model, water_heating_system, obj_name_hpwh, h_tank, solar_fraction, hpwh_tamb, hpwh_bottom_element_sp, hpwh_top_element_sp, hpwh_120V, hpwh_120V_type) # Calculate some geometry parameters for UA, the location of sensors and heat sources in the tank v_actual = calc_storage_tank_actual_vol(water_heating_system.tank_volume, water_heating_system.fuel_type) # gal a_tank, a_side = calc_tank_areas(v_actual, UnitConversions.convert(h_tank, 'm', 'ft')) # sqft - e_cap = 4.5 # kW + if hpwh_120V + e_cap = 0.0 # kW, no backup in Rheem 120V + else + e_cap = 4.5 # kW + end + parasitics = 3.0 # W # Based on Ecotope lab testing of most recent AO Smith HPWHs (series HPTU) + #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/h-R elsif water_heating_system.tank_volume <= 73.0 From 5582ece61279aad1abaa07d8deecade25d6c16de Mon Sep 17 00:00:00 2001 From: Jeff Maguire Date: Tue, 31 Oct 2023 17:47:56 -0600 Subject: [PATCH 02/13] Oops, fixed some unmet WH loads changes. --- HPXMLtoOpenStudio/resources/hotwater_appliances.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb index 5f559f0055..b85d0f61b7 100644 --- a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +++ b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb @@ -289,19 +289,16 @@ def self.apply(model, runner, hpxml, weather, spaces, hot_water_distribution, if gpd_frac > 0 fx_gpd = get_fixtures_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fractions, fixtures_usage_multiplier) - shower_gpd = get_showers_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fractions, fixtures_usage_multiplier) w_gpd = get_dist_waste_gpd(eri_version, nbeds, has_uncond_bsmnt, cfa, ncfl, hot_water_distribution, fixtures_all_low_flow, fixtures_usage_multiplier) fx_peak_flow = nil shower_peak_flow = nil if not schedules_file.nil? fx_peak_flow = schedules_file.calc_peak_flow_from_daily_gpm(col_name: SchedulesFile::ColumnHotWaterFixtures, daily_water: fx_gpd) - shower_peak_flow = schedules_file.calc_peak_flow_from_daily_gpm(col_name: SchedulesFile::ColumnHotWaterFixtures, daily_water: shower_gpd) dist_water_peak_flow = schedules_file.calc_peak_flow_from_daily_gpm(col_name: SchedulesFile::ColumnHotWaterFixtures, daily_water: w_gpd) end if fx_peak_flow.nil? fx_peak_flow = fixtures_schedule_obj.calc_design_level_from_daily_gpm(fx_gpd) - shower_peak_flow = shower_schedule_obj.calc_design_level_from_daily_gpm(fx_gpd) dist_water_peak_flow = fixtures_schedule_obj.calc_design_level_from_daily_gpm(w_gpd) end @@ -972,7 +969,6 @@ def self.get_fixtures_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fr end def self.add_showers_and_calculate_max(model, runner, hpxml, weather, water_heating_system, eri_version, schedules_file) - #JEFF nbeds = hpxml.building_construction.additional_properties.adjusted_number_of_bedrooms #Process fixtures From 07c32ade5b35f4f20106d2c4e93c23c7b745a1c6 Mon Sep 17 00:00:00 2001 From: Jeff Maguire Date: Tue, 31 Oct 2023 18:04:07 -0600 Subject: [PATCH 03/13] Now runs successfully :) --- HPXMLtoOpenStudio/measure.rb | 2 +- HPXMLtoOpenStudio/resources/constants.rb | 2 +- .../resources/hotwater_appliances.rb | 22 ++++++++----------- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/HPXMLtoOpenStudio/measure.rb b/HPXMLtoOpenStudio/measure.rb index 46e0e6625f..56f3c82205 100644 --- a/HPXMLtoOpenStudio/measure.rb +++ b/HPXMLtoOpenStudio/measure.rb @@ -1896,7 +1896,7 @@ def self.add_unmet_hours_output(model, spaces) def self.add_unmet_wh_loads(runner, model, weather, hw_plant_loop) @hpxml.water_heating_systems.each do |water_heating_system| #Get shower schedule max value - shower_peak_flow = HotWaterAndAppliances.add_showers_and_calculate_max(model, runner, @hpxml, weather, water_heating_system, @eri_version, @schedules_file) + shower_peak_flow = HotWaterAndAppliances.add_showers_and_calculate_max(model, runner, @hpxml, weather, water_heating_system, @eri_version, @schedules_file, @hpxml.header.unavailable_periods) sys_id = water_heating_system.id #Get the water storage tanks for the outlet temp sensor num_tanks = 0 diff --git a/HPXMLtoOpenStudio/resources/constants.rb b/HPXMLtoOpenStudio/resources/constants.rb index 3910aade59..c2bdf58c6e 100644 --- a/HPXMLtoOpenStudio/resources/constants.rb +++ b/HPXMLtoOpenStudio/resources/constants.rb @@ -394,7 +394,7 @@ def self.ObjectNameRoomAirConditioner return 'room ac' end def self.ObjectNameShowers - return 'showers' + return 'hot_water_showers' end def self.ObjectNameSolarHotWater diff --git a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb index b85d0f61b7..26f7f433ad 100644 --- a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +++ b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb @@ -292,7 +292,6 @@ def self.apply(model, runner, hpxml, weather, spaces, hot_water_distribution, w_gpd = get_dist_waste_gpd(eri_version, nbeds, has_uncond_bsmnt, cfa, ncfl, hot_water_distribution, fixtures_all_low_flow, fixtures_usage_multiplier) fx_peak_flow = nil - shower_peak_flow = nil if not schedules_file.nil? fx_peak_flow = schedules_file.calc_peak_flow_from_daily_gpm(col_name: SchedulesFile::ColumnHotWaterFixtures, daily_water: fx_gpd) dist_water_peak_flow = schedules_file.calc_peak_flow_from_daily_gpm(col_name: SchedulesFile::ColumnHotWaterFixtures, daily_water: w_gpd) @@ -393,8 +392,6 @@ def self.apply(model, runner, hpxml, weather, spaces, hot_water_distribution, end end - - def self.get_range_oven_default_values() return { is_induction: false, is_convection: false } @@ -968,18 +965,19 @@ def self.get_fixtures_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fr return f_eff * ref_f_gpd * fixtures_usage_multiplier end - def self.add_showers_and_calculate_max(model, runner, hpxml, weather, water_heating_system, eri_version, schedules_file) + def self.add_showers_and_calculate_max(model, runner, hpxml, weather, water_heating_system, eri_version, schedules_file, unavailable_periods) nbeds = hpxml.building_construction.additional_properties.adjusted_number_of_bedrooms - - #Process fixtures + + # Process fixtures fixtures_usage_multiplier = hpxml.water_heating.water_fixtures_usage_multiplier fixtures_all_low_flow = true hpxml.water_fixtures.each do |water_fixture| next unless [HPXML::WaterFixtureTypeShowerhead, HPXML::WaterFixtureTypeFaucet].include? water_fixture.water_fixture_type + fixtures_all_low_flow = false if not water_fixture.low_flow end - #Get distribution system + # Get distribution system if hpxml.water_heating_systems.size > 0 hot_water_distribution = hpxml.hot_water_distributions[0] end @@ -995,7 +993,7 @@ def self.add_showers_and_calculate_max(model, runner, hpxml, weather, water_heat daily_wh_inlet_temperatures = calc_water_heater_daily_inlet_temperatures(weather, nbeds, hot_water_distribution, fixtures_all_low_flow, hpxml.header.sim_calendar_year) daily_mw_fractions = calc_mixed_water_daily_fractions(daily_wh_inlet_temperatures, avg_setpoint_temp, t_mix) - #Create separate shower schedule: Only used for calculating unmet loads. Shower hot water usage is part of the fixtures usage. + # Create separate shower schedule: Only used for calculating unmet loads. Shower hot water usage is part of the fixtures usage. showers_schedule = nil showers_col_name = SchedulesFile::ColumnHotWaterShowers if not schedules_file.nil? @@ -1006,7 +1004,7 @@ def self.add_showers_and_calculate_max(model, runner, hpxml, weather, water_heat showers_weekday_sch = Schedule.ShowersWeekdayFractions showers_weekend_sch = Schedule.ShowersWeekendFractions showers_monthly_sch = Schedule.ShowersMonthlyMultipliers - showers_schedule_obj = MonthWeekdayWeekendSchedule.new(model, Constants.ObjectNameShowers, showers_weekday_sch, showers_weekend_sch, showers_monthly_sch, Constants.ScheduleTypeLimitsFraction, unavailable_periods: fixtures_unavailable_periods) + showers_schedule_obj = MonthWeekdayWeekendSchedule.new(model, Constants.ObjectNameShowers, showers_weekday_sch, showers_weekend_sch, showers_monthly_sch, Constants.ScheduleTypeLimitsFraction, unavailable_periods: unavailable_periods) showers_schedule = showers_schedule_obj.schedule else runner.registerWarning("Both '#{showers_col_name}' schedule file and weekday fractions provided; the latter will be ignored.") if !Schedule.ShowersWeekdayFractions.nil? @@ -1022,13 +1020,11 @@ def self.add_showers_and_calculate_max(model, runner, hpxml, weather, water_heat shower_peak_flow = schedules_file.calc_peak_flow_from_daily_gpm(col_name: SchedulesFile::ColumnHotWaterFixtures, daily_water: shower_gpd) end if shower_peak_flow.nil? - shower_peak_flow = shower_schedule_obj.calc_design_level_from_daily_gpm(fx_gpd) + shower_peak_flow = showers_schedule_obj.calc_design_level_from_daily_gpm(shower_gpd) end end return shower_peak_flow - - end def self.get_showers_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fractions, fixtures_usage_multiplier = 1.0) @@ -1037,7 +1033,7 @@ def self.get_showers_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fra end if Constants.ERIVersions.index(eri_version) < Constants.ERIVersions.index('2014A') - #Note that the standard only has a total hot water usage, it does not specify a fraction for showers. Assuming showers are 40% of total HW usage (based on BA Benchmark usage) + # Note that the standard only has a total hot water usage, it does not specify a fraction for showers. Assuming showers are 40% of total HW usage (based on BA Benchmark usage) showers_gpd = 0.4 * (30.0 + 10.0 * nbeds) # Table 4.2.2(1) Service water heating systems # Convert to mixed water gpd avg_mw_fraction = daily_mw_fractions.reduce(:+) / daily_mw_fractions.size.to_f From 57362e1951e35a5bd96a9e24aa6ab36abb8c6022 Mon Sep 17 00:00:00 2001 From: Jeff Maguire Date: Thu, 2 Nov 2023 08:59:07 -0600 Subject: [PATCH 04/13] Update curve values --- HPXMLtoOpenStudio/resources/waterheater.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index d18d645e37..dab9913a79 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -711,12 +711,12 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, weather, obj_nam hpwh_cop = OpenStudio::Model::CurveBiquadratic.new(model) hpwh_cop.setName('HPWH-COP-fT') - hpwh_cop.setCoefficient1Constant(1.0877) - hpwh_cop.setCoefficient2x(0.02076) - hpwh_cop.setCoefficient3xPOW2(0.0004093) - hpwh_cop.setCoefficient4y(-0.01123) - hpwh_cop.setCoefficient5yPOW2(0.00007281) - hpwh_cop.setCoefficient6xTIMESY(-0.0004776) + hpwh_cop.setCoefficient1Constant(1.17977858818095) + hpwh_cop.setCoefficient2x(0.0301183438423715) + hpwh_cop.setCoefficient3xPOW2(0.000206318341610479) + hpwh_cop.setCoefficient4y(-0.019352993529396) + hpwh_cop.setCoefficient5yPOW2(0.00013405980085366) + hpwh_cop.setCoefficient6xTIMESY(-0.0003025958862054) hpwh_cop.setMinimumValueofx(0) hpwh_cop.setMaximumValueofx(100) hpwh_cop.setMinimumValueofy(0) From 888afa0d58eb04828e3c61c637d28e102891e98e Mon Sep 17 00:00:00 2001 From: Jeff Maguire Date: Thu, 16 Nov 2023 16:19:16 -0700 Subject: [PATCH 05/13] remove debug print statement --- HPXMLtoOpenStudio/resources/waterheater.rb | 1 - ...-dhw-tank-heat-pump-detailed-schedules.xml | 554 ------------------ 2 files changed, 555 deletions(-) delete mode 100644 workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index 3d6a5e6c96..ab11e00c65 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -1916,7 +1916,6 @@ def self.unmet_wh_loads_program(model, water_heating_systems, plantloop_map, sho num_tanks = 0 tank = nil hw_plant_loop = plantloop_map[water_heating_system.id] - puts("plantloop_map = #{plantloop_map}") hw_plant_loop.components.each do |c| next unless c.to_WaterHeaterMixed.is_initialized diff --git a/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml b/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml deleted file mode 100644 index 98febe3b3a..0000000000 --- a/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +++ /dev/null @@ -1,554 +0,0 @@ - - - - HPXML - tasks.rb - 2000-01-01T00:00:00-07:00 - create - - - - - 60 - - ../../HPXMLtoOpenStudio/resources/schedule_files/water-heater-setpoints.csv - ../../HPXMLtoOpenStudio/resources/schedule_files/water-heater-operating-modes.csv - - - Bills - - - - - - - - -
- CO -
-
- - proposed workscope - - - - - suburban - stand-alone - no units above or below - 180 - - electricity - natural gas - - - - single-family detached - 2.0 - 1.0 - 8.0 - 3 - 2 - 2700.0 - 21600.0 - - - - - 2006 - 5B - - - - USA_CO_Denver.Intl.AP.725650_TMY3 - - USA_CO_Denver.Intl.AP.725650_TMY3.epw - - - - - - - - 50.0 - - ACH - 3.0 - - 21600.0 - - - - - - - - false - - - false - - - - - - - - - - - true - - - - - - - - - - - attic - unvented - 1509.3 - asphalt or fiberglass shingles - 0.7 - 0.92 - 6.0 - false - - - 2.3 - - - - - - - outside - basement - conditioned - 115.6 - wood siding - 0.7 - 0.92 - - - 23.0 - - - - - - - outside - conditioned space - - - - 1200.0 - wood siding - 0.7 - 0.92 - - gypsum board - - - - 23.0 - - - - - outside - attic - unvented - gable - - - - 225.0 - wood siding - 0.7 - 0.92 - - - 4.0 - - - - - - - ground - basement - conditioned - 8.0 - 1200.0 - 8.0 - 7.0 - - gypsum board - - - - - continuous - exterior - 8.9 - 0.0 - 8.0 - - - continuous - interior - 0.0 - - - - - - - - attic - unvented - conditioned space - ceiling - - - - 1350.0 - - gypsum board - - - - 39.3 - - - - - - - basement - conditioned - 1350.0 - 4.0 - 150.0 - - - - 0.0 - 0.0 - - - - - - 0.0 - 0.0 - - - - 0.0 - 0.0 - - - - - - - 108.0 - 0 - 0.33 - 0.45 - - - 0.7 - 0.85 - - 0.67 - - - - - 72.0 - 90 - 0.33 - 0.45 - - - 0.7 - 0.85 - - 0.67 - - - - - 108.0 - 180 - 0.33 - 0.45 - - - 0.7 - 0.85 - - 0.67 - - - - - 72.0 - 270 - 0.33 - 0.45 - - - 0.7 - 0.85 - - 0.67 - - - - - - - - 40.0 - 180 - 4.4 - - - - - - - - - - - - - - - - - natural gas - 36000.0 - - AFUE - 0.92 - - 1.0 - - - - - central air conditioner - electricity - 24000.0 - single stage - 1.0 - - SEER - 13.0 - - 0.73 - - - - - 68.0 - 78.0 - - - - - - regular velocity - - supply - - CFM25 - 75.0 - to outside - - - - return - - CFM25 - 25.0 - to outside - - - - - supply - 4.0 - attic - unvented - 150.0 - - - - return - 0.0 - attic - unvented - 50.0 - - - - - - - - - electricity - heat pump water heater - conditioned space - 50.0 - 1.0 - 3.75 - medium - - - - - - 50.0 - - - - 0.0 - - - - - shower head - true - - - - faucet - false - - - - - - - conditioned space - 1.21 - 380.0 - 0.12 - 1.09 - 27.0 - 6.0 - 3.2 - - - - conditioned space - electricity - 3.73 - true - 150.0 - - - - conditioned space - 307.0 - 12 - 0.12 - 1.09 - 22.32 - 4.0 - - - - conditioned space - 650.0 - true - - - - conditioned space - electricity - false - - - - false - - - - - - interior - 0.4 - - - - - - - interior - 0.1 - - - - - - - interior - 0.25 - - - - - - - exterior - 0.4 - - - - - - - exterior - 0.1 - - - - - - - exterior - 0.25 - - - - - - - - - TV other - - kWh/year - 620.0 - - - - - other - - kWh/year - 2457.0 - - - 0.855 - 0.045 - - - - -
-
\ No newline at end of file From 6242be4a81be6549c2f4aeee8d98a6a5269f212b Mon Sep 17 00:00:00 2001 From: Jeff Maguire Date: Mon, 4 Dec 2023 11:53:55 -0700 Subject: [PATCH 06/13] Fix unmet shower calculation (wasn't pulling peak flow rate correctly into shower energy calc) --- HPXMLtoOpenStudio/resources/hotwater_appliances.rb | 5 ++--- HPXMLtoOpenStudio/resources/waterheater.rb | 5 +---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb index ee6335b846..a398271a1e 100644 --- a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +++ b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb @@ -329,8 +329,8 @@ def self.apply(model, runner, hpxml, weather, spaces, hot_water_distribution, end id = water_heating_system.id - shower_peak_flows[:id] = shower_peak_flow - + shower_peak_flows = {id => shower_peak_flow} + # Fixtures (showers, sinks, baths) add_water_use_equipment(model, Constants.ObjectNameFixtures, fx_peak_flow * gpd_frac * non_solar_fraction, fixtures_schedule, water_use_connections[water_heating_system.id], mw_temp_schedule) @@ -999,7 +999,6 @@ def self.get_fixtures_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fr end def self.get_showers_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fractions, fixtures_usage_multiplier = 1.0) - #JEFF if nbeds < 0.0 return 0.0 end diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index ab11e00c65..036f67c95e 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -1964,10 +1964,7 @@ def self.unmet_wh_loads_program(model, water_heating_systems, plantloop_map, sho unmet_wh_loads_program.addLine('Else') unmet_wh_loads_program.addLine('Set ShowerTime=0') unmet_wh_loads_program.addLine('EndIf') - unmet_wh_loads_program.addLine("If (#{shower_flow_sensor.name} > 0) && (#{wh_temp_sensor.name} < #{mixed_setpoint_sensor.name})") - # unmet_wh_loads_program.addLine("If (#{shower_flow_sensor.name} > 0) && (49 < #{mixed_setpoint_sensor.name})") - unmet_wh_loads_program.addLine('Set ShowerSagTime=SystemTimeStep') - # unmet_wh_loads_program.addLine("Set ShowerE=#{shower_flow_sensor.name} * #{shower_peak_flow} * 4141170 * (49 - #{mixed_setpoint_sensor.name})") + unmet_wh_loads_program.addLine("If (#{shower_flow_sensor.name} > 0) && (#{wh_temp_sensor.name} < #{mixed_setpoint_sensor.name})") unmet_wh_loads_program.addLine('Set ShowerSagTime=SystemTimeStep') unmet_wh_loads_program.addLine("Set ShowerE=#{shower_flow_sensor.name} * #{showers_peak_flow[water_heating_system.id]} * 4141170 * (#{wh_temp_sensor.name} - #{mixed_setpoint_sensor.name})") unmet_wh_loads_program.addLine('Else') unmet_wh_loads_program.addLine('Set ShowerSagTime=0') From 10e2a21d8acff2b4b7c385da36989ae2518f0efb Mon Sep 17 00:00:00 2001 From: Jeff Maguire Date: Mon, 4 Dec 2023 12:44:06 -0700 Subject: [PATCH 07/13] oops --- HPXMLtoOpenStudio/resources/waterheater.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index 036f67c95e..b563652d83 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -1964,7 +1964,8 @@ def self.unmet_wh_loads_program(model, water_heating_systems, plantloop_map, sho unmet_wh_loads_program.addLine('Else') unmet_wh_loads_program.addLine('Set ShowerTime=0') unmet_wh_loads_program.addLine('EndIf') - unmet_wh_loads_program.addLine("If (#{shower_flow_sensor.name} > 0) && (#{wh_temp_sensor.name} < #{mixed_setpoint_sensor.name})") unmet_wh_loads_program.addLine('Set ShowerSagTime=SystemTimeStep') + unmet_wh_loads_program.addLine("If (#{shower_flow_sensor.name} > 0) && (#{wh_temp_sensor.name} < #{mixed_setpoint_sensor.name})") + unmet_wh_loads_program.addLine('Set ShowerSagTime=SystemTimeStep') unmet_wh_loads_program.addLine("Set ShowerE=#{shower_flow_sensor.name} * #{showers_peak_flow[water_heating_system.id]} * 4141170 * (#{wh_temp_sensor.name} - #{mixed_setpoint_sensor.name})") unmet_wh_loads_program.addLine('Else') unmet_wh_loads_program.addLine('Set ShowerSagTime=0') From 4230a5990b1b9a58d33ddb14ac2e7a00cb077633 Mon Sep 17 00:00:00 2001 From: Jeff Maguire Date: Wed, 6 Dec 2023 12:41:12 -0700 Subject: [PATCH 08/13] Sign change on reported unmet shower E --- HPXMLtoOpenStudio/resources/waterheater.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index b563652d83..78c053320a 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -1966,7 +1966,7 @@ def self.unmet_wh_loads_program(model, water_heating_systems, plantloop_map, sho unmet_wh_loads_program.addLine('EndIf') unmet_wh_loads_program.addLine("If (#{shower_flow_sensor.name} > 0) && (#{wh_temp_sensor.name} < #{mixed_setpoint_sensor.name})") unmet_wh_loads_program.addLine('Set ShowerSagTime=SystemTimeStep') - unmet_wh_loads_program.addLine("Set ShowerE=#{shower_flow_sensor.name} * #{showers_peak_flow[water_heating_system.id]} * 4141170 * (#{wh_temp_sensor.name} - #{mixed_setpoint_sensor.name})") + unmet_wh_loads_program.addLine("Set ShowerE=#{shower_flow_sensor.name} * #{showers_peak_flow[water_heating_system.id]} * 990.0 * 4183.0 * (#{mixed_setpoint_sensor.name} - #{wh_temp_sensor.name})") unmet_wh_loads_program.addLine('Else') unmet_wh_loads_program.addLine('Set ShowerSagTime=0') unmet_wh_loads_program.addLine('Set ShowerE=0') From 05727309f04ce7b4416c4e52dc1a9e9898ce506e Mon Sep 17 00:00:00 2001 From: Jeff Maguire Date: Wed, 6 Dec 2023 15:58:40 -0700 Subject: [PATCH 09/13] Update unmet shower E calc --- HPXMLtoOpenStudio/resources/waterheater.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index 78c053320a..36bbe2e5ae 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -1966,7 +1966,7 @@ def self.unmet_wh_loads_program(model, water_heating_systems, plantloop_map, sho unmet_wh_loads_program.addLine('EndIf') unmet_wh_loads_program.addLine("If (#{shower_flow_sensor.name} > 0) && (#{wh_temp_sensor.name} < #{mixed_setpoint_sensor.name})") unmet_wh_loads_program.addLine('Set ShowerSagTime=SystemTimeStep') - unmet_wh_loads_program.addLine("Set ShowerE=#{shower_flow_sensor.name} * #{showers_peak_flow[water_heating_system.id]} * 990.0 * 4183.0 * (#{mixed_setpoint_sensor.name} - #{wh_temp_sensor.name})") + unmet_wh_loads_program.addLine("Set ShowerE=#{shower_flow_sensor.name} * #{showers_peak_flow[water_heating_system.id]} * 990.0 * 4183.0 * (SystemTimeStep * 3600) * (#{mixed_setpoint_sensor.name} - #{wh_temp_sensor.name})") unmet_wh_loads_program.addLine('Else') unmet_wh_loads_program.addLine('Set ShowerSagTime=0') unmet_wh_loads_program.addLine('Set ShowerE=0') From 9d699e15ea8db09ae9c5c7ef71f6f7d9df13138b Mon Sep 17 00:00:00 2001 From: Jeff Maguire Date: Mon, 18 Dec 2023 10:15:20 -0700 Subject: [PATCH 10/13] Don't need a count of WHs. --- HPXMLtoOpenStudio/resources/hotwater_appliances.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb index ad1dafe3d0..677d3d7473 100644 --- a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +++ b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb @@ -327,8 +327,7 @@ def self.apply(model, runner, hpxml_header, hpxml_bldg, weather, spaces, hot_wat #create an array of peak flow to return shower_peak_flows = {} - num_wh = 0 - hpxml.water_heating_systems.each do |water_heating_system| + hpxml_bldg.water_heating_systems.each do |water_heating_system| non_solar_fraction = 1.0 - Waterheater.get_water_heater_solar_fraction(water_heating_system, solar_thermal_system) gpd_frac = water_heating_system.fraction_dhw_load_served # Fixtures fraction @@ -377,7 +376,6 @@ def self.apply(model, runner, hpxml_header, hpxml_bldg, weather, spaces, hot_wat dist_pump.additionalProperties.setFeature('HPXML_ID', water_heating_system.id) # Used by reporting measure end end - num_wh += 1 end # Clothes washer From 57d9e26c37e8b334a9f97fd5084686191dbd5990 Mon Sep 17 00:00:00 2001 From: jmaguire1 Date: Tue, 16 Apr 2024 10:48:41 -0600 Subject: [PATCH 11/13] Some shared circuit updates --- HPXMLtoOpenStudio/resources/waterheater.rb | 42 +++++++++++----------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index 6ac144c200..e1b162a9cb 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -63,11 +63,15 @@ def self.apply_tankless(model, runner, loc_space, loc_schedule, water_heating_sy def self.apply_heatpump(model, runner, loc_space, loc_schedule, elevation, water_heating_system, ec_adj, solar_thermal_system, conditioned_zone, eri_version, schedules_file, unavailable_periods, unit_multiplier, nbeds) #TODO: flag for testing, need to add whether this is 120 V or 240 V, shared or dedicated circuit, to the HPXML files. Extension elements? hpwh_120V = true - hpwh_120V_type = 'dedicated' #'shared' + hpwh_120V_type = 'shared' #'dedicated' obj_name_hpwh = Constants.ObjectNameWaterHeater solar_fraction = get_water_heater_solar_fraction(water_heating_system, solar_thermal_system) - t_set_c = get_t_set_c(water_heating_system.temperature, water_heating_system.water_heater_type) + if hpwh_120V and hpwh_120V_type == 'shared' + t_set_c = 60.0 #FIXME: To account for higher setpoint + tempering valve. Leave delivery temperatures alone. Should specify tempering in OS-HPXML? + else + t_set_c = get_t_set_c(water_heating_system.temperature, water_heating_system.water_heater_type) + end loop = create_new_loop(model, t_set_c, eri_version, unit_multiplier) h_tank = 0.0188 * water_heating_system.tank_volume + 0.0935 # Linear relationship that gets GE height at 50 gal and AO Smith height at 80 gal @@ -127,7 +131,7 @@ def self.apply_heatpump(model, runner, loc_space, loc_schedule, elevation, water coil = setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_name_hpwh, airflow_rate, unit_multiplier, hpwh_120V, hpwh_120V_type) # WaterHeater:Stratified - tank = setup_hpwh_stratified_tank(model, water_heating_system, obj_name_hpwh, h_tank, solar_fraction, hpwh_tamb, bottom_element_setpoint_schedule, top_element_setpoint_schedule, unit_multiplier, nbeds, hpwh_120V, hpwh_120V_type) + tank = setup_hpwh_stratified_tank(model, water_heating_system, obj_name_hpwh, h_tank, solar_fraction, hpwh_tamb, bottom_element_setpoint_schedule, top_element_setpoint_schedule, unit_multiplier, nbeds, hpwh_120V) loop.addSupplyBranchForComponent(tank) add_desuperheater(model, runner, water_heating_system, tank, loc_space, loc_schedule, loop, unit_multiplier) @@ -720,16 +724,15 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n hpwh_cop.setMinimumValueofy(0) hpwh_cop.setMaximumValueofy(100) else - #FIXME: Update when performance mapping of shared circuit 120V HPWH is complete - cap = 0.3 * unit_multiplier# kW + cap = 0.357 * unit_multiplier# kW hpwh_cap = OpenStudio::Model::CurveBiquadratic.new(model) hpwh_cap.setName('HPWH-Cap-fT') - hpwh_cap.setCoefficient1Constant(0.636) - hpwh_cap.setCoefficient2x(0.0227) - hpwh_cap.setCoefficient3xPOW2(0.000406) - hpwh_cap.setCoefficient4y(-0.000437) - hpwh_cap.setCoefficient5yPOW2(0.0) - hpwh_cap.setCoefficient6xTIMESY(0.0) + hpwh_cap.setCoefficient1Constant(0.813229356) + hpwh_cap.setCoefficient2x(0.0159673030632523) + hpwh_cap.setCoefficient3xPOW2(0.000537186311098498) + hpwh_cap.setCoefficient4y(0.00203190805032679) + hpwh_cap.setCoefficient5yPOW2(-0.0000859752506704333) + hpwh_cap.setCoefficient6xTIMESY(-0.0000686226937803693) hpwh_cap.setMinimumValueofx(0) hpwh_cap.setMaximumValueofx(100) hpwh_cap.setMinimumValueofy(0) @@ -737,12 +740,12 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n hpwh_cop = OpenStudio::Model::CurveBiquadratic.new(model) hpwh_cop.setName('HPWH-COP-fT') - hpwh_cop.setCoefficient1Constant(1.0877) - hpwh_cop.setCoefficient2x(0.02076) - hpwh_cop.setCoefficient3xPOW2(0.0004093) - hpwh_cop.setCoefficient4y(-0.01123) - hpwh_cop.setCoefficient5yPOW2(0.00007281) - hpwh_cop.setCoefficient6xTIMESY(-0.0004776) + hpwh_cop.setCoefficient1Constant(1.01320210461835) + hpwh_cop.setCoefficient2x(0.0436532624576874) + hpwh_cop.setCoefficient3xPOW2(0.0000117316476697918) + hpwh_cop.setCoefficient4y(-0.0111263487690818) + hpwh_cop.setCoefficient5yPOW2(0.0000368768084560584) + hpwh_cop.setCoefficient6xTIMESY(-0.000498493870520354) hpwh_cop.setMinimumValueofx(0) hpwh_cop.setMaximumValueofx(100) hpwh_cop.setMinimumValueofy(0) @@ -780,7 +783,6 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n # Assumptions and values shr = 0.88 # unitless - # Calculate an altitude adjusted rated evaporator wetbulb temperature rated_ewb_F = 56.4 rated_edb_F = 67.5 @@ -797,7 +799,7 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n if hpwh_120V_type == 'dedicated' cop = 3.6 else - cop = 3.6 + cop = 4.2 end else if not water_heating_system.energy_factor.nil? @@ -836,7 +838,7 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n return coil end - def self.setup_hpwh_stratified_tank(model, water_heating_system, obj_name_hpwh, h_tank, solar_fraction, hpwh_tamb, hpwh_bottom_element_sp, hpwh_top_element_sp, unit_multiplier, nbeds, hpwh_120V, hpwh_120V_type) + def self.setup_hpwh_stratified_tank(model, water_heating_system, obj_name_hpwh, h_tank, solar_fraction, hpwh_tamb, hpwh_bottom_element_sp, hpwh_top_element_sp, unit_multiplier, nbeds, hpwh_120V) # Calculate some geometry parameters for UA, the location of sensors and heat sources in the tank v_actual = calc_storage_tank_actual_vol(water_heating_system.tank_volume, water_heating_system.fuel_type) # gal a_tank, a_side = calc_tank_areas(v_actual, UnitConversions.convert(h_tank, 'm', 'ft')) # sqft From 062314d44116a2dbb5cbc77644a36c179bd74fed Mon Sep 17 00:00:00 2001 From: jmaguire1 Date: Tue, 16 Apr 2024 10:59:09 -0600 Subject: [PATCH 12/13] Update unmet showers EMS program to match unmet_wh_loads branch --- HPXMLtoOpenStudio/resources/waterheater.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index e1b162a9cb..fd01a2f553 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -2006,9 +2006,9 @@ def self.unmet_wh_loads_program(model, water_heating_systems, plantloop_map, sho unmet_wh_loads_program.addLine('Else') unmet_wh_loads_program.addLine('Set ShowerTime=0') unmet_wh_loads_program.addLine('EndIf') - unmet_wh_loads_program.addLine("If (#{shower_flow_sensor.name} > 0) && (#{wh_temp_sensor.name} < #{mixed_setpoint_sensor.name})") + unmet_wh_loads_program.addLine("If (#{shower_flow_sensor.name} > 0) && (#{wh_temp_sensor.name} < #{mixed_setpoint_sensor.name})") unmet_wh_loads_program.addLine('Set ShowerSagTime=SystemTimeStep') - unmet_wh_loads_program.addLine("Set ShowerE=#{shower_flow_sensor.name} * #{showers_peak_flow[water_heating_system.id]} * 990.0 * 4183.0 * (SystemTimeStep * 3600) * (#{mixed_setpoint_sensor.name} - #{wh_temp_sensor.name})") + unmet_wh_loads_program.addLine("Set ShowerE=#{shower_flow_sensor.name} * #{showers_peak_flows[water_heating_system.id]} * 4141170 * (#{wh_temp_sensor.name} - #{mixed_setpoint_sensor.name})") unmet_wh_loads_program.addLine('Else') unmet_wh_loads_program.addLine('Set ShowerSagTime=0') unmet_wh_loads_program.addLine('Set ShowerE=0') From c50bbc5c2a95a8226186354af28bf398fc89491f Mon Sep 17 00:00:00 2001 From: jmaguire1 Date: Thu, 18 Apr 2024 13:44:09 -0600 Subject: [PATCH 13/13] Add tempering valve for shared circuit 120V HPWH --- BuildResidentialScheduleFile/measure.xml | 10 ++-- HPXMLtoOpenStudio/measure.rb | 3 +- HPXMLtoOpenStudio/measure.xml | 26 +++++----- .../resources/hotwater_appliances.rb | 12 ++++- HPXMLtoOpenStudio/resources/schedules.rb | 4 +- HPXMLtoOpenStudio/resources/waterheater.rb | 35 ++++++------- HPXMLtoOpenStudio/tests/test_schedules.rb | 1 - ReportSimulationOutput/measure.xml | 50 +++++++++++++++++-- ...ratified-detailed-occupancy-stochastic.xml | 30 +++-------- 9 files changed, 100 insertions(+), 71 deletions(-) diff --git a/BuildResidentialScheduleFile/measure.xml b/BuildResidentialScheduleFile/measure.xml index 69f19e76c7..f2d7ea1866 100644 --- a/BuildResidentialScheduleFile/measure.xml +++ b/BuildResidentialScheduleFile/measure.xml @@ -3,8 +3,8 @@ 3.1 build_residential_schedule_file f770b2db-1a9f-4e99-99a7-7f3161a594b1 - 88f0b216-fd7b-44ac-bae8-6e65898aa224 - 2024-03-14T23:17:21Z + a110985a-4bd3-4d90-8ae5-85ac26de0edb + 2024-04-18T19:34:47Z 03F02484 BuildResidentialScheduleFile Schedule File Builder @@ -22,7 +22,7 @@ schedules_column_names Schedules: Column Names - A comma-separated list of the column names to generate. If not provided, defaults to all columns. Possible column names are: occupants, lighting_interior, lighting_garage, cooking_range, dishwasher, clothes_washer, clothes_dryer, ceiling_fan, plug_loads_other, plug_loads_tv, hot_water_dishwasher, hot_water_clothes_washer, hot_water_fixtures. + A comma-separated list of the column names to generate. If not provided, defaults to all columns. Possible column names are: occupants, lighting_interior, lighting_garage, cooking_range, dishwasher, clothes_washer, clothes_dryer, ceiling_fan, plug_loads_other, plug_loads_tv, hot_water_dishwasher, hot_water_clothes_washer, hot_water_fixtures, hot_water_showers. String false false @@ -116,7 +116,7 @@ README.md md readme - 5852D2EF + 1FB083ED README.md.erb @@ -223,7 +223,7 @@ schedules.rb rb resource - B5E26248 + F588B60A schedules_config.md diff --git a/HPXMLtoOpenStudio/measure.rb b/HPXMLtoOpenStudio/measure.rb index 621e692b5b..f01718daa1 100644 --- a/HPXMLtoOpenStudio/measure.rb +++ b/HPXMLtoOpenStudio/measure.rb @@ -1553,8 +1553,7 @@ def add_hot_water_and_appliances(runner, model, weather, spaces) showers_peak_flows = HotWaterAndAppliances.apply(model, runner, @hpxml_header, @hpxml_bldg, weather, spaces, hot_water_distribution, solar_thermal_system, @eri_version, @schedules_file, plantloop_map, @hpxml_header.unavailable_periods, @hpxml_bldg.building_construction.number_of_units, - @apply_ashrae140_assumptions) - + @apply_ashrae140_assumptions) if (not solar_thermal_system.nil?) && (not solar_thermal_system.collector_area.nil?) # Detailed solar water heater loc_space, loc_schedule = get_space_or_schedule_from_location(solar_thermal_system.water_heating_system.location, model, spaces) diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml index ecc6d95902..3c080f02fa 100644 --- a/HPXMLtoOpenStudio/measure.xml +++ b/HPXMLtoOpenStudio/measure.xml @@ -3,8 +3,8 @@ 3.1 hpxm_lto_openstudio b1543b30-9465-45ff-ba04-1d1f85e763bc - a29c684e-60c6-4228-8d59-8f6c311f1172 - 2024-04-09T20:34:32Z + d949db95-7c4c-40f1-bb13-4723a63ebd5b + 2024-04-18T19:34:48Z D8922A73 HPXMLtoOpenStudio HPXML to OpenStudio Translator @@ -142,7 +142,7 @@ measure.rb rb script - CA17B170 + FA0D32C8 airflow.rb @@ -160,7 +160,7 @@ constants.rb rb resource - 2568BDAC + EB133043 constructions.rb @@ -274,7 +274,7 @@ data/unavailable_periods.csv csv resource - 73BFECE2 + DDE30F98 energyplus.rb @@ -298,7 +298,7 @@ hotwater_appliances.rb rb resource - 063242D8 + 8BDCB4FD hpxml.rb @@ -388,7 +388,7 @@ output.rb rb resource - 7AC7F779 + 00CDE355 psychrometrics.rb @@ -424,19 +424,19 @@ schedule_files/occupancy-stochastic-10-mins.csv csv resource - F88479B3 + 811F8B96 schedule_files/occupancy-stochastic-30-mins.csv csv resource - F88479B3 + 811F8B96 schedule_files/occupancy-stochastic.csv csv resource - B0187567 + EDB7F257 schedule_files/occupancy-stochastic_2.csv @@ -526,7 +526,7 @@ schedules.rb rb resource - 42F9AD9E + 97729642 simcontrols.rb @@ -562,7 +562,7 @@ waterheater.rb rb resource - 80D00EE1 + 07CD9978 weather.rb @@ -658,7 +658,7 @@ test_schedules.rb rb test - C6CCF641 + 683CFFF2 test_simcontrols.rb diff --git a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb index 8e1bb347dc..d65d25bda0 100644 --- a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +++ b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb @@ -417,6 +417,14 @@ def self.apply(model, runner, hpxml_header, hpxml_bldg, weather, spaces, hot_wat end end + # FIXME: quick fix for tempering valves. Since the tempering valves are set to the setpoint of the normal WH, this only affects 120V Shared HPWHs with higher tank setpoints + # TODO: Formal support of tempering valves? Probably requires an HPXML change? + t_hot = 125.0 # F + hw_temp_schedule = OpenStudio::Model::ScheduleConstant.new(model) + hw_temp_schedule.setName('hot water temperature schedule') + hw_temp_schedule.setValue(UnitConversions.convert(t_hot, 'F', 'C')) + Schedule.set_schedule_type_limits(model, hw_temp_schedule, Constants.ScheduleTypeLimitsTemperature) + # Clothes washer if not clothes_washer.nil? gpd_frac = nil @@ -438,7 +446,7 @@ def self.apply(model, runner, hpxml_header, hpxml_bldg, weather, spaces, hot_wat cw_peak_flow = cw_schedule_obj.calc_design_level_from_daily_gpm(cw_gpd) water_cw_schedule = cw_schedule_obj.schedule end - add_water_use_equipment(model, cw_object_name, cw_peak_flow * gpd_frac * non_solar_fraction, water_cw_schedule, water_use_connections[water_heating_system.id], unit_multiplier) + add_water_use_equipment(model, cw_object_name, cw_peak_flow * gpd_frac * non_solar_fraction, water_cw_schedule, water_use_connections[water_heating_system.id], unit_multiplier, hw_temp_schedule) end end @@ -465,7 +473,7 @@ def self.apply(model, runner, hpxml_header, hpxml_bldg, weather, spaces, hot_wat dw_peak_flow = dw_schedule_obj.calc_design_level_from_daily_gpm(dw_gpd) water_dw_schedule = dw_schedule_obj.schedule end - add_water_use_equipment(model, dw_obj_name, dw_peak_flow * gpd_frac * non_solar_fraction, water_dw_schedule, water_use_connections[water_heating_system.id], unit_multiplier) + add_water_use_equipment(model, dw_obj_name, dw_peak_flow * gpd_frac * non_solar_fraction, water_dw_schedule, water_use_connections[water_heating_system.id], unit_multiplier, hw_temp_schedule) end if not apply_ashrae140_assumptions diff --git a/HPXMLtoOpenStudio/resources/schedules.rb b/HPXMLtoOpenStudio/resources/schedules.rb index a9298095e0..7e3116d0db 100644 --- a/HPXMLtoOpenStudio/resources/schedules.rb +++ b/HPXMLtoOpenStudio/resources/schedules.rb @@ -948,7 +948,7 @@ def self.ShowersWeekendFractions def self.ShowersMonthlyMultipliers return '1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0' end - + def self.GeneralWaterUseWeekdayFractions return '0.023, 0.021, 0.021, 0.025, 0.027, 0.038, 0.044, 0.039, 0.037, 0.037, 0.034, 0.035, 0.035, 0.035, 0.039, 0.043, 0.051, 0.064, 0.065, 0.072, 0.073, 0.063, 0.045, 0.034' end @@ -1433,7 +1433,7 @@ def initialize(name, used_by_unavailable_periods, can_be_stochastic, type) HotWaterDishwasher: Column.new('hot_water_dishwasher', false, true, :frac), HotWaterClothesWasher: Column.new('hot_water_clothes_washer', false, true, :frac), HotWaterFixtures: Column.new('hot_water_fixtures', true, true, :frac), - HotWaterShowers: Column.new('hot_water_showers', true, true, :frac), + HotWaterShowers: Column.new('hot_water_showers', true, true, :frac), HotWaterRecirculationPump: Column.new('hot_water_recirculation_pump', true, false, :frac), GeneralWaterUse: Column.new('general_water_use', true, false, :frac), Sleeping: Column.new('sleeping', false, false, nil), diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index fd01a2f553..e409d402c9 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -61,14 +61,15 @@ def self.apply_tankless(model, runner, loc_space, loc_schedule, water_heating_sy end def self.apply_heatpump(model, runner, loc_space, loc_schedule, elevation, water_heating_system, ec_adj, solar_thermal_system, conditioned_zone, eri_version, schedules_file, unavailable_periods, unit_multiplier, nbeds) - #TODO: flag for testing, need to add whether this is 120 V or 240 V, shared or dedicated circuit, to the HPXML files. Extension elements? + # TODO: flag for testing, need to add whether this is 120 V or 240 V, shared or dedicated circuit, to the HPXML files. Extension elements? hpwh_120V = true - hpwh_120V_type = 'shared' #'dedicated' - + hpwh_120V_type = 'shared' # 'dedicated' + obj_name_hpwh = Constants.ObjectNameWaterHeater solar_fraction = get_water_heater_solar_fraction(water_heating_system, solar_thermal_system) - if hpwh_120V and hpwh_120V_type == 'shared' - t_set_c = 60.0 #FIXME: To account for higher setpoint + tempering valve. Leave delivery temperatures alone. Should specify tempering in OS-HPXML? + if hpwh_120V && (hpwh_120V_type == 'shared') + t_set_c = UnitConversions.convert(140.0, 'F', 'C') # FIXME: To account for higher setpoint + tempering valve. Leave delivery temperatures alone. Should specify tempering in OS-HPXML? + puts("t_set_c=#{t_set_c}") else t_set_c = get_t_set_c(water_heating_system.temperature, water_heating_system.water_heater_type) end @@ -90,8 +91,8 @@ def self.apply_heatpump(model, runner, loc_space, loc_schedule, elevation, water top_element_setpoint_schedule.setName("#{obj_name_hpwh} TopElementSetpoint") bottom_element_setpoint_schedule = OpenStudio::Model::ScheduleConstant.new(model) bottom_element_setpoint_schedule.setName("#{obj_name_hpwh} BottomElementSetpoint") - - if hpwh_120V #no elements, HP only + + if hpwh_120V # no elements, HP only top_element_setpoint_schedule.setValue(0.0) bottom_element_setpoint_schedule.setValue(0.0) end @@ -148,7 +149,7 @@ def self.apply_heatpump(model, runner, loc_space, loc_schedule, elevation, water # EMS for the HPWH control logic op_mode = water_heating_system.operating_mode - if not hpwh_120V #No EMS required when there's no elements + if not hpwh_120V # No EMS required when there's no elements hpwh_ctrl_program = add_hpwh_control_program(model, runner, obj_name_hpwh, amb_temp_sensor, top_element_setpoint_schedule, bottom_element_setpoint_schedule, min_temp, max_temp, op_mode, setpoint_schedule, control_setpoint_schedule, schedules_file) end # ProgramCallingManagers @@ -652,9 +653,9 @@ def self.apply_solar_thermal(model, loc_space, loc_schedule, solar_thermal_syste private - def self.setup_hpwh_wrapped_condenser(model, obj_name_hpwh, coil, tank, fan, h_tank, airflow_rate, hpwh_tamb, hpwh_rhamb, min_temp, max_temp, setpoint_schedule, unit_multiplier, hpwh_120V, hpwh_120V_type) + def self.setup_hpwh_wrapped_condenser(model, obj_name_hpwh, coil, tank, fan, h_tank, airflow_rate, hpwh_tamb, hpwh_rhamb, min_temp, max_temp, setpoint_schedule, unit_multiplier, hpwh_120V, _hpwh_120V_type) h_tank = get_tank_height() - h_condtop = (1.0 - (5.5 / 12.0)) * h_tank # in the 6th node of the tank (counting from top) + h_condtop = (1.0 - (5.5 / 12.0)) * h_tank # in the 6th node of the tank (counting from top) h_condbot = 0.01 * unit_multiplier # bottom node h_hpctrl_up = (1.0 - (2.5 / 12.0)) * h_tank # in the 3rd node of the tank h_hpctrl_low = (1.0 - (8.5 / 12.0)) * h_tank # in the 9th node of the tank @@ -724,7 +725,7 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n hpwh_cop.setMinimumValueofy(0) hpwh_cop.setMaximumValueofy(100) else - cap = 0.357 * unit_multiplier# kW + cap = 0.357 * unit_multiplier # kW hpwh_cap = OpenStudio::Model::CurveBiquadratic.new(model) hpwh_cap.setName('HPWH-Cap-fT') hpwh_cap.setCoefficient1Constant(0.813229356) @@ -752,7 +753,7 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n hpwh_cop.setMaximumValueofy(100) end else - cap = 0.5 * unit_multiplier# kW + cap = 0.5 * unit_multiplier # kW hpwh_cap = OpenStudio::Model::CurveBiquadratic.new(model) hpwh_cap.setName('HPWH-Cap-fT') hpwh_cap.setCoefficient1Constant(0.563) @@ -765,7 +766,7 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n hpwh_cap.setMaximumValueofx(100) hpwh_cap.setMinimumValueofy(0) hpwh_cap.setMaximumValueofy(100) - + hpwh_cop = OpenStudio::Model::CurveBiquadratic.new(model) hpwh_cop.setName('HPWH-COP-fT') hpwh_cop.setCoefficient1Constant(1.1332) @@ -779,10 +780,10 @@ def self.setup_hpwh_dxcoil(model, runner, water_heating_system, elevation, obj_n hpwh_cop.setMinimumValueofy(0) hpwh_cop.setMaximumValueofy(100) end - + # Assumptions and values shr = 0.88 # unitless - + # Calculate an altitude adjusted rated evaporator wetbulb temperature rated_ewb_F = 56.4 rated_edb_F = 67.5 @@ -848,10 +849,10 @@ def self.setup_hpwh_stratified_tank(model, water_heating_system, obj_name_hpwh, else e_cap = 4.5 # kW end - + parasitics = 3.0 # W # Based on Ecotope lab testing of most recent AO Smith HPWHs (series HPTU) - #FIXME: Is this close enough to the right value for 120V, or do we need new UA values? + # 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/h-R elsif water_heating_system.tank_volume <= 73.0 diff --git a/HPXMLtoOpenStudio/tests/test_schedules.rb b/HPXMLtoOpenStudio/tests/test_schedules.rb index 43263daa51..a0442f8a4f 100644 --- a/HPXMLtoOpenStudio/tests/test_schedules.rb +++ b/HPXMLtoOpenStudio/tests/test_schedules.rb @@ -51,7 +51,6 @@ def test_default_schedules args_hash['hpxml_path'] = File.absolute_path(File.join(sample_files_dir, 'base.xml')) model, _hpxml, _hpxml_bldg = _test_measure(args_hash) - schedule_constants = 12 schedule_rulesets = 17 schedule_fixed_intervals = 1 diff --git a/ReportSimulationOutput/measure.xml b/ReportSimulationOutput/measure.xml index ae914a57bc..1897c29d6b 100644 --- a/ReportSimulationOutput/measure.xml +++ b/ReportSimulationOutput/measure.xml @@ -3,8 +3,8 @@ 3.1 report_simulation_output df9d170c-c21a-4130-866d-0d46b06073fd - 86433d47-d27c-48f7-a73c-f041301a9510 - 2024-04-05T23:48:54Z + 6e556762-46e8-45f4-ada0-33298a400d06 + 2024-04-18T19:34:51Z 9BF1E6AC ReportSimulationOutput HPXML Simulation Output Report @@ -209,6 +209,25 @@ + + include_annual_unmet_loads + Generate Annual Output: Unmet Loads + Generates annual unmet loads for hot water. + Boolean + false + false + true + + + true + true + + + false + false + + + include_annual_peak_fuels Generate Annual Output: Peak Fuels @@ -1535,6 +1554,27 @@ Double false + + unmet_loads_hot_water_shower_time_hr + unmet_loads_hot_water_shower_time_hr + unmet_loads_hot_water_shower_time_hr + Double + false + + + unmet_loads_hot_water_shower_energy_j + unmet_loads_hot_water_shower_energy_j + unmet_loads_hot_water_shower_energy_j + Double + false + + + unmet_loads_hot_water_shower_unmet_time_hr + unmet_loads_hot_water_shower_unmet_time_hr + unmet_loads_hot_water_shower_unmet_time_hr + Double + false + peak_electricity_winter_total_w peak_electricity_winter_total_w @@ -1912,7 +1952,7 @@ README.md md readme - 86FD2C61 + 19CFE254 README.md.erb @@ -1929,13 +1969,13 @@ measure.rb rb script - A5EC70C1 + D0F6DE17 test_report_sim_output.rb rb test - E1591BBB + C12809BB diff --git a/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml b/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml index b5f2d4373e..38cf025fe4 100644 --- a/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +++ b/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml @@ -2,8 +2,8 @@ HPXML - tasks.rb - 2000-01-01T00:00:00-07:00 + BuildResidentialHPXML + 2024-04-18T13:38:34-06:00 create @@ -36,10 +36,6 @@ stand-alone no units above or below 180 - - electricity - natural gas - single-family detached @@ -88,7 +84,6 @@ false - false @@ -113,8 +108,7 @@ attic - unvented 1509.3 asphalt or fiberglass shingles - 0.7 - 0.92 + medium 6.0 @@ -129,8 +123,7 @@ basement - conditioned 115.6 wood siding - 0.7 - 0.92 + medium 23.0 @@ -147,11 +140,7 @@ 1200.0 wood siding - 0.7 - 0.92 - - gypsum board - + medium 23.0 @@ -167,8 +156,7 @@ 225.0 wood siding - 0.7 - 0.92 + medium 4.0 @@ -184,9 +172,6 @@ 1200.0 8.0 7.0 - - gypsum board - @@ -212,9 +197,6 @@ 1350.0 - - gypsum board - 39.3