urbanopt-cli 0.4.1 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (944) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/CHANGELOG.md +59 -0
  4. data/CMakeLists.txt +17 -17
  5. data/FindOpenStudioSDK.cmake +12 -7
  6. data/Gemfile +8 -10
  7. data/LICENSE.md +11 -1
  8. data/README.md +1 -0
  9. data/Rakefile +16 -6
  10. data/example_files/Gemfile +25 -9
  11. data/example_files/example_project.json +35 -20
  12. data/example_files/example_project_combined.json +100 -5
  13. data/example_files/example_project_with_electric_network.json +2116 -0
  14. data/example_files/mappers/Baseline.rb +111 -51
  15. data/example_files/mappers/CreateBar.rb +19 -7
  16. data/example_files/mappers/EvCharging.rb +141 -0
  17. data/example_files/mappers/Floorspace.rb +29 -17
  18. data/example_files/mappers/HighEfficiency.rb +20 -8
  19. data/example_files/mappers/HighEfficiencyCreateBar.rb +19 -8
  20. data/example_files/mappers/HighEfficiencyFloorspace.rb +19 -8
  21. data/example_files/mappers/ThermalStorage.rb +16 -6
  22. data/example_files/mappers/base_workflow.osw +26 -1
  23. data/example_files/mappers/floorspace_workflow.osw +9 -0
  24. data/example_files/measures/BuildResidentialModel/measure.rb +249 -134
  25. data/example_files/reopt/base_assumptions.json +2 -2
  26. data/example_files/reopt/multiPV_assumptions.json +4 -3
  27. data/example_files/residential/clothes_dryer.tsv +7 -7
  28. data/example_files/residential/clothes_washer.tsv +2 -2
  29. data/example_files/residential/cooling_system.tsv +42 -22
  30. data/example_files/residential/dishwasher.tsv +1 -1
  31. data/example_files/residential/exhaust.tsv +3 -0
  32. data/example_files/residential/heat_pump.tsv +62 -40
  33. data/example_files/residential/water_heater.tsv +1 -1
  34. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +14 -0
  35. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +116 -0
  36. data/example_files/resources/hpxml-measures/.gitignore +1 -8
  37. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1088 -1329
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +1819 -1383
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -8
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +450 -362
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules.rb +165 -112
  42. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.json +388 -0
  43. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.md +43 -0
  44. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_state_and_monthly_schedule_shift.csv +613 -0
  45. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_state_and_monthly_schedule_shift.csv +613 -0
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +56 -82
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-appliances-dehumidifier-ief.osw → base-appliances-dehumidifier-ief-portable.osw} +57 -83
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-appliances-dehumidifier-50percent.osw → base-appliances-dehumidifier-ief-whole-home.osw} +59 -85
  49. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +56 -82
  50. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +56 -82
  51. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +56 -82
  52. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +61 -87
  53. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +56 -82
  54. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +56 -82
  55. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +56 -82
  56. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +56 -82
  57. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +56 -82
  58. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +56 -82
  59. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +56 -82
  60. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-baseboard.osw +341 -0
  61. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-fan-coil.osw +341 -0
  62. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-mechvent-shared-preconditioning.osw → base-bldgtype-multifamily-shared-mechvent-preconditioning.osw} +70 -95
  63. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-mechvent-shared.osw → base-bldgtype-multifamily-shared-mechvent.osw} +70 -95
  64. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +341 -0
  65. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +341 -0
  66. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +341 -0
  67. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-single-family-attached.osw → base-bldgtype-single-family-attached.osw} +59 -85
  68. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +56 -82
  69. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +56 -82
  70. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +56 -82
  71. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +56 -82
  72. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +56 -82
  73. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +56 -82
  74. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +56 -82
  75. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +56 -82
  76. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +56 -82
  77. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +56 -82
  78. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +56 -82
  79. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +56 -82
  80. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +57 -83
  81. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +56 -82
  82. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +56 -82
  83. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +56 -82
  84. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +56 -82
  85. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +56 -82
  86. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +56 -82
  87. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +56 -82
  88. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +56 -82
  89. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +56 -82
  90. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +56 -82
  91. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +56 -82
  92. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +56 -82
  93. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +338 -0
  94. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +56 -82
  95. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +338 -0
  96. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +56 -82
  97. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +56 -82
  98. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +338 -0
  99. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +56 -82
  100. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +56 -82
  101. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +56 -82
  102. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +56 -82
  103. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +56 -82
  104. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +56 -83
  105. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +337 -0
  106. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +56 -82
  107. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +337 -0
  108. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +56 -82
  109. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +56 -82
  110. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +56 -82
  111. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +56 -82
  112. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +56 -82
  113. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +56 -82
  114. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +56 -82
  115. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +56 -82
  116. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +56 -82
  117. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +56 -82
  118. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +56 -82
  119. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +56 -82
  120. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +56 -82
  121. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +56 -82
  122. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +56 -82
  123. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +57 -83
  124. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +57 -83
  125. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +56 -82
  126. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +56 -82
  127. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +56 -82
  128. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +56 -82
  129. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +55 -81
  130. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +55 -81
  131. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +55 -81
  132. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +55 -81
  133. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +55 -81
  134. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +337 -0
  135. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +337 -0
  136. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +56 -82
  137. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +56 -82
  138. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +56 -82
  139. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +56 -82
  140. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +56 -82
  141. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +56 -82
  142. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +56 -82
  143. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +56 -82
  144. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +56 -82
  145. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +56 -82
  146. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +56 -82
  147. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +56 -82
  148. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +56 -82
  149. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +56 -82
  150. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +55 -81
  151. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +55 -81
  152. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +55 -81
  153. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +55 -81
  154. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +56 -82
  155. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +56 -82
  156. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +56 -82
  157. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +56 -82
  158. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +57 -83
  159. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +56 -82
  160. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +56 -82
  161. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +57 -83
  162. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +56 -82
  163. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +337 -0
  164. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +56 -82
  165. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +56 -82
  166. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +56 -82
  167. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +56 -82
  168. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +56 -82
  169. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +56 -82
  170. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +56 -82
  171. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +56 -82
  172. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +56 -82
  173. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +336 -0
  174. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +336 -0
  175. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +56 -84
  176. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw +339 -0
  177. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +339 -0
  178. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +339 -0
  179. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +339 -0
  180. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +340 -0
  181. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +340 -0
  182. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +340 -0
  183. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +338 -0
  184. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +338 -0
  185. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +338 -0
  186. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +339 -0
  187. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +338 -0
  188. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +340 -0
  189. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +56 -82
  190. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +56 -82
  191. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +56 -82
  192. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +56 -82
  193. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +57 -83
  194. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +57 -83
  195. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +56 -82
  196. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +57 -83
  197. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +337 -0
  198. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +56 -82
  199. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +56 -82
  200. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +56 -82
  201. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +56 -82
  202. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +56 -82
  203. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +56 -82
  204. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +56 -82
  205. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +57 -83
  206. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +56 -82
  207. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +56 -82
  208. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +64 -90
  209. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +56 -82
  210. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +69 -95
  211. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +337 -0
  212. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-honolulu-hi.osw +337 -0
  213. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +56 -82
  214. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +337 -0
  215. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +337 -0
  216. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +56 -82
  217. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +64 -92
  218. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +57 -83
  219. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +56 -82
  220. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +56 -82
  221. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +56 -82
  222. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +337 -0
  223. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +56 -82
  224. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +56 -82
  225. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +56 -82
  226. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +56 -82
  227. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +56 -82
  228. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +57 -83
  229. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +60 -86
  230. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +60 -86
  231. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +56 -82
  232. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +337 -0
  233. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +52 -78
  234. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +52 -78
  235. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-vacancy-6-months.osw → base-schedules-stochastic-vacant.osw} +59 -85
  236. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +56 -82
  237. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +56 -82
  238. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +56 -82
  239. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +56 -82
  240. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +56 -82
  241. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +56 -82
  242. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +56 -82
  243. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +56 -82
  244. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +71 -57
  245. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +56 -82
  246. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +341 -0
  247. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +341 -0
  248. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +341 -0
  249. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +341 -0
  250. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +341 -0
  251. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +341 -0
  252. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +341 -0
  253. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +341 -0
  254. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +341 -0
  255. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +341 -0
  256. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +341 -0
  257. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +341 -0
  258. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +341 -0
  259. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +341 -0
  260. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +341 -0
  261. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +341 -0
  262. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +341 -0
  263. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +341 -0
  264. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +341 -0
  265. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +341 -0
  266. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +341 -0
  267. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +341 -0
  268. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +341 -0
  269. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +341 -0
  270. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +341 -0
  271. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
  272. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +341 -0
  273. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
  274. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +341 -0
  275. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +341 -0
  276. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +341 -0
  277. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
  278. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +341 -0
  279. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
  280. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +341 -0
  281. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
  282. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +341 -0
  283. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
  284. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +341 -0
  285. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
  286. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +341 -0
  287. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +341 -0
  288. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +341 -0
  289. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +341 -0
  290. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +341 -0
  291. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
  292. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +341 -0
  293. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
  294. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +341 -0
  295. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +341 -0
  296. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +341 -0
  297. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
  298. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +341 -0
  299. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
  300. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +341 -0
  301. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
  302. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +341 -0
  303. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
  304. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +341 -0
  305. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
  306. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +341 -0
  307. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +341 -0
  308. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +341 -0
  309. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +341 -0
  310. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +339 -0
  311. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +339 -0
  312. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-flat.osw +339 -0
  313. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-pv-shared.osw → extra-bldgtype-single-family-attached-double-exterior.osw} +62 -89
  314. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +339 -0
  315. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-dhw-shared-water-heater.osw → extra-bldgtype-single-family-attached-single-exterior-front.osw} +60 -86
  316. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +339 -0
  317. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +339 -0
  318. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +339 -0
  319. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +339 -0
  320. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +339 -0
  321. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-multifamily.osw → extra-bldgtype-single-family-attached-unconditioned-basement.osw} +64 -91
  322. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +339 -0
  323. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +339 -0
  324. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +339 -0
  325. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +339 -0
  326. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +339 -0
  327. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +339 -0
  328. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +56 -82
  329. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +337 -0
  330. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +337 -0
  331. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +337 -0
  332. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +56 -82
  333. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +339 -0
  334. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-hot-tub-heater-with-zero-kwh.osw +337 -0
  335. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-pool-heater-with-zero-kwh.osw +337 -0
  336. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +56 -82
  337. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +338 -0
  338. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +336 -0
  339. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +337 -0
  340. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +337 -0
  341. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-second-heating-system-fireplace.osw → extra-second-heating-system-fireplace-to-heating-system.osw} +58 -84
  342. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +337 -0
  343. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-second-heating-system-portable-heater.osw → extra-second-heating-system-portable-heater-to-heating-system.osw} +56 -82
  344. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +56 -82
  345. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +337 -0
  346. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +337 -0
  347. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +337 -0
  348. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +337 -0
  349. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +337 -0
  350. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +59 -85
  351. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +337 -0
  352. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +56 -82
  353. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +56 -82
  354. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +56 -82
  355. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +56 -82
  356. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +337 -0
  357. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +56 -82
  358. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +64 -89
  359. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +64 -89
  360. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +63 -88
  361. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-hvac-programmable-thermostat.osw → invalid_files/multipliers-without-fuel-loads.osw} +54 -80
  362. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +337 -0
  363. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-tv-plug-loads.osw +337 -0
  364. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-dhw-uef.osw → invalid_files/multipliers-without-vehicle-plug-loads.osw} +58 -84
  365. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +337 -0
  366. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +56 -82
  367. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +56 -82
  368. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +56 -82
  369. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +337 -0
  370. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +56 -82
  371. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +337 -0
  372. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +58 -84
  373. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +58 -84
  374. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +56 -82
  375. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +56 -82
  376. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-with-shared-system.osw +337 -0
  377. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +56 -82
  378. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +56 -82
  379. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +56 -82
  380. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +59 -85
  381. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +58 -84
  382. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +56 -82
  383. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +337 -0
  384. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/vacant.csv +8761 -0
  385. data/example_files/resources/hpxml-measures/Changelog.md +249 -0
  386. data/example_files/resources/hpxml-measures/Gemfile +2 -5
  387. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +404 -1357
  388. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +247 -171
  389. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +11 -101
  390. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +824 -301
  391. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +18 -35
  392. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +526 -0
  393. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +135 -207
  394. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +14 -186
  395. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +549 -93
  396. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +12 -15
  397. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +78 -0
  398. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +413 -15
  399. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +48 -37
  400. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +1627 -1227
  401. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +1192 -434
  402. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +1555 -1616
  403. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +1436 -1479
  404. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +3 -2
  405. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +22 -10
  406. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +85 -19
  407. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +4 -26
  408. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +22 -46
  409. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +22 -21
  410. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +51 -14
  411. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +24 -7
  412. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +2 -0
  413. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +80 -19
  414. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +9 -2
  415. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +106 -75
  416. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +109 -34
  417. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +22 -36
  418. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +1565 -768
  419. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +151 -0
  420. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +101 -0
  421. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +9 -18
  422. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +316 -28
  423. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +53 -0
  424. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +4 -2
  425. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +13 -11
  426. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +4 -2
  427. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +5 -3
  428. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +13 -11
  429. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +102 -62
  430. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +189 -35
  431. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +26 -0
  432. data/example_files/resources/hpxml-measures/README.md +5 -5
  433. data/example_files/resources/hpxml-measures/Rakefile +2 -10
  434. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +416 -299
  435. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.xml +364 -481
  436. data/example_files/resources/hpxml-measures/SimulationOutputReport/resources/constants.rb +1 -2
  437. data/example_files/resources/hpxml-measures/SimulationOutputReport/tests/output_report_test.rb +327 -320
  438. data/example_files/resources/hpxml-measures/docs/source/build_residential_hpxml.rst +3 -3
  439. data/example_files/resources/hpxml-measures/docs/source/conf.py +11 -5
  440. data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +6 -6
  441. data/example_files/resources/hpxml-measures/docs/source/index.rst +2 -2
  442. data/example_files/resources/hpxml-measures/docs/source/intro.rst +7 -109
  443. data/example_files/resources/hpxml-measures/docs/source/nstatic/stylesheet.css +13 -1
  444. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +2482 -0
  445. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +282 -0
  446. data/example_files/resources/hpxml-measures/tasks.rb +2494 -1248
  447. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3-cache.csv +35 -0
  448. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3.epw +8768 -0
  449. data/example_files/resources/hpxml-measures/weather/USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv +10 -10
  450. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3-cache.csv +35 -0
  451. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3.epw +8768 -0
  452. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3-cache.csv +35 -0
  453. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3.epw +8768 -0
  454. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3-cache.csv +35 -0
  455. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3.epw +8768 -0
  456. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +96 -21
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +558 -559
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-appliances-dehumidifier-ief.xml → base-appliances-dehumidifier-ief-portable.xml} +8 -7
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-appliances-dehumidifier-50percent.xml → base-appliances-dehumidifier-ief-whole-home.xml} +10 -9
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +535 -0
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +525 -524
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +558 -559
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +564 -565
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +513 -513
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +558 -559
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +558 -559
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +558 -559
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +565 -566
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +633 -634
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +531 -532
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +517 -518
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +562 -563
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +565 -566
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-multifamily-buffer-space.xml → base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml} +34 -62
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +554 -0
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-non-freezing-space.xml → base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml} +34 -62
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-heated-space.xml → base-bldgtype-multifamily-adjacent-to-other-heated-space.xml} +34 -62
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-housing-unit.xml → base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml} +34 -62
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +425 -0
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +457 -0
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +427 -0
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +479 -0
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +474 -0
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +408 -0
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +439 -0
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +406 -0
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +409 -0
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +457 -0
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +407 -0
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +438 -0
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +408 -0
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +456 -0
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +451 -0
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +460 -0
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +451 -0
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +466 -0
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-mechvent-shared-multiple.xml → base-bldgtype-multifamily-shared-mechvent-multiple.xml} +43 -415
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +489 -0
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +473 -0
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +465 -0
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +458 -0
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +451 -0
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +448 -0
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +619 -0
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +516 -519
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +516 -519
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +550 -551
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +7 -9
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +563 -564
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +548 -549
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +550 -551
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +550 -551
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +567 -568
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +517 -520
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +517 -520
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +518 -521
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +525 -528
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +517 -520
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +567 -568
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +568 -569
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +566 -567
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +522 -525
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +562 -563
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +575 -578
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +497 -497
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +565 -566
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +565 -566
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +565 -566
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +565 -566
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +565 -566
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +577 -578
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +577 -578
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +577 -578
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +570 -571
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +577 -578
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +577 -578
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +563 -564
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +564 -0
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +563 -564
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +565 -0
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +563 -564
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +561 -562
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +564 -0
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +569 -570
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +576 -577
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +561 -562
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +563 -564
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +563 -564
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +561 -562
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +561 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +560 -561
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +561 -0
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +568 -569
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +575 -576
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +560 -561
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +560 -561
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +661 -664
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +575 -576
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +562 -563
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +562 -563
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +562 -563
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +562 -563
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +636 -639
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +562 -563
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +562 -563
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +562 -563
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +565 -566
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +561 -562
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +582 -578
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +590 -591
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +601 -0
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +590 -591
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +517 -0
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +2474 -2493
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2475 -0
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +754 -755
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +504 -505
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-windows-interior-shading.xml → base-enclosure-windows-shading.xml} +23 -9
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +498 -497
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +644 -0
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +724 -729
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +562 -563
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +562 -563
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +685 -688
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +516 -517
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +609 -610
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +558 -559
  588. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +573 -574
  589. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +573 -574
  590. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +573 -574
  591. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +576 -577
  592. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +627 -628
  593. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-autosize.xml → base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml} +8 -12
  594. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml} +9 -9
  595. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +561 -562
  596. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +561 -562
  597. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +561 -562
  598. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +553 -0
  599. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml} +5 -6
  600. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-manual-s-oversize-allowances.xml +561 -0
  601. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed.xml +558 -0
  602. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-air-to-air-heat-pump-2-speed-manual-s-oversize-allowances.xml} +4 -5
  603. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-2-speed.xml} +4 -5
  604. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-air-to-air-heat-pump-var-speed-manual-s-oversize-allowances.xml} +4 -5
  605. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-var-speed.xml} +4 -5
  606. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-elec-only-autosize.xml → base-hvac-autosize-boiler-elec-only.xml} +2 -5
  607. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-gas-central-ac-1-speed-autosize.xml → base-hvac-autosize-boiler-gas-central-ac-1-speed.xml} +4 -6
  608. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-gas-only-autosize.xml → base-hvac-autosize-boiler-gas-only.xml} +2 -5
  609. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-1-speed-autosize.xml → base-hvac-autosize-central-ac-only-1-speed.xml} +547 -548
  610. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-2-speed-autosize.xml → base-hvac-autosize-central-ac-only-2-speed.xml} +4 -5
  611. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-var-speed-autosize.xml → base-hvac-autosize-central-ac-only-var-speed.xml} +4 -5
  612. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-plus-air-to-air-heat-pump-heating-autosize.xml → base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml} +570 -571
  613. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml +559 -0
  614. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-dual-fuel-mini-split-heat-pump-ducted-autosize.xml → base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml} +557 -558
  615. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-elec-resistance-only-autosize.xml → base-hvac-autosize-elec-resistance-only.xml} +2 -5
  616. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-evap-cooler-furnace-gas-autosize.xml → base-hvac-autosize-evap-cooler-furnace-gas.xml} +4 -5
  617. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-floor-furnace-propane-only-autosize.xml → base-hvac-autosize-floor-furnace-propane-only.xml} +5 -6
  618. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-elec-only-autosize.xml → base-hvac-autosize-furnace-elec-only.xml} +4 -5
  619. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-central-ac-2-speed-autosize.xml → base-hvac-autosize-furnace-gas-central-ac-2-speed.xml} +4 -5
  620. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-central-ac-var-speed-autosize.xml → base-hvac-autosize-furnace-gas-central-ac-var-speed.xml} +4 -5
  621. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml → base-hvac-autosize-furnace-gas-only.xml} +4 -6
  622. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-room-ac-autosize.xml → base-hvac-autosize-furnace-gas-room-ac.xml} +4 -5
  623. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +555 -0
  624. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +560 -0
  625. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-ground-to-air-heat-pump-manual-s-oversize-allowances.xml} +4 -6
  626. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize.xml → base-hvac-autosize-ground-to-air-heat-pump.xml} +4 -6
  627. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +547 -0
  628. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-cooling-only-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml} +551 -552
  629. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-heating-only-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml} +556 -557
  630. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml +560 -0
  631. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted.xml} +556 -557
  632. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-room-ac-only-autosize.xml → base-hvac-autosize-room-ac-only.xml} +2 -5
  633. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-stove-oil-only-autosize.xml → base-hvac-autosize-stove-oil-only.xml} +5 -6
  634. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-wall-furnace-elec-only-autosize.xml → base-hvac-autosize-wall-furnace-elec-only.xml} +5 -6
  635. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-autosize.xml → base-hvac-autosize.xml} +4 -5
  636. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +518 -521
  637. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +518 -521
  638. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +571 -573
  639. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +519 -522
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +518 -521
  641. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +518 -521
  642. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +518 -521
  643. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +548 -549
  644. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +548 -549
  645. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +548 -549
  646. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +575 -576
  647. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +532 -535
  648. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +562 -563
  649. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +562 -563
  650. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +562 -563
  651. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +562 -563
  652. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +561 -562
  653. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +562 -563
  654. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +509 -512
  655. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +555 -555
  656. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +536 -528
  657. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +503 -505
  658. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +6 -7
  659. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +6 -57
  660. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +6 -7
  661. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +549 -0
  662. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +562 -563
  663. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +548 -549
  664. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +562 -563
  665. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +562 -563
  666. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +5 -7
  667. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +560 -561
  668. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +548 -549
  669. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +548 -549
  670. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +548 -549
  671. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +576 -579
  672. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +557 -0
  673. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +563 -0
  674. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +7 -9
  675. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-flowrate.xml → base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.xml} +8 -9
  676. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml → base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.xml} +13 -8
  677. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.xml +567 -0
  678. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.xml +567 -0
  679. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.xml +572 -0
  680. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.xml +572 -0
  681. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.xml +572 -0
  682. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-only.xml +553 -0
  683. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-ground-to-air-heat-pump.xml +566 -0
  684. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-air-conditioner-only-ducted-autosize.xml → base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.xml} +10 -5
  685. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize-manual-s-oversize-allowances.xml → base-hvac-install-quality-all-mini-split-heat-pump-ducted.xml} +13 -8
  686. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-blower-efficiency-furnace-gas-central-ac-1-speed.xml +569 -0
  687. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-misc-shelter-coefficient.xml → base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.xml} +9 -10
  688. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.xml +570 -0
  689. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +547 -548
  690. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +508 -511
  691. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +554 -555
  692. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +560 -561
  693. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +560 -561
  694. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +515 -518
  695. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +21 -13
  696. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +486 -489
  697. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +6 -57
  698. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +567 -0
  699. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +570 -571
  700. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +508 -511
  701. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +508 -511
  702. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +562 -563
  703. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +6 -7
  704. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +6 -7
  705. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +565 -566
  706. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +562 -563
  707. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +6 -7
  708. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +573 -574
  709. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-detailed.xml +585 -586
  710. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +488 -489
  711. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +562 -563
  712. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +573 -563
  713. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +516 -517
  714. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +573 -563
  715. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +563 -0
  716. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +517 -0
  717. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +516 -517
  718. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +517 -0
  719. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +577 -0
  720. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +574 -575
  721. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +590 -591
  722. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +545 -548
  723. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +549 -541
  724. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +575 -576
  725. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +576 -577
  726. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +576 -577
  727. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +574 -575
  728. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +574 -575
  729. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +575 -576
  730. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +575 -576
  731. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +796 -795
  732. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +574 -575
  733. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +572 -573
  734. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +478 -495
  735. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +579 -0
  736. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +758 -833
  737. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +749 -820
  738. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +550 -559
  739. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +575 -576
  740. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-calendar-year.xml → base-misc-shielding-of-home.xml} +7 -8
  741. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +728 -725
  742. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1657 -0
  743. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +6 -7
  744. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +564 -0
  745. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +6 -7
  746. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +6 -7
  747. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +563 -564
  748. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +569 -570
  749. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +565 -566
  750. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +566 -567
  751. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +562 -563
  752. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +562 -563
  753. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/boiler-invalid-afue.xml +519 -0
  754. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml +532 -535
  755. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +562 -563
  756. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +562 -563
  757. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +562 -563
  758. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +535 -0
  759. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +535 -0
  760. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +575 -578
  761. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-uef.xml → invalid_files/dhw-invalid-ef-tank.xml} +7 -8
  762. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +564 -0
  763. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +562 -563
  764. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +563 -0
  765. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +563 -0
  766. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +562 -563
  767. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +562 -563
  768. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +562 -563
  769. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +546 -547
  770. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +543 -544
  771. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +546 -545
  772. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +563 -0
  773. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +448 -0
  774. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +613 -616
  775. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml +626 -629
  776. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +610 -611
  777. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +550 -551
  778. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +472 -473
  779. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +488 -534
  780. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +760 -0
  781. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +759 -0
  782. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +761 -0
  783. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +759 -0
  784. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +563 -0
  785. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +460 -0
  786. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-output-greater-than-consumption.xml +579 -0
  787. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +559 -560
  788. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +21 -13
  789. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +21 -13
  790. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml +528 -534
  791. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +546 -549
  792. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +546 -549
  793. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +21 -13
  794. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +569 -0
  795. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml +570 -571
  796. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-shared-negative-seer-eq.xml +407 -0
  797. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +563 -0
  798. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +563 -0
  799. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +563 -0
  800. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +563 -0
  801. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +569 -567
  802. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +562 -563
  803. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +562 -563
  804. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +466 -0
  805. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-surfaces.xml +644 -0
  806. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/{appliances-location-unconditioned-space.xml → invalid-foundation-wall-properties.xml} +39 -29
  807. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id.xml +591 -0
  808. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +591 -0
  809. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +563 -0
  810. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +565 -0
  811. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +575 -576
  812. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +465 -0
  813. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/{slab-zero-exposed-perimeter.xml → invalid-number-of-conditioned-floors.xml} +7 -8
  814. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +451 -0
  815. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +550 -551
  816. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml +517 -520
  817. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +564 -565
  818. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +563 -0
  819. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +473 -0
  820. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +562 -563
  821. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +582 -578
  822. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +562 -563
  823. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +21 -13
  824. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +560 -561
  825. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +562 -563
  826. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +562 -563
  827. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-surface.xml +575 -566
  828. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +562 -563
  829. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +1657 -0
  830. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +1657 -0
  831. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-cooling-systems.xml +432 -0
  832. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-heating-systems.xml +434 -0
  833. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +590 -591
  834. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +562 -563
  835. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +563 -0
  836. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +546 -547
  837. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +562 -563
  838. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +568 -569
  839. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +568 -569
  840. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +563 -564
  841. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +526 -529
  842. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-fraction-one.xml +571 -0
  843. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +531 -534
  844. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +565 -566
  845. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +531 -534
  846. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +575 -576
  847. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +562 -563
  848. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +562 -563
  849. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +465 -827
  850. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +465 -827
  851. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +590 -591
  852. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml +577 -578
  853. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +562 -563
  854. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +562 -563
  855. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +562 -563
  856. data/example_files/resources/hpxml-measures/workflow/template.osw +5 -1
  857. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +6 -17
  858. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +6 -17
  859. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +6 -17
  860. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +6 -17
  861. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +6 -17
  862. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +6 -17
  863. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +6 -17
  864. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +6 -17
  865. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +6 -17
  866. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +6 -17
  867. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +6 -17
  868. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +6 -17
  869. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +6 -17
  870. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +6 -17
  871. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +6 -17
  872. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +6 -17
  873. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +6 -17
  874. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +6 -17
  875. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +6 -17
  876. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +6 -17
  877. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +6 -17
  878. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +6 -17
  879. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +6 -19
  880. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +6 -19
  881. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -19
  882. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -19
  883. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +294 -0
  884. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +27 -0
  885. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +294 -0
  886. data/example_files/resources/hpxml-measures/workflow/tests/compare.rb +130 -0
  887. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +522 -527
  888. data/example_files/{measures/BuildResidentialModel/resources → resources}/measure-info.json +0 -0
  889. data/example_files/{measures/BuildResidentialModel/resources → resources}/meta_measure.rb +53 -44
  890. data/example_files/validation_schema.yaml +149 -0
  891. data/example_files/visualization/input_visualization_feature.html +213 -56
  892. data/example_files/visualization/input_visualization_scenario.html +92 -30
  893. data/lib/uo_cli.rb +406 -128
  894. data/lib/uo_cli/version.rb +17 -7
  895. data/requirements.txt +2 -0
  896. data/scripts/setup-env-gitbash.sh +5 -5
  897. data/scripts/setup-env-unix.sh +4 -4
  898. data/scripts/setup-env.bat +14 -11
  899. data/scripts/setup-env.ps1 +13 -10
  900. data/uo_cli.gemspec +10 -8
  901. metadata +390 -130
  902. data/developer_nrel_key.rb +0 -31
  903. data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.rb +0 -1005
  904. data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.xml +0 -326
  905. data/example_files/measures/ResidentialGeometryCreateMultifamily/tests/create_residential_multifamily_geometry_test.rb +0 -477
  906. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.rb +0 -1039
  907. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.xml +0 -393
  908. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/tests/create_residential_single_family_attached_geometry_test.rb +0 -456
  909. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.rb +0 -979
  910. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.xml +0 -388
  911. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/tests/create_residential_single_family_detached_geometry_test.rb +0 -704
  912. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/location.rb +0 -24
  913. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.yml +0 -61
  914. data/example_files/resources/hpxml-measures/docs/source/hpxml_to_openstudio.rst +0 -1386
  915. data/example_files/resources/hpxml-measures/docs/source/simulation_output_report.rst +0 -252
  916. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-laundry-room.xml +0 -828
  917. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater-recirc.xml +0 -820
  918. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater.xml +0 -813
  919. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-attached-multifamily.xml +0 -810
  920. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-common-surfaces.xml +0 -928
  921. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ideal-air.xml +0 -501
  922. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple2.xml +0 -838
  923. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-baseboard.xml +0 -777
  924. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil-ducted.xml +0 -808
  925. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil.xml +0 -780
  926. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-water-loop-heat-pump.xml +0 -820
  927. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-cooling-tower-water-loop-heat-pump.xml +0 -815
  928. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-baseboard.xml +0 -760
  929. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-ducted.xml +0 -790
  930. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-eae.xml +0 -759
  931. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil.xml +0 -762
  932. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-water-loop-heat-pump.xml +0 -796
  933. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-baseboard.xml +0 -759
  934. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil-ducted.xml +0 -789
  935. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil.xml +0 -761
  936. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-water-loop-heat-pump.xml +0 -796
  937. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-cooling-tower-only-water-loop-heat-pump.xml +0 -791
  938. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-ground-loop-ground-to-air-heat-pump.xml +0 -814
  939. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared-preconditioning.xml +0 -851
  940. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared.xml +0 -835
  941. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-shared.xml +0 -827
  942. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/coal-for-non-boiler-heating.xml +0 -514
  943. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type.xml +0 -828
  944. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-interior-shading.xml +0 -564
@@ -21,7 +21,8 @@
21
21
  "add_blended_rates_to_urdb_rate": false,
22
22
  "net_metering_limit_kw": 0,
23
23
  "interconnection_limit_kw": 100000000.0,
24
- "urdb_label": "5e162e2a5457a3d50873e3af"
24
+ "blended_monthly_demand_charges_us_dollars_per_kw": [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
25
+ "blended_monthly_rates_us_dollars_per_kwh": [0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13]
25
26
  },
26
27
  "Wind": {
27
28
  "min_kw": 0,
@@ -50,7 +51,6 @@
50
51
  "pv_name": "Roof - South Face",
51
52
  "location":"roof",
52
53
  "existing_kw": 0,
53
- "existing_kw": 0,
54
54
  "min_kw": 0,
55
55
  "max_kw": 1000000000.0,
56
56
  "installed_cost_us_dollars_per_kw": 1600,
@@ -21,7 +21,8 @@
21
21
  "add_blended_rates_to_urdb_rate": false,
22
22
  "net_metering_limit_kw": 0,
23
23
  "interconnection_limit_kw": 100000000.0,
24
- "urdb_label": "5e162e2a5457a3d50873e3af"
24
+ "blended_monthly_demand_charges_us_dollars_per_kw": [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
25
+ "blended_monthly_rates_us_dollars_per_kwh": [0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13]
25
26
  },
26
27
  "Wind": {
27
28
  "min_kw": 0,
@@ -50,7 +51,7 @@
50
51
  "pv_name": "Roof - South Face",
51
52
  "location":"roof",
52
53
  "existing_kw": 0,
53
- "min_kw": 1.6,
54
+ "min_kw": 0,
54
55
  "max_kw": 1000000000.0,
55
56
  "installed_cost_us_dollars_per_kw": 1600,
56
57
  "om_cost_us_dollars_per_kw": 16,
@@ -85,7 +86,7 @@
85
86
  {
86
87
  "pv_name": "Groundmount",
87
88
  "location":"ground",
88
- "existing_kw": 5,
89
+ "existing_kw": 0,
89
90
  "min_kw": 0,
90
91
  "max_kw": 1000000000.0,
91
92
  "installed_cost_us_dollars_per_kw": 2200,
@@ -1,7 +1,7 @@
1
- Dependency=Template Month Dependency=Template Year Dependency=clothes_dryer_fuel_type clothes_dryer_efficiency_cef clothes_dryer_control_type Source
2
- lb/kWh type
3
- Sep 2020 electricity 3.93 timer "ResStock ""Electric, Premium, EnergyStar 100% Usage"""
4
- Sep 2020 natural gas 3.03 timer "ResStock ""Gas, Premium, 100% Usage"""
5
- Sep 2020 fuel oil 3.03 timer Engineering judgment
6
- Sep 2020 propane 3.03 timer Engineering judgment
7
- Sep 2020 wood 3.03 timer Engineering judgment
1
+ Dependency=Template Month Dependency=Template Year Dependency=clothes_dryer_fuel_type clothes_dryer_efficiency Source
2
+ lb/kWh
3
+ Sep 2020 electricity 3.93 "ResStock ""Electric, Premium, EnergyStar 100% Usage"""
4
+ Sep 2020 natural gas 3.03 "ResStock ""Gas, Premium, 100% Usage"""
5
+ Sep 2020 fuel oil 3.03 Engineering judgment
6
+ Sep 2020 propane 3.03 Engineering judgment
7
+ Sep 2020 wood 3.03 Engineering judgment
@@ -1,3 +1,3 @@
1
- Dependency=Template Month Dependency=Template Year clothes_washer_efficiency_imef clothes_washer_rated_annual_kwh clothes_washer_label_electric_rate clothes_washer_label_gas_rate clothes_washer_label_annual_gas_cost clothes_washer_label_usage clothes_washer_capacity Source
2
- ft^3/kWh-cyc kWh/yr $/kWh $/therm $ cyc/wk ft^3
1
+ Dependency=Template Month Dependency=Template Year clothes_washer_efficiency clothes_washer_rated_annual_kwh clothes_washer_label_electric_rate clothes_washer_label_gas_rate clothes_washer_label_annual_gas_cost clothes_washer_label_usage clothes_washer_capacity Source
2
+ ft^2/kWh-cyc kWh/yr $/kWh $/therm $ cyc/wk ft^3
3
3
  Sep 2020 2.92 75 0.12 1.09 7 6 4.5 "ResStock ""EnergyStar Most Efficient, 100% Usage"""
@@ -1,22 +1,42 @@
1
- Dependency=Climate Zone Dependency=Template Month Dependency=Template Year Dependency=cooling_system_type cooling_system_cooling_efficiency_seer Source
2
- SEER
3
- 1A Sep 2020 central air conditioner 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
4
- 1B Sep 2020 central air conditioner 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
5
- 1C Sep 2020 central air conditioner 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
6
- 2A Sep 2020 central air conditioner 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
7
- 2B Sep 2020 central air conditioner 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
8
- 2C Sep 2020 central air conditioner 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
9
- 3A Sep 2020 central air conditioner 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
10
- 3B Sep 2020 central air conditioner 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
11
- 3C Sep 2020 central air conditioner 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
12
- 4A Sep 2020 central air conditioner 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
13
- 4B Sep 2020 central air conditioner 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
14
- 4C Sep 2020 central air conditioner 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
15
- 5A Sep 2020 central air conditioner 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
16
- 5B Sep 2020 central air conditioner 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
17
- 5C Sep 2020 central air conditioner 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
18
- 6A Sep 2020 central air conditioner 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
19
- 6B Sep 2020 central air conditioner 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
20
- 6C Sep 2020 central air conditioner 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
21
- 7 Sep 2020 central air conditioner 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
22
- 8 Sep 2020 central air conditioner 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
1
+ Dependency=Climate Zone Dependency=Template Month Dependency=Template Year Dependency=cooling_system_type cooling_system_cooling_efficiency_type cooling_system_cooling_efficiency Source
2
+
3
+ 1A Sep 2020 central air conditioner SEER 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
4
+ 1B Sep 2020 central air conditioner SEER 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
5
+ 1C Sep 2020 central air conditioner SEER 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
6
+ 2A Sep 2020 central air conditioner SEER 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
7
+ 2B Sep 2020 central air conditioner SEER 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
8
+ 2C Sep 2020 central air conditioner SEER 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
9
+ 3A Sep 2020 central air conditioner SEER 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
10
+ 3B Sep 2020 central air conditioner SEER 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
11
+ 3C Sep 2020 central air conditioner SEER 15 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
12
+ 4A Sep 2020 central air conditioner SEER 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
13
+ 4B Sep 2020 central air conditioner SEER 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
14
+ 4C Sep 2020 central air conditioner SEER 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
15
+ 5A Sep 2020 central air conditioner SEER 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
16
+ 5B Sep 2020 central air conditioner SEER 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
17
+ 5C Sep 2020 central air conditioner SEER 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
18
+ 6A Sep 2020 central air conditioner SEER 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
19
+ 6B Sep 2020 central air conditioner SEER 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
20
+ 6C Sep 2020 central air conditioner SEER 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
21
+ 7 Sep 2020 central air conditioner SEER 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
22
+ 8 Sep 2020 central air conditioner SEER 13 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
23
+ 1A Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
24
+ 1B Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
25
+ 1C Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
26
+ 2A Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
27
+ 2B Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
28
+ 2C Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
29
+ 3A Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
30
+ 3B Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
31
+ 3C Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
32
+ 4A Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
33
+ 4B Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
34
+ 4C Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
35
+ 5A Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
36
+ 5B Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
37
+ 5C Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
38
+ 6A Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
39
+ 6B Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
40
+ 6C Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
41
+ 7 Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
42
+ 8 Sep 2020 room air conditioner EER 8.5 "ResStock ""Room AC, EER 8.5"""
@@ -1,3 +1,3 @@
1
- Dependency=Template Month Dependency=Template Year dishwasher_efficiency_kwh dishwasher_label_electric_rate dishwasher_label_gas_rate dishwasher_label_annual_gas_cost dishwasher_label_usage dishwasher_place_setting_capacity Source
1
+ Dependency=Template Month Dependency=Template Year dishwasher_efficiency dishwasher_label_electric_rate dishwasher_label_gas_rate dishwasher_label_annual_gas_cost dishwasher_label_usage dishwasher_place_setting_capacity Source
2
2
  kWh/yr $/kWh $/therm $ cyc/wk #
3
3
  Sep 2020 199 0.12 1.09 18 4 12 "ResStock ""199 Rated kWh, 100% Usage"""
@@ -0,0 +1,3 @@
1
+ Dependency=Template Month Dependency=Template Year kitchen_fans_quantity bathroom_fans_quantity
2
+
3
+ Sep 2020 auto auto
@@ -1,40 +1,62 @@
1
- Dependency=Climate Zone Dependency=Template Month Dependency=Template Year Dependency=heat_pump_type heat_pump_heating_efficiency_hspf heat_pump_heating_efficiency_cop heat_pump_cooling_efficiency_seer heat_pump_cooling_efficiency_eer heat_pump_backup_fuel Source
2
- HSPF COP SEER EER type
3
- 1A Sep 2020 air-to-air 8.2 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
4
- 1B Sep 2020 air-to-air 8.2 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
5
- 1C Sep 2020 air-to-air 8.2 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
6
- 2A Sep 2020 air-to-air 8.2 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
7
- 2B Sep 2020 air-to-air 8.2 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
8
- 2C Sep 2020 air-to-air 8.2 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
9
- 3A Sep 2020 air-to-air 8.2 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
10
- 3B Sep 2020 air-to-air 8.2 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
11
- 3C Sep 2020 air-to-air 8.2 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
12
- 4A Sep 2020 air-to-air 8.5 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
13
- 4B Sep 2020 air-to-air 8.5 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
14
- 4C Sep 2020 air-to-air 9.25 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
15
- 5A Sep 2020 air-to-air 9.25 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
16
- 5B Sep 2020 air-to-air 9.25 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
17
- 5C Sep 2020 air-to-air 9.25 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
18
- 6A Sep 2020 air-to-air 9.5 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
19
- 6B Sep 2020 air-to-air 9.5 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
20
- 6C Sep 2020 air-to-air 9.5 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
21
- 1A Sep 2020 mini-split 10 19 electricity Engineering judgment
22
- 1B Sep 2020 mini-split 10 19 electricity Engineering judgment
23
- 1C Sep 2020 mini-split 10 19 electricity Engineering judgment
24
- 2A Sep 2020 mini-split 10 19 electricity Engineering judgment
25
- 2B Sep 2020 mini-split 10 19 electricity Engineering judgment
26
- 2C Sep 2020 mini-split 10 19 electricity Engineering judgment
27
- 3A Sep 2020 mini-split 10 19 electricity Engineering judgment
28
- 3B Sep 2020 mini-split 10 19 electricity Engineering judgment
29
- 3C Sep 2020 mini-split 10 19 electricity Engineering judgment
30
- 4A Sep 2020 mini-split 10 19 electricity Engineering judgment
31
- 4B Sep 2020 mini-split 10 19 electricity Engineering judgment
32
- 4C Sep 2020 mini-split 10 19 electricity Engineering judgment
33
- 5A Sep 2020 mini-split 10 19 electricity Engineering judgment
34
- 5B Sep 2020 mini-split 10 19 electricity Engineering judgment
35
- 5C Sep 2020 mini-split 10 19 electricity Engineering judgment
36
- 6A Sep 2020 mini-split 10 19 electricity Engineering judgment
37
- 6B Sep 2020 mini-split 10 19 electricity Engineering judgment
38
- 6C Sep 2020 mini-split 10 19 electricity Engineering judgment
39
- 7 Sep 2020 ground-to-air 3.6 17.1 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
40
- 8 Sep 2020 ground-to-air 3.6 17.1 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
1
+ Dependency=Climate Zone Dependency=Template Month Dependency=Template Year Dependency=heat_pump_type heat_pump_heating_efficiency_type heat_pump_heating_efficiency heat_pump_cooling_efficiency_type heat_pump_cooling_efficiency heat_pump_backup_fuel Source
2
+ type
3
+ 1A Sep 2020 air-to-air HSPF 8.2 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
4
+ 1B Sep 2020 air-to-air HSPF 8.2 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
5
+ 1C Sep 2020 air-to-air HSPF 8.2 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
6
+ 2A Sep 2020 air-to-air HSPF 8.2 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
7
+ 2B Sep 2020 air-to-air HSPF 8.2 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
8
+ 2C Sep 2020 air-to-air HSPF 8.2 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
9
+ 3A Sep 2020 air-to-air HSPF 8.2 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
10
+ 3B Sep 2020 air-to-air HSPF 8.2 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
11
+ 3C Sep 2020 air-to-air HSPF 8.2 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
12
+ 4A Sep 2020 air-to-air HSPF 8.5 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
13
+ 4B Sep 2020 air-to-air HSPF 8.5 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
14
+ 4C Sep 2020 air-to-air HSPF 9.25 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
15
+ 5A Sep 2020 air-to-air HSPF 9.25 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
16
+ 5B Sep 2020 air-to-air HSPF 9.25 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
17
+ 5C Sep 2020 air-to-air HSPF 9.25 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
18
+ 6A Sep 2020 air-to-air HSPF 9.5 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
19
+ 6B Sep 2020 air-to-air HSPF 9.5 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
20
+ 6C Sep 2020 air-to-air HSPF 9.5 SEER 15 electricity "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
21
+ 7 Sep 2020 air-to-air HSPF 9.5 SEER 15 electricity Engineering judgment
22
+ 8 Sep 2020 air-to-air HSPF 9.5 SEER 15 electricity Engineering judgment
23
+ 1A Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
24
+ 1B Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
25
+ 1C Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
26
+ 2A Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
27
+ 2B Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
28
+ 2C Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
29
+ 3A Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
30
+ 3B Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
31
+ 3C Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
32
+ 4A Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
33
+ 4B Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
34
+ 4C Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
35
+ 5A Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
36
+ 5B Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
37
+ 5C Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
38
+ 6A Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
39
+ 6B Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
40
+ 6C Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
41
+ 7 Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
42
+ 8 Sep 2020 mini-split HSPF 10 SEER 19 electricity Engineering judgment
43
+ 1A Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
44
+ 1B Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
45
+ 1C Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
46
+ 2A Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
47
+ 2B Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
48
+ 2C Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
49
+ 3A Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
50
+ 3B Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
51
+ 3C Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
52
+ 4A Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
53
+ 4B Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
54
+ 4C Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
55
+ 5A Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
56
+ 5B Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
57
+ 5C Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
58
+ 6A Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
59
+ 6B Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
60
+ 6C Sep 2020 ground-to-air COP 3.6 EER 17.1 Engineering judgment
61
+ 7 Sep 2020 ground-to-air COP 3.6 EER 17.1 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
62
+ 8 Sep 2020 ground-to-air COP 3.6 EER 17.1 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
@@ -1,4 +1,4 @@
1
- Dependency=Template Month Dependency=Template Year Dependency=water_heater_fuel_type water_heater_efficiency_ef water_heater_tank_volume Source
1
+ Dependency=Template Month Dependency=Template Year Dependency=water_heater_fuel_type water_heater_efficiency water_heater_tank_volume Source
2
2
  ratio gal
3
3
  Sep 2020 electricity 0.93 40 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
4
4
  Sep 2020 natural gas 0.61 40 "National ERI Target Procedure ENERGY STAR Certified Homes, Version 3.1 (Rev. 10)"
@@ -0,0 +1,14 @@
1
+ ## Pull Request Description
2
+
3
+ [description here]
4
+
5
+ ## Checklist
6
+
7
+ Not all may apply:
8
+
9
+ - [ ] EPvalidator.xml has been updated
10
+ - [ ] Tests (and test files) have been updated
11
+ - [ ] Documentation has been updated
12
+ - [ ] Changelog has been updated
13
+ - [ ] `openstudio tasks.rb update_measures` has been run
14
+ - [ ] No unexpected regression test changes on CI (checked comparison artifacts)
@@ -0,0 +1,116 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ types: [ synchronize, opened, ready_for_review ]
8
+ workflow_dispatch:
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+ container:
14
+ image: docker://nrel/openstudio:develop
15
+ steps:
16
+ - uses: actions/checkout@v2
17
+
18
+ - name: Install gems
19
+ run: |
20
+ rm -f Gemfile.lock && bundle install
21
+
22
+ - name: Run tests
23
+ run: |
24
+ bundle exec rake test_all
25
+
26
+ - name: Store results
27
+ uses: actions/upload-artifact@v2
28
+ with:
29
+ path: workflow/tests/results
30
+ name: results
31
+
32
+ compare-results:
33
+ if: github.event_name == 'pull_request'
34
+ runs-on: ubuntu-latest
35
+ needs: build
36
+ steps:
37
+ - uses: actions/checkout@v2
38
+ with:
39
+ ref: ${{ github.event.pull_request.base.sha }}
40
+
41
+ - name: Store base results
42
+ uses: actions/upload-artifact@v2
43
+ with:
44
+ path: workflow/tests/base_results
45
+ name: base_results
46
+
47
+ - uses: actions/checkout@v2
48
+ with:
49
+ ref: ${{ github.event.pull_request.head.sha }}
50
+
51
+ - name: Download base results
52
+ uses: actions/download-artifact@v2
53
+ with:
54
+ path: |
55
+ base_results
56
+ name: base_results
57
+
58
+ - name: Download feature results
59
+ uses: actions/download-artifact@v2
60
+ with:
61
+ path: |
62
+ results
63
+ name: results
64
+
65
+ - name: Compare results
66
+ run: |
67
+ cp -r base_results/results*.csv workflow/tests/base_results
68
+ mkdir workflow/tests/results
69
+ cp -r results/results* workflow/tests/results
70
+ ruby workflow/tests/compare.rb
71
+
72
+ - name: Store comparisons
73
+ uses: actions/upload-artifact@v2
74
+ with:
75
+ path: workflow/tests/comparisons
76
+ name: comparisons
77
+
78
+ update-results:
79
+ if: github.event.pull_request.draft != true
80
+ runs-on: ubuntu-latest
81
+ needs: compare-results
82
+ steps:
83
+ - uses: actions/checkout@v2
84
+ with:
85
+ ref: ${{ github.event.pull_request.head.sha }}
86
+
87
+ - name: Setup git branch
88
+ shell: bash
89
+ run: |
90
+ branch_name="${{ github.head_ref }}"
91
+ branch_sha="${{ github.event.pull_request.head.sha }}"
92
+ echo "Checking out branch: $branch_name, $branch_sha"
93
+ git checkout -b $branch_name || git checkout $branch_name
94
+
95
+ - name: Download feature results
96
+ uses: actions/download-artifact@v2
97
+ with:
98
+ path: |
99
+ results
100
+ name: results
101
+
102
+ - name: Commit latest results
103
+ shell: bash
104
+ run: |
105
+ git status
106
+ cp -r results/results* workflow/tests/base_results
107
+ git add workflow/tests/base_results
108
+ git status
109
+ if [[ $(git diff --cached --exit-code) ]]; then
110
+ git config --global user.email "github-action@users.noreply.github.com"
111
+ git config --global user.name "GitHub Action"
112
+ git commit -m "Latest results."
113
+ branch_name="${{ github.head_ref }}"
114
+ echo "Pushing to branch: $branch_name"
115
+ git push -u origin $branch_name
116
+ fi
@@ -241,8 +241,6 @@
241
241
  /weather/USA_AZ_Page.Muni.AWOS.723710_TMY3.epw
242
242
  /weather/USA_AZ_Phoenix-Deer.Valley.AP.722784_TMY3-cache.csv
243
243
  /weather/USA_AZ_Phoenix-Deer.Valley.AP.722784_TMY3.epw
244
- /weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3-cache.csv
245
- /weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3.epw
246
244
  /weather/USA_AZ_Prescott-Love.Field.723723_TMY3-cache.csv
247
245
  /weather/USA_AZ_Prescott-Love.Field.723723_TMY3.epw
248
246
  /weather/USA_AZ_Safford.AWOS.722747_TMY3-cache.csv
@@ -593,8 +591,6 @@
593
591
  /weather/USA_HI_Barbers.Point.NAS.911780_TMY3.epw
594
592
  /weather/USA_HI_Hilo.Intl.AP.912850_TMY3-cache.csv
595
593
  /weather/USA_HI_Hilo.Intl.AP.912850_TMY3.epw
596
- /weather/USA_HI_Honolulu.Intl.AP.911820_TMY3-cache.csv
597
- /weather/USA_HI_Honolulu.Intl.AP.911820_TMY3.epw
598
594
  /weather/USA_HI_Kahului.AP.911900_TMY3-cache.csv
599
595
  /weather/USA_HI_Kahului.AP.911900_TMY3.epw
600
596
  /weather/USA_HI_Kailua-Kaneohe.Bay.MCAS.911760_TMY3-cache.csv
@@ -1189,8 +1185,6 @@
1189
1185
  /weather/USA_MT_Great.Falls.Intl.AP.727750_TMY3.epw
1190
1186
  /weather/USA_MT_Havre.City-County.AP.727770_TMY3-cache.csv
1191
1187
  /weather/USA_MT_Havre.City-County.AP.727770_TMY3.epw
1192
- /weather/USA_MT_Helena.Rgnl.AP.727720_TMY3-cache.csv
1193
- /weather/USA_MT_Helena.Rgnl.AP.727720_TMY3.epw
1194
1188
  /weather/USA_MT_Kalispell-Glacier.Park.Intl.AP.727790_TMY3-cache.csv
1195
1189
  /weather/USA_MT_Kalispell-Glacier.Park.Intl.AP.727790_TMY3.epw
1196
1190
  /weather/USA_MT_Lewistown.Muni.AP.726776_TMY3-cache.csv
@@ -1539,8 +1533,6 @@
1539
1533
  /weather/USA_OR_Portland-Hillsboro.AP.726986_TMY3.epw
1540
1534
  /weather/USA_OR_Portland-Troutdale.AP.726985_TMY3-cache.csv
1541
1535
  /weather/USA_OR_Portland-Troutdale.AP.726985_TMY3.epw
1542
- /weather/USA_OR_Portland.Intl.AP.726980_TMY3-cache.csv
1543
- /weather/USA_OR_Portland.Intl.AP.726980_TMY3.epw
1544
1536
  /weather/USA_OR_Redmond-Roberts.Field.726835_TMY3-cache.csv
1545
1537
  /weather/USA_OR_Redmond-Roberts.Field.726835_TMY3.epw
1546
1538
  /weather/USA_OR_Roseburg.Rgnl.AP.726904_TMY3-cache.csv
@@ -2020,6 +2012,7 @@
2020
2012
  /workflow/out.osw
2021
2013
  /workflow/tests/results
2022
2014
  /workflow/tests/run
2015
+ /workflow/tests/test*
2023
2016
  /workflow/sample_files/results
2024
2017
  /workflow/sample_files/run
2025
2018
  /workflow/sample_files/invalid_files/results
@@ -9,7 +9,6 @@ require 'csv'
9
9
 
10
10
  require_relative 'resources/constants'
11
11
  require_relative 'resources/geometry'
12
- require_relative 'resources/location'
13
12
  require_relative 'resources/schedules'
14
13
 
15
14
  require_relative '../HPXMLtoOpenStudio/resources/constants'
@@ -18,7 +17,9 @@ require_relative '../HPXMLtoOpenStudio/resources/geometry'
18
17
  require_relative '../HPXMLtoOpenStudio/resources/hpxml'
19
18
  require_relative '../HPXMLtoOpenStudio/resources/hvac'
20
19
  require_relative '../HPXMLtoOpenStudio/resources/lighting'
20
+ require_relative '../HPXMLtoOpenStudio/resources/location'
21
21
  require_relative '../HPXMLtoOpenStudio/resources/materials'
22
+ require_relative '../HPXMLtoOpenStudio/resources/meta_measure'
22
23
  require_relative '../HPXMLtoOpenStudio/resources/psychrometrics'
23
24
  require_relative '../HPXMLtoOpenStudio/resources/schedules'
24
25
  require_relative '../HPXMLtoOpenStudio/resources/unit_conversions'
@@ -134,7 +135,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
134
135
 
135
136
  arg = OpenStudio::Measure::OSArgument.makeChoiceArgument('schedules_type', schedules_type_choices, true)
136
137
  arg.setDisplayName('Schedules: Type')
137
- arg.setDescription("The type of occupant-related schedules to use. Schedules corresponding to 'default' are average (e.g., Building America). Schedules corresponding to 'stochastic' are generated using time-inhomogenous Markov chains derived from American Time Use Survey data, and supplemented with sampling duration and power level from NEEA RBSA data as well as DHW draw duration and flow rate from Aquacraft/AWWA data.")
138
+ arg.setDescription("The type of occupant-related schedules to use. Schedules corresponding to 'default' are average (e.g., Building America). Schedules corresponding to 'stochastic' are generated using time-inhomogeneous Markov chains derived from American Time Use Survey data, and supplemented with sampling duration and power level from NEEA RBSA data as well as DHW draw duration and flow rate from Aquacraft/AWWA data.")
138
139
  arg.setDefaultValue('default')
139
140
  args << arg
140
141
 
@@ -167,6 +168,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
167
168
  arg.setDescription("This numeric field should contain the ending day of the ending month (must be valid for month) for the vacancy period desired. Only applies if the schedules type is 'stochastic'.")
168
169
  args << arg
169
170
 
171
+ arg = OpenStudio::Measure::OSArgument.makeIntegerArgument('schedules_random_seed', false)
172
+ arg.setDisplayName('Schedules: Random Seed')
173
+ arg.setUnits('#')
174
+ arg.setDescription("This numeric field is the seed for the random number generator. Only applies if the schedules type is 'stochastic'.")
175
+ args << arg
176
+
170
177
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('weather_station_epw_filepath', true)
171
178
  arg.setDisplayName('EnergyPlus Weather (EPW) Filepath')
172
179
  arg.setDescription('Path of the EPW file.')
@@ -184,7 +191,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
184
191
  args << arg
185
192
 
186
193
  unit_type_choices = OpenStudio::StringVector.new
187
- unit_type_choices << HPXML::ResidentialTypeManufactured
188
194
  unit_type_choices << HPXML::ResidentialTypeSFD
189
195
  unit_type_choices << HPXML::ResidentialTypeSFA
190
196
  unit_type_choices << HPXML::ResidentialTypeApartment
@@ -205,7 +211,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
205
211
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('geometry_num_floors_above_grade', true)
206
212
  arg.setDisplayName('Geometry: Number of Floors')
207
213
  arg.setUnits('#')
208
- arg.setDescription("The number of floors above grade (in the unit if #{HPXML::ResidentialTypeSFA}, and in the building if #{HPXML::ResidentialTypeApartment}).")
214
+ arg.setDescription("The number of floors above grade (in the unit if #{HPXML::ResidentialTypeSFD} or #{HPXML::ResidentialTypeSFA}, and in the building if #{HPXML::ResidentialTypeApartment}). Conditioned attics are included.")
209
215
  arg.setDefaultValue(2)
210
216
  args << arg
211
217
 
@@ -219,7 +225,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
219
225
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_orientation', true)
220
226
  arg.setDisplayName('Geometry: Orientation')
221
227
  arg.setUnits('degrees')
222
- arg.setDescription("The house's orientation is measured clockwise from due south when viewed from above (e.g., North=0, East=90, South=180, West=270).")
228
+ arg.setDescription("The unit's orientation is measured clockwise from due south when viewed from above (e.g., North=0, East=90, South=180, West=270).")
223
229
  arg.setDefaultValue(180.0)
224
230
  args << arg
225
231
 
@@ -238,28 +244,28 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
238
244
 
239
245
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('geometry_corridor_position', corridor_position_choices, true)
240
246
  arg.setDisplayName('Geometry: Corridor Position')
241
- arg.setDescription('The position of the corridor.')
247
+ arg.setDescription("The position of the corridor. Only applies to #{HPXML::ResidentialTypeSFA} and #{HPXML::ResidentialTypeApartment} units. Exterior corridors are shaded, but not enclosed. Interior corridors are enclosed and conditioned.")
242
248
  arg.setDefaultValue('Double-Loaded Interior')
243
249
  args << arg
244
250
 
245
251
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_corridor_width', true)
246
252
  arg.setDisplayName('Geometry: Corridor Width')
247
253
  arg.setUnits('ft')
248
- arg.setDescription('The width of the corridor.')
254
+ arg.setDescription("The width of the corridor. Only applies to #{HPXML::ResidentialTypeApartment} units.")
249
255
  arg.setDefaultValue(10.0)
250
256
  args << arg
251
257
 
252
258
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_inset_width', true)
253
259
  arg.setDisplayName('Geometry: Inset Width')
254
260
  arg.setUnits('ft')
255
- arg.setDescription('The width of the inset.')
261
+ arg.setDescription("The width of the inset. Only applies to #{HPXML::ResidentialTypeApartment} units.")
256
262
  arg.setDefaultValue(0.0)
257
263
  args << arg
258
264
 
259
265
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_inset_depth', true)
260
266
  arg.setDisplayName('Geometry: Inset Depth')
261
267
  arg.setUnits('ft')
262
- arg.setDescription('The depth of the inset.')
268
+ arg.setDescription("The depth of the inset. Only applies to #{HPXML::ResidentialTypeApartment} units.")
263
269
  arg.setDefaultValue(0.0)
264
270
  args << arg
265
271
 
@@ -269,35 +275,35 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
269
275
 
270
276
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('geometry_inset_position', inset_position_choices, true)
271
277
  arg.setDisplayName('Geometry: Inset Position')
272
- arg.setDescription('The position of the inset.')
278
+ arg.setDescription("The position of the inset. Only applies to #{HPXML::ResidentialTypeApartment} units.")
273
279
  arg.setDefaultValue('Right')
274
280
  args << arg
275
281
 
276
282
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_balcony_depth', true)
277
283
  arg.setDisplayName('Geometry: Balcony Depth')
278
284
  arg.setUnits('ft')
279
- arg.setDescription('The depth of the balcony.')
285
+ arg.setDescription("The depth of the balcony. Only applies to #{HPXML::ResidentialTypeApartment} units.")
280
286
  arg.setDefaultValue(0.0)
281
287
  args << arg
282
288
 
283
289
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_garage_width', true)
284
290
  arg.setDisplayName('Geometry: Garage Width')
285
291
  arg.setUnits('ft')
286
- arg.setDescription('The width of the garage. Enter zero for no garage.')
292
+ arg.setDescription("The width of the garage. Enter zero for no garage. Only applies to #{HPXML::ResidentialTypeSFD} units.")
287
293
  arg.setDefaultValue(0.0)
288
294
  args << arg
289
295
 
290
296
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_garage_depth', true)
291
297
  arg.setDisplayName('Geometry: Garage Depth')
292
298
  arg.setUnits('ft')
293
- arg.setDescription('The depth of the garage.')
299
+ arg.setDescription("The depth of the garage. Only applies to #{HPXML::ResidentialTypeSFD} units.")
294
300
  arg.setDefaultValue(20.0)
295
301
  args << arg
296
302
 
297
303
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_garage_protrusion', true)
298
304
  arg.setDisplayName('Geometry: Garage Protrusion')
299
305
  arg.setUnits('frac')
300
- arg.setDescription('The fraction of the garage that is protruding from the living space.')
306
+ arg.setDescription("The fraction of the garage that is protruding from the living space. Only applies to #{HPXML::ResidentialTypeSFD} units.")
301
307
  arg.setDefaultValue(0.0)
302
308
  args << arg
303
309
 
@@ -307,7 +313,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
307
313
 
308
314
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('geometry_garage_position', garage_position_choices, true)
309
315
  arg.setDisplayName('Geometry: Garage Position')
310
- arg.setDescription('The position of the garage.')
316
+ arg.setDescription("The position of the garage. Only applies to #{HPXML::ResidentialTypeSFD} units.")
311
317
  arg.setDefaultValue('Right')
312
318
  args << arg
313
319
 
@@ -339,6 +345,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
339
345
  arg.setDefaultValue(0.0)
340
346
  args << arg
341
347
 
348
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_rim_joist_height', true)
349
+ arg.setDisplayName('Geometry: Rim Joist Height')
350
+ arg.setUnits('in')
351
+ arg.setDescription('The height of the rim joists. Only applies to basements/crawlspaces.')
352
+ arg.setDefaultValue(9.25)
353
+ args << arg
354
+
342
355
  roof_type_choices = OpenStudio::StringVector.new
343
356
  roof_type_choices << 'gable'
344
357
  roof_type_choices << 'hip'
@@ -346,7 +359,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
346
359
 
347
360
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('geometry_roof_type', roof_type_choices, true)
348
361
  arg.setDisplayName('Geometry: Roof Type')
349
- arg.setDescription('The roof type of the building.')
362
+ arg.setDescription("The roof type of the building. Assumed flat for #{HPXML::ResidentialTypeApartment} units.")
350
363
  arg.setDefaultValue('gable')
351
364
  args << arg
352
365
 
@@ -370,16 +383,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
370
383
  arg.setDefaultValue('6:12')
371
384
  args << arg
372
385
 
373
- roof_structure_choices = OpenStudio::StringVector.new
374
- roof_structure_choices << 'truss, cantilever'
375
- roof_structure_choices << 'rafter'
376
-
377
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('geometry_roof_structure', roof_structure_choices, true)
378
- arg.setDisplayName('Geometry: Roof Structure')
379
- arg.setDescription('The roof structure of the building. Ignored if the building has a flat roof.')
380
- arg.setDefaultValue('truss, cantilever')
381
- args << arg
382
-
383
386
  attic_type_choices = OpenStudio::StringVector.new
384
387
  attic_type_choices << HPXML::AtticTypeVented
385
388
  attic_type_choices << HPXML::AtticTypeUnvented
@@ -419,6 +422,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
419
422
  arg.setDefaultValue(Constants.Auto)
420
423
  args << arg
421
424
 
425
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('geometry_has_flue_or_chimney', true)
426
+ arg.setDisplayName('Geometry: Has Flue or Chimney')
427
+ arg.setDescription('Whether there is a flue or chimney.')
428
+ arg.setDefaultValue(Constants.Auto)
429
+ args << arg
430
+
422
431
  level_choices = OpenStudio::StringVector.new
423
432
  level_choices << 'Bottom'
424
433
  level_choices << 'Middle'
@@ -442,19 +451,19 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
442
451
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('geometry_building_num_units', false)
443
452
  arg.setDisplayName('Geometry: Building Number of Units')
444
453
  arg.setUnits('#')
445
- arg.setDescription("The number of units in the building. This is required for #{HPXML::ResidentialTypeSFA} and #{HPXML::ResidentialTypeApartment} buildings.")
454
+ arg.setDescription("The number of units in the building. This is required for #{HPXML::ResidentialTypeSFA} and #{HPXML::ResidentialTypeApartment} units.")
446
455
  args << arg
447
456
 
448
457
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('geometry_building_num_bedrooms', false)
449
458
  arg.setDisplayName('Geometry: Building Number of Bedrooms')
450
459
  arg.setUnits('#')
451
- arg.setDescription("The number of bedrooms in the building. This is required for #{HPXML::ResidentialTypeSFA} and #{HPXML::ResidentialTypeApartment} buildings with shared PV systems.")
460
+ arg.setDescription("The number of bedrooms in the building. This is required for #{HPXML::ResidentialTypeSFA} and #{HPXML::ResidentialTypeApartment} units with shared PV systems.")
452
461
  args << arg
453
462
 
454
463
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('floor_assembly_r', true)
455
464
  arg.setDisplayName('Floor: Assembly R-value')
456
465
  arg.setUnits('h-ft^2-R/Btu')
457
- arg.setDescription('Assembly R-value for the floor (foundation ceiling). Ignored if a slab foundation.')
466
+ arg.setDescription('Assembly R-value for the floor (foundation ceiling). Ignored if the building has a slab foundation.')
458
467
  arg.setDefaultValue(30)
459
468
  args << arg
460
469
 
@@ -472,11 +481,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
472
481
  arg.setDefaultValue(0)
473
482
  args << arg
474
483
 
475
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_insulation_distance_to_bottom', true)
484
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('foundation_wall_insulation_distance_to_bottom', true)
476
485
  arg.setDisplayName('Foundation: Wall Insulation Distance To Bottom')
477
486
  arg.setUnits('ft')
478
- arg.setDescription('The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces.')
479
- arg.setDefaultValue(0)
487
+ arg.setDescription("The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces. A value of '#{Constants.Auto}' will use the same height as the foundation.")
488
+ arg.setDefaultValue(Constants.Auto)
480
489
  args << arg
481
490
 
482
491
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_assembly_r', false)
@@ -485,6 +494,19 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
485
494
  arg.setDescription('Assembly R-value for the foundation walls. Only applies to basements/crawlspaces. If provided, overrides the previous foundation wall insulation inputs.')
486
495
  args << arg
487
496
 
497
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('foundation_wall_thickness', true)
498
+ arg.setDisplayName('Foundation: Wall Thickness')
499
+ arg.setDescription('The thickness of the foundation wall.')
500
+ arg.setDefaultValue(Constants.Auto)
501
+ args << arg
502
+
503
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('rim_joist_assembly_r', true)
504
+ arg.setDisplayName('Rim Joist: Assembly R-value')
505
+ arg.setUnits('h-ft^2-R/Btu')
506
+ arg.setDescription('Assembly R-value for the rim joists. Only applies to basements/crawlspaces.')
507
+ arg.setDefaultValue(23)
508
+ args << arg
509
+
488
510
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_perimeter_insulation_r', true)
489
511
  arg.setDisplayName('Slab: Perimeter Insulation Nominal R-value')
490
512
  arg.setUnits('h-ft^2-R/Btu')
@@ -513,18 +535,24 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
513
535
  arg.setDefaultValue(0)
514
536
  args << arg
515
537
 
516
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_carpet_fraction', true)
538
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('slab_thickness', true)
539
+ arg.setDisplayName('Slab: Thickness')
540
+ arg.setDescription('The thickness of the slab.')
541
+ arg.setDefaultValue(Constants.Auto)
542
+ args << arg
543
+
544
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('slab_carpet_fraction', true)
517
545
  arg.setDisplayName('Slab: Carpet Fraction')
518
546
  arg.setUnits('Frac')
519
547
  arg.setDescription('Fraction of the slab floor area that is carpeted.')
520
- arg.setDefaultValue(0)
548
+ arg.setDefaultValue(Constants.Auto)
521
549
  args << arg
522
550
 
523
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_carpet_r', true)
551
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('slab_carpet_r', true)
524
552
  arg.setDisplayName('Slab: Carpet R-value')
525
553
  arg.setUnits('h-ft^2-R/Btu')
526
554
  arg.setDescription('R-value of the slab carpet.')
527
- arg.setDefaultValue(0)
555
+ arg.setDefaultValue(Constants.Auto)
528
556
  args << arg
529
557
 
530
558
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_assembly_r', true)
@@ -548,7 +576,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
548
576
  args << arg
549
577
 
550
578
  color_choices = OpenStudio::StringVector.new
551
- color_choices << Constants.Auto
552
579
  color_choices << HPXML::ColorDark
553
580
  color_choices << HPXML::ColorLight
554
581
  color_choices << HPXML::ColorMedium
@@ -558,7 +585,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
558
585
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_color', color_choices, true)
559
586
  arg.setDisplayName('Roof: Color')
560
587
  arg.setDescription('The color of the roof.')
561
- arg.setDefaultValue(Constants.Auto)
588
+ arg.setDefaultValue(HPXML::ColorMedium)
562
589
  args << arg
563
590
 
564
591
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('roof_assembly_r', true)
@@ -568,18 +595,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
568
595
  arg.setDefaultValue(2.3)
569
596
  args << arg
570
597
 
571
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('roof_solar_absorptance', true)
572
- arg.setDisplayName('Roof: Solar Absorptance')
573
- arg.setDescription('The solar absorptance of the roof.')
574
- arg.setDefaultValue(Constants.Auto)
575
- args << arg
576
-
577
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('roof_emittance', true)
578
- arg.setDisplayName('Roof: Emittance')
579
- arg.setDescription('The emittance of the roof.')
580
- arg.setDefaultValue(0.92)
581
- args << arg
582
-
583
598
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('roof_radiant_barrier', true)
584
599
  arg.setDisplayName('Roof: Has Radiant Barrier')
585
600
  arg.setDescription('Specifies whether the attic has a radiant barrier.')
@@ -600,28 +615,28 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
600
615
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_front_distance', true)
601
616
  arg.setDisplayName('Neighbor: Front Distance')
602
617
  arg.setUnits('ft')
603
- arg.setDescription('The minimum distance between the simulated house and the neighboring house to the front (not including eaves). A value of zero indicates no neighbors.')
618
+ arg.setDescription('The minimum distance between the simulated unit and the neighboring building to the front (not including eaves). A value of zero indicates no neighbors.')
604
619
  arg.setDefaultValue(0.0)
605
620
  args << arg
606
621
 
607
622
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_back_distance', true)
608
623
  arg.setDisplayName('Neighbor: Back Distance')
609
624
  arg.setUnits('ft')
610
- arg.setDescription('The minimum distance between the simulated house and the neighboring house to the back (not including eaves). A value of zero indicates no neighbors.')
625
+ arg.setDescription('The minimum distance between the simulated unit and the neighboring building to the back (not including eaves). A value of zero indicates no neighbors.')
611
626
  arg.setDefaultValue(0.0)
612
627
  args << arg
613
628
 
614
629
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_left_distance', true)
615
630
  arg.setDisplayName('Neighbor: Left Distance')
616
631
  arg.setUnits('ft')
617
- arg.setDescription('The minimum distance between the simulated house and the neighboring house to the left (not including eaves). A value of zero indicates no neighbors.')
632
+ arg.setDescription('The minimum distance between the simulated unit and the neighboring building to the left (not including eaves). A value of zero indicates no neighbors.')
618
633
  arg.setDefaultValue(10.0)
619
634
  args << arg
620
635
 
621
636
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_right_distance', true)
622
637
  arg.setDisplayName('Neighbor: Right Distance')
623
638
  arg.setUnits('ft')
624
- arg.setDescription('The minimum distance between the simulated house and the neighboring house to the right (not including eaves). A value of zero indicates no neighbors.')
639
+ arg.setDescription('The minimum distance between the simulated unit and the neighboring building to the right (not including eaves). A value of zero indicates no neighbors.')
625
640
  arg.setDefaultValue(10.0)
626
641
  args << arg
627
642
 
@@ -682,13 +697,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
682
697
 
683
698
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('wall_siding_type', wall_siding_type_choices, false)
684
699
  arg.setDisplayName('Wall: Siding Type')
685
- arg.setDescription('The siding type of the exterior walls.')
700
+ arg.setDescription('The siding type of the exterior walls. Also applies to rim joists.')
686
701
  args << arg
687
702
 
688
703
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('wall_color', color_choices, true)
689
704
  arg.setDisplayName('Wall: Color')
690
- arg.setDescription('The color of the exterior walls.')
691
- arg.setDefaultValue(Constants.Auto)
705
+ arg.setDescription('The color of the exterior walls. Also applies to rim joists.')
706
+ arg.setDefaultValue(HPXML::ColorMedium)
692
707
  args << arg
693
708
 
694
709
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('wall_assembly_r', true)
@@ -698,63 +713,51 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
698
713
  arg.setDefaultValue(13)
699
714
  args << arg
700
715
 
701
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('wall_solar_absorptance', true)
702
- arg.setDisplayName('Wall: Solar Absorptance')
703
- arg.setDescription('The solar absorptance of the exterior walls.')
704
- arg.setDefaultValue(Constants.Auto)
705
- args << arg
706
-
707
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('wall_emittance', true)
708
- arg.setDisplayName('Wall: Emittance')
709
- arg.setDescription('The emittance of the exterior walls.')
710
- arg.setDefaultValue(0.92)
711
- args << arg
712
-
713
716
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_front_wwr', true)
714
717
  arg.setDisplayName('Windows: Front Window-to-Wall Ratio')
715
- arg.setDescription("The ratio of window area to wall area for the building's front facade. Enter 0 if specifying Front Window Area instead.")
718
+ arg.setDescription("The ratio of window area to wall area for the unit's front facade. Enter 0 if specifying Front Window Area instead.")
716
719
  arg.setDefaultValue(0.18)
717
720
  args << arg
718
721
 
719
722
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_back_wwr', true)
720
723
  arg.setDisplayName('Windows: Back Window-to-Wall Ratio')
721
- arg.setDescription("The ratio of window area to wall area for the building's back facade. Enter 0 if specifying Back Window Area instead.")
724
+ arg.setDescription("The ratio of window area to wall area for the unit's back facade. Enter 0 if specifying Back Window Area instead.")
722
725
  arg.setDefaultValue(0.18)
723
726
  args << arg
724
727
 
725
728
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_left_wwr', true)
726
729
  arg.setDisplayName('Windows: Left Window-to-Wall Ratio')
727
- arg.setDescription("The ratio of window area to wall area for the building's left facade. Enter 0 if specifying Left Window Area instead.")
730
+ arg.setDescription("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.")
728
731
  arg.setDefaultValue(0.18)
729
732
  args << arg
730
733
 
731
734
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_right_wwr', true)
732
735
  arg.setDisplayName('Windows: Right Window-to-Wall Ratio')
733
- arg.setDescription("The ratio of window area to wall area for the building's right facade. Enter 0 if specifying Right Window Area instead.")
736
+ arg.setDescription("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.")
734
737
  arg.setDefaultValue(0.18)
735
738
  args << arg
736
739
 
737
740
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_area_front', true)
738
741
  arg.setDisplayName('Windows: Front Window Area')
739
- arg.setDescription("The amount of window area on the building's front facade. Enter 0 if specifying Front Window-to-Wall Ratio instead.")
742
+ arg.setDescription("The amount of window area on the unit's front facade. Enter 0 if specifying Front Window-to-Wall Ratio instead.")
740
743
  arg.setDefaultValue(0)
741
744
  args << arg
742
745
 
743
746
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_area_back', true)
744
747
  arg.setDisplayName('Windows: Back Window Area')
745
- arg.setDescription("The amount of window area on the building's back facade. Enter 0 if specifying Back Window-to-Wall Ratio instead.")
748
+ arg.setDescription("The amount of window area on the unit's back facade. Enter 0 if specifying Back Window-to-Wall Ratio instead.")
746
749
  arg.setDefaultValue(0)
747
750
  args << arg
748
751
 
749
752
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_area_left', true)
750
753
  arg.setDisplayName('Windows: Left Window Area')
751
- arg.setDescription("The amount of window area on the building's left facade. Enter 0 if specifying Left Window-to-Wall Ratio instead.")
754
+ arg.setDescription("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.")
752
755
  arg.setDefaultValue(0)
753
756
  args << arg
754
757
 
755
758
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_area_right', true)
756
759
  arg.setDisplayName('Windows: Right Window Area')
757
- arg.setDescription("The amount of window area on the building's right facade. Enter 0 if specifying Right Window-to-Wall Ratio instead.")
760
+ arg.setDescription("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.")
758
761
  arg.setDefaultValue(0)
759
762
  args << arg
760
763
 
@@ -792,6 +795,16 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
792
795
  arg.setDescription('Interior shading multiplier for the cooling season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc.')
793
796
  args << arg
794
797
 
798
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_exterior_shading_winter', false)
799
+ arg.setDisplayName('Windows: Winter Exterior Shading')
800
+ arg.setDescription('Exterior shading multiplier for the heating season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc.')
801
+ args << arg
802
+
803
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_exterior_shading_summer', false)
804
+ arg.setDisplayName('Windows: Summer Exterior Shading')
805
+ arg.setDescription('Exterior shading multiplier for the cooling season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc.')
806
+ args << arg
807
+
795
808
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('overhangs_front_depth', true)
796
809
  arg.setDisplayName('Overhangs: Front Facade Depth')
797
810
  arg.setDescription('Specifies the depth of overhangs for windows on the front facade.')
@@ -842,25 +855,25 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
842
855
 
843
856
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('skylight_area_front', true)
844
857
  arg.setDisplayName('Skylights: Front Roof Area')
845
- arg.setDescription("The amount of skylight area on the building's front conditioned roof facade.")
858
+ arg.setDescription("The amount of skylight area on the unit's front conditioned roof facade.")
846
859
  arg.setDefaultValue(0)
847
860
  args << arg
848
861
 
849
862
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('skylight_area_back', true)
850
863
  arg.setDisplayName('Skylights: Back Roof Area')
851
- arg.setDescription("The amount of skylight area on the building's back conditioned roof facade.")
864
+ arg.setDescription("The amount of skylight area on the unit's back conditioned roof facade.")
852
865
  arg.setDefaultValue(0)
853
866
  args << arg
854
867
 
855
868
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('skylight_area_left', true)
856
869
  arg.setDisplayName('Skylights: Left Roof Area')
857
- arg.setDescription("The amount of skylight area on the building's left conditioned roof facade.")
870
+ arg.setDescription("The amount of skylight area on the unit's left conditioned roof facade (when viewed from the front).")
858
871
  arg.setDefaultValue(0)
859
872
  args << arg
860
873
 
861
874
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('skylight_area_right', true)
862
875
  arg.setDisplayName('Skylights: Right Roof Area')
863
- arg.setDescription("The amount of skylight area on the building's right conditioned roof facade.")
876
+ arg.setDescription("The amount of skylight area on the unit's right conditioned roof facade (when viewed from the front).")
864
877
  arg.setDefaultValue(0)
865
878
  args << arg
866
879
 
@@ -915,10 +928,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
915
928
  arg.setDefaultValue(3)
916
929
  args << arg
917
930
 
918
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('air_leakage_shelter_coefficient', true)
919
- arg.setDisplayName('Air Leakage: Shelter Coefficient')
920
- arg.setUnits('Frac')
921
- arg.setDescription('The local shelter coefficient (AIM-2 infiltration model) accounts for nearby buildings, trees, and obstructions.')
931
+ air_leakage_shielding_of_home_choices = OpenStudio::StringVector.new
932
+ air_leakage_shielding_of_home_choices << Constants.Auto
933
+ air_leakage_shielding_of_home_choices << HPXML::ShieldingExposed
934
+ air_leakage_shielding_of_home_choices << HPXML::ShieldingNormal
935
+ air_leakage_shielding_of_home_choices << HPXML::ShieldingWellShielded
936
+
937
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('air_leakage_shielding_of_home', air_leakage_shielding_of_home_choices, true)
938
+ arg.setDisplayName('Air Leakage: Shielding of Home')
939
+ arg.setDescription('Presence of nearby buildings, trees, obstructions for infiltration model.')
922
940
  arg.setDefaultValue(Constants.Auto)
923
941
  args << arg
924
942
 
@@ -933,6 +951,8 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
933
951
  heating_system_type_choices << HPXML::HVACTypePortableHeater
934
952
  heating_system_type_choices << HPXML::HVACTypeFireplace
935
953
  heating_system_type_choices << HPXML::HVACTypeFixedHeater
954
+ heating_system_type_choices << "Shared #{HPXML::HVACTypeBoiler} w/ Baseboard"
955
+ heating_system_type_choices << "Shared #{HPXML::HVACTypeBoiler} w/ Ductless Fan Coil"
936
956
 
937
957
  heating_system_fuel_choices = OpenStudio::StringVector.new
938
958
  heating_system_fuel_choices << HPXML::FuelTypeElectricity
@@ -950,6 +970,10 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
950
970
  cooling_system_type_choices << HPXML::HVACTypeEvaporativeCooler
951
971
  cooling_system_type_choices << HPXML::HVACTypeMiniSplitAirConditioner
952
972
 
973
+ cooling_efficiency_type_choices = OpenStudio::StringVector.new
974
+ cooling_efficiency_type_choices << HPXML::UnitsSEER
975
+ cooling_efficiency_type_choices << HPXML::UnitsEER
976
+
953
977
  compressor_type_choices = OpenStudio::StringVector.new
954
978
  compressor_type_choices << HPXML::HVACCompressorTypeSingleStage
955
979
  compressor_type_choices << HPXML::HVACCompressorTypeTwoStage
@@ -988,16 +1012,10 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
988
1012
  arg.setDefaultValue(1)
989
1013
  args << arg
990
1014
 
991
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_electric_auxiliary_energy', false)
992
- arg.setDisplayName('Heating System: Electric Auxiliary Energy')
993
- arg.setDescription('The electric auxiliary energy of the heating system.')
994
- arg.setUnits('kWh/yr')
995
- args << arg
996
-
997
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('heating_system_has_flue_or_chimney', true)
998
- arg.setDisplayName('Heating System: Has Flue or Chimney')
999
- arg.setDescription('Whether the heating system has a flue or chimney.')
1000
- arg.setDefaultValue(false)
1015
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_airflow_defect_ratio', false)
1016
+ arg.setDisplayName('Heating System: Airflow Defect Ratio')
1017
+ arg.setDescription("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 #{HPXML::HVACTypeFurnace}.")
1018
+ arg.setUnits('Frac')
1001
1019
  args << arg
1002
1020
 
1003
1021
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooling_system_type', cooling_system_type_choices, true)
@@ -1006,18 +1024,17 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1006
1024
  arg.setDefaultValue(HPXML::HVACTypeCentralAirConditioner)
1007
1025
  args << arg
1008
1026
 
1009
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_cooling_efficiency_seer', true)
1010
- arg.setDisplayName('Cooling System: Rated SEER')
1011
- arg.setUnits('SEER')
1012
- arg.setDescription("The rated efficiency value of the #{HPXML::HVACTypeCentralAirConditioner} cooling system.")
1013
- arg.setDefaultValue(13.0)
1027
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooling_system_cooling_efficiency_type', cooling_efficiency_type_choices, true)
1028
+ arg.setDisplayName('Cooling System: Efficiency Type')
1029
+ arg.setDescription("The efficiency type of the cooling system. System types #{HPXML::HVACTypeCentralAirConditioner} and #{HPXML::HVACTypeMiniSplitAirConditioner} use #{HPXML::UnitsSEER}. System type #{HPXML::HVACTypeRoomAirConditioner} uses #{HPXML::UnitsEER}. Ignored for system type #{HPXML::HVACTypeEvaporativeCooler}.")
1030
+ arg.setDefaultValue(HPXML::UnitsSEER)
1014
1031
  args << arg
1015
1032
 
1016
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_cooling_efficiency_eer', true)
1017
- arg.setDisplayName('Cooling System: Rated EER')
1018
- arg.setUnits('EER')
1019
- arg.setDescription("The rated efficiency value of the #{HPXML::HVACTypeRoomAirConditioner} cooling system.")
1020
- arg.setDefaultValue(8.5)
1033
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_cooling_efficiency', true)
1034
+ arg.setDisplayName('Cooling System: Efficiency')
1035
+ arg.setUnits("#{HPXML::UnitsSEER} or #{HPXML::UnitsEER}")
1036
+ arg.setDescription("The rated efficiency value of the cooling system. Ignored for #{HPXML::HVACTypeEvaporativeCooler}.")
1037
+ arg.setDefaultValue(13.0)
1021
1038
  args << arg
1022
1039
 
1023
1040
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooling_system_cooling_compressor_type', compressor_type_choices, false)
@@ -1027,13 +1044,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1027
1044
 
1028
1045
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_cooling_sensible_heat_fraction', false)
1029
1046
  arg.setDisplayName('Cooling System: Cooling Sensible Heat Fraction')
1030
- arg.setDescription('The sensible heat fraction of the cooling system. Ignored for evaporative cooler.')
1047
+ arg.setDescription("The sensible heat fraction of the cooling system. Ignored for #{HPXML::HVACTypeEvaporativeCooler}.")
1031
1048
  arg.setUnits('Frac')
1032
1049
  args << arg
1033
1050
 
1034
1051
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('cooling_system_cooling_capacity', true)
1035
1052
  arg.setDisplayName('Cooling System: Cooling Capacity')
1036
- arg.setDescription("The output cooling capacity of the cooling system. If using '#{Constants.Auto}', the autosizing algorithm will use ACCA Manual J/S to set the capacity to meet its load served. Ignored for evaporative cooler.")
1053
+ arg.setDescription("The output cooling capacity of the cooling system. If using '#{Constants.Auto}', the autosizing algorithm will use ACCA Manual J/S to set the capacity to meet its load served.")
1037
1054
  arg.setUnits('tons')
1038
1055
  arg.setDefaultValue(Constants.Auto)
1039
1056
  args << arg
@@ -1047,16 +1064,32 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1047
1064
 
1048
1065
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('cooling_system_is_ducted', true)
1049
1066
  arg.setDisplayName('Cooling System: Is Ducted')
1050
- arg.setDescription("Whether the cooling system is ducted or not. Only used for #{HPXML::HVACTypeEvaporativeCooler} and #{HPXML::HVACTypeMiniSplitAirConditioner}.")
1067
+ arg.setDescription("Whether the cooling system is ducted or not. Only used for #{HPXML::HVACTypeMiniSplitAirConditioner} and #{HPXML::HVACTypeEvaporativeCooler}.")
1051
1068
  arg.setDefaultValue(false)
1052
1069
  args << arg
1053
1070
 
1071
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_airflow_defect_ratio', false)
1072
+ arg.setDisplayName('Cooling System: Airflow Defect Ratio')
1073
+ arg.setDescription("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 #{HPXML::HVACTypeCentralAirConditioner} and ducted #{HPXML::HVACTypeMiniSplitAirConditioner}.")
1074
+ arg.setUnits('Frac')
1075
+ args << arg
1076
+
1077
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_charge_defect_ratio', false)
1078
+ arg.setDisplayName('Cooling System: Charge Defect Ratio')
1079
+ arg.setDescription("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 #{HPXML::HVACTypeCentralAirConditioner} and #{HPXML::HVACTypeMiniSplitAirConditioner}.")
1080
+ arg.setUnits('Frac')
1081
+ args << arg
1082
+
1054
1083
  heat_pump_type_choices = OpenStudio::StringVector.new
1055
1084
  heat_pump_type_choices << 'none'
1056
1085
  heat_pump_type_choices << HPXML::HVACTypeHeatPumpAirToAir
1057
1086
  heat_pump_type_choices << HPXML::HVACTypeHeatPumpMiniSplit
1058
1087
  heat_pump_type_choices << HPXML::HVACTypeHeatPumpGroundToAir
1059
1088
 
1089
+ heat_pump_heating_efficiency_type_choices = OpenStudio::StringVector.new
1090
+ heat_pump_heating_efficiency_type_choices << HPXML::UnitsHSPF
1091
+ heat_pump_heating_efficiency_type_choices << HPXML::UnitsCOP
1092
+
1060
1093
  heat_pump_fuel_choices = OpenStudio::StringVector.new
1061
1094
  heat_pump_fuel_choices << HPXML::FuelTypeElectricity
1062
1095
 
@@ -1073,32 +1106,30 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1073
1106
  arg.setDefaultValue('none')
1074
1107
  args << arg
1075
1108
 
1076
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_efficiency_hspf', true)
1077
- arg.setDisplayName('Heat Pump: Rated Heating HSPF')
1078
- arg.setUnits('HSPF')
1079
- arg.setDescription("The rated heating efficiency value of the #{HPXML::HVACTypeHeatPumpAirToAir}/#{HPXML::HVACTypeHeatPumpMiniSplit} heat pump.")
1080
- arg.setDefaultValue(7.7)
1109
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_heating_efficiency_type', heat_pump_heating_efficiency_type_choices, true)
1110
+ arg.setDisplayName('Heat Pump: Heating Efficiency Type')
1111
+ arg.setDescription("The heating efficiency type of heat pump. System types #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit} use #{HPXML::UnitsHSPF}. System type #{HPXML::HVACTypeHeatPumpGroundToAir} uses #{HPXML::UnitsCOP}.")
1112
+ arg.setDefaultValue(HPXML::UnitsHSPF)
1081
1113
  args << arg
1082
1114
 
1083
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_efficiency_cop', true)
1084
- arg.setDisplayName('Heat Pump: Rated Heating COP')
1085
- arg.setUnits('COP')
1086
- arg.setDescription("The rated heating efficiency value of the #{HPXML::HVACTypeHeatPumpGroundToAir} heat pump.")
1087
- arg.setDefaultValue(3.6)
1115
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_efficiency', true)
1116
+ arg.setDisplayName('Heat Pump: Heating Efficiency')
1117
+ arg.setUnits("#{HPXML::UnitsHSPF} or #{HPXML::UnitsCOP}")
1118
+ arg.setDescription('The rated heating efficiency value of the heat pump.')
1119
+ arg.setDefaultValue(7.7)
1088
1120
  args << arg
1089
1121
 
1090
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_cooling_efficiency_seer', true)
1091
- arg.setDisplayName('Heat Pump: Rated Cooling SEER')
1092
- arg.setUnits('SEER')
1093
- arg.setDescription("The rated cooling efficiency value of the #{HPXML::HVACTypeHeatPumpAirToAir}/#{HPXML::HVACTypeHeatPumpMiniSplit} heat pump.")
1094
- arg.setDefaultValue(13.0)
1122
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_cooling_efficiency_type', cooling_efficiency_type_choices, true)
1123
+ arg.setDisplayName('Heat Pump: Cooling Efficiency Type')
1124
+ arg.setDescription("The cooling efficiency type of heat pump. System types #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit} use #{HPXML::UnitsSEER}. System type #{HPXML::HVACTypeHeatPumpGroundToAir} uses #{HPXML::UnitsEER}.")
1125
+ arg.setDefaultValue(HPXML::UnitsSEER)
1095
1126
  args << arg
1096
1127
 
1097
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_cooling_efficiency_eer', true)
1098
- arg.setDisplayName('Heat Pump: Rated Cooling EER')
1099
- arg.setUnits('EER')
1100
- arg.setDescription("The rated cooling efficiency value of the #{HPXML::HVACTypeHeatPumpGroundToAir} heat pump.")
1101
- arg.setDefaultValue(16.6)
1128
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_cooling_efficiency', true)
1129
+ arg.setDisplayName('Heat Pump: Cooling Efficiency')
1130
+ arg.setUnits("#{HPXML::UnitsSEER} or #{HPXML::UnitsEER}")
1131
+ arg.setDescription('The rated cooling efficiency value of the heat pump.')
1132
+ arg.setDefaultValue(13.0)
1102
1133
  args << arg
1103
1134
 
1104
1135
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_cooling_compressor_type', compressor_type_choices, false)
@@ -1119,7 +1150,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1119
1150
  arg.setDefaultValue(Constants.Auto)
1120
1151
  args << arg
1121
1152
 
1122
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('heat_pump_heating_capacity_17F', true)
1153
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('heat_pump_heating_capacity_17_f', true)
1123
1154
  arg.setDisplayName('Heat Pump: Heating Capacity 17F')
1124
1155
  arg.setDescription("The output heating capacity of the heat pump at 17F. Only applies to #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit}.")
1125
1156
  arg.setUnits('Btu/hr')
@@ -1168,77 +1199,96 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1168
1199
 
1169
1200
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_backup_heating_switchover_temp', false)
1170
1201
  arg.setDisplayName('Heat Pump: Backup Heating Switchover Temperature')
1171
- arg.setDescription('The temperature at which the heat pump stops operating and the backup heating system starts running. Only applies to air-to-air and mini-split.')
1202
+ arg.setDescription('The temperature at which the heat pump stops operating and the backup heating system starts running. Only applies to air-to-air and mini-split. If not provided, backup heating will operate as needed when heat pump capacity is insufficient.')
1172
1203
  arg.setUnits('deg-F')
1173
1204
  args << arg
1174
1205
 
1175
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('heat_pump_mini_split_is_ducted', false)
1176
- arg.setDisplayName('Heat Pump: Mini-Split Is Ducted')
1177
- arg.setDescription('Whether the mini-split heat pump is ducted or not.')
1206
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('heat_pump_is_ducted', false)
1207
+ arg.setDisplayName('Heat Pump: Is Ducted')
1208
+ arg.setDescription("Whether the heat pump is ducted or not. Only used for #{HPXML::HVACTypeHeatPumpMiniSplit}.")
1178
1209
  args << arg
1179
1210
 
1180
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_ground_to_air_pump_power', false)
1181
- arg.setDisplayName('Heat Pump: Ground-to-Air Pump Power')
1182
- arg.setDescription('Ground loop circulator pump power during operation of the heat pump.')
1183
- arg.setUnits('watt/ton')
1211
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_airflow_defect_ratio', false)
1212
+ arg.setDisplayName('Heat Pump: Airflow Defect Ratio')
1213
+ arg.setDescription("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 #{HPXML::HVACTypeHeatPumpAirToAir}, ducted #{HPXML::HVACTypeHeatPumpMiniSplit}, and #{HPXML::HVACTypeHeatPumpGroundToAir}.")
1214
+ arg.setUnits('Frac')
1184
1215
  args << arg
1185
1216
 
1186
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_ground_to_air_fan_power', false)
1187
- arg.setDisplayName('Heat Pump: Ground-to-Air Fan Power')
1188
- arg.setDescription('Blower fan power.')
1189
- arg.setUnits('watt/CFM')
1217
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_charge_defect_ratio', false)
1218
+ arg.setDisplayName('Heat Pump: Charge Defect Ratio')
1219
+ arg.setDescription('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.')
1220
+ arg.setUnits('Frac')
1190
1221
  args << arg
1191
1222
 
1192
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('setpoint_heating_temp', true)
1193
- arg.setDisplayName('Setpoint: Heating Temperature')
1194
- arg.setDescription('Specify the heating setpoint temperature.')
1195
- arg.setUnits('deg-F')
1196
- arg.setDefaultValue(71)
1223
+ heating_system_type_2_choices = OpenStudio::StringVector.new
1224
+ heating_system_type_2_choices << 'none'
1225
+ heating_system_type_2_choices << HPXML::HVACTypeWallFurnace
1226
+ heating_system_type_2_choices << HPXML::HVACTypeFloorFurnace
1227
+ heating_system_type_2_choices << HPXML::HVACTypeBoiler
1228
+ heating_system_type_2_choices << HPXML::HVACTypeElectricResistance
1229
+ heating_system_type_2_choices << HPXML::HVACTypeStove
1230
+ heating_system_type_2_choices << HPXML::HVACTypePortableHeater
1231
+ heating_system_type_2_choices << HPXML::HVACTypeFireplace
1232
+
1233
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system_type_2', heating_system_type_2_choices, true)
1234
+ arg.setDisplayName('Heating System 2: Type')
1235
+ arg.setDescription('The type of the second heating system.')
1236
+ arg.setDefaultValue('none')
1197
1237
  args << arg
1198
1238
 
1199
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('setpoint_heating_setback_temp', true)
1200
- arg.setDisplayName('Setpoint: Heating Setback Temperature')
1201
- arg.setDescription('Specify the heating setback temperature.')
1202
- arg.setUnits('deg-F')
1203
- arg.setDefaultValue(71)
1239
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system_fuel_2', heating_system_fuel_choices, true)
1240
+ arg.setDisplayName('Heating System 2: Fuel Type')
1241
+ arg.setDescription("The fuel type of the second heating system. Ignored for #{HPXML::HVACTypeElectricResistance}.")
1242
+ arg.setDefaultValue(HPXML::FuelTypeElectricity)
1204
1243
  args << arg
1205
1244
 
1206
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('setpoint_heating_setback_hours_per_week', true)
1207
- arg.setDisplayName('Setpoint: Heating Setback Hours per Week')
1208
- arg.setDescription('Specify the heating setback number of hours per week value.')
1209
- arg.setDefaultValue(0)
1245
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_heating_efficiency_2', true)
1246
+ arg.setDisplayName('Heating System 2: Rated AFUE or Percent')
1247
+ arg.setUnits('Frac')
1248
+ arg.setDescription('For Furnace/WallFurnace/FloorFurnace/Boiler second heating system, the rated AFUE value. For ElectricResistance/Stove/PortableHeater/Fireplace, the rated Percent value.')
1249
+ arg.setDefaultValue(1.0)
1210
1250
  args << arg
1211
1251
 
1212
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('setpoint_heating_setback_start_hour', true)
1213
- arg.setDisplayName('Setpoint: Heating Setback Start Hour')
1214
- arg.setDescription('Specify the heating setback start hour value. 0 = midnight, 12 = noon')
1215
- arg.setDefaultValue(23)
1252
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('heating_system_heating_capacity_2', true)
1253
+ arg.setDisplayName('Heating System 2: Heating Capacity')
1254
+ arg.setDescription("The output heating capacity of the second heating system. If using '#{Constants.Auto}', the autosizing algorithm will use ACCA Manual J/S to set the capacity to meet its load served.")
1255
+ arg.setUnits('Btu/hr')
1256
+ arg.setDefaultValue(Constants.Auto)
1257
+ args << arg
1258
+
1259
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_fraction_heat_load_served_2', true)
1260
+ arg.setDisplayName('Heating System 2: Fraction Heat Load Served')
1261
+ arg.setDescription('The heat load served fraction of the second heating system.')
1262
+ arg.setUnits('Frac')
1263
+ arg.setDefaultValue(0.25)
1216
1264
  args << arg
1217
1265
 
1218
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('setpoint_cooling_temp', true)
1219
- arg.setDisplayName('Setpoint: Cooling Temperature')
1220
- arg.setDescription('Specify the cooling setpoint temperature.')
1266
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('setpoint_heating_weekday', true)
1267
+ arg.setDisplayName('Heating Setpoint: Weekday Schedule')
1268
+ arg.setDescription('Specify the constant or 24-hour comma-separated weekday heating schedule.')
1221
1269
  arg.setUnits('deg-F')
1222
- arg.setDefaultValue(76)
1270
+ arg.setDefaultValue('71')
1223
1271
  args << arg
1224
1272
 
1225
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('setpoint_cooling_setup_temp', true)
1226
- arg.setDisplayName('Setpoint: Cooling Setup Temperature')
1227
- arg.setDescription('Specify the cooling setup temperature.')
1273
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('setpoint_heating_weekend', true)
1274
+ arg.setDisplayName('Heating Setpoint: Weekend Schedule')
1275
+ arg.setDescription('Specify the constant or 24-hour comma-separated weekend heating schedule.')
1228
1276
  arg.setUnits('deg-F')
1229
- arg.setDefaultValue(76)
1277
+ arg.setDefaultValue('71')
1230
1278
  args << arg
1231
1279
 
1232
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('setpoint_cooling_setup_hours_per_week', true)
1233
- arg.setDisplayName('Setpoint: Cooling Setup Hours per Week')
1234
- arg.setDescription('Specify the cooling setup number of hours per week value.')
1235
- arg.setDefaultValue(0)
1280
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('setpoint_cooling_weekday', true)
1281
+ arg.setDisplayName('Cooling Setpoint: Weekday Schedule')
1282
+ arg.setDescription('Specify the constant or 24-hour comma-separated weekday cooling schedule.')
1283
+ arg.setUnits('deg-F')
1284
+ arg.setDefaultValue('76')
1236
1285
  args << arg
1237
1286
 
1238
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('setpoint_cooling_setup_start_hour', true)
1239
- arg.setDisplayName('Setpoint: Cooling Setup Start Hour')
1240
- arg.setDescription('Specify the cooling setup start hour value. 0 = midnight, 12 = noon')
1241
- arg.setDefaultValue(9)
1287
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('setpoint_cooling_weekend', true)
1288
+ arg.setDisplayName('Cooling Setpoint: Weekend Schedule')
1289
+ arg.setDescription('Specify the constant or 24-hour comma-separated weekend cooling schedule.')
1290
+ arg.setUnits('deg-F')
1291
+ arg.setDefaultValue('76')
1242
1292
  args << arg
1243
1293
 
1244
1294
  duct_leakage_units_choices = OpenStudio::StringVector.new
@@ -1330,65 +1380,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1330
1380
 
1331
1381
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('ducts_number_of_return_registers', true)
1332
1382
  arg.setDisplayName('Ducts: Number of Return Registers')
1333
- arg.setDescription('The number of return registers of the ducts.')
1383
+ arg.setDescription("The number of return registers of the ducts. Ignored for ducted #{HPXML::HVACTypeEvaporativeCooler}.")
1334
1384
  arg.setUnits('#')
1335
1385
  arg.setDefaultValue(Constants.Auto)
1336
1386
  args << arg
1337
1387
 
1338
- heating_system_type_2_choices = OpenStudio::StringVector.new
1339
- heating_system_type_2_choices << 'none'
1340
- heating_system_type_2_choices << HPXML::HVACTypeWallFurnace
1341
- heating_system_type_2_choices << HPXML::HVACTypeFloorFurnace
1342
- heating_system_type_2_choices << HPXML::HVACTypeElectricResistance
1343
- heating_system_type_2_choices << HPXML::HVACTypeStove
1344
- heating_system_type_2_choices << HPXML::HVACTypePortableHeater
1345
- heating_system_type_2_choices << HPXML::HVACTypeFireplace
1346
-
1347
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system_type_2', heating_system_type_2_choices, true)
1348
- arg.setDisplayName('Heating System 2: Type')
1349
- arg.setDescription('The type of the second heating system.')
1350
- arg.setDefaultValue('none')
1351
- args << arg
1352
-
1353
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system_fuel_2', heating_system_fuel_choices, true)
1354
- arg.setDisplayName('Heating System 2: Fuel Type')
1355
- arg.setDescription('The fuel type of the second heating system. Ignored for ElectricResistance.')
1356
- arg.setDefaultValue(HPXML::FuelTypeElectricity)
1357
- args << arg
1358
-
1359
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_heating_efficiency_2', true)
1360
- arg.setDisplayName('Heating System 2: Rated AFUE or Percent')
1361
- arg.setUnits('Frac')
1362
- arg.setDescription('For Furnace/WallFurnace/FloorFurnace/Boiler second heating system, the rated AFUE value. For ElectricResistance/Stove/PortableHeater/Fireplace, the rated Percent value.')
1363
- arg.setDefaultValue(1.0)
1364
- args << arg
1365
-
1366
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('heating_system_heating_capacity_2', true)
1367
- arg.setDisplayName('Heating System 2: Heating Capacity')
1368
- arg.setDescription("The output heating capacity of the second heating system. If using '#{Constants.Auto}', the autosizing algorithm will use ACCA Manual J/S to set the capacity to meet its load served.")
1369
- arg.setUnits('Btu/hr')
1370
- arg.setDefaultValue(Constants.Auto)
1371
- args << arg
1372
-
1373
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_fraction_heat_load_served_2', true)
1374
- arg.setDisplayName('Heating System 2: Fraction Heat Load Served')
1375
- arg.setDescription('The heat load served fraction of the second heating system.')
1376
- arg.setUnits('Frac')
1377
- arg.setDefaultValue(0.25)
1378
- args << arg
1379
-
1380
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_electric_auxiliary_energy_2', false)
1381
- arg.setDisplayName('Heating System 2: Electric Auxiliary Energy')
1382
- arg.setDescription('The electric auxiliary energy of the second heating system.')
1383
- arg.setUnits('kWh/yr')
1384
- args << arg
1385
-
1386
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('heating_system_has_flue_or_chimney_2', true)
1387
- arg.setDisplayName('Heating System 2: Has Flue or Chimney')
1388
- arg.setDescription('Whether the second heating system has a flue or chimney.')
1389
- arg.setDefaultValue(false)
1390
- args << arg
1391
-
1392
1388
  mech_vent_fan_type_choices = OpenStudio::StringVector.new
1393
1389
  mech_vent_fan_type_choices << 'none'
1394
1390
  mech_vent_fan_type_choices << HPXML::MechVentTypeExhaust
@@ -1418,11 +1414,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1418
1414
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_hours_in_operation', true)
1419
1415
  arg.setDisplayName('Mechanical Ventilation: Hours In Operation')
1420
1416
  arg.setDescription('The hours in operation of the mechanical ventilation.')
1421
- arg.setUnits('hrs')
1417
+ arg.setUnits('hrs/day')
1422
1418
  arg.setDefaultValue(24)
1423
1419
  args << arg
1424
1420
 
1425
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('mech_vent_total_recovery_efficiency_type', mech_vent_recovery_efficiency_type_choices, true)
1421
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('mech_vent_recovery_efficiency_type', mech_vent_recovery_efficiency_type_choices, true)
1426
1422
  arg.setDisplayName('Mechanical Ventilation: Total Recovery Efficiency Type')
1427
1423
  arg.setDescription('The total recovery efficiency type of the mechanical ventilation.')
1428
1424
  arg.setDefaultValue('Unadjusted')
@@ -1430,20 +1426,14 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1430
1426
 
1431
1427
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_total_recovery_efficiency', true)
1432
1428
  arg.setDisplayName('Mechanical Ventilation: Total Recovery Efficiency')
1433
- arg.setDescription('The Unadjusted or Adjusted total recovery efficiency of the mechanical ventilation.')
1429
+ arg.setDescription("The Unadjusted or Adjusted total recovery efficiency of the mechanical ventilation. Applies to #{HPXML::MechVentTypeERV}.")
1434
1430
  arg.setUnits('Frac')
1435
1431
  arg.setDefaultValue(0.48)
1436
1432
  args << arg
1437
1433
 
1438
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('mech_vent_sensible_recovery_efficiency_type', mech_vent_recovery_efficiency_type_choices, true)
1439
- arg.setDisplayName('Mechanical Ventilation: Sensible Recovery Efficiency Type')
1440
- arg.setDescription('The sensible recovery efficiency type of the mechanical ventilation.')
1441
- arg.setDefaultValue('Unadjusted')
1442
- args << arg
1443
-
1444
1434
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_sensible_recovery_efficiency', true)
1445
1435
  arg.setDisplayName('Mechanical Ventilation: Sensible Recovery Efficiency')
1446
- arg.setDescription('The Unadjusted or Adjusted sensible recovery efficiency of the mechanical ventilation.')
1436
+ arg.setDescription("The Unadjusted or Adjusted sensible recovery efficiency of the mechanical ventilation. Applies to #{HPXML::MechVentTypeERV} and #{HPXML::MechVentTypeHRV}.")
1447
1437
  arg.setUnits('Frac')
1448
1438
  arg.setDefaultValue(0.72)
1449
1439
  args << arg
@@ -1455,16 +1445,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1455
1445
  arg.setDefaultValue(30)
1456
1446
  args << arg
1457
1447
 
1458
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('mech_vent_is_shared_system', true)
1459
- arg.setDisplayName('Mechanical Ventilation: Is Shared System')
1460
- arg.setDescription('Whether the mechanical ventilation is a shared system. If true, assumed to serve all the units in the building.')
1461
- arg.setDefaultValue(false)
1462
- args << arg
1463
-
1464
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('shared_mech_vent_in_unit_flow_rate', false)
1465
- arg.setDisplayName('Shared Mechanical Ventilation: In-Unit Flow Rate')
1466
- arg.setDescription('The flow rate delivered to the dwelling unit. This is required for a shared mechanical ventilation system.')
1467
- arg.setUnits('CFM')
1448
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('mech_vent_num_units_served', true)
1449
+ arg.setDisplayName('Mechanical Ventilation: Number of Units Served')
1450
+ arg.setDescription("Number of dwelling units served by the mechanical ventilation system. Must be 1 if #{HPXML::ResidentialTypeSFD}. Used to apportion flow rate and fan power to the unit.")
1451
+ arg.setUnits('#')
1452
+ arg.setDefaultValue(1)
1468
1453
  args << arg
1469
1454
 
1470
1455
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('shared_mech_vent_frac_recirculation', false)
@@ -1475,12 +1460,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1475
1460
 
1476
1461
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('shared_mech_vent_preheating_fuel', heating_system_fuel_choices, false)
1477
1462
  arg.setDisplayName('Shared Mechanical Ventilation: Preheating Fuel')
1478
- arg.setDescription('Fuel type of the preconditioning heating equipment.')
1463
+ arg.setDescription('Fuel type of the preconditioning heating equipment. Only used for a shared mechanical ventilation system.')
1479
1464
  args << arg
1480
1465
 
1481
1466
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('shared_mech_vent_preheating_efficiency', false)
1482
1467
  arg.setDisplayName('Shared Mechanical Ventilation: Preheating Efficiency')
1483
- arg.setDescription('Efficiency of the preconditioning heating equipment.')
1468
+ arg.setDescription('Efficiency of the preconditioning heating equipment. Only used for a shared mechanical ventilation system.')
1484
1469
  arg.setUnits('COP')
1485
1470
  args << arg
1486
1471
 
@@ -1495,12 +1480,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1495
1480
 
1496
1481
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('shared_mech_vent_precooling_fuel', cooling_system_fuel_choices, false)
1497
1482
  arg.setDisplayName('Shared Mechanical Ventilation: Precooling Fuel')
1498
- arg.setDescription('Fuel type of the preconditioning cooling equipment.')
1483
+ arg.setDescription('Fuel type of the preconditioning cooling equipment. Only used for a shared mechanical ventilation system.')
1499
1484
  args << arg
1500
1485
 
1501
1486
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('shared_mech_vent_precooling_efficiency', false)
1502
1487
  arg.setDisplayName('Shared Mechanical Ventilation: Precooling Efficiency')
1503
- arg.setDescription('Efficiency of the preconditioning cooling equipment.')
1488
+ arg.setDescription('Efficiency of the preconditioning cooling equipment. Only used for a shared mechanical ventilation system.')
1504
1489
  arg.setUnits('COP')
1505
1490
  args << arg
1506
1491
 
@@ -1510,7 +1495,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1510
1495
  arg.setUnits('Frac')
1511
1496
  args << arg
1512
1497
 
1513
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('mech_vent_fan_type_2', mech_vent_fan_type_choices, true)
1498
+ mech_vent_fan_type_2_choices = OpenStudio::StringVector.new
1499
+ mech_vent_fan_type_2_choices << 'none'
1500
+ mech_vent_fan_type_2_choices << HPXML::MechVentTypeExhaust
1501
+ mech_vent_fan_type_2_choices << HPXML::MechVentTypeSupply
1502
+ mech_vent_fan_type_2_choices << HPXML::MechVentTypeERV
1503
+ mech_vent_fan_type_2_choices << HPXML::MechVentTypeHRV
1504
+ mech_vent_fan_type_2_choices << HPXML::MechVentTypeBalanced
1505
+
1506
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('mech_vent_fan_type_2', mech_vent_fan_type_2_choices, true)
1514
1507
  arg.setDisplayName('Mechanical Ventilation 2: Fan Type')
1515
1508
  arg.setDescription("The type of the second mechanical ventilation. Use 'none' if there is no second mechanical ventilation system.")
1516
1509
  arg.setDefaultValue('none')
@@ -1526,11 +1519,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1526
1519
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_hours_in_operation_2', true)
1527
1520
  arg.setDisplayName('Mechanical Ventilation 2: Hours In Operation')
1528
1521
  arg.setDescription('The hours in operation of the second mechanical ventilation.')
1529
- arg.setUnits('hrs')
1522
+ arg.setUnits('hrs/day')
1530
1523
  arg.setDefaultValue(24)
1531
1524
  args << arg
1532
1525
 
1533
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('mech_vent_total_recovery_efficiency_type_2', mech_vent_recovery_efficiency_type_choices, true)
1526
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('mech_vent_recovery_efficiency_type_2', mech_vent_recovery_efficiency_type_choices, true)
1534
1527
  arg.setDisplayName('Mechanical Ventilation 2: Total Recovery Efficiency Type')
1535
1528
  arg.setDescription('The total recovery efficiency type of the second mechanical ventilation.')
1536
1529
  arg.setDefaultValue('Unadjusted')
@@ -1538,20 +1531,14 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1538
1531
 
1539
1532
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_total_recovery_efficiency_2', true)
1540
1533
  arg.setDisplayName('Mechanical Ventilation 2: Total Recovery Efficiency')
1541
- arg.setDescription('The Unadjusted or Adjusted total recovery efficiency of the second mechanical ventilation.')
1534
+ arg.setDescription("The Unadjusted or Adjusted total recovery efficiency of the second mechanical ventilation. Applies to #{HPXML::MechVentTypeERV}.")
1542
1535
  arg.setUnits('Frac')
1543
1536
  arg.setDefaultValue(0.48)
1544
1537
  args << arg
1545
1538
 
1546
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('mech_vent_sensible_recovery_efficiency_type_2', mech_vent_recovery_efficiency_type_choices, true)
1547
- arg.setDisplayName('Mechanical Ventilation 2: Sensible Recovery Efficiency Type')
1548
- arg.setDescription('The sensible recovery efficiency type of the second mechanical ventilation.')
1549
- arg.setDefaultValue('Unadjusted')
1550
- args << arg
1551
-
1552
1539
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_sensible_recovery_efficiency_2', true)
1553
1540
  arg.setDisplayName('Mechanical Ventilation 2: Sensible Recovery Efficiency')
1554
- arg.setDescription('The Unadjusted or Adjusted sensible recovery efficiency of the second mechanical ventilation.')
1541
+ arg.setDescription("The Unadjusted or Adjusted sensible recovery efficiency of the second mechanical ventilation. Applies to #{HPXML::MechVentTypeERV} and #{HPXML::MechVentTypeHRV}.")
1555
1542
  arg.setUnits('Frac')
1556
1543
  arg.setDefaultValue(0.72)
1557
1544
  args << arg
@@ -1563,76 +1550,74 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1563
1550
  arg.setDefaultValue(30)
1564
1551
  args << arg
1565
1552
 
1566
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('kitchen_fans_present', true)
1567
- arg.setDisplayName('Kitchen Fans: Present')
1568
- arg.setDescription('Whether there are kitchen fans.')
1569
- arg.setDefaultValue(false)
1570
- args << arg
1571
-
1572
- arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('kitchen_fans_quantity', false)
1553
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('kitchen_fans_quantity', true)
1573
1554
  arg.setDisplayName('Kitchen Fans: Quantity')
1574
1555
  arg.setDescription('The quantity of the kitchen fans.')
1575
1556
  arg.setUnits('#')
1557
+ arg.setDefaultValue(Constants.Auto)
1576
1558
  args << arg
1577
1559
 
1578
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_flow_rate', false)
1560
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('kitchen_fans_flow_rate', false)
1579
1561
  arg.setDisplayName('Kitchen Fans: Flow Rate')
1580
1562
  arg.setDescription('The flow rate of the kitchen fan.')
1581
1563
  arg.setUnits('CFM')
1564
+ arg.setDefaultValue(Constants.Auto)
1582
1565
  args << arg
1583
1566
 
1584
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_hours_in_operation', false)
1567
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('kitchen_fans_hours_in_operation', false)
1585
1568
  arg.setDisplayName('Kitchen Fans: Hours In Operation')
1586
1569
  arg.setDescription('The hours in operation of the kitchen fan.')
1587
- arg.setUnits('hrs')
1570
+ arg.setUnits('hrs/day')
1571
+ arg.setDefaultValue(Constants.Auto)
1588
1572
  args << arg
1589
1573
 
1590
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_power', false)
1574
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('kitchen_fans_power', false)
1591
1575
  arg.setDisplayName('Kitchen Fans: Fan Power')
1592
1576
  arg.setDescription('The fan power of the kitchen fan.')
1593
1577
  arg.setUnits('W')
1578
+ arg.setDefaultValue(Constants.Auto)
1594
1579
  args << arg
1595
1580
 
1596
- arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('kitchen_fans_start_hour', false)
1581
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('kitchen_fans_start_hour', false)
1597
1582
  arg.setDisplayName('Kitchen Fans: Start Hour')
1598
1583
  arg.setDescription('The start hour of the kitchen fan.')
1599
1584
  arg.setUnits('hr')
1585
+ arg.setDefaultValue(Constants.Auto)
1600
1586
  args << arg
1601
1587
 
1602
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('bathroom_fans_present', true)
1603
- arg.setDisplayName('Bathroom Fans: Present')
1604
- arg.setDescription('Whether there are bathroom fans.')
1605
- arg.setDefaultValue(false)
1606
- args << arg
1607
-
1608
- arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('bathroom_fans_quantity', false)
1588
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('bathroom_fans_quantity', true)
1609
1589
  arg.setDisplayName('Bathroom Fans: Quantity')
1610
1590
  arg.setDescription('The quantity of the bathroom fans.')
1611
1591
  arg.setUnits('#')
1592
+ arg.setDefaultValue(Constants.Auto)
1612
1593
  args << arg
1613
1594
 
1614
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_flow_rate', false)
1595
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('bathroom_fans_flow_rate', false)
1615
1596
  arg.setDisplayName('Bathroom Fans: Flow Rate')
1616
1597
  arg.setDescription('The flow rate of the bathroom fans.')
1617
1598
  arg.setUnits('CFM')
1599
+ arg.setDefaultValue(Constants.Auto)
1618
1600
  args << arg
1619
1601
 
1620
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_hours_in_operation', false)
1602
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('bathroom_fans_hours_in_operation', false)
1621
1603
  arg.setDisplayName('Bathroom Fans: Hours In Operation')
1622
1604
  arg.setDescription('The hours in operation of the bathroom fans.')
1623
- arg.setUnits('hrs')
1605
+ arg.setUnits('hrs/day')
1606
+ arg.setDefaultValue(Constants.Auto)
1624
1607
  args << arg
1625
1608
 
1626
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_power', false)
1609
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('bathroom_fans_power', false)
1627
1610
  arg.setDisplayName('Bathroom Fans: Fan Power')
1628
1611
  arg.setDescription('The fan power of the bathroom fans.')
1629
1612
  arg.setUnits('W')
1613
+ arg.setDefaultValue(Constants.Auto)
1630
1614
  args << arg
1631
1615
 
1632
- arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('bathroom_fans_start_hour', false)
1616
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('bathroom_fans_start_hour', false)
1633
1617
  arg.setDisplayName('Bathroom Fans: Start Hour')
1634
1618
  arg.setDescription('The start hour of the bathroom fans.')
1635
1619
  arg.setUnits('hr')
1620
+ arg.setDefaultValue(Constants.Auto)
1636
1621
  args << arg
1637
1622
 
1638
1623
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('whole_house_fan_present', true)
@@ -1711,34 +1696,28 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1711
1696
 
1712
1697
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('water_heater_tank_volume', true)
1713
1698
  arg.setDisplayName('Water Heater: Tank Volume')
1714
- arg.setDescription("Nominal volume of water heater tank. Set to #{Constants.Auto} to have volume autosized. Only applies to #{HPXML::WaterHeaterTypeStorage}, #{HPXML::WaterHeaterTypeHeatPump}, and #{HPXML::WaterHeaterTypeCombiStorage}.")
1699
+ arg.setDescription("Nominal volume of water heater tank. Set to '#{Constants.Auto}' to have volume autosized. Only applies to #{HPXML::WaterHeaterTypeStorage}, #{HPXML::WaterHeaterTypeHeatPump}, and #{HPXML::WaterHeaterTypeCombiStorage}.")
1715
1700
  arg.setUnits('gal')
1716
1701
  arg.setDefaultValue(Constants.Auto)
1717
1702
  args << arg
1718
1703
 
1719
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('water_heater_heating_capacity', true)
1720
- arg.setDisplayName('Water Heater: Input Capacity')
1721
- arg.setDescription("The maximum energy input rating of water heater. Set to #{Constants.Auto} to have this field autosized. Only applies to #{HPXML::WaterHeaterTypeStorage}.")
1722
- arg.setUnits('Btu/hr')
1723
- arg.setDefaultValue(Constants.Auto)
1724
- args << arg
1725
-
1726
1704
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_efficiency_type', water_heater_efficiency_type_choices, true)
1727
1705
  arg.setDisplayName('Water Heater: Efficiency Type')
1728
1706
  arg.setDescription('The efficiency type of water heater. Does not apply to space-heating boilers.')
1729
1707
  arg.setDefaultValue('EnergyFactor')
1730
1708
  args << arg
1731
1709
 
1732
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_efficiency_ef', true)
1733
- arg.setDisplayName('Water Heater: Energy Factor')
1734
- arg.setDescription('Ratio of useful energy output from water heater to the total amount of energy delivered from the water heater.')
1710
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_efficiency', true)
1711
+ arg.setDisplayName('Water Heater: Efficiency')
1712
+ arg.setDescription('Rated Energy Factor or Uniform Energy Factor. Does not apply to space-heating boilers.')
1735
1713
  arg.setDefaultValue(0.67)
1736
1714
  args << arg
1737
1715
 
1738
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_efficiency_uef', true)
1739
- arg.setDisplayName('Water Heater: Uniform Energy Factor')
1740
- arg.setDescription('The uniform energy factor of water heater. Does not apply to space-heating boilers.')
1741
- arg.setDefaultValue(0.67)
1716
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_first_hour_rating', false)
1717
+ arg.setDisplayName('Water Heater: First Hour Rating')
1718
+ arg.setDescription("Rated gallons of hot water supplied in an hour. Required if Efficiency Type is UniformEnergyFactor and Type is not #{HPXML::WaterHeaterTypeTankless}. Does not apply to space-heating boilers.")
1719
+ arg.setUnits('gal/hr')
1720
+ arg.setDefaultValue(56.0)
1742
1721
  args << arg
1743
1722
 
1744
1723
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('water_heater_recovery_efficiency', true)
@@ -1767,22 +1746,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1767
1746
  arg.setDefaultValue(Constants.Auto)
1768
1747
  args << arg
1769
1748
 
1770
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_performance_adjustment', false)
1771
- arg.setDisplayName('Water Heater: Performance Adjustment')
1772
- arg.setDescription("A performance adjustment due to cycling inefficiencies. Only applies to #{HPXML::WaterHeaterTypeTankless}.")
1773
- arg.setUnits('Frac')
1774
- args << arg
1775
-
1776
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('water_heater_has_flue_or_chimney', true)
1777
- arg.setDisplayName('Water Heater: Has Flue or Chimney')
1778
- arg.setDescription('Whether the water heater has a flue or chimney.')
1779
- arg.setDefaultValue(false)
1780
- args << arg
1781
-
1782
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('water_heater_is_shared_system', true)
1783
- arg.setDisplayName('Water Heater: Is Shared System')
1784
- arg.setDescription('Whether the water heater is a shared system. If true, assumed to serve all the units in the building.')
1785
- arg.setDefaultValue(false)
1749
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('water_heater_num_units_served', true)
1750
+ arg.setDisplayName('Water Heater: Number of Units Served')
1751
+ arg.setDescription("Number of dwelling units served (directly or indirectly) by the water heater. Must be 1 if #{HPXML::ResidentialTypeSFD}. Used to apportion water heater tank losses to the unit.")
1752
+ arg.setUnits('#')
1753
+ arg.setDefaultValue(1)
1786
1754
  args << arg
1787
1755
 
1788
1756
  dhw_distribution_system_type_choices = OpenStudio::StringVector.new
@@ -1836,11 +1804,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1836
1804
  arg.setDefaultValue(Constants.Auto)
1837
1805
  args << arg
1838
1806
 
1839
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dhw_distribution_pipe_r', true)
1807
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('dhw_distribution_pipe_r', true)
1840
1808
  arg.setDisplayName('Hot Water Distribution: Pipe Insulation Nominal R-Value')
1841
1809
  arg.setUnits('h-ft^2-R/Btu')
1842
1810
  arg.setDescription('Nominal R-value of the pipe insulation.')
1843
- arg.setDefaultValue(0.0)
1811
+ arg.setDefaultValue(Constants.Auto)
1844
1812
  args << arg
1845
1813
 
1846
1814
  dwhr_facilities_connected_choices = OpenStudio::StringVector.new
@@ -1850,7 +1818,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1850
1818
 
1851
1819
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('dwhr_facilities_connected', dwhr_facilities_connected_choices, true)
1852
1820
  arg.setDisplayName('Drain Water Heat Recovery: Facilities Connected')
1853
- arg.setDescription("Which facilities are connected for the drain water heat recovery. Use 'none' if there is no drawin water heat recovery system.")
1821
+ arg.setDescription("Which facilities are connected for the drain water heat recovery. Use 'none' if there is no drain water heat recovery system.")
1854
1822
  arg.setDefaultValue('none')
1855
1823
  args << arg
1856
1824
 
@@ -1969,15 +1937,18 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1969
1937
 
1970
1938
  pv_system_module_type_choices = OpenStudio::StringVector.new
1971
1939
  pv_system_module_type_choices << 'none'
1940
+ pv_system_module_type_choices << Constants.Auto
1972
1941
  pv_system_module_type_choices << HPXML::PVModuleTypeStandard
1973
1942
  pv_system_module_type_choices << HPXML::PVModuleTypePremium
1974
1943
  pv_system_module_type_choices << HPXML::PVModuleTypeThinFilm
1975
1944
 
1976
1945
  pv_system_location_choices = OpenStudio::StringVector.new
1946
+ pv_system_location_choices << Constants.Auto
1977
1947
  pv_system_location_choices << HPXML::LocationRoof
1978
1948
  pv_system_location_choices << HPXML::LocationGround
1979
1949
 
1980
1950
  pv_system_tracking_choices = OpenStudio::StringVector.new
1951
+ pv_system_tracking_choices << Constants.Auto
1981
1952
  pv_system_tracking_choices << HPXML::PVTrackingTypeFixed
1982
1953
  pv_system_tracking_choices << HPXML::PVTrackingType1Axis
1983
1954
  pv_system_tracking_choices << HPXML::PVTrackingType1AxisBacktracked
@@ -1992,13 +1963,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1992
1963
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_location_1', pv_system_location_choices, true)
1993
1964
  arg.setDisplayName('Photovoltaics 1: Location')
1994
1965
  arg.setDescription('Location of the PV system 1.')
1995
- arg.setDefaultValue(HPXML::LocationRoof)
1966
+ arg.setDefaultValue(Constants.Auto)
1996
1967
  args << arg
1997
1968
 
1998
1969
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_tracking_1', pv_system_tracking_choices, true)
1999
1970
  arg.setDisplayName('Photovoltaics 1: Tracking')
2000
1971
  arg.setDescription('Tracking of the PV system 1.')
2001
- arg.setDefaultValue(HPXML::PVTrackingTypeFixed)
1972
+ arg.setDefaultValue(Constants.Auto)
2002
1973
  args << arg
2003
1974
 
2004
1975
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_array_azimuth_1', true)
@@ -2034,10 +2005,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2034
2005
  arg.setDescription('System losses fraction of the PV system 1.')
2035
2006
  args << arg
2036
2007
 
2037
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('pv_system_is_shared_1', true)
2038
- arg.setDisplayName('Photovoltaics 1: Is Shared System')
2039
- arg.setDescription('Whether PV system 1 is shared. If true, assumed to serve all the units in the building.')
2040
- arg.setDefaultValue(false)
2008
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('pv_system_num_units_served_1', true)
2009
+ arg.setDisplayName('Photovoltaics 1: Number of Units Served')
2010
+ arg.setDescription("Number of dwelling units served by PV system 1. Must be 1 if #{HPXML::ResidentialTypeSFD}. Used to apportion PV generation to the unit.")
2011
+ arg.setUnits('#')
2012
+ arg.setDefaultValue(1)
2041
2013
  args << arg
2042
2014
 
2043
2015
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_module_type_2', pv_system_module_type_choices, true)
@@ -2049,13 +2021,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2049
2021
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_location_2', pv_system_location_choices, true)
2050
2022
  arg.setDisplayName('Photovoltaics 2: Location')
2051
2023
  arg.setDescription('Location of the PV system 2.')
2052
- arg.setDefaultValue(HPXML::LocationRoof)
2024
+ arg.setDefaultValue(Constants.Auto)
2053
2025
  args << arg
2054
2026
 
2055
2027
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_tracking_2', pv_system_tracking_choices, true)
2056
2028
  arg.setDisplayName('Photovoltaics 2: Tracking')
2057
2029
  arg.setDescription('Tracking of the PV system 2.')
2058
- arg.setDefaultValue(HPXML::PVTrackingTypeFixed)
2030
+ arg.setDefaultValue(Constants.Auto)
2059
2031
  args << arg
2060
2032
 
2061
2033
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_array_azimuth_2', true)
@@ -2091,10 +2063,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2091
2063
  arg.setDescription('System losses fraction of the PV system 2.')
2092
2064
  args << arg
2093
2065
 
2094
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('pv_system_is_shared_2', true)
2095
- arg.setDisplayName('Photovoltaics 2: Is Shared System')
2096
- arg.setDescription('Whether PV system 2 is shared. If true, assumed to serve all the units in the building.')
2097
- arg.setDefaultValue(false)
2066
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('pv_system_num_units_served_2', true)
2067
+ arg.setDisplayName('Photovoltaics 2: Number of Units Served')
2068
+ arg.setDescription("Number of dwelling units served by PV system 2. Must be 1 if #{HPXML::ResidentialTypeSFD}. Used to apportion PV generation to the unit.")
2069
+ arg.setUnits('#')
2070
+ arg.setDefaultValue(1)
2098
2071
  args << arg
2099
2072
 
2100
2073
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_fraction_cfl_interior', true)
@@ -2210,33 +2183,31 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2210
2183
  arg.setDefaultValue(Constants.Auto)
2211
2184
  args << arg
2212
2185
 
2213
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('dehumidifier_present', true)
2214
- arg.setDisplayName('Dehumidifier: Present')
2215
- arg.setDescription('Whether there is a dehumidifier.')
2216
- arg.setDefaultValue(false)
2217
- args << arg
2186
+ dehumidifier_type_choices = OpenStudio::StringVector.new
2187
+ dehumidifier_type_choices << 'none'
2188
+ dehumidifier_type_choices << HPXML::DehumidifierTypePortable
2189
+ dehumidifier_type_choices << HPXML::DehumidifierTypeWholeHome
2218
2190
 
2219
2191
  dehumidifier_efficiency_type_choices = OpenStudio::StringVector.new
2220
2192
  dehumidifier_efficiency_type_choices << 'EnergyFactor'
2221
2193
  dehumidifier_efficiency_type_choices << 'IntegratedEnergyFactor'
2222
2194
 
2195
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('dehumidifier_type', dehumidifier_type_choices, true)
2196
+ arg.setDisplayName('Dehumidifier: Type')
2197
+ arg.setDescription('The type of dehumidifier.')
2198
+ arg.setDefaultValue('none')
2199
+ args << arg
2200
+
2223
2201
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('dehumidifier_efficiency_type', dehumidifier_efficiency_type_choices, true)
2224
2202
  arg.setDisplayName('Dehumidifier: Efficiency Type')
2225
2203
  arg.setDescription('The efficiency type of dehumidifier.')
2226
- arg.setDefaultValue('EnergyFactor')
2227
- args << arg
2228
-
2229
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dehumidifier_efficiency_ef', true)
2230
- arg.setDisplayName('Dehumidifier: Energy Factor')
2231
- arg.setUnits('liters/kWh')
2232
- arg.setDescription('The Energy Factor (EF) of the dehumidifier.')
2233
- arg.setDefaultValue(1.8)
2204
+ arg.setDefaultValue('IntegratedEnergyFactor')
2234
2205
  args << arg
2235
2206
 
2236
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dehumidifier_efficiency_ief', true)
2237
- arg.setDisplayName('Dehumidifier: Integrated Energy Factor')
2207
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dehumidifier_efficiency', true)
2208
+ arg.setDisplayName('Dehumidifier: Efficiency')
2238
2209
  arg.setUnits('liters/kWh')
2239
- arg.setDescription('The Integrated Energy Factor (IEF) of the dehumidifier.')
2210
+ arg.setDescription('The efficiency of the dehumidifier.')
2240
2211
  arg.setDefaultValue(1.5)
2241
2212
  args << arg
2242
2213
 
@@ -2261,14 +2232,9 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2261
2232
  arg.setDefaultValue(1)
2262
2233
  args << arg
2263
2234
 
2264
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('clothes_washer_present', true)
2265
- arg.setDisplayName('Clothes Washer: Present')
2266
- arg.setDescription('Whether there is a clothes washer.')
2267
- arg.setDefaultValue(true)
2268
- args << arg
2269
-
2270
2235
  appliance_location_choices = OpenStudio::StringVector.new
2271
2236
  appliance_location_choices << Constants.Auto
2237
+ appliance_location_choices << 'none'
2272
2238
  appliance_location_choices << HPXML::LocationLivingSpace
2273
2239
  appliance_location_choices << HPXML::LocationBasementConditioned
2274
2240
  appliance_location_choices << HPXML::LocationBasementUnconditioned
@@ -2290,21 +2256,14 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2290
2256
 
2291
2257
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_washer_efficiency_type', clothes_washer_efficiency_type_choices, true)
2292
2258
  arg.setDisplayName('Clothes Washer: Efficiency Type')
2293
- arg.setDescription('The efficiency type of clothes washer.')
2259
+ arg.setDescription('The efficiency type of the clothes washer.')
2294
2260
  arg.setDefaultValue('IntegratedModifiedEnergyFactor')
2295
2261
  args << arg
2296
2262
 
2297
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_washer_efficiency_mef', true)
2298
- arg.setDisplayName('Clothes Washer: Modified Energy Factor')
2299
- arg.setUnits('ft^3/kWh-cycle')
2300
- arg.setDescription('The Modified Energy Factor (MEF) is the capacity of the clothes container divided by the total clothes washer energy consumption per cycle, where the energy consumption is the sum of the machine electrical energy consumption, the hot water energy consumption, the energy required for removal of the remaining moisture in the wash load, standby energy, and off-mode energy consumption.')
2301
- arg.setDefaultValue(Constants.Auto)
2302
- args << arg
2303
-
2304
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_washer_efficiency_imef', true)
2305
- arg.setDisplayName('Clothes Washer: Integrated Modified Energy Factor')
2263
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_washer_efficiency', true)
2264
+ arg.setDisplayName('Clothes Washer: Efficiency')
2306
2265
  arg.setUnits('ft^3/kWh-cyc')
2307
- arg.setDescription('The energy performance metric for ENERGY STAR certified residential clothes washers as of March 7, 2015.')
2266
+ arg.setDescription('The efficiency of the clothes washer.')
2308
2267
  arg.setDefaultValue(Constants.Auto)
2309
2268
  args << arg
2310
2269
 
@@ -2356,12 +2315,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2356
2315
  arg.setDefaultValue(1.0)
2357
2316
  args << arg
2358
2317
 
2359
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('clothes_dryer_present', true)
2360
- arg.setDisplayName('Clothes Dryer: Present')
2361
- arg.setDescription('Whether there is a clothes dryer.')
2362
- arg.setDefaultValue(true)
2363
- args << arg
2364
-
2365
2318
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_dryer_location', appliance_location_choices, true)
2366
2319
  arg.setDisplayName('Clothes Dryer: Location')
2367
2320
  arg.setDescription('The space type for the clothes dryer location.')
@@ -2376,11 +2329,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2376
2329
  clothes_dryer_fuel_choices << HPXML::FuelTypeWoodCord
2377
2330
  clothes_dryer_fuel_choices << HPXML::FuelTypeCoal
2378
2331
 
2379
- clothes_dryer_control_type_choices = OpenStudio::StringVector.new
2380
- clothes_dryer_control_type_choices << Constants.Auto
2381
- clothes_dryer_control_type_choices << HPXML::ClothesDryerControlTypeTimer
2382
- clothes_dryer_control_type_choices << HPXML::ClothesDryerControlTypeMoisture
2383
-
2384
2332
  clothes_dryer_efficiency_type_choices = OpenStudio::StringVector.new
2385
2333
  clothes_dryer_efficiency_type_choices << 'EnergyFactor'
2386
2334
  clothes_dryer_efficiency_type_choices << 'CombinedEnergyFactor'
@@ -2393,27 +2341,14 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2393
2341
 
2394
2342
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_dryer_efficiency_type', clothes_dryer_efficiency_type_choices, true)
2395
2343
  arg.setDisplayName('Clothes Dryer: Efficiency Type')
2396
- arg.setDescription('The efficiency type of clothes dryer.')
2344
+ arg.setDescription('The efficiency type of the clothes dryer.')
2397
2345
  arg.setDefaultValue('CombinedEnergyFactor')
2398
2346
  args << arg
2399
2347
 
2400
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_dryer_efficiency_ef', true)
2401
- arg.setDisplayName('Clothes Dryer: Energy Factor')
2348
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_dryer_efficiency', true)
2349
+ arg.setDisplayName('Clothes Dryer: Efficiency')
2402
2350
  arg.setUnits('lb/kWh')
2403
- arg.setDescription('The energy performance metric for ENERGY STAR certified residential clothes dryers prior to September 13, 2013. The new metric is Combined Energy Factor.')
2404
- arg.setDefaultValue(3.4615)
2405
- args << arg
2406
-
2407
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_dryer_efficiency_cef', true)
2408
- arg.setDisplayName('Clothes Dryer: Combined Energy Factor')
2409
- arg.setUnits('lb/kWh')
2410
- arg.setDescription('The Combined Energy Factor (CEF) measures the pounds of clothing that can be dried per kWh (Fuel equivalent) of electricity, including energy consumed during Stand-by and Off modes.')
2411
- arg.setDefaultValue(Constants.Auto)
2412
- args << arg
2413
-
2414
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_dryer_control_type', clothes_dryer_control_type_choices, true)
2415
- arg.setDisplayName('Clothes Dryer: Control Type')
2416
- arg.setDescription('Type of control used by the clothes dryer.')
2351
+ arg.setDescription('The efficiency of the clothes dryer.')
2417
2352
  arg.setDefaultValue(Constants.Auto)
2418
2353
  args << arg
2419
2354
 
@@ -2430,12 +2365,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2430
2365
  arg.setDefaultValue(1.0)
2431
2366
  args << arg
2432
2367
 
2433
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('dishwasher_present', true)
2434
- arg.setDisplayName('Dishwasher: Present')
2435
- arg.setDescription('Whether there is a dishwasher.')
2436
- arg.setDefaultValue(true)
2437
- args << arg
2438
-
2439
2368
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('dishwasher_location', appliance_location_choices, true)
2440
2369
  arg.setDisplayName('Dishwasher: Location')
2441
2370
  arg.setDescription('The space type for the dishwasher location.')
@@ -2452,19 +2381,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2452
2381
  arg.setDefaultValue('RatedAnnualkWh')
2453
2382
  args << arg
2454
2383
 
2455
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('dishwasher_efficiency_kwh', true)
2456
- arg.setDisplayName('Dishwasher: Rated Annual kWh')
2457
- arg.setUnits('kWh/yr')
2458
- arg.setDescription('The rated annual kWh of the dishwasher.')
2384
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('dishwasher_efficiency', true)
2385
+ arg.setDisplayName('Dishwasher: Efficiency')
2386
+ arg.setUnits('RatedAnnualkWh or EnergyFactor')
2387
+ arg.setDescription('The efficiency of the dishwasher.')
2459
2388
  arg.setDefaultValue(Constants.Auto)
2460
2389
  args << arg
2461
2390
 
2462
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_efficiency_ef', true)
2463
- arg.setDisplayName('Dishwasher: Energy Factor')
2464
- arg.setDescription('The energy factor of the dishwasher.')
2465
- arg.setDefaultValue(0.46)
2466
- args << arg
2467
-
2468
2391
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('dishwasher_label_electric_rate', true)
2469
2392
  arg.setDisplayName('Dishwasher: Label Electric Rate')
2470
2393
  arg.setUnits('$/kWh')
@@ -2506,12 +2429,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2506
2429
  arg.setDefaultValue(1.0)
2507
2430
  args << arg
2508
2431
 
2509
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('refrigerator_present', true)
2510
- arg.setDisplayName('Refrigerator: Present')
2511
- arg.setDescription('Whether there is a refrigerator.')
2512
- arg.setDefaultValue(true)
2513
- args << arg
2514
-
2515
2432
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('refrigerator_location', appliance_location_choices, true)
2516
2433
  arg.setDisplayName('Refrigerator: Location')
2517
2434
  arg.setDescription('The space type for the refrigerator location.')
@@ -2531,12 +2448,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2531
2448
  arg.setDefaultValue(1.0)
2532
2449
  args << arg
2533
2450
 
2534
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('extra_refrigerator_present', true)
2535
- arg.setDisplayName('Extra Refrigerator: Present')
2536
- arg.setDescription('Whether there is an extra refrigerator.')
2537
- arg.setDefaultValue(false)
2538
- args << arg
2539
-
2540
2451
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('extra_refrigerator_location', appliance_location_choices, true)
2541
2452
  arg.setDisplayName('Extra Refrigerator: Location')
2542
2453
  arg.setDescription('The space type for the extra refrigerator location.')
@@ -2556,12 +2467,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2556
2467
  arg.setDefaultValue(1.0)
2557
2468
  args << arg
2558
2469
 
2559
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('freezer_present', true)
2560
- arg.setDisplayName('Freezer: Present')
2561
- arg.setDescription('Whether there is a freezer.')
2562
- arg.setDefaultValue(false)
2563
- args << arg
2564
-
2565
2470
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('freezer_location', appliance_location_choices, true)
2566
2471
  arg.setDisplayName('Freezer: Location')
2567
2472
  arg.setDescription('The space type for the freezer location.')
@@ -2589,12 +2494,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2589
2494
  cooking_range_oven_fuel_choices << HPXML::FuelTypeWoodCord
2590
2495
  cooking_range_oven_fuel_choices << HPXML::FuelTypeCoal
2591
2496
 
2592
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('cooking_range_oven_present', true)
2593
- arg.setDisplayName('Cooking Range/Oven: Present')
2594
- arg.setDescription('Whether there is a cooking range/oven.')
2595
- arg.setDefaultValue(true)
2596
- args << arg
2597
-
2598
2497
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooking_range_oven_location', appliance_location_choices, true)
2599
2498
  arg.setDisplayName('Cooking Range/Oven: Location')
2600
2499
  arg.setDescription('The space type for the cooking range/oven location.')
@@ -2631,7 +2530,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2631
2530
 
2632
2531
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('ceiling_fan_efficiency', true)
2633
2532
  arg.setDisplayName('Ceiling Fan: Efficiency')
2634
- arg.setUnits('CFM/watt')
2533
+ arg.setUnits('CFM/W')
2635
2534
  arg.setDescription('The efficiency rating of the ceiling fan(s) at medium speed.')
2636
2535
  arg.setDefaultValue(Constants.Auto)
2637
2536
  args << arg
@@ -2705,26 +2604,26 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2705
2604
 
2706
2605
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('plug_loads_well_pump_usage_multiplier', true)
2707
2606
  arg.setDisplayName('Plug Loads: Well Pump Usage Multiplier')
2708
- arg.setDescription('Multiplier on the well_pump energy usage that can reflect, e.g., high/low usage occupants.')
2607
+ arg.setDescription('Multiplier on the well pump energy usage that can reflect, e.g., high/low usage occupants.')
2709
2608
  arg.setDefaultValue(1.0)
2710
2609
  args << arg
2711
2610
 
2712
2611
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('plug_loads_vehicle_present', true)
2713
2612
  arg.setDisplayName('Plug Loads: Vehicle Present')
2714
- arg.setDescription('Whether there is a vehicle.')
2613
+ arg.setDescription('Whether there is an electric vehicle.')
2715
2614
  arg.setDefaultValue(false)
2716
2615
  args << arg
2717
2616
 
2718
2617
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('plug_loads_vehicle_annual_kwh', true)
2719
2618
  arg.setDisplayName('Plug Loads: Vehicle Annual kWh')
2720
- arg.setDescription('The annual energy consumption of the well pump plug loads.')
2619
+ arg.setDescription('The annual energy consumption of the electric vehicle plug loads.')
2721
2620
  arg.setUnits('kWh/yr')
2722
2621
  arg.setDefaultValue(Constants.Auto)
2723
2622
  args << arg
2724
2623
 
2725
2624
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('plug_loads_vehicle_usage_multiplier', true)
2726
2625
  arg.setDisplayName('Plug Loads: Vehicle Usage Multiplier')
2727
- arg.setDescription('Multiplier on the well_pump energy usage that can reflect, e.g., high/low usage occupants.')
2626
+ arg.setDescription('Multiplier on the electric vehicle energy usage that can reflect, e.g., high/low usage occupants.')
2728
2627
  arg.setDefaultValue(1.0)
2729
2628
  args << arg
2730
2629
 
@@ -2759,16 +2658,10 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2759
2658
  arg.setDefaultValue(Constants.Auto)
2760
2659
  args << arg
2761
2660
 
2762
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('fuel_loads_grill_location', fuel_loads_location_choices, true)
2763
- arg.setDisplayName('Fuel Loads: Grill Location')
2764
- arg.setDescription('The location of the fuel loads grill.')
2765
- arg.setDefaultValue(Constants.Auto)
2766
- args << arg
2767
-
2768
2661
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('fuel_loads_grill_usage_multiplier', true)
2769
2662
  arg.setDisplayName('Fuel Loads: Grill Usage Multiplier')
2770
2663
  arg.setDescription('Multiplier on the fuel loads grill energy usage that can reflect, e.g., high/low usage occupants.')
2771
- arg.setDefaultValue(1.0)
2664
+ arg.setDefaultValue(0.0)
2772
2665
  args << arg
2773
2666
 
2774
2667
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('fuel_loads_lighting_present', true)
@@ -2790,16 +2683,10 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2790
2683
  arg.setDefaultValue(Constants.Auto)
2791
2684
  args << arg
2792
2685
 
2793
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('fuel_loads_lighting_location', fuel_loads_location_choices, true)
2794
- arg.setDisplayName('Fuel Loads: Lighting Location')
2795
- arg.setDescription('The location of the fuel loads lighting.')
2796
- arg.setDefaultValue(Constants.Auto)
2797
- args << arg
2798
-
2799
2686
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('fuel_loads_lighting_usage_multiplier', true)
2800
2687
  arg.setDisplayName('Fuel Loads: Lighting Usage Multiplier')
2801
2688
  arg.setDescription('Multiplier on the fuel loads lighting energy usage that can reflect, e.g., high/low usage occupants.')
2802
- arg.setDefaultValue(1.0)
2689
+ arg.setDefaultValue(0.0)
2803
2690
  args << arg
2804
2691
 
2805
2692
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('fuel_loads_fireplace_present', true)
@@ -2821,20 +2708,28 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2821
2708
  arg.setDefaultValue(Constants.Auto)
2822
2709
  args << arg
2823
2710
 
2824
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('fuel_loads_fireplace_location', fuel_loads_location_choices, true)
2825
- arg.setDisplayName('Fuel Loads: Fireplace Location')
2826
- arg.setDescription('The location of the fuel loads fireplace.')
2711
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('fuel_loads_fireplace_frac_sensible', true)
2712
+ arg.setDisplayName('Fuel Loads: Fireplace Sensible Fraction')
2713
+ arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are sensible.")
2714
+ arg.setUnits('Frac')
2715
+ arg.setDefaultValue(Constants.Auto)
2716
+ args << arg
2717
+
2718
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('fuel_loads_fireplace_frac_latent', true)
2719
+ arg.setDisplayName('Fuel Loads: Fireplace Latent Fraction')
2720
+ arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are latent.")
2721
+ arg.setUnits('Frac')
2827
2722
  arg.setDefaultValue(Constants.Auto)
2828
2723
  args << arg
2829
2724
 
2830
2725
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('fuel_loads_fireplace_usage_multiplier', true)
2831
2726
  arg.setDisplayName('Fuel Loads: Fireplace Usage Multiplier')
2832
2727
  arg.setDescription('Multiplier on the fuel loads fireplace energy usage that can reflect, e.g., high/low usage occupants.')
2833
- arg.setDefaultValue(1.0)
2728
+ arg.setDefaultValue(0.0)
2834
2729
  args << arg
2835
2730
 
2836
2731
  heater_type_choices = OpenStudio::StringVector.new
2837
- heater_type_choices << 'none'
2732
+ heater_type_choices << HPXML::TypeNone
2838
2733
  heater_type_choices << HPXML::HeaterTypeElectricResistance
2839
2734
  heater_type_choices << HPXML::HeaterTypeGas
2840
2735
  heater_type_choices << HPXML::HeaterTypeHeatPump
@@ -2861,7 +2756,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2861
2756
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pool_heater_type', heater_type_choices, true)
2862
2757
  arg.setDisplayName('Pool: Heater Type')
2863
2758
  arg.setDescription("The type of pool heater. Use 'none' if there is no pool heater.")
2864
- arg.setDefaultValue('none')
2759
+ arg.setDefaultValue(HPXML::TypeNone)
2865
2760
  args << arg
2866
2761
 
2867
2762
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('pool_heater_annual_kwh', true)
@@ -2906,7 +2801,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2906
2801
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('hot_tub_heater_type', heater_type_choices, true)
2907
2802
  arg.setDisplayName('Hot Tub: Heater Type')
2908
2803
  arg.setDescription("The type of hot tub heater. Use 'none' if there is no hot tub heater.")
2909
- arg.setDefaultValue('none')
2804
+ arg.setDefaultValue(HPXML::TypeNone)
2910
2805
  args << arg
2911
2806
 
2912
2807
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('hot_tub_heater_annual_kwh', true)
@@ -2941,13 +2836,14 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2941
2836
  return false
2942
2837
  end
2943
2838
 
2839
+ Geometry.tear_down_model(model, runner)
2840
+
2944
2841
  Version.check_openstudio_version()
2945
2842
 
2946
2843
  # assign the user inputs to variables
2947
- args = get_argument_values(runner, user_arguments)
2948
- args[:hpxml_path] = runner.getStringArgumentValue('hpxml_path', user_arguments)
2949
- args[:software_program_used] = runner.getOptionalStringArgumentValue('software_program_used', user_arguments)
2950
- args[:software_program_version] = runner.getOptionalStringArgumentValue('software_program_version', user_arguments)
2844
+ args = get_argument_values(runner, arguments(model), user_arguments)
2845
+ args = Hash[args.collect { |k, v| [k.to_sym, v] }]
2846
+ args[:geometry_rim_joist_height] /= 12.0
2951
2847
  args[:geometry_roof_pitch] = { '1:12' => 1.0 / 12.0, '2:12' => 2.0 / 12.0, '3:12' => 3.0 / 12.0, '4:12' => 4.0 / 12.0, '5:12' => 5.0 / 12.0, '6:12' => 6.0 / 12.0, '7:12' => 7.0 / 12.0, '8:12' => 8.0 / 12.0, '9:12' => 9.0 / 12.0, '10:12' => 10.0 / 12.0, '11:12' => 11.0 / 12.0, '12:12' => 12.0 / 12.0 }[args[:geometry_roof_pitch]]
2952
2848
 
2953
2849
  # Argument error checks
@@ -2999,402 +2895,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2999
2895
  runner.registerInfo("Wrote file: #{hpxml_path}")
3000
2896
  end
3001
2897
 
3002
- def get_argument_values(runner, user_arguments)
3003
- return { simulation_control_timestep: runner.getOptionalIntegerArgumentValue('simulation_control_timestep', user_arguments),
3004
- simulation_control_run_period_begin_month: runner.getOptionalIntegerArgumentValue('simulation_control_run_period_begin_month', user_arguments),
3005
- simulation_control_run_period_begin_day_of_month: runner.getOptionalIntegerArgumentValue('simulation_control_run_period_begin_day_of_month', user_arguments),
3006
- simulation_control_run_period_end_month: runner.getOptionalIntegerArgumentValue('simulation_control_run_period_end_month', user_arguments),
3007
- simulation_control_run_period_end_day_of_month: runner.getOptionalIntegerArgumentValue('simulation_control_run_period_end_day_of_month', user_arguments),
3008
- simulation_control_run_period_calendar_year: runner.getOptionalIntegerArgumentValue('simulation_control_run_period_calendar_year', user_arguments),
3009
- simulation_control_daylight_saving_enabled: runner.getOptionalStringArgumentValue('simulation_control_daylight_saving_enabled', user_arguments),
3010
- simulation_control_daylight_saving_begin_month: runner.getOptionalIntegerArgumentValue('simulation_control_daylight_saving_begin_month', user_arguments),
3011
- simulation_control_daylight_saving_begin_day_of_month: runner.getOptionalIntegerArgumentValue('simulation_control_daylight_saving_begin_day_of_month', user_arguments),
3012
- simulation_control_daylight_saving_end_month: runner.getOptionalIntegerArgumentValue('simulation_control_daylight_saving_end_month', user_arguments),
3013
- simulation_control_daylight_saving_end_day_of_month: runner.getOptionalIntegerArgumentValue('simulation_control_daylight_saving_end_day_of_month', user_arguments),
3014
- schedules_type: runner.getStringArgumentValue('schedules_type', user_arguments),
3015
- schedules_path: runner.getOptionalStringArgumentValue('schedules_path', user_arguments),
3016
- schedules_vacancy_begin_month: runner.getOptionalIntegerArgumentValue('schedules_vacancy_begin_month', user_arguments),
3017
- schedules_vacancy_begin_day_of_month: runner.getOptionalIntegerArgumentValue('schedules_vacancy_begin_day_of_month', user_arguments),
3018
- schedules_vacancy_end_month: runner.getOptionalIntegerArgumentValue('schedules_vacancy_end_month', user_arguments),
3019
- schedules_vacancy_end_day_of_month: runner.getOptionalIntegerArgumentValue('schedules_vacancy_end_day_of_month', user_arguments),
3020
- weather_station_epw_filepath: runner.getStringArgumentValue('weather_station_epw_filepath', user_arguments),
3021
- site_type: runner.getOptionalStringArgumentValue('site_type', user_arguments),
3022
- geometry_unit_type: runner.getStringArgumentValue('geometry_unit_type', user_arguments),
3023
- geometry_cfa: runner.getDoubleArgumentValue('geometry_cfa', user_arguments),
3024
- geometry_num_floors_above_grade: runner.getIntegerArgumentValue('geometry_num_floors_above_grade', user_arguments),
3025
- geometry_wall_height: runner.getDoubleArgumentValue('geometry_wall_height', user_arguments),
3026
- geometry_orientation: runner.getDoubleArgumentValue('geometry_orientation', user_arguments),
3027
- geometry_aspect_ratio: runner.getDoubleArgumentValue('geometry_aspect_ratio', user_arguments),
3028
- geometry_corridor_position: runner.getStringArgumentValue('geometry_corridor_position', user_arguments),
3029
- geometry_corridor_width: runner.getDoubleArgumentValue('geometry_corridor_width', user_arguments),
3030
- geometry_inset_width: runner.getDoubleArgumentValue('geometry_inset_width', user_arguments),
3031
- geometry_inset_depth: runner.getDoubleArgumentValue('geometry_inset_depth', user_arguments),
3032
- geometry_inset_position: runner.getStringArgumentValue('geometry_inset_position', user_arguments),
3033
- geometry_balcony_depth: runner.getDoubleArgumentValue('geometry_balcony_depth', user_arguments),
3034
- geometry_garage_width: runner.getDoubleArgumentValue('geometry_garage_width', user_arguments),
3035
- geometry_garage_depth: runner.getDoubleArgumentValue('geometry_garage_depth', user_arguments),
3036
- geometry_garage_protrusion: runner.getDoubleArgumentValue('geometry_garage_protrusion', user_arguments),
3037
- geometry_garage_position: runner.getStringArgumentValue('geometry_garage_position', user_arguments),
3038
- geometry_foundation_type: runner.getStringArgumentValue('geometry_foundation_type', user_arguments),
3039
- geometry_foundation_height: runner.getDoubleArgumentValue('geometry_foundation_height', user_arguments),
3040
- geometry_foundation_height_above_grade: runner.getDoubleArgumentValue('geometry_foundation_height_above_grade', user_arguments),
3041
- geometry_roof_type: runner.getStringArgumentValue('geometry_roof_type', user_arguments),
3042
- geometry_roof_pitch: runner.getStringArgumentValue('geometry_roof_pitch', user_arguments),
3043
- geometry_roof_structure: runner.getStringArgumentValue('geometry_roof_structure', user_arguments),
3044
- geometry_attic_type: runner.getStringArgumentValue('geometry_attic_type', user_arguments),
3045
- geometry_eaves_depth: runner.getDoubleArgumentValue('geometry_eaves_depth', user_arguments),
3046
- geometry_num_bedrooms: runner.getIntegerArgumentValue('geometry_num_bedrooms', user_arguments),
3047
- geometry_num_bathrooms: runner.getStringArgumentValue('geometry_num_bathrooms', user_arguments),
3048
- geometry_num_occupants: runner.getStringArgumentValue('geometry_num_occupants', user_arguments),
3049
- geometry_level: runner.getOptionalStringArgumentValue('geometry_level', user_arguments),
3050
- geometry_horizontal_location: runner.getOptionalStringArgumentValue('geometry_horizontal_location', user_arguments),
3051
- geometry_building_num_units: runner.getOptionalIntegerArgumentValue('geometry_building_num_units', user_arguments),
3052
- geometry_building_num_bedrooms: runner.getOptionalIntegerArgumentValue('geometry_building_num_bedrooms', user_arguments),
3053
- floor_assembly_r: runner.getDoubleArgumentValue('floor_assembly_r', user_arguments),
3054
- foundation_wall_insulation_r: runner.getDoubleArgumentValue('foundation_wall_insulation_r', user_arguments),
3055
- foundation_wall_insulation_distance_to_top: runner.getDoubleArgumentValue('foundation_wall_insulation_distance_to_top', user_arguments),
3056
- foundation_wall_insulation_distance_to_bottom: runner.getDoubleArgumentValue('foundation_wall_insulation_distance_to_bottom', user_arguments),
3057
- foundation_wall_assembly_r: runner.getOptionalDoubleArgumentValue('foundation_wall_assembly_r', user_arguments),
3058
- slab_perimeter_insulation_r: runner.getDoubleArgumentValue('slab_perimeter_insulation_r', user_arguments),
3059
- slab_perimeter_depth: runner.getDoubleArgumentValue('slab_perimeter_depth', user_arguments),
3060
- slab_under_insulation_r: runner.getDoubleArgumentValue('slab_under_insulation_r', user_arguments),
3061
- slab_under_width: runner.getDoubleArgumentValue('slab_under_width', user_arguments),
3062
- slab_carpet_fraction: runner.getDoubleArgumentValue('slab_carpet_fraction', user_arguments),
3063
- slab_carpet_r: runner.getDoubleArgumentValue('slab_carpet_r', user_arguments),
3064
- ceiling_assembly_r: runner.getDoubleArgumentValue('ceiling_assembly_r', user_arguments),
3065
- roof_material_type: runner.getOptionalStringArgumentValue('roof_material_type', user_arguments),
3066
- roof_color: runner.getStringArgumentValue('roof_color', user_arguments),
3067
- roof_assembly_r: runner.getDoubleArgumentValue('roof_assembly_r', user_arguments),
3068
- roof_solar_absorptance: runner.getStringArgumentValue('roof_solar_absorptance', user_arguments),
3069
- roof_emittance: runner.getDoubleArgumentValue('roof_emittance', user_arguments),
3070
- roof_radiant_barrier: runner.getBoolArgumentValue('roof_radiant_barrier', user_arguments),
3071
- roof_radiant_barrier_grade: runner.getStringArgumentValue('roof_radiant_barrier_grade', user_arguments),
3072
- neighbor_front_distance: runner.getDoubleArgumentValue('neighbor_front_distance', user_arguments),
3073
- neighbor_back_distance: runner.getDoubleArgumentValue('neighbor_back_distance', user_arguments),
3074
- neighbor_left_distance: runner.getDoubleArgumentValue('neighbor_left_distance', user_arguments),
3075
- neighbor_right_distance: runner.getDoubleArgumentValue('neighbor_right_distance', user_arguments),
3076
- neighbor_front_height: runner.getStringArgumentValue('neighbor_front_height', user_arguments),
3077
- neighbor_back_height: runner.getStringArgumentValue('neighbor_back_height', user_arguments),
3078
- neighbor_left_height: runner.getStringArgumentValue('neighbor_left_height', user_arguments),
3079
- neighbor_right_height: runner.getStringArgumentValue('neighbor_right_height', user_arguments),
3080
- wall_type: runner.getStringArgumentValue('wall_type', user_arguments),
3081
- wall_siding_type: runner.getOptionalStringArgumentValue('wall_siding_type', user_arguments),
3082
- wall_color: runner.getStringArgumentValue('wall_color', user_arguments),
3083
- wall_assembly_r: runner.getDoubleArgumentValue('wall_assembly_r', user_arguments),
3084
- wall_solar_absorptance: runner.getStringArgumentValue('wall_solar_absorptance', user_arguments),
3085
- wall_emittance: runner.getDoubleArgumentValue('wall_emittance', user_arguments),
3086
- window_front_wwr: runner.getDoubleArgumentValue('window_front_wwr', user_arguments),
3087
- window_back_wwr: runner.getDoubleArgumentValue('window_back_wwr', user_arguments),
3088
- window_left_wwr: runner.getDoubleArgumentValue('window_left_wwr', user_arguments),
3089
- window_right_wwr: runner.getDoubleArgumentValue('window_right_wwr', user_arguments),
3090
- window_area_front: runner.getDoubleArgumentValue('window_area_front', user_arguments),
3091
- window_area_back: runner.getDoubleArgumentValue('window_area_back', user_arguments),
3092
- window_area_left: runner.getDoubleArgumentValue('window_area_left', user_arguments),
3093
- window_area_right: runner.getDoubleArgumentValue('window_area_right', user_arguments),
3094
- window_aspect_ratio: runner.getDoubleArgumentValue('window_aspect_ratio', user_arguments),
3095
- window_fraction_operable: runner.getOptionalDoubleArgumentValue('window_fraction_operable', user_arguments),
3096
- window_ufactor: runner.getDoubleArgumentValue('window_ufactor', user_arguments),
3097
- window_shgc: runner.getDoubleArgumentValue('window_shgc', user_arguments),
3098
- window_interior_shading_winter: runner.getOptionalDoubleArgumentValue('window_interior_shading_winter', user_arguments),
3099
- window_interior_shading_summer: runner.getOptionalDoubleArgumentValue('window_interior_shading_summer', user_arguments),
3100
- overhangs_front_depth: runner.getDoubleArgumentValue('overhangs_front_depth', user_arguments),
3101
- overhangs_front_distance_to_top_of_window: runner.getDoubleArgumentValue('overhangs_front_distance_to_top_of_window', user_arguments),
3102
- overhangs_back_depth: runner.getDoubleArgumentValue('overhangs_back_depth', user_arguments),
3103
- overhangs_back_distance_to_top_of_window: runner.getDoubleArgumentValue('overhangs_back_distance_to_top_of_window', user_arguments),
3104
- overhangs_left_depth: runner.getDoubleArgumentValue('overhangs_left_depth', user_arguments),
3105
- overhangs_left_distance_to_top_of_window: runner.getDoubleArgumentValue('overhangs_left_distance_to_top_of_window', user_arguments),
3106
- overhangs_right_depth: runner.getDoubleArgumentValue('overhangs_right_depth', user_arguments),
3107
- overhangs_right_distance_to_top_of_window: runner.getDoubleArgumentValue('overhangs_right_distance_to_top_of_window', user_arguments),
3108
- skylight_area_front: runner.getDoubleArgumentValue('skylight_area_front', user_arguments),
3109
- skylight_area_back: runner.getDoubleArgumentValue('skylight_area_back', user_arguments),
3110
- skylight_area_left: runner.getDoubleArgumentValue('skylight_area_left', user_arguments),
3111
- skylight_area_right: runner.getDoubleArgumentValue('skylight_area_right', user_arguments),
3112
- skylight_ufactor: runner.getDoubleArgumentValue('skylight_ufactor', user_arguments),
3113
- skylight_shgc: runner.getDoubleArgumentValue('skylight_shgc', user_arguments),
3114
- door_area: runner.getDoubleArgumentValue('door_area', user_arguments),
3115
- door_rvalue: runner.getDoubleArgumentValue('door_rvalue', user_arguments),
3116
- air_leakage_units: runner.getStringArgumentValue('air_leakage_units', user_arguments),
3117
- air_leakage_house_pressure: runner.getDoubleArgumentValue('air_leakage_house_pressure', user_arguments),
3118
- air_leakage_value: runner.getDoubleArgumentValue('air_leakage_value', user_arguments),
3119
- air_leakage_shelter_coefficient: runner.getStringArgumentValue('air_leakage_shelter_coefficient', user_arguments),
3120
- heating_system_type: runner.getStringArgumentValue('heating_system_type', user_arguments),
3121
- heating_system_fuel: runner.getStringArgumentValue('heating_system_fuel', user_arguments),
3122
- heating_system_heating_efficiency: runner.getDoubleArgumentValue('heating_system_heating_efficiency', user_arguments),
3123
- heating_system_heating_capacity: runner.getStringArgumentValue('heating_system_heating_capacity', user_arguments),
3124
- heating_system_fraction_heat_load_served: runner.getDoubleArgumentValue('heating_system_fraction_heat_load_served', user_arguments),
3125
- heating_system_electric_auxiliary_energy: runner.getOptionalDoubleArgumentValue('heating_system_electric_auxiliary_energy', user_arguments),
3126
- heating_system_has_flue_or_chimney: runner.getBoolArgumentValue('heating_system_has_flue_or_chimney', user_arguments),
3127
- cooling_system_type: runner.getStringArgumentValue('cooling_system_type', user_arguments),
3128
- cooling_system_cooling_efficiency_seer: runner.getDoubleArgumentValue('cooling_system_cooling_efficiency_seer', user_arguments),
3129
- cooling_system_cooling_efficiency_eer: runner.getDoubleArgumentValue('cooling_system_cooling_efficiency_eer', user_arguments),
3130
- cooling_system_cooling_compressor_type: runner.getOptionalStringArgumentValue('cooling_system_cooling_compressor_type', user_arguments),
3131
- cooling_system_cooling_sensible_heat_fraction: runner.getOptionalDoubleArgumentValue('cooling_system_cooling_sensible_heat_fraction', user_arguments),
3132
- cooling_system_cooling_capacity: runner.getStringArgumentValue('cooling_system_cooling_capacity', user_arguments),
3133
- cooling_system_fraction_cool_load_served: runner.getDoubleArgumentValue('cooling_system_fraction_cool_load_served', user_arguments),
3134
- cooling_system_is_ducted: runner.getBoolArgumentValue('cooling_system_is_ducted', user_arguments),
3135
- heat_pump_type: runner.getStringArgumentValue('heat_pump_type', user_arguments),
3136
- heat_pump_heating_efficiency_hspf: runner.getDoubleArgumentValue('heat_pump_heating_efficiency_hspf', user_arguments),
3137
- heat_pump_heating_efficiency_cop: runner.getDoubleArgumentValue('heat_pump_heating_efficiency_cop', user_arguments),
3138
- heat_pump_cooling_efficiency_seer: runner.getDoubleArgumentValue('heat_pump_cooling_efficiency_seer', user_arguments),
3139
- heat_pump_cooling_efficiency_eer: runner.getDoubleArgumentValue('heat_pump_cooling_efficiency_eer', user_arguments),
3140
- heat_pump_cooling_compressor_type: runner.getOptionalStringArgumentValue('heat_pump_cooling_compressor_type', user_arguments),
3141
- heat_pump_cooling_sensible_heat_fraction: runner.getOptionalDoubleArgumentValue('heat_pump_cooling_sensible_heat_fraction', user_arguments),
3142
- heat_pump_heating_capacity: runner.getStringArgumentValue('heat_pump_heating_capacity', user_arguments),
3143
- heat_pump_heating_capacity_17F: runner.getStringArgumentValue('heat_pump_heating_capacity_17F', user_arguments),
3144
- heat_pump_cooling_capacity: runner.getStringArgumentValue('heat_pump_cooling_capacity', user_arguments),
3145
- heat_pump_fraction_heat_load_served: runner.getDoubleArgumentValue('heat_pump_fraction_heat_load_served', user_arguments),
3146
- heat_pump_fraction_cool_load_served: runner.getDoubleArgumentValue('heat_pump_fraction_cool_load_served', user_arguments),
3147
- heat_pump_backup_fuel: runner.getStringArgumentValue('heat_pump_backup_fuel', user_arguments),
3148
- heat_pump_backup_heating_efficiency: runner.getDoubleArgumentValue('heat_pump_backup_heating_efficiency', user_arguments),
3149
- heat_pump_backup_heating_capacity: runner.getStringArgumentValue('heat_pump_backup_heating_capacity', user_arguments),
3150
- heat_pump_backup_heating_switchover_temp: runner.getOptionalDoubleArgumentValue('heat_pump_backup_heating_switchover_temp', user_arguments),
3151
- heat_pump_mini_split_is_ducted: runner.getOptionalStringArgumentValue('heat_pump_mini_split_is_ducted', user_arguments),
3152
- heat_pump_ground_to_air_pump_power: runner.getOptionalDoubleArgumentValue('heat_pump_ground_to_air_pump_power', user_arguments),
3153
- heat_pump_ground_to_air_fan_power: runner.getOptionalDoubleArgumentValue('heat_pump_ground_to_air_fan_power', user_arguments),
3154
- setpoint_heating_temp: runner.getDoubleArgumentValue('setpoint_heating_temp', user_arguments),
3155
- setpoint_heating_setback_temp: runner.getDoubleArgumentValue('setpoint_heating_setback_temp', user_arguments),
3156
- setpoint_heating_setback_hours_per_week: runner.getDoubleArgumentValue('setpoint_heating_setback_hours_per_week', user_arguments),
3157
- setpoint_heating_setback_start_hour: runner.getDoubleArgumentValue('setpoint_heating_setback_start_hour', user_arguments),
3158
- setpoint_cooling_temp: runner.getDoubleArgumentValue('setpoint_cooling_temp', user_arguments),
3159
- setpoint_cooling_setup_temp: runner.getDoubleArgumentValue('setpoint_cooling_setup_temp', user_arguments),
3160
- setpoint_cooling_setup_hours_per_week: runner.getDoubleArgumentValue('setpoint_cooling_setup_hours_per_week', user_arguments),
3161
- setpoint_cooling_setup_start_hour: runner.getDoubleArgumentValue('setpoint_cooling_setup_start_hour', user_arguments),
3162
- ducts_supply_leakage_units: runner.getStringArgumentValue('ducts_supply_leakage_units', user_arguments),
3163
- ducts_return_leakage_units: runner.getStringArgumentValue('ducts_return_leakage_units', user_arguments),
3164
- ducts_supply_leakage_value: runner.getDoubleArgumentValue('ducts_supply_leakage_value', user_arguments),
3165
- ducts_return_leakage_value: runner.getDoubleArgumentValue('ducts_return_leakage_value', user_arguments),
3166
- ducts_supply_insulation_r: runner.getDoubleArgumentValue('ducts_supply_insulation_r', user_arguments),
3167
- ducts_return_insulation_r: runner.getDoubleArgumentValue('ducts_return_insulation_r', user_arguments),
3168
- ducts_supply_location: runner.getStringArgumentValue('ducts_supply_location', user_arguments),
3169
- ducts_return_location: runner.getStringArgumentValue('ducts_return_location', user_arguments),
3170
- ducts_supply_surface_area: runner.getStringArgumentValue('ducts_supply_surface_area', user_arguments),
3171
- ducts_return_surface_area: runner.getStringArgumentValue('ducts_return_surface_area', user_arguments),
3172
- ducts_number_of_return_registers: runner.getStringArgumentValue('ducts_number_of_return_registers', user_arguments),
3173
- heating_system_type_2: runner.getStringArgumentValue('heating_system_type_2', user_arguments),
3174
- heating_system_fuel_2: runner.getStringArgumentValue('heating_system_fuel_2', user_arguments),
3175
- heating_system_heating_efficiency_2: runner.getDoubleArgumentValue('heating_system_heating_efficiency_2', user_arguments),
3176
- heating_system_heating_capacity_2: runner.getStringArgumentValue('heating_system_heating_capacity_2', user_arguments),
3177
- heating_system_fraction_heat_load_served_2: runner.getDoubleArgumentValue('heating_system_fraction_heat_load_served_2', user_arguments),
3178
- heating_system_electric_auxiliary_energy_2: runner.getOptionalDoubleArgumentValue('heating_system_electric_auxiliary_energy_2', user_arguments),
3179
- heating_system_has_flue_or_chimney_2: runner.getBoolArgumentValue('heating_system_has_flue_or_chimney_2', user_arguments),
3180
- mech_vent_fan_type: runner.getStringArgumentValue('mech_vent_fan_type', user_arguments),
3181
- mech_vent_flow_rate: runner.getDoubleArgumentValue('mech_vent_flow_rate', user_arguments),
3182
- mech_vent_hours_in_operation: runner.getDoubleArgumentValue('mech_vent_hours_in_operation', user_arguments),
3183
- mech_vent_total_recovery_efficiency_type: runner.getStringArgumentValue('mech_vent_total_recovery_efficiency_type', user_arguments),
3184
- mech_vent_total_recovery_efficiency: runner.getDoubleArgumentValue('mech_vent_total_recovery_efficiency', user_arguments),
3185
- mech_vent_sensible_recovery_efficiency_type: runner.getStringArgumentValue('mech_vent_sensible_recovery_efficiency_type', user_arguments),
3186
- mech_vent_sensible_recovery_efficiency: runner.getDoubleArgumentValue('mech_vent_sensible_recovery_efficiency', user_arguments),
3187
- mech_vent_fan_power: runner.getDoubleArgumentValue('mech_vent_fan_power', user_arguments),
3188
- mech_vent_is_shared_system: runner.getBoolArgumentValue('mech_vent_is_shared_system', user_arguments),
3189
- shared_mech_vent_in_unit_flow_rate: runner.getOptionalDoubleArgumentValue('shared_mech_vent_in_unit_flow_rate', user_arguments),
3190
- shared_mech_vent_frac_recirculation: runner.getOptionalDoubleArgumentValue('shared_mech_vent_frac_recirculation', user_arguments),
3191
- shared_mech_vent_preheating_fuel: runner.getOptionalStringArgumentValue('shared_mech_vent_preheating_fuel', user_arguments),
3192
- shared_mech_vent_preheating_efficiency: runner.getOptionalDoubleArgumentValue('shared_mech_vent_preheating_efficiency', user_arguments),
3193
- shared_mech_vent_preheating_fraction_heat_load_served: runner.getOptionalDoubleArgumentValue('shared_mech_vent_preheating_fraction_heat_load_served', user_arguments),
3194
- shared_mech_vent_precooling_fuel: runner.getOptionalStringArgumentValue('shared_mech_vent_precooling_fuel', user_arguments),
3195
- shared_mech_vent_precooling_efficiency: runner.getOptionalDoubleArgumentValue('shared_mech_vent_precooling_efficiency', user_arguments),
3196
- shared_mech_vent_precooling_fraction_cool_load_served: runner.getOptionalDoubleArgumentValue('shared_mech_vent_precooling_fraction_cool_load_served', user_arguments),
3197
- mech_vent_fan_type_2: runner.getStringArgumentValue('mech_vent_fan_type_2', user_arguments),
3198
- mech_vent_flow_rate_2: runner.getDoubleArgumentValue('mech_vent_flow_rate_2', user_arguments),
3199
- mech_vent_hours_in_operation_2: runner.getDoubleArgumentValue('mech_vent_hours_in_operation_2', user_arguments),
3200
- mech_vent_total_recovery_efficiency_type_2: runner.getStringArgumentValue('mech_vent_total_recovery_efficiency_type_2', user_arguments),
3201
- mech_vent_total_recovery_efficiency_2: runner.getDoubleArgumentValue('mech_vent_total_recovery_efficiency_2', user_arguments),
3202
- mech_vent_sensible_recovery_efficiency_type_2: runner.getStringArgumentValue('mech_vent_sensible_recovery_efficiency_type_2', user_arguments),
3203
- mech_vent_sensible_recovery_efficiency_2: runner.getDoubleArgumentValue('mech_vent_sensible_recovery_efficiency_2', user_arguments),
3204
- mech_vent_fan_power_2: runner.getDoubleArgumentValue('mech_vent_fan_power_2', user_arguments),
3205
- kitchen_fans_present: runner.getBoolArgumentValue('kitchen_fans_present', user_arguments),
3206
- kitchen_fans_quantity: runner.getOptionalIntegerArgumentValue('kitchen_fans_quantity', user_arguments),
3207
- kitchen_fans_flow_rate: runner.getOptionalDoubleArgumentValue('kitchen_fans_flow_rate', user_arguments),
3208
- kitchen_fans_hours_in_operation: runner.getOptionalDoubleArgumentValue('kitchen_fans_hours_in_operation', user_arguments),
3209
- kitchen_fans_power: runner.getOptionalDoubleArgumentValue('kitchen_fans_power', user_arguments),
3210
- kitchen_fans_start_hour: runner.getOptionalIntegerArgumentValue('kitchen_fans_start_hour', user_arguments),
3211
- bathroom_fans_present: runner.getBoolArgumentValue('bathroom_fans_present', user_arguments),
3212
- bathroom_fans_quantity: runner.getOptionalIntegerArgumentValue('bathroom_fans_quantity', user_arguments),
3213
- bathroom_fans_flow_rate: runner.getOptionalDoubleArgumentValue('bathroom_fans_flow_rate', user_arguments),
3214
- bathroom_fans_hours_in_operation: runner.getOptionalDoubleArgumentValue('bathroom_fans_hours_in_operation', user_arguments),
3215
- bathroom_fans_power: runner.getOptionalDoubleArgumentValue('bathroom_fans_power', user_arguments),
3216
- bathroom_fans_start_hour: runner.getOptionalIntegerArgumentValue('bathroom_fans_start_hour', user_arguments),
3217
- whole_house_fan_present: runner.getBoolArgumentValue('whole_house_fan_present', user_arguments),
3218
- whole_house_fan_flow_rate: runner.getDoubleArgumentValue('whole_house_fan_flow_rate', user_arguments),
3219
- whole_house_fan_power: runner.getDoubleArgumentValue('whole_house_fan_power', user_arguments),
3220
- water_heater_type: runner.getStringArgumentValue('water_heater_type', user_arguments),
3221
- water_heater_fuel_type: runner.getStringArgumentValue('water_heater_fuel_type', user_arguments),
3222
- water_heater_location: runner.getStringArgumentValue('water_heater_location', user_arguments),
3223
- water_heater_tank_volume: runner.getStringArgumentValue('water_heater_tank_volume', user_arguments),
3224
- water_heater_heating_capacity: runner.getStringArgumentValue('water_heater_heating_capacity', user_arguments),
3225
- water_heater_efficiency_type: runner.getStringArgumentValue('water_heater_efficiency_type', user_arguments),
3226
- water_heater_efficiency_ef: runner.getDoubleArgumentValue('water_heater_efficiency_ef', user_arguments),
3227
- water_heater_efficiency_uef: runner.getDoubleArgumentValue('water_heater_efficiency_uef', user_arguments),
3228
- water_heater_recovery_efficiency: runner.getStringArgumentValue('water_heater_recovery_efficiency', user_arguments),
3229
- water_heater_standby_loss: runner.getOptionalDoubleArgumentValue('water_heater_standby_loss', user_arguments),
3230
- water_heater_jacket_rvalue: runner.getOptionalDoubleArgumentValue('water_heater_jacket_rvalue', user_arguments),
3231
- water_heater_setpoint_temperature: runner.getStringArgumentValue('water_heater_setpoint_temperature', user_arguments),
3232
- water_heater_performance_adjustment: runner.getOptionalDoubleArgumentValue('water_heater_performance_adjustment', user_arguments),
3233
- water_heater_has_flue_or_chimney: runner.getBoolArgumentValue('water_heater_has_flue_or_chimney', user_arguments),
3234
- water_heater_is_shared_system: runner.getBoolArgumentValue('water_heater_is_shared_system', user_arguments),
3235
- dhw_distribution_system_type: runner.getStringArgumentValue('dhw_distribution_system_type', user_arguments),
3236
- dhw_distribution_standard_piping_length: runner.getStringArgumentValue('dhw_distribution_standard_piping_length', user_arguments),
3237
- dhw_distribution_recirc_control_type: runner.getStringArgumentValue('dhw_distribution_recirc_control_type', user_arguments),
3238
- dhw_distribution_recirc_piping_length: runner.getStringArgumentValue('dhw_distribution_recirc_piping_length', user_arguments),
3239
- dhw_distribution_recirc_branch_piping_length: runner.getStringArgumentValue('dhw_distribution_recirc_branch_piping_length', user_arguments),
3240
- dhw_distribution_recirc_pump_power: runner.getStringArgumentValue('dhw_distribution_recirc_pump_power', user_arguments),
3241
- dhw_distribution_pipe_r: runner.getDoubleArgumentValue('dhw_distribution_pipe_r', user_arguments),
3242
- dwhr_facilities_connected: runner.getStringArgumentValue('dwhr_facilities_connected', user_arguments),
3243
- dwhr_equal_flow: runner.getBoolArgumentValue('dwhr_equal_flow', user_arguments),
3244
- dwhr_efficiency: runner.getDoubleArgumentValue('dwhr_efficiency', user_arguments),
3245
- water_fixtures_shower_low_flow: runner.getBoolArgumentValue('water_fixtures_shower_low_flow', user_arguments),
3246
- water_fixtures_sink_low_flow: runner.getBoolArgumentValue('water_fixtures_sink_low_flow', user_arguments),
3247
- water_fixtures_usage_multiplier: runner.getDoubleArgumentValue('water_fixtures_usage_multiplier', user_arguments),
3248
- solar_thermal_system_type: runner.getStringArgumentValue('solar_thermal_system_type', user_arguments),
3249
- solar_thermal_collector_area: runner.getDoubleArgumentValue('solar_thermal_collector_area', user_arguments),
3250
- solar_thermal_collector_loop_type: runner.getStringArgumentValue('solar_thermal_collector_loop_type', user_arguments),
3251
- solar_thermal_collector_type: runner.getStringArgumentValue('solar_thermal_collector_type', user_arguments),
3252
- solar_thermal_collector_azimuth: runner.getDoubleArgumentValue('solar_thermal_collector_azimuth', user_arguments),
3253
- solar_thermal_collector_tilt: runner.getStringArgumentValue('solar_thermal_collector_tilt', user_arguments),
3254
- solar_thermal_collector_rated_optical_efficiency: runner.getDoubleArgumentValue('solar_thermal_collector_rated_optical_efficiency', user_arguments),
3255
- solar_thermal_collector_rated_thermal_losses: runner.getDoubleArgumentValue('solar_thermal_collector_rated_thermal_losses', user_arguments),
3256
- solar_thermal_storage_volume: runner.getStringArgumentValue('solar_thermal_storage_volume', user_arguments),
3257
- solar_thermal_solar_fraction: runner.getDoubleArgumentValue('solar_thermal_solar_fraction', user_arguments),
3258
- pv_system_module_type_1: runner.getStringArgumentValue('pv_system_module_type_1', user_arguments),
3259
- pv_system_location_1: runner.getStringArgumentValue('pv_system_location_1', user_arguments),
3260
- pv_system_tracking_1: runner.getStringArgumentValue('pv_system_tracking_1', user_arguments),
3261
- pv_system_array_azimuth_1: runner.getDoubleArgumentValue('pv_system_array_azimuth_1', user_arguments),
3262
- pv_system_array_tilt_1: runner.getStringArgumentValue('pv_system_array_tilt_1', user_arguments),
3263
- pv_system_max_power_output_1: runner.getDoubleArgumentValue('pv_system_max_power_output_1', user_arguments),
3264
- pv_system_inverter_efficiency_1: runner.getOptionalDoubleArgumentValue('pv_system_inverter_efficiency_1', user_arguments),
3265
- pv_system_system_losses_fraction_1: runner.getOptionalDoubleArgumentValue('pv_system_system_losses_fraction_1', user_arguments),
3266
- pv_system_is_shared_1: runner.getBoolArgumentValue('pv_system_is_shared_1', user_arguments),
3267
- pv_system_module_type_2: runner.getStringArgumentValue('pv_system_module_type_2', user_arguments),
3268
- pv_system_location_2: runner.getStringArgumentValue('pv_system_location_2', user_arguments),
3269
- pv_system_tracking_2: runner.getStringArgumentValue('pv_system_tracking_2', user_arguments),
3270
- pv_system_array_azimuth_2: runner.getDoubleArgumentValue('pv_system_array_azimuth_2', user_arguments),
3271
- pv_system_array_tilt_2: runner.getStringArgumentValue('pv_system_array_tilt_2', user_arguments),
3272
- pv_system_max_power_output_2: runner.getDoubleArgumentValue('pv_system_max_power_output_2', user_arguments),
3273
- pv_system_inverter_efficiency_2: runner.getOptionalDoubleArgumentValue('pv_system_inverter_efficiency_2', user_arguments),
3274
- pv_system_system_losses_fraction_2: runner.getOptionalDoubleArgumentValue('pv_system_system_losses_fraction_2', user_arguments),
3275
- pv_system_is_shared_2: runner.getBoolArgumentValue('pv_system_is_shared_2', user_arguments),
3276
- lighting_fraction_cfl_interior: runner.getDoubleArgumentValue('lighting_fraction_cfl_interior', user_arguments),
3277
- lighting_fraction_lfl_interior: runner.getDoubleArgumentValue('lighting_fraction_lfl_interior', user_arguments),
3278
- lighting_fraction_led_interior: runner.getDoubleArgumentValue('lighting_fraction_led_interior', user_arguments),
3279
- lighting_usage_multiplier_interior: runner.getDoubleArgumentValue('lighting_usage_multiplier_interior', user_arguments),
3280
- lighting_fraction_cfl_exterior: runner.getDoubleArgumentValue('lighting_fraction_cfl_exterior', user_arguments),
3281
- lighting_fraction_lfl_exterior: runner.getDoubleArgumentValue('lighting_fraction_lfl_exterior', user_arguments),
3282
- lighting_fraction_led_exterior: runner.getDoubleArgumentValue('lighting_fraction_led_exterior', user_arguments),
3283
- lighting_usage_multiplier_exterior: runner.getDoubleArgumentValue('lighting_usage_multiplier_exterior', user_arguments),
3284
- lighting_fraction_cfl_garage: runner.getDoubleArgumentValue('lighting_fraction_cfl_garage', user_arguments),
3285
- lighting_fraction_lfl_garage: runner.getDoubleArgumentValue('lighting_fraction_lfl_garage', user_arguments),
3286
- lighting_fraction_led_garage: runner.getDoubleArgumentValue('lighting_fraction_led_garage', user_arguments),
3287
- lighting_usage_multiplier_garage: runner.getDoubleArgumentValue('lighting_usage_multiplier_garage', user_arguments),
3288
- holiday_lighting_present: runner.getBoolArgumentValue('holiday_lighting_present', user_arguments),
3289
- holiday_lighting_daily_kwh: runner.getStringArgumentValue('holiday_lighting_daily_kwh', user_arguments),
3290
- holiday_lighting_period_begin_month: runner.getStringArgumentValue('holiday_lighting_period_begin_month', user_arguments),
3291
- holiday_lighting_period_begin_day_of_month: runner.getStringArgumentValue('holiday_lighting_period_begin_day_of_month', user_arguments),
3292
- holiday_lighting_period_end_month: runner.getStringArgumentValue('holiday_lighting_period_end_month', user_arguments),
3293
- holiday_lighting_period_end_day_of_month: runner.getStringArgumentValue('holiday_lighting_period_end_day_of_month', user_arguments),
3294
- dehumidifier_present: runner.getBoolArgumentValue('dehumidifier_present', user_arguments),
3295
- dehumidifier_efficiency_type: runner.getStringArgumentValue('dehumidifier_efficiency_type', user_arguments),
3296
- dehumidifier_efficiency_ef: runner.getDoubleArgumentValue('dehumidifier_efficiency_ef', user_arguments),
3297
- dehumidifier_efficiency_ief: runner.getDoubleArgumentValue('dehumidifier_efficiency_ief', user_arguments),
3298
- dehumidifier_capacity: runner.getDoubleArgumentValue('dehumidifier_capacity', user_arguments),
3299
- dehumidifier_rh_setpoint: runner.getDoubleArgumentValue('dehumidifier_rh_setpoint', user_arguments),
3300
- dehumidifier_fraction_dehumidification_load_served: runner.getDoubleArgumentValue('dehumidifier_fraction_dehumidification_load_served', user_arguments),
3301
- clothes_washer_present: runner.getBoolArgumentValue('clothes_washer_present', user_arguments),
3302
- clothes_washer_location: runner.getStringArgumentValue('clothes_washer_location', user_arguments),
3303
- clothes_washer_efficiency_type: runner.getStringArgumentValue('clothes_washer_efficiency_type', user_arguments),
3304
- clothes_washer_efficiency_mef: runner.getStringArgumentValue('clothes_washer_efficiency_mef', user_arguments),
3305
- clothes_washer_efficiency_imef: runner.getStringArgumentValue('clothes_washer_efficiency_imef', user_arguments),
3306
- clothes_washer_rated_annual_kwh: runner.getStringArgumentValue('clothes_washer_rated_annual_kwh', user_arguments),
3307
- clothes_washer_label_electric_rate: runner.getStringArgumentValue('clothes_washer_label_electric_rate', user_arguments),
3308
- clothes_washer_label_gas_rate: runner.getStringArgumentValue('clothes_washer_label_gas_rate', user_arguments),
3309
- clothes_washer_label_annual_gas_cost: runner.getStringArgumentValue('clothes_washer_label_annual_gas_cost', user_arguments),
3310
- clothes_washer_label_usage: runner.getStringArgumentValue('clothes_washer_label_usage', user_arguments),
3311
- clothes_washer_capacity: runner.getStringArgumentValue('clothes_washer_capacity', user_arguments),
3312
- clothes_washer_usage_multiplier: runner.getDoubleArgumentValue('clothes_washer_usage_multiplier', user_arguments),
3313
- clothes_dryer_present: runner.getBoolArgumentValue('clothes_dryer_present', user_arguments),
3314
- clothes_dryer_location: runner.getStringArgumentValue('clothes_dryer_location', user_arguments),
3315
- clothes_dryer_fuel_type: runner.getStringArgumentValue('clothes_dryer_fuel_type', user_arguments),
3316
- clothes_dryer_efficiency_type: runner.getStringArgumentValue('clothes_dryer_efficiency_type', user_arguments),
3317
- clothes_dryer_efficiency_ef: runner.getDoubleArgumentValue('clothes_dryer_efficiency_ef', user_arguments),
3318
- clothes_dryer_efficiency_cef: runner.getStringArgumentValue('clothes_dryer_efficiency_cef', user_arguments),
3319
- clothes_dryer_control_type: runner.getStringArgumentValue('clothes_dryer_control_type', user_arguments),
3320
- clothes_dryer_vented_flow_rate: runner.getStringArgumentValue('clothes_dryer_vented_flow_rate', user_arguments),
3321
- clothes_dryer_usage_multiplier: runner.getDoubleArgumentValue('clothes_dryer_usage_multiplier', user_arguments),
3322
- dishwasher_present: runner.getBoolArgumentValue('dishwasher_present', user_arguments),
3323
- dishwasher_location: runner.getStringArgumentValue('dishwasher_location', user_arguments),
3324
- dishwasher_efficiency_type: runner.getStringArgumentValue('dishwasher_efficiency_type', user_arguments),
3325
- dishwasher_efficiency_kwh: runner.getStringArgumentValue('dishwasher_efficiency_kwh', user_arguments),
3326
- dishwasher_efficiency_ef: runner.getDoubleArgumentValue('dishwasher_efficiency_ef', user_arguments),
3327
- dishwasher_label_electric_rate: runner.getStringArgumentValue('dishwasher_label_electric_rate', user_arguments),
3328
- dishwasher_label_gas_rate: runner.getStringArgumentValue('dishwasher_label_gas_rate', user_arguments),
3329
- dishwasher_label_annual_gas_cost: runner.getStringArgumentValue('dishwasher_label_annual_gas_cost', user_arguments),
3330
- dishwasher_label_usage: runner.getStringArgumentValue('dishwasher_label_usage', user_arguments),
3331
- dishwasher_place_setting_capacity: runner.getStringArgumentValue('dishwasher_place_setting_capacity', user_arguments),
3332
- dishwasher_usage_multiplier: runner.getDoubleArgumentValue('dishwasher_usage_multiplier', user_arguments),
3333
- refrigerator_present: runner.getBoolArgumentValue('refrigerator_present', user_arguments),
3334
- refrigerator_location: runner.getStringArgumentValue('refrigerator_location', user_arguments),
3335
- refrigerator_rated_annual_kwh: runner.getStringArgumentValue('refrigerator_rated_annual_kwh', user_arguments),
3336
- refrigerator_usage_multiplier: runner.getDoubleArgumentValue('refrigerator_usage_multiplier', user_arguments),
3337
- extra_refrigerator_present: runner.getBoolArgumentValue('extra_refrigerator_present', user_arguments),
3338
- extra_refrigerator_location: runner.getStringArgumentValue('extra_refrigerator_location', user_arguments),
3339
- extra_refrigerator_rated_annual_kwh: runner.getStringArgumentValue('extra_refrigerator_rated_annual_kwh', user_arguments),
3340
- extra_refrigerator_usage_multiplier: runner.getDoubleArgumentValue('extra_refrigerator_usage_multiplier', user_arguments),
3341
- freezer_present: runner.getBoolArgumentValue('freezer_present', user_arguments),
3342
- freezer_location: runner.getStringArgumentValue('freezer_location', user_arguments),
3343
- freezer_rated_annual_kwh: runner.getStringArgumentValue('freezer_rated_annual_kwh', user_arguments),
3344
- freezer_usage_multiplier: runner.getDoubleArgumentValue('freezer_usage_multiplier', user_arguments),
3345
- cooking_range_oven_present: runner.getBoolArgumentValue('cooking_range_oven_present', user_arguments),
3346
- cooking_range_oven_location: runner.getStringArgumentValue('cooking_range_oven_location', user_arguments),
3347
- cooking_range_oven_fuel_type: runner.getStringArgumentValue('cooking_range_oven_fuel_type', user_arguments),
3348
- cooking_range_oven_is_induction: runner.getOptionalStringArgumentValue('cooking_range_oven_is_induction', user_arguments),
3349
- cooking_range_oven_is_convection: runner.getOptionalStringArgumentValue('cooking_range_oven_is_convection', user_arguments),
3350
- cooking_range_oven_usage_multiplier: runner.getDoubleArgumentValue('cooking_range_oven_usage_multiplier', user_arguments),
3351
- ceiling_fan_present: runner.getBoolArgumentValue('ceiling_fan_present', user_arguments),
3352
- ceiling_fan_efficiency: runner.getStringArgumentValue('ceiling_fan_efficiency', user_arguments),
3353
- ceiling_fan_quantity: runner.getStringArgumentValue('ceiling_fan_quantity', user_arguments),
3354
- ceiling_fan_cooling_setpoint_temp_offset: runner.getDoubleArgumentValue('ceiling_fan_cooling_setpoint_temp_offset', user_arguments),
3355
- plug_loads_television_annual_kwh: runner.getStringArgumentValue('plug_loads_television_annual_kwh', user_arguments),
3356
- plug_loads_television_usage_multiplier: runner.getDoubleArgumentValue('plug_loads_television_usage_multiplier', user_arguments),
3357
- plug_loads_other_annual_kwh: runner.getStringArgumentValue('plug_loads_other_annual_kwh', user_arguments),
3358
- plug_loads_other_frac_sensible: runner.getStringArgumentValue('plug_loads_other_frac_sensible', user_arguments),
3359
- plug_loads_other_frac_latent: runner.getStringArgumentValue('plug_loads_other_frac_latent', user_arguments),
3360
- plug_loads_other_usage_multiplier: runner.getDoubleArgumentValue('plug_loads_other_usage_multiplier', user_arguments),
3361
- plug_loads_well_pump_present: runner.getBoolArgumentValue('plug_loads_well_pump_present', user_arguments),
3362
- plug_loads_well_pump_annual_kwh: runner.getStringArgumentValue('plug_loads_well_pump_annual_kwh', user_arguments),
3363
- plug_loads_well_pump_usage_multiplier: runner.getDoubleArgumentValue('plug_loads_well_pump_usage_multiplier', user_arguments),
3364
- plug_loads_vehicle_present: runner.getBoolArgumentValue('plug_loads_vehicle_present', user_arguments),
3365
- plug_loads_vehicle_annual_kwh: runner.getStringArgumentValue('plug_loads_vehicle_annual_kwh', user_arguments),
3366
- plug_loads_vehicle_usage_multiplier: runner.getDoubleArgumentValue('plug_loads_vehicle_usage_multiplier', user_arguments),
3367
- fuel_loads_grill_present: runner.getBoolArgumentValue('fuel_loads_grill_present', user_arguments),
3368
- fuel_loads_grill_fuel_type: runner.getStringArgumentValue('fuel_loads_grill_fuel_type', user_arguments),
3369
- fuel_loads_grill_annual_therm: runner.getStringArgumentValue('fuel_loads_grill_annual_therm', user_arguments),
3370
- fuel_loads_grill_location: runner.getStringArgumentValue('fuel_loads_grill_location', user_arguments),
3371
- fuel_loads_grill_usage_multiplier: runner.getDoubleArgumentValue('fuel_loads_grill_usage_multiplier', user_arguments),
3372
- fuel_loads_lighting_present: runner.getBoolArgumentValue('fuel_loads_lighting_present', user_arguments),
3373
- fuel_loads_lighting_fuel_type: runner.getStringArgumentValue('fuel_loads_lighting_fuel_type', user_arguments),
3374
- fuel_loads_lighting_annual_therm: runner.getStringArgumentValue('fuel_loads_lighting_annual_therm', user_arguments),
3375
- fuel_loads_lighting_location: runner.getStringArgumentValue('fuel_loads_lighting_location', user_arguments),
3376
- fuel_loads_lighting_usage_multiplier: runner.getDoubleArgumentValue('fuel_loads_lighting_usage_multiplier', user_arguments),
3377
- fuel_loads_fireplace_present: runner.getBoolArgumentValue('fuel_loads_fireplace_present', user_arguments),
3378
- fuel_loads_fireplace_fuel_type: runner.getStringArgumentValue('fuel_loads_fireplace_fuel_type', user_arguments),
3379
- fuel_loads_fireplace_annual_therm: runner.getStringArgumentValue('fuel_loads_fireplace_annual_therm', user_arguments),
3380
- fuel_loads_fireplace_location: runner.getStringArgumentValue('fuel_loads_fireplace_location', user_arguments),
3381
- fuel_loads_fireplace_usage_multiplier: runner.getDoubleArgumentValue('fuel_loads_fireplace_usage_multiplier', user_arguments),
3382
- pool_present: runner.getBoolArgumentValue('pool_present', user_arguments),
3383
- pool_pump_annual_kwh: runner.getStringArgumentValue('pool_pump_annual_kwh', user_arguments),
3384
- pool_pump_usage_multiplier: runner.getDoubleArgumentValue('pool_pump_usage_multiplier', user_arguments),
3385
- pool_heater_type: runner.getStringArgumentValue('pool_heater_type', user_arguments),
3386
- pool_heater_annual_kwh: runner.getStringArgumentValue('pool_heater_annual_kwh', user_arguments),
3387
- pool_heater_annual_therm: runner.getStringArgumentValue('pool_heater_annual_therm', user_arguments),
3388
- pool_heater_usage_multiplier: runner.getDoubleArgumentValue('pool_heater_usage_multiplier', user_arguments),
3389
- hot_tub_present: runner.getBoolArgumentValue('hot_tub_present', user_arguments),
3390
- hot_tub_pump_annual_kwh: runner.getStringArgumentValue('hot_tub_pump_annual_kwh', user_arguments),
3391
- hot_tub_pump_usage_multiplier: runner.getDoubleArgumentValue('hot_tub_pump_usage_multiplier', user_arguments),
3392
- hot_tub_heater_type: runner.getStringArgumentValue('hot_tub_heater_type', user_arguments),
3393
- hot_tub_heater_annual_kwh: runner.getStringArgumentValue('hot_tub_heater_annual_kwh', user_arguments),
3394
- hot_tub_heater_annual_therm: runner.getStringArgumentValue('hot_tub_heater_annual_therm', user_arguments),
3395
- hot_tub_heater_usage_multiplier: runner.getDoubleArgumentValue('hot_tub_heater_usage_multiplier', user_arguments) }
3396
- end
3397
-
3398
2898
  def validate_arguments(args)
3399
2899
  warnings = []
3400
2900
  errors = []
@@ -3460,9 +2960,17 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3460
2960
  errors << "ducts_supply_location=#{args[:ducts_supply_location]} and ducts_supply_surface_area=#{args[:ducts_supply_surface_area]} and ducts_return_location=#{args[:ducts_return_location]} and ducts_return_surface_area=#{args[:ducts_return_surface_area]}" if error
3461
2961
 
3462
2962
  # second heating system fraction heat load served non less than 50%
3463
- warning = (args[:heating_system_type_2] != 'none') && (args[:heating_system_fraction_heat_load_served_2] >= 0.5)
2963
+ warning = (args[:heating_system_type_2] != 'none') && (args[:heating_system_fraction_heat_load_served_2] >= 0.5) && (args[:heating_system_fraction_heat_load_served_2] < 1.0)
3464
2964
  warnings << "heating_system_type_2=#{args[:heating_system_type_2]} and heating_system_fraction_heat_load_served_2=#{args[:heating_system_fraction_heat_load_served_2]}" if warning
3465
2965
 
2966
+ # second heating system fraction heat load served is 100%
2967
+ error = (args[:heating_system_type_2] != 'none') && (args[:heating_system_fraction_heat_load_served_2] == 1.0)
2968
+ errors << "heating_system_type_2=#{args[:heating_system_type_2]} and heating_system_fraction_heat_load_served_2=#{args[:heating_system_fraction_heat_load_served_2]}" if error
2969
+
2970
+ # second heating system but no primary heating system
2971
+ error = (args[:heating_system_type] == 'none') && (args[:heat_pump_type] == 'none') && (args[:heating_system_type_2] != 'none')
2972
+ errors << "heating_system_type=#{args[:heating_system_type]} and heat_pump_type=#{args[:heat_pump_type]} and heating_system_type_2=#{args[:heating_system_type_2]}" if error
2973
+
3466
2974
  # single-family attached and num units, horizontal location not specified
3467
2975
  error = (args[:geometry_unit_type] == HPXML::ResidentialTypeSFA) && (!args[:geometry_building_num_units].is_initialized || !args[:geometry_horizontal_location].is_initialized)
3468
2976
  errors << "geometry_unit_type=#{args[:geometry_unit_type]} and geometry_building_num_units=#{args[:geometry_building_num_units].is_initialized} and geometry_horizontal_location=#{args[:geometry_horizontal_location].is_initialized}" if error
@@ -3487,10 +2995,56 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3487
2995
  warning = (args[:geometry_attic_type] == HPXML::AtticTypeConditioned) && (args[:geometry_roof_type] != 'flat') && (args[:ceiling_assembly_r] > 2.1)
3488
2996
  warnings << "geometry_attic_type=#{args[:geometry_attic_type]} and ceiling_assembly_r=#{args[:ceiling_assembly_r]}" if warning
3489
2997
 
2998
+ # conditioned attic but only one above-grade floor
2999
+ error = (args[:geometry_num_floors_above_grade] == 1 && args[:geometry_attic_type] == HPXML::AtticTypeConditioned)
3000
+ errors << "geometry_num_floors_above_grade=#{args[:geometry_num_floors_above_grade]} and geometry_attic_type=#{args[:geometry_attic_type]}" if error
3001
+
3490
3002
  # dhw indirect but no boiler
3491
3003
  error = ((args[:water_heater_type] == HPXML::WaterHeaterTypeCombiStorage) || (args[:water_heater_type] == HPXML::WaterHeaterTypeCombiTankless)) && (args[:heating_system_type] != HPXML::HVACTypeBoiler)
3492
3004
  errors << "water_heater_type=#{args[:water_heater_type]} and heating_system_type=#{args[:heating_system_type]}" if error
3493
3005
 
3006
+ # no tv plug loads but specifying usage multipliers
3007
+ if args[:plug_loads_television_annual_kwh] != Constants.Auto
3008
+ warning = (args[:plug_loads_television_annual_kwh].to_f == 0.0 && args[:plug_loads_television_usage_multiplier] != 0.0)
3009
+ warnings << "plug_loads_television_annual_kwh=#{args[:plug_loads_television_annual_kwh]} and plug_loads_television_usage_multiplier=#{args[:plug_loads_television_usage_multiplier]}" if warning
3010
+ end
3011
+
3012
+ # no other plug loads but specifying usage multipliers
3013
+ if args[:plug_loads_other_annual_kwh] != Constants.Auto
3014
+ warning = (args[:plug_loads_other_annual_kwh].to_f == 0.0 && args[:plug_loads_other_usage_multiplier] != 0.0)
3015
+ warnings << "plug_loads_other_annual_kwh=#{args[:plug_loads_other_annual_kwh]} and plug_loads_other_usage_multiplier=#{args[:plug_loads_other_usage_multiplier]}" if warning
3016
+ end
3017
+
3018
+ # no well pump plug loads but specifying usage multipliers
3019
+ if args[:plug_loads_well_pump_annual_kwh] != Constants.Auto
3020
+ warning = (args[:plug_loads_well_pump_annual_kwh].to_f == 0.0 && args[:plug_loads_well_pump_usage_multiplier] != 0.0)
3021
+ warnings << "plug_loads_well_pump_annual_kwh=#{args[:plug_loads_well_pump_annual_kwh]} and plug_loads_well_pump_usage_multiplier=#{args[:plug_loads_well_pump_usage_multiplier]}" if warning
3022
+ end
3023
+
3024
+ # no vehicle plug loads but specifying usage multipliers
3025
+ if args[:plug_loads_vehicle_annual_kwh] != Constants.Auto
3026
+ warning = (args[:plug_loads_vehicle_annual_kwh].to_f && args[:plug_loads_vehicle_usage_multiplier] != 0.0)
3027
+ warnings << "plug_loads_vehicle_annual_kwh=#{args[:plug_loads_vehicle_annual_kwh]} and plug_loads_vehicle_usage_multiplier=#{args[:plug_loads_vehicle_usage_multiplier]}" if warning
3028
+ end
3029
+
3030
+ # no fuel loads but specifying usage multipliers
3031
+ warning = (!args[:fuel_loads_grill_present] && args[:fuel_loads_grill_usage_multiplier] != 0.0) || (!args[:fuel_loads_lighting_present] && args[:fuel_loads_lighting_usage_multiplier] != 0.0) || (!args[:fuel_loads_fireplace_present] && args[:fuel_loads_fireplace_usage_multiplier] != 0.0)
3032
+ warnings << "fuel_loads_grill_present=#{args[:fuel_loads_grill_present]} and fuel_loads_grill_usage_multiplier=#{args[:fuel_loads_grill_usage_multiplier]} and fuel_loads_lighting_present=#{args[:fuel_loads_lighting_present]} and fuel_loads_lighting_usage_multiplier=#{args[:fuel_loads_lighting_usage_multiplier]} and fuel_loads_fireplace_present=#{args[:fuel_loads_fireplace_present]} and fuel_loads_fireplace_usage_multiplier=#{args[:fuel_loads_fireplace_usage_multiplier]}" if warning
3033
+
3034
+ # foundation wall insulation distance to bottom is greater than foundation wall height
3035
+ if args[:foundation_wall_insulation_distance_to_bottom] != Constants.Auto
3036
+ error = (args[:foundation_wall_insulation_distance_to_bottom].to_f > args[:geometry_foundation_height])
3037
+ errors << "foundation_wall_insulation_distance_to_bottom=#{args[:foundation_wall_insulation_distance_to_bottom]} and geometry_foundation_height=#{args[:geometry_foundation_height]}" if error
3038
+ end
3039
+
3040
+ # number of bedrooms not greater than zero
3041
+ error = (args[:geometry_num_bedrooms] <= 0)
3042
+ errors << "geometry_num_bedrooms=#{args[:geometry_num_bedrooms]}" if error
3043
+
3044
+ # single-family detached with shared system
3045
+ error = [HPXML::ResidentialTypeSFD].include?(args[:geometry_unit_type]) && args[:heating_system_type].include?('Shared')
3046
+ errors << "geometry_unit_type=#{args[:geometry_unit_type]} and heating_system_type=#{args[:heating_system_type]}" if error
3047
+
3494
3048
  return warnings, errors
3495
3049
  end
3496
3050
 
@@ -3505,13 +3059,17 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3505
3059
  is_valid = false
3506
3060
  end
3507
3061
 
3508
- # Validate input HPXML against EnergyPlus Use Case
3509
- stron_path = File.join(schemas_dir, 'EPvalidator.xml')
3510
- errors = Validator.run_validator(hpxml_doc, stron_path)
3062
+ # Validate input HPXML against schematron docs
3063
+ stron_paths = [File.join(schemas_dir, 'HPXMLvalidator.xml'),
3064
+ File.join(schemas_dir, 'EPvalidator.xml')]
3065
+ errors, warnings = Validator.run_validators(hpxml_doc, stron_paths)
3511
3066
  errors.each do |error|
3512
3067
  runner.registerError("#{hpxml_path}: #{error}")
3513
3068
  is_valid = false
3514
3069
  end
3070
+ warnings.each do |warning|
3071
+ runner.registerWarning("#{warning}")
3072
+ end
3515
3073
 
3516
3074
  return is_valid
3517
3075
  end
@@ -3519,9 +3077,7 @@ end
3519
3077
 
3520
3078
  class HPXMLFile
3521
3079
  def self.create(runner, model, args, epw_file)
3522
- model_geometry = OpenStudio::Model::Model.new
3523
-
3524
- success = create_geometry_envelope(runner, model_geometry, args)
3080
+ success = create_geometry_envelope(runner, model, args)
3525
3081
  return false if not success
3526
3082
 
3527
3083
  success = create_schedules(runner, model, epw_file, args)
@@ -3529,27 +3085,30 @@ class HPXMLFile
3529
3085
 
3530
3086
  hpxml = HPXML.new
3531
3087
 
3532
- set_header(hpxml, runner, args)
3088
+ set_header(hpxml, runner, args, epw_file)
3533
3089
  set_site(hpxml, runner, args)
3534
3090
  set_neighbor_buildings(hpxml, runner, args)
3535
3091
  set_building_occupancy(hpxml, runner, args)
3536
3092
  set_building_construction(hpxml, runner, args)
3537
3093
  set_climate_and_risk_zones(hpxml, runner, args, epw_file)
3538
3094
  set_air_infiltration_measurements(hpxml, runner, args)
3539
- set_attics(hpxml, runner, model_geometry, args)
3540
- set_foundations(hpxml, runner, model_geometry, args)
3541
- set_roofs(hpxml, runner, model_geometry, args)
3542
- set_rim_joists(hpxml, runner, model_geometry, args)
3543
- set_walls(hpxml, runner, model_geometry, args)
3544
- set_foundation_walls(hpxml, runner, model_geometry, args)
3545
- set_frame_floors(hpxml, runner, model_geometry, args)
3546
- set_slabs(hpxml, runner, model_geometry, args)
3547
- set_windows(hpxml, runner, model_geometry, args)
3548
- set_skylights(hpxml, runner, model_geometry, args)
3549
- set_doors(hpxml, runner, model_geometry, args)
3095
+
3096
+ set_attics(hpxml, runner, model, args)
3097
+ set_foundations(hpxml, runner, model, args)
3098
+ set_roofs(hpxml, runner, model, args)
3099
+ set_rim_joists(hpxml, runner, model, args)
3100
+ set_walls(hpxml, runner, model, args)
3101
+ set_foundation_walls(hpxml, runner, model, args)
3102
+ set_frame_floors(hpxml, runner, model, args)
3103
+ set_slabs(hpxml, runner, model, args)
3104
+ set_windows(hpxml, runner, model, args)
3105
+ set_skylights(hpxml, runner, model, args)
3106
+ set_doors(hpxml, runner, model, args)
3107
+
3550
3108
  set_heating_systems(hpxml, runner, args)
3551
3109
  set_cooling_systems(hpxml, runner, args)
3552
3110
  set_heat_pumps(hpxml, runner, args)
3111
+ set_secondary_heating_systems(hpxml, runner, args)
3553
3112
  set_hvac_distribution(hpxml, runner, args)
3554
3113
  set_hvac_control(hpxml, runner, args)
3555
3114
  set_ventilation_fans(hpxml, runner, args)
@@ -3593,6 +3152,13 @@ class HPXMLFile
3593
3152
  if args[:geometry_foundation_type] == HPXML::FoundationTypeSlab
3594
3153
  args[:geometry_foundation_height] = 0.0
3595
3154
  args[:geometry_foundation_height_above_grade] = 0.0
3155
+ args[:geometry_rim_joist_height] = 0.0
3156
+ elsif args[:geometry_foundation_type] == HPXML::FoundationTypeAmbient
3157
+ args[:geometry_rim_joist_height] = 0.0
3158
+ end
3159
+
3160
+ if args[:geometry_attic_type] == HPXML::AtticTypeConditioned
3161
+ args[:geometry_num_floors_above_grade] -= 1
3596
3162
  end
3597
3163
 
3598
3164
  if args[:geometry_unit_type] == HPXML::ResidentialTypeSFD
@@ -3600,6 +3166,8 @@ class HPXMLFile
3600
3166
  elsif args[:geometry_unit_type] == HPXML::ResidentialTypeSFA
3601
3167
  success = Geometry.create_single_family_attached(runner: runner, model: model, **args)
3602
3168
  elsif args[:geometry_unit_type] == HPXML::ResidentialTypeApartment
3169
+ args[:geometry_roof_type] = 'flat'
3170
+ args[:geometry_attic_type] = HPXML::AtticTypeVented
3603
3171
  success = Geometry.create_multifamily(runner: runner, model: model, **args)
3604
3172
  end
3605
3173
  return false if not success
@@ -3623,12 +3191,18 @@ class HPXMLFile
3623
3191
  return true
3624
3192
  end
3625
3193
 
3194
+ info_msgs = []
3195
+
3626
3196
  # set the calendar year
3627
3197
  year_description = model.getYearDescription
3628
3198
  year_description.setCalendarYear(2007) # default to TMY
3199
+ if args[:simulation_control_run_period_calendar_year].is_initialized
3200
+ year_description.setCalendarYear(args[:simulation_control_run_period_calendar_year].get)
3201
+ end
3629
3202
  if epw_file.startDateActualYear.is_initialized # AMY
3630
3203
  year_description.setCalendarYear(epw_file.startDateActualYear.get)
3631
3204
  end
3205
+ info_msgs << "CalendarYear=#{year_description.calendarYear}"
3632
3206
 
3633
3207
  # set the timestep
3634
3208
  timestep = model.getTimestep
@@ -3636,8 +3210,13 @@ class HPXMLFile
3636
3210
  if args[:simulation_control_timestep].is_initialized
3637
3211
  timestep.setNumberOfTimestepsPerHour(60 / args[:simulation_control_timestep].get)
3638
3212
  end
3213
+ info_msgs << "NumberOfTimestepsPerHour=#{timestep.numberOfTimestepsPerHour}"
3214
+
3215
+ # get the seed
3216
+ random_seed = args[:schedules_random_seed].get if args[:schedules_random_seed].is_initialized
3639
3217
 
3640
- schedule_generator = ScheduleGenerator.new(runner: runner, model: model, epw_file: epw_file)
3218
+ # instantiate the generator
3219
+ schedule_generator = ScheduleGenerator.new(runner: runner, model: model, epw_file: epw_file, random_seed: random_seed)
3641
3220
 
3642
3221
  # create the schedule
3643
3222
  if args[:geometry_num_occupants] == Constants.Auto
@@ -3650,14 +3229,16 @@ class HPXMLFile
3650
3229
  return false if not success
3651
3230
 
3652
3231
  # export the schedule
3653
- args[:schedules_path] = '../schedules.csv'
3232
+ args[:schedules_path] = "../#{File.basename(args[:hpxml_path], '.xml')}_schedules.csv"
3654
3233
  success = schedule_generator.export(schedules_path: File.expand_path(args[:schedules_path]))
3655
3234
  return false if not success
3656
3235
 
3236
+ runner.registerInfo("Created schedule with #{info_msgs.join(', ')}")
3237
+
3657
3238
  return true
3658
3239
  end
3659
3240
 
3660
- def self.set_header(hpxml, runner, args)
3241
+ def self.set_header(hpxml, runner, args, epw_file)
3661
3242
  hpxml.header.xml_type = 'HPXML'
3662
3243
  hpxml.header.xml_generated_by = 'BuildResidentialHPXML'
3663
3244
  hpxml.header.transaction = 'create'
@@ -3678,13 +3259,13 @@ class HPXMLFile
3678
3259
  hpxml.header.sim_begin_month = args[:simulation_control_run_period_begin_month].get
3679
3260
  end
3680
3261
  if args[:simulation_control_run_period_begin_day_of_month].is_initialized
3681
- hpxml.header.sim_begin_day_of_month = args[:simulation_control_run_period_begin_day_of_month].get
3262
+ hpxml.header.sim_begin_day = args[:simulation_control_run_period_begin_day_of_month].get
3682
3263
  end
3683
3264
  if args[:simulation_control_run_period_end_month].is_initialized
3684
3265
  hpxml.header.sim_end_month = args[:simulation_control_run_period_end_month].get
3685
3266
  end
3686
3267
  if args[:simulation_control_run_period_end_day_of_month].is_initialized
3687
- hpxml.header.sim_end_day_of_month = args[:simulation_control_run_period_end_day_of_month].get
3268
+ hpxml.header.sim_end_day = args[:simulation_control_run_period_end_day_of_month].get
3688
3269
  end
3689
3270
  if args[:simulation_control_run_period_calendar_year].is_initialized
3690
3271
  hpxml.header.sim_calendar_year = args[:simulation_control_run_period_calendar_year].get
@@ -3697,50 +3278,47 @@ class HPXMLFile
3697
3278
  hpxml.header.dst_begin_month = args[:simulation_control_daylight_saving_begin_month].get
3698
3279
  end
3699
3280
  if args[:simulation_control_daylight_saving_begin_day_of_month].is_initialized
3700
- hpxml.header.dst_begin_day_of_month = args[:simulation_control_daylight_saving_begin_day_of_month].get
3281
+ hpxml.header.dst_begin_day = args[:simulation_control_daylight_saving_begin_day_of_month].get
3701
3282
  end
3702
3283
  if args[:simulation_control_daylight_saving_end_month].is_initialized
3703
3284
  hpxml.header.dst_end_month = args[:simulation_control_daylight_saving_end_month].get
3704
3285
  end
3705
3286
  if args[:simulation_control_daylight_saving_end_day_of_month].is_initialized
3706
- hpxml.header.dst_end_day_of_month = args[:simulation_control_daylight_saving_end_day_of_month].get
3287
+ hpxml.header.dst_end_day = args[:simulation_control_daylight_saving_end_day_of_month].get
3707
3288
  end
3708
3289
 
3709
3290
  hpxml.header.building_id = 'MyBuilding'
3291
+ hpxml.header.state_code = epw_file.stateProvinceRegion
3710
3292
  hpxml.header.event_type = 'proposed workscope'
3711
3293
  hpxml.header.schedules_path = args[:schedules_path]
3712
3294
  end
3713
3295
 
3714
3296
  def self.set_site(hpxml, runner, args)
3715
- if args[:air_leakage_shelter_coefficient] != Constants.Auto
3716
- shelter_coefficient = args[:air_leakage_shelter_coefficient]
3297
+ if args[:air_leakage_shielding_of_home] != Constants.Auto
3298
+ shielding_of_home = args[:air_leakage_shielding_of_home]
3717
3299
  end
3718
3300
 
3719
3301
  if args[:site_type].is_initialized
3720
3302
  hpxml.site.site_type = args[:site_type].get
3721
3303
  end
3722
3304
 
3723
- hpxml.site.shelter_coefficient = shelter_coefficient
3305
+ hpxml.site.shielding_of_home = shielding_of_home
3724
3306
  end
3725
3307
 
3726
3308
  def self.set_neighbor_buildings(hpxml, runner, args)
3727
- [args[:neighbor_front_distance], args[:neighbor_back_distance], args[:neighbor_left_distance], args[:neighbor_right_distance]].each_with_index do |distance, i|
3728
- next if distance == 0
3309
+ nbr_map = { Constants.FacadeFront => [args[:neighbor_front_distance], args[:neighbor_front_height]],
3310
+ Constants.FacadeBack => [args[:neighbor_back_distance], args[:neighbor_back_height]],
3311
+ Constants.FacadeLeft => [args[:neighbor_left_distance], args[:neighbor_left_height]],
3312
+ Constants.FacadeRight => [args[:neighbor_right_distance], args[:neighbor_right_height]] }
3729
3313
 
3730
- if i == 0 # front
3731
- azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 0, args[:geometry_orientation], 0)
3732
- elsif i == 1 # back
3733
- azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 180, args[:geometry_orientation], 0)
3734
- elsif i == 2 # left
3735
- azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 90, args[:geometry_orientation], 0)
3736
- elsif i == 3 # right
3737
- azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 270, args[:geometry_orientation], 0)
3738
- end
3314
+ nbr_map.each do |facade, data|
3315
+ distance, neighbor_height = data
3316
+ next if distance == 0
3739
3317
 
3740
- neighbor_height = [args[:neighbor_front_height], args[:neighbor_back_height], args[:neighbor_left_height], args[:neighbor_right_height]]
3318
+ azimuth = get_azimuth_from_facade(facade, args)
3741
3319
 
3742
- if (distance > 0) && (neighbor_height[i] != Constants.Auto)
3743
- height = Float(neighbor_height[i])
3320
+ if (distance > 0) && (neighbor_height != Constants.Auto)
3321
+ height = Float(neighbor_height)
3744
3322
  end
3745
3323
 
3746
3324
  hpxml.neighbor_buildings.add(azimuth: azimuth,
@@ -3756,11 +3334,15 @@ class HPXMLFile
3756
3334
  end
3757
3335
 
3758
3336
  def self.set_building_construction(hpxml, runner, args)
3759
- number_of_conditioned_floors_above_grade = args[:geometry_num_floors_above_grade]
3760
-
3761
- number_of_conditioned_floors = number_of_conditioned_floors_above_grade
3762
- if args[:geometry_foundation_type] == HPXML::FoundationTypeBasementConditioned
3763
- number_of_conditioned_floors += 1
3337
+ if args[:geometry_unit_type] == HPXML::ResidentialTypeApartment
3338
+ number_of_conditioned_floors_above_grade = 1
3339
+ number_of_conditioned_floors = 1
3340
+ else
3341
+ number_of_conditioned_floors_above_grade = args[:geometry_num_floors_above_grade]
3342
+ number_of_conditioned_floors = number_of_conditioned_floors_above_grade
3343
+ if args[:geometry_foundation_type] == HPXML::FoundationTypeBasementConditioned
3344
+ number_of_conditioned_floors += 1
3345
+ end
3764
3346
  end
3765
3347
 
3766
3348
  if args[:geometry_num_bathrooms] != Constants.Auto
@@ -3777,11 +3359,9 @@ class HPXMLFile
3777
3359
  hpxml.building_construction.conditioned_building_volume = conditioned_building_volume
3778
3360
  hpxml.building_construction.average_ceiling_height = args[:geometry_wall_height]
3779
3361
  hpxml.building_construction.residential_facility_type = args[:geometry_unit_type]
3780
-
3781
- if (args[:heating_system_type] != 'none' && args[:heating_system_has_flue_or_chimney]) ||
3782
- (args[:heating_system_type_2] != 'none' && args[:heating_system_has_flue_or_chimney_2]) ||
3783
- (args[:water_heater_type] != 'none' && args[:water_heater_has_flue_or_chimney])
3784
- hpxml.building_construction.has_flue_or_chimney = true
3362
+ if args[:geometry_has_flue_or_chimney] != Constants.Auto
3363
+ has_flue_or_chimney = args[:geometry_has_flue_or_chimney]
3364
+ hpxml.building_construction.has_flue_or_chimney = has_flue_or_chimney
3785
3365
  end
3786
3366
  end
3787
3367
 
@@ -3820,7 +3400,6 @@ class HPXMLFile
3820
3400
 
3821
3401
  def self.set_attics(hpxml, runner, model, args)
3822
3402
  return if args[:geometry_unit_type] == HPXML::ResidentialTypeApartment
3823
- return if args[:geometry_unit_type] == HPXML::ResidentialTypeSFA # TODO: remove when we can model single-family attached units
3824
3403
 
3825
3404
  if args[:geometry_roof_type] == 'flat'
3826
3405
  hpxml.attics.add(id: HPXML::AtticTypeFlatRoof,
@@ -3839,6 +3418,11 @@ class HPXMLFile
3839
3418
  end
3840
3419
 
3841
3420
  def self.set_roofs(hpxml, runner, model, args)
3421
+ args[:geometry_roof_pitch] *= 12.0
3422
+ if args[:geometry_roof_type] == 'flat'
3423
+ args[:geometry_roof_pitch] = 0.0
3424
+ end
3425
+
3842
3426
  model.getSurfaces.sort.each do |surface|
3843
3427
  next unless ['Outdoors'].include? surface.outsideBoundaryCondition
3844
3428
  next if surface.surfaceType != 'RoofCeiling'
@@ -3846,40 +3430,33 @@ class HPXMLFile
3846
3430
  interior_adjacent_to = get_adjacent_to(surface)
3847
3431
  next if [HPXML::LocationOtherHousingUnit].include? interior_adjacent_to
3848
3432
 
3849
- pitch = args[:geometry_roof_pitch] * 12.0
3850
- if args[:geometry_roof_type] == 'flat'
3851
- pitch = 0.0
3852
- end
3853
-
3854
3433
  if args[:roof_material_type].is_initialized
3855
3434
  roof_type = args[:roof_material_type].get
3856
3435
  end
3857
3436
 
3858
- if args[:roof_color] == Constants.Auto && args[:roof_solar_absorptance] == Constants.Auto
3859
- solar_absorptance = 0.7
3860
- end
3861
-
3862
3437
  if args[:roof_color] != Constants.Auto
3863
3438
  roof_color = args[:roof_color]
3864
3439
  end
3865
3440
 
3866
- if args[:roof_solar_absorptance] != Constants.Auto
3867
- solar_absorptance = args[:roof_solar_absorptance]
3868
- end
3869
-
3441
+ radiant_barrier = args[:roof_radiant_barrier]
3870
3442
  if args[:roof_radiant_barrier]
3871
3443
  radiant_barrier_grade = args[:roof_radiant_barrier_grade]
3872
3444
  end
3873
3445
 
3446
+ if args[:geometry_roof_type] == 'flat'
3447
+ azimuth = nil
3448
+ else
3449
+ azimuth = get_surface_azimuth(surface, args)
3450
+ end
3451
+
3874
3452
  hpxml.roofs.add(id: valid_attr(surface.name),
3875
3453
  interior_adjacent_to: get_adjacent_to(surface),
3454
+ azimuth: azimuth,
3876
3455
  area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2').round,
3877
3456
  roof_type: roof_type,
3878
3457
  roof_color: roof_color,
3879
- solar_absorptance: solar_absorptance,
3880
- emittance: args[:roof_emittance],
3881
- pitch: pitch,
3882
- radiant_barrier: args[:roof_radiant_barrier],
3458
+ pitch: args[:geometry_roof_pitch],
3459
+ radiant_barrier: radiant_barrier,
3883
3460
  radiant_barrier_grade: radiant_barrier_grade,
3884
3461
  insulation_assembly_r_value: args[:roof_assembly_r])
3885
3462
  end
@@ -3887,41 +3464,108 @@ class HPXMLFile
3887
3464
 
3888
3465
  def self.set_rim_joists(hpxml, runner, model, args)
3889
3466
  model.getSurfaces.sort.each do |surface|
3890
- # TODO
3467
+ next if surface.surfaceType != 'Wall'
3468
+ next unless ['Outdoors', 'Adiabatic'].include? surface.outsideBoundaryCondition
3469
+ next unless Geometry.surface_is_rim_joist(surface, args[:geometry_rim_joist_height])
3470
+
3471
+ interior_adjacent_to = get_adjacent_to(surface)
3472
+ next unless [HPXML::LocationBasementConditioned, HPXML::LocationBasementUnconditioned, HPXML::LocationCrawlspaceUnvented, HPXML::LocationCrawlspaceVented].include? interior_adjacent_to
3473
+
3474
+ exterior_adjacent_to = HPXML::LocationOutside
3475
+ if surface.outsideBoundaryCondition == 'Adiabatic' # can be adjacent to foundation space
3476
+ adjacent_surface = get_adiabatic_adjacent_surface(model, surface)
3477
+ if adjacent_surface.nil? # adjacent to a space that is not explicitly in the model
3478
+ unless [HPXML::ResidentialTypeSFD].include?(args[:geometry_unit_type])
3479
+ exterior_adjacent_to = interior_adjacent_to
3480
+ if exterior_adjacent_to == HPXML::LocationLivingSpace # living adjacent to living
3481
+ exterior_adjacent_to = HPXML::LocationOtherHousingUnit
3482
+ end
3483
+ end
3484
+ else # adjacent to a space that is explicitly in the model, e.g., corridor
3485
+ exterior_adjacent_to = get_adjacent_to(adjacent_surface)
3486
+ end
3487
+ end
3488
+
3489
+ if exterior_adjacent_to == HPXML::LocationOutside && args[:wall_siding_type].is_initialized
3490
+ siding = args[:wall_siding_type].get
3491
+ end
3492
+
3493
+ if args[:wall_color] != Constants.Auto
3494
+ color = args[:wall_color]
3495
+ end
3496
+
3497
+ if interior_adjacent_to == exterior_adjacent_to
3498
+ insulation_assembly_r_value = 4.0 # Uninsulated
3499
+ else
3500
+ insulation_assembly_r_value = args[:rim_joist_assembly_r]
3501
+ end
3502
+
3503
+ hpxml.rim_joists.add(id: valid_attr(surface.name),
3504
+ exterior_adjacent_to: exterior_adjacent_to,
3505
+ interior_adjacent_to: interior_adjacent_to,
3506
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2').round(1),
3507
+ siding: siding,
3508
+ color: color,
3509
+ insulation_assembly_r_value: insulation_assembly_r_value)
3510
+ end
3511
+ end
3512
+
3513
+ def self.get_unexposed_garage_perimeter(hpxml, args)
3514
+ # this is perimeter adjacent to a 100% protruding garage that is not exposed
3515
+ # we need this because it's difficult to set this surface to Adiabatic using our geometry methods
3516
+ if (args[:geometry_garage_protrusion] == 1.0) && (args[:geometry_garage_width] * args[:geometry_garage_depth] > 0)
3517
+ return args[:geometry_garage_width]
3518
+ end
3519
+ return 0
3520
+ end
3521
+
3522
+ def self.get_adiabatic_adjacent_surface(model, surface)
3523
+ return if surface.outsideBoundaryCondition != 'Adiabatic'
3524
+
3525
+ adjacentSurfaceType = 'Wall'
3526
+ if surface.surfaceType == 'RoofCeiling'
3527
+ adjacentSurfaceType = 'Floor'
3528
+ elsif surface.surfaceType == 'Floor'
3529
+ adjacentSurfaceType = 'RoofCeiling'
3530
+ end
3531
+
3532
+ model.getSurfaces.sort.each do |adjacent_surface|
3533
+ next if surface == adjacent_surface
3534
+ next if adjacent_surface.surfaceType != adjacentSurfaceType
3535
+ next if adjacent_surface.outsideBoundaryCondition != 'Adiabatic'
3536
+ next if Geometry.getSurfaceXValues([surface]) != Geometry.getSurfaceXValues([adjacent_surface])
3537
+ next if Geometry.getSurfaceYValues([surface]) != Geometry.getSurfaceYValues([adjacent_surface])
3538
+ next if Geometry.getSurfaceZValues([surface]) != Geometry.getSurfaceZValues([adjacent_surface])
3539
+
3540
+ return adjacent_surface
3891
3541
  end
3542
+ return
3892
3543
  end
3893
3544
 
3894
3545
  def self.set_walls(hpxml, runner, model, args)
3895
3546
  model.getSurfaces.sort.each do |surface|
3896
3547
  next if surface.surfaceType != 'Wall'
3548
+ next if Geometry.surface_is_rim_joist(surface, args[:geometry_rim_joist_height])
3897
3549
 
3898
3550
  interior_adjacent_to = get_adjacent_to(surface)
3899
- if [HPXML::LocationOtherHousingUnit].include? interior_adjacent_to
3900
- has_door = false
3901
- surface.subSurfaces.each do |sub_surface|
3902
- next if sub_surface.subSurfaceType != 'Door'
3903
-
3904
- has_door = true
3905
- end
3906
- next unless has_door
3907
- else
3908
- next unless [HPXML::LocationLivingSpace, HPXML::LocationAtticUnvented, HPXML::LocationAtticVented, HPXML::LocationGarage].include? interior_adjacent_to
3909
- end
3551
+ next unless [HPXML::LocationLivingSpace, HPXML::LocationAtticUnvented, HPXML::LocationAtticVented, HPXML::LocationGarage].include? interior_adjacent_to
3910
3552
 
3911
3553
  exterior_adjacent_to = HPXML::LocationOutside
3912
3554
  if surface.adjacentSurface.is_initialized
3913
3555
  exterior_adjacent_to = get_adjacent_to(surface.adjacentSurface.get)
3914
- elsif surface.outsideBoundaryCondition == 'Adiabatic'
3915
- exterior_adjacent_to = HPXML::LocationOtherHousingUnit
3556
+ elsif surface.outsideBoundaryCondition == 'Adiabatic' # can be adjacent to living space, attic, corridor
3557
+ adjacent_surface = get_adiabatic_adjacent_surface(model, surface)
3558
+ if adjacent_surface.nil? # adjacent to a space that is not explicitly in the model
3559
+ exterior_adjacent_to = interior_adjacent_to
3560
+ if exterior_adjacent_to == HPXML::LocationLivingSpace # living adjacent to living
3561
+ exterior_adjacent_to = HPXML::LocationOtherHousingUnit
3562
+ end
3563
+ else # adjacent to a space that is explicitly in the model, e.g., corridor
3564
+ exterior_adjacent_to = get_adjacent_to(adjacent_surface)
3565
+ end
3916
3566
  end
3917
3567
 
3918
- if interior_adjacent_to == HPXML::LocationOtherHousingUnit && exterior_adjacent_to == HPXML::LocationOtherHousingUnit
3919
- interior_adjacent_to = HPXML::LocationLivingSpace
3920
- exterior_adjacent_to == HPXML::LocationOtherHousingUnit
3921
- else
3922
- next if interior_adjacent_to == exterior_adjacent_to
3923
- end
3924
- next if [HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include? exterior_adjacent_to
3568
+ next if exterior_adjacent_to == HPXML::LocationLivingSpace # already captured these surfaces
3925
3569
 
3926
3570
  wall_type = args[:wall_type]
3927
3571
  if [HPXML::LocationAtticUnvented, HPXML::LocationAtticVented].include? interior_adjacent_to
@@ -3944,15 +3588,22 @@ class HPXMLFile
3944
3588
  solar_absorptance = args[:wall_solar_absorptance]
3945
3589
  end
3946
3590
 
3591
+ if args[:wall_emittance] != Constants.Auto
3592
+ emittance = args[:wall_emittance]
3593
+ end
3594
+
3595
+ azimuth = get_surface_azimuth(surface, args)
3596
+
3947
3597
  hpxml.walls.add(id: valid_attr(surface.name),
3948
3598
  exterior_adjacent_to: exterior_adjacent_to,
3949
3599
  interior_adjacent_to: interior_adjacent_to,
3600
+ azimuth: azimuth,
3950
3601
  wall_type: wall_type,
3951
3602
  siding: siding,
3952
3603
  color: color,
3953
3604
  solar_absorptance: solar_absorptance,
3954
3605
  area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2').round,
3955
- emittance: args[:wall_emittance])
3606
+ emittance: emittance)
3956
3607
 
3957
3608
  is_uncond_attic_roof_insulated = false
3958
3609
  if [HPXML::LocationAtticUnvented, HPXML::LocationAtticVented].include? interior_adjacent_to
@@ -3973,26 +3624,58 @@ class HPXMLFile
3973
3624
 
3974
3625
  def self.set_foundation_walls(hpxml, runner, model, args)
3975
3626
  model.getSurfaces.sort.each do |surface|
3976
- next unless ['Foundation'].include? surface.outsideBoundaryCondition
3977
3627
  next if surface.surfaceType != 'Wall'
3628
+ next unless ['Foundation', 'Adiabatic'].include? surface.outsideBoundaryCondition
3629
+ next if Geometry.surface_is_rim_joist(surface, args[:geometry_rim_joist_height])
3630
+
3631
+ interior_adjacent_to = get_adjacent_to(surface)
3632
+ next unless [HPXML::LocationBasementConditioned, HPXML::LocationBasementUnconditioned, HPXML::LocationCrawlspaceUnvented, HPXML::LocationCrawlspaceVented].include? interior_adjacent_to
3633
+
3634
+ exterior_adjacent_to = HPXML::LocationGround
3635
+ if surface.outsideBoundaryCondition == 'Adiabatic' # can be adjacent to foundation space
3636
+ adjacent_surface = get_adiabatic_adjacent_surface(model, surface)
3637
+ if adjacent_surface.nil? # adjacent to a space that is not explicitly in the model
3638
+ unless [HPXML::ResidentialTypeSFD].include?(args[:geometry_unit_type])
3639
+ exterior_adjacent_to = interior_adjacent_to
3640
+ if exterior_adjacent_to == HPXML::LocationLivingSpace # living adjacent to living
3641
+ exterior_adjacent_to = HPXML::LocationOtherHousingUnit
3642
+ end
3643
+ end
3644
+ else # adjacent to a space that is explicitly in the model, e.g., corridor
3645
+ exterior_adjacent_to = get_adjacent_to(adjacent_surface)
3646
+ end
3647
+ end
3978
3648
 
3979
3649
  if args[:foundation_wall_assembly_r].is_initialized && (args[:foundation_wall_assembly_r].get > 0)
3980
3650
  insulation_assembly_r_value = args[:foundation_wall_assembly_r]
3981
3651
  else
3982
- insulation_exterior_r_value = args[:foundation_wall_insulation_r]
3983
- insulation_exterior_distance_to_top = args[:foundation_wall_insulation_distance_to_top]
3984
- insulation_exterior_distance_to_bottom = args[:foundation_wall_insulation_distance_to_bottom]
3652
+ if interior_adjacent_to == exterior_adjacent_to # E.g., don't insulate wall between basement and neighbor basement
3653
+ insulation_exterior_r_value = 0
3654
+ insulation_exterior_distance_to_top = 0
3655
+ insulation_exterior_distance_to_bottom = 0
3656
+ else
3657
+ insulation_exterior_r_value = args[:foundation_wall_insulation_r]
3658
+ insulation_exterior_distance_to_top = args[:foundation_wall_insulation_distance_to_top]
3659
+ insulation_exterior_distance_to_bottom = args[:foundation_wall_insulation_distance_to_bottom]
3660
+ if insulation_exterior_distance_to_bottom == Constants.Auto
3661
+ insulation_exterior_distance_to_bottom = args[:geometry_foundation_height]
3662
+ end
3663
+ end
3985
3664
  insulation_interior_r_value = 0
3986
3665
  insulation_interior_distance_to_top = 0
3987
3666
  insulation_interior_distance_to_bottom = 0
3988
3667
  end
3989
3668
 
3669
+ if args[:foundation_wall_thickness] != Constants.Auto
3670
+ thickness = args[:foundation_wall_thickness]
3671
+ end
3672
+
3990
3673
  hpxml.foundation_walls.add(id: valid_attr(surface.name),
3991
- exterior_adjacent_to: HPXML::LocationGround,
3992
- interior_adjacent_to: get_adjacent_to(surface),
3674
+ exterior_adjacent_to: exterior_adjacent_to,
3675
+ interior_adjacent_to: interior_adjacent_to,
3993
3676
  height: args[:geometry_foundation_height],
3994
3677
  area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2').round,
3995
- thickness: 8,
3678
+ thickness: thickness,
3996
3679
  depth_below_grade: args[:geometry_foundation_height] - args[:geometry_foundation_height_above_grade],
3997
3680
  insulation_assembly_r_value: insulation_assembly_r_value,
3998
3681
  insulation_interior_r_value: insulation_interior_r_value,
@@ -4067,6 +3750,11 @@ class HPXMLFile
4067
3750
  has_foundation_walls = true
4068
3751
  end
4069
3752
  exposed_perimeter = Geometry.calculate_exposed_perimeter(model, [surface], has_foundation_walls).round
3753
+ next if exposed_perimeter == 0 # this could be, e.g., the foundation floor of an interior corridor
3754
+
3755
+ if [HPXML::LocationCrawlspaceVented, HPXML::LocationCrawlspaceUnvented, HPXML::LocationBasementUnconditioned, HPXML::LocationBasementConditioned].include? interior_adjacent_to
3756
+ exposed_perimeter -= get_unexposed_garage_perimeter(hpxml, args)
3757
+ end
4070
3758
 
4071
3759
  if [HPXML::LocationLivingSpace, HPXML::LocationGarage].include? interior_adjacent_to
4072
3760
  depth_below_grade = 0
@@ -4078,11 +3766,22 @@ class HPXMLFile
4078
3766
  under_slab_insulation_width = args[:slab_under_width]
4079
3767
  end
4080
3768
 
4081
- thickness = 4.0
3769
+ if args[:slab_thickness] != Constants.Auto
3770
+ thickness = args[:slab_thickness]
3771
+ end
3772
+
4082
3773
  if interior_adjacent_to.include? 'crawlspace'
4083
3774
  thickness = 0.0 # Assume soil
4084
3775
  end
4085
3776
 
3777
+ if args[:slab_carpet_fraction] != Constants.Auto
3778
+ carpet_fraction = args[:slab_carpet_fraction]
3779
+ end
3780
+
3781
+ if args[:slab_carpet_r] != Constants.Auto
3782
+ carpet_r_value = args[:slab_carpet_r]
3783
+ end
3784
+
4086
3785
  hpxml.slabs.add(id: valid_attr(surface.name),
4087
3786
  interior_adjacent_to: interior_adjacent_to,
4088
3787
  area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2').round,
@@ -4094,8 +3793,8 @@ class HPXMLFile
4094
3793
  under_slab_insulation_r_value: args[:slab_under_insulation_r],
4095
3794
  under_slab_insulation_spans_entire_slab: under_slab_insulation_spans_entire_slab,
4096
3795
  depth_below_grade: depth_below_grade,
4097
- carpet_fraction: args[:slab_carpet_fraction],
4098
- carpet_r_value: args[:slab_carpet_r])
3796
+ carpet_fraction: carpet_fraction,
3797
+ carpet_r_value: carpet_r_value)
4099
3798
  end
4100
3799
  end
4101
3800
 
@@ -4107,51 +3806,41 @@ class HPXMLFile
4107
3806
  sub_surface_height = Geometry.get_surface_height(sub_surface)
4108
3807
  sub_surface_facade = Geometry.get_facade_for_surface(sub_surface)
4109
3808
 
4110
- if (sub_surface_facade == Constants.FacadeFront) && (args[:overhangs_front_depth] > 0)
3809
+ if (sub_surface_facade == Constants.FacadeFront) && ((args[:overhangs_front_depth] > 0) || args[:overhangs_front_distance_to_top_of_window] > 0)
4111
3810
  overhangs_depth = args[:overhangs_front_depth]
4112
3811
  overhangs_distance_to_top_of_window = args[:overhangs_front_distance_to_top_of_window]
4113
3812
  overhangs_distance_to_bottom_of_window = (overhangs_distance_to_top_of_window + sub_surface_height).round
4114
- elsif (sub_surface_facade == Constants.FacadeBack) && (args[:overhangs_back_depth] > 0)
3813
+ elsif (sub_surface_facade == Constants.FacadeBack) && ((args[:overhangs_back_depth] > 0) || args[:overhangs_back_distance_to_top_of_window] > 0)
4115
3814
  overhangs_depth = args[:overhangs_back_depth]
4116
3815
  overhangs_distance_to_top_of_window = args[:overhangs_back_distance_to_top_of_window]
4117
3816
  overhangs_distance_to_bottom_of_window = (overhangs_distance_to_top_of_window + sub_surface_height).round
4118
- elsif (sub_surface_facade == Constants.FacadeLeft) && (args[:overhangs_left_depth] > 0)
3817
+ elsif (sub_surface_facade == Constants.FacadeLeft) && ((args[:overhangs_left_depth] > 0) || args[:overhangs_left_distance_to_top_of_window] > 0)
4119
3818
  overhangs_depth = args[:overhangs_left_depth]
4120
3819
  overhangs_distance_to_top_of_window = args[:overhangs_left_distance_to_top_of_window]
4121
3820
  overhangs_distance_to_bottom_of_window = (overhangs_distance_to_top_of_window + sub_surface_height).round
4122
- elsif (sub_surface_facade == Constants.FacadeRight) && (args[:overhangs_right_depth] > 0)
3821
+ elsif (sub_surface_facade == Constants.FacadeRight) && ((args[:overhangs_right_depth] > 0) || args[:overhangs_right_distance_to_top_of_window] > 0)
4123
3822
  overhangs_depth = args[:overhangs_right_depth]
4124
3823
  overhangs_distance_to_top_of_window = args[:overhangs_right_distance_to_top_of_window]
4125
3824
  overhangs_distance_to_bottom_of_window = (overhangs_distance_to_top_of_window + sub_surface_height).round
4126
3825
  elsif args[:geometry_eaves_depth] > 0
4127
- eaves_z = args[:geometry_wall_height] * args[:geometry_num_floors_above_grade]
3826
+ # Get max z coordinate of eaves
3827
+ eaves_z = args[:geometry_wall_height] * args[:geometry_num_floors_above_grade] + args[:geometry_rim_joist_height]
3828
+ if args[:geometry_attic_type] == HPXML::AtticTypeConditioned
3829
+ eaves_z += Geometry.get_conditioned_attic_height(model.getSpaces)
3830
+ end
4128
3831
  if args[:geometry_foundation_type] == HPXML::FoundationTypeAmbient
4129
3832
  eaves_z += args[:geometry_foundation_height]
4130
3833
  end
4131
- sub_surface_z = -9e99
4132
- space = sub_surface.space.get
4133
- z_origin = space.zOrigin
4134
- sub_surface.vertices.each do |vertex|
4135
- z = vertex.z + z_origin
4136
- next if z < sub_surface_z
4137
-
4138
- sub_surface_z = z
4139
- end
4140
- sub_surface_z = UnitConversions.convert(sub_surface_z, 'm', 'ft')
3834
+
3835
+ # Get max z coordinate of this window
3836
+ sub_surface_z = Geometry.getSurfaceZValues([sub_surface]).max + UnitConversions.convert(sub_surface.space.get.zOrigin, 'm', 'ft')
3837
+
4141
3838
  overhangs_depth = args[:geometry_eaves_depth]
4142
- overhangs_distance_to_top_of_window = eaves_z - sub_surface_z
3839
+ overhangs_distance_to_top_of_window = eaves_z - sub_surface_z # difference between max z coordinates of eaves and this window
4143
3840
  overhangs_distance_to_bottom_of_window = (overhangs_distance_to_top_of_window + sub_surface_height).round
4144
3841
  end
4145
3842
 
4146
- if sub_surface_facade == Constants.FacadeFront
4147
- azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 0, args[:geometry_orientation], 0)
4148
- elsif sub_surface_facade == Constants.FacadeBack
4149
- azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 180, args[:geometry_orientation], 0)
4150
- elsif sub_surface_facade == Constants.FacadeLeft
4151
- azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 90, args[:geometry_orientation], 0)
4152
- elsif sub_surface_facade == Constants.FacadeRight
4153
- azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 270, args[:geometry_orientation], 0)
4154
- end
3843
+ azimuth = get_azimuth_from_facade(sub_surface_facade, args)
4155
3844
 
4156
3845
  if args[:window_interior_shading_winter].is_initialized
4157
3846
  interior_shading_factor_winter = args[:window_interior_shading_winter].get
@@ -4161,6 +3850,14 @@ class HPXMLFile
4161
3850
  interior_shading_factor_summer = args[:window_interior_shading_summer].get
4162
3851
  end
4163
3852
 
3853
+ if args[:window_exterior_shading_winter].is_initialized
3854
+ exterior_shading_factor_winter = args[:window_exterior_shading_winter].get
3855
+ end
3856
+
3857
+ if args[:window_exterior_shading_summer].is_initialized
3858
+ exterior_shading_factor_summer = args[:window_exterior_shading_summer].get
3859
+ end
3860
+
4164
3861
  if args[:window_fraction_operable].is_initialized
4165
3862
  fraction_operable = args[:window_fraction_operable].get
4166
3863
  end
@@ -4175,6 +3872,8 @@ class HPXMLFile
4175
3872
  overhangs_distance_to_bottom_of_window: overhangs_distance_to_bottom_of_window,
4176
3873
  interior_shading_factor_winter: interior_shading_factor_winter,
4177
3874
  interior_shading_factor_summer: interior_shading_factor_summer,
3875
+ exterior_shading_factor_winter: exterior_shading_factor_winter,
3876
+ exterior_shading_factor_summer: exterior_shading_factor_summer,
4178
3877
  fraction_operable: fraction_operable,
4179
3878
  wall_idref: valid_attr(surface.name))
4180
3879
  end # sub_surfaces
@@ -4200,13 +3899,21 @@ class HPXMLFile
4200
3899
 
4201
3900
  def self.set_doors(hpxml, runner, model, args)
4202
3901
  model.getSurfaces.sort.each do |surface|
3902
+ interior_adjacent_to = get_adjacent_to(surface)
3903
+
3904
+ adjacent_surface = surface
3905
+ if [HPXML::LocationOtherHousingUnit].include?(interior_adjacent_to)
3906
+ adjacent_surface = get_adiabatic_adjacent_surface(model, surface)
3907
+ next if adjacent_surface.nil?
3908
+ end
3909
+
4203
3910
  surface.subSurfaces.sort.each do |sub_surface|
4204
3911
  next if sub_surface.subSurfaceType != 'Door'
4205
3912
 
4206
3913
  sub_surface_facade = Geometry.get_facade_for_surface(sub_surface)
4207
3914
 
4208
3915
  hpxml.doors.add(id: "#{valid_attr(sub_surface.name)}_#{sub_surface_facade}",
4209
- wall_idref: valid_attr(surface.name),
3916
+ wall_idref: valid_attr(adjacent_surface.name),
4210
3917
  area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2').round,
4211
3918
  azimuth: args[:geometry_orientation],
4212
3919
  r_value: args[:door_rvalue])
@@ -4223,67 +3930,49 @@ class HPXMLFile
4223
3930
  heating_capacity = args[:heating_system_heating_capacity]
4224
3931
  end
4225
3932
 
4226
- if args[:heating_system_electric_auxiliary_energy].is_initialized
4227
- if args[:heating_system_electric_auxiliary_energy].get > 0
4228
- electric_auxiliary_energy = args[:heating_system_electric_auxiliary_energy].get
4229
- end
4230
- end
4231
-
4232
3933
  if heating_system_type == HPXML::HVACTypeElectricResistance
4233
3934
  heating_system_fuel = HPXML::FuelTypeElectricity
4234
3935
  else
4235
3936
  heating_system_fuel = args[:heating_system_fuel]
4236
3937
  end
4237
3938
 
4238
- if [HPXML::HVACTypeFurnace, HPXML::HVACTypeWallFurnace, HPXML::HVACTypeFloorFurnace, HPXML::HVACTypeBoiler].include? heating_system_type
3939
+ if [HPXML::HVACTypeFurnace, HPXML::HVACTypeWallFurnace, HPXML::HVACTypeFloorFurnace].include?(heating_system_type) || heating_system_type.include?(HPXML::HVACTypeBoiler)
4239
3940
  heating_efficiency_afue = args[:heating_system_heating_efficiency]
4240
- elsif [HPXML::HVACTypeElectricResistance, HPXML::HVACTypeStove, HPXML::HVACTypePortableHeater, HPXML::HVACTypeFireplace, HPXML::HVACTypeFixedHeater].include? heating_system_type
3941
+ elsif [HPXML::HVACTypeElectricResistance, HPXML::HVACTypeStove, HPXML::HVACTypePortableHeater, HPXML::HVACTypeFireplace, HPXML::HVACTypeFixedHeater].include?(heating_system_type)
4241
3942
  heating_efficiency_percent = args[:heating_system_heating_efficiency]
4242
3943
  end
4243
3944
 
4244
- hpxml.heating_systems.add(id: 'HeatingSystem',
4245
- heating_system_type: heating_system_type,
4246
- heating_system_fuel: heating_system_fuel,
4247
- heating_capacity: heating_capacity,
4248
- fraction_heat_load_served: args[:heating_system_fraction_heat_load_served],
4249
- electric_auxiliary_energy: electric_auxiliary_energy,
4250
- heating_efficiency_afue: heating_efficiency_afue,
4251
- heating_efficiency_percent: heating_efficiency_percent)
4252
-
4253
- heating_system_type_2 = args[:heating_system_type_2]
4254
-
4255
- return if heating_system_type_2 == 'none'
4256
-
4257
- if args[:heating_system_heating_capacity_2] != Constants.Auto
4258
- heating_capacity_2 = args[:heating_system_heating_capacity_2]
3945
+ if args[:heating_system_airflow_defect_ratio].is_initialized
3946
+ if [HPXML::HVACTypeFurnace].include? heating_system_type
3947
+ airflow_defect_ratio = args[:heating_system_airflow_defect_ratio].get
3948
+ end
4259
3949
  end
4260
3950
 
4261
- if args[:heating_system_electric_auxiliary_energy_2].is_initialized
4262
- if args[:heating_system_electric_auxiliary_energy_2].get > 0
4263
- electric_auxiliary_energy_2 = args[:heating_system_electric_auxiliary_energy_2].get
4264
- end
3951
+ fraction_heat_load_served = args[:heating_system_fraction_heat_load_served]
3952
+ if args[:heating_system_type_2] != 'none' && fraction_heat_load_served + args[:heating_system_fraction_heat_load_served_2] > 1.0
3953
+ fraction_heat_load_served = 1.0 - args[:heating_system_fraction_heat_load_served_2]
4265
3954
  end
4266
3955
 
4267
- if args[:heating_system_fuel_2] == HPXML::HVACTypeElectricResistance
4268
- heating_system_fuel_2 = HPXML::FuelTypeElectricity
4269
- else
4270
- heating_system_fuel_2 = args[:heating_system_fuel_2]
3956
+ if heating_system_type.include?('Shared')
3957
+ is_shared_system = true
3958
+ number_of_units_served = args[:geometry_building_num_units].get
3959
+ heating_capacity = nil
4271
3960
  end
4272
3961
 
4273
- if [HPXML::HVACTypeFurnace, HPXML::HVACTypeWallFurnace].include? heating_system_type_2
4274
- heating_efficiency_afue_2 = args[:heating_system_heating_efficiency_2]
4275
- elsif [HPXML::HVACTypeElectricResistance, HPXML::HVACTypeStove, HPXML::HVACTypePortableHeater, HPXML::HVACTypeFireplace].include? heating_system_type_2
4276
- heating_efficiency_percent_2 = args[:heating_system_heating_efficiency_2]
3962
+ if heating_system_type.include?(HPXML::HVACTypeBoiler)
3963
+ heating_system_type = HPXML::HVACTypeBoiler
4277
3964
  end
4278
3965
 
4279
- hpxml.heating_systems.add(id: 'SecondHeatingSystem',
4280
- heating_system_type: heating_system_type_2,
4281
- heating_system_fuel: heating_system_fuel_2,
4282
- heating_capacity: heating_capacity_2,
4283
- fraction_heat_load_served: args[:heating_system_fraction_heat_load_served_2],
4284
- electric_auxiliary_energy: electric_auxiliary_energy_2,
4285
- heating_efficiency_afue: heating_efficiency_afue_2,
4286
- heating_efficiency_percent: heating_efficiency_percent_2)
3966
+ hpxml.heating_systems.add(id: 'HeatingSystem',
3967
+ heating_system_type: heating_system_type,
3968
+ heating_system_fuel: heating_system_fuel,
3969
+ heating_capacity: heating_capacity,
3970
+ fraction_heat_load_served: fraction_heat_load_served,
3971
+ heating_efficiency_afue: heating_efficiency_afue,
3972
+ heating_efficiency_percent: heating_efficiency_percent,
3973
+ airflow_defect_ratio: airflow_defect_ratio,
3974
+ is_shared_system: is_shared_system,
3975
+ number_of_units_served: number_of_units_served)
4287
3976
  end
4288
3977
 
4289
3978
  def self.set_cooling_systems(hpxml, runner, args)
@@ -4291,10 +3980,8 @@ class HPXMLFile
4291
3980
 
4292
3981
  return if cooling_system_type == 'none'
4293
3982
 
4294
- if cooling_system_type != HPXML::HVACTypeEvaporativeCooler
4295
- if args[:cooling_system_cooling_capacity] != Constants.Auto
4296
- cooling_capacity = args[:cooling_system_cooling_capacity]
4297
- end
3983
+ if args[:cooling_system_cooling_capacity] != Constants.Auto
3984
+ cooling_capacity = args[:cooling_system_cooling_capacity]
4298
3985
  end
4299
3986
 
4300
3987
  if args[:cooling_system_cooling_compressor_type].is_initialized
@@ -4309,10 +3996,22 @@ class HPXMLFile
4309
3996
  end
4310
3997
  end
4311
3998
 
4312
- if [HPXML::HVACTypeCentralAirConditioner, HPXML::HVACTypeMiniSplitAirConditioner].include? cooling_system_type
4313
- cooling_efficiency_seer = args[:cooling_system_cooling_efficiency_seer]
4314
- elsif [HPXML::HVACTypeRoomAirConditioner].include? cooling_system_type
4315
- cooling_efficiency_eer = args[:cooling_system_cooling_efficiency_eer]
3999
+ if args[:cooling_system_cooling_efficiency_type] == HPXML::UnitsSEER
4000
+ cooling_efficiency_seer = args[:cooling_system_cooling_efficiency]
4001
+ elsif args[:cooling_system_cooling_efficiency_type] == HPXML::UnitsEER
4002
+ cooling_efficiency_eer = args[:cooling_system_cooling_efficiency]
4003
+ end
4004
+
4005
+ if args[:cooling_system_airflow_defect_ratio].is_initialized
4006
+ if [HPXML::HVACTypeCentralAirConditioner].include?(cooling_system_type) || ([HPXML::HVACTypeMiniSplitAirConditioner].include?(cooling_system_type) && (args[:cooling_system_is_ducted]))
4007
+ airflow_defect_ratio = args[:cooling_system_airflow_defect_ratio].get
4008
+ end
4009
+ end
4010
+
4011
+ if args[:cooling_system_charge_defect_ratio].is_initialized
4012
+ if [HPXML::HVACTypeCentralAirConditioner, HPXML::HVACTypeMiniSplitAirConditioner].include?(cooling_system_type)
4013
+ charge_defect_ratio = args[:cooling_system_charge_defect_ratio].get
4014
+ end
4316
4015
  end
4317
4016
 
4318
4017
  hpxml.cooling_systems.add(id: 'CoolingSystem',
@@ -4323,7 +4022,9 @@ class HPXMLFile
4323
4022
  compressor_type: compressor_type,
4324
4023
  cooling_shr: cooling_shr,
4325
4024
  cooling_efficiency_seer: cooling_efficiency_seer,
4326
- cooling_efficiency_eer: cooling_efficiency_eer)
4025
+ cooling_efficiency_eer: cooling_efficiency_eer,
4026
+ airflow_defect_ratio: airflow_defect_ratio,
4027
+ charge_defect_ratio: charge_defect_ratio)
4327
4028
  end
4328
4029
 
4329
4030
  def self.set_heat_pumps(hpxml, runner, args)
@@ -4336,8 +4037,8 @@ class HPXMLFile
4336
4037
  end
4337
4038
 
4338
4039
  if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit].include? heat_pump_type
4339
- if args[:heat_pump_heating_capacity_17F] != Constants.Auto
4340
- heating_capacity_17F = args[:heat_pump_heating_capacity_17F]
4040
+ if args[:heat_pump_heating_capacity_17_f] != Constants.Auto
4041
+ heating_capacity_17F = args[:heat_pump_heating_capacity_17_f]
4341
4042
  end
4342
4043
  end
4343
4044
 
@@ -4374,22 +4075,33 @@ class HPXMLFile
4374
4075
  cooling_shr = args[:heat_pump_cooling_sensible_heat_fraction].get
4375
4076
  end
4376
4077
 
4377
- if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit].include? heat_pump_type
4378
- heating_efficiency_hspf = args[:heat_pump_heating_efficiency_hspf]
4379
- cooling_efficiency_seer = args[:heat_pump_cooling_efficiency_seer]
4380
- elsif [HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump_type
4381
- heating_efficiency_cop = args[:heat_pump_heating_efficiency_cop]
4382
- cooling_efficiency_eer = args[:heat_pump_cooling_efficiency_eer]
4383
-
4384
- if args[:heat_pump_ground_to_air_pump_power].is_initialized
4385
- pump_watts_per_ton = args[:heat_pump_ground_to_air_pump_power].get
4386
- end
4078
+ if args[:heat_pump_heating_efficiency_type] == HPXML::UnitsHSPF
4079
+ heating_efficiency_hspf = args[:heat_pump_heating_efficiency]
4080
+ elsif args[:heat_pump_heating_efficiency_type] == HPXML::UnitsCOP
4081
+ heating_efficiency_cop = args[:heat_pump_heating_efficiency]
4082
+ end
4387
4083
 
4388
- if args[:heat_pump_ground_to_air_fan_power].is_initialized
4389
- fan_watts_per_cfm = args[:heat_pump_ground_to_air_fan_power].get
4084
+ if args[:heat_pump_cooling_efficiency_type] == HPXML::UnitsSEER
4085
+ cooling_efficiency_seer = args[:heat_pump_cooling_efficiency]
4086
+ elsif args[:heat_pump_cooling_efficiency_type] == HPXML::UnitsEER
4087
+ cooling_efficiency_eer = args[:heat_pump_cooling_efficiency]
4088
+ end
4089
+
4090
+ if args[:heat_pump_airflow_defect_ratio].is_initialized
4091
+ if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpGroundToAir].include?(heat_pump_type) || ([HPXML::HVACTypeHeatPumpMiniSplit].include?(heat_pump_type) && (args[:heat_pump_is_ducted]))
4092
+ airflow_defect_ratio = args[:heat_pump_airflow_defect_ratio].get
4390
4093
  end
4391
4094
  end
4392
4095
 
4096
+ if args[:heat_pump_charge_defect_ratio].is_initialized
4097
+ charge_defect_ratio = args[:heat_pump_charge_defect_ratio].get
4098
+ end
4099
+
4100
+ fraction_heat_load_served = args[:heat_pump_fraction_heat_load_served]
4101
+ if args[:heating_system_type_2] != 'none' && fraction_heat_load_served + args[:heating_system_fraction_heat_load_served_2] > 1.0
4102
+ fraction_heat_load_served = 1.0 - args[:heating_system_fraction_heat_load_served_2]
4103
+ end
4104
+
4393
4105
  hpxml.heat_pumps.add(id: 'HeatPump',
4394
4106
  heat_pump_type: heat_pump_type,
4395
4107
  heat_pump_fuel: HPXML::FuelTypeElectricity,
@@ -4398,7 +4110,7 @@ class HPXMLFile
4398
4110
  compressor_type: compressor_type,
4399
4111
  cooling_shr: cooling_shr,
4400
4112
  cooling_capacity: cooling_capacity,
4401
- fraction_heat_load_served: args[:heat_pump_fraction_heat_load_served],
4113
+ fraction_heat_load_served: fraction_heat_load_served,
4402
4114
  fraction_cool_load_served: args[:heat_pump_fraction_cool_load_served],
4403
4115
  backup_heating_fuel: backup_heating_fuel,
4404
4116
  backup_heating_capacity: backup_heating_capacity,
@@ -4409,31 +4121,67 @@ class HPXMLFile
4409
4121
  cooling_efficiency_seer: cooling_efficiency_seer,
4410
4122
  heating_efficiency_cop: heating_efficiency_cop,
4411
4123
  cooling_efficiency_eer: cooling_efficiency_eer,
4412
- pump_watts_per_ton: pump_watts_per_ton,
4413
- fan_watts_per_cfm: fan_watts_per_cfm)
4124
+ airflow_defect_ratio: airflow_defect_ratio,
4125
+ charge_defect_ratio: charge_defect_ratio)
4126
+ end
4127
+
4128
+ def self.set_secondary_heating_systems(hpxml, runner, args)
4129
+ heating_system_type = args[:heating_system_type_2]
4130
+
4131
+ return if heating_system_type == 'none'
4132
+
4133
+ if args[:heating_system_heating_capacity_2] != Constants.Auto
4134
+ heating_capacity = args[:heating_system_heating_capacity_2]
4135
+ end
4136
+
4137
+ if args[:heating_system_fuel_2] == HPXML::HVACTypeElectricResistance
4138
+ heating_system_fuel = HPXML::FuelTypeElectricity
4139
+ else
4140
+ heating_system_fuel = args[:heating_system_fuel_2]
4141
+ end
4142
+
4143
+ if [HPXML::HVACTypeFurnace, HPXML::HVACTypeWallFurnace, HPXML::HVACTypeFloorFurnace].include?(heating_system_type) || heating_system_type.include?(HPXML::HVACTypeBoiler)
4144
+ heating_efficiency_afue = args[:heating_system_heating_efficiency_2]
4145
+ elsif [HPXML::HVACTypeElectricResistance, HPXML::HVACTypeStove, HPXML::HVACTypePortableHeater, HPXML::HVACTypeFireplace].include?(heating_system_type)
4146
+ heating_efficiency_percent = args[:heating_system_heating_efficiency_2]
4147
+ end
4148
+
4149
+ if heating_system_type.include?(HPXML::HVACTypeBoiler)
4150
+ heating_system_type = HPXML::HVACTypeBoiler
4151
+ end
4152
+
4153
+ hpxml.heating_systems.add(id: 'SecondHeatingSystem',
4154
+ heating_system_type: heating_system_type,
4155
+ heating_system_fuel: heating_system_fuel,
4156
+ heating_capacity: heating_capacity,
4157
+ fraction_heat_load_served: args[:heating_system_fraction_heat_load_served_2],
4158
+ heating_efficiency_afue: heating_efficiency_afue,
4159
+ heating_efficiency_percent: heating_efficiency_percent)
4414
4160
  end
4415
4161
 
4416
4162
  def self.set_hvac_distribution(hpxml, runner, args)
4417
4163
  # HydronicDistribution?
4164
+ hydr_idx = 0
4418
4165
  hpxml.heating_systems.each do |heating_system|
4419
- next unless [HPXML::HVACTypeBoiler].include? heating_system.heating_system_type
4166
+ next unless [heating_system.heating_system_type].include?(HPXML::HVACTypeBoiler)
4167
+ next if args[:heating_system_type].include?('Fan Coil')
4420
4168
 
4421
- hpxml.hvac_distributions.add(id: 'HydronicDistribution',
4169
+ hydr_idx += 1
4170
+ hpxml.hvac_distributions.add(id: "HydronicDistribution#{hydr_idx}",
4422
4171
  distribution_system_type: HPXML::HVACDistributionTypeHydronic,
4423
4172
  hydronic_type: HPXML::HydronicTypeBaseboard)
4424
4173
  heating_system.distribution_system_idref = hpxml.hvac_distributions[-1].id
4425
- break
4426
4174
  end
4427
4175
 
4428
4176
  # AirDistribution?
4429
4177
  air_distribution_systems = []
4430
4178
  hpxml.heating_systems.each do |heating_system|
4431
- if [HPXML::HVACTypeFurnace].include? heating_system.heating_system_type
4179
+ if [HPXML::HVACTypeFurnace].include?(heating_system.heating_system_type)
4432
4180
  air_distribution_systems << heating_system
4433
4181
  end
4434
4182
  end
4435
4183
  hpxml.cooling_systems.each do |cooling_system|
4436
- if [HPXML::HVACTypeCentralAirConditioner].include? cooling_system.cooling_system_type
4184
+ if [HPXML::HVACTypeCentralAirConditioner].include?(cooling_system.cooling_system_type)
4437
4185
  air_distribution_systems << cooling_system
4438
4186
  elsif [HPXML::HVACTypeEvaporativeCooler, HPXML::HVACTypeMiniSplitAirConditioner].include?(cooling_system.cooling_system_type) && args[:cooling_system_is_ducted]
4439
4187
  air_distribution_systems << cooling_system
@@ -4443,41 +4191,69 @@ class HPXMLFile
4443
4191
  if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump.heat_pump_type
4444
4192
  air_distribution_systems << heat_pump
4445
4193
  elsif [HPXML::HVACTypeHeatPumpMiniSplit].include?(heat_pump.heat_pump_type)
4446
- if args[:heat_pump_mini_split_is_ducted].is_initialized
4447
- air_distribution_systems << heat_pump if to_boolean(args[:heat_pump_mini_split_is_ducted].get)
4194
+ if args[:heat_pump_is_ducted].is_initialized
4195
+ air_distribution_systems << heat_pump if to_boolean(args[:heat_pump_is_ducted].get)
4448
4196
  end
4449
4197
  end
4450
4198
  end
4451
- return unless air_distribution_systems.size > 0
4199
+
4200
+ # FanCoil?
4201
+ fan_coil_distribution_systems = []
4202
+ hpxml.heating_systems.each do |heating_system|
4203
+ if args[:heating_system_type].include?('Fan Coil')
4204
+ fan_coil_distribution_systems << heating_system
4205
+ end
4206
+ end
4207
+
4208
+ return if air_distribution_systems.size == 0 && fan_coil_distribution_systems.size == 0
4452
4209
 
4453
4210
  if args[:ducts_number_of_return_registers] != Constants.Auto
4454
4211
  number_of_return_registers = args[:ducts_number_of_return_registers]
4455
4212
  end
4456
4213
 
4457
- hpxml.hvac_distributions.add(id: 'AirDistribution',
4458
- distribution_system_type: HPXML::HVACDistributionTypeAir,
4459
- conditioned_floor_area_served: args[:geometry_cfa],
4460
- number_of_return_registers: number_of_return_registers)
4214
+ if [HPXML::HVACTypeEvaporativeCooler].include?(args[:cooling_system_type]) && hpxml.heating_systems.size == 0 && hpxml.heat_pumps.size == 0
4215
+ number_of_return_registers = nil
4216
+ if args[:cooling_system_is_ducted]
4217
+ number_of_return_registers = 0
4218
+ end
4219
+ end
4461
4220
 
4462
- air_distribution_systems.each do |hvac_system|
4463
- hvac_system.distribution_system_idref = hpxml.hvac_distributions[-1].id
4221
+ if air_distribution_systems.size > 0
4222
+ hpxml.hvac_distributions.add(id: 'AirDistribution',
4223
+ distribution_system_type: HPXML::HVACDistributionTypeAir,
4224
+ conditioned_floor_area_served: args[:geometry_cfa],
4225
+ air_type: HPXML::AirTypeRegularVelocity,
4226
+ number_of_return_registers: number_of_return_registers)
4227
+ air_distribution_systems.each do |hvac_system|
4228
+ hvac_system.distribution_system_idref = hpxml.hvac_distributions[-1].id
4229
+ end
4230
+ set_duct_leakages(args, hpxml.hvac_distributions[-1])
4231
+ set_ducts(args, hpxml.hvac_distributions[-1])
4464
4232
  end
4465
4233
 
4466
- # Duct Leakage
4467
- hpxml.hvac_distributions[-1].duct_leakage_measurements.add(duct_type: HPXML::DuctTypeSupply,
4468
- duct_leakage_units: args[:ducts_supply_leakage_units],
4469
- duct_leakage_value: args[:ducts_supply_leakage_value],
4470
- duct_leakage_total_or_to_outside: HPXML::DuctLeakageToOutside)
4234
+ if fan_coil_distribution_systems.size > 0
4235
+ hpxml.hvac_distributions.add(id: 'FanCoilDistribution',
4236
+ distribution_system_type: HPXML::HVACDistributionTypeAir,
4237
+ air_type: HPXML::AirTypeFanCoil)
4238
+ fan_coil_distribution_systems.each do |hvac_system|
4239
+ hvac_system.distribution_system_idref = hpxml.hvac_distributions[-1].id
4240
+ end
4241
+ end
4242
+ end
4471
4243
 
4472
- if not ([HPXML::HVACTypeEvaporativeCooler].include?(args[:cooling_system_type]) && args[:cooling_system_is_ducted])
4244
+ def self.set_duct_leakages(args, hvac_distribution)
4245
+ hvac_distribution.duct_leakage_measurements.add(duct_type: HPXML::DuctTypeSupply,
4246
+ duct_leakage_units: args[:ducts_supply_leakage_units],
4247
+ duct_leakage_value: args[:ducts_supply_leakage_value],
4248
+ duct_leakage_total_or_to_outside: HPXML::DuctLeakageToOutside)
4473
4249
 
4474
- hpxml.hvac_distributions[-1].duct_leakage_measurements.add(duct_type: HPXML::DuctTypeReturn,
4475
- duct_leakage_units: args[:ducts_return_leakage_units],
4476
- duct_leakage_value: args[:ducts_return_leakage_value],
4477
- duct_leakage_total_or_to_outside: HPXML::DuctLeakageToOutside)
4478
- end
4250
+ hvac_distribution.duct_leakage_measurements.add(duct_type: HPXML::DuctTypeReturn,
4251
+ duct_leakage_units: args[:ducts_return_leakage_units],
4252
+ duct_leakage_value: args[:ducts_return_leakage_value],
4253
+ duct_leakage_total_or_to_outside: HPXML::DuctLeakageToOutside)
4254
+ end
4479
4255
 
4480
- # Ducts
4256
+ def self.set_ducts(args, hvac_distribution)
4481
4257
  if args[:ducts_supply_location] != Constants.Auto
4482
4258
  ducts_supply_location = args[:ducts_supply_location]
4483
4259
  end
@@ -4494,32 +4270,34 @@ class HPXMLFile
4494
4270
  ducts_return_surface_area = args[:ducts_return_surface_area]
4495
4271
  end
4496
4272
 
4497
- hpxml.hvac_distributions[-1].ducts.add(duct_type: HPXML::DuctTypeSupply,
4498
- duct_insulation_r_value: args[:ducts_supply_insulation_r],
4499
- duct_location: ducts_supply_location,
4500
- duct_surface_area: ducts_supply_surface_area)
4273
+ hvac_distribution.ducts.add(duct_type: HPXML::DuctTypeSupply,
4274
+ duct_insulation_r_value: args[:ducts_supply_insulation_r],
4275
+ duct_location: ducts_supply_location,
4276
+ duct_surface_area: ducts_supply_surface_area)
4501
4277
 
4502
4278
  if not ([HPXML::HVACTypeEvaporativeCooler].include?(args[:cooling_system_type]) && args[:cooling_system_is_ducted])
4503
- hpxml.hvac_distributions[-1].ducts.add(duct_type: HPXML::DuctTypeReturn,
4504
- duct_insulation_r_value: args[:ducts_return_insulation_r],
4505
- duct_location: ducts_return_location,
4506
- duct_surface_area: ducts_return_surface_area)
4279
+ hvac_distribution.ducts.add(duct_type: HPXML::DuctTypeReturn,
4280
+ duct_insulation_r_value: args[:ducts_return_insulation_r],
4281
+ duct_location: ducts_return_location,
4282
+ duct_surface_area: ducts_return_surface_area)
4507
4283
  end
4508
4284
  end
4509
4285
 
4510
4286
  def self.set_hvac_control(hpxml, runner, args)
4511
4287
  return if (args[:heating_system_type] == 'none') && (args[:cooling_system_type] == 'none') && (args[:heat_pump_type] == 'none')
4512
4288
 
4513
- if (args[:setpoint_heating_temp] != args[:setpoint_heating_setback_temp]) && (args[:setpoint_heating_setback_hours_per_week] > 0)
4514
- heating_setback_temp = args[:setpoint_heating_setback_temp]
4515
- heating_setback_hours_per_week = args[:setpoint_heating_setback_hours_per_week]
4516
- heating_setback_start_hour = args[:setpoint_heating_setback_start_hour]
4289
+ if args[:setpoint_heating_weekday] == args[:setpoint_heating_weekend] && !args[:setpoint_heating_weekday].include?(',')
4290
+ heating_setpoint_temp = args[:setpoint_heating_weekday]
4291
+ else
4292
+ weekday_heating_setpoints = args[:setpoint_heating_weekday]
4293
+ weekend_heating_setpoints = args[:setpoint_heating_weekend]
4517
4294
  end
4518
4295
 
4519
- if (args[:setpoint_cooling_temp] != args[:setpoint_cooling_setup_temp]) && (args[:setpoint_cooling_setup_hours_per_week] > 0)
4520
- cooling_setup_temp = args[:setpoint_cooling_setup_temp]
4521
- cooling_setup_hours_per_week = args[:setpoint_cooling_setup_hours_per_week]
4522
- cooling_setup_start_hour = args[:setpoint_cooling_setup_start_hour]
4296
+ if args[:setpoint_cooling_weekday] == args[:setpoint_cooling_weekend] && !args[:setpoint_cooling_weekday].include?(',')
4297
+ cooling_setpoint_temp = args[:setpoint_cooling_weekday]
4298
+ else
4299
+ weekday_cooling_setpoints = args[:setpoint_cooling_weekday]
4300
+ weekend_cooling_setpoints = args[:setpoint_cooling_weekend]
4523
4301
  end
4524
4302
 
4525
4303
  ceiling_fan_quantity = nil
@@ -4532,52 +4310,47 @@ class HPXMLFile
4532
4310
  end
4533
4311
 
4534
4312
  hpxml.hvac_controls.add(id: 'HVACControl',
4535
- heating_setpoint_temp: args[:setpoint_heating_temp],
4536
- cooling_setpoint_temp: args[:setpoint_cooling_temp],
4537
- heating_setback_temp: heating_setback_temp,
4538
- heating_setback_hours_per_week: heating_setback_hours_per_week,
4539
- heating_setback_start_hour: heating_setback_start_hour,
4540
- cooling_setup_temp: cooling_setup_temp,
4541
- cooling_setup_hours_per_week: cooling_setup_hours_per_week,
4542
- cooling_setup_start_hour: cooling_setup_start_hour,
4313
+ heating_setpoint_temp: heating_setpoint_temp,
4314
+ cooling_setpoint_temp: cooling_setpoint_temp,
4315
+ weekday_heating_setpoints: weekday_heating_setpoints,
4316
+ weekend_heating_setpoints: weekend_heating_setpoints,
4317
+ weekday_cooling_setpoints: weekday_cooling_setpoints,
4318
+ weekend_cooling_setpoints: weekend_cooling_setpoints,
4543
4319
  ceiling_fan_cooling_setpoint_temp_offset: ceiling_fan_cooling_setpoint_temp_offset)
4544
4320
  end
4545
4321
 
4546
4322
  def self.set_ventilation_fans(hpxml, runner, args)
4547
4323
  if args[:mech_vent_fan_type] != 'none'
4548
4324
 
4549
- if args[:mech_vent_fan_type].include? 'recovery ventilator'
4550
-
4551
- if args[:mech_vent_fan_type].include? 'energy'
4552
-
4553
- if args[:mech_vent_total_recovery_efficiency_type] == 'Unadjusted'
4554
- total_recovery_efficiency = args[:mech_vent_total_recovery_efficiency]
4555
- elsif args[:mech_vent_total_recovery_efficiency_type] == 'Adjusted'
4556
- total_recovery_efficiency_adjusted = args[:mech_vent_total_recovery_efficiency]
4557
- end
4558
-
4325
+ if [HPXML::MechVentTypeERV].include?(args[:mech_vent_fan_type])
4326
+ if args[:mech_vent_recovery_efficiency_type] == 'Unadjusted'
4327
+ total_recovery_efficiency = args[:mech_vent_total_recovery_efficiency]
4328
+ sensible_recovery_efficiency = args[:mech_vent_sensible_recovery_efficiency]
4329
+ elsif args[:mech_vent_recovery_efficiency_type] == 'Adjusted'
4330
+ total_recovery_efficiency_adjusted = args[:mech_vent_total_recovery_efficiency]
4331
+ sensible_recovery_efficiency_adjusted = args[:mech_vent_sensible_recovery_efficiency]
4559
4332
  end
4560
-
4561
- if args[:mech_vent_sensible_recovery_efficiency_type] == 'Unadjusted'
4333
+ elsif [HPXML::MechVentTypeHRV].include?(args[:mech_vent_fan_type])
4334
+ if args[:mech_vent_recovery_efficiency_type] == 'Unadjusted'
4562
4335
  sensible_recovery_efficiency = args[:mech_vent_sensible_recovery_efficiency]
4563
- elsif args[:mech_vent_sensible_recovery_efficiency_type] == 'Adjusted'
4336
+ elsif args[:mech_vent_recovery_efficiency_type] == 'Adjusted'
4564
4337
  sensible_recovery_efficiency_adjusted = args[:mech_vent_sensible_recovery_efficiency]
4565
4338
  end
4566
-
4567
4339
  end
4568
4340
 
4569
4341
  distribution_system_idref = nil
4570
4342
  if args[:mech_vent_fan_type] == HPXML::MechVentTypeCFIS
4571
4343
  hpxml.hvac_distributions.each do |hvac_distribution|
4572
4344
  next unless hvac_distribution.distribution_system_type == HPXML::HVACDistributionTypeAir
4345
+ next if hvac_distribution.air_type != HPXML::AirTypeRegularVelocity
4573
4346
 
4574
4347
  distribution_system_idref = hvac_distribution.id
4575
4348
  end
4576
4349
  end
4577
4350
 
4578
- if args[:mech_vent_is_shared_system]
4579
- is_shared_system = args[:mech_vent_is_shared_system]
4580
- in_unit_flow_rate = args[:shared_mech_vent_in_unit_flow_rate].get
4351
+ if args[:mech_vent_num_units_served] > 1
4352
+ is_shared_system = true
4353
+ in_unit_flow_rate = args[:mech_vent_flow_rate] / args[:mech_vent_num_units_served].to_f
4581
4354
  fraction_recirculation = args[:shared_mech_vent_frac_recirculation].get
4582
4355
  if args[:shared_mech_vent_preheating_fuel].is_initialized && args[:shared_mech_vent_preheating_efficiency].is_initialized && args[:shared_mech_vent_preheating_fraction_heat_load_served].is_initialized
4583
4356
  preheating_fuel = args[:shared_mech_vent_preheating_fuel].get
@@ -4615,32 +4388,20 @@ class HPXMLFile
4615
4388
 
4616
4389
  if args[:mech_vent_fan_type_2] != 'none'
4617
4390
 
4618
- if args[:mech_vent_fan_type_2].include? 'recovery ventilator'
4619
-
4620
- if args[:mech_vent_fan_type_2].include? 'energy'
4391
+ if [HPXML::MechVentTypeERV].include?(args[:mech_vent_fan_type_2])
4621
4392
 
4622
- if args[:mech_vent_total_recovery_efficiency_type_2] == 'Unadjusted'
4623
- total_recovery_efficiency = args[:mech_vent_total_recovery_efficiency_2]
4624
- elsif args[:mech_vent_total_recovery_efficiency_type_2] == 'Adjusted'
4625
- total_recovery_efficiency_adjusted = args[:mech_vent_total_recovery_efficiency_2]
4626
- end
4627
-
4628
- end
4629
-
4630
- if args[:mech_vent_sensible_recovery_efficiency_type_2] == 'Unadjusted'
4393
+ if args[:mech_vent_recovery_efficiency_type_2] == 'Unadjusted'
4394
+ total_recovery_efficiency = args[:mech_vent_total_recovery_efficiency_2]
4631
4395
  sensible_recovery_efficiency = args[:mech_vent_sensible_recovery_efficiency_2]
4632
- elsif args[:mech_vent_sensible_recovery_efficiency_type_2] == 'Adjusted'
4396
+ elsif args[:mech_vent_recovery_efficiency_type_2] == 'Adjusted'
4397
+ total_recovery_efficiency_adjusted = args[:mech_vent_total_recovery_efficiency_2]
4633
4398
  sensible_recovery_efficiency_adjusted = args[:mech_vent_sensible_recovery_efficiency_2]
4634
4399
  end
4635
-
4636
- end
4637
-
4638
- distribution_system_idref = nil
4639
- if args[:mech_vent_fan_type_2] == HPXML::MechVentTypeCFIS
4640
- hpxml.hvac_distributions.each do |hvac_distribution|
4641
- next unless hvac_distribution.distribution_system_type == HPXML::HVACDistributionTypeAir
4642
-
4643
- distribution_system_idref = hvac_distribution.id
4400
+ elsif [HPXML::MechVentTypeHRV].include?(args[:mech_vent_fan_type_2])
4401
+ if args[:mech_vent_recovery_efficiency_type_2] == 'Unadjusted'
4402
+ sensible_recovery_efficiency = args[:mech_vent_sensible_recovery_efficiency_2]
4403
+ elsif args[:mech_vent_recovery_efficiency_type_2] == 'Adjusted'
4404
+ sensible_recovery_efficiency_adjusted = args[:mech_vent_sensible_recovery_efficiency_2]
4644
4405
  end
4645
4406
  end
4646
4407
 
@@ -4653,29 +4414,36 @@ class HPXMLFile
4653
4414
  total_recovery_efficiency_adjusted: total_recovery_efficiency_adjusted,
4654
4415
  sensible_recovery_efficiency: sensible_recovery_efficiency,
4655
4416
  sensible_recovery_efficiency_adjusted: sensible_recovery_efficiency_adjusted,
4656
- fan_power: args[:mech_vent_fan_power_2],
4657
- distribution_system_idref: distribution_system_idref)
4417
+ fan_power: args[:mech_vent_fan_power_2])
4658
4418
  end
4659
4419
 
4660
- if args[:kitchen_fans_present]
4420
+ if (args[:kitchen_fans_quantity] == Constants.Auto) || (args[:kitchen_fans_quantity].to_i > 0)
4661
4421
  if args[:kitchen_fans_flow_rate].is_initialized
4662
- rated_flow_rate = args[:kitchen_fans_flow_rate].get
4422
+ if args[:kitchen_fans_flow_rate].get != Constants.Auto
4423
+ rated_flow_rate = args[:kitchen_fans_flow_rate].get.to_f
4424
+ end
4663
4425
  end
4664
4426
 
4665
4427
  if args[:kitchen_fans_power].is_initialized
4666
- fan_power = args[:kitchen_fans_power].get
4428
+ if args[:kitchen_fans_power].get != Constants.Auto
4429
+ fan_power = args[:kitchen_fans_power].get.to_f
4430
+ end
4667
4431
  end
4668
4432
 
4669
4433
  if args[:kitchen_fans_hours_in_operation].is_initialized
4670
- hours_in_operation = args[:kitchen_fans_hours_in_operation].get
4434
+ if args[:kitchen_fans_hours_in_operation].get != Constants.Auto
4435
+ hours_in_operation = args[:kitchen_fans_hours_in_operation].get.to_f
4436
+ end
4671
4437
  end
4672
4438
 
4673
4439
  if args[:kitchen_fans_start_hour].is_initialized
4674
- start_hour = args[:kitchen_fans_start_hour].get
4440
+ if args[:kitchen_fans_start_hour].get != Constants.Auto
4441
+ start_hour = args[:kitchen_fans_start_hour].get.to_i
4442
+ end
4675
4443
  end
4676
4444
 
4677
- if args[:kitchen_fans_quantity].is_initialized
4678
- quantity = args[:kitchen_fans_quantity].get
4445
+ if args[:kitchen_fans_quantity] != Constants.Auto
4446
+ quantity = args[:kitchen_fans_quantity].to_i
4679
4447
  end
4680
4448
 
4681
4449
  hpxml.ventilation_fans.add(id: 'KitchenRangeFan',
@@ -4688,25 +4456,33 @@ class HPXMLFile
4688
4456
  quantity: quantity)
4689
4457
  end
4690
4458
 
4691
- if args[:bathroom_fans_present]
4459
+ if (args[:bathroom_fans_quantity] == Constants.Auto) || (args[:bathroom_fans_quantity].to_i > 0)
4692
4460
  if args[:bathroom_fans_flow_rate].is_initialized
4693
- rated_flow_rate = args[:bathroom_fans_flow_rate].get
4461
+ if args[:bathroom_fans_flow_rate].get != Constants.Auto
4462
+ rated_flow_rate = args[:bathroom_fans_flow_rate].get.to_f
4463
+ end
4694
4464
  end
4695
4465
 
4696
4466
  if args[:bathroom_fans_power].is_initialized
4697
- fan_power = args[:bathroom_fans_power].get
4467
+ if args[:bathroom_fans_power].get != Constants.Auto
4468
+ fan_power = args[:bathroom_fans_power].get.to_f
4469
+ end
4698
4470
  end
4699
4471
 
4700
4472
  if args[:bathroom_fans_hours_in_operation].is_initialized
4701
- hours_in_operation = args[:bathroom_fans_hours_in_operation].get
4473
+ if args[:bathroom_fans_hours_in_operation].get != Constants.Auto
4474
+ hours_in_operation = args[:bathroom_fans_hours_in_operation].get.to_f
4475
+ end
4702
4476
  end
4703
4477
 
4704
4478
  if args[:bathroom_fans_start_hour].is_initialized
4705
- start_hour = args[:bathroom_fans_start_hour].get
4479
+ if args[:bathroom_fans_start_hour].get != Constants.Auto
4480
+ start_hour = args[:bathroom_fans_start_hour].get.to_i
4481
+ end
4706
4482
  end
4707
4483
 
4708
- if args[:bathroom_fans_quantity].is_initialized
4709
- quantity = args[:bathroom_fans_quantity].get
4484
+ if args[:bathroom_fans_quantity] != Constants.Auto
4485
+ quantity = args[:bathroom_fans_quantity].to_i
4710
4486
  end
4711
4487
 
4712
4488
  hpxml.ventilation_fans.add(id: 'BathFans',
@@ -4749,19 +4525,18 @@ class HPXMLFile
4749
4525
  tank_volume = args[:water_heater_tank_volume]
4750
4526
  end
4751
4527
 
4752
- if args[:water_heater_heating_capacity] != Constants.Auto
4753
- heating_capacity = args[:water_heater_heating_capacity]
4754
- end
4755
-
4756
4528
  if args[:water_heater_setpoint_temperature] != Constants.Auto
4757
4529
  temperature = args[:water_heater_setpoint_temperature]
4758
4530
  end
4759
4531
 
4760
4532
  if not [HPXML::WaterHeaterTypeCombiStorage, HPXML::WaterHeaterTypeCombiTankless].include? water_heater_type
4761
4533
  if args[:water_heater_efficiency_type] == 'EnergyFactor'
4762
- energy_factor = args[:water_heater_efficiency_ef]
4534
+ energy_factor = args[:water_heater_efficiency]
4763
4535
  elsif args[:water_heater_efficiency_type] == 'UniformEnergyFactor'
4764
- uniform_energy_factor = args[:water_heater_efficiency_uef]
4536
+ uniform_energy_factor = args[:water_heater_efficiency]
4537
+ if water_heater_type != HPXML::WaterHeaterTypeTankless
4538
+ first_hour_rating = args[:water_heater_first_hour_rating]
4539
+ end
4765
4540
  end
4766
4541
  end
4767
4542
 
@@ -4771,6 +4546,10 @@ class HPXMLFile
4771
4546
  end
4772
4547
  end
4773
4548
 
4549
+ if [HPXML::WaterHeaterTypeTankless, HPXML::WaterHeaterTypeCombiTankless].include? water_heater_type
4550
+ tank_volume = nil
4551
+ end
4552
+
4774
4553
  if [HPXML::WaterHeaterTypeTankless].include? water_heater_type
4775
4554
  heating_capacity = nil
4776
4555
  recovery_efficiency = nil
@@ -4802,27 +4581,20 @@ class HPXMLFile
4802
4581
  end
4803
4582
  end
4804
4583
 
4805
- if [HPXML::WaterHeaterTypeTankless].include? water_heater_type
4806
- if args[:water_heater_performance_adjustment].is_initialized
4807
- performance_adjustment = args[:water_heater_performance_adjustment].get
4808
- end
4809
- end
4810
-
4811
- if args[:water_heater_is_shared_system]
4812
- is_shared_system = args[:water_heater_is_shared_system]
4813
- number_of_units_served = args[:geometry_building_num_units].get
4584
+ if args[:water_heater_num_units_served] > 1
4585
+ is_shared_system = true
4586
+ number_of_units_served = args[:water_heater_num_units_served]
4814
4587
  end
4815
4588
 
4816
4589
  hpxml.water_heating_systems.add(id: 'WaterHeater',
4817
4590
  water_heater_type: water_heater_type,
4818
4591
  fuel_type: fuel_type,
4819
4592
  location: location,
4820
- performance_adjustment: performance_adjustment,
4821
4593
  tank_volume: tank_volume,
4822
4594
  fraction_dhw_load_served: 1.0,
4823
- heating_capacity: heating_capacity,
4824
4595
  energy_factor: energy_factor,
4825
4596
  uniform_energy_factor: uniform_energy_factor,
4597
+ first_hour_rating: first_hour_rating,
4826
4598
  recovery_efficiency: recovery_efficiency,
4827
4599
  related_hvac_idref: related_hvac_idref,
4828
4600
  standby_loss: standby_loss,
@@ -4861,6 +4633,10 @@ class HPXMLFile
4861
4633
  end
4862
4634
  end
4863
4635
 
4636
+ if args[:dhw_distribution_pipe_r] != Constants.Auto
4637
+ pipe_r_value = args[:dhw_distribution_pipe_r]
4638
+ end
4639
+
4864
4640
  hpxml.hot_water_distributions.add(id: 'HotWaterDistribution',
4865
4641
  system_type: args[:dhw_distribution_system_type],
4866
4642
  standard_piping_length: standard_piping_length,
@@ -4868,7 +4644,7 @@ class HPXMLFile
4868
4644
  recirculation_piping_length: recirculation_piping_length,
4869
4645
  recirculation_branch_piping_length: recirculation_branch_piping_length,
4870
4646
  recirculation_pump_power: recirculation_pump_power,
4871
- pipe_r_value: args[:dhw_distribution_pipe_r],
4647
+ pipe_r_value: pipe_r_value,
4872
4648
  dwhr_facilities_connected: dwhr_facilities_connected,
4873
4649
  dwhr_equal_flow: dwhr_equal_flow,
4874
4650
  dwhr_efficiency: dwhr_efficiency)
@@ -4912,7 +4688,7 @@ class HPXMLFile
4912
4688
  collector_loop_type = args[:solar_thermal_collector_loop_type]
4913
4689
  collector_type = args[:solar_thermal_collector_type]
4914
4690
  collector_azimuth = args[:solar_thermal_collector_azimuth]
4915
- collector_tilt = get_absolute_tilt(args[:solar_thermal_collector_tilt], hpxml.roofs[-1].pitch, epw_file)
4691
+ collector_tilt = get_absolute_tilt(args[:solar_thermal_collector_tilt], args[:geometry_roof_pitch], epw_file)
4916
4692
  collector_frta = args[:solar_thermal_collector_rated_optical_efficiency]
4917
4693
  collector_frul = args[:solar_thermal_collector_rated_thermal_losses]
4918
4694
 
@@ -4940,8 +4716,20 @@ class HPXMLFile
4940
4716
  end
4941
4717
 
4942
4718
  def self.set_pv_systems(hpxml, runner, args, epw_file)
4943
- [args[:pv_system_module_type_1], args[:pv_system_module_type_2]].each_with_index do |module_type, i|
4944
- next if module_type == 'none'
4719
+ [args[:pv_system_module_type_1], args[:pv_system_module_type_2]].each_with_index do |pv_system_module_type, i|
4720
+ next if pv_system_module_type == 'none'
4721
+
4722
+ if [args[:pv_system_module_type_1], args[:pv_system_module_type_2]][i] != Constants.Auto
4723
+ module_type = [args[:pv_system_module_type_1], args[:pv_system_module_type_2]][i]
4724
+ end
4725
+
4726
+ if [args[:pv_system_location_1], args[:pv_system_location_2]][i] != Constants.Auto
4727
+ location = [args[:pv_system_location_1], args[:pv_system_location_2]][i]
4728
+ end
4729
+
4730
+ if [args[:pv_system_tracking_1], args[:pv_system_tracking_2]][i] != Constants.Auto
4731
+ tracking = [args[:pv_system_tracking_1], args[:pv_system_tracking_2]][i]
4732
+ end
4945
4733
 
4946
4734
  max_power_output = [args[:pv_system_max_power_output_1], args[:pv_system_max_power_output_2]][i]
4947
4735
 
@@ -4953,17 +4741,18 @@ class HPXMLFile
4953
4741
  system_losses_fraction = [args[:pv_system_system_losses_fraction_1], args[:pv_system_system_losses_fraction_2]][i].get
4954
4742
  end
4955
4743
 
4956
- if [args[:pv_system_is_shared_1], args[:pv_system_is_shared_2]][i]
4957
- is_shared_system = [args[:pv_system_is_shared_1], args[:pv_system_is_shared_2]][i]
4958
- number_of_bedrooms_served = args[:geometry_building_num_bedrooms].get
4744
+ num_units_served = [args[:pv_system_num_units_served_1], args[:pv_system_num_units_served_2]][i]
4745
+ if num_units_served > 1
4746
+ is_shared_system = true
4747
+ number_of_bedrooms_served = (args[:geometry_building_num_bedrooms].get * num_units_served / args[:geometry_building_num_units].get).to_i
4959
4748
  end
4960
4749
 
4961
4750
  hpxml.pv_systems.add(id: "PVSystem#{i + 1}",
4962
- location: [args[:pv_system_location_1], args[:pv_system_location_2]][i],
4751
+ location: location,
4963
4752
  module_type: module_type,
4964
- tracking: [args[:pv_system_tracking_1], args[:pv_system_tracking_2]][i],
4753
+ tracking: tracking,
4965
4754
  array_azimuth: [args[:pv_system_array_azimuth_1], args[:pv_system_array_azimuth_2]][i],
4966
- array_tilt: get_absolute_tilt([args[:pv_system_array_tilt_1], args[:pv_system_array_tilt_2]][i], hpxml.roofs[-1].pitch, epw_file),
4755
+ array_tilt: get_absolute_tilt([args[:pv_system_array_tilt_1], args[:pv_system_array_tilt_2]][i], args[:geometry_roof_pitch], epw_file),
4967
4756
  max_power_output: max_power_output,
4968
4757
  inverter_efficiency: inverter_efficiency,
4969
4758
  system_losses_fraction: system_losses_fraction,
@@ -5035,7 +4824,7 @@ class HPXMLFile
5035
4824
  end
5036
4825
 
5037
4826
  if args[:holiday_lighting_period_begin_day_of_month] != Constants.Auto
5038
- hpxml.lighting.holiday_period_begin_day_of_month = args[:holiday_lighting_period_begin_day_of_month]
4827
+ hpxml.lighting.holiday_period_begin_day = args[:holiday_lighting_period_begin_day_of_month]
5039
4828
  end
5040
4829
 
5041
4830
  if args[:holiday_lighting_period_end_month] != Constants.Auto
@@ -5043,49 +4832,50 @@ class HPXMLFile
5043
4832
  end
5044
4833
 
5045
4834
  if args[:holiday_lighting_period_end_day_of_month] != Constants.Auto
5046
- hpxml.lighting.holiday_period_end_day_of_month = args[:holiday_lighting_period_end_day_of_month]
4835
+ hpxml.lighting.holiday_period_end_day = args[:holiday_lighting_period_end_day_of_month]
5047
4836
  end
5048
4837
  end
5049
4838
 
5050
4839
  def self.set_dehumidifier(hpxml, runner, args)
5051
- return unless args[:dehumidifier_present]
4840
+ return if args[:dehumidifier_type] == 'none'
5052
4841
 
5053
4842
  if args[:dehumidifier_efficiency_type] == 'EnergyFactor'
5054
- energy_factor = args[:dehumidifier_efficiency_ef]
4843
+ energy_factor = args[:dehumidifier_efficiency]
5055
4844
  elsif args[:dehumidifier_efficiency_type] == 'IntegratedEnergyFactor'
5056
- integrated_energy_factor = args[:dehumidifier_efficiency_ief]
4845
+ integrated_energy_factor = args[:dehumidifier_efficiency]
5057
4846
  end
5058
4847
 
5059
4848
  hpxml.dehumidifiers.add(id: 'Dehumidifier',
4849
+ type: args[:dehumidifier_type],
5060
4850
  capacity: args[:dehumidifier_capacity],
5061
4851
  energy_factor: energy_factor,
5062
4852
  integrated_energy_factor: integrated_energy_factor,
5063
4853
  rh_setpoint: args[:dehumidifier_rh_setpoint],
5064
- fraction_served: args[:dehumidifier_fraction_dehumidification_load_served])
4854
+ fraction_served: args[:dehumidifier_fraction_dehumidification_load_served],
4855
+ location: HPXML::LocationLivingSpace)
5065
4856
  end
5066
4857
 
5067
4858
  def self.set_clothes_washer(hpxml, runner, args)
5068
4859
  if args[:water_heater_type] == 'none'
5069
- args[:clothes_washer_present] = false
4860
+ args[:clothes_washer_location] = 'none'
5070
4861
  end
5071
4862
 
5072
- return unless args[:clothes_washer_present]
4863
+ return if args[:clothes_washer_location] == 'none'
5073
4864
 
5074
4865
  if args[:clothes_washer_rated_annual_kwh] != Constants.Auto
5075
4866
  rated_annual_kwh = args[:clothes_washer_rated_annual_kwh]
4867
+ return if Float(rated_annual_kwh) == 0
5076
4868
  end
5077
4869
 
5078
4870
  if args[:clothes_washer_location] != Constants.Auto
5079
4871
  location = args[:clothes_washer_location]
5080
4872
  end
5081
4873
 
5082
- if args[:clothes_washer_efficiency_type] == 'ModifiedEnergyFactor'
5083
- if args[:clothes_washer_efficiency_mef] != Constants.Auto
5084
- modified_energy_factor = args[:clothes_washer_efficiency_mef]
5085
- end
5086
- elsif args[:clothes_washer_efficiency_type] == 'IntegratedModifiedEnergyFactor'
5087
- if args[:clothes_washer_efficiency_imef] != Constants.Auto
5088
- integrated_modified_energy_factor = args[:clothes_washer_efficiency_imef]
4874
+ if args[:clothes_washer_efficiency] != Constants.Auto
4875
+ if args[:clothes_washer_efficiency_type] == 'ModifiedEnergyFactor'
4876
+ modified_energy_factor = args[:clothes_washer_efficiency].to_f
4877
+ elsif args[:clothes_washer_efficiency_type] == 'IntegratedModifiedEnergyFactor'
4878
+ integrated_modified_energy_factor = args[:clothes_washer_efficiency].to_f
5089
4879
  end
5090
4880
  end
5091
4881
 
@@ -5127,14 +4917,14 @@ class HPXMLFile
5127
4917
  end
5128
4918
 
5129
4919
  def self.set_clothes_dryer(hpxml, runner, args)
5130
- return unless args[:clothes_washer_present]
5131
- return unless args[:clothes_dryer_present]
5132
-
5133
- if args[:clothes_dryer_efficiency_type] == 'EnergyFactor'
5134
- energy_factor = args[:clothes_dryer_efficiency_ef]
5135
- elsif args[:clothes_dryer_efficiency_type] == 'CombinedEnergyFactor'
5136
- if args[:clothes_dryer_efficiency_cef] != Constants.Auto
5137
- combined_energy_factor = args[:clothes_dryer_efficiency_cef]
4920
+ return if args[:clothes_washer_location] == 'none'
4921
+ return if args[:clothes_dryer_location] == 'none'
4922
+
4923
+ if args[:clothes_dryer_efficiency] != Constants.Auto
4924
+ if args[:clothes_dryer_efficiency_type] == 'EnergyFactor'
4925
+ energy_factor = args[:clothes_dryer_efficiency].to_f
4926
+ elsif args[:clothes_dryer_efficiency_type] == 'CombinedEnergyFactor'
4927
+ combined_energy_factor = args[:clothes_dryer_efficiency].to_f
5138
4928
  end
5139
4929
  end
5140
4930
 
@@ -5142,10 +4932,6 @@ class HPXMLFile
5142
4932
  location = args[:clothes_dryer_location]
5143
4933
  end
5144
4934
 
5145
- if args[:clothes_dryer_control_type] != Constants.Auto
5146
- control_type = args[:clothes_dryer_control_type]
5147
- end
5148
-
5149
4935
  if args[:clothes_dryer_vented_flow_rate] != Constants.Auto
5150
4936
  is_vented = false
5151
4937
  if Float(args[:clothes_dryer_vented_flow_rate]) > 0
@@ -5163,25 +4949,25 @@ class HPXMLFile
5163
4949
  fuel_type: args[:clothes_dryer_fuel_type],
5164
4950
  energy_factor: energy_factor,
5165
4951
  combined_energy_factor: combined_energy_factor,
5166
- control_type: control_type,
5167
4952
  is_vented: is_vented,
5168
4953
  vented_flow_rate: vented_flow_rate,
5169
4954
  usage_multiplier: usage_multiplier)
5170
4955
  end
5171
4956
 
5172
4957
  def self.set_dishwasher(hpxml, runner, args)
5173
- return unless args[:dishwasher_present]
4958
+ return if args[:dishwasher_location] == 'none'
5174
4959
 
5175
4960
  if args[:dishwasher_location] != Constants.Auto
5176
4961
  location = args[:dishwasher_location]
5177
4962
  end
5178
4963
 
5179
4964
  if args[:dishwasher_efficiency_type] == 'RatedAnnualkWh'
5180
- if args[:dishwasher_efficiency_kwh] != Constants.Auto
5181
- rated_annual_kwh = args[:dishwasher_efficiency_kwh]
4965
+ if args[:dishwasher_efficiency] != Constants.Auto
4966
+ rated_annual_kwh = args[:dishwasher_efficiency]
4967
+ return if Float(rated_annual_kwh) == 0
5182
4968
  end
5183
4969
  elsif args[:dishwasher_efficiency_type] == 'EnergyFactor'
5184
- energy_factor = args[:dishwasher_efficiency_ef]
4970
+ energy_factor = args[:dishwasher_efficiency]
5185
4971
  end
5186
4972
 
5187
4973
  if args[:dishwasher_label_electric_rate] != Constants.Auto
@@ -5221,10 +5007,11 @@ class HPXMLFile
5221
5007
  end
5222
5008
 
5223
5009
  def self.set_refrigerator(hpxml, runner, args)
5224
- return unless args[:refrigerator_present]
5010
+ return if args[:refrigerator_location] == 'none'
5225
5011
 
5226
5012
  if args[:refrigerator_rated_annual_kwh] != Constants.Auto
5227
- refrigerator_rated_annual_kwh = args[:refrigerator_rated_annual_kwh]
5013
+ rated_annual_kwh = args[:refrigerator_rated_annual_kwh]
5014
+ return if Float(rated_annual_kwh) == 0
5228
5015
  end
5229
5016
 
5230
5017
  if args[:refrigerator_location] != Constants.Auto
@@ -5235,22 +5022,23 @@ class HPXMLFile
5235
5022
  usage_multiplier = args[:refrigerator_usage_multiplier]
5236
5023
  end
5237
5024
 
5238
- if args[:extra_refrigerator_present]
5025
+ if args[:extra_refrigerator_location] != 'none'
5239
5026
  primary_indicator = true
5240
5027
  end
5241
5028
 
5242
5029
  hpxml.refrigerators.add(id: 'Refrigerator',
5243
5030
  location: location,
5244
- rated_annual_kwh: refrigerator_rated_annual_kwh,
5031
+ rated_annual_kwh: rated_annual_kwh,
5245
5032
  primary_indicator: primary_indicator,
5246
5033
  usage_multiplier: usage_multiplier)
5247
5034
  end
5248
5035
 
5249
5036
  def self.set_extra_refrigerator(hpxml, runner, args)
5250
- return unless args[:extra_refrigerator_present]
5037
+ return if args[:extra_refrigerator_location] == 'none'
5251
5038
 
5252
5039
  if args[:extra_refrigerator_rated_annual_kwh] != Constants.Auto
5253
5040
  rated_annual_kwh = args[:extra_refrigerator_rated_annual_kwh]
5041
+ return if Float(rated_annual_kwh) == 0
5254
5042
  end
5255
5043
 
5256
5044
  if args[:extra_refrigerator_location] != Constants.Auto
@@ -5269,10 +5057,11 @@ class HPXMLFile
5269
5057
  end
5270
5058
 
5271
5059
  def self.set_freezer(hpxml, runner, args)
5272
- return unless args[:freezer_present]
5060
+ return if args[:freezer_location] == 'none'
5273
5061
 
5274
5062
  if args[:freezer_rated_annual_kwh] != Constants.Auto
5275
5063
  rated_annual_kwh = args[:freezer_rated_annual_kwh]
5064
+ return if Float(rated_annual_kwh) == 0
5276
5065
  end
5277
5066
 
5278
5067
  if args[:freezer_location] != Constants.Auto
@@ -5290,7 +5079,7 @@ class HPXMLFile
5290
5079
  end
5291
5080
 
5292
5081
  def self.set_cooking_range_oven(hpxml, runner, args)
5293
- return unless args[:cooking_range_oven_present]
5082
+ return if args[:cooking_range_oven_location] == 'none'
5294
5083
 
5295
5084
  if args[:cooking_range_oven_location] != Constants.Auto
5296
5085
  location = args[:cooking_range_oven_location]
@@ -5339,8 +5128,9 @@ class HPXMLFile
5339
5128
  kWh_per_year = args[:plug_loads_television_annual_kwh]
5340
5129
  end
5341
5130
 
5342
- if args[:plug_loads_television_usage_multiplier] != 1.0
5343
- usage_multiplier = args[:plug_loads_television_usage_multiplier]
5131
+ usage_multiplier = args[:plug_loads_television_usage_multiplier]
5132
+ if usage_multiplier == 1.0
5133
+ usage_multiplier = nil
5344
5134
  end
5345
5135
 
5346
5136
  hpxml.plug_loads.add(id: 'PlugLoadsTelevision',
@@ -5362,8 +5152,9 @@ class HPXMLFile
5362
5152
  frac_latent = args[:plug_loads_other_frac_latent]
5363
5153
  end
5364
5154
 
5365
- if args[:plug_loads_other_usage_multiplier] != 1.0
5366
- usage_multiplier = args[:plug_loads_other_usage_multiplier]
5155
+ usage_multiplier = args[:plug_loads_other_usage_multiplier]
5156
+ if usage_multiplier == 1.0
5157
+ usage_multiplier = nil
5367
5158
  end
5368
5159
 
5369
5160
  hpxml.plug_loads.add(id: 'PlugLoadsOther',
@@ -5381,30 +5172,15 @@ class HPXMLFile
5381
5172
  kWh_per_year = args[:plug_loads_well_pump_annual_kwh]
5382
5173
  end
5383
5174
 
5384
- if args[:plug_loads_well_pump_usage_multiplier] != 1.0
5385
- usage_multiplier = args[:plug_loads_well_pump_usage_multiplier]
5386
- end
5387
-
5388
- if args[:plug_loads_well_pump_weekday_fractions] != Constants.Auto
5389
- weekday_fractions = args[:plug_loads_well_pump_weekday_fractions]
5390
- end
5391
-
5392
- if args[:plug_loads_well_pump_weekend_fractions] != Constants.Auto
5393
- weekend_fractions = args[:plug_loads_well_pump_weekend_fractions]
5394
- end
5395
-
5396
- if args[:plug_loads_well_pump_monthly_multipliers] != Constants.Auto
5397
- monthly_multipliers = args[:plug_loads_well_pump_monthly_multipliers]
5175
+ usage_multiplier = args[:plug_loads_well_pump_usage_multiplier]
5176
+ if usage_multiplier == 1.0
5177
+ usage_multiplier = nil
5398
5178
  end
5399
5179
 
5400
5180
  hpxml.plug_loads.add(id: 'PlugLoadsWellPump',
5401
5181
  plug_load_type: HPXML::PlugLoadTypeWellPump,
5402
5182
  kWh_per_year: kWh_per_year,
5403
- usage_multiplier: usage_multiplier,
5404
- weekday_fractions: weekday_fractions,
5405
- weekend_fractions: weekend_fractions,
5406
- monthly_multipliers: monthly_multipliers,
5407
- location: HPXML::LocationExterior)
5183
+ usage_multiplier: usage_multiplier)
5408
5184
  end
5409
5185
 
5410
5186
  def self.set_plug_loads_vehicle(hpxml, runner, args)
@@ -5414,30 +5190,15 @@ class HPXMLFile
5414
5190
  kWh_per_year = args[:plug_loads_vehicle_annual_kwh]
5415
5191
  end
5416
5192
 
5417
- if args[:plug_loads_vehicle_usage_multiplier] != 1.0
5418
- usage_multiplier = args[:plug_loads_vehicle_usage_multiplier]
5419
- end
5420
-
5421
- if args[:plug_loads_vehicle_weekday_fractions] != Constants.Auto
5422
- weekday_fractions = args[:plug_loads_vehicle_weekday_fractions]
5423
- end
5424
-
5425
- if args[:plug_loads_vehicle_weekend_fractions] != Constants.Auto
5426
- weekend_fractions = args[:plug_loads_vehicle_weekend_fractions]
5427
- end
5428
-
5429
- if args[:plug_loads_vehicle_monthly_multipliers] != Constants.Auto
5430
- monthly_multipliers = args[:plug_loads_vehicle_monthly_multipliers]
5193
+ usage_multiplier = args[:plug_loads_vehicle_usage_multiplier]
5194
+ if usage_multiplier == 1.0
5195
+ usage_multiplier = nil
5431
5196
  end
5432
5197
 
5433
5198
  hpxml.plug_loads.add(id: 'PlugLoadsVehicle',
5434
5199
  plug_load_type: HPXML::PlugLoadTypeElectricVehicleCharging,
5435
5200
  kWh_per_year: kWh_per_year,
5436
- usage_multiplier: usage_multiplier,
5437
- weekday_fractions: weekday_fractions,
5438
- weekend_fractions: weekend_fractions,
5439
- monthly_multipliers: monthly_multipliers,
5440
- location: HPXML::LocationExterior)
5201
+ usage_multiplier: usage_multiplier)
5441
5202
  end
5442
5203
 
5443
5204
  def self.set_fuel_loads_grill(hpxml, runner, args)
@@ -5446,10 +5207,6 @@ class HPXMLFile
5446
5207
  therm_per_year = args[:fuel_loads_grill_annual_therm]
5447
5208
  end
5448
5209
 
5449
- if args[:fuel_loads_grill_location] != Constants.Auto
5450
- location = args[:fuel_loads_grill_location]
5451
- end
5452
-
5453
5210
  if args[:fuel_loads_grill_usage_multiplier] != 1.0
5454
5211
  usage_multiplier = args[:fuel_loads_grill_usage_multiplier]
5455
5212
  end
@@ -5457,7 +5214,6 @@ class HPXMLFile
5457
5214
  hpxml.fuel_loads.add(id: 'FuelLoadsGrill',
5458
5215
  fuel_load_type: HPXML::FuelLoadTypeGrill,
5459
5216
  fuel_type: args[:fuel_loads_grill_fuel_type],
5460
- location: location,
5461
5217
  therm_per_year: therm_per_year,
5462
5218
  usage_multiplier: usage_multiplier)
5463
5219
  end
@@ -5469,10 +5225,6 @@ class HPXMLFile
5469
5225
  therm_per_year = args[:fuel_loads_lighting_annual_therm]
5470
5226
  end
5471
5227
 
5472
- if args[:fuel_loads_lighting_location] != Constants.Auto
5473
- location = args[:fuel_loads_lighting_location]
5474
- end
5475
-
5476
5228
  if args[:fuel_loads_lighting_usage_multiplier] != 1.0
5477
5229
  usage_multiplier = args[:fuel_loads_lighting_usage_multiplier]
5478
5230
  end
@@ -5480,7 +5232,6 @@ class HPXMLFile
5480
5232
  hpxml.fuel_loads.add(id: 'FuelLoadsLighting',
5481
5233
  fuel_load_type: HPXML::FuelLoadTypeLighting,
5482
5234
  fuel_type: args[:fuel_loads_lighting_fuel_type],
5483
- location: location,
5484
5235
  therm_per_year: therm_per_year,
5485
5236
  usage_multiplier: usage_multiplier)
5486
5237
  end
@@ -5492,8 +5243,12 @@ class HPXMLFile
5492
5243
  therm_per_year = args[:fuel_loads_fireplace_annual_therm]
5493
5244
  end
5494
5245
 
5495
- if args[:fuel_loads_fireplace_location] != Constants.Auto
5496
- location = args[:fuel_loads_fireplace_location]
5246
+ if args[:fuel_loads_fireplace_frac_sensible] != Constants.Auto
5247
+ frac_sensible = args[:fuel_loads_fireplace_frac_sensible]
5248
+ end
5249
+
5250
+ if args[:fuel_loads_fireplace_frac_latent] != Constants.Auto
5251
+ frac_latent = args[:fuel_loads_fireplace_frac_latent]
5497
5252
  end
5498
5253
 
5499
5254
  if args[:fuel_loads_fireplace_usage_multiplier] != 1.0
@@ -5503,8 +5258,9 @@ class HPXMLFile
5503
5258
  hpxml.fuel_loads.add(id: 'FuelLoadsFireplace',
5504
5259
  fuel_load_type: HPXML::FuelLoadTypeFireplace,
5505
5260
  fuel_type: args[:fuel_loads_fireplace_fuel_type],
5506
- location: location,
5507
5261
  therm_per_year: therm_per_year,
5262
+ frac_sensible: frac_sensible,
5263
+ frac_latent: frac_latent,
5508
5264
  usage_multiplier: usage_multiplier)
5509
5265
  end
5510
5266
  end
@@ -5520,18 +5276,20 @@ class HPXMLFile
5520
5276
  pump_usage_multiplier = args[:pool_pump_usage_multiplier]
5521
5277
  end
5522
5278
 
5523
- if args[:pool_heater_type] != 'none'
5524
- heater_type = args[:pool_heater_type]
5525
- end
5279
+ pool_heater_type = args[:pool_heater_type]
5526
5280
 
5527
- if args[:pool_heater_annual_kwh] != Constants.Auto
5528
- heater_load_units = 'kWh/year'
5529
- heater_load_value = args[:pool_heater_annual_kwh]
5281
+ if [HPXML::HeaterTypeElectricResistance, HPXML::HeaterTypeHeatPump].include?(pool_heater_type)
5282
+ if args[:pool_heater_annual_kwh] != Constants.Auto
5283
+ heater_load_units = 'kWh/year'
5284
+ heater_load_value = args[:pool_heater_annual_kwh]
5285
+ end
5530
5286
  end
5531
5287
 
5532
- if args[:pool_heater_annual_therm] != Constants.Auto
5533
- heater_load_units = 'therm/year'
5534
- heater_load_value = args[:pool_heater_annual_therm]
5288
+ if [HPXML::HeaterTypeGas].include?(pool_heater_type)
5289
+ if args[:pool_heater_annual_therm] != Constants.Auto
5290
+ heater_load_units = 'therm/year'
5291
+ heater_load_value = args[:pool_heater_annual_therm]
5292
+ end
5535
5293
  end
5536
5294
 
5537
5295
  if args[:pool_heater_usage_multiplier] != 1.0
@@ -5539,9 +5297,11 @@ class HPXMLFile
5539
5297
  end
5540
5298
 
5541
5299
  hpxml.pools.add(id: 'Pool',
5300
+ type: HPXML::TypeUnknown,
5301
+ pump_type: HPXML::TypeUnknown,
5542
5302
  pump_kwh_per_year: pump_kwh_per_year,
5543
5303
  pump_usage_multiplier: pump_usage_multiplier,
5544
- heater_type: heater_type,
5304
+ heater_type: pool_heater_type,
5545
5305
  heater_load_units: heater_load_units,
5546
5306
  heater_load_value: heater_load_value,
5547
5307
  heater_usage_multiplier: heater_usage_multiplier)
@@ -5558,18 +5318,20 @@ class HPXMLFile
5558
5318
  pump_usage_multiplier = args[:hot_tub_pump_usage_multiplier]
5559
5319
  end
5560
5320
 
5561
- if args[:hot_tub_heater_type] != 'none'
5562
- heater_type = args[:hot_tub_heater_type]
5563
- end
5321
+ hot_tub_heater_type = args[:hot_tub_heater_type]
5564
5322
 
5565
- if args[:hot_tub_heater_annual_kwh] != Constants.Auto
5566
- heater_load_units = 'kWh/year'
5567
- heater_load_value = args[:hot_tub_heater_annual_kwh]
5323
+ if [HPXML::HeaterTypeElectricResistance, HPXML::HeaterTypeHeatPump].include?(hot_tub_heater_type)
5324
+ if args[:hot_tub_heater_annual_kwh] != Constants.Auto
5325
+ heater_load_units = 'kWh/year'
5326
+ heater_load_value = args[:hot_tub_heater_annual_kwh]
5327
+ end
5568
5328
  end
5569
5329
 
5570
- if args[:hot_tub_heater_annual_therm] != Constants.Auto
5571
- heater_load_units = 'therm/year'
5572
- heater_load_value = args[:hot_tub_heater_annual_therm]
5330
+ if [HPXML::HeaterTypeGas].include?(hot_tub_heater_type)
5331
+ if args[:hot_tub_heater_annual_therm] != Constants.Auto
5332
+ heater_load_units = 'therm/year'
5333
+ heater_load_value = args[:hot_tub_heater_annual_therm]
5334
+ end
5573
5335
  end
5574
5336
 
5575
5337
  if args[:hot_tub_heater_usage_multiplier] != 1.0
@@ -5577,9 +5339,11 @@ class HPXMLFile
5577
5339
  end
5578
5340
 
5579
5341
  hpxml.hot_tubs.add(id: 'HotTub',
5342
+ type: HPXML::TypeUnknown,
5343
+ pump_type: HPXML::TypeUnknown,
5580
5344
  pump_kwh_per_year: pump_kwh_per_year,
5581
5345
  pump_usage_multiplier: pump_usage_multiplier,
5582
- heater_type: heater_type,
5346
+ heater_type: hot_tub_heater_type,
5583
5347
  heater_load_units: heater_load_units,
5584
5348
  heater_load_value: heater_load_value,
5585
5349
  heater_usage_multiplier: heater_usage_multiplier)
@@ -5597,30 +5361,25 @@ class HPXMLFile
5597
5361
  st = space.spaceType.get
5598
5362
  space_type = st.standardsSpaceType.get
5599
5363
 
5600
- if ['vented crawlspace'].include? space_type
5601
- return HPXML::LocationCrawlspaceVented
5602
- elsif ['unvented crawlspace'].include? space_type
5603
- return HPXML::LocationCrawlspaceUnvented
5604
- elsif ['garage'].include? space_type
5605
- return HPXML::LocationGarage
5606
- elsif ['living space'].include? space_type
5607
- if Geometry.space_is_below_grade(space)
5608
- return HPXML::LocationBasementConditioned
5609
- else
5610
- return HPXML::LocationLivingSpace
5611
- end
5612
- elsif ['vented attic'].include? space_type
5613
- return HPXML::LocationAtticVented
5614
- elsif ['unvented attic'].include? space_type
5615
- return HPXML::LocationAtticUnvented
5616
- elsif ['unconditioned basement'].include? space_type
5617
- return HPXML::LocationBasementUnconditioned
5618
- elsif ['corridor'].include? space_type
5619
- return HPXML::LocationOtherHousingUnit
5620
- elsif ['ambient'].include? space_type
5621
- return HPXML::LocationOutside
5364
+ return space_type
5365
+ end
5366
+
5367
+ def self.get_surface_azimuth(surface, args)
5368
+ facade = Geometry.get_facade_for_surface(surface)
5369
+ return get_azimuth_from_facade(facade, args)
5370
+ end
5371
+
5372
+ def self.get_azimuth_from_facade(facade, args)
5373
+ if facade == Constants.FacadeFront
5374
+ azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 0, args[:geometry_orientation], 0)
5375
+ elsif facade == Constants.FacadeBack
5376
+ azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 180, args[:geometry_orientation], 0)
5377
+ elsif facade == Constants.FacadeLeft
5378
+ azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 90, args[:geometry_orientation], 0)
5379
+ elsif facade == Constants.FacadeRight
5380
+ azimuth = Geometry.get_abs_azimuth(Constants.CoordRelative, 270, args[:geometry_orientation], 0)
5622
5381
  else
5623
- fail "Unhandled SpaceType value (#{space_type}) for surface '#{surface.name}'."
5382
+ fail 'Unexpected facade.'
5624
5383
  end
5625
5384
  end
5626
5385
  end