Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add unmet water heater loads EMS program #1502

Open
wants to merge 97 commits into
base: master
Choose a base branch
from
Open

Conversation

jmaguire1
Copy link
Collaborator

@jmaguire1 jmaguire1 commented Oct 4, 2023

Pull Request Description

Add an EMS program for calculating unmet water heating loads. Focus is on unmet showers, but we can also calculate this for each end use if we wanted to. Addresses #1170.

Checklist

PR Author: Check these when they're done. Not all may apply. strikethrough and check any that do not apply.

PR Reviewer: Verify each has been completed.

  • Schematron validator (EPvalidator.xml) has been updated
  • Sample files have been added/updated (via tasks.rb)
  • Tests have been added/updated (e.g., HPXMLtoOpenStudio/tests and/or workflow/tests/hpxml_translator_test.rb)
  • Documentation has been updated
  • Changelog has been updated
  • openstudio tasks.rb update_measures has been run
  • No unexpected changes to simulation results of sample files

@jmaguire1 jmaguire1 changed the title Add unmet loads EMS program Add unmet water heater loads EMS program Oct 13, 2023
@shorowit shorowit mentioned this pull request Oct 17, 2023
12 tasks
@jmaguire1
Copy link
Collaborator Author

Right now, this method calculates:

  • Unmet shower energy (mcpdelta T when T_delivered < 105 F)
  • Unmet shower time
  • Total shower time

Unmet shower energy I feel is the most complete metric, since it accounts for how far off from the desired temperature you are. However, no one really has a sense for if say 2 kWh of unmet showers is too many, so this way you can calculate the % of shower time where loads are unmet.

We could also add metrics related to ALL hot water usage, or all fixtures. We'd want to account for the different desired delivered temperature for appliances, but it wouldn't be hard to add metrics like Unmet Energy for all fixtures.

@jmaguire1 jmaguire1 mentioned this pull request Nov 1, 2023
7 tasks
Copy link
Contributor

@shorowit shorowit left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some comments while I think of it. Addressing these comments will make it easier to pull in the master branch.

HPXMLtoOpenStudio/measure.rb Outdated Show resolved Hide resolved
HPXMLtoOpenStudio/resources/hotwater_appliances.rb Outdated Show resolved Hide resolved
@jmaguire1
Copy link
Collaborator Author

@shorowit: I just did a major refactor of this, no more duplicate code. Thanks for the suggestions. It'd be good to know if you think this is a decent way to organize things at a minimum if/when you have a chance to take a look, we're looking to use this with the 120 V HPWH relatively soon.

@shorowit shorowit added the enhancement New feature or request label Jan 13, 2024
@jmaguire1 jmaguire1 marked this pull request as ready for review September 11, 2024 18:53
@jmaguire1
Copy link
Collaborator Author

jmaguire1 commented Sep 11, 2024

One thing I did realize after trying to use this in OCHRE: without having the shower max flow rate somewhere in HPXML or an unnormalized schedule, it's hard to do the equivalent comfort calculations. I could see shower max gpm being an HPXML extension or switching to an unnormalized schedule (unnormalized is probably easier), but I think I can address this in a follow up after I get at least some of the 120V HPWH capabilities in.

Other than that, this is finally ready for review @shorowit. Thanks Joe for helping me figure out some of the more complicated multiple WH cases.

shorowit and others added 4 commits September 18, 2024 10:30
…o unmet_wh_loads

# Conflicts:
#	BuildResidentialScheduleFile/measure.xml
#	HPXMLtoOpenStudio/measure.rb
#	HPXMLtoOpenStudio/measure.xml
#	HPXMLtoOpenStudio/resources/data/unavailable_periods.csv
#	HPXMLtoOpenStudio/resources/hotwater_appliances.rb
#	workflow/tests/base_results/results_simulations_misc.csv
…o unmet_wh_loads

# Conflicts:
#	HPXMLtoOpenStudio/measure.xml
#	workflow/tests/base_results/results_simulations_misc.csv
#	workflow/tests/util.rb
Comment on lines 26 to +27
hot_water_fixtures,1,1,0,0
hot_water_showers,1,1,0,0
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently showers are a subset of fixtures, which may be confusing to a user. Should we bite the bullet and replace fixtures with sinks and baths? What are the ramifications? Probably a breaking change for outputs (e.g., hot water gallons).

HPXMLtoOpenStudio/resources/waterheater.rb Outdated Show resolved Hide resolved
Comment on lines 328 to 340
Annual Unmet Loads
~~~~~~~~~~~~~~~~~~

Annual unmet loads are listed below.

======================================== =====
Type Notes
======================================== =====
Unmet Loads: Hot Water Shower Energy (J) TODO
Unmet Loads: Hot Water Shower Time (hr) TODO
======================================== =====

TODO
Copy link
Contributor

@shorowit shorowit Sep 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What if we combine these with the above Annual Unmet Hours like so:

  • Unmet Hours: Showers (hr)
  • Unmet Hours: Showers (%)

Also document that this only accounts for a storage water heater running out of water and occupant discomfort. It does not account for temperature drop due to a distribution system or a tankless water heater's minimum firing rate. Using simple schedules (rather than detailed/stochastic schedules) may under-represent these values.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What should we report for timeseries, just Unmet Hours: Showers (hr)?

Also, seems like if we're no longer reporting unmet loads in kBtu, then we'd no longer need to use shower peak flow in the EMS program? If not, this should simplify down to just comparing Use Side temperature to Mixed temperature during shower draws.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, yes the % output would only make sense as an annual output.

Second question is for @jmaguire1.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just the hours in the timeseries makes a lot of sense.

If we drop the energy metric, and just track hours of unmet loads, then we could drop the flow rate. The original intent with including flow rate and calculating energy, rather than just hours, was that we might want to account for difference between a shower that's just below setpoint and one that's like 30F below setpoint, or a small amount of flow vs. multiple showers at the same time being below setpoint. I've been proposing energy as the more important metric for a few years now, but the problem (as we discussed) is no one has any context of what 1 kWh of unmet showers means.

All that being said: I'm OK with dropping energy and trying to just report unmet hours of showering, in which case I think it's fine to drop max flow rate from the EMS program. There's no real standard way to report this, and there's advantages to hours in terms of being more intuitive.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good @jmaguire1. I've gone ahead and pulled the peak flow stuff out of the EMS program.

tasks.rb Outdated
Comment on lines 2090 to 2091
water_heating_system.heating_capacity = 5000 if water_heating_system.water_heater_type == HPXML::WaterHeaterTypeStorage
water_heating_system.temperature = 100.0 if [HPXML::WaterHeaterTypeHeatPump, HPXML::WaterHeaterTypeTankless].include?(water_heating_system.water_heater_type)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is kind of weird, the HPWH/tankless systems are not actually undersized, they just have their setpoint artificially lowered to result in unmet showers. At least for storage/HPWH, can't we just set a small tank volume instead? Maybe we don't need all the sample files. We can probably remove the tankless one, for example.

(Also, hopefully at some point in the future, we'll allow optional capacity inputs for HPWHs and tankless systems.)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried instead reducing tank volume (e.g., to 1 gal). Water Heater Use Side Outlet Temperature doesn't appear to drop (even when using stochastic schedules).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any idea, @jmaguire1?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Definitely a little surprised, but I know we do have some code that scale the max flow rate to ensure that you never draw out more than the whole tank volume in an hour

storage_tank.setUseSideDesignFlowRate(UnitConversions.convert(storage_volume, 'gal', 'm^3') / 60.1) # Sized to ensure that E+ never autosizes the design flow rate to be larger than the tank volume getting drawn out in a hour (60 minutes)

I think this means the water heater might be reducing the flow rate through it with stochastic schedules if you try to specify like 2 gal/min, the WH might only see lower flow rate. E+ will throw an error if you have a flow rate on the use side larger than the tank volume/hour, so we do need this code. If reducing the tank volume and heater capacity doesn't give you unmet loads, I'm not sure that there's a better way to do this without reducing the setpoint.

Copy link
Collaborator

@joseph-robertson joseph-robertson Oct 2, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, I'm definitely confused here. The code you are referencing above is in the apply_solar_thermal method. Looks like storage_tank.setUseSideDesignFlowRate(UnitConversions.convert(storage_volume, 'gal', 'm^3') / 60.1) is used only for stratified tanks, not mixed. I'm seeing that use side outlet temperature doesn't drop for an HPXML file with storage water heater (i.e., mixed w/autosized use side design flow rate).

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here is 40 gal vs 1 gal:
image

@@ -34,6 +34,7 @@ __New Features__
- **Breaking change**: Disaggregates "Walls" into "Above Grade Walls" and "Below Grade Walls" in results_design_load_details.csv output file.
- Updates `openei_rates.zip` with the latest residential utility rates from the [OpenEI U.S. Utility Rate database](https://apps.openei.org/USURDB/).
- Adds a warning if the sum of supply/return duct leakage to outside values is very high.
- Adds metrics for unmet hot water loads.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need a better description.

@joseph-robertson joseph-robertson self-assigned this Oct 1, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request priority low
Projects
Status: In progress
Development

Successfully merging this pull request may close these issues.

3 participants