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

EUSS add air barrier upgrade measure #179

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions national/housing_characteristics/options_lookup.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -4655,6 +4655,7 @@ env_roof_insul_aedg roof_insul_aedg upgrade_env_roof_insul_aedg
env_secondary_windows secondary_windows upgrade_env_secondary_windows
env_window_film window_film upgrade_env_window_film
env_new_aedg_windows new_aedg_windows upgrade_env_new_aedg_windows
add_air_barrier air_barrier upgrade_add_air_barrier
light_led lighting_technology_gen4 upgrade_light_led lighting_generation=gen4_led
light_led lighting_technology_gen5 upgrade_light_led lighting_generation=gen5_led
light_led lighting_technology_gen6 upgrade_light_led lighting_generation=gen6_led
Expand Down
22 changes: 11 additions & 11 deletions resources/measures/set_nist_infiltration_correlations/measure.rb
Original file line number Diff line number Diff line change
Expand Up @@ -477,15 +477,15 @@ def run(model, runner, user_arguments)
end
else
hvac_schedule = model.getScheduleByName(hvac_schedule)
unless schedule_object.is_initialized
runner.registerError("HVAC schedule argument #{hvac_schedule} not found in the model. IT may have been removed by another measure.")
unless hvac_schedule.is_initialized
runner.registerError("HVAC schedule argument #{hvac_schedule} not found in the model. It may have been removed by another measure.")
return false
end
hvac_schedule = hvac_schedule.get
if hvac_schedule.get.to_ScheduleRuleset.is_initialized
hvac_schedule = hvac_schedule.get.to_ScheduleRuleset.get
elsif hvac_schedule.get.to_ScheduleConstant.is_initialized
hvac_schedule = hvac_schedule.get.to_ScheduleConstant.get
if hvac_schedule.to_ScheduleRuleset.is_initialized
hvac_schedule = hvac_schedule.to_ScheduleRuleset.get
elsif hvac_schedule.to_ScheduleConstant.is_initialized
hvac_schedule = hvac_schedule.to_ScheduleConstant.get
else
runner.registerError("HVAC schedule argument #{hvac_schedule} is not a Schedule Constant or Schedule Ruleset object.")
return false
Expand All @@ -498,18 +498,18 @@ def run(model, runner, user_arguments)
if hvac_schedule.nil?
runner.registerWarning('Unable to determine the HVAC schedule. Treating the building as if there is no HVAC system with outdoor air. If this is not the case, input a schedule argument, or assign one to an air loop in the model.')
on_schedule = OpenStudio::Model::ScheduleConstant.new(model)
on_schedule.setName("Infiltration HVAC On Schedule")
on_schedule.setName('Infiltration HVAC On Schedule')
on_schedule.setValue(0.0)
off_schedule = OpenStudio::Model::ScheduleConstant.new(model)
off_schedule.setName("Infiltration HVAC Off Schedule")
off_schedule.setName('Infiltration HVAC Off Schedule')
off_schedule.setValue(1.0)
elsif hvac_schedule.to_ScheduleConstant.is_initialized
hvac_schedule = hvac_schedule.to_ScheduleConstant.get
on_schedule = OpenStudio::Model::ScheduleConstant.new(model)
on_schedule.setName("Infiltration HVAC On Schedule")
on_schedule.setName('Infiltration HVAC On Schedule')
on_schedule.setValue(hvac_schedule.value)
off_schedule = OpenStudio::Model::ScheduleConstant.new(model)
off_schedule.setName("Infiltration HVAC Off Schedule")
off_schedule.setName('Infiltration HVAC Off Schedule')
if hvac_schedule.value > 0
off_schedule.setValue(0.0)
else
Expand All @@ -518,7 +518,7 @@ def run(model, runner, user_arguments)
elsif hvac_schedule.to_ScheduleRuleset.is_initialized
hvac_schedule = hvac_schedule.to_ScheduleRuleset.get
on_schedule = hvac_schedule.clone.to_ScheduleRuleset.get
on_schedule.setName("Infiltration HVAC On Schedule")
on_schedule.setName('Infiltration HVAC On Schedule')
off_schedule = invert_schedule_ruleset(hvac_schedule, 'Infiltration HVAC Off Schedule')
end

Expand Down
27 changes: 27 additions & 0 deletions resources/measures/upgrade_add_air_barrier/LICENSE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
OpenStudio(R), Copyright (c) 2008-2023, Alliance for Sustainable Energy, LLC. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted
provided that the following conditions are met:

(1) Redistributions of source code must retain the above copyright notice, this list of conditions
and the following disclaimer.

(2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the distribution.

(3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse
or promote products derived from this software without specific prior written permission from the
respective party.

(4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other
derivative works may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar
designation without specific prior written permission from Alliance for Sustainable Energy, LLC.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES GOVERNMENT,
OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 changes: 27 additions & 0 deletions resources/measures/upgrade_add_air_barrier/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@


###### (Automatically generated documentation)

# AddAirBarrier

## Description
This measure incorporates infiltration that varies with weather and HVAC operation, and takes into account building geometry (height, above-ground exterior surface area, and volume). It is based on work published by Ng et al. (2018) 'Weather correlations to calculate infiltration rates for U.S. commercial building energy models' and Ng et al. (2021) 'Evaluating potential benefits of air barriers in commercial buildings using NIST infiltration correlations in EnergyPlus'. This method of calculating infiltration was developed using eleven of the DOE commercial prototype building models (Goel et al. 2014) and TMY3 weather files for eight climate zones (CZ). Guidance on implementing the infiltration correlations are explained in the NIST technical report 'Implementing NIST Infiltration Correlations'. Ng et al. (2018) shows that when analyzing the benefits of building envelope airtightening, greater HVAC energy savings were predicted using the infiltration inputs included in this Measure compared with using the default inputs that are included in the prototype building models. Brian Polidoro (NIST) first developed this Measure in 2015 and updated it in 2018 and 2019. Matthew Dahlhausen (NREL) updated the 2019 Measure and published this current version in 2023. To provide feedback on the NIST infiltration correlations, please email [email protected] or [email protected]. For measure implementation questions or issues, contact [email protected].

## Modeler Description
This measure will remove any existing infiltration objects (OS:SpaceInfiltration:DesignFlowRate and OS:SpaceInfiltration:EffectiveLeakageArea). Every zone will then get two OS:SpaceInfiltration:DesignFlowRate objects that add infiltration using the 'Flow per Exterior Surface Area' input option, one infiltration object when the HVAC system is on and one object when the HVAC system is off. The method assumes that HVAC operation is set by a schedule, though it may not reflect actual simulation/operation when fan operation may depend on internal loads and temperature setpoints. By default, interior zones will receive no infiltration. The user may enter a design building envelope airtightness at a specific design pressure, and whether the design value represents a 4-sided, 5-sided, or 6-sided normalization. By default, the measure assumes an airtightness design value of 13.8 (m^3/h-m^2) at 75 Pa. The measure assumes that infiltration is evenly distributed across the entire building envelope, including the roof. The user may select the HVAC system operating schedule in the model, or infer it based on the availability schedule of the air loop that serves the largest amount of floor area. The measure will make a copy of the HVAC operating schedule, 'Infiltration HVAC On Schedule', which is used with the HVAC on infiltration correlations. The measure will also make an 'Infiltration HVAC Off Schedule' with inverse operation, used with the HVAC off infiltration correlations. OS:SpaceInfiltration:DesignFlowRate object coefficients (A, B, C, and D) come from Ng et al. (2018). The user may select the Building Type and Climate Zone, or the measure will infer them from the model.

## Measure Type
ModelMeasure

## Taxonomy


## Arguments




This measure does not have any user arguments



45 changes: 45 additions & 0 deletions resources/measures/upgrade_add_air_barrier/README.md.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<%#= README.md.erb is used to auto-generate README.md. %>
<%#= To manually maintain README.md throw away README.md.erb and manually edit README.md %>
###### (Automatically generated documentation)

# <%= name %>

## Description
<%= description %>

## Modeler Description
<%= modelerDescription %>

## Measure Type
<%= measureType %>

## Taxonomy
<%= taxonomy %>

## Arguments

<% arguments.each do |argument| %>
### <%= argument[:display_name] %>
<%= argument[:description] %>
**Name:** <%= argument[:name] %>,
**Type:** <%= argument[:type] %>,
**Units:** <%= argument[:units] %>,
**Required:** <%= argument[:required] %>,
**Model Dependent:** <%= argument[:model_dependent] %>
<% if argument[:type] == "Choice" && !argument[:model_dependent]%>
**Choice Display Names** <%= argument[:choice_display_names] %>
<% end %>
<% end %>

<% if arguments.size == 0 %>
<%= "This measure does not have any user arguments" %>
<% end %>

<% if outputs.size > 0 %>
## Outputs
<% output_names = [] %>
<% outputs.each do |output| %>
<% output_names << output[:display_name] %>
<% end %>
<%= output_names.join(", ") %>
<% end %>
Loading