diff --git a/.github/release.yml b/.github/release.yml
new file mode 100644
index 00000000..b469f6fb
--- /dev/null
+++ b/.github/release.yml
@@ -0,0 +1,24 @@
+# https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes#configuration-options
+
+changelog:
+ exclude:
+ labels:
+ - ignore-for-release
+ - DO NOT MERGE
+ - invalid
+ - dependencies
+ - tests
+ authors:
+ - octocat
+ - dependabot
+ categories:
+ - title: Breaking Changes đź›
+ labels:
+ - breaking-change
+ - title: Exciting New Features 🎉
+ labels:
+ - enhancement
+ - Feature
+ - title: Other Changes
+ labels:
+ - "*"
diff --git a/.github/workflows/nightly_ci_build.yml b/.github/workflows/nightly_ci_build.yml
index ac8d39e1..e16a89f0 100644
--- a/.github/workflows/nightly_ci_build.yml
+++ b/.github/workflows/nightly_ci_build.yml
@@ -1,11 +1,14 @@
-name: nightly_build
+name: CLI CI
on:
+ # Run on weeknights, and also whenever a push is made
push:
- # schedule:
- # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
- # 5:24 am UTC (11:24pm MDT the day before) every weekday night in MDT
- # - cron: '24 5 * * 2-6'
+ schedule:
+ # # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
+ # # 5:24 am UTC (11:24pm MDT the day before) every weekday night in MDT
+ - cron: '24 5 * * 2-6'
+ # pull_request:
+ # types: [review_requested]
env:
# Favor_Local_Gems enforces develop branch of all Ruby dependencies
@@ -13,23 +16,29 @@ env:
# If CI is then successful, we have a breaking change in a dependency somewhere.
FAVOR_LOCAL_GEMS: true
GEM_DEVELOPER_KEY: ${{ secrets.GEM_DEVELOPER_KEY }}
- UO_NUM_PARALLEL: 2
- # GHA machines only have 2 cores. Trying to run more than that is even slower.
- # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources
-
+ UO_NUM_PARALLEL: 4
+ # GHA machines have 4 cores. Trying to run more concurrently will slow everything down.
+ # https://github.blog/2024-01-17-github-hosted-runners-double-the-power-for-open-source/
jobs:
weeknight-tests:
- # ubuntu-latest works since https://github.com/rbenv/ruby-build/releases/tag/v20220710 (July 10, 2022)
- # https://github.com/rbenv/ruby-build/discussions/1940
+ strategy:
+ matrix:
+ # os: container operations in GHA only work on Ubuntu
+ simulation-type: [basic, GEB, residential, electric]
+ # python-version: No need to test more than 1 python-version
runs-on: ubuntu-latest
container:
- image: docker://nrel/openstudio:3.6.1
+ image: docker://nrel/openstudio:3.7.0
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
+ - name: Change Owner of Container Working Directory
+ # working dir permissions workaround from https://github.com/actions/runner-images/issues/6775#issuecomment-1377299658
+ run: chown root:root .
- name: Set up Python
- uses: actions/setup-python@v4
+ if: ${{ matrix.simulation-type == 'electric' }}
+ uses: actions/setup-python@v5
with:
- # Disco needs python 3.10
+ # Disco needs python ~=3.10
python-version: '3.10'
- name: Install Ruby dependencies
run: |
@@ -37,25 +46,26 @@ jobs:
bundle update
bundle exec certified-update
- name: Install python dependencies
- run: bundle exec uo install_python
- - name: Run Rspec
- continue-on-error: true
- # Continue to upload step even if a test fails, so we can troubleshoot
- run: bundle exec rspec
+ if: ${{ matrix.simulation-type == 'electric' || matrix.simulation-type == 'basic' }}
+ run: bundle exec rspec -e 'Install python dependencies'
+ - name: Test project setup
+ # We only need to run these tests once, not every matrix iteration.
+ if: ${{ matrix.simulation-type == 'basic' }}
+ run: |
+ bundle exec rspec -e 'Admin'
+ bundle exec rspec -e 'Create project'
+ bundle exec rspec -e 'Make and manipulate ScenarioFiles'
+ bundle exec rspec -e 'Update project directory'
+ - name: Test simulations
+ run: bundle exec rspec -e 'Run and work with a small ${{ matrix.simulation-type }} simulation'
- name: Upload artifacts
# Save results for examination - useful for debugging
uses: actions/upload-artifact@v3
- # Only upload if rspec fails
+ # Using v4 would mean we have to change our path design, and/or the test dir names
+ # Only upload if a previous step fails
if: failure()
with:
name: rspec_results
path: |
- spec/test_directory**/run/
- # coverage/
+ spec/test_directory**/
retention-days: 7 # save for 1 week before deleting
- # coveralls action docs: https://github.com/marketplace/actions/coveralls-github-action
- # - name: Coveralls
- # uses: coverallsapp/github-action@1.1.3
- # with:
- # github-token: ${{ secrets.GITHUB_TOKEN }}
- # path-to-lcov: "./coverage/lcov/urbanopt-cli.lcov"
diff --git a/.gitignore b/.gitignore
index cd37d71b..8e1cd488 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,3 +29,4 @@ Gemfile.lock
example_files/python_deps/Miniconda*
example_files/python_deps/python_config.json
example_files/python_deps/python
+example_files/python_deps/python-3.10
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c237aa83..0eedee79 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,22 @@
# Changelog
+## Version 0.11.0
+Date Range: 07/20/23 - 01/26/24
+
+### Exciting New Features 🎉
+* error handling for non-US weatherfiles by @vtnate in https://github.com/urbanopt/urbanopt-cli/pull/443
+* Ground Heat Exchanger Workflow by @tanushree04 in https://github.com/urbanopt/urbanopt-cli/pull/426
+* Initial implementation of geometry orientation and aspect ratio by @rawadelkontar in https://github.com/urbanopt/urbanopt-cli/pull/444
+### Other Changes
+* Update installer 0.10.0 by @tijcolem in https://github.com/urbanopt/urbanopt-cli/pull/433
+* Remove jenkins by @vtnate in https://github.com/urbanopt/urbanopt-cli/pull/432
+* Coverage badges by @vtnate in https://github.com/urbanopt/urbanopt-cli/pull/434
+* Update README.md by @vtnate in https://github.com/urbanopt/urbanopt-cli/pull/435
+* Categorize tests to parallelize CI by @vtnate in https://github.com/urbanopt/urbanopt-cli/pull/442
+* use unsecured http as default rubygems source in project_dir by @vtnate in https://github.com/urbanopt/urbanopt-cli/pull/445
+
+**Full Changelog**: https://github.com/urbanopt/urbanopt-cli/compare/v0.10.0...v0.11.0
+
## Version 0.10.0
Date Range: 06/14/22 - 7/20/23
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2df89e13..4a2e3e68 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.10.2)
cmake_policy(SET CMP0048 NEW)
-project(URBANoptCLI VERSION 0.9.3)
+project(URBANoptCLI VERSION 0.10.0)
include(FindOpenStudioSDK.cmake)
@@ -89,16 +89,16 @@ option(BUILD_PACKAGE "Build package" OFF)
# need to update the MD5sum for each platform and url below
if(UNIX)
if(APPLE)
- set(URBANOPT_CLI_GEMS_ZIP_FILENAME "urbanopt-cli-gems-20230616-darwin.tar.gz")
- set(URBANOPT_CLI_GEMS_ZIP_EXPECTED_MD5 "0e1a97892eec849f469afd1a8f115321")
+ set(URBANOPT_CLI_GEMS_ZIP_FILENAME "urbanopt-cli-gems-20230731-darwin.tar.gz")
+ set(URBANOPT_CLI_GEMS_ZIP_EXPECTED_MD5 "6dcaeb17c6567d5e5242c470b0ff2eb0")
else()
- set(URBANOPT_CLI_GEMS_ZIP_FILENAME "urbanopt-cli-gems-20230616-linux.tar.gz")
- set(URBANOPT_CLI_GEMS_ZIP_EXPECTED_MD5 "8d0ca0d83c184a4b4a9c389ca79ffe8b")
+ set(URBANOPT_CLI_GEMS_ZIP_FILENAME "urbanopt-cli-gems-20230731-linux.tar.gz")
+ set(URBANOPT_CLI_GEMS_ZIP_EXPECTED_MD5 "ff67d59a162288cb7e5d4632e970e53d")
endif()
elseif(WIN32)
if(CMAKE_CL_64)
- set(URBANOPT_CLI_GEMS_ZIP_FILENAME "urbanopt-cli-gems-20230616-windows.tar.gz")
- set(URBANOPT_CLI_GEMS_ZIP_EXPECTED_MD5 "97ec22034dd6585a6356c01ba7a66c29")
+ set(URBANOPT_CLI_GEMS_ZIP_FILENAME "urbanopt-cli-gems-20230801-windows.tar.gz")
+ set(URBANOPT_CLI_GEMS_ZIP_EXPECTED_MD5 "2293f9f07643d110a84afaa0c1049c03")
endif()
endif()
diff --git a/FindOpenStudioSDK.cmake b/FindOpenStudioSDK.cmake
index 802306d9..6a82a4ef 100644
--- a/FindOpenStudioSDK.cmake
+++ b/FindOpenStudioSDK.cmake
@@ -1,5 +1,5 @@
set(OPENSTUDIO_VERSION_MAJOR 3)
-set(OPENSTUDIO_VERSION_MINOR 5)
+set(OPENSTUDIO_VERSION_MINOR 6)
set(OPENSTUDIO_VERSION_PATCH 1)
set(OPENSTUDIO_VERSION "${OPENSTUDIO_VERSION_MAJOR}.${OPENSTUDIO_VERSION_MINOR}.${OPENSTUDIO_VERSION_PATCH}")
@@ -16,23 +16,23 @@ else()
set(OPENSTUDIO_BASELINK "https://openstudio-builds.s3.amazonaws.com/${OPENSTUDIO_VERSION}"
CACHE STRING "Base link to where the openstudio archives are hosted" FORCE)
- set(OPENSTUDIO_VERSION_SHA "+22e1db7be5")
+ set(OPENSTUDIO_VERSION_SHA "+bb9481519e")
if(APPLE)
- set(OPENSTUDIO_EXPECTED_HASH f21b03a44aa9ac3e52a4bdfa20009171)
+ set(OPENSTUDIO_EXPECTED_HASH ba881908f683ec695c209399f261b299)
set(OPENSTUDIO_PLATFORM "Darwin-x86_64")
set(OPENSTUDIO_EXT "tar.gz")
elseif(UNIX)
if(LSB_RELEASE_VERSION_SHORT MATCHES "20.04")
- set(OPENSTUDIO_EXPECTED_HASH 6e5c93002f0cfb445dcdcdb1270261a4)
- set(OPENSTUDIO_PLATFORM "Ubuntu-20.04")
+ set(OPENSTUDIO_EXPECTED_HASH 5e67958249d99f96149b4d5576c3d0ef)
+ set(OPENSTUDIO_PLATFORM "Ubuntu-20.04-x86_64")
else() # Assumes 20.04
- set(OPENSTUDIO_EXPECTED_HASH 6e5c93002f0cfb445dcdcdb1270261a4)
- set(OPENSTUDIO_PLATFORM "Ubuntu-20.04")
+ set(OPENSTUDIO_EXPECTED_HASH 5e67958249d99f96149b4d5576c3d0ef)
+ set(OPENSTUDIO_PLATFORM "Ubuntu-20.04-x86_64")
endif()
set(OPENSTUDIO_EXT "tar.gz")
elseif(WIN32)
- set(OPENSTUDIO_EXPECTED_HASH bc83efcb140d20f8f9758559a58c4347)
+ set(OPENSTUDIO_EXPECTED_HASH 802f8cffeac24f011e636baf1e6ffd40)
set(OPENSTUDIO_PLATFORM "Windows")
set(OPENSTUDIO_EXT "tar.gz")
endif()
diff --git a/Jenkinsfile b/Jenkinsfile
deleted file mode 100644
index babb259d..00000000
--- a/Jenkinsfile
+++ /dev/null
@@ -1,10 +0,0 @@
-//Jenkins pipelines are stored in shared libaries. Please see: https://github.com/tijcolem/nrel_cbci_jenkins_libs
-
-@Library('cbci_shared_libs') _
-
-// Build for PR to develop branch only.
-if ((env.CHANGE_ID) && (env.CHANGE_TARGET) ) { // check if set
-
- urbanopt_cli()
-
-}
diff --git a/LICENSE.md b/LICENSE.md
index 5962a8b8..b8379cac 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,42 +1,15 @@
-URBANopt (tm), Copyright (c) 2019-2023, Alliance for Sustainable Energy, LLC, and other
-contributors. All rights reserved.
+URBANopt (tm), Copyright (c) 2019-2024, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-Redistributions of source code must retain the above copyright notice, this list
-of conditions and the following disclaimer.
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-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.
+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.
-Neither the name of the copyright holder nor the names of its contributors may be
-used to endorse or promote products derived from this software without specific
-prior written permission.
+Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-Redistribution of this software, without modification, must refer to the software
-by the same designation. Redistribution of a modified version of this software
-(i) may not refer to the modified version by the same designation, or by any
-confusingly similar designation, and (ii) must refer to the underlying software
-originally provided by Alliance as "URBANopt". Except to comply with the foregoing,
-the term "URBANopt", or any confusingly similar designation may not be used to
-refer to any modified version of this software or any modified version of the
-underlying software originally provided by Alliance without the prior written
-consent of Alliance.
+Redistribution of this software, without modification, must refer to the software by the same designation. Redistribution of a modified version of this software (i) may not refer to the modified version by the same designation, or by any confusingly similar designation, and (ii) must refer to the underlying software originally provided by Alliance as “URBANopt”. Except to comply with the foregoing, the term “URBANopt”, or any confusingly similar designation may not be used to refer to any modified version of this software or any modified version of the underlying software originally provided by Alliance without the prior written consent of Alliance.
-The name of the copyright holder(s), any contributors, the United States Government,
-the United States Department of Energy, or any of their employees may not be used to
-endorse or promote products derived from this software without specific prior written
-permission from the respective party.
+The name of the copyright holder(s), any contributors, the United States Government, the United States Department of Energy, or any of their employees may not be used to endorse or promote products derived from this software without specific prior written permission from the respective party.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY 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(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED STATES
-DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, 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.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY 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(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, 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.
diff --git a/README.md b/README.md
index 27ea4499..7cc81ff4 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,18 @@
-[![Coverage Status](https://coveralls.io/repos/github/urbanopt/urbanopt-cli/badge.svg?branch=develop)](https://coveralls.io/github/urbanopt/urbanopt-cli?branch=develop)
-[![nightly_build](https://github.com/urbanopt/urbanopt-cli/actions/workflows/nightly_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-cli/actions/workflows/nightly_build.yml)
+[![CLI build status](https://github.com/urbanopt/urbanopt-cli/actions/workflows/nightly_ci_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-cli/actions/workflows/nightly_ci_build.yml)
+[![Core-gem](https://github.com/urbanopt/urbanopt-core-gem/actions/workflows/nightly_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-core-gem/actions/workflows/nightly_build.yml)
+[![Coverage Status](https://coveralls.io/repos/github/urbanopt/urbanopt-core-gem/badge.svg?branch=develop)](https://coveralls.io/github/urbanopt/urbanopt-core-gem?branch=develop)
+[![Geojson-gem](https://github.com/urbanopt/urbanopt-geojson-gem/actions/workflows/nightly_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-geojson-gem/actions/workflows/nightly_build.yml)
+[![Coverage Status](https://coveralls.io/repos/github/urbanopt/urbanopt-geojson-gem/badge.svg?branch=develop)](https://coveralls.io/github/urbanopt/urbanopt-geojson-gem?branch=develop)
+[![Reopt-gem](https://github.com/urbanopt/urbanopt-reopt-gem/actions/workflows/nightly_ci_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-reopt-gem/actions/workflows/nightly_ci_build.yml)
+[![Coverage Status](https://coveralls.io/repos/github/urbanopt/urbanopt-reopt-gem/badge.svg?branch=develop)](https://coveralls.io/github/urbanopt/urbanopt-reopt-gem?branch=develop)
+[![Reporting-gem](https://github.com/urbanopt/urbanopt-reporting-gem/actions/workflows/nightly_ci_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-reporting-gem/actions/workflows/nightly_ci_build.yml)
+[![Coverage Status](https://coveralls.io/repos/github/urbanopt/urbanopt-reporting-gem/badge.svg?branch=develop)](https://coveralls.io/github/urbanopt/urbanopt-reporting-gem?branch=develop)
+[![RNM-gem](https://github.com/urbanopt/urbanopt-rnm-us-gem/actions/workflows/nightly_ci_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-rnm-us-gem/actions/workflows/nightly_ci_build.yml)
+[![Coverage Status](https://coveralls.io/repos/github/urbanopt/urbanopt-rnm-us-gem/badge.svg?branch=develop)](https://coveralls.io/github/urbanopt/urbanopt-rnm-us-gem?branch=develop)
+[![Scenario-gem](https://github.com/urbanopt/urbanopt-scenario-gem/actions/workflows/nightly_ci_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-scenario-gem/actions/workflows/nightly_ci_build.yml)
+[![Coverage Status](https://coveralls.io/repos/github/urbanopt/urbanopt-scenario-gem/badge.svg?branch=develop)](https://coveralls.io/github/urbanopt/urbanopt-scenario-gem?branch=develop)
+[![Example-project CI](https://github.com/urbanopt/urbanopt-example-geojson-project/actions/workflows/weekly_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-example-geojson-project/actions/workflows/weekly_build.yml)
+[![Coverage Status](https://coveralls.io/repos/github/urbanopt/urbanopt-example-geojson-project/badge.svg?branch=develop)](https://coveralls.io/github/urbanopt/urbanopt-example-geojson-project?branch=develop)
# URBANopt CLI
@@ -7,7 +20,7 @@ This is the command line interface (CLI) for the URBANopt™ SDK.
## Installation (Using Ruby)
-Using ruby add this line to your application's Gemfile:
+Add this line to your application's Gemfile:
```ruby
gem 'urbanopt-cli'
@@ -28,7 +41,7 @@ gem install urbanopt-cli
## Installation (Using Installer)
-The UrbanOpt installer is an alternate way to install the UrbanOpt CLI that also includes Ruby 2.5.x and OpenStudio SDK.
+The UrbanOpt installer is an alternate way to install the UrbanOpt CLI that also includes Ruby 2.7.2 and the OpenStudio SDK.
Below are installation instructions for each platform.
### Linux (Ubuntu 18.04)
@@ -65,7 +78,7 @@ The `setup-env.sh` generates env variables and stores them in a file `.env_uo.sh
. ~/.env_uo.sh
```
-When launching new shell terminals run `. ~/.env_uo.s` to setup the environment.Â
+When launching new shell terminals run `. ~/.env_uo.sh` to setup the environment.Â
### Windows (64-bit Windows 7 – 10)
@@ -155,7 +168,7 @@ Post-process simulations for a full scenario:
uo process -- --scenario --feature
```
-- Valid `TYPE`s are: `default`, `opendss`, `reopt-scenario`, `reopt-feature`
+- Valid `TYPE`s are: `default`, `opendss`, `reopt-scenario`, `reopt-feature`, `reopt-resilience`, `disco`
Delete a scenario you have already run:
@@ -173,10 +186,12 @@ uo --version
Python dependencies are currently versioned as follows:
-| Python Package | Version |
-| ----------- | ----------- |
-| urbanopt-ditto-reader | 0.4.0 |
-| NREL-disco | 0.3.4 from https://github.com/NREL/disco.git |
+| Python Package | Version |
+| --------------------------- | ------- |
+| urbanopt-ditto-reader | 0.6.3 |
+| NREL-disco | 0.5.0 |
+| geojson-modelica-translator | 0.6.0 |
+| ThermalNetwork | 0.2.3 |
## Development
diff --git a/example_files/Gemfile b/example_files/Gemfile
index 0e28fd37..93e63e65 100644
--- a/example_files/Gemfile
+++ b/example_files/Gemfile
@@ -1,4 +1,4 @@
-source 'https://rubygems.org'
+source 'http://rubygems.org'
ruby '~> 2.7.0'
@@ -35,7 +35,7 @@ if allow_local && File.exist?('../openstudio-common-measures-gem')
elsif allow_local
gem 'openstudio-common-measures', github: 'NREL/openstudio-common-measures-gem', branch: 'develop'
else
- gem 'openstudio-common-measures', '~> 0.8.0'
+ gem 'openstudio-common-measures', '~> 0.9.0'
end
if allow_local && File.exist?('../openstudio-model-articulation-gem')
@@ -43,7 +43,7 @@ if allow_local && File.exist?('../openstudio-model-articulation-gem')
elsif allow_local
gem 'openstudio-model-articulation', github: 'NREL/openstudio-model-articulation-gem', branch: 'develop'
else
- gem 'openstudio-model-articulation', '~> 0.8.0'
+ gem 'openstudio-model-articulation', '~> 0.9.0'
end
if allow_local && File.exist?('../openstudio-load-flexibility-measures-gem')
@@ -51,7 +51,7 @@ if allow_local && File.exist?('../openstudio-load-flexibility-measures-gem')
elsif allow_local
gem 'openstudio-load-flexibility-measures', github: 'NREL/openstudio-load-flexibility-measures-gem', branch: 'develop'
else
- gem 'openstudio-load-flexibility-measures', '~> 0.7.0'
+ gem 'openstudio-load-flexibility-measures', '~> 0.8.0'
end
if allow_local && File.exist?('../openstudio-ee-gem')
@@ -59,7 +59,7 @@ if allow_local && File.exist?('../openstudio-ee-gem')
elsif allow_local
gem 'openstudio-ee', github: 'NREL/openstudio-ee-gem', branch: 'develop'
else
- gem 'openstudio-ee', '~> 0.8.0'
+ gem 'openstudio-ee', '~> 0.9.0'
end
if allow_local && File.exist?('../openstudio-calibration-gem')
@@ -67,7 +67,7 @@ if allow_local && File.exist?('../openstudio-calibration-gem')
elsif allow_local
gem 'openstudio-calibration', github: 'NREL/openstudio-calibration-gem', branch: 'develop'
else
- gem 'openstudio-calibration', '~> 0.8.0'
+ gem 'openstudio-calibration', '~> 0.9.0'
end
if allow_local && File.exist?('../../openstudio-geb')
@@ -75,7 +75,7 @@ if allow_local && File.exist?('../../openstudio-geb')
elsif allow_local
gem 'openstudio-geb', github: 'LBNL-ETA/openstudio-geb-gem', branch: 'master'
else
- gem 'openstudio-geb', '~> 0.3.2'
+ gem 'openstudio-geb', '~> 0.4.0'
end
if allow_local && File.exists?('../urbanopt-geojson-gem')
@@ -83,7 +83,7 @@ if allow_local && File.exists?('../urbanopt-geojson-gem')
elsif allow_local
gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'develop'
else
- gem 'urbanopt-geojson', '~> 0.10.0'
+ gem 'urbanopt-geojson', '~> 0.11.1'
end
# NEVER put SCENARIO-GEM in this file...it will make all simulations fail due to the sqlite dependency
@@ -94,5 +94,5 @@ if allow_local && File.exist?('../urbanopt-reporting-gem')
elsif allow_local
gem 'urbanopt-reporting', github: 'URBANopt/urbanopt-reporting-gem', branch: 'develop'
else
- gem 'urbanopt-reporting', '~> 0.8.0'
+ gem 'urbanopt-reporting', '~> 0.9.1'
end
diff --git a/example_files/base_workflow_res.osw b/example_files/base_workflow_res.osw
deleted file mode 100644
index cd096187..00000000
--- a/example_files/base_workflow_res.osw
+++ /dev/null
@@ -1,276 +0,0 @@
-{
- "seed_file": null,
- "weather_file": null,
- "measure_paths": [],
- "file_paths": [],
- "run_directory": null,
- "steps": [
- {
- "measure_dir_name": "BuildResidentialModel",
- "arguments": {
- "__SKIP__": true
- }
- },{
- "measure_dir_name": "set_run_period",
- "arguments": {
- "__SKIP__": true,
- "timesteps_per_hour": 4,
- "begin_date": "2019-06-01",
- "end_date": "2019-09-30"
- }
- },{
- "measure_dir_name": "ChangeBuildingLocation",
- "arguments": {
- "__SKIP__": true,
- "weather_file_name": "USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw",
- "climate_zone": "ASHRAE 169-2013-6A"
- }
- },{
- "measure_dir_name": "create_bar_from_building_type_ratios",
- "arguments": {
- "__SKIP__": true,
- "bldg_type_a": null,
- "bldg_type_a_num_units": 0,
- "bldg_type_b": "SmallOffice",
- "bldg_type_b_fract_bldg_area": 0,
- "bldg_type_b_num_units": 0,
- "bldg_type_c": "SmallOffice",
- "bldg_type_c_fract_bldg_area": 0,
- "bldg_type_c_num_units": 0,
- "bldg_type_d": "SmallOffice",
- "bldg_type_d_fract_bldg_area": 0,
- "bldg_type_d_num_units": 0,
- "single_floor_area": null,
- "floor_height": 0,
- "num_stories_above_grade": null,
- "num_stories_below_grade": null,
- "building_rotation": 0,
- "template": "90.1-2004",
- "ns_to_ew_ratio": 0,
- "wwr": 0,
- "party_wall_fraction": 0,
- "story_multiplier": "None",
- "bar_division_method": "Multiple Space Types - Individual Stories Sliced"
- }
- },{
- "name": "create_typical_building_from_model 1",
- "measure_dir_name": "create_typical_building_from_model",
- "arguments": {
- "__SKIP__": true,
- "add_hvac": false,
- "add_refrigeration": false
- }
- },{
- "measure_dir_name": "blended_space_type_from_model",
- "arguments": {
- "__SKIP__": true,
- "blend_method": "Building Story"
- }
- },{
- "measure_dir_name": "add_ev_load",
- "arguments": {
- "__SKIP__": true,
- "chg_station_type": "Typical Public",
- "delay_type": "Min Delay",
- "charge_behavior": "Business as Usual",
- "ev_use_model_occupancy": false,
- "ev_percent": 100
- }
- },{
- "measure_dir_name": "add_ems_to_control_ev_charging",
- "arguments": {
- "__SKIP__": true,
- "curtailment_frac": 0.5
- }
- },{
- "measure_dir_name": "urban_geometry_creation_zoning",
- "arguments": {
- "__SKIP__": true,
- "geojson_file": "exportGeo.json",
- "feature_id": "5",
- "surrounding_buildings": "None"
- }
- },{
- "name": "create_typical_building_from_model 2",
- "measure_dir_name": "create_typical_building_from_model",
- "arguments": {
- "__SKIP__": true,
- "template": "90.1-2004",
- "add_constructions": false,
- "add_space_type_loads": false,
- "add_elevators": false,
- "add_exterior_lights": false,
- "add_exhaust": false,
- "add_swh": false,
- "add_refrigeration": false,
- "remove_objects": false,
- "system_type": "Inferred",
- "add_hvac": true,
- "use_upstream_args": false
- }
- },{
- "measure_dir_name": "add_chilled_water_storage_tank",
- "arguments": {
- "__SKIP__": true,
- "objective": "Partial Storage",
- "primary_loop_sp": 6.7,
- "secondary_loop_sp": 6.7,
- "primary_delta_t": "Use Existing Loop Value",
- "discharge_start": "08:00",
- "discharge_end": "21:00",
- "charge_start": "23:00",
- "charge_end": "07:00",
- "run_output_path": "."
- }
- },{
- "measure_dir_name": "add_ems_emissions_reporting",
- "arguments": {
- "__SKIP__": true,
- "future_subregion": "RMPAc",
- "hourly_historical_subregion": "Rocky Mountains",
- "annual_historical_subregion": "RMPA",
- "future_year": 2020,
- "hourly_historical_year": 2019,
- "annual_historical_year": 2019
- }
- },{
- "measure_dir_name":"PredictedMeanVote",
- "arguments":{
- "__SKIP__": true,
- "comfortWarnings":true,
- "workEfficiencySchedule":"Work Efficiency Schedule",
- "clothingSchedule":"Clothing Schedule",
- "airVelocitySchedule":"Air Velocity Schedule"
- }
- },{
- "measure_dir_name": "reduce_epd_by_percentage_for_peak_hours",
- "arguments": {
- "__SKIP__": true,
- "epd_reduce_percent": 50,
- "start_time": "17:00:00",
- "end_time": "21:00:00",
- "start_date1": "07-01",
- "end_date1": "08-31"
- }
- },
- {
- "measure_dir_name": "AdjustThermostatSetpointsByDegreesForPeakHours",
- "arguments": {
- "__SKIP__": true,
- "cooling_adjustment": 2,
- "cooling_daily_starttime": "16:01:00",
- "cooling_daily_endtime": "20:00:00",
- "cooling_startdate": "06-01",
- "cooling_enddate": "09-30",
- "heating_adjustment": 2,
- "heating_daily_starttime": "16:01:00",
- "heating_daily_endtime": "20:00:00",
- "heating_startdate_1": "01-01",
- "heating_enddate_1": "05-31",
- "heating_startdate_2": "10-01",
- "heating_enddate_2": "12-31"
- }
- },{
- "measure_dir_name": "IncreaseInsulationRValueForExteriorWalls",
- "arguments": {
- "__SKIP__": true,
- "r_value": 10
- }
- },{
- "measure_dir_name": "ReduceElectricEquipmentLoadsByPercentage",
- "arguments": {
- "__SKIP__": true,
- "elecequip_power_reduction_percent": 20
- }
- },{
- "measure_dir_name": "ReduceLightingLoadsByPercentage",
- "arguments": {
- "__SKIP__": true,
- "lighting_power_reduction_percent": 30
- }
- },{
- "measure_dir_name": "add_central_ice_storage",
- "arguments": {
- "__SKIP__": true,
- "chiller_resize_factor": 0.8,
- "discharge_start": "08:00",
- "discharge_end": "20:00",
- "charge_start": "23:00",
- "inter_sp": 46
- }
- },{
- "measure_dir_name":"add_hpwh",
- "arguments":{
- "__SKIP__":true
- }
- },{
- "measure_dir_name": "add_packaged_ice_storage",
- "arguments": {
- "__SKIP__": true,
- "size_mult": "0.75",
- "charge_start": "23:00"
- }
- },
- {
- "measure_dir_name":"export_time_series_modelica",
- "arguments":{
- "__SKIP__":false
- }
- },{
- "measure_dir_name":"export_modelica_loads",
- "arguments":{
- "__SKIP__":false
- }
- },
- {
- "measure_dir_name": "envelope_and_internal_load_breakdown",
- "arguments": {
- "__SKIP__": true
- }
- },
- {
- "measure_dir_name": "generic_qaqc",
- "arguments": {
- "template": "90.1-2004",
- "check_eui_reasonableness": true,
- "check_eui_reasonableness_tol": 0.25,
- "check_eui_by_end_use": true,
- "check_eui_by_end_use_tol": 0.25,
- "check_mech_sys_part_load_eff": true,
- "check_mech_sys_part_load_eff_tol": 0.25,
- "check_mech_sys_capacity": false,
- "check_simultaneous_heating_and_cooling": true,
- "check_simultaneous_heating_and_cooling_max_tol": 0.25,
- "check_internal_loads": true,
- "check_internal_loads_tol": 0.25,
- "check_schedules": true,
- "check_schedules_tol": 0.25,
- "check_envelope_conductance": true,
- "check_envelope_conductance_tol": 0.25,
- "check_domestic_hot_water": true,
- "check_domestic_hot_water_tol": 0.50,
- "check_mech_sys_efficiency": true,
- "check_mech_sys_efficiency_tol": 0.25,
- "check_mech_sys_type": false,
- "check_supply_air_and_thermostat_temp_difference": true,
- "check_supply_air_and_thermostat_temp_difference_tol": 4.0,
- "__SKIP__": true
- }
- },{
- "measure_dir_name": "default_feature_reports",
- "arguments": {
- "feature_id": null,
- "feature_name": null,
- "feature_type": null,
- "feature_location": null
- }
- },{
- "measure_dir_name": "openstudio_results",
- "arguments": {
- "__SKIP__": true
- }
- }
- ],
- "name": null,
- "description": null
-}
diff --git a/example_files/example_project_combined.json b/example_files/example_project_combined.json
index 88e4e6c6..18164187 100644
--- a/example_files/example_project_combined.json
+++ b/example_files/example_project_combined.json
@@ -650,7 +650,10 @@
"system_type": "Residential - furnace and central air conditioner",
"heating_system_fuel_type": "natural gas",
"onsite_parking_fraction": 1,
- "template": "Residential IECC 2015 - Customizable Template Sep 2020"
+ "template": "Residential IECC 2015 - Customizable Template Sep 2020",
+ "geometry_unit_orientation": 90.0,
+ "geometry_unit_aspect_ratio" : 1.0
+
},
"geometry": {
"type": "Polygon",
@@ -793,6 +796,7 @@
"number_of_stories": 2,
"number_of_stories_above_ground": 2,
"foundation_type": "slab",
+ "number_of_residential_units": 4,
"hpxml_directory": "17"
},
"geometry": {
@@ -879,4 +883,4 @@
"name": "New Scenario"
}
]
-}
\ No newline at end of file
+}
diff --git a/example_files/example_project_with_ghe.json b/example_files/example_project_with_ghe.json
new file mode 100644
index 00000000..4e6aa53a
--- /dev/null
+++ b/example_files/example_project_with_ghe.json
@@ -0,0 +1,859 @@
+{
+ "type": "FeatureCollection",
+ "project": {
+ "id": "7c33a001-bccb-413e-ac87-67558b5d4b07",
+ "name": "New Project",
+ "surface_elevation": null,
+ "import_surrounding_buildings_as_shading": null,
+ "weather_filename": "USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw",
+ "tariff_filename": null,
+ "climate_zone": "6A",
+ "cec_climate_zone": null,
+ "begin_date": "2017-01-01T07:00:00.000Z",
+ "end_date": "2017-12-31T07:00:00.000Z",
+ "timesteps_per_hour": 1,
+ "default_template": "90.1-2013"
+ },
+ "features": [
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "53340c2c-ab20-40db-aba1-11ac607c52a7",
+ "name": "Site Origin",
+ "type": "Site Origin",
+ "begin_date": "2017-01-01T07:00:00.000Z",
+ "end_date": "2017-12-31T07:00:00.000Z",
+ "cec_climate_zone": null,
+ "climate_zone": "6A",
+ "default_template": "90.1-2013",
+ "import_surrounding_buildings_as_shading": null,
+ "surface_elevation": null,
+ "tariff_filename": null,
+ "timesteps_per_hour": 1,
+ "weather_filename": "USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw"
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [
+ -78.84948467732347,
+ 42.81677154451123
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "1",
+ "name": "Mixed_use 1",
+ "type": "Building",
+ "building_type": "Mixed use",
+ "floor_area": 752184,
+ "footprint_area": 188046,
+ "number_of_stories": 4,
+ "mixed_type_1": "Office",
+ "mixed_type_1_percentage": 50,
+ "mixed_type_2": "Food service",
+ "mixed_type_2_percentage": 50,
+ "mixed_type_3": "Strip shopping mall",
+ "mixed_type_3_percentage": 0,
+ "mixed_type_4": "Lodging",
+ "mixed_type_4_percentage": 0
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.84650338745196,
+ 42.81331301863236
+ ],
+ [
+ -78.84652443964629,
+ 42.81463974371101
+ ],
+ [
+ -78.84680142363833,
+ 42.815293654042534
+ ],
+ [
+ -78.84744455124724,
+ 42.81514110006128
+ ],
+ [
+ -78.84728610028628,
+ 42.81478165791734
+ ],
+ [
+ -78.84786797764677,
+ 42.814643631760134
+ ],
+ [
+ -78.84721106637106,
+ 42.813153418927016
+ ],
+ [
+ -78.84650338745196,
+ 42.81331301863236
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "2",
+ "name": "Restaurant 1",
+ "type": "Building",
+ "building_type": "Food service",
+ "floor_area": 22313,
+ "footprint_area": 22313,
+ "number_of_stories": 1,
+ "ev_charging": true,
+ "ev_charging_behavior": "Business as Usual",
+ "ev_percent": 100,
+ "ev_curtailment_frac": 0.5,
+ "ev_use_model_occupancy": true
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.8500120420453,
+ 42.81812185529549
+ ],
+ [
+ -78.85038975191084,
+ 42.81803226424341
+ ],
+ [
+ -78.850630729414,
+ 42.81857888627522
+ ],
+ [
+ -78.85025301954843,
+ 42.81866847653532
+ ],
+ [
+ -78.8500120420453,
+ 42.81812185529549
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "3",
+ "name": "Restaurant 10",
+ "type": "Building",
+ "building_type": "Food service",
+ "floor_area": 125631,
+ "footprint_area": 41877,
+ "number_of_stories": 3,
+ "ev_charging": true,
+ "ev_charging_station_type": "Typical Public"
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.84962224800356,
+ 42.81329273502644
+ ],
+ [
+ -78.84929833482822,
+ 42.81337083838241
+ ],
+ [
+ -78.84983265832118,
+ 42.814563298664666
+ ],
+ [
+ -78.85015657149653,
+ 42.81448519681467
+ ],
+ [
+ -78.84962224800356,
+ 42.81329273502644
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "4",
+ "name": "Restaurant 12",
+ "type": "Building",
+ "building_type": "Food service",
+ "floor_area": 31623,
+ "footprint_area": 10541,
+ "number_of_stories": 3,
+ "ev_charging": true,
+ "ev_charging_station_type": "Typical Public"
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.84907318596754,
+ 42.81342719667407
+ ],
+ [
+ -78.84862090048105,
+ 42.81353625345659
+ ],
+ [
+ -78.84871721918239,
+ 42.813751210926796
+ ],
+ [
+ -78.84916950466888,
+ 42.81364215452331
+ ],
+ [
+ -78.84907318596754,
+ 42.81342719667407
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "5",
+ "name": "District Office 1",
+ "type": "Building",
+ "building_type": "Office",
+ "system_type": "VAV district chilled water with district hot water reheat",
+ "floor_area": 8804,
+ "footprint_area": 8804,
+ "number_of_stories": 1,
+ "ev_charging": true,
+ "ev_charging_station_type": "Typical Work"
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.84809175426629,
+ 42.81367038997507
+ ],
+ [
+ -78.84848670778973,
+ 42.81357515750889
+ ],
+ [
+ -78.84857883872144,
+ 42.81378076888831
+ ],
+ [
+ -78.84818388519801,
+ 42.81387600103781
+ ],
+ [
+ -78.84809175426629,
+ 42.81367038997507
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "6",
+ "name": "District Office 2",
+ "type": "Building",
+ "building_type": "Office",
+ "system_type": "VAV district chilled water with district hot water reheat",
+ "floor_area": 10689,
+ "footprint_area": 10689,
+ "number_of_stories": 1,
+ "ev_charging": true
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.84846106738529,
+ 42.814495803077364
+ ],
+ [
+ -78.8486903952376,
+ 42.81444050756261
+ ],
+ [
+ -78.8484977578349,
+ 42.81401059666683
+ ],
+ [
+ -78.84826842998261,
+ 42.81406589256599
+ ],
+ [
+ -78.84846106738529,
+ 42.814495803077364
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "7",
+ "name": "Office 1",
+ "type": "Building",
+ "building_type": "Office",
+ "system_type": "VAV district chilled water with district hot water reheat",
+ "number_of_stories": 6,
+ "detailed_model_filename": "7.osm"
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.84733878006863,
+ 42.816466983030836
+ ],
+ [
+ -78.84854275129324,
+ 42.81617669028003
+ ],
+ [
+ -78.848356395545,
+ 42.81576080994094
+ ],
+ [
+ -78.84715242432038,
+ 42.81605110464406
+ ],
+ [
+ -78.84733878006863,
+ 42.816466983030836
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "8",
+ "name": "Hospital 1",
+ "type": "Building",
+ "building_type": "Outpatient health care",
+ "system_type": "VAV district chilled water with district hot water reheat",
+ "number_of_stories": 10,
+ "detailed_model_filename": "8.osm"
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.84973966335251,
+ 42.8154441454509
+ ],
+ [
+ -78.85049562542395,
+ 42.81525669280299
+ ],
+ [
+ -78.85078257620685,
+ 42.81588131780643
+ ],
+ [
+ -78.8505086568277,
+ 42.81594736368234
+ ],
+ [
+ -78.85041233812638,
+ 42.815732413845666
+ ],
+ [
+ -78.84991755499783,
+ 42.81585689105046
+ ],
+ [
+ -78.84973966335251,
+ 42.8154441454509
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "9",
+ "name": "Hospital 2",
+ "type": "Building",
+ "building_type": "Inpatient health care",
+ "number_of_stories": 3,
+ "detailed_model_filename": "9.osm"
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.85083627755732,
+ 42.81600678613279
+ ],
+ [
+ -78.85056039001891,
+ 42.816076133580566
+ ],
+ [
+ -78.85072568130569,
+ 42.816450649528036
+ ],
+ [
+ -78.84940134236577,
+ 42.81677160705479
+ ],
+ [
+ -78.84958014898304,
+ 42.81716858994267
+ ],
+ [
+ -78.8507262115271,
+ 42.816890840117026
+ ],
+ [
+ -78.8508565789851,
+ 42.81719595796099
+ ],
+ [
+ -78.85132137101688,
+ 42.81708331517635
+ ],
+ [
+ -78.85083627755732,
+ 42.81600678613279
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "10",
+ "name": "Mixed use 2",
+ "type": "Building",
+ "building_type": "Mixed use",
+ "floor_area": 1278384,
+ "footprint_area": 159798,
+ "number_of_stories": 8,
+ "mixed_type_1": "Strip shopping mall",
+ "mixed_type_1_percentage": 25,
+ "mixed_type_2": "Food service",
+ "mixed_type_2_percentage": 25,
+ "mixed_type_3": "Office",
+ "mixed_type_3_percentage": 15,
+ "mixed_type_4": "Lodging",
+ "mixed_type_4_percentage": 35
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.85115264550463,
+ 42.81786093060211
+ ],
+ [
+ -78.85163483958878,
+ 42.81774467026972
+ ],
+ [
+ -78.85246596719499,
+ 42.819583261120755
+ ],
+ [
+ -78.85082390085432,
+ 42.819979162017745
+ ],
+ [
+ -78.85060552295334,
+ 42.81947573727234
+ ],
+ [
+ -78.85174564783776,
+ 42.81920483484765
+ ],
+ [
+ -78.85115264550463,
+ 42.81786093060211
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "11",
+ "name": "Restaurant 13",
+ "type": "Building",
+ "building_type": "Food service",
+ "floor_area": 32511,
+ "footprint_area": 10837,
+ "number_of_stories": 3
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.84961163640645,
+ 42.81460851835703
+ ],
+ [
+ -78.84914661048371,
+ 42.81472064501696
+ ],
+ [
+ -78.84905029178236,
+ 42.81450569091638
+ ],
+ [
+ -78.84951531770513,
+ 42.81439356386673
+ ],
+ [
+ -78.84961163640645,
+ 42.81460851835703
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "12",
+ "name": "Mall 1",
+ "type": "Building",
+ "building_type": "Strip shopping mall",
+ "floor_area": 374409,
+ "footprint_area": 124803,
+ "number_of_stories": 3
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.84768338040897,
+ 42.817161656757065
+ ],
+ [
+ -78.8482630702579,
+ 42.8170218879136
+ ],
+ [
+ -78.84915297130291,
+ 42.81900776764229
+ ],
+ [
+ -78.84857328145401,
+ 42.81914753199706
+ ],
+ [
+ -78.84768338040897,
+ 42.817161656757065
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "13",
+ "name": "Hotel 1",
+ "type": "Building",
+ "building_type": "Lodging",
+ "floor_area": 316160,
+ "footprint_area": 31616,
+ "number_of_stories": 10
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.8494955083645,
+ 42.819748790984335
+ ],
+ [
+ -78.84891089471263,
+ 42.81989327725856
+ ],
+ [
+ -78.8491389243777,
+ 42.82038967009544
+ ],
+ [
+ -78.84972353802956,
+ 42.82024518498119
+ ],
+ [
+ -78.8494955083645,
+ 42.819748790984335
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "7932a208-dcb6-4d23-a46f-288896eaa1bc",
+ "geometryType": "Rectangle",
+ "name": "New District System_1",
+ "type": "District System",
+ "district_system_type": "Ground Heat Exchanger",
+ "footprint_area": 11237,
+ "footprint_perimeter": 425,
+ "floor_area": 11237
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ -78.84863142413666,
+ 42.813370258279036
+ ],
+ [
+ -78.84852414737549,
+ 42.81311449850455
+ ],
+ [
+ -78.84811397152369,
+ 42.813207081350356
+ ],
+ [
+ -78.84822124828486,
+ 42.813462840742005
+ ],
+ [
+ -78.84863142413666,
+ 42.813370258279036
+ ]
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "c141750a-1588-4d52-a48f-143f562bbf58",
+ "type": "ThermalJunction",
+ "DSId": "7932a208-dcb6-4d23-a46f-288896eaa1bc",
+ "is_ghe_start_loop": true,
+ "junction_type": "DES",
+ "connection_type": "Series"
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [
+ -78.84859427149203,
+ 42.81337864415956
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "61caaec1-b89e-4992-8d74-614ba012410d",
+ "type": "ThermalJunction",
+ "buildingId": "4",
+ "junction_type": "DES",
+ "connection_type": "Series"
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [
+ -78.84866300528785,
+ 42.81352610099487
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "type": "ThermalConnector",
+ "id": "2aff6cc6-c572-4b26-8d5e-861430e74214",
+ "startJunctionId": "c141750a-1588-4d52-a48f-143f562bbf58",
+ "endJunctionId": "61caaec1-b89e-4992-8d74-614ba012410d",
+ "startFeatureId": "7932a208-dcb6-4d23-a46f-288896eaa1bc",
+ "endFeatureId": "4",
+ "total_length": 57,
+ "connector_type": "OnePipe",
+ "fluid_temperature_type": "Hot",
+ "flow_direction": "Supply"
+ },
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [
+ -78.84859427149203,
+ 42.81337864415956
+ ],
+ [
+ -78.84866300528785,
+ 42.81352610099487
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "c8721cd3-370f-4c05-84dd-5078765374aa",
+ "type": "ThermalJunction",
+ "buildingId": "4",
+ "junction_type": "DES",
+ "connection_type": "Series"
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [
+ -78.84866909176027,
+ 42.813643803541
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "2bb0321d-894b-4d54-a394-db753f3ae8e1",
+ "type": "ThermalJunction",
+ "buildingId": "5",
+ "junction_type": "DES",
+ "connection_type": "Series"
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [
+ -78.84853165495203,
+ 42.81367546753221
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "type": "ThermalConnector",
+ "id": "edaab88a-f105-456e-b0c0-1c58733de17b",
+ "startJunctionId": "c8721cd3-370f-4c05-84dd-5078765374aa",
+ "endJunctionId": "2bb0321d-894b-4d54-a394-db753f3ae8e1",
+ "startFeatureId": "4",
+ "endFeatureId": "5",
+ "total_length": 39,
+ "connector_type": "OnePipe",
+ "fluid_temperature_type": "Hot",
+ "flow_direction": "Supply"
+ },
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [
+ -78.84866909176027,
+ 42.813643803541
+ ],
+ [
+ -78.84853165495203,
+ 42.81367546753221
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "3d81cbe7-b0ff-4afc-9996-54ad53aac9a4",
+ "type": "ThermalJunction",
+ "buildingId": "5",
+ "junction_type": "DES",
+ "connection_type": "Series"
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [
+ -78.8484384462089,
+ 42.813586794504644
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "35574fbd-c29c-4f80-a1a1-49e0700d4f73",
+ "type": "ThermalJunction",
+ "DSId": "7932a208-dcb6-4d23-a46f-288896eaa1bc",
+ "junction_type": "DES",
+ "connection_type": "Series"
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [
+ -78.84836979234511,
+ 42.81342931227285
+ ]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "type": "ThermalConnector",
+ "id": "b3ac3ba6-7094-42dc-81eb-5967f90077f2",
+ "startJunctionId": "3d81cbe7-b0ff-4afc-9996-54ad53aac9a4",
+ "endJunctionId": "35574fbd-c29c-4f80-a1a1-49e0700d4f73",
+ "startFeatureId": "5",
+ "endFeatureId": "7932a208-dcb6-4d23-a46f-288896eaa1bc",
+ "total_length": 60,
+ "connector_type": "OnePipe",
+ "fluid_temperature_type": "Hot",
+ "flow_direction": "Supply"
+ },
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [
+ -78.8484384462089,
+ 42.813586794504644
+ ],
+ [
+ -78.84836979234511,
+ 42.81342931227285
+ ]
+ ]
+ }
+ }
+ ],
+ "mappers": [],
+ "scenarios": [
+ {
+ "feature_mappings": [],
+ "id": "72301739-c6c3-4dd7-bf1a-f37c8eff40db",
+ "name": "New Scenario"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/example_files/mappers/Baseline.rb b/example_files/mappers/Baseline.rb
index 3c7dc2bb..5ce00973 100644
--- a/example_files/mappers/Baseline.rb
+++ b/example_files/mappers/Baseline.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
require 'urbanopt/reporting'
@@ -261,103 +261,23 @@ def commercial_building_types
]
end
- def get_arg_default(arg)
- case arg.type.valueName.downcase
- when 'boolean'
- return arg.defaultValueAsBool
- when 'double'
- return arg.defaultValueAsDouble
- when 'integer'
- return arg.defaultValueAsInteger
- when 'string'
- return arg.defaultValueAsString
- when 'choice'
- return arg.defaultValueAsString
- end
- end
-
- def get_lookup_tsv(args, filepath)
- rows = []
- headers = []
- units = []
- CSV.foreach(filepath, { col_sep: "\t" }) do |row|
- if headers.empty?
- row.each do |header|
- next if header == 'Source'
-
- if args.key?(header.gsub('Dependency=', '').to_sym)
- header = header.gsub('Dependency=', '')
- end
- unless header.include?('Dependency=')
- header = header.to_sym
- end
- headers << header
- end
- next
- elsif units.empty?
- row.each do |unit|
- units << unit
- end
- next
- end
- if headers.length != row.length
- row = row[0..-2] # leave out Source column
- end
- rows << headers.zip(row).to_h
- end
- return rows
- end
-
- def get_lookup_row(args, rows, template_vals)
- rows.each do |row|
- if row.key?('Dependency=Climate Zone') && (row['Dependency=Climate Zone'] != template_vals[:climate_zone])
- next
- end
- if row.key?('Dependency=IECC Year') && (row['Dependency=IECC Year'] != template_vals[:iecc_year])
- next
- end
- if row.key?('Dependency=Template Month') && (row['Dependency=Template Month'] != template_vals[:t_month])
- next
- end
- if row.key?('Dependency=Template Year') && (row['Dependency=Template Year'] != template_vals[:t_year])
- next
- end
-
- row.delete('Dependency=Climate Zone')
- row.delete('Dependency=IECC Year')
- row.delete('Dependency=Template Month')
- row.delete('Dependency=Template Year')
-
- row.each do |k, v|
- next unless v.nil?
-
- row.delete(k)
- end
-
- intersection = args.keys & row.keys
- return row if intersection.empty? # found the correct row
-
- skip = false
- intersection.each do |k|
- if args[k] != row[k]
- skip = true
- end
- end
-
- return row unless skip
- end
- return nil
- end
-
def get_climate_zone_iecc(epw)
headers = CSV.open(epw, 'r', &:first)
wmo = headers[5]
- zones_csv = File.join(File.dirname(__FILE__), '../resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/climate_zones.csv')
+ zones_csv = Pathname(__FILE__).dirname.parent / 'resources' / 'hpxml-measures' / 'HPXMLtoOpenStudio' / 'resources' / 'data' / 'climate_zones.csv'
+
+ # Check if the CSV file is empty
+ if File.empty?(epw)
+ raise "Error: Your weather file #{epw} is empty."
+ end
+
CSV.foreach(zones_csv) do |row|
if row[0].to_s == wmo.to_s
return row[6].to_s
end
end
+
+ return nil
end
# epw_state to subregions mapping methods
@@ -607,8 +527,6 @@ def create_osw(scenario, features, feature_names)
end
if residential_building_types.include? building_type
- debug = false
-
# Check for required residential fields
is_defined(feature, :number_of_stories_above_ground)
is_defined(feature, :foundation_type)
@@ -622,338 +540,39 @@ def create_osw(scenario, features, feature_names)
end
end
- args = {}
-
- # Custom HPXML Files
- begin
- args[:hpxml_dir] = feature.hpxml_directory
- rescue StandardError
- end
-
- # Simulation Control
- args[:simulation_control_timestep] = 60
- begin
- args[:simulation_control_timestep] = 60 / feature.timesteps_per_hour
- rescue StandardError
- end
-
- args[:simulation_control_run_period] = 'Jan 1 - Dec 31'
- args[:simulation_control_run_period_calendar_year] = 2007
- begin
- abbr_monthnames = Date::ABBR_MONTHNAMES
- begin_month = abbr_monthnames[feature.begin_date[5, 2].to_i]
- begin_day_of_month = feature.begin_date[8, 2].to_i
- end_month = abbr_monthnames[feature.end_date[5, 2].to_i]
- end_day_of_month = feature.end_date[8, 2].to_i
- args[:simulation_control_run_period] = "#{begin_month} #{begin_day_of_month} - #{end_month} #{end_day_of_month}"
- args[:simulation_control_run_period_calendar_year] = feature.begin_date[0, 4].to_i
- rescue StandardError
- end
-
- args[:weather_station_epw_filepath] = "../../../weather/#{feature.weather_filename}"
-
- # Geometry
- args[:geometry_building_num_units] = 1
- args[:geometry_unit_num_floors_above_grade] = 1
- case building_type
- when 'Single-Family Detached'
- args[:geometry_unit_type] = 'single-family detached'
- args[:geometry_unit_num_floors_above_grade] = feature.number_of_stories_above_ground
- when 'Single-Family Attached'
- args[:geometry_unit_type] = 'single-family attached'
- begin
- args[:geometry_building_num_units] = feature.number_of_residential_units
- rescue StandardError
- end
- args[:geometry_unit_num_floors_above_grade] = feature.number_of_stories_above_ground
- args[:air_leakage_type] = 'unit exterior only'
- when 'Multifamily'
- args[:geometry_unit_type] = 'apartment unit'
- begin
- args[:geometry_building_num_units] = feature.number_of_residential_units
- rescue StandardError
- end
- args[:air_leakage_type] = 'unit exterior only'
- end
-
- args[:geometry_num_floors_above_grade] = feature.number_of_stories_above_ground
-
- args[:geometry_foundation_type] = 'SlabOnGrade'
- args[:geometry_foundation_height] = 0.0
- case feature.foundation_type
- when 'crawlspace - vented'
- args[:geometry_foundation_type] = 'VentedCrawlspace'
- args[:geometry_foundation_height] = 3.0
- when 'crawlspace - unvented'
- args[:geometry_foundation_type] = 'UnventedCrawlspace'
- args[:geometry_foundation_height] = 3.0
- when 'crawlspace - conditioned'
- args[:geometry_foundation_type] = 'ConditionedCrawlspace'
- args[:geometry_foundation_height] = 3.0
- when 'basement - unconditioned'
- args[:geometry_foundation_type] = 'UnconditionedBasement'
- args[:geometry_foundation_height] = 8.0
- when 'basement - conditioned'
- args[:geometry_foundation_type] = 'ConditionedBasement'
- args[:geometry_foundation_height] = 8.0
- when 'ambient'
- args[:geometry_foundation_type] = 'Ambient'
- args[:geometry_foundation_height] = 8.0
- end
-
- begin
- case feature.attic_type
- when 'attic - vented'
- args[:geometry_attic_type] = 'VentedAttic'
- begin
- args[:geometry_roof_type] = feature.roof_type
- rescue StandardError
- end
- when 'attic - unvented'
- args[:geometry_attic_type] = 'UnventedAttic'
- begin
- args[:geometry_roof_type] = feature.roof_type
- rescue StandardError
- end
- when 'attic - conditioned'
- args[:geometry_attic_type] = 'ConditionedAttic'
- begin
- args[:geometry_roof_type] = feature.roof_type
- rescue StandardError
- end
- when 'flat roof'
- args[:geometry_attic_type] = 'FlatRoof'
- end
- rescue StandardError
- end
-
- args[:geometry_roof_type] = 'gable'
- begin
- case feature.roof_type
- when 'Hip'
- args[:geometry_roof_type] = 'hip'
- end
- rescue StandardError
+ epw = File.join(File.dirname(__FILE__), '../weather', feature.weather_filename)
+ climate_zone = get_climate_zone_iecc(epw)
+ if climate_zone.nil?
+ abort("Error: No match found for the WMO station from your weather file #{Pathname(epw).expand_path} in our US WMO list.
+ This is known to happen when your weather file is from somewhere outside of the United States.
+ Please replace your weather file with one from an analogous weather location in the United States.")
end
- begin
- args[:geometry_unit_cfa] = feature.floor_area / args[:geometry_building_num_units]
- rescue StandardError
- end
-
- begin
- args[:geometry_unit_num_bedrooms] = feature.number_of_bedrooms / args[:geometry_building_num_units]
- rescue StandardError
- end
-
- # Occupancy Calculation Type
- begin
- if feature.occupancy_calculation_type == 'operational'
- # set args[:geometry_unit_num_occupants]
- begin
- args[:geometry_unit_num_occupants] = feature.number_of_occupants / args[:geometry_building_num_units]
- rescue StandardError # number_of_occupants is not defined: assume equal to number of bedrooms
- args[:geometry_unit_num_occupants] = args[:geometry_unit_num_bedrooms]
- end
- elsif feature.occupancy_calculation_type == 'asset'
- # do not set args[:geometry_unit_num_occupants]
- end
- rescue StandardError # occupancy_calculation_type is not defined: do nothing, i.e., asset calculation
- end
-
- args[:geometry_average_ceiling_height] = 8.0
- begin
- args[:geometry_average_ceiling_height] = feature.maximum_roof_height / feature.number_of_stories_above_ground
- rescue StandardError
- end
-
- begin
- num_garage_spaces = 0
- if feature.onsite_parking_fraction
- num_garage_spaces = 1
- if args[:geometry_unit_cfa] > 2500.0
- num_garage_spaces = 2
- end
- end
- args[:geometry_garage_width] = 12.0 * num_garage_spaces
- args[:geometry_garage_protrusion] = 1.0
- rescue StandardError
- end
-
- args[:neighbor_left_distance] = 0.0
- args[:neighbor_right_distance] = 0.0
-
- # SCHEDULES
-
- feature_ids = []
- scenario.feature_file.features.each do |feature|
- feature_ids << feature.id
- end
-
- args[:feature_id] = feature_ids.index(feature_id)
- args[:schedules_random_seed] = feature_ids.index(feature_id)
- args[:schedules_type] = 'stochastic' # smooth or stochastic
- args[:schedules_variation] = 'unit' # building or unit
-
- # HVAC
-
- system_type = 'Residential - furnace and central air conditioner'
- begin
- system_type = feature.system_type
- rescue StandardError
- end
-
- args[:heating_system_type] = 'none'
- if system_type.include?('electric resistance')
- args[:heating_system_type] = 'ElectricResistance'
- elsif system_type.include?('furnace')
- args[:heating_system_type] = 'Furnace'
- elsif system_type.include?('boiler')
- args[:heating_system_type] = 'Boiler'
- end
-
- args[:cooling_system_type] = 'none'
- if system_type.include?('central air conditioner')
- args[:cooling_system_type] = 'central air conditioner'
- elsif system_type.include?('room air conditioner')
- args[:cooling_system_type] = 'room air conditioner'
- elsif system_type.include?('evaporative cooler')
- args[:cooling_system_type] = 'evaporative cooler'
- end
-
- args[:heat_pump_type] = 'none'
- if system_type.include?('air-to-air')
- args[:heat_pump_type] = 'air-to-air'
- elsif system_type.include?('mini-split')
- args[:heat_pump_type] = 'mini-split'
- elsif system_type.include?('ground-to-air')
- args[:heat_pump_type] = 'ground-to-air'
- end
-
- args[:heating_system_fuel] = 'natural gas'
- begin
- args[:heating_system_fuel] = feature.heating_system_fuel_type
- rescue StandardError
- end
-
- if args[:heating_system_type] == 'ElectricResistance'
- args[:heating_system_fuel] = 'electricity'
- end
-
- # APPLIANCES
-
- args[:cooking_range_oven_fuel_type] = args[:heating_system_fuel]
- args[:clothes_dryer_fuel_type] = args[:heating_system_fuel]
-
- # WATER HEATER
-
- args[:water_heater_fuel_type] = args[:heating_system_fuel]
+ # Start general residential mapping
+ args = {}
+ require File.join(File.dirname(__FILE__), 'residential/util')
+ residential(scenario, feature, args, building_type)
+ # Then onto optional "template" mapping
+ # mappers/residential/template
template = nil
begin
template = feature.template
rescue StandardError
end
- # IECC / EnergyStar / Other
- if !template.nil? && template.include?('Residential IECC')
-
- captures = template.match(/Residential IECC (?\d+) - Customizable Template (?\w+) (?\d+)/)
- template_vals = Hash[captures.names.zip(captures.captures)]
- template_vals = template_vals.transform_keys(&:to_sym)
-
- epw = File.join(File.dirname(__FILE__), '../weather', feature.weather_filename)
- template_vals[:climate_zone] = get_climate_zone_iecc(epw)
-
- # ENCLOSURE
-
- enclosure_filepath = File.join(File.dirname(__FILE__), 'residential/enclosure.tsv')
- enclosure = get_lookup_tsv(args, enclosure_filepath)
- row = get_lookup_row(args, enclosure, template_vals)
-
- # Determine which surfaces to place insulation on
- if args[:geometry_foundation_type].include? 'Basement'
- row[:foundation_wall_assembly_r] = row[:foundation_wall_assembly_r_basement]
- row[:floor_over_foundation_assembly_r] = 2.1
- row[:floor_over_garage_assembly_r] = 2.1
- elsif args[:geometry_foundation_type].include? 'Crawlspace'
- row[:foundation_wall_assembly_r] = row[:foundation_wall_assembly_r_crawlspace]
- row[:floor_over_foundation_assembly_r] = 2.1
- row[:floor_over_garage_assembly_r] = 2.1
- end
- row.delete(:foundation_wall_assembly_r_basement)
- row.delete(:foundation_wall_assembly_r_crawlspace)
- if ['ConditionedAttic'].include?(args[:geometry_attic_type])
- row[:roof_assembly_r] = row[:ceiling_assembly_r]
- row[:ceiling_assembly_r] = 2.1
- end
- args.update(row) unless row.nil?
-
- # HVAC
-
- if args[:heating_system_type] != 'none'
- heating_system_filepath = File.join(File.dirname(__FILE__), 'residential/heating_system.tsv')
- heating_system = get_lookup_tsv(args, heating_system_filepath)
- row = get_lookup_row(args, heating_system, template_vals)
- args.update(row) unless row.nil?
- end
-
- if args[:cooling_system_type] != 'none'
- cooling_system_filepath = File.join(File.dirname(__FILE__), 'residential/cooling_system.tsv')
- cooling_system = get_lookup_tsv(args, cooling_system_filepath)
- row = get_lookup_row(args, cooling_system, template_vals)
- args.update(row) unless row.nil?
- end
-
- if args[:heat_pump_type] != 'none'
- heat_pump_filepath = File.join(File.dirname(__FILE__), 'residential/heat_pump.tsv')
- heat_pump = get_lookup_tsv(args, heat_pump_filepath)
- row = get_lookup_row(args, heat_pump, template_vals)
- args.update(row) unless row.nil?
- end
-
- # APPLIANCES
-
- ['refrigerator', 'clothes_washer', 'dishwasher', 'clothes_dryer'].each do |appliance|
- appliances_filepath = File.join(File.dirname(__FILE__), "residential/#{appliance}.tsv")
- appliances = get_lookup_tsv(args, appliances_filepath)
- row = get_lookup_row(args, appliances, template_vals)
-
- args.update(row) unless row.nil?
-
- end
-
- # MECHANICAL VENTILATION
-
- mechvent_filepath = File.join(File.dirname(__FILE__), 'residential/mechanical_ventilation.tsv')
- mechvent = get_lookup_tsv(args, mechvent_filepath)
- row = get_lookup_row(args, mechvent, template_vals)
- args.update(row) unless row.nil?
-
- # EXHAUST
- # deprecated in OpenStudio-HPXML v1.5.0
- # exhaust_filepath = File.join(File.dirname(__FILE__), 'residential/exhaust.tsv')
- # exhaust = get_lookup_tsv(args, exhaust_filepath)
- # row = get_lookup_row(args, exhaust, template_vals)
- # args.update(row) unless row.nil?
-
- # WATER HEATER
-
- water_heater_filepath = File.join(File.dirname(__FILE__), 'residential/water_heater.tsv')
- water_heater = get_lookup_tsv(args, water_heater_filepath)
- row = get_lookup_row(args, water_heater, template_vals)
- args.update(row) unless row.nil?
+ if !template.nil?
+ require File.join(File.dirname(__FILE__), 'residential/template/util')
+ residential_template(args, template, climate_zone)
end
- # Parse BuildResidentialModel measure xml so we can override defaults with template values
+ # Parse BuildResidentialModel measure xml so we can override defaults
default_args = {}
- OpenStudio::Extension.set_measure_argument(osw, 'BuildResidentialModel', '__SKIP__', false)
measures_dir = File.absolute_path(File.join(File.dirname(__FILE__), '../resources/hpxml-measures'))
measure_xml = File.read(File.join(measures_dir, 'BuildResidentialHPXML', 'measure.xml'))
measure = REXML::Document.new(measure_xml).root
measure.elements.each('arguments/argument') do |arg|
arg_name = arg.elements['name'].text.to_sym
- next if [:hpxml_path].include? arg_name
default_args[arg_name] = nil
if arg.elements['default_value']
@@ -962,14 +581,16 @@ def create_osw(scenario, features, feature_names)
end
end
+ build_res_model_args = [:feature_id, :schedules_type, :schedules_random_seed, :schedules_variation, :geometry_num_floors_above_grade, :hpxml_dir, :output_dir]
args.each_key do |arg_name|
unless default_args.key?(arg_name)
- next if [:feature_id, :schedules_type, :schedules_random_seed, :schedules_variation, :geometry_num_floors_above_grade, :hpxml_dir].include?(arg_name)
+ next if build_res_model_args.include?(arg_name)
puts "Argument '#{arg_name}' is unknown."
end
end
+ debug = false
default_args.each do |arg_name, arg_default|
next if arg_default.nil?
@@ -988,6 +609,7 @@ def create_osw(scenario, features, feature_names)
end
end
+ OpenStudio::Extension.set_measure_argument(osw, 'BuildResidentialModel', '__SKIP__', false)
args.each_key do |arg_name|
OpenStudio::Extension.set_measure_argument(osw, 'BuildResidentialModel', arg_name, args[arg_name])
end
@@ -1038,8 +660,12 @@ def create_osw(scenario, features, feature_names)
# convert to hash
building_hash = feature.to_hash
- # check for detailed model filename
OpenStudio::Extension.set_measure_argument(osw, 'PredictedMeanVote', '__SKIP__', false)
+
+ # Changing location here means we always read the geojson weather file, no matter what.
+ OpenStudio::Extension.set_measure_argument(osw, 'ChangeBuildingLocation', '__SKIP__', false)
+
+ # check for detailed model filename
if building_hash.key?(:detailed_model_filename)
detailed_model_filename = building_hash[:detailed_model_filename]
osw[:file_paths] << File.join(File.dirname(__FILE__), '../osm_building/')
@@ -1048,7 +674,7 @@ def create_osw(scenario, features, feature_names)
# skip PMV measure with detailed models:
OpenStudio::Extension.set_measure_argument(osw, 'PredictedMeanVote', '__SKIP__', true)
- # in case detailed model filename is not present
+ # For when the user DIDN'T BYO osm file
else
building_type_1 = building_hash[:building_type]
@@ -1144,10 +770,6 @@ def time_mapping(time)
return new_time
end
- # ChangeBuildingLocation
- # set skip measure to false change building location
- OpenStudio::Extension.set_measure_argument(osw, 'ChangeBuildingLocation', '__SKIP__', false)
-
# cec climate zone takes precedence
cec_found = false
begin
@@ -1326,6 +948,8 @@ def time_mapping(time)
OpenStudio::Extension.set_measure_argument(osw, 'create_typical_building_from_model', 'system_type', system_type, 'create_typical_building_from_model 2')
end
+ OpenStudio::Extension.set_measure_argument(osw, 'export_time_series_modelica', '__SKIP__', false)
+ OpenStudio::Extension.set_measure_argument(osw, 'export_modelica_loads', '__SKIP__', false)
else
raise "Building type #{building_type} not currently supported."
end
@@ -1481,6 +1105,6 @@ def time_mapping(time)
return osw
end
- end
+ end # end class
end
end
diff --git a/example_files/mappers/ChilledWaterStorage.rb b/example_files/mappers/ChilledWaterStorage.rb
index b02b4893..1f59d23f 100644
--- a/example_files/mappers/ChilledWaterStorage.rb
+++ b/example_files/mappers/ChilledWaterStorage.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
# Mapper created by LBNL using the measure from openstudio-geb gem
diff --git a/example_files/mappers/CreateBar.rb b/example_files/mappers/CreateBar.rb
index 78d67857..94a33f06 100644
--- a/example_files/mappers/CreateBar.rb
+++ b/example_files/mappers/CreateBar.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
require 'urbanopt/reporting'
diff --git a/example_files/mappers/EvCharging.rb b/example_files/mappers/EvCharging.rb
index 02a3386a..c3cdf816 100644
--- a/example_files/mappers/EvCharging.rb
+++ b/example_files/mappers/EvCharging.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
require 'urbanopt/reporting'
diff --git a/example_files/mappers/FlexibleHotWater.rb b/example_files/mappers/FlexibleHotWater.rb
index 05dd1a65..d65b672d 100644
--- a/example_files/mappers/FlexibleHotWater.rb
+++ b/example_files/mappers/FlexibleHotWater.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
require 'urbanopt/reporting'
diff --git a/example_files/mappers/Floorspace.rb b/example_files/mappers/Floorspace.rb
index 0220654c..5942f241 100644
--- a/example_files/mappers/Floorspace.rb
+++ b/example_files/mappers/Floorspace.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
require 'urbanopt/reporting'
diff --git a/example_files/mappers/HighEfficiency.rb b/example_files/mappers/HighEfficiency.rb
index 3cd52f66..ab7c5d46 100644
--- a/example_files/mappers/HighEfficiency.rb
+++ b/example_files/mappers/HighEfficiency.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
require 'urbanopt/reporting'
diff --git a/example_files/mappers/HighEfficiencyCreateBar.rb b/example_files/mappers/HighEfficiencyCreateBar.rb
index 8cf09624..2579aaf7 100644
--- a/example_files/mappers/HighEfficiencyCreateBar.rb
+++ b/example_files/mappers/HighEfficiencyCreateBar.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
require 'urbanopt/reporting'
diff --git a/example_files/mappers/HighEfficiencyFloorspace.rb b/example_files/mappers/HighEfficiencyFloorspace.rb
index 4e7895ae..24c3053b 100644
--- a/example_files/mappers/HighEfficiencyFloorspace.rb
+++ b/example_files/mappers/HighEfficiencyFloorspace.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
require 'urbanopt/reporting'
diff --git a/example_files/mappers/PeakHoursMelsShedding.rb b/example_files/mappers/PeakHoursMelsShedding.rb
index a1a0ec4d..9f8955ee 100644
--- a/example_files/mappers/PeakHoursMelsShedding.rb
+++ b/example_files/mappers/PeakHoursMelsShedding.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
# Mapper created by LBNL using the measure from openstudio-geb gem
diff --git a/example_files/mappers/PeakHoursThermostatAdjust.rb b/example_files/mappers/PeakHoursThermostatAdjust.rb
index 575eae5c..7bc47e84 100644
--- a/example_files/mappers/PeakHoursThermostatAdjust.rb
+++ b/example_files/mappers/PeakHoursThermostatAdjust.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
# Mapper created by LBNL using the measure from openstudio-geb gem
diff --git a/example_files/mappers/ThermalStorage.rb b/example_files/mappers/ThermalStorage.rb
index ee5dd7d5..b56dce57 100644
--- a/example_files/mappers/ThermalStorage.rb
+++ b/example_files/mappers/ThermalStorage.rb
@@ -1,6 +1,6 @@
# *********************************************************************************
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
-# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
# *********************************************************************************
require 'urbanopt/reporting'
diff --git a/example_files/mappers/base_workflow.osw b/example_files/mappers/base_workflow.osw
index 0b552963..736dee77 100644
--- a/example_files/mappers/base_workflow.osw
+++ b/example_files/mappers/base_workflow.osw
@@ -6,6 +6,11 @@
"run_directory": null,
"steps": [
{
+ "measure_dir_name": "BuildResidentialModel",
+ "arguments": {
+ "__SKIP__": true
+ }
+ },{
"measure_dir_name": "set_run_period",
"arguments": {
"__SKIP__": true,
@@ -205,17 +210,19 @@
"size_mult": "0.75",
"charge_start": "23:00"
}
- },{
+ },
+ {
"measure_dir_name":"export_time_series_modelica",
"arguments":{
- "__SKIP__":false
+ "__SKIP__": true
}
},{
"measure_dir_name":"export_modelica_loads",
"arguments":{
- "__SKIP__":false
+ "__SKIP__": true
}
- },{
+ },
+ {
"measure_dir_name": "envelope_and_internal_load_breakdown",
"arguments": {
"__SKIP__": true
diff --git a/example_files/residential/clothes_dryer.tsv b/example_files/mappers/residential/template/iecc/clothes_dryer.tsv
similarity index 100%
rename from example_files/residential/clothes_dryer.tsv
rename to example_files/mappers/residential/template/iecc/clothes_dryer.tsv
diff --git a/example_files/residential/clothes_washer.tsv b/example_files/mappers/residential/template/iecc/clothes_washer.tsv
similarity index 100%
rename from example_files/residential/clothes_washer.tsv
rename to example_files/mappers/residential/template/iecc/clothes_washer.tsv
diff --git a/example_files/residential/cooling_system.tsv b/example_files/mappers/residential/template/iecc/cooling_system.tsv
similarity index 100%
rename from example_files/residential/cooling_system.tsv
rename to example_files/mappers/residential/template/iecc/cooling_system.tsv
diff --git a/example_files/residential/dishwasher.tsv b/example_files/mappers/residential/template/iecc/dishwasher.tsv
similarity index 100%
rename from example_files/residential/dishwasher.tsv
rename to example_files/mappers/residential/template/iecc/dishwasher.tsv
diff --git a/example_files/residential/enclosure.tsv b/example_files/mappers/residential/template/iecc/enclosure.tsv
similarity index 100%
rename from example_files/residential/enclosure.tsv
rename to example_files/mappers/residential/template/iecc/enclosure.tsv
diff --git a/example_files/residential/heat_pump.tsv b/example_files/mappers/residential/template/iecc/heat_pump.tsv
similarity index 100%
rename from example_files/residential/heat_pump.tsv
rename to example_files/mappers/residential/template/iecc/heat_pump.tsv
diff --git a/example_files/residential/heating_system.tsv b/example_files/mappers/residential/template/iecc/heating_system.tsv
similarity index 100%
rename from example_files/residential/heating_system.tsv
rename to example_files/mappers/residential/template/iecc/heating_system.tsv
diff --git a/example_files/residential/mechanical_ventilation.tsv b/example_files/mappers/residential/template/iecc/mechanical_ventilation.tsv
similarity index 100%
rename from example_files/residential/mechanical_ventilation.tsv
rename to example_files/mappers/residential/template/iecc/mechanical_ventilation.tsv
diff --git a/example_files/residential/refrigerator.tsv b/example_files/mappers/residential/template/iecc/refrigerator.tsv
similarity index 100%
rename from example_files/residential/refrigerator.tsv
rename to example_files/mappers/residential/template/iecc/refrigerator.tsv
diff --git a/example_files/residential/water_heater.tsv b/example_files/mappers/residential/template/iecc/water_heater.tsv
similarity index 100%
rename from example_files/residential/water_heater.tsv
rename to example_files/mappers/residential/template/iecc/water_heater.tsv
diff --git a/example_files/mappers/residential/template/util.rb b/example_files/mappers/residential/template/util.rb
new file mode 100644
index 00000000..44addb19
--- /dev/null
+++ b/example_files/mappers/residential/template/util.rb
@@ -0,0 +1,138 @@
+# *********************************************************************************
+# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
+# *********************************************************************************
+
+
+def residential_template(args, template, climate_zone)
+ '''Assign arguments from tsv files.'''
+
+ # IECC / EnergyStar / Other
+ if template.include?('Residential IECC')
+
+ captures = template.match(/Residential IECC (?\d+) - Customizable Template (?\w+) (?\d+)/)
+ template_vals = Hash[captures.names.zip(captures.captures)]
+ template_vals = template_vals.transform_keys(&:to_sym)
+ template_vals[:climate_zone] = climate_zone
+
+ # ENCLOSURE
+
+ enclosure_filepath = File.join(File.dirname(__FILE__), 'iecc/enclosure.tsv')
+ enclosure = get_lookup_tsv(args, enclosure_filepath)
+ row = get_lookup_row(args, enclosure, template_vals)
+
+ # Determine which surfaces to place insulation on
+ if args[:geometry_foundation_type].include? 'Basement'
+ row[:foundation_wall_assembly_r] = row[:foundation_wall_assembly_r_basement]
+ row[:floor_over_foundation_assembly_r] = 2.1
+ row[:floor_over_garage_assembly_r] = 2.1
+ elsif args[:geometry_foundation_type].include? 'Crawlspace'
+ row[:foundation_wall_assembly_r] = row[:foundation_wall_assembly_r_crawlspace]
+ row[:floor_over_foundation_assembly_r] = 2.1
+ row[:floor_over_garage_assembly_r] = 2.1
+ end
+ row.delete(:foundation_wall_assembly_r_basement)
+ row.delete(:foundation_wall_assembly_r_crawlspace)
+ if ['ConditionedAttic'].include?(args[:geometry_attic_type])
+ row[:roof_assembly_r] = row[:ceiling_assembly_r]
+ row[:ceiling_assembly_r] = 2.1
+ end
+ args.update(row) unless row.nil?
+
+ # HVAC
+
+ { args[:heating_system_type] => 'iecc/heating_system.tsv',
+ args[:cooling_system_type] => 'iecc/cooling_system.tsv',
+ args[:heat_pump_type] => 'iecc/heat_pump.tsv' }.each do |type, path|
+
+ if type != 'none'
+ filepath = File.join(File.dirname(__FILE__), path)
+ lookup_tsv = get_lookup_tsv(args, filepath)
+ row = get_lookup_row(args, lookup_tsv, template_vals)
+ args.update(row) unless row.nil?
+ end
+ end
+
+ # APPLIANCES / MECHANICAL VENTILATION / WATER HEATER
+
+ ['refrigerator', 'clothes_washer', 'dishwasher', 'clothes_dryer', 'mechanical_ventilation', 'water_heater'].each do |appliance|
+ filepath = File.join(File.dirname(__FILE__), "iecc/#{appliance}.tsv")
+ lookup_tsv = get_lookup_tsv(args, filepath)
+ row = get_lookup_row(args, lookup_tsv, template_vals)
+ args.update(row) unless row.nil?
+ end
+ end
+end
+
+def get_lookup_tsv(args, filepath)
+ rows = []
+ headers = []
+ units = []
+ CSV.foreach(filepath, { col_sep: "\t" }) do |row|
+ if headers.empty?
+ row.each do |header|
+ next if header == 'Source'
+
+ if args.key?(header.gsub('Dependency=', '').to_sym)
+ header = header.gsub('Dependency=', '')
+ end
+ unless header.include?('Dependency=')
+ header = header.to_sym
+ end
+ headers << header
+ end
+ next
+ elsif units.empty?
+ row.each do |unit|
+ units << unit
+ end
+ next
+ end
+ if headers.length != row.length
+ row = row[0..-2] # leave out Source column
+ end
+ rows << headers.zip(row).to_h
+ end
+ return rows
+end
+
+def get_lookup_row(args, rows, template_vals)
+ rows.each do |row|
+ if row.key?('Dependency=Climate Zone') && (row['Dependency=Climate Zone'] != template_vals[:climate_zone])
+ next
+ end
+ if row.key?('Dependency=IECC Year') && (row['Dependency=IECC Year'] != template_vals[:iecc_year])
+ next
+ end
+ if row.key?('Dependency=Template Month') && (row['Dependency=Template Month'] != template_vals[:t_month])
+ next
+ end
+ if row.key?('Dependency=Template Year') && (row['Dependency=Template Year'] != template_vals[:t_year])
+ next
+ end
+
+ row.delete('Dependency=Climate Zone')
+ row.delete('Dependency=IECC Year')
+ row.delete('Dependency=Template Month')
+ row.delete('Dependency=Template Year')
+
+ row.each do |k, v|
+ next unless v.nil?
+
+ row.delete(k)
+ end
+
+ intersection = args.keys & row.keys
+ return row if intersection.empty? # found the correct row
+
+ skip = false
+ intersection.each do |k|
+ if args[k] != row[k]
+ skip = true
+ end
+ end
+
+ return row unless skip
+ end
+ return nil
+end
diff --git a/example_files/mappers/residential/util.rb b/example_files/mappers/residential/util.rb
new file mode 100644
index 00000000..31aa7317
--- /dev/null
+++ b/example_files/mappers/residential/util.rb
@@ -0,0 +1,276 @@
+# *********************************************************************************
+# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
+# *********************************************************************************
+
+
+def residential(scenario, feature, args, building_type)
+ '''Assign arguments from geojson file.'''
+
+ # Schedules
+ feature_ids = []
+ scenario.feature_file.features.each do |f|
+ feature_ids << f.id
+ end
+
+ # BuildResidentialModel arguments
+ args[:hpxml_path] = '../feature.xml'
+ args[:output_dir] = '..'
+ args[:feature_id] = feature.id
+ args[:schedules_type] = 'stochastic' # smooth or stochastic
+ args[:schedules_random_seed] = feature_ids.index(feature.id)
+ args[:schedules_variation] = 'unit' # building or unit
+ args[:geometry_num_floors_above_grade] = feature.number_of_stories_above_ground
+
+ # Optionals
+ number_of_residential_units = 1
+ begin
+ number_of_residential_units = feature.number_of_residential_units
+ rescue StandardError
+ end
+ args[:geometry_building_num_units] = number_of_residential_units
+
+ begin
+ args[:hpxml_dir] = feature.hpxml_directory
+ return
+ rescue StandardError
+ end
+
+ timestep = 60
+ begin
+ timestep = 60 / feature.timesteps_per_hour
+ rescue StandardError
+ end
+
+ run_period = 'Jan 1 - Dec 31'
+ calendar_year = 2007
+ begin
+ abbr_monthnames = Date::ABBR_MONTHNAMES
+ begin_month = abbr_monthnames[feature.begin_date[5, 2].to_i]
+ begin_day_of_month = feature.begin_date[8, 2].to_i
+ end_month = abbr_monthnames[feature.end_date[5, 2].to_i]
+ end_day_of_month = feature.end_date[8, 2].to_i
+ run_period = "#{begin_month} #{begin_day_of_month} - #{end_month} #{end_day_of_month}"
+ calendar_year = feature.begin_date[0, 4].to_i
+ rescue StandardError
+ end
+
+ occupancy_calculation_type = nil
+ begin
+ occupancy_calculation_type = feature.occupancy_calculation_type
+ rescue StandardError
+ end
+
+ number_of_occupants = nil
+ begin
+ number_of_occupants = feature.number_of_occupants
+ rescue StandardError
+ end
+
+ maximum_roof_height = 8.0
+ begin
+ maximum_roof_height = feature.maximum_roof_height
+ rescue StandardError
+ end
+
+ roof_type = 'Gable'
+ begin
+ roof_type = feature.roof_type
+ rescue StandardError
+ end
+
+ geometry_unit_orientation = nil
+ begin
+ geometry_unit_orientation = feature.geometry_unit_orientation
+ rescue StandardError
+ end
+
+ geometry_unit_aspect_ratio = nil
+ begin
+ geometry_unit_aspect_ratio = feature.geometry_unit_aspect_ratio
+ rescue StandardError
+ end
+
+ onsite_parking_fraction = false
+ begin
+ onsite_parking_fraction = feature.onsite_parking_fraction
+ rescue StandardError
+ end
+
+ # Apply residential
+ residential_simulation(args, timestep, run_period, calendar_year, feature.weather_filename)
+ residential_geometry_unit(args, building_type, feature.floor_area, feature.number_of_bedrooms, geometry_unit_orientation, geometry_unit_aspect_ratio, occupancy_calculation_type, number_of_occupants, maximum_roof_height)
+ residential_geometry_foundation(args, feature.foundation_type)
+ residential_geometry_attic(args, feature.attic_type, roof_type)
+ residential_geometry_garage(args, onsite_parking_fraction)
+ residential_geometry_neighbor(args)
+ residential_hvac(args, feature.system_type, feature.heating_system_fuel_type)
+ residential_appliances(args)
+end
+
+def residential_simulation(args, timestep, run_period, calendar_year, weather_filename)
+ args[:simulation_control_timestep] = timestep
+ args[:simulation_control_run_period] = run_period
+ args[:simulation_control_run_period_calendar_year] = calendar_year
+ args[:weather_station_epw_filepath] = "../../../weather/#{weather_filename}"
+end
+
+def residential_geometry_unit(args, building_type, floor_area, number_of_bedrooms, geometry_unit_orientation, geometry_unit_aspect_ratio, occupancy_calculation_type, number_of_occupants, maximum_roof_height)
+ number_of_stories_above_ground = args[:geometry_num_floors_above_grade]
+ args[:geometry_unit_num_floors_above_grade] = 1
+ case building_type
+ when 'Single-Family Detached'
+ args[:geometry_building_num_units] = 1
+ args[:geometry_unit_type] = 'single-family detached'
+ args[:geometry_unit_num_floors_above_grade] = number_of_stories_above_ground
+ when 'Single-Family Attached'
+ args[:geometry_unit_type] = 'single-family attached'
+ args[:geometry_unit_num_floors_above_grade] = number_of_stories_above_ground
+ args[:air_leakage_type] = 'unit exterior only'
+ when 'Multifamily'
+ args[:geometry_unit_type] = 'apartment unit'
+ args[:air_leakage_type] = 'unit exterior only'
+ end
+
+ args[:geometry_unit_cfa] = floor_area / args[:geometry_building_num_units]
+
+ args[:geometry_unit_num_bedrooms] = number_of_bedrooms / args[:geometry_building_num_units]
+
+ # Geometry Orientation and Aspect Ratio
+ # Orientation (North=0, East=90, South=180, West=270)
+ args[:geometry_unit_orientation] = geometry_unit_orientation if !geometry_unit_orientation.nil?
+
+ # Aspect Ratio
+ # The ratio of front/back wall length to left/right wall length for the unit, excluding any protruding garage wall area.
+ args[:geometry_unit_aspect_ratio] = geometry_unit_aspect_ratio if !geometry_unit_aspect_ratio.nil?
+
+ # Occupancy Calculation Type
+ if occupancy_calculation_type == 'operational'
+ # set args[:geometry_unit_num_occupants]
+ begin
+ args[:geometry_unit_num_occupants] = number_of_occupants / args[:geometry_building_num_units]
+ rescue StandardError # number_of_occupants is not defined: assume equal to number of bedrooms
+ args[:geometry_unit_num_occupants] = args[:geometry_unit_num_bedrooms]
+ end
+ else # nil or asset
+ # do not set args[:geometry_unit_num_occupants]
+ end
+
+ args[:geometry_average_ceiling_height] = maximum_roof_height / number_of_stories_above_ground
+end
+
+def residential_geometry_foundation(args, foundation_type)
+ args[:geometry_foundation_type] = 'SlabOnGrade'
+ args[:geometry_foundation_height] = 0.0
+ case foundation_type
+ when 'crawlspace - vented'
+ args[:geometry_foundation_type] = 'VentedCrawlspace'
+ args[:geometry_foundation_height] = 3.0
+ when 'crawlspace - unvented'
+ args[:geometry_foundation_type] = 'UnventedCrawlspace'
+ args[:geometry_foundation_height] = 3.0
+ when 'crawlspace - conditioned'
+ args[:geometry_foundation_type] = 'ConditionedCrawlspace'
+ args[:geometry_foundation_height] = 3.0
+ when 'basement - unconditioned'
+ args[:geometry_foundation_type] = 'UnconditionedBasement'
+ args[:geometry_foundation_height] = 8.0
+ when 'basement - conditioned'
+ args[:geometry_foundation_type] = 'ConditionedBasement'
+ args[:geometry_foundation_height] = 8.0
+ when 'ambient'
+ args[:geometry_foundation_type] = 'Ambient'
+ args[:geometry_foundation_height] = 8.0
+ end
+end
+
+def residential_geometry_attic(args, attic_type, roof_type)
+ begin
+ case attic_type
+ when 'attic - vented'
+ args[:geometry_attic_type] = 'VentedAttic'
+ when 'attic - unvented'
+ args[:geometry_attic_type] = 'UnventedAttic'
+ when 'attic - conditioned'
+ args[:geometry_attic_type] = 'ConditionedAttic'
+ when 'flat roof'
+ args[:geometry_attic_type] = 'FlatRoof'
+ end
+ rescue StandardError
+ end
+
+ case roof_type
+ when 'Gable'
+ args[:geometry_roof_type] = 'gable'
+ when 'Hip'
+ args[:geometry_roof_type] = 'hip'
+ end
+end
+
+def residential_geometry_garage(args, onsite_parking_fraction)
+ num_garage_spaces = 0
+ if onsite_parking_fraction
+ num_garage_spaces = 1
+ if args[:geometry_unit_cfa] > 2500.0
+ num_garage_spaces = 2
+ end
+ end
+ args[:geometry_garage_width] = 12.0 * num_garage_spaces
+ args[:geometry_garage_protrusion] = 1.0
+end
+
+def residential_geometry_neighbor(args)
+ args[:neighbor_left_distance] = 0.0
+ args[:neighbor_right_distance] = 0.0
+end
+
+def residential_hvac(args, system_type, heating_system_fuel_type)
+ system_type = 'Residential - furnace and central air conditioner'
+ begin
+ system_type = system_type
+ rescue StandardError
+ end
+
+ args[:heating_system_type] = 'none'
+ if system_type.include?('electric resistance')
+ args[:heating_system_type] = 'ElectricResistance'
+ elsif system_type.include?('furnace')
+ args[:heating_system_type] = 'Furnace'
+ elsif system_type.include?('boiler')
+ args[:heating_system_type] = 'Boiler'
+ end
+
+ args[:cooling_system_type] = 'none'
+ if system_type.include?('central air conditioner')
+ args[:cooling_system_type] = 'central air conditioner'
+ elsif system_type.include?('room air conditioner')
+ args[:cooling_system_type] = 'room air conditioner'
+ elsif system_type.include?('evaporative cooler')
+ args[:cooling_system_type] = 'evaporative cooler'
+ end
+
+ args[:heat_pump_type] = 'none'
+ if system_type.include?('air-to-air')
+ args[:heat_pump_type] = 'air-to-air'
+ elsif system_type.include?('mini-split')
+ args[:heat_pump_type] = 'mini-split'
+ elsif system_type.include?('ground-to-air')
+ args[:heat_pump_type] = 'ground-to-air'
+ end
+
+ args[:heating_system_fuel] = 'natural gas'
+ begin
+ args[:heating_system_fuel] = heating_system_fuel_type
+ rescue StandardError
+ end
+
+ if args[:heating_system_type] == 'ElectricResistance'
+ args[:heating_system_fuel] = 'electricity'
+ end
+end
+
+def residential_appliances(args)
+ args[:cooking_range_oven_fuel_type] = args[:heating_system_fuel]
+ args[:clothes_dryer_fuel_type] = args[:heating_system_fuel]
+ args[:water_heater_fuel_type] = args[:heating_system_fuel]
+end
diff --git a/example_files/measures/BuildResidentialModel/measure.rb b/example_files/measures/BuildResidentialModel/measure.rb
index 5d74d40a..ac6b0965 100644
--- a/example_files/measures/BuildResidentialModel/measure.rb
+++ b/example_files/measures/BuildResidentialModel/measure.rb
@@ -1,3 +1,8 @@
+# *********************************************************************************
+# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
+# *********************************************************************************
+
# see the URL below for information on how to write OpenStudio measures
# http://nrel.github.io/OpenStudio-user-documentation/measures/measure_writing_guide/
@@ -63,8 +68,13 @@ def arguments(model)
args << arg
arg = OpenStudio::Measure::OSArgument.makeStringArgument('hpxml_dir', false)
- arg.setDisplayName('Custom HPXML Files')
- arg.setDescription('The name of the folder containing HPXML files, relative to the xml_building folder.')
+ arg.setDisplayName('Folder Containing Custom HPXML File')
+ arg.setDescription('The name of the folder containing a custom HPXML file, relative to the xml_building folder.')
+ args << arg
+
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('output_dir', true)
+ arg.setDisplayName('Directory for Output Files')
+ arg.setDescription('Absolute/relative path for the output files directory.')
args << arg
measures_dir = File.absolute_path(File.join(File.dirname(__FILE__), '../../resources/hpxml-measures'))
@@ -73,8 +83,6 @@ def arguments(model)
measure = get_measure_instance(full_measure_path)
measure.arguments(model).each do |arg|
- next if ['hpxml_path'].include? arg.name
-
args << arg
end
@@ -95,72 +103,76 @@ def run(model, runner, user_arguments)
# optionals: get or remove
args.each_key do |arg|
- # TODO: how to check if arg is an optional or not?
-
if args[arg].is_initialized
args[arg] = args[arg].get
else
args.delete(arg)
end
- rescue StandardError
+ rescue StandardError # this is needed for when args[arg] is actually a value
end
- # get file/dir paths
+ # get hpxml-measures directory
resources_dir = File.absolute_path(File.join(File.dirname(__FILE__), '../../resources'))
-
- # apply HPXML measures
measures_dir = File.join(resources_dir, 'hpxml-measures')
check_dir_exists(measures_dir, runner)
- # these will get added back in by unit_model
- model.getBuilding.remove
- model.getShadowCalculation.remove
- model.getSimulationControl.remove
- model.getSite.remove
- model.getTimestep.remove
-
# either create units or get pre-made units
if args[:hpxml_dir].nil?
units = get_unit_positions(runner, args)
if units.empty?
return false
end
+
+ standards_number_of_living_units = units.size
else
- hpxml_dir = File.join(File.dirname(__FILE__), "../../xml_building/#{args[:hpxml_dir]}")
+ xml_building_folder = "xml_building"
+ hpxml_dir = File.join(File.dirname(__FILE__), "../../#{xml_building_folder}/#{args[:hpxml_dir]}")
if !File.exist?(hpxml_dir)
- runner.registerError("HPXML directory #{File.expand_path(hpxml_dir)} was specified for feature ID = #{args[:feature_id]}, but could not be found.")
+ runner.registerError("HPXML directory '#{File.join(xml_building_folder, File.basename(hpxml_dir))}' was specified for feature ID = #{args[:feature_id]}, but could not be found.")
return false
end
units = []
- Dir["#{hpxml_dir}/*.xml"].each do |hpxml_path|
- name, ext = File.basename(hpxml_path).split('.')
- units << { 'name' => name, 'hpxml_path' => hpxml_path }
+ hpxml_paths = Dir["#{hpxml_dir}/*.xml"]
+ if hpxml_paths.size != 1
+ runner.registerError("HPXML directory '#{File.join(xml_building_folder, File.basename(hpxml_dir))}' must contain exactly 1 HPXML file; the single file can describe multiple dwelling units of a feature.")
+ return false
+ end
+ hpxml_path = hpxml_paths[0]
+ units << { 'hpxml_path' => hpxml_path }
+
+ hpxml = HPXML.new(hpxml_path: hpxml_path, building_id: 'ALL')
+ standards_number_of_living_units = 0
+ hpxml.buildings.each do |hpxml_bldg|
+ number_of_units = 1
+ number_of_units = hpxml_bldg.building_construction.number_of_units if !hpxml_bldg.building_construction.number_of_units.nil?
+ standards_number_of_living_units += number_of_units
end
end
- standards_number_of_living_units = units.size
- if args[:hpxml_dir].nil? && args.key?(:geometry_building_num_units) && (standards_number_of_living_units != Integer(args[:geometry_building_num_units]))
- runner.registerError("The number of created units (#{units.size}) differs from the specified number of units (#{standards_number_of_living_units}).")
+ if args.key?(:geometry_building_num_units) && (standards_number_of_living_units != Integer(args[:geometry_building_num_units]))
+ runner.registerError("The number of actual dwelling units (#{standards_number_of_living_units}) differs from the specified number of units (#{Integer(args[:geometry_building_num_units])}).")
return false
end
+ hpxml_path = File.expand_path(args[:hpxml_path])
units.each_with_index do |unit, unit_num|
- unit_model = OpenStudio::Model::Model.new
measures = {}
- hpxml_path = File.expand_path("../#{unit['name']}.xml")
- if !unit.key?('hpxml_path')
+ if !unit.key?('hpxml_path') # create a single new HPXML file describing all dwelling units of the feature
# BuildResidentialHPXML
measure_subdir = 'BuildResidentialHPXML'
full_measure_path = File.join(measures_dir, measure_subdir, 'measure.rb')
check_file_exists(full_measure_path, runner)
- measures[measure_subdir] = []
measure_args = args.clone.collect { |k, v| [k.to_s, v] }.to_h
measure_args['hpxml_path'] = hpxml_path
+ if unit_num > 0
+ measure_args['existing_hpxml_path'] = hpxml_path
+ measure_args['battery_present'] = 'false' # limitation of OS-HPXML
+ end
begin
measure_args['software_info_program_used'] = File.basename(File.absolute_path(File.join(File.dirname(__FILE__), '../../..')))
rescue StandardError
@@ -178,155 +190,103 @@ def run(model, runner, user_arguments)
measure_args['geometry_foundation_type'] = unit['geometry_foundation_type'] if unit.key?('geometry_foundation_type')
measure_args['geometry_attic_type'] = unit['geometry_attic_type'] if unit.key?('geometry_attic_type')
measure_args['geometry_unit_orientation'] = unit['geometry_unit_orientation'] if unit.key?('geometry_unit_orientation')
- measure_args.delete('feature_id')
- measure_args.delete('schedules_type')
- measure_args.delete('schedules_random_seed')
- measure_args.delete('schedules_variation')
- measure_args.delete('geometry_num_floors_above_grade')
- measures[measure_subdir] << measure_args
- else
+ # don't assign these to BuildResidentialHPXML
+ measure = get_measure_instance(full_measure_path)
+ arg_names = measure.arguments(model).collect { |arg| arg.name.to_sym }
+ args_to_delete = args.keys - arg_names
+ args_to_delete.each do |arg_to_delete|
+ measure_args.delete(arg_to_delete.to_s)
+ end
+
+ measures[measure_subdir] = [measure_args]
+
+ if !apply_measures(measures_dir, measures, runner, model, true, 'OpenStudio::Measure::ModelMeasure', 'feature.osw')
+ return false
+ end
+ else # we're using an HPXML file from the xml_building folder
FileUtils.cp(File.expand_path(unit['hpxml_path']), hpxml_path)
+
end
+ end # end units.each_with_index do |unit, unit_num|
+
+ # call BuildResidentialScheduleFile / HPXMLtoOpenStudio after HPXML file is created
+ measures = {}
- # BuildResidentialScheduleFile
+ # BuildResidentialScheduleFile
+ if args[:schedules_type] == 'stochastic' # if smooth, don't run the measure; schedules type stochastic currently hardcoded in Baseline.rb
measure_subdir = 'BuildResidentialScheduleFile'
full_measure_path = File.join(measures_dir, measure_subdir, 'measure.rb')
check_file_exists(full_measure_path, runner)
- measures[measure_subdir] = []
measure_args = {}
measure_args['hpxml_path'] = hpxml_path
measure_args['hpxml_output_path'] = hpxml_path
- measure_args['schedules_random_seed'] = args[:schedules_random_seed] # variation by building; deterministic
- if args[:schedules_variation] == 'unit'
- measure_args['schedules_random_seed'] *= (unit_num + 1) # variation across units; deterministic
- end
- measure_args['output_csv_path'] = File.expand_path("../#{unit['name']}.csv")
+ measure_args['schedules_random_seed'] = args[:schedules_random_seed]
+ measure_args['building_id'] = 'ALL' # FIXME: schedules variation by building currently not supported; by unit currently hardcoded in Baseline.rb
+ measure_args['output_csv_path'] = 'schedules.csv'
- measures[measure_subdir] << measure_args if args[:schedules_type] == 'stochastic' # only run BuildResidentialScheduleFile measure if stochastic; if smooth, don't run the measure
+ measures[measure_subdir] = [measure_args]
+ end
- # HPXMLtoOpenStudio
- measure_subdir = 'HPXMLtoOpenStudio'
- full_measure_path = File.join(measures_dir, measure_subdir, 'measure.rb')
- check_file_exists(full_measure_path, runner)
- measures[measure_subdir] = []
+ # HPXMLtoOpenStudio
+ measure_subdir = 'HPXMLtoOpenStudio'
+ full_measure_path = File.join(measures_dir, measure_subdir, 'measure.rb')
+ check_file_exists(full_measure_path, runner)
- measure_args = {}
- measure_args['hpxml_path'] = hpxml_path
- measure_args['output_dir'] = File.expand_path('..')
- measure_args['debug'] = true
+ measure_args = {}
+ measure_args['hpxml_path'] = hpxml_path
+ measure_args['output_dir'] = File.expand_path(args[:output_dir])
+ measure_args['debug'] = true
+ measure_args['building_id'] = 'ALL'
- measures[measure_subdir] << measure_args
+ measures[measure_subdir] = [measure_args]
- # if !apply_child_measures(measures_dir, measures, runner, unit_model, workflow_json, "#{unit['name']}.osw", true)
- if !apply_measures(measures_dir, measures, runner, unit_model, true, 'OpenStudio::Measure::ModelMeasure', "#{unit['name']}.osw")
- return false
- end
+ if !apply_measures(measures_dir, measures, runner, model, true, 'OpenStudio::Measure::ModelMeasure', 'feature.osw')
+ return false
+ end
- # store metadata for default feature reports measure
- standards_number_of_above_ground_stories = Integer(args[:geometry_num_floors_above_grade])
- standards_number_of_stories = Integer(args[:geometry_num_floors_above_grade])
- number_of_conditioned_stories = Integer(args[:geometry_num_floors_above_grade])
- if ['UnconditionedBasement', 'ConditionedBasement'].include?(args[:geometry_foundation_type])
- standards_number_of_stories += 1
- if ['ConditionedBasement'].include?(args[:geometry_foundation_type])
- number_of_conditioned_stories += 1
- end
+ # store metadata for default_feature_reports measure
+ standards_number_of_above_ground_stories = Integer(args[:geometry_num_floors_above_grade])
+ standards_number_of_stories = Integer(args[:geometry_num_floors_above_grade])
+ number_of_conditioned_stories = Integer(args[:geometry_num_floors_above_grade])
+ if ['UnconditionedBasement', 'ConditionedBasement'].include?(args[:geometry_foundation_type])
+ standards_number_of_stories += 1
+ if ['ConditionedBasement'].include?(args[:geometry_foundation_type])
+ number_of_conditioned_stories += 1
end
+ end
- case args[:geometry_unit_type]
- when 'single-family detached'
- building_type = 'Single-Family Detached'
- when 'single-family attached'
- building_type = 'Single-Family Attached'
- when 'apartment unit'
- building_type = 'Multifamily'
- end
+ case args[:geometry_unit_type]
+ when 'single-family detached'
+ building_type = 'Single-Family Detached'
+ when 'single-family attached'
+ building_type = 'Single-Family Attached'
+ when 'apartment unit'
+ building_type = 'Multifamily'
+ end
- unit_model.getSpaces.each do |unit_space|
- unit_space_type = OpenStudio::Model::SpaceType.new(unit_model)
- unit_space_type.setStandardsSpaceType(unit_space.name.to_s)
- unit_space.setSpaceType(unit_space_type)
- end
+ model.getSpaces.each do |space|
+ space_type = OpenStudio::Model::SpaceType.new(model)
+ space_type.setStandardsSpaceType(space.name.to_s)
+ space.setSpaceType(space_type)
+ end
- unit_model.getSpaceTypes.each do |space_type|
- next unless space_type.standardsSpaceType.is_initialized
- next if !space_type.standardsSpaceType.get.include?('living space')
+ model.getSpaceTypes.each do |space_type|
+ next unless space_type.standardsSpaceType.is_initialized
+ # set building_type on SpaceType for conditioned spaces to populate space_type_areas hash in default_feature_reports
+ if space_type.standardsSpaceType.get.include?('conditioned space') || space_type.standardsSpaceType.get.include?('conditioned_space')
space_type.setStandardsBuildingType(building_type)
end
-
- unit_model.getBuilding.setStandardsBuildingType('Residential')
- unit_model.getBuilding.setStandardsNumberOfAboveGroundStories(standards_number_of_above_ground_stories)
- unit_model.getBuilding.setStandardsNumberOfStories(standards_number_of_stories)
- unit_model.getBuilding.setNominalFloortoFloorHeight(Float(args[:geometry_average_ceiling_height]))
- unit_model.getBuilding.setStandardsNumberOfLivingUnits(standards_number_of_living_units)
- unit_model.getBuilding.additionalProperties.setFeature('NumberOfConditionedStories', number_of_conditioned_stories)
-
- if unit_num == 0 # for the first building unit, add everything
-
- model.addObjects(unit_model.objects, true)
-
- else # for single-family attached and multifamily, add "almost" everything
-
- y_shift = 100.0 * unit_num # meters
-
- # shift the unit so it's not right on top of the previous one
- unit_model.getSpaces.sort.each do |space|
- space.setYOrigin(y_shift)
- end
-
- # shift shading surfaces
- m = OpenStudio::Matrix.new(4, 4, 0)
- m[0, 0] = 1
- m[1, 1] = 1
- m[2, 2] = 1
- m[3, 3] = 1
- m[1, 3] = y_shift
- t = OpenStudio::Transformation.new(m)
-
- unit_model.getShadingSurfaceGroups.each do |shading_surface_group|
- next if shading_surface_group.space.is_initialized # already got shifted
-
- shading_surface_group.shadingSurfaces.each do |shading_surface|
- shading_surface.setVertices(t * shading_surface.vertices)
- end
- end
-
- # prefix all objects with name using unit number. May be cleaner if source models are setup with unique names
- prefix_all_unit_model_objects(unit_model, unit)
-
- # we already have the following unique objects from the first building unit
- unit_model.getConvergenceLimits.remove
- unit_model.getOutputDiagnostics.remove
- unit_model.getRunPeriodControlDaylightSavingTime.remove
- unit_model.getShadowCalculation.remove
- unit_model.getSimulationControl.remove
- unit_model.getSiteGroundTemperatureDeep.remove
- unit_model.getSiteGroundTemperatureShallow.remove
- unit_model.getSite.remove
- unit_model.getInsideSurfaceConvectionAlgorithm.remove
- unit_model.getOutsideSurfaceConvectionAlgorithm.remove
- unit_model.getTimestep.remove
- unit_model.getFoundationKivaSettings.remove
- unit_model.getOutputJSON.remove
- unit_model.getOutputControlFiles.remove
- unit_model.getPerformancePrecisionTradeoffs.remove
-
- unit_model_objects = []
- unit_model.objects.each do |obj|
- unit_model_objects << obj unless obj.to_Building.is_initialized # if we remove this, we lose all thermal zones
- end
-
- model.addObjects(unit_model_objects, true)
-
- end
end
- # save the "re-composed" model with all building units to file
- building_path = File.expand_path(File.join('..', 'whole_building.osm'))
- model.save(building_path, true)
+ model.getBuilding.setStandardsBuildingType('Residential')
+ model.getBuilding.setStandardsNumberOfAboveGroundStories(standards_number_of_above_ground_stories)
+ model.getBuilding.setStandardsNumberOfStories(standards_number_of_stories)
+ model.getBuilding.setNominalFloortoFloorHeight(Float(args[:geometry_average_ceiling_height]))
+ model.getBuilding.setStandardsNumberOfLivingUnits(standards_number_of_living_units)
+ model.getBuilding.additionalProperties.setFeature('NumberOfConditionedStories', number_of_conditioned_stories)
return true
end
@@ -335,26 +295,23 @@ def get_unit_positions(runner, args)
units = []
case args[:geometry_unit_type]
when 'single-family detached'
- units << { 'name' => 'unit 1' }
+ units << {}
when 'single-family attached'
(1..args[:geometry_building_num_units]).to_a.each do |unit_num|
case unit_num
when 1
- units << { 'name' => "unit #{unit_num}",
- 'geometry_unit_left_wall_is_adiabatic' => true }
+ units << { 'geometry_unit_left_wall_is_adiabatic' => true }
when args[:geometry_building_num_units]
- units << { 'name' => "unit #{unit_num}",
- 'geometry_unit_right_wall_is_adiabatic' => true }
+ units << { 'geometry_unit_right_wall_is_adiabatic' => true }
else
- units << { 'name' => "unit #{unit_num}",
- 'geometry_unit_left_wall_is_adiabatic' => true,
+ units << { 'geometry_unit_left_wall_is_adiabatic' => true,
'geometry_unit_right_wall_is_adiabatic' => true }
end
end
when 'apartment unit'
num_units_per_floor = (Float(args[:geometry_building_num_units]) / Float(args[:geometry_num_floors_above_grade])).ceil
if num_units_per_floor == 1
- runner.registerError("num_units_per_floor='#{num_units_per_floor}' not supported.")
+ runner.registerError("Unit type '#{args[:geometry_unit_type]}' with num_units_per_floor=#{num_units_per_floor} is not supported.")
return units
end
@@ -406,8 +363,7 @@ def get_unit_positions(runner, args)
end
position += 1
- units << { 'name' => "unit #{unit_num}",
- 'geometry_unit_left_wall_is_adiabatic' => geometry_unit_left_wall_is_adiabatic,
+ units << { 'geometry_unit_left_wall_is_adiabatic' => geometry_unit_left_wall_is_adiabatic,
'geometry_unit_right_wall_is_adiabatic' => geometry_unit_right_wall_is_adiabatic,
'geometry_unit_front_wall_is_adiabatic' => geometry_unit_front_wall_is_adiabatic,
'geometry_unit_back_wall_is_adiabatic' => geometry_unit_back_wall_is_adiabatic,
@@ -418,74 +374,6 @@ def get_unit_positions(runner, args)
end
return units
end
-
- def prefix_all_unit_model_objects(unit_model, unit)
- # EMS objects
- ems_map = {}
-
- unit_model.getEnergyManagementSystemSensors.each do |sensor|
- old_sensor_name = sensor.name.to_s
- new_sensor_name = make_variable_name("#{unit['name']}_#{sensor.name}")
-
- ems_map[old_sensor_name] = new_sensor_name
-
- old_sensor_key_name = sensor.keyName.to_s
- new_sensor_key_name = make_variable_name("#{unit['name']}_#{sensor.keyName}") unless sensor.keyName.empty?
- sensor.setKeyName(new_sensor_key_name) unless sensor.keyName.empty?
- end
-
- unit_model.getEnergyManagementSystemActuators.each do |actuator|
- old_actuator_name = actuator.name.to_s
- new_actuator_name = make_variable_name("#{unit['name']}_#{actuator.name}")
-
- ems_map[old_actuator_name] = new_actuator_name
- end
-
- unit_model.getEnergyManagementSystemOutputVariables.each do |output_variable|
- next if output_variable.emsVariableObject.is_initialized
-
- old_ems_variable_name = output_variable.emsVariableName.to_s
- new_ems_variable_name = make_variable_name("#{unit['name']}_#{output_variable.emsVariableName}")
-
- ems_map[old_ems_variable_name] = new_ems_variable_name
- output_variable.setEMSVariableName(new_ems_variable_name)
- end
-
- # variables in program lines don't get updated automatically
- characters = ['', ' ', ',', '(', ')', '+', '-', '*', '/', ';']
- unit_model.getEnergyManagementSystemPrograms.each do |program|
- old_program_name = program.name.to_s
- new_program_name = make_variable_name("#{unit['name']}_#{program.name}")
-
- new_lines = []
- program.lines.each_with_index do |line, i|
- ems_map.each do |old_name, new_name|
- # old_name between at least 1 character, with the exception of '' on left and ' ' on right
- characters.each do |lhs|
- characters.each do |rhs|
- next if lhs == '' && ['', ' '].include?(rhs)
-
- line = line.gsub("#{lhs}#{old_name}#{rhs}", "#{lhs}#{new_name}#{rhs}") if line.include?("#{lhs}#{old_name}#{rhs}")
- end
- end
- end
- new_lines << line
- end
- program.setLines(new_lines)
- end
-
- # All model objects
- unit_model.objects.each do |model_object|
- next if model_object.name.nil?
-
- new_model_object_name = make_variable_name("#{unit['name']}_#{model_object.name}")
- model_object.setName(new_model_object_name)
- end
- end
-
- def make_variable_name(str)
- return str.gsub(' ', '_').gsub('-', '_')
- end
end
# register the measure to be used by the application
diff --git a/example_files/measures/BuildResidentialModel/measure.xml b/example_files/measures/BuildResidentialModel/measure.xml
index 9afc20bf..5c1b4228 100644
--- a/example_files/measures/BuildResidentialModel/measure.xml
+++ b/example_files/measures/BuildResidentialModel/measure.xml
@@ -3,8 +3,8 @@
3.1
build_residential_model
259dc35f-65e8-47d4-913f-69efede5a267
- 62a1cfcd-d73a-4ea0-80e6-9c045acf63e7
- 2023-07-13T21:29:35Z
+ 43b14be0-3b56-4458-b665-1d6c4fa747af
+ 2023-12-18T21:19:53Z
2C38F48B
BuildResidentialModel
Build Residential Model
@@ -76,8 +76,32 @@
hpxml_dir
- Custom HPXML Files
- The name of the folder containing HPXML files, relative to the xml_building folder.
+ Folder Containing Custom HPXML File
+ The name of the folder containing a custom HPXML file, relative to the xml_building folder.
+ String
+ false
+ false
+
+
+ output_dir
+ Directory for Output Files
+ Absolute/relative path for the output files directory.
+ String
+ true
+ false
+
+
+ hpxml_path
+ HPXML File Path
+ Absolute/relative path of the HPXML file.
+ String
+ true
+ false
+
+
+ existing_hpxml_path
+ Existing HPXML File Path
+ Absolute/relative path of the existing HPXML file. If not provided, a new HPXML file with one Building element is created. If provided, a new Building element will be appended to this HPXML file (e.g., to create a multifamily HPXML file describing multiple dwelling units).
String
false
false
@@ -147,7 +171,7 @@
simulation_control_timestep
Simulation Control: Timestep
- Value must be a divisor of 60. If not provided, the OS-HPXML default is used.
+ Value must be a divisor of 60. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.
Integer
min
false
@@ -156,7 +180,7 @@
simulation_control_run_period
Simulation Control: Run Period
- Enter a date like "Jan 1 - Dec 31". If not provided, the OS-HPXML default is used.
+ Enter a date like 'Jan 1 - Dec 31'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.
String
false
false
@@ -164,7 +188,7 @@
simulation_control_run_period_calendar_year
Simulation Control: Run Period Calendar Year
- This numeric field should contain the calendar year that determines the start day of week. If you are running simulations using AMY weather files, the value entered for calendar year will not be used; it will be overridden by the actual year found in the AMY weather file. If not provided, the OS-HPXML default is used.
+ This numeric field should contain the calendar year that determines the start day of week. If you are running simulations using AMY weather files, the value entered for calendar year will not be used; it will be overridden by the actual year found in the AMY weather file. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.
Integer
year
false
@@ -173,7 +197,7 @@
simulation_control_daylight_saving_enabled
Simulation Control: Daylight Saving Enabled
- Whether to use daylight saving. If not provided, the OS-HPXML default is used.
+ Whether to use daylight saving. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-building-site'>HPXML Building Site</a>) is used.
Boolean
false
false
@@ -191,7 +215,7 @@
simulation_control_daylight_saving_period
Simulation Control: Daylight Saving Period
- Enter a date like "Mar 15 - Dec 15". If not provided, the OS-HPXML default is used.
+ Enter a date like 'Mar 15 - Dec 15'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-building-site'>HPXML Building Site</a>) is used.
String
false
false
@@ -199,7 +223,7 @@
simulation_control_temperature_capacitance_multiplier
Simulation Control: Temperature Capacitance Multiplier
- Affects the transient calculation of indoor air temperatures. If not provided, the OS-HPXML default is used.
+ Affects the transient calculation of indoor air temperatures. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.
String
false
false
@@ -207,7 +231,7 @@
site_type
Site: Type
- The type of site. If not provided, the OS-HPXML default is used.
+ The type of site. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Choice
false
false
@@ -229,7 +253,7 @@
site_shielding_of_home
Site: Shielding of Home
- Presence of nearby buildings, trees, obstructions for infiltration model. If not provided, the OS-HPXML default is used.
+ Presence of nearby buildings, trees, obstructions for infiltration model. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Choice
false
false
@@ -251,7 +275,7 @@
site_ground_conductivity
Site: Ground Conductivity
- Conductivity of the ground soil. If not provided, the OS-HPXML default is used.
+ Conductivity of the ground soil. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Double
Btu/hr-ft-F
false
@@ -595,6 +619,14 @@
false
false
+
+ unit_multiplier
+ Building Construction: Unit Multiplier
+ The number of similar dwelling units. EnergyPlus simulation results will be multiplied this value. If not provided, defaults to 1.
+ Integer
+ false
+ false
+
geometry_unit_type
Geometry: Unit Type
@@ -616,6 +648,10 @@
apartment unit
apartment unit
+
+ manufactured home
+ manufactured home
+
@@ -747,7 +783,7 @@
geometry_unit_num_bathrooms
Geometry: Unit Number of Bathrooms
- The number of bathrooms in the unit. If not provided, the OS-HPXML default is used.
+ The number of bathrooms in the unit. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-building-construction'>HPXML Building Construction</a>) is used.
Integer
#
false
@@ -804,7 +840,7 @@
geometry_garage_protrusion
Geometry: Garage Protrusion
- The fraction of the garage that is protruding from the living space. Only applies to single-family detached units.
+ The fraction of the garage that is protruding from the conditioned space. Only applies to single-family detached units.
Double
Frac
true
@@ -871,6 +907,14 @@
AboveApartment
AboveApartment
+
+ BellyAndWingWithSkirt
+ BellyAndWingWithSkirt
+
+
+ BellyAndWingNoSkirt
+ BellyAndWingNoSkirt
+
@@ -1064,7 +1108,7 @@
neighbor_front_height
Neighbor: Front Height
- The height of the neighboring building to the front. If not provided, the OS-HPXML default is used.
+ The height of the neighboring building to the front. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Double
ft
false
@@ -1073,7 +1117,7 @@
neighbor_back_height
Neighbor: Back Height
- The height of the neighboring building to the back. If not provided, the OS-HPXML default is used.
+ The height of the neighboring building to the back. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Double
ft
false
@@ -1082,7 +1126,7 @@
neighbor_left_height
Neighbor: Left Height
- The height of the neighboring building to the left. If not provided, the OS-HPXML default is used.
+ The height of the neighboring building to the left. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Double
ft
false
@@ -1091,7 +1135,7 @@
neighbor_right_height
Neighbor: Right Height
- The height of the neighboring building to the right. If not provided, the OS-HPXML default is used.
+ The height of the neighboring building to the right. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Double
ft
false
@@ -1147,7 +1191,7 @@
foundation_wall_type
Foundation Wall: Type
- The material type of the foundation wall. If not provided, the OS-HPXML default is used.
+ The material type of the foundation wall. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.
Choice
false
false
@@ -1189,7 +1233,7 @@
foundation_wall_thickness
Foundation Wall: Thickness
- The thickness of the foundation wall. If not provided, the OS-HPXML default is used.
+ The thickness of the foundation wall. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.
Double
in
false
@@ -1228,7 +1272,7 @@
foundation_wall_insulation_distance_to_top
Foundation Wall: Insulation Distance To Top
- The distance from the top of the foundation wall to the top of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default is used.
+ The distance from the top of the foundation wall to the top of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.
Double
ft
false
@@ -1237,7 +1281,7 @@
foundation_wall_insulation_distance_to_bottom
Foundation Wall: Insulation Distance To Bottom
- The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default is used.
+ The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.
Double
ft
false
@@ -1304,7 +1348,7 @@
slab_thickness
Slab: Thickness
- The thickness of the slab. Zero can be entered if there is a dirt floor instead of a slab. If not provided, the OS-HPXML default is used.
+ The thickness of the slab. Zero can be entered if there is a dirt floor instead of a slab. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-slabs'>HPXML Slabs</a>) is used.
Double
in
false
@@ -1313,7 +1357,7 @@
slab_carpet_fraction
Slab: Carpet Fraction
- Fraction of the slab floor area that is carpeted. If not provided, the OS-HPXML default is used.
+ Fraction of the slab floor area that is carpeted. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-slabs'>HPXML Slabs</a>) is used.
Double
Frac
false
@@ -1322,7 +1366,7 @@
slab_carpet_r
Slab: Carpet R-value
- R-value of the slab carpet. If not provided, the OS-HPXML default is used.
+ R-value of the slab carpet. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-slabs'>HPXML Slabs</a>) is used.
Double
h-ft^2-R/Btu
false
@@ -1341,7 +1385,7 @@
roof_material_type
Roof: Material Type
- The material type of the roof. If not provided, the OS-HPXML default is used.
+ The material type of the roof. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-roofs'>HPXML Roofs</a>) is used.
Choice
false
false
@@ -1387,7 +1431,7 @@
roof_color
Roof: Color
- The color of the roof. If not provided, the OS-HPXML default is used.
+ The color of the roof. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-roofs'>HPXML Roofs</a>) is used.
Choice
false
false
@@ -1446,11 +1490,10 @@
roof_radiant_barrier_grade
Roof: Radiant Barrier Grade
- The grade of the radiant barrier. If not provided, the OS-HPXML default is used.
+ The grade of the radiant barrier. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-roofs'>HPXML Roofs</a>) is used.
Choice
false
false
- 1
1
@@ -1524,7 +1567,7 @@
wall_siding_type
Wall: Siding Type
- The siding type of the walls. Also applies to rim joists. If not provided, the OS-HPXML default is used.
+ The siding type of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-walls'>HPXML Walls</a>) is used.
Choice
false
false
@@ -1578,7 +1621,7 @@
wall_color
Wall: Color
- The color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default is used.
+ The color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-walls'>HPXML Walls</a>) is used.
Choice
false
false
@@ -1708,7 +1751,7 @@
window_fraction_operable
Windows: Fraction Operable
- Fraction of windows that are operable. If not provided, the OS-HPXML default is used.
+ Fraction of windows that are operable. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Double
Frac
false
@@ -1717,7 +1760,7 @@
window_natvent_availability
Windows: Natural Ventilation Availability
- For operable windows, the number of days/week that windows can be opened by occupants for natural ventilation. If not provided, the OS-HPXML default is used.
+ For operable windows, the number of days/week that windows can be opened by occupants for natural ventilation. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Integer
Days/week
false
@@ -1745,7 +1788,7 @@
window_interior_shading_winter
Windows: Winter Interior Shading
- Interior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.
+ Interior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Double
Frac
false
@@ -1754,7 +1797,7 @@
window_interior_shading_summer
Windows: Summer Interior Shading
- Interior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.
+ Interior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Double
Frac
false
@@ -1763,7 +1806,7 @@
window_exterior_shading_winter
Windows: Winter Exterior Shading
- Exterior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.
+ Exterior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Double
Frac
false
@@ -1772,7 +1815,7 @@
window_exterior_shading_summer
Windows: Summer Exterior Shading
- Exterior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.
+ Exterior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Double
Frac
false
@@ -1781,7 +1824,7 @@
window_shading_summer_season
Windows: Shading Summer Season
- Enter a date like "May 1 - Sep 30". Defines the summer season for purposes of shading coefficients; the rest of the year is assumed to be winter. If not provided, the OS-HPXML default is used.
+ Enter a date like 'May 1 - Sep 30'. Defines the summer season for purposes of shading coefficients; the rest of the year is assumed to be winter. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
String
false
false
@@ -2092,7 +2135,7 @@
air_leakage_has_flue_or_chimney_in_conditioned_space
Air Leakage: Has Flue or Chimney in Conditioned Space
- Presence of flue or chimney with combustion air from conditioned space; used for infiltration model. If not provided, the OS-HPXML default is used.
+ Presence of flue or chimney with combustion air from conditioned space; used for infiltration model. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#flue-or-chimney'>Flue or Chimney</a>) is used.
Boolean
false
false
@@ -2145,17 +2188,13 @@
Stove
- PortableHeater
- PortableHeater
+ SpaceHeater
+ SpaceHeater
Fireplace
Fireplace
-
- FixedHeater
- FixedHeater
-
Shared Boiler w/ Baseboard
Shared Boiler w/ Baseboard
@@ -2218,7 +2257,7 @@
heating_system_heating_capacity
Heating System: Heating Capacity
- The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default is used.
+ The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-heating-systems'>HPXML Heating Systems</a>) is used.
Double
Btu/hr
false
@@ -2326,7 +2365,7 @@
cooling_system_cooling_compressor_type
Cooling System: Cooling Compressor Type
- The compressor type of the cooling system. Only applies to central air conditioner. If not provided, the OS-HPXML default is used.
+ The compressor type of the cooling system. Only applies to central air conditioner and mini-split. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#central-air-conditioner'>Central Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.
Choice
false
false
@@ -2348,7 +2387,7 @@
cooling_system_cooling_sensible_heat_fraction
Cooling System: Cooling Sensible Heat Fraction
- The sensible heat fraction of the cooling system. Ignored for evaporative cooler. If not provided, the OS-HPXML default is used.
+ The sensible heat fraction of the cooling system. Ignored for evaporative cooler. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#central-air-conditioner'>Central Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner'>Room Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.
Double
Frac
false
@@ -2357,7 +2396,7 @@
cooling_system_cooling_capacity
Cooling System: Cooling Capacity
- The output cooling capacity of the cooling system. If not provided, the OS-HPXML autosized default is used.
+ The output cooling capacity of the cooling system. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#central-air-conditioner'>Central Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner'>Room Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#evaporative-cooler'>Evaporative Cooler</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.
Double
Btu/hr
false
@@ -2413,7 +2452,7 @@
cooling_system_crankcase_heater_watts
Cooling System: Crankcase Heater Power Watts
- Cooling system crankcase heater power consumption in Watts. Applies only to central air conditioner, mini-split, packaged terminal air conditioner and room air conditioner. If not provided, the OS-HPXML default is used.
+ Cooling system crankcase heater power consumption in Watts. Applies only to central air conditioner, room air conditioner, packaged terminal air conditioner and mini-split. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#central-air-conditioner'>Central Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner'>Room Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.
Double
W
false
@@ -2469,7 +2508,7 @@
cooling_system_integrated_heating_system_capacity
Cooling System: Integrated Heating System Heating Capacity
- The output heating capacity of the heating system integrated into cooling system. If not provided, the OS-HPXML autosized default is used. Only used for packaged terminal air conditioner and room air conditioner.
+ The output heating capacity of the heating system integrated into cooling system. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner'>Room Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>) is used. Only used for room air conditioner and packaged terminal air conditioner.
Double
Btu/hr
false
@@ -2590,7 +2629,7 @@
heat_pump_cooling_compressor_type
Heat Pump: Cooling Compressor Type
- The compressor type of the heat pump. Only applies to air-to-air. If not provided, the OS-HPXML default is used.
+ The compressor type of the heat pump. Only applies to air-to-air and mini-split. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>) is used.
Choice
false
false
@@ -2612,7 +2651,7 @@
heat_pump_cooling_sensible_heat_fraction
Heat Pump: Cooling Sensible Heat Fraction
- The sensible heat fraction of the heat pump. If not provided, the OS-HPXML default is used.
+ The sensible heat fraction of the heat pump. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#ground-to-air-heat-pump'>Ground-to-Air Heat Pump</a>) is used.
Double
Frac
false
@@ -2621,7 +2660,7 @@
heat_pump_heating_capacity
Heat Pump: Heating Capacity
- The output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default is used.
+ The output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#ground-to-air-heat-pump'>Ground-to-Air Heat Pump</a>) is used.
Double
Btu/hr
false
@@ -2630,7 +2669,7 @@
heat_pump_heating_capacity_retention_fraction
Heat Pump: Heating Capacity Retention Fraction
- The output heating capacity of the heat pump at a user-specified temperature (e.g., 17F or 5F) divided by the above nominal heating capacity. Applies to all heat pump types except ground-to-air. If not provided, the OS-HPXML default is used.
+ The output heating capacity of the heat pump at a user-specified temperature (e.g., 17F or 5F) divided by the above nominal heating capacity. Applies to all heat pump types except ground-to-air. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>) is used.
Double
Frac
false
@@ -2648,7 +2687,7 @@
heat_pump_cooling_capacity
Heat Pump: Cooling Capacity
- The output cooling capacity of the heat pump. If not provided, the OS-HPXML autosized default is used.
+ The output cooling capacity of the heat pump. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#ground-to-air-heat-pump'>Ground-to-Air Heat Pump</a>) is used.
Double
Btu/hr
false
@@ -2677,7 +2716,7 @@
heat_pump_compressor_lockout_temp
Heat Pump: Compressor Lockout Temperature
- The temperature below which the heat pump compressor is disabled. If both this and Backup Heating Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies to all heat pump types other than ground-to-air. If not provided, the OS-HPXML default is used.
+ The temperature below which the heat pump compressor is disabled. If both this and Backup Heating Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies to all heat pump types other than ground-to-air. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>) is used.
Double
deg-F
false
@@ -2745,7 +2784,7 @@
heat_pump_backup_heating_capacity
Heat Pump: Backup Heating Capacity
- The backup output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default is used. Only applies if Backup Type is 'integrated'.
+ The backup output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#backup'>Backup</a>) is used. Only applies if Backup Type is 'integrated'.
Double
Btu/hr
false
@@ -2754,7 +2793,7 @@
heat_pump_backup_heating_lockout_temp
Heat Pump: Backup Heating Lockout Temperature
- The temperature above which the heat pump backup system is disabled. If both this and Compressor Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies for both Backup Type of 'integrated' and 'separate'. If not provided, the OS-HPXML default is used.
+ The temperature above which the heat pump backup system is disabled. If both this and Compressor Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies for both Backup Type of 'integrated' and 'separate'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#backup'>Backup</a>) is used.
Double
deg-F
false
@@ -2763,7 +2802,7 @@
heat_pump_sizing_methodology
Heat Pump: Sizing Methodology
- The auto-sizing methodology to use when the heat pump capacity is not provided. If not provided, the OS-HPXML default is used.
+ The auto-sizing methodology to use when the heat pump capacity is not provided. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-hvac-sizing-control'>HPXML HVAC Sizing Control</a>) is used.
Choice
false
false
@@ -2821,7 +2860,7 @@
heat_pump_crankcase_heater_watts
Heat Pump: Crankcase Heater Power Watts
- Heat Pump crankcase heater power consumption in Watts. Applies only to air-to-air, mini-split, packaged terminal heat pump and room air conditioner with reverse cycle. If not provided, the OS-HPXML default is used.
+ Heat Pump crankcase heater power consumption in Watts. Applies only to air-to-air, mini-split, packaged terminal heat pump and room air conditioner with reverse cycle. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>) is used.
Double
W
false
@@ -2865,17 +2904,13 @@
Stove
- PortableHeater
- PortableHeater
+ SpaceHeater
+ SpaceHeater
Fireplace
Fireplace
-
- FixedHeater
- FixedHeater
-
@@ -2930,7 +2965,7 @@
heating_system_2_heating_capacity
Heating System 2: Heating Capacity
- The output heating capacity of the second heating system. If not provided, the OS-HPXML autosized default is used.
+ The output heating capacity of the second heating system. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-heating-systems'>HPXML Heating Systems</a>) is used.
Double
Btu/hr
false
@@ -2985,7 +3020,7 @@
hvac_control_heating_season_period
HVAC Control: Heating Season Period
- Enter a date like 'Nov 1 - Jun 30'. If not provided, the OS-HPXML default is used. Can also provide 'BuildingAmerica' to use automatic seasons from the Building America House Simulation Protocols.
+ Enter a date like 'Nov 1 - Jun 30'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-hvac-control'>HPXML HVAC Control</a>) is used. Can also provide 'BuildingAmerica' to use automatic seasons from the Building America House Simulation Protocols.
String
false
false
@@ -2993,7 +3028,7 @@
hvac_control_cooling_season_period
HVAC Control: Cooling Season Period
- Enter a date like 'Jun 1 - Oct 31'. If not provided, the OS-HPXML default is used. Can also provide 'BuildingAmerica' to use automatic seasons from the Building America House Simulation Protocols.
+ Enter a date like 'Jun 1 - Oct 31'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-hvac-control'>HPXML HVAC Control</a>) is used. Can also provide 'BuildingAmerica' to use automatic seasons from the Building America House Simulation Protocols.
String
false
false
@@ -3042,14 +3077,14 @@
ducts_supply_location
Ducts: Supply Location
- The location of the supply ducts. If not provided, the OS-HPXML default is used.
+ The location of the supply ducts. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -3059,6 +3094,10 @@
basement - unconditioned
basement - unconditioned
+
+ crawlspace
+ crawlspace
+
crawlspace - vented
crawlspace - vented
@@ -3071,6 +3110,10 @@
crawlspace - conditioned
crawlspace - conditioned
+
+ attic
+ attic
+
attic - vented
attic - vented
@@ -3115,6 +3158,10 @@
other non-freezing space
other non-freezing space
+
+ manufactured home belly
+ manufactured home belly
+
@@ -3156,23 +3203,32 @@
ducts_supply_surface_area
Ducts: Supply Surface Area
- The surface area of the supply ducts. If not provided, the OS-HPXML default is used.
+ The supply ducts surface area in the given location. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
Double
ft^2
false
false
+
+ ducts_supply_surface_area_fraction
+ Ducts: Supply Area Fraction
+ The fraction of supply ducts surface area in the given location. Only used if Surface Area is not provided. If the fraction is less than 1, the remaining duct area is assumed to be in conditioned space. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
+ Double
+ frac
+ false
+ false
+
ducts_return_location
Ducts: Return Location
- The location of the return ducts. If not provided, the OS-HPXML default is used.
+ The location of the return ducts. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -3182,6 +3238,10 @@
basement - unconditioned
basement - unconditioned
+
+ crawlspace
+ crawlspace
+
crawlspace - vented
crawlspace - vented
@@ -3194,6 +3254,10 @@
crawlspace - conditioned
crawlspace - conditioned
+
+ attic
+ attic
+
attic - vented
attic - vented
@@ -3238,6 +3302,10 @@
other non-freezing space
other non-freezing space
+
+ manufactured home belly
+ manufactured home belly
+
@@ -3279,16 +3347,25 @@
ducts_return_surface_area
Ducts: Return Surface Area
- The surface area of the return ducts. If not provided, the OS-HPXML default is used.
+ The return ducts surface area in the given location. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
Double
ft^2
false
false
+
+ ducts_return_surface_area_fraction
+ Ducts: Return Area Fraction
+ The fraction of return ducts surface area in the given location. Only used if Surface Area is not provided. If the fraction is less than 1, the remaining duct area is assumed to be in conditioned space. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
+ Double
+ frac
+ false
+ false
+
ducts_number_of_return_registers
Ducts: Number of Return Registers
- The number of return registers of the ducts. Only used to calculate default return duct surface area. If not provided, the OS-HPXML default is used.
+ The number of return registers of the ducts. Only used to calculate default return duct surface area. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
Integer
#
false
@@ -3336,7 +3413,7 @@
mech_vent_flow_rate
Mechanical Ventilation: Flow Rate
- The flow rate of the mechanical ventilation. If not provided, the OS-HPXML default is used.
+ The flow rate of the mechanical ventilation. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#whole-ventilation-fan'>Whole Ventilation Fan</a>) is used.
Double
CFM
false
@@ -3345,7 +3422,7 @@
mech_vent_hours_in_operation
Mechanical Ventilation: Hours In Operation
- The hours in operation of the mechanical ventilation. If not provided, the OS-HPXML default is used.
+ The hours in operation of the mechanical ventilation. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#whole-ventilation-fan'>Whole Ventilation Fan</a>) is used.
Double
hrs/day
false
@@ -3393,7 +3470,7 @@
mech_vent_fan_power
Mechanical Ventilation: Fan Power
- The fan power of the mechanical ventilation. If not provided, the OS-HPXML default is used.
+ The fan power of the mechanical ventilation. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#whole-ventilation-fan'>Whole Ventilation Fan</a>) is used.
Double
W
false
@@ -3613,7 +3690,7 @@
kitchen_fans_quantity
Kitchen Fans: Quantity
- The quantity of the kitchen fans. If not provided, the OS-HPXML default is used.
+ The quantity of the kitchen fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Integer
#
false
@@ -3622,7 +3699,7 @@
kitchen_fans_flow_rate
Kitchen Fans: Flow Rate
- The flow rate of the kitchen fan. If not provided, the OS-HPXML default is used.
+ The flow rate of the kitchen fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
CFM
false
@@ -3631,7 +3708,7 @@
kitchen_fans_hours_in_operation
Kitchen Fans: Hours In Operation
- The hours in operation of the kitchen fan. If not provided, the OS-HPXML default is used.
+ The hours in operation of the kitchen fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
hrs/day
false
@@ -3640,7 +3717,7 @@
kitchen_fans_power
Kitchen Fans: Fan Power
- The fan power of the kitchen fan. If not provided, the OS-HPXML default is used.
+ The fan power of the kitchen fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
W
false
@@ -3649,7 +3726,7 @@
kitchen_fans_start_hour
Kitchen Fans: Start Hour
- The start hour of the kitchen fan. If not provided, the OS-HPXML default is used.
+ The start hour of the kitchen fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Integer
hr
false
@@ -3658,7 +3735,7 @@
bathroom_fans_quantity
Bathroom Fans: Quantity
- The quantity of the bathroom fans. If not provided, the OS-HPXML default is used.
+ The quantity of the bathroom fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Integer
#
false
@@ -3667,7 +3744,7 @@
bathroom_fans_flow_rate
Bathroom Fans: Flow Rate
- The flow rate of the bathroom fans. If not provided, the OS-HPXML default is used.
+ The flow rate of the bathroom fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
CFM
false
@@ -3676,7 +3753,7 @@
bathroom_fans_hours_in_operation
Bathroom Fans: Hours In Operation
- The hours in operation of the bathroom fans. If not provided, the OS-HPXML default is used.
+ The hours in operation of the bathroom fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
hrs/day
false
@@ -3685,7 +3762,7 @@
bathroom_fans_power
Bathroom Fans: Fan Power
- The fan power of the bathroom fans. If not provided, the OS-HPXML default is used.
+ The fan power of the bathroom fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
W
false
@@ -3694,7 +3771,7 @@
bathroom_fans_start_hour
Bathroom Fans: Start Hour
- The start hour of the bathroom fans. If not provided, the OS-HPXML default is used.
+ The start hour of the bathroom fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Integer
hr
false
@@ -3722,7 +3799,7 @@
whole_house_fan_flow_rate
Whole House Fan: Flow Rate
- The flow rate of the whole house fan. If not provided, the OS-HPXML default is used.
+ The flow rate of the whole house fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#whole-house-fan'>Whole House Fan</a>) is used.
Double
CFM
false
@@ -3731,7 +3808,7 @@
whole_house_fan_power
Whole House Fan: Fan Power
- The fan power of the whole house fan. If not provided, the OS-HPXML default is used.
+ The fan power of the whole house fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#whole-house-fan'>Whole House Fan</a>) is used.
Double
W
false
@@ -3810,14 +3887,14 @@
water_heater_location
Water Heater: Location
- The location of water heater. If not provided, the OS-HPXML default is used.
+ The location of water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-water-heating-systems'>HPXML Water Heating Systems</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -3831,6 +3908,10 @@
garage
garage
+
+ attic
+ attic
+
attic - vented
attic - vented
@@ -3839,6 +3920,10 @@
attic - unvented
attic - unvented
+
+ crawlspace
+ crawlspace
+
crawlspace - vented
crawlspace - vented
@@ -3876,7 +3961,7 @@
water_heater_tank_volume
Water Heater: Tank Volume
- Nominal volume of water heater tank. Only applies to storage water heater, heat pump water heater, and space-heating boiler with storage tank. If not provided, the OS-HPXML default is used.
+ Nominal volume of water heater tank. Only applies to storage water heater, heat pump water heater, and space-heating boiler with storage tank. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#conventional-storage'>Conventional Storage</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#heat-pump'>Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#combi-boiler-w-storage'>Combi Boiler w/ Storage</a>) is used.
Double
gal
false
@@ -3913,7 +3998,7 @@
water_heater_usage_bin
Water Heater: Usage Bin
- The usage of the water heater. Only applies if Efficiency Type is UniformEnergyFactor and Type is not instantaneous water heater. Does not apply to space-heating boilers. If not provided, the OS-HPXML default is used.
+ The usage of the water heater. Only applies if Efficiency Type is UniformEnergyFactor and Type is not instantaneous water heater. Does not apply to space-heating boilers. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#conventional-storage'>Conventional Storage</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#heat-pump'>Heat Pump</a>) is used.
Choice
false
false
@@ -3939,7 +4024,7 @@
water_heater_recovery_efficiency
Water Heater: Recovery Efficiency
- Ratio of energy delivered to water heater to the energy content of the fuel consumed by the water heater. Only used for non-electric storage water heaters. If not provided, the OS-HPXML default is used.
+ Ratio of energy delivered to water heater to the energy content of the fuel consumed by the water heater. Only used for non-electric storage water heaters. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#conventional-storage'>Conventional Storage</a>) is used.
Double
Frac
false
@@ -3948,7 +4033,7 @@
water_heater_heating_capacity
Water Heater: Heating Capacity
- Heating capacity. Only applies to storage water heater. If not provided, the OS-HPXML default is used.
+ Heating capacity. Only applies to storage water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#conventional-storage'>Conventional Storage</a>) is used.
Double
Btu/hr
false
@@ -3957,7 +4042,7 @@
water_heater_standby_loss
Water Heater: Standby Loss
- The standby loss of water heater. Only applies to space-heating boilers. If not provided, the OS-HPXML default is used.
+ The standby loss of water heater. Only applies to space-heating boilers. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#combi-boiler-w-storage'>Combi Boiler w/ Storage</a>) is used.
Double
deg-F/hr
false
@@ -3975,7 +4060,7 @@
water_heater_setpoint_temperature
Water Heater: Setpoint Temperature
- The setpoint temperature of water heater. If not provided, the OS-HPXML default is used.
+ The setpoint temperature of water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-water-heating-systems'>HPXML Water Heating Systems</a>) is used.
Double
deg-F
false
@@ -4012,7 +4097,7 @@
water_heater_tank_model_type
Water Heater: Tank Type
- Type of tank model to use. The 'stratified' tank generally provide more accurate results, but may significantly increase run time. Applies only to storage water heater. If not provided, the OS-HPXML default is used.
+ Type of tank model to use. The 'stratified' tank generally provide more accurate results, but may significantly increase run time. Applies only to storage water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#conventional-storage'>Conventional Storage</a>) is used.
Choice
false
false
@@ -4030,7 +4115,7 @@
water_heater_operating_mode
Water Heater: Operating Mode
- The water heater operating mode. The 'heat pump only' option only uses the heat pump, while 'hybrid/auto' allows the backup electric resistance to come on in high demand situations. This is ignored if a scheduled operating mode type is selected. Applies only to heat pump water heater. If not provided, the OS-HPXML default is used.
+ The water heater operating mode. The 'heat pump only' option only uses the heat pump, while 'hybrid/auto' allows the backup electric resistance to come on in high demand situations. This is ignored if a scheduled operating mode type is selected. Applies only to heat pump water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#heat-pump'>Heat Pump</a>) is used.
Choice
false
false
@@ -4067,7 +4152,7 @@
hot_water_distribution_standard_piping_length
Hot Water Distribution: Standard Piping Length
- If the distribution system is Standard, the length of the piping. If not provided, the OS-HPXML default is used.
+ If the distribution system is Standard, the length of the piping. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#standard'>Standard</a>) is used.
Double
ft
false
@@ -4107,7 +4192,7 @@
hot_water_distribution_recirc_piping_length
Hot Water Distribution: Recirculation Piping Length
- If the distribution system is Recirculation, the length of the recirculation piping. If not provided, the OS-HPXML default is used.
+ If the distribution system is Recirculation, the length of the recirculation piping. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#recirculation'>Recirculation</a>) is used.
Double
ft
false
@@ -4116,7 +4201,7 @@
hot_water_distribution_recirc_branch_piping_length
Hot Water Distribution: Recirculation Branch Piping Length
- If the distribution system is Recirculation, the length of the recirculation branch piping. If not provided, the OS-HPXML default is used.
+ If the distribution system is Recirculation, the length of the recirculation branch piping. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#recirculation'>Recirculation</a>) is used.
Double
ft
false
@@ -4125,7 +4210,7 @@
hot_water_distribution_recirc_pump_power
Hot Water Distribution: Recirculation Pump Power
- If the distribution system is Recirculation, the recirculation pump power. If not provided, the OS-HPXML default is used.
+ If the distribution system is Recirculation, the recirculation pump power. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#recirculation'>Recirculation</a>) is used.
Double
W
false
@@ -4134,7 +4219,7 @@
hot_water_distribution_pipe_r
Hot Water Distribution: Pipe Insulation Nominal R-Value
- Nominal R-value of the pipe insulation. If not provided, the OS-HPXML default is used.
+ Nominal R-value of the pipe insulation. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-hot-water-distribution'>HPXML Hot Water Distribution</a>) is used.
Double
h-ft^2-R/Btu
false
@@ -4233,7 +4318,7 @@
water_fixtures_usage_multiplier
Hot Water Fixtures: Usage Multiplier
- Multiplier on the hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-water-fixtures'>HPXML Water Fixtures</a>) is used.
Double
false
false
@@ -4360,7 +4445,7 @@
solar_thermal_storage_volume
Solar Thermal: Storage Volume
- The storage volume of the solar thermal system. If not provided, the OS-HPXML default is used.
+ The storage volume of the solar thermal system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#detailed-inputs'>Detailed Inputs</a>) is used.
Double
gal
false
@@ -4398,7 +4483,7 @@
pv_system_module_type
PV System: Module Type
- Module type of the PV system. If not provided, the OS-HPXML default is used.
+ Module type of the PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4420,7 +4505,7 @@
pv_system_location
PV System: Location
- Location of the PV system. If not provided, the OS-HPXML default is used.
+ Location of the PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4438,7 +4523,7 @@
pv_system_tracking
PV System: Tracking
- Type of tracking for the PV system. If not provided, the OS-HPXML default is used.
+ Type of tracking for the PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4494,7 +4579,7 @@
pv_system_inverter_efficiency
PV System: Inverter Efficiency
- Inverter efficiency of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default is used.
+ Inverter efficiency of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Double
Frac
false
@@ -4503,7 +4588,7 @@
pv_system_system_losses_fraction
PV System: System Losses Fraction
- System losses fraction of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default is used.
+ System losses fraction of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Double
Frac
false
@@ -4540,7 +4625,7 @@
pv_system_2_module_type
PV System 2: Module Type
- Module type of the second PV system. If not provided, the OS-HPXML default is used.
+ Module type of the second PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4562,7 +4647,7 @@
pv_system_2_location
PV System 2: Location
- Location of the second PV system. If not provided, the OS-HPXML default is used.
+ Location of the second PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4580,7 +4665,7 @@
pv_system_2_tracking
PV System 2: Tracking
- Type of tracking for the second PV system. If not provided, the OS-HPXML default is used.
+ Type of tracking for the second PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4655,14 +4740,14 @@
battery_location
Battery: Location
- The space type for the lithium ion battery location. If not provided, the OS-HPXML default is used.
+ The space type for the lithium ion battery location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-batteries'>HPXML Batteries</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -4672,6 +4757,10 @@
basement - unconditioned
basement - unconditioned
+
+ crawlspace
+ crawlspace
+
crawlspace - vented
crawlspace - vented
@@ -4684,6 +4773,10 @@
crawlspace - conditioned
crawlspace - conditioned
+
+ attic
+ attic
+
attic - vented
attic - vented
@@ -4705,7 +4798,7 @@
battery_power
Battery: Rated Power Output
- The rated power output of the lithium ion battery. If not provided, the OS-HPXML default is used.
+ The rated power output of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-batteries'>HPXML Batteries</a>) is used.
Double
W
false
@@ -4714,7 +4807,7 @@
battery_capacity
Battery: Nominal Capacity
- The nominal capacity of the lithium ion battery. If not provided, the OS-HPXML default is used.
+ The nominal capacity of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-batteries'>HPXML Batteries</a>) is used.
Double
kWh
false
@@ -4723,7 +4816,7 @@
battery_usable_capacity
Battery: Usable Capacity
- The usable capacity of the lithium ion battery. If not provided, the OS-HPXML default is used.
+ The usable capacity of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-batteries'>HPXML Batteries</a>) is used.
Double
kWh
false
@@ -4732,7 +4825,7 @@
battery_round_trip_efficiency
Battery: Round Trip Efficiency
- The round trip efficiency of the lithium ion battery. If not provided, the OS-HPXML default is used.
+ The round trip efficiency of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-batteries'>HPXML Batteries</a>) is used.
Double
Frac
false
@@ -4787,7 +4880,7 @@
lighting_interior_usage_multiplier
Lighting: Interior Usage Multiplier
- Multiplier on the lighting energy usage (interior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the lighting energy usage (interior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-lighting'>HPXML Lighting</a>) is used.
Double
false
false
@@ -4822,7 +4915,7 @@
lighting_exterior_usage_multiplier
Lighting: Exterior Usage Multiplier
- Multiplier on the lighting energy usage (exterior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the lighting energy usage (exterior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-lighting'>HPXML Lighting</a>) is used.
Double
false
false
@@ -4857,7 +4950,7 @@
lighting_garage_usage_multiplier
Lighting: Garage Usage Multiplier
- Multiplier on the lighting energy usage (garage) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the lighting energy usage (garage) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-lighting'>HPXML Lighting</a>) is used.
Double
false
false
@@ -4884,7 +4977,7 @@
holiday_lighting_daily_kwh
Holiday Lighting: Daily Consumption
- The daily energy consumption for holiday lighting (exterior). If not provided, the OS-HPXML default is used.
+ The daily energy consumption for holiday lighting (exterior). If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-lighting'>HPXML Lighting</a>) is used.
Double
kWh/day
false
@@ -4893,7 +4986,7 @@
holiday_lighting_period
Holiday Lighting: Period
- Enter a date like "Nov 25 - Jan 5". If not provided, the OS-HPXML default is used.
+ Enter a date like 'Nov 25 - Jan 5'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-lighting'>HPXML Lighting</a>) is used.
String
false
false
@@ -5002,14 +5095,14 @@
clothes_washer_location
Clothes Washer: Location
- The space type for the clothes washer location. If not provided, the OS-HPXML default is used.
+ The space type for the clothes washer location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5063,7 +5156,7 @@
clothes_washer_efficiency
Clothes Washer: Efficiency
- The efficiency of the clothes washer. If not provided, the OS-HPXML default is used.
+ The efficiency of the clothes washer. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
ft^3/kWh-cyc
false
@@ -5072,7 +5165,7 @@
clothes_washer_rated_annual_kwh
Clothes Washer: Rated Annual Consumption
- The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.
+ The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
kWh/yr
false
@@ -5081,7 +5174,7 @@
clothes_washer_label_electric_rate
Clothes Washer: Label Electric Rate
- The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.
+ The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
$/kWh
false
@@ -5090,7 +5183,7 @@
clothes_washer_label_gas_rate
Clothes Washer: Label Gas Rate
- The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.
+ The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
$/therm
false
@@ -5099,7 +5192,7 @@
clothes_washer_label_annual_gas_cost
Clothes Washer: Label Annual Cost with Gas DHW
- The annual cost of using the system under test conditions. Input is obtained from the EnergyGuide label. If not provided, the OS-HPXML default is used.
+ The annual cost of using the system under test conditions. Input is obtained from the EnergyGuide label. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
$
false
@@ -5108,7 +5201,7 @@
clothes_washer_label_usage
Clothes Washer: Label Usage
- The clothes washer loads per week. If not provided, the OS-HPXML default is used.
+ The clothes washer loads per week. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
cyc/wk
false
@@ -5117,7 +5210,7 @@
clothes_washer_capacity
Clothes Washer: Drum Volume
- Volume of the washer drum. Obtained from the EnergyStar website or the manufacturer's literature. If not provided, the OS-HPXML default is used.
+ Volume of the washer drum. Obtained from the EnergyStar website or the manufacturer's literature. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
ft^3
false
@@ -5126,7 +5219,7 @@
clothes_washer_usage_multiplier
Clothes Washer: Usage Multiplier
- Multiplier on the clothes washer energy and hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the clothes washer energy and hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
false
false
@@ -5153,14 +5246,14 @@
clothes_dryer_location
Clothes Dryer: Location
- The space type for the clothes dryer location. If not provided, the OS-HPXML default is used.
+ The space type for the clothes dryer location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5249,7 +5342,7 @@
clothes_dryer_efficiency
Clothes Dryer: Efficiency
- The efficiency of the clothes dryer. If not provided, the OS-HPXML default is used.
+ The efficiency of the clothes dryer. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.
Double
lb/kWh
false
@@ -5258,7 +5351,7 @@
clothes_dryer_vented_flow_rate
Clothes Dryer: Vented Flow Rate
- The exhaust flow rate of the vented clothes dryer. If not provided, the OS-HPXML default is used.
+ The exhaust flow rate of the vented clothes dryer. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.
Double
CFM
false
@@ -5267,7 +5360,7 @@
clothes_dryer_usage_multiplier
Clothes Dryer: Usage Multiplier
- Multiplier on the clothes dryer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the clothes dryer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.
Double
false
false
@@ -5294,14 +5387,14 @@
dishwasher_location
Dishwasher: Location
- The space type for the dishwasher location. If not provided, the OS-HPXML default is used.
+ The space type for the dishwasher location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5355,7 +5448,7 @@
dishwasher_efficiency
Dishwasher: Efficiency
- The efficiency of the dishwasher. If not provided, the OS-HPXML default is used.
+ The efficiency of the dishwasher. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
RatedAnnualkWh or EnergyFactor
false
@@ -5364,7 +5457,7 @@
dishwasher_label_electric_rate
Dishwasher: Label Electric Rate
- The label electric rate of the dishwasher. If not provided, the OS-HPXML default is used.
+ The label electric rate of the dishwasher. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
$/kWh
false
@@ -5373,7 +5466,7 @@
dishwasher_label_gas_rate
Dishwasher: Label Gas Rate
- The label gas rate of the dishwasher. If not provided, the OS-HPXML default is used.
+ The label gas rate of the dishwasher. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
$/therm
false
@@ -5382,7 +5475,7 @@
dishwasher_label_annual_gas_cost
Dishwasher: Label Annual Gas Cost
- The label annual gas cost of the dishwasher. If not provided, the OS-HPXML default is used.
+ The label annual gas cost of the dishwasher. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
$
false
@@ -5391,7 +5484,7 @@
dishwasher_label_usage
Dishwasher: Label Usage
- The dishwasher loads per week. If not provided, the OS-HPXML default is used.
+ The dishwasher loads per week. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
cyc/wk
false
@@ -5400,7 +5493,7 @@
dishwasher_place_setting_capacity
Dishwasher: Number of Place Settings
- The number of place settings for the unit. Data obtained from manufacturer's literature. If not provided, the OS-HPXML default is used.
+ The number of place settings for the unit. Data obtained from manufacturer's literature. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Integer
#
false
@@ -5409,7 +5502,7 @@
dishwasher_usage_multiplier
Dishwasher: Usage Multiplier
- Multiplier on the dishwasher energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the dishwasher energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
false
false
@@ -5436,14 +5529,14 @@
refrigerator_location
Refrigerator: Location
- The space type for the refrigerator location. If not provided, the OS-HPXML default is used.
+ The space type for the refrigerator location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5478,7 +5571,7 @@
refrigerator_rated_annual_kwh
Refrigerator: Rated Annual Consumption
- The EnergyGuide rated annual energy consumption for a refrigerator. If not provided, the OS-HPXML default is used.
+ The EnergyGuide rated annual energy consumption for a refrigerator. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Double
kWh/yr
false
@@ -5487,7 +5580,7 @@
refrigerator_usage_multiplier
Refrigerator: Usage Multiplier
- Multiplier on the refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Double
false
false
@@ -5514,14 +5607,14 @@
extra_refrigerator_location
Extra Refrigerator: Location
- The space type for the extra refrigerator location. If not provided, the OS-HPXML default is used.
+ The space type for the extra refrigerator location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5556,7 +5649,7 @@
extra_refrigerator_rated_annual_kwh
Extra Refrigerator: Rated Annual Consumption
- The EnergyGuide rated annual energy consumption for an extra rrefrigerator. If not provided, the OS-HPXML default is used.
+ The EnergyGuide rated annual energy consumption for an extra rrefrigerator. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Double
kWh/yr
false
@@ -5565,7 +5658,7 @@
extra_refrigerator_usage_multiplier
Extra Refrigerator: Usage Multiplier
- Multiplier on the extra refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the extra refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Double
false
false
@@ -5592,14 +5685,14 @@
freezer_location
Freezer: Location
- The space type for the freezer location. If not provided, the OS-HPXML default is used.
+ The space type for the freezer location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-freezers'>HPXML Freezers</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5634,7 +5727,7 @@
freezer_rated_annual_kwh
Freezer: Rated Annual Consumption
- The EnergyGuide rated annual energy consumption for a freezer. If not provided, the OS-HPXML default is used.
+ The EnergyGuide rated annual energy consumption for a freezer. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-freezers'>HPXML Freezers</a>) is used.
Double
kWh/yr
false
@@ -5643,7 +5736,7 @@
freezer_usage_multiplier
Freezer: Usage Multiplier
- Multiplier on the freezer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the freezer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-freezers'>HPXML Freezers</a>) is used.
Double
false
false
@@ -5670,14 +5763,14 @@
cooking_range_oven_location
Cooking Range/Oven: Location
- The space type for the cooking range/oven location. If not provided, the OS-HPXML default is used.
+ The space type for the cooking range/oven location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5747,7 +5840,7 @@
cooking_range_oven_is_induction
Cooking Range/Oven: Is Induction
- Whether the cooking range is induction. If not provided, the OS-HPXML default is used.
+ Whether the cooking range is induction. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.
Boolean
false
false
@@ -5765,7 +5858,7 @@
cooking_range_oven_is_convection
Cooking Range/Oven: Is Convection
- Whether the oven is convection. If not provided, the OS-HPXML default is used.
+ Whether the oven is convection. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.
Boolean
false
false
@@ -5783,7 +5876,7 @@
cooking_range_oven_usage_multiplier
Cooking Range/Oven: Usage Multiplier
- Multiplier on the cooking range/oven energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the cooking range/oven energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.
Double
false
false
@@ -5810,7 +5903,7 @@
ceiling_fan_efficiency
Ceiling Fan: Efficiency
- The efficiency rating of the ceiling fan(s) at medium speed. If not provided, the OS-HPXML default is used.
+ The efficiency rating of the ceiling fan(s) at medium speed. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-ceiling-fans'>HPXML Ceiling Fans</a>) is used.
Double
CFM/W
false
@@ -5819,7 +5912,7 @@
ceiling_fan_quantity
Ceiling Fan: Quantity
- Total number of ceiling fans. If not provided, the OS-HPXML default is used.
+ Total number of ceiling fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-ceiling-fans'>HPXML Ceiling Fans</a>) is used.
Integer
#
false
@@ -5828,7 +5921,7 @@
ceiling_fan_cooling_setpoint_temp_offset
Ceiling Fan: Cooling Setpoint Temperature Offset
- The cooling setpoint temperature offset during months when the ceiling fans are operating. Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default is used.
+ The cooling setpoint temperature offset during months when the ceiling fans are operating. Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-ceiling-fans'>HPXML Ceiling Fans</a>) is used.
Double
deg-F
false
@@ -5856,7 +5949,7 @@
misc_plug_loads_television_annual_kwh
Misc Plug Loads: Television Annual kWh
- The annual energy consumption of the television plug loads. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the television plug loads. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
kWh/yr
false
@@ -5865,7 +5958,7 @@
misc_plug_loads_television_usage_multiplier
Misc Plug Loads: Television Usage Multiplier
- Multiplier on the television energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the television energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
false
false
@@ -5873,7 +5966,7 @@
misc_plug_loads_other_annual_kwh
Misc Plug Loads: Other Annual kWh
- The annual energy consumption of the other residual plug loads. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the other residual plug loads. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
kWh/yr
false
@@ -5882,7 +5975,7 @@
misc_plug_loads_other_frac_sensible
Misc Plug Loads: Other Sensible Fraction
- Fraction of other residual plug loads' internal gains that are sensible. If not provided, the OS-HPXML default is used.
+ Fraction of other residual plug loads' internal gains that are sensible. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
Frac
false
@@ -5891,7 +5984,7 @@
misc_plug_loads_other_frac_latent
Misc Plug Loads: Other Latent Fraction
- Fraction of other residual plug loads' internal gains that are latent. If not provided, the OS-HPXML default is used.
+ Fraction of other residual plug loads' internal gains that are latent. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
Frac
false
@@ -5900,7 +5993,7 @@
misc_plug_loads_other_usage_multiplier
Misc Plug Loads: Other Usage Multiplier
- Multiplier on the other energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the other energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
false
false
@@ -5927,7 +6020,7 @@
misc_plug_loads_well_pump_annual_kwh
Misc Plug Loads: Well Pump Annual kWh
- The annual energy consumption of the well pump plug loads. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the well pump plug loads. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
kWh/yr
false
@@ -5936,7 +6029,7 @@
misc_plug_loads_well_pump_usage_multiplier
Misc Plug Loads: Well Pump Usage Multiplier
- Multiplier on the well pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the well pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
false
false
@@ -5963,7 +6056,7 @@
misc_plug_loads_vehicle_annual_kwh
Misc Plug Loads: Vehicle Annual kWh
- The annual energy consumption of the electric vehicle plug loads. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the electric vehicle plug loads. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
kWh/yr
false
@@ -5972,7 +6065,7 @@
misc_plug_loads_vehicle_usage_multiplier
Misc Plug Loads: Vehicle Usage Multiplier
- Multiplier on the electric vehicle energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the electric vehicle energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
false
false
@@ -6030,7 +6123,7 @@
misc_fuel_loads_grill_annual_therm
Misc Fuel Loads: Grill Annual therm
- The annual energy consumption of the fuel loads grill. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the fuel loads grill. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.
Double
therm/yr
false
@@ -6039,7 +6132,7 @@
misc_fuel_loads_grill_usage_multiplier
Misc Fuel Loads: Grill Usage Multiplier
- Multiplier on the fuel loads grill energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the fuel loads grill energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.
Double
false
false
@@ -6097,7 +6190,7 @@
misc_fuel_loads_lighting_annual_therm
Misc Fuel Loads: Lighting Annual therm
- The annual energy consumption of the fuel loads lighting. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the fuel loads lighting. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-fuel-loads'>HPXML Fuel Loads</a>)is used.
Double
therm/yr
false
@@ -6106,7 +6199,7 @@
misc_fuel_loads_lighting_usage_multiplier
Misc Fuel Loads: Lighting Usage Multiplier
- Multiplier on the fuel loads lighting energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the fuel loads lighting energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.
Double
false
false
@@ -6164,7 +6257,7 @@
misc_fuel_loads_fireplace_annual_therm
Misc Fuel Loads: Fireplace Annual therm
- The annual energy consumption of the fuel loads fireplace. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the fuel loads fireplace. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.
Double
therm/yr
false
@@ -6173,7 +6266,7 @@
misc_fuel_loads_fireplace_frac_sensible
Misc Fuel Loads: Fireplace Sensible Fraction
- Fraction of fireplace residual fuel loads' internal gains that are sensible. If not provided, the OS-HPXML default is used.
+ Fraction of fireplace residual fuel loads' internal gains that are sensible. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.
Double
Frac
false
@@ -6182,7 +6275,7 @@
misc_fuel_loads_fireplace_frac_latent
Misc Fuel Loads: Fireplace Latent Fraction
- Fraction of fireplace residual fuel loads' internal gains that are latent. If not provided, the OS-HPXML default is used.
+ Fraction of fireplace residual fuel loads' internal gains that are latent. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.
Double
Frac
false
@@ -6191,7 +6284,7 @@
misc_fuel_loads_fireplace_usage_multiplier
Misc Fuel Loads: Fireplace Usage Multiplier
- Multiplier on the fuel loads fireplace energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the fuel loads fireplace energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.
Double
false
false
@@ -6218,7 +6311,7 @@
pool_pump_annual_kwh
Pool: Pump Annual kWh
- The annual energy consumption of the pool pump. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the pool pump. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#pool-pump'>Pool Pump</a>) is used.
Double
kWh/yr
false
@@ -6227,7 +6320,7 @@
pool_pump_usage_multiplier
Pool: Pump Usage Multiplier
- Multiplier on the pool pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the pool pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#pool-pump'>Pool Pump</a>) is used.
Double
false
false
@@ -6262,7 +6355,7 @@
pool_heater_annual_kwh
Pool: Heater Annual kWh
- The annual energy consumption of the electric resistance pool heater. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the electric resistance pool heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#pool-heater'>Pool Heater</a>) is used.
Double
kWh/yr
false
@@ -6271,7 +6364,7 @@
pool_heater_annual_therm
Pool: Heater Annual therm
- The annual energy consumption of the gas fired pool heater. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the gas fired pool heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#pool-heater'>Pool Heater</a>) is used.
Double
therm/yr
false
@@ -6280,15 +6373,15 @@
pool_heater_usage_multiplier
Pool: Heater Usage Multiplier
- Multiplier on the pool heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the pool heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#pool-heater'>Pool Heater</a>) is used.
Double
false
false
- hot_tub_present
- Hot Tub: Present
- Whether there is a hot tub.
+ permanent_spa_present
+ Permanent Spa: Present
+ Whether there is a permanent spa.
Boolean
true
false
@@ -6305,26 +6398,26 @@
- hot_tub_pump_annual_kwh
- Hot Tub: Pump Annual kWh
- The annual energy consumption of the hot tub pump. If not provided, the OS-HPXML default is used.
+ permanent_spa_pump_annual_kwh
+ Permanent Spa: Pump Annual kWh
+ The annual energy consumption of the permanent spa pump. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#permanent-spa-pump'>Permanent Spa Pump</a>) is used.
Double
kWh/yr
false
false
- hot_tub_pump_usage_multiplier
- Hot Tub: Pump Usage Multiplier
- Multiplier on the hot tub pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ permanent_spa_pump_usage_multiplier
+ Permanent Spa: Pump Usage Multiplier
+ Multiplier on the permanent spa pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#permanent-spa-pump'>Permanent Spa Pump</a>) is used.
Double
false
false
- hot_tub_heater_type
- Hot Tub: Heater Type
- The type of hot tub heater. Use 'none' if there is no hot tub heater.
+ permanent_spa_heater_type
+ Permanent Spa: Heater Type
+ The type of permanent spa heater. Use 'none' if there is no permanent spa heater.
Choice
true
false
@@ -6349,27 +6442,27 @@
- hot_tub_heater_annual_kwh
- Hot Tub: Heater Annual kWh
- The annual energy consumption of the electric resistance hot tub heater. If not provided, the OS-HPXML default is used.
+ permanent_spa_heater_annual_kwh
+ Permanent Spa: Heater Annual kWh
+ The annual energy consumption of the electric resistance permanent spa heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#permanent-spa-heater'>Permanent Spa Heater</a>) is used.
Double
kWh/yr
false
false
- hot_tub_heater_annual_therm
- Hot Tub: Heater Annual therm
- The annual energy consumption of the gas fired hot tub heater. If not provided, the OS-HPXML default is used.
+ permanent_spa_heater_annual_therm
+ Permanent Spa: Heater Annual therm
+ The annual energy consumption of the gas fired permanent spa heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#permanent-spa-heater'>Permanent Spa Heater</a>) is used.
Double
therm/yr
false
false
- hot_tub_heater_usage_multiplier
- Hot Tub: Heater Usage Multiplier
- Multiplier on the hot tub heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ permanent_spa_heater_usage_multiplier
+ Permanent Spa: Heater Usage Multiplier
+ Multiplier on the permanent spa heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#permanent-spa-heater'>Permanent Spa Heater</a>) is used.
Double
false
false
@@ -6742,31 +6835,49 @@
measure.rb
rb
script
- B83724CD
+ 283BDAF5
constants.rb
rb
resource
- 2050FF10
+ 82A13855
geometry.rb
rb
resource
- 58F1B7DD
+ 5C6DA7A8
unit_conversions.rb
rb
resource
- 5E82ABE2
+ 9B7AAA98
util.rb
rb
resource
- 055F0A54
+ 42CACEFB
+
+
+ test_build_residential_model.rb
+ rb
+ test
+ 4584D81F
+
+
+ xml_building/17/feature1.xml
+ xml
+ test
+ CADEF9CC
+
+
+ xml_building/17/feature2.xml
+ xml
+ test
+ CADEF9CC
diff --git a/example_files/measures/BuildResidentialModel/resources/geometry.rb b/example_files/measures/BuildResidentialModel/resources/geometry.rb
index b6fd0a6f..6b2863dd 100644
--- a/example_files/measures/BuildResidentialModel/resources/geometry.rb
+++ b/example_files/measures/BuildResidentialModel/resources/geometry.rb
@@ -1,3 +1,8 @@
+# *********************************************************************************
+# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
+# *********************************************************************************
+
require_relative 'constants'
require_relative 'unit_conversions'
require_relative 'util'
@@ -1526,11 +1531,11 @@ def self.process_occupants(model, runner, num_occ, occ_gain, sens_frac, lat_frac
runner.registerInfo("Removed existing people from space '#{space.name}'.")
end
objects_to_remove.uniq.each do |object|
-
+
object.remove
rescue StandardError
# no op
-
+
end
space_num_occ = unit_occ * UnitConversions.convert(space.floorArea, 'm^2', 'ft^2') / ffa
diff --git a/example_files/measures/BuildResidentialModel/resources/unit_conversions.rb b/example_files/measures/BuildResidentialModel/resources/unit_conversions.rb
index 30b64a55..2b138405 100644
--- a/example_files/measures/BuildResidentialModel/resources/unit_conversions.rb
+++ b/example_files/measures/BuildResidentialModel/resources/unit_conversions.rb
@@ -1,3 +1,8 @@
+# *********************************************************************************
+# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
+# *********************************************************************************
+
class WholeBuildingUnitConversions
# As there is a performance penalty to using OpenStudio's built-in unit convert()
# method, we use, our own methods here.
diff --git a/example_files/measures/BuildResidentialModel/resources/util.rb b/example_files/measures/BuildResidentialModel/resources/util.rb
index f991973e..25efa95a 100644
--- a/example_files/measures/BuildResidentialModel/resources/util.rb
+++ b/example_files/measures/BuildResidentialModel/resources/util.rb
@@ -1,3 +1,8 @@
+# *********************************************************************************
+# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
+# *********************************************************************************
+
# Add classes or functions here than can be used across a variety of our python classes and modules.
require_relative 'constants'
require_relative 'unit_conversions'
diff --git a/example_files/measures/BuildResidentialModel/tests/test_build_residential_model.rb b/example_files/measures/BuildResidentialModel/tests/test_build_residential_model.rb
new file mode 100644
index 00000000..09a836ea
--- /dev/null
+++ b/example_files/measures/BuildResidentialModel/tests/test_build_residential_model.rb
@@ -0,0 +1,344 @@
+# *********************************************************************************
+# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
+# *********************************************************************************
+
+# frozen_string_literal: true
+
+require_relative '../../../resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper'
+require_relative '../../../mappers/residential/util'
+require_relative '../../../mappers/residential/template//util'
+require 'openstudio'
+require 'openstudio/measure/ShowRunnerOutput'
+require_relative '../measure.rb'
+require 'csv'
+
+class BuildResidentialModelTest < Minitest::Test
+ def setup
+ @tests_path = File.dirname(__FILE__)
+ @run_path = File.join(@tests_path, 'run')
+ @hpxml_path = File.join(@run_path, 'feature.xml')
+ FileUtils.mkdir_p(@run_path)
+
+ @args = {}
+ _initialize_arguments()
+ end
+
+ def teardown
+ FileUtils.rm_rf(@run_path)
+ end
+
+ def _initialize_arguments()
+ # BuildResidentialModel arguments
+ @args[:hpxml_path] = @hpxml_path
+ @args[:output_dir] = @run_path
+ @args[:feature_id] = 1
+ @args[:schedules_type] = 'stochastic'
+ @args[:schedules_random_seed] = 1
+ @args[:schedules_variation] = 'unit'
+ @args[:geometry_num_floors_above_grade] = 1
+
+ # Optionals / Feature
+ @args[:geometry_building_num_units] = 1
+ @timestep = 60
+ @run_period = 'Jan 1 - Dec 31'
+ @calendar_year = 2007
+ @weather_filename = 'USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw'
+ @building_type = 'Single-Family Detached'
+ @floor_area = 3055
+ @number_of_bedrooms = 3
+ @geometry_unit_orientation = nil
+ @geometry_aspect_ratio = nil
+ @occupancy_calculation_type = nil
+ @number_of_occupants = nil
+ @maximum_roof_height = 8.0
+ @foundation_type = 'crawlspace - unvented'
+ @attic_type = 'attic - vented'
+ @roof_type = 'Gable'
+ @onsite_parking_fraction = false
+ @system_type = 'Residential - furnace and central air conditioner'
+ @heating_system_fuel_type = 'natural gas'
+ @template = nil
+ @climate_zone = '5A'
+ end
+
+ def test_hpxml_dir
+ # in https://github.com/urbanopt/urbanopt-geojson-gem/blob/develop/lib/urbanopt/geojson/schema/building_properties.json, see:
+ # - "hpxml_directory"
+
+ @args[:hpxml_dir] = '18'
+ _test_measure(expected_errors: ["HPXML directory 'xml_building/18' was specified for feature ID = 1, but could not be found."])
+
+ @args[:hpxml_dir] = '../measures/BuildResidentialModel/tests/xml_building/17'
+ _test_measure(expected_errors: ["HPXML directory 'xml_building/17' must contain exactly 1 HPXML file; the single file can describe multiple dwelling units of a feature."])
+
+ @args[:hpxml_dir] = '17'
+ _test_measure(expected_errors: ['The number of actual dwelling units (4) differs from the specified number of units (1).'])
+
+ @args[:geometry_building_num_units] = 4
+
+ _test_measure()
+ end
+
+ def test_schedules_type
+ # Baseline.rb mapper currently hardcodes schedules_type to "stochastic"
+
+ schedules_types = ['stochastic', 'smooth']
+
+ schedules_types.each do |schedules_type|
+ @args[:schedules_type] = schedules_type
+
+ _apply_residential()
+ _test_measure()
+ end
+ end
+
+ def test_feature_building_types_num_units_and_stories
+ # in https://github.com/urbanopt/urbanopt-geojson-gem/blob/develop/lib/urbanopt/geojson/schema/building_properties.json, see:
+ # - "buildingType"
+ # - "number_of_residential_units"
+ # - "number_of_stories_above_ground"
+
+ feature_building_types = ['Single-Family Detached', 'Single-Family Attached', 'Multifamily']
+ feature_number_of_residential_unitss = (1..3).to_a
+ feature_number_of_stories_above_grounds = (1..2).to_a
+
+ feature_building_types.each do |feature_building_type|
+ feature_number_of_residential_unitss.each do |feature_number_of_residential_units|
+ feature_number_of_stories_above_grounds.each do |feature_number_of_stories_above_ground|
+ @building_type = feature_building_type
+ @args[:geometry_num_floors_above_grade] = feature_number_of_stories_above_ground
+ @args[:geometry_building_num_units] = feature_number_of_residential_units
+
+ expected_errors = []
+ if feature_building_type == 'Multifamily'
+ num_units_per_floor = (Float(@args[:geometry_building_num_units]) / Float(@args[:geometry_num_floors_above_grade])).ceil
+ if num_units_per_floor == 1
+ expected_errors = ["Unit type 'apartment unit' with num_units_per_floor=#{num_units_per_floor} is not supported."]
+ end
+ end
+
+ _apply_residential()
+ _test_measure(expected_errors: expected_errors)
+ end
+ end
+ end
+ end
+
+ def test_feature_building_foundation_and_attic_types_and_num_stories
+ # in https://github.com/urbanopt/urbanopt-geojson-gem/blob/develop/lib/urbanopt/geojson/schema/building_properties.json, see:
+ # - "buildingType"
+ # - "foundationType"
+ # - "atticType"
+ # - "number_of_stories_above_ground"
+
+ feature_building_types = ['Single-Family Detached', 'Single-Family Attached', 'Multifamily']
+ feature_foundation_types = ['slab', 'crawlspace - vented', 'crawlspace - conditioned', 'basement - unconditioned', 'basement - conditioned', 'ambient']
+ feature_attic_types = ['attic - vented', 'attic - conditioned', 'flat roof']
+ feature_number_of_stories_above_grounds = (1..2).to_a
+
+ feature_building_types.each do |feature_building_type|
+ feature_foundation_types.each do |feature_foundation_type|
+ feature_attic_types.each do |feature_attic_type|
+ feature_number_of_stories_above_grounds.each do |feature_number_of_stories_above_ground|
+ @building_type = feature_building_type
+ @foundation_type = feature_foundation_type
+ @attic_type = feature_attic_type
+ @args[:geometry_num_floors_above_grade] = feature_number_of_stories_above_ground
+
+ expected_errors = []
+ if feature_attic_type == 'attic - conditioned' && feature_number_of_stories_above_ground == 1
+ expected_errors = ['Units with a conditioned attic must have at least two above-grade floors.']
+ end
+ if feature_building_type == 'Multifamily'
+ num_units_per_floor = (Float(@args[:geometry_building_num_units]) / Float(@args[:geometry_num_floors_above_grade])).ceil
+ if num_units_per_floor == 1
+ expected_errors = ["Unit type 'apartment unit' with num_units_per_floor=#{num_units_per_floor} is not supported."]
+ end
+ end
+
+ _apply_residential()
+ _test_measure(expected_errors: expected_errors)
+ end
+ end
+ end
+ end
+ end
+
+ def test_feature_building_types_num_units_and_bedrooms
+ # in https://github.com/urbanopt/urbanopt-geojson-gem/blob/develop/lib/urbanopt/geojson/schema/building_properties.json, see:
+ # - "buildingType"
+ # - "number_of_residential_units"
+ # - "number_of_bedrooms"
+
+ feature_building_types = ['Single-Family Detached', 'Multifamily']
+ feature_number_of_residential_unitss = (2..4).to_a
+ feature_number_of_bedroomss = (11..13).to_a
+
+ feature_building_types.each do |feature_building_type|
+ feature_number_of_residential_unitss.each do |feature_number_of_residential_units|
+ feature_number_of_bedroomss.each do |feature_number_of_bedrooms|
+ @building_type = feature_building_type
+ @args[:geometry_building_num_units] = feature_number_of_residential_units
+ @number_of_bedrooms = feature_number_of_bedrooms
+
+ _apply_residential()
+ _test_measure()
+ end
+ end
+ end
+ end
+
+ def test_feature_building_occ_calc_types_num_occupants_and_units
+ # in https://github.com/urbanopt/urbanopt-geojson-gem/blob/develop/lib/urbanopt/geojson/schema/building_properties.json, see:
+ # - "buildingType"
+ # - "occupancy_calculation_type"
+ # - "number_of_residential_units"
+ # - "number_of_occupants"
+
+ feature_building_types = ['Single-Family Detached', 'Multifamily']
+ feature_occupancy_calculation_types = ['asset', 'operational']
+ feature_number_of_residential_unitss = (2..3).to_a
+ feature_number_of_occupantss = [nil, 3]
+
+ feature_building_types.each do |feature_building_type|
+ feature_occupancy_calculation_types.each do |feature_occupancy_calculation_type|
+ feature_number_of_residential_unitss.each do |feature_number_of_residential_units|
+ feature_number_of_occupantss.each do |feature_number_of_occupants|
+ @building_type = feature_building_type
+ @occupancy_calculation_type = feature_occupancy_calculation_type
+ @args[:geometry_building_num_units] = feature_number_of_residential_units
+ @number_of_occupants = feature_number_of_occupants
+
+ _apply_residential()
+ _test_measure()
+ end
+ end
+ end
+ end
+ end
+
+ def test_feature_building_foundation_types_and_garages
+ # in https://github.com/urbanopt/urbanopt-geojson-gem/blob/develop/lib/urbanopt/geojson/schema/building_properties.json, see:
+ # - "buildingType"
+ # - "foundationType"
+ # - "onsite_parking_fraction"
+
+ feature_building_types = ['Single-Family Detached', 'Single-Family Attached', 'Multifamily']
+ feature_foundation_types = ['slab', 'crawlspace - vented', 'crawlspace - conditioned', 'basement - unconditioned', 'basement - conditioned', 'ambient']
+ feature_onsite_parking_fractions = [false, true]
+
+ feature_building_types.each do |feature_building_type|
+ feature_foundation_types.each do |feature_foundation_type|
+ feature_onsite_parking_fractions.each do |feature_onsite_parking_fraction|
+ @building_type = feature_building_type
+ @foundation_type = feature_foundation_type
+ @onsite_parking_fraction = feature_onsite_parking_fraction
+ @args[:geometry_building_num_units] = 2
+
+ expected_errors = []
+ if feature_foundation_type == 'ambient' && feature_onsite_parking_fraction
+ expected_errors = ['Cannot handle garages with an ambient foundation type.']
+ end
+ if feature_building_type == 'Multifamily' && feature_foundation_type.include?('- conditioned')
+ expected_errors = ['Conditioned basement/crawlspace foundation type for apartment units is not currently supported.']
+ end
+
+ _apply_residential()
+ _test_measure(expected_errors: expected_errors)
+ end
+ end
+ end
+ end
+
+ def test_hvac_system_and_fuel_types
+ # in https://github.com/urbanopt/urbanopt-geojson-gem/blob/develop/lib/urbanopt/geojson/schema/building_properties.json, see:
+ # - "systemType" (those prefixed with "Residential")
+ # - "heatingSystemFuelType"
+
+ feature_system_types = ['Residential - electric resistance and no cooling', 'Residential - electric resistance and central air conditioner', 'Residential - electric resistance and room air conditioner', 'Residential - electric resistance and evaporative cooler', 'Residential - furnace and no cooling', 'Residential - furnace and central air conditioner', 'Residential - furnace and room air conditioner', 'Residential - furnace and evaporative cooler', 'Residential - boiler and no cooling', 'Residential - boiler and central air conditioner', 'Residential - boiler and room air conditioner', 'Residential - boiler and evaporative cooler', 'Residential - air-to-air heat pump', 'Residential - mini-split heat pump', 'Residential - ground-to-air heat pump']
+ feature_heating_system_fuel_types = ['electricity', 'natural gas', 'fuel oil', 'propane', 'wood']
+
+ feature_system_types.each do |feature_system_type|
+ feature_heating_system_fuel_types.each do |feature_heating_system_fuel_type|
+ @system_type = feature_system_type
+ @heating_system_fuel_type = feature_heating_system_fuel_type
+
+ _apply_residential()
+ _test_measure()
+ end
+ end
+ end
+
+ def test_residential_template_types
+ # in https://github.com/urbanopt/urbanopt-geojson-gem/blob/develop/lib/urbanopt/geojson/schema/building_properties.json, see:
+ # - "templateType"
+
+ feature_templates = ['Residential IECC 2006 - Customizable Template Sep 2020', 'Residential IECC 2009 - Customizable Template Sep 2020', 'Residential IECC 2012 - Customizable Template Sep 2020', 'Residential IECC 2015 - Customizable Template Sep 2020', 'Residential IECC 2018 - Customizable Template Sep 2020', 'Residential IECC 2006 - Customizable Template Apr 2022', 'Residential IECC 2009 - Customizable Template Apr 2022', 'Residential IECC 2012 - Customizable Template Apr 2022', 'Residential IECC 2015 - Customizable Template Apr 2022', 'Residential IECC 2018 - Customizable Template Apr 2022']
+
+ feature_templates.each do |feature_template|
+ @args = {}
+ _initialize_arguments()
+
+ @template = feature_template
+
+ _apply_residential()
+ _apply_residential_template()
+ _test_measure()
+ end
+ end
+
+ def _apply_residential()
+ residential_simulation(@args, @timestep, @run_period, @calendar_year, @weather_filename)
+ residential_geometry_unit(@args, @building_type, @floor_area, @number_of_bedrooms, @geometry_unit_orientation, @geometry_unit_aspect_ratio, @occupancy_calculation_type, @number_of_occupants, @maximum_roof_height)
+ residential_geometry_foundation(@args, @foundation_type)
+ residential_geometry_attic(@args, @attic_type, @roof_type)
+ residential_geometry_garage(@args, @onsite_parking_fraction)
+ residential_geometry_neighbor(@args)
+ residential_hvac(@args, @system_type, @heating_system_fuel_type)
+ residential_appliances(@args)
+ end
+
+ def _apply_residential_template()
+ residential_template(@args, @template, @climate_zone)
+ end
+
+ def _test_measure(expected_errors: [])
+ # create an instance of the measure
+ measure = BuildResidentialModel.new
+
+ runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
+ model = OpenStudio::Model::Model.new
+
+ # get arguments
+ arguments = measure.arguments(model)
+ argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
+
+ # populate argument with specified hash value if specified
+ arguments.each do |arg|
+ temp_arg_var = arg.clone
+ if @args.has_key?(arg.name.to_sym)
+ assert(temp_arg_var.setValue(@args[arg.name.to_sym]))
+ end
+ argument_map[arg.name] = temp_arg_var
+ end
+
+ # run the measure
+ measure.run(model, runner, argument_map)
+ result = runner.result
+
+ # assert that it ran correctly
+ if !expected_errors.empty?
+ # show_output(result) unless result.value.valueName == 'Fail'
+ assert_equal('Fail', result.value.valueName)
+
+ error_msgs = result.errors.map { |x| x.logMessage }
+ expected_errors.each do |expected_error|
+ assert_includes(error_msgs, expected_error)
+ end
+ else
+ show_output(result) unless result.value.valueName == 'Success'
+ assert_equal('Success', result.value.valueName)
+ end
+ end
+end
diff --git a/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature1.xml b/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature1.xml
new file mode 100644
index 00000000..477ab565
--- /dev/null
+++ b/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature1.xml
@@ -0,0 +1,2112 @@
+
+
+
+ HPXML
+ BuildResidentialHPXML
+ 2023-11-30T15:05:03-07:00
+ create
+
+
+ uo-example-project
+
+
+ 60
+ 1
+ 1
+ 12
+ 31
+ 2017
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+ attached on one side
+ no units above or below
+ 180
+
+
+ single-family attached
+ 2.0
+ 2.0
+ 8.0
+ 1
+ 4580.0
+ 36640.0
+
+
+ schedules.csv
+
+
+
+
+
+ USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3
+
+ ../../../weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+ 50.0
+
+ ACH
+ 3.0
+
+ 36640.0
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attic - vented
+ 1280.1
+ 0
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+ attic - vented
+ 1280.1
+ 180
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 0
+
+
+ 16.66666667
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 541.4
+ 90
+
+
+ 16.66666667
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 180
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 270
+
+
+ 4.0
+
+
+
+
+ outside
+ attic - vented
+ gable
+
+
+
+ 143.1
+ 90
+
+
+ 4.0
+
+
+
+
+
+
+ attic - vented
+ conditioned space
+ ceiling
+
+
+
+ 2290.0
+
+
+ 38.46153846
+
+
+
+
+
+
+ conditioned space
+ 2290.0
+ 169.2
+
+
+
+ 10.0
+ 2.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.8
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+ 48.7
+ 90
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.6
+
+
+
+
+
+ 48.7
+ 90
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.6
+
+
+
+
+
+ 94.9
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 13.0
+
+
+
+
+
+ 100.0
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fuel oil
+
+ AFUE
+ 0.85
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 1.0
+
+ EER
+ 8.5
+
+
+
+
+
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ Percent
+ 0.1
+ to outside
+
+
+
+ return
+
+ Percent
+ 0.1
+ to outside
+
+
+
+
+ supply
+ 8.0
+
+
+
+ return
+ 8.0
+
+
+
+ 4580.0
+
+
+
+
+
+
+ energy recovery ventilator
+ true
+ 0.48
+ 0.72
+
+
+
+ kitchen
+ true
+
+
+
+ bath
+ true
+
+
+
+
+
+
+ fuel oil
+ storage water heater
+ 40.0
+ 1.0
+ 0.53
+
+
+
+
+
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+ 1.0
+
+
+
+
+
+
+ 2.92
+ 75.0
+ 0.12
+ 1.09
+ 7.0
+ 6.0
+ 4.5
+
+
+
+ fuel oil
+ 3.03
+
+
+
+ 199.0
+ 12
+ 0.12
+ 1.09
+ 18.0
+ 4.0
+
+
+
+ 423.0
+ true
+
+
+
+ fuel oil
+
+
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+ attached on two sides
+ no units above or below
+ 180
+
+
+ single-family attached
+ 2.0
+ 2.0
+ 8.0
+ 1
+ 4580.0
+ 36640.0
+
+
+ schedules_2.csv
+
+
+
+
+
+ USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3
+
+ ../../../weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+ 50.0
+
+ ACH
+ 3.0
+
+ 36640.0
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attic - vented
+ 1280.1
+ 0
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+ attic - vented
+ 1280.1
+ 180
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 0
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 90
+
+
+ 4.0
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 180
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 90
+
+
+ 4.0
+
+
+
+
+
+
+ attic - vented
+ conditioned space
+ ceiling
+
+
+
+ 2290.0
+
+
+ 38.46153846
+
+
+
+
+
+
+ conditioned space
+ 2290.0
+ 135.4
+
+
+
+ 10.0
+ 2.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.8
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+ 94.9
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 13.0
+
+
+
+
+
+ 100.0
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fuel oil
+
+ AFUE
+ 0.85
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 1.0
+
+ EER
+ 8.5
+
+
+
+
+
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ Percent
+ 0.1
+ to outside
+
+
+
+ return
+
+ Percent
+ 0.1
+ to outside
+
+
+
+
+ supply
+ 8.0
+
+
+
+ return
+ 8.0
+
+
+
+ 4580.0
+
+
+
+
+
+
+ energy recovery ventilator
+ true
+ 0.48
+ 0.72
+
+
+
+ kitchen
+ true
+
+
+
+ bath
+ true
+
+
+
+
+
+
+ fuel oil
+ storage water heater
+ 40.0
+ 1.0
+ 0.53
+
+
+
+
+
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+ 1.0
+
+
+
+
+
+
+ 2.92
+ 75.0
+ 0.12
+ 1.09
+ 7.0
+ 6.0
+ 4.5
+
+
+
+ fuel oil
+ 3.03
+
+
+
+ 199.0
+ 12
+ 0.12
+ 1.09
+ 18.0
+ 4.0
+
+
+
+ 423.0
+ true
+
+
+
+ fuel oil
+
+
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+ attached on two sides
+ no units above or below
+ 180
+
+
+ single-family attached
+ 2.0
+ 2.0
+ 8.0
+ 1
+ 4580.0
+ 36640.0
+
+
+ schedules_3.csv
+
+
+
+
+
+ USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3
+
+ ../../../weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+ 50.0
+
+ ACH
+ 3.0
+
+ 36640.0
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attic - vented
+ 1280.1
+ 0
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+ attic - vented
+ 1280.1
+ 180
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 0
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 90
+
+
+ 4.0
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 180
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 90
+
+
+ 4.0
+
+
+
+
+
+
+ attic - vented
+ conditioned space
+ ceiling
+
+
+
+ 2290.0
+
+
+ 38.46153846
+
+
+
+
+
+
+ conditioned space
+ 2290.0
+ 135.4
+
+
+
+ 10.0
+ 2.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.8
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+ 94.9
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 13.0
+
+
+
+
+
+ 100.0
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fuel oil
+
+ AFUE
+ 0.85
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 1.0
+
+ EER
+ 8.5
+
+
+
+
+
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ Percent
+ 0.1
+ to outside
+
+
+
+ return
+
+ Percent
+ 0.1
+ to outside
+
+
+
+
+ supply
+ 8.0
+
+
+
+ return
+ 8.0
+
+
+
+ 4580.0
+
+
+
+
+
+
+ energy recovery ventilator
+ true
+ 0.48
+ 0.72
+
+
+
+ kitchen
+ true
+
+
+
+ bath
+ true
+
+
+
+
+
+
+ fuel oil
+ storage water heater
+ 40.0
+ 1.0
+ 0.53
+
+
+
+
+
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+ 1.0
+
+
+
+
+
+
+ 2.92
+ 75.0
+ 0.12
+ 1.09
+ 7.0
+ 6.0
+ 4.5
+
+
+
+ fuel oil
+ 3.03
+
+
+
+ 199.0
+ 12
+ 0.12
+ 1.09
+ 18.0
+ 4.0
+
+
+
+ 423.0
+ true
+
+
+
+ fuel oil
+
+
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+ attached on one side
+ no units above or below
+ 180
+
+
+ single-family attached
+ 2.0
+ 2.0
+ 8.0
+ 1
+ 4580.0
+ 36640.0
+
+
+ schedules_4.csv
+
+
+
+
+
+ USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3
+
+ ../../../weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+ 50.0
+
+ ACH
+ 3.0
+
+ 36640.0
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attic - vented
+ 1280.1
+ 0
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+ attic - vented
+ 1280.1
+ 180
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 0
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 90
+
+
+ 4.0
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 180
+
+
+ 16.66666667
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 541.4
+ 270
+
+
+ 16.66666667
+
+
+
+
+ outside
+ attic - vented
+ gable
+
+
+
+ 143.1
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 90
+
+
+ 4.0
+
+
+
+
+
+
+ attic - vented
+ conditioned space
+ ceiling
+
+
+
+ 2290.0
+
+
+ 38.46153846
+
+
+
+
+
+
+ conditioned space
+ 2290.0
+ 169.2
+
+
+
+ 10.0
+ 2.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.8
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+ 94.9
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 13.0
+
+
+
+
+
+ 100.0
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+ 48.7
+ 270
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.6
+
+
+
+
+
+ 48.7
+ 270
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.6
+
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fuel oil
+
+ AFUE
+ 0.85
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 1.0
+
+ EER
+ 8.5
+
+
+
+
+
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ Percent
+ 0.1
+ to outside
+
+
+
+ return
+
+ Percent
+ 0.1
+ to outside
+
+
+
+
+ supply
+ 8.0
+
+
+
+ return
+ 8.0
+
+
+
+ 4580.0
+
+
+
+
+
+
+ energy recovery ventilator
+ true
+ 0.48
+ 0.72
+
+
+
+ kitchen
+ true
+
+
+
+ bath
+ true
+
+
+
+
+
+
+ fuel oil
+ storage water heater
+ 40.0
+ 1.0
+ 0.53
+
+
+
+
+
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+ 1.0
+
+
+
+
+
+
+ 2.92
+ 75.0
+ 0.12
+ 1.09
+ 7.0
+ 6.0
+ 4.5
+
+
+
+ fuel oil
+ 3.03
+
+
+
+ 199.0
+ 12
+ 0.12
+ 1.09
+ 18.0
+ 4.0
+
+
+
+ 423.0
+ true
+
+
+
+ fuel oil
+
+
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
\ No newline at end of file
diff --git a/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature2.xml b/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature2.xml
new file mode 100644
index 00000000..477ab565
--- /dev/null
+++ b/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature2.xml
@@ -0,0 +1,2112 @@
+
+
+
+ HPXML
+ BuildResidentialHPXML
+ 2023-11-30T15:05:03-07:00
+ create
+
+
+ uo-example-project
+
+
+ 60
+ 1
+ 1
+ 12
+ 31
+ 2017
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+ attached on one side
+ no units above or below
+ 180
+
+
+ single-family attached
+ 2.0
+ 2.0
+ 8.0
+ 1
+ 4580.0
+ 36640.0
+
+
+ schedules.csv
+
+
+
+
+
+ USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3
+
+ ../../../weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+ 50.0
+
+ ACH
+ 3.0
+
+ 36640.0
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attic - vented
+ 1280.1
+ 0
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+ attic - vented
+ 1280.1
+ 180
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 0
+
+
+ 16.66666667
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 541.4
+ 90
+
+
+ 16.66666667
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 180
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 270
+
+
+ 4.0
+
+
+
+
+ outside
+ attic - vented
+ gable
+
+
+
+ 143.1
+ 90
+
+
+ 4.0
+
+
+
+
+
+
+ attic - vented
+ conditioned space
+ ceiling
+
+
+
+ 2290.0
+
+
+ 38.46153846
+
+
+
+
+
+
+ conditioned space
+ 2290.0
+ 169.2
+
+
+
+ 10.0
+ 2.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.8
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+ 48.7
+ 90
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.6
+
+
+
+
+
+ 48.7
+ 90
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.6
+
+
+
+
+
+ 94.9
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 13.0
+
+
+
+
+
+ 100.0
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fuel oil
+
+ AFUE
+ 0.85
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 1.0
+
+ EER
+ 8.5
+
+
+
+
+
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ Percent
+ 0.1
+ to outside
+
+
+
+ return
+
+ Percent
+ 0.1
+ to outside
+
+
+
+
+ supply
+ 8.0
+
+
+
+ return
+ 8.0
+
+
+
+ 4580.0
+
+
+
+
+
+
+ energy recovery ventilator
+ true
+ 0.48
+ 0.72
+
+
+
+ kitchen
+ true
+
+
+
+ bath
+ true
+
+
+
+
+
+
+ fuel oil
+ storage water heater
+ 40.0
+ 1.0
+ 0.53
+
+
+
+
+
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+ 1.0
+
+
+
+
+
+
+ 2.92
+ 75.0
+ 0.12
+ 1.09
+ 7.0
+ 6.0
+ 4.5
+
+
+
+ fuel oil
+ 3.03
+
+
+
+ 199.0
+ 12
+ 0.12
+ 1.09
+ 18.0
+ 4.0
+
+
+
+ 423.0
+ true
+
+
+
+ fuel oil
+
+
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+ attached on two sides
+ no units above or below
+ 180
+
+
+ single-family attached
+ 2.0
+ 2.0
+ 8.0
+ 1
+ 4580.0
+ 36640.0
+
+
+ schedules_2.csv
+
+
+
+
+
+ USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3
+
+ ../../../weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+ 50.0
+
+ ACH
+ 3.0
+
+ 36640.0
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attic - vented
+ 1280.1
+ 0
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+ attic - vented
+ 1280.1
+ 180
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 0
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 90
+
+
+ 4.0
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 180
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 90
+
+
+ 4.0
+
+
+
+
+
+
+ attic - vented
+ conditioned space
+ ceiling
+
+
+
+ 2290.0
+
+
+ 38.46153846
+
+
+
+
+
+
+ conditioned space
+ 2290.0
+ 135.4
+
+
+
+ 10.0
+ 2.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.8
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+ 94.9
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 13.0
+
+
+
+
+
+ 100.0
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fuel oil
+
+ AFUE
+ 0.85
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 1.0
+
+ EER
+ 8.5
+
+
+
+
+
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ Percent
+ 0.1
+ to outside
+
+
+
+ return
+
+ Percent
+ 0.1
+ to outside
+
+
+
+
+ supply
+ 8.0
+
+
+
+ return
+ 8.0
+
+
+
+ 4580.0
+
+
+
+
+
+
+ energy recovery ventilator
+ true
+ 0.48
+ 0.72
+
+
+
+ kitchen
+ true
+
+
+
+ bath
+ true
+
+
+
+
+
+
+ fuel oil
+ storage water heater
+ 40.0
+ 1.0
+ 0.53
+
+
+
+
+
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+ 1.0
+
+
+
+
+
+
+ 2.92
+ 75.0
+ 0.12
+ 1.09
+ 7.0
+ 6.0
+ 4.5
+
+
+
+ fuel oil
+ 3.03
+
+
+
+ 199.0
+ 12
+ 0.12
+ 1.09
+ 18.0
+ 4.0
+
+
+
+ 423.0
+ true
+
+
+
+ fuel oil
+
+
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+ attached on two sides
+ no units above or below
+ 180
+
+
+ single-family attached
+ 2.0
+ 2.0
+ 8.0
+ 1
+ 4580.0
+ 36640.0
+
+
+ schedules_3.csv
+
+
+
+
+
+ USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3
+
+ ../../../weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+ 50.0
+
+ ACH
+ 3.0
+
+ 36640.0
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attic - vented
+ 1280.1
+ 0
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+ attic - vented
+ 1280.1
+ 180
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 0
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 90
+
+
+ 4.0
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 180
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 90
+
+
+ 4.0
+
+
+
+
+
+
+ attic - vented
+ conditioned space
+ ceiling
+
+
+
+ 2290.0
+
+
+ 38.46153846
+
+
+
+
+
+
+ conditioned space
+ 2290.0
+ 135.4
+
+
+
+ 10.0
+ 2.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.8
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+ 94.9
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 13.0
+
+
+
+
+
+ 100.0
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fuel oil
+
+ AFUE
+ 0.85
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 1.0
+
+ EER
+ 8.5
+
+
+
+
+
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ Percent
+ 0.1
+ to outside
+
+
+
+ return
+
+ Percent
+ 0.1
+ to outside
+
+
+
+
+ supply
+ 8.0
+
+
+
+ return
+ 8.0
+
+
+
+ 4580.0
+
+
+
+
+
+
+ energy recovery ventilator
+ true
+ 0.48
+ 0.72
+
+
+
+ kitchen
+ true
+
+
+
+ bath
+ true
+
+
+
+
+
+
+ fuel oil
+ storage water heater
+ 40.0
+ 1.0
+ 0.53
+
+
+
+
+
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+ 1.0
+
+
+
+
+
+
+ 2.92
+ 75.0
+ 0.12
+ 1.09
+ 7.0
+ 6.0
+ 4.5
+
+
+
+ fuel oil
+ 3.03
+
+
+
+ 199.0
+ 12
+ 0.12
+ 1.09
+ 18.0
+ 4.0
+
+
+
+ 423.0
+ true
+
+
+
+ fuel oil
+
+
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+ attached on one side
+ no units above or below
+ 180
+
+
+ single-family attached
+ 2.0
+ 2.0
+ 8.0
+ 1
+ 4580.0
+ 36640.0
+
+
+ schedules_4.csv
+
+
+
+
+
+ USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3
+
+ ../../../weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+ 50.0
+
+ ACH
+ 3.0
+
+ 36640.0
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attic - vented
+ 1280.1
+ 0
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+ attic - vented
+ 1280.1
+ 180
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 0
+
+
+ 16.66666667
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 541.4
+ 90
+
+
+ 4.0
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1082.8
+ 180
+
+
+ 16.66666667
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 541.4
+ 270
+
+
+ 16.66666667
+
+
+
+
+ outside
+ attic - vented
+ gable
+
+
+
+ 143.1
+ 270
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 143.1
+ 90
+
+
+ 4.0
+
+
+
+
+
+
+ attic - vented
+ conditioned space
+ ceiling
+
+
+
+ 2290.0
+
+
+ 38.46153846
+
+
+
+
+
+
+ conditioned space
+ 2290.0
+ 169.2
+
+
+
+ 10.0
+ 2.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.8
+
+
+
+
+
+ 97.5
+ 0
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+ 94.9
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 13.0
+
+
+
+
+
+ 100.0
+ 180
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.8
+
+
+
+
+
+ 48.7
+ 270
+ 0.32
+ 0.4
+
+ 2.0
+ 9.0
+ 12.6
+
+
+
+
+
+ 48.7
+ 270
+ 0.32
+ 0.4
+
+ 2.0
+ 1.0
+ 4.6
+
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fuel oil
+
+ AFUE
+ 0.85
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 1.0
+
+ EER
+ 8.5
+
+
+
+
+
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ Percent
+ 0.1
+ to outside
+
+
+
+ return
+
+ Percent
+ 0.1
+ to outside
+
+
+
+
+ supply
+ 8.0
+
+
+
+ return
+ 8.0
+
+
+
+ 4580.0
+
+
+
+
+
+
+ energy recovery ventilator
+ true
+ 0.48
+ 0.72
+
+
+
+ kitchen
+ true
+
+
+
+ bath
+ true
+
+
+
+
+
+
+ fuel oil
+ storage water heater
+ 40.0
+ 1.0
+ 0.53
+
+
+
+
+
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+ 1.0
+
+
+
+
+
+
+ 2.92
+ 75.0
+ 0.12
+ 1.09
+ 7.0
+ 6.0
+ 4.5
+
+
+
+ fuel oil
+ 3.03
+
+
+
+ 199.0
+ 12
+ 0.12
+ 1.09
+ 18.0
+ 4.0
+
+
+
+ 423.0
+ true
+
+
+
+ fuel oil
+
+
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ interior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+ exterior
+ 0.0
+
+
+
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
\ No newline at end of file
diff --git a/example_files/osm_building/7.osm b/example_files/osm_building/7.osm
index 2f0b762f..573726ac 100644
--- a/example_files/osm_building/7.osm
+++ b/example_files/osm_building/7.osm
@@ -87,7 +87,6 @@ OS:WeatherFile,
-78.73, !- Longitude {deg}
-5, !- Time Zone {hr}
215, !- Elevation {m}
- file:///C:/gitrepos/urbanopt-example-geojson-project/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw, !- Url
; !- Checksum
OS:Site:WaterMainsTemperature,
@@ -13827,4 +13826,3 @@ OS:Curve:Cubic,
1.1674, !- Coefficient4 x**3
0, !- Minimum Value of x
1.3; !- Maximum Value of x
-
diff --git a/example_files/osm_building/8.osm b/example_files/osm_building/8.osm
index 023c9ec2..d2fccd3e 100644
--- a/example_files/osm_building/8.osm
+++ b/example_files/osm_building/8.osm
@@ -87,7 +87,6 @@ OS:WeatherFile,
-78.73, !- Longitude {deg}
-5, !- Time Zone {hr}
215, !- Elevation {m}
- file:///C:/gitrepos/urbanopt-example-geojson-project/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw, !- Url
; !- Checksum
OS:Site:WaterMainsTemperature,
@@ -25371,4 +25370,3 @@ OS:Curve:Cubic,
1.1674, !- Coefficient4 x**3
0, !- Minimum Value of x
1.3; !- Maximum Value of x
-
diff --git a/example_files/osm_building/9.osm b/example_files/osm_building/9.osm
index 8d8055b9..5422ad46 100644
--- a/example_files/osm_building/9.osm
+++ b/example_files/osm_building/9.osm
@@ -87,7 +87,6 @@ OS:WeatherFile,
-78.73, !- Longitude {deg}
-5, !- Time Zone {hr}
215, !- Elevation {m}
- file:///C:/gitrepos/urbanopt-example-geojson-project/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.epw, !- Url
; !- Checksum
OS:Site:WaterMainsTemperature,
@@ -14919,4 +14918,3 @@ OS:Curve:Cubic,
OS:AdditionalProperties,
{4b9bd2a9-38d4-48bf-a65b-3b2905990a4f}, !- Handle
{dbe1c071-cef9-4a66-ab11-96e1d7867765}; !- Object Name
-
diff --git a/example_files/python_deps/dependencies.json b/example_files/python_deps/dependencies.json
index 96ab0445..0899e1d9 100644
--- a/example_files/python_deps/dependencies.json
+++ b/example_files/python_deps/dependencies.json
@@ -1,5 +1,6 @@
[
- { "name": "urbanopt-ditto-reader", "version": "0.5.1"},
- { "name": "NREL-disco", "version": "0.4.1"},
- { "name": "geojson-modelica-translator", "version": "0.5.0"}
+ { "name": "ThermalNetwork", "version": "0.2.3"},
+ { "name": "urbanopt-ditto-reader", "version": "0.6.3"},
+ { "name": "NREL-disco", "version": "0.5.0"},
+ { "name": "geojson-modelica-translator", "version": "0.6.0"}
]
diff --git a/example_files/resources/hpxml-measures/.gitattributes b/example_files/resources/hpxml-measures/.gitattributes
new file mode 100644
index 00000000..90fb947a
--- /dev/null
+++ b/example_files/resources/hpxml-measures/.gitattributes
@@ -0,0 +1,3 @@
+# Declare files that will always have CRLF line endings on checkout.
+
+workflow/**/*.xml text eol=crlf
diff --git a/example_files/resources/hpxml-measures/.github/pull_request_template.md b/example_files/resources/hpxml-measures/.github/pull_request_template.md
index 237a37db..7ab8bf1d 100644
--- a/example_files/resources/hpxml-measures/.github/pull_request_template.md
+++ b/example_files/resources/hpxml-measures/.github/pull_request_template.md
@@ -9,8 +9,8 @@ PR Author: Check these when they're done. Not all may apply. ~~strikethrough~~ a
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`)
+- [ ] Sample files have been added/updated (`openstudio tasks.rb update_hpxmls`)
+- [ ] Tests have been added/updated (e.g., `HPXMLtoOpenStudio/tests/test*.rb` and/or `workflow/tests/test*.rb`)
- [ ] Documentation has been updated
- [ ] Changelog has been updated
- [ ] `openstudio tasks.rb update_measures` has been run
diff --git a/example_files/resources/hpxml-measures/.github/workflows/add_to_project.yml b/example_files/resources/hpxml-measures/.github/workflows/add_to_project.yml
new file mode 100644
index 00000000..8dc9884b
--- /dev/null
+++ b/example_files/resources/hpxml-measures/.github/workflows/add_to_project.yml
@@ -0,0 +1,17 @@
+name: Add issue to project
+on:
+ issues:
+ types:
+ - opened
+ - reopened
+ - transferred
+
+jobs:
+ add-to-project:
+ name: Add issue to project
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/add-to-project@v0.3.0
+ with:
+ project-url: https://github.com/orgs/NREL/projects/78
+ github-token: ${{ secrets.GHB_TOKEN }}
\ No newline at end of file
diff --git a/example_files/resources/hpxml-measures/.github/workflows/config.yml b/example_files/resources/hpxml-measures/.github/workflows/config.yml
index d171f7c6..518dc474 100644
--- a/example_files/resources/hpxml-measures/.github/workflows/config.yml
+++ b/example_files/resources/hpxml-measures/.github/workflows/config.yml
@@ -11,7 +11,7 @@ jobs:
run-unit-tests:
runs-on: ubuntu-latest
container:
- image: docker://nrel/openstudio:3.6.1
+ image: docker://nrel/openstudio:3.7.0
steps:
- uses: actions/checkout@v3
with:
@@ -43,6 +43,12 @@ jobs:
path: coverage
name: coverage
+ - name: Store results
+ uses: actions/upload-artifact@v3
+ with:
+ path: workflow/tests/results
+ name: results
+
- name: Build documentation
run: |
cd docs
@@ -54,10 +60,33 @@ jobs:
name: documentation
path: docs/_build/html/
- run-workflow-tests:
+ run-workflow1-tests:
+ runs-on: ubuntu-latest
+ container:
+ image: docker://nrel/openstudio:3.7.0
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ ref: ${{ github.head_ref }}
+
+ - name: Install software
+ run: |
+ rm -f Gemfile.lock && bundle install
+
+ - name: Run workflow tests
+ run: |
+ bundle exec rake test_workflow1
+
+ - name: Store results
+ uses: actions/upload-artifact@v3
+ with:
+ path: workflow/tests/results
+ name: results
+
+ run-workflow2-tests:
runs-on: ubuntu-latest
container:
- image: docker://nrel/openstudio:3.6.1
+ image: docker://nrel/openstudio:3.7.0
steps:
- uses: actions/checkout@v3
with:
@@ -69,7 +98,7 @@ jobs:
- name: Run workflow tests
run: |
- bundle exec rake test_workflow
+ bundle exec rake test_workflow2
- name: Store results
uses: actions/upload-artifact@v3
@@ -86,8 +115,8 @@ jobs:
- name: Install software and run test
shell: pwsh
run: |
- $env:OS_VERSION="3.6.1"
- $env:OS_SHA="bb9481519e"
+ $env:OS_VERSION="3.7.0"
+ $env:OS_SHA="d5269793f1"
Invoke-WebRequest -OutFile Windows.tar.gz -URI "https://github.com/NREL/OpenStudio/releases/download/v${env:OS_VERSION}/OpenStudio-${env:OS_VERSION}+${env:OS_SHA}-Windows.tar.gz"
tar -xzf Windows.tar.gz
& .\OpenStudio-${env:OS_VERSION}+${env:OS_SHA}-Windows\bin\openstudio.exe workflow\run_simulation.rb -x workflow\sample_files\base.xml --hourly ALL --add-component-loads --add-stochastic-schedules
@@ -95,7 +124,7 @@ jobs:
compare-results:
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
- needs: [run-workflow-tests]
+ needs: [run-workflow1-tests, run-workflow2-tests, run-unit-tests]
steps:
- uses: actions/checkout@v3
with:
@@ -147,7 +176,7 @@ jobs:
update-results:
runs-on: ubuntu-latest
- needs: [run-workflow-tests]
+ needs: [run-workflow1-tests, run-workflow2-tests, run-unit-tests]
steps:
- uses: actions/checkout@v3
with:
diff --git a/example_files/resources/hpxml-measures/.gitignore b/example_files/resources/hpxml-measures/.gitignore
index a0fcb5bb..d9c6bb29 100644
--- a/example_files/resources/hpxml-measures/.gitignore
+++ b/example_files/resources/hpxml-measures/.gitignore
@@ -1,3 +1,4 @@
+.ruby-version
/coverage
/docs/_build
/results
diff --git a/example_files/resources/hpxml-measures/.readthedocs.yml b/example_files/resources/hpxml-measures/.readthedocs.yml
index bfe20b3a..aa4109f6 100644
--- a/example_files/resources/hpxml-measures/.readthedocs.yml
+++ b/example_files/resources/hpxml-measures/.readthedocs.yml
@@ -4,6 +4,10 @@ sphinx:
configuration: docs/source/conf.py
build:
- os: ubuntu-22.04
+ os: "ubuntu-22.04"
tools:
- python: "3.8"
\ No newline at end of file
+ python: "3.11"
+
+python:
+ install:
+ - requirements: docs/requirements.txt
\ No newline at end of file
diff --git a/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md b/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md
new file mode 100644
index 00000000..3ad5ef7c
--- /dev/null
+++ b/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md
@@ -0,0 +1,5596 @@
+
+###### (Automatically generated documentation)
+
+# HPXML Builder
+
+## Description
+Builds a residential HPXML file.
+
+Note: OS-HPXML default values can be found in the OS-HPXML documentation or can be seen by using the 'apply_defaults' argument.
+
+## Arguments
+
+
+**HPXML File Path**
+
+Absolute/relative path of the HPXML file.
+
+- **Name:** ``hpxml_path``
+- **Type:** ``String``
+
+- **Required:** ``true``
+
+
+
+**Existing HPXML File Path**
+
+Absolute/relative path of the existing HPXML file. If not provided, a new HPXML file with one Building element is created. If provided, a new Building element will be appended to this HPXML file (e.g., to create a multifamily HPXML file describing multiple dwelling units).
+
+- **Name:** ``existing_hpxml_path``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Software Info: Program Used**
+
+The name of the software program used.
+
+- **Name:** ``software_info_program_used``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Software Info: Program Version**
+
+The version of the software program used.
+
+- **Name:** ``software_info_program_version``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Schedules: CSV File Paths**
+
+Absolute/relative paths of csv files containing user-specified detailed schedules. If multiple files, use a comma-separated list.
+
+- **Name:** ``schedules_filepaths``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Schedules: Vacancy Period**
+
+Specifies the vacancy period. Enter a date like "Dec 15 - Jan 15". Optionally, can enter hour of the day like "Dec 15 2 - Jan 15 20" (start hour can be 0 through 23 and end hour can be 1 through 24).
+
+- **Name:** ``schedules_vacancy_period``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Schedules: Power Outage Period**
+
+Specifies the power outage period. Enter a date like "Dec 15 - Jan 15". Optionally, can enter hour of the day like "Dec 15 2 - Jan 15 20" (start hour can be 0 through 23 and end hour can be 1 through 24).
+
+- **Name:** ``schedules_power_outage_period``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Schedules: Power Outage Period Window Natural Ventilation Availability**
+
+The availability of the natural ventilation schedule during the outage period.
+
+- **Name:** ``schedules_power_outage_window_natvent_availability``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `regular schedule`, `always available`, `always unavailable`
+
+
+
+**Simulation Control: Timestep**
+
+Value must be a divisor of 60. If not provided, the OS-HPXML default (see HPXML Simulation Control) is used.
+
+- **Name:** ``simulation_control_timestep``
+- **Type:** ``Integer``
+
+- **Units:** ``min``
+
+- **Required:** ``false``
+
+
+
+**Simulation Control: Run Period**
+
+Enter a date like 'Jan 1 - Dec 31'. If not provided, the OS-HPXML default (see HPXML Simulation Control) is used.
+
+- **Name:** ``simulation_control_run_period``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Simulation Control: Run Period Calendar Year**
+
+This numeric field should contain the calendar year that determines the start day of week. If you are running simulations using AMY weather files, the value entered for calendar year will not be used; it will be overridden by the actual year found in the AMY weather file. If not provided, the OS-HPXML default (see HPXML Simulation Control) is used.
+
+- **Name:** ``simulation_control_run_period_calendar_year``
+- **Type:** ``Integer``
+
+- **Units:** ``year``
+
+- **Required:** ``false``
+
+
+
+**Simulation Control: Daylight Saving Enabled**
+
+Whether to use daylight saving. If not provided, the OS-HPXML default (see HPXML Building Site) is used.
+
+- **Name:** ``simulation_control_daylight_saving_enabled``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Simulation Control: Daylight Saving Period**
+
+Enter a date like 'Mar 15 - Dec 15'. If not provided, the OS-HPXML default (see HPXML Building Site) is used.
+
+- **Name:** ``simulation_control_daylight_saving_period``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Simulation Control: Temperature Capacitance Multiplier**
+
+Affects the transient calculation of indoor air temperatures. If not provided, the OS-HPXML default (see HPXML Simulation Control) is used.
+
+- **Name:** ``simulation_control_temperature_capacitance_multiplier``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Site: Type**
+
+The type of site. If not provided, the OS-HPXML default (see HPXML Site) is used.
+
+- **Name:** ``site_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `suburban`, `urban`, `rural`
+
+
+
+**Site: Shielding of Home**
+
+Presence of nearby buildings, trees, obstructions for infiltration model. If not provided, the OS-HPXML default (see HPXML Site) is used.
+
+- **Name:** ``site_shielding_of_home``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `exposed`, `normal`, `well-shielded`
+
+
+
+**Site: Ground Conductivity**
+
+Conductivity of the ground soil. If not provided, the OS-HPXML default (see HPXML Site) is used.
+
+- **Name:** ``site_ground_conductivity``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr-ft-F``
+
+- **Required:** ``false``
+
+
+
+**Site: Zip Code**
+
+Zip code of the home address.
+
+- **Name:** ``site_zip_code``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Site: IECC Zone**
+
+IECC zone of the home address.
+
+- **Name:** ``site_iecc_zone``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `1A`, `1B`, `1C`, `2A`, `2B`, `2C`, `3A`, `3B`, `3C`, `4A`, `4B`, `4C`, `5A`, `5B`, `5C`, `6A`, `6B`, `6C`, `7`, `8`
+
+
+
+**Site: State Code**
+
+State code of the home address.
+
+- **Name:** ``site_state_code``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `AK`, `AL`, `AR`, `AZ`, `CA`, `CO`, `CT`, `DC`, `DE`, `FL`, `GA`, `HI`, `IA`, `ID`, `IL`, `IN`, `KS`, `KY`, `LA`, `MA`, `MD`, `ME`, `MI`, `MN`, `MO`, `MS`, `MT`, `NC`, `ND`, `NE`, `NH`, `NJ`, `NM`, `NV`, `NY`, `OH`, `OK`, `OR`, `PA`, `RI`, `SC`, `SD`, `TN`, `TX`, `UT`, `VA`, `VT`, `WA`, `WI`, `WV`, `WY`
+
+
+
+**Site: Time Zone UTC Offset**
+
+Time zone UTC offset of the home address. Must be between -12 and 14.
+
+- **Name:** ``site_time_zone_utc_offset``
+- **Type:** ``Double``
+
+- **Units:** ``hr``
+
+- **Required:** ``false``
+
+
+
+**Weather Station: EnergyPlus Weather (EPW) Filepath**
+
+Path of the EPW file.
+
+- **Name:** ``weather_station_epw_filepath``
+- **Type:** ``String``
+
+- **Required:** ``true``
+
+
+
+**Building Construction: Year Built**
+
+The year the building was built.
+
+- **Name:** ``year_built``
+- **Type:** ``Integer``
+
+- **Required:** ``false``
+
+
+
+**Building Construction: Unit Multiplier**
+
+The number of similar dwelling units. EnergyPlus simulation results will be multiplied this value. If not provided, defaults to 1.
+
+- **Name:** ``unit_multiplier``
+- **Type:** ``Integer``
+
+- **Required:** ``false``
+
+
+
+**Geometry: Unit Type**
+
+The type of dwelling unit. Use single-family attached for a dwelling unit with 1 or more stories, attached units to one or both sides, and no units above/below. Use apartment unit for a dwelling unit with 1 story, attached units to one, two, or three sides, and units above and/or below.
+
+- **Name:** ``geometry_unit_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `single-family detached`, `single-family attached`, `apartment unit`, `manufactured home`
+
+
+
+**Geometry: Unit Left Wall Is Adiabatic**
+
+Presence of an adiabatic left wall.
+
+- **Name:** ``geometry_unit_left_wall_is_adiabatic``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Geometry: Unit Right Wall Is Adiabatic**
+
+Presence of an adiabatic right wall.
+
+- **Name:** ``geometry_unit_right_wall_is_adiabatic``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Geometry: Unit Front Wall Is Adiabatic**
+
+Presence of an adiabatic front wall, for example, the unit is adjacent to a conditioned corridor.
+
+- **Name:** ``geometry_unit_front_wall_is_adiabatic``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Geometry: Unit Back Wall Is Adiabatic**
+
+Presence of an adiabatic back wall.
+
+- **Name:** ``geometry_unit_back_wall_is_adiabatic``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Geometry: Unit Number of Floors Above Grade**
+
+The number of floors above grade in the unit. Attic type ConditionedAttic is included. Assumed to be 1 for apartment units.
+
+- **Name:** ``geometry_unit_num_floors_above_grade``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``true``
+
+
+
+**Geometry: Unit Conditioned Floor Area**
+
+The total floor area of the unit's conditioned space (including any conditioned basement floor area).
+
+- **Name:** ``geometry_unit_cfa``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``true``
+
+
+
+**Geometry: Unit Aspect Ratio**
+
+The ratio of front/back wall length to left/right wall length for the unit, excluding any protruding garage wall area.
+
+- **Name:** ``geometry_unit_aspect_ratio``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Geometry: Unit Orientation**
+
+The unit's orientation is measured clockwise from north (e.g., North=0, East=90, South=180, West=270).
+
+- **Name:** ``geometry_unit_orientation``
+- **Type:** ``Double``
+
+- **Units:** ``degrees``
+
+- **Required:** ``true``
+
+
+
+**Geometry: Unit Number of Bedrooms**
+
+The number of bedrooms in the unit.
+
+- **Name:** ``geometry_unit_num_bedrooms``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``true``
+
+
+
+**Geometry: Unit Number of Bathrooms**
+
+The number of bathrooms in the unit. If not provided, the OS-HPXML default (see HPXML Building Construction) is used.
+
+- **Name:** ``geometry_unit_num_bathrooms``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``false``
+
+
+
+**Geometry: Unit Number of Occupants**
+
+The number of occupants in the unit. If not provided, an *asset* calculation is performed assuming standard occupancy, in which various end use defaults (e.g., plug loads, appliances, and hot water usage) are calculated based on Number of Bedrooms and Conditioned Floor Area per ANSI/RESNET/ICC 301-2019. If provided, an *operational* calculation is instead performed in which the end use defaults are adjusted using the relationship between Number of Bedrooms and Number of Occupants from RECS 2015.
+
+- **Name:** ``geometry_unit_num_occupants``
+- **Type:** ``Double``
+
+- **Units:** ``#``
+
+- **Required:** ``false``
+
+
+
+**Geometry: Building Number of Units**
+
+The number of units in the building. Required for single-family attached and apartment units.
+
+- **Name:** ``geometry_building_num_units``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``false``
+
+
+
+**Geometry: Average Ceiling Height**
+
+Average distance from the floor to the ceiling.
+
+- **Name:** ``geometry_average_ceiling_height``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Geometry: Garage Width**
+
+The width of the garage. Enter zero for no garage. Only applies to single-family detached units.
+
+- **Name:** ``geometry_garage_width``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Geometry: Garage Depth**
+
+The depth of the garage. Only applies to single-family detached units.
+
+- **Name:** ``geometry_garage_depth``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Geometry: Garage Protrusion**
+
+The fraction of the garage that is protruding from the conditioned space. Only applies to single-family detached units.
+
+- **Name:** ``geometry_garage_protrusion``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Geometry: Garage Position**
+
+The position of the garage. Only applies to single-family detached units.
+
+- **Name:** ``geometry_garage_position``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `Right`, `Left`
+
+
+
+**Geometry: Foundation Type**
+
+The foundation type of the building. Foundation types ConditionedBasement and ConditionedCrawlspace are not allowed for apartment units.
+
+- **Name:** ``geometry_foundation_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `SlabOnGrade`, `VentedCrawlspace`, `UnventedCrawlspace`, `ConditionedCrawlspace`, `UnconditionedBasement`, `ConditionedBasement`, `Ambient`, `AboveApartment`, `BellyAndWingWithSkirt`, `BellyAndWingNoSkirt`
+
+
+
+**Geometry: Foundation Height**
+
+The height of the foundation (e.g., 3ft for crawlspace, 8ft for basement). Only applies to basements/crawlspaces.
+
+- **Name:** ``geometry_foundation_height``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Geometry: Foundation Height Above Grade**
+
+The depth above grade of the foundation wall. Only applies to basements/crawlspaces.
+
+- **Name:** ``geometry_foundation_height_above_grade``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Geometry: Rim Joist Height**
+
+The height of the rim joists. Only applies to basements/crawlspaces.
+
+- **Name:** ``geometry_rim_joist_height``
+- **Type:** ``Double``
+
+- **Units:** ``in``
+
+- **Required:** ``false``
+
+
+
+**Geometry: Attic Type**
+
+The attic type of the building. Attic type ConditionedAttic is not allowed for apartment units.
+
+- **Name:** ``geometry_attic_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `FlatRoof`, `VentedAttic`, `UnventedAttic`, `ConditionedAttic`, `BelowApartment`
+
+
+
+**Geometry: Roof Type**
+
+The roof type of the building. Ignored if the building has a flat roof.
+
+- **Name:** ``geometry_roof_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `gable`, `hip`
+
+
+
+**Geometry: Roof Pitch**
+
+The roof pitch of the attic. Ignored if the building has a flat roof.
+
+- **Name:** ``geometry_roof_pitch``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `1:12`, `2:12`, `3:12`, `4:12`, `5:12`, `6:12`, `7:12`, `8:12`, `9:12`, `10:12`, `11:12`, `12:12`
+
+
+
+**Geometry: Eaves Depth**
+
+The eaves depth of the roof.
+
+- **Name:** ``geometry_eaves_depth``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Neighbor: Front Distance**
+
+The distance between the unit and the neighboring building to the front (not including eaves). A value of zero indicates no neighbors. Used for shading.
+
+- **Name:** ``neighbor_front_distance``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Neighbor: Back Distance**
+
+The distance between the unit and the neighboring building to the back (not including eaves). A value of zero indicates no neighbors. Used for shading.
+
+- **Name:** ``neighbor_back_distance``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Neighbor: Left Distance**
+
+The distance between the unit and the neighboring building to the left (not including eaves). A value of zero indicates no neighbors. Used for shading.
+
+- **Name:** ``neighbor_left_distance``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Neighbor: Right Distance**
+
+The distance between the unit and the neighboring building to the right (not including eaves). A value of zero indicates no neighbors. Used for shading.
+
+- **Name:** ``neighbor_right_distance``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Neighbor: Front Height**
+
+The height of the neighboring building to the front. If not provided, the OS-HPXML default (see HPXML Site) is used.
+
+- **Name:** ``neighbor_front_height``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``false``
+
+
+
+**Neighbor: Back Height**
+
+The height of the neighboring building to the back. If not provided, the OS-HPXML default (see HPXML Site) is used.
+
+- **Name:** ``neighbor_back_height``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``false``
+
+
+
+**Neighbor: Left Height**
+
+The height of the neighboring building to the left. If not provided, the OS-HPXML default (see HPXML Site) is used.
+
+- **Name:** ``neighbor_left_height``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``false``
+
+
+
+**Neighbor: Right Height**
+
+The height of the neighboring building to the right. If not provided, the OS-HPXML default (see HPXML Site) is used.
+
+- **Name:** ``neighbor_right_height``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``false``
+
+
+
+**Floor: Over Foundation Assembly R-value**
+
+Assembly R-value for the floor over the foundation. Ignored if the building has a slab-on-grade foundation.
+
+- **Name:** ``floor_over_foundation_assembly_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``true``
+
+
+
+**Floor: Over Garage Assembly R-value**
+
+Assembly R-value for the floor over the garage. Ignored unless the building has a garage under conditioned space.
+
+- **Name:** ``floor_over_garage_assembly_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``true``
+
+
+
+**Floor: Type**
+
+The type of floors.
+
+- **Name:** ``floor_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `WoodFrame`, `StructuralInsulatedPanel`, `SolidConcrete`, `SteelFrame`
+
+
+
+**Foundation Wall: Type**
+
+The material type of the foundation wall. If not provided, the OS-HPXML default (see HPXML Foundation Walls) is used.
+
+- **Name:** ``foundation_wall_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `solid concrete`, `concrete block`, `concrete block foam core`, `concrete block perlite core`, `concrete block vermiculite core`, `concrete block solid core`, `double brick`, `wood`
+
+
+
+**Foundation Wall: Thickness**
+
+The thickness of the foundation wall. If not provided, the OS-HPXML default (see HPXML Foundation Walls) is used.
+
+- **Name:** ``foundation_wall_thickness``
+- **Type:** ``Double``
+
+- **Units:** ``in``
+
+- **Required:** ``false``
+
+
+
+**Foundation Wall: Insulation Nominal R-value**
+
+Nominal R-value for the foundation wall insulation. Only applies to basements/crawlspaces.
+
+- **Name:** ``foundation_wall_insulation_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``true``
+
+
+
+**Foundation Wall: Insulation Location**
+
+Whether the insulation is on the interior or exterior of the foundation wall. Only applies to basements/crawlspaces.
+
+- **Name:** ``foundation_wall_insulation_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `interior`, `exterior`
+
+
+
+**Foundation Wall: Insulation Distance To Top**
+
+The distance from the top of the foundation wall to the top of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default (see HPXML Foundation Walls) is used.
+
+- **Name:** ``foundation_wall_insulation_distance_to_top``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``false``
+
+
+
+**Foundation Wall: Insulation Distance To Bottom**
+
+The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default (see HPXML Foundation Walls) is used.
+
+- **Name:** ``foundation_wall_insulation_distance_to_bottom``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``false``
+
+
+
+**Foundation Wall: Assembly R-value**
+
+Assembly R-value for the foundation walls. Only applies to basements/crawlspaces. If provided, overrides the previous foundation wall insulation inputs. If not provided, it is ignored.
+
+- **Name:** ``foundation_wall_assembly_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``false``
+
+
+
+**Rim Joist: Assembly R-value**
+
+Assembly R-value for the rim joists. Only applies to basements/crawlspaces. Required if a rim joist height is provided.
+
+- **Name:** ``rim_joist_assembly_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``false``
+
+
+
+**Slab: Perimeter Insulation Nominal R-value**
+
+Nominal R-value of the vertical slab perimeter insulation. Applies to slab-on-grade foundations and basement/crawlspace floors.
+
+- **Name:** ``slab_perimeter_insulation_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``true``
+
+
+
+**Slab: Perimeter Insulation Depth**
+
+Depth from grade to bottom of vertical slab perimeter insulation. Applies to slab-on-grade foundations and basement/crawlspace floors.
+
+- **Name:** ``slab_perimeter_depth``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Slab: Under Slab Insulation Nominal R-value**
+
+Nominal R-value of the horizontal under slab insulation. Applies to slab-on-grade foundations and basement/crawlspace floors.
+
+- **Name:** ``slab_under_insulation_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``true``
+
+
+
+**Slab: Under Slab Insulation Width**
+
+Width from slab edge inward of horizontal under-slab insulation. Enter 999 to specify that the under slab insulation spans the entire slab. Applies to slab-on-grade foundations and basement/crawlspace floors.
+
+- **Name:** ``slab_under_width``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Slab: Thickness**
+
+The thickness of the slab. Zero can be entered if there is a dirt floor instead of a slab. If not provided, the OS-HPXML default (see HPXML Slabs) is used.
+
+- **Name:** ``slab_thickness``
+- **Type:** ``Double``
+
+- **Units:** ``in``
+
+- **Required:** ``false``
+
+
+
+**Slab: Carpet Fraction**
+
+Fraction of the slab floor area that is carpeted. If not provided, the OS-HPXML default (see HPXML Slabs) is used.
+
+- **Name:** ``slab_carpet_fraction``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Slab: Carpet R-value**
+
+R-value of the slab carpet. If not provided, the OS-HPXML default (see HPXML Slabs) is used.
+
+- **Name:** ``slab_carpet_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``false``
+
+
+
+**Ceiling: Assembly R-value**
+
+Assembly R-value for the ceiling (attic floor).
+
+- **Name:** ``ceiling_assembly_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``true``
+
+
+
+**Roof: Material Type**
+
+The material type of the roof. If not provided, the OS-HPXML default (see HPXML Roofs) is used.
+
+- **Name:** ``roof_material_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `asphalt or fiberglass shingles`, `concrete`, `cool roof`, `slate or tile shingles`, `expanded polystyrene sheathing`, `metal surfacing`, `plastic/rubber/synthetic sheeting`, `shingles`, `wood shingles or shakes`
+
+
+
+**Roof: Color**
+
+The color of the roof. If not provided, the OS-HPXML default (see HPXML Roofs) is used.
+
+- **Name:** ``roof_color``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `dark`, `light`, `medium`, `medium dark`, `reflective`
+
+
+
+**Roof: Assembly R-value**
+
+Assembly R-value of the roof.
+
+- **Name:** ``roof_assembly_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``true``
+
+
+
+**Roof: Has Radiant Barrier**
+
+Presence of a radiant barrier in the attic.
+
+- **Name:** ``roof_radiant_barrier``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Roof: Radiant Barrier Grade**
+
+The grade of the radiant barrier. If not provided, the OS-HPXML default (see HPXML Roofs) is used.
+
+- **Name:** ``roof_radiant_barrier_grade``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `1`, `2`, `3`
+
+
+
+**Wall: Type**
+
+The type of walls.
+
+- **Name:** ``wall_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `WoodStud`, `ConcreteMasonryUnit`, `DoubleWoodStud`, `InsulatedConcreteForms`, `LogWall`, `StructuralInsulatedPanel`, `SolidConcrete`, `SteelFrame`, `Stone`, `StrawBale`, `StructuralBrick`
+
+
+
+**Wall: Siding Type**
+
+The siding type of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see HPXML Walls) is used.
+
+- **Name:** ``wall_siding_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `aluminum siding`, `asbestos siding`, `brick veneer`, `composite shingle siding`, `fiber cement siding`, `masonite siding`, `none`, `stucco`, `synthetic stucco`, `vinyl siding`, `wood siding`
+
+
+
+**Wall: Color**
+
+The color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see HPXML Walls) is used.
+
+- **Name:** ``wall_color``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `dark`, `light`, `medium`, `medium dark`, `reflective`
+
+
+
+**Wall: Assembly R-value**
+
+Assembly R-value of the walls.
+
+- **Name:** ``wall_assembly_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``true``
+
+
+
+**Windows: Front Window-to-Wall Ratio**
+
+The ratio of window area to wall area for the unit's front facade. Enter 0 if specifying Front Window Area instead.
+
+- **Name:** ``window_front_wwr``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Windows: Back Window-to-Wall Ratio**
+
+The ratio of window area to wall area for the unit's back facade. Enter 0 if specifying Back Window Area instead.
+
+- **Name:** ``window_back_wwr``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Windows: Left Window-to-Wall Ratio**
+
+The ratio of window area to wall area for the unit's left facade (when viewed from the front). Enter 0 if specifying Left Window Area instead.
+
+- **Name:** ``window_left_wwr``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Windows: Right Window-to-Wall Ratio**
+
+The ratio of window area to wall area for the unit's right facade (when viewed from the front). Enter 0 if specifying Right Window Area instead.
+
+- **Name:** ``window_right_wwr``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Windows: Front Window Area**
+
+The amount of window area on the unit's front facade. Enter 0 if specifying Front Window-to-Wall Ratio instead.
+
+- **Name:** ``window_area_front``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``true``
+
+
+
+**Windows: Back Window Area**
+
+The amount of window area on the unit's back facade. Enter 0 if specifying Back Window-to-Wall Ratio instead.
+
+- **Name:** ``window_area_back``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``true``
+
+
+
+**Windows: Left Window Area**
+
+The amount of window area on the unit's left facade (when viewed from the front). Enter 0 if specifying Left Window-to-Wall Ratio instead.
+
+- **Name:** ``window_area_left``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``true``
+
+
+
+**Windows: Right Window Area**
+
+The amount of window area on the unit's right facade (when viewed from the front). Enter 0 if specifying Right Window-to-Wall Ratio instead.
+
+- **Name:** ``window_area_right``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``true``
+
+
+
+**Windows: Aspect Ratio**
+
+Ratio of window height to width.
+
+- **Name:** ``window_aspect_ratio``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Windows: Fraction Operable**
+
+Fraction of windows that are operable. If not provided, the OS-HPXML default (see HPXML Windows) is used.
+
+- **Name:** ``window_fraction_operable``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Windows: Natural Ventilation Availability**
+
+For operable windows, the number of days/week that windows can be opened by occupants for natural ventilation. If not provided, the OS-HPXML default (see HPXML Windows) is used.
+
+- **Name:** ``window_natvent_availability``
+- **Type:** ``Integer``
+
+- **Units:** ``Days/week``
+
+- **Required:** ``false``
+
+
+
+**Windows: U-Factor**
+
+Full-assembly NFRC U-factor.
+
+- **Name:** ``window_ufactor``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr-ft^2-R``
+
+- **Required:** ``true``
+
+
+
+**Windows: SHGC**
+
+Full-assembly NFRC solar heat gain coefficient.
+
+- **Name:** ``window_shgc``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Windows: Winter Interior Shading**
+
+Interior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see HPXML Windows) is used.
+
+- **Name:** ``window_interior_shading_winter``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Windows: Summer Interior Shading**
+
+Interior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see HPXML Windows) is used.
+
+- **Name:** ``window_interior_shading_summer``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Windows: Winter Exterior Shading**
+
+Exterior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see HPXML Windows) is used.
+
+- **Name:** ``window_exterior_shading_winter``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Windows: Summer Exterior Shading**
+
+Exterior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see HPXML Windows) is used.
+
+- **Name:** ``window_exterior_shading_summer``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Windows: Shading Summer Season**
+
+Enter a date like 'May 1 - Sep 30'. Defines the summer season for purposes of shading coefficients; the rest of the year is assumed to be winter. If not provided, the OS-HPXML default (see HPXML Windows) is used.
+
+- **Name:** ``window_shading_summer_season``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Windows: Storm Type**
+
+The type of storm, if present. If not provided, assumes there is no storm.
+
+- **Name:** ``window_storm_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `clear`, `low-e`
+
+
+
+**Overhangs: Front Depth**
+
+The depth of overhangs for windows for the front facade.
+
+- **Name:** ``overhangs_front_depth``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Overhangs: Front Distance to Top of Window**
+
+The overhangs distance to the top of window for the front facade.
+
+- **Name:** ``overhangs_front_distance_to_top_of_window``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Overhangs: Front Distance to Bottom of Window**
+
+The overhangs distance to the bottom of window for the front facade.
+
+- **Name:** ``overhangs_front_distance_to_bottom_of_window``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Overhangs: Back Depth**
+
+The depth of overhangs for windows for the back facade.
+
+- **Name:** ``overhangs_back_depth``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Overhangs: Back Distance to Top of Window**
+
+The overhangs distance to the top of window for the back facade.
+
+- **Name:** ``overhangs_back_distance_to_top_of_window``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Overhangs: Back Distance to Bottom of Window**
+
+The overhangs distance to the bottom of window for the back facade.
+
+- **Name:** ``overhangs_back_distance_to_bottom_of_window``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Overhangs: Left Depth**
+
+The depth of overhangs for windows for the left facade.
+
+- **Name:** ``overhangs_left_depth``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Overhangs: Left Distance to Top of Window**
+
+The overhangs distance to the top of window for the left facade.
+
+- **Name:** ``overhangs_left_distance_to_top_of_window``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Overhangs: Left Distance to Bottom of Window**
+
+The overhangs distance to the bottom of window for the left facade.
+
+- **Name:** ``overhangs_left_distance_to_bottom_of_window``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Overhangs: Right Depth**
+
+The depth of overhangs for windows for the right facade.
+
+- **Name:** ``overhangs_right_depth``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Overhangs: Right Distance to Top of Window**
+
+The overhangs distance to the top of window for the right facade.
+
+- **Name:** ``overhangs_right_distance_to_top_of_window``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Overhangs: Right Distance to Bottom of Window**
+
+The overhangs distance to the bottom of window for the right facade.
+
+- **Name:** ``overhangs_right_distance_to_bottom_of_window``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``true``
+
+
+
+**Skylights: Front Roof Area**
+
+The amount of skylight area on the unit's front conditioned roof facade.
+
+- **Name:** ``skylight_area_front``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``true``
+
+
+
+**Skylights: Back Roof Area**
+
+The amount of skylight area on the unit's back conditioned roof facade.
+
+- **Name:** ``skylight_area_back``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``true``
+
+
+
+**Skylights: Left Roof Area**
+
+The amount of skylight area on the unit's left conditioned roof facade (when viewed from the front).
+
+- **Name:** ``skylight_area_left``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``true``
+
+
+
+**Skylights: Right Roof Area**
+
+The amount of skylight area on the unit's right conditioned roof facade (when viewed from the front).
+
+- **Name:** ``skylight_area_right``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``true``
+
+
+
+**Skylights: U-Factor**
+
+Full-assembly NFRC U-factor.
+
+- **Name:** ``skylight_ufactor``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr-ft^2-R``
+
+- **Required:** ``true``
+
+
+
+**Skylights: SHGC**
+
+Full-assembly NFRC solar heat gain coefficient.
+
+- **Name:** ``skylight_shgc``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Skylights: Storm Type**
+
+The type of storm, if present. If not provided, assumes there is no storm.
+
+- **Name:** ``skylight_storm_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `clear`, `low-e`
+
+
+
+**Doors: Area**
+
+The area of the opaque door(s).
+
+- **Name:** ``door_area``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``true``
+
+
+
+**Doors: R-value**
+
+R-value of the opaque door(s).
+
+- **Name:** ``door_rvalue``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``true``
+
+
+
+**Air Leakage: Units**
+
+The unit of measure for the air leakage.
+
+- **Name:** ``air_leakage_units``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `ACH`, `CFM`, `ACHnatural`, `CFMnatural`, `EffectiveLeakageArea`
+
+
+
+**Air Leakage: House Pressure**
+
+The house pressure relative to outside. Required when units are ACH or CFM.
+
+- **Name:** ``air_leakage_house_pressure``
+- **Type:** ``Double``
+
+- **Units:** ``Pa``
+
+- **Required:** ``true``
+
+
+
+**Air Leakage: Value**
+
+Air exchange rate value. For 'EffectiveLeakageArea', provide value in sq. in.
+
+- **Name:** ``air_leakage_value``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Air Leakage: Type**
+
+Type of air leakage. If 'unit total', represents the total infiltration to the unit as measured by a compartmentalization test, in which case the air leakage value will be adjusted by the ratio of exterior envelope surface area to total envelope surface area. Otherwise, if 'unit exterior only', represents the infiltration to the unit from outside only as measured by a guarded test. Required when unit type is single-family attached or apartment unit.
+
+- **Name:** ``air_leakage_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `unit total`, `unit exterior only`
+
+
+
+**Air Leakage: Has Flue or Chimney in Conditioned Space**
+
+Presence of flue or chimney with combustion air from conditioned space; used for infiltration model. If not provided, the OS-HPXML default (see Flue or Chimney) is used.
+
+- **Name:** ``air_leakage_has_flue_or_chimney_in_conditioned_space``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Heating System: Type**
+
+The type of heating system. Use 'none' if there is no heating system or if there is a heat pump serving a heating load.
+
+- **Name:** ``heating_system_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `Furnace`, `WallFurnace`, `FloorFurnace`, `Boiler`, `ElectricResistance`, `Stove`, `SpaceHeater`, `Fireplace`, `Shared Boiler w/ Baseboard`, `Shared Boiler w/ Ductless Fan Coil`
+
+
+
+**Heating System: Fuel Type**
+
+The fuel type of the heating system. Ignored for ElectricResistance.
+
+- **Name:** ``heating_system_fuel``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `electricity`, `natural gas`, `fuel oil`, `propane`, `wood`, `wood pellets`, `coal`
+
+
+
+**Heating System: Rated AFUE or Percent**
+
+The rated heating efficiency value of the heating system.
+
+- **Name:** ``heating_system_heating_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Heating System: Heating Capacity**
+
+The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default (see HPXML Heating Systems) is used.
+
+- **Name:** ``heating_system_heating_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr``
+
+- **Required:** ``false``
+
+
+
+**Heating System: Fraction Heat Load Served**
+
+The heating load served by the heating system.
+
+- **Name:** ``heating_system_fraction_heat_load_served``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Heating System: Pilot Light**
+
+The fuel usage of the pilot light. Applies only to Furnace, WallFurnace, FloorFurnace, Stove, Boiler, and Fireplace with non-electric fuel type. If not provided, assumes no pilot light.
+
+- **Name:** ``heating_system_pilot_light``
+- **Type:** ``Double``
+
+- **Units:** ``Btuh``
+
+- **Required:** ``false``
+
+
+
+**Heating System: Airflow Defect Ratio**
+
+The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the heating system per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to Furnace. If not provided, assumes no defect.
+
+- **Name:** ``heating_system_airflow_defect_ratio``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Cooling System: Type**
+
+The type of cooling system. Use 'none' if there is no cooling system or if there is a heat pump serving a cooling load.
+
+- **Name:** ``cooling_system_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `central air conditioner`, `room air conditioner`, `evaporative cooler`, `mini-split`, `packaged terminal air conditioner`
+
+
+
+**Cooling System: Efficiency Type**
+
+The efficiency type of the cooling system. System types central air conditioner and mini-split use SEER or SEER2. System types room air conditioner and packaged terminal air conditioner use EER or CEER. Ignored for system type evaporative cooler.
+
+- **Name:** ``cooling_system_cooling_efficiency_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `SEER`, `SEER2`, `EER`, `CEER`
+
+
+
+**Cooling System: Efficiency**
+
+The rated efficiency value of the cooling system. Ignored for evaporative cooler.
+
+- **Name:** ``cooling_system_cooling_efficiency``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Cooling System: Cooling Compressor Type**
+
+The compressor type of the cooling system. Only applies to central air conditioner and mini-split. If not provided, the OS-HPXML default (see Central Air Conditioner, Mini-Split Air Conditioner) is used.
+
+- **Name:** ``cooling_system_cooling_compressor_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `single stage`, `two stage`, `variable speed`
+
+
+
+**Cooling System: Cooling Sensible Heat Fraction**
+
+The sensible heat fraction of the cooling system. Ignored for evaporative cooler. If not provided, the OS-HPXML default (see Central Air Conditioner, Room Air Conditioner, Packaged Terminal Air Conditioner, Mini-Split Air Conditioner) is used.
+
+- **Name:** ``cooling_system_cooling_sensible_heat_fraction``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Cooling System: Cooling Capacity**
+
+The output cooling capacity of the cooling system. If not provided, the OS-HPXML autosized default (see Central Air Conditioner, Room Air Conditioner, Packaged Terminal Air Conditioner, Evaporative Cooler, Mini-Split Air Conditioner) is used.
+
+- **Name:** ``cooling_system_cooling_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr``
+
+- **Required:** ``false``
+
+
+
+**Cooling System: Fraction Cool Load Served**
+
+The cooling load served by the cooling system.
+
+- **Name:** ``cooling_system_fraction_cool_load_served``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Cooling System: Is Ducted**
+
+Whether the cooling system is ducted or not. Only used for mini-split and evaporative cooler. It's assumed that central air conditioner is ducted, and room air conditioner and packaged terminal air conditioner are not ducted.
+
+- **Name:** ``cooling_system_is_ducted``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Cooling System: Airflow Defect Ratio**
+
+The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the cooling system per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to central air conditioner and ducted mini-split. If not provided, assumes no defect.
+
+- **Name:** ``cooling_system_airflow_defect_ratio``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Cooling System: Charge Defect Ratio**
+
+The refrigerant charge defect ratio, defined as (InstalledCharge - DesignCharge) / DesignCharge, of the cooling system per ANSI/RESNET/ACCA Standard 310. A value of zero means no refrigerant charge defect. Applies only to central air conditioner and mini-split. If not provided, assumes no defect.
+
+- **Name:** ``cooling_system_charge_defect_ratio``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Cooling System: Crankcase Heater Power Watts**
+
+Cooling system crankcase heater power consumption in Watts. Applies only to central air conditioner, room air conditioner, packaged terminal air conditioner and mini-split. If not provided, the OS-HPXML default (see Central Air Conditioner, Room Air Conditioner, Packaged Terminal Air Conditioner, Mini-Split Air Conditioner) is used.
+
+- **Name:** ``cooling_system_crankcase_heater_watts``
+- **Type:** ``Double``
+
+- **Units:** ``W``
+
+- **Required:** ``false``
+
+
+
+**Cooling System: Integrated Heating System Fuel Type**
+
+The fuel type of the heating system integrated into cooling system. Only used for packaged terminal air conditioner and room air conditioner.
+
+- **Name:** ``cooling_system_integrated_heating_system_fuel``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `electricity`, `natural gas`, `fuel oil`, `propane`, `wood`, `wood pellets`, `coal`
+
+
+
+**Cooling System: Integrated Heating System Efficiency**
+
+The rated heating efficiency value of the heating system integrated into cooling system. Only used for packaged terminal air conditioner and room air conditioner.
+
+- **Name:** ``cooling_system_integrated_heating_system_efficiency_percent``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Cooling System: Integrated Heating System Heating Capacity**
+
+The output heating capacity of the heating system integrated into cooling system. If not provided, the OS-HPXML autosized default (see Room Air Conditioner, Packaged Terminal Air Conditioner) is used. Only used for room air conditioner and packaged terminal air conditioner.
+
+- **Name:** ``cooling_system_integrated_heating_system_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr``
+
+- **Required:** ``false``
+
+
+
+**Cooling System: Integrated Heating System Fraction Heat Load Served**
+
+The heating load served by the heating system integrated into cooling system. Only used for packaged terminal air conditioner and room air conditioner.
+
+- **Name:** ``cooling_system_integrated_heating_system_fraction_heat_load_served``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Type**
+
+The type of heat pump. Use 'none' if there is no heat pump.
+
+- **Name:** ``heat_pump_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `air-to-air`, `mini-split`, `ground-to-air`, `packaged terminal heat pump`, `room air conditioner with reverse cycle`
+
+
+
+**Heat Pump: Heating Efficiency Type**
+
+The heating efficiency type of heat pump. System types air-to-air and mini-split use HSPF or HSPF2. System types ground-to-air, packaged terminal heat pump and room air conditioner with reverse cycle use COP.
+
+- **Name:** ``heat_pump_heating_efficiency_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `HSPF`, `HSPF2`, `COP`
+
+
+
+**Heat Pump: Heating Efficiency**
+
+The rated heating efficiency value of the heat pump.
+
+- **Name:** ``heat_pump_heating_efficiency``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Heat Pump: Cooling Efficiency Type**
+
+The cooling efficiency type of heat pump. System types air-to-air and mini-split use SEER or SEER2. System types ground-to-air, packaged terminal heat pump and room air conditioner with reverse cycle use EER.
+
+- **Name:** ``heat_pump_cooling_efficiency_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `SEER`, `SEER2`, `EER`, `CEER`
+
+
+
+**Heat Pump: Cooling Efficiency**
+
+The rated cooling efficiency value of the heat pump.
+
+- **Name:** ``heat_pump_cooling_efficiency``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Heat Pump: Cooling Compressor Type**
+
+The compressor type of the heat pump. Only applies to air-to-air and mini-split. If not provided, the OS-HPXML default (see Air-to-Air Heat Pump, Mini-Split Heat Pump) is used.
+
+- **Name:** ``heat_pump_cooling_compressor_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `single stage`, `two stage`, `variable speed`
+
+
+
+**Heat Pump: Cooling Sensible Heat Fraction**
+
+The sensible heat fraction of the heat pump. If not provided, the OS-HPXML default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle, Ground-to-Air Heat Pump) is used.
+
+- **Name:** ``heat_pump_cooling_sensible_heat_fraction``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Heating Capacity**
+
+The output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle, Ground-to-Air Heat Pump) is used.
+
+- **Name:** ``heat_pump_heating_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Heating Capacity Retention Fraction**
+
+The output heating capacity of the heat pump at a user-specified temperature (e.g., 17F or 5F) divided by the above nominal heating capacity. Applies to all heat pump types except ground-to-air. If not provided, the OS-HPXML default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle) is used.
+
+- **Name:** ``heat_pump_heating_capacity_retention_fraction``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Heating Capacity Retention Temperature**
+
+The user-specified temperature (e.g., 17F or 5F) for the above heating capacity retention fraction. Applies to all heat pump types except ground-to-air. Required if the Heating Capacity Retention Fraction is provided.
+
+- **Name:** ``heat_pump_heating_capacity_retention_temp``
+- **Type:** ``Double``
+
+- **Units:** ``deg-F``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Cooling Capacity**
+
+The output cooling capacity of the heat pump. If not provided, the OS-HPXML autosized default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle, Ground-to-Air Heat Pump) is used.
+
+- **Name:** ``heat_pump_cooling_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Fraction Heat Load Served**
+
+The heating load served by the heat pump.
+
+- **Name:** ``heat_pump_fraction_heat_load_served``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Heat Pump: Fraction Cool Load Served**
+
+The cooling load served by the heat pump.
+
+- **Name:** ``heat_pump_fraction_cool_load_served``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Heat Pump: Compressor Lockout Temperature**
+
+The temperature below which the heat pump compressor is disabled. If both this and Backup Heating Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies to all heat pump types other than ground-to-air. If not provided, the OS-HPXML default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle) is used.
+
+- **Name:** ``heat_pump_compressor_lockout_temp``
+- **Type:** ``Double``
+
+- **Units:** ``deg-F``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Backup Type**
+
+The backup type of the heat pump. If 'integrated', represents e.g. built-in electric strip heat or dual-fuel integrated furnace. If 'separate', represents e.g. electric baseboard or boiler based on the Heating System 2 specified below. Use 'none' if there is no backup heating.
+
+- **Name:** ``heat_pump_backup_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `integrated`, `separate`
+
+
+
+**Heat Pump: Backup Fuel Type**
+
+The backup fuel type of the heat pump. Only applies if Backup Type is 'integrated'.
+
+- **Name:** ``heat_pump_backup_fuel``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `electricity`, `natural gas`, `fuel oil`, `propane`
+
+
+
+**Heat Pump: Backup Rated Efficiency**
+
+The backup rated efficiency value of the heat pump. Percent for electricity fuel type. AFUE otherwise. Only applies if Backup Type is 'integrated'.
+
+- **Name:** ``heat_pump_backup_heating_efficiency``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Heat Pump: Backup Heating Capacity**
+
+The backup output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default (see Backup) is used. Only applies if Backup Type is 'integrated'.
+
+- **Name:** ``heat_pump_backup_heating_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Backup Heating Lockout Temperature**
+
+The temperature above which the heat pump backup system is disabled. If both this and Compressor Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies for both Backup Type of 'integrated' and 'separate'. If not provided, the OS-HPXML default (see Backup) is used.
+
+- **Name:** ``heat_pump_backup_heating_lockout_temp``
+- **Type:** ``Double``
+
+- **Units:** ``deg-F``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Sizing Methodology**
+
+The auto-sizing methodology to use when the heat pump capacity is not provided. If not provided, the OS-HPXML default (see HPXML HVAC Sizing Control) is used.
+
+- **Name:** ``heat_pump_sizing_methodology``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `ACCA`, `HERS`, `MaxLoad`
+
+
+
+**Heat Pump: Is Ducted**
+
+Whether the heat pump is ducted or not. Only used for mini-split. It's assumed that air-to-air and ground-to-air are ducted, and packaged terminal heat pump and room air conditioner with reverse cycle are not ducted. If not provided, assumes not ducted.
+
+- **Name:** ``heat_pump_is_ducted``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Airflow Defect Ratio**
+
+The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the heat pump per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to air-to-air, ducted mini-split, and ground-to-air. If not provided, assumes no defect.
+
+- **Name:** ``heat_pump_airflow_defect_ratio``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Charge Defect Ratio**
+
+The refrigerant charge defect ratio, defined as (InstalledCharge - DesignCharge) / DesignCharge, of the heat pump per ANSI/RESNET/ACCA Standard 310. A value of zero means no refrigerant charge defect. Applies to all heat pump types. If not provided, assumes no defect.
+
+- **Name:** ``heat_pump_charge_defect_ratio``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Heat Pump: Crankcase Heater Power Watts**
+
+Heat Pump crankcase heater power consumption in Watts. Applies only to air-to-air, mini-split, packaged terminal heat pump and room air conditioner with reverse cycle. If not provided, the OS-HPXML default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle) is used.
+
+- **Name:** ``heat_pump_crankcase_heater_watts``
+- **Type:** ``Double``
+
+- **Units:** ``W``
+
+- **Required:** ``false``
+
+
+
+**Heating System 2: Type**
+
+The type of the second heating system.
+
+- **Name:** ``heating_system_2_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `Furnace`, `WallFurnace`, `FloorFurnace`, `Boiler`, `ElectricResistance`, `Stove`, `SpaceHeater`, `Fireplace`
+
+
+
+**Heating System 2: Fuel Type**
+
+The fuel type of the second heating system. Ignored for ElectricResistance.
+
+- **Name:** ``heating_system_2_fuel``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `electricity`, `natural gas`, `fuel oil`, `propane`, `wood`, `wood pellets`, `coal`
+
+
+
+**Heating System 2: Rated AFUE or Percent**
+
+The rated heating efficiency value of the second heating system.
+
+- **Name:** ``heating_system_2_heating_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Heating System 2: Heating Capacity**
+
+The output heating capacity of the second heating system. If not provided, the OS-HPXML autosized default (see HPXML Heating Systems) is used.
+
+- **Name:** ``heating_system_2_heating_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr``
+
+- **Required:** ``false``
+
+
+
+**Heating System 2: Fraction Heat Load Served**
+
+The heat load served fraction of the second heating system. Ignored if this heating system serves as a backup system for a heat pump.
+
+- **Name:** ``heating_system_2_fraction_heat_load_served``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**HVAC Control: Heating Weekday Setpoint Schedule**
+
+Specify the constant or 24-hour comma-separated weekday heating setpoint schedule. Required unless a detailed CSV schedule is provided.
+
+- **Name:** ``hvac_control_heating_weekday_setpoint``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**HVAC Control: Heating Weekend Setpoint Schedule**
+
+Specify the constant or 24-hour comma-separated weekend heating setpoint schedule. Required unless a detailed CSV schedule is provided.
+
+- **Name:** ``hvac_control_heating_weekend_setpoint``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**HVAC Control: Cooling Weekday Setpoint Schedule**
+
+Specify the constant or 24-hour comma-separated weekday cooling setpoint schedule. Required unless a detailed CSV schedule is provided.
+
+- **Name:** ``hvac_control_cooling_weekday_setpoint``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**HVAC Control: Cooling Weekend Setpoint Schedule**
+
+Specify the constant or 24-hour comma-separated weekend cooling setpoint schedule. Required unless a detailed CSV schedule is provided.
+
+- **Name:** ``hvac_control_cooling_weekend_setpoint``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**HVAC Control: Heating Season Period**
+
+Enter a date like 'Nov 1 - Jun 30'. If not provided, the OS-HPXML default (see HPXML HVAC Control) is used. Can also provide 'BuildingAmerica' to use automatic seasons from the Building America House Simulation Protocols.
+
+- **Name:** ``hvac_control_heating_season_period``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**HVAC Control: Cooling Season Period**
+
+Enter a date like 'Jun 1 - Oct 31'. If not provided, the OS-HPXML default (see HPXML HVAC Control) is used. Can also provide 'BuildingAmerica' to use automatic seasons from the Building America House Simulation Protocols.
+
+- **Name:** ``hvac_control_cooling_season_period``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Ducts: Leakage Units**
+
+The leakage units of the ducts.
+
+- **Name:** ``ducts_leakage_units``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `CFM25`, `CFM50`, `Percent`
+
+
+
+**Ducts: Supply Leakage to Outside Value**
+
+The leakage value to outside for the supply ducts.
+
+- **Name:** ``ducts_supply_leakage_to_outside_value``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Ducts: Return Leakage to Outside Value**
+
+The leakage value to outside for the return ducts.
+
+- **Name:** ``ducts_return_leakage_to_outside_value``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Ducts: Supply Location**
+
+The location of the supply ducts. If not provided, the OS-HPXML default (see Air Distribution) is used.
+
+- **Name:** ``ducts_supply_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `conditioned space`, `basement - conditioned`, `basement - unconditioned`, `crawlspace`, `crawlspace - vented`, `crawlspace - unvented`, `crawlspace - conditioned`, `attic`, `attic - vented`, `attic - unvented`, `garage`, `exterior wall`, `under slab`, `roof deck`, `outside`, `other housing unit`, `other heated space`, `other multifamily buffer space`, `other non-freezing space`, `manufactured home belly`
+
+
+
+**Ducts: Supply Insulation R-Value**
+
+The insulation r-value of the supply ducts excluding air films.
+
+- **Name:** ``ducts_supply_insulation_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``true``
+
+
+
+**Ducts: Supply Buried Insulation Level**
+
+Whether the supply ducts are buried in, e.g., attic loose-fill insulation. Partially buried ducts have insulation that does not cover the top of the ducts. Fully buried ducts have insulation that just covers the top of the ducts. Deeply buried ducts have insulation that continues above the top of the ducts.
+
+- **Name:** ``ducts_supply_buried_insulation_level``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `not buried`, `partially buried`, `fully buried`, `deeply buried`
+
+
+
+**Ducts: Supply Surface Area**
+
+The supply ducts surface area in the given location. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see Air Distribution) is used.
+
+- **Name:** ``ducts_supply_surface_area``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``false``
+
+
+
+**Ducts: Supply Area Fraction**
+
+The fraction of supply ducts surface area in the given location. Only used if Surface Area is not provided. If the fraction is less than 1, the remaining duct area is assumed to be in conditioned space. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see Air Distribution) is used.
+
+- **Name:** ``ducts_supply_surface_area_fraction``
+- **Type:** ``Double``
+
+- **Units:** ``frac``
+
+- **Required:** ``false``
+
+
+
+**Ducts: Return Location**
+
+The location of the return ducts. If not provided, the OS-HPXML default (see Air Distribution) is used.
+
+- **Name:** ``ducts_return_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `conditioned space`, `basement - conditioned`, `basement - unconditioned`, `crawlspace`, `crawlspace - vented`, `crawlspace - unvented`, `crawlspace - conditioned`, `attic`, `attic - vented`, `attic - unvented`, `garage`, `exterior wall`, `under slab`, `roof deck`, `outside`, `other housing unit`, `other heated space`, `other multifamily buffer space`, `other non-freezing space`, `manufactured home belly`
+
+
+
+**Ducts: Return Insulation R-Value**
+
+The insulation r-value of the return ducts excluding air films.
+
+- **Name:** ``ducts_return_insulation_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``true``
+
+
+
+**Ducts: Return Buried Insulation Level**
+
+Whether the return ducts are buried in, e.g., attic loose-fill insulation. Partially buried ducts have insulation that does not cover the top of the ducts. Fully buried ducts have insulation that just covers the top of the ducts. Deeply buried ducts have insulation that continues above the top of the ducts.
+
+- **Name:** ``ducts_return_buried_insulation_level``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `not buried`, `partially buried`, `fully buried`, `deeply buried`
+
+
+
+**Ducts: Return Surface Area**
+
+The return ducts surface area in the given location. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see Air Distribution) is used.
+
+- **Name:** ``ducts_return_surface_area``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``false``
+
+
+
+**Ducts: Return Area Fraction**
+
+The fraction of return ducts surface area in the given location. Only used if Surface Area is not provided. If the fraction is less than 1, the remaining duct area is assumed to be in conditioned space. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see Air Distribution) is used.
+
+- **Name:** ``ducts_return_surface_area_fraction``
+- **Type:** ``Double``
+
+- **Units:** ``frac``
+
+- **Required:** ``false``
+
+
+
+**Ducts: Number of Return Registers**
+
+The number of return registers of the ducts. Only used to calculate default return duct surface area. If not provided, the OS-HPXML default (see Air Distribution) is used.
+
+- **Name:** ``ducts_number_of_return_registers``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``false``
+
+
+
+**Mechanical Ventilation: Fan Type**
+
+The type of the mechanical ventilation. Use 'none' if there is no mechanical ventilation system.
+
+- **Name:** ``mech_vent_fan_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `exhaust only`, `supply only`, `energy recovery ventilator`, `heat recovery ventilator`, `balanced`, `central fan integrated supply`
+
+
+
+**Mechanical Ventilation: Flow Rate**
+
+The flow rate of the mechanical ventilation. If not provided, the OS-HPXML default (see Whole Ventilation Fan) is used.
+
+- **Name:** ``mech_vent_flow_rate``
+- **Type:** ``Double``
+
+- **Units:** ``CFM``
+
+- **Required:** ``false``
+
+
+
+**Mechanical Ventilation: Hours In Operation**
+
+The hours in operation of the mechanical ventilation. If not provided, the OS-HPXML default (see Whole Ventilation Fan) is used.
+
+- **Name:** ``mech_vent_hours_in_operation``
+- **Type:** ``Double``
+
+- **Units:** ``hrs/day``
+
+- **Required:** ``false``
+
+
+
+**Mechanical Ventilation: Total Recovery Efficiency Type**
+
+The total recovery efficiency type of the mechanical ventilation.
+
+- **Name:** ``mech_vent_recovery_efficiency_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `Unadjusted`, `Adjusted`
+
+
+
+**Mechanical Ventilation: Total Recovery Efficiency**
+
+The Unadjusted or Adjusted total recovery efficiency of the mechanical ventilation. Applies to energy recovery ventilator.
+
+- **Name:** ``mech_vent_total_recovery_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Mechanical Ventilation: Sensible Recovery Efficiency**
+
+The Unadjusted or Adjusted sensible recovery efficiency of the mechanical ventilation. Applies to energy recovery ventilator and heat recovery ventilator.
+
+- **Name:** ``mech_vent_sensible_recovery_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Mechanical Ventilation: Fan Power**
+
+The fan power of the mechanical ventilation. If not provided, the OS-HPXML default (see Whole Ventilation Fan) is used.
+
+- **Name:** ``mech_vent_fan_power``
+- **Type:** ``Double``
+
+- **Units:** ``W``
+
+- **Required:** ``false``
+
+
+
+**Mechanical Ventilation: Number of Units Served**
+
+Number of dwelling units served by the mechanical ventilation system. Must be 1 if single-family detached. Used to apportion flow rate and fan power to the unit.
+
+- **Name:** ``mech_vent_num_units_served``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``true``
+
+
+
+**Shared Mechanical Ventilation: Fraction Recirculation**
+
+Fraction of the total supply air that is recirculated, with the remainder assumed to be outdoor air. The value must be 0 for exhaust only systems. Required for a shared mechanical ventilation system.
+
+- **Name:** ``mech_vent_shared_frac_recirculation``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Shared Mechanical Ventilation: Preheating Fuel**
+
+Fuel type of the preconditioning heating equipment. Only used for a shared mechanical ventilation system. If not provided, assumes no preheating.
+
+- **Name:** ``mech_vent_shared_preheating_fuel``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `electricity`, `natural gas`, `fuel oil`, `propane`, `wood`, `wood pellets`, `coal`
+
+
+
+**Shared Mechanical Ventilation: Preheating Efficiency**
+
+Efficiency of the preconditioning heating equipment. Only used for a shared mechanical ventilation system. If not provided, assumes no preheating.
+
+- **Name:** ``mech_vent_shared_preheating_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``COP``
+
+- **Required:** ``false``
+
+
+
+**Shared Mechanical Ventilation: Preheating Fraction Ventilation Heat Load Served**
+
+Fraction of heating load introduced by the shared ventilation system that is met by the preconditioning heating equipment. If not provided, assumes no preheating.
+
+- **Name:** ``mech_vent_shared_preheating_fraction_heat_load_served``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Shared Mechanical Ventilation: Precooling Fuel**
+
+Fuel type of the preconditioning cooling equipment. Only used for a shared mechanical ventilation system. If not provided, assumes no precooling.
+
+- **Name:** ``mech_vent_shared_precooling_fuel``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `electricity`
+
+
+
+**Shared Mechanical Ventilation: Precooling Efficiency**
+
+Efficiency of the preconditioning cooling equipment. Only used for a shared mechanical ventilation system. If not provided, assumes no precooling.
+
+- **Name:** ``mech_vent_shared_precooling_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``COP``
+
+- **Required:** ``false``
+
+
+
+**Shared Mechanical Ventilation: Precooling Fraction Ventilation Cool Load Served**
+
+Fraction of cooling load introduced by the shared ventilation system that is met by the preconditioning cooling equipment. If not provided, assumes no precooling.
+
+- **Name:** ``mech_vent_shared_precooling_fraction_cool_load_served``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Mechanical Ventilation 2: Fan Type**
+
+The type of the second mechanical ventilation. Use 'none' if there is no second mechanical ventilation system.
+
+- **Name:** ``mech_vent_2_fan_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `exhaust only`, `supply only`, `energy recovery ventilator`, `heat recovery ventilator`, `balanced`
+
+
+
+**Mechanical Ventilation 2: Flow Rate**
+
+The flow rate of the second mechanical ventilation.
+
+- **Name:** ``mech_vent_2_flow_rate``
+- **Type:** ``Double``
+
+- **Units:** ``CFM``
+
+- **Required:** ``true``
+
+
+
+**Mechanical Ventilation 2: Hours In Operation**
+
+The hours in operation of the second mechanical ventilation.
+
+- **Name:** ``mech_vent_2_hours_in_operation``
+- **Type:** ``Double``
+
+- **Units:** ``hrs/day``
+
+- **Required:** ``true``
+
+
+
+**Mechanical Ventilation 2: Total Recovery Efficiency Type**
+
+The total recovery efficiency type of the second mechanical ventilation.
+
+- **Name:** ``mech_vent_2_recovery_efficiency_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `Unadjusted`, `Adjusted`
+
+
+
+**Mechanical Ventilation 2: Total Recovery Efficiency**
+
+The Unadjusted or Adjusted total recovery efficiency of the second mechanical ventilation. Applies to energy recovery ventilator.
+
+- **Name:** ``mech_vent_2_total_recovery_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Mechanical Ventilation 2: Sensible Recovery Efficiency**
+
+The Unadjusted or Adjusted sensible recovery efficiency of the second mechanical ventilation. Applies to energy recovery ventilator and heat recovery ventilator.
+
+- **Name:** ``mech_vent_2_sensible_recovery_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Mechanical Ventilation 2: Fan Power**
+
+The fan power of the second mechanical ventilation.
+
+- **Name:** ``mech_vent_2_fan_power``
+- **Type:** ``Double``
+
+- **Units:** ``W``
+
+- **Required:** ``true``
+
+
+
+**Kitchen Fans: Quantity**
+
+The quantity of the kitchen fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.
+
+- **Name:** ``kitchen_fans_quantity``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``false``
+
+
+
+**Kitchen Fans: Flow Rate**
+
+The flow rate of the kitchen fan. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.
+
+- **Name:** ``kitchen_fans_flow_rate``
+- **Type:** ``Double``
+
+- **Units:** ``CFM``
+
+- **Required:** ``false``
+
+
+
+**Kitchen Fans: Hours In Operation**
+
+The hours in operation of the kitchen fan. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.
+
+- **Name:** ``kitchen_fans_hours_in_operation``
+- **Type:** ``Double``
+
+- **Units:** ``hrs/day``
+
+- **Required:** ``false``
+
+
+
+**Kitchen Fans: Fan Power**
+
+The fan power of the kitchen fan. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.
+
+- **Name:** ``kitchen_fans_power``
+- **Type:** ``Double``
+
+- **Units:** ``W``
+
+- **Required:** ``false``
+
+
+
+**Kitchen Fans: Start Hour**
+
+The start hour of the kitchen fan. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.
+
+- **Name:** ``kitchen_fans_start_hour``
+- **Type:** ``Integer``
+
+- **Units:** ``hr``
+
+- **Required:** ``false``
+
+
+
+**Bathroom Fans: Quantity**
+
+The quantity of the bathroom fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.
+
+- **Name:** ``bathroom_fans_quantity``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``false``
+
+
+
+**Bathroom Fans: Flow Rate**
+
+The flow rate of the bathroom fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.
+
+- **Name:** ``bathroom_fans_flow_rate``
+- **Type:** ``Double``
+
+- **Units:** ``CFM``
+
+- **Required:** ``false``
+
+
+
+**Bathroom Fans: Hours In Operation**
+
+The hours in operation of the bathroom fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.
+
+- **Name:** ``bathroom_fans_hours_in_operation``
+- **Type:** ``Double``
+
+- **Units:** ``hrs/day``
+
+- **Required:** ``false``
+
+
+
+**Bathroom Fans: Fan Power**
+
+The fan power of the bathroom fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.
+
+- **Name:** ``bathroom_fans_power``
+- **Type:** ``Double``
+
+- **Units:** ``W``
+
+- **Required:** ``false``
+
+
+
+**Bathroom Fans: Start Hour**
+
+The start hour of the bathroom fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.
+
+- **Name:** ``bathroom_fans_start_hour``
+- **Type:** ``Integer``
+
+- **Units:** ``hr``
+
+- **Required:** ``false``
+
+
+
+**Whole House Fan: Present**
+
+Whether there is a whole house fan.
+
+- **Name:** ``whole_house_fan_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Whole House Fan: Flow Rate**
+
+The flow rate of the whole house fan. If not provided, the OS-HPXML default (see Whole House Fan) is used.
+
+- **Name:** ``whole_house_fan_flow_rate``
+- **Type:** ``Double``
+
+- **Units:** ``CFM``
+
+- **Required:** ``false``
+
+
+
+**Whole House Fan: Fan Power**
+
+The fan power of the whole house fan. If not provided, the OS-HPXML default (see Whole House Fan) is used.
+
+- **Name:** ``whole_house_fan_power``
+- **Type:** ``Double``
+
+- **Units:** ``W``
+
+- **Required:** ``false``
+
+
+
+**Water Heater: Type**
+
+The type of water heater. Use 'none' if there is no water heater.
+
+- **Name:** ``water_heater_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `storage water heater`, `instantaneous water heater`, `heat pump water heater`, `space-heating boiler with storage tank`, `space-heating boiler with tankless coil`
+
+
+
+**Water Heater: Fuel Type**
+
+The fuel type of water heater. Ignored for heat pump water heater.
+
+- **Name:** ``water_heater_fuel_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `electricity`, `natural gas`, `fuel oil`, `propane`, `wood`, `coal`
+
+
+
+**Water Heater: Location**
+
+The location of water heater. If not provided, the OS-HPXML default (see HPXML Water Heating Systems) is used.
+
+- **Name:** ``water_heater_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `conditioned space`, `basement - conditioned`, `basement - unconditioned`, `garage`, `attic`, `attic - vented`, `attic - unvented`, `crawlspace`, `crawlspace - vented`, `crawlspace - unvented`, `crawlspace - conditioned`, `other exterior`, `other housing unit`, `other heated space`, `other multifamily buffer space`, `other non-freezing space`
+
+
+
+**Water Heater: Tank Volume**
+
+Nominal volume of water heater tank. Only applies to storage water heater, heat pump water heater, and space-heating boiler with storage tank. If not provided, the OS-HPXML default (see Conventional Storage, Heat Pump, Combi Boiler w/ Storage) is used.
+
+- **Name:** ``water_heater_tank_volume``
+- **Type:** ``Double``
+
+- **Units:** ``gal``
+
+- **Required:** ``false``
+
+
+
+**Water Heater: Efficiency Type**
+
+The efficiency type of water heater. Does not apply to space-heating boilers.
+
+- **Name:** ``water_heater_efficiency_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `EnergyFactor`, `UniformEnergyFactor`
+
+
+
+**Water Heater: Efficiency**
+
+Rated Energy Factor or Uniform Energy Factor. Does not apply to space-heating boilers.
+
+- **Name:** ``water_heater_efficiency``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Water Heater: Usage Bin**
+
+The usage of the water heater. Only applies if Efficiency Type is UniformEnergyFactor and Type is not instantaneous water heater. Does not apply to space-heating boilers. If not provided, the OS-HPXML default (see Conventional Storage, Heat Pump) is used.
+
+- **Name:** ``water_heater_usage_bin``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `very small`, `low`, `medium`, `high`
+
+
+
+**Water Heater: Recovery Efficiency**
+
+Ratio of energy delivered to water heater to the energy content of the fuel consumed by the water heater. Only used for non-electric storage water heaters. If not provided, the OS-HPXML default (see Conventional Storage) is used.
+
+- **Name:** ``water_heater_recovery_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Water Heater: Heating Capacity**
+
+Heating capacity. Only applies to storage water heater. If not provided, the OS-HPXML default (see Conventional Storage) is used.
+
+- **Name:** ``water_heater_heating_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr``
+
+- **Required:** ``false``
+
+
+
+**Water Heater: Standby Loss**
+
+The standby loss of water heater. Only applies to space-heating boilers. If not provided, the OS-HPXML default (see Combi Boiler w/ Storage) is used.
+
+- **Name:** ``water_heater_standby_loss``
+- **Type:** ``Double``
+
+- **Units:** ``deg-F/hr``
+
+- **Required:** ``false``
+
+
+
+**Water Heater: Jacket R-value**
+
+The jacket R-value of water heater. Doesn't apply to instantaneous water heater or space-heating boiler with tankless coil. If not provided, defaults to no jacket insulation.
+
+- **Name:** ``water_heater_jacket_rvalue``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``false``
+
+
+
+**Water Heater: Setpoint Temperature**
+
+The setpoint temperature of water heater. If not provided, the OS-HPXML default (see HPXML Water Heating Systems) is used.
+
+- **Name:** ``water_heater_setpoint_temperature``
+- **Type:** ``Double``
+
+- **Units:** ``deg-F``
+
+- **Required:** ``false``
+
+
+
+**Water Heater: Number of Units Served**
+
+Number of dwelling units served (directly or indirectly) by the water heater. Must be 1 if single-family detached. Used to apportion water heater tank losses to the unit.
+
+- **Name:** ``water_heater_num_units_served``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``true``
+
+
+
+**Water Heater: Uses Desuperheater**
+
+Requires that the dwelling unit has a air-to-air, mini-split, or ground-to-air heat pump or a central air conditioner or mini-split air conditioner. If not provided, assumes no desuperheater.
+
+- **Name:** ``water_heater_uses_desuperheater``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Water Heater: Tank Type**
+
+Type of tank model to use. The 'stratified' tank generally provide more accurate results, but may significantly increase run time. Applies only to storage water heater. If not provided, the OS-HPXML default (see Conventional Storage) is used.
+
+- **Name:** ``water_heater_tank_model_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `mixed`, `stratified`
+
+
+
+**Water Heater: Operating Mode**
+
+The water heater operating mode. The 'heat pump only' option only uses the heat pump, while 'hybrid/auto' allows the backup electric resistance to come on in high demand situations. This is ignored if a scheduled operating mode type is selected. Applies only to heat pump water heater. If not provided, the OS-HPXML default (see Heat Pump) is used.
+
+- **Name:** ``water_heater_operating_mode``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `hybrid/auto`, `heat pump only`
+
+
+
+**Hot Water Distribution: System Type**
+
+The type of the hot water distribution system.
+
+- **Name:** ``hot_water_distribution_system_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `Standard`, `Recirculation`
+
+
+
+**Hot Water Distribution: Standard Piping Length**
+
+If the distribution system is Standard, the length of the piping. If not provided, the OS-HPXML default (see Standard) is used.
+
+- **Name:** ``hot_water_distribution_standard_piping_length``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``false``
+
+
+
+**Hot Water Distribution: Recirculation Control Type**
+
+If the distribution system is Recirculation, the type of hot water recirculation control, if any.
+
+- **Name:** ``hot_water_distribution_recirc_control_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `no control`, `timer`, `temperature`, `presence sensor demand control`, `manual demand control`
+
+
+
+**Hot Water Distribution: Recirculation Piping Length**
+
+If the distribution system is Recirculation, the length of the recirculation piping. If not provided, the OS-HPXML default (see Recirculation) is used.
+
+- **Name:** ``hot_water_distribution_recirc_piping_length``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``false``
+
+
+
+**Hot Water Distribution: Recirculation Branch Piping Length**
+
+If the distribution system is Recirculation, the length of the recirculation branch piping. If not provided, the OS-HPXML default (see Recirculation) is used.
+
+- **Name:** ``hot_water_distribution_recirc_branch_piping_length``
+- **Type:** ``Double``
+
+- **Units:** ``ft``
+
+- **Required:** ``false``
+
+
+
+**Hot Water Distribution: Recirculation Pump Power**
+
+If the distribution system is Recirculation, the recirculation pump power. If not provided, the OS-HPXML default (see Recirculation) is used.
+
+- **Name:** ``hot_water_distribution_recirc_pump_power``
+- **Type:** ``Double``
+
+- **Units:** ``W``
+
+- **Required:** ``false``
+
+
+
+**Hot Water Distribution: Pipe Insulation Nominal R-Value**
+
+Nominal R-value of the pipe insulation. If not provided, the OS-HPXML default (see HPXML Hot Water Distribution) is used.
+
+- **Name:** ``hot_water_distribution_pipe_r``
+- **Type:** ``Double``
+
+- **Units:** ``h-ft^2-R/Btu``
+
+- **Required:** ``false``
+
+
+
+**Drain Water Heat Recovery: Facilities Connected**
+
+Which facilities are connected for the drain water heat recovery. Use 'none' if there is no drain water heat recovery system.
+
+- **Name:** ``dwhr_facilities_connected``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `one`, `all`
+
+
+
+**Drain Water Heat Recovery: Equal Flow**
+
+Whether the drain water heat recovery has equal flow.
+
+- **Name:** ``dwhr_equal_flow``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Drain Water Heat Recovery: Efficiency**
+
+The efficiency of the drain water heat recovery.
+
+- **Name:** ``dwhr_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Hot Water Fixtures: Is Shower Low Flow**
+
+Whether the shower fixture is low flow.
+
+- **Name:** ``water_fixtures_shower_low_flow``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Hot Water Fixtures: Is Sink Low Flow**
+
+Whether the sink fixture is low flow.
+
+- **Name:** ``water_fixtures_sink_low_flow``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Hot Water Fixtures: Usage Multiplier**
+
+Multiplier on the hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Water Fixtures) is used.
+
+- **Name:** ``water_fixtures_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Solar Thermal: System Type**
+
+The type of solar thermal system. Use 'none' if there is no solar thermal system.
+
+- **Name:** ``solar_thermal_system_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `hot water`
+
+
+
+**Solar Thermal: Collector Area**
+
+The collector area of the solar thermal system.
+
+- **Name:** ``solar_thermal_collector_area``
+- **Type:** ``Double``
+
+- **Units:** ``ft^2``
+
+- **Required:** ``true``
+
+
+
+**Solar Thermal: Collector Loop Type**
+
+The collector loop type of the solar thermal system.
+
+- **Name:** ``solar_thermal_collector_loop_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `liquid direct`, `liquid indirect`, `passive thermosyphon`
+
+
+
+**Solar Thermal: Collector Type**
+
+The collector type of the solar thermal system.
+
+- **Name:** ``solar_thermal_collector_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `evacuated tube`, `single glazing black`, `double glazing black`, `integrated collector storage`
+
+
+
+**Solar Thermal: Collector Azimuth**
+
+The collector azimuth of the solar thermal system. Azimuth is measured clockwise from north (e.g., North=0, East=90, South=180, West=270).
+
+- **Name:** ``solar_thermal_collector_azimuth``
+- **Type:** ``Double``
+
+- **Units:** ``degrees``
+
+- **Required:** ``true``
+
+
+
+**Solar Thermal: Collector Tilt**
+
+The collector tilt of the solar thermal system. Can also enter, e.g., RoofPitch, RoofPitch+20, Latitude, Latitude-15, etc.
+
+- **Name:** ``solar_thermal_collector_tilt``
+- **Type:** ``String``
+
+- **Required:** ``true``
+
+
+
+**Solar Thermal: Collector Rated Optical Efficiency**
+
+The collector rated optical efficiency of the solar thermal system.
+
+- **Name:** ``solar_thermal_collector_rated_optical_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Solar Thermal: Collector Rated Thermal Losses**
+
+The collector rated thermal losses of the solar thermal system.
+
+- **Name:** ``solar_thermal_collector_rated_thermal_losses``
+- **Type:** ``Double``
+
+- **Units:** ``Btu/hr-ft^2-R``
+
+- **Required:** ``true``
+
+
+
+**Solar Thermal: Storage Volume**
+
+The storage volume of the solar thermal system. If not provided, the OS-HPXML default (see Detailed Inputs) is used.
+
+- **Name:** ``solar_thermal_storage_volume``
+- **Type:** ``Double``
+
+- **Units:** ``gal``
+
+- **Required:** ``false``
+
+
+
+**Solar Thermal: Solar Fraction**
+
+The solar fraction of the solar thermal system. If provided, overrides all other solar thermal inputs.
+
+- **Name:** ``solar_thermal_solar_fraction``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**PV System: Present**
+
+Whether there is a PV system present.
+
+- **Name:** ``pv_system_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**PV System: Module Type**
+
+Module type of the PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.
+
+- **Name:** ``pv_system_module_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `standard`, `premium`, `thin film`
+
+
+
+**PV System: Location**
+
+Location of the PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.
+
+- **Name:** ``pv_system_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `roof`, `ground`
+
+
+
+**PV System: Tracking**
+
+Type of tracking for the PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.
+
+- **Name:** ``pv_system_tracking``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `fixed`, `1-axis`, `1-axis backtracked`, `2-axis`
+
+
+
+**PV System: Array Azimuth**
+
+Array azimuth of the PV system. Azimuth is measured clockwise from north (e.g., North=0, East=90, South=180, West=270).
+
+- **Name:** ``pv_system_array_azimuth``
+- **Type:** ``Double``
+
+- **Units:** ``degrees``
+
+- **Required:** ``true``
+
+
+
+**PV System: Array Tilt**
+
+Array tilt of the PV system. Can also enter, e.g., RoofPitch, RoofPitch+20, Latitude, Latitude-15, etc.
+
+- **Name:** ``pv_system_array_tilt``
+- **Type:** ``String``
+
+- **Required:** ``true``
+
+
+
+**PV System: Maximum Power Output**
+
+Maximum power output of the PV system. For a shared system, this is the total building maximum power output.
+
+- **Name:** ``pv_system_max_power_output``
+- **Type:** ``Double``
+
+- **Units:** ``W``
+
+- **Required:** ``true``
+
+
+
+**PV System: Inverter Efficiency**
+
+Inverter efficiency of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.
+
+- **Name:** ``pv_system_inverter_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**PV System: System Losses Fraction**
+
+System losses fraction of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.
+
+- **Name:** ``pv_system_system_losses_fraction``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**PV System: Number of Bedrooms Served**
+
+Number of bedrooms served by PV system. Required if single-family attached or apartment unit. Used to apportion PV generation to the unit of a SFA/MF building. If there are two PV systems, this will apply to both.
+
+- **Name:** ``pv_system_num_bedrooms_served``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``false``
+
+
+
+**PV System 2: Present**
+
+Whether there is a second PV system present.
+
+- **Name:** ``pv_system_2_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**PV System 2: Module Type**
+
+Module type of the second PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.
+
+- **Name:** ``pv_system_2_module_type``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `standard`, `premium`, `thin film`
+
+
+
+**PV System 2: Location**
+
+Location of the second PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.
+
+- **Name:** ``pv_system_2_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `roof`, `ground`
+
+
+
+**PV System 2: Tracking**
+
+Type of tracking for the second PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.
+
+- **Name:** ``pv_system_2_tracking``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `fixed`, `1-axis`, `1-axis backtracked`, `2-axis`
+
+
+
+**PV System 2: Array Azimuth**
+
+Array azimuth of the second PV system. Azimuth is measured clockwise from north (e.g., North=0, East=90, South=180, West=270).
+
+- **Name:** ``pv_system_2_array_azimuth``
+- **Type:** ``Double``
+
+- **Units:** ``degrees``
+
+- **Required:** ``true``
+
+
+
+**PV System 2: Array Tilt**
+
+Array tilt of the second PV system. Can also enter, e.g., RoofPitch, RoofPitch+20, Latitude, Latitude-15, etc.
+
+- **Name:** ``pv_system_2_array_tilt``
+- **Type:** ``String``
+
+- **Required:** ``true``
+
+
+
+**PV System 2: Maximum Power Output**
+
+Maximum power output of the second PV system. For a shared system, this is the total building maximum power output.
+
+- **Name:** ``pv_system_2_max_power_output``
+- **Type:** ``Double``
+
+- **Units:** ``W``
+
+- **Required:** ``true``
+
+
+
+**Battery: Present**
+
+Whether there is a lithium ion battery present.
+
+- **Name:** ``battery_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Battery: Location**
+
+The space type for the lithium ion battery location. If not provided, the OS-HPXML default (see HPXML Batteries) is used.
+
+- **Name:** ``battery_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `conditioned space`, `basement - conditioned`, `basement - unconditioned`, `crawlspace`, `crawlspace - vented`, `crawlspace - unvented`, `crawlspace - conditioned`, `attic`, `attic - vented`, `attic - unvented`, `garage`, `outside`
+
+
+
+**Battery: Rated Power Output**
+
+The rated power output of the lithium ion battery. If not provided, the OS-HPXML default (see HPXML Batteries) is used.
+
+- **Name:** ``battery_power``
+- **Type:** ``Double``
+
+- **Units:** ``W``
+
+- **Required:** ``false``
+
+
+
+**Battery: Nominal Capacity**
+
+The nominal capacity of the lithium ion battery. If not provided, the OS-HPXML default (see HPXML Batteries) is used.
+
+- **Name:** ``battery_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``kWh``
+
+- **Required:** ``false``
+
+
+
+**Battery: Usable Capacity**
+
+The usable capacity of the lithium ion battery. If not provided, the OS-HPXML default (see HPXML Batteries) is used.
+
+- **Name:** ``battery_usable_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``kWh``
+
+- **Required:** ``false``
+
+
+
+**Battery: Round Trip Efficiency**
+
+The round trip efficiency of the lithium ion battery. If not provided, the OS-HPXML default (see HPXML Batteries) is used.
+
+- **Name:** ``battery_round_trip_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Lighting: Present**
+
+Whether there is lighting energy use.
+
+- **Name:** ``lighting_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Lighting: Interior Fraction CFL**
+
+Fraction of all lamps (interior) that are compact fluorescent. Lighting not specified as CFL, LFL, or LED is assumed to be incandescent.
+
+- **Name:** ``lighting_interior_fraction_cfl``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Lighting: Interior Fraction LFL**
+
+Fraction of all lamps (interior) that are linear fluorescent. Lighting not specified as CFL, LFL, or LED is assumed to be incandescent.
+
+- **Name:** ``lighting_interior_fraction_lfl``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Lighting: Interior Fraction LED**
+
+Fraction of all lamps (interior) that are light emitting diodes. Lighting not specified as CFL, LFL, or LED is assumed to be incandescent.
+
+- **Name:** ``lighting_interior_fraction_led``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Lighting: Interior Usage Multiplier**
+
+Multiplier on the lighting energy usage (interior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Lighting) is used.
+
+- **Name:** ``lighting_interior_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Lighting: Exterior Fraction CFL**
+
+Fraction of all lamps (exterior) that are compact fluorescent. Lighting not specified as CFL, LFL, or LED is assumed to be incandescent.
+
+- **Name:** ``lighting_exterior_fraction_cfl``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Lighting: Exterior Fraction LFL**
+
+Fraction of all lamps (exterior) that are linear fluorescent. Lighting not specified as CFL, LFL, or LED is assumed to be incandescent.
+
+- **Name:** ``lighting_exterior_fraction_lfl``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Lighting: Exterior Fraction LED**
+
+Fraction of all lamps (exterior) that are light emitting diodes. Lighting not specified as CFL, LFL, or LED is assumed to be incandescent.
+
+- **Name:** ``lighting_exterior_fraction_led``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Lighting: Exterior Usage Multiplier**
+
+Multiplier on the lighting energy usage (exterior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Lighting) is used.
+
+- **Name:** ``lighting_exterior_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Lighting: Garage Fraction CFL**
+
+Fraction of all lamps (garage) that are compact fluorescent. Lighting not specified as CFL, LFL, or LED is assumed to be incandescent.
+
+- **Name:** ``lighting_garage_fraction_cfl``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Lighting: Garage Fraction LFL**
+
+Fraction of all lamps (garage) that are linear fluorescent. Lighting not specified as CFL, LFL, or LED is assumed to be incandescent.
+
+- **Name:** ``lighting_garage_fraction_lfl``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Lighting: Garage Fraction LED**
+
+Fraction of all lamps (garage) that are light emitting diodes. Lighting not specified as CFL, LFL, or LED is assumed to be incandescent.
+
+- **Name:** ``lighting_garage_fraction_led``
+- **Type:** ``Double``
+
+- **Required:** ``true``
+
+
+
+**Lighting: Garage Usage Multiplier**
+
+Multiplier on the lighting energy usage (garage) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Lighting) is used.
+
+- **Name:** ``lighting_garage_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Holiday Lighting: Present**
+
+Whether there is holiday lighting.
+
+- **Name:** ``holiday_lighting_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Holiday Lighting: Daily Consumption**
+
+The daily energy consumption for holiday lighting (exterior). If not provided, the OS-HPXML default (see HPXML Lighting) is used.
+
+- **Name:** ``holiday_lighting_daily_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/day``
+
+- **Required:** ``false``
+
+
+
+**Holiday Lighting: Period**
+
+Enter a date like 'Nov 25 - Jan 5'. If not provided, the OS-HPXML default (see HPXML Lighting) is used.
+
+- **Name:** ``holiday_lighting_period``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Dehumidifier: Type**
+
+The type of dehumidifier.
+
+- **Name:** ``dehumidifier_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `portable`, `whole-home`
+
+
+
+**Dehumidifier: Efficiency Type**
+
+The efficiency type of dehumidifier.
+
+- **Name:** ``dehumidifier_efficiency_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `EnergyFactor`, `IntegratedEnergyFactor`
+
+
+
+**Dehumidifier: Efficiency**
+
+The efficiency of the dehumidifier.
+
+- **Name:** ``dehumidifier_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``liters/kWh``
+
+- **Required:** ``true``
+
+
+
+**Dehumidifier: Capacity**
+
+The capacity (water removal rate) of the dehumidifier.
+
+- **Name:** ``dehumidifier_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``pint/day``
+
+- **Required:** ``true``
+
+
+
+**Dehumidifier: Relative Humidity Setpoint**
+
+The relative humidity setpoint of the dehumidifier.
+
+- **Name:** ``dehumidifier_rh_setpoint``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Dehumidifier: Fraction Dehumidification Load Served**
+
+The dehumidification load served fraction of the dehumidifier.
+
+- **Name:** ``dehumidifier_fraction_dehumidification_load_served``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``true``
+
+
+
+**Clothes Washer: Present**
+
+Whether there is a clothes washer present.
+
+- **Name:** ``clothes_washer_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Clothes Washer: Location**
+
+The space type for the clothes washer location. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.
+
+- **Name:** ``clothes_washer_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `conditioned space`, `basement - conditioned`, `basement - unconditioned`, `garage`, `other housing unit`, `other heated space`, `other multifamily buffer space`, `other non-freezing space`
+
+
+
+**Clothes Washer: Efficiency Type**
+
+The efficiency type of the clothes washer.
+
+- **Name:** ``clothes_washer_efficiency_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `ModifiedEnergyFactor`, `IntegratedModifiedEnergyFactor`
+
+
+
+**Clothes Washer: Efficiency**
+
+The efficiency of the clothes washer. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.
+
+- **Name:** ``clothes_washer_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``ft^3/kWh-cyc``
+
+- **Required:** ``false``
+
+
+
+**Clothes Washer: Rated Annual Consumption**
+
+The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.
+
+- **Name:** ``clothes_washer_rated_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Clothes Washer: Label Electric Rate**
+
+The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.
+
+- **Name:** ``clothes_washer_label_electric_rate``
+- **Type:** ``Double``
+
+- **Units:** ``$/kWh``
+
+- **Required:** ``false``
+
+
+
+**Clothes Washer: Label Gas Rate**
+
+The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.
+
+- **Name:** ``clothes_washer_label_gas_rate``
+- **Type:** ``Double``
+
+- **Units:** ``$/therm``
+
+- **Required:** ``false``
+
+
+
+**Clothes Washer: Label Annual Cost with Gas DHW**
+
+The annual cost of using the system under test conditions. Input is obtained from the EnergyGuide label. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.
+
+- **Name:** ``clothes_washer_label_annual_gas_cost``
+- **Type:** ``Double``
+
+- **Units:** ``$``
+
+- **Required:** ``false``
+
+
+
+**Clothes Washer: Label Usage**
+
+The clothes washer loads per week. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.
+
+- **Name:** ``clothes_washer_label_usage``
+- **Type:** ``Double``
+
+- **Units:** ``cyc/wk``
+
+- **Required:** ``false``
+
+
+
+**Clothes Washer: Drum Volume**
+
+Volume of the washer drum. Obtained from the EnergyStar website or the manufacturer's literature. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.
+
+- **Name:** ``clothes_washer_capacity``
+- **Type:** ``Double``
+
+- **Units:** ``ft^3``
+
+- **Required:** ``false``
+
+
+
+**Clothes Washer: Usage Multiplier**
+
+Multiplier on the clothes washer energy and hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.
+
+- **Name:** ``clothes_washer_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Clothes Dryer: Present**
+
+Whether there is a clothes dryer present.
+
+- **Name:** ``clothes_dryer_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Clothes Dryer: Location**
+
+The space type for the clothes dryer location. If not provided, the OS-HPXML default (see HPXML Clothes Dryer) is used.
+
+- **Name:** ``clothes_dryer_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `conditioned space`, `basement - conditioned`, `basement - unconditioned`, `garage`, `other housing unit`, `other heated space`, `other multifamily buffer space`, `other non-freezing space`
+
+
+
+**Clothes Dryer: Fuel Type**
+
+Type of fuel used by the clothes dryer.
+
+- **Name:** ``clothes_dryer_fuel_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `electricity`, `natural gas`, `fuel oil`, `propane`, `wood`, `coal`
+
+
+
+**Clothes Dryer: Efficiency Type**
+
+The efficiency type of the clothes dryer.
+
+- **Name:** ``clothes_dryer_efficiency_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `EnergyFactor`, `CombinedEnergyFactor`
+
+
+
+**Clothes Dryer: Efficiency**
+
+The efficiency of the clothes dryer. If not provided, the OS-HPXML default (see HPXML Clothes Dryer) is used.
+
+- **Name:** ``clothes_dryer_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``lb/kWh``
+
+- **Required:** ``false``
+
+
+
+**Clothes Dryer: Vented Flow Rate**
+
+The exhaust flow rate of the vented clothes dryer. If not provided, the OS-HPXML default (see HPXML Clothes Dryer) is used.
+
+- **Name:** ``clothes_dryer_vented_flow_rate``
+- **Type:** ``Double``
+
+- **Units:** ``CFM``
+
+- **Required:** ``false``
+
+
+
+**Clothes Dryer: Usage Multiplier**
+
+Multiplier on the clothes dryer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Clothes Dryer) is used.
+
+- **Name:** ``clothes_dryer_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Dishwasher: Present**
+
+Whether there is a dishwasher present.
+
+- **Name:** ``dishwasher_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Dishwasher: Location**
+
+The space type for the dishwasher location. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.
+
+- **Name:** ``dishwasher_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `conditioned space`, `basement - conditioned`, `basement - unconditioned`, `garage`, `other housing unit`, `other heated space`, `other multifamily buffer space`, `other non-freezing space`
+
+
+
+**Dishwasher: Efficiency Type**
+
+The efficiency type of dishwasher.
+
+- **Name:** ``dishwasher_efficiency_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `RatedAnnualkWh`, `EnergyFactor`
+
+
+
+**Dishwasher: Efficiency**
+
+The efficiency of the dishwasher. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.
+
+- **Name:** ``dishwasher_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``RatedAnnualkWh or EnergyFactor``
+
+- **Required:** ``false``
+
+
+
+**Dishwasher: Label Electric Rate**
+
+The label electric rate of the dishwasher. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.
+
+- **Name:** ``dishwasher_label_electric_rate``
+- **Type:** ``Double``
+
+- **Units:** ``$/kWh``
+
+- **Required:** ``false``
+
+
+
+**Dishwasher: Label Gas Rate**
+
+The label gas rate of the dishwasher. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.
+
+- **Name:** ``dishwasher_label_gas_rate``
+- **Type:** ``Double``
+
+- **Units:** ``$/therm``
+
+- **Required:** ``false``
+
+
+
+**Dishwasher: Label Annual Gas Cost**
+
+The label annual gas cost of the dishwasher. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.
+
+- **Name:** ``dishwasher_label_annual_gas_cost``
+- **Type:** ``Double``
+
+- **Units:** ``$``
+
+- **Required:** ``false``
+
+
+
+**Dishwasher: Label Usage**
+
+The dishwasher loads per week. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.
+
+- **Name:** ``dishwasher_label_usage``
+- **Type:** ``Double``
+
+- **Units:** ``cyc/wk``
+
+- **Required:** ``false``
+
+
+
+**Dishwasher: Number of Place Settings**
+
+The number of place settings for the unit. Data obtained from manufacturer's literature. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.
+
+- **Name:** ``dishwasher_place_setting_capacity``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``false``
+
+
+
+**Dishwasher: Usage Multiplier**
+
+Multiplier on the dishwasher energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.
+
+- **Name:** ``dishwasher_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Refrigerator: Present**
+
+Whether there is a refrigerator present.
+
+- **Name:** ``refrigerator_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Refrigerator: Location**
+
+The space type for the refrigerator location. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.
+
+- **Name:** ``refrigerator_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `conditioned space`, `basement - conditioned`, `basement - unconditioned`, `garage`, `other housing unit`, `other heated space`, `other multifamily buffer space`, `other non-freezing space`
+
+
+
+**Refrigerator: Rated Annual Consumption**
+
+The EnergyGuide rated annual energy consumption for a refrigerator. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.
+
+- **Name:** ``refrigerator_rated_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Refrigerator: Usage Multiplier**
+
+Multiplier on the refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.
+
+- **Name:** ``refrigerator_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Extra Refrigerator: Present**
+
+Whether there is an extra refrigerator present.
+
+- **Name:** ``extra_refrigerator_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Extra Refrigerator: Location**
+
+The space type for the extra refrigerator location. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.
+
+- **Name:** ``extra_refrigerator_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `conditioned space`, `basement - conditioned`, `basement - unconditioned`, `garage`, `other housing unit`, `other heated space`, `other multifamily buffer space`, `other non-freezing space`
+
+
+
+**Extra Refrigerator: Rated Annual Consumption**
+
+The EnergyGuide rated annual energy consumption for an extra rrefrigerator. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.
+
+- **Name:** ``extra_refrigerator_rated_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Extra Refrigerator: Usage Multiplier**
+
+Multiplier on the extra refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.
+
+- **Name:** ``extra_refrigerator_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Freezer: Present**
+
+Whether there is a freezer present.
+
+- **Name:** ``freezer_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Freezer: Location**
+
+The space type for the freezer location. If not provided, the OS-HPXML default (see HPXML Freezers) is used.
+
+- **Name:** ``freezer_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `conditioned space`, `basement - conditioned`, `basement - unconditioned`, `garage`, `other housing unit`, `other heated space`, `other multifamily buffer space`, `other non-freezing space`
+
+
+
+**Freezer: Rated Annual Consumption**
+
+The EnergyGuide rated annual energy consumption for a freezer. If not provided, the OS-HPXML default (see HPXML Freezers) is used.
+
+- **Name:** ``freezer_rated_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Freezer: Usage Multiplier**
+
+Multiplier on the freezer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Freezers) is used.
+
+- **Name:** ``freezer_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Cooking Range/Oven: Present**
+
+Whether there is a cooking range/oven present.
+
+- **Name:** ``cooking_range_oven_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Cooking Range/Oven: Location**
+
+The space type for the cooking range/oven location. If not provided, the OS-HPXML default (see HPXML Cooking Range/Oven) is used.
+
+- **Name:** ``cooking_range_oven_location``
+- **Type:** ``Choice``
+
+- **Required:** ``false``
+
+- **Choices:** `conditioned space`, `basement - conditioned`, `basement - unconditioned`, `garage`, `other housing unit`, `other heated space`, `other multifamily buffer space`, `other non-freezing space`
+
+
+
+**Cooking Range/Oven: Fuel Type**
+
+Type of fuel used by the cooking range/oven.
+
+- **Name:** ``cooking_range_oven_fuel_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `electricity`, `natural gas`, `fuel oil`, `propane`, `wood`, `coal`
+
+
+
+**Cooking Range/Oven: Is Induction**
+
+Whether the cooking range is induction. If not provided, the OS-HPXML default (see HPXML Cooking Range/Oven) is used.
+
+- **Name:** ``cooking_range_oven_is_induction``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Cooking Range/Oven: Is Convection**
+
+Whether the oven is convection. If not provided, the OS-HPXML default (see HPXML Cooking Range/Oven) is used.
+
+- **Name:** ``cooking_range_oven_is_convection``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Cooking Range/Oven: Usage Multiplier**
+
+Multiplier on the cooking range/oven energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Cooking Range/Oven) is used.
+
+- **Name:** ``cooking_range_oven_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Ceiling Fan: Present**
+
+Whether there are any ceiling fans.
+
+- **Name:** ``ceiling_fan_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Ceiling Fan: Efficiency**
+
+The efficiency rating of the ceiling fan(s) at medium speed. If not provided, the OS-HPXML default (see HPXML Ceiling Fans) is used.
+
+- **Name:** ``ceiling_fan_efficiency``
+- **Type:** ``Double``
+
+- **Units:** ``CFM/W``
+
+- **Required:** ``false``
+
+
+
+**Ceiling Fan: Quantity**
+
+Total number of ceiling fans. If not provided, the OS-HPXML default (see HPXML Ceiling Fans) is used.
+
+- **Name:** ``ceiling_fan_quantity``
+- **Type:** ``Integer``
+
+- **Units:** ``#``
+
+- **Required:** ``false``
+
+
+
+**Ceiling Fan: Cooling Setpoint Temperature Offset**
+
+The cooling setpoint temperature offset during months when the ceiling fans are operating. Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default (see HPXML Ceiling Fans) is used.
+
+- **Name:** ``ceiling_fan_cooling_setpoint_temp_offset``
+- **Type:** ``Double``
+
+- **Units:** ``deg-F``
+
+- **Required:** ``false``
+
+
+
+**Misc Plug Loads: Television Present**
+
+Whether there are televisions.
+
+- **Name:** ``misc_plug_loads_television_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Misc Plug Loads: Television Annual kWh**
+
+The annual energy consumption of the television plug loads. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.
+
+- **Name:** ``misc_plug_loads_television_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Misc Plug Loads: Television Usage Multiplier**
+
+Multiplier on the television energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.
+
+- **Name:** ``misc_plug_loads_television_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Misc Plug Loads: Other Annual kWh**
+
+The annual energy consumption of the other residual plug loads. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.
+
+- **Name:** ``misc_plug_loads_other_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Misc Plug Loads: Other Sensible Fraction**
+
+Fraction of other residual plug loads' internal gains that are sensible. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.
+
+- **Name:** ``misc_plug_loads_other_frac_sensible``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Misc Plug Loads: Other Latent Fraction**
+
+Fraction of other residual plug loads' internal gains that are latent. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.
+
+- **Name:** ``misc_plug_loads_other_frac_latent``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Misc Plug Loads: Other Usage Multiplier**
+
+Multiplier on the other energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.
+
+- **Name:** ``misc_plug_loads_other_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Misc Plug Loads: Well Pump Present**
+
+Whether there is a well pump.
+
+- **Name:** ``misc_plug_loads_well_pump_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Misc Plug Loads: Well Pump Annual kWh**
+
+The annual energy consumption of the well pump plug loads. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.
+
+- **Name:** ``misc_plug_loads_well_pump_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Misc Plug Loads: Well Pump Usage Multiplier**
+
+Multiplier on the well pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.
+
+- **Name:** ``misc_plug_loads_well_pump_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Misc Plug Loads: Vehicle Present**
+
+Whether there is an electric vehicle.
+
+- **Name:** ``misc_plug_loads_vehicle_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Misc Plug Loads: Vehicle Annual kWh**
+
+The annual energy consumption of the electric vehicle plug loads. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.
+
+- **Name:** ``misc_plug_loads_vehicle_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Misc Plug Loads: Vehicle Usage Multiplier**
+
+Multiplier on the electric vehicle energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.
+
+- **Name:** ``misc_plug_loads_vehicle_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Misc Fuel Loads: Grill Present**
+
+Whether there is a fuel loads grill.
+
+- **Name:** ``misc_fuel_loads_grill_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Misc Fuel Loads: Grill Fuel Type**
+
+The fuel type of the fuel loads grill.
+
+- **Name:** ``misc_fuel_loads_grill_fuel_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `natural gas`, `fuel oil`, `propane`, `wood`, `wood pellets`
+
+
+
+**Misc Fuel Loads: Grill Annual therm**
+
+The annual energy consumption of the fuel loads grill. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.
+
+- **Name:** ``misc_fuel_loads_grill_annual_therm``
+- **Type:** ``Double``
+
+- **Units:** ``therm/yr``
+
+- **Required:** ``false``
+
+
+
+**Misc Fuel Loads: Grill Usage Multiplier**
+
+Multiplier on the fuel loads grill energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.
+
+- **Name:** ``misc_fuel_loads_grill_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Misc Fuel Loads: Lighting Present**
+
+Whether there is fuel loads lighting.
+
+- **Name:** ``misc_fuel_loads_lighting_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Misc Fuel Loads: Lighting Fuel Type**
+
+The fuel type of the fuel loads lighting.
+
+- **Name:** ``misc_fuel_loads_lighting_fuel_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `natural gas`, `fuel oil`, `propane`, `wood`, `wood pellets`
+
+
+
+**Misc Fuel Loads: Lighting Annual therm**
+
+The annual energy consumption of the fuel loads lighting. If not provided, the OS-HPXML default (see HPXML Fuel Loads)is used.
+
+- **Name:** ``misc_fuel_loads_lighting_annual_therm``
+- **Type:** ``Double``
+
+- **Units:** ``therm/yr``
+
+- **Required:** ``false``
+
+
+
+**Misc Fuel Loads: Lighting Usage Multiplier**
+
+Multiplier on the fuel loads lighting energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.
+
+- **Name:** ``misc_fuel_loads_lighting_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Misc Fuel Loads: Fireplace Present**
+
+Whether there is fuel loads fireplace.
+
+- **Name:** ``misc_fuel_loads_fireplace_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Misc Fuel Loads: Fireplace Fuel Type**
+
+The fuel type of the fuel loads fireplace.
+
+- **Name:** ``misc_fuel_loads_fireplace_fuel_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `natural gas`, `fuel oil`, `propane`, `wood`, `wood pellets`
+
+
+
+**Misc Fuel Loads: Fireplace Annual therm**
+
+The annual energy consumption of the fuel loads fireplace. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.
+
+- **Name:** ``misc_fuel_loads_fireplace_annual_therm``
+- **Type:** ``Double``
+
+- **Units:** ``therm/yr``
+
+- **Required:** ``false``
+
+
+
+**Misc Fuel Loads: Fireplace Sensible Fraction**
+
+Fraction of fireplace residual fuel loads' internal gains that are sensible. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.
+
+- **Name:** ``misc_fuel_loads_fireplace_frac_sensible``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Misc Fuel Loads: Fireplace Latent Fraction**
+
+Fraction of fireplace residual fuel loads' internal gains that are latent. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.
+
+- **Name:** ``misc_fuel_loads_fireplace_frac_latent``
+- **Type:** ``Double``
+
+- **Units:** ``Frac``
+
+- **Required:** ``false``
+
+
+
+**Misc Fuel Loads: Fireplace Usage Multiplier**
+
+Multiplier on the fuel loads fireplace energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.
+
+- **Name:** ``misc_fuel_loads_fireplace_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Pool: Present**
+
+Whether there is a pool.
+
+- **Name:** ``pool_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Pool: Pump Annual kWh**
+
+The annual energy consumption of the pool pump. If not provided, the OS-HPXML default (see Pool Pump) is used.
+
+- **Name:** ``pool_pump_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Pool: Pump Usage Multiplier**
+
+Multiplier on the pool pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see Pool Pump) is used.
+
+- **Name:** ``pool_pump_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Pool: Heater Type**
+
+The type of pool heater. Use 'none' if there is no pool heater.
+
+- **Name:** ``pool_heater_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `electric resistance`, `gas fired`, `heat pump`
+
+
+
+**Pool: Heater Annual kWh**
+
+The annual energy consumption of the electric resistance pool heater. If not provided, the OS-HPXML default (see Pool Heater) is used.
+
+- **Name:** ``pool_heater_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Pool: Heater Annual therm**
+
+The annual energy consumption of the gas fired pool heater. If not provided, the OS-HPXML default (see Pool Heater) is used.
+
+- **Name:** ``pool_heater_annual_therm``
+- **Type:** ``Double``
+
+- **Units:** ``therm/yr``
+
+- **Required:** ``false``
+
+
+
+**Pool: Heater Usage Multiplier**
+
+Multiplier on the pool heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see Pool Heater) is used.
+
+- **Name:** ``pool_heater_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Permanent Spa: Present**
+
+Whether there is a permanent spa.
+
+- **Name:** ``permanent_spa_present``
+- **Type:** ``Boolean``
+
+- **Required:** ``true``
+
+
+
+**Permanent Spa: Pump Annual kWh**
+
+The annual energy consumption of the permanent spa pump. If not provided, the OS-HPXML default (see Permanent Spa Pump) is used.
+
+- **Name:** ``permanent_spa_pump_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Permanent Spa: Pump Usage Multiplier**
+
+Multiplier on the permanent spa pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see Permanent Spa Pump) is used.
+
+- **Name:** ``permanent_spa_pump_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Permanent Spa: Heater Type**
+
+The type of permanent spa heater. Use 'none' if there is no permanent spa heater.
+
+- **Name:** ``permanent_spa_heater_type``
+- **Type:** ``Choice``
+
+- **Required:** ``true``
+
+- **Choices:** `none`, `electric resistance`, `gas fired`, `heat pump`
+
+
+
+**Permanent Spa: Heater Annual kWh**
+
+The annual energy consumption of the electric resistance permanent spa heater. If not provided, the OS-HPXML default (see Permanent Spa Heater) is used.
+
+- **Name:** ``permanent_spa_heater_annual_kwh``
+- **Type:** ``Double``
+
+- **Units:** ``kWh/yr``
+
+- **Required:** ``false``
+
+
+
+**Permanent Spa: Heater Annual therm**
+
+The annual energy consumption of the gas fired permanent spa heater. If not provided, the OS-HPXML default (see Permanent Spa Heater) is used.
+
+- **Name:** ``permanent_spa_heater_annual_therm``
+- **Type:** ``Double``
+
+- **Units:** ``therm/yr``
+
+- **Required:** ``false``
+
+
+
+**Permanent Spa: Heater Usage Multiplier**
+
+Multiplier on the permanent spa heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see Permanent Spa Heater) is used.
+
+- **Name:** ``permanent_spa_heater_usage_multiplier``
+- **Type:** ``Double``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Scenario Names**
+
+Names of emissions scenarios. If multiple scenarios, use a comma-separated list. If not provided, no emissions scenarios are calculated.
+
+- **Name:** ``emissions_scenario_names``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Types**
+
+Types of emissions (e.g., CO2e, NOx, etc.). If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``emissions_types``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Electricity Units**
+
+Electricity emissions factors units. If multiple scenarios, use a comma-separated list. Only lb/MWh and kg/MWh are allowed.
+
+- **Name:** ``emissions_electricity_units``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Electricity Values or File Paths**
+
+Electricity emissions factors values, specified as either an annual factor or an absolute/relative path to a file with hourly factors. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``emissions_electricity_values_or_filepaths``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Electricity Files Number of Header Rows**
+
+The number of header rows in the electricity emissions factor file. Only applies when an electricity filepath is used. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``emissions_electricity_number_of_header_rows``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Electricity Files Column Numbers**
+
+The column number in the electricity emissions factor file. Only applies when an electricity filepath is used. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``emissions_electricity_column_numbers``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Fossil Fuel Units**
+
+Fossil fuel emissions factors units. If multiple scenarios, use a comma-separated list. Only lb/MBtu and kg/MBtu are allowed.
+
+- **Name:** ``emissions_fossil_fuel_units``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Natural Gas Values**
+
+Natural gas emissions factors values, specified as an annual factor. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``emissions_natural_gas_values``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Propane Values**
+
+Propane emissions factors values, specified as an annual factor. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``emissions_propane_values``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Fuel Oil Values**
+
+Fuel oil emissions factors values, specified as an annual factor. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``emissions_fuel_oil_values``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Coal Values**
+
+Coal emissions factors values, specified as an annual factor. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``emissions_coal_values``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Wood Values**
+
+Wood emissions factors values, specified as an annual factor. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``emissions_wood_values``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Emissions: Wood Pellets Values**
+
+Wood pellets emissions factors values, specified as an annual factor. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``emissions_wood_pellets_values``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Scenario Names**
+
+Names of utility bill scenarios. If multiple scenarios, use a comma-separated list. If not provided, no utility bills scenarios are calculated.
+
+- **Name:** ``utility_bill_scenario_names``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Electricity File Paths**
+
+Electricity tariff file specified as an absolute/relative path to a file with utility rate structure information. Tariff file must be formatted to OpenEI API version 7. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_electricity_filepaths``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Electricity Fixed Charges**
+
+Electricity utility bill monthly fixed charges. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_electricity_fixed_charges``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Natural Gas Fixed Charges**
+
+Natural gas utility bill monthly fixed charges. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_natural_gas_fixed_charges``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Propane Fixed Charges**
+
+Propane utility bill monthly fixed charges. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_propane_fixed_charges``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Fuel Oil Fixed Charges**
+
+Fuel oil utility bill monthly fixed charges. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_fuel_oil_fixed_charges``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Coal Fixed Charges**
+
+Coal utility bill monthly fixed charges. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_coal_fixed_charges``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Wood Fixed Charges**
+
+Wood utility bill monthly fixed charges. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_wood_fixed_charges``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Wood Pellets Fixed Charges**
+
+Wood pellets utility bill monthly fixed charges. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_wood_pellets_fixed_charges``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Electricity Marginal Rates**
+
+Electricity utility bill marginal rates. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_electricity_marginal_rates``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Natural Gas Marginal Rates**
+
+Natural gas utility bill marginal rates. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_natural_gas_marginal_rates``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Propane Marginal Rates**
+
+Propane utility bill marginal rates. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_propane_marginal_rates``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Fuel Oil Marginal Rates**
+
+Fuel oil utility bill marginal rates. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_fuel_oil_marginal_rates``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Coal Marginal Rates**
+
+Coal utility bill marginal rates. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_coal_marginal_rates``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Wood Marginal Rates**
+
+Wood utility bill marginal rates. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_wood_marginal_rates``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: Wood Pellets Marginal Rates**
+
+Wood pellets utility bill marginal rates. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_wood_pellets_marginal_rates``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: PV Compensation Types**
+
+Utility bill PV compensation types. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_pv_compensation_types``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: PV Net Metering Annual Excess Sellback Rate Types**
+
+Utility bill PV net metering annual excess sellback rate types. Only applies if the PV compensation type is 'NetMetering'. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_pv_net_metering_annual_excess_sellback_rate_types``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: PV Net Metering Annual Excess Sellback Rates**
+
+Utility bill PV net metering annual excess sellback rates. Only applies if the PV compensation type is 'NetMetering' and the PV annual excess sellback rate type is 'User-Specified'. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_pv_net_metering_annual_excess_sellback_rates``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: PV Feed-In Tariff Rates**
+
+Utility bill PV annual full/gross feed-in tariff rates. Only applies if the PV compensation type is 'FeedInTariff'. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_pv_feed_in_tariff_rates``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: PV Monthly Grid Connection Fee Units**
+
+Utility bill PV monthly grid connection fee units. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_pv_monthly_grid_connection_fee_units``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Utility Bills: PV Monthly Grid Connection Fees**
+
+Utility bill PV monthly grid connection fees. If multiple scenarios, use a comma-separated list.
+
+- **Name:** ``utility_bill_pv_monthly_grid_connection_fees``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Additional Properties**
+
+Additional properties specified as key-value pairs (i.e., key=value). If multiple additional properties, use a |-separated list. For example, 'LowIncome=false|Remodeled|Description=2-story home in Denver'. These properties will be stored in the HPXML file under /HPXML/SoftwareInfo/extension/AdditionalProperties.
+
+- **Name:** ``additional_properties``
+- **Type:** ``String``
+
+- **Required:** ``false``
+
+
+
+**Combine like surfaces?**
+
+If true, combines like surfaces to simplify the HPXML file generated.
+
+- **Name:** ``combine_like_surfaces``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Apply Default Values?**
+
+If true, applies OS-HPXML default values to the HPXML output file. Setting to true will also force validation of the HPXML output file before applying OS-HPXML default values.
+
+- **Name:** ``apply_defaults``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+**Apply Validation?**
+
+If true, validates the HPXML output file. Set to false for faster performance. Note that validation is not needed if the HPXML file will be validated downstream (e.g., via the HPXMLtoOpenStudio measure).
+
+- **Name:** ``apply_validation``
+- **Type:** ``Boolean``
+
+- **Required:** ``false``
+
+
+
+
+
+
+
diff --git a/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md.erb b/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md.erb
new file mode 100644
index 00000000..0e9bc87d
--- /dev/null
+++ b/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md.erb
@@ -0,0 +1,41 @@
+<%#= README.md.erb is used to auto-generate README.md. %>
+###### (Automatically generated documentation)
+
+# <%= name %>
+
+## Description
+<%= description %>
+
+<%= modelerDescription %>
+
+## Arguments
+
+<% arguments.each do |argument| %>
+**<%= argument[:display_name] %>**
+
+<%= argument[:description] %>
+
+- **Name:** ``<%= argument[:name] %>``
+- **Type:** ``<%= argument[:type] %>``
+<% if argument[:units] %>
+- **Units:** ``<%= argument[:units] %>``
+<% end %>
+- **Required:** ``<%= argument[:required] %>``
+<% if argument[:type] == "Choice" %>
+- **Choices:** `<%= argument[:choice_values].join("`, `") %>`
+<% end %>
+
+<% end %>
+
+<% if arguments.size == 0 %>
+<%= "This measure does not have any user arguments" %>
+<% end %>
+
+<% if outputs.size > 0 %>
+## Outputs
+All possible measure outputs are listed below. Actual outputs depend on measure argument values provided.
+
+<% outputs.each do |output| %>
+- ``<%= output[:display_name] %>``
+<% end %>
+<% end %>
diff --git a/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb b/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb
index 41db0b18..69060759 100644
--- a/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb
+++ b/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb
@@ -1,3 +1,8 @@
+# *********************************************************************************
+# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
+# See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
+# *********************************************************************************
+
# frozen_string_literal: true
# Require all gems up front; this is much faster than multiple resource
@@ -35,6 +40,8 @@ def modeler_description
# define the arguments that the user will input
def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
+ docs_base_url = "https://openstudio-hpxml.readthedocs.io/en/v#{Version::OS_HPXML_Version}/workflow_inputs.html"
+
args = OpenStudio::Measure::OSArgumentVector.new
arg = OpenStudio::Measure::OSArgument.makeStringArgument('hpxml_path', true)
@@ -42,6 +49,11 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg.setDescription('Absolute/relative path of the HPXML file.')
args << arg
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('existing_hpxml_path', false)
+ arg.setDisplayName('Existing HPXML File Path')
+ arg.setDescription('Absolute/relative path of the existing HPXML file. If not provided, a new HPXML file with one Building element is created. If provided, a new Building element will be appended to this HPXML file (e.g., to create a multifamily HPXML file describing multiple dwelling units).')
+ args << arg
+
arg = OpenStudio::Measure::OSArgument.makeStringArgument('software_info_program_used', false)
arg.setDisplayName('Software Info: Program Used')
arg.setDescription('The name of the software program used.')
@@ -80,33 +92,33 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('simulation_control_timestep', false)
arg.setDisplayName('Simulation Control: Timestep')
arg.setUnits('min')
- arg.setDescription('Value must be a divisor of 60. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Value must be a divisor of 60. If not provided, the OS-HPXML default (see HPXML Simulation Control) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeStringArgument('simulation_control_run_period', false)
arg.setDisplayName('Simulation Control: Run Period')
- arg.setDescription('Enter a date like "Jan 1 - Dec 31". If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Enter a date like 'Jan 1 - Dec 31'. If not provided, the OS-HPXML default (see HPXML Simulation Control) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('simulation_control_run_period_calendar_year', false)
arg.setDisplayName('Simulation Control: Run Period Calendar Year')
arg.setUnits('year')
- arg.setDescription('This numeric field should contain the calendar year that determines the start day of week. If you are running simulations using AMY weather files, the value entered for calendar year will not be used; it will be overridden by the actual year found in the AMY weather file. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("This numeric field should contain the calendar year that determines the start day of week. If you are running simulations using AMY weather files, the value entered for calendar year will not be used; it will be overridden by the actual year found in the AMY weather file. If not provided, the OS-HPXML default (see HPXML Simulation Control) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('simulation_control_daylight_saving_enabled', false)
arg.setDisplayName('Simulation Control: Daylight Saving Enabled')
- arg.setDescription('Whether to use daylight saving. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Whether to use daylight saving. If not provided, the OS-HPXML default (see HPXML Building Site) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeStringArgument('simulation_control_daylight_saving_period', false)
arg.setDisplayName('Simulation Control: Daylight Saving Period')
- arg.setDescription('Enter a date like "Mar 15 - Dec 15". If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Enter a date like 'Mar 15 - Dec 15'. If not provided, the OS-HPXML default (see HPXML Building Site) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeStringArgument('simulation_control_temperature_capacitance_multiplier', false)
arg.setDisplayName('Simulation Control: Temperature Capacitance Multiplier')
- arg.setDescription('Affects the transient calculation of indoor air temperatures. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Affects the transient calculation of indoor air temperatures. If not provided, the OS-HPXML default (see HPXML Simulation Control) is used.")
args << arg
site_type_choices = OpenStudio::StringVector.new
@@ -116,7 +128,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('site_type', site_type_choices, false)
arg.setDisplayName('Site: Type')
- arg.setDescription('The type of site. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The type of site. If not provided, the OS-HPXML default (see HPXML Site) is used.")
args << arg
site_shielding_of_home_choices = OpenStudio::StringVector.new
@@ -126,12 +138,12 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('site_shielding_of_home', site_shielding_of_home_choices, false)
arg.setDisplayName('Site: Shielding of Home')
- arg.setDescription('Presence of nearby buildings, trees, obstructions for infiltration model. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Presence of nearby buildings, trees, obstructions for infiltration model. If not provided, the OS-HPXML default (see HPXML Site) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument.makeDoubleArgument('site_ground_conductivity', false)
arg.setDisplayName('Site: Ground Conductivity')
- arg.setDescription('Conductivity of the ground soil. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Conductivity of the ground soil. If not provided, the OS-HPXML default (see HPXML Site) is used.")
arg.setUnits('Btu/hr-ft-F')
args << arg
@@ -181,6 +193,12 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
unit_type_choices << HPXML::ResidentialTypeSFD
unit_type_choices << HPXML::ResidentialTypeSFA
unit_type_choices << HPXML::ResidentialTypeApartment
+ unit_type_choices << HPXML::ResidentialTypeManufactured
+
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('unit_multiplier', false)
+ arg.setDisplayName('Building Construction: Unit Multiplier')
+ arg.setDescription('The number of similar dwelling units. EnergyPlus simulation results will be multiplied this value. If not provided, defaults to 1.')
+ args << arg
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('geometry_unit_type', unit_type_choices, true)
arg.setDisplayName('Geometry: Unit Type')
@@ -255,7 +273,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('geometry_unit_num_bathrooms', false)
arg.setDisplayName('Geometry: Unit Number of Bathrooms')
arg.setUnits('#')
- arg.setDescription('The number of bathrooms in the unit. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The number of bathrooms in the unit. If not provided, the OS-HPXML default (see HPXML Building Construction) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_unit_num_occupants', false)
@@ -294,7 +312,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_garage_protrusion', true)
arg.setDisplayName('Geometry: Garage Protrusion')
arg.setUnits('Frac')
- arg.setDescription("The fraction of the garage that is protruding from the living space. Only applies to #{HPXML::ResidentialTypeSFD} units.")
+ arg.setDescription("The fraction of the garage that is protruding from the conditioned space. Only applies to #{HPXML::ResidentialTypeSFD} units.")
arg.setDefaultValue(0.0)
args << arg
@@ -317,6 +335,8 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
foundation_type_choices << HPXML::FoundationTypeBasementConditioned
foundation_type_choices << HPXML::FoundationTypeAmbient
foundation_type_choices << HPXML::FoundationTypeAboveApartment # I.e., adiabatic
+ foundation_type_choices << "#{HPXML::FoundationTypeBellyAndWing}WithSkirt"
+ foundation_type_choices << "#{HPXML::FoundationTypeBellyAndWing}NoSkirt"
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('geometry_foundation_type', foundation_type_choices, true)
arg.setDisplayName('Geometry: Foundation Type')
@@ -425,25 +445,25 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_front_height', false)
arg.setDisplayName('Neighbor: Front Height')
arg.setUnits('ft')
- arg.setDescription('The height of the neighboring building to the front. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The height of the neighboring building to the front. If not provided, the OS-HPXML default (see HPXML Site) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_back_height', false)
arg.setDisplayName('Neighbor: Back Height')
arg.setUnits('ft')
- arg.setDescription('The height of the neighboring building to the back. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The height of the neighboring building to the back. If not provided, the OS-HPXML default (see HPXML Site) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_left_height', false)
arg.setDisplayName('Neighbor: Left Height')
arg.setUnits('ft')
- arg.setDescription('The height of the neighboring building to the left. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The height of the neighboring building to the left. If not provided, the OS-HPXML default (see HPXML Site) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_right_height', false)
arg.setDisplayName('Neighbor: Right Height')
arg.setUnits('ft')
- arg.setDescription('The height of the neighboring building to the right. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The height of the neighboring building to the right. If not provided, the OS-HPXML default (see HPXML Site) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('floor_over_foundation_assembly_r', true)
@@ -484,13 +504,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('foundation_wall_type', foundation_wall_type_choices, false)
arg.setDisplayName('Foundation Wall: Type')
- arg.setDescription('The material type of the foundation wall. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The material type of the foundation wall. If not provided, the OS-HPXML default (see HPXML Foundation Walls) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_thickness', false)
arg.setDisplayName('Foundation Wall: Thickness')
arg.setUnits('in')
- arg.setDescription('The thickness of the foundation wall. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The thickness of the foundation wall. If not provided, the OS-HPXML default (see HPXML Foundation Walls) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_insulation_r', true)
@@ -514,13 +534,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_insulation_distance_to_top', false)
arg.setDisplayName('Foundation Wall: Insulation Distance To Top')
arg.setUnits('ft')
- arg.setDescription('The distance from the top of the foundation wall to the top of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The distance from the top of the foundation wall to the top of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default (see HPXML Foundation Walls) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_insulation_distance_to_bottom', false)
arg.setDisplayName('Foundation Wall: Insulation Distance To Bottom')
arg.setUnits('ft')
- arg.setDescription('The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default (see HPXML Foundation Walls) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_assembly_r', false)
@@ -566,19 +586,19 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_thickness', false)
arg.setDisplayName('Slab: Thickness')
arg.setUnits('in')
- arg.setDescription('The thickness of the slab. Zero can be entered if there is a dirt floor instead of a slab. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The thickness of the slab. Zero can be entered if there is a dirt floor instead of a slab. If not provided, the OS-HPXML default (see HPXML Slabs) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_carpet_fraction', false)
arg.setDisplayName('Slab: Carpet Fraction')
arg.setUnits('Frac')
- arg.setDescription('Fraction of the slab floor area that is carpeted. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Fraction of the slab floor area that is carpeted. If not provided, the OS-HPXML default (see HPXML Slabs) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_carpet_r', false)
arg.setDisplayName('Slab: Carpet R-value')
arg.setUnits('h-ft^2-R/Btu')
- arg.setDescription('R-value of the slab carpet. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("R-value of the slab carpet. If not provided, the OS-HPXML default (see HPXML Slabs) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_assembly_r', true)
@@ -601,7 +621,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_material_type', roof_material_type_choices, false)
arg.setDisplayName('Roof: Material Type')
- arg.setDescription('The material type of the roof. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The material type of the roof. If not provided, the OS-HPXML default (see HPXML Roofs) is used.")
args << arg
color_choices = OpenStudio::StringVector.new
@@ -613,7 +633,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_color', color_choices, false)
arg.setDisplayName('Roof: Color')
- arg.setDescription('The color of the roof. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The color of the roof. If not provided, the OS-HPXML default (see HPXML Roofs) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('roof_assembly_r', true)
@@ -636,8 +656,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_radiant_barrier_grade', roof_radiant_barrier_grade_choices, false)
arg.setDisplayName('Roof: Radiant Barrier Grade')
- arg.setDescription('The grade of the radiant barrier. If not provided, the OS-HPXML default is used.')
- arg.setDefaultValue('1')
+ arg.setDescription("The grade of the radiant barrier. If not provided, the OS-HPXML default (see HPXML Roofs) is used.")
args << arg
wall_type_choices = OpenStudio::StringVector.new
@@ -674,12 +693,12 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('wall_siding_type', wall_siding_type_choices, false)
arg.setDisplayName('Wall: Siding Type')
- arg.setDescription('The siding type of the walls. Also applies to rim joists. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The siding type of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see HPXML Walls) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('wall_color', color_choices, false)
arg.setDisplayName('Wall: Color')
- arg.setDescription('The color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see HPXML Walls) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('wall_assembly_r', true)
@@ -755,13 +774,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_fraction_operable', false)
arg.setDisplayName('Windows: Fraction Operable')
arg.setUnits('Frac')
- arg.setDescription('Fraction of windows that are operable. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Fraction of windows that are operable. If not provided, the OS-HPXML default (see HPXML Windows) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('window_natvent_availability', false)
arg.setDisplayName('Windows: Natural Ventilation Availability')
arg.setUnits('Days/week')
- arg.setDescription('For operable windows, the number of days/week that windows can be opened by occupants for natural ventilation. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("For operable windows, the number of days/week that windows can be opened by occupants for natural ventilation. If not provided, the OS-HPXML default (see HPXML Windows) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_ufactor', true)
@@ -780,30 +799,30 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_interior_shading_winter', false)
arg.setDisplayName('Windows: Winter Interior Shading')
arg.setUnits('Frac')
- arg.setDescription('Interior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Interior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see HPXML Windows) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_interior_shading_summer', false)
arg.setDisplayName('Windows: Summer Interior Shading')
arg.setUnits('Frac')
- arg.setDescription('Interior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Interior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see HPXML Windows) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_exterior_shading_winter', false)
arg.setDisplayName('Windows: Winter Exterior Shading')
arg.setUnits('Frac')
- arg.setDescription('Exterior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Exterior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see HPXML Windows) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_exterior_shading_summer', false)
arg.setDisplayName('Windows: Summer Exterior Shading')
arg.setUnits('Frac')
- arg.setDescription('Exterior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Exterior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see HPXML Windows) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeStringArgument('window_shading_summer_season', false)
arg.setDisplayName('Windows: Shading Summer Season')
- arg.setDescription('Enter a date like "May 1 - Sep 30". Defines the summer season for purposes of shading coefficients; the rest of the year is assumed to be winter. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Enter a date like 'May 1 - Sep 30'. Defines the summer season for purposes of shading coefficients; the rest of the year is assumed to be winter. If not provided, the OS-HPXML default (see HPXML Windows) is used.")
args << arg
storm_window_type_choices = OpenStudio::StringVector.new
@@ -996,7 +1015,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('air_leakage_has_flue_or_chimney_in_conditioned_space', false)
arg.setDisplayName('Air Leakage: Has Flue or Chimney in Conditioned Space')
- arg.setDescription('Presence of flue or chimney with combustion air from conditioned space; used for infiltration model. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Presence of flue or chimney with combustion air from conditioned space; used for infiltration model. If not provided, the OS-HPXML default (see Flue or Chimney) is used.")
args << arg
heating_system_type_choices = OpenStudio::StringVector.new
@@ -1007,9 +1026,8 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
heating_system_type_choices << HPXML::HVACTypeBoiler
heating_system_type_choices << HPXML::HVACTypeElectricResistance
heating_system_type_choices << HPXML::HVACTypeStove
- heating_system_type_choices << HPXML::HVACTypePortableHeater
+ heating_system_type_choices << HPXML::HVACTypeSpaceHeater
heating_system_type_choices << HPXML::HVACTypeFireplace
- heating_system_type_choices << HPXML::HVACTypeFixedHeater
heating_system_type_choices << "Shared #{HPXML::HVACTypeBoiler} w/ Baseboard"
heating_system_type_choices << "Shared #{HPXML::HVACTypeBoiler} w/ Ductless Fan Coil"
@@ -1062,7 +1080,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_heating_capacity', false)
arg.setDisplayName('Heating System: Heating Capacity')
- arg.setDescription('The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default is used.')
+ arg.setDescription("The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default (see HPXML Heating Systems) is used.")
arg.setUnits('Btu/hr')
args << arg
@@ -1105,18 +1123,18 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooling_system_cooling_compressor_type', compressor_type_choices, false)
arg.setDisplayName('Cooling System: Cooling Compressor Type')
- arg.setDescription("The compressor type of the cooling system. Only applies to #{HPXML::HVACTypeCentralAirConditioner}. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("The compressor type of the cooling system. Only applies to #{HPXML::HVACTypeCentralAirConditioner} and #{HPXML::HVACTypeMiniSplitAirConditioner}. If not provided, the OS-HPXML default (see Central Air Conditioner, Mini-Split Air Conditioner) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_cooling_sensible_heat_fraction', false)
arg.setDisplayName('Cooling System: Cooling Sensible Heat Fraction')
- arg.setDescription("The sensible heat fraction of the cooling system. Ignored for #{HPXML::HVACTypeEvaporativeCooler}. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("The sensible heat fraction of the cooling system. Ignored for #{HPXML::HVACTypeEvaporativeCooler}. If not provided, the OS-HPXML default (see Central Air Conditioner, Room Air Conditioner, Packaged Terminal Air Conditioner, Mini-Split Air Conditioner) is used.")
arg.setUnits('Frac')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_cooling_capacity', false)
arg.setDisplayName('Cooling System: Cooling Capacity')
- arg.setDescription('The output cooling capacity of the cooling system. If not provided, the OS-HPXML autosized default is used.')
+ arg.setDescription("The output cooling capacity of the cooling system. If not provided, the OS-HPXML autosized default (see Central Air Conditioner, Room Air Conditioner, Packaged Terminal Air Conditioner, Evaporative Cooler, Mini-Split Air Conditioner) is used.")
arg.setUnits('Btu/hr')
args << arg
@@ -1147,7 +1165,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_crankcase_heater_watts', false)
arg.setDisplayName('Cooling System: Crankcase Heater Power Watts')
- arg.setDescription("Cooling system crankcase heater power consumption in Watts. Applies only to #{HPXML::HVACTypeCentralAirConditioner}, #{HPXML::HVACTypeMiniSplitAirConditioner}, #{HPXML::HVACTypePTAC} and #{HPXML::HVACTypeRoomAirConditioner}. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("Cooling system crankcase heater power consumption in Watts. Applies only to #{HPXML::HVACTypeCentralAirConditioner}, #{HPXML::HVACTypeRoomAirConditioner}, #{HPXML::HVACTypePTAC} and #{HPXML::HVACTypeMiniSplitAirConditioner}. If not provided, the OS-HPXML default (see Central Air Conditioner, Room Air Conditioner, Packaged Terminal Air Conditioner, Mini-Split Air Conditioner) is used.")
arg.setUnits('W')
args << arg
@@ -1164,7 +1182,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_integrated_heating_system_capacity', false)
arg.setDisplayName('Cooling System: Integrated Heating System Heating Capacity')
- arg.setDescription("The output heating capacity of the heating system integrated into cooling system. If not provided, the OS-HPXML autosized default is used. Only used for #{HPXML::HVACTypePTAC} and #{HPXML::HVACTypeRoomAirConditioner}.")
+ arg.setDescription("The output heating capacity of the heating system integrated into cooling system. If not provided, the OS-HPXML autosized default (see Room Air Conditioner, Packaged Terminal Air Conditioner) is used. Only used for #{HPXML::HVACTypeRoomAirConditioner} and #{HPXML::HVACTypePTAC}.")
arg.setUnits('Btu/hr')
args << arg
@@ -1187,9 +1205,6 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
heat_pump_heating_efficiency_type_choices << HPXML::UnitsHSPF2
heat_pump_heating_efficiency_type_choices << HPXML::UnitsCOP
- heat_pump_fuel_choices = OpenStudio::StringVector.new
- heat_pump_fuel_choices << HPXML::FuelTypeElectricity
-
heat_pump_backup_type_choices = OpenStudio::StringVector.new
heat_pump_backup_type_choices << 'none'
heat_pump_backup_type_choices << HPXML::HeatPumpBackupTypeIntegrated
@@ -1238,24 +1253,24 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_cooling_compressor_type', compressor_type_choices, false)
arg.setDisplayName('Heat Pump: Cooling Compressor Type')
- arg.setDescription("The compressor type of the heat pump. Only applies to #{HPXML::HVACTypeHeatPumpAirToAir}. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("The compressor type of the heat pump. Only applies to #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit}. If not provided, the OS-HPXML default (see Air-to-Air Heat Pump, Mini-Split Heat Pump) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_cooling_sensible_heat_fraction', false)
arg.setDisplayName('Heat Pump: Cooling Sensible Heat Fraction')
- arg.setDescription('The sensible heat fraction of the heat pump. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The sensible heat fraction of the heat pump. If not provided, the OS-HPXML default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle, Ground-to-Air Heat Pump) is used.")
arg.setUnits('Frac')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_capacity', false)
arg.setDisplayName('Heat Pump: Heating Capacity')
- arg.setDescription('The output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default is used.')
+ arg.setDescription("The output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle, Ground-to-Air Heat Pump) is used.")
arg.setUnits('Btu/hr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_capacity_retention_fraction', false)
arg.setDisplayName('Heat Pump: Heating Capacity Retention Fraction')
- arg.setDescription("The output heating capacity of the heat pump at a user-specified temperature (e.g., 17F or 5F) divided by the above nominal heating capacity. Applies to all heat pump types except #{HPXML::HVACTypeHeatPumpGroundToAir}. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("The output heating capacity of the heat pump at a user-specified temperature (e.g., 17F or 5F) divided by the above nominal heating capacity. Applies to all heat pump types except #{HPXML::HVACTypeHeatPumpGroundToAir}. If not provided, the OS-HPXML default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle) is used.")
arg.setUnits('Frac')
args << arg
@@ -1267,7 +1282,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_cooling_capacity', false)
arg.setDisplayName('Heat Pump: Cooling Capacity')
- arg.setDescription('The output cooling capacity of the heat pump. If not provided, the OS-HPXML autosized default is used.')
+ arg.setDescription("The output cooling capacity of the heat pump. If not provided, the OS-HPXML autosized default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle, Ground-to-Air Heat Pump) is used.")
arg.setUnits('Btu/hr')
args << arg
@@ -1287,7 +1302,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_compressor_lockout_temp', false)
arg.setDisplayName('Heat Pump: Compressor Lockout Temperature')
- arg.setDescription("The temperature below which the heat pump compressor is disabled. If both this and Backup Heating Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies to all heat pump types other than #{HPXML::HVACTypeHeatPumpGroundToAir}. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("The temperature below which the heat pump compressor is disabled. If both this and Backup Heating Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies to all heat pump types other than #{HPXML::HVACTypeHeatPumpGroundToAir}. If not provided, the OS-HPXML default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle) is used.")
arg.setUnits('deg-F')
args << arg
@@ -1311,19 +1326,19 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_backup_heating_capacity', false)
arg.setDisplayName('Heat Pump: Backup Heating Capacity')
- arg.setDescription("The backup output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default is used. Only applies if Backup Type is '#{HPXML::HeatPumpBackupTypeIntegrated}'.")
+ arg.setDescription("The backup output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default (see Backup) is used. Only applies if Backup Type is '#{HPXML::HeatPumpBackupTypeIntegrated}'.")
arg.setUnits('Btu/hr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_backup_heating_lockout_temp', false)
arg.setDisplayName('Heat Pump: Backup Heating Lockout Temperature')
- arg.setDescription("The temperature above which the heat pump backup system is disabled. If both this and Compressor Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies for both Backup Type of '#{HPXML::HeatPumpBackupTypeIntegrated}' and '#{HPXML::HeatPumpBackupTypeSeparate}'. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("The temperature above which the heat pump backup system is disabled. If both this and Compressor Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies for both Backup Type of '#{HPXML::HeatPumpBackupTypeIntegrated}' and '#{HPXML::HeatPumpBackupTypeSeparate}'. If not provided, the OS-HPXML default (see Backup) is used.")
arg.setUnits('deg-F')
args << arg
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_sizing_methodology', heat_pump_sizing_choices, false)
arg.setDisplayName('Heat Pump: Sizing Methodology')
- arg.setDescription('The auto-sizing methodology to use when the heat pump capacity is not provided. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The auto-sizing methodology to use when the heat pump capacity is not provided. If not provided, the OS-HPXML default (see HPXML HVAC Sizing Control) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('heat_pump_is_ducted', false)
@@ -1345,7 +1360,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_crankcase_heater_watts', false)
arg.setDisplayName('Heat Pump: Crankcase Heater Power Watts')
- arg.setDescription("Heat Pump crankcase heater power consumption in Watts. Applies only to #{HPXML::HVACTypeHeatPumpAirToAir}, #{HPXML::HVACTypeHeatPumpMiniSplit}, #{HPXML::HVACTypeHeatPumpPTHP} and #{HPXML::HVACTypeHeatPumpRoom}. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("Heat Pump crankcase heater power consumption in Watts. Applies only to #{HPXML::HVACTypeHeatPumpAirToAir}, #{HPXML::HVACTypeHeatPumpMiniSplit}, #{HPXML::HVACTypeHeatPumpPTHP} and #{HPXML::HVACTypeHeatPumpRoom}. If not provided, the OS-HPXML default (see Air-to-Air Heat Pump, Mini-Split Heat Pump, Packaged Terminal Heat Pump, Room Air Conditioner w/ Reverse Cycle) is used.")
arg.setUnits('W')
args << arg
@@ -1357,9 +1372,8 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
heating_system_2_type_choices << HPXML::HVACTypeBoiler
heating_system_2_type_choices << HPXML::HVACTypeElectricResistance
heating_system_2_type_choices << HPXML::HVACTypeStove
- heating_system_2_type_choices << HPXML::HVACTypePortableHeater
+ heating_system_2_type_choices << HPXML::HVACTypeSpaceHeater
heating_system_2_type_choices << HPXML::HVACTypeFireplace
- heating_system_2_type_choices << HPXML::HVACTypeFixedHeater
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system_2_type', heating_system_2_type_choices, true)
arg.setDisplayName('Heating System 2: Type')
@@ -1382,7 +1396,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_2_heating_capacity', false)
arg.setDisplayName('Heating System 2: Heating Capacity')
- arg.setDescription('The output heating capacity of the second heating system. If not provided, the OS-HPXML autosized default is used.')
+ arg.setDescription("The output heating capacity of the second heating system. If not provided, the OS-HPXML autosized default (see HPXML Heating Systems) is used.")
arg.setUnits('Btu/hr')
args << arg
@@ -1419,12 +1433,12 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_heating_season_period', false)
arg.setDisplayName('HVAC Control: Heating Season Period')
- arg.setDescription("Enter a date like 'Nov 1 - Jun 30'. If not provided, the OS-HPXML default is used. Can also provide '#{HPXML::BuildingAmerica}' to use automatic seasons from the Building America House Simulation Protocols.")
+ arg.setDescription("Enter a date like 'Nov 1 - Jun 30'. If not provided, the OS-HPXML default (see HPXML HVAC Control) is used. Can also provide '#{HPXML::BuildingAmerica}' to use automatic seasons from the Building America House Simulation Protocols.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_cooling_season_period', false)
arg.setDisplayName('HVAC Control: Cooling Season Period')
- arg.setDescription("Enter a date like 'Jun 1 - Oct 31'. If not provided, the OS-HPXML default is used. Can also provide '#{HPXML::BuildingAmerica}' to use automatic seasons from the Building America House Simulation Protocols.")
+ arg.setDescription("Enter a date like 'Jun 1 - Oct 31'. If not provided, the OS-HPXML default (see HPXML HVAC Control) is used. Can also provide '#{HPXML::BuildingAmerica}' to use automatic seasons from the Building America House Simulation Protocols.")
args << arg
duct_leakage_units_choices = OpenStudio::StringVector.new
@@ -1433,12 +1447,14 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
duct_leakage_units_choices << HPXML::UnitsPercent
duct_location_choices = OpenStudio::StringVector.new
- duct_location_choices << HPXML::LocationLivingSpace
+ duct_location_choices << HPXML::LocationConditionedSpace
duct_location_choices << HPXML::LocationBasementConditioned
duct_location_choices << HPXML::LocationBasementUnconditioned
+ duct_location_choices << HPXML::LocationCrawlspace
duct_location_choices << HPXML::LocationCrawlspaceVented
duct_location_choices << HPXML::LocationCrawlspaceUnvented
duct_location_choices << HPXML::LocationCrawlspaceConditioned
+ duct_location_choices << HPXML::LocationAttic
duct_location_choices << HPXML::LocationAtticVented
duct_location_choices << HPXML::LocationAtticUnvented
duct_location_choices << HPXML::LocationGarage
@@ -1450,6 +1466,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
duct_location_choices << HPXML::LocationOtherHeatedSpace
duct_location_choices << HPXML::LocationOtherMultifamilyBufferSpace
duct_location_choices << HPXML::LocationOtherNonFreezingSpace
+ duct_location_choices << HPXML::LocationManufacturedHomeBelly
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_leakage_units', duct_leakage_units_choices, true)
arg.setDisplayName('Ducts: Leakage Units')
@@ -1471,7 +1488,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_supply_location', duct_location_choices, false)
arg.setDisplayName('Ducts: Supply Location')
- arg.setDescription('The location of the supply ducts. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The location of the supply ducts. If not provided, the OS-HPXML default (see Air Distribution) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_supply_insulation_r', true)
@@ -1494,13 +1511,19 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_supply_surface_area', false)
arg.setDisplayName('Ducts: Supply Surface Area')
- arg.setDescription('The surface area of the supply ducts. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The supply ducts surface area in the given location. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see Air Distribution) is used.")
arg.setUnits('ft^2')
args << arg
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_supply_surface_area_fraction', false)
+ arg.setDisplayName('Ducts: Supply Area Fraction')
+ arg.setDescription("The fraction of supply ducts surface area in the given location. Only used if Surface Area is not provided. If the fraction is less than 1, the remaining duct area is assumed to be in conditioned space. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see Air Distribution) is used.")
+ arg.setUnits('frac')
+ args << arg
+
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_return_location', duct_location_choices, false)
arg.setDisplayName('Ducts: Return Location')
- arg.setDescription('The location of the return ducts. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The location of the return ducts. If not provided, the OS-HPXML default (see Air Distribution) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_return_insulation_r', true)
@@ -1517,13 +1540,19 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_return_surface_area', false)
arg.setDisplayName('Ducts: Return Surface Area')
- arg.setDescription('The surface area of the return ducts. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The return ducts surface area in the given location. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see Air Distribution) is used.")
arg.setUnits('ft^2')
args << arg
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_return_surface_area_fraction', false)
+ arg.setDisplayName('Ducts: Return Area Fraction')
+ arg.setDescription("The fraction of return ducts surface area in the given location. Only used if Surface Area is not provided. If the fraction is less than 1, the remaining duct area is assumed to be in conditioned space. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see Air Distribution) is used.")
+ arg.setUnits('frac')
+ args << arg
+
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('ducts_number_of_return_registers', false)
arg.setDisplayName('Ducts: Number of Return Registers')
- arg.setDescription('The number of return registers of the ducts. Only used to calculate default return duct surface area. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The number of return registers of the ducts. Only used to calculate default return duct surface area. If not provided, the OS-HPXML default (see Air Distribution) is used.")
arg.setUnits('#')
args << arg
@@ -1548,13 +1577,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_flow_rate', false)
arg.setDisplayName('Mechanical Ventilation: Flow Rate')
- arg.setDescription('The flow rate of the mechanical ventilation. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The flow rate of the mechanical ventilation. If not provided, the OS-HPXML default (see Whole Ventilation Fan) is used.")
arg.setUnits('CFM')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_hours_in_operation', false)
arg.setDisplayName('Mechanical Ventilation: Hours In Operation')
- arg.setDescription('The hours in operation of the mechanical ventilation. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The hours in operation of the mechanical ventilation. If not provided, the OS-HPXML default (see Whole Ventilation Fan) is used.")
arg.setUnits('hrs/day')
args << arg
@@ -1580,7 +1609,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_fan_power', false)
arg.setDisplayName('Mechanical Ventilation: Fan Power')
- arg.setDescription('The fan power of the mechanical ventilation. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The fan power of the mechanical ventilation. If not provided, the OS-HPXML default (see Whole Ventilation Fan) is used.")
arg.setUnits('W')
args << arg
@@ -1691,61 +1720,61 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('kitchen_fans_quantity', false)
arg.setDisplayName('Kitchen Fans: Quantity')
- arg.setDescription('The quantity of the kitchen fans. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The quantity of the kitchen fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.")
arg.setUnits('#')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_flow_rate', false)
arg.setDisplayName('Kitchen Fans: Flow Rate')
- arg.setDescription('The flow rate of the kitchen fan. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The flow rate of the kitchen fan. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.")
arg.setUnits('CFM')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_hours_in_operation', false)
arg.setDisplayName('Kitchen Fans: Hours In Operation')
- arg.setDescription('The hours in operation of the kitchen fan. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The hours in operation of the kitchen fan. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.")
arg.setUnits('hrs/day')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_power', false)
arg.setDisplayName('Kitchen Fans: Fan Power')
- arg.setDescription('The fan power of the kitchen fan. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The fan power of the kitchen fan. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.")
arg.setUnits('W')
args << arg
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('kitchen_fans_start_hour', false)
arg.setDisplayName('Kitchen Fans: Start Hour')
- arg.setDescription('The start hour of the kitchen fan. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The start hour of the kitchen fan. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.")
arg.setUnits('hr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('bathroom_fans_quantity', false)
arg.setDisplayName('Bathroom Fans: Quantity')
- arg.setDescription('The quantity of the bathroom fans. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The quantity of the bathroom fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.")
arg.setUnits('#')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_flow_rate', false)
arg.setDisplayName('Bathroom Fans: Flow Rate')
- arg.setDescription('The flow rate of the bathroom fans. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The flow rate of the bathroom fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.")
arg.setUnits('CFM')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_hours_in_operation', false)
arg.setDisplayName('Bathroom Fans: Hours In Operation')
- arg.setDescription('The hours in operation of the bathroom fans. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The hours in operation of the bathroom fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.")
arg.setUnits('hrs/day')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_power', false)
arg.setDisplayName('Bathroom Fans: Fan Power')
- arg.setDescription('The fan power of the bathroom fans. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The fan power of the bathroom fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.")
arg.setUnits('W')
args << arg
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('bathroom_fans_start_hour', false)
arg.setDisplayName('Bathroom Fans: Start Hour')
- arg.setDescription('The start hour of the bathroom fans. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The start hour of the bathroom fans. If not provided, the OS-HPXML default (see Local Ventilation Fan) is used.")
arg.setUnits('hr')
args << arg
@@ -1757,13 +1786,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('whole_house_fan_flow_rate', false)
arg.setDisplayName('Whole House Fan: Flow Rate')
- arg.setDescription('The flow rate of the whole house fan. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The flow rate of the whole house fan. If not provided, the OS-HPXML default (see Whole House Fan) is used.")
arg.setUnits('CFM')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('whole_house_fan_power', false)
arg.setDisplayName('Whole House Fan: Fan Power')
- arg.setDescription('The fan power of the whole house fan. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The fan power of the whole house fan. If not provided, the OS-HPXML default (see Whole House Fan) is used.")
arg.setUnits('W')
args << arg
@@ -1784,12 +1813,14 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
water_heater_fuel_choices << HPXML::FuelTypeCoal
water_heater_location_choices = OpenStudio::StringVector.new
- water_heater_location_choices << HPXML::LocationLivingSpace
+ water_heater_location_choices << HPXML::LocationConditionedSpace
water_heater_location_choices << HPXML::LocationBasementConditioned
water_heater_location_choices << HPXML::LocationBasementUnconditioned
water_heater_location_choices << HPXML::LocationGarage
+ water_heater_location_choices << HPXML::LocationAttic
water_heater_location_choices << HPXML::LocationAtticVented
water_heater_location_choices << HPXML::LocationAtticUnvented
+ water_heater_location_choices << HPXML::LocationCrawlspace
water_heater_location_choices << HPXML::LocationCrawlspaceVented
water_heater_location_choices << HPXML::LocationCrawlspaceUnvented
water_heater_location_choices << HPXML::LocationCrawlspaceConditioned
@@ -1823,12 +1854,12 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_location', water_heater_location_choices, false)
arg.setDisplayName('Water Heater: Location')
- arg.setDescription('The location of water heater. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The location of water heater. If not provided, the OS-HPXML default (see HPXML Water Heating Systems) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_tank_volume', false)
arg.setDisplayName('Water Heater: Tank Volume')
- arg.setDescription("Nominal volume of water heater tank. Only applies to #{HPXML::WaterHeaterTypeStorage}, #{HPXML::WaterHeaterTypeHeatPump}, and #{HPXML::WaterHeaterTypeCombiStorage}. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("Nominal volume of water heater tank. Only applies to #{HPXML::WaterHeaterTypeStorage}, #{HPXML::WaterHeaterTypeHeatPump}, and #{HPXML::WaterHeaterTypeCombiStorage}. If not provided, the OS-HPXML default (see Conventional Storage, Heat Pump, Combi Boiler w/ Storage) is used.")
arg.setUnits('gal')
args << arg
@@ -1846,24 +1877,24 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_usage_bin', water_heater_usage_bin_choices, false)
arg.setDisplayName('Water Heater: Usage Bin')
- arg.setDescription("The usage of the water heater. Only applies if Efficiency Type is UniformEnergyFactor and Type is not #{HPXML::WaterHeaterTypeTankless}. Does not apply to space-heating boilers. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("The usage of the water heater. Only applies if Efficiency Type is UniformEnergyFactor and Type is not #{HPXML::WaterHeaterTypeTankless}. Does not apply to space-heating boilers. If not provided, the OS-HPXML default (see Conventional Storage, Heat Pump) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_recovery_efficiency', false)
arg.setDisplayName('Water Heater: Recovery Efficiency')
- arg.setDescription('Ratio of energy delivered to water heater to the energy content of the fuel consumed by the water heater. Only used for non-electric storage water heaters. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Ratio of energy delivered to water heater to the energy content of the fuel consumed by the water heater. Only used for non-electric storage water heaters. If not provided, the OS-HPXML default (see Conventional Storage) is used.")
arg.setUnits('Frac')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_heating_capacity', false)
arg.setDisplayName('Water Heater: Heating Capacity')
- arg.setDescription("Heating capacity. Only applies to #{HPXML::WaterHeaterTypeStorage}. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("Heating capacity. Only applies to #{HPXML::WaterHeaterTypeStorage}. If not provided, the OS-HPXML default (see Conventional Storage) is used.")
arg.setUnits('Btu/hr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_standby_loss', false)
arg.setDisplayName('Water Heater: Standby Loss')
- arg.setDescription('The standby loss of water heater. Only applies to space-heating boilers. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The standby loss of water heater. Only applies to space-heating boilers. If not provided, the OS-HPXML default (see Combi Boiler w/ Storage) is used.")
arg.setUnits('deg-F/hr')
args << arg
@@ -1875,7 +1906,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_setpoint_temperature', false)
arg.setDisplayName('Water Heater: Setpoint Temperature')
- arg.setDescription('The setpoint temperature of water heater. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The setpoint temperature of water heater. If not provided, the OS-HPXML default (see HPXML Water Heating Systems) is used.")
arg.setUnits('deg-F')
args << arg
@@ -1897,7 +1928,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_tank_model_type', water_heater_tank_model_type_choices, false)
arg.setDisplayName('Water Heater: Tank Type')
- arg.setDescription("Type of tank model to use. The '#{HPXML::WaterHeaterTankModelTypeStratified}' tank generally provide more accurate results, but may significantly increase run time. Applies only to #{HPXML::WaterHeaterTypeStorage}. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("Type of tank model to use. The '#{HPXML::WaterHeaterTankModelTypeStratified}' tank generally provide more accurate results, but may significantly increase run time. Applies only to #{HPXML::WaterHeaterTypeStorage}. If not provided, the OS-HPXML default (see Conventional Storage) is used.")
args << arg
water_heater_operating_mode_choices = OpenStudio::StringVector.new
@@ -1906,7 +1937,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_operating_mode', water_heater_operating_mode_choices, false)
arg.setDisplayName('Water Heater: Operating Mode')
- arg.setDescription("The water heater operating mode. The '#{HPXML::WaterHeaterOperatingModeHeatPumpOnly}' option only uses the heat pump, while '#{HPXML::WaterHeaterOperatingModeHybridAuto}' allows the backup electric resistance to come on in high demand situations. This is ignored if a scheduled operating mode type is selected. Applies only to #{HPXML::WaterHeaterTypeHeatPump}. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("The water heater operating mode. The '#{HPXML::WaterHeaterOperatingModeHeatPumpOnly}' option only uses the heat pump, while '#{HPXML::WaterHeaterOperatingModeHybridAuto}' allows the backup electric resistance to come on in high demand situations. This is ignored if a scheduled operating mode type is selected. Applies only to #{HPXML::WaterHeaterTypeHeatPump}. If not provided, the OS-HPXML default (see Heat Pump) is used.")
args << arg
hot_water_distribution_system_type_choices = OpenStudio::StringVector.new
@@ -1922,7 +1953,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_standard_piping_length', false)
arg.setDisplayName('Hot Water Distribution: Standard Piping Length')
arg.setUnits('ft')
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeStandard}, the length of the piping. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeStandard}, the length of the piping. If not provided, the OS-HPXML default (see Standard) is used.")
args << arg
recirculation_control_type_choices = OpenStudio::StringVector.new
@@ -1941,25 +1972,25 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_recirc_piping_length', false)
arg.setDisplayName('Hot Water Distribution: Recirculation Piping Length')
arg.setUnits('ft')
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the length of the recirculation piping. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the length of the recirculation piping. If not provided, the OS-HPXML default (see Recirculation) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_recirc_branch_piping_length', false)
arg.setDisplayName('Hot Water Distribution: Recirculation Branch Piping Length')
arg.setUnits('ft')
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the length of the recirculation branch piping. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the length of the recirculation branch piping. If not provided, the OS-HPXML default (see Recirculation) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_recirc_pump_power', false)
arg.setDisplayName('Hot Water Distribution: Recirculation Pump Power')
arg.setUnits('W')
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the recirculation pump power. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the recirculation pump power. If not provided, the OS-HPXML default (see Recirculation) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_pipe_r', false)
arg.setDisplayName('Hot Water Distribution: Pipe Insulation Nominal R-Value')
arg.setUnits('h-ft^2-R/Btu')
- arg.setDescription('Nominal R-value of the pipe insulation. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Nominal R-value of the pipe insulation. If not provided, the OS-HPXML default (see HPXML Hot Water Distribution) is used.")
args << arg
dwhr_facilities_connected_choices = OpenStudio::StringVector.new
@@ -2000,7 +2031,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_fixtures_usage_multiplier', false)
arg.setDisplayName('Hot Water Fixtures: Usage Multiplier')
- arg.setDescription('Multiplier on the hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Water Fixtures) is used.")
args << arg
solar_thermal_system_type_choices = OpenStudio::StringVector.new
@@ -2074,7 +2105,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('solar_thermal_storage_volume', false)
arg.setDisplayName('Solar Thermal: Storage Volume')
arg.setUnits('gal')
- arg.setDescription('The storage volume of the solar thermal system. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The storage volume of the solar thermal system. If not provided, the OS-HPXML default (see Detailed Inputs) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('solar_thermal_solar_fraction', true)
@@ -2107,17 +2138,17 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_module_type', pv_system_module_type_choices, false)
arg.setDisplayName('PV System: Module Type')
- arg.setDescription('Module type of the PV system. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Module type of the PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_location', pv_system_location_choices, false)
arg.setDisplayName('PV System: Location')
- arg.setDescription('Location of the PV system. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Location of the PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_tracking', pv_system_tracking_choices, false)
arg.setDisplayName('PV System: Tracking')
- arg.setDescription('Type of tracking for the PV system. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Type of tracking for the PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_array_azimuth', true)
@@ -2144,13 +2175,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_inverter_efficiency', false)
arg.setDisplayName('PV System: Inverter Efficiency')
arg.setUnits('Frac')
- arg.setDescription('Inverter efficiency of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Inverter efficiency of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_system_losses_fraction', false)
arg.setDisplayName('PV System: System Losses Fraction')
arg.setUnits('Frac')
- arg.setDescription('System losses fraction of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("System losses fraction of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('pv_system_num_bedrooms_served', false)
@@ -2167,17 +2198,17 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_module_type', pv_system_module_type_choices, false)
arg.setDisplayName('PV System 2: Module Type')
- arg.setDescription('Module type of the second PV system. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Module type of the second PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_location', pv_system_location_choices, false)
arg.setDisplayName('PV System 2: Location')
- arg.setDescription('Location of the second PV system. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Location of the second PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_tracking', pv_system_tracking_choices, false)
arg.setDisplayName('PV System 2: Tracking')
- arg.setDescription('Type of tracking for the second PV system. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Type of tracking for the second PV system. If not provided, the OS-HPXML default (see HPXML Photovoltaics) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_2_array_azimuth', true)
@@ -2202,12 +2233,14 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
args << arg
battery_location_choices = OpenStudio::StringVector.new
- battery_location_choices << HPXML::LocationLivingSpace
+ battery_location_choices << HPXML::LocationConditionedSpace
battery_location_choices << HPXML::LocationBasementConditioned
battery_location_choices << HPXML::LocationBasementUnconditioned
+ battery_location_choices << HPXML::LocationCrawlspace
battery_location_choices << HPXML::LocationCrawlspaceVented
battery_location_choices << HPXML::LocationCrawlspaceUnvented
battery_location_choices << HPXML::LocationCrawlspaceConditioned
+ battery_location_choices << HPXML::LocationAttic
battery_location_choices << HPXML::LocationAtticVented
battery_location_choices << HPXML::LocationAtticUnvented
battery_location_choices << HPXML::LocationGarage
@@ -2221,30 +2254,30 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('battery_location', battery_location_choices, false)
arg.setDisplayName('Battery: Location')
- arg.setDescription('The space type for the lithium ion battery location. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The space type for the lithium ion battery location. If not provided, the OS-HPXML default (see HPXML Batteries) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_power', false)
arg.setDisplayName('Battery: Rated Power Output')
- arg.setDescription('The rated power output of the lithium ion battery. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The rated power output of the lithium ion battery. If not provided, the OS-HPXML default (see HPXML Batteries) is used.")
arg.setUnits('W')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_capacity', false)
arg.setDisplayName('Battery: Nominal Capacity')
- arg.setDescription('The nominal capacity of the lithium ion battery. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The nominal capacity of the lithium ion battery. If not provided, the OS-HPXML default (see HPXML Batteries) is used.")
arg.setUnits('kWh')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_usable_capacity', false)
arg.setDisplayName('Battery: Usable Capacity')
- arg.setDescription('The usable capacity of the lithium ion battery. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The usable capacity of the lithium ion battery. If not provided, the OS-HPXML default (see HPXML Batteries) is used.")
arg.setUnits('kWh')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_round_trip_efficiency', false)
arg.setDisplayName('Battery: Round Trip Efficiency')
- arg.setDescription('The round trip efficiency of the lithium ion battery. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The round trip efficiency of the lithium ion battery. If not provided, the OS-HPXML default (see HPXML Batteries) is used.")
arg.setUnits('Frac')
args << arg
@@ -2274,7 +2307,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_interior_usage_multiplier', false)
arg.setDisplayName('Lighting: Interior Usage Multiplier')
- arg.setDescription('Multiplier on the lighting energy usage (interior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the lighting energy usage (interior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Lighting) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_exterior_fraction_cfl', true)
@@ -2297,7 +2330,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_exterior_usage_multiplier', false)
arg.setDisplayName('Lighting: Exterior Usage Multiplier')
- arg.setDescription('Multiplier on the lighting energy usage (exterior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the lighting energy usage (exterior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Lighting) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_garage_fraction_cfl', true)
@@ -2320,7 +2353,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_garage_usage_multiplier', false)
arg.setDisplayName('Lighting: Garage Usage Multiplier')
- arg.setDescription('Multiplier on the lighting energy usage (garage) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the lighting energy usage (garage) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Lighting) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('holiday_lighting_present', true)
@@ -2332,12 +2365,12 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('holiday_lighting_daily_kwh', false)
arg.setDisplayName('Holiday Lighting: Daily Consumption')
arg.setUnits('kWh/day')
- arg.setDescription('The daily energy consumption for holiday lighting (exterior). If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The daily energy consumption for holiday lighting (exterior). If not provided, the OS-HPXML default (see HPXML Lighting) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeStringArgument('holiday_lighting_period', false)
arg.setDisplayName('Holiday Lighting: Period')
- arg.setDescription('Enter a date like "Nov 25 - Jan 5". If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Enter a date like 'Nov 25 - Jan 5'. If not provided, the OS-HPXML default (see HPXML Lighting) is used.")
args << arg
dehumidifier_type_choices = OpenStudio::StringVector.new
@@ -2390,7 +2423,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
args << arg
appliance_location_choices = OpenStudio::StringVector.new
- appliance_location_choices << HPXML::LocationLivingSpace
+ appliance_location_choices << HPXML::LocationConditionedSpace
appliance_location_choices << HPXML::LocationBasementConditioned
appliance_location_choices << HPXML::LocationBasementUnconditioned
appliance_location_choices << HPXML::LocationGarage
@@ -2411,7 +2444,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_washer_location', appliance_location_choices, false)
arg.setDisplayName('Clothes Washer: Location')
- arg.setDescription('The space type for the clothes washer location. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The space type for the clothes washer location. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_washer_efficiency_type', clothes_washer_efficiency_type_choices, true)
@@ -2423,48 +2456,48 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_efficiency', false)
arg.setDisplayName('Clothes Washer: Efficiency')
arg.setUnits('ft^3/kWh-cyc')
- arg.setDescription('The efficiency of the clothes washer. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The efficiency of the clothes washer. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_rated_annual_kwh', false)
arg.setDisplayName('Clothes Washer: Rated Annual Consumption')
arg.setUnits('kWh/yr')
- arg.setDescription('The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_electric_rate', false)
arg.setDisplayName('Clothes Washer: Label Electric Rate')
arg.setUnits('$/kWh')
- arg.setDescription('The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_gas_rate', false)
arg.setDisplayName('Clothes Washer: Label Gas Rate')
arg.setUnits('$/therm')
- arg.setDescription('The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_annual_gas_cost', false)
arg.setDisplayName('Clothes Washer: Label Annual Cost with Gas DHW')
arg.setUnits('$')
- arg.setDescription('The annual cost of using the system under test conditions. Input is obtained from the EnergyGuide label. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual cost of using the system under test conditions. Input is obtained from the EnergyGuide label. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_usage', false)
arg.setDisplayName('Clothes Washer: Label Usage')
arg.setUnits('cyc/wk')
- arg.setDescription('The clothes washer loads per week. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The clothes washer loads per week. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_capacity', false)
arg.setDisplayName('Clothes Washer: Drum Volume')
arg.setUnits('ft^3')
- arg.setDescription("Volume of the washer drum. Obtained from the EnergyStar website or the manufacturer's literature. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("Volume of the washer drum. Obtained from the EnergyStar website or the manufacturer's literature. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_usage_multiplier', false)
arg.setDisplayName('Clothes Washer: Usage Multiplier')
- arg.setDescription('Multiplier on the clothes washer energy and hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the clothes washer energy and hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Clothes Washer) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('clothes_dryer_present', true)
@@ -2475,7 +2508,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_dryer_location', appliance_location_choices, false)
arg.setDisplayName('Clothes Dryer: Location')
- arg.setDescription('The space type for the clothes dryer location. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The space type for the clothes dryer location. If not provided, the OS-HPXML default (see HPXML Clothes Dryer) is used.")
args << arg
clothes_dryer_fuel_choices = OpenStudio::StringVector.new
@@ -2505,18 +2538,18 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_dryer_efficiency', false)
arg.setDisplayName('Clothes Dryer: Efficiency')
arg.setUnits('lb/kWh')
- arg.setDescription('The efficiency of the clothes dryer. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The efficiency of the clothes dryer. If not provided, the OS-HPXML default (see HPXML Clothes Dryer) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_dryer_vented_flow_rate', false)
arg.setDisplayName('Clothes Dryer: Vented Flow Rate')
- arg.setDescription('The exhaust flow rate of the vented clothes dryer. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The exhaust flow rate of the vented clothes dryer. If not provided, the OS-HPXML default (see HPXML Clothes Dryer) is used.")
arg.setUnits('CFM')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_dryer_usage_multiplier', false)
arg.setDisplayName('Clothes Dryer: Usage Multiplier')
- arg.setDescription('Multiplier on the clothes dryer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the clothes dryer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Clothes Dryer) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('dishwasher_present', true)
@@ -2527,7 +2560,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('dishwasher_location', appliance_location_choices, false)
arg.setDisplayName('Dishwasher: Location')
- arg.setDescription('The space type for the dishwasher location. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The space type for the dishwasher location. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.")
args << arg
dishwasher_efficiency_type_choices = OpenStudio::StringVector.new
@@ -2543,42 +2576,42 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_efficiency', false)
arg.setDisplayName('Dishwasher: Efficiency')
arg.setUnits('RatedAnnualkWh or EnergyFactor')
- arg.setDescription('The efficiency of the dishwasher. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The efficiency of the dishwasher. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_electric_rate', false)
arg.setDisplayName('Dishwasher: Label Electric Rate')
arg.setUnits('$/kWh')
- arg.setDescription('The label electric rate of the dishwasher. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The label electric rate of the dishwasher. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_gas_rate', false)
arg.setDisplayName('Dishwasher: Label Gas Rate')
arg.setUnits('$/therm')
- arg.setDescription('The label gas rate of the dishwasher. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The label gas rate of the dishwasher. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_annual_gas_cost', false)
arg.setDisplayName('Dishwasher: Label Annual Gas Cost')
arg.setUnits('$')
- arg.setDescription('The label annual gas cost of the dishwasher. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The label annual gas cost of the dishwasher. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_usage', false)
arg.setDisplayName('Dishwasher: Label Usage')
arg.setUnits('cyc/wk')
- arg.setDescription('The dishwasher loads per week. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The dishwasher loads per week. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('dishwasher_place_setting_capacity', false)
arg.setDisplayName('Dishwasher: Number of Place Settings')
arg.setUnits('#')
- arg.setDescription("The number of place settings for the unit. Data obtained from manufacturer's literature. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("The number of place settings for the unit. Data obtained from manufacturer's literature. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_usage_multiplier', false)
arg.setDisplayName('Dishwasher: Usage Multiplier')
- arg.setDescription('Multiplier on the dishwasher energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the dishwasher energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Dishwasher) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('refrigerator_present', true)
@@ -2589,18 +2622,18 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('refrigerator_location', appliance_location_choices, false)
arg.setDisplayName('Refrigerator: Location')
- arg.setDescription('The space type for the refrigerator location. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The space type for the refrigerator location. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('refrigerator_rated_annual_kwh', false)
arg.setDisplayName('Refrigerator: Rated Annual Consumption')
arg.setUnits('kWh/yr')
- arg.setDescription('The EnergyGuide rated annual energy consumption for a refrigerator. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The EnergyGuide rated annual energy consumption for a refrigerator. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('refrigerator_usage_multiplier', false)
arg.setDisplayName('Refrigerator: Usage Multiplier')
- arg.setDescription('Multiplier on the refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('extra_refrigerator_present', true)
@@ -2611,18 +2644,18 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('extra_refrigerator_location', appliance_location_choices, false)
arg.setDisplayName('Extra Refrigerator: Location')
- arg.setDescription('The space type for the extra refrigerator location. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The space type for the extra refrigerator location. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('extra_refrigerator_rated_annual_kwh', false)
arg.setDisplayName('Extra Refrigerator: Rated Annual Consumption')
arg.setUnits('kWh/yr')
- arg.setDescription('The EnergyGuide rated annual energy consumption for an extra rrefrigerator. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The EnergyGuide rated annual energy consumption for an extra rrefrigerator. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('extra_refrigerator_usage_multiplier', false)
arg.setDisplayName('Extra Refrigerator: Usage Multiplier')
- arg.setDescription('Multiplier on the extra refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the extra refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Refrigerators) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('freezer_present', true)
@@ -2633,18 +2666,18 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('freezer_location', appliance_location_choices, false)
arg.setDisplayName('Freezer: Location')
- arg.setDescription('The space type for the freezer location. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The space type for the freezer location. If not provided, the OS-HPXML default (see HPXML Freezers) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('freezer_rated_annual_kwh', false)
arg.setDisplayName('Freezer: Rated Annual Consumption')
arg.setUnits('kWh/yr')
- arg.setDescription('The EnergyGuide rated annual energy consumption for a freezer. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The EnergyGuide rated annual energy consumption for a freezer. If not provided, the OS-HPXML default (see HPXML Freezers) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('freezer_usage_multiplier', false)
arg.setDisplayName('Freezer: Usage Multiplier')
- arg.setDescription('Multiplier on the freezer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the freezer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Freezers) is used.")
args << arg
cooking_range_oven_fuel_choices = OpenStudio::StringVector.new
@@ -2663,7 +2696,7 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooking_range_oven_location', appliance_location_choices, false)
arg.setDisplayName('Cooking Range/Oven: Location')
- arg.setDescription('The space type for the cooking range/oven location. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The space type for the cooking range/oven location. If not provided, the OS-HPXML default (see HPXML Cooking Range/Oven) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooking_range_oven_fuel_type', cooking_range_oven_fuel_choices, true)
@@ -2674,17 +2707,17 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('cooking_range_oven_is_induction', false)
arg.setDisplayName('Cooking Range/Oven: Is Induction')
- arg.setDescription('Whether the cooking range is induction. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Whether the cooking range is induction. If not provided, the OS-HPXML default (see HPXML Cooking Range/Oven) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('cooking_range_oven_is_convection', false)
arg.setDisplayName('Cooking Range/Oven: Is Convection')
- arg.setDescription('Whether the oven is convection. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Whether the oven is convection. If not provided, the OS-HPXML default (see HPXML Cooking Range/Oven) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooking_range_oven_usage_multiplier', false)
arg.setDisplayName('Cooking Range/Oven: Usage Multiplier')
- arg.setDescription('Multiplier on the cooking range/oven energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the cooking range/oven energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Cooking Range/Oven) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('ceiling_fan_present', true)
@@ -2696,19 +2729,19 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_fan_efficiency', false)
arg.setDisplayName('Ceiling Fan: Efficiency')
arg.setUnits('CFM/W')
- arg.setDescription('The efficiency rating of the ceiling fan(s) at medium speed. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The efficiency rating of the ceiling fan(s) at medium speed. If not provided, the OS-HPXML default (see HPXML Ceiling Fans) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('ceiling_fan_quantity', false)
arg.setDisplayName('Ceiling Fan: Quantity')
arg.setUnits('#')
- arg.setDescription('Total number of ceiling fans. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Total number of ceiling fans. If not provided, the OS-HPXML default (see HPXML Ceiling Fans) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_fan_cooling_setpoint_temp_offset', false)
arg.setDisplayName('Ceiling Fan: Cooling Setpoint Temperature Offset')
arg.setUnits('deg-F')
- arg.setDescription('The cooling setpoint temperature offset during months when the ceiling fans are operating. Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The cooling setpoint temperature offset during months when the ceiling fans are operating. Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default (see HPXML Ceiling Fans) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_plug_loads_television_present', true)
@@ -2719,36 +2752,36 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_television_annual_kwh', false)
arg.setDisplayName('Misc Plug Loads: Television Annual kWh')
- arg.setDescription('The annual energy consumption of the television plug loads. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual energy consumption of the television plug loads. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.")
arg.setUnits('kWh/yr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_television_usage_multiplier', false)
arg.setDisplayName('Misc Plug Loads: Television Usage Multiplier')
- arg.setDescription('Multiplier on the television energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the television energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_annual_kwh', false)
arg.setDisplayName('Misc Plug Loads: Other Annual kWh')
- arg.setDescription('The annual energy consumption of the other residual plug loads. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual energy consumption of the other residual plug loads. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.")
arg.setUnits('kWh/yr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_frac_sensible', false)
arg.setDisplayName('Misc Plug Loads: Other Sensible Fraction')
- arg.setDescription("Fraction of other residual plug loads' internal gains that are sensible. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("Fraction of other residual plug loads' internal gains that are sensible. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.")
arg.setUnits('Frac')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_frac_latent', false)
arg.setDisplayName('Misc Plug Loads: Other Latent Fraction')
- arg.setDescription("Fraction of other residual plug loads' internal gains that are latent. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("Fraction of other residual plug loads' internal gains that are latent. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.")
arg.setUnits('Frac')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_usage_multiplier', false)
arg.setDisplayName('Misc Plug Loads: Other Usage Multiplier')
- arg.setDescription('Multiplier on the other energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the other energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_plug_loads_well_pump_present', true)
@@ -2759,13 +2792,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_well_pump_annual_kwh', false)
arg.setDisplayName('Misc Plug Loads: Well Pump Annual kWh')
- arg.setDescription('The annual energy consumption of the well pump plug loads. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual energy consumption of the well pump plug loads. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.")
arg.setUnits('kWh/yr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_well_pump_usage_multiplier', false)
arg.setDisplayName('Misc Plug Loads: Well Pump Usage Multiplier')
- arg.setDescription('Multiplier on the well pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the well pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_plug_loads_vehicle_present', true)
@@ -2776,13 +2809,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_vehicle_annual_kwh', false)
arg.setDisplayName('Misc Plug Loads: Vehicle Annual kWh')
- arg.setDescription('The annual energy consumption of the electric vehicle plug loads. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual energy consumption of the electric vehicle plug loads. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.")
arg.setUnits('kWh/yr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_vehicle_usage_multiplier', false)
arg.setDisplayName('Misc Plug Loads: Vehicle Usage Multiplier')
- arg.setDescription('Multiplier on the electric vehicle energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the electric vehicle energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Plug Loads) is used.")
args << arg
misc_fuel_loads_fuel_choices = OpenStudio::StringVector.new
@@ -2806,13 +2839,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_grill_annual_therm', false)
arg.setDisplayName('Misc Fuel Loads: Grill Annual therm')
- arg.setDescription('The annual energy consumption of the fuel loads grill. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual energy consumption of the fuel loads grill. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.")
arg.setUnits('therm/yr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_grill_usage_multiplier', false)
arg.setDisplayName('Misc Fuel Loads: Grill Usage Multiplier')
- arg.setDescription('Multiplier on the fuel loads grill energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the fuel loads grill energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_fuel_loads_lighting_present', true)
@@ -2829,13 +2862,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_lighting_annual_therm', false)
arg.setDisplayName('Misc Fuel Loads: Lighting Annual therm')
- arg.setDescription('The annual energy consumption of the fuel loads lighting. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual energy consumption of the fuel loads lighting. If not provided, the OS-HPXML default (see HPXML Fuel Loads)is used.")
arg.setUnits('therm/yr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_lighting_usage_multiplier', false)
arg.setDisplayName('Misc Fuel Loads: Lighting Usage Multiplier')
- arg.setDescription('Multiplier on the fuel loads lighting energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the fuel loads lighting energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_fuel_loads_fireplace_present', true)
@@ -2852,25 +2885,25 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_annual_therm', false)
arg.setDisplayName('Misc Fuel Loads: Fireplace Annual therm')
- arg.setDescription('The annual energy consumption of the fuel loads fireplace. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual energy consumption of the fuel loads fireplace. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.")
arg.setUnits('therm/yr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_frac_sensible', false)
arg.setDisplayName('Misc Fuel Loads: Fireplace Sensible Fraction')
- arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are sensible. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are sensible. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.")
arg.setUnits('Frac')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_frac_latent', false)
arg.setDisplayName('Misc Fuel Loads: Fireplace Latent Fraction')
- arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are latent. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are latent. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.")
arg.setUnits('Frac')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_usage_multiplier', false)
arg.setDisplayName('Misc Fuel Loads: Fireplace Usage Multiplier')
- arg.setDescription('Multiplier on the fuel loads fireplace energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the fuel loads fireplace energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see HPXML Fuel Loads) is used.")
args << arg
heater_type_choices = OpenStudio::StringVector.new
@@ -2887,13 +2920,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_pump_annual_kwh', false)
arg.setDisplayName('Pool: Pump Annual kWh')
- arg.setDescription('The annual energy consumption of the pool pump. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("The annual energy consumption of the pool pump. If not provided, the OS-HPXML default (see Pool Pump) is used.")
arg.setUnits('kWh/yr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_pump_usage_multiplier', false)
arg.setDisplayName('Pool: Pump Usage Multiplier')
- arg.setDescription('Multiplier on the pool pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the pool pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see Pool Pump) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pool_heater_type', heater_type_choices, true)
@@ -2904,59 +2937,59 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_heater_annual_kwh', false)
arg.setDisplayName('Pool: Heater Annual kWh')
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} pool heater. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} pool heater. If not provided, the OS-HPXML default (see Pool Heater) is used.")
arg.setUnits('kWh/yr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_heater_annual_therm', false)
arg.setDisplayName('Pool: Heater Annual therm')
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} pool heater. If not provided, the OS-HPXML default is used.")
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} pool heater. If not provided, the OS-HPXML default (see Pool Heater) is used.")
arg.setUnits('therm/yr')
args << arg
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_heater_usage_multiplier', false)
arg.setDisplayName('Pool: Heater Usage Multiplier')
- arg.setDescription('Multiplier on the pool heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg.setDescription("Multiplier on the pool heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see Pool Heater) is used.")
args << arg
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('hot_tub_present', true)
- arg.setDisplayName('Hot Tub: Present')
- arg.setDescription('Whether there is a hot tub.')
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('permanent_spa_present', true)
+ arg.setDisplayName('Permanent Spa: Present')
+ arg.setDescription('Whether there is a permanent spa.')
arg.setDefaultValue(false)
args << arg
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_pump_annual_kwh', false)
- arg.setDisplayName('Hot Tub: Pump Annual kWh')
- arg.setDescription('The annual energy consumption of the hot tub pump. If not provided, the OS-HPXML default is used.')
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_pump_annual_kwh', false)
+ arg.setDisplayName('Permanent Spa: Pump Annual kWh')
+ arg.setDescription("The annual energy consumption of the permanent spa pump. If not provided, the OS-HPXML default (see Permanent Spa Pump) is used.")
arg.setUnits('kWh/yr')
args << arg
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_pump_usage_multiplier', false)
- arg.setDisplayName('Hot Tub: Pump Usage Multiplier')
- arg.setDescription('Multiplier on the hot tub pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_pump_usage_multiplier', false)
+ arg.setDisplayName('Permanent Spa: Pump Usage Multiplier')
+ arg.setDescription("Multiplier on the permanent spa pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see Permanent Spa Pump) is used.")
args << arg
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('hot_tub_heater_type', heater_type_choices, true)
- arg.setDisplayName('Hot Tub: Heater Type')
- arg.setDescription("The type of hot tub heater. Use '#{HPXML::TypeNone}' if there is no hot tub heater.")
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('permanent_spa_heater_type', heater_type_choices, true)
+ arg.setDisplayName('Permanent Spa: Heater Type')
+ arg.setDescription("The type of permanent spa heater. Use '#{HPXML::TypeNone}' if there is no permanent spa heater.")
arg.setDefaultValue(HPXML::TypeNone)
args << arg
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_annual_kwh', false)
- arg.setDisplayName('Hot Tub: Heater Annual kWh')
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} hot tub heater. If not provided, the OS-HPXML default is used.")
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_heater_annual_kwh', false)
+ arg.setDisplayName('Permanent Spa: Heater Annual kWh')
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} permanent spa heater. If not provided, the OS-HPXML default (see Permanent Spa Heater) is used.")
arg.setUnits('kWh/yr')
args << arg
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_annual_therm', false)
- arg.setDisplayName('Hot Tub: Heater Annual therm')
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} hot tub heater. If not provided, the OS-HPXML default is used.")
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_heater_annual_therm', false)
+ arg.setDisplayName('Permanent Spa: Heater Annual therm')
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} permanent spa heater. If not provided, the OS-HPXML default (see Permanent Spa Heater) is used.")
arg.setUnits('therm/yr')
args << arg
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_usage_multiplier', false)
- arg.setDisplayName('Hot Tub: Heater Usage Multiplier')
- arg.setDescription('Multiplier on the hot tub heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_heater_usage_multiplier', false)
+ arg.setDisplayName('Permanent Spa: Heater Usage Multiplier')
+ arg.setDescription("Multiplier on the permanent spa heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see Permanent Spa Heater) is used.")
args << arg
arg = OpenStudio::Measure::OSArgument.makeStringArgument('emissions_scenario_names', false)
@@ -3111,7 +3144,6 @@ def run(model, runner, user_arguments)
args[:apply_validation] = args[:apply_validation].is_initialized ? args[:apply_validation].get : false
args[:apply_defaults] = args[:apply_defaults].is_initialized ? args[:apply_defaults].get : false
- args[:apply_validation] = true if args[:apply_defaults]
args[:geometry_unit_left_wall_is_adiabatic] = (args[:geometry_unit_left_wall_is_adiabatic].is_initialized && args[:geometry_unit_left_wall_is_adiabatic].get)
args[:geometry_unit_right_wall_is_adiabatic] = (args[:geometry_unit_right_wall_is_adiabatic].is_initialized && args[:geometry_unit_right_wall_is_adiabatic].get)
args[:geometry_unit_front_wall_is_adiabatic] = (args[:geometry_unit_front_wall_is_adiabatic].is_initialized && args[:geometry_unit_front_wall_is_adiabatic].get)
@@ -3149,16 +3181,20 @@ def run(model, runner, user_arguments)
hpxml_path = File.expand_path(hpxml_path)
end
- hpxml_doc = HPXMLFile.create(runner, model, args, epw_path, hpxml_path)
+ # Existing HPXML File
+ if args[:existing_hpxml_path].is_initialized
+ existing_hpxml_path = args[:existing_hpxml_path].get
+ unless (Pathname.new existing_hpxml_path).absolute?
+ existing_hpxml_path = File.expand_path(existing_hpxml_path)
+ end
+ end
+
+ hpxml_doc = HPXMLFile.create(runner, model, args, epw_path, hpxml_path, existing_hpxml_path)
if not hpxml_doc
runner.registerError('Unsuccessful creation of HPXML file.')
return false
end
- # Write HPXML file again if defaults applied
- if args[:apply_defaults]
- XMLHelper.write_file(hpxml_doc, hpxml_path)
- end
runner.registerInfo("Wrote file: #{hpxml_path}")
# Uncomment for debugging purposes
@@ -3177,6 +3213,10 @@ def validate_arguments(args)
def argument_warnings(args)
warnings = []
+ max_uninsulated_floor_rvalue = 6.0
+ max_uninsulated_ceiling_rvalue = 3.0
+ max_uninsulated_roof_rvalue = 3.0
+
warning = ([HPXML::WaterHeaterTypeHeatPump].include?(args[:water_heater_type]) && (args[:water_heater_fuel_type] != HPXML::FuelTypeElectricity))
warnings << 'Cannot model a heat pump water heater with non-electric fuel type.' if warning
@@ -3186,19 +3226,16 @@ def argument_warnings(args)
warning = (args[:geometry_foundation_type] == HPXML::FoundationTypeSlab) && (args[:geometry_foundation_height_above_grade] > 0)
warnings << 'Specified a slab foundation type with a non-zero height above grade.' if warning
- warning = (args[:heating_system_2_type] != 'none') && (args[:heating_system_2_fraction_heat_load_served] >= 0.5) && (args[:heating_system_2_fraction_heat_load_served] < 1.0)
- warnings << 'The fraction of heat load served by the second heating system is greater than or equal to 50%.' if warning
-
- warning = [HPXML::FoundationTypeCrawlspaceVented, HPXML::FoundationTypeCrawlspaceUnvented, HPXML::FoundationTypeBasementUnconditioned].include?(args[:geometry_foundation_type]) && ((args[:foundation_wall_insulation_r] > 0) || args[:foundation_wall_assembly_r].is_initialized) && (args[:floor_over_foundation_assembly_r] > 2.1)
+ warning = [HPXML::FoundationTypeCrawlspaceVented, HPXML::FoundationTypeCrawlspaceUnvented, HPXML::FoundationTypeBasementUnconditioned].include?(args[:geometry_foundation_type]) && ((args[:foundation_wall_insulation_r] > 0) || args[:foundation_wall_assembly_r].is_initialized) && (args[:floor_over_foundation_assembly_r] > max_uninsulated_floor_rvalue)
warnings << 'Home with unconditioned basement/crawlspace foundation type has both foundation wall insulation and floor insulation.' if warning
- warning = [HPXML::AtticTypeVented, HPXML::AtticTypeUnvented].include?(args[:geometry_attic_type]) && (args[:ceiling_assembly_r] > 2.1) && (args[:roof_assembly_r] > 2.3)
+ warning = [HPXML::AtticTypeVented, HPXML::AtticTypeUnvented].include?(args[:geometry_attic_type]) && (args[:ceiling_assembly_r] > max_uninsulated_ceiling_rvalue) && (args[:roof_assembly_r] > max_uninsulated_roof_rvalue)
warnings << 'Home with unconditioned attic type has both ceiling insulation and roof insulation.' if warning
- warning = (args[:geometry_foundation_type] == HPXML::FoundationTypeBasementConditioned) && (args[:floor_over_foundation_assembly_r] > 2.1)
+ warning = (args[:geometry_foundation_type] == HPXML::FoundationTypeBasementConditioned) && (args[:floor_over_foundation_assembly_r] > max_uninsulated_floor_rvalue)
warnings << 'Home with conditioned basement has floor insulation.' if warning
- warning = (args[:geometry_attic_type] == HPXML::AtticTypeConditioned) && (args[:ceiling_assembly_r] > 2.1)
+ warning = (args[:geometry_attic_type] == HPXML::AtticTypeConditioned) && (args[:ceiling_assembly_r] > max_uninsulated_ceiling_rvalue)
warnings << 'Home with conditioned attic has ceiling insulation.' if warning
return warnings
@@ -3219,12 +3256,6 @@ def argument_errors(args)
error = (args[:geometry_unit_type] == HPXML::ResidentialTypeApartment) && ([HPXML::FoundationTypeBasementConditioned, HPXML::FoundationTypeCrawlspaceConditioned].include? args[:geometry_foundation_type])
errors << 'Conditioned basement/crawlspace foundation type for apartment units is not currently supported.' if error
- error = (args[:ducts_supply_location].is_initialized != args[:ducts_supply_surface_area].is_initialized) || (args[:ducts_return_location].is_initialized != args[:ducts_return_surface_area].is_initialized)
- errors << 'Duct location and surface area not both defaulted or not both specified.' if error
-
- error = (args[:heating_system_2_type] != 'none') && (args[:heating_system_2_fraction_heat_load_served] == 1.0)
- errors << 'The fraction of heat load served by the second heating system is 100%.' if error
-
error = (args[:heating_system_type] == 'none') && (args[:heat_pump_type] == 'none') && (args[:heating_system_2_type] != 'none')
errors << 'A second heating system was specified without a primary heating system.' if error
@@ -3355,7 +3386,7 @@ def argument_errors(args)
end
class HPXMLFile
- def self.create(runner, model, args, epw_path, hpxml_path)
+ def self.create(runner, model, args, epw_path, hpxml_path, existing_hpxml_path)
epw_file = OpenStudio::EpwFile.new(epw_path)
if (args[:hvac_control_heating_season_period].to_s == HPXML::BuildingAmerica) || (args[:hvac_control_cooling_season_period].to_s == HPXML::BuildingAmerica) || (args[:apply_defaults])
weather = WeatherProcess.new(epw_path: epw_path, runner: nil)
@@ -3370,75 +3401,88 @@ def self.create(runner, model, args, epw_path, hpxml_path)
sorted_surfaces = model.getSurfaces.sort_by { |s| s.additionalProperties.getFeatureAsInteger('Index').get }
sorted_subsurfaces = model.getSubSurfaces.sort_by { |ss| ss.additionalProperties.getFeatureAsInteger('Index').get }
- hpxml = HPXML.new
-
- set_header(hpxml, args)
- set_site(hpxml, args)
- set_neighbor_buildings(hpxml, args)
- set_building_occupancy(hpxml, args)
- set_building_construction(hpxml, args)
- set_climate_and_risk_zones(hpxml, args)
- set_air_infiltration_measurements(hpxml, args)
- set_roofs(hpxml, args, sorted_surfaces)
- set_rim_joists(hpxml, model, args, sorted_surfaces)
- set_walls(hpxml, model, args, sorted_surfaces)
- set_foundation_walls(hpxml, model, args, sorted_surfaces)
- set_floors(hpxml, args, sorted_surfaces)
- set_slabs(hpxml, model, args, sorted_surfaces)
- set_windows(hpxml, model, args, sorted_subsurfaces)
- set_skylights(hpxml, args, sorted_subsurfaces)
- set_doors(hpxml, model, args, sorted_subsurfaces)
- set_attics(hpxml, args)
- set_foundations(hpxml, args)
- set_heating_systems(hpxml, args)
- set_cooling_systems(hpxml, args)
- set_heat_pumps(hpxml, args)
- set_secondary_heating_systems(hpxml, args)
- set_hvac_distribution(hpxml, args)
- set_hvac_control(hpxml, args, epw_file, weather)
- set_ventilation_fans(hpxml, args)
- set_water_heating_systems(hpxml, args)
- set_hot_water_distribution(hpxml, args)
- set_water_fixtures(hpxml, args)
- set_solar_thermal(hpxml, args, epw_file)
- set_pv_systems(hpxml, args, epw_file)
- set_battery(hpxml, args)
- set_lighting(hpxml, args)
- set_dehumidifier(hpxml, args)
- set_clothes_washer(hpxml, args)
- set_clothes_dryer(hpxml, args)
- set_dishwasher(hpxml, args)
- set_refrigerator(hpxml, args)
- set_extra_refrigerator(hpxml, args)
- set_freezer(hpxml, args)
- set_cooking_range_oven(hpxml, args)
- set_ceiling_fans(hpxml, args)
- set_misc_plug_loads_television(hpxml, args)
- set_misc_plug_loads_other(hpxml, args)
- set_misc_plug_loads_vehicle(hpxml, args)
- set_misc_plug_loads_well_pump(hpxml, args)
- set_misc_fuel_loads_grill(hpxml, args)
- set_misc_fuel_loads_lighting(hpxml, args)
- set_misc_fuel_loads_fireplace(hpxml, args)
- set_pool(hpxml, args)
- set_hot_tub(hpxml, args)
- collapse_surfaces(hpxml, args)
- renumber_hpxml_ids(hpxml)
-
- hpxml_doc = hpxml.to_oga()
+ hpxml = HPXML.new(hpxml_path: existing_hpxml_path, building_id: 'ALL')
+
+ if not set_header(runner, hpxml, args)
+ return false
+ end
+
+ hpxml_bldg = add_building(hpxml, args)
+ set_site(hpxml_bldg, args)
+ set_neighbor_buildings(hpxml_bldg, args)
+ set_building_occupancy(hpxml_bldg, args)
+ set_building_construction(hpxml_bldg, args)
+ set_building_header(hpxml_bldg, args)
+ set_climate_and_risk_zones(hpxml_bldg, args)
+ set_air_infiltration_measurements(hpxml_bldg, args)
+ set_roofs(hpxml_bldg, args, sorted_surfaces)
+ set_rim_joists(hpxml_bldg, model, args, sorted_surfaces)
+ set_walls(hpxml_bldg, model, args, sorted_surfaces)
+ set_foundation_walls(hpxml_bldg, model, args, sorted_surfaces)
+ set_floors(hpxml_bldg, args, sorted_surfaces)
+ set_slabs(hpxml_bldg, model, args, sorted_surfaces)
+ set_windows(hpxml_bldg, model, args, sorted_subsurfaces)
+ set_skylights(hpxml_bldg, args, sorted_subsurfaces)
+ set_doors(hpxml_bldg, model, args, sorted_subsurfaces)
+ set_attics(hpxml_bldg, args)
+ set_foundations(hpxml_bldg, args)
+ set_heating_systems(hpxml_bldg, args)
+ set_cooling_systems(hpxml_bldg, args)
+ set_heat_pumps(hpxml_bldg, args)
+ set_secondary_heating_systems(hpxml_bldg, args)
+ set_hvac_distribution(hpxml_bldg, args)
+ set_hvac_control(hpxml, hpxml_bldg, args, epw_file, weather)
+ set_ventilation_fans(hpxml_bldg, args)
+ set_water_heating_systems(hpxml_bldg, args)
+ set_hot_water_distribution(hpxml_bldg, args)
+ set_water_fixtures(hpxml_bldg, args)
+ set_solar_thermal(hpxml_bldg, args, epw_file)
+ set_pv_systems(hpxml_bldg, args, epw_file)
+ set_battery(hpxml_bldg, args)
+ set_lighting(hpxml_bldg, args)
+ set_dehumidifier(hpxml_bldg, args)
+ set_clothes_washer(hpxml_bldg, args)
+ set_clothes_dryer(hpxml_bldg, args)
+ set_dishwasher(hpxml_bldg, args)
+ set_refrigerator(hpxml_bldg, args)
+ set_extra_refrigerator(hpxml_bldg, args)
+ set_freezer(hpxml_bldg, args)
+ set_cooking_range_oven(hpxml_bldg, args)
+ set_ceiling_fans(hpxml_bldg, args)
+ set_misc_plug_loads_television(hpxml_bldg, args)
+ set_misc_plug_loads_other(hpxml_bldg, args)
+ set_misc_plug_loads_vehicle(hpxml_bldg, args)
+ set_misc_plug_loads_well_pump(hpxml_bldg, args)
+ set_misc_fuel_loads_grill(hpxml_bldg, args)
+ set_misc_fuel_loads_lighting(hpxml_bldg, args)
+ set_misc_fuel_loads_fireplace(hpxml_bldg, args)
+ set_pool(hpxml_bldg, args)
+ set_permanent_spa(hpxml_bldg, args)
+ collapse_surfaces(hpxml_bldg, args)
+ renumber_hpxml_ids(hpxml_bldg)
+
+ hpxml_doc = hpxml.to_doc()
+ hpxml.set_unique_hpxml_ids(hpxml_doc, true) if hpxml.buildings.size > 1
XMLHelper.write_file(hpxml_doc, hpxml_path)
- if args[:apply_validation]
- # Check for invalid HPXML file
+ if args[:apply_defaults]
+ # Always check for invalid HPXML file before applying defaults
if not validate_hpxml(runner, hpxml, hpxml_doc, hpxml_path)
return false
end
- end
- if args[:apply_defaults]
eri_version = Constants.ERIVersions[-1]
- HPXMLDefaults.apply(runner, hpxml, eri_version, weather, epw_file: epw_file)
- hpxml_doc = hpxml.to_oga()
+ HPXMLDefaults.apply(runner, hpxml, hpxml_bldg, eri_version, weather, epw_file: epw_file)
+ hpxml_doc = hpxml.to_doc()
+ hpxml.set_unique_hpxml_ids(hpxml_doc, true) if hpxml.buildings.size > 1
+ XMLHelper.write_file(hpxml_doc, hpxml_path)
+ end
+
+ if args[:apply_validation]
+ # Optionally check for invalid HPXML file (with or without defaults applied)
+ if not validate_hpxml(runner, hpxml, hpxml_doc, hpxml_path)
+ return false
+ end
end
return hpxml_doc
@@ -3446,7 +3490,10 @@ def self.create(runner, model, args, epw_path, hpxml_path)
def self.validate_hpxml(runner, hpxml, hpxml_doc, hpxml_path)
# Check for errors in the HPXML object
- errors = hpxml.check_for_errors()
+ errors = []
+ hpxml.buildings.each do |hpxml_bldg|
+ errors += hpxml_bldg.check_for_errors()
+ end
if errors.size > 0
fail "ERROR: Invalid HPXML object produced.\n#{errors}"
end
@@ -3499,7 +3546,7 @@ def self.create_geometry_envelope(runner, model, args)
args[:geometry_foundation_height] = 0.0
args[:geometry_foundation_height_above_grade] = 0.0
args[:geometry_rim_joist_height] = 0.0
- elsif args[:geometry_foundation_type] == HPXML::FoundationTypeAmbient
+ elsif (args[:geometry_foundation_type] == HPXML::FoundationTypeAmbient) || args[:geometry_foundation_type].start_with?(HPXML::FoundationTypeBellyAndWing)
args[:geometry_rim_joist_height] = 0.0
end
@@ -3514,6 +3561,8 @@ def self.create_geometry_envelope(runner, model, args)
success = Geometry.create_single_family_attached(model: model, **args)
elsif args[:geometry_unit_type] == HPXML::ResidentialTypeApartment
success = Geometry.create_apartment(model: model, **args)
+ elsif args[:geometry_unit_type] == HPXML::ResidentialTypeManufactured
+ success = Geometry.create_single_family_detached(runner: runner, model: model, **args)
end
return false if not success
@@ -3526,23 +3575,40 @@ def self.create_geometry_envelope(runner, model, args)
return true
end
- def self.set_header(hpxml, args)
+ def self.unavailable_period_exists(hpxml, column_name, begin_month, begin_day, begin_hour, end_month, end_day, end_hour, natvent_availability = nil)
+ natvent_availability = HPXML::ScheduleUnavailable if natvent_availability.nil?
+
+ hpxml.header.unavailable_periods.each do |unavailable_period|
+ begin_hour = 0 if begin_hour.nil?
+ end_hour = 24 if end_hour.nil?
+
+ next unless (unavailable_period.column_name == column_name) &&
+ (unavailable_period.begin_month == begin_month) &&
+ (unavailable_period.begin_day == begin_day) &&
+ (unavailable_period.begin_hour == begin_hour) &&
+ (unavailable_period.end_month == end_month) &&
+ (unavailable_period.end_day == end_day) &&
+ (unavailable_period.end_hour == end_hour) &&
+ (unavailable_period.natvent_availability == natvent_availability)
+
+ return true
+ end
+ return false
+ end
+
+ def self.set_header(runner, hpxml, args)
+ errors = []
+
hpxml.header.xml_type = 'HPXML'
hpxml.header.xml_generated_by = 'BuildResidentialHPXML'
hpxml.header.transaction = 'create'
- hpxml.header.building_id = 'MyBuilding'
- hpxml.header.event_type = 'proposed workscope'
-
- if args[:window_natvent_availability].is_initialized
- hpxml.header.natvent_days_per_week = args[:window_natvent_availability].get
- end
- if args[:schedules_filepaths].is_initialized
- hpxml.header.schedules_filepaths = args[:schedules_filepaths].get.split(',').map(&:strip)
- end
if args[:schedules_vacancy_period].is_initialized
begin_month, begin_day, begin_hour, end_month, end_day, end_hour = Schedule.parse_date_time_range(args[:schedules_vacancy_period].get)
- hpxml.header.unavailable_periods.add(column_name: 'Vacancy', begin_month: begin_month, begin_day: begin_day, begin_hour: begin_hour, end_month: end_month, end_day: end_day, end_hour: end_hour, natvent_availability: HPXML::ScheduleUnavailable)
+
+ if not unavailable_period_exists(hpxml, 'Vacancy', begin_month, begin_day, begin_hour, end_month, end_day, end_hour)
+ hpxml.header.unavailable_periods.add(column_name: 'Vacancy', begin_month: begin_month, begin_day: begin_day, begin_hour: begin_hour, end_month: end_month, end_day: end_day, end_hour: end_hour, natvent_availability: HPXML::ScheduleUnavailable)
+ end
end
if args[:schedules_power_outage_period].is_initialized
begin_month, begin_day, begin_hour, end_month, end_day, end_hour = Schedule.parse_date_time_range(args[:schedules_power_outage_period].get)
@@ -3551,22 +3617,39 @@ def self.set_header(hpxml, args)
natvent_availability = args[:schedules_power_outage_window_natvent_availability].get
end
- hpxml.header.unavailable_periods.add(column_name: 'Power Outage', begin_month: begin_month, begin_day: begin_day, begin_hour: begin_hour, end_month: end_month, end_day: end_day, end_hour: end_hour, natvent_availability: natvent_availability)
+ if not unavailable_period_exists(hpxml, 'Power Outage', begin_month, begin_day, begin_hour, end_month, end_day, end_hour, natvent_availability)
+ hpxml.header.unavailable_periods.add(column_name: 'Power Outage', begin_month: begin_month, begin_day: begin_day, begin_hour: begin_hour, end_month: end_month, end_day: end_day, end_hour: end_hour, natvent_availability: natvent_availability)
+ end
end
if args[:software_info_program_used].is_initialized
+ if !hpxml.header.software_program_used.nil? && (hpxml.header.software_program_used != args[:software_info_program_used].get)
+ errors << "'Software Info: Program Used' cannot vary across dwelling units."
+ end
hpxml.header.software_program_used = args[:software_info_program_used].get
end
if args[:software_info_program_version].is_initialized
+ if !hpxml.header.software_program_version.nil? && (hpxml.header.software_program_version != args[:software_info_program_version].get)
+ errors << "'Software Info: Program Version' cannot vary across dwelling units."
+ end
hpxml.header.software_program_version = args[:software_info_program_version].get
end
if args[:simulation_control_timestep].is_initialized
+ if !hpxml.header.timestep.nil? && (hpxml.header.timestep != args[:simulation_control_timestep].get)
+ errors << "'Simulation Control: Timestep' cannot vary across dwelling units."
+ end
hpxml.header.timestep = args[:simulation_control_timestep].get
end
if args[:simulation_control_run_period].is_initialized
begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:simulation_control_run_period].get)
+ if (!hpxml.header.sim_begin_month.nil? && (hpxml.header.sim_begin_month != begin_month)) ||
+ (!hpxml.header.sim_begin_day.nil? && (hpxml.header.sim_begin_day != begin_day)) ||
+ (!hpxml.header.sim_end_month.nil? && (hpxml.header.sim_end_month != end_month)) ||
+ (!hpxml.header.sim_end_day.nil? && (hpxml.header.sim_end_day != end_day))
+ errors << "'Simulation Control: Run Period' cannot vary across dwelling units."
+ end
hpxml.header.sim_begin_month = begin_month
hpxml.header.sim_begin_day = begin_day
hpxml.header.sim_end_month = end_month
@@ -3574,44 +3657,19 @@ def self.set_header(hpxml, args)
end
if args[:simulation_control_run_period_calendar_year].is_initialized
+ if !hpxml.header.sim_calendar_year.nil? && (hpxml.header.sim_calendar_year != Integer(args[:simulation_control_run_period_calendar_year].get))
+ errors << "'Simulation Control: Run Period Calendar Year' cannot vary across dwelling units."
+ end
hpxml.header.sim_calendar_year = args[:simulation_control_run_period_calendar_year].get
end
- if args[:simulation_control_daylight_saving_enabled].is_initialized
- hpxml.header.dst_enabled = args[:simulation_control_daylight_saving_enabled].get
- end
- if args[:simulation_control_daylight_saving_period].is_initialized
- begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:simulation_control_daylight_saving_period].get)
- hpxml.header.dst_begin_month = begin_month
- hpxml.header.dst_begin_day = begin_day
- hpxml.header.dst_end_month = end_month
- hpxml.header.dst_end_day = end_day
- end
-
if args[:simulation_control_temperature_capacitance_multiplier].is_initialized
+ if !hpxml.header.temperature_capacitance_multiplier.nil? && (hpxml.header.temperature_capacitance_multiplier != Float(args[:simulation_control_temperature_capacitance_multiplier].get))
+ errors << "'Simulation Control: Temperature Capacitance Multiplier' cannot vary across dwelling units."
+ end
hpxml.header.temperature_capacitance_multiplier = args[:simulation_control_temperature_capacitance_multiplier].get
end
- if args[:window_shading_summer_season].is_initialized
- begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:window_shading_summer_season].get)
- hpxml.header.shading_summer_begin_month = begin_month
- hpxml.header.shading_summer_begin_day = begin_day
- hpxml.header.shading_summer_end_month = end_month
- hpxml.header.shading_summer_end_day = end_day
- end
-
- if args[:site_zip_code].is_initialized
- hpxml.header.zip_code = args[:site_zip_code].get
- end
-
- if args[:site_state_code].is_initialized
- hpxml.header.state_code = args[:site_state_code].get
- end
-
- if args[:site_time_zone_utc_offset].is_initialized
- hpxml.header.time_zone_utc_offset = args[:site_time_zone_utc_offset].get
- end
-
if args[:emissions_scenario_names].is_initialized
emissions_scenario_names = args[:emissions_scenario_names].get.split(',').map(&:strip)
emissions_types = args[:emissions_types].get.split(',').map(&:strip)
@@ -3659,6 +3717,7 @@ def self.set_header(hpxml, args)
fuel_values[HPXML::FuelTypeWoodPellets])
emissions_scenarios.each do |emissions_scenario|
name, emissions_type, elec_units, elec_value_or_schedule_filepath, elec_num_headers, elec_column_num, fuel_units, natural_gas_value, propane_value, fuel_oil_value, coal_value, wood_value, wood_pellets_value = emissions_scenario
+
elec_value = Float(elec_value_or_schedule_filepath) rescue nil
if elec_value.nil?
elec_schedule_filepath = elec_value_or_schedule_filepath
@@ -3672,6 +3731,38 @@ def self.set_header(hpxml, args)
wood_value = Float(wood_value) rescue nil
wood_pellets_value = Float(wood_pellets_value) rescue nil
+ emissions_scenario_exists = false
+ hpxml.header.emissions_scenarios.each do |es|
+ if (es.name != name) || (es.emissions_type != emissions_type)
+ next
+ end
+
+ if (es.emissions_type != emissions_type) ||
+ (!elec_units.nil? && es.elec_units != elec_units) ||
+ (!elec_value.nil? && es.elec_value != elec_value) ||
+ (!elec_schedule_filepath.nil? && es.elec_schedule_filepath != elec_schedule_filepath) ||
+ (!elec_num_headers.nil? && es.elec_schedule_number_of_header_rows != elec_num_headers) ||
+ (!elec_column_num.nil? && es.elec_schedule_column_number != elec_column_num) ||
+ (!es.natural_gas_units.nil? && !fuel_units.nil? && es.natural_gas_units != fuel_units) ||
+ (!natural_gas_value.nil? && es.natural_gas_value != natural_gas_value) ||
+ (!es.propane_units.nil? && !fuel_units.nil? && es.propane_units != fuel_units) ||
+ (!propane_value.nil? && es.propane_value != propane_value) ||
+ (!es.fuel_oil_units.nil? && !fuel_units.nil? && es.fuel_oil_units != fuel_units) ||
+ (!fuel_oil_value.nil? && es.fuel_oil_value != fuel_oil_value) ||
+ (!es.coal_units.nil? && !fuel_units.nil? && es.coal_units != fuel_units) ||
+ (!coal_value.nil? && es.coal_value != coal_value) ||
+ (!es.wood_units.nil? && !fuel_units.nil? && es.wood_units != fuel_units) ||
+ (!wood_value.nil? && es.wood_value != wood_value) ||
+ (!es.wood_pellets_units.nil? && !fuel_units.nil? && es.wood_pellets_units != fuel_units) ||
+ (!wood_pellets_value.nil? && es.wood_pellets_value != wood_pellets_value)
+ errors << "HPXML header already includes an emissions scenario named '#{name}' with type '#{emissions_type}'."
+ else
+ emissions_scenario_exists = true
+ end
+ end
+
+ next if emissions_scenario_exists
+
hpxml.header.emissions_scenarios.add(name: name,
emissions_type: emissions_type,
elec_units: elec_units,
@@ -3785,6 +3876,7 @@ def self.set_header(hpxml, args)
bills_scenarios.each do |bills_scenario|
name, elec_tariff_filepath, elec_fixed_charge, natural_gas_fixed_charge, propane_fixed_charge, fuel_oil_fixed_charge, coal_fixed_charge, wood_fixed_charge, wood_pellets_fixed_charge, elec_marginal_rate, natural_gas_marginal_rate, propane_marginal_rate, fuel_oil_marginal_rate, coal_marginal_rate, wood_marginal_rate, wood_pellets_marginal_rate, pv_compensation_type, pv_net_metering_annual_excess_sellback_rate_type, pv_net_metering_annual_excess_sellback_rate, pv_feed_in_tariff_rate, pv_monthly_grid_connection_fee_unit, pv_monthly_grid_connection_fee = bills_scenario
+
elec_tariff_filepath = (elec_tariff_filepath.to_s.include?('.') ? elec_tariff_filepath : nil)
elec_fixed_charge = Float(elec_fixed_charge) rescue nil
natural_gas_fixed_charge = Float(natural_gas_fixed_charge) rescue nil
@@ -3820,6 +3912,39 @@ def self.set_header(hpxml, args)
pv_monthly_grid_connection_fee_dollars = Float(pv_monthly_grid_connection_fee) rescue nil
end
+ utility_bill_scenario_exists = false
+ hpxml.header.utility_bill_scenarios.each do |ubs|
+ next if ubs.name != name
+
+ if (!elec_tariff_filepath.nil? && ubs.elec_tariff_filepath != elec_tariff_filepath) ||
+ (!elec_fixed_charge.nil? && ubs.elec_fixed_charge != elec_fixed_charge) ||
+ (!natural_gas_fixed_charge.nil? && ubs.natural_gas_fixed_charge != natural_gas_fixed_charge) ||
+ (!propane_fixed_charge.nil? && ubs.propane_fixed_charge != propane_fixed_charge) ||
+ (!fuel_oil_fixed_charge.nil? && ubs.fuel_oil_fixed_charge != fuel_oil_fixed_charge) ||
+ (!coal_fixed_charge.nil? && ubs.coal_fixed_charge != coal_fixed_charge) ||
+ (!wood_fixed_charge.nil? && ubs.wood_fixed_charge != wood_fixed_charge) ||
+ (!wood_pellets_fixed_charge.nil? && ubs.wood_pellets_fixed_charge != wood_pellets_fixed_charge) ||
+ (!elec_marginal_rate.nil? && ubs.elec_marginal_rate != elec_marginal_rate) ||
+ (!natural_gas_marginal_rate.nil? && ubs.natural_gas_marginal_rate != natural_gas_marginal_rate) ||
+ (!propane_marginal_rate.nil? && ubs.propane_marginal_rate != propane_marginal_rate) ||
+ (!fuel_oil_marginal_rate.nil? && ubs.fuel_oil_marginal_rate != fuel_oil_marginal_rate) ||
+ (!coal_marginal_rate.nil? && ubs.coal_marginal_rate != coal_marginal_rate) ||
+ (!wood_marginal_rate.nil? && ubs.wood_marginal_rate != wood_marginal_rate) ||
+ (!wood_pellets_marginal_rate.nil? && ubs.wood_pellets_marginal_rate != wood_pellets_marginal_rate) ||
+ (!pv_compensation_type.nil? && ubs.pv_compensation_type != pv_compensation_type) ||
+ (!pv_net_metering_annual_excess_sellback_rate_type.nil? && ubs.pv_net_metering_annual_excess_sellback_rate_type != pv_net_metering_annual_excess_sellback_rate_type) ||
+ (!pv_net_metering_annual_excess_sellback_rate.nil? && ubs.pv_net_metering_annual_excess_sellback_rate != pv_net_metering_annual_excess_sellback_rate) ||
+ (!pv_feed_in_tariff_rate.nil? && ubs.pv_feed_in_tariff_rate != pv_feed_in_tariff_rate) ||
+ (!pv_monthly_grid_connection_fee_dollars_per_kw.nil? && ubs.pv_monthly_grid_connection_fee_dollars_per_kw != pv_monthly_grid_connection_fee_dollars_per_kw) ||
+ (!pv_monthly_grid_connection_fee_dollars.nil? && ubs.pv_monthly_grid_connection_fee_dollars != pv_monthly_grid_connection_fee_dollars)
+ errors << "HPXML header already includes a utility bill scenario named '#{name}'."
+ else
+ utility_bill_scenario_exists = true
+ end
+ end
+
+ next if utility_bill_scenario_exists
+
hpxml.header.utility_bill_scenarios.add(name: name,
elec_tariff_filepath: elec_tariff_filepath,
elec_fixed_charge: elec_fixed_charge,
@@ -3845,28 +3970,62 @@ def self.set_header(hpxml, args)
end
end
- if args[:additional_properties].is_initialized
- extension_properties = {}
- additional_properties = args[:additional_properties].get.split('|').map(&:strip)
- additional_properties.each do |additional_property|
- key, value = additional_property.split('=').map(&:strip)
- extension_properties[key] = value
- end
- hpxml.header.extension_properties = extension_properties
+ errors.each do |error|
+ runner.registerError(error)
+ end
+ return errors.empty?
+ end
+
+ def self.add_building(hpxml, args)
+ if args[:site_zip_code].is_initialized
+ zip_code = args[:site_zip_code].get
end
+
+ if args[:site_state_code].is_initialized
+ state_code = args[:site_state_code].get
+ end
+
+ if args[:site_time_zone_utc_offset].is_initialized
+ time_zone_utc_offset = args[:site_time_zone_utc_offset].get
+ end
+
+ if args[:simulation_control_daylight_saving_enabled].is_initialized
+ dst_enabled = args[:simulation_control_daylight_saving_enabled].get
+ end
+ if args[:simulation_control_daylight_saving_period].is_initialized
+ begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:simulation_control_daylight_saving_period].get)
+ dst_begin_month = begin_month
+ dst_begin_day = begin_day
+ dst_end_month = end_month
+ dst_end_day = end_day
+ end
+
+ hpxml.buildings.add(building_id: 'MyBuilding',
+ site_id: 'SiteID',
+ event_type: 'proposed workscope',
+ zip_code: zip_code,
+ state_code: state_code,
+ time_zone_utc_offset: time_zone_utc_offset,
+ dst_enabled: dst_enabled,
+ dst_begin_month: dst_begin_month,
+ dst_begin_day: dst_begin_day,
+ dst_end_month: dst_end_month,
+ dst_end_day: dst_end_day)
+
+ return hpxml.buildings[-1]
end
- def self.set_site(hpxml, args)
+ def self.set_site(hpxml_bldg, args)
if args[:site_shielding_of_home].is_initialized
- hpxml.site.shielding_of_home = args[:site_shielding_of_home].get
+ hpxml_bldg.site.shielding_of_home = args[:site_shielding_of_home].get
end
if args[:site_ground_conductivity].is_initialized
- hpxml.site.ground_conductivity = args[:site_ground_conductivity].get
+ hpxml_bldg.site.ground_conductivity = args[:site_ground_conductivity].get
end
if args[:site_type].is_initialized
- hpxml.site.site_type = args[:site_type].get
+ hpxml_bldg.site.site_type = args[:site_type].get
end
adb_walls = [args[:geometry_unit_left_wall_is_adiabatic], args[:geometry_unit_right_wall_is_adiabatic], args[:geometry_unit_front_wall_is_adiabatic], args[:geometry_unit_back_wall_is_adiabatic]]
@@ -3874,36 +4033,36 @@ def self.set_site(hpxml, args)
if [HPXML::ResidentialTypeSFA, HPXML::ResidentialTypeApartment].include? args[:geometry_unit_type]
if n_walls_attached == 3
- hpxml.site.surroundings = HPXML::SurroundingsThreeSides
+ hpxml_bldg.site.surroundings = HPXML::SurroundingsThreeSides
elsif n_walls_attached == 2
- hpxml.site.surroundings = HPXML::SurroundingsTwoSides
+ hpxml_bldg.site.surroundings = HPXML::SurroundingsTwoSides
elsif n_walls_attached == 1
- hpxml.site.surroundings = HPXML::SurroundingsOneSide
+ hpxml_bldg.site.surroundings = HPXML::SurroundingsOneSide
else
- hpxml.site.surroundings = HPXML::SurroundingsStandAlone
+ hpxml_bldg.site.surroundings = HPXML::SurroundingsStandAlone
end
if args[:geometry_attic_type] == HPXML::AtticTypeBelowApartment
if args[:geometry_foundation_type] == HPXML::FoundationTypeAboveApartment
- hpxml.site.vertical_surroundings = HPXML::VerticalSurroundingsAboveAndBelow
+ hpxml_bldg.site.vertical_surroundings = HPXML::VerticalSurroundingsAboveAndBelow
else
- hpxml.site.vertical_surroundings = HPXML::VerticalSurroundingsAbove
+ hpxml_bldg.site.vertical_surroundings = HPXML::VerticalSurroundingsAbove
end
else
if args[:geometry_foundation_type] == HPXML::FoundationTypeAboveApartment
- hpxml.site.vertical_surroundings = HPXML::VerticalSurroundingsBelow
+ hpxml_bldg.site.vertical_surroundings = HPXML::VerticalSurroundingsBelow
else
- hpxml.site.vertical_surroundings = HPXML::VerticalSurroundingsNoAboveOrBelow
+ hpxml_bldg.site.vertical_surroundings = HPXML::VerticalSurroundingsNoAboveOrBelow
end
end
- elsif [HPXML::ResidentialTypeSFD].include? args[:geometry_unit_type]
- hpxml.site.surroundings = HPXML::SurroundingsStandAlone
- hpxml.site.vertical_surroundings = HPXML::VerticalSurroundingsNoAboveOrBelow
+ elsif [HPXML::ResidentialTypeSFD, HPXML::ResidentialTypeManufactured].include? args[:geometry_unit_type]
+ hpxml_bldg.site.surroundings = HPXML::SurroundingsStandAlone
+ hpxml_bldg.site.vertical_surroundings = HPXML::VerticalSurroundingsNoAboveOrBelow
end
- hpxml.site.azimuth_of_front_of_home = args[:geometry_unit_orientation]
+ hpxml_bldg.site.azimuth_of_front_of_home = args[:geometry_unit_orientation]
end
- def self.set_neighbor_buildings(hpxml, args)
+ def self.set_neighbor_buildings(hpxml_bldg, args)
nbr_map = { Constants.FacadeFront => [args[:neighbor_front_distance], args[:neighbor_front_height]],
Constants.FacadeBack => [args[:neighbor_back_distance], args[:neighbor_back_height]],
Constants.FacadeLeft => [args[:neighbor_left_distance], args[:neighbor_left_height]],
@@ -3919,19 +4078,19 @@ def self.set_neighbor_buildings(hpxml, args)
height = neighbor_height.get
end
- hpxml.neighbor_buildings.add(azimuth: azimuth,
- distance: distance,
- height: height)
+ hpxml_bldg.neighbor_buildings.add(azimuth: azimuth,
+ distance: distance,
+ height: height)
end
end
- def self.set_building_occupancy(hpxml, args)
+ def self.set_building_occupancy(hpxml_bldg, args)
if args[:geometry_unit_num_occupants].is_initialized
- hpxml.building_occupancy.number_of_residents = args[:geometry_unit_num_occupants].get
+ hpxml_bldg.building_occupancy.number_of_residents = args[:geometry_unit_num_occupants].get
end
end
- def self.set_building_construction(hpxml, args)
+ def self.set_building_construction(hpxml_bldg, args)
if args[:geometry_unit_type] == HPXML::ResidentialTypeApartment
args[:geometry_unit_num_floors_above_grade] = 1
end
@@ -3947,34 +4106,70 @@ def self.set_building_construction(hpxml, args)
conditioned_building_volume = args[:geometry_unit_cfa] * args[:geometry_average_ceiling_height]
- hpxml.building_construction.number_of_conditioned_floors = number_of_conditioned_floors
- hpxml.building_construction.number_of_conditioned_floors_above_grade = number_of_conditioned_floors_above_grade
- hpxml.building_construction.number_of_bedrooms = args[:geometry_unit_num_bedrooms]
- hpxml.building_construction.number_of_bathrooms = number_of_bathrooms
- hpxml.building_construction.conditioned_floor_area = args[:geometry_unit_cfa]
- hpxml.building_construction.conditioned_building_volume = conditioned_building_volume
- hpxml.building_construction.average_ceiling_height = args[:geometry_average_ceiling_height]
- hpxml.building_construction.residential_facility_type = args[:geometry_unit_type]
+ hpxml_bldg.building_construction.number_of_conditioned_floors = number_of_conditioned_floors
+ hpxml_bldg.building_construction.number_of_conditioned_floors_above_grade = number_of_conditioned_floors_above_grade
+ hpxml_bldg.building_construction.number_of_bedrooms = args[:geometry_unit_num_bedrooms]
+ hpxml_bldg.building_construction.number_of_bathrooms = number_of_bathrooms
+ hpxml_bldg.building_construction.conditioned_floor_area = args[:geometry_unit_cfa]
+ hpxml_bldg.building_construction.conditioned_building_volume = conditioned_building_volume
+ hpxml_bldg.building_construction.average_ceiling_height = args[:geometry_average_ceiling_height]
+ hpxml_bldg.building_construction.residential_facility_type = args[:geometry_unit_type]
if args[:year_built].is_initialized
- hpxml.building_construction.year_built = args[:year_built].get
+ hpxml_bldg.building_construction.year_built = args[:year_built].get
+ end
+
+ if args[:unit_multiplier].is_initialized
+ hpxml_bldg.building_construction.number_of_units = args[:unit_multiplier].get
end
end
- def self.set_climate_and_risk_zones(hpxml, args)
- hpxml.climate_and_risk_zones.weather_station_id = 'WeatherStation'
+ def self.set_building_header(hpxml_bldg, args)
+ if args[:schedules_filepaths].is_initialized
+ hpxml_bldg.header.schedules_filepaths = args[:schedules_filepaths].get.split(',').map(&:strip)
+ end
+
+ if args[:heat_pump_sizing_methodology].is_initialized
+ hpxml_bldg.header.heat_pump_sizing_methodology = args[:heat_pump_sizing_methodology].get
+ end
+
+ if args[:window_natvent_availability].is_initialized
+ hpxml_bldg.header.natvent_days_per_week = args[:window_natvent_availability].get
+ end
+
+ if args[:window_shading_summer_season].is_initialized
+ begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:window_shading_summer_season].get)
+ hpxml_bldg.header.shading_summer_begin_month = begin_month
+ hpxml_bldg.header.shading_summer_begin_day = begin_day
+ hpxml_bldg.header.shading_summer_end_month = end_month
+ hpxml_bldg.header.shading_summer_end_day = end_day
+ end
+
+ if args[:additional_properties].is_initialized
+ extension_properties = {}
+ additional_properties = args[:additional_properties].get.split('|').map(&:strip)
+ additional_properties.each do |additional_property|
+ key, value = additional_property.split('=').map(&:strip)
+ extension_properties[key] = value
+ end
+ hpxml_bldg.header.extension_properties = extension_properties
+ end
+ end
+
+ def self.set_climate_and_risk_zones(hpxml_bldg, args)
+ hpxml_bldg.climate_and_risk_zones.weather_station_id = 'WeatherStation'
if args[:site_iecc_zone].is_initialized
- hpxml.climate_and_risk_zones.climate_zone_ieccs.add(zone: args[:site_iecc_zone].get,
- year: 2006)
+ hpxml_bldg.climate_and_risk_zones.climate_zone_ieccs.add(zone: args[:site_iecc_zone].get,
+ year: 2006)
end
weather_station_name = File.basename(args[:weather_station_epw_filepath]).gsub('.epw', '')
- hpxml.climate_and_risk_zones.weather_station_name = weather_station_name
- hpxml.climate_and_risk_zones.weather_station_epw_filepath = args[:weather_station_epw_filepath]
+ hpxml_bldg.climate_and_risk_zones.weather_station_name = weather_station_name
+ hpxml_bldg.climate_and_risk_zones.weather_station_epw_filepath = args[:weather_station_epw_filepath]
end
- def self.set_air_infiltration_measurements(hpxml, args)
+ def self.set_air_infiltration_measurements(hpxml_bldg, args)
if args[:air_leakage_units] == HPXML::UnitsELA
effective_leakage_area = args[:air_leakage_value]
else
@@ -3989,22 +4184,22 @@ def self.set_air_infiltration_measurements(hpxml, args)
air_leakage_type = args[:air_leakage_type]
end
end
- infiltration_volume = hpxml.building_construction.conditioned_building_volume
+ infiltration_volume = hpxml_bldg.building_construction.conditioned_building_volume
- hpxml.air_infiltration_measurements.add(id: "AirInfiltrationMeasurement#{hpxml.air_infiltration_measurements.size + 1}",
- house_pressure: house_pressure,
- unit_of_measure: unit_of_measure,
- air_leakage: air_leakage,
- effective_leakage_area: effective_leakage_area,
- infiltration_volume: infiltration_volume,
- infiltration_type: air_leakage_type)
+ hpxml_bldg.air_infiltration_measurements.add(id: "AirInfiltrationMeasurement#{hpxml_bldg.air_infiltration_measurements.size + 1}",
+ house_pressure: house_pressure,
+ unit_of_measure: unit_of_measure,
+ air_leakage: air_leakage,
+ effective_leakage_area: effective_leakage_area,
+ infiltration_volume: infiltration_volume,
+ infiltration_type: air_leakage_type)
if args[:air_leakage_has_flue_or_chimney_in_conditioned_space].is_initialized
- hpxml.air_infiltration.has_flue_or_chimney_in_conditioned_space = args[:air_leakage_has_flue_or_chimney_in_conditioned_space].get
+ hpxml_bldg.air_infiltration.has_flue_or_chimney_in_conditioned_space = args[:air_leakage_has_flue_or_chimney_in_conditioned_space].get
end
end
- def self.set_roofs(hpxml, args, sorted_surfaces)
+ def self.set_roofs(hpxml_bldg, args, sorted_surfaces)
args[:geometry_roof_pitch] *= 12.0
if (args[:geometry_attic_type] == HPXML::AtticTypeFlatRoof) || (args[:geometry_attic_type] == HPXML::AtticTypeBelowApartment)
args[:geometry_roof_pitch] = 0.0
@@ -4036,21 +4231,21 @@ def self.set_roofs(hpxml, args, sorted_surfaces)
azimuth = Geometry.get_surface_azimuth(surface: surface, orientation: args[:geometry_unit_orientation])
end
- hpxml.roofs.add(id: "Roof#{hpxml.roofs.size + 1}",
- interior_adjacent_to: Geometry.get_adjacent_to(surface: surface),
- azimuth: azimuth,
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
- roof_type: roof_type,
- roof_color: roof_color,
- pitch: args[:geometry_roof_pitch],
- radiant_barrier: radiant_barrier,
- radiant_barrier_grade: radiant_barrier_grade,
- insulation_assembly_r_value: args[:roof_assembly_r])
- @surface_ids[surface.name.to_s] = hpxml.roofs[-1].id
+ hpxml_bldg.roofs.add(id: "Roof#{hpxml_bldg.roofs.size + 1}",
+ interior_adjacent_to: Geometry.get_adjacent_to(surface: surface),
+ azimuth: azimuth,
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
+ roof_type: roof_type,
+ roof_color: roof_color,
+ pitch: args[:geometry_roof_pitch],
+ radiant_barrier: radiant_barrier,
+ radiant_barrier_grade: radiant_barrier_grade,
+ insulation_assembly_r_value: args[:roof_assembly_r])
+ @surface_ids[surface.name.to_s] = hpxml_bldg.roofs[-1].id
end
end
- def self.set_rim_joists(hpxml, model, args, sorted_surfaces)
+ def self.set_rim_joists(hpxml_bldg, model, args, sorted_surfaces)
sorted_surfaces.each do |surface|
next if surface.surfaceType != 'Wall'
next unless ['Outdoors', 'Adiabatic'].include? surface.outsideBoundaryCondition
@@ -4069,7 +4264,7 @@ def self.set_rim_joists(hpxml, model, args, sorted_surfaces)
if adjacent_surface.nil? # adjacent to a space that is not explicitly in the model
unless [HPXML::ResidentialTypeSFD].include?(args[:geometry_unit_type])
exterior_adjacent_to = interior_adjacent_to
- if exterior_adjacent_to == HPXML::LocationLivingSpace # living adjacent to living
+ if exterior_adjacent_to == HPXML::LocationConditionedSpace # conditioned space adjacent to conditioned space
exterior_adjacent_to = HPXML::LocationOtherHousingUnit
end
end
@@ -4094,34 +4289,34 @@ def self.set_rim_joists(hpxml, model, args, sorted_surfaces)
azimuth = Geometry.get_surface_azimuth(surface: surface, orientation: args[:geometry_unit_orientation])
- hpxml.rim_joists.add(id: "RimJoist#{hpxml.rim_joists.size + 1}",
- exterior_adjacent_to: exterior_adjacent_to,
- interior_adjacent_to: interior_adjacent_to,
- azimuth: azimuth,
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
- siding: siding,
- color: color,
- insulation_assembly_r_value: insulation_assembly_r_value)
- @surface_ids[surface.name.to_s] = hpxml.rim_joists[-1].id
+ hpxml_bldg.rim_joists.add(id: "RimJoist#{hpxml_bldg.rim_joists.size + 1}",
+ exterior_adjacent_to: exterior_adjacent_to,
+ interior_adjacent_to: interior_adjacent_to,
+ azimuth: azimuth,
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
+ siding: siding,
+ color: color,
+ insulation_assembly_r_value: insulation_assembly_r_value)
+ @surface_ids[surface.name.to_s] = hpxml_bldg.rim_joists[-1].id
end
end
- def self.set_walls(hpxml, model, args, sorted_surfaces)
+ def self.set_walls(hpxml_bldg, model, args, sorted_surfaces)
sorted_surfaces.each do |surface|
next if surface.surfaceType != 'Wall'
next if Geometry.surface_is_rim_joist(surface, args[:geometry_rim_joist_height])
interior_adjacent_to = Geometry.get_adjacent_to(surface: surface)
- next unless [HPXML::LocationLivingSpace, HPXML::LocationAtticUnvented, HPXML::LocationAtticVented, HPXML::LocationGarage].include? interior_adjacent_to
+ next unless [HPXML::LocationConditionedSpace, HPXML::LocationAtticUnvented, HPXML::LocationAtticVented, HPXML::LocationGarage].include? interior_adjacent_to
exterior_adjacent_to = HPXML::LocationOutside
if surface.adjacentSurface.is_initialized
exterior_adjacent_to = Geometry.get_adjacent_to(surface: surface.adjacentSurface.get)
- elsif surface.outsideBoundaryCondition == 'Adiabatic' # can be adjacent to living space, attic
+ elsif surface.outsideBoundaryCondition == 'Adiabatic' # can be adjacent to conditioned space, attic
adjacent_surface = Geometry.get_adiabatic_adjacent_surface(model: model, surface: surface)
if adjacent_surface.nil? # adjacent to a space that is not explicitly in the model
exterior_adjacent_to = interior_adjacent_to
- if exterior_adjacent_to == HPXML::LocationLivingSpace # living adjacent to living
+ if exterior_adjacent_to == HPXML::LocationConditionedSpace # conditioned space adjacent to conditioned space
exterior_adjacent_to = HPXML::LocationOtherHousingUnit
end
else # adjacent to a space that is explicitly in the model
@@ -4129,7 +4324,7 @@ def self.set_walls(hpxml, model, args, sorted_surfaces)
end
end
- next if exterior_adjacent_to == HPXML::LocationLivingSpace # already captured these surfaces
+ next if exterior_adjacent_to == HPXML::LocationConditionedSpace # already captured these surfaces
attic_locations = [HPXML::LocationAtticUnconditioned, HPXML::LocationAtticUnvented, HPXML::LocationAtticVented]
attic_wall_type = nil
@@ -4156,35 +4351,35 @@ def self.set_walls(hpxml, model, args, sorted_surfaces)
azimuth = Geometry.get_surface_azimuth(surface: surface, orientation: args[:geometry_unit_orientation])
- hpxml.walls.add(id: "Wall#{hpxml.walls.size + 1}",
- exterior_adjacent_to: exterior_adjacent_to,
- interior_adjacent_to: interior_adjacent_to,
- azimuth: azimuth,
- wall_type: wall_type,
- attic_wall_type: attic_wall_type,
- siding: siding,
- color: color,
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'))
- @surface_ids[surface.name.to_s] = hpxml.walls[-1].id
+ hpxml_bldg.walls.add(id: "Wall#{hpxml_bldg.walls.size + 1}",
+ exterior_adjacent_to: exterior_adjacent_to,
+ interior_adjacent_to: interior_adjacent_to,
+ azimuth: azimuth,
+ wall_type: wall_type,
+ attic_wall_type: attic_wall_type,
+ siding: siding,
+ color: color,
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'))
+ @surface_ids[surface.name.to_s] = hpxml_bldg.walls[-1].id
is_uncond_attic_roof_insulated = false
if attic_locations.include? interior_adjacent_to
- hpxml.roofs.each do |roof|
+ hpxml_bldg.roofs.each do |roof|
next unless (roof.interior_adjacent_to == interior_adjacent_to) && (roof.insulation_assembly_r_value > 4.0)
is_uncond_attic_roof_insulated = true
end
end
- if hpxml.walls[-1].is_thermal_boundary || is_uncond_attic_roof_insulated # Assume wall is insulated if roof is insulated
- hpxml.walls[-1].insulation_assembly_r_value = args[:wall_assembly_r]
+ if hpxml_bldg.walls[-1].is_thermal_boundary || is_uncond_attic_roof_insulated # Assume wall is insulated if roof is insulated
+ hpxml_bldg.walls[-1].insulation_assembly_r_value = args[:wall_assembly_r]
else
- hpxml.walls[-1].insulation_assembly_r_value = 4.0 # Uninsulated
+ hpxml_bldg.walls[-1].insulation_assembly_r_value = 4.0 # Uninsulated
end
end
end
- def self.set_foundation_walls(hpxml, model, args, sorted_surfaces)
+ def self.set_foundation_walls(hpxml_bldg, model, args, sorted_surfaces)
sorted_surfaces.each do |surface|
next if surface.surfaceType != 'Wall'
next unless ['Foundation', 'Adiabatic'].include? surface.outsideBoundaryCondition
@@ -4203,7 +4398,7 @@ def self.set_foundation_walls(hpxml, model, args, sorted_surfaces)
if adjacent_surface.nil? # adjacent to a space that is not explicitly in the model
unless [HPXML::ResidentialTypeSFD].include?(args[:geometry_unit_type])
exterior_adjacent_to = interior_adjacent_to
- if exterior_adjacent_to == HPXML::LocationLivingSpace # living adjacent to living
+ if exterior_adjacent_to == HPXML::LocationConditionedSpace # conditioned space adjacent to conditioned space
exterior_adjacent_to = HPXML::LocationOtherHousingUnit
end
end
@@ -4257,27 +4452,27 @@ def self.set_foundation_walls(hpxml, model, args, sorted_surfaces)
azimuth = Geometry.get_surface_azimuth(surface: surface, orientation: args[:geometry_unit_orientation])
- hpxml.foundation_walls.add(id: "FoundationWall#{hpxml.foundation_walls.size + 1}",
- exterior_adjacent_to: exterior_adjacent_to,
- interior_adjacent_to: interior_adjacent_to,
- type: type,
- azimuth: azimuth,
- height: args[:geometry_foundation_height],
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
- thickness: thickness,
- depth_below_grade: args[:geometry_foundation_height] - args[:geometry_foundation_height_above_grade],
- insulation_assembly_r_value: insulation_assembly_r_value,
- insulation_interior_r_value: insulation_interior_r_value,
- insulation_interior_distance_to_top: insulation_interior_distance_to_top,
- insulation_interior_distance_to_bottom: insulation_interior_distance_to_bottom,
- insulation_exterior_r_value: insulation_exterior_r_value,
- insulation_exterior_distance_to_top: insulation_exterior_distance_to_top,
- insulation_exterior_distance_to_bottom: insulation_exterior_distance_to_bottom)
- @surface_ids[surface.name.to_s] = hpxml.foundation_walls[-1].id
+ hpxml_bldg.foundation_walls.add(id: "FoundationWall#{hpxml_bldg.foundation_walls.size + 1}",
+ exterior_adjacent_to: exterior_adjacent_to,
+ interior_adjacent_to: interior_adjacent_to,
+ type: type,
+ azimuth: azimuth,
+ height: args[:geometry_foundation_height],
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
+ thickness: thickness,
+ depth_below_grade: args[:geometry_foundation_height] - args[:geometry_foundation_height_above_grade],
+ insulation_assembly_r_value: insulation_assembly_r_value,
+ insulation_interior_r_value: insulation_interior_r_value,
+ insulation_interior_distance_to_top: insulation_interior_distance_to_top,
+ insulation_interior_distance_to_bottom: insulation_interior_distance_to_bottom,
+ insulation_exterior_r_value: insulation_exterior_r_value,
+ insulation_exterior_distance_to_top: insulation_exterior_distance_to_top,
+ insulation_exterior_distance_to_bottom: insulation_exterior_distance_to_bottom)
+ @surface_ids[surface.name.to_s] = hpxml_bldg.foundation_walls[-1].id
end
end
- def self.set_floors(hpxml, args, sorted_surfaces)
+ def self.set_floors(hpxml_bldg, args, sorted_surfaces)
if [HPXML::FoundationTypeBasementConditioned,
HPXML::FoundationTypeCrawlspaceConditioned].include?(args[:geometry_foundation_type]) && (args[:floor_over_foundation_assembly_r] > 2.1)
args[:floor_over_foundation_assembly_r] = 2.1 # Uninsulated
@@ -4292,7 +4487,7 @@ def self.set_floors(hpxml, args, sorted_surfaces)
next unless ['Floor', 'RoofCeiling'].include? surface.surfaceType
interior_adjacent_to = Geometry.get_adjacent_to(surface: surface)
- next unless [HPXML::LocationLivingSpace, HPXML::LocationGarage].include? interior_adjacent_to
+ next unless [HPXML::LocationConditionedSpace, HPXML::LocationGarage].include? interior_adjacent_to
exterior_adjacent_to = HPXML::LocationOutside
if surface.adjacentSurface.is_initialized
@@ -4308,40 +4503,40 @@ def self.set_floors(hpxml, args, sorted_surfaces)
next if interior_adjacent_to == exterior_adjacent_to
next if (surface.surfaceType == 'RoofCeiling') && (exterior_adjacent_to == HPXML::LocationOutside)
- next if [HPXML::LocationLivingSpace,
+ next if [HPXML::LocationConditionedSpace,
HPXML::LocationBasementConditioned,
HPXML::LocationCrawlspaceConditioned].include? exterior_adjacent_to
- hpxml.floors.add(id: "Floor#{hpxml.floors.size + 1}",
- exterior_adjacent_to: exterior_adjacent_to,
- interior_adjacent_to: interior_adjacent_to,
- floor_type: args[:floor_type],
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
- floor_or_ceiling: floor_or_ceiling)
- if hpxml.floors[-1].floor_or_ceiling.nil?
- if hpxml.floors[-1].is_floor
- hpxml.floors[-1].floor_or_ceiling = HPXML::FloorOrCeilingFloor
- elsif hpxml.floors[-1].is_ceiling
- hpxml.floors[-1].floor_or_ceiling = HPXML::FloorOrCeilingCeiling
+ hpxml_bldg.floors.add(id: "Floor#{hpxml_bldg.floors.size + 1}",
+ exterior_adjacent_to: exterior_adjacent_to,
+ interior_adjacent_to: interior_adjacent_to,
+ floor_type: args[:floor_type],
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
+ floor_or_ceiling: floor_or_ceiling)
+ if hpxml_bldg.floors[-1].floor_or_ceiling.nil?
+ if hpxml_bldg.floors[-1].is_floor
+ hpxml_bldg.floors[-1].floor_or_ceiling = HPXML::FloorOrCeilingFloor
+ elsif hpxml_bldg.floors[-1].is_ceiling
+ hpxml_bldg.floors[-1].floor_or_ceiling = HPXML::FloorOrCeilingCeiling
end
end
- @surface_ids[surface.name.to_s] = hpxml.floors[-1].id
+ @surface_ids[surface.name.to_s] = hpxml_bldg.floors[-1].id
- if hpxml.floors[-1].is_thermal_boundary
+ if hpxml_bldg.floors[-1].is_thermal_boundary
if [HPXML::LocationAtticUnvented, HPXML::LocationAtticVented].include? exterior_adjacent_to
- hpxml.floors[-1].insulation_assembly_r_value = args[:ceiling_assembly_r]
+ hpxml_bldg.floors[-1].insulation_assembly_r_value = args[:ceiling_assembly_r]
elsif [HPXML::LocationGarage].include? exterior_adjacent_to
- hpxml.floors[-1].insulation_assembly_r_value = args[:floor_over_garage_assembly_r]
+ hpxml_bldg.floors[-1].insulation_assembly_r_value = args[:floor_over_garage_assembly_r]
else
- hpxml.floors[-1].insulation_assembly_r_value = args[:floor_over_foundation_assembly_r]
+ hpxml_bldg.floors[-1].insulation_assembly_r_value = args[:floor_over_foundation_assembly_r]
end
else
- hpxml.floors[-1].insulation_assembly_r_value = 2.1 # Uninsulated
+ hpxml_bldg.floors[-1].insulation_assembly_r_value = 2.1 # Uninsulated
end
end
end
- def self.set_slabs(hpxml, model, args, sorted_surfaces)
+ def self.set_slabs(hpxml_bldg, model, args, sorted_surfaces)
sorted_surfaces.each do |surface|
next unless ['Foundation'].include? surface.outsideBoundaryCondition
next if surface.surfaceType != 'Floor'
@@ -4368,10 +4563,6 @@ def self.set_slabs(hpxml, model, args, sorted_surfaces)
exposed_perimeter -= Geometry.get_unexposed_garage_perimeter(**args)
end
- if [HPXML::LocationLivingSpace, HPXML::LocationGarage].include? interior_adjacent_to
- depth_below_grade = 0
- end
-
if args[:slab_under_width] == 999
under_slab_insulation_spans_entire_slab = true
else
@@ -4390,31 +4581,30 @@ def self.set_slabs(hpxml, model, args, sorted_surfaces)
carpet_r_value = args[:slab_carpet_r].get
end
- hpxml.slabs.add(id: "Slab#{hpxml.slabs.size + 1}",
- interior_adjacent_to: interior_adjacent_to,
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
- thickness: thickness,
- exposed_perimeter: exposed_perimeter,
- perimeter_insulation_depth: args[:slab_perimeter_depth],
- under_slab_insulation_width: under_slab_insulation_width,
- perimeter_insulation_r_value: args[:slab_perimeter_insulation_r],
- under_slab_insulation_r_value: args[:slab_under_insulation_r],
- under_slab_insulation_spans_entire_slab: under_slab_insulation_spans_entire_slab,
- depth_below_grade: depth_below_grade,
- carpet_fraction: carpet_fraction,
- carpet_r_value: carpet_r_value)
- @surface_ids[surface.name.to_s] = hpxml.slabs[-1].id
+ hpxml_bldg.slabs.add(id: "Slab#{hpxml_bldg.slabs.size + 1}",
+ interior_adjacent_to: interior_adjacent_to,
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
+ thickness: thickness,
+ exposed_perimeter: exposed_perimeter,
+ perimeter_insulation_depth: args[:slab_perimeter_depth],
+ under_slab_insulation_width: under_slab_insulation_width,
+ perimeter_insulation_r_value: args[:slab_perimeter_insulation_r],
+ under_slab_insulation_r_value: args[:slab_under_insulation_r],
+ under_slab_insulation_spans_entire_slab: under_slab_insulation_spans_entire_slab,
+ carpet_fraction: carpet_fraction,
+ carpet_r_value: carpet_r_value)
+ @surface_ids[surface.name.to_s] = hpxml_bldg.slabs[-1].id
next unless interior_adjacent_to == HPXML::LocationCrawlspaceConditioned
# Increase Conditioned Building Volume & Infiltration Volume
- conditioned_crawlspace_volume = hpxml.slabs[-1].area * args[:geometry_foundation_height]
- hpxml.building_construction.conditioned_building_volume += conditioned_crawlspace_volume
- hpxml.air_infiltration_measurements[0].infiltration_volume += conditioned_crawlspace_volume
+ conditioned_crawlspace_volume = hpxml_bldg.slabs[-1].area * args[:geometry_foundation_height]
+ hpxml_bldg.building_construction.conditioned_building_volume += conditioned_crawlspace_volume
+ hpxml_bldg.air_infiltration_measurements[0].infiltration_volume += conditioned_crawlspace_volume
end
end
- def self.set_windows(hpxml, model, args, sorted_subsurfaces)
+ def self.set_windows(hpxml_bldg, model, args, sorted_subsurfaces)
sorted_subsurfaces.each do |sub_surface|
next if sub_surface.subSurfaceType != 'FixedWindow'
@@ -4450,7 +4640,7 @@ def self.set_windows(hpxml, model, args, sorted_subsurfaces)
end
# Get max z coordinate of this window
- sub_surface_z = Geometry.getSurfaceZValues([sub_surface]).max + UnitConversions.convert(sub_surface.space.get.zOrigin, 'm', 'ft')
+ sub_surface_z = Geometry.get_surface_z_values([sub_surface]).max + UnitConversions.convert(sub_surface.space.get.zOrigin, 'm', 'ft')
overhangs_depth = args[:geometry_eaves_depth]
overhangs_distance_to_top_of_window = eaves_z - sub_surface_z # difference between max z coordinates of eaves and this window
@@ -4486,25 +4676,25 @@ def self.set_windows(hpxml, model, args, sorted_subsurfaces)
wall_idref = @surface_ids[surface.name.to_s]
next if wall_idref.nil?
- hpxml.windows.add(id: "Window#{hpxml.windows.size + 1}",
- area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
- azimuth: azimuth,
- ufactor: args[:window_ufactor],
- shgc: args[:window_shgc],
- storm_type: window_storm_type,
- overhangs_depth: overhangs_depth,
- overhangs_distance_to_top_of_window: overhangs_distance_to_top_of_window,
- overhangs_distance_to_bottom_of_window: overhangs_distance_to_bottom_of_window,
- interior_shading_factor_winter: interior_shading_factor_winter,
- interior_shading_factor_summer: interior_shading_factor_summer,
- exterior_shading_factor_winter: exterior_shading_factor_winter,
- exterior_shading_factor_summer: exterior_shading_factor_summer,
- fraction_operable: fraction_operable,
- wall_idref: wall_idref)
+ hpxml_bldg.windows.add(id: "Window#{hpxml_bldg.windows.size + 1}",
+ area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
+ azimuth: azimuth,
+ ufactor: args[:window_ufactor],
+ shgc: args[:window_shgc],
+ storm_type: window_storm_type,
+ overhangs_depth: overhangs_depth,
+ overhangs_distance_to_top_of_window: overhangs_distance_to_top_of_window,
+ overhangs_distance_to_bottom_of_window: overhangs_distance_to_bottom_of_window,
+ interior_shading_factor_winter: interior_shading_factor_winter,
+ interior_shading_factor_summer: interior_shading_factor_summer,
+ exterior_shading_factor_winter: exterior_shading_factor_winter,
+ exterior_shading_factor_summer: exterior_shading_factor_summer,
+ fraction_operable: fraction_operable,
+ wall_idref: wall_idref)
end
end
- def self.set_skylights(hpxml, args, sorted_subsurfaces)
+ def self.set_skylights(hpxml_bldg, args, sorted_subsurfaces)
sorted_subsurfaces.each do |sub_surface|
next if sub_surface.subSurfaceType != 'Skylight'
@@ -4520,17 +4710,17 @@ def self.set_skylights(hpxml, args, sorted_subsurfaces)
roof_idref = @surface_ids[surface.name.to_s]
next if roof_idref.nil?
- hpxml.skylights.add(id: "Skylight#{hpxml.skylights.size + 1}",
- area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
- azimuth: azimuth,
- ufactor: args[:skylight_ufactor],
- shgc: args[:skylight_shgc],
- storm_type: skylight_storm_type,
- roof_idref: roof_idref)
+ hpxml_bldg.skylights.add(id: "Skylight#{hpxml_bldg.skylights.size + 1}",
+ area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
+ azimuth: azimuth,
+ ufactor: args[:skylight_ufactor],
+ shgc: args[:skylight_shgc],
+ storm_type: skylight_storm_type,
+ roof_idref: roof_idref)
end
end
- def self.set_doors(hpxml, model, args, sorted_subsurfaces)
+ def self.set_doors(hpxml_bldg, model, args, sorted_subsurfaces)
sorted_subsurfaces.each do |sub_surface|
next if sub_surface.subSurfaceType != 'Door'
@@ -4546,18 +4736,18 @@ def self.set_doors(hpxml, model, args, sorted_subsurfaces)
wall_idref = @surface_ids[surface.name.to_s]
next if wall_idref.nil?
- hpxml.doors.add(id: "Door#{hpxml.doors.size + 1}",
- wall_idref: wall_idref,
- area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
- azimuth: args[:geometry_unit_orientation],
- r_value: args[:door_rvalue])
+ hpxml_bldg.doors.add(id: "Door#{hpxml_bldg.doors.size + 1}",
+ wall_idref: wall_idref,
+ area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
+ azimuth: args[:geometry_unit_orientation],
+ r_value: args[:door_rvalue])
end
end
- def self.set_attics(hpxml, args)
- surf_ids = { 'roofs' => { 'surfaces' => hpxml.roofs, 'ids' => [] },
- 'walls' => { 'surfaces' => hpxml.walls, 'ids' => [] },
- 'floors' => { 'surfaces' => hpxml.floors, 'ids' => [] } }
+ def self.set_attics(hpxml_bldg, args)
+ surf_ids = { 'roofs' => { 'surfaces' => hpxml_bldg.roofs, 'ids' => [] },
+ 'walls' => { 'surfaces' => hpxml_bldg.walls, 'ids' => [] },
+ 'floors' => { 'surfaces' => hpxml_bldg.floors, 'ids' => [] } }
attic_locations = [HPXML::LocationAtticUnconditioned, HPXML::LocationAtticUnvented, HPXML::LocationAtticVented]
surf_ids.values.each do |surf_hash|
@@ -4570,27 +4760,27 @@ def self.set_attics(hpxml, args)
end
# Add attached roofs for cathedral ceiling
- living_space = HPXML::LocationLivingSpace
+ conditioned_space = HPXML::LocationConditionedSpace
surf_ids['roofs']['surfaces'].each do |surface|
- next if (living_space != surface.interior_adjacent_to) &&
- (living_space != surface.exterior_adjacent_to)
+ next if (conditioned_space != surface.interior_adjacent_to) &&
+ (conditioned_space != surface.exterior_adjacent_to)
surf_ids['roofs']['ids'] << surface.id
end
- hpxml.attics.add(id: "Attic#{hpxml.attics.size + 1}",
- attic_type: args[:geometry_attic_type],
- attached_to_roof_idrefs: surf_ids['roofs']['ids'],
- attached_to_wall_idrefs: surf_ids['walls']['ids'],
- attached_to_floor_idrefs: surf_ids['floors']['ids'])
+ hpxml_bldg.attics.add(id: "Attic#{hpxml_bldg.attics.size + 1}",
+ attic_type: args[:geometry_attic_type],
+ attached_to_roof_idrefs: surf_ids['roofs']['ids'],
+ attached_to_wall_idrefs: surf_ids['walls']['ids'],
+ attached_to_floor_idrefs: surf_ids['floors']['ids'])
end
- def self.set_foundations(hpxml, args)
- surf_ids = { 'slabs' => { 'surfaces' => hpxml.slabs, 'ids' => [] },
- 'floors' => { 'surfaces' => hpxml.floors, 'ids' => [] },
- 'foundation_walls' => { 'surfaces' => hpxml.foundation_walls, 'ids' => [] },
- 'walls' => { 'surfaces' => hpxml.walls, 'ids' => [] },
- 'rim_joists' => { 'surfaces' => hpxml.rim_joists, 'ids' => [] }, }
+ def self.set_foundations(hpxml_bldg, args)
+ surf_ids = { 'slabs' => { 'surfaces' => hpxml_bldg.slabs, 'ids' => [] },
+ 'floors' => { 'surfaces' => hpxml_bldg.floors, 'ids' => [] },
+ 'foundation_walls' => { 'surfaces' => hpxml_bldg.foundation_walls, 'ids' => [] },
+ 'walls' => { 'surfaces' => hpxml_bldg.walls, 'ids' => [] },
+ 'rim_joists' => { 'surfaces' => hpxml_bldg.rim_joists, 'ids' => [] }, }
foundation_locations = [HPXML::LocationBasementConditioned,
HPXML::LocationBasementUnconditioned,
@@ -4602,23 +4792,37 @@ def self.set_foundations(hpxml, args)
surf_hash['surfaces'].each do |surface|
next unless (foundation_locations.include? surface.interior_adjacent_to) ||
(foundation_locations.include? surface.exterior_adjacent_to) ||
- (surf_type == 'slabs' && surface.interior_adjacent_to == HPXML::LocationLivingSpace) ||
- (surf_type == 'floors' && surface.exterior_adjacent_to == HPXML::LocationOutside)
+ (surf_type == 'slabs' && surface.interior_adjacent_to == HPXML::LocationConditionedSpace) ||
+ (surf_type == 'floors' && [HPXML::LocationOutside, HPXML::LocationManufacturedHomeUnderBelly].include?(surface.exterior_adjacent_to))
surf_hash['ids'] << surface.id
end
end
- hpxml.foundations.add(id: "Foundation#{hpxml.foundations.size + 1}",
- foundation_type: args[:geometry_foundation_type],
- attached_to_slab_idrefs: surf_ids['slabs']['ids'],
- attached_to_floor_idrefs: surf_ids['floors']['ids'],
- attached_to_foundation_wall_idrefs: surf_ids['foundation_walls']['ids'],
- attached_to_wall_idrefs: surf_ids['walls']['ids'],
- attached_to_rim_joist_idrefs: surf_ids['rim_joists']['ids'])
+ if args[:geometry_foundation_type].start_with?(HPXML::FoundationTypeBellyAndWing)
+ foundation_type = HPXML::FoundationTypeBellyAndWing
+ if args[:geometry_foundation_type].end_with?('WithSkirt')
+ belly_wing_skirt_present = true
+ elsif args[:geometry_foundation_type].end_with?('NoSkirt')
+ belly_wing_skirt_present = false
+ else
+ fail 'Unepected belly and wing foundation type.'
+ end
+ else
+ foundation_type = args[:geometry_foundation_type]
+ end
+
+ hpxml_bldg.foundations.add(id: "Foundation#{hpxml_bldg.foundations.size + 1}",
+ foundation_type: foundation_type,
+ attached_to_slab_idrefs: surf_ids['slabs']['ids'],
+ attached_to_floor_idrefs: surf_ids['floors']['ids'],
+ attached_to_foundation_wall_idrefs: surf_ids['foundation_walls']['ids'],
+ attached_to_wall_idrefs: surf_ids['walls']['ids'],
+ attached_to_rim_joist_idrefs: surf_ids['rim_joists']['ids'],
+ belly_wing_skirt_present: belly_wing_skirt_present)
end
- def self.set_heating_systems(hpxml, args)
+ def self.set_heating_systems(hpxml_bldg, args)
heating_system_type = args[:heating_system_type]
return if heating_system_type == 'none'
@@ -4639,9 +4843,8 @@ def self.set_heating_systems(hpxml, args)
heating_efficiency_afue = args[:heating_system_heating_efficiency]
elsif [HPXML::HVACTypeElectricResistance,
HPXML::HVACTypeStove,
- HPXML::HVACTypePortableHeater,
- HPXML::HVACTypeFireplace,
- HPXML::HVACTypeFixedHeater].include?(heating_system_type)
+ HPXML::HVACTypeSpaceHeater,
+ HPXML::HVACTypeFireplace].include?(heating_system_type)
heating_efficiency_percent = args[:heating_system_heating_efficiency]
end
@@ -4670,22 +4873,22 @@ def self.set_heating_systems(hpxml, args)
heating_system_type = HPXML::HVACTypeBoiler
end
- hpxml.heating_systems.add(id: "HeatingSystem#{hpxml.heating_systems.size + 1}",
- heating_system_type: heating_system_type,
- heating_system_fuel: heating_system_fuel,
- heating_capacity: heating_capacity,
- fraction_heat_load_served: fraction_heat_load_served,
- heating_efficiency_afue: heating_efficiency_afue,
- heating_efficiency_percent: heating_efficiency_percent,
- airflow_defect_ratio: airflow_defect_ratio,
- pilot_light: pilot_light,
- pilot_light_btuh: pilot_light_btuh,
- is_shared_system: is_shared_system,
- number_of_units_served: number_of_units_served,
- primary_system: true)
+ hpxml_bldg.heating_systems.add(id: "HeatingSystem#{hpxml_bldg.heating_systems.size + 1}",
+ heating_system_type: heating_system_type,
+ heating_system_fuel: heating_system_fuel,
+ heating_capacity: heating_capacity,
+ fraction_heat_load_served: fraction_heat_load_served,
+ heating_efficiency_afue: heating_efficiency_afue,
+ heating_efficiency_percent: heating_efficiency_percent,
+ airflow_defect_ratio: airflow_defect_ratio,
+ pilot_light: pilot_light,
+ pilot_light_btuh: pilot_light_btuh,
+ is_shared_system: is_shared_system,
+ number_of_units_served: number_of_units_served,
+ primary_system: true)
end
- def self.set_cooling_systems(hpxml, args)
+ def self.set_cooling_systems(hpxml_bldg, args)
cooling_system_type = args[:cooling_system_type]
return if cooling_system_type == 'none'
@@ -4695,7 +4898,7 @@ def self.set_cooling_systems(hpxml, args)
end
if args[:cooling_system_cooling_compressor_type].is_initialized
- if cooling_system_type == HPXML::HVACTypeCentralAirConditioner
+ if [HPXML::HVACTypeCentralAirConditioner, HPXML::HVACTypeMiniSplitAirConditioner].include? cooling_system_type
compressor_type = args[:cooling_system_cooling_compressor_type].get
end
end
@@ -4754,28 +4957,28 @@ def self.set_cooling_systems(hpxml, args)
end
end
- hpxml.cooling_systems.add(id: "CoolingSystem#{hpxml.cooling_systems.size + 1}",
- cooling_system_type: cooling_system_type,
- cooling_system_fuel: HPXML::FuelTypeElectricity,
- cooling_capacity: cooling_capacity,
- fraction_cool_load_served: args[:cooling_system_fraction_cool_load_served],
- compressor_type: compressor_type,
- cooling_shr: cooling_shr,
- cooling_efficiency_seer: cooling_efficiency_seer,
- cooling_efficiency_seer2: cooling_efficiency_seer2,
- cooling_efficiency_eer: cooling_efficiency_eer,
- cooling_efficiency_ceer: cooling_efficiency_ceer,
- airflow_defect_ratio: airflow_defect_ratio,
- charge_defect_ratio: charge_defect_ratio,
- crankcase_heater_watts: cooling_system_crankcase_heater_watts,
- primary_system: true,
- integrated_heating_system_fuel: integrated_heating_system_fuel,
- integrated_heating_system_capacity: integrated_heating_system_capacity,
- integrated_heating_system_efficiency_percent: integrated_heating_system_efficiency_percent,
- integrated_heating_system_fraction_heat_load_served: integrated_heating_system_fraction_heat_load_served)
+ hpxml_bldg.cooling_systems.add(id: "CoolingSystem#{hpxml_bldg.cooling_systems.size + 1}",
+ cooling_system_type: cooling_system_type,
+ cooling_system_fuel: HPXML::FuelTypeElectricity,
+ cooling_capacity: cooling_capacity,
+ fraction_cool_load_served: args[:cooling_system_fraction_cool_load_served],
+ compressor_type: compressor_type,
+ cooling_shr: cooling_shr,
+ cooling_efficiency_seer: cooling_efficiency_seer,
+ cooling_efficiency_seer2: cooling_efficiency_seer2,
+ cooling_efficiency_eer: cooling_efficiency_eer,
+ cooling_efficiency_ceer: cooling_efficiency_ceer,
+ airflow_defect_ratio: airflow_defect_ratio,
+ charge_defect_ratio: charge_defect_ratio,
+ crankcase_heater_watts: cooling_system_crankcase_heater_watts,
+ primary_system: true,
+ integrated_heating_system_fuel: integrated_heating_system_fuel,
+ integrated_heating_system_capacity: integrated_heating_system_capacity,
+ integrated_heating_system_efficiency_percent: integrated_heating_system_efficiency_percent,
+ integrated_heating_system_fraction_heat_load_served: integrated_heating_system_fraction_heat_load_served)
end
- def self.set_heat_pumps(hpxml, args)
+ def self.set_heat_pumps(hpxml_bldg, args)
heat_pump_type = args[:heat_pump_type]
return if heat_pump_type == 'none'
@@ -4811,7 +5014,7 @@ def self.set_heat_pumps(hpxml, args)
end
backup_type = args[:heat_pump_backup_type]
- backup_system_idref = "HeatingSystem#{hpxml.heating_systems.size + 1}"
+ backup_system_idref = "HeatingSystem#{hpxml_bldg.heating_systems.size + 1}"
end
if args[:heat_pump_compressor_lockout_temp].is_initialized
@@ -4834,7 +5037,7 @@ def self.set_heat_pumps(hpxml, args)
end
if args[:heat_pump_cooling_compressor_type].is_initialized
- if [HPXML::HVACTypeHeatPumpAirToAir].include? heat_pump_type
+ if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit].include? heat_pump_type
compressor_type = args[:heat_pump_cooling_compressor_type].get
end
end
@@ -4886,44 +5089,40 @@ def self.set_heat_pumps(hpxml, args)
primary_cooling_system = true
end
- if args[:heat_pump_sizing_methodology].is_initialized
- hpxml.header.heat_pump_sizing_methodology = args[:heat_pump_sizing_methodology].get
- end
-
- hpxml.heat_pumps.add(id: "HeatPump#{hpxml.heat_pumps.size + 1}",
- heat_pump_type: heat_pump_type,
- heat_pump_fuel: HPXML::FuelTypeElectricity,
- heating_capacity: heating_capacity,
- heating_capacity_retention_fraction: heating_capacity_retention_fraction,
- heating_capacity_retention_temp: heating_capacity_retention_temp,
- compressor_type: compressor_type,
- compressor_lockout_temp: compressor_lockout_temp,
- cooling_shr: cooling_shr,
- cooling_capacity: cooling_capacity,
- fraction_heat_load_served: fraction_heat_load_served,
- fraction_cool_load_served: fraction_cool_load_served,
- backup_type: backup_type,
- backup_system_idref: backup_system_idref,
- backup_heating_fuel: backup_heating_fuel,
- backup_heating_capacity: backup_heating_capacity,
- backup_heating_efficiency_afue: backup_heating_efficiency_afue,
- backup_heating_efficiency_percent: backup_heating_efficiency_percent,
- backup_heating_switchover_temp: backup_heating_switchover_temp,
- backup_heating_lockout_temp: backup_heating_lockout_temp,
- heating_efficiency_hspf: heating_efficiency_hspf,
- heating_efficiency_hspf2: heating_efficiency_hspf2,
- cooling_efficiency_seer: cooling_efficiency_seer,
- cooling_efficiency_seer2: cooling_efficiency_seer2,
- heating_efficiency_cop: heating_efficiency_cop,
- cooling_efficiency_eer: cooling_efficiency_eer,
- airflow_defect_ratio: airflow_defect_ratio,
- charge_defect_ratio: charge_defect_ratio,
- crankcase_heater_watts: heat_pump_crankcase_heater_watts,
- primary_heating_system: primary_heating_system,
- primary_cooling_system: primary_cooling_system)
+ hpxml_bldg.heat_pumps.add(id: "HeatPump#{hpxml_bldg.heat_pumps.size + 1}",
+ heat_pump_type: heat_pump_type,
+ heat_pump_fuel: HPXML::FuelTypeElectricity,
+ heating_capacity: heating_capacity,
+ heating_capacity_retention_fraction: heating_capacity_retention_fraction,
+ heating_capacity_retention_temp: heating_capacity_retention_temp,
+ compressor_type: compressor_type,
+ compressor_lockout_temp: compressor_lockout_temp,
+ cooling_shr: cooling_shr,
+ cooling_capacity: cooling_capacity,
+ fraction_heat_load_served: fraction_heat_load_served,
+ fraction_cool_load_served: fraction_cool_load_served,
+ backup_type: backup_type,
+ backup_system_idref: backup_system_idref,
+ backup_heating_fuel: backup_heating_fuel,
+ backup_heating_capacity: backup_heating_capacity,
+ backup_heating_efficiency_afue: backup_heating_efficiency_afue,
+ backup_heating_efficiency_percent: backup_heating_efficiency_percent,
+ backup_heating_switchover_temp: backup_heating_switchover_temp,
+ backup_heating_lockout_temp: backup_heating_lockout_temp,
+ heating_efficiency_hspf: heating_efficiency_hspf,
+ heating_efficiency_hspf2: heating_efficiency_hspf2,
+ cooling_efficiency_seer: cooling_efficiency_seer,
+ cooling_efficiency_seer2: cooling_efficiency_seer2,
+ heating_efficiency_cop: heating_efficiency_cop,
+ cooling_efficiency_eer: cooling_efficiency_eer,
+ airflow_defect_ratio: airflow_defect_ratio,
+ charge_defect_ratio: charge_defect_ratio,
+ crankcase_heater_watts: heat_pump_crankcase_heater_watts,
+ primary_heating_system: primary_heating_system,
+ primary_cooling_system: primary_cooling_system)
end
- def self.set_secondary_heating_systems(hpxml, args)
+ def self.set_secondary_heating_systems(hpxml_bldg, args)
heating_system_type = args[:heating_system_2_type]
heating_system_is_heatpump_backup = (args[:heat_pump_type] != 'none' && args[:heat_pump_backup_type] == HPXML::HeatPumpBackupTypeSeparate)
@@ -4941,7 +5140,7 @@ def self.set_secondary_heating_systems(hpxml, args)
if [HPXML::HVACTypeFurnace, HPXML::HVACTypeWallFurnace, HPXML::HVACTypeFloorFurnace].include?(heating_system_type) || heating_system_type.include?(HPXML::HVACTypeBoiler)
heating_efficiency_afue = args[:heating_system_2_heating_efficiency]
- elsif [HPXML::HVACTypeElectricResistance, HPXML::HVACTypeStove, HPXML::HVACTypePortableHeater, HPXML::HVACTypeFireplace].include?(heating_system_type)
+ elsif [HPXML::HVACTypeElectricResistance, HPXML::HVACTypeStove, HPXML::HVACTypeSpaceHeater, HPXML::HVACTypeFireplace].include?(heating_system_type)
heating_efficiency_percent = args[:heating_system_2_heating_efficiency]
end
@@ -4953,42 +5152,42 @@ def self.set_secondary_heating_systems(hpxml, args)
fraction_heat_load_served = args[:heating_system_2_fraction_heat_load_served]
end
- hpxml.heating_systems.add(id: "HeatingSystem#{hpxml.heating_systems.size + 1}",
- heating_system_type: heating_system_type,
- heating_system_fuel: heating_system_fuel,
- heating_capacity: heating_capacity,
- fraction_heat_load_served: fraction_heat_load_served,
- heating_efficiency_afue: heating_efficiency_afue,
- heating_efficiency_percent: heating_efficiency_percent)
+ hpxml_bldg.heating_systems.add(id: "HeatingSystem#{hpxml_bldg.heating_systems.size + 1}",
+ heating_system_type: heating_system_type,
+ heating_system_fuel: heating_system_fuel,
+ heating_capacity: heating_capacity,
+ fraction_heat_load_served: fraction_heat_load_served,
+ heating_efficiency_afue: heating_efficiency_afue,
+ heating_efficiency_percent: heating_efficiency_percent)
end
- def self.set_hvac_distribution(hpxml, args)
+ def self.set_hvac_distribution(hpxml_bldg, args)
# HydronicDistribution?
- hpxml.heating_systems.each do |heating_system|
+ hpxml_bldg.heating_systems.each do |heating_system|
next unless [heating_system.heating_system_type].include?(HPXML::HVACTypeBoiler)
next if args[:heating_system_type].include?('Fan Coil')
- hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
- distribution_system_type: HPXML::HVACDistributionTypeHydronic,
- hydronic_type: HPXML::HydronicTypeBaseboard)
- heating_system.distribution_system_idref = hpxml.hvac_distributions[-1].id
+ hpxml_bldg.hvac_distributions.add(id: "HVACDistribution#{hpxml_bldg.hvac_distributions.size + 1}",
+ distribution_system_type: HPXML::HVACDistributionTypeHydronic,
+ hydronic_type: HPXML::HydronicTypeBaseboard)
+ heating_system.distribution_system_idref = hpxml_bldg.hvac_distributions[-1].id
end
# AirDistribution?
air_distribution_systems = []
- hpxml.heating_systems.each do |heating_system|
+ hpxml_bldg.heating_systems.each do |heating_system|
if [HPXML::HVACTypeFurnace].include?(heating_system.heating_system_type)
air_distribution_systems << heating_system
end
end
- hpxml.cooling_systems.each do |cooling_system|
+ hpxml_bldg.cooling_systems.each do |cooling_system|
if [HPXML::HVACTypeCentralAirConditioner].include?(cooling_system.cooling_system_type)
air_distribution_systems << cooling_system
elsif [HPXML::HVACTypeEvaporativeCooler, HPXML::HVACTypeMiniSplitAirConditioner].include?(cooling_system.cooling_system_type) && args[:cooling_system_is_ducted]
air_distribution_systems << cooling_system
end
end
- hpxml.heat_pumps.each do |heat_pump|
+ hpxml_bldg.heat_pumps.each do |heat_pump|
if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump.heat_pump_type
air_distribution_systems << heat_pump
elsif [HPXML::HVACTypeHeatPumpMiniSplit].include?(heat_pump.heat_pump_type)
@@ -5000,7 +5199,9 @@ def self.set_hvac_distribution(hpxml, args)
# FanCoil?
fan_coil_distribution_systems = []
- hpxml.heating_systems.each do |heating_system|
+ hpxml_bldg.heating_systems.each do |heating_system|
+ next unless heating_system.primary_system
+
if args[:heating_system_type].include?('Fan Coil')
fan_coil_distribution_systems << heating_system
end
@@ -5012,7 +5213,7 @@ def self.set_hvac_distribution(hpxml, args)
number_of_return_registers = args[:ducts_number_of_return_registers].get
end
- if [HPXML::HVACTypeEvaporativeCooler].include?(args[:cooling_system_type]) && hpxml.heating_systems.size == 0 && hpxml.heat_pumps.size == 0
+ if [HPXML::HVACTypeEvaporativeCooler].include?(args[:cooling_system_type]) && hpxml_bldg.heating_systems.size == 0 && hpxml_bldg.heat_pumps.size == 0
number_of_return_registers = nil
if args[:cooling_system_is_ducted]
number_of_return_registers = 0
@@ -5020,23 +5221,23 @@ def self.set_hvac_distribution(hpxml, args)
end
if air_distribution_systems.size > 0
- hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
- distribution_system_type: HPXML::HVACDistributionTypeAir,
- air_type: HPXML::AirTypeRegularVelocity,
- number_of_return_registers: number_of_return_registers)
+ hpxml_bldg.hvac_distributions.add(id: "HVACDistribution#{hpxml_bldg.hvac_distributions.size + 1}",
+ distribution_system_type: HPXML::HVACDistributionTypeAir,
+ air_type: HPXML::AirTypeRegularVelocity,
+ number_of_return_registers: number_of_return_registers)
air_distribution_systems.each do |hvac_system|
- hvac_system.distribution_system_idref = hpxml.hvac_distributions[-1].id
+ hvac_system.distribution_system_idref = hpxml_bldg.hvac_distributions[-1].id
end
- set_duct_leakages(args, hpxml.hvac_distributions[-1])
- set_ducts(args, hpxml.hvac_distributions[-1])
+ set_duct_leakages(args, hpxml_bldg.hvac_distributions[-1])
+ set_ducts(hpxml_bldg, args, hpxml_bldg.hvac_distributions[-1])
end
if fan_coil_distribution_systems.size > 0
- hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
- distribution_system_type: HPXML::HVACDistributionTypeAir,
- air_type: HPXML::AirTypeFanCoil)
+ hpxml_bldg.hvac_distributions.add(id: "HVACDistribution#{hpxml_bldg.hvac_distributions.size + 1}",
+ distribution_system_type: HPXML::HVACDistributionTypeAir,
+ air_type: HPXML::AirTypeFanCoil)
fan_coil_distribution_systems.each do |hvac_system|
- hvac_system.distribution_system_idref = hpxml.hvac_distributions[-1].id
+ hvac_system.distribution_system_idref = hpxml_bldg.hvac_distributions[-1].id
end
end
end
@@ -5053,23 +5254,74 @@ def self.set_duct_leakages(args, hvac_distribution)
duct_leakage_total_or_to_outside: HPXML::DuctLeakageToOutside)
end
- def self.set_ducts(args, hvac_distribution)
+ def self.get_location(location, foundation_type, attic_type)
+ if location == HPXML::LocationCrawlspace
+ if foundation_type == HPXML::FoundationTypeCrawlspaceUnvented
+ return HPXML::LocationCrawlspaceUnvented
+ elsif foundation_type == HPXML::FoundationTypeCrawlspaceVented
+ return HPXML::LocationCrawlspaceVented
+ elsif foundation_type == HPXML::FoundationTypeCrawlspaceConditioned
+ return HPXML::LocationCrawlspaceConditioned
+ else
+ fail "Specified '#{location}' but foundation type is '#{foundation_type}'."
+ end
+ elsif location == HPXML::LocationAttic
+ if attic_type == HPXML::AtticTypeUnvented
+ return HPXML::LocationAtticUnvented
+ elsif attic_type == HPXML::AtticTypeVented
+ return HPXML::LocationAtticVented
+ elsif attic_type == HPXML::AtticTypeConditioned
+ return HPXML::LocationConditionedSpace
+ else
+ fail "Specified '#{location}' but attic type is '#{attic_type}'."
+ end
+ end
+ return location
+ end
+
+ def self.set_ducts(hpxml_bldg, args, hvac_distribution)
if args[:ducts_supply_location].is_initialized
- ducts_supply_location = args[:ducts_supply_location].get
+ ducts_supply_location = get_location(args[:ducts_supply_location].get, hpxml_bldg.foundations[-1].foundation_type, hpxml_bldg.attics[-1].attic_type)
end
if args[:ducts_return_location].is_initialized
- ducts_return_location = args[:ducts_return_location].get
+ ducts_return_location = get_location(args[:ducts_return_location].get, hpxml_bldg.foundations[-1].foundation_type, hpxml_bldg.attics[-1].attic_type)
end
if args[:ducts_supply_surface_area].is_initialized
ducts_supply_surface_area = args[:ducts_supply_surface_area].get
end
+ if args[:ducts_supply_surface_area_fraction].is_initialized
+ ducts_supply_area_fraction = args[:ducts_supply_surface_area_fraction].get
+ end
+
if args[:ducts_return_surface_area].is_initialized
ducts_return_surface_area = args[:ducts_return_surface_area].get
end
+ if args[:ducts_return_surface_area_fraction].is_initialized
+ ducts_return_area_fraction = args[:ducts_return_surface_area_fraction].get
+ end
+
+ if (not ducts_supply_location.nil?) && ducts_supply_surface_area.nil? && ducts_supply_area_fraction.nil?
+ # Supply duct location without any area inputs provided; set area fraction
+ if ducts_supply_location == HPXML::LocationConditionedSpace
+ ducts_supply_area_fraction = 1.0
+ else
+ ducts_supply_area_fraction = HVAC.get_default_duct_fraction_outside_conditioned_space(args[:geometry_unit_num_floors_above_grade])
+ end
+ end
+
+ if (not ducts_return_location.nil?) && ducts_return_surface_area.nil? && ducts_return_area_fraction.nil?
+ # Return duct location without any area inputs provided; set area fraction
+ if ducts_return_location == HPXML::LocationConditionedSpace
+ ducts_return_area_fraction = 1.0
+ else
+ ducts_return_area_fraction = HVAC.get_default_duct_fraction_outside_conditioned_space(args[:geometry_unit_num_floors_above_grade])
+ end
+ end
+
if args[:ducts_supply_buried_insulation_level].is_initialized
ducts_supply_buried_insulation_level = args[:ducts_supply_buried_insulation_level].get
end
@@ -5083,7 +5335,8 @@ def self.set_ducts(args, hvac_distribution)
duct_insulation_r_value: args[:ducts_supply_insulation_r],
duct_buried_insulation_level: ducts_supply_buried_insulation_level,
duct_location: ducts_supply_location,
- duct_surface_area: ducts_supply_surface_area)
+ duct_surface_area: ducts_supply_surface_area,
+ duct_fraction_area: ducts_supply_area_fraction)
if not ([HPXML::HVACTypeEvaporativeCooler].include?(args[:cooling_system_type]) && args[:cooling_system_is_ducted])
hvac_distribution.ducts.add(id: "Ducts#{hvac_distribution.ducts.size + 1}",
@@ -5091,20 +5344,56 @@ def self.set_ducts(args, hvac_distribution)
duct_insulation_r_value: args[:ducts_return_insulation_r],
duct_buried_insulation_level: ducts_return_buried_insulation_level,
duct_location: ducts_return_location,
- duct_surface_area: ducts_return_surface_area)
+ duct_surface_area: ducts_return_surface_area,
+ duct_fraction_area: ducts_return_area_fraction)
+ end
+
+ if (not ducts_supply_area_fraction.nil?) && (ducts_supply_area_fraction < 1)
+ # OS-HPXML needs duct fractions to sum to 1; add remaining ducts in conditioned space.
+ hvac_distribution.ducts.add(id: "Ducts#{hvac_distribution.ducts.size + 1}",
+ duct_type: HPXML::DuctTypeSupply,
+ duct_insulation_r_value: 0.0,
+ duct_location: HPXML::LocationConditionedSpace,
+ duct_fraction_area: 1.0 - ducts_supply_area_fraction)
+ end
+
+ if not hvac_distribution.ducts.find { |d| d.duct_type == HPXML::DuctTypeReturn }.nil?
+ if (not ducts_return_area_fraction.nil?) && (ducts_return_area_fraction < 1)
+ # OS-HPXML needs duct fractions to sum to 1; add remaining ducts in conditioned space.
+ hvac_distribution.ducts.add(id: "Ducts#{hvac_distribution.ducts.size + 1}",
+ duct_type: HPXML::DuctTypeReturn,
+ duct_insulation_r_value: 0.0,
+ duct_location: HPXML::LocationConditionedSpace,
+ duct_fraction_area: 1.0 - ducts_return_area_fraction)
+ end
end
# If duct surface areas are defaulted, set CFA served
if hvac_distribution.ducts.select { |d| d.duct_surface_area.nil? }.size > 0
- hvac_distribution.conditioned_floor_area_served = args[:geometry_unit_cfa]
+ max_fraction_load_served = 0.0
+ hvac_distribution.hvac_systems.each do |hvac_system|
+ if hvac_system.respond_to?(:fraction_heat_load_served)
+ if hvac_system.is_a?(HPXML::HeatingSystem) && hvac_system.is_heat_pump_backup_system
+ # HP backup system, use HP fraction heat load served
+ fraction_heat_load_served = hvac_system.primary_heat_pump.fraction_heat_load_served
+ else
+ fraction_heat_load_served = hvac_system.fraction_heat_load_served
+ end
+ max_fraction_load_served = [max_fraction_load_served, fraction_heat_load_served].max
+ end
+ if hvac_system.respond_to?(:fraction_cool_load_served)
+ max_fraction_load_served = [max_fraction_load_served, hvac_system.fraction_cool_load_served].max
+ end
+ end
+ hvac_distribution.conditioned_floor_area_served = args[:geometry_unit_cfa] * max_fraction_load_served
end
end
- def self.set_hvac_control(hpxml, args, epw_file, weather)
+ def self.set_hvac_control(hpxml, hpxml_bldg, args, epw_file, weather)
return if (args[:heating_system_type] == 'none') && (args[:cooling_system_type] == 'none') && (args[:heat_pump_type] == 'none')
# Heating
- if hpxml.total_fraction_heat_load_served > 0
+ if hpxml_bldg.total_fraction_heat_load_served > 0
if args[:hvac_control_heating_weekday_setpoint].is_initialized && args[:hvac_control_heating_weekend_setpoint].is_initialized
if args[:hvac_control_heating_weekday_setpoint].get == args[:hvac_control_heating_weekend_setpoint].get && !args[:hvac_control_heating_weekday_setpoint].get.include?(',')
@@ -5133,7 +5422,7 @@ def self.set_hvac_control(hpxml, args, epw_file, weather)
end
# Cooling
- if hpxml.total_fraction_cool_load_served > 0
+ if hpxml_bldg.total_fraction_cool_load_served > 0
if args[:hvac_control_cooling_weekday_setpoint].is_initialized && args[:hvac_control_cooling_weekend_setpoint].is_initialized
if args[:hvac_control_cooling_weekday_setpoint].get == args[:hvac_control_cooling_weekend_setpoint].get && !args[:hvac_control_cooling_weekday_setpoint].get.include?(',')
@@ -5165,25 +5454,25 @@ def self.set_hvac_control(hpxml, args, epw_file, weather)
end
- hpxml.hvac_controls.add(id: "HVACControl#{hpxml.hvac_controls.size + 1}",
- heating_setpoint_temp: heating_setpoint_temp,
- cooling_setpoint_temp: cooling_setpoint_temp,
- weekday_heating_setpoints: weekday_heating_setpoints,
- weekend_heating_setpoints: weekend_heating_setpoints,
- weekday_cooling_setpoints: weekday_cooling_setpoints,
- weekend_cooling_setpoints: weekend_cooling_setpoints,
- ceiling_fan_cooling_setpoint_temp_offset: ceiling_fan_cooling_setpoint_temp_offset,
- seasons_heating_begin_month: seasons_heating_begin_month,
- seasons_heating_begin_day: seasons_heating_begin_day,
- seasons_heating_end_month: seasons_heating_end_month,
- seasons_heating_end_day: seasons_heating_end_day,
- seasons_cooling_begin_month: seasons_cooling_begin_month,
- seasons_cooling_begin_day: seasons_cooling_begin_day,
- seasons_cooling_end_month: seasons_cooling_end_month,
- seasons_cooling_end_day: seasons_cooling_end_day)
+ hpxml_bldg.hvac_controls.add(id: "HVACControl#{hpxml_bldg.hvac_controls.size + 1}",
+ heating_setpoint_temp: heating_setpoint_temp,
+ cooling_setpoint_temp: cooling_setpoint_temp,
+ weekday_heating_setpoints: weekday_heating_setpoints,
+ weekend_heating_setpoints: weekend_heating_setpoints,
+ weekday_cooling_setpoints: weekday_cooling_setpoints,
+ weekend_cooling_setpoints: weekend_cooling_setpoints,
+ ceiling_fan_cooling_setpoint_temp_offset: ceiling_fan_cooling_setpoint_temp_offset,
+ seasons_heating_begin_month: seasons_heating_begin_month,
+ seasons_heating_begin_day: seasons_heating_begin_day,
+ seasons_heating_end_month: seasons_heating_end_month,
+ seasons_heating_end_day: seasons_heating_end_day,
+ seasons_cooling_begin_month: seasons_cooling_begin_month,
+ seasons_cooling_begin_day: seasons_cooling_begin_day,
+ seasons_cooling_end_month: seasons_cooling_end_month,
+ seasons_cooling_end_day: seasons_cooling_end_day)
end
- def self.set_ventilation_fans(hpxml, args)
+ def self.set_ventilation_fans(hpxml_bldg, args)
if args[:mech_vent_fan_type] != 'none'
if [HPXML::MechVentTypeERV].include?(args[:mech_vent_fan_type])
@@ -5204,7 +5493,7 @@ def self.set_ventilation_fans(hpxml, args)
distribution_system_idref = nil
if args[:mech_vent_fan_type] == HPXML::MechVentTypeCFIS
- hpxml.hvac_distributions.each do |hvac_distribution|
+ hpxml_bldg.hvac_distributions.each do |hvac_distribution|
next unless hvac_distribution.distribution_system_type == HPXML::HVACDistributionTypeAir
next if hvac_distribution.air_type != HPXML::AirTypeRegularVelocity
@@ -5241,27 +5530,27 @@ def self.set_ventilation_fans(hpxml, args)
rated_flow_rate = args[:mech_vent_flow_rate].get
end
- hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
- fan_type: args[:mech_vent_fan_type],
- cfis_addtl_runtime_operating_mode: cfis_addtl_runtime_operating_mode,
- rated_flow_rate: rated_flow_rate,
- hours_in_operation: hours_in_operation,
- used_for_whole_building_ventilation: true,
- total_recovery_efficiency: total_recovery_efficiency,
- total_recovery_efficiency_adjusted: total_recovery_efficiency_adjusted,
- sensible_recovery_efficiency: sensible_recovery_efficiency,
- sensible_recovery_efficiency_adjusted: sensible_recovery_efficiency_adjusted,
- fan_power: fan_power,
- distribution_system_idref: distribution_system_idref,
- is_shared_system: is_shared_system,
- in_unit_flow_rate: in_unit_flow_rate,
- fraction_recirculation: fraction_recirculation,
- preheating_fuel: preheating_fuel,
- preheating_efficiency_cop: preheating_efficiency_cop,
- preheating_fraction_load_served: preheating_fraction_load_served,
- precooling_fuel: precooling_fuel,
- precooling_efficiency_cop: precooling_efficiency_cop,
- precooling_fraction_load_served: precooling_fraction_load_served)
+ hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
+ fan_type: args[:mech_vent_fan_type],
+ cfis_addtl_runtime_operating_mode: cfis_addtl_runtime_operating_mode,
+ rated_flow_rate: rated_flow_rate,
+ hours_in_operation: hours_in_operation,
+ used_for_whole_building_ventilation: true,
+ total_recovery_efficiency: total_recovery_efficiency,
+ total_recovery_efficiency_adjusted: total_recovery_efficiency_adjusted,
+ sensible_recovery_efficiency: sensible_recovery_efficiency,
+ sensible_recovery_efficiency_adjusted: sensible_recovery_efficiency_adjusted,
+ fan_power: fan_power,
+ distribution_system_idref: distribution_system_idref,
+ is_shared_system: is_shared_system,
+ in_unit_flow_rate: in_unit_flow_rate,
+ fraction_recirculation: fraction_recirculation,
+ preheating_fuel: preheating_fuel,
+ preheating_efficiency_cop: preheating_efficiency_cop,
+ preheating_fraction_load_served: preheating_fraction_load_served,
+ precooling_fuel: precooling_fuel,
+ precooling_efficiency_cop: precooling_efficiency_cop,
+ precooling_fraction_load_served: precooling_fraction_load_served)
end
if args[:mech_vent_2_fan_type] != 'none'
@@ -5286,16 +5575,16 @@ def self.set_ventilation_fans(hpxml, args)
hours_in_operation = args[:mech_vent_2_hours_in_operation]
fan_power = args[:mech_vent_2_fan_power]
- hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
- fan_type: args[:mech_vent_2_fan_type],
- rated_flow_rate: args[:mech_vent_2_flow_rate],
- hours_in_operation: hours_in_operation,
- used_for_whole_building_ventilation: true,
- total_recovery_efficiency: total_recovery_efficiency,
- total_recovery_efficiency_adjusted: total_recovery_efficiency_adjusted,
- sensible_recovery_efficiency: sensible_recovery_efficiency,
- sensible_recovery_efficiency_adjusted: sensible_recovery_efficiency_adjusted,
- fan_power: fan_power)
+ hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
+ fan_type: args[:mech_vent_2_fan_type],
+ rated_flow_rate: args[:mech_vent_2_flow_rate],
+ hours_in_operation: hours_in_operation,
+ used_for_whole_building_ventilation: true,
+ total_recovery_efficiency: total_recovery_efficiency,
+ total_recovery_efficiency_adjusted: total_recovery_efficiency_adjusted,
+ sensible_recovery_efficiency: sensible_recovery_efficiency,
+ sensible_recovery_efficiency_adjusted: sensible_recovery_efficiency_adjusted,
+ fan_power: fan_power)
end
if !args[:kitchen_fans_quantity].is_initialized || (args[:kitchen_fans_quantity].get > 0)
@@ -5319,14 +5608,14 @@ def self.set_ventilation_fans(hpxml, args)
quantity = args[:kitchen_fans_quantity].get
end
- hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
- rated_flow_rate: rated_flow_rate,
- used_for_local_ventilation: true,
- hours_in_operation: hours_in_operation,
- fan_location: HPXML::LocationKitchen,
- fan_power: fan_power,
- start_hour: start_hour,
- count: quantity)
+ hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
+ rated_flow_rate: rated_flow_rate,
+ used_for_local_ventilation: true,
+ hours_in_operation: hours_in_operation,
+ fan_location: HPXML::LocationKitchen,
+ fan_power: fan_power,
+ start_hour: start_hour,
+ count: quantity)
end
if !args[:bathroom_fans_quantity].is_initialized || (args[:bathroom_fans_quantity].get > 0)
@@ -5350,14 +5639,14 @@ def self.set_ventilation_fans(hpxml, args)
quantity = args[:bathroom_fans_quantity].get
end
- hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
- rated_flow_rate: rated_flow_rate,
- used_for_local_ventilation: true,
- hours_in_operation: hours_in_operation,
- fan_location: HPXML::LocationBath,
- fan_power: fan_power,
- start_hour: start_hour,
- count: quantity)
+ hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
+ rated_flow_rate: rated_flow_rate,
+ used_for_local_ventilation: true,
+ hours_in_operation: hours_in_operation,
+ fan_location: HPXML::LocationBath,
+ fan_power: fan_power,
+ start_hour: start_hour,
+ count: quantity)
end
if args[:whole_house_fan_present]
@@ -5369,14 +5658,14 @@ def self.set_ventilation_fans(hpxml, args)
fan_power = args[:whole_house_fan_power].get
end
- hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
- rated_flow_rate: rated_flow_rate,
- used_for_seasonal_cooling_load_reduction: true,
- fan_power: fan_power)
+ hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
+ rated_flow_rate: rated_flow_rate,
+ used_for_seasonal_cooling_load_reduction: true,
+ fan_power: fan_power)
end
end
- def self.set_water_heating_systems(hpxml, args)
+ def self.set_water_heating_systems(hpxml_bldg, args)
water_heater_type = args[:water_heater_type]
return if water_heater_type == 'none'
@@ -5387,7 +5676,7 @@ def self.set_water_heating_systems(hpxml, args)
end
if args[:water_heater_location].is_initialized
- location = args[:water_heater_location].get
+ location = get_location(args[:water_heater_location].get, hpxml_bldg.foundations[-1].foundation_type, hpxml_bldg.attics[-1].attic_type)
end
if args[:water_heater_tank_volume].is_initialized
@@ -5426,8 +5715,8 @@ def self.set_water_heating_systems(hpxml, args)
fuel_type = nil
heating_capacity = nil
energy_factor = nil
- if hpxml.heating_systems.size > 0
- related_hvac_idref = hpxml.heating_systems[0].id
+ if hpxml_bldg.heating_systems.size > 0
+ related_hvac_idref = hpxml_bldg.heating_systems[0].id
end
end
@@ -5456,13 +5745,13 @@ def self.set_water_heating_systems(hpxml, args)
uses_desuperheater = args[:water_heater_uses_desuperheater].get
if uses_desuperheater
related_hvac_idref = nil
- hpxml.cooling_systems.each do |cooling_system|
+ hpxml_bldg.cooling_systems.each do |cooling_system|
next unless [HPXML::HVACTypeCentralAirConditioner,
HPXML::HVACTypeMiniSplitAirConditioner].include? cooling_system.cooling_system_type
related_hvac_idref = cooling_system.id
end
- hpxml.heat_pumps.each do |heat_pump|
+ hpxml_bldg.heat_pumps.each do |heat_pump|
next unless [HPXML::HVACTypeHeatPumpAirToAir,
HPXML::HVACTypeHeatPumpMiniSplit,
HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump.heat_pump_type
@@ -5486,30 +5775,30 @@ def self.set_water_heating_systems(hpxml, args)
end
end
- hpxml.water_heating_systems.add(id: "WaterHeatingSystem#{hpxml.water_heating_systems.size + 1}",
- water_heater_type: water_heater_type,
- fuel_type: fuel_type,
- location: location,
- tank_volume: tank_volume,
- fraction_dhw_load_served: 1.0,
- energy_factor: energy_factor,
- uniform_energy_factor: uniform_energy_factor,
- usage_bin: usage_bin,
- recovery_efficiency: recovery_efficiency,
- uses_desuperheater: uses_desuperheater,
- related_hvac_idref: related_hvac_idref,
- standby_loss_units: standby_loss_units,
- standby_loss_value: standby_loss_value,
- jacket_r_value: jacket_r_value,
- temperature: temperature,
- heating_capacity: heating_capacity,
- is_shared_system: is_shared_system,
- number_of_units_served: number_of_units_served,
- tank_model_type: tank_model_type,
- operating_mode: operating_mode)
+ hpxml_bldg.water_heating_systems.add(id: "WaterHeatingSystem#{hpxml_bldg.water_heating_systems.size + 1}",
+ water_heater_type: water_heater_type,
+ fuel_type: fuel_type,
+ location: location,
+ tank_volume: tank_volume,
+ fraction_dhw_load_served: 1.0,
+ energy_factor: energy_factor,
+ uniform_energy_factor: uniform_energy_factor,
+ usage_bin: usage_bin,
+ recovery_efficiency: recovery_efficiency,
+ uses_desuperheater: uses_desuperheater,
+ related_hvac_idref: related_hvac_idref,
+ standby_loss_units: standby_loss_units,
+ standby_loss_value: standby_loss_value,
+ jacket_r_value: jacket_r_value,
+ temperature: temperature,
+ heating_capacity: heating_capacity,
+ is_shared_system: is_shared_system,
+ number_of_units_served: number_of_units_served,
+ tank_model_type: tank_model_type,
+ operating_mode: operating_mode)
end
- def self.set_hot_water_distribution(hpxml, args)
+ def self.set_hot_water_distribution(hpxml_bldg, args)
return if args[:water_heater_type] == 'none'
if args[:dwhr_facilities_connected] != 'none'
@@ -5548,36 +5837,36 @@ def self.set_hot_water_distribution(hpxml, args)
pipe_r_value = args[:hot_water_distribution_pipe_r].get
end
- hpxml.hot_water_distributions.add(id: "HotWaterDistribution#{hpxml.hot_water_distributions.size + 1}",
- system_type: args[:hot_water_distribution_system_type],
- standard_piping_length: standard_piping_length,
- recirculation_control_type: recirculation_control_type,
- recirculation_piping_length: recirculation_piping_length,
- recirculation_branch_piping_length: recirculation_branch_piping_length,
- recirculation_pump_power: recirculation_pump_power,
- pipe_r_value: pipe_r_value,
- dwhr_facilities_connected: dwhr_facilities_connected,
- dwhr_equal_flow: dwhr_equal_flow,
- dwhr_efficiency: dwhr_efficiency)
+ hpxml_bldg.hot_water_distributions.add(id: "HotWaterDistribution#{hpxml_bldg.hot_water_distributions.size + 1}",
+ system_type: args[:hot_water_distribution_system_type],
+ standard_piping_length: standard_piping_length,
+ recirculation_control_type: recirculation_control_type,
+ recirculation_piping_length: recirculation_piping_length,
+ recirculation_branch_piping_length: recirculation_branch_piping_length,
+ recirculation_pump_power: recirculation_pump_power,
+ pipe_r_value: pipe_r_value,
+ dwhr_facilities_connected: dwhr_facilities_connected,
+ dwhr_equal_flow: dwhr_equal_flow,
+ dwhr_efficiency: dwhr_efficiency)
end
- def self.set_water_fixtures(hpxml, args)
+ def self.set_water_fixtures(hpxml_bldg, args)
return if args[:water_heater_type] == 'none'
- hpxml.water_fixtures.add(id: "WaterFixture#{hpxml.water_fixtures.size + 1}",
- water_fixture_type: HPXML::WaterFixtureTypeShowerhead,
- low_flow: args[:water_fixtures_shower_low_flow])
+ hpxml_bldg.water_fixtures.add(id: "WaterFixture#{hpxml_bldg.water_fixtures.size + 1}",
+ water_fixture_type: HPXML::WaterFixtureTypeShowerhead,
+ low_flow: args[:water_fixtures_shower_low_flow])
- hpxml.water_fixtures.add(id: "WaterFixture#{hpxml.water_fixtures.size + 1}",
- water_fixture_type: HPXML::WaterFixtureTypeFaucet,
- low_flow: args[:water_fixtures_sink_low_flow])
+ hpxml_bldg.water_fixtures.add(id: "WaterFixture#{hpxml_bldg.water_fixtures.size + 1}",
+ water_fixture_type: HPXML::WaterFixtureTypeFaucet,
+ low_flow: args[:water_fixtures_sink_low_flow])
if args[:water_fixtures_usage_multiplier].is_initialized
- hpxml.water_heating.water_fixtures_usage_multiplier = args[:water_fixtures_usage_multiplier].get
+ hpxml_bldg.water_heating.water_fixtures_usage_multiplier = args[:water_fixtures_usage_multiplier].get
end
end
- def self.set_solar_thermal(hpxml, args, epw_file)
+ def self.set_solar_thermal(hpxml_bldg, args, epw_file)
return if args[:solar_thermal_system_type] == 'none'
if args[:solar_thermal_solar_fraction] > 0
@@ -5596,25 +5885,25 @@ def self.set_solar_thermal(hpxml, args, epw_file)
end
end
- if hpxml.water_heating_systems.size == 0
+ if hpxml_bldg.water_heating_systems.size == 0
fail 'Solar thermal system specified but no water heater found.'
end
- hpxml.solar_thermal_systems.add(id: "SolarThermalSystem#{hpxml.solar_thermal_systems.size + 1}",
- system_type: args[:solar_thermal_system_type],
- collector_area: collector_area,
- collector_loop_type: collector_loop_type,
- collector_type: collector_type,
- collector_azimuth: collector_azimuth,
- collector_tilt: collector_tilt,
- collector_frta: collector_frta,
- collector_frul: collector_frul,
- storage_volume: storage_volume,
- water_heating_system_idref: hpxml.water_heating_systems[0].id,
- solar_fraction: solar_fraction)
+ hpxml_bldg.solar_thermal_systems.add(id: "SolarThermalSystem#{hpxml_bldg.solar_thermal_systems.size + 1}",
+ system_type: args[:solar_thermal_system_type],
+ collector_area: collector_area,
+ collector_loop_type: collector_loop_type,
+ collector_type: collector_type,
+ collector_azimuth: collector_azimuth,
+ collector_tilt: collector_tilt,
+ collector_frta: collector_frta,
+ collector_frul: collector_frul,
+ storage_volume: storage_volume,
+ water_heating_system_idref: hpxml_bldg.water_heating_systems[0].id,
+ solar_fraction: solar_fraction)
end
- def self.set_pv_systems(hpxml, args, epw_file)
+ def self.set_pv_systems(hpxml_bldg, args, epw_file)
[args[:pv_system_present], args[:pv_system_2_present]].each_with_index do |pv_system_present, i|
next unless pv_system_present
@@ -5643,36 +5932,36 @@ def self.set_pv_systems(hpxml, args, epw_file)
end
end
- hpxml.pv_systems.add(id: "PVSystem#{hpxml.pv_systems.size + 1}",
- location: location,
- module_type: module_type,
- tracking: tracking,
- array_azimuth: [args[:pv_system_array_azimuth], args[:pv_system_2_array_azimuth]][i],
- array_tilt: Geometry.get_absolute_tilt([args[:pv_system_array_tilt], args[:pv_system_2_array_tilt]][i], args[:geometry_roof_pitch], epw_file),
- max_power_output: max_power_output,
- system_losses_fraction: system_losses_fraction,
- is_shared_system: is_shared_system,
- number_of_bedrooms_served: number_of_bedrooms_served)
+ hpxml_bldg.pv_systems.add(id: "PVSystem#{hpxml_bldg.pv_systems.size + 1}",
+ location: location,
+ module_type: module_type,
+ tracking: tracking,
+ array_azimuth: [args[:pv_system_array_azimuth], args[:pv_system_2_array_azimuth]][i],
+ array_tilt: Geometry.get_absolute_tilt([args[:pv_system_array_tilt], args[:pv_system_2_array_tilt]][i], args[:geometry_roof_pitch], epw_file),
+ max_power_output: max_power_output,
+ system_losses_fraction: system_losses_fraction,
+ is_shared_system: is_shared_system,
+ number_of_bedrooms_served: number_of_bedrooms_served)
end
- if hpxml.pv_systems.size > 0
+ if hpxml_bldg.pv_systems.size > 0
# Add inverter efficiency; assume a single inverter even if multiple PV arrays
if args[:pv_system_inverter_efficiency].is_initialized
inverter_efficiency = args[:pv_system_inverter_efficiency].get
end
- hpxml.inverters.add(id: "Inverter#{hpxml.inverters.size + 1}",
- inverter_efficiency: inverter_efficiency)
- hpxml.pv_systems.each do |pv_system|
- pv_system.inverter_idref = hpxml.inverters[-1].id
+ hpxml_bldg.inverters.add(id: "Inverter#{hpxml_bldg.inverters.size + 1}",
+ inverter_efficiency: inverter_efficiency)
+ hpxml_bldg.pv_systems.each do |pv_system|
+ pv_system.inverter_idref = hpxml_bldg.inverters[-1].id
end
end
end
- def self.set_battery(hpxml, args)
+ def self.set_battery(hpxml_bldg, args)
return unless args[:battery_present]
if args[:battery_location].is_initialized
- location = args[:battery_location].get
+ location = get_location(args[:battery_location].get, hpxml_bldg.foundations[-1].foundation_type, hpxml_bldg.attics[-1].attic_type)
end
if args[:battery_power].is_initialized
@@ -5691,16 +5980,16 @@ def self.set_battery(hpxml, args)
round_trip_efficiency = args[:battery_round_trip_efficiency].get
end
- hpxml.batteries.add(id: "Battery#{hpxml.batteries.size + 1}",
- type: HPXML::BatteryTypeLithiumIon,
- location: location,
- rated_power_output: rated_power_output,
- nominal_capacity_kwh: nominal_capacity_kwh,
- usable_capacity_kwh: usable_capacity_kwh,
- round_trip_efficiency: round_trip_efficiency)
+ hpxml_bldg.batteries.add(id: "Battery#{hpxml_bldg.batteries.size + 1}",
+ type: HPXML::BatteryTypeLithiumIon,
+ location: location,
+ rated_power_output: rated_power_output,
+ nominal_capacity_kwh: nominal_capacity_kwh,
+ usable_capacity_kwh: usable_capacity_kwh,
+ round_trip_efficiency: round_trip_efficiency)
end
- def self.set_lighting(hpxml, args)
+ def self.set_lighting(hpxml_bldg, args)
if args[:lighting_present]
has_garage = (args[:geometry_garage_width] * args[:geometry_garage_depth] > 0)
@@ -5709,19 +5998,19 @@ def self.set_lighting(hpxml, args)
interior_usage_multiplier = args[:lighting_interior_usage_multiplier].get
end
if interior_usage_multiplier.nil? || interior_usage_multiplier.to_f > 0
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
- location: HPXML::LocationInterior,
- fraction_of_units_in_location: args[:lighting_interior_fraction_cfl],
- lighting_type: HPXML::LightingTypeCFL)
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
- location: HPXML::LocationInterior,
- fraction_of_units_in_location: args[:lighting_interior_fraction_lfl],
- lighting_type: HPXML::LightingTypeLFL)
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
- location: HPXML::LocationInterior,
- fraction_of_units_in_location: args[:lighting_interior_fraction_led],
- lighting_type: HPXML::LightingTypeLED)
- hpxml.lighting.interior_usage_multiplier = interior_usage_multiplier
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
+ location: HPXML::LocationInterior,
+ fraction_of_units_in_location: args[:lighting_interior_fraction_cfl],
+ lighting_type: HPXML::LightingTypeCFL)
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
+ location: HPXML::LocationInterior,
+ fraction_of_units_in_location: args[:lighting_interior_fraction_lfl],
+ lighting_type: HPXML::LightingTypeLFL)
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
+ location: HPXML::LocationInterior,
+ fraction_of_units_in_location: args[:lighting_interior_fraction_led],
+ lighting_type: HPXML::LightingTypeLED)
+ hpxml_bldg.lighting.interior_usage_multiplier = interior_usage_multiplier
end
# Exterior
@@ -5729,19 +6018,19 @@ def self.set_lighting(hpxml, args)
exterior_usage_multiplier = args[:lighting_exterior_usage_multiplier].get
end
if exterior_usage_multiplier.nil? || exterior_usage_multiplier.to_f > 0
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
- location: HPXML::LocationExterior,
- fraction_of_units_in_location: args[:lighting_exterior_fraction_cfl],
- lighting_type: HPXML::LightingTypeCFL)
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
- location: HPXML::LocationExterior,
- fraction_of_units_in_location: args[:lighting_exterior_fraction_lfl],
- lighting_type: HPXML::LightingTypeLFL)
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
- location: HPXML::LocationExterior,
- fraction_of_units_in_location: args[:lighting_exterior_fraction_led],
- lighting_type: HPXML::LightingTypeLED)
- hpxml.lighting.exterior_usage_multiplier = exterior_usage_multiplier
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
+ location: HPXML::LocationExterior,
+ fraction_of_units_in_location: args[:lighting_exterior_fraction_cfl],
+ lighting_type: HPXML::LightingTypeCFL)
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
+ location: HPXML::LocationExterior,
+ fraction_of_units_in_location: args[:lighting_exterior_fraction_lfl],
+ lighting_type: HPXML::LightingTypeLFL)
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
+ location: HPXML::LocationExterior,
+ fraction_of_units_in_location: args[:lighting_exterior_fraction_led],
+ lighting_type: HPXML::LightingTypeLED)
+ hpxml_bldg.lighting.exterior_usage_multiplier = exterior_usage_multiplier
end
# Garage
@@ -5750,41 +6039,41 @@ def self.set_lighting(hpxml, args)
garage_usage_multiplier = args[:lighting_garage_usage_multiplier].get
end
if garage_usage_multiplier.nil? || garage_usage_multiplier.to_f > 0
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
- location: HPXML::LocationGarage,
- fraction_of_units_in_location: args[:lighting_garage_fraction_cfl],
- lighting_type: HPXML::LightingTypeCFL)
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
- location: HPXML::LocationGarage,
- fraction_of_units_in_location: args[:lighting_garage_fraction_lfl],
- lighting_type: HPXML::LightingTypeLFL)
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
- location: HPXML::LocationGarage,
- fraction_of_units_in_location: args[:lighting_garage_fraction_led],
- lighting_type: HPXML::LightingTypeLED)
- hpxml.lighting.garage_usage_multiplier = garage_usage_multiplier
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
+ location: HPXML::LocationGarage,
+ fraction_of_units_in_location: args[:lighting_garage_fraction_cfl],
+ lighting_type: HPXML::LightingTypeCFL)
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
+ location: HPXML::LocationGarage,
+ fraction_of_units_in_location: args[:lighting_garage_fraction_lfl],
+ lighting_type: HPXML::LightingTypeLFL)
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
+ location: HPXML::LocationGarage,
+ fraction_of_units_in_location: args[:lighting_garage_fraction_led],
+ lighting_type: HPXML::LightingTypeLED)
+ hpxml_bldg.lighting.garage_usage_multiplier = garage_usage_multiplier
end
end
end
return unless args[:holiday_lighting_present]
- hpxml.lighting.holiday_exists = true
+ hpxml_bldg.lighting.holiday_exists = true
if args[:holiday_lighting_daily_kwh].is_initialized
- hpxml.lighting.holiday_kwh_per_day = args[:holiday_lighting_daily_kwh].get
+ hpxml_bldg.lighting.holiday_kwh_per_day = args[:holiday_lighting_daily_kwh].get
end
if args[:holiday_lighting_period].is_initialized
begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:holiday_lighting_period].get)
- hpxml.lighting.holiday_period_begin_month = begin_month
- hpxml.lighting.holiday_period_begin_day = begin_day
- hpxml.lighting.holiday_period_end_month = end_month
- hpxml.lighting.holiday_period_end_day = end_day
+ hpxml_bldg.lighting.holiday_period_begin_month = begin_month
+ hpxml_bldg.lighting.holiday_period_begin_day = begin_day
+ hpxml_bldg.lighting.holiday_period_end_month = end_month
+ hpxml_bldg.lighting.holiday_period_end_day = end_day
end
end
- def self.set_dehumidifier(hpxml, args)
+ def self.set_dehumidifier(hpxml_bldg, args)
return if args[:dehumidifier_type] == 'none'
if args[:dehumidifier_efficiency_type] == 'EnergyFactor'
@@ -5793,17 +6082,17 @@ def self.set_dehumidifier(hpxml, args)
integrated_energy_factor = args[:dehumidifier_efficiency]
end
- hpxml.dehumidifiers.add(id: "Dehumidifier#{hpxml.dehumidifiers.size + 1}",
- type: args[:dehumidifier_type],
- capacity: args[:dehumidifier_capacity],
- energy_factor: energy_factor,
- integrated_energy_factor: integrated_energy_factor,
- rh_setpoint: args[:dehumidifier_rh_setpoint],
- fraction_served: args[:dehumidifier_fraction_dehumidification_load_served],
- location: HPXML::LocationLivingSpace)
+ hpxml_bldg.dehumidifiers.add(id: "Dehumidifier#{hpxml_bldg.dehumidifiers.size + 1}",
+ type: args[:dehumidifier_type],
+ capacity: args[:dehumidifier_capacity],
+ energy_factor: energy_factor,
+ integrated_energy_factor: integrated_energy_factor,
+ rh_setpoint: args[:dehumidifier_rh_setpoint],
+ fraction_served: args[:dehumidifier_fraction_dehumidification_load_served],
+ location: HPXML::LocationConditionedSpace)
end
- def self.set_clothes_washer(hpxml, args)
+ def self.set_clothes_washer(hpxml_bldg, args)
return if args[:water_heater_type] == 'none'
return unless args[:clothes_washer_present]
@@ -5847,20 +6136,20 @@ def self.set_clothes_washer(hpxml, args)
usage_multiplier = args[:clothes_washer_usage_multiplier].get
end
- hpxml.clothes_washers.add(id: "ClothesWasher#{hpxml.clothes_washers.size + 1}",
- location: location,
- modified_energy_factor: modified_energy_factor,
- integrated_modified_energy_factor: integrated_modified_energy_factor,
- rated_annual_kwh: rated_annual_kwh,
- label_electric_rate: label_electric_rate,
- label_gas_rate: label_gas_rate,
- label_annual_gas_cost: label_annual_gas_cost,
- label_usage: label_usage,
- capacity: capacity,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.clothes_washers.add(id: "ClothesWasher#{hpxml_bldg.clothes_washers.size + 1}",
+ location: location,
+ modified_energy_factor: modified_energy_factor,
+ integrated_modified_energy_factor: integrated_modified_energy_factor,
+ rated_annual_kwh: rated_annual_kwh,
+ label_electric_rate: label_electric_rate,
+ label_gas_rate: label_gas_rate,
+ label_annual_gas_cost: label_annual_gas_cost,
+ label_usage: label_usage,
+ capacity: capacity,
+ usage_multiplier: usage_multiplier)
end
- def self.set_clothes_dryer(hpxml, args)
+ def self.set_clothes_dryer(hpxml_bldg, args)
return if args[:water_heater_type] == 'none'
return unless args[:clothes_washer_present]
return unless args[:clothes_dryer_present]
@@ -5889,17 +6178,17 @@ def self.set_clothes_dryer(hpxml, args)
usage_multiplier = args[:clothes_dryer_usage_multiplier].get
end
- hpxml.clothes_dryers.add(id: "ClothesDryer#{hpxml.clothes_dryers.size + 1}",
- location: location,
- fuel_type: args[:clothes_dryer_fuel_type],
- energy_factor: energy_factor,
- combined_energy_factor: combined_energy_factor,
- is_vented: is_vented,
- vented_flow_rate: vented_flow_rate,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.clothes_dryers.add(id: "ClothesDryer#{hpxml_bldg.clothes_dryers.size + 1}",
+ location: location,
+ fuel_type: args[:clothes_dryer_fuel_type],
+ energy_factor: energy_factor,
+ combined_energy_factor: combined_energy_factor,
+ is_vented: is_vented,
+ vented_flow_rate: vented_flow_rate,
+ usage_multiplier: usage_multiplier)
end
- def self.set_dishwasher(hpxml, args)
+ def self.set_dishwasher(hpxml_bldg, args)
return if args[:water_heater_type] == 'none'
return unless args[:dishwasher_present]
@@ -5941,19 +6230,19 @@ def self.set_dishwasher(hpxml, args)
usage_multiplier = args[:dishwasher_usage_multiplier].get
end
- hpxml.dishwashers.add(id: "Dishwasher#{hpxml.dishwashers.size + 1}",
- location: location,
- rated_annual_kwh: rated_annual_kwh,
- energy_factor: energy_factor,
- label_electric_rate: label_electric_rate,
- label_gas_rate: label_gas_rate,
- label_annual_gas_cost: label_annual_gas_cost,
- label_usage: label_usage,
- place_setting_capacity: place_setting_capacity,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.dishwashers.add(id: "Dishwasher#{hpxml_bldg.dishwashers.size + 1}",
+ location: location,
+ rated_annual_kwh: rated_annual_kwh,
+ energy_factor: energy_factor,
+ label_electric_rate: label_electric_rate,
+ label_gas_rate: label_gas_rate,
+ label_annual_gas_cost: label_annual_gas_cost,
+ label_usage: label_usage,
+ place_setting_capacity: place_setting_capacity,
+ usage_multiplier: usage_multiplier)
end
- def self.set_refrigerator(hpxml, args)
+ def self.set_refrigerator(hpxml_bldg, args)
return unless args[:refrigerator_present]
if args[:refrigerator_rated_annual_kwh].is_initialized
@@ -5968,14 +6257,14 @@ def self.set_refrigerator(hpxml, args)
usage_multiplier = args[:refrigerator_usage_multiplier].get
end
- hpxml.refrigerators.add(id: "Refrigerator#{hpxml.refrigerators.size + 1}",
- location: location,
- rated_annual_kwh: rated_annual_kwh,
- primary_indicator: true,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.refrigerators.add(id: "Refrigerator#{hpxml_bldg.refrigerators.size + 1}",
+ location: location,
+ rated_annual_kwh: rated_annual_kwh,
+ primary_indicator: true,
+ usage_multiplier: usage_multiplier)
end
- def self.set_extra_refrigerator(hpxml, args)
+ def self.set_extra_refrigerator(hpxml_bldg, args)
return unless args[:extra_refrigerator_present]
if args[:extra_refrigerator_rated_annual_kwh].is_initialized
@@ -5990,14 +6279,14 @@ def self.set_extra_refrigerator(hpxml, args)
usage_multiplier = args[:extra_refrigerator_usage_multiplier].get
end
- hpxml.refrigerators.add(id: "Refrigerator#{hpxml.refrigerators.size + 1}",
- location: location,
- rated_annual_kwh: rated_annual_kwh,
- primary_indicator: false,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.refrigerators.add(id: "Refrigerator#{hpxml_bldg.refrigerators.size + 1}",
+ location: location,
+ rated_annual_kwh: rated_annual_kwh,
+ primary_indicator: false,
+ usage_multiplier: usage_multiplier)
end
- def self.set_freezer(hpxml, args)
+ def self.set_freezer(hpxml_bldg, args)
return unless args[:freezer_present]
if args[:freezer_rated_annual_kwh].is_initialized
@@ -6012,13 +6301,13 @@ def self.set_freezer(hpxml, args)
usage_multiplier = args[:freezer_usage_multiplier].get
end
- hpxml.freezers.add(id: "Freezer#{hpxml.freezers.size + 1}",
- location: location,
- rated_annual_kwh: rated_annual_kwh,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.freezers.add(id: "Freezer#{hpxml_bldg.freezers.size + 1}",
+ location: location,
+ rated_annual_kwh: rated_annual_kwh,
+ usage_multiplier: usage_multiplier)
end
- def self.set_cooking_range_oven(hpxml, args)
+ def self.set_cooking_range_oven(hpxml_bldg, args)
return unless args[:cooking_range_oven_present]
if args[:cooking_range_oven_location].is_initialized
@@ -6033,21 +6322,21 @@ def self.set_cooking_range_oven(hpxml, args)
usage_multiplier = args[:cooking_range_oven_usage_multiplier].get
end
- hpxml.cooking_ranges.add(id: "CookingRange#{hpxml.cooking_ranges.size + 1}",
- location: location,
- fuel_type: args[:cooking_range_oven_fuel_type],
- is_induction: is_induction,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.cooking_ranges.add(id: "CookingRange#{hpxml_bldg.cooking_ranges.size + 1}",
+ location: location,
+ fuel_type: args[:cooking_range_oven_fuel_type],
+ is_induction: is_induction,
+ usage_multiplier: usage_multiplier)
if args[:cooking_range_oven_is_convection].is_initialized
is_convection = args[:cooking_range_oven_is_convection].get
end
- hpxml.ovens.add(id: "Oven#{hpxml.ovens.size + 1}",
- is_convection: is_convection)
+ hpxml_bldg.ovens.add(id: "Oven#{hpxml_bldg.ovens.size + 1}",
+ is_convection: is_convection)
end
- def self.set_ceiling_fans(hpxml, args)
+ def self.set_ceiling_fans(hpxml_bldg, args)
return unless args[:ceiling_fan_present]
if args[:ceiling_fan_efficiency].is_initialized
@@ -6058,12 +6347,12 @@ def self.set_ceiling_fans(hpxml, args)
quantity = args[:ceiling_fan_quantity].get
end
- hpxml.ceiling_fans.add(id: "CeilingFan#{hpxml.ceiling_fans.size + 1}",
- efficiency: efficiency,
- count: quantity)
+ hpxml_bldg.ceiling_fans.add(id: "CeilingFan#{hpxml_bldg.ceiling_fans.size + 1}",
+ efficiency: efficiency,
+ count: quantity)
end
- def self.set_misc_plug_loads_television(hpxml, args)
+ def self.set_misc_plug_loads_television(hpxml_bldg, args)
return unless args[:misc_plug_loads_television_present]
if args[:misc_plug_loads_television_annual_kwh].is_initialized
@@ -6074,13 +6363,13 @@ def self.set_misc_plug_loads_television(hpxml, args)
usage_multiplier = args[:misc_plug_loads_television_usage_multiplier].get
end
- hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
- plug_load_type: HPXML::PlugLoadTypeTelevision,
- kwh_per_year: kwh_per_year,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}",
+ plug_load_type: HPXML::PlugLoadTypeTelevision,
+ kwh_per_year: kwh_per_year,
+ usage_multiplier: usage_multiplier)
end
- def self.set_misc_plug_loads_other(hpxml, args)
+ def self.set_misc_plug_loads_other(hpxml_bldg, args)
if args[:misc_plug_loads_other_annual_kwh].is_initialized
kwh_per_year = args[:misc_plug_loads_other_annual_kwh].get
end
@@ -6097,15 +6386,15 @@ def self.set_misc_plug_loads_other(hpxml, args)
usage_multiplier = args[:misc_plug_loads_other_usage_multiplier].get
end
- hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
- plug_load_type: HPXML::PlugLoadTypeOther,
- kwh_per_year: kwh_per_year,
- frac_sensible: frac_sensible,
- frac_latent: frac_latent,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}",
+ plug_load_type: HPXML::PlugLoadTypeOther,
+ kwh_per_year: kwh_per_year,
+ frac_sensible: frac_sensible,
+ frac_latent: frac_latent,
+ usage_multiplier: usage_multiplier)
end
- def self.set_misc_plug_loads_well_pump(hpxml, args)
+ def self.set_misc_plug_loads_well_pump(hpxml_bldg, args)
return unless args[:misc_plug_loads_well_pump_present]
if args[:misc_plug_loads_well_pump_annual_kwh].is_initialized
@@ -6116,13 +6405,13 @@ def self.set_misc_plug_loads_well_pump(hpxml, args)
usage_multiplier = args[:misc_plug_loads_well_pump_usage_multiplier].get
end
- hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
- plug_load_type: HPXML::PlugLoadTypeWellPump,
- kwh_per_year: kwh_per_year,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}",
+ plug_load_type: HPXML::PlugLoadTypeWellPump,
+ kwh_per_year: kwh_per_year,
+ usage_multiplier: usage_multiplier)
end
- def self.set_misc_plug_loads_vehicle(hpxml, args)
+ def self.set_misc_plug_loads_vehicle(hpxml_bldg, args)
return unless args[:misc_plug_loads_vehicle_present]
if args[:misc_plug_loads_vehicle_annual_kwh].is_initialized
@@ -6133,13 +6422,13 @@ def self.set_misc_plug_loads_vehicle(hpxml, args)
usage_multiplier = args[:misc_plug_loads_vehicle_usage_multiplier].get
end
- hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
- plug_load_type: HPXML::PlugLoadTypeElectricVehicleCharging,
- kwh_per_year: kwh_per_year,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}",
+ plug_load_type: HPXML::PlugLoadTypeElectricVehicleCharging,
+ kwh_per_year: kwh_per_year,
+ usage_multiplier: usage_multiplier)
end
- def self.set_misc_fuel_loads_grill(hpxml, args)
+ def self.set_misc_fuel_loads_grill(hpxml_bldg, args)
return unless args[:misc_fuel_loads_grill_present]
if args[:misc_fuel_loads_grill_annual_therm].is_initialized
@@ -6150,14 +6439,14 @@ def self.set_misc_fuel_loads_grill(hpxml, args)
usage_multiplier = args[:misc_fuel_loads_grill_usage_multiplier].get
end
- hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
- fuel_load_type: HPXML::FuelLoadTypeGrill,
- fuel_type: args[:misc_fuel_loads_grill_fuel_type],
- therm_per_year: therm_per_year,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.fuel_loads.add(id: "FuelLoad#{hpxml_bldg.fuel_loads.size + 1}",
+ fuel_load_type: HPXML::FuelLoadTypeGrill,
+ fuel_type: args[:misc_fuel_loads_grill_fuel_type],
+ therm_per_year: therm_per_year,
+ usage_multiplier: usage_multiplier)
end
- def self.set_misc_fuel_loads_lighting(hpxml, args)
+ def self.set_misc_fuel_loads_lighting(hpxml_bldg, args)
return unless args[:misc_fuel_loads_lighting_present]
if args[:misc_fuel_loads_lighting_annual_therm].is_initialized
@@ -6168,14 +6457,14 @@ def self.set_misc_fuel_loads_lighting(hpxml, args)
usage_multiplier = args[:misc_fuel_loads_lighting_usage_multiplier].get
end
- hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
- fuel_load_type: HPXML::FuelLoadTypeLighting,
- fuel_type: args[:misc_fuel_loads_lighting_fuel_type],
- therm_per_year: therm_per_year,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.fuel_loads.add(id: "FuelLoad#{hpxml_bldg.fuel_loads.size + 1}",
+ fuel_load_type: HPXML::FuelLoadTypeLighting,
+ fuel_type: args[:misc_fuel_loads_lighting_fuel_type],
+ therm_per_year: therm_per_year,
+ usage_multiplier: usage_multiplier)
end
- def self.set_misc_fuel_loads_fireplace(hpxml, args)
+ def self.set_misc_fuel_loads_fireplace(hpxml_bldg, args)
return unless args[:misc_fuel_loads_fireplace_present]
if args[:misc_fuel_loads_fireplace_annual_therm].is_initialized
@@ -6194,16 +6483,16 @@ def self.set_misc_fuel_loads_fireplace(hpxml, args)
usage_multiplier = args[:misc_fuel_loads_fireplace_usage_multiplier].get
end
- hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
- fuel_load_type: HPXML::FuelLoadTypeFireplace,
- fuel_type: args[:misc_fuel_loads_fireplace_fuel_type],
- therm_per_year: therm_per_year,
- frac_sensible: frac_sensible,
- frac_latent: frac_latent,
- usage_multiplier: usage_multiplier)
+ hpxml_bldg.fuel_loads.add(id: "FuelLoad#{hpxml_bldg.fuel_loads.size + 1}",
+ fuel_load_type: HPXML::FuelLoadTypeFireplace,
+ fuel_type: args[:misc_fuel_loads_fireplace_fuel_type],
+ therm_per_year: therm_per_year,
+ frac_sensible: frac_sensible,
+ frac_latent: frac_latent,
+ usage_multiplier: usage_multiplier)
end
- def self.set_pool(hpxml, args)
+ def self.set_pool(hpxml_bldg, args)
return unless args[:pool_present]
if args[:pool_pump_annual_kwh].is_initialized
@@ -6234,101 +6523,101 @@ def self.set_pool(hpxml, args)
heater_usage_multiplier = args[:pool_heater_usage_multiplier].get
end
- hpxml.pools.add(id: "Pool#{hpxml.pools.size + 1}",
- type: HPXML::TypeUnknown,
- pump_type: HPXML::TypeUnknown,
- pump_kwh_per_year: pump_kwh_per_year,
- pump_usage_multiplier: pump_usage_multiplier,
- heater_type: pool_heater_type,
- heater_load_units: heater_load_units,
- heater_load_value: heater_load_value,
- heater_usage_multiplier: heater_usage_multiplier)
+ hpxml_bldg.pools.add(id: "Pool#{hpxml_bldg.pools.size + 1}",
+ type: HPXML::TypeUnknown,
+ pump_type: HPXML::TypeUnknown,
+ pump_kwh_per_year: pump_kwh_per_year,
+ pump_usage_multiplier: pump_usage_multiplier,
+ heater_type: pool_heater_type,
+ heater_load_units: heater_load_units,
+ heater_load_value: heater_load_value,
+ heater_usage_multiplier: heater_usage_multiplier)
end
- def self.set_hot_tub(hpxml, args)
- return unless args[:hot_tub_present]
+ def self.set_permanent_spa(hpxml_bldg, args)
+ return unless args[:permanent_spa_present]
- if args[:hot_tub_pump_annual_kwh].is_initialized
- pump_kwh_per_year = args[:hot_tub_pump_annual_kwh].get
+ if args[:permanent_spa_pump_annual_kwh].is_initialized
+ pump_kwh_per_year = args[:permanent_spa_pump_annual_kwh].get
end
- if args[:hot_tub_pump_usage_multiplier].is_initialized
- pump_usage_multiplier = args[:hot_tub_pump_usage_multiplier].get
+ if args[:permanent_spa_pump_usage_multiplier].is_initialized
+ pump_usage_multiplier = args[:permanent_spa_pump_usage_multiplier].get
end
- hot_tub_heater_type = args[:hot_tub_heater_type]
+ permanent_spa_heater_type = args[:permanent_spa_heater_type]
- if [HPXML::HeaterTypeElectricResistance, HPXML::HeaterTypeHeatPump].include?(hot_tub_heater_type)
- if args[:hot_tub_heater_annual_kwh].is_initialized
+ if [HPXML::HeaterTypeElectricResistance, HPXML::HeaterTypeHeatPump].include?(permanent_spa_heater_type)
+ if args[:permanent_spa_heater_annual_kwh].is_initialized
heater_load_units = HPXML::UnitsKwhPerYear
- heater_load_value = args[:hot_tub_heater_annual_kwh].get
+ heater_load_value = args[:permanent_spa_heater_annual_kwh].get
end
end
- if [HPXML::HeaterTypeGas].include?(hot_tub_heater_type)
- if args[:hot_tub_heater_annual_therm].is_initialized
+ if [HPXML::HeaterTypeGas].include?(permanent_spa_heater_type)
+ if args[:permanent_spa_heater_annual_therm].is_initialized
heater_load_units = HPXML::UnitsThermPerYear
- heater_load_value = args[:hot_tub_heater_annual_therm].get
+ heater_load_value = args[:permanent_spa_heater_annual_therm].get
end
end
- if args[:hot_tub_heater_usage_multiplier].is_initialized
- heater_usage_multiplier = args[:hot_tub_heater_usage_multiplier].get
+ if args[:permanent_spa_heater_usage_multiplier].is_initialized
+ heater_usage_multiplier = args[:permanent_spa_heater_usage_multiplier].get
end
- hpxml.hot_tubs.add(id: "HotTub#{hpxml.hot_tubs.size + 1}",
- type: HPXML::TypeUnknown,
- pump_type: HPXML::TypeUnknown,
- pump_kwh_per_year: pump_kwh_per_year,
- pump_usage_multiplier: pump_usage_multiplier,
- heater_type: hot_tub_heater_type,
- heater_load_units: heater_load_units,
- heater_load_value: heater_load_value,
- heater_usage_multiplier: heater_usage_multiplier)
+ hpxml_bldg.permanent_spas.add(id: "PermanentSpa#{hpxml_bldg.permanent_spas.size + 1}",
+ type: HPXML::TypeUnknown,
+ pump_type: HPXML::TypeUnknown,
+ pump_kwh_per_year: pump_kwh_per_year,
+ pump_usage_multiplier: pump_usage_multiplier,
+ heater_type: permanent_spa_heater_type,
+ heater_load_units: heater_load_units,
+ heater_load_value: heater_load_value,
+ heater_usage_multiplier: heater_usage_multiplier)
end
- def self.collapse_surfaces(hpxml, args)
+ def self.collapse_surfaces(hpxml_bldg, args)
if args[:combine_like_surfaces].is_initialized && args[:combine_like_surfaces].get
# Collapse some surfaces whose azimuth is a minor effect to simplify HPXMLs.
- (hpxml.roofs + hpxml.rim_joists + hpxml.walls + hpxml.foundation_walls).each do |surface|
+ (hpxml_bldg.roofs + hpxml_bldg.rim_joists + hpxml_bldg.walls + hpxml_bldg.foundation_walls).each do |surface|
surface.azimuth = nil
end
- hpxml.collapse_enclosure_surfaces()
+ hpxml_bldg.collapse_enclosure_surfaces()
else
# Collapse surfaces so that we don't get, e.g., individual windows
# or the front wall split because of the door. Exclude foundation walls
# from the list so we get all 4 foundation walls.
- hpxml.collapse_enclosure_surfaces([:roofs, :walls, :rim_joists, :floors,
- :slabs, :windows, :skylights, :doors])
+ hpxml_bldg.collapse_enclosure_surfaces([:roofs, :walls, :rim_joists, :floors,
+ :slabs, :windows, :skylights, :doors])
end
# After surfaces are collapsed, round all areas
- (hpxml.roofs +
- hpxml.rim_joists +
- hpxml.walls +
- hpxml.foundation_walls +
- hpxml.floors +
- hpxml.slabs +
- hpxml.windows +
- hpxml.skylights +
- hpxml.doors).each do |s|
+ (hpxml_bldg.roofs +
+ hpxml_bldg.rim_joists +
+ hpxml_bldg.walls +
+ hpxml_bldg.foundation_walls +
+ hpxml_bldg.floors +
+ hpxml_bldg.slabs +
+ hpxml_bldg.windows +
+ hpxml_bldg.skylights +
+ hpxml_bldg.doors).each do |s|
s.area = s.area.round(1)
end
end
- def self.renumber_hpxml_ids(hpxml)
+ def self.renumber_hpxml_ids(hpxml_bldg)
# Renumber surfaces
- { hpxml.walls => 'Wall',
- hpxml.foundation_walls => 'FoundationWall',
- hpxml.rim_joists => 'RimJoist',
- hpxml.floors => 'Floor',
- hpxml.roofs => 'Roof',
- hpxml.slabs => 'Slab',
- hpxml.windows => 'Window',
- hpxml.doors => 'Door',
- hpxml.skylights => 'Skylight' }.each do |surfs, surf_name|
+ { hpxml_bldg.walls => 'Wall',
+ hpxml_bldg.foundation_walls => 'FoundationWall',
+ hpxml_bldg.rim_joists => 'RimJoist',
+ hpxml_bldg.floors => 'Floor',
+ hpxml_bldg.roofs => 'Roof',
+ hpxml_bldg.slabs => 'Slab',
+ hpxml_bldg.windows => 'Window',
+ hpxml_bldg.doors => 'Door',
+ hpxml_bldg.skylights => 'Skylight' }.each do |surfs, surf_name|
surfs.each_with_index do |surf, i|
- (hpxml.attics + hpxml.foundations).each do |attic_or_fnd|
+ (hpxml_bldg.attics + hpxml_bldg.foundations).each do |attic_or_fnd|
if attic_or_fnd.respond_to?(:attached_to_roof_idrefs) && !attic_or_fnd.attached_to_roof_idrefs.nil? && !attic_or_fnd.attached_to_roof_idrefs.delete(surf.id).nil?
attic_or_fnd.attached_to_roof_idrefs << "#{surf_name}#{i + 1}"
end
@@ -6348,12 +6637,12 @@ def self.renumber_hpxml_ids(hpxml)
attic_or_fnd.attached_to_foundation_wall_idrefs << "#{surf_name}#{i + 1}"
end
end
- (hpxml.windows + hpxml.doors).each do |subsurf|
+ (hpxml_bldg.windows + hpxml_bldg.doors).each do |subsurf|
if subsurf.respond_to?(:wall_idref) && (subsurf.wall_idref == surf.id)
subsurf.wall_idref = "#{surf_name}#{i + 1}"
end
end
- hpxml.skylights.each do |subsurf|
+ hpxml_bldg.skylights.each do |subsurf|
if subsurf.respond_to?(:roof_idref) && (subsurf.roof_idref == surf.id)
subsurf.roof_idref = "#{surf_name}#{i + 1}"
end
diff --git a/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml b/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml
index 45eb7f88..895e9df6 100644
--- a/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml
+++ b/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml
@@ -1,10 +1,10 @@
- 3.0
+ 3.1
build_residential_hpxml
a13a8983-2b01-4930-8af2-42030b6e4233
- 61a17495-a6d8-4328-a2c6-341c8ef4300c
- 20230519T183248Z
+ 73f05c97-2d2b-4e1e-8709-67b264ec605e
+ 2023-11-13T20:11:04Z
2C38F48B
BuildResidentialHPXML
HPXML Builder
@@ -19,6 +19,14 @@
true
false
+
+ existing_hpxml_path
+ Existing HPXML File Path
+ Absolute/relative path of the existing HPXML file. If not provided, a new HPXML file with one Building element is created. If provided, a new Building element will be appended to this HPXML file (e.g., to create a multifamily HPXML file describing multiple dwelling units).
+ String
+ false
+ false
+
software_info_program_used
Software Info: Program Used
@@ -84,7 +92,7 @@
simulation_control_timestep
Simulation Control: Timestep
- Value must be a divisor of 60. If not provided, the OS-HPXML default is used.
+ Value must be a divisor of 60. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.
Integer
min
false
@@ -93,7 +101,7 @@
simulation_control_run_period
Simulation Control: Run Period
- Enter a date like "Jan 1 - Dec 31". If not provided, the OS-HPXML default is used.
+ Enter a date like 'Jan 1 - Dec 31'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.
String
false
false
@@ -101,7 +109,7 @@
simulation_control_run_period_calendar_year
Simulation Control: Run Period Calendar Year
- This numeric field should contain the calendar year that determines the start day of week. If you are running simulations using AMY weather files, the value entered for calendar year will not be used; it will be overridden by the actual year found in the AMY weather file. If not provided, the OS-HPXML default is used.
+ This numeric field should contain the calendar year that determines the start day of week. If you are running simulations using AMY weather files, the value entered for calendar year will not be used; it will be overridden by the actual year found in the AMY weather file. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.
Integer
year
false
@@ -110,7 +118,7 @@
simulation_control_daylight_saving_enabled
Simulation Control: Daylight Saving Enabled
- Whether to use daylight saving. If not provided, the OS-HPXML default is used.
+ Whether to use daylight saving. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-building-site'>HPXML Building Site</a>) is used.
Boolean
false
false
@@ -128,7 +136,7 @@
simulation_control_daylight_saving_period
Simulation Control: Daylight Saving Period
- Enter a date like "Mar 15 - Dec 15". If not provided, the OS-HPXML default is used.
+ Enter a date like 'Mar 15 - Dec 15'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-building-site'>HPXML Building Site</a>) is used.
String
false
false
@@ -136,7 +144,7 @@
simulation_control_temperature_capacitance_multiplier
Simulation Control: Temperature Capacitance Multiplier
- Affects the transient calculation of indoor air temperatures. If not provided, the OS-HPXML default is used.
+ Affects the transient calculation of indoor air temperatures. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.
String
false
false
@@ -144,7 +152,7 @@
site_type
Site: Type
- The type of site. If not provided, the OS-HPXML default is used.
+ The type of site. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Choice
false
false
@@ -166,7 +174,7 @@
site_shielding_of_home
Site: Shielding of Home
- Presence of nearby buildings, trees, obstructions for infiltration model. If not provided, the OS-HPXML default is used.
+ Presence of nearby buildings, trees, obstructions for infiltration model. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Choice
false
false
@@ -188,7 +196,7 @@
site_ground_conductivity
Site: Ground Conductivity
- Conductivity of the ground soil. If not provided, the OS-HPXML default is used.
+ Conductivity of the ground soil. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Double
Btu/hr-ft-F
false
@@ -532,6 +540,14 @@
false
false
+
+ unit_multiplier
+ Building Construction: Unit Multiplier
+ The number of similar dwelling units. EnergyPlus simulation results will be multiplied this value. If not provided, defaults to 1.
+ Integer
+ false
+ false
+
geometry_unit_type
Geometry: Unit Type
@@ -553,6 +569,10 @@
apartment unit
apartment unit
+
+ manufactured home
+ manufactured home
+
@@ -684,7 +704,7 @@
geometry_unit_num_bathrooms
Geometry: Unit Number of Bathrooms
- The number of bathrooms in the unit. If not provided, the OS-HPXML default is used.
+ The number of bathrooms in the unit. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-building-construction'>HPXML Building Construction</a>) is used.
Integer
#
false
@@ -741,7 +761,7 @@
geometry_garage_protrusion
Geometry: Garage Protrusion
- The fraction of the garage that is protruding from the living space. Only applies to single-family detached units.
+ The fraction of the garage that is protruding from the conditioned space. Only applies to single-family detached units.
Double
Frac
true
@@ -808,6 +828,14 @@
AboveApartment
AboveApartment
+
+ BellyAndWingWithSkirt
+ BellyAndWingWithSkirt
+
+
+ BellyAndWingNoSkirt
+ BellyAndWingNoSkirt
+
@@ -1001,7 +1029,7 @@
neighbor_front_height
Neighbor: Front Height
- The height of the neighboring building to the front. If not provided, the OS-HPXML default is used.
+ The height of the neighboring building to the front. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Double
ft
false
@@ -1010,7 +1038,7 @@
neighbor_back_height
Neighbor: Back Height
- The height of the neighboring building to the back. If not provided, the OS-HPXML default is used.
+ The height of the neighboring building to the back. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Double
ft
false
@@ -1019,7 +1047,7 @@
neighbor_left_height
Neighbor: Left Height
- The height of the neighboring building to the left. If not provided, the OS-HPXML default is used.
+ The height of the neighboring building to the left. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Double
ft
false
@@ -1028,7 +1056,7 @@
neighbor_right_height
Neighbor: Right Height
- The height of the neighboring building to the right. If not provided, the OS-HPXML default is used.
+ The height of the neighboring building to the right. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Double
ft
false
@@ -1084,7 +1112,7 @@
foundation_wall_type
Foundation Wall: Type
- The material type of the foundation wall. If not provided, the OS-HPXML default is used.
+ The material type of the foundation wall. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.
Choice
false
false
@@ -1126,7 +1154,7 @@
foundation_wall_thickness
Foundation Wall: Thickness
- The thickness of the foundation wall. If not provided, the OS-HPXML default is used.
+ The thickness of the foundation wall. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.
Double
in
false
@@ -1165,7 +1193,7 @@
foundation_wall_insulation_distance_to_top
Foundation Wall: Insulation Distance To Top
- The distance from the top of the foundation wall to the top of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default is used.
+ The distance from the top of the foundation wall to the top of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.
Double
ft
false
@@ -1174,7 +1202,7 @@
foundation_wall_insulation_distance_to_bottom
Foundation Wall: Insulation Distance To Bottom
- The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default is used.
+ The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.
Double
ft
false
@@ -1241,7 +1269,7 @@
slab_thickness
Slab: Thickness
- The thickness of the slab. Zero can be entered if there is a dirt floor instead of a slab. If not provided, the OS-HPXML default is used.
+ The thickness of the slab. Zero can be entered if there is a dirt floor instead of a slab. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-slabs'>HPXML Slabs</a>) is used.
Double
in
false
@@ -1250,7 +1278,7 @@
slab_carpet_fraction
Slab: Carpet Fraction
- Fraction of the slab floor area that is carpeted. If not provided, the OS-HPXML default is used.
+ Fraction of the slab floor area that is carpeted. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-slabs'>HPXML Slabs</a>) is used.
Double
Frac
false
@@ -1259,7 +1287,7 @@
slab_carpet_r
Slab: Carpet R-value
- R-value of the slab carpet. If not provided, the OS-HPXML default is used.
+ R-value of the slab carpet. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-slabs'>HPXML Slabs</a>) is used.
Double
h-ft^2-R/Btu
false
@@ -1278,7 +1306,7 @@
roof_material_type
Roof: Material Type
- The material type of the roof. If not provided, the OS-HPXML default is used.
+ The material type of the roof. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-roofs'>HPXML Roofs</a>) is used.
Choice
false
false
@@ -1324,7 +1352,7 @@
roof_color
Roof: Color
- The color of the roof. If not provided, the OS-HPXML default is used.
+ The color of the roof. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-roofs'>HPXML Roofs</a>) is used.
Choice
false
false
@@ -1383,11 +1411,10 @@
roof_radiant_barrier_grade
Roof: Radiant Barrier Grade
- The grade of the radiant barrier. If not provided, the OS-HPXML default is used.
+ The grade of the radiant barrier. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-roofs'>HPXML Roofs</a>) is used.
Choice
false
false
- 1
1
@@ -1461,7 +1488,7 @@
wall_siding_type
Wall: Siding Type
- The siding type of the walls. Also applies to rim joists. If not provided, the OS-HPXML default is used.
+ The siding type of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-walls'>HPXML Walls</a>) is used.
Choice
false
false
@@ -1515,7 +1542,7 @@
wall_color
Wall: Color
- The color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default is used.
+ The color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-walls'>HPXML Walls</a>) is used.
Choice
false
false
@@ -1645,7 +1672,7 @@
window_fraction_operable
Windows: Fraction Operable
- Fraction of windows that are operable. If not provided, the OS-HPXML default is used.
+ Fraction of windows that are operable. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Double
Frac
false
@@ -1654,7 +1681,7 @@
window_natvent_availability
Windows: Natural Ventilation Availability
- For operable windows, the number of days/week that windows can be opened by occupants for natural ventilation. If not provided, the OS-HPXML default is used.
+ For operable windows, the number of days/week that windows can be opened by occupants for natural ventilation. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Integer
Days/week
false
@@ -1682,7 +1709,7 @@
window_interior_shading_winter
Windows: Winter Interior Shading
- Interior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.
+ Interior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Double
Frac
false
@@ -1691,7 +1718,7 @@
window_interior_shading_summer
Windows: Summer Interior Shading
- Interior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.
+ Interior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Double
Frac
false
@@ -1700,7 +1727,7 @@
window_exterior_shading_winter
Windows: Winter Exterior Shading
- Exterior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.
+ Exterior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Double
Frac
false
@@ -1709,7 +1736,7 @@
window_exterior_shading_summer
Windows: Summer Exterior Shading
- Exterior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.
+ Exterior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
Double
Frac
false
@@ -1718,7 +1745,7 @@
window_shading_summer_season
Windows: Shading Summer Season
- Enter a date like "May 1 - Sep 30". Defines the summer season for purposes of shading coefficients; the rest of the year is assumed to be winter. If not provided, the OS-HPXML default is used.
+ Enter a date like 'May 1 - Sep 30'. Defines the summer season for purposes of shading coefficients; the rest of the year is assumed to be winter. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-windows'>HPXML Windows</a>) is used.
String
false
false
@@ -2029,7 +2056,7 @@
air_leakage_has_flue_or_chimney_in_conditioned_space
Air Leakage: Has Flue or Chimney in Conditioned Space
- Presence of flue or chimney with combustion air from conditioned space; used for infiltration model. If not provided, the OS-HPXML default is used.
+ Presence of flue or chimney with combustion air from conditioned space; used for infiltration model. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#flue-or-chimney'>Flue or Chimney</a>) is used.
Boolean
false
false
@@ -2082,17 +2109,13 @@
Stove
- PortableHeater
- PortableHeater
+ SpaceHeater
+ SpaceHeater
Fireplace
Fireplace
-
- FixedHeater
- FixedHeater
-
Shared Boiler w/ Baseboard
Shared Boiler w/ Baseboard
@@ -2155,7 +2178,7 @@
heating_system_heating_capacity
Heating System: Heating Capacity
- The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default is used.
+ The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-heating-systems'>HPXML Heating Systems</a>) is used.
Double
Btu/hr
false
@@ -2263,7 +2286,7 @@
cooling_system_cooling_compressor_type
Cooling System: Cooling Compressor Type
- The compressor type of the cooling system. Only applies to central air conditioner. If not provided, the OS-HPXML default is used.
+ The compressor type of the cooling system. Only applies to central air conditioner and mini-split. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#central-air-conditioner'>Central Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.
Choice
false
false
@@ -2285,7 +2308,7 @@
cooling_system_cooling_sensible_heat_fraction
Cooling System: Cooling Sensible Heat Fraction
- The sensible heat fraction of the cooling system. Ignored for evaporative cooler. If not provided, the OS-HPXML default is used.
+ The sensible heat fraction of the cooling system. Ignored for evaporative cooler. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#central-air-conditioner'>Central Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner'>Room Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.
Double
Frac
false
@@ -2294,7 +2317,7 @@
cooling_system_cooling_capacity
Cooling System: Cooling Capacity
- The output cooling capacity of the cooling system. If not provided, the OS-HPXML autosized default is used.
+ The output cooling capacity of the cooling system. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#central-air-conditioner'>Central Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner'>Room Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#evaporative-cooler'>Evaporative Cooler</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.
Double
Btu/hr
false
@@ -2350,7 +2373,7 @@
cooling_system_crankcase_heater_watts
Cooling System: Crankcase Heater Power Watts
- Cooling system crankcase heater power consumption in Watts. Applies only to central air conditioner, mini-split, packaged terminal air conditioner and room air conditioner. If not provided, the OS-HPXML default is used.
+ Cooling system crankcase heater power consumption in Watts. Applies only to central air conditioner, room air conditioner, packaged terminal air conditioner and mini-split. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#central-air-conditioner'>Central Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner'>Room Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.
Double
W
false
@@ -2406,7 +2429,7 @@
cooling_system_integrated_heating_system_capacity
Cooling System: Integrated Heating System Heating Capacity
- The output heating capacity of the heating system integrated into cooling system. If not provided, the OS-HPXML autosized default is used. Only used for packaged terminal air conditioner and room air conditioner.
+ The output heating capacity of the heating system integrated into cooling system. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner'>Room Air Conditioner</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>) is used. Only used for room air conditioner and packaged terminal air conditioner.
Double
Btu/hr
false
@@ -2527,7 +2550,7 @@
heat_pump_cooling_compressor_type
Heat Pump: Cooling Compressor Type
- The compressor type of the heat pump. Only applies to air-to-air. If not provided, the OS-HPXML default is used.
+ The compressor type of the heat pump. Only applies to air-to-air and mini-split. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>) is used.
Choice
false
false
@@ -2549,7 +2572,7 @@
heat_pump_cooling_sensible_heat_fraction
Heat Pump: Cooling Sensible Heat Fraction
- The sensible heat fraction of the heat pump. If not provided, the OS-HPXML default is used.
+ The sensible heat fraction of the heat pump. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#ground-to-air-heat-pump'>Ground-to-Air Heat Pump</a>) is used.
Double
Frac
false
@@ -2558,7 +2581,7 @@
heat_pump_heating_capacity
Heat Pump: Heating Capacity
- The output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default is used.
+ The output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#ground-to-air-heat-pump'>Ground-to-Air Heat Pump</a>) is used.
Double
Btu/hr
false
@@ -2567,7 +2590,7 @@
heat_pump_heating_capacity_retention_fraction
Heat Pump: Heating Capacity Retention Fraction
- The output heating capacity of the heat pump at a user-specified temperature (e.g., 17F or 5F) divided by the above nominal heating capacity. Applies to all heat pump types except ground-to-air. If not provided, the OS-HPXML default is used.
+ The output heating capacity of the heat pump at a user-specified temperature (e.g., 17F or 5F) divided by the above nominal heating capacity. Applies to all heat pump types except ground-to-air. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>) is used.
Double
Frac
false
@@ -2585,7 +2608,7 @@
heat_pump_cooling_capacity
Heat Pump: Cooling Capacity
- The output cooling capacity of the heat pump. If not provided, the OS-HPXML autosized default is used.
+ The output cooling capacity of the heat pump. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#ground-to-air-heat-pump'>Ground-to-Air Heat Pump</a>) is used.
Double
Btu/hr
false
@@ -2614,7 +2637,7 @@
heat_pump_compressor_lockout_temp
Heat Pump: Compressor Lockout Temperature
- The temperature below which the heat pump compressor is disabled. If both this and Backup Heating Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies to all heat pump types other than ground-to-air. If not provided, the OS-HPXML default is used.
+ The temperature below which the heat pump compressor is disabled. If both this and Backup Heating Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies to all heat pump types other than ground-to-air. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>) is used.
Double
deg-F
false
@@ -2682,7 +2705,7 @@
heat_pump_backup_heating_capacity
Heat Pump: Backup Heating Capacity
- The backup output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default is used. Only applies if Backup Type is 'integrated'.
+ The backup output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#backup'>Backup</a>) is used. Only applies if Backup Type is 'integrated'.
Double
Btu/hr
false
@@ -2691,7 +2714,7 @@
heat_pump_backup_heating_lockout_temp
Heat Pump: Backup Heating Lockout Temperature
- The temperature above which the heat pump backup system is disabled. If both this and Compressor Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies for both Backup Type of 'integrated' and 'separate'. If not provided, the OS-HPXML default is used.
+ The temperature above which the heat pump backup system is disabled. If both this and Compressor Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies for both Backup Type of 'integrated' and 'separate'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#backup'>Backup</a>) is used.
Double
deg-F
false
@@ -2700,7 +2723,7 @@
heat_pump_sizing_methodology
Heat Pump: Sizing Methodology
- The auto-sizing methodology to use when the heat pump capacity is not provided. If not provided, the OS-HPXML default is used.
+ The auto-sizing methodology to use when the heat pump capacity is not provided. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-hvac-sizing-control'>HPXML HVAC Sizing Control</a>) is used.
Choice
false
false
@@ -2758,7 +2781,7 @@
heat_pump_crankcase_heater_watts
Heat Pump: Crankcase Heater Power Watts
- Heat Pump crankcase heater power consumption in Watts. Applies only to air-to-air, mini-split, packaged terminal heat pump and room air conditioner with reverse cycle. If not provided, the OS-HPXML default is used.
+ Heat Pump crankcase heater power consumption in Watts. Applies only to air-to-air, mini-split, packaged terminal heat pump and room air conditioner with reverse cycle. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>) is used.
Double
W
false
@@ -2802,17 +2825,13 @@
Stove
- PortableHeater
- PortableHeater
+ SpaceHeater
+ SpaceHeater
Fireplace
Fireplace
-
- FixedHeater
- FixedHeater
-
@@ -2867,7 +2886,7 @@
heating_system_2_heating_capacity
Heating System 2: Heating Capacity
- The output heating capacity of the second heating system. If not provided, the OS-HPXML autosized default is used.
+ The output heating capacity of the second heating system. If not provided, the OS-HPXML autosized default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-heating-systems'>HPXML Heating Systems</a>) is used.
Double
Btu/hr
false
@@ -2922,7 +2941,7 @@
hvac_control_heating_season_period
HVAC Control: Heating Season Period
- Enter a date like 'Nov 1 - Jun 30'. If not provided, the OS-HPXML default is used. Can also provide 'BuildingAmerica' to use automatic seasons from the Building America House Simulation Protocols.
+ Enter a date like 'Nov 1 - Jun 30'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-hvac-control'>HPXML HVAC Control</a>) is used. Can also provide 'BuildingAmerica' to use automatic seasons from the Building America House Simulation Protocols.
String
false
false
@@ -2930,7 +2949,7 @@
hvac_control_cooling_season_period
HVAC Control: Cooling Season Period
- Enter a date like 'Jun 1 - Oct 31'. If not provided, the OS-HPXML default is used. Can also provide 'BuildingAmerica' to use automatic seasons from the Building America House Simulation Protocols.
+ Enter a date like 'Jun 1 - Oct 31'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-hvac-control'>HPXML HVAC Control</a>) is used. Can also provide 'BuildingAmerica' to use automatic seasons from the Building America House Simulation Protocols.
String
false
false
@@ -2979,14 +2998,14 @@
ducts_supply_location
Ducts: Supply Location
- The location of the supply ducts. If not provided, the OS-HPXML default is used.
+ The location of the supply ducts. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -2996,6 +3015,10 @@
basement - unconditioned
basement - unconditioned
+
+ crawlspace
+ crawlspace
+
crawlspace - vented
crawlspace - vented
@@ -3008,6 +3031,10 @@
crawlspace - conditioned
crawlspace - conditioned
+
+ attic
+ attic
+
attic - vented
attic - vented
@@ -3052,6 +3079,10 @@
other non-freezing space
other non-freezing space
+
+ manufactured home belly
+ manufactured home belly
+
@@ -3093,23 +3124,32 @@
ducts_supply_surface_area
Ducts: Supply Surface Area
- The surface area of the supply ducts. If not provided, the OS-HPXML default is used.
+ The supply ducts surface area in the given location. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
Double
ft^2
false
false
+
+ ducts_supply_surface_area_fraction
+ Ducts: Supply Area Fraction
+ The fraction of supply ducts surface area in the given location. Only used if Surface Area is not provided. If the fraction is less than 1, the remaining duct area is assumed to be in conditioned space. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
+ Double
+ frac
+ false
+ false
+
ducts_return_location
Ducts: Return Location
- The location of the return ducts. If not provided, the OS-HPXML default is used.
+ The location of the return ducts. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -3119,6 +3159,10 @@
basement - unconditioned
basement - unconditioned
+
+ crawlspace
+ crawlspace
+
crawlspace - vented
crawlspace - vented
@@ -3131,6 +3175,10 @@
crawlspace - conditioned
crawlspace - conditioned
+
+ attic
+ attic
+
attic - vented
attic - vented
@@ -3175,6 +3223,10 @@
other non-freezing space
other non-freezing space
+
+ manufactured home belly
+ manufactured home belly
+
@@ -3216,16 +3268,25 @@
ducts_return_surface_area
Ducts: Return Surface Area
- The surface area of the return ducts. If not provided, the OS-HPXML default is used.
+ The return ducts surface area in the given location. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
Double
ft^2
false
false
+
+ ducts_return_surface_area_fraction
+ Ducts: Return Area Fraction
+ The fraction of return ducts surface area in the given location. Only used if Surface Area is not provided. If the fraction is less than 1, the remaining duct area is assumed to be in conditioned space. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
+ Double
+ frac
+ false
+ false
+
ducts_number_of_return_registers
Ducts: Number of Return Registers
- The number of return registers of the ducts. Only used to calculate default return duct surface area. If not provided, the OS-HPXML default is used.
+ The number of return registers of the ducts. Only used to calculate default return duct surface area. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#air-distribution'>Air Distribution</a>) is used.
Integer
#
false
@@ -3273,7 +3334,7 @@
mech_vent_flow_rate
Mechanical Ventilation: Flow Rate
- The flow rate of the mechanical ventilation. If not provided, the OS-HPXML default is used.
+ The flow rate of the mechanical ventilation. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#whole-ventilation-fan'>Whole Ventilation Fan</a>) is used.
Double
CFM
false
@@ -3282,7 +3343,7 @@
mech_vent_hours_in_operation
Mechanical Ventilation: Hours In Operation
- The hours in operation of the mechanical ventilation. If not provided, the OS-HPXML default is used.
+ The hours in operation of the mechanical ventilation. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#whole-ventilation-fan'>Whole Ventilation Fan</a>) is used.
Double
hrs/day
false
@@ -3330,7 +3391,7 @@
mech_vent_fan_power
Mechanical Ventilation: Fan Power
- The fan power of the mechanical ventilation. If not provided, the OS-HPXML default is used.
+ The fan power of the mechanical ventilation. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#whole-ventilation-fan'>Whole Ventilation Fan</a>) is used.
Double
W
false
@@ -3550,7 +3611,7 @@
kitchen_fans_quantity
Kitchen Fans: Quantity
- The quantity of the kitchen fans. If not provided, the OS-HPXML default is used.
+ The quantity of the kitchen fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Integer
#
false
@@ -3559,7 +3620,7 @@
kitchen_fans_flow_rate
Kitchen Fans: Flow Rate
- The flow rate of the kitchen fan. If not provided, the OS-HPXML default is used.
+ The flow rate of the kitchen fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
CFM
false
@@ -3568,7 +3629,7 @@
kitchen_fans_hours_in_operation
Kitchen Fans: Hours In Operation
- The hours in operation of the kitchen fan. If not provided, the OS-HPXML default is used.
+ The hours in operation of the kitchen fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
hrs/day
false
@@ -3577,7 +3638,7 @@
kitchen_fans_power
Kitchen Fans: Fan Power
- The fan power of the kitchen fan. If not provided, the OS-HPXML default is used.
+ The fan power of the kitchen fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
W
false
@@ -3586,7 +3647,7 @@
kitchen_fans_start_hour
Kitchen Fans: Start Hour
- The start hour of the kitchen fan. If not provided, the OS-HPXML default is used.
+ The start hour of the kitchen fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Integer
hr
false
@@ -3595,7 +3656,7 @@
bathroom_fans_quantity
Bathroom Fans: Quantity
- The quantity of the bathroom fans. If not provided, the OS-HPXML default is used.
+ The quantity of the bathroom fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Integer
#
false
@@ -3604,7 +3665,7 @@
bathroom_fans_flow_rate
Bathroom Fans: Flow Rate
- The flow rate of the bathroom fans. If not provided, the OS-HPXML default is used.
+ The flow rate of the bathroom fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
CFM
false
@@ -3613,7 +3674,7 @@
bathroom_fans_hours_in_operation
Bathroom Fans: Hours In Operation
- The hours in operation of the bathroom fans. If not provided, the OS-HPXML default is used.
+ The hours in operation of the bathroom fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
hrs/day
false
@@ -3622,7 +3683,7 @@
bathroom_fans_power
Bathroom Fans: Fan Power
- The fan power of the bathroom fans. If not provided, the OS-HPXML default is used.
+ The fan power of the bathroom fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Double
W
false
@@ -3631,7 +3692,7 @@
bathroom_fans_start_hour
Bathroom Fans: Start Hour
- The start hour of the bathroom fans. If not provided, the OS-HPXML default is used.
+ The start hour of the bathroom fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#local-ventilation-fan'>Local Ventilation Fan</a>) is used.
Integer
hr
false
@@ -3659,7 +3720,7 @@
whole_house_fan_flow_rate
Whole House Fan: Flow Rate
- The flow rate of the whole house fan. If not provided, the OS-HPXML default is used.
+ The flow rate of the whole house fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#whole-house-fan'>Whole House Fan</a>) is used.
Double
CFM
false
@@ -3668,7 +3729,7 @@
whole_house_fan_power
Whole House Fan: Fan Power
- The fan power of the whole house fan. If not provided, the OS-HPXML default is used.
+ The fan power of the whole house fan. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#whole-house-fan'>Whole House Fan</a>) is used.
Double
W
false
@@ -3747,14 +3808,14 @@
water_heater_location
Water Heater: Location
- The location of water heater. If not provided, the OS-HPXML default is used.
+ The location of water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-water-heating-systems'>HPXML Water Heating Systems</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -3768,6 +3829,10 @@
garage
garage
+
+ attic
+ attic
+
attic - vented
attic - vented
@@ -3776,6 +3841,10 @@
attic - unvented
attic - unvented
+
+ crawlspace
+ crawlspace
+
crawlspace - vented
crawlspace - vented
@@ -3813,7 +3882,7 @@
water_heater_tank_volume
Water Heater: Tank Volume
- Nominal volume of water heater tank. Only applies to storage water heater, heat pump water heater, and space-heating boiler with storage tank. If not provided, the OS-HPXML default is used.
+ Nominal volume of water heater tank. Only applies to storage water heater, heat pump water heater, and space-heating boiler with storage tank. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#conventional-storage'>Conventional Storage</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#heat-pump'>Heat Pump</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#combi-boiler-w-storage'>Combi Boiler w/ Storage</a>) is used.
Double
gal
false
@@ -3850,7 +3919,7 @@
water_heater_usage_bin
Water Heater: Usage Bin
- The usage of the water heater. Only applies if Efficiency Type is UniformEnergyFactor and Type is not instantaneous water heater. Does not apply to space-heating boilers. If not provided, the OS-HPXML default is used.
+ The usage of the water heater. Only applies if Efficiency Type is UniformEnergyFactor and Type is not instantaneous water heater. Does not apply to space-heating boilers. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#conventional-storage'>Conventional Storage</a>, <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#heat-pump'>Heat Pump</a>) is used.
Choice
false
false
@@ -3876,7 +3945,7 @@
water_heater_recovery_efficiency
Water Heater: Recovery Efficiency
- Ratio of energy delivered to water heater to the energy content of the fuel consumed by the water heater. Only used for non-electric storage water heaters. If not provided, the OS-HPXML default is used.
+ Ratio of energy delivered to water heater to the energy content of the fuel consumed by the water heater. Only used for non-electric storage water heaters. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#conventional-storage'>Conventional Storage</a>) is used.
Double
Frac
false
@@ -3885,7 +3954,7 @@
water_heater_heating_capacity
Water Heater: Heating Capacity
- Heating capacity. Only applies to storage water heater. If not provided, the OS-HPXML default is used.
+ Heating capacity. Only applies to storage water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#conventional-storage'>Conventional Storage</a>) is used.
Double
Btu/hr
false
@@ -3894,7 +3963,7 @@
water_heater_standby_loss
Water Heater: Standby Loss
- The standby loss of water heater. Only applies to space-heating boilers. If not provided, the OS-HPXML default is used.
+ The standby loss of water heater. Only applies to space-heating boilers. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#combi-boiler-w-storage'>Combi Boiler w/ Storage</a>) is used.
Double
deg-F/hr
false
@@ -3912,7 +3981,7 @@
water_heater_setpoint_temperature
Water Heater: Setpoint Temperature
- The setpoint temperature of water heater. If not provided, the OS-HPXML default is used.
+ The setpoint temperature of water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-water-heating-systems'>HPXML Water Heating Systems</a>) is used.
Double
deg-F
false
@@ -3949,7 +4018,7 @@
water_heater_tank_model_type
Water Heater: Tank Type
- Type of tank model to use. The 'stratified' tank generally provide more accurate results, but may significantly increase run time. Applies only to storage water heater. If not provided, the OS-HPXML default is used.
+ Type of tank model to use. The 'stratified' tank generally provide more accurate results, but may significantly increase run time. Applies only to storage water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#conventional-storage'>Conventional Storage</a>) is used.
Choice
false
false
@@ -3967,7 +4036,7 @@
water_heater_operating_mode
Water Heater: Operating Mode
- The water heater operating mode. The 'heat pump only' option only uses the heat pump, while 'hybrid/auto' allows the backup electric resistance to come on in high demand situations. This is ignored if a scheduled operating mode type is selected. Applies only to heat pump water heater. If not provided, the OS-HPXML default is used.
+ The water heater operating mode. The 'heat pump only' option only uses the heat pump, while 'hybrid/auto' allows the backup electric resistance to come on in high demand situations. This is ignored if a scheduled operating mode type is selected. Applies only to heat pump water heater. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#heat-pump'>Heat Pump</a>) is used.
Choice
false
false
@@ -4004,7 +4073,7 @@
hot_water_distribution_standard_piping_length
Hot Water Distribution: Standard Piping Length
- If the distribution system is Standard, the length of the piping. If not provided, the OS-HPXML default is used.
+ If the distribution system is Standard, the length of the piping. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#standard'>Standard</a>) is used.
Double
ft
false
@@ -4044,7 +4113,7 @@
hot_water_distribution_recirc_piping_length
Hot Water Distribution: Recirculation Piping Length
- If the distribution system is Recirculation, the length of the recirculation piping. If not provided, the OS-HPXML default is used.
+ If the distribution system is Recirculation, the length of the recirculation piping. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#recirculation'>Recirculation</a>) is used.
Double
ft
false
@@ -4053,7 +4122,7 @@
hot_water_distribution_recirc_branch_piping_length
Hot Water Distribution: Recirculation Branch Piping Length
- If the distribution system is Recirculation, the length of the recirculation branch piping. If not provided, the OS-HPXML default is used.
+ If the distribution system is Recirculation, the length of the recirculation branch piping. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#recirculation'>Recirculation</a>) is used.
Double
ft
false
@@ -4062,7 +4131,7 @@
hot_water_distribution_recirc_pump_power
Hot Water Distribution: Recirculation Pump Power
- If the distribution system is Recirculation, the recirculation pump power. If not provided, the OS-HPXML default is used.
+ If the distribution system is Recirculation, the recirculation pump power. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#recirculation'>Recirculation</a>) is used.
Double
W
false
@@ -4071,7 +4140,7 @@
hot_water_distribution_pipe_r
Hot Water Distribution: Pipe Insulation Nominal R-Value
- Nominal R-value of the pipe insulation. If not provided, the OS-HPXML default is used.
+ Nominal R-value of the pipe insulation. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-hot-water-distribution'>HPXML Hot Water Distribution</a>) is used.
Double
h-ft^2-R/Btu
false
@@ -4170,7 +4239,7 @@
water_fixtures_usage_multiplier
Hot Water Fixtures: Usage Multiplier
- Multiplier on the hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-water-fixtures'>HPXML Water Fixtures</a>) is used.
Double
false
false
@@ -4297,7 +4366,7 @@
solar_thermal_storage_volume
Solar Thermal: Storage Volume
- The storage volume of the solar thermal system. If not provided, the OS-HPXML default is used.
+ The storage volume of the solar thermal system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#detailed-inputs'>Detailed Inputs</a>) is used.
Double
gal
false
@@ -4335,7 +4404,7 @@
pv_system_module_type
PV System: Module Type
- Module type of the PV system. If not provided, the OS-HPXML default is used.
+ Module type of the PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4357,7 +4426,7 @@
pv_system_location
PV System: Location
- Location of the PV system. If not provided, the OS-HPXML default is used.
+ Location of the PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4375,7 +4444,7 @@
pv_system_tracking
PV System: Tracking
- Type of tracking for the PV system. If not provided, the OS-HPXML default is used.
+ Type of tracking for the PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4431,7 +4500,7 @@
pv_system_inverter_efficiency
PV System: Inverter Efficiency
- Inverter efficiency of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default is used.
+ Inverter efficiency of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Double
Frac
false
@@ -4440,7 +4509,7 @@
pv_system_system_losses_fraction
PV System: System Losses Fraction
- System losses fraction of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default is used.
+ System losses fraction of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Double
Frac
false
@@ -4477,7 +4546,7 @@
pv_system_2_module_type
PV System 2: Module Type
- Module type of the second PV system. If not provided, the OS-HPXML default is used.
+ Module type of the second PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4499,7 +4568,7 @@
pv_system_2_location
PV System 2: Location
- Location of the second PV system. If not provided, the OS-HPXML default is used.
+ Location of the second PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4517,7 +4586,7 @@
pv_system_2_tracking
PV System 2: Tracking
- Type of tracking for the second PV system. If not provided, the OS-HPXML default is used.
+ Type of tracking for the second PV system. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.
Choice
false
false
@@ -4592,14 +4661,14 @@
battery_location
Battery: Location
- The space type for the lithium ion battery location. If not provided, the OS-HPXML default is used.
+ The space type for the lithium ion battery location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-batteries'>HPXML Batteries</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -4609,6 +4678,10 @@
basement - unconditioned
basement - unconditioned
+
+ crawlspace
+ crawlspace
+
crawlspace - vented
crawlspace - vented
@@ -4621,6 +4694,10 @@
crawlspace - conditioned
crawlspace - conditioned
+
+ attic
+ attic
+
attic - vented
attic - vented
@@ -4642,7 +4719,7 @@
battery_power
Battery: Rated Power Output
- The rated power output of the lithium ion battery. If not provided, the OS-HPXML default is used.
+ The rated power output of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-batteries'>HPXML Batteries</a>) is used.
Double
W
false
@@ -4651,7 +4728,7 @@
battery_capacity
Battery: Nominal Capacity
- The nominal capacity of the lithium ion battery. If not provided, the OS-HPXML default is used.
+ The nominal capacity of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-batteries'>HPXML Batteries</a>) is used.
Double
kWh
false
@@ -4660,7 +4737,7 @@
battery_usable_capacity
Battery: Usable Capacity
- The usable capacity of the lithium ion battery. If not provided, the OS-HPXML default is used.
+ The usable capacity of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-batteries'>HPXML Batteries</a>) is used.
Double
kWh
false
@@ -4669,7 +4746,7 @@
battery_round_trip_efficiency
Battery: Round Trip Efficiency
- The round trip efficiency of the lithium ion battery. If not provided, the OS-HPXML default is used.
+ The round trip efficiency of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-batteries'>HPXML Batteries</a>) is used.
Double
Frac
false
@@ -4724,7 +4801,7 @@
lighting_interior_usage_multiplier
Lighting: Interior Usage Multiplier
- Multiplier on the lighting energy usage (interior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the lighting energy usage (interior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-lighting'>HPXML Lighting</a>) is used.
Double
false
false
@@ -4759,7 +4836,7 @@
lighting_exterior_usage_multiplier
Lighting: Exterior Usage Multiplier
- Multiplier on the lighting energy usage (exterior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the lighting energy usage (exterior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-lighting'>HPXML Lighting</a>) is used.
Double
false
false
@@ -4794,7 +4871,7 @@
lighting_garage_usage_multiplier
Lighting: Garage Usage Multiplier
- Multiplier on the lighting energy usage (garage) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the lighting energy usage (garage) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-lighting'>HPXML Lighting</a>) is used.
Double
false
false
@@ -4821,7 +4898,7 @@
holiday_lighting_daily_kwh
Holiday Lighting: Daily Consumption
- The daily energy consumption for holiday lighting (exterior). If not provided, the OS-HPXML default is used.
+ The daily energy consumption for holiday lighting (exterior). If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-lighting'>HPXML Lighting</a>) is used.
Double
kWh/day
false
@@ -4830,7 +4907,7 @@
holiday_lighting_period
Holiday Lighting: Period
- Enter a date like "Nov 25 - Jan 5". If not provided, the OS-HPXML default is used.
+ Enter a date like 'Nov 25 - Jan 5'. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-lighting'>HPXML Lighting</a>) is used.
String
false
false
@@ -4939,14 +5016,14 @@
clothes_washer_location
Clothes Washer: Location
- The space type for the clothes washer location. If not provided, the OS-HPXML default is used.
+ The space type for the clothes washer location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5000,7 +5077,7 @@
clothes_washer_efficiency
Clothes Washer: Efficiency
- The efficiency of the clothes washer. If not provided, the OS-HPXML default is used.
+ The efficiency of the clothes washer. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
ft^3/kWh-cyc
false
@@ -5009,7 +5086,7 @@
clothes_washer_rated_annual_kwh
Clothes Washer: Rated Annual Consumption
- The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.
+ The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
kWh/yr
false
@@ -5018,7 +5095,7 @@
clothes_washer_label_electric_rate
Clothes Washer: Label Electric Rate
- The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.
+ The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
$/kWh
false
@@ -5027,7 +5104,7 @@
clothes_washer_label_gas_rate
Clothes Washer: Label Gas Rate
- The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.
+ The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
$/therm
false
@@ -5036,7 +5113,7 @@
clothes_washer_label_annual_gas_cost
Clothes Washer: Label Annual Cost with Gas DHW
- The annual cost of using the system under test conditions. Input is obtained from the EnergyGuide label. If not provided, the OS-HPXML default is used.
+ The annual cost of using the system under test conditions. Input is obtained from the EnergyGuide label. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
$
false
@@ -5045,7 +5122,7 @@
clothes_washer_label_usage
Clothes Washer: Label Usage
- The clothes washer loads per week. If not provided, the OS-HPXML default is used.
+ The clothes washer loads per week. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
cyc/wk
false
@@ -5054,7 +5131,7 @@
clothes_washer_capacity
Clothes Washer: Drum Volume
- Volume of the washer drum. Obtained from the EnergyStar website or the manufacturer's literature. If not provided, the OS-HPXML default is used.
+ Volume of the washer drum. Obtained from the EnergyStar website or the manufacturer's literature. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
ft^3
false
@@ -5063,7 +5140,7 @@
clothes_washer_usage_multiplier
Clothes Washer: Usage Multiplier
- Multiplier on the clothes washer energy and hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the clothes washer energy and hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.
Double
false
false
@@ -5090,14 +5167,14 @@
clothes_dryer_location
Clothes Dryer: Location
- The space type for the clothes dryer location. If not provided, the OS-HPXML default is used.
+ The space type for the clothes dryer location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5186,7 +5263,7 @@
clothes_dryer_efficiency
Clothes Dryer: Efficiency
- The efficiency of the clothes dryer. If not provided, the OS-HPXML default is used.
+ The efficiency of the clothes dryer. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.
Double
lb/kWh
false
@@ -5195,7 +5272,7 @@
clothes_dryer_vented_flow_rate
Clothes Dryer: Vented Flow Rate
- The exhaust flow rate of the vented clothes dryer. If not provided, the OS-HPXML default is used.
+ The exhaust flow rate of the vented clothes dryer. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.
Double
CFM
false
@@ -5204,7 +5281,7 @@
clothes_dryer_usage_multiplier
Clothes Dryer: Usage Multiplier
- Multiplier on the clothes dryer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the clothes dryer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.
Double
false
false
@@ -5231,14 +5308,14 @@
dishwasher_location
Dishwasher: Location
- The space type for the dishwasher location. If not provided, the OS-HPXML default is used.
+ The space type for the dishwasher location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5292,7 +5369,7 @@
dishwasher_efficiency
Dishwasher: Efficiency
- The efficiency of the dishwasher. If not provided, the OS-HPXML default is used.
+ The efficiency of the dishwasher. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
RatedAnnualkWh or EnergyFactor
false
@@ -5301,7 +5378,7 @@
dishwasher_label_electric_rate
Dishwasher: Label Electric Rate
- The label electric rate of the dishwasher. If not provided, the OS-HPXML default is used.
+ The label electric rate of the dishwasher. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
$/kWh
false
@@ -5310,7 +5387,7 @@
dishwasher_label_gas_rate
Dishwasher: Label Gas Rate
- The label gas rate of the dishwasher. If not provided, the OS-HPXML default is used.
+ The label gas rate of the dishwasher. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
$/therm
false
@@ -5319,7 +5396,7 @@
dishwasher_label_annual_gas_cost
Dishwasher: Label Annual Gas Cost
- The label annual gas cost of the dishwasher. If not provided, the OS-HPXML default is used.
+ The label annual gas cost of the dishwasher. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
$
false
@@ -5328,7 +5405,7 @@
dishwasher_label_usage
Dishwasher: Label Usage
- The dishwasher loads per week. If not provided, the OS-HPXML default is used.
+ The dishwasher loads per week. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
cyc/wk
false
@@ -5337,7 +5414,7 @@
dishwasher_place_setting_capacity
Dishwasher: Number of Place Settings
- The number of place settings for the unit. Data obtained from manufacturer's literature. If not provided, the OS-HPXML default is used.
+ The number of place settings for the unit. Data obtained from manufacturer's literature. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Integer
#
false
@@ -5346,7 +5423,7 @@
dishwasher_usage_multiplier
Dishwasher: Usage Multiplier
- Multiplier on the dishwasher energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the dishwasher energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.
Double
false
false
@@ -5373,14 +5450,14 @@
refrigerator_location
Refrigerator: Location
- The space type for the refrigerator location. If not provided, the OS-HPXML default is used.
+ The space type for the refrigerator location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5415,7 +5492,7 @@
refrigerator_rated_annual_kwh
Refrigerator: Rated Annual Consumption
- The EnergyGuide rated annual energy consumption for a refrigerator. If not provided, the OS-HPXML default is used.
+ The EnergyGuide rated annual energy consumption for a refrigerator. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Double
kWh/yr
false
@@ -5424,7 +5501,7 @@
refrigerator_usage_multiplier
Refrigerator: Usage Multiplier
- Multiplier on the refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Double
false
false
@@ -5451,14 +5528,14 @@
extra_refrigerator_location
Extra Refrigerator: Location
- The space type for the extra refrigerator location. If not provided, the OS-HPXML default is used.
+ The space type for the extra refrigerator location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5493,7 +5570,7 @@
extra_refrigerator_rated_annual_kwh
Extra Refrigerator: Rated Annual Consumption
- The EnergyGuide rated annual energy consumption for an extra rrefrigerator. If not provided, the OS-HPXML default is used.
+ The EnergyGuide rated annual energy consumption for an extra rrefrigerator. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Double
kWh/yr
false
@@ -5502,7 +5579,7 @@
extra_refrigerator_usage_multiplier
Extra Refrigerator: Usage Multiplier
- Multiplier on the extra refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the extra refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.
Double
false
false
@@ -5529,14 +5606,14 @@
freezer_location
Freezer: Location
- The space type for the freezer location. If not provided, the OS-HPXML default is used.
+ The space type for the freezer location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-freezers'>HPXML Freezers</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5571,7 +5648,7 @@
freezer_rated_annual_kwh
Freezer: Rated Annual Consumption
- The EnergyGuide rated annual energy consumption for a freezer. If not provided, the OS-HPXML default is used.
+ The EnergyGuide rated annual energy consumption for a freezer. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-freezers'>HPXML Freezers</a>) is used.
Double
kWh/yr
false
@@ -5580,7 +5657,7 @@
freezer_usage_multiplier
Freezer: Usage Multiplier
- Multiplier on the freezer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the freezer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-freezers'>HPXML Freezers</a>) is used.
Double
false
false
@@ -5607,14 +5684,14 @@
cooking_range_oven_location
Cooking Range/Oven: Location
- The space type for the cooking range/oven location. If not provided, the OS-HPXML default is used.
+ The space type for the cooking range/oven location. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.
Choice
false
false
- living space
- living space
+ conditioned space
+ conditioned space
basement - conditioned
@@ -5684,7 +5761,7 @@
cooking_range_oven_is_induction
Cooking Range/Oven: Is Induction
- Whether the cooking range is induction. If not provided, the OS-HPXML default is used.
+ Whether the cooking range is induction. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.
Boolean
false
false
@@ -5702,7 +5779,7 @@
cooking_range_oven_is_convection
Cooking Range/Oven: Is Convection
- Whether the oven is convection. If not provided, the OS-HPXML default is used.
+ Whether the oven is convection. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.
Boolean
false
false
@@ -5720,7 +5797,7 @@
cooking_range_oven_usage_multiplier
Cooking Range/Oven: Usage Multiplier
- Multiplier on the cooking range/oven energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the cooking range/oven energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.
Double
false
false
@@ -5747,7 +5824,7 @@
ceiling_fan_efficiency
Ceiling Fan: Efficiency
- The efficiency rating of the ceiling fan(s) at medium speed. If not provided, the OS-HPXML default is used.
+ The efficiency rating of the ceiling fan(s) at medium speed. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-ceiling-fans'>HPXML Ceiling Fans</a>) is used.
Double
CFM/W
false
@@ -5756,7 +5833,7 @@
ceiling_fan_quantity
Ceiling Fan: Quantity
- Total number of ceiling fans. If not provided, the OS-HPXML default is used.
+ Total number of ceiling fans. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-ceiling-fans'>HPXML Ceiling Fans</a>) is used.
Integer
#
false
@@ -5765,7 +5842,7 @@
ceiling_fan_cooling_setpoint_temp_offset
Ceiling Fan: Cooling Setpoint Temperature Offset
- The cooling setpoint temperature offset during months when the ceiling fans are operating. Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default is used.
+ The cooling setpoint temperature offset during months when the ceiling fans are operating. Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-ceiling-fans'>HPXML Ceiling Fans</a>) is used.
Double
deg-F
false
@@ -5793,7 +5870,7 @@
misc_plug_loads_television_annual_kwh
Misc Plug Loads: Television Annual kWh
- The annual energy consumption of the television plug loads. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the television plug loads. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
kWh/yr
false
@@ -5802,7 +5879,7 @@
misc_plug_loads_television_usage_multiplier
Misc Plug Loads: Television Usage Multiplier
- Multiplier on the television energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the television energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
false
false
@@ -5810,7 +5887,7 @@
misc_plug_loads_other_annual_kwh
Misc Plug Loads: Other Annual kWh
- The annual energy consumption of the other residual plug loads. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the other residual plug loads. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
kWh/yr
false
@@ -5819,7 +5896,7 @@
misc_plug_loads_other_frac_sensible
Misc Plug Loads: Other Sensible Fraction
- Fraction of other residual plug loads' internal gains that are sensible. If not provided, the OS-HPXML default is used.
+ Fraction of other residual plug loads' internal gains that are sensible. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
Frac
false
@@ -5828,7 +5905,7 @@
misc_plug_loads_other_frac_latent
Misc Plug Loads: Other Latent Fraction
- Fraction of other residual plug loads' internal gains that are latent. If not provided, the OS-HPXML default is used.
+ Fraction of other residual plug loads' internal gains that are latent. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
Frac
false
@@ -5837,7 +5914,7 @@
misc_plug_loads_other_usage_multiplier
Misc Plug Loads: Other Usage Multiplier
- Multiplier on the other energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.
+ Multiplier on the other energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
false
false
@@ -5864,7 +5941,7 @@
misc_plug_loads_well_pump_annual_kwh
Misc Plug Loads: Well Pump Annual kWh
- The annual energy consumption of the well pump plug loads. If not provided, the OS-HPXML default is used.
+ The annual energy consumption of the well pump plug loads. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.
Double
kWh/yr
false
@@ -5873,7 +5950,7 @@