Skip to content

Commit 4efddd1

Browse files
authored
Merge pull request #365 from NREL/hot_water_outputs
Hot water outputs
2 parents 4edf532 + 004bcb6 commit 4efddd1

10 files changed

Lines changed: 235 additions & 104 deletions

File tree

HPXMLtoOpenStudio/measure.xml

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
<schema_version>3.0</schema_version>
33
<name>hpxm_lto_openstudio</name>
44
<uid>b1543b30-9465-45ff-ba04-1d1f85e763bc</uid>
5-
<version_id>d8289762-8ed2-4b6b-ae42-3f4eb2536489</version_id>
6-
<version_modified>20200423T222111Z</version_modified>
5+
<version_id>3a4851f5-e9fb-41b7-9b48-834feb4c00ea</version_id>
6+
<version_modified>20200424T214303Z</version_modified>
77
<xml_checksum>D8922A73</xml_checksum>
88
<class_name>HPXMLtoOpenStudio</class_name>
99
<display_name>HPXML to OpenStudio Translator</display_name>
@@ -401,12 +401,6 @@
401401
<usage_type>resource</usage_type>
402402
<checksum>54943094</checksum>
403403
</file>
404-
<file>
405-
<filename>constants.rb</filename>
406-
<filetype>rb</filetype>
407-
<usage_type>resource</usage_type>
408-
<checksum>B25F263A</checksum>
409-
</file>
410404
<file>
411405
<filename>lighting.rb</filename>
412406
<filetype>rb</filetype>
@@ -443,12 +437,6 @@
443437
<usage_type>resource</usage_type>
444438
<checksum>D2131124</checksum>
445439
</file>
446-
<file>
447-
<filename>hotwater_appliances.rb</filename>
448-
<filetype>rb</filetype>
449-
<usage_type>resource</usage_type>
450-
<checksum>2963E900</checksum>
451-
</file>
452440
<file>
453441
<filename>waterheater.rb</filename>
454442
<filetype>rb</filetype>
@@ -478,5 +466,17 @@
478466
<usage_type>resource</usage_type>
479467
<checksum>99D52803</checksum>
480468
</file>
469+
<file>
470+
<filename>constants.rb</filename>
471+
<filetype>rb</filetype>
472+
<usage_type>resource</usage_type>
473+
<checksum>61AD1556</checksum>
474+
</file>
475+
<file>
476+
<filename>hotwater_appliances.rb</filename>
477+
<filetype>rb</filetype>
478+
<usage_type>resource</usage_type>
479+
<checksum>14B9BE69</checksum>
480+
</file>
481481
</files>
482482
</measure>

HPXMLtoOpenStudio/resources/constants.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,10 @@ def self.ObjectNameDishwasher
223223
return 'dishwasher'
224224
end
225225

226+
def self.ObjectNameDistributionWaste
227+
return 'dhw distribution waste'
228+
end
229+
226230
def self.ObjectNameDucts
227231
return 'ducts'
228232
end
@@ -371,6 +375,10 @@ def self.ObjectNameUnitHeater
371375
return 'unit heater'
372376
end
373377

378+
def self.ObjectNameWater
379+
return 'water'
380+
end
381+
374382
def self.ObjectNameWaterHeater
375383
return 'water heater'
376384
end

HPXMLtoOpenStudio/resources/hotwater_appliances.rb

Lines changed: 27 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -132,59 +132,43 @@ def self.apply(model, weather, living_space,
132132
end
133133

134134
if not dist_type.nil?
135-
# Fixtures (showers, sinks, baths) + distribution losses
135+
# Fixtures (showers, sinks, baths) + distribution waste
136136
fx_gpd = get_fixtures_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fractions)
137-
w_gpd = get_dist_waste_gpd(eri_version, nbeds, has_uncond_bsmnt, cfa, ncfl, dist_type, pipe_r, std_pipe_length, recirc_branch_length, fixtures_all_low_flow)
138-
fx_sens_btu, fx_lat_btu = get_fixtures_gains_sens_lat(nbeds)
139-
140137
fx_gpd *= fixtures_usage_multiplier
141-
w_gpd *= fixtures_usage_multiplier
142-
fx_sens_btu *= fixtures_usage_multiplier
143-
fx_lat_btu *= fixtures_usage_multiplier
144-
145-
disaggregate_sinks_showers_baths = false
146-
if disaggregate_sinks_showers_baths
147-
fx_names = [Constants.ObjectNameShower,
148-
Constants.ObjectNameSink,
149-
Constants.ObjectNameBath]
150-
else
151-
fx_names = [Constants.ObjectNameFixtures]
152-
end
153-
154-
fx_schedules = {}
155-
fx_names.each do |fx_name|
156-
fx_schedules[fx_name] = HotWaterSchedule.new(model, fx_name, nbeds)
157-
end
158-
159-
# Calculate sum_total_flow
160-
sum_total_flow = 0.0
161-
fx_schedules.each do |fx_name, fx_schedule|
162-
sum_total_flow += fx_schedule.totalFlow
163-
end
138+
w_gpd = get_dist_waste_gpd(eri_version, nbeds, has_uncond_bsmnt, cfa, ncfl, dist_type, pipe_r, std_pipe_length, recirc_branch_length, fixtures_all_low_flow)
139+
w_gpd *= fixtures_usage_multiplier # Fixture draws are the reason for most distribution waste, so scale this too
164140

165141
mw_schedule = OpenStudio::Model::ScheduleConstant.new(model)
166142
mw_schedule.setValue(UnitConversions.convert(t_mix, 'F', 'C'))
167143
Schedule.set_schedule_type_limits(model, mw_schedule, Constants.ScheduleTypeLimitsTemperature)
168144

169-
fx_schedules.each do |fx_name, fx_schedule|
170-
fx_name_sens = "#{fx_name} Sensible"
171-
fx_name_lat = "#{fx_name} Latent"
172-
173-
fx_schedule = fx_schedules[fx_name]
174-
fx_frac = fx_schedule.totalFlow / sum_total_flow
145+
water_name = Constants.ObjectNameWater
146+
water_schedule = HotWaterSchedule.new(model, Constants.ObjectNameFixtures, nbeds)
175147

176-
fx_peak_flow = fx_schedule.calcPeakFlowFromDailygpm((fx_gpd + w_gpd) * fx_frac)
177-
fx_design_level_sens = fx_schedule.calcDesignLevelFromDailykWh(UnitConversions.convert(fx_sens_btu * fx_frac, 'Btu', 'kWh') / 365.0)
178-
fx_design_level_lat = fx_schedule.calcDesignLevelFromDailykWh(UnitConversions.convert(fx_lat_btu * fx_frac, 'Btu', 'kWh') / 365.0)
148+
# Fixtures
149+
fx_name = Constants.ObjectNameFixtures
150+
fx_peak_flow = water_schedule.calcPeakFlowFromDailygpm(fx_gpd)
151+
dhw_loop_fracs.each do |sys_id, dhw_load_frac|
152+
dhw_loop = dhw_loops[sys_id]
153+
add_water_use_equipment(model, fx_name, fx_peak_flow * dhw_load_frac, water_schedule.schedule, mw_schedule, water_use_connections[dhw_loop])
154+
end
179155

180-
dhw_loop_fracs.each do |sys_id, dhw_load_frac|
181-
dhw_loop = dhw_loops[sys_id]
182-
add_water_use_equipment(model, fx_name, fx_peak_flow * dhw_load_frac, fx_schedule.schedule, mw_schedule, water_use_connections[dhw_loop])
183-
end
184-
add_other_equipment(model, fx_name_sens, living_space, fx_design_level_sens, 1.0, 0.0, fx_schedule.schedule, nil)
185-
add_other_equipment(model, fx_name_lat, living_space, fx_design_level_lat, 0.0, 1.0, fx_schedule.schedule, nil)
156+
# Distribution waste
157+
dist_water_name = Constants.ObjectNameDistributionWaste
158+
dist_water_peak_flow = water_schedule.calcPeakFlowFromDailygpm(w_gpd)
159+
dhw_loop_fracs.each do |sys_id, dhw_load_frac|
160+
dhw_loop = dhw_loops[sys_id]
161+
add_water_use_equipment(model, dist_water_name, dist_water_peak_flow * dhw_load_frac, water_schedule.schedule, mw_schedule, water_use_connections[dhw_loop])
186162
end
187163

164+
# Internal gains
165+
# Floor mopping, shower evaporation, water films on showers, tubs & sinks surfaces, plant watering, etc.
166+
water_sens_btu, water_lat_btu = get_water_gains_sens_lat(nbeds)
167+
water_design_level_sens = water_schedule.calcDesignLevelFromDailykWh(UnitConversions.convert(water_sens_btu, 'Btu', 'kWh') / 365.0)
168+
water_design_level_lat = water_schedule.calcDesignLevelFromDailykWh(UnitConversions.convert(water_lat_btu, 'Btu', 'kWh') / 365.0)
169+
add_other_equipment(model, "#{water_name} Sensible", living_space, water_design_level_sens, 1.0, 0.0, water_schedule.schedule, nil)
170+
add_other_equipment(model, "#{water_name} Latent", living_space, water_design_level_lat, 0.0, 1.0, water_schedule.schedule, nil)
171+
188172
# Recirculation pump
189173
dist_pump_annual_kwh = get_hwdist_recirc_pump_energy(dist_type, recirc_control_type, recirc_pump_power)
190174
if dist_pump_annual_kwh > 0
@@ -700,7 +684,7 @@ def self.get_fixtures_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fr
700684
return f_eff * ref_f_gpd
701685
end
702686

703-
def self.get_fixtures_gains_sens_lat(nbeds)
687+
def self.get_water_gains_sens_lat(nbeds)
704688
# Table 4.2.2(3). Internal Gains for Reference Homes
705689
sens_gains = -1227.0 - 409.0 * nbeds # Btu/day
706690
lat_gains = 1245.0 + 415.0 * nbeds # Btu/day

0 commit comments

Comments
 (0)