urbanopt-cli 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (712) hide show
  1. checksums.yaml +4 -4
  2. data/.github/release.yml +24 -0
  3. data/.github/workflows/nightly_ci_build.yml +39 -29
  4. data/.gitignore +1 -0
  5. data/CHANGELOG.md +17 -0
  6. data/CMakeLists.txt +7 -7
  7. data/FindOpenStudioSDK.cmake +8 -8
  8. data/LICENSE.md +8 -35
  9. data/README.md +25 -10
  10. data/example_files/Gemfile +9 -9
  11. data/example_files/example_project_combined.json +6 -2
  12. data/example_files/example_project_with_ghe.json +859 -0
  13. data/example_files/mappers/Baseline.rb +39 -415
  14. data/example_files/mappers/ChilledWaterStorage.rb +1 -1
  15. data/example_files/mappers/CreateBar.rb +1 -1
  16. data/example_files/mappers/EvCharging.rb +1 -1
  17. data/example_files/mappers/FlexibleHotWater.rb +1 -1
  18. data/example_files/mappers/Floorspace.rb +1 -1
  19. data/example_files/mappers/HighEfficiency.rb +1 -1
  20. data/example_files/mappers/HighEfficiencyCreateBar.rb +1 -1
  21. data/example_files/mappers/HighEfficiencyFloorspace.rb +1 -1
  22. data/example_files/mappers/PeakHoursMelsShedding.rb +1 -1
  23. data/example_files/mappers/PeakHoursThermostatAdjust.rb +1 -1
  24. data/example_files/mappers/ThermalStorage.rb +1 -1
  25. data/example_files/mappers/base_workflow.osw +11 -4
  26. data/example_files/mappers/residential/template/util.rb +138 -0
  27. data/example_files/mappers/residential/util.rb +276 -0
  28. data/example_files/measures/BuildResidentialModel/measure.rb +118 -230
  29. data/example_files/measures/BuildResidentialModel/measure.xml +344 -233
  30. data/example_files/measures/BuildResidentialModel/resources/geometry.rb +7 -2
  31. data/example_files/measures/BuildResidentialModel/resources/unit_conversions.rb +5 -0
  32. data/example_files/measures/BuildResidentialModel/resources/util.rb +5 -0
  33. data/example_files/measures/BuildResidentialModel/tests/test_build_residential_model.rb +344 -0
  34. data/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature1.xml +2112 -0
  35. data/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature2.xml +2112 -0
  36. data/example_files/osm_building/7.osm +0 -2
  37. data/example_files/osm_building/8.osm +0 -2
  38. data/example_files/osm_building/9.osm +0 -2
  39. data/example_files/python_deps/dependencies.json +4 -3
  40. data/example_files/resources/hpxml-measures/.gitattributes +3 -0
  41. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +2 -2
  42. data/example_files/resources/hpxml-measures/.github/workflows/add_to_project.yml +17 -0
  43. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +37 -8
  44. data/example_files/resources/hpxml-measures/.gitignore +1 -0
  45. data/example_files/resources/hpxml-measures/.readthedocs.yml +6 -2
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md +5596 -0
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md.erb +41 -0
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1324 -1035
  49. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +325 -236
  50. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +119 -152
  51. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{build_residential_hpxml_test.rb → test_build_residential_hpxml.rb} +225 -107
  52. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/README.md +96 -0
  53. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/README.md.erb +41 -0
  54. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +73 -31
  55. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +60 -40
  56. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/README.md +48 -23
  57. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/constants.rb +5 -0
  58. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +6 -12
  59. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/{build_residential_schedule_file_test.rb → test_build_residential_schedule_file.rb} +162 -35
  60. data/example_files/resources/hpxml-measures/Changelog.md +57 -1
  61. data/example_files/resources/hpxml-measures/Gemfile +1 -1
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/README.md +83 -0
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/README.md.erb +41 -0
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +1081 -878
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +258 -204
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +205 -178
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +43 -18
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +37 -112
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +34 -73
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/Xing_okstate_0664D_13659_Table_A-3.csv +4165 -0
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv +2 -2
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +5 -1
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +13 -7
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +95 -42
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +132 -108
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +1695 -1267
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +668 -589
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +304 -553
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +197 -112
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +1140 -1745
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +412 -325
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +56 -48
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +49 -38
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +5 -0
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -1
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +5 -0
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +94 -78
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +60 -2
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +6 -1
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +11 -5
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv +1 -1
  92. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-30-mins.csv +52561 -0
  93. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_2.csv +8761 -0
  94. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_3.csv +8761 -0
  95. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_4.csv +8761 -0
  96. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_5.csv +8761 -0
  97. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_6.csv +8761 -0
  98. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +129 -137
  99. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +12 -21
  100. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +5 -0
  101. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/util.rb +7 -2
  102. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +6 -1
  103. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +7 -2
  104. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +179 -144
  105. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +129 -71
  106. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +5 -0
  107. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +23 -6
  108. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +129 -118
  109. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +25 -20
  110. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +2282 -2239
  111. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +395 -204
  112. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +12 -7
  113. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +56 -51
  114. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +369 -230
  115. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +371 -191
  116. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +27 -20
  117. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +55 -5
  118. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +35 -30
  119. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +13 -8
  120. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +107 -93
  121. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +11 -6
  122. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +757 -573
  123. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +77 -72
  124. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +36 -6
  125. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +5 -0
  126. data/example_files/resources/hpxml-measures/README.md +2 -0
  127. data/example_files/resources/hpxml-measures/Rakefile +10 -3
  128. data/example_files/resources/hpxml-measures/ReportSimulationOutput/README.md +787 -0
  129. data/example_files/resources/hpxml-measures/ReportSimulationOutput/README.md.erb +41 -0
  130. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +730 -418
  131. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +1215 -9
  132. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/{output_report_test.rb → test_report_sim_output.rb} +130 -299
  133. data/example_files/resources/hpxml-measures/ReportUtilityBills/README.md +87 -0
  134. data/example_files/resources/hpxml-measures/ReportUtilityBills/README.md.erb +41 -0
  135. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +261 -89
  136. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +179 -94
  137. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/Average_retail_price_of_electricity.csv +68 -68
  138. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +3 -2
  139. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +713 -685
  140. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +716 -688
  141. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/README.md +5 -2
  142. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +18 -9
  143. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/test_report_utility_bills.rb +1308 -0
  144. data/example_files/resources/hpxml-measures/docs/requirements.txt +5 -0
  145. data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -2
  146. data/example_files/resources/hpxml-measures/docs/source/intro.rst +3 -20
  147. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +1 -1
  148. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +917 -564
  149. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +79 -42
  150. data/example_files/resources/hpxml-measures/tasks.rb +2305 -2055
  151. data/example_files/resources/hpxml-measures/workflow/hpxml_inputs.json +270 -587
  152. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +559 -557
  153. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +522 -520
  154. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +534 -532
  155. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +547 -545
  156. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +546 -544
  157. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +603 -623
  158. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +613 -633
  159. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +699 -721
  160. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +662 -661
  161. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +657 -677
  162. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +470 -467
  163. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +441 -438
  164. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +468 -465
  165. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +469 -466
  166. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +468 -465
  167. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +717 -714
  168. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +647 -645
  169. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +569 -566
  170. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +602 -599
  171. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +630 -627
  172. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +776 -774
  173. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +670 -667
  174. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +632 -629
  175. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +731 -729
  176. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +672 -669
  177. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +667 -644
  178. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +646 -644
  179. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +690 -688
  180. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +701 -699
  181. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +637 -615
  182. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +690 -688
  183. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +557 -554
  184. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +534 -531
  185. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +636 -635
  186. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +616 -613
  187. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +601 -598
  188. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +581 -578
  189. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +624 -622
  190. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +584 -582
  191. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +631 -629
  192. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +922 -921
  193. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +855 -853
  194. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +739 -737
  195. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +798 -796
  196. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +696 -694
  197. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +487 -483
  198. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +443 -440
  199. data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +688 -686
  200. data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +722 -720
  201. data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +619 -617
  202. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +13 -20
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +9 -9
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +11 -12
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +11 -12
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +12 -13
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +11 -12
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +9 -9
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +9 -9
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +4 -4
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +9 -9
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +9 -9
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +9 -9
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +11 -11
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +10 -10
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +9 -9
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +10 -11
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +9 -9
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +8 -8
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +571 -569
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +9 -9
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml → base-bldgtype-mf-unit-adjacent-to-multifamily-buffer-space.xml} +5 -5
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-multiple.xml → base-bldgtype-mf-unit-adjacent-to-multiple.xml} +17 -17
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml → base-bldgtype-mf-unit-adjacent-to-non-freezing-space.xml} +5 -5
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-other-heated-space.xml → base-bldgtype-mf-unit-adjacent-to-other-heated-space.xml} +5 -5
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml → base-bldgtype-mf-unit-adjacent-to-other-housing-unit.xml} +5 -5
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-infil-compartmentalization-test.xml → base-bldgtype-mf-unit-infil-compartmentalization-test.xml} +461 -461
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-residents-1.xml → base-bldgtype-mf-unit-residents-1.xml} +453 -453
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml → base-bldgtype-mf-unit-shared-boiler-chiller-baseboard.xml} +11 -11
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-boiler-chiller-fan-coil-ducted.xml} +11 -11
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml → base-bldgtype-mf-unit-shared-boiler-chiller-fan-coil.xml} +11 -11
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-chiller-water-loop-heat-pump.xml} +11 -11
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-cooling-tower-water-loop-heat-pump.xml} +11 -11
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-baseboard.xml → base-bldgtype-mf-unit-shared-boiler-only-baseboard.xml} +11 -11
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil-ducted.xml} +11 -11
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil-eae.xml} +11 -11
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-mf-unit-shared-boiler-only-fan-coil-fireplace-elec.xml +433 -0
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil.xml} +11 -11
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-only-water-loop-heat-pump.xml} +11 -11
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-baseboard.xml → base-bldgtype-mf-unit-shared-chiller-only-baseboard.xml} +11 -11
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-chiller-only-fan-coil-ducted.xml} +11 -11
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml → base-bldgtype-mf-unit-shared-chiller-only-fan-coil.xml} +11 -11
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-chiller-only-water-loop-heat-pump.xml} +11 -11
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-cooling-tower-only-water-loop-heat-pump.xml} +11 -11
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-generator.xml → base-bldgtype-mf-unit-shared-generator.xml} +13 -13
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml → base-bldgtype-mf-unit-shared-ground-loop-ground-to-air-heat-pump.xml} +13 -13
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml → base-bldgtype-mf-unit-shared-laundry-room-multiple-water-heaters.xml} +480 -480
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-laundry-room.xml → base-bldgtype-mf-unit-shared-laundry-room.xml} +10 -10
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent-multiple.xml → base-bldgtype-mf-unit-shared-mechvent-multiple.xml} +15 -15
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent-preconditioning.xml → base-bldgtype-mf-unit-shared-mechvent-preconditioning.xml} +13 -13
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent.xml → base-bldgtype-mf-unit-shared-mechvent.xml} +13 -13
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-pv.xml → base-bldgtype-mf-unit-shared-pv.xml} +13 -13
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-water-heater-recirc.xml → base-bldgtype-mf-unit-shared-water-heater-recirc.xml} +13 -13
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-water-heater.xml → base-bldgtype-mf-unit-shared-water-heater.xml} +13 -13
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily.xml → base-bldgtype-mf-unit.xml} +13 -13
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-2stories.xml → base-bldgtype-sfa-unit-2stories.xml} +610 -610
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-atticroof-cathedral.xml → base-bldgtype-sfa-unit-atticroof-cathedral.xml} +558 -558
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-infil-compartmentalization-test.xml → base-bldgtype-sfa-unit-infil-compartmentalization-test.xml} +610 -610
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached.xml → base-bldgtype-sfa-unit.xml} +610 -610
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +8 -8
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +9 -9
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +9 -9
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +9 -9
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +9 -9
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +9 -9
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +9 -9
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +9 -9
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +9 -9
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +507 -505
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +9 -9
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +8 -8
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +9 -9
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +9 -9
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +9 -9
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +9 -9
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +9 -9
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +9 -9
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +9 -9
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +12 -10
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +14 -14
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +5 -5
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +9 -9
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +9 -9
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +9 -9
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +9 -9
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +9 -9
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +9 -9
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +9 -9
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +9 -9
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +9 -9
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +9 -9
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +9 -9
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +9 -9
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +12 -10
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +9 -9
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +8 -8
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +9 -9
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +9 -9
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +9 -9
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +13 -11
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +9 -9
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +8 -8
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +9 -9
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +9 -9
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +9 -9
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +9 -9
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +12 -10
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +9 -9
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +9 -9
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +9 -9
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +12 -10
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +8 -8
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +9 -9
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +9 -9
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +9 -9
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +9 -9
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +9 -9
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +9 -9
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +9 -9
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +13 -14
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +11 -11
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +9 -9
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +9 -9
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +9 -9
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +9 -9
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +576 -576
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +519 -519
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +4 -5
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +9 -9
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +9 -9
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +9 -9
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ela.xml +548 -548
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +9 -9
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +9 -9
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-cfm.xml +551 -551
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +9 -9
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +9 -9
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +9 -9
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +9 -9
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +9 -9
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +9 -9
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +9 -9
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +10 -11
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +9 -9
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -19
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +555 -553
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +9 -9
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +9 -9
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading-seasons.xml +560 -558
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +9 -9
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +9 -9
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +10 -10
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +10 -11
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-belly-wing-no-skirt.xml +496 -0
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-belly-wing-skirt.xml +496 -0
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -18
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-simple-power-outage-natvent-unavailable.xml → base-foundation-conditioned-basement-slab-insulation-full.xml} +552 -564
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +9 -9
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-insulation.xml +555 -555
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +8 -8
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +5 -5
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +10 -11
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +4 -4
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +4 -4
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +4 -4
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +4 -4
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +9 -9
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace-above-grade.xml +558 -0
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +9 -9
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +15 -15
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +9 -9
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-capacity-17f.xml +552 -552
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +9 -9
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-lockout-temperatures.xml +562 -562
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +557 -557
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +9 -9
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +9 -9
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-hvac-seasons.xml +586 -586
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +9 -9
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +9 -9
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +9 -9
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml → base-hvac-air-to-air-heat-pump-var-speed-detailed-performance-other-temperatures.xml} +89 -13
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml → base-hvac-air-to-air-heat-pump-var-speed-detailed-performance.xml} +107 -13
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +9 -9
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-sizing-controls.xml +567 -565
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +9 -9
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +9 -9
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +9 -9
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +9 -9
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only-pilot.xml +512 -512
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +9 -9
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +9 -9
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +9 -9
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +9 -9
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +536 -536
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +9 -9
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +9 -9
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-central-ac-only-var-speed.xml → base-hvac-central-ac-only-var-speed-detailed-performance.xml} +49 -10
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +9 -9
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +9 -9
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +9 -9
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-lockout-temperatures.xml +559 -559
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +9 -9
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +9 -9
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +9 -9
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +9 -9
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +11 -12
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +558 -558
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-buried.xml +554 -554
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-furnace-gas-room-ac.xml → base-hvac-ducts-defaults.xml} +28 -14
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-effective-rvalue.xml +552 -552
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +9 -9
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +9 -9
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +9 -9
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +9 -9
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +9 -9
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +9 -9
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +9 -9
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +15 -10
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +9 -9
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +9 -9
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +9 -9
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +9 -9
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +9 -9
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +12 -10
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-pilot.xml +541 -541
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +9 -9
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +9 -9
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +9 -9
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +9 -9
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +9 -9
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +9 -9
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +9 -9
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +9 -9
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +9 -9
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +9 -9
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +9 -9
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-air-to-air-heat-pump-1-speed-autosized-backup.xml → base-hvac-install-quality-air-to-air-heat-pump-var-speed-detailed-performance.xml} +650 -556
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +9 -9
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +9 -9
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +9 -9
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +9 -9
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +9 -9
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +9 -9
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +9 -9
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +9 -9
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +9 -9
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml → base-hvac-mini-split-air-conditioner-only-ductless-detailed-performance.xml} +50 -49
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +9 -9
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +9 -9
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml → base-hvac-mini-split-heat-pump-ducted-detailed-performance.xml} +109 -14
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +9 -9
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +9 -9
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-baseboard.xml +524 -524
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted-backup-hardsized.xml → base-hvac-mini-split-heat-pump-ductless-backup-furnace-ducts-defaults.xml} +560 -552
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-furnace.xml +563 -563
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +9 -9
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml → base-hvac-mini-split-heat-pump-ductless-detailed-performance.xml} +108 -60
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-heating-capacity-17f.xml +505 -505
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +9 -9
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +9 -9
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +10 -11
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +9 -9
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-natural-gas.xml +504 -504
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +9 -9
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp-heating-capacity-17f.xml +512 -512
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +9 -9
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +9 -9
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +9 -9
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +12 -10
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +9 -9
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +504 -504
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +517 -517
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +9 -9
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +9 -9
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +9 -9
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +9 -9
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-fixed-heater-gas-only.xml → base-hvac-space-heater-gas-only.xml} +10 -10
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +9 -9
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +9 -9
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +9 -9
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +9 -9
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +9 -9
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +9 -9
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-kwh-per-year.xml +531 -528
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-mixed.xml +536 -536
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none-ceiling-fans.xml +515 -515
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +9 -9
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +9 -9
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +9 -9
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +9 -9
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +10 -11
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +4 -4
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +9 -9
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +10 -11
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +10 -11
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +10 -11
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +9 -9
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +9 -9
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +9 -9
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +9 -9
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +9 -9
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +9 -9
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +576 -576
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +576 -576
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +9 -9
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +9 -9
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +9 -9
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +9 -9
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +9 -9
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +9 -9
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +9 -9
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +9 -9
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +9 -9
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +9 -9
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +21 -19
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +605 -605
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +587 -587
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +9 -9
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +9 -9
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +3 -3
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +9 -9
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +587 -585
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +584 -584
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +9 -9
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +555 -555
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +26 -26
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +26 -26
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +9 -9
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading-bldgtype-multifamily.xml +508 -508
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +9 -9
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +9 -9
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-simple-power-outage-natvent-available.xml → base-misc-unit-multiplier.xml} +553 -564
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +26 -26
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-mf-units.xml +2755 -0
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-multiple-buildings.xml → base-multiple-sfd-buildings.xml} +31 -22
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +9 -9
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +4 -5
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-round-trip-efficiency.xml +597 -597
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +599 -597
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +9 -9
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +615 -613
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +612 -612
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +596 -596
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +9 -9
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0-runperiod-1-month.xml +559 -559
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0.xml +555 -555
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1-misc-loads-large-uncommon.xml +616 -616
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1-misc-loads-large-uncommon2.xml +616 -616
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1.xml +547 -547
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-5.xml +515 -515
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +14 -12
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-crankcase-heater-40w.xml → base-schedules-detailed-mixed-timesteps-power-outage.xml} +565 -555
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-detailed-occupancy-stochastic-vacancy-year-round.xml → base-schedules-detailed-mixed-timesteps.xml} +554 -563
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +12 -10
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-power-outage.xml +566 -564
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +12 -10
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +12 -10
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +12 -10
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +12 -10
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +12 -10
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage.xml +619 -619
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy.xml +618 -618
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +9 -9
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +9 -9
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +9 -9
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +9 -9
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +9 -9
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-temperature-capacitance-multiplier.xml +553 -553
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +12 -10
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +12 -10
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +9 -9
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-30-mins.xml +552 -552
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +9 -9
  575. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +2 -0
  576. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy-subset.osw +2 -0
  577. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +2 -0
  578. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +4 -1
  579. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Long_Residence.xml +385 -385
  580. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Vatilo_Residence.xml +378 -380
  581. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Victor_Residence.xml +369 -369
  582. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +7 -7
  583. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +7 -7
  584. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +7 -7
  585. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +7 -7
  586. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +7 -7
  587. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +7 -7
  588. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +7 -7
  589. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +7 -7
  590. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +7 -7
  591. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +7 -7
  592. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +7 -7
  593. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +7 -7
  594. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +7 -7
  595. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +7 -7
  596. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +7 -7
  597. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +7 -7
  598. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +7 -7
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +7 -7
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +7 -7
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +7 -7
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +7 -7
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +7 -7
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +7 -8
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +7 -8
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -6
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -6
  608. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_sizing.csv +363 -0
  609. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations1.csv +281 -0
  610. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations1_bills.csv +281 -0
  611. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations2.csv +141 -0
  612. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations2_bills.csv +141 -0
  613. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +12 -6
  614. data/example_files/resources/hpxml-measures/workflow/tests/util.rb +1141 -0
  615. data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.ddy +536 -0
  616. data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.epw +8768 -0
  617. data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.stat +554 -0
  618. data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.ddy +536 -0
  619. data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.epw +8768 -0
  620. data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.stat +553 -0
  621. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3-cache.csv +35 -0
  622. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.ddy +536 -0
  623. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.epw +8768 -0
  624. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.stat +553 -0
  625. data/example_files/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3-cache.csv +35 -0
  626. data/example_files/xml_building/17/README.md +4 -2
  627. data/example_files/xml_building/17/feature.xml +2112 -0
  628. data/lib/uo_cli/version.rb +1 -1
  629. data/lib/uo_cli.rb +110 -17
  630. data/uo_cli.gemspec +6 -8
  631. metadata +130 -177
  632. data/Jenkinsfile +0 -10
  633. data/example_files/base_workflow_res.osw +0 -276
  634. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +0 -1226
  635. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +0 -551
  636. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +0 -551
  637. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +0 -544
  638. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +0 -550
  639. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +0 -552
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +0 -552
  641. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload-miami-fl.xml +0 -552
  642. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +0 -552
  643. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +0 -552
  644. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +0 -552
  645. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +0 -552
  646. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +0 -569
  647. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +0 -599
  648. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +0 -552
  649. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +0 -506
  650. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +0 -560
  651. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +0 -507
  652. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +0 -536
  653. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +0 -536
  654. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +0 -565
  655. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +0 -553
  656. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +0 -553
  657. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +0 -553
  658. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +0 -497
  659. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +0 -544
  660. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +0 -500
  661. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +0 -536
  662. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +0 -551
  663. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +0 -551
  664. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +0 -536
  665. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +0 -546
  666. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +0 -552
  667. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +0 -554
  668. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +0 -554
  669. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +0 -554
  670. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +0 -543
  671. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +0 -549
  672. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +0 -551
  673. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +0 -551
  674. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-baseboard.xml +0 -519
  675. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +0 -522
  676. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +0 -503
  677. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +0 -496
  678. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +0 -518
  679. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +0 -518
  680. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +0 -518
  681. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +0 -496
  682. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +0 -503
  683. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +0 -518
  684. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +0 -518
  685. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +0 -518
  686. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +0 -500
  687. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +0 -500
  688. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only-pilot-light.xml +0 -506
  689. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +0 -501
  690. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +0 -556
  691. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +0 -548
  692. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy-year-round.xml +0 -619
  693. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +0 -475
  694. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +0 -475
  695. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +0 -1313
  696. data/example_files/resources/measure-info.json +0 -26
  697. data/example_files/resources/meta_measure.rb +0 -301
  698. data/example_files/xml_building/17/unit 1.xml +0 -580
  699. data/example_files/xml_building/17/unit 2.xml +0 -553
  700. data/example_files/xml_building/17/unit 3.xml +0 -553
  701. data/example_files/xml_building/17/unit 4.xml +0 -580
  702. /data/example_files/{residential → mappers/residential/template/iecc}/clothes_dryer.tsv +0 -0
  703. /data/example_files/{residential → mappers/residential/template/iecc}/clothes_washer.tsv +0 -0
  704. /data/example_files/{residential → mappers/residential/template/iecc}/cooling_system.tsv +0 -0
  705. /data/example_files/{residential → mappers/residential/template/iecc}/dishwasher.tsv +0 -0
  706. /data/example_files/{residential → mappers/residential/template/iecc}/enclosure.tsv +0 -0
  707. /data/example_files/{residential → mappers/residential/template/iecc}/heat_pump.tsv +0 -0
  708. /data/example_files/{residential → mappers/residential/template/iecc}/heating_system.tsv +0 -0
  709. /data/example_files/{residential → mappers/residential/template/iecc}/mechanical_ventilation.tsv +0 -0
  710. /data/example_files/{residential → mappers/residential/template/iecc}/refrigerator.tsv +0 -0
  711. /data/example_files/{residential → mappers/residential/template/iecc}/water_heater.tsv +0 -0
  712. /data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/{JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json → Detailed Rate.json} +0 -0
@@ -1,3 +1,8 @@
1
+ # *********************************************************************************
2
+ # URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
3
+ # See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
4
+ # *********************************************************************************
5
+
1
6
  # frozen_string_literal: true
2
7
 
3
8
  # Require all gems up front; this is much faster than multiple resource
@@ -35,6 +40,8 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
35
40
 
36
41
  # define the arguments that the user will input
37
42
  def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
43
+ docs_base_url = "https://openstudio-hpxml.readthedocs.io/en/v#{Version::OS_HPXML_Version}/workflow_inputs.html"
44
+
38
45
  args = OpenStudio::Measure::OSArgumentVector.new
39
46
 
40
47
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('hpxml_path', true)
@@ -42,6 +49,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
42
49
  arg.setDescription('Absolute/relative path of the HPXML file.')
43
50
  args << arg
44
51
 
52
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('existing_hpxml_path', false)
53
+ arg.setDisplayName('Existing HPXML File Path')
54
+ arg.setDescription('Absolute/relative path of the existing HPXML file. If not provided, a new HPXML file with one Building element is created. If provided, a new Building element will be appended to this HPXML file (e.g., to create a multifamily HPXML file describing multiple dwelling units).')
55
+ args << arg
56
+
45
57
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('software_info_program_used', false)
46
58
  arg.setDisplayName('Software Info: Program Used')
47
59
  arg.setDescription('The name of the software program used.')
@@ -80,33 +92,33 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
80
92
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('simulation_control_timestep', false)
81
93
  arg.setDisplayName('Simulation Control: Timestep')
82
94
  arg.setUnits('min')
83
- arg.setDescription('Value must be a divisor of 60. If not provided, the OS-HPXML default is used.')
95
+ arg.setDescription("Value must be a divisor of 60. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.")
84
96
  args << arg
85
97
 
86
98
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('simulation_control_run_period', false)
87
99
  arg.setDisplayName('Simulation Control: Run Period')
88
- arg.setDescription('Enter a date like "Jan 1 - Dec 31". If not provided, the OS-HPXML default is used.')
100
+ arg.setDescription("Enter a date like 'Jan 1 - Dec 31'. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.")
89
101
  args << arg
90
102
 
91
103
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('simulation_control_run_period_calendar_year', false)
92
104
  arg.setDisplayName('Simulation Control: Run Period Calendar Year')
93
105
  arg.setUnits('year')
94
- arg.setDescription('This numeric field should contain the calendar year that determines the start day of week. If you are running simulations using AMY weather files, the value entered for calendar year will not be used; it will be overridden by the actual year found in the AMY weather file. If not provided, the OS-HPXML default is used.')
106
+ arg.setDescription("This numeric field should contain the calendar year that determines the start day of week. If you are running simulations using AMY weather files, the value entered for calendar year will not be used; it will be overridden by the actual year found in the AMY weather file. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.")
95
107
  args << arg
96
108
 
97
109
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('simulation_control_daylight_saving_enabled', false)
98
110
  arg.setDisplayName('Simulation Control: Daylight Saving Enabled')
99
- arg.setDescription('Whether to use daylight saving. If not provided, the OS-HPXML default is used.')
111
+ arg.setDescription("Whether to use daylight saving. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-building-site'>HPXML Building Site</a>) is used.")
100
112
  args << arg
101
113
 
102
114
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('simulation_control_daylight_saving_period', false)
103
115
  arg.setDisplayName('Simulation Control: Daylight Saving Period')
104
- arg.setDescription('Enter a date like "Mar 15 - Dec 15". If not provided, the OS-HPXML default is used.')
116
+ arg.setDescription("Enter a date like 'Mar 15 - Dec 15'. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-building-site'>HPXML Building Site</a>) is used.")
105
117
  args << arg
106
118
 
107
119
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('simulation_control_temperature_capacitance_multiplier', false)
108
120
  arg.setDisplayName('Simulation Control: Temperature Capacitance Multiplier')
109
- arg.setDescription('Affects the transient calculation of indoor air temperatures. If not provided, the OS-HPXML default is used.')
121
+ arg.setDescription("Affects the transient calculation of indoor air temperatures. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.")
110
122
  args << arg
111
123
 
112
124
  site_type_choices = OpenStudio::StringVector.new
@@ -116,7 +128,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
116
128
 
117
129
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('site_type', site_type_choices, false)
118
130
  arg.setDisplayName('Site: Type')
119
- arg.setDescription('The type of site. If not provided, the OS-HPXML default is used.')
131
+ arg.setDescription("The type of site. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-site'>HPXML Site</a>) is used.")
120
132
  args << arg
121
133
 
122
134
  site_shielding_of_home_choices = OpenStudio::StringVector.new
@@ -126,12 +138,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
126
138
 
127
139
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('site_shielding_of_home', site_shielding_of_home_choices, false)
128
140
  arg.setDisplayName('Site: Shielding of Home')
129
- arg.setDescription('Presence of nearby buildings, trees, obstructions for infiltration model. If not provided, the OS-HPXML default is used.')
141
+ arg.setDescription("Presence of nearby buildings, trees, obstructions for infiltration model. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-site'>HPXML Site</a>) is used.")
130
142
  args << arg
131
143
 
132
144
  arg = OpenStudio::Measure::OSArgument.makeDoubleArgument('site_ground_conductivity', false)
133
145
  arg.setDisplayName('Site: Ground Conductivity')
134
- arg.setDescription('Conductivity of the ground soil. If not provided, the OS-HPXML default is used.')
146
+ arg.setDescription("Conductivity of the ground soil. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-site'>HPXML Site</a>) is used.")
135
147
  arg.setUnits('Btu/hr-ft-F')
136
148
  args << arg
137
149
 
@@ -181,6 +193,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
181
193
  unit_type_choices << HPXML::ResidentialTypeSFD
182
194
  unit_type_choices << HPXML::ResidentialTypeSFA
183
195
  unit_type_choices << HPXML::ResidentialTypeApartment
196
+ unit_type_choices << HPXML::ResidentialTypeManufactured
197
+
198
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('unit_multiplier', false)
199
+ arg.setDisplayName('Building Construction: Unit Multiplier')
200
+ arg.setDescription('The number of similar dwelling units. EnergyPlus simulation results will be multiplied this value. If not provided, defaults to 1.')
201
+ args << arg
184
202
 
185
203
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('geometry_unit_type', unit_type_choices, true)
186
204
  arg.setDisplayName('Geometry: Unit Type')
@@ -255,7 +273,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
255
273
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('geometry_unit_num_bathrooms', false)
256
274
  arg.setDisplayName('Geometry: Unit Number of Bathrooms')
257
275
  arg.setUnits('#')
258
- arg.setDescription('The number of bathrooms in the unit. If not provided, the OS-HPXML default is used.')
276
+ arg.setDescription("The number of bathrooms in the unit. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-building-construction'>HPXML Building Construction</a>) is used.")
259
277
  args << arg
260
278
 
261
279
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_unit_num_occupants', false)
@@ -294,7 +312,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
294
312
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_garage_protrusion', true)
295
313
  arg.setDisplayName('Geometry: Garage Protrusion')
296
314
  arg.setUnits('Frac')
297
- arg.setDescription("The fraction of the garage that is protruding from the living space. Only applies to #{HPXML::ResidentialTypeSFD} units.")
315
+ arg.setDescription("The fraction of the garage that is protruding from the conditioned space. Only applies to #{HPXML::ResidentialTypeSFD} units.")
298
316
  arg.setDefaultValue(0.0)
299
317
  args << arg
300
318
 
@@ -317,6 +335,8 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
317
335
  foundation_type_choices << HPXML::FoundationTypeBasementConditioned
318
336
  foundation_type_choices << HPXML::FoundationTypeAmbient
319
337
  foundation_type_choices << HPXML::FoundationTypeAboveApartment # I.e., adiabatic
338
+ foundation_type_choices << "#{HPXML::FoundationTypeBellyAndWing}WithSkirt"
339
+ foundation_type_choices << "#{HPXML::FoundationTypeBellyAndWing}NoSkirt"
320
340
 
321
341
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('geometry_foundation_type', foundation_type_choices, true)
322
342
  arg.setDisplayName('Geometry: Foundation Type')
@@ -425,25 +445,25 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
425
445
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_front_height', false)
426
446
  arg.setDisplayName('Neighbor: Front Height')
427
447
  arg.setUnits('ft')
428
- arg.setDescription('The height of the neighboring building to the front. If not provided, the OS-HPXML default is used.')
448
+ arg.setDescription("The height of the neighboring building to the front. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-site'>HPXML Site</a>) is used.")
429
449
  args << arg
430
450
 
431
451
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_back_height', false)
432
452
  arg.setDisplayName('Neighbor: Back Height')
433
453
  arg.setUnits('ft')
434
- arg.setDescription('The height of the neighboring building to the back. If not provided, the OS-HPXML default is used.')
454
+ arg.setDescription("The height of the neighboring building to the back. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-site'>HPXML Site</a>) is used.")
435
455
  args << arg
436
456
 
437
457
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_left_height', false)
438
458
  arg.setDisplayName('Neighbor: Left Height')
439
459
  arg.setUnits('ft')
440
- arg.setDescription('The height of the neighboring building to the left. If not provided, the OS-HPXML default is used.')
460
+ arg.setDescription("The height of the neighboring building to the left. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-site'>HPXML Site</a>) is used.")
441
461
  args << arg
442
462
 
443
463
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_right_height', false)
444
464
  arg.setDisplayName('Neighbor: Right Height')
445
465
  arg.setUnits('ft')
446
- arg.setDescription('The height of the neighboring building to the right. If not provided, the OS-HPXML default is used.')
466
+ arg.setDescription("The height of the neighboring building to the right. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-site'>HPXML Site</a>) is used.")
447
467
  args << arg
448
468
 
449
469
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('floor_over_foundation_assembly_r', true)
@@ -484,13 +504,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
484
504
 
485
505
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('foundation_wall_type', foundation_wall_type_choices, false)
486
506
  arg.setDisplayName('Foundation Wall: Type')
487
- arg.setDescription('The material type of the foundation wall. If not provided, the OS-HPXML default is used.')
507
+ arg.setDescription("The material type of the foundation wall. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.")
488
508
  args << arg
489
509
 
490
510
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_thickness', false)
491
511
  arg.setDisplayName('Foundation Wall: Thickness')
492
512
  arg.setUnits('in')
493
- arg.setDescription('The thickness of the foundation wall. If not provided, the OS-HPXML default is used.')
513
+ arg.setDescription("The thickness of the foundation wall. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.")
494
514
  args << arg
495
515
 
496
516
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_insulation_r', true)
@@ -514,13 +534,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
514
534
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_insulation_distance_to_top', false)
515
535
  arg.setDisplayName('Foundation Wall: Insulation Distance To Top')
516
536
  arg.setUnits('ft')
517
- arg.setDescription('The distance from the top of the foundation wall to the top of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default is used.')
537
+ arg.setDescription("The distance from the top of the foundation wall to the top of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.")
518
538
  args << arg
519
539
 
520
540
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_insulation_distance_to_bottom', false)
521
541
  arg.setDisplayName('Foundation Wall: Insulation Distance To Bottom')
522
542
  arg.setUnits('ft')
523
- arg.setDescription('The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default is used.')
543
+ arg.setDescription("The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-foundation-walls'>HPXML Foundation Walls</a>) is used.")
524
544
  args << arg
525
545
 
526
546
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_assembly_r', false)
@@ -566,19 +586,19 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
566
586
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_thickness', false)
567
587
  arg.setDisplayName('Slab: Thickness')
568
588
  arg.setUnits('in')
569
- arg.setDescription('The thickness of the slab. Zero can be entered if there is a dirt floor instead of a slab. If not provided, the OS-HPXML default is used.')
589
+ arg.setDescription("The thickness of the slab. Zero can be entered if there is a dirt floor instead of a slab. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-slabs'>HPXML Slabs</a>) is used.")
570
590
  args << arg
571
591
 
572
592
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_carpet_fraction', false)
573
593
  arg.setDisplayName('Slab: Carpet Fraction')
574
594
  arg.setUnits('Frac')
575
- arg.setDescription('Fraction of the slab floor area that is carpeted. If not provided, the OS-HPXML default is used.')
595
+ arg.setDescription("Fraction of the slab floor area that is carpeted. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-slabs'>HPXML Slabs</a>) is used.")
576
596
  args << arg
577
597
 
578
598
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_carpet_r', false)
579
599
  arg.setDisplayName('Slab: Carpet R-value')
580
600
  arg.setUnits('h-ft^2-R/Btu')
581
- arg.setDescription('R-value of the slab carpet. If not provided, the OS-HPXML default is used.')
601
+ arg.setDescription("R-value of the slab carpet. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-slabs'>HPXML Slabs</a>) is used.")
582
602
  args << arg
583
603
 
584
604
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_assembly_r', true)
@@ -601,7 +621,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
601
621
 
602
622
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_material_type', roof_material_type_choices, false)
603
623
  arg.setDisplayName('Roof: Material Type')
604
- arg.setDescription('The material type of the roof. If not provided, the OS-HPXML default is used.')
624
+ arg.setDescription("The material type of the roof. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-roofs'>HPXML Roofs</a>) is used.")
605
625
  args << arg
606
626
 
607
627
  color_choices = OpenStudio::StringVector.new
@@ -613,7 +633,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
613
633
 
614
634
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_color', color_choices, false)
615
635
  arg.setDisplayName('Roof: Color')
616
- arg.setDescription('The color of the roof. If not provided, the OS-HPXML default is used.')
636
+ arg.setDescription("The color of the roof. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-roofs'>HPXML Roofs</a>) is used.")
617
637
  args << arg
618
638
 
619
639
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('roof_assembly_r', true)
@@ -636,8 +656,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
636
656
 
637
657
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_radiant_barrier_grade', roof_radiant_barrier_grade_choices, false)
638
658
  arg.setDisplayName('Roof: Radiant Barrier Grade')
639
- arg.setDescription('The grade of the radiant barrier. If not provided, the OS-HPXML default is used.')
640
- arg.setDefaultValue('1')
659
+ arg.setDescription("The grade of the radiant barrier. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-roofs'>HPXML Roofs</a>) is used.")
641
660
  args << arg
642
661
 
643
662
  wall_type_choices = OpenStudio::StringVector.new
@@ -674,12 +693,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
674
693
 
675
694
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('wall_siding_type', wall_siding_type_choices, false)
676
695
  arg.setDisplayName('Wall: Siding Type')
677
- arg.setDescription('The siding type of the walls. Also applies to rim joists. If not provided, the OS-HPXML default is used.')
696
+ arg.setDescription("The siding type of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-walls'>HPXML Walls</a>) is used.")
678
697
  args << arg
679
698
 
680
699
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('wall_color', color_choices, false)
681
700
  arg.setDisplayName('Wall: Color')
682
- arg.setDescription('The color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default is used.')
701
+ arg.setDescription("The color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-walls'>HPXML Walls</a>) is used.")
683
702
  args << arg
684
703
 
685
704
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('wall_assembly_r', true)
@@ -755,13 +774,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
755
774
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_fraction_operable', false)
756
775
  arg.setDisplayName('Windows: Fraction Operable')
757
776
  arg.setUnits('Frac')
758
- arg.setDescription('Fraction of windows that are operable. If not provided, the OS-HPXML default is used.')
777
+ arg.setDescription("Fraction of windows that are operable. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-windows'>HPXML Windows</a>) is used.")
759
778
  args << arg
760
779
 
761
780
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('window_natvent_availability', false)
762
781
  arg.setDisplayName('Windows: Natural Ventilation Availability')
763
782
  arg.setUnits('Days/week')
764
- arg.setDescription('For operable windows, the number of days/week that windows can be opened by occupants for natural ventilation. If not provided, the OS-HPXML default is used.')
783
+ arg.setDescription("For operable windows, the number of days/week that windows can be opened by occupants for natural ventilation. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-windows'>HPXML Windows</a>) is used.")
765
784
  args << arg
766
785
 
767
786
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_ufactor', true)
@@ -780,30 +799,30 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
780
799
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_interior_shading_winter', false)
781
800
  arg.setDisplayName('Windows: Winter Interior Shading')
782
801
  arg.setUnits('Frac')
783
- arg.setDescription('Interior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
802
+ arg.setDescription("Interior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-windows'>HPXML Windows</a>) is used.")
784
803
  args << arg
785
804
 
786
805
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_interior_shading_summer', false)
787
806
  arg.setDisplayName('Windows: Summer Interior Shading')
788
807
  arg.setUnits('Frac')
789
- arg.setDescription('Interior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
808
+ arg.setDescription("Interior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-windows'>HPXML Windows</a>) is used.")
790
809
  args << arg
791
810
 
792
811
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_exterior_shading_winter', false)
793
812
  arg.setDisplayName('Windows: Winter Exterior Shading')
794
813
  arg.setUnits('Frac')
795
- arg.setDescription('Exterior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
814
+ arg.setDescription("Exterior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-windows'>HPXML Windows</a>) is used.")
796
815
  args << arg
797
816
 
798
817
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_exterior_shading_summer', false)
799
818
  arg.setDisplayName('Windows: Summer Exterior Shading')
800
819
  arg.setUnits('Frac')
801
- arg.setDescription('Exterior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
820
+ arg.setDescription("Exterior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-windows'>HPXML Windows</a>) is used.")
802
821
  args << arg
803
822
 
804
823
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('window_shading_summer_season', false)
805
824
  arg.setDisplayName('Windows: Shading Summer Season')
806
- arg.setDescription('Enter a date like "May 1 - Sep 30". Defines the summer season for purposes of shading coefficients; the rest of the year is assumed to be winter. If not provided, the OS-HPXML default is used.')
825
+ arg.setDescription("Enter a date like 'May 1 - Sep 30'. Defines the summer season for purposes of shading coefficients; the rest of the year is assumed to be winter. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-windows'>HPXML Windows</a>) is used.")
807
826
  args << arg
808
827
 
809
828
  storm_window_type_choices = OpenStudio::StringVector.new
@@ -996,7 +1015,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
996
1015
 
997
1016
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('air_leakage_has_flue_or_chimney_in_conditioned_space', false)
998
1017
  arg.setDisplayName('Air Leakage: Has Flue or Chimney in Conditioned Space')
999
- arg.setDescription('Presence of flue or chimney with combustion air from conditioned space; used for infiltration model. If not provided, the OS-HPXML default is used.')
1018
+ arg.setDescription("Presence of flue or chimney with combustion air from conditioned space; used for infiltration model. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#flue-or-chimney'>Flue or Chimney</a>) is used.")
1000
1019
  args << arg
1001
1020
 
1002
1021
  heating_system_type_choices = OpenStudio::StringVector.new
@@ -1007,9 +1026,8 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1007
1026
  heating_system_type_choices << HPXML::HVACTypeBoiler
1008
1027
  heating_system_type_choices << HPXML::HVACTypeElectricResistance
1009
1028
  heating_system_type_choices << HPXML::HVACTypeStove
1010
- heating_system_type_choices << HPXML::HVACTypePortableHeater
1029
+ heating_system_type_choices << HPXML::HVACTypeSpaceHeater
1011
1030
  heating_system_type_choices << HPXML::HVACTypeFireplace
1012
- heating_system_type_choices << HPXML::HVACTypeFixedHeater
1013
1031
  heating_system_type_choices << "Shared #{HPXML::HVACTypeBoiler} w/ Baseboard"
1014
1032
  heating_system_type_choices << "Shared #{HPXML::HVACTypeBoiler} w/ Ductless Fan Coil"
1015
1033
 
@@ -1062,7 +1080,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1062
1080
 
1063
1081
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_heating_capacity', false)
1064
1082
  arg.setDisplayName('Heating System: Heating Capacity')
1065
- arg.setDescription('The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default is used.')
1083
+ arg.setDescription("The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default (see <a href='#{docs_base_url}#hpxml-heating-systems'>HPXML Heating Systems</a>) is used.")
1066
1084
  arg.setUnits('Btu/hr')
1067
1085
  args << arg
1068
1086
 
@@ -1105,18 +1123,18 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1105
1123
 
1106
1124
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooling_system_cooling_compressor_type', compressor_type_choices, false)
1107
1125
  arg.setDisplayName('Cooling System: Cooling Compressor Type')
1108
- arg.setDescription("The compressor type of the cooling system. Only applies to #{HPXML::HVACTypeCentralAirConditioner}. If not provided, the OS-HPXML default is used.")
1126
+ arg.setDescription("The compressor type of the cooling system. Only applies to #{HPXML::HVACTypeCentralAirConditioner} and #{HPXML::HVACTypeMiniSplitAirConditioner}. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#central-air-conditioner'>Central Air Conditioner</a>, <a href='#{docs_base_url}#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.")
1109
1127
  args << arg
1110
1128
 
1111
1129
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_cooling_sensible_heat_fraction', false)
1112
1130
  arg.setDisplayName('Cooling System: Cooling Sensible Heat Fraction')
1113
- arg.setDescription("The sensible heat fraction of the cooling system. Ignored for #{HPXML::HVACTypeEvaporativeCooler}. If not provided, the OS-HPXML default is used.")
1131
+ arg.setDescription("The sensible heat fraction of the cooling system. Ignored for #{HPXML::HVACTypeEvaporativeCooler}. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#central-air-conditioner'>Central Air Conditioner</a>, <a href='#{docs_base_url}#room-air-conditioner'>Room Air Conditioner</a>, <a href='#{docs_base_url}#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>, <a href='#{docs_base_url}#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.")
1114
1132
  arg.setUnits('Frac')
1115
1133
  args << arg
1116
1134
 
1117
1135
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_cooling_capacity', false)
1118
1136
  arg.setDisplayName('Cooling System: Cooling Capacity')
1119
- arg.setDescription('The output cooling capacity of the cooling system. If not provided, the OS-HPXML autosized default is used.')
1137
+ arg.setDescription("The output cooling capacity of the cooling system. If not provided, the OS-HPXML autosized default (see <a href='#{docs_base_url}#central-air-conditioner'>Central Air Conditioner</a>, <a href='#{docs_base_url}#room-air-conditioner'>Room Air Conditioner</a>, <a href='#{docs_base_url}#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>, <a href='#{docs_base_url}#evaporative-cooler'>Evaporative Cooler</a>, <a href='#{docs_base_url}#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.")
1120
1138
  arg.setUnits('Btu/hr')
1121
1139
  args << arg
1122
1140
 
@@ -1147,7 +1165,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1147
1165
 
1148
1166
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_crankcase_heater_watts', false)
1149
1167
  arg.setDisplayName('Cooling System: Crankcase Heater Power Watts')
1150
- arg.setDescription("Cooling system crankcase heater power consumption in Watts. Applies only to #{HPXML::HVACTypeCentralAirConditioner}, #{HPXML::HVACTypeMiniSplitAirConditioner}, #{HPXML::HVACTypePTAC} and #{HPXML::HVACTypeRoomAirConditioner}. If not provided, the OS-HPXML default is used.")
1168
+ arg.setDescription("Cooling system crankcase heater power consumption in Watts. Applies only to #{HPXML::HVACTypeCentralAirConditioner}, #{HPXML::HVACTypeRoomAirConditioner}, #{HPXML::HVACTypePTAC} and #{HPXML::HVACTypeMiniSplitAirConditioner}. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#central-air-conditioner'>Central Air Conditioner</a>, <a href='#{docs_base_url}#room-air-conditioner'>Room Air Conditioner</a>, <a href='#{docs_base_url}#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>, <a href='#{docs_base_url}#mini-split-air-conditioner'>Mini-Split Air Conditioner</a>) is used.")
1151
1169
  arg.setUnits('W')
1152
1170
  args << arg
1153
1171
 
@@ -1164,7 +1182,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1164
1182
 
1165
1183
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_integrated_heating_system_capacity', false)
1166
1184
  arg.setDisplayName('Cooling System: Integrated Heating System Heating Capacity')
1167
- arg.setDescription("The output heating capacity of the heating system integrated into cooling system. If not provided, the OS-HPXML autosized default is used. Only used for #{HPXML::HVACTypePTAC} and #{HPXML::HVACTypeRoomAirConditioner}.")
1185
+ arg.setDescription("The output heating capacity of the heating system integrated into cooling system. If not provided, the OS-HPXML autosized default (see <a href='#{docs_base_url}#room-air-conditioner'>Room Air Conditioner</a>, <a href='#{docs_base_url}#packaged-terminal-air-conditioner'>Packaged Terminal Air Conditioner</a>) is used. Only used for #{HPXML::HVACTypeRoomAirConditioner} and #{HPXML::HVACTypePTAC}.")
1168
1186
  arg.setUnits('Btu/hr')
1169
1187
  args << arg
1170
1188
 
@@ -1187,9 +1205,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1187
1205
  heat_pump_heating_efficiency_type_choices << HPXML::UnitsHSPF2
1188
1206
  heat_pump_heating_efficiency_type_choices << HPXML::UnitsCOP
1189
1207
 
1190
- heat_pump_fuel_choices = OpenStudio::StringVector.new
1191
- heat_pump_fuel_choices << HPXML::FuelTypeElectricity
1192
-
1193
1208
  heat_pump_backup_type_choices = OpenStudio::StringVector.new
1194
1209
  heat_pump_backup_type_choices << 'none'
1195
1210
  heat_pump_backup_type_choices << HPXML::HeatPumpBackupTypeIntegrated
@@ -1238,24 +1253,24 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1238
1253
 
1239
1254
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_cooling_compressor_type', compressor_type_choices, false)
1240
1255
  arg.setDisplayName('Heat Pump: Cooling Compressor Type')
1241
- arg.setDescription("The compressor type of the heat pump. Only applies to #{HPXML::HVACTypeHeatPumpAirToAir}. If not provided, the OS-HPXML default is used.")
1256
+ arg.setDescription("The compressor type of the heat pump. Only applies to #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit}. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='#{docs_base_url}#mini-split-heat-pump'>Mini-Split Heat Pump</a>) is used.")
1242
1257
  args << arg
1243
1258
 
1244
1259
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_cooling_sensible_heat_fraction', false)
1245
1260
  arg.setDisplayName('Heat Pump: Cooling Sensible Heat Fraction')
1246
- arg.setDescription('The sensible heat fraction of the heat pump. If not provided, the OS-HPXML default is used.')
1261
+ arg.setDescription("The sensible heat fraction of the heat pump. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='#{docs_base_url}#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='#{docs_base_url}#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='#{docs_base_url}#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>, <a href='#{docs_base_url}#ground-to-air-heat-pump'>Ground-to-Air Heat Pump</a>) is used.")
1247
1262
  arg.setUnits('Frac')
1248
1263
  args << arg
1249
1264
 
1250
1265
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_capacity', false)
1251
1266
  arg.setDisplayName('Heat Pump: Heating Capacity')
1252
- arg.setDescription('The output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default is used.')
1267
+ arg.setDescription("The output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default (see <a href='#{docs_base_url}#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='#{docs_base_url}#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='#{docs_base_url}#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='#{docs_base_url}#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>, <a href='#{docs_base_url}#ground-to-air-heat-pump'>Ground-to-Air Heat Pump</a>) is used.")
1253
1268
  arg.setUnits('Btu/hr')
1254
1269
  args << arg
1255
1270
 
1256
1271
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_capacity_retention_fraction', false)
1257
1272
  arg.setDisplayName('Heat Pump: Heating Capacity Retention Fraction')
1258
- arg.setDescription("The output heating capacity of the heat pump at a user-specified temperature (e.g., 17F or 5F) divided by the above nominal heating capacity. Applies to all heat pump types except #{HPXML::HVACTypeHeatPumpGroundToAir}. If not provided, the OS-HPXML default is used.")
1273
+ arg.setDescription("The output heating capacity of the heat pump at a user-specified temperature (e.g., 17F or 5F) divided by the above nominal heating capacity. Applies to all heat pump types except #{HPXML::HVACTypeHeatPumpGroundToAir}. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='#{docs_base_url}#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='#{docs_base_url}#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='#{docs_base_url}#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>) is used.")
1259
1274
  arg.setUnits('Frac')
1260
1275
  args << arg
1261
1276
 
@@ -1267,7 +1282,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1267
1282
 
1268
1283
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_cooling_capacity', false)
1269
1284
  arg.setDisplayName('Heat Pump: Cooling Capacity')
1270
- arg.setDescription('The output cooling capacity of the heat pump. If not provided, the OS-HPXML autosized default is used.')
1285
+ arg.setDescription("The output cooling capacity of the heat pump. If not provided, the OS-HPXML autosized default (see <a href='#{docs_base_url}#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='#{docs_base_url}#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='#{docs_base_url}#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='#{docs_base_url}#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>, <a href='#{docs_base_url}#ground-to-air-heat-pump'>Ground-to-Air Heat Pump</a>) is used.")
1271
1286
  arg.setUnits('Btu/hr')
1272
1287
  args << arg
1273
1288
 
@@ -1287,7 +1302,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1287
1302
 
1288
1303
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_compressor_lockout_temp', false)
1289
1304
  arg.setDisplayName('Heat Pump: Compressor Lockout Temperature')
1290
- arg.setDescription("The temperature below which the heat pump compressor is disabled. If both this and Backup Heating Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies to all heat pump types other than #{HPXML::HVACTypeHeatPumpGroundToAir}. If not provided, the OS-HPXML default is used.")
1305
+ arg.setDescription("The temperature below which the heat pump compressor is disabled. If both this and Backup Heating Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies to all heat pump types other than #{HPXML::HVACTypeHeatPumpGroundToAir}. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='#{docs_base_url}#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='#{docs_base_url}#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='#{docs_base_url}#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>) is used.")
1291
1306
  arg.setUnits('deg-F')
1292
1307
  args << arg
1293
1308
 
@@ -1311,19 +1326,19 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1311
1326
 
1312
1327
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_backup_heating_capacity', false)
1313
1328
  arg.setDisplayName('Heat Pump: Backup Heating Capacity')
1314
- arg.setDescription("The backup output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default is used. Only applies if Backup Type is '#{HPXML::HeatPumpBackupTypeIntegrated}'.")
1329
+ arg.setDescription("The backup output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default (see <a href='#{docs_base_url}#backup'>Backup</a>) is used. Only applies if Backup Type is '#{HPXML::HeatPumpBackupTypeIntegrated}'.")
1315
1330
  arg.setUnits('Btu/hr')
1316
1331
  args << arg
1317
1332
 
1318
1333
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_backup_heating_lockout_temp', false)
1319
1334
  arg.setDisplayName('Heat Pump: Backup Heating Lockout Temperature')
1320
- arg.setDescription("The temperature above which the heat pump backup system is disabled. If both this and Compressor Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies for both Backup Type of '#{HPXML::HeatPumpBackupTypeIntegrated}' and '#{HPXML::HeatPumpBackupTypeSeparate}'. If not provided, the OS-HPXML default is used.")
1335
+ arg.setDescription("The temperature above which the heat pump backup system is disabled. If both this and Compressor Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies for both Backup Type of '#{HPXML::HeatPumpBackupTypeIntegrated}' and '#{HPXML::HeatPumpBackupTypeSeparate}'. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#backup'>Backup</a>) is used.")
1321
1336
  arg.setUnits('deg-F')
1322
1337
  args << arg
1323
1338
 
1324
1339
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_sizing_methodology', heat_pump_sizing_choices, false)
1325
1340
  arg.setDisplayName('Heat Pump: Sizing Methodology')
1326
- arg.setDescription('The auto-sizing methodology to use when the heat pump capacity is not provided. If not provided, the OS-HPXML default is used.')
1341
+ arg.setDescription("The auto-sizing methodology to use when the heat pump capacity is not provided. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-hvac-sizing-control'>HPXML HVAC Sizing Control</a>) is used.")
1327
1342
  args << arg
1328
1343
 
1329
1344
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('heat_pump_is_ducted', false)
@@ -1345,7 +1360,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1345
1360
 
1346
1361
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_crankcase_heater_watts', false)
1347
1362
  arg.setDisplayName('Heat Pump: Crankcase Heater Power Watts')
1348
- arg.setDescription("Heat Pump crankcase heater power consumption in Watts. Applies only to #{HPXML::HVACTypeHeatPumpAirToAir}, #{HPXML::HVACTypeHeatPumpMiniSplit}, #{HPXML::HVACTypeHeatPumpPTHP} and #{HPXML::HVACTypeHeatPumpRoom}. If not provided, the OS-HPXML default is used.")
1363
+ arg.setDescription("Heat Pump crankcase heater power consumption in Watts. Applies only to #{HPXML::HVACTypeHeatPumpAirToAir}, #{HPXML::HVACTypeHeatPumpMiniSplit}, #{HPXML::HVACTypeHeatPumpPTHP} and #{HPXML::HVACTypeHeatPumpRoom}. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-to-air-heat-pump'>Air-to-Air Heat Pump</a>, <a href='#{docs_base_url}#mini-split-heat-pump'>Mini-Split Heat Pump</a>, <a href='#{docs_base_url}#packaged-terminal-heat-pump'>Packaged Terminal Heat Pump</a>, <a href='#{docs_base_url}#room-air-conditioner-w-reverse-cycle'>Room Air Conditioner w/ Reverse Cycle</a>) is used.")
1349
1364
  arg.setUnits('W')
1350
1365
  args << arg
1351
1366
 
@@ -1357,9 +1372,8 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1357
1372
  heating_system_2_type_choices << HPXML::HVACTypeBoiler
1358
1373
  heating_system_2_type_choices << HPXML::HVACTypeElectricResistance
1359
1374
  heating_system_2_type_choices << HPXML::HVACTypeStove
1360
- heating_system_2_type_choices << HPXML::HVACTypePortableHeater
1375
+ heating_system_2_type_choices << HPXML::HVACTypeSpaceHeater
1361
1376
  heating_system_2_type_choices << HPXML::HVACTypeFireplace
1362
- heating_system_2_type_choices << HPXML::HVACTypeFixedHeater
1363
1377
 
1364
1378
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system_2_type', heating_system_2_type_choices, true)
1365
1379
  arg.setDisplayName('Heating System 2: Type')
@@ -1382,7 +1396,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1382
1396
 
1383
1397
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_2_heating_capacity', false)
1384
1398
  arg.setDisplayName('Heating System 2: Heating Capacity')
1385
- arg.setDescription('The output heating capacity of the second heating system. If not provided, the OS-HPXML autosized default is used.')
1399
+ arg.setDescription("The output heating capacity of the second heating system. If not provided, the OS-HPXML autosized default (see <a href='#{docs_base_url}#hpxml-heating-systems'>HPXML Heating Systems</a>) is used.")
1386
1400
  arg.setUnits('Btu/hr')
1387
1401
  args << arg
1388
1402
 
@@ -1419,12 +1433,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1419
1433
 
1420
1434
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_heating_season_period', false)
1421
1435
  arg.setDisplayName('HVAC Control: Heating Season Period')
1422
- arg.setDescription("Enter a date like 'Nov 1 - Jun 30'. If not provided, the OS-HPXML default is used. Can also provide '#{HPXML::BuildingAmerica}' to use automatic seasons from the Building America House Simulation Protocols.")
1436
+ arg.setDescription("Enter a date like 'Nov 1 - Jun 30'. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-hvac-control'>HPXML HVAC Control</a>) is used. Can also provide '#{HPXML::BuildingAmerica}' to use automatic seasons from the Building America House Simulation Protocols.")
1423
1437
  args << arg
1424
1438
 
1425
1439
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_cooling_season_period', false)
1426
1440
  arg.setDisplayName('HVAC Control: Cooling Season Period')
1427
- arg.setDescription("Enter a date like 'Jun 1 - Oct 31'. If not provided, the OS-HPXML default is used. Can also provide '#{HPXML::BuildingAmerica}' to use automatic seasons from the Building America House Simulation Protocols.")
1441
+ arg.setDescription("Enter a date like 'Jun 1 - Oct 31'. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-hvac-control'>HPXML HVAC Control</a>) is used. Can also provide '#{HPXML::BuildingAmerica}' to use automatic seasons from the Building America House Simulation Protocols.")
1428
1442
  args << arg
1429
1443
 
1430
1444
  duct_leakage_units_choices = OpenStudio::StringVector.new
@@ -1433,12 +1447,14 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1433
1447
  duct_leakage_units_choices << HPXML::UnitsPercent
1434
1448
 
1435
1449
  duct_location_choices = OpenStudio::StringVector.new
1436
- duct_location_choices << HPXML::LocationLivingSpace
1450
+ duct_location_choices << HPXML::LocationConditionedSpace
1437
1451
  duct_location_choices << HPXML::LocationBasementConditioned
1438
1452
  duct_location_choices << HPXML::LocationBasementUnconditioned
1453
+ duct_location_choices << HPXML::LocationCrawlspace
1439
1454
  duct_location_choices << HPXML::LocationCrawlspaceVented
1440
1455
  duct_location_choices << HPXML::LocationCrawlspaceUnvented
1441
1456
  duct_location_choices << HPXML::LocationCrawlspaceConditioned
1457
+ duct_location_choices << HPXML::LocationAttic
1442
1458
  duct_location_choices << HPXML::LocationAtticVented
1443
1459
  duct_location_choices << HPXML::LocationAtticUnvented
1444
1460
  duct_location_choices << HPXML::LocationGarage
@@ -1450,6 +1466,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1450
1466
  duct_location_choices << HPXML::LocationOtherHeatedSpace
1451
1467
  duct_location_choices << HPXML::LocationOtherMultifamilyBufferSpace
1452
1468
  duct_location_choices << HPXML::LocationOtherNonFreezingSpace
1469
+ duct_location_choices << HPXML::LocationManufacturedHomeBelly
1453
1470
 
1454
1471
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_leakage_units', duct_leakage_units_choices, true)
1455
1472
  arg.setDisplayName('Ducts: Leakage Units')
@@ -1471,7 +1488,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1471
1488
 
1472
1489
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_supply_location', duct_location_choices, false)
1473
1490
  arg.setDisplayName('Ducts: Supply Location')
1474
- arg.setDescription('The location of the supply ducts. If not provided, the OS-HPXML default is used.')
1491
+ arg.setDescription("The location of the supply ducts. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-distribution'>Air Distribution</a>) is used.")
1475
1492
  args << arg
1476
1493
 
1477
1494
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_supply_insulation_r', true)
@@ -1494,13 +1511,19 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1494
1511
 
1495
1512
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_supply_surface_area', false)
1496
1513
  arg.setDisplayName('Ducts: Supply Surface Area')
1497
- arg.setDescription('The surface area of the supply ducts. If not provided, the OS-HPXML default is used.')
1514
+ arg.setDescription("The supply ducts surface area in the given location. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-distribution'>Air Distribution</a>) is used.")
1498
1515
  arg.setUnits('ft^2')
1499
1516
  args << arg
1500
1517
 
1518
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_supply_surface_area_fraction', false)
1519
+ arg.setDisplayName('Ducts: Supply Area Fraction')
1520
+ arg.setDescription("The fraction of supply ducts surface area in the given location. Only used if Surface Area is not provided. If the fraction is less than 1, the remaining duct area is assumed to be in conditioned space. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-distribution'>Air Distribution</a>) is used.")
1521
+ arg.setUnits('frac')
1522
+ args << arg
1523
+
1501
1524
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_return_location', duct_location_choices, false)
1502
1525
  arg.setDisplayName('Ducts: Return Location')
1503
- arg.setDescription('The location of the return ducts. If not provided, the OS-HPXML default is used.')
1526
+ arg.setDescription("The location of the return ducts. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-distribution'>Air Distribution</a>) is used.")
1504
1527
  args << arg
1505
1528
 
1506
1529
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_return_insulation_r', true)
@@ -1517,13 +1540,19 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1517
1540
 
1518
1541
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_return_surface_area', false)
1519
1542
  arg.setDisplayName('Ducts: Return Surface Area')
1520
- arg.setDescription('The surface area of the return ducts. If not provided, the OS-HPXML default is used.')
1543
+ arg.setDescription("The return ducts surface area in the given location. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-distribution'>Air Distribution</a>) is used.")
1521
1544
  arg.setUnits('ft^2')
1522
1545
  args << arg
1523
1546
 
1547
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_return_surface_area_fraction', false)
1548
+ arg.setDisplayName('Ducts: Return Area Fraction')
1549
+ arg.setDescription("The fraction of return ducts surface area in the given location. Only used if Surface Area is not provided. If the fraction is less than 1, the remaining duct area is assumed to be in conditioned space. If neither Surface Area nor Area Fraction provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-distribution'>Air Distribution</a>) is used.")
1550
+ arg.setUnits('frac')
1551
+ args << arg
1552
+
1524
1553
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('ducts_number_of_return_registers', false)
1525
1554
  arg.setDisplayName('Ducts: Number of Return Registers')
1526
- arg.setDescription('The number of return registers of the ducts. Only used to calculate default return duct surface area. If not provided, the OS-HPXML default is used.')
1555
+ arg.setDescription("The number of return registers of the ducts. Only used to calculate default return duct surface area. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#air-distribution'>Air Distribution</a>) is used.")
1527
1556
  arg.setUnits('#')
1528
1557
  args << arg
1529
1558
 
@@ -1548,13 +1577,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1548
1577
 
1549
1578
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_flow_rate', false)
1550
1579
  arg.setDisplayName('Mechanical Ventilation: Flow Rate')
1551
- arg.setDescription('The flow rate of the mechanical ventilation. If not provided, the OS-HPXML default is used.')
1580
+ arg.setDescription("The flow rate of the mechanical ventilation. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#whole-ventilation-fan'>Whole Ventilation Fan</a>) is used.")
1552
1581
  arg.setUnits('CFM')
1553
1582
  args << arg
1554
1583
 
1555
1584
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_hours_in_operation', false)
1556
1585
  arg.setDisplayName('Mechanical Ventilation: Hours In Operation')
1557
- arg.setDescription('The hours in operation of the mechanical ventilation. If not provided, the OS-HPXML default is used.')
1586
+ arg.setDescription("The hours in operation of the mechanical ventilation. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#whole-ventilation-fan'>Whole Ventilation Fan</a>) is used.")
1558
1587
  arg.setUnits('hrs/day')
1559
1588
  args << arg
1560
1589
 
@@ -1580,7 +1609,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1580
1609
 
1581
1610
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_fan_power', false)
1582
1611
  arg.setDisplayName('Mechanical Ventilation: Fan Power')
1583
- arg.setDescription('The fan power of the mechanical ventilation. If not provided, the OS-HPXML default is used.')
1612
+ arg.setDescription("The fan power of the mechanical ventilation. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#whole-ventilation-fan'>Whole Ventilation Fan</a>) is used.")
1584
1613
  arg.setUnits('W')
1585
1614
  args << arg
1586
1615
 
@@ -1691,61 +1720,61 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1691
1720
 
1692
1721
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('kitchen_fans_quantity', false)
1693
1722
  arg.setDisplayName('Kitchen Fans: Quantity')
1694
- arg.setDescription('The quantity of the kitchen fans. If not provided, the OS-HPXML default is used.')
1723
+ arg.setDescription("The quantity of the kitchen fans. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#local-ventilation-fan'>Local Ventilation Fan</a>) is used.")
1695
1724
  arg.setUnits('#')
1696
1725
  args << arg
1697
1726
 
1698
1727
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_flow_rate', false)
1699
1728
  arg.setDisplayName('Kitchen Fans: Flow Rate')
1700
- arg.setDescription('The flow rate of the kitchen fan. If not provided, the OS-HPXML default is used.')
1729
+ arg.setDescription("The flow rate of the kitchen fan. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#local-ventilation-fan'>Local Ventilation Fan</a>) is used.")
1701
1730
  arg.setUnits('CFM')
1702
1731
  args << arg
1703
1732
 
1704
1733
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_hours_in_operation', false)
1705
1734
  arg.setDisplayName('Kitchen Fans: Hours In Operation')
1706
- arg.setDescription('The hours in operation of the kitchen fan. If not provided, the OS-HPXML default is used.')
1735
+ arg.setDescription("The hours in operation of the kitchen fan. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#local-ventilation-fan'>Local Ventilation Fan</a>) is used.")
1707
1736
  arg.setUnits('hrs/day')
1708
1737
  args << arg
1709
1738
 
1710
1739
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_power', false)
1711
1740
  arg.setDisplayName('Kitchen Fans: Fan Power')
1712
- arg.setDescription('The fan power of the kitchen fan. If not provided, the OS-HPXML default is used.')
1741
+ arg.setDescription("The fan power of the kitchen fan. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#local-ventilation-fan'>Local Ventilation Fan</a>) is used.")
1713
1742
  arg.setUnits('W')
1714
1743
  args << arg
1715
1744
 
1716
1745
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('kitchen_fans_start_hour', false)
1717
1746
  arg.setDisplayName('Kitchen Fans: Start Hour')
1718
- arg.setDescription('The start hour of the kitchen fan. If not provided, the OS-HPXML default is used.')
1747
+ arg.setDescription("The start hour of the kitchen fan. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#local-ventilation-fan'>Local Ventilation Fan</a>) is used.")
1719
1748
  arg.setUnits('hr')
1720
1749
  args << arg
1721
1750
 
1722
1751
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('bathroom_fans_quantity', false)
1723
1752
  arg.setDisplayName('Bathroom Fans: Quantity')
1724
- arg.setDescription('The quantity of the bathroom fans. If not provided, the OS-HPXML default is used.')
1753
+ arg.setDescription("The quantity of the bathroom fans. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#local-ventilation-fan'>Local Ventilation Fan</a>) is used.")
1725
1754
  arg.setUnits('#')
1726
1755
  args << arg
1727
1756
 
1728
1757
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_flow_rate', false)
1729
1758
  arg.setDisplayName('Bathroom Fans: Flow Rate')
1730
- arg.setDescription('The flow rate of the bathroom fans. If not provided, the OS-HPXML default is used.')
1759
+ arg.setDescription("The flow rate of the bathroom fans. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#local-ventilation-fan'>Local Ventilation Fan</a>) is used.")
1731
1760
  arg.setUnits('CFM')
1732
1761
  args << arg
1733
1762
 
1734
1763
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_hours_in_operation', false)
1735
1764
  arg.setDisplayName('Bathroom Fans: Hours In Operation')
1736
- arg.setDescription('The hours in operation of the bathroom fans. If not provided, the OS-HPXML default is used.')
1765
+ arg.setDescription("The hours in operation of the bathroom fans. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#local-ventilation-fan'>Local Ventilation Fan</a>) is used.")
1737
1766
  arg.setUnits('hrs/day')
1738
1767
  args << arg
1739
1768
 
1740
1769
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_power', false)
1741
1770
  arg.setDisplayName('Bathroom Fans: Fan Power')
1742
- arg.setDescription('The fan power of the bathroom fans. If not provided, the OS-HPXML default is used.')
1771
+ arg.setDescription("The fan power of the bathroom fans. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#local-ventilation-fan'>Local Ventilation Fan</a>) is used.")
1743
1772
  arg.setUnits('W')
1744
1773
  args << arg
1745
1774
 
1746
1775
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('bathroom_fans_start_hour', false)
1747
1776
  arg.setDisplayName('Bathroom Fans: Start Hour')
1748
- arg.setDescription('The start hour of the bathroom fans. If not provided, the OS-HPXML default is used.')
1777
+ arg.setDescription("The start hour of the bathroom fans. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#local-ventilation-fan'>Local Ventilation Fan</a>) is used.")
1749
1778
  arg.setUnits('hr')
1750
1779
  args << arg
1751
1780
 
@@ -1757,13 +1786,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1757
1786
 
1758
1787
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('whole_house_fan_flow_rate', false)
1759
1788
  arg.setDisplayName('Whole House Fan: Flow Rate')
1760
- arg.setDescription('The flow rate of the whole house fan. If not provided, the OS-HPXML default is used.')
1789
+ arg.setDescription("The flow rate of the whole house fan. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#whole-house-fan'>Whole House Fan</a>) is used.")
1761
1790
  arg.setUnits('CFM')
1762
1791
  args << arg
1763
1792
 
1764
1793
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('whole_house_fan_power', false)
1765
1794
  arg.setDisplayName('Whole House Fan: Fan Power')
1766
- arg.setDescription('The fan power of the whole house fan. If not provided, the OS-HPXML default is used.')
1795
+ arg.setDescription("The fan power of the whole house fan. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#whole-house-fan'>Whole House Fan</a>) is used.")
1767
1796
  arg.setUnits('W')
1768
1797
  args << arg
1769
1798
 
@@ -1784,12 +1813,14 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1784
1813
  water_heater_fuel_choices << HPXML::FuelTypeCoal
1785
1814
 
1786
1815
  water_heater_location_choices = OpenStudio::StringVector.new
1787
- water_heater_location_choices << HPXML::LocationLivingSpace
1816
+ water_heater_location_choices << HPXML::LocationConditionedSpace
1788
1817
  water_heater_location_choices << HPXML::LocationBasementConditioned
1789
1818
  water_heater_location_choices << HPXML::LocationBasementUnconditioned
1790
1819
  water_heater_location_choices << HPXML::LocationGarage
1820
+ water_heater_location_choices << HPXML::LocationAttic
1791
1821
  water_heater_location_choices << HPXML::LocationAtticVented
1792
1822
  water_heater_location_choices << HPXML::LocationAtticUnvented
1823
+ water_heater_location_choices << HPXML::LocationCrawlspace
1793
1824
  water_heater_location_choices << HPXML::LocationCrawlspaceVented
1794
1825
  water_heater_location_choices << HPXML::LocationCrawlspaceUnvented
1795
1826
  water_heater_location_choices << HPXML::LocationCrawlspaceConditioned
@@ -1823,12 +1854,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1823
1854
 
1824
1855
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_location', water_heater_location_choices, false)
1825
1856
  arg.setDisplayName('Water Heater: Location')
1826
- arg.setDescription('The location of water heater. If not provided, the OS-HPXML default is used.')
1857
+ arg.setDescription("The location of water heater. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-water-heating-systems'>HPXML Water Heating Systems</a>) is used.")
1827
1858
  args << arg
1828
1859
 
1829
1860
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_tank_volume', false)
1830
1861
  arg.setDisplayName('Water Heater: Tank Volume')
1831
- arg.setDescription("Nominal volume of water heater tank. Only applies to #{HPXML::WaterHeaterTypeStorage}, #{HPXML::WaterHeaterTypeHeatPump}, and #{HPXML::WaterHeaterTypeCombiStorage}. If not provided, the OS-HPXML default is used.")
1862
+ arg.setDescription("Nominal volume of water heater tank. Only applies to #{HPXML::WaterHeaterTypeStorage}, #{HPXML::WaterHeaterTypeHeatPump}, and #{HPXML::WaterHeaterTypeCombiStorage}. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#conventional-storage'>Conventional Storage</a>, <a href='#{docs_base_url}#heat-pump'>Heat Pump</a>, <a href='#{docs_base_url}#combi-boiler-w-storage'>Combi Boiler w/ Storage</a>) is used.")
1832
1863
  arg.setUnits('gal')
1833
1864
  args << arg
1834
1865
 
@@ -1846,24 +1877,24 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1846
1877
 
1847
1878
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_usage_bin', water_heater_usage_bin_choices, false)
1848
1879
  arg.setDisplayName('Water Heater: Usage Bin')
1849
- arg.setDescription("The usage of the water heater. Only applies if Efficiency Type is UniformEnergyFactor and Type is not #{HPXML::WaterHeaterTypeTankless}. Does not apply to space-heating boilers. If not provided, the OS-HPXML default is used.")
1880
+ arg.setDescription("The usage of the water heater. Only applies if Efficiency Type is UniformEnergyFactor and Type is not #{HPXML::WaterHeaterTypeTankless}. Does not apply to space-heating boilers. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#conventional-storage'>Conventional Storage</a>, <a href='#{docs_base_url}#heat-pump'>Heat Pump</a>) is used.")
1850
1881
  args << arg
1851
1882
 
1852
1883
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_recovery_efficiency', false)
1853
1884
  arg.setDisplayName('Water Heater: Recovery Efficiency')
1854
- arg.setDescription('Ratio of energy delivered to water heater to the energy content of the fuel consumed by the water heater. Only used for non-electric storage water heaters. If not provided, the OS-HPXML default is used.')
1885
+ arg.setDescription("Ratio of energy delivered to water heater to the energy content of the fuel consumed by the water heater. Only used for non-electric storage water heaters. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#conventional-storage'>Conventional Storage</a>) is used.")
1855
1886
  arg.setUnits('Frac')
1856
1887
  args << arg
1857
1888
 
1858
1889
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_heating_capacity', false)
1859
1890
  arg.setDisplayName('Water Heater: Heating Capacity')
1860
- arg.setDescription("Heating capacity. Only applies to #{HPXML::WaterHeaterTypeStorage}. If not provided, the OS-HPXML default is used.")
1891
+ arg.setDescription("Heating capacity. Only applies to #{HPXML::WaterHeaterTypeStorage}. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#conventional-storage'>Conventional Storage</a>) is used.")
1861
1892
  arg.setUnits('Btu/hr')
1862
1893
  args << arg
1863
1894
 
1864
1895
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_standby_loss', false)
1865
1896
  arg.setDisplayName('Water Heater: Standby Loss')
1866
- arg.setDescription('The standby loss of water heater. Only applies to space-heating boilers. If not provided, the OS-HPXML default is used.')
1897
+ arg.setDescription("The standby loss of water heater. Only applies to space-heating boilers. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#combi-boiler-w-storage'>Combi Boiler w/ Storage</a>) is used.")
1867
1898
  arg.setUnits('deg-F/hr')
1868
1899
  args << arg
1869
1900
 
@@ -1875,7 +1906,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1875
1906
 
1876
1907
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_setpoint_temperature', false)
1877
1908
  arg.setDisplayName('Water Heater: Setpoint Temperature')
1878
- arg.setDescription('The setpoint temperature of water heater. If not provided, the OS-HPXML default is used.')
1909
+ arg.setDescription("The setpoint temperature of water heater. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-water-heating-systems'>HPXML Water Heating Systems</a>) is used.")
1879
1910
  arg.setUnits('deg-F')
1880
1911
  args << arg
1881
1912
 
@@ -1897,7 +1928,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1897
1928
 
1898
1929
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_tank_model_type', water_heater_tank_model_type_choices, false)
1899
1930
  arg.setDisplayName('Water Heater: Tank Type')
1900
- arg.setDescription("Type of tank model to use. The '#{HPXML::WaterHeaterTankModelTypeStratified}' tank generally provide more accurate results, but may significantly increase run time. Applies only to #{HPXML::WaterHeaterTypeStorage}. If not provided, the OS-HPXML default is used.")
1931
+ arg.setDescription("Type of tank model to use. The '#{HPXML::WaterHeaterTankModelTypeStratified}' tank generally provide more accurate results, but may significantly increase run time. Applies only to #{HPXML::WaterHeaterTypeStorage}. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#conventional-storage'>Conventional Storage</a>) is used.")
1901
1932
  args << arg
1902
1933
 
1903
1934
  water_heater_operating_mode_choices = OpenStudio::StringVector.new
@@ -1906,7 +1937,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1906
1937
 
1907
1938
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_operating_mode', water_heater_operating_mode_choices, false)
1908
1939
  arg.setDisplayName('Water Heater: Operating Mode')
1909
- arg.setDescription("The water heater operating mode. The '#{HPXML::WaterHeaterOperatingModeHeatPumpOnly}' option only uses the heat pump, while '#{HPXML::WaterHeaterOperatingModeHybridAuto}' allows the backup electric resistance to come on in high demand situations. This is ignored if a scheduled operating mode type is selected. Applies only to #{HPXML::WaterHeaterTypeHeatPump}. If not provided, the OS-HPXML default is used.")
1940
+ arg.setDescription("The water heater operating mode. The '#{HPXML::WaterHeaterOperatingModeHeatPumpOnly}' option only uses the heat pump, while '#{HPXML::WaterHeaterOperatingModeHybridAuto}' allows the backup electric resistance to come on in high demand situations. This is ignored if a scheduled operating mode type is selected. Applies only to #{HPXML::WaterHeaterTypeHeatPump}. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#heat-pump'>Heat Pump</a>) is used.")
1910
1941
  args << arg
1911
1942
 
1912
1943
  hot_water_distribution_system_type_choices = OpenStudio::StringVector.new
@@ -1922,7 +1953,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1922
1953
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_standard_piping_length', false)
1923
1954
  arg.setDisplayName('Hot Water Distribution: Standard Piping Length')
1924
1955
  arg.setUnits('ft')
1925
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeStandard}, the length of the piping. If not provided, the OS-HPXML default is used.")
1956
+ arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeStandard}, the length of the piping. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#standard'>Standard</a>) is used.")
1926
1957
  args << arg
1927
1958
 
1928
1959
  recirculation_control_type_choices = OpenStudio::StringVector.new
@@ -1941,25 +1972,25 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1941
1972
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_recirc_piping_length', false)
1942
1973
  arg.setDisplayName('Hot Water Distribution: Recirculation Piping Length')
1943
1974
  arg.setUnits('ft')
1944
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the length of the recirculation piping. If not provided, the OS-HPXML default is used.")
1975
+ arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the length of the recirculation piping. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#recirculation'>Recirculation</a>) is used.")
1945
1976
  args << arg
1946
1977
 
1947
1978
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_recirc_branch_piping_length', false)
1948
1979
  arg.setDisplayName('Hot Water Distribution: Recirculation Branch Piping Length')
1949
1980
  arg.setUnits('ft')
1950
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the length of the recirculation branch piping. If not provided, the OS-HPXML default is used.")
1981
+ arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the length of the recirculation branch piping. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#recirculation'>Recirculation</a>) is used.")
1951
1982
  args << arg
1952
1983
 
1953
1984
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_recirc_pump_power', false)
1954
1985
  arg.setDisplayName('Hot Water Distribution: Recirculation Pump Power')
1955
1986
  arg.setUnits('W')
1956
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the recirculation pump power. If not provided, the OS-HPXML default is used.")
1987
+ arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the recirculation pump power. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#recirculation'>Recirculation</a>) is used.")
1957
1988
  args << arg
1958
1989
 
1959
1990
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_pipe_r', false)
1960
1991
  arg.setDisplayName('Hot Water Distribution: Pipe Insulation Nominal R-Value')
1961
1992
  arg.setUnits('h-ft^2-R/Btu')
1962
- arg.setDescription('Nominal R-value of the pipe insulation. If not provided, the OS-HPXML default is used.')
1993
+ arg.setDescription("Nominal R-value of the pipe insulation. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-hot-water-distribution'>HPXML Hot Water Distribution</a>) is used.")
1963
1994
  args << arg
1964
1995
 
1965
1996
  dwhr_facilities_connected_choices = OpenStudio::StringVector.new
@@ -2000,7 +2031,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2000
2031
 
2001
2032
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_fixtures_usage_multiplier', false)
2002
2033
  arg.setDisplayName('Hot Water Fixtures: Usage Multiplier')
2003
- arg.setDescription('Multiplier on the hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2034
+ arg.setDescription("Multiplier on the hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-water-fixtures'>HPXML Water Fixtures</a>) is used.")
2004
2035
  args << arg
2005
2036
 
2006
2037
  solar_thermal_system_type_choices = OpenStudio::StringVector.new
@@ -2074,7 +2105,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2074
2105
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('solar_thermal_storage_volume', false)
2075
2106
  arg.setDisplayName('Solar Thermal: Storage Volume')
2076
2107
  arg.setUnits('gal')
2077
- arg.setDescription('The storage volume of the solar thermal system. If not provided, the OS-HPXML default is used.')
2108
+ arg.setDescription("The storage volume of the solar thermal system. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#detailed-inputs'>Detailed Inputs</a>) is used.")
2078
2109
  args << arg
2079
2110
 
2080
2111
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('solar_thermal_solar_fraction', true)
@@ -2107,17 +2138,17 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2107
2138
 
2108
2139
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_module_type', pv_system_module_type_choices, false)
2109
2140
  arg.setDisplayName('PV System: Module Type')
2110
- arg.setDescription('Module type of the PV system. If not provided, the OS-HPXML default is used.')
2141
+ arg.setDescription("Module type of the PV system. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.")
2111
2142
  args << arg
2112
2143
 
2113
2144
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_location', pv_system_location_choices, false)
2114
2145
  arg.setDisplayName('PV System: Location')
2115
- arg.setDescription('Location of the PV system. If not provided, the OS-HPXML default is used.')
2146
+ arg.setDescription("Location of the PV system. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.")
2116
2147
  args << arg
2117
2148
 
2118
2149
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_tracking', pv_system_tracking_choices, false)
2119
2150
  arg.setDisplayName('PV System: Tracking')
2120
- arg.setDescription('Type of tracking for the PV system. If not provided, the OS-HPXML default is used.')
2151
+ arg.setDescription("Type of tracking for the PV system. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.")
2121
2152
  args << arg
2122
2153
 
2123
2154
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_array_azimuth', true)
@@ -2144,13 +2175,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2144
2175
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_inverter_efficiency', false)
2145
2176
  arg.setDisplayName('PV System: Inverter Efficiency')
2146
2177
  arg.setUnits('Frac')
2147
- arg.setDescription('Inverter efficiency of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default is used.')
2178
+ arg.setDescription("Inverter efficiency of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.")
2148
2179
  args << arg
2149
2180
 
2150
2181
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_system_losses_fraction', false)
2151
2182
  arg.setDisplayName('PV System: System Losses Fraction')
2152
2183
  arg.setUnits('Frac')
2153
- arg.setDescription('System losses fraction of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default is used.')
2184
+ arg.setDescription("System losses fraction of the PV system. If there are two PV systems, this will apply to both. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.")
2154
2185
  args << arg
2155
2186
 
2156
2187
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('pv_system_num_bedrooms_served', false)
@@ -2167,17 +2198,17 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2167
2198
 
2168
2199
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_module_type', pv_system_module_type_choices, false)
2169
2200
  arg.setDisplayName('PV System 2: Module Type')
2170
- arg.setDescription('Module type of the second PV system. If not provided, the OS-HPXML default is used.')
2201
+ arg.setDescription("Module type of the second PV system. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.")
2171
2202
  args << arg
2172
2203
 
2173
2204
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_location', pv_system_location_choices, false)
2174
2205
  arg.setDisplayName('PV System 2: Location')
2175
- arg.setDescription('Location of the second PV system. If not provided, the OS-HPXML default is used.')
2206
+ arg.setDescription("Location of the second PV system. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.")
2176
2207
  args << arg
2177
2208
 
2178
2209
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_tracking', pv_system_tracking_choices, false)
2179
2210
  arg.setDisplayName('PV System 2: Tracking')
2180
- arg.setDescription('Type of tracking for the second PV system. If not provided, the OS-HPXML default is used.')
2211
+ arg.setDescription("Type of tracking for the second PV system. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-photovoltaics'>HPXML Photovoltaics</a>) is used.")
2181
2212
  args << arg
2182
2213
 
2183
2214
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_2_array_azimuth', true)
@@ -2202,12 +2233,14 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2202
2233
  args << arg
2203
2234
 
2204
2235
  battery_location_choices = OpenStudio::StringVector.new
2205
- battery_location_choices << HPXML::LocationLivingSpace
2236
+ battery_location_choices << HPXML::LocationConditionedSpace
2206
2237
  battery_location_choices << HPXML::LocationBasementConditioned
2207
2238
  battery_location_choices << HPXML::LocationBasementUnconditioned
2239
+ battery_location_choices << HPXML::LocationCrawlspace
2208
2240
  battery_location_choices << HPXML::LocationCrawlspaceVented
2209
2241
  battery_location_choices << HPXML::LocationCrawlspaceUnvented
2210
2242
  battery_location_choices << HPXML::LocationCrawlspaceConditioned
2243
+ battery_location_choices << HPXML::LocationAttic
2211
2244
  battery_location_choices << HPXML::LocationAtticVented
2212
2245
  battery_location_choices << HPXML::LocationAtticUnvented
2213
2246
  battery_location_choices << HPXML::LocationGarage
@@ -2221,30 +2254,30 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2221
2254
 
2222
2255
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('battery_location', battery_location_choices, false)
2223
2256
  arg.setDisplayName('Battery: Location')
2224
- arg.setDescription('The space type for the lithium ion battery location. If not provided, the OS-HPXML default is used.')
2257
+ arg.setDescription("The space type for the lithium ion battery location. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-batteries'>HPXML Batteries</a>) is used.")
2225
2258
  args << arg
2226
2259
 
2227
2260
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_power', false)
2228
2261
  arg.setDisplayName('Battery: Rated Power Output')
2229
- arg.setDescription('The rated power output of the lithium ion battery. If not provided, the OS-HPXML default is used.')
2262
+ arg.setDescription("The rated power output of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-batteries'>HPXML Batteries</a>) is used.")
2230
2263
  arg.setUnits('W')
2231
2264
  args << arg
2232
2265
 
2233
2266
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_capacity', false)
2234
2267
  arg.setDisplayName('Battery: Nominal Capacity')
2235
- arg.setDescription('The nominal capacity of the lithium ion battery. If not provided, the OS-HPXML default is used.')
2268
+ arg.setDescription("The nominal capacity of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-batteries'>HPXML Batteries</a>) is used.")
2236
2269
  arg.setUnits('kWh')
2237
2270
  args << arg
2238
2271
 
2239
2272
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_usable_capacity', false)
2240
2273
  arg.setDisplayName('Battery: Usable Capacity')
2241
- arg.setDescription('The usable capacity of the lithium ion battery. If not provided, the OS-HPXML default is used.')
2274
+ arg.setDescription("The usable capacity of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-batteries'>HPXML Batteries</a>) is used.")
2242
2275
  arg.setUnits('kWh')
2243
2276
  args << arg
2244
2277
 
2245
2278
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_round_trip_efficiency', false)
2246
2279
  arg.setDisplayName('Battery: Round Trip Efficiency')
2247
- arg.setDescription('The round trip efficiency of the lithium ion battery. If not provided, the OS-HPXML default is used.')
2280
+ arg.setDescription("The round trip efficiency of the lithium ion battery. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-batteries'>HPXML Batteries</a>) is used.")
2248
2281
  arg.setUnits('Frac')
2249
2282
  args << arg
2250
2283
 
@@ -2274,7 +2307,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2274
2307
 
2275
2308
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_interior_usage_multiplier', false)
2276
2309
  arg.setDisplayName('Lighting: Interior Usage Multiplier')
2277
- arg.setDescription('Multiplier on the lighting energy usage (interior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2310
+ arg.setDescription("Multiplier on the lighting energy usage (interior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-lighting'>HPXML Lighting</a>) is used.")
2278
2311
  args << arg
2279
2312
 
2280
2313
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_exterior_fraction_cfl', true)
@@ -2297,7 +2330,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2297
2330
 
2298
2331
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_exterior_usage_multiplier', false)
2299
2332
  arg.setDisplayName('Lighting: Exterior Usage Multiplier')
2300
- arg.setDescription('Multiplier on the lighting energy usage (exterior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2333
+ arg.setDescription("Multiplier on the lighting energy usage (exterior) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-lighting'>HPXML Lighting</a>) is used.")
2301
2334
  args << arg
2302
2335
 
2303
2336
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_garage_fraction_cfl', true)
@@ -2320,7 +2353,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2320
2353
 
2321
2354
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_garage_usage_multiplier', false)
2322
2355
  arg.setDisplayName('Lighting: Garage Usage Multiplier')
2323
- arg.setDescription('Multiplier on the lighting energy usage (garage) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2356
+ arg.setDescription("Multiplier on the lighting energy usage (garage) that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-lighting'>HPXML Lighting</a>) is used.")
2324
2357
  args << arg
2325
2358
 
2326
2359
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('holiday_lighting_present', true)
@@ -2332,12 +2365,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2332
2365
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('holiday_lighting_daily_kwh', false)
2333
2366
  arg.setDisplayName('Holiday Lighting: Daily Consumption')
2334
2367
  arg.setUnits('kWh/day')
2335
- arg.setDescription('The daily energy consumption for holiday lighting (exterior). If not provided, the OS-HPXML default is used.')
2368
+ arg.setDescription("The daily energy consumption for holiday lighting (exterior). If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-lighting'>HPXML Lighting</a>) is used.")
2336
2369
  args << arg
2337
2370
 
2338
2371
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('holiday_lighting_period', false)
2339
2372
  arg.setDisplayName('Holiday Lighting: Period')
2340
- arg.setDescription('Enter a date like "Nov 25 - Jan 5". If not provided, the OS-HPXML default is used.')
2373
+ arg.setDescription("Enter a date like 'Nov 25 - Jan 5'. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-lighting'>HPXML Lighting</a>) is used.")
2341
2374
  args << arg
2342
2375
 
2343
2376
  dehumidifier_type_choices = OpenStudio::StringVector.new
@@ -2390,7 +2423,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2390
2423
  args << arg
2391
2424
 
2392
2425
  appliance_location_choices = OpenStudio::StringVector.new
2393
- appliance_location_choices << HPXML::LocationLivingSpace
2426
+ appliance_location_choices << HPXML::LocationConditionedSpace
2394
2427
  appliance_location_choices << HPXML::LocationBasementConditioned
2395
2428
  appliance_location_choices << HPXML::LocationBasementUnconditioned
2396
2429
  appliance_location_choices << HPXML::LocationGarage
@@ -2411,7 +2444,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2411
2444
 
2412
2445
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_washer_location', appliance_location_choices, false)
2413
2446
  arg.setDisplayName('Clothes Washer: Location')
2414
- arg.setDescription('The space type for the clothes washer location. If not provided, the OS-HPXML default is used.')
2447
+ arg.setDescription("The space type for the clothes washer location. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.")
2415
2448
  args << arg
2416
2449
 
2417
2450
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_washer_efficiency_type', clothes_washer_efficiency_type_choices, true)
@@ -2423,48 +2456,48 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2423
2456
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_efficiency', false)
2424
2457
  arg.setDisplayName('Clothes Washer: Efficiency')
2425
2458
  arg.setUnits('ft^3/kWh-cyc')
2426
- arg.setDescription('The efficiency of the clothes washer. If not provided, the OS-HPXML default is used.')
2459
+ arg.setDescription("The efficiency of the clothes washer. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.")
2427
2460
  args << arg
2428
2461
 
2429
2462
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_rated_annual_kwh', false)
2430
2463
  arg.setDisplayName('Clothes Washer: Rated Annual Consumption')
2431
2464
  arg.setUnits('kWh/yr')
2432
- arg.setDescription('The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.')
2465
+ arg.setDescription("The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.")
2433
2466
  args << arg
2434
2467
 
2435
2468
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_electric_rate', false)
2436
2469
  arg.setDisplayName('Clothes Washer: Label Electric Rate')
2437
2470
  arg.setUnits('$/kWh')
2438
- arg.setDescription('The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.')
2471
+ arg.setDescription("The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.")
2439
2472
  args << arg
2440
2473
 
2441
2474
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_gas_rate', false)
2442
2475
  arg.setDisplayName('Clothes Washer: Label Gas Rate')
2443
2476
  arg.setUnits('$/therm')
2444
- arg.setDescription('The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default is used.')
2477
+ arg.setDescription("The annual energy consumed by the clothes washer, as rated, obtained from the EnergyGuide label. This includes both the appliance electricity consumption and the energy required for water heating. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.")
2445
2478
  args << arg
2446
2479
 
2447
2480
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_annual_gas_cost', false)
2448
2481
  arg.setDisplayName('Clothes Washer: Label Annual Cost with Gas DHW')
2449
2482
  arg.setUnits('$')
2450
- arg.setDescription('The annual cost of using the system under test conditions. Input is obtained from the EnergyGuide label. If not provided, the OS-HPXML default is used.')
2483
+ arg.setDescription("The annual cost of using the system under test conditions. Input is obtained from the EnergyGuide label. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.")
2451
2484
  args << arg
2452
2485
 
2453
2486
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_usage', false)
2454
2487
  arg.setDisplayName('Clothes Washer: Label Usage')
2455
2488
  arg.setUnits('cyc/wk')
2456
- arg.setDescription('The clothes washer loads per week. If not provided, the OS-HPXML default is used.')
2489
+ arg.setDescription("The clothes washer loads per week. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.")
2457
2490
  args << arg
2458
2491
 
2459
2492
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_capacity', false)
2460
2493
  arg.setDisplayName('Clothes Washer: Drum Volume')
2461
2494
  arg.setUnits('ft^3')
2462
- arg.setDescription("Volume of the washer drum. Obtained from the EnergyStar website or the manufacturer's literature. If not provided, the OS-HPXML default is used.")
2495
+ arg.setDescription("Volume of the washer drum. Obtained from the EnergyStar website or the manufacturer's literature. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.")
2463
2496
  args << arg
2464
2497
 
2465
2498
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_usage_multiplier', false)
2466
2499
  arg.setDisplayName('Clothes Washer: Usage Multiplier')
2467
- arg.setDescription('Multiplier on the clothes washer energy and hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2500
+ arg.setDescription("Multiplier on the clothes washer energy and hot water usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-washer'>HPXML Clothes Washer</a>) is used.")
2468
2501
  args << arg
2469
2502
 
2470
2503
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('clothes_dryer_present', true)
@@ -2475,7 +2508,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2475
2508
 
2476
2509
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_dryer_location', appliance_location_choices, false)
2477
2510
  arg.setDisplayName('Clothes Dryer: Location')
2478
- arg.setDescription('The space type for the clothes dryer location. If not provided, the OS-HPXML default is used.')
2511
+ arg.setDescription("The space type for the clothes dryer location. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.")
2479
2512
  args << arg
2480
2513
 
2481
2514
  clothes_dryer_fuel_choices = OpenStudio::StringVector.new
@@ -2505,18 +2538,18 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2505
2538
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_dryer_efficiency', false)
2506
2539
  arg.setDisplayName('Clothes Dryer: Efficiency')
2507
2540
  arg.setUnits('lb/kWh')
2508
- arg.setDescription('The efficiency of the clothes dryer. If not provided, the OS-HPXML default is used.')
2541
+ arg.setDescription("The efficiency of the clothes dryer. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.")
2509
2542
  args << arg
2510
2543
 
2511
2544
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_dryer_vented_flow_rate', false)
2512
2545
  arg.setDisplayName('Clothes Dryer: Vented Flow Rate')
2513
- arg.setDescription('The exhaust flow rate of the vented clothes dryer. If not provided, the OS-HPXML default is used.')
2546
+ arg.setDescription("The exhaust flow rate of the vented clothes dryer. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.")
2514
2547
  arg.setUnits('CFM')
2515
2548
  args << arg
2516
2549
 
2517
2550
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_dryer_usage_multiplier', false)
2518
2551
  arg.setDisplayName('Clothes Dryer: Usage Multiplier')
2519
- arg.setDescription('Multiplier on the clothes dryer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2552
+ arg.setDescription("Multiplier on the clothes dryer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-clothes-dryer'>HPXML Clothes Dryer</a>) is used.")
2520
2553
  args << arg
2521
2554
 
2522
2555
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('dishwasher_present', true)
@@ -2527,7 +2560,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2527
2560
 
2528
2561
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('dishwasher_location', appliance_location_choices, false)
2529
2562
  arg.setDisplayName('Dishwasher: Location')
2530
- arg.setDescription('The space type for the dishwasher location. If not provided, the OS-HPXML default is used.')
2563
+ arg.setDescription("The space type for the dishwasher location. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.")
2531
2564
  args << arg
2532
2565
 
2533
2566
  dishwasher_efficiency_type_choices = OpenStudio::StringVector.new
@@ -2543,42 +2576,42 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2543
2576
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_efficiency', false)
2544
2577
  arg.setDisplayName('Dishwasher: Efficiency')
2545
2578
  arg.setUnits('RatedAnnualkWh or EnergyFactor')
2546
- arg.setDescription('The efficiency of the dishwasher. If not provided, the OS-HPXML default is used.')
2579
+ arg.setDescription("The efficiency of the dishwasher. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.")
2547
2580
  args << arg
2548
2581
 
2549
2582
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_electric_rate', false)
2550
2583
  arg.setDisplayName('Dishwasher: Label Electric Rate')
2551
2584
  arg.setUnits('$/kWh')
2552
- arg.setDescription('The label electric rate of the dishwasher. If not provided, the OS-HPXML default is used.')
2585
+ arg.setDescription("The label electric rate of the dishwasher. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.")
2553
2586
  args << arg
2554
2587
 
2555
2588
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_gas_rate', false)
2556
2589
  arg.setDisplayName('Dishwasher: Label Gas Rate')
2557
2590
  arg.setUnits('$/therm')
2558
- arg.setDescription('The label gas rate of the dishwasher. If not provided, the OS-HPXML default is used.')
2591
+ arg.setDescription("The label gas rate of the dishwasher. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.")
2559
2592
  args << arg
2560
2593
 
2561
2594
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_annual_gas_cost', false)
2562
2595
  arg.setDisplayName('Dishwasher: Label Annual Gas Cost')
2563
2596
  arg.setUnits('$')
2564
- arg.setDescription('The label annual gas cost of the dishwasher. If not provided, the OS-HPXML default is used.')
2597
+ arg.setDescription("The label annual gas cost of the dishwasher. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.")
2565
2598
  args << arg
2566
2599
 
2567
2600
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_usage', false)
2568
2601
  arg.setDisplayName('Dishwasher: Label Usage')
2569
2602
  arg.setUnits('cyc/wk')
2570
- arg.setDescription('The dishwasher loads per week. If not provided, the OS-HPXML default is used.')
2603
+ arg.setDescription("The dishwasher loads per week. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.")
2571
2604
  args << arg
2572
2605
 
2573
2606
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('dishwasher_place_setting_capacity', false)
2574
2607
  arg.setDisplayName('Dishwasher: Number of Place Settings')
2575
2608
  arg.setUnits('#')
2576
- arg.setDescription("The number of place settings for the unit. Data obtained from manufacturer's literature. If not provided, the OS-HPXML default is used.")
2609
+ arg.setDescription("The number of place settings for the unit. Data obtained from manufacturer's literature. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.")
2577
2610
  args << arg
2578
2611
 
2579
2612
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_usage_multiplier', false)
2580
2613
  arg.setDisplayName('Dishwasher: Usage Multiplier')
2581
- arg.setDescription('Multiplier on the dishwasher energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2614
+ arg.setDescription("Multiplier on the dishwasher energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-dishwasher'>HPXML Dishwasher</a>) is used.")
2582
2615
  args << arg
2583
2616
 
2584
2617
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('refrigerator_present', true)
@@ -2589,18 +2622,18 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2589
2622
 
2590
2623
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('refrigerator_location', appliance_location_choices, false)
2591
2624
  arg.setDisplayName('Refrigerator: Location')
2592
- arg.setDescription('The space type for the refrigerator location. If not provided, the OS-HPXML default is used.')
2625
+ arg.setDescription("The space type for the refrigerator location. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.")
2593
2626
  args << arg
2594
2627
 
2595
2628
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('refrigerator_rated_annual_kwh', false)
2596
2629
  arg.setDisplayName('Refrigerator: Rated Annual Consumption')
2597
2630
  arg.setUnits('kWh/yr')
2598
- arg.setDescription('The EnergyGuide rated annual energy consumption for a refrigerator. If not provided, the OS-HPXML default is used.')
2631
+ arg.setDescription("The EnergyGuide rated annual energy consumption for a refrigerator. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.")
2599
2632
  args << arg
2600
2633
 
2601
2634
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('refrigerator_usage_multiplier', false)
2602
2635
  arg.setDisplayName('Refrigerator: Usage Multiplier')
2603
- arg.setDescription('Multiplier on the refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2636
+ arg.setDescription("Multiplier on the refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.")
2604
2637
  args << arg
2605
2638
 
2606
2639
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('extra_refrigerator_present', true)
@@ -2611,18 +2644,18 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2611
2644
 
2612
2645
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('extra_refrigerator_location', appliance_location_choices, false)
2613
2646
  arg.setDisplayName('Extra Refrigerator: Location')
2614
- arg.setDescription('The space type for the extra refrigerator location. If not provided, the OS-HPXML default is used.')
2647
+ arg.setDescription("The space type for the extra refrigerator location. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.")
2615
2648
  args << arg
2616
2649
 
2617
2650
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('extra_refrigerator_rated_annual_kwh', false)
2618
2651
  arg.setDisplayName('Extra Refrigerator: Rated Annual Consumption')
2619
2652
  arg.setUnits('kWh/yr')
2620
- arg.setDescription('The EnergyGuide rated annual energy consumption for an extra rrefrigerator. If not provided, the OS-HPXML default is used.')
2653
+ arg.setDescription("The EnergyGuide rated annual energy consumption for an extra rrefrigerator. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.")
2621
2654
  args << arg
2622
2655
 
2623
2656
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('extra_refrigerator_usage_multiplier', false)
2624
2657
  arg.setDisplayName('Extra Refrigerator: Usage Multiplier')
2625
- arg.setDescription('Multiplier on the extra refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2658
+ arg.setDescription("Multiplier on the extra refrigerator energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-refrigerators'>HPXML Refrigerators</a>) is used.")
2626
2659
  args << arg
2627
2660
 
2628
2661
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('freezer_present', true)
@@ -2633,18 +2666,18 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2633
2666
 
2634
2667
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('freezer_location', appliance_location_choices, false)
2635
2668
  arg.setDisplayName('Freezer: Location')
2636
- arg.setDescription('The space type for the freezer location. If not provided, the OS-HPXML default is used.')
2669
+ arg.setDescription("The space type for the freezer location. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-freezers'>HPXML Freezers</a>) is used.")
2637
2670
  args << arg
2638
2671
 
2639
2672
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('freezer_rated_annual_kwh', false)
2640
2673
  arg.setDisplayName('Freezer: Rated Annual Consumption')
2641
2674
  arg.setUnits('kWh/yr')
2642
- arg.setDescription('The EnergyGuide rated annual energy consumption for a freezer. If not provided, the OS-HPXML default is used.')
2675
+ arg.setDescription("The EnergyGuide rated annual energy consumption for a freezer. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-freezers'>HPXML Freezers</a>) is used.")
2643
2676
  args << arg
2644
2677
 
2645
2678
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('freezer_usage_multiplier', false)
2646
2679
  arg.setDisplayName('Freezer: Usage Multiplier')
2647
- arg.setDescription('Multiplier on the freezer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2680
+ arg.setDescription("Multiplier on the freezer energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-freezers'>HPXML Freezers</a>) is used.")
2648
2681
  args << arg
2649
2682
 
2650
2683
  cooking_range_oven_fuel_choices = OpenStudio::StringVector.new
@@ -2663,7 +2696,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2663
2696
 
2664
2697
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooking_range_oven_location', appliance_location_choices, false)
2665
2698
  arg.setDisplayName('Cooking Range/Oven: Location')
2666
- arg.setDescription('The space type for the cooking range/oven location. If not provided, the OS-HPXML default is used.')
2699
+ arg.setDescription("The space type for the cooking range/oven location. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.")
2667
2700
  args << arg
2668
2701
 
2669
2702
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooking_range_oven_fuel_type', cooking_range_oven_fuel_choices, true)
@@ -2674,17 +2707,17 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2674
2707
 
2675
2708
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('cooking_range_oven_is_induction', false)
2676
2709
  arg.setDisplayName('Cooking Range/Oven: Is Induction')
2677
- arg.setDescription('Whether the cooking range is induction. If not provided, the OS-HPXML default is used.')
2710
+ arg.setDescription("Whether the cooking range is induction. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.")
2678
2711
  args << arg
2679
2712
 
2680
2713
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('cooking_range_oven_is_convection', false)
2681
2714
  arg.setDisplayName('Cooking Range/Oven: Is Convection')
2682
- arg.setDescription('Whether the oven is convection. If not provided, the OS-HPXML default is used.')
2715
+ arg.setDescription("Whether the oven is convection. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.")
2683
2716
  args << arg
2684
2717
 
2685
2718
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooking_range_oven_usage_multiplier', false)
2686
2719
  arg.setDisplayName('Cooking Range/Oven: Usage Multiplier')
2687
- arg.setDescription('Multiplier on the cooking range/oven energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2720
+ arg.setDescription("Multiplier on the cooking range/oven energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-cooking-range-oven'>HPXML Cooking Range/Oven</a>) is used.")
2688
2721
  args << arg
2689
2722
 
2690
2723
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('ceiling_fan_present', true)
@@ -2696,19 +2729,19 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2696
2729
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_fan_efficiency', false)
2697
2730
  arg.setDisplayName('Ceiling Fan: Efficiency')
2698
2731
  arg.setUnits('CFM/W')
2699
- arg.setDescription('The efficiency rating of the ceiling fan(s) at medium speed. If not provided, the OS-HPXML default is used.')
2732
+ arg.setDescription("The efficiency rating of the ceiling fan(s) at medium speed. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-ceiling-fans'>HPXML Ceiling Fans</a>) is used.")
2700
2733
  args << arg
2701
2734
 
2702
2735
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('ceiling_fan_quantity', false)
2703
2736
  arg.setDisplayName('Ceiling Fan: Quantity')
2704
2737
  arg.setUnits('#')
2705
- arg.setDescription('Total number of ceiling fans. If not provided, the OS-HPXML default is used.')
2738
+ arg.setDescription("Total number of ceiling fans. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-ceiling-fans'>HPXML Ceiling Fans</a>) is used.")
2706
2739
  args << arg
2707
2740
 
2708
2741
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_fan_cooling_setpoint_temp_offset', false)
2709
2742
  arg.setDisplayName('Ceiling Fan: Cooling Setpoint Temperature Offset')
2710
2743
  arg.setUnits('deg-F')
2711
- arg.setDescription('The cooling setpoint temperature offset during months when the ceiling fans are operating. Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default is used.')
2744
+ arg.setDescription("The cooling setpoint temperature offset during months when the ceiling fans are operating. Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-ceiling-fans'>HPXML Ceiling Fans</a>) is used.")
2712
2745
  args << arg
2713
2746
 
2714
2747
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_plug_loads_television_present', true)
@@ -2719,36 +2752,36 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2719
2752
 
2720
2753
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_television_annual_kwh', false)
2721
2754
  arg.setDisplayName('Misc Plug Loads: Television Annual kWh')
2722
- arg.setDescription('The annual energy consumption of the television plug loads. If not provided, the OS-HPXML default is used.')
2755
+ arg.setDescription("The annual energy consumption of the television plug loads. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.")
2723
2756
  arg.setUnits('kWh/yr')
2724
2757
  args << arg
2725
2758
 
2726
2759
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_television_usage_multiplier', false)
2727
2760
  arg.setDisplayName('Misc Plug Loads: Television Usage Multiplier')
2728
- arg.setDescription('Multiplier on the television energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2761
+ arg.setDescription("Multiplier on the television energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.")
2729
2762
  args << arg
2730
2763
 
2731
2764
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_annual_kwh', false)
2732
2765
  arg.setDisplayName('Misc Plug Loads: Other Annual kWh')
2733
- arg.setDescription('The annual energy consumption of the other residual plug loads. If not provided, the OS-HPXML default is used.')
2766
+ arg.setDescription("The annual energy consumption of the other residual plug loads. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.")
2734
2767
  arg.setUnits('kWh/yr')
2735
2768
  args << arg
2736
2769
 
2737
2770
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_frac_sensible', false)
2738
2771
  arg.setDisplayName('Misc Plug Loads: Other Sensible Fraction')
2739
- arg.setDescription("Fraction of other residual plug loads' internal gains that are sensible. If not provided, the OS-HPXML default is used.")
2772
+ arg.setDescription("Fraction of other residual plug loads' internal gains that are sensible. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.")
2740
2773
  arg.setUnits('Frac')
2741
2774
  args << arg
2742
2775
 
2743
2776
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_frac_latent', false)
2744
2777
  arg.setDisplayName('Misc Plug Loads: Other Latent Fraction')
2745
- arg.setDescription("Fraction of other residual plug loads' internal gains that are latent. If not provided, the OS-HPXML default is used.")
2778
+ arg.setDescription("Fraction of other residual plug loads' internal gains that are latent. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.")
2746
2779
  arg.setUnits('Frac')
2747
2780
  args << arg
2748
2781
 
2749
2782
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_usage_multiplier', false)
2750
2783
  arg.setDisplayName('Misc Plug Loads: Other Usage Multiplier')
2751
- arg.setDescription('Multiplier on the other energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2784
+ arg.setDescription("Multiplier on the other energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.")
2752
2785
  args << arg
2753
2786
 
2754
2787
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_plug_loads_well_pump_present', true)
@@ -2759,13 +2792,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2759
2792
 
2760
2793
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_well_pump_annual_kwh', false)
2761
2794
  arg.setDisplayName('Misc Plug Loads: Well Pump Annual kWh')
2762
- arg.setDescription('The annual energy consumption of the well pump plug loads. If not provided, the OS-HPXML default is used.')
2795
+ arg.setDescription("The annual energy consumption of the well pump plug loads. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.")
2763
2796
  arg.setUnits('kWh/yr')
2764
2797
  args << arg
2765
2798
 
2766
2799
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_well_pump_usage_multiplier', false)
2767
2800
  arg.setDisplayName('Misc Plug Loads: Well Pump Usage Multiplier')
2768
- arg.setDescription('Multiplier on the well pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2801
+ arg.setDescription("Multiplier on the well pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.")
2769
2802
  args << arg
2770
2803
 
2771
2804
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_plug_loads_vehicle_present', true)
@@ -2776,13 +2809,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2776
2809
 
2777
2810
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_vehicle_annual_kwh', false)
2778
2811
  arg.setDisplayName('Misc Plug Loads: Vehicle Annual kWh')
2779
- arg.setDescription('The annual energy consumption of the electric vehicle plug loads. If not provided, the OS-HPXML default is used.')
2812
+ arg.setDescription("The annual energy consumption of the electric vehicle plug loads. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.")
2780
2813
  arg.setUnits('kWh/yr')
2781
2814
  args << arg
2782
2815
 
2783
2816
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_vehicle_usage_multiplier', false)
2784
2817
  arg.setDisplayName('Misc Plug Loads: Vehicle Usage Multiplier')
2785
- arg.setDescription('Multiplier on the electric vehicle energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2818
+ arg.setDescription("Multiplier on the electric vehicle energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-plug-loads'>HPXML Plug Loads</a>) is used.")
2786
2819
  args << arg
2787
2820
 
2788
2821
  misc_fuel_loads_fuel_choices = OpenStudio::StringVector.new
@@ -2806,13 +2839,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2806
2839
 
2807
2840
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_grill_annual_therm', false)
2808
2841
  arg.setDisplayName('Misc Fuel Loads: Grill Annual therm')
2809
- arg.setDescription('The annual energy consumption of the fuel loads grill. If not provided, the OS-HPXML default is used.')
2842
+ arg.setDescription("The annual energy consumption of the fuel loads grill. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.")
2810
2843
  arg.setUnits('therm/yr')
2811
2844
  args << arg
2812
2845
 
2813
2846
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_grill_usage_multiplier', false)
2814
2847
  arg.setDisplayName('Misc Fuel Loads: Grill Usage Multiplier')
2815
- arg.setDescription('Multiplier on the fuel loads grill energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2848
+ arg.setDescription("Multiplier on the fuel loads grill energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.")
2816
2849
  args << arg
2817
2850
 
2818
2851
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_fuel_loads_lighting_present', true)
@@ -2829,13 +2862,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2829
2862
 
2830
2863
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_lighting_annual_therm', false)
2831
2864
  arg.setDisplayName('Misc Fuel Loads: Lighting Annual therm')
2832
- arg.setDescription('The annual energy consumption of the fuel loads lighting. If not provided, the OS-HPXML default is used.')
2865
+ arg.setDescription("The annual energy consumption of the fuel loads lighting. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-fuel-loads'>HPXML Fuel Loads</a>)is used.")
2833
2866
  arg.setUnits('therm/yr')
2834
2867
  args << arg
2835
2868
 
2836
2869
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_lighting_usage_multiplier', false)
2837
2870
  arg.setDisplayName('Misc Fuel Loads: Lighting Usage Multiplier')
2838
- arg.setDescription('Multiplier on the fuel loads lighting energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2871
+ arg.setDescription("Multiplier on the fuel loads lighting energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.")
2839
2872
  args << arg
2840
2873
 
2841
2874
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_fuel_loads_fireplace_present', true)
@@ -2852,25 +2885,25 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2852
2885
 
2853
2886
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_annual_therm', false)
2854
2887
  arg.setDisplayName('Misc Fuel Loads: Fireplace Annual therm')
2855
- arg.setDescription('The annual energy consumption of the fuel loads fireplace. If not provided, the OS-HPXML default is used.')
2888
+ arg.setDescription("The annual energy consumption of the fuel loads fireplace. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.")
2856
2889
  arg.setUnits('therm/yr')
2857
2890
  args << arg
2858
2891
 
2859
2892
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_frac_sensible', false)
2860
2893
  arg.setDisplayName('Misc Fuel Loads: Fireplace Sensible Fraction')
2861
- arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are sensible. If not provided, the OS-HPXML default is used.")
2894
+ arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are sensible. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.")
2862
2895
  arg.setUnits('Frac')
2863
2896
  args << arg
2864
2897
 
2865
2898
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_frac_latent', false)
2866
2899
  arg.setDisplayName('Misc Fuel Loads: Fireplace Latent Fraction')
2867
- arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are latent. If not provided, the OS-HPXML default is used.")
2900
+ arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are latent. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.")
2868
2901
  arg.setUnits('Frac')
2869
2902
  args << arg
2870
2903
 
2871
2904
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_usage_multiplier', false)
2872
2905
  arg.setDisplayName('Misc Fuel Loads: Fireplace Usage Multiplier')
2873
- arg.setDescription('Multiplier on the fuel loads fireplace energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2906
+ arg.setDescription("Multiplier on the fuel loads fireplace energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-fuel-loads'>HPXML Fuel Loads</a>) is used.")
2874
2907
  args << arg
2875
2908
 
2876
2909
  heater_type_choices = OpenStudio::StringVector.new
@@ -2887,13 +2920,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2887
2920
 
2888
2921
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_pump_annual_kwh', false)
2889
2922
  arg.setDisplayName('Pool: Pump Annual kWh')
2890
- arg.setDescription('The annual energy consumption of the pool pump. If not provided, the OS-HPXML default is used.')
2923
+ arg.setDescription("The annual energy consumption of the pool pump. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#pool-pump'>Pool Pump</a>) is used.")
2891
2924
  arg.setUnits('kWh/yr')
2892
2925
  args << arg
2893
2926
 
2894
2927
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_pump_usage_multiplier', false)
2895
2928
  arg.setDisplayName('Pool: Pump Usage Multiplier')
2896
- arg.setDescription('Multiplier on the pool pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2929
+ arg.setDescription("Multiplier on the pool pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#pool-pump'>Pool Pump</a>) is used.")
2897
2930
  args << arg
2898
2931
 
2899
2932
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pool_heater_type', heater_type_choices, true)
@@ -2904,59 +2937,59 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2904
2937
 
2905
2938
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_heater_annual_kwh', false)
2906
2939
  arg.setDisplayName('Pool: Heater Annual kWh')
2907
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} pool heater. If not provided, the OS-HPXML default is used.")
2940
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} pool heater. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#pool-heater'>Pool Heater</a>) is used.")
2908
2941
  arg.setUnits('kWh/yr')
2909
2942
  args << arg
2910
2943
 
2911
2944
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_heater_annual_therm', false)
2912
2945
  arg.setDisplayName('Pool: Heater Annual therm')
2913
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} pool heater. If not provided, the OS-HPXML default is used.")
2946
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} pool heater. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#pool-heater'>Pool Heater</a>) is used.")
2914
2947
  arg.setUnits('therm/yr')
2915
2948
  args << arg
2916
2949
 
2917
2950
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_heater_usage_multiplier', false)
2918
2951
  arg.setDisplayName('Pool: Heater Usage Multiplier')
2919
- arg.setDescription('Multiplier on the pool heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2952
+ arg.setDescription("Multiplier on the pool heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#pool-heater'>Pool Heater</a>) is used.")
2920
2953
  args << arg
2921
2954
 
2922
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('hot_tub_present', true)
2923
- arg.setDisplayName('Hot Tub: Present')
2924
- arg.setDescription('Whether there is a hot tub.')
2955
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('permanent_spa_present', true)
2956
+ arg.setDisplayName('Permanent Spa: Present')
2957
+ arg.setDescription('Whether there is a permanent spa.')
2925
2958
  arg.setDefaultValue(false)
2926
2959
  args << arg
2927
2960
 
2928
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_pump_annual_kwh', false)
2929
- arg.setDisplayName('Hot Tub: Pump Annual kWh')
2930
- arg.setDescription('The annual energy consumption of the hot tub pump. If not provided, the OS-HPXML default is used.')
2961
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_pump_annual_kwh', false)
2962
+ arg.setDisplayName('Permanent Spa: Pump Annual kWh')
2963
+ arg.setDescription("The annual energy consumption of the permanent spa pump. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#permanent-spa-pump'>Permanent Spa Pump</a>) is used.")
2931
2964
  arg.setUnits('kWh/yr')
2932
2965
  args << arg
2933
2966
 
2934
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_pump_usage_multiplier', false)
2935
- arg.setDisplayName('Hot Tub: Pump Usage Multiplier')
2936
- arg.setDescription('Multiplier on the hot tub pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2967
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_pump_usage_multiplier', false)
2968
+ arg.setDisplayName('Permanent Spa: Pump Usage Multiplier')
2969
+ arg.setDescription("Multiplier on the permanent spa pump energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#permanent-spa-pump'>Permanent Spa Pump</a>) is used.")
2937
2970
  args << arg
2938
2971
 
2939
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('hot_tub_heater_type', heater_type_choices, true)
2940
- arg.setDisplayName('Hot Tub: Heater Type')
2941
- arg.setDescription("The type of hot tub heater. Use '#{HPXML::TypeNone}' if there is no hot tub heater.")
2972
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('permanent_spa_heater_type', heater_type_choices, true)
2973
+ arg.setDisplayName('Permanent Spa: Heater Type')
2974
+ arg.setDescription("The type of permanent spa heater. Use '#{HPXML::TypeNone}' if there is no permanent spa heater.")
2942
2975
  arg.setDefaultValue(HPXML::TypeNone)
2943
2976
  args << arg
2944
2977
 
2945
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_annual_kwh', false)
2946
- arg.setDisplayName('Hot Tub: Heater Annual kWh')
2947
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} hot tub heater. If not provided, the OS-HPXML default is used.")
2978
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_heater_annual_kwh', false)
2979
+ arg.setDisplayName('Permanent Spa: Heater Annual kWh')
2980
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} permanent spa heater. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#permanent-spa-heater'>Permanent Spa Heater</a>) is used.")
2948
2981
  arg.setUnits('kWh/yr')
2949
2982
  args << arg
2950
2983
 
2951
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_annual_therm', false)
2952
- arg.setDisplayName('Hot Tub: Heater Annual therm')
2953
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} hot tub heater. If not provided, the OS-HPXML default is used.")
2984
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_heater_annual_therm', false)
2985
+ arg.setDisplayName('Permanent Spa: Heater Annual therm')
2986
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} permanent spa heater. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#permanent-spa-heater'>Permanent Spa Heater</a>) is used.")
2954
2987
  arg.setUnits('therm/yr')
2955
2988
  args << arg
2956
2989
 
2957
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_usage_multiplier', false)
2958
- arg.setDisplayName('Hot Tub: Heater Usage Multiplier')
2959
- arg.setDescription('Multiplier on the hot tub heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default is used.')
2990
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('permanent_spa_heater_usage_multiplier', false)
2991
+ arg.setDisplayName('Permanent Spa: Heater Usage Multiplier')
2992
+ arg.setDescription("Multiplier on the permanent spa heater energy usage that can reflect, e.g., high/low usage occupants. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#permanent-spa-heater'>Permanent Spa Heater</a>) is used.")
2960
2993
  args << arg
2961
2994
 
2962
2995
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('emissions_scenario_names', false)
@@ -3111,7 +3144,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3111
3144
 
3112
3145
  args[:apply_validation] = args[:apply_validation].is_initialized ? args[:apply_validation].get : false
3113
3146
  args[:apply_defaults] = args[:apply_defaults].is_initialized ? args[:apply_defaults].get : false
3114
- args[:apply_validation] = true if args[:apply_defaults]
3115
3147
  args[:geometry_unit_left_wall_is_adiabatic] = (args[:geometry_unit_left_wall_is_adiabatic].is_initialized && args[:geometry_unit_left_wall_is_adiabatic].get)
3116
3148
  args[:geometry_unit_right_wall_is_adiabatic] = (args[:geometry_unit_right_wall_is_adiabatic].is_initialized && args[:geometry_unit_right_wall_is_adiabatic].get)
3117
3149
  args[:geometry_unit_front_wall_is_adiabatic] = (args[:geometry_unit_front_wall_is_adiabatic].is_initialized && args[:geometry_unit_front_wall_is_adiabatic].get)
@@ -3149,16 +3181,20 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3149
3181
  hpxml_path = File.expand_path(hpxml_path)
3150
3182
  end
3151
3183
 
3152
- hpxml_doc = HPXMLFile.create(runner, model, args, epw_path, hpxml_path)
3184
+ # Existing HPXML File
3185
+ if args[:existing_hpxml_path].is_initialized
3186
+ existing_hpxml_path = args[:existing_hpxml_path].get
3187
+ unless (Pathname.new existing_hpxml_path).absolute?
3188
+ existing_hpxml_path = File.expand_path(existing_hpxml_path)
3189
+ end
3190
+ end
3191
+
3192
+ hpxml_doc = HPXMLFile.create(runner, model, args, epw_path, hpxml_path, existing_hpxml_path)
3153
3193
  if not hpxml_doc
3154
3194
  runner.registerError('Unsuccessful creation of HPXML file.')
3155
3195
  return false
3156
3196
  end
3157
3197
 
3158
- # Write HPXML file again if defaults applied
3159
- if args[:apply_defaults]
3160
- XMLHelper.write_file(hpxml_doc, hpxml_path)
3161
- end
3162
3198
  runner.registerInfo("Wrote file: #{hpxml_path}")
3163
3199
 
3164
3200
  # Uncomment for debugging purposes
@@ -3177,6 +3213,10 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3177
3213
  def argument_warnings(args)
3178
3214
  warnings = []
3179
3215
 
3216
+ max_uninsulated_floor_rvalue = 6.0
3217
+ max_uninsulated_ceiling_rvalue = 3.0
3218
+ max_uninsulated_roof_rvalue = 3.0
3219
+
3180
3220
  warning = ([HPXML::WaterHeaterTypeHeatPump].include?(args[:water_heater_type]) && (args[:water_heater_fuel_type] != HPXML::FuelTypeElectricity))
3181
3221
  warnings << 'Cannot model a heat pump water heater with non-electric fuel type.' if warning
3182
3222
 
@@ -3186,19 +3226,16 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3186
3226
  warning = (args[:geometry_foundation_type] == HPXML::FoundationTypeSlab) && (args[:geometry_foundation_height_above_grade] > 0)
3187
3227
  warnings << 'Specified a slab foundation type with a non-zero height above grade.' if warning
3188
3228
 
3189
- warning = (args[:heating_system_2_type] != 'none') && (args[:heating_system_2_fraction_heat_load_served] >= 0.5) && (args[:heating_system_2_fraction_heat_load_served] < 1.0)
3190
- warnings << 'The fraction of heat load served by the second heating system is greater than or equal to 50%.' if warning
3191
-
3192
- warning = [HPXML::FoundationTypeCrawlspaceVented, HPXML::FoundationTypeCrawlspaceUnvented, HPXML::FoundationTypeBasementUnconditioned].include?(args[:geometry_foundation_type]) && ((args[:foundation_wall_insulation_r] > 0) || args[:foundation_wall_assembly_r].is_initialized) && (args[:floor_over_foundation_assembly_r] > 2.1)
3229
+ warning = [HPXML::FoundationTypeCrawlspaceVented, HPXML::FoundationTypeCrawlspaceUnvented, HPXML::FoundationTypeBasementUnconditioned].include?(args[:geometry_foundation_type]) && ((args[:foundation_wall_insulation_r] > 0) || args[:foundation_wall_assembly_r].is_initialized) && (args[:floor_over_foundation_assembly_r] > max_uninsulated_floor_rvalue)
3193
3230
  warnings << 'Home with unconditioned basement/crawlspace foundation type has both foundation wall insulation and floor insulation.' if warning
3194
3231
 
3195
- warning = [HPXML::AtticTypeVented, HPXML::AtticTypeUnvented].include?(args[:geometry_attic_type]) && (args[:ceiling_assembly_r] > 2.1) && (args[:roof_assembly_r] > 2.3)
3232
+ warning = [HPXML::AtticTypeVented, HPXML::AtticTypeUnvented].include?(args[:geometry_attic_type]) && (args[:ceiling_assembly_r] > max_uninsulated_ceiling_rvalue) && (args[:roof_assembly_r] > max_uninsulated_roof_rvalue)
3196
3233
  warnings << 'Home with unconditioned attic type has both ceiling insulation and roof insulation.' if warning
3197
3234
 
3198
- warning = (args[:geometry_foundation_type] == HPXML::FoundationTypeBasementConditioned) && (args[:floor_over_foundation_assembly_r] > 2.1)
3235
+ warning = (args[:geometry_foundation_type] == HPXML::FoundationTypeBasementConditioned) && (args[:floor_over_foundation_assembly_r] > max_uninsulated_floor_rvalue)
3199
3236
  warnings << 'Home with conditioned basement has floor insulation.' if warning
3200
3237
 
3201
- warning = (args[:geometry_attic_type] == HPXML::AtticTypeConditioned) && (args[:ceiling_assembly_r] > 2.1)
3238
+ warning = (args[:geometry_attic_type] == HPXML::AtticTypeConditioned) && (args[:ceiling_assembly_r] > max_uninsulated_ceiling_rvalue)
3202
3239
  warnings << 'Home with conditioned attic has ceiling insulation.' if warning
3203
3240
 
3204
3241
  return warnings
@@ -3219,12 +3256,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3219
3256
  error = (args[:geometry_unit_type] == HPXML::ResidentialTypeApartment) && ([HPXML::FoundationTypeBasementConditioned, HPXML::FoundationTypeCrawlspaceConditioned].include? args[:geometry_foundation_type])
3220
3257
  errors << 'Conditioned basement/crawlspace foundation type for apartment units is not currently supported.' if error
3221
3258
 
3222
- error = (args[:ducts_supply_location].is_initialized != args[:ducts_supply_surface_area].is_initialized) || (args[:ducts_return_location].is_initialized != args[:ducts_return_surface_area].is_initialized)
3223
- errors << 'Duct location and surface area not both defaulted or not both specified.' if error
3224
-
3225
- error = (args[:heating_system_2_type] != 'none') && (args[:heating_system_2_fraction_heat_load_served] == 1.0)
3226
- errors << 'The fraction of heat load served by the second heating system is 100%.' if error
3227
-
3228
3259
  error = (args[:heating_system_type] == 'none') && (args[:heat_pump_type] == 'none') && (args[:heating_system_2_type] != 'none')
3229
3260
  errors << 'A second heating system was specified without a primary heating system.' if error
3230
3261
 
@@ -3355,7 +3386,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3355
3386
  end
3356
3387
 
3357
3388
  class HPXMLFile
3358
- def self.create(runner, model, args, epw_path, hpxml_path)
3389
+ def self.create(runner, model, args, epw_path, hpxml_path, existing_hpxml_path)
3359
3390
  epw_file = OpenStudio::EpwFile.new(epw_path)
3360
3391
  if (args[:hvac_control_heating_season_period].to_s == HPXML::BuildingAmerica) || (args[:hvac_control_cooling_season_period].to_s == HPXML::BuildingAmerica) || (args[:apply_defaults])
3361
3392
  weather = WeatherProcess.new(epw_path: epw_path, runner: nil)
@@ -3370,75 +3401,88 @@ class HPXMLFile
3370
3401
  sorted_surfaces = model.getSurfaces.sort_by { |s| s.additionalProperties.getFeatureAsInteger('Index').get }
3371
3402
  sorted_subsurfaces = model.getSubSurfaces.sort_by { |ss| ss.additionalProperties.getFeatureAsInteger('Index').get }
3372
3403
 
3373
- hpxml = HPXML.new
3374
-
3375
- set_header(hpxml, args)
3376
- set_site(hpxml, args)
3377
- set_neighbor_buildings(hpxml, args)
3378
- set_building_occupancy(hpxml, args)
3379
- set_building_construction(hpxml, args)
3380
- set_climate_and_risk_zones(hpxml, args)
3381
- set_air_infiltration_measurements(hpxml, args)
3382
- set_roofs(hpxml, args, sorted_surfaces)
3383
- set_rim_joists(hpxml, model, args, sorted_surfaces)
3384
- set_walls(hpxml, model, args, sorted_surfaces)
3385
- set_foundation_walls(hpxml, model, args, sorted_surfaces)
3386
- set_floors(hpxml, args, sorted_surfaces)
3387
- set_slabs(hpxml, model, args, sorted_surfaces)
3388
- set_windows(hpxml, model, args, sorted_subsurfaces)
3389
- set_skylights(hpxml, args, sorted_subsurfaces)
3390
- set_doors(hpxml, model, args, sorted_subsurfaces)
3391
- set_attics(hpxml, args)
3392
- set_foundations(hpxml, args)
3393
- set_heating_systems(hpxml, args)
3394
- set_cooling_systems(hpxml, args)
3395
- set_heat_pumps(hpxml, args)
3396
- set_secondary_heating_systems(hpxml, args)
3397
- set_hvac_distribution(hpxml, args)
3398
- set_hvac_control(hpxml, args, epw_file, weather)
3399
- set_ventilation_fans(hpxml, args)
3400
- set_water_heating_systems(hpxml, args)
3401
- set_hot_water_distribution(hpxml, args)
3402
- set_water_fixtures(hpxml, args)
3403
- set_solar_thermal(hpxml, args, epw_file)
3404
- set_pv_systems(hpxml, args, epw_file)
3405
- set_battery(hpxml, args)
3406
- set_lighting(hpxml, args)
3407
- set_dehumidifier(hpxml, args)
3408
- set_clothes_washer(hpxml, args)
3409
- set_clothes_dryer(hpxml, args)
3410
- set_dishwasher(hpxml, args)
3411
- set_refrigerator(hpxml, args)
3412
- set_extra_refrigerator(hpxml, args)
3413
- set_freezer(hpxml, args)
3414
- set_cooking_range_oven(hpxml, args)
3415
- set_ceiling_fans(hpxml, args)
3416
- set_misc_plug_loads_television(hpxml, args)
3417
- set_misc_plug_loads_other(hpxml, args)
3418
- set_misc_plug_loads_vehicle(hpxml, args)
3419
- set_misc_plug_loads_well_pump(hpxml, args)
3420
- set_misc_fuel_loads_grill(hpxml, args)
3421
- set_misc_fuel_loads_lighting(hpxml, args)
3422
- set_misc_fuel_loads_fireplace(hpxml, args)
3423
- set_pool(hpxml, args)
3424
- set_hot_tub(hpxml, args)
3425
- collapse_surfaces(hpxml, args)
3426
- renumber_hpxml_ids(hpxml)
3427
-
3428
- hpxml_doc = hpxml.to_oga()
3404
+ hpxml = HPXML.new(hpxml_path: existing_hpxml_path, building_id: 'ALL')
3405
+
3406
+ if not set_header(runner, hpxml, args)
3407
+ return false
3408
+ end
3409
+
3410
+ hpxml_bldg = add_building(hpxml, args)
3411
+ set_site(hpxml_bldg, args)
3412
+ set_neighbor_buildings(hpxml_bldg, args)
3413
+ set_building_occupancy(hpxml_bldg, args)
3414
+ set_building_construction(hpxml_bldg, args)
3415
+ set_building_header(hpxml_bldg, args)
3416
+ set_climate_and_risk_zones(hpxml_bldg, args)
3417
+ set_air_infiltration_measurements(hpxml_bldg, args)
3418
+ set_roofs(hpxml_bldg, args, sorted_surfaces)
3419
+ set_rim_joists(hpxml_bldg, model, args, sorted_surfaces)
3420
+ set_walls(hpxml_bldg, model, args, sorted_surfaces)
3421
+ set_foundation_walls(hpxml_bldg, model, args, sorted_surfaces)
3422
+ set_floors(hpxml_bldg, args, sorted_surfaces)
3423
+ set_slabs(hpxml_bldg, model, args, sorted_surfaces)
3424
+ set_windows(hpxml_bldg, model, args, sorted_subsurfaces)
3425
+ set_skylights(hpxml_bldg, args, sorted_subsurfaces)
3426
+ set_doors(hpxml_bldg, model, args, sorted_subsurfaces)
3427
+ set_attics(hpxml_bldg, args)
3428
+ set_foundations(hpxml_bldg, args)
3429
+ set_heating_systems(hpxml_bldg, args)
3430
+ set_cooling_systems(hpxml_bldg, args)
3431
+ set_heat_pumps(hpxml_bldg, args)
3432
+ set_secondary_heating_systems(hpxml_bldg, args)
3433
+ set_hvac_distribution(hpxml_bldg, args)
3434
+ set_hvac_control(hpxml, hpxml_bldg, args, epw_file, weather)
3435
+ set_ventilation_fans(hpxml_bldg, args)
3436
+ set_water_heating_systems(hpxml_bldg, args)
3437
+ set_hot_water_distribution(hpxml_bldg, args)
3438
+ set_water_fixtures(hpxml_bldg, args)
3439
+ set_solar_thermal(hpxml_bldg, args, epw_file)
3440
+ set_pv_systems(hpxml_bldg, args, epw_file)
3441
+ set_battery(hpxml_bldg, args)
3442
+ set_lighting(hpxml_bldg, args)
3443
+ set_dehumidifier(hpxml_bldg, args)
3444
+ set_clothes_washer(hpxml_bldg, args)
3445
+ set_clothes_dryer(hpxml_bldg, args)
3446
+ set_dishwasher(hpxml_bldg, args)
3447
+ set_refrigerator(hpxml_bldg, args)
3448
+ set_extra_refrigerator(hpxml_bldg, args)
3449
+ set_freezer(hpxml_bldg, args)
3450
+ set_cooking_range_oven(hpxml_bldg, args)
3451
+ set_ceiling_fans(hpxml_bldg, args)
3452
+ set_misc_plug_loads_television(hpxml_bldg, args)
3453
+ set_misc_plug_loads_other(hpxml_bldg, args)
3454
+ set_misc_plug_loads_vehicle(hpxml_bldg, args)
3455
+ set_misc_plug_loads_well_pump(hpxml_bldg, args)
3456
+ set_misc_fuel_loads_grill(hpxml_bldg, args)
3457
+ set_misc_fuel_loads_lighting(hpxml_bldg, args)
3458
+ set_misc_fuel_loads_fireplace(hpxml_bldg, args)
3459
+ set_pool(hpxml_bldg, args)
3460
+ set_permanent_spa(hpxml_bldg, args)
3461
+ collapse_surfaces(hpxml_bldg, args)
3462
+ renumber_hpxml_ids(hpxml_bldg)
3463
+
3464
+ hpxml_doc = hpxml.to_doc()
3465
+ hpxml.set_unique_hpxml_ids(hpxml_doc, true) if hpxml.buildings.size > 1
3429
3466
  XMLHelper.write_file(hpxml_doc, hpxml_path)
3430
3467
 
3431
- if args[:apply_validation]
3432
- # Check for invalid HPXML file
3468
+ if args[:apply_defaults]
3469
+ # Always check for invalid HPXML file before applying defaults
3433
3470
  if not validate_hpxml(runner, hpxml, hpxml_doc, hpxml_path)
3434
3471
  return false
3435
3472
  end
3436
- end
3437
3473
 
3438
- if args[:apply_defaults]
3439
3474
  eri_version = Constants.ERIVersions[-1]
3440
- HPXMLDefaults.apply(runner, hpxml, eri_version, weather, epw_file: epw_file)
3441
- hpxml_doc = hpxml.to_oga()
3475
+ HPXMLDefaults.apply(runner, hpxml, hpxml_bldg, eri_version, weather, epw_file: epw_file)
3476
+ hpxml_doc = hpxml.to_doc()
3477
+ hpxml.set_unique_hpxml_ids(hpxml_doc, true) if hpxml.buildings.size > 1
3478
+ XMLHelper.write_file(hpxml_doc, hpxml_path)
3479
+ end
3480
+
3481
+ if args[:apply_validation]
3482
+ # Optionally check for invalid HPXML file (with or without defaults applied)
3483
+ if not validate_hpxml(runner, hpxml, hpxml_doc, hpxml_path)
3484
+ return false
3485
+ end
3442
3486
  end
3443
3487
 
3444
3488
  return hpxml_doc
@@ -3446,7 +3490,10 @@ class HPXMLFile
3446
3490
 
3447
3491
  def self.validate_hpxml(runner, hpxml, hpxml_doc, hpxml_path)
3448
3492
  # Check for errors in the HPXML object
3449
- errors = hpxml.check_for_errors()
3493
+ errors = []
3494
+ hpxml.buildings.each do |hpxml_bldg|
3495
+ errors += hpxml_bldg.check_for_errors()
3496
+ end
3450
3497
  if errors.size > 0
3451
3498
  fail "ERROR: Invalid HPXML object produced.\n#{errors}"
3452
3499
  end
@@ -3499,7 +3546,7 @@ class HPXMLFile
3499
3546
  args[:geometry_foundation_height] = 0.0
3500
3547
  args[:geometry_foundation_height_above_grade] = 0.0
3501
3548
  args[:geometry_rim_joist_height] = 0.0
3502
- elsif args[:geometry_foundation_type] == HPXML::FoundationTypeAmbient
3549
+ elsif (args[:geometry_foundation_type] == HPXML::FoundationTypeAmbient) || args[:geometry_foundation_type].start_with?(HPXML::FoundationTypeBellyAndWing)
3503
3550
  args[:geometry_rim_joist_height] = 0.0
3504
3551
  end
3505
3552
 
@@ -3514,6 +3561,8 @@ class HPXMLFile
3514
3561
  success = Geometry.create_single_family_attached(model: model, **args)
3515
3562
  elsif args[:geometry_unit_type] == HPXML::ResidentialTypeApartment
3516
3563
  success = Geometry.create_apartment(model: model, **args)
3564
+ elsif args[:geometry_unit_type] == HPXML::ResidentialTypeManufactured
3565
+ success = Geometry.create_single_family_detached(runner: runner, model: model, **args)
3517
3566
  end
3518
3567
  return false if not success
3519
3568
 
@@ -3526,23 +3575,40 @@ class HPXMLFile
3526
3575
  return true
3527
3576
  end
3528
3577
 
3529
- def self.set_header(hpxml, args)
3578
+ def self.unavailable_period_exists(hpxml, column_name, begin_month, begin_day, begin_hour, end_month, end_day, end_hour, natvent_availability = nil)
3579
+ natvent_availability = HPXML::ScheduleUnavailable if natvent_availability.nil?
3580
+
3581
+ hpxml.header.unavailable_periods.each do |unavailable_period|
3582
+ begin_hour = 0 if begin_hour.nil?
3583
+ end_hour = 24 if end_hour.nil?
3584
+
3585
+ next unless (unavailable_period.column_name == column_name) &&
3586
+ (unavailable_period.begin_month == begin_month) &&
3587
+ (unavailable_period.begin_day == begin_day) &&
3588
+ (unavailable_period.begin_hour == begin_hour) &&
3589
+ (unavailable_period.end_month == end_month) &&
3590
+ (unavailable_period.end_day == end_day) &&
3591
+ (unavailable_period.end_hour == end_hour) &&
3592
+ (unavailable_period.natvent_availability == natvent_availability)
3593
+
3594
+ return true
3595
+ end
3596
+ return false
3597
+ end
3598
+
3599
+ def self.set_header(runner, hpxml, args)
3600
+ errors = []
3601
+
3530
3602
  hpxml.header.xml_type = 'HPXML'
3531
3603
  hpxml.header.xml_generated_by = 'BuildResidentialHPXML'
3532
3604
  hpxml.header.transaction = 'create'
3533
- hpxml.header.building_id = 'MyBuilding'
3534
- hpxml.header.event_type = 'proposed workscope'
3535
-
3536
- if args[:window_natvent_availability].is_initialized
3537
- hpxml.header.natvent_days_per_week = args[:window_natvent_availability].get
3538
- end
3539
3605
 
3540
- if args[:schedules_filepaths].is_initialized
3541
- hpxml.header.schedules_filepaths = args[:schedules_filepaths].get.split(',').map(&:strip)
3542
- end
3543
3606
  if args[:schedules_vacancy_period].is_initialized
3544
3607
  begin_month, begin_day, begin_hour, end_month, end_day, end_hour = Schedule.parse_date_time_range(args[:schedules_vacancy_period].get)
3545
- hpxml.header.unavailable_periods.add(column_name: 'Vacancy', begin_month: begin_month, begin_day: begin_day, begin_hour: begin_hour, end_month: end_month, end_day: end_day, end_hour: end_hour, natvent_availability: HPXML::ScheduleUnavailable)
3608
+
3609
+ if not unavailable_period_exists(hpxml, 'Vacancy', begin_month, begin_day, begin_hour, end_month, end_day, end_hour)
3610
+ hpxml.header.unavailable_periods.add(column_name: 'Vacancy', begin_month: begin_month, begin_day: begin_day, begin_hour: begin_hour, end_month: end_month, end_day: end_day, end_hour: end_hour, natvent_availability: HPXML::ScheduleUnavailable)
3611
+ end
3546
3612
  end
3547
3613
  if args[:schedules_power_outage_period].is_initialized
3548
3614
  begin_month, begin_day, begin_hour, end_month, end_day, end_hour = Schedule.parse_date_time_range(args[:schedules_power_outage_period].get)
@@ -3551,22 +3617,39 @@ class HPXMLFile
3551
3617
  natvent_availability = args[:schedules_power_outage_window_natvent_availability].get
3552
3618
  end
3553
3619
 
3554
- hpxml.header.unavailable_periods.add(column_name: 'Power Outage', begin_month: begin_month, begin_day: begin_day, begin_hour: begin_hour, end_month: end_month, end_day: end_day, end_hour: end_hour, natvent_availability: natvent_availability)
3620
+ if not unavailable_period_exists(hpxml, 'Power Outage', begin_month, begin_day, begin_hour, end_month, end_day, end_hour, natvent_availability)
3621
+ hpxml.header.unavailable_periods.add(column_name: 'Power Outage', begin_month: begin_month, begin_day: begin_day, begin_hour: begin_hour, end_month: end_month, end_day: end_day, end_hour: end_hour, natvent_availability: natvent_availability)
3622
+ end
3555
3623
  end
3556
3624
 
3557
3625
  if args[:software_info_program_used].is_initialized
3626
+ if !hpxml.header.software_program_used.nil? && (hpxml.header.software_program_used != args[:software_info_program_used].get)
3627
+ errors << "'Software Info: Program Used' cannot vary across dwelling units."
3628
+ end
3558
3629
  hpxml.header.software_program_used = args[:software_info_program_used].get
3559
3630
  end
3560
3631
  if args[:software_info_program_version].is_initialized
3632
+ if !hpxml.header.software_program_version.nil? && (hpxml.header.software_program_version != args[:software_info_program_version].get)
3633
+ errors << "'Software Info: Program Version' cannot vary across dwelling units."
3634
+ end
3561
3635
  hpxml.header.software_program_version = args[:software_info_program_version].get
3562
3636
  end
3563
3637
 
3564
3638
  if args[:simulation_control_timestep].is_initialized
3639
+ if !hpxml.header.timestep.nil? && (hpxml.header.timestep != args[:simulation_control_timestep].get)
3640
+ errors << "'Simulation Control: Timestep' cannot vary across dwelling units."
3641
+ end
3565
3642
  hpxml.header.timestep = args[:simulation_control_timestep].get
3566
3643
  end
3567
3644
 
3568
3645
  if args[:simulation_control_run_period].is_initialized
3569
3646
  begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:simulation_control_run_period].get)
3647
+ if (!hpxml.header.sim_begin_month.nil? && (hpxml.header.sim_begin_month != begin_month)) ||
3648
+ (!hpxml.header.sim_begin_day.nil? && (hpxml.header.sim_begin_day != begin_day)) ||
3649
+ (!hpxml.header.sim_end_month.nil? && (hpxml.header.sim_end_month != end_month)) ||
3650
+ (!hpxml.header.sim_end_day.nil? && (hpxml.header.sim_end_day != end_day))
3651
+ errors << "'Simulation Control: Run Period' cannot vary across dwelling units."
3652
+ end
3570
3653
  hpxml.header.sim_begin_month = begin_month
3571
3654
  hpxml.header.sim_begin_day = begin_day
3572
3655
  hpxml.header.sim_end_month = end_month
@@ -3574,44 +3657,19 @@ class HPXMLFile
3574
3657
  end
3575
3658
 
3576
3659
  if args[:simulation_control_run_period_calendar_year].is_initialized
3660
+ if !hpxml.header.sim_calendar_year.nil? && (hpxml.header.sim_calendar_year != Integer(args[:simulation_control_run_period_calendar_year].get))
3661
+ errors << "'Simulation Control: Run Period Calendar Year' cannot vary across dwelling units."
3662
+ end
3577
3663
  hpxml.header.sim_calendar_year = args[:simulation_control_run_period_calendar_year].get
3578
3664
  end
3579
3665
 
3580
- if args[:simulation_control_daylight_saving_enabled].is_initialized
3581
- hpxml.header.dst_enabled = args[:simulation_control_daylight_saving_enabled].get
3582
- end
3583
- if args[:simulation_control_daylight_saving_period].is_initialized
3584
- begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:simulation_control_daylight_saving_period].get)
3585
- hpxml.header.dst_begin_month = begin_month
3586
- hpxml.header.dst_begin_day = begin_day
3587
- hpxml.header.dst_end_month = end_month
3588
- hpxml.header.dst_end_day = end_day
3589
- end
3590
-
3591
3666
  if args[:simulation_control_temperature_capacitance_multiplier].is_initialized
3667
+ if !hpxml.header.temperature_capacitance_multiplier.nil? && (hpxml.header.temperature_capacitance_multiplier != Float(args[:simulation_control_temperature_capacitance_multiplier].get))
3668
+ errors << "'Simulation Control: Temperature Capacitance Multiplier' cannot vary across dwelling units."
3669
+ end
3592
3670
  hpxml.header.temperature_capacitance_multiplier = args[:simulation_control_temperature_capacitance_multiplier].get
3593
3671
  end
3594
3672
 
3595
- if args[:window_shading_summer_season].is_initialized
3596
- begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:window_shading_summer_season].get)
3597
- hpxml.header.shading_summer_begin_month = begin_month
3598
- hpxml.header.shading_summer_begin_day = begin_day
3599
- hpxml.header.shading_summer_end_month = end_month
3600
- hpxml.header.shading_summer_end_day = end_day
3601
- end
3602
-
3603
- if args[:site_zip_code].is_initialized
3604
- hpxml.header.zip_code = args[:site_zip_code].get
3605
- end
3606
-
3607
- if args[:site_state_code].is_initialized
3608
- hpxml.header.state_code = args[:site_state_code].get
3609
- end
3610
-
3611
- if args[:site_time_zone_utc_offset].is_initialized
3612
- hpxml.header.time_zone_utc_offset = args[:site_time_zone_utc_offset].get
3613
- end
3614
-
3615
3673
  if args[:emissions_scenario_names].is_initialized
3616
3674
  emissions_scenario_names = args[:emissions_scenario_names].get.split(',').map(&:strip)
3617
3675
  emissions_types = args[:emissions_types].get.split(',').map(&:strip)
@@ -3659,6 +3717,7 @@ class HPXMLFile
3659
3717
  fuel_values[HPXML::FuelTypeWoodPellets])
3660
3718
  emissions_scenarios.each do |emissions_scenario|
3661
3719
  name, emissions_type, elec_units, elec_value_or_schedule_filepath, elec_num_headers, elec_column_num, fuel_units, natural_gas_value, propane_value, fuel_oil_value, coal_value, wood_value, wood_pellets_value = emissions_scenario
3720
+
3662
3721
  elec_value = Float(elec_value_or_schedule_filepath) rescue nil
3663
3722
  if elec_value.nil?
3664
3723
  elec_schedule_filepath = elec_value_or_schedule_filepath
@@ -3672,6 +3731,38 @@ class HPXMLFile
3672
3731
  wood_value = Float(wood_value) rescue nil
3673
3732
  wood_pellets_value = Float(wood_pellets_value) rescue nil
3674
3733
 
3734
+ emissions_scenario_exists = false
3735
+ hpxml.header.emissions_scenarios.each do |es|
3736
+ if (es.name != name) || (es.emissions_type != emissions_type)
3737
+ next
3738
+ end
3739
+
3740
+ if (es.emissions_type != emissions_type) ||
3741
+ (!elec_units.nil? && es.elec_units != elec_units) ||
3742
+ (!elec_value.nil? && es.elec_value != elec_value) ||
3743
+ (!elec_schedule_filepath.nil? && es.elec_schedule_filepath != elec_schedule_filepath) ||
3744
+ (!elec_num_headers.nil? && es.elec_schedule_number_of_header_rows != elec_num_headers) ||
3745
+ (!elec_column_num.nil? && es.elec_schedule_column_number != elec_column_num) ||
3746
+ (!es.natural_gas_units.nil? && !fuel_units.nil? && es.natural_gas_units != fuel_units) ||
3747
+ (!natural_gas_value.nil? && es.natural_gas_value != natural_gas_value) ||
3748
+ (!es.propane_units.nil? && !fuel_units.nil? && es.propane_units != fuel_units) ||
3749
+ (!propane_value.nil? && es.propane_value != propane_value) ||
3750
+ (!es.fuel_oil_units.nil? && !fuel_units.nil? && es.fuel_oil_units != fuel_units) ||
3751
+ (!fuel_oil_value.nil? && es.fuel_oil_value != fuel_oil_value) ||
3752
+ (!es.coal_units.nil? && !fuel_units.nil? && es.coal_units != fuel_units) ||
3753
+ (!coal_value.nil? && es.coal_value != coal_value) ||
3754
+ (!es.wood_units.nil? && !fuel_units.nil? && es.wood_units != fuel_units) ||
3755
+ (!wood_value.nil? && es.wood_value != wood_value) ||
3756
+ (!es.wood_pellets_units.nil? && !fuel_units.nil? && es.wood_pellets_units != fuel_units) ||
3757
+ (!wood_pellets_value.nil? && es.wood_pellets_value != wood_pellets_value)
3758
+ errors << "HPXML header already includes an emissions scenario named '#{name}' with type '#{emissions_type}'."
3759
+ else
3760
+ emissions_scenario_exists = true
3761
+ end
3762
+ end
3763
+
3764
+ next if emissions_scenario_exists
3765
+
3675
3766
  hpxml.header.emissions_scenarios.add(name: name,
3676
3767
  emissions_type: emissions_type,
3677
3768
  elec_units: elec_units,
@@ -3785,6 +3876,7 @@ class HPXMLFile
3785
3876
 
3786
3877
  bills_scenarios.each do |bills_scenario|
3787
3878
  name, elec_tariff_filepath, elec_fixed_charge, natural_gas_fixed_charge, propane_fixed_charge, fuel_oil_fixed_charge, coal_fixed_charge, wood_fixed_charge, wood_pellets_fixed_charge, elec_marginal_rate, natural_gas_marginal_rate, propane_marginal_rate, fuel_oil_marginal_rate, coal_marginal_rate, wood_marginal_rate, wood_pellets_marginal_rate, pv_compensation_type, pv_net_metering_annual_excess_sellback_rate_type, pv_net_metering_annual_excess_sellback_rate, pv_feed_in_tariff_rate, pv_monthly_grid_connection_fee_unit, pv_monthly_grid_connection_fee = bills_scenario
3879
+
3788
3880
  elec_tariff_filepath = (elec_tariff_filepath.to_s.include?('.') ? elec_tariff_filepath : nil)
3789
3881
  elec_fixed_charge = Float(elec_fixed_charge) rescue nil
3790
3882
  natural_gas_fixed_charge = Float(natural_gas_fixed_charge) rescue nil
@@ -3820,6 +3912,39 @@ class HPXMLFile
3820
3912
  pv_monthly_grid_connection_fee_dollars = Float(pv_monthly_grid_connection_fee) rescue nil
3821
3913
  end
3822
3914
 
3915
+ utility_bill_scenario_exists = false
3916
+ hpxml.header.utility_bill_scenarios.each do |ubs|
3917
+ next if ubs.name != name
3918
+
3919
+ if (!elec_tariff_filepath.nil? && ubs.elec_tariff_filepath != elec_tariff_filepath) ||
3920
+ (!elec_fixed_charge.nil? && ubs.elec_fixed_charge != elec_fixed_charge) ||
3921
+ (!natural_gas_fixed_charge.nil? && ubs.natural_gas_fixed_charge != natural_gas_fixed_charge) ||
3922
+ (!propane_fixed_charge.nil? && ubs.propane_fixed_charge != propane_fixed_charge) ||
3923
+ (!fuel_oil_fixed_charge.nil? && ubs.fuel_oil_fixed_charge != fuel_oil_fixed_charge) ||
3924
+ (!coal_fixed_charge.nil? && ubs.coal_fixed_charge != coal_fixed_charge) ||
3925
+ (!wood_fixed_charge.nil? && ubs.wood_fixed_charge != wood_fixed_charge) ||
3926
+ (!wood_pellets_fixed_charge.nil? && ubs.wood_pellets_fixed_charge != wood_pellets_fixed_charge) ||
3927
+ (!elec_marginal_rate.nil? && ubs.elec_marginal_rate != elec_marginal_rate) ||
3928
+ (!natural_gas_marginal_rate.nil? && ubs.natural_gas_marginal_rate != natural_gas_marginal_rate) ||
3929
+ (!propane_marginal_rate.nil? && ubs.propane_marginal_rate != propane_marginal_rate) ||
3930
+ (!fuel_oil_marginal_rate.nil? && ubs.fuel_oil_marginal_rate != fuel_oil_marginal_rate) ||
3931
+ (!coal_marginal_rate.nil? && ubs.coal_marginal_rate != coal_marginal_rate) ||
3932
+ (!wood_marginal_rate.nil? && ubs.wood_marginal_rate != wood_marginal_rate) ||
3933
+ (!wood_pellets_marginal_rate.nil? && ubs.wood_pellets_marginal_rate != wood_pellets_marginal_rate) ||
3934
+ (!pv_compensation_type.nil? && ubs.pv_compensation_type != pv_compensation_type) ||
3935
+ (!pv_net_metering_annual_excess_sellback_rate_type.nil? && ubs.pv_net_metering_annual_excess_sellback_rate_type != pv_net_metering_annual_excess_sellback_rate_type) ||
3936
+ (!pv_net_metering_annual_excess_sellback_rate.nil? && ubs.pv_net_metering_annual_excess_sellback_rate != pv_net_metering_annual_excess_sellback_rate) ||
3937
+ (!pv_feed_in_tariff_rate.nil? && ubs.pv_feed_in_tariff_rate != pv_feed_in_tariff_rate) ||
3938
+ (!pv_monthly_grid_connection_fee_dollars_per_kw.nil? && ubs.pv_monthly_grid_connection_fee_dollars_per_kw != pv_monthly_grid_connection_fee_dollars_per_kw) ||
3939
+ (!pv_monthly_grid_connection_fee_dollars.nil? && ubs.pv_monthly_grid_connection_fee_dollars != pv_monthly_grid_connection_fee_dollars)
3940
+ errors << "HPXML header already includes a utility bill scenario named '#{name}'."
3941
+ else
3942
+ utility_bill_scenario_exists = true
3943
+ end
3944
+ end
3945
+
3946
+ next if utility_bill_scenario_exists
3947
+
3823
3948
  hpxml.header.utility_bill_scenarios.add(name: name,
3824
3949
  elec_tariff_filepath: elec_tariff_filepath,
3825
3950
  elec_fixed_charge: elec_fixed_charge,
@@ -3845,28 +3970,62 @@ class HPXMLFile
3845
3970
  end
3846
3971
  end
3847
3972
 
3848
- if args[:additional_properties].is_initialized
3849
- extension_properties = {}
3850
- additional_properties = args[:additional_properties].get.split('|').map(&:strip)
3851
- additional_properties.each do |additional_property|
3852
- key, value = additional_property.split('=').map(&:strip)
3853
- extension_properties[key] = value
3854
- end
3855
- hpxml.header.extension_properties = extension_properties
3973
+ errors.each do |error|
3974
+ runner.registerError(error)
3975
+ end
3976
+ return errors.empty?
3977
+ end
3978
+
3979
+ def self.add_building(hpxml, args)
3980
+ if args[:site_zip_code].is_initialized
3981
+ zip_code = args[:site_zip_code].get
3856
3982
  end
3983
+
3984
+ if args[:site_state_code].is_initialized
3985
+ state_code = args[:site_state_code].get
3986
+ end
3987
+
3988
+ if args[:site_time_zone_utc_offset].is_initialized
3989
+ time_zone_utc_offset = args[:site_time_zone_utc_offset].get
3990
+ end
3991
+
3992
+ if args[:simulation_control_daylight_saving_enabled].is_initialized
3993
+ dst_enabled = args[:simulation_control_daylight_saving_enabled].get
3994
+ end
3995
+ if args[:simulation_control_daylight_saving_period].is_initialized
3996
+ begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:simulation_control_daylight_saving_period].get)
3997
+ dst_begin_month = begin_month
3998
+ dst_begin_day = begin_day
3999
+ dst_end_month = end_month
4000
+ dst_end_day = end_day
4001
+ end
4002
+
4003
+ hpxml.buildings.add(building_id: 'MyBuilding',
4004
+ site_id: 'SiteID',
4005
+ event_type: 'proposed workscope',
4006
+ zip_code: zip_code,
4007
+ state_code: state_code,
4008
+ time_zone_utc_offset: time_zone_utc_offset,
4009
+ dst_enabled: dst_enabled,
4010
+ dst_begin_month: dst_begin_month,
4011
+ dst_begin_day: dst_begin_day,
4012
+ dst_end_month: dst_end_month,
4013
+ dst_end_day: dst_end_day)
4014
+
4015
+ return hpxml.buildings[-1]
3857
4016
  end
3858
4017
 
3859
- def self.set_site(hpxml, args)
4018
+ def self.set_site(hpxml_bldg, args)
3860
4019
  if args[:site_shielding_of_home].is_initialized
3861
- hpxml.site.shielding_of_home = args[:site_shielding_of_home].get
4020
+ hpxml_bldg.site.shielding_of_home = args[:site_shielding_of_home].get
3862
4021
  end
3863
4022
 
3864
4023
  if args[:site_ground_conductivity].is_initialized
3865
- hpxml.site.ground_conductivity = args[:site_ground_conductivity].get
4024
+ hpxml_bldg.site.ground_conductivity = args[:site_ground_conductivity].get
3866
4025
  end
3867
4026
 
3868
4027
  if args[:site_type].is_initialized
3869
- hpxml.site.site_type = args[:site_type].get
4028
+ hpxml_bldg.site.site_type = args[:site_type].get
3870
4029
  end
3871
4030
 
3872
4031
  adb_walls = [args[:geometry_unit_left_wall_is_adiabatic], args[:geometry_unit_right_wall_is_adiabatic], args[:geometry_unit_front_wall_is_adiabatic], args[:geometry_unit_back_wall_is_adiabatic]]
@@ -3874,36 +4033,36 @@ class HPXMLFile
3874
4033
 
3875
4034
  if [HPXML::ResidentialTypeSFA, HPXML::ResidentialTypeApartment].include? args[:geometry_unit_type]
3876
4035
  if n_walls_attached == 3
3877
- hpxml.site.surroundings = HPXML::SurroundingsThreeSides
4036
+ hpxml_bldg.site.surroundings = HPXML::SurroundingsThreeSides
3878
4037
  elsif n_walls_attached == 2
3879
- hpxml.site.surroundings = HPXML::SurroundingsTwoSides
4038
+ hpxml_bldg.site.surroundings = HPXML::SurroundingsTwoSides
3880
4039
  elsif n_walls_attached == 1
3881
- hpxml.site.surroundings = HPXML::SurroundingsOneSide
4040
+ hpxml_bldg.site.surroundings = HPXML::SurroundingsOneSide
3882
4041
  else
3883
- hpxml.site.surroundings = HPXML::SurroundingsStandAlone
4042
+ hpxml_bldg.site.surroundings = HPXML::SurroundingsStandAlone
3884
4043
  end
3885
4044
  if args[:geometry_attic_type] == HPXML::AtticTypeBelowApartment
3886
4045
  if args[:geometry_foundation_type] == HPXML::FoundationTypeAboveApartment
3887
- hpxml.site.vertical_surroundings = HPXML::VerticalSurroundingsAboveAndBelow
4046
+ hpxml_bldg.site.vertical_surroundings = HPXML::VerticalSurroundingsAboveAndBelow
3888
4047
  else
3889
- hpxml.site.vertical_surroundings = HPXML::VerticalSurroundingsAbove
4048
+ hpxml_bldg.site.vertical_surroundings = HPXML::VerticalSurroundingsAbove
3890
4049
  end
3891
4050
  else
3892
4051
  if args[:geometry_foundation_type] == HPXML::FoundationTypeAboveApartment
3893
- hpxml.site.vertical_surroundings = HPXML::VerticalSurroundingsBelow
4052
+ hpxml_bldg.site.vertical_surroundings = HPXML::VerticalSurroundingsBelow
3894
4053
  else
3895
- hpxml.site.vertical_surroundings = HPXML::VerticalSurroundingsNoAboveOrBelow
4054
+ hpxml_bldg.site.vertical_surroundings = HPXML::VerticalSurroundingsNoAboveOrBelow
3896
4055
  end
3897
4056
  end
3898
- elsif [HPXML::ResidentialTypeSFD].include? args[:geometry_unit_type]
3899
- hpxml.site.surroundings = HPXML::SurroundingsStandAlone
3900
- hpxml.site.vertical_surroundings = HPXML::VerticalSurroundingsNoAboveOrBelow
4057
+ elsif [HPXML::ResidentialTypeSFD, HPXML::ResidentialTypeManufactured].include? args[:geometry_unit_type]
4058
+ hpxml_bldg.site.surroundings = HPXML::SurroundingsStandAlone
4059
+ hpxml_bldg.site.vertical_surroundings = HPXML::VerticalSurroundingsNoAboveOrBelow
3901
4060
  end
3902
4061
 
3903
- hpxml.site.azimuth_of_front_of_home = args[:geometry_unit_orientation]
4062
+ hpxml_bldg.site.azimuth_of_front_of_home = args[:geometry_unit_orientation]
3904
4063
  end
3905
4064
 
3906
- def self.set_neighbor_buildings(hpxml, args)
4065
+ def self.set_neighbor_buildings(hpxml_bldg, args)
3907
4066
  nbr_map = { Constants.FacadeFront => [args[:neighbor_front_distance], args[:neighbor_front_height]],
3908
4067
  Constants.FacadeBack => [args[:neighbor_back_distance], args[:neighbor_back_height]],
3909
4068
  Constants.FacadeLeft => [args[:neighbor_left_distance], args[:neighbor_left_height]],
@@ -3919,19 +4078,19 @@ class HPXMLFile
3919
4078
  height = neighbor_height.get
3920
4079
  end
3921
4080
 
3922
- hpxml.neighbor_buildings.add(azimuth: azimuth,
3923
- distance: distance,
3924
- height: height)
4081
+ hpxml_bldg.neighbor_buildings.add(azimuth: azimuth,
4082
+ distance: distance,
4083
+ height: height)
3925
4084
  end
3926
4085
  end
3927
4086
 
3928
- def self.set_building_occupancy(hpxml, args)
4087
+ def self.set_building_occupancy(hpxml_bldg, args)
3929
4088
  if args[:geometry_unit_num_occupants].is_initialized
3930
- hpxml.building_occupancy.number_of_residents = args[:geometry_unit_num_occupants].get
4089
+ hpxml_bldg.building_occupancy.number_of_residents = args[:geometry_unit_num_occupants].get
3931
4090
  end
3932
4091
  end
3933
4092
 
3934
- def self.set_building_construction(hpxml, args)
4093
+ def self.set_building_construction(hpxml_bldg, args)
3935
4094
  if args[:geometry_unit_type] == HPXML::ResidentialTypeApartment
3936
4095
  args[:geometry_unit_num_floors_above_grade] = 1
3937
4096
  end
@@ -3947,34 +4106,70 @@ class HPXMLFile
3947
4106
 
3948
4107
  conditioned_building_volume = args[:geometry_unit_cfa] * args[:geometry_average_ceiling_height]
3949
4108
 
3950
- hpxml.building_construction.number_of_conditioned_floors = number_of_conditioned_floors
3951
- hpxml.building_construction.number_of_conditioned_floors_above_grade = number_of_conditioned_floors_above_grade
3952
- hpxml.building_construction.number_of_bedrooms = args[:geometry_unit_num_bedrooms]
3953
- hpxml.building_construction.number_of_bathrooms = number_of_bathrooms
3954
- hpxml.building_construction.conditioned_floor_area = args[:geometry_unit_cfa]
3955
- hpxml.building_construction.conditioned_building_volume = conditioned_building_volume
3956
- hpxml.building_construction.average_ceiling_height = args[:geometry_average_ceiling_height]
3957
- hpxml.building_construction.residential_facility_type = args[:geometry_unit_type]
4109
+ hpxml_bldg.building_construction.number_of_conditioned_floors = number_of_conditioned_floors
4110
+ hpxml_bldg.building_construction.number_of_conditioned_floors_above_grade = number_of_conditioned_floors_above_grade
4111
+ hpxml_bldg.building_construction.number_of_bedrooms = args[:geometry_unit_num_bedrooms]
4112
+ hpxml_bldg.building_construction.number_of_bathrooms = number_of_bathrooms
4113
+ hpxml_bldg.building_construction.conditioned_floor_area = args[:geometry_unit_cfa]
4114
+ hpxml_bldg.building_construction.conditioned_building_volume = conditioned_building_volume
4115
+ hpxml_bldg.building_construction.average_ceiling_height = args[:geometry_average_ceiling_height]
4116
+ hpxml_bldg.building_construction.residential_facility_type = args[:geometry_unit_type]
3958
4117
 
3959
4118
  if args[:year_built].is_initialized
3960
- hpxml.building_construction.year_built = args[:year_built].get
4119
+ hpxml_bldg.building_construction.year_built = args[:year_built].get
4120
+ end
4121
+
4122
+ if args[:unit_multiplier].is_initialized
4123
+ hpxml_bldg.building_construction.number_of_units = args[:unit_multiplier].get
3961
4124
  end
3962
4125
  end
3963
4126
 
3964
- def self.set_climate_and_risk_zones(hpxml, args)
3965
- hpxml.climate_and_risk_zones.weather_station_id = 'WeatherStation'
4127
+ def self.set_building_header(hpxml_bldg, args)
4128
+ if args[:schedules_filepaths].is_initialized
4129
+ hpxml_bldg.header.schedules_filepaths = args[:schedules_filepaths].get.split(',').map(&:strip)
4130
+ end
4131
+
4132
+ if args[:heat_pump_sizing_methodology].is_initialized
4133
+ hpxml_bldg.header.heat_pump_sizing_methodology = args[:heat_pump_sizing_methodology].get
4134
+ end
4135
+
4136
+ if args[:window_natvent_availability].is_initialized
4137
+ hpxml_bldg.header.natvent_days_per_week = args[:window_natvent_availability].get
4138
+ end
4139
+
4140
+ if args[:window_shading_summer_season].is_initialized
4141
+ begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:window_shading_summer_season].get)
4142
+ hpxml_bldg.header.shading_summer_begin_month = begin_month
4143
+ hpxml_bldg.header.shading_summer_begin_day = begin_day
4144
+ hpxml_bldg.header.shading_summer_end_month = end_month
4145
+ hpxml_bldg.header.shading_summer_end_day = end_day
4146
+ end
4147
+
4148
+ if args[:additional_properties].is_initialized
4149
+ extension_properties = {}
4150
+ additional_properties = args[:additional_properties].get.split('|').map(&:strip)
4151
+ additional_properties.each do |additional_property|
4152
+ key, value = additional_property.split('=').map(&:strip)
4153
+ extension_properties[key] = value
4154
+ end
4155
+ hpxml_bldg.header.extension_properties = extension_properties
4156
+ end
4157
+ end
4158
+
4159
+ def self.set_climate_and_risk_zones(hpxml_bldg, args)
4160
+ hpxml_bldg.climate_and_risk_zones.weather_station_id = 'WeatherStation'
3966
4161
 
3967
4162
  if args[:site_iecc_zone].is_initialized
3968
- hpxml.climate_and_risk_zones.climate_zone_ieccs.add(zone: args[:site_iecc_zone].get,
3969
- year: 2006)
4163
+ hpxml_bldg.climate_and_risk_zones.climate_zone_ieccs.add(zone: args[:site_iecc_zone].get,
4164
+ year: 2006)
3970
4165
  end
3971
4166
 
3972
4167
  weather_station_name = File.basename(args[:weather_station_epw_filepath]).gsub('.epw', '')
3973
- hpxml.climate_and_risk_zones.weather_station_name = weather_station_name
3974
- hpxml.climate_and_risk_zones.weather_station_epw_filepath = args[:weather_station_epw_filepath]
4168
+ hpxml_bldg.climate_and_risk_zones.weather_station_name = weather_station_name
4169
+ hpxml_bldg.climate_and_risk_zones.weather_station_epw_filepath = args[:weather_station_epw_filepath]
3975
4170
  end
3976
4171
 
3977
- def self.set_air_infiltration_measurements(hpxml, args)
4172
+ def self.set_air_infiltration_measurements(hpxml_bldg, args)
3978
4173
  if args[:air_leakage_units] == HPXML::UnitsELA
3979
4174
  effective_leakage_area = args[:air_leakage_value]
3980
4175
  else
@@ -3989,22 +4184,22 @@ class HPXMLFile
3989
4184
  air_leakage_type = args[:air_leakage_type]
3990
4185
  end
3991
4186
  end
3992
- infiltration_volume = hpxml.building_construction.conditioned_building_volume
4187
+ infiltration_volume = hpxml_bldg.building_construction.conditioned_building_volume
3993
4188
 
3994
- hpxml.air_infiltration_measurements.add(id: "AirInfiltrationMeasurement#{hpxml.air_infiltration_measurements.size + 1}",
3995
- house_pressure: house_pressure,
3996
- unit_of_measure: unit_of_measure,
3997
- air_leakage: air_leakage,
3998
- effective_leakage_area: effective_leakage_area,
3999
- infiltration_volume: infiltration_volume,
4000
- infiltration_type: air_leakage_type)
4189
+ hpxml_bldg.air_infiltration_measurements.add(id: "AirInfiltrationMeasurement#{hpxml_bldg.air_infiltration_measurements.size + 1}",
4190
+ house_pressure: house_pressure,
4191
+ unit_of_measure: unit_of_measure,
4192
+ air_leakage: air_leakage,
4193
+ effective_leakage_area: effective_leakage_area,
4194
+ infiltration_volume: infiltration_volume,
4195
+ infiltration_type: air_leakage_type)
4001
4196
 
4002
4197
  if args[:air_leakage_has_flue_or_chimney_in_conditioned_space].is_initialized
4003
- hpxml.air_infiltration.has_flue_or_chimney_in_conditioned_space = args[:air_leakage_has_flue_or_chimney_in_conditioned_space].get
4198
+ hpxml_bldg.air_infiltration.has_flue_or_chimney_in_conditioned_space = args[:air_leakage_has_flue_or_chimney_in_conditioned_space].get
4004
4199
  end
4005
4200
  end
4006
4201
 
4007
- def self.set_roofs(hpxml, args, sorted_surfaces)
4202
+ def self.set_roofs(hpxml_bldg, args, sorted_surfaces)
4008
4203
  args[:geometry_roof_pitch] *= 12.0
4009
4204
  if (args[:geometry_attic_type] == HPXML::AtticTypeFlatRoof) || (args[:geometry_attic_type] == HPXML::AtticTypeBelowApartment)
4010
4205
  args[:geometry_roof_pitch] = 0.0
@@ -4036,21 +4231,21 @@ class HPXMLFile
4036
4231
  azimuth = Geometry.get_surface_azimuth(surface: surface, orientation: args[:geometry_unit_orientation])
4037
4232
  end
4038
4233
 
4039
- hpxml.roofs.add(id: "Roof#{hpxml.roofs.size + 1}",
4040
- interior_adjacent_to: Geometry.get_adjacent_to(surface: surface),
4041
- azimuth: azimuth,
4042
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4043
- roof_type: roof_type,
4044
- roof_color: roof_color,
4045
- pitch: args[:geometry_roof_pitch],
4046
- radiant_barrier: radiant_barrier,
4047
- radiant_barrier_grade: radiant_barrier_grade,
4048
- insulation_assembly_r_value: args[:roof_assembly_r])
4049
- @surface_ids[surface.name.to_s] = hpxml.roofs[-1].id
4234
+ hpxml_bldg.roofs.add(id: "Roof#{hpxml_bldg.roofs.size + 1}",
4235
+ interior_adjacent_to: Geometry.get_adjacent_to(surface: surface),
4236
+ azimuth: azimuth,
4237
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4238
+ roof_type: roof_type,
4239
+ roof_color: roof_color,
4240
+ pitch: args[:geometry_roof_pitch],
4241
+ radiant_barrier: radiant_barrier,
4242
+ radiant_barrier_grade: radiant_barrier_grade,
4243
+ insulation_assembly_r_value: args[:roof_assembly_r])
4244
+ @surface_ids[surface.name.to_s] = hpxml_bldg.roofs[-1].id
4050
4245
  end
4051
4246
  end
4052
4247
 
4053
- def self.set_rim_joists(hpxml, model, args, sorted_surfaces)
4248
+ def self.set_rim_joists(hpxml_bldg, model, args, sorted_surfaces)
4054
4249
  sorted_surfaces.each do |surface|
4055
4250
  next if surface.surfaceType != 'Wall'
4056
4251
  next unless ['Outdoors', 'Adiabatic'].include? surface.outsideBoundaryCondition
@@ -4069,7 +4264,7 @@ class HPXMLFile
4069
4264
  if adjacent_surface.nil? # adjacent to a space that is not explicitly in the model
4070
4265
  unless [HPXML::ResidentialTypeSFD].include?(args[:geometry_unit_type])
4071
4266
  exterior_adjacent_to = interior_adjacent_to
4072
- if exterior_adjacent_to == HPXML::LocationLivingSpace # living adjacent to living
4267
+ if exterior_adjacent_to == HPXML::LocationConditionedSpace # conditioned space adjacent to conditioned space
4073
4268
  exterior_adjacent_to = HPXML::LocationOtherHousingUnit
4074
4269
  end
4075
4270
  end
@@ -4094,34 +4289,34 @@ class HPXMLFile
4094
4289
 
4095
4290
  azimuth = Geometry.get_surface_azimuth(surface: surface, orientation: args[:geometry_unit_orientation])
4096
4291
 
4097
- hpxml.rim_joists.add(id: "RimJoist#{hpxml.rim_joists.size + 1}",
4098
- exterior_adjacent_to: exterior_adjacent_to,
4099
- interior_adjacent_to: interior_adjacent_to,
4100
- azimuth: azimuth,
4101
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4102
- siding: siding,
4103
- color: color,
4104
- insulation_assembly_r_value: insulation_assembly_r_value)
4105
- @surface_ids[surface.name.to_s] = hpxml.rim_joists[-1].id
4292
+ hpxml_bldg.rim_joists.add(id: "RimJoist#{hpxml_bldg.rim_joists.size + 1}",
4293
+ exterior_adjacent_to: exterior_adjacent_to,
4294
+ interior_adjacent_to: interior_adjacent_to,
4295
+ azimuth: azimuth,
4296
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4297
+ siding: siding,
4298
+ color: color,
4299
+ insulation_assembly_r_value: insulation_assembly_r_value)
4300
+ @surface_ids[surface.name.to_s] = hpxml_bldg.rim_joists[-1].id
4106
4301
  end
4107
4302
  end
4108
4303
 
4109
- def self.set_walls(hpxml, model, args, sorted_surfaces)
4304
+ def self.set_walls(hpxml_bldg, model, args, sorted_surfaces)
4110
4305
  sorted_surfaces.each do |surface|
4111
4306
  next if surface.surfaceType != 'Wall'
4112
4307
  next if Geometry.surface_is_rim_joist(surface, args[:geometry_rim_joist_height])
4113
4308
 
4114
4309
  interior_adjacent_to = Geometry.get_adjacent_to(surface: surface)
4115
- next unless [HPXML::LocationLivingSpace, HPXML::LocationAtticUnvented, HPXML::LocationAtticVented, HPXML::LocationGarage].include? interior_adjacent_to
4310
+ next unless [HPXML::LocationConditionedSpace, HPXML::LocationAtticUnvented, HPXML::LocationAtticVented, HPXML::LocationGarage].include? interior_adjacent_to
4116
4311
 
4117
4312
  exterior_adjacent_to = HPXML::LocationOutside
4118
4313
  if surface.adjacentSurface.is_initialized
4119
4314
  exterior_adjacent_to = Geometry.get_adjacent_to(surface: surface.adjacentSurface.get)
4120
- elsif surface.outsideBoundaryCondition == 'Adiabatic' # can be adjacent to living space, attic
4315
+ elsif surface.outsideBoundaryCondition == 'Adiabatic' # can be adjacent to conditioned space, attic
4121
4316
  adjacent_surface = Geometry.get_adiabatic_adjacent_surface(model: model, surface: surface)
4122
4317
  if adjacent_surface.nil? # adjacent to a space that is not explicitly in the model
4123
4318
  exterior_adjacent_to = interior_adjacent_to
4124
- if exterior_adjacent_to == HPXML::LocationLivingSpace # living adjacent to living
4319
+ if exterior_adjacent_to == HPXML::LocationConditionedSpace # conditioned space adjacent to conditioned space
4125
4320
  exterior_adjacent_to = HPXML::LocationOtherHousingUnit
4126
4321
  end
4127
4322
  else # adjacent to a space that is explicitly in the model
@@ -4129,7 +4324,7 @@ class HPXMLFile
4129
4324
  end
4130
4325
  end
4131
4326
 
4132
- next if exterior_adjacent_to == HPXML::LocationLivingSpace # already captured these surfaces
4327
+ next if exterior_adjacent_to == HPXML::LocationConditionedSpace # already captured these surfaces
4133
4328
 
4134
4329
  attic_locations = [HPXML::LocationAtticUnconditioned, HPXML::LocationAtticUnvented, HPXML::LocationAtticVented]
4135
4330
  attic_wall_type = nil
@@ -4156,35 +4351,35 @@ class HPXMLFile
4156
4351
 
4157
4352
  azimuth = Geometry.get_surface_azimuth(surface: surface, orientation: args[:geometry_unit_orientation])
4158
4353
 
4159
- hpxml.walls.add(id: "Wall#{hpxml.walls.size + 1}",
4160
- exterior_adjacent_to: exterior_adjacent_to,
4161
- interior_adjacent_to: interior_adjacent_to,
4162
- azimuth: azimuth,
4163
- wall_type: wall_type,
4164
- attic_wall_type: attic_wall_type,
4165
- siding: siding,
4166
- color: color,
4167
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'))
4168
- @surface_ids[surface.name.to_s] = hpxml.walls[-1].id
4354
+ hpxml_bldg.walls.add(id: "Wall#{hpxml_bldg.walls.size + 1}",
4355
+ exterior_adjacent_to: exterior_adjacent_to,
4356
+ interior_adjacent_to: interior_adjacent_to,
4357
+ azimuth: azimuth,
4358
+ wall_type: wall_type,
4359
+ attic_wall_type: attic_wall_type,
4360
+ siding: siding,
4361
+ color: color,
4362
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'))
4363
+ @surface_ids[surface.name.to_s] = hpxml_bldg.walls[-1].id
4169
4364
 
4170
4365
  is_uncond_attic_roof_insulated = false
4171
4366
  if attic_locations.include? interior_adjacent_to
4172
- hpxml.roofs.each do |roof|
4367
+ hpxml_bldg.roofs.each do |roof|
4173
4368
  next unless (roof.interior_adjacent_to == interior_adjacent_to) && (roof.insulation_assembly_r_value > 4.0)
4174
4369
 
4175
4370
  is_uncond_attic_roof_insulated = true
4176
4371
  end
4177
4372
  end
4178
4373
 
4179
- if hpxml.walls[-1].is_thermal_boundary || is_uncond_attic_roof_insulated # Assume wall is insulated if roof is insulated
4180
- hpxml.walls[-1].insulation_assembly_r_value = args[:wall_assembly_r]
4374
+ if hpxml_bldg.walls[-1].is_thermal_boundary || is_uncond_attic_roof_insulated # Assume wall is insulated if roof is insulated
4375
+ hpxml_bldg.walls[-1].insulation_assembly_r_value = args[:wall_assembly_r]
4181
4376
  else
4182
- hpxml.walls[-1].insulation_assembly_r_value = 4.0 # Uninsulated
4377
+ hpxml_bldg.walls[-1].insulation_assembly_r_value = 4.0 # Uninsulated
4183
4378
  end
4184
4379
  end
4185
4380
  end
4186
4381
 
4187
- def self.set_foundation_walls(hpxml, model, args, sorted_surfaces)
4382
+ def self.set_foundation_walls(hpxml_bldg, model, args, sorted_surfaces)
4188
4383
  sorted_surfaces.each do |surface|
4189
4384
  next if surface.surfaceType != 'Wall'
4190
4385
  next unless ['Foundation', 'Adiabatic'].include? surface.outsideBoundaryCondition
@@ -4203,7 +4398,7 @@ class HPXMLFile
4203
4398
  if adjacent_surface.nil? # adjacent to a space that is not explicitly in the model
4204
4399
  unless [HPXML::ResidentialTypeSFD].include?(args[:geometry_unit_type])
4205
4400
  exterior_adjacent_to = interior_adjacent_to
4206
- if exterior_adjacent_to == HPXML::LocationLivingSpace # living adjacent to living
4401
+ if exterior_adjacent_to == HPXML::LocationConditionedSpace # conditioned space adjacent to conditioned space
4207
4402
  exterior_adjacent_to = HPXML::LocationOtherHousingUnit
4208
4403
  end
4209
4404
  end
@@ -4257,27 +4452,27 @@ class HPXMLFile
4257
4452
 
4258
4453
  azimuth = Geometry.get_surface_azimuth(surface: surface, orientation: args[:geometry_unit_orientation])
4259
4454
 
4260
- hpxml.foundation_walls.add(id: "FoundationWall#{hpxml.foundation_walls.size + 1}",
4261
- exterior_adjacent_to: exterior_adjacent_to,
4262
- interior_adjacent_to: interior_adjacent_to,
4263
- type: type,
4264
- azimuth: azimuth,
4265
- height: args[:geometry_foundation_height],
4266
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4267
- thickness: thickness,
4268
- depth_below_grade: args[:geometry_foundation_height] - args[:geometry_foundation_height_above_grade],
4269
- insulation_assembly_r_value: insulation_assembly_r_value,
4270
- insulation_interior_r_value: insulation_interior_r_value,
4271
- insulation_interior_distance_to_top: insulation_interior_distance_to_top,
4272
- insulation_interior_distance_to_bottom: insulation_interior_distance_to_bottom,
4273
- insulation_exterior_r_value: insulation_exterior_r_value,
4274
- insulation_exterior_distance_to_top: insulation_exterior_distance_to_top,
4275
- insulation_exterior_distance_to_bottom: insulation_exterior_distance_to_bottom)
4276
- @surface_ids[surface.name.to_s] = hpxml.foundation_walls[-1].id
4455
+ hpxml_bldg.foundation_walls.add(id: "FoundationWall#{hpxml_bldg.foundation_walls.size + 1}",
4456
+ exterior_adjacent_to: exterior_adjacent_to,
4457
+ interior_adjacent_to: interior_adjacent_to,
4458
+ type: type,
4459
+ azimuth: azimuth,
4460
+ height: args[:geometry_foundation_height],
4461
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4462
+ thickness: thickness,
4463
+ depth_below_grade: args[:geometry_foundation_height] - args[:geometry_foundation_height_above_grade],
4464
+ insulation_assembly_r_value: insulation_assembly_r_value,
4465
+ insulation_interior_r_value: insulation_interior_r_value,
4466
+ insulation_interior_distance_to_top: insulation_interior_distance_to_top,
4467
+ insulation_interior_distance_to_bottom: insulation_interior_distance_to_bottom,
4468
+ insulation_exterior_r_value: insulation_exterior_r_value,
4469
+ insulation_exterior_distance_to_top: insulation_exterior_distance_to_top,
4470
+ insulation_exterior_distance_to_bottom: insulation_exterior_distance_to_bottom)
4471
+ @surface_ids[surface.name.to_s] = hpxml_bldg.foundation_walls[-1].id
4277
4472
  end
4278
4473
  end
4279
4474
 
4280
- def self.set_floors(hpxml, args, sorted_surfaces)
4475
+ def self.set_floors(hpxml_bldg, args, sorted_surfaces)
4281
4476
  if [HPXML::FoundationTypeBasementConditioned,
4282
4477
  HPXML::FoundationTypeCrawlspaceConditioned].include?(args[:geometry_foundation_type]) && (args[:floor_over_foundation_assembly_r] > 2.1)
4283
4478
  args[:floor_over_foundation_assembly_r] = 2.1 # Uninsulated
@@ -4292,7 +4487,7 @@ class HPXMLFile
4292
4487
  next unless ['Floor', 'RoofCeiling'].include? surface.surfaceType
4293
4488
 
4294
4489
  interior_adjacent_to = Geometry.get_adjacent_to(surface: surface)
4295
- next unless [HPXML::LocationLivingSpace, HPXML::LocationGarage].include? interior_adjacent_to
4490
+ next unless [HPXML::LocationConditionedSpace, HPXML::LocationGarage].include? interior_adjacent_to
4296
4491
 
4297
4492
  exterior_adjacent_to = HPXML::LocationOutside
4298
4493
  if surface.adjacentSurface.is_initialized
@@ -4308,40 +4503,40 @@ class HPXMLFile
4308
4503
 
4309
4504
  next if interior_adjacent_to == exterior_adjacent_to
4310
4505
  next if (surface.surfaceType == 'RoofCeiling') && (exterior_adjacent_to == HPXML::LocationOutside)
4311
- next if [HPXML::LocationLivingSpace,
4506
+ next if [HPXML::LocationConditionedSpace,
4312
4507
  HPXML::LocationBasementConditioned,
4313
4508
  HPXML::LocationCrawlspaceConditioned].include? exterior_adjacent_to
4314
4509
 
4315
- hpxml.floors.add(id: "Floor#{hpxml.floors.size + 1}",
4316
- exterior_adjacent_to: exterior_adjacent_to,
4317
- interior_adjacent_to: interior_adjacent_to,
4318
- floor_type: args[:floor_type],
4319
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4320
- floor_or_ceiling: floor_or_ceiling)
4321
- if hpxml.floors[-1].floor_or_ceiling.nil?
4322
- if hpxml.floors[-1].is_floor
4323
- hpxml.floors[-1].floor_or_ceiling = HPXML::FloorOrCeilingFloor
4324
- elsif hpxml.floors[-1].is_ceiling
4325
- hpxml.floors[-1].floor_or_ceiling = HPXML::FloorOrCeilingCeiling
4510
+ hpxml_bldg.floors.add(id: "Floor#{hpxml_bldg.floors.size + 1}",
4511
+ exterior_adjacent_to: exterior_adjacent_to,
4512
+ interior_adjacent_to: interior_adjacent_to,
4513
+ floor_type: args[:floor_type],
4514
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4515
+ floor_or_ceiling: floor_or_ceiling)
4516
+ if hpxml_bldg.floors[-1].floor_or_ceiling.nil?
4517
+ if hpxml_bldg.floors[-1].is_floor
4518
+ hpxml_bldg.floors[-1].floor_or_ceiling = HPXML::FloorOrCeilingFloor
4519
+ elsif hpxml_bldg.floors[-1].is_ceiling
4520
+ hpxml_bldg.floors[-1].floor_or_ceiling = HPXML::FloorOrCeilingCeiling
4326
4521
  end
4327
4522
  end
4328
- @surface_ids[surface.name.to_s] = hpxml.floors[-1].id
4523
+ @surface_ids[surface.name.to_s] = hpxml_bldg.floors[-1].id
4329
4524
 
4330
- if hpxml.floors[-1].is_thermal_boundary
4525
+ if hpxml_bldg.floors[-1].is_thermal_boundary
4331
4526
  if [HPXML::LocationAtticUnvented, HPXML::LocationAtticVented].include? exterior_adjacent_to
4332
- hpxml.floors[-1].insulation_assembly_r_value = args[:ceiling_assembly_r]
4527
+ hpxml_bldg.floors[-1].insulation_assembly_r_value = args[:ceiling_assembly_r]
4333
4528
  elsif [HPXML::LocationGarage].include? exterior_adjacent_to
4334
- hpxml.floors[-1].insulation_assembly_r_value = args[:floor_over_garage_assembly_r]
4529
+ hpxml_bldg.floors[-1].insulation_assembly_r_value = args[:floor_over_garage_assembly_r]
4335
4530
  else
4336
- hpxml.floors[-1].insulation_assembly_r_value = args[:floor_over_foundation_assembly_r]
4531
+ hpxml_bldg.floors[-1].insulation_assembly_r_value = args[:floor_over_foundation_assembly_r]
4337
4532
  end
4338
4533
  else
4339
- hpxml.floors[-1].insulation_assembly_r_value = 2.1 # Uninsulated
4534
+ hpxml_bldg.floors[-1].insulation_assembly_r_value = 2.1 # Uninsulated
4340
4535
  end
4341
4536
  end
4342
4537
  end
4343
4538
 
4344
- def self.set_slabs(hpxml, model, args, sorted_surfaces)
4539
+ def self.set_slabs(hpxml_bldg, model, args, sorted_surfaces)
4345
4540
  sorted_surfaces.each do |surface|
4346
4541
  next unless ['Foundation'].include? surface.outsideBoundaryCondition
4347
4542
  next if surface.surfaceType != 'Floor'
@@ -4368,10 +4563,6 @@ class HPXMLFile
4368
4563
  exposed_perimeter -= Geometry.get_unexposed_garage_perimeter(**args)
4369
4564
  end
4370
4565
 
4371
- if [HPXML::LocationLivingSpace, HPXML::LocationGarage].include? interior_adjacent_to
4372
- depth_below_grade = 0
4373
- end
4374
-
4375
4566
  if args[:slab_under_width] == 999
4376
4567
  under_slab_insulation_spans_entire_slab = true
4377
4568
  else
@@ -4390,31 +4581,30 @@ class HPXMLFile
4390
4581
  carpet_r_value = args[:slab_carpet_r].get
4391
4582
  end
4392
4583
 
4393
- hpxml.slabs.add(id: "Slab#{hpxml.slabs.size + 1}",
4394
- interior_adjacent_to: interior_adjacent_to,
4395
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4396
- thickness: thickness,
4397
- exposed_perimeter: exposed_perimeter,
4398
- perimeter_insulation_depth: args[:slab_perimeter_depth],
4399
- under_slab_insulation_width: under_slab_insulation_width,
4400
- perimeter_insulation_r_value: args[:slab_perimeter_insulation_r],
4401
- under_slab_insulation_r_value: args[:slab_under_insulation_r],
4402
- under_slab_insulation_spans_entire_slab: under_slab_insulation_spans_entire_slab,
4403
- depth_below_grade: depth_below_grade,
4404
- carpet_fraction: carpet_fraction,
4405
- carpet_r_value: carpet_r_value)
4406
- @surface_ids[surface.name.to_s] = hpxml.slabs[-1].id
4584
+ hpxml_bldg.slabs.add(id: "Slab#{hpxml_bldg.slabs.size + 1}",
4585
+ interior_adjacent_to: interior_adjacent_to,
4586
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4587
+ thickness: thickness,
4588
+ exposed_perimeter: exposed_perimeter,
4589
+ perimeter_insulation_depth: args[:slab_perimeter_depth],
4590
+ under_slab_insulation_width: under_slab_insulation_width,
4591
+ perimeter_insulation_r_value: args[:slab_perimeter_insulation_r],
4592
+ under_slab_insulation_r_value: args[:slab_under_insulation_r],
4593
+ under_slab_insulation_spans_entire_slab: under_slab_insulation_spans_entire_slab,
4594
+ carpet_fraction: carpet_fraction,
4595
+ carpet_r_value: carpet_r_value)
4596
+ @surface_ids[surface.name.to_s] = hpxml_bldg.slabs[-1].id
4407
4597
 
4408
4598
  next unless interior_adjacent_to == HPXML::LocationCrawlspaceConditioned
4409
4599
 
4410
4600
  # Increase Conditioned Building Volume & Infiltration Volume
4411
- conditioned_crawlspace_volume = hpxml.slabs[-1].area * args[:geometry_foundation_height]
4412
- hpxml.building_construction.conditioned_building_volume += conditioned_crawlspace_volume
4413
- hpxml.air_infiltration_measurements[0].infiltration_volume += conditioned_crawlspace_volume
4601
+ conditioned_crawlspace_volume = hpxml_bldg.slabs[-1].area * args[:geometry_foundation_height]
4602
+ hpxml_bldg.building_construction.conditioned_building_volume += conditioned_crawlspace_volume
4603
+ hpxml_bldg.air_infiltration_measurements[0].infiltration_volume += conditioned_crawlspace_volume
4414
4604
  end
4415
4605
  end
4416
4606
 
4417
- def self.set_windows(hpxml, model, args, sorted_subsurfaces)
4607
+ def self.set_windows(hpxml_bldg, model, args, sorted_subsurfaces)
4418
4608
  sorted_subsurfaces.each do |sub_surface|
4419
4609
  next if sub_surface.subSurfaceType != 'FixedWindow'
4420
4610
 
@@ -4450,7 +4640,7 @@ class HPXMLFile
4450
4640
  end
4451
4641
 
4452
4642
  # Get max z coordinate of this window
4453
- sub_surface_z = Geometry.getSurfaceZValues([sub_surface]).max + UnitConversions.convert(sub_surface.space.get.zOrigin, 'm', 'ft')
4643
+ sub_surface_z = Geometry.get_surface_z_values([sub_surface]).max + UnitConversions.convert(sub_surface.space.get.zOrigin, 'm', 'ft')
4454
4644
 
4455
4645
  overhangs_depth = args[:geometry_eaves_depth]
4456
4646
  overhangs_distance_to_top_of_window = eaves_z - sub_surface_z # difference between max z coordinates of eaves and this window
@@ -4486,25 +4676,25 @@ class HPXMLFile
4486
4676
  wall_idref = @surface_ids[surface.name.to_s]
4487
4677
  next if wall_idref.nil?
4488
4678
 
4489
- hpxml.windows.add(id: "Window#{hpxml.windows.size + 1}",
4490
- area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
4491
- azimuth: azimuth,
4492
- ufactor: args[:window_ufactor],
4493
- shgc: args[:window_shgc],
4494
- storm_type: window_storm_type,
4495
- overhangs_depth: overhangs_depth,
4496
- overhangs_distance_to_top_of_window: overhangs_distance_to_top_of_window,
4497
- overhangs_distance_to_bottom_of_window: overhangs_distance_to_bottom_of_window,
4498
- interior_shading_factor_winter: interior_shading_factor_winter,
4499
- interior_shading_factor_summer: interior_shading_factor_summer,
4500
- exterior_shading_factor_winter: exterior_shading_factor_winter,
4501
- exterior_shading_factor_summer: exterior_shading_factor_summer,
4502
- fraction_operable: fraction_operable,
4503
- wall_idref: wall_idref)
4679
+ hpxml_bldg.windows.add(id: "Window#{hpxml_bldg.windows.size + 1}",
4680
+ area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
4681
+ azimuth: azimuth,
4682
+ ufactor: args[:window_ufactor],
4683
+ shgc: args[:window_shgc],
4684
+ storm_type: window_storm_type,
4685
+ overhangs_depth: overhangs_depth,
4686
+ overhangs_distance_to_top_of_window: overhangs_distance_to_top_of_window,
4687
+ overhangs_distance_to_bottom_of_window: overhangs_distance_to_bottom_of_window,
4688
+ interior_shading_factor_winter: interior_shading_factor_winter,
4689
+ interior_shading_factor_summer: interior_shading_factor_summer,
4690
+ exterior_shading_factor_winter: exterior_shading_factor_winter,
4691
+ exterior_shading_factor_summer: exterior_shading_factor_summer,
4692
+ fraction_operable: fraction_operable,
4693
+ wall_idref: wall_idref)
4504
4694
  end
4505
4695
  end
4506
4696
 
4507
- def self.set_skylights(hpxml, args, sorted_subsurfaces)
4697
+ def self.set_skylights(hpxml_bldg, args, sorted_subsurfaces)
4508
4698
  sorted_subsurfaces.each do |sub_surface|
4509
4699
  next if sub_surface.subSurfaceType != 'Skylight'
4510
4700
 
@@ -4520,17 +4710,17 @@ class HPXMLFile
4520
4710
  roof_idref = @surface_ids[surface.name.to_s]
4521
4711
  next if roof_idref.nil?
4522
4712
 
4523
- hpxml.skylights.add(id: "Skylight#{hpxml.skylights.size + 1}",
4524
- area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
4525
- azimuth: azimuth,
4526
- ufactor: args[:skylight_ufactor],
4527
- shgc: args[:skylight_shgc],
4528
- storm_type: skylight_storm_type,
4529
- roof_idref: roof_idref)
4713
+ hpxml_bldg.skylights.add(id: "Skylight#{hpxml_bldg.skylights.size + 1}",
4714
+ area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
4715
+ azimuth: azimuth,
4716
+ ufactor: args[:skylight_ufactor],
4717
+ shgc: args[:skylight_shgc],
4718
+ storm_type: skylight_storm_type,
4719
+ roof_idref: roof_idref)
4530
4720
  end
4531
4721
  end
4532
4722
 
4533
- def self.set_doors(hpxml, model, args, sorted_subsurfaces)
4723
+ def self.set_doors(hpxml_bldg, model, args, sorted_subsurfaces)
4534
4724
  sorted_subsurfaces.each do |sub_surface|
4535
4725
  next if sub_surface.subSurfaceType != 'Door'
4536
4726
 
@@ -4546,18 +4736,18 @@ class HPXMLFile
4546
4736
  wall_idref = @surface_ids[surface.name.to_s]
4547
4737
  next if wall_idref.nil?
4548
4738
 
4549
- hpxml.doors.add(id: "Door#{hpxml.doors.size + 1}",
4550
- wall_idref: wall_idref,
4551
- area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
4552
- azimuth: args[:geometry_unit_orientation],
4553
- r_value: args[:door_rvalue])
4739
+ hpxml_bldg.doors.add(id: "Door#{hpxml_bldg.doors.size + 1}",
4740
+ wall_idref: wall_idref,
4741
+ area: UnitConversions.convert(sub_surface.grossArea, 'm^2', 'ft^2'),
4742
+ azimuth: args[:geometry_unit_orientation],
4743
+ r_value: args[:door_rvalue])
4554
4744
  end
4555
4745
  end
4556
4746
 
4557
- def self.set_attics(hpxml, args)
4558
- surf_ids = { 'roofs' => { 'surfaces' => hpxml.roofs, 'ids' => [] },
4559
- 'walls' => { 'surfaces' => hpxml.walls, 'ids' => [] },
4560
- 'floors' => { 'surfaces' => hpxml.floors, 'ids' => [] } }
4747
+ def self.set_attics(hpxml_bldg, args)
4748
+ surf_ids = { 'roofs' => { 'surfaces' => hpxml_bldg.roofs, 'ids' => [] },
4749
+ 'walls' => { 'surfaces' => hpxml_bldg.walls, 'ids' => [] },
4750
+ 'floors' => { 'surfaces' => hpxml_bldg.floors, 'ids' => [] } }
4561
4751
 
4562
4752
  attic_locations = [HPXML::LocationAtticUnconditioned, HPXML::LocationAtticUnvented, HPXML::LocationAtticVented]
4563
4753
  surf_ids.values.each do |surf_hash|
@@ -4570,27 +4760,27 @@ class HPXMLFile
4570
4760
  end
4571
4761
 
4572
4762
  # Add attached roofs for cathedral ceiling
4573
- living_space = HPXML::LocationLivingSpace
4763
+ conditioned_space = HPXML::LocationConditionedSpace
4574
4764
  surf_ids['roofs']['surfaces'].each do |surface|
4575
- next if (living_space != surface.interior_adjacent_to) &&
4576
- (living_space != surface.exterior_adjacent_to)
4765
+ next if (conditioned_space != surface.interior_adjacent_to) &&
4766
+ (conditioned_space != surface.exterior_adjacent_to)
4577
4767
 
4578
4768
  surf_ids['roofs']['ids'] << surface.id
4579
4769
  end
4580
4770
 
4581
- hpxml.attics.add(id: "Attic#{hpxml.attics.size + 1}",
4582
- attic_type: args[:geometry_attic_type],
4583
- attached_to_roof_idrefs: surf_ids['roofs']['ids'],
4584
- attached_to_wall_idrefs: surf_ids['walls']['ids'],
4585
- attached_to_floor_idrefs: surf_ids['floors']['ids'])
4771
+ hpxml_bldg.attics.add(id: "Attic#{hpxml_bldg.attics.size + 1}",
4772
+ attic_type: args[:geometry_attic_type],
4773
+ attached_to_roof_idrefs: surf_ids['roofs']['ids'],
4774
+ attached_to_wall_idrefs: surf_ids['walls']['ids'],
4775
+ attached_to_floor_idrefs: surf_ids['floors']['ids'])
4586
4776
  end
4587
4777
 
4588
- def self.set_foundations(hpxml, args)
4589
- surf_ids = { 'slabs' => { 'surfaces' => hpxml.slabs, 'ids' => [] },
4590
- 'floors' => { 'surfaces' => hpxml.floors, 'ids' => [] },
4591
- 'foundation_walls' => { 'surfaces' => hpxml.foundation_walls, 'ids' => [] },
4592
- 'walls' => { 'surfaces' => hpxml.walls, 'ids' => [] },
4593
- 'rim_joists' => { 'surfaces' => hpxml.rim_joists, 'ids' => [] }, }
4778
+ def self.set_foundations(hpxml_bldg, args)
4779
+ surf_ids = { 'slabs' => { 'surfaces' => hpxml_bldg.slabs, 'ids' => [] },
4780
+ 'floors' => { 'surfaces' => hpxml_bldg.floors, 'ids' => [] },
4781
+ 'foundation_walls' => { 'surfaces' => hpxml_bldg.foundation_walls, 'ids' => [] },
4782
+ 'walls' => { 'surfaces' => hpxml_bldg.walls, 'ids' => [] },
4783
+ 'rim_joists' => { 'surfaces' => hpxml_bldg.rim_joists, 'ids' => [] }, }
4594
4784
 
4595
4785
  foundation_locations = [HPXML::LocationBasementConditioned,
4596
4786
  HPXML::LocationBasementUnconditioned,
@@ -4602,23 +4792,37 @@ class HPXMLFile
4602
4792
  surf_hash['surfaces'].each do |surface|
4603
4793
  next unless (foundation_locations.include? surface.interior_adjacent_to) ||
4604
4794
  (foundation_locations.include? surface.exterior_adjacent_to) ||
4605
- (surf_type == 'slabs' && surface.interior_adjacent_to == HPXML::LocationLivingSpace) ||
4606
- (surf_type == 'floors' && surface.exterior_adjacent_to == HPXML::LocationOutside)
4795
+ (surf_type == 'slabs' && surface.interior_adjacent_to == HPXML::LocationConditionedSpace) ||
4796
+ (surf_type == 'floors' && [HPXML::LocationOutside, HPXML::LocationManufacturedHomeUnderBelly].include?(surface.exterior_adjacent_to))
4607
4797
 
4608
4798
  surf_hash['ids'] << surface.id
4609
4799
  end
4610
4800
  end
4611
4801
 
4612
- hpxml.foundations.add(id: "Foundation#{hpxml.foundations.size + 1}",
4613
- foundation_type: args[:geometry_foundation_type],
4614
- attached_to_slab_idrefs: surf_ids['slabs']['ids'],
4615
- attached_to_floor_idrefs: surf_ids['floors']['ids'],
4616
- attached_to_foundation_wall_idrefs: surf_ids['foundation_walls']['ids'],
4617
- attached_to_wall_idrefs: surf_ids['walls']['ids'],
4618
- attached_to_rim_joist_idrefs: surf_ids['rim_joists']['ids'])
4802
+ if args[:geometry_foundation_type].start_with?(HPXML::FoundationTypeBellyAndWing)
4803
+ foundation_type = HPXML::FoundationTypeBellyAndWing
4804
+ if args[:geometry_foundation_type].end_with?('WithSkirt')
4805
+ belly_wing_skirt_present = true
4806
+ elsif args[:geometry_foundation_type].end_with?('NoSkirt')
4807
+ belly_wing_skirt_present = false
4808
+ else
4809
+ fail 'Unepected belly and wing foundation type.'
4810
+ end
4811
+ else
4812
+ foundation_type = args[:geometry_foundation_type]
4813
+ end
4814
+
4815
+ hpxml_bldg.foundations.add(id: "Foundation#{hpxml_bldg.foundations.size + 1}",
4816
+ foundation_type: foundation_type,
4817
+ attached_to_slab_idrefs: surf_ids['slabs']['ids'],
4818
+ attached_to_floor_idrefs: surf_ids['floors']['ids'],
4819
+ attached_to_foundation_wall_idrefs: surf_ids['foundation_walls']['ids'],
4820
+ attached_to_wall_idrefs: surf_ids['walls']['ids'],
4821
+ attached_to_rim_joist_idrefs: surf_ids['rim_joists']['ids'],
4822
+ belly_wing_skirt_present: belly_wing_skirt_present)
4619
4823
  end
4620
4824
 
4621
- def self.set_heating_systems(hpxml, args)
4825
+ def self.set_heating_systems(hpxml_bldg, args)
4622
4826
  heating_system_type = args[:heating_system_type]
4623
4827
 
4624
4828
  return if heating_system_type == 'none'
@@ -4639,9 +4843,8 @@ class HPXMLFile
4639
4843
  heating_efficiency_afue = args[:heating_system_heating_efficiency]
4640
4844
  elsif [HPXML::HVACTypeElectricResistance,
4641
4845
  HPXML::HVACTypeStove,
4642
- HPXML::HVACTypePortableHeater,
4643
- HPXML::HVACTypeFireplace,
4644
- HPXML::HVACTypeFixedHeater].include?(heating_system_type)
4846
+ HPXML::HVACTypeSpaceHeater,
4847
+ HPXML::HVACTypeFireplace].include?(heating_system_type)
4645
4848
  heating_efficiency_percent = args[:heating_system_heating_efficiency]
4646
4849
  end
4647
4850
 
@@ -4670,22 +4873,22 @@ class HPXMLFile
4670
4873
  heating_system_type = HPXML::HVACTypeBoiler
4671
4874
  end
4672
4875
 
4673
- hpxml.heating_systems.add(id: "HeatingSystem#{hpxml.heating_systems.size + 1}",
4674
- heating_system_type: heating_system_type,
4675
- heating_system_fuel: heating_system_fuel,
4676
- heating_capacity: heating_capacity,
4677
- fraction_heat_load_served: fraction_heat_load_served,
4678
- heating_efficiency_afue: heating_efficiency_afue,
4679
- heating_efficiency_percent: heating_efficiency_percent,
4680
- airflow_defect_ratio: airflow_defect_ratio,
4681
- pilot_light: pilot_light,
4682
- pilot_light_btuh: pilot_light_btuh,
4683
- is_shared_system: is_shared_system,
4684
- number_of_units_served: number_of_units_served,
4685
- primary_system: true)
4876
+ hpxml_bldg.heating_systems.add(id: "HeatingSystem#{hpxml_bldg.heating_systems.size + 1}",
4877
+ heating_system_type: heating_system_type,
4878
+ heating_system_fuel: heating_system_fuel,
4879
+ heating_capacity: heating_capacity,
4880
+ fraction_heat_load_served: fraction_heat_load_served,
4881
+ heating_efficiency_afue: heating_efficiency_afue,
4882
+ heating_efficiency_percent: heating_efficiency_percent,
4883
+ airflow_defect_ratio: airflow_defect_ratio,
4884
+ pilot_light: pilot_light,
4885
+ pilot_light_btuh: pilot_light_btuh,
4886
+ is_shared_system: is_shared_system,
4887
+ number_of_units_served: number_of_units_served,
4888
+ primary_system: true)
4686
4889
  end
4687
4890
 
4688
- def self.set_cooling_systems(hpxml, args)
4891
+ def self.set_cooling_systems(hpxml_bldg, args)
4689
4892
  cooling_system_type = args[:cooling_system_type]
4690
4893
 
4691
4894
  return if cooling_system_type == 'none'
@@ -4695,7 +4898,7 @@ class HPXMLFile
4695
4898
  end
4696
4899
 
4697
4900
  if args[:cooling_system_cooling_compressor_type].is_initialized
4698
- if cooling_system_type == HPXML::HVACTypeCentralAirConditioner
4901
+ if [HPXML::HVACTypeCentralAirConditioner, HPXML::HVACTypeMiniSplitAirConditioner].include? cooling_system_type
4699
4902
  compressor_type = args[:cooling_system_cooling_compressor_type].get
4700
4903
  end
4701
4904
  end
@@ -4754,28 +4957,28 @@ class HPXMLFile
4754
4957
  end
4755
4958
  end
4756
4959
 
4757
- hpxml.cooling_systems.add(id: "CoolingSystem#{hpxml.cooling_systems.size + 1}",
4758
- cooling_system_type: cooling_system_type,
4759
- cooling_system_fuel: HPXML::FuelTypeElectricity,
4760
- cooling_capacity: cooling_capacity,
4761
- fraction_cool_load_served: args[:cooling_system_fraction_cool_load_served],
4762
- compressor_type: compressor_type,
4763
- cooling_shr: cooling_shr,
4764
- cooling_efficiency_seer: cooling_efficiency_seer,
4765
- cooling_efficiency_seer2: cooling_efficiency_seer2,
4766
- cooling_efficiency_eer: cooling_efficiency_eer,
4767
- cooling_efficiency_ceer: cooling_efficiency_ceer,
4768
- airflow_defect_ratio: airflow_defect_ratio,
4769
- charge_defect_ratio: charge_defect_ratio,
4770
- crankcase_heater_watts: cooling_system_crankcase_heater_watts,
4771
- primary_system: true,
4772
- integrated_heating_system_fuel: integrated_heating_system_fuel,
4773
- integrated_heating_system_capacity: integrated_heating_system_capacity,
4774
- integrated_heating_system_efficiency_percent: integrated_heating_system_efficiency_percent,
4775
- integrated_heating_system_fraction_heat_load_served: integrated_heating_system_fraction_heat_load_served)
4960
+ hpxml_bldg.cooling_systems.add(id: "CoolingSystem#{hpxml_bldg.cooling_systems.size + 1}",
4961
+ cooling_system_type: cooling_system_type,
4962
+ cooling_system_fuel: HPXML::FuelTypeElectricity,
4963
+ cooling_capacity: cooling_capacity,
4964
+ fraction_cool_load_served: args[:cooling_system_fraction_cool_load_served],
4965
+ compressor_type: compressor_type,
4966
+ cooling_shr: cooling_shr,
4967
+ cooling_efficiency_seer: cooling_efficiency_seer,
4968
+ cooling_efficiency_seer2: cooling_efficiency_seer2,
4969
+ cooling_efficiency_eer: cooling_efficiency_eer,
4970
+ cooling_efficiency_ceer: cooling_efficiency_ceer,
4971
+ airflow_defect_ratio: airflow_defect_ratio,
4972
+ charge_defect_ratio: charge_defect_ratio,
4973
+ crankcase_heater_watts: cooling_system_crankcase_heater_watts,
4974
+ primary_system: true,
4975
+ integrated_heating_system_fuel: integrated_heating_system_fuel,
4976
+ integrated_heating_system_capacity: integrated_heating_system_capacity,
4977
+ integrated_heating_system_efficiency_percent: integrated_heating_system_efficiency_percent,
4978
+ integrated_heating_system_fraction_heat_load_served: integrated_heating_system_fraction_heat_load_served)
4776
4979
  end
4777
4980
 
4778
- def self.set_heat_pumps(hpxml, args)
4981
+ def self.set_heat_pumps(hpxml_bldg, args)
4779
4982
  heat_pump_type = args[:heat_pump_type]
4780
4983
 
4781
4984
  return if heat_pump_type == 'none'
@@ -4811,7 +5014,7 @@ class HPXMLFile
4811
5014
  end
4812
5015
 
4813
5016
  backup_type = args[:heat_pump_backup_type]
4814
- backup_system_idref = "HeatingSystem#{hpxml.heating_systems.size + 1}"
5017
+ backup_system_idref = "HeatingSystem#{hpxml_bldg.heating_systems.size + 1}"
4815
5018
  end
4816
5019
 
4817
5020
  if args[:heat_pump_compressor_lockout_temp].is_initialized
@@ -4834,7 +5037,7 @@ class HPXMLFile
4834
5037
  end
4835
5038
 
4836
5039
  if args[:heat_pump_cooling_compressor_type].is_initialized
4837
- if [HPXML::HVACTypeHeatPumpAirToAir].include? heat_pump_type
5040
+ if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit].include? heat_pump_type
4838
5041
  compressor_type = args[:heat_pump_cooling_compressor_type].get
4839
5042
  end
4840
5043
  end
@@ -4886,44 +5089,40 @@ class HPXMLFile
4886
5089
  primary_cooling_system = true
4887
5090
  end
4888
5091
 
4889
- if args[:heat_pump_sizing_methodology].is_initialized
4890
- hpxml.header.heat_pump_sizing_methodology = args[:heat_pump_sizing_methodology].get
4891
- end
4892
-
4893
- hpxml.heat_pumps.add(id: "HeatPump#{hpxml.heat_pumps.size + 1}",
4894
- heat_pump_type: heat_pump_type,
4895
- heat_pump_fuel: HPXML::FuelTypeElectricity,
4896
- heating_capacity: heating_capacity,
4897
- heating_capacity_retention_fraction: heating_capacity_retention_fraction,
4898
- heating_capacity_retention_temp: heating_capacity_retention_temp,
4899
- compressor_type: compressor_type,
4900
- compressor_lockout_temp: compressor_lockout_temp,
4901
- cooling_shr: cooling_shr,
4902
- cooling_capacity: cooling_capacity,
4903
- fraction_heat_load_served: fraction_heat_load_served,
4904
- fraction_cool_load_served: fraction_cool_load_served,
4905
- backup_type: backup_type,
4906
- backup_system_idref: backup_system_idref,
4907
- backup_heating_fuel: backup_heating_fuel,
4908
- backup_heating_capacity: backup_heating_capacity,
4909
- backup_heating_efficiency_afue: backup_heating_efficiency_afue,
4910
- backup_heating_efficiency_percent: backup_heating_efficiency_percent,
4911
- backup_heating_switchover_temp: backup_heating_switchover_temp,
4912
- backup_heating_lockout_temp: backup_heating_lockout_temp,
4913
- heating_efficiency_hspf: heating_efficiency_hspf,
4914
- heating_efficiency_hspf2: heating_efficiency_hspf2,
4915
- cooling_efficiency_seer: cooling_efficiency_seer,
4916
- cooling_efficiency_seer2: cooling_efficiency_seer2,
4917
- heating_efficiency_cop: heating_efficiency_cop,
4918
- cooling_efficiency_eer: cooling_efficiency_eer,
4919
- airflow_defect_ratio: airflow_defect_ratio,
4920
- charge_defect_ratio: charge_defect_ratio,
4921
- crankcase_heater_watts: heat_pump_crankcase_heater_watts,
4922
- primary_heating_system: primary_heating_system,
4923
- primary_cooling_system: primary_cooling_system)
5092
+ hpxml_bldg.heat_pumps.add(id: "HeatPump#{hpxml_bldg.heat_pumps.size + 1}",
5093
+ heat_pump_type: heat_pump_type,
5094
+ heat_pump_fuel: HPXML::FuelTypeElectricity,
5095
+ heating_capacity: heating_capacity,
5096
+ heating_capacity_retention_fraction: heating_capacity_retention_fraction,
5097
+ heating_capacity_retention_temp: heating_capacity_retention_temp,
5098
+ compressor_type: compressor_type,
5099
+ compressor_lockout_temp: compressor_lockout_temp,
5100
+ cooling_shr: cooling_shr,
5101
+ cooling_capacity: cooling_capacity,
5102
+ fraction_heat_load_served: fraction_heat_load_served,
5103
+ fraction_cool_load_served: fraction_cool_load_served,
5104
+ backup_type: backup_type,
5105
+ backup_system_idref: backup_system_idref,
5106
+ backup_heating_fuel: backup_heating_fuel,
5107
+ backup_heating_capacity: backup_heating_capacity,
5108
+ backup_heating_efficiency_afue: backup_heating_efficiency_afue,
5109
+ backup_heating_efficiency_percent: backup_heating_efficiency_percent,
5110
+ backup_heating_switchover_temp: backup_heating_switchover_temp,
5111
+ backup_heating_lockout_temp: backup_heating_lockout_temp,
5112
+ heating_efficiency_hspf: heating_efficiency_hspf,
5113
+ heating_efficiency_hspf2: heating_efficiency_hspf2,
5114
+ cooling_efficiency_seer: cooling_efficiency_seer,
5115
+ cooling_efficiency_seer2: cooling_efficiency_seer2,
5116
+ heating_efficiency_cop: heating_efficiency_cop,
5117
+ cooling_efficiency_eer: cooling_efficiency_eer,
5118
+ airflow_defect_ratio: airflow_defect_ratio,
5119
+ charge_defect_ratio: charge_defect_ratio,
5120
+ crankcase_heater_watts: heat_pump_crankcase_heater_watts,
5121
+ primary_heating_system: primary_heating_system,
5122
+ primary_cooling_system: primary_cooling_system)
4924
5123
  end
4925
5124
 
4926
- def self.set_secondary_heating_systems(hpxml, args)
5125
+ def self.set_secondary_heating_systems(hpxml_bldg, args)
4927
5126
  heating_system_type = args[:heating_system_2_type]
4928
5127
  heating_system_is_heatpump_backup = (args[:heat_pump_type] != 'none' && args[:heat_pump_backup_type] == HPXML::HeatPumpBackupTypeSeparate)
4929
5128
 
@@ -4941,7 +5140,7 @@ class HPXMLFile
4941
5140
 
4942
5141
  if [HPXML::HVACTypeFurnace, HPXML::HVACTypeWallFurnace, HPXML::HVACTypeFloorFurnace].include?(heating_system_type) || heating_system_type.include?(HPXML::HVACTypeBoiler)
4943
5142
  heating_efficiency_afue = args[:heating_system_2_heating_efficiency]
4944
- elsif [HPXML::HVACTypeElectricResistance, HPXML::HVACTypeStove, HPXML::HVACTypePortableHeater, HPXML::HVACTypeFireplace].include?(heating_system_type)
5143
+ elsif [HPXML::HVACTypeElectricResistance, HPXML::HVACTypeStove, HPXML::HVACTypeSpaceHeater, HPXML::HVACTypeFireplace].include?(heating_system_type)
4945
5144
  heating_efficiency_percent = args[:heating_system_2_heating_efficiency]
4946
5145
  end
4947
5146
 
@@ -4953,42 +5152,42 @@ class HPXMLFile
4953
5152
  fraction_heat_load_served = args[:heating_system_2_fraction_heat_load_served]
4954
5153
  end
4955
5154
 
4956
- hpxml.heating_systems.add(id: "HeatingSystem#{hpxml.heating_systems.size + 1}",
4957
- heating_system_type: heating_system_type,
4958
- heating_system_fuel: heating_system_fuel,
4959
- heating_capacity: heating_capacity,
4960
- fraction_heat_load_served: fraction_heat_load_served,
4961
- heating_efficiency_afue: heating_efficiency_afue,
4962
- heating_efficiency_percent: heating_efficiency_percent)
5155
+ hpxml_bldg.heating_systems.add(id: "HeatingSystem#{hpxml_bldg.heating_systems.size + 1}",
5156
+ heating_system_type: heating_system_type,
5157
+ heating_system_fuel: heating_system_fuel,
5158
+ heating_capacity: heating_capacity,
5159
+ fraction_heat_load_served: fraction_heat_load_served,
5160
+ heating_efficiency_afue: heating_efficiency_afue,
5161
+ heating_efficiency_percent: heating_efficiency_percent)
4963
5162
  end
4964
5163
 
4965
- def self.set_hvac_distribution(hpxml, args)
5164
+ def self.set_hvac_distribution(hpxml_bldg, args)
4966
5165
  # HydronicDistribution?
4967
- hpxml.heating_systems.each do |heating_system|
5166
+ hpxml_bldg.heating_systems.each do |heating_system|
4968
5167
  next unless [heating_system.heating_system_type].include?(HPXML::HVACTypeBoiler)
4969
5168
  next if args[:heating_system_type].include?('Fan Coil')
4970
5169
 
4971
- hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
4972
- distribution_system_type: HPXML::HVACDistributionTypeHydronic,
4973
- hydronic_type: HPXML::HydronicTypeBaseboard)
4974
- heating_system.distribution_system_idref = hpxml.hvac_distributions[-1].id
5170
+ hpxml_bldg.hvac_distributions.add(id: "HVACDistribution#{hpxml_bldg.hvac_distributions.size + 1}",
5171
+ distribution_system_type: HPXML::HVACDistributionTypeHydronic,
5172
+ hydronic_type: HPXML::HydronicTypeBaseboard)
5173
+ heating_system.distribution_system_idref = hpxml_bldg.hvac_distributions[-1].id
4975
5174
  end
4976
5175
 
4977
5176
  # AirDistribution?
4978
5177
  air_distribution_systems = []
4979
- hpxml.heating_systems.each do |heating_system|
5178
+ hpxml_bldg.heating_systems.each do |heating_system|
4980
5179
  if [HPXML::HVACTypeFurnace].include?(heating_system.heating_system_type)
4981
5180
  air_distribution_systems << heating_system
4982
5181
  end
4983
5182
  end
4984
- hpxml.cooling_systems.each do |cooling_system|
5183
+ hpxml_bldg.cooling_systems.each do |cooling_system|
4985
5184
  if [HPXML::HVACTypeCentralAirConditioner].include?(cooling_system.cooling_system_type)
4986
5185
  air_distribution_systems << cooling_system
4987
5186
  elsif [HPXML::HVACTypeEvaporativeCooler, HPXML::HVACTypeMiniSplitAirConditioner].include?(cooling_system.cooling_system_type) && args[:cooling_system_is_ducted]
4988
5187
  air_distribution_systems << cooling_system
4989
5188
  end
4990
5189
  end
4991
- hpxml.heat_pumps.each do |heat_pump|
5190
+ hpxml_bldg.heat_pumps.each do |heat_pump|
4992
5191
  if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump.heat_pump_type
4993
5192
  air_distribution_systems << heat_pump
4994
5193
  elsif [HPXML::HVACTypeHeatPumpMiniSplit].include?(heat_pump.heat_pump_type)
@@ -5000,7 +5199,9 @@ class HPXMLFile
5000
5199
 
5001
5200
  # FanCoil?
5002
5201
  fan_coil_distribution_systems = []
5003
- hpxml.heating_systems.each do |heating_system|
5202
+ hpxml_bldg.heating_systems.each do |heating_system|
5203
+ next unless heating_system.primary_system
5204
+
5004
5205
  if args[:heating_system_type].include?('Fan Coil')
5005
5206
  fan_coil_distribution_systems << heating_system
5006
5207
  end
@@ -5012,7 +5213,7 @@ class HPXMLFile
5012
5213
  number_of_return_registers = args[:ducts_number_of_return_registers].get
5013
5214
  end
5014
5215
 
5015
- if [HPXML::HVACTypeEvaporativeCooler].include?(args[:cooling_system_type]) && hpxml.heating_systems.size == 0 && hpxml.heat_pumps.size == 0
5216
+ if [HPXML::HVACTypeEvaporativeCooler].include?(args[:cooling_system_type]) && hpxml_bldg.heating_systems.size == 0 && hpxml_bldg.heat_pumps.size == 0
5016
5217
  number_of_return_registers = nil
5017
5218
  if args[:cooling_system_is_ducted]
5018
5219
  number_of_return_registers = 0
@@ -5020,23 +5221,23 @@ class HPXMLFile
5020
5221
  end
5021
5222
 
5022
5223
  if air_distribution_systems.size > 0
5023
- hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
5024
- distribution_system_type: HPXML::HVACDistributionTypeAir,
5025
- air_type: HPXML::AirTypeRegularVelocity,
5026
- number_of_return_registers: number_of_return_registers)
5224
+ hpxml_bldg.hvac_distributions.add(id: "HVACDistribution#{hpxml_bldg.hvac_distributions.size + 1}",
5225
+ distribution_system_type: HPXML::HVACDistributionTypeAir,
5226
+ air_type: HPXML::AirTypeRegularVelocity,
5227
+ number_of_return_registers: number_of_return_registers)
5027
5228
  air_distribution_systems.each do |hvac_system|
5028
- hvac_system.distribution_system_idref = hpxml.hvac_distributions[-1].id
5229
+ hvac_system.distribution_system_idref = hpxml_bldg.hvac_distributions[-1].id
5029
5230
  end
5030
- set_duct_leakages(args, hpxml.hvac_distributions[-1])
5031
- set_ducts(args, hpxml.hvac_distributions[-1])
5231
+ set_duct_leakages(args, hpxml_bldg.hvac_distributions[-1])
5232
+ set_ducts(hpxml_bldg, args, hpxml_bldg.hvac_distributions[-1])
5032
5233
  end
5033
5234
 
5034
5235
  if fan_coil_distribution_systems.size > 0
5035
- hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
5036
- distribution_system_type: HPXML::HVACDistributionTypeAir,
5037
- air_type: HPXML::AirTypeFanCoil)
5236
+ hpxml_bldg.hvac_distributions.add(id: "HVACDistribution#{hpxml_bldg.hvac_distributions.size + 1}",
5237
+ distribution_system_type: HPXML::HVACDistributionTypeAir,
5238
+ air_type: HPXML::AirTypeFanCoil)
5038
5239
  fan_coil_distribution_systems.each do |hvac_system|
5039
- hvac_system.distribution_system_idref = hpxml.hvac_distributions[-1].id
5240
+ hvac_system.distribution_system_idref = hpxml_bldg.hvac_distributions[-1].id
5040
5241
  end
5041
5242
  end
5042
5243
  end
@@ -5053,23 +5254,74 @@ class HPXMLFile
5053
5254
  duct_leakage_total_or_to_outside: HPXML::DuctLeakageToOutside)
5054
5255
  end
5055
5256
 
5056
- def self.set_ducts(args, hvac_distribution)
5257
+ def self.get_location(location, foundation_type, attic_type)
5258
+ if location == HPXML::LocationCrawlspace
5259
+ if foundation_type == HPXML::FoundationTypeCrawlspaceUnvented
5260
+ return HPXML::LocationCrawlspaceUnvented
5261
+ elsif foundation_type == HPXML::FoundationTypeCrawlspaceVented
5262
+ return HPXML::LocationCrawlspaceVented
5263
+ elsif foundation_type == HPXML::FoundationTypeCrawlspaceConditioned
5264
+ return HPXML::LocationCrawlspaceConditioned
5265
+ else
5266
+ fail "Specified '#{location}' but foundation type is '#{foundation_type}'."
5267
+ end
5268
+ elsif location == HPXML::LocationAttic
5269
+ if attic_type == HPXML::AtticTypeUnvented
5270
+ return HPXML::LocationAtticUnvented
5271
+ elsif attic_type == HPXML::AtticTypeVented
5272
+ return HPXML::LocationAtticVented
5273
+ elsif attic_type == HPXML::AtticTypeConditioned
5274
+ return HPXML::LocationConditionedSpace
5275
+ else
5276
+ fail "Specified '#{location}' but attic type is '#{attic_type}'."
5277
+ end
5278
+ end
5279
+ return location
5280
+ end
5281
+
5282
+ def self.set_ducts(hpxml_bldg, args, hvac_distribution)
5057
5283
  if args[:ducts_supply_location].is_initialized
5058
- ducts_supply_location = args[:ducts_supply_location].get
5284
+ ducts_supply_location = get_location(args[:ducts_supply_location].get, hpxml_bldg.foundations[-1].foundation_type, hpxml_bldg.attics[-1].attic_type)
5059
5285
  end
5060
5286
 
5061
5287
  if args[:ducts_return_location].is_initialized
5062
- ducts_return_location = args[:ducts_return_location].get
5288
+ ducts_return_location = get_location(args[:ducts_return_location].get, hpxml_bldg.foundations[-1].foundation_type, hpxml_bldg.attics[-1].attic_type)
5063
5289
  end
5064
5290
 
5065
5291
  if args[:ducts_supply_surface_area].is_initialized
5066
5292
  ducts_supply_surface_area = args[:ducts_supply_surface_area].get
5067
5293
  end
5068
5294
 
5295
+ if args[:ducts_supply_surface_area_fraction].is_initialized
5296
+ ducts_supply_area_fraction = args[:ducts_supply_surface_area_fraction].get
5297
+ end
5298
+
5069
5299
  if args[:ducts_return_surface_area].is_initialized
5070
5300
  ducts_return_surface_area = args[:ducts_return_surface_area].get
5071
5301
  end
5072
5302
 
5303
+ if args[:ducts_return_surface_area_fraction].is_initialized
5304
+ ducts_return_area_fraction = args[:ducts_return_surface_area_fraction].get
5305
+ end
5306
+
5307
+ if (not ducts_supply_location.nil?) && ducts_supply_surface_area.nil? && ducts_supply_area_fraction.nil?
5308
+ # Supply duct location without any area inputs provided; set area fraction
5309
+ if ducts_supply_location == HPXML::LocationConditionedSpace
5310
+ ducts_supply_area_fraction = 1.0
5311
+ else
5312
+ ducts_supply_area_fraction = HVAC.get_default_duct_fraction_outside_conditioned_space(args[:geometry_unit_num_floors_above_grade])
5313
+ end
5314
+ end
5315
+
5316
+ if (not ducts_return_location.nil?) && ducts_return_surface_area.nil? && ducts_return_area_fraction.nil?
5317
+ # Return duct location without any area inputs provided; set area fraction
5318
+ if ducts_return_location == HPXML::LocationConditionedSpace
5319
+ ducts_return_area_fraction = 1.0
5320
+ else
5321
+ ducts_return_area_fraction = HVAC.get_default_duct_fraction_outside_conditioned_space(args[:geometry_unit_num_floors_above_grade])
5322
+ end
5323
+ end
5324
+
5073
5325
  if args[:ducts_supply_buried_insulation_level].is_initialized
5074
5326
  ducts_supply_buried_insulation_level = args[:ducts_supply_buried_insulation_level].get
5075
5327
  end
@@ -5083,7 +5335,8 @@ class HPXMLFile
5083
5335
  duct_insulation_r_value: args[:ducts_supply_insulation_r],
5084
5336
  duct_buried_insulation_level: ducts_supply_buried_insulation_level,
5085
5337
  duct_location: ducts_supply_location,
5086
- duct_surface_area: ducts_supply_surface_area)
5338
+ duct_surface_area: ducts_supply_surface_area,
5339
+ duct_fraction_area: ducts_supply_area_fraction)
5087
5340
 
5088
5341
  if not ([HPXML::HVACTypeEvaporativeCooler].include?(args[:cooling_system_type]) && args[:cooling_system_is_ducted])
5089
5342
  hvac_distribution.ducts.add(id: "Ducts#{hvac_distribution.ducts.size + 1}",
@@ -5091,20 +5344,56 @@ class HPXMLFile
5091
5344
  duct_insulation_r_value: args[:ducts_return_insulation_r],
5092
5345
  duct_buried_insulation_level: ducts_return_buried_insulation_level,
5093
5346
  duct_location: ducts_return_location,
5094
- duct_surface_area: ducts_return_surface_area)
5347
+ duct_surface_area: ducts_return_surface_area,
5348
+ duct_fraction_area: ducts_return_area_fraction)
5349
+ end
5350
+
5351
+ if (not ducts_supply_area_fraction.nil?) && (ducts_supply_area_fraction < 1)
5352
+ # OS-HPXML needs duct fractions to sum to 1; add remaining ducts in conditioned space.
5353
+ hvac_distribution.ducts.add(id: "Ducts#{hvac_distribution.ducts.size + 1}",
5354
+ duct_type: HPXML::DuctTypeSupply,
5355
+ duct_insulation_r_value: 0.0,
5356
+ duct_location: HPXML::LocationConditionedSpace,
5357
+ duct_fraction_area: 1.0 - ducts_supply_area_fraction)
5358
+ end
5359
+
5360
+ if not hvac_distribution.ducts.find { |d| d.duct_type == HPXML::DuctTypeReturn }.nil?
5361
+ if (not ducts_return_area_fraction.nil?) && (ducts_return_area_fraction < 1)
5362
+ # OS-HPXML needs duct fractions to sum to 1; add remaining ducts in conditioned space.
5363
+ hvac_distribution.ducts.add(id: "Ducts#{hvac_distribution.ducts.size + 1}",
5364
+ duct_type: HPXML::DuctTypeReturn,
5365
+ duct_insulation_r_value: 0.0,
5366
+ duct_location: HPXML::LocationConditionedSpace,
5367
+ duct_fraction_area: 1.0 - ducts_return_area_fraction)
5368
+ end
5095
5369
  end
5096
5370
 
5097
5371
  # If duct surface areas are defaulted, set CFA served
5098
5372
  if hvac_distribution.ducts.select { |d| d.duct_surface_area.nil? }.size > 0
5099
- hvac_distribution.conditioned_floor_area_served = args[:geometry_unit_cfa]
5373
+ max_fraction_load_served = 0.0
5374
+ hvac_distribution.hvac_systems.each do |hvac_system|
5375
+ if hvac_system.respond_to?(:fraction_heat_load_served)
5376
+ if hvac_system.is_a?(HPXML::HeatingSystem) && hvac_system.is_heat_pump_backup_system
5377
+ # HP backup system, use HP fraction heat load served
5378
+ fraction_heat_load_served = hvac_system.primary_heat_pump.fraction_heat_load_served
5379
+ else
5380
+ fraction_heat_load_served = hvac_system.fraction_heat_load_served
5381
+ end
5382
+ max_fraction_load_served = [max_fraction_load_served, fraction_heat_load_served].max
5383
+ end
5384
+ if hvac_system.respond_to?(:fraction_cool_load_served)
5385
+ max_fraction_load_served = [max_fraction_load_served, hvac_system.fraction_cool_load_served].max
5386
+ end
5387
+ end
5388
+ hvac_distribution.conditioned_floor_area_served = args[:geometry_unit_cfa] * max_fraction_load_served
5100
5389
  end
5101
5390
  end
5102
5391
 
5103
- def self.set_hvac_control(hpxml, args, epw_file, weather)
5392
+ def self.set_hvac_control(hpxml, hpxml_bldg, args, epw_file, weather)
5104
5393
  return if (args[:heating_system_type] == 'none') && (args[:cooling_system_type] == 'none') && (args[:heat_pump_type] == 'none')
5105
5394
 
5106
5395
  # Heating
5107
- if hpxml.total_fraction_heat_load_served > 0
5396
+ if hpxml_bldg.total_fraction_heat_load_served > 0
5108
5397
 
5109
5398
  if args[:hvac_control_heating_weekday_setpoint].is_initialized && args[:hvac_control_heating_weekend_setpoint].is_initialized
5110
5399
  if args[:hvac_control_heating_weekday_setpoint].get == args[:hvac_control_heating_weekend_setpoint].get && !args[:hvac_control_heating_weekday_setpoint].get.include?(',')
@@ -5133,7 +5422,7 @@ class HPXMLFile
5133
5422
  end
5134
5423
 
5135
5424
  # Cooling
5136
- if hpxml.total_fraction_cool_load_served > 0
5425
+ if hpxml_bldg.total_fraction_cool_load_served > 0
5137
5426
 
5138
5427
  if args[:hvac_control_cooling_weekday_setpoint].is_initialized && args[:hvac_control_cooling_weekend_setpoint].is_initialized
5139
5428
  if args[:hvac_control_cooling_weekday_setpoint].get == args[:hvac_control_cooling_weekend_setpoint].get && !args[:hvac_control_cooling_weekday_setpoint].get.include?(',')
@@ -5165,25 +5454,25 @@ class HPXMLFile
5165
5454
 
5166
5455
  end
5167
5456
 
5168
- hpxml.hvac_controls.add(id: "HVACControl#{hpxml.hvac_controls.size + 1}",
5169
- heating_setpoint_temp: heating_setpoint_temp,
5170
- cooling_setpoint_temp: cooling_setpoint_temp,
5171
- weekday_heating_setpoints: weekday_heating_setpoints,
5172
- weekend_heating_setpoints: weekend_heating_setpoints,
5173
- weekday_cooling_setpoints: weekday_cooling_setpoints,
5174
- weekend_cooling_setpoints: weekend_cooling_setpoints,
5175
- ceiling_fan_cooling_setpoint_temp_offset: ceiling_fan_cooling_setpoint_temp_offset,
5176
- seasons_heating_begin_month: seasons_heating_begin_month,
5177
- seasons_heating_begin_day: seasons_heating_begin_day,
5178
- seasons_heating_end_month: seasons_heating_end_month,
5179
- seasons_heating_end_day: seasons_heating_end_day,
5180
- seasons_cooling_begin_month: seasons_cooling_begin_month,
5181
- seasons_cooling_begin_day: seasons_cooling_begin_day,
5182
- seasons_cooling_end_month: seasons_cooling_end_month,
5183
- seasons_cooling_end_day: seasons_cooling_end_day)
5457
+ hpxml_bldg.hvac_controls.add(id: "HVACControl#{hpxml_bldg.hvac_controls.size + 1}",
5458
+ heating_setpoint_temp: heating_setpoint_temp,
5459
+ cooling_setpoint_temp: cooling_setpoint_temp,
5460
+ weekday_heating_setpoints: weekday_heating_setpoints,
5461
+ weekend_heating_setpoints: weekend_heating_setpoints,
5462
+ weekday_cooling_setpoints: weekday_cooling_setpoints,
5463
+ weekend_cooling_setpoints: weekend_cooling_setpoints,
5464
+ ceiling_fan_cooling_setpoint_temp_offset: ceiling_fan_cooling_setpoint_temp_offset,
5465
+ seasons_heating_begin_month: seasons_heating_begin_month,
5466
+ seasons_heating_begin_day: seasons_heating_begin_day,
5467
+ seasons_heating_end_month: seasons_heating_end_month,
5468
+ seasons_heating_end_day: seasons_heating_end_day,
5469
+ seasons_cooling_begin_month: seasons_cooling_begin_month,
5470
+ seasons_cooling_begin_day: seasons_cooling_begin_day,
5471
+ seasons_cooling_end_month: seasons_cooling_end_month,
5472
+ seasons_cooling_end_day: seasons_cooling_end_day)
5184
5473
  end
5185
5474
 
5186
- def self.set_ventilation_fans(hpxml, args)
5475
+ def self.set_ventilation_fans(hpxml_bldg, args)
5187
5476
  if args[:mech_vent_fan_type] != 'none'
5188
5477
 
5189
5478
  if [HPXML::MechVentTypeERV].include?(args[:mech_vent_fan_type])
@@ -5204,7 +5493,7 @@ class HPXMLFile
5204
5493
 
5205
5494
  distribution_system_idref = nil
5206
5495
  if args[:mech_vent_fan_type] == HPXML::MechVentTypeCFIS
5207
- hpxml.hvac_distributions.each do |hvac_distribution|
5496
+ hpxml_bldg.hvac_distributions.each do |hvac_distribution|
5208
5497
  next unless hvac_distribution.distribution_system_type == HPXML::HVACDistributionTypeAir
5209
5498
  next if hvac_distribution.air_type != HPXML::AirTypeRegularVelocity
5210
5499
 
@@ -5241,27 +5530,27 @@ class HPXMLFile
5241
5530
  rated_flow_rate = args[:mech_vent_flow_rate].get
5242
5531
  end
5243
5532
 
5244
- hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
5245
- fan_type: args[:mech_vent_fan_type],
5246
- cfis_addtl_runtime_operating_mode: cfis_addtl_runtime_operating_mode,
5247
- rated_flow_rate: rated_flow_rate,
5248
- hours_in_operation: hours_in_operation,
5249
- used_for_whole_building_ventilation: true,
5250
- total_recovery_efficiency: total_recovery_efficiency,
5251
- total_recovery_efficiency_adjusted: total_recovery_efficiency_adjusted,
5252
- sensible_recovery_efficiency: sensible_recovery_efficiency,
5253
- sensible_recovery_efficiency_adjusted: sensible_recovery_efficiency_adjusted,
5254
- fan_power: fan_power,
5255
- distribution_system_idref: distribution_system_idref,
5256
- is_shared_system: is_shared_system,
5257
- in_unit_flow_rate: in_unit_flow_rate,
5258
- fraction_recirculation: fraction_recirculation,
5259
- preheating_fuel: preheating_fuel,
5260
- preheating_efficiency_cop: preheating_efficiency_cop,
5261
- preheating_fraction_load_served: preheating_fraction_load_served,
5262
- precooling_fuel: precooling_fuel,
5263
- precooling_efficiency_cop: precooling_efficiency_cop,
5264
- precooling_fraction_load_served: precooling_fraction_load_served)
5533
+ hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
5534
+ fan_type: args[:mech_vent_fan_type],
5535
+ cfis_addtl_runtime_operating_mode: cfis_addtl_runtime_operating_mode,
5536
+ rated_flow_rate: rated_flow_rate,
5537
+ hours_in_operation: hours_in_operation,
5538
+ used_for_whole_building_ventilation: true,
5539
+ total_recovery_efficiency: total_recovery_efficiency,
5540
+ total_recovery_efficiency_adjusted: total_recovery_efficiency_adjusted,
5541
+ sensible_recovery_efficiency: sensible_recovery_efficiency,
5542
+ sensible_recovery_efficiency_adjusted: sensible_recovery_efficiency_adjusted,
5543
+ fan_power: fan_power,
5544
+ distribution_system_idref: distribution_system_idref,
5545
+ is_shared_system: is_shared_system,
5546
+ in_unit_flow_rate: in_unit_flow_rate,
5547
+ fraction_recirculation: fraction_recirculation,
5548
+ preheating_fuel: preheating_fuel,
5549
+ preheating_efficiency_cop: preheating_efficiency_cop,
5550
+ preheating_fraction_load_served: preheating_fraction_load_served,
5551
+ precooling_fuel: precooling_fuel,
5552
+ precooling_efficiency_cop: precooling_efficiency_cop,
5553
+ precooling_fraction_load_served: precooling_fraction_load_served)
5265
5554
  end
5266
5555
 
5267
5556
  if args[:mech_vent_2_fan_type] != 'none'
@@ -5286,16 +5575,16 @@ class HPXMLFile
5286
5575
  hours_in_operation = args[:mech_vent_2_hours_in_operation]
5287
5576
  fan_power = args[:mech_vent_2_fan_power]
5288
5577
 
5289
- hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
5290
- fan_type: args[:mech_vent_2_fan_type],
5291
- rated_flow_rate: args[:mech_vent_2_flow_rate],
5292
- hours_in_operation: hours_in_operation,
5293
- used_for_whole_building_ventilation: true,
5294
- total_recovery_efficiency: total_recovery_efficiency,
5295
- total_recovery_efficiency_adjusted: total_recovery_efficiency_adjusted,
5296
- sensible_recovery_efficiency: sensible_recovery_efficiency,
5297
- sensible_recovery_efficiency_adjusted: sensible_recovery_efficiency_adjusted,
5298
- fan_power: fan_power)
5578
+ hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
5579
+ fan_type: args[:mech_vent_2_fan_type],
5580
+ rated_flow_rate: args[:mech_vent_2_flow_rate],
5581
+ hours_in_operation: hours_in_operation,
5582
+ used_for_whole_building_ventilation: true,
5583
+ total_recovery_efficiency: total_recovery_efficiency,
5584
+ total_recovery_efficiency_adjusted: total_recovery_efficiency_adjusted,
5585
+ sensible_recovery_efficiency: sensible_recovery_efficiency,
5586
+ sensible_recovery_efficiency_adjusted: sensible_recovery_efficiency_adjusted,
5587
+ fan_power: fan_power)
5299
5588
  end
5300
5589
 
5301
5590
  if !args[:kitchen_fans_quantity].is_initialized || (args[:kitchen_fans_quantity].get > 0)
@@ -5319,14 +5608,14 @@ class HPXMLFile
5319
5608
  quantity = args[:kitchen_fans_quantity].get
5320
5609
  end
5321
5610
 
5322
- hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
5323
- rated_flow_rate: rated_flow_rate,
5324
- used_for_local_ventilation: true,
5325
- hours_in_operation: hours_in_operation,
5326
- fan_location: HPXML::LocationKitchen,
5327
- fan_power: fan_power,
5328
- start_hour: start_hour,
5329
- count: quantity)
5611
+ hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
5612
+ rated_flow_rate: rated_flow_rate,
5613
+ used_for_local_ventilation: true,
5614
+ hours_in_operation: hours_in_operation,
5615
+ fan_location: HPXML::LocationKitchen,
5616
+ fan_power: fan_power,
5617
+ start_hour: start_hour,
5618
+ count: quantity)
5330
5619
  end
5331
5620
 
5332
5621
  if !args[:bathroom_fans_quantity].is_initialized || (args[:bathroom_fans_quantity].get > 0)
@@ -5350,14 +5639,14 @@ class HPXMLFile
5350
5639
  quantity = args[:bathroom_fans_quantity].get
5351
5640
  end
5352
5641
 
5353
- hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
5354
- rated_flow_rate: rated_flow_rate,
5355
- used_for_local_ventilation: true,
5356
- hours_in_operation: hours_in_operation,
5357
- fan_location: HPXML::LocationBath,
5358
- fan_power: fan_power,
5359
- start_hour: start_hour,
5360
- count: quantity)
5642
+ hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
5643
+ rated_flow_rate: rated_flow_rate,
5644
+ used_for_local_ventilation: true,
5645
+ hours_in_operation: hours_in_operation,
5646
+ fan_location: HPXML::LocationBath,
5647
+ fan_power: fan_power,
5648
+ start_hour: start_hour,
5649
+ count: quantity)
5361
5650
  end
5362
5651
 
5363
5652
  if args[:whole_house_fan_present]
@@ -5369,14 +5658,14 @@ class HPXMLFile
5369
5658
  fan_power = args[:whole_house_fan_power].get
5370
5659
  end
5371
5660
 
5372
- hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
5373
- rated_flow_rate: rated_flow_rate,
5374
- used_for_seasonal_cooling_load_reduction: true,
5375
- fan_power: fan_power)
5661
+ hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
5662
+ rated_flow_rate: rated_flow_rate,
5663
+ used_for_seasonal_cooling_load_reduction: true,
5664
+ fan_power: fan_power)
5376
5665
  end
5377
5666
  end
5378
5667
 
5379
- def self.set_water_heating_systems(hpxml, args)
5668
+ def self.set_water_heating_systems(hpxml_bldg, args)
5380
5669
  water_heater_type = args[:water_heater_type]
5381
5670
  return if water_heater_type == 'none'
5382
5671
 
@@ -5387,7 +5676,7 @@ class HPXMLFile
5387
5676
  end
5388
5677
 
5389
5678
  if args[:water_heater_location].is_initialized
5390
- location = args[:water_heater_location].get
5679
+ location = get_location(args[:water_heater_location].get, hpxml_bldg.foundations[-1].foundation_type, hpxml_bldg.attics[-1].attic_type)
5391
5680
  end
5392
5681
 
5393
5682
  if args[:water_heater_tank_volume].is_initialized
@@ -5426,8 +5715,8 @@ class HPXMLFile
5426
5715
  fuel_type = nil
5427
5716
  heating_capacity = nil
5428
5717
  energy_factor = nil
5429
- if hpxml.heating_systems.size > 0
5430
- related_hvac_idref = hpxml.heating_systems[0].id
5718
+ if hpxml_bldg.heating_systems.size > 0
5719
+ related_hvac_idref = hpxml_bldg.heating_systems[0].id
5431
5720
  end
5432
5721
  end
5433
5722
 
@@ -5456,13 +5745,13 @@ class HPXMLFile
5456
5745
  uses_desuperheater = args[:water_heater_uses_desuperheater].get
5457
5746
  if uses_desuperheater
5458
5747
  related_hvac_idref = nil
5459
- hpxml.cooling_systems.each do |cooling_system|
5748
+ hpxml_bldg.cooling_systems.each do |cooling_system|
5460
5749
  next unless [HPXML::HVACTypeCentralAirConditioner,
5461
5750
  HPXML::HVACTypeMiniSplitAirConditioner].include? cooling_system.cooling_system_type
5462
5751
 
5463
5752
  related_hvac_idref = cooling_system.id
5464
5753
  end
5465
- hpxml.heat_pumps.each do |heat_pump|
5754
+ hpxml_bldg.heat_pumps.each do |heat_pump|
5466
5755
  next unless [HPXML::HVACTypeHeatPumpAirToAir,
5467
5756
  HPXML::HVACTypeHeatPumpMiniSplit,
5468
5757
  HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump.heat_pump_type
@@ -5486,30 +5775,30 @@ class HPXMLFile
5486
5775
  end
5487
5776
  end
5488
5777
 
5489
- hpxml.water_heating_systems.add(id: "WaterHeatingSystem#{hpxml.water_heating_systems.size + 1}",
5490
- water_heater_type: water_heater_type,
5491
- fuel_type: fuel_type,
5492
- location: location,
5493
- tank_volume: tank_volume,
5494
- fraction_dhw_load_served: 1.0,
5495
- energy_factor: energy_factor,
5496
- uniform_energy_factor: uniform_energy_factor,
5497
- usage_bin: usage_bin,
5498
- recovery_efficiency: recovery_efficiency,
5499
- uses_desuperheater: uses_desuperheater,
5500
- related_hvac_idref: related_hvac_idref,
5501
- standby_loss_units: standby_loss_units,
5502
- standby_loss_value: standby_loss_value,
5503
- jacket_r_value: jacket_r_value,
5504
- temperature: temperature,
5505
- heating_capacity: heating_capacity,
5506
- is_shared_system: is_shared_system,
5507
- number_of_units_served: number_of_units_served,
5508
- tank_model_type: tank_model_type,
5509
- operating_mode: operating_mode)
5778
+ hpxml_bldg.water_heating_systems.add(id: "WaterHeatingSystem#{hpxml_bldg.water_heating_systems.size + 1}",
5779
+ water_heater_type: water_heater_type,
5780
+ fuel_type: fuel_type,
5781
+ location: location,
5782
+ tank_volume: tank_volume,
5783
+ fraction_dhw_load_served: 1.0,
5784
+ energy_factor: energy_factor,
5785
+ uniform_energy_factor: uniform_energy_factor,
5786
+ usage_bin: usage_bin,
5787
+ recovery_efficiency: recovery_efficiency,
5788
+ uses_desuperheater: uses_desuperheater,
5789
+ related_hvac_idref: related_hvac_idref,
5790
+ standby_loss_units: standby_loss_units,
5791
+ standby_loss_value: standby_loss_value,
5792
+ jacket_r_value: jacket_r_value,
5793
+ temperature: temperature,
5794
+ heating_capacity: heating_capacity,
5795
+ is_shared_system: is_shared_system,
5796
+ number_of_units_served: number_of_units_served,
5797
+ tank_model_type: tank_model_type,
5798
+ operating_mode: operating_mode)
5510
5799
  end
5511
5800
 
5512
- def self.set_hot_water_distribution(hpxml, args)
5801
+ def self.set_hot_water_distribution(hpxml_bldg, args)
5513
5802
  return if args[:water_heater_type] == 'none'
5514
5803
 
5515
5804
  if args[:dwhr_facilities_connected] != 'none'
@@ -5548,36 +5837,36 @@ class HPXMLFile
5548
5837
  pipe_r_value = args[:hot_water_distribution_pipe_r].get
5549
5838
  end
5550
5839
 
5551
- hpxml.hot_water_distributions.add(id: "HotWaterDistribution#{hpxml.hot_water_distributions.size + 1}",
5552
- system_type: args[:hot_water_distribution_system_type],
5553
- standard_piping_length: standard_piping_length,
5554
- recirculation_control_type: recirculation_control_type,
5555
- recirculation_piping_length: recirculation_piping_length,
5556
- recirculation_branch_piping_length: recirculation_branch_piping_length,
5557
- recirculation_pump_power: recirculation_pump_power,
5558
- pipe_r_value: pipe_r_value,
5559
- dwhr_facilities_connected: dwhr_facilities_connected,
5560
- dwhr_equal_flow: dwhr_equal_flow,
5561
- dwhr_efficiency: dwhr_efficiency)
5840
+ hpxml_bldg.hot_water_distributions.add(id: "HotWaterDistribution#{hpxml_bldg.hot_water_distributions.size + 1}",
5841
+ system_type: args[:hot_water_distribution_system_type],
5842
+ standard_piping_length: standard_piping_length,
5843
+ recirculation_control_type: recirculation_control_type,
5844
+ recirculation_piping_length: recirculation_piping_length,
5845
+ recirculation_branch_piping_length: recirculation_branch_piping_length,
5846
+ recirculation_pump_power: recirculation_pump_power,
5847
+ pipe_r_value: pipe_r_value,
5848
+ dwhr_facilities_connected: dwhr_facilities_connected,
5849
+ dwhr_equal_flow: dwhr_equal_flow,
5850
+ dwhr_efficiency: dwhr_efficiency)
5562
5851
  end
5563
5852
 
5564
- def self.set_water_fixtures(hpxml, args)
5853
+ def self.set_water_fixtures(hpxml_bldg, args)
5565
5854
  return if args[:water_heater_type] == 'none'
5566
5855
 
5567
- hpxml.water_fixtures.add(id: "WaterFixture#{hpxml.water_fixtures.size + 1}",
5568
- water_fixture_type: HPXML::WaterFixtureTypeShowerhead,
5569
- low_flow: args[:water_fixtures_shower_low_flow])
5856
+ hpxml_bldg.water_fixtures.add(id: "WaterFixture#{hpxml_bldg.water_fixtures.size + 1}",
5857
+ water_fixture_type: HPXML::WaterFixtureTypeShowerhead,
5858
+ low_flow: args[:water_fixtures_shower_low_flow])
5570
5859
 
5571
- hpxml.water_fixtures.add(id: "WaterFixture#{hpxml.water_fixtures.size + 1}",
5572
- water_fixture_type: HPXML::WaterFixtureTypeFaucet,
5573
- low_flow: args[:water_fixtures_sink_low_flow])
5860
+ hpxml_bldg.water_fixtures.add(id: "WaterFixture#{hpxml_bldg.water_fixtures.size + 1}",
5861
+ water_fixture_type: HPXML::WaterFixtureTypeFaucet,
5862
+ low_flow: args[:water_fixtures_sink_low_flow])
5574
5863
 
5575
5864
  if args[:water_fixtures_usage_multiplier].is_initialized
5576
- hpxml.water_heating.water_fixtures_usage_multiplier = args[:water_fixtures_usage_multiplier].get
5865
+ hpxml_bldg.water_heating.water_fixtures_usage_multiplier = args[:water_fixtures_usage_multiplier].get
5577
5866
  end
5578
5867
  end
5579
5868
 
5580
- def self.set_solar_thermal(hpxml, args, epw_file)
5869
+ def self.set_solar_thermal(hpxml_bldg, args, epw_file)
5581
5870
  return if args[:solar_thermal_system_type] == 'none'
5582
5871
 
5583
5872
  if args[:solar_thermal_solar_fraction] > 0
@@ -5596,25 +5885,25 @@ class HPXMLFile
5596
5885
  end
5597
5886
  end
5598
5887
 
5599
- if hpxml.water_heating_systems.size == 0
5888
+ if hpxml_bldg.water_heating_systems.size == 0
5600
5889
  fail 'Solar thermal system specified but no water heater found.'
5601
5890
  end
5602
5891
 
5603
- hpxml.solar_thermal_systems.add(id: "SolarThermalSystem#{hpxml.solar_thermal_systems.size + 1}",
5604
- system_type: args[:solar_thermal_system_type],
5605
- collector_area: collector_area,
5606
- collector_loop_type: collector_loop_type,
5607
- collector_type: collector_type,
5608
- collector_azimuth: collector_azimuth,
5609
- collector_tilt: collector_tilt,
5610
- collector_frta: collector_frta,
5611
- collector_frul: collector_frul,
5612
- storage_volume: storage_volume,
5613
- water_heating_system_idref: hpxml.water_heating_systems[0].id,
5614
- solar_fraction: solar_fraction)
5892
+ hpxml_bldg.solar_thermal_systems.add(id: "SolarThermalSystem#{hpxml_bldg.solar_thermal_systems.size + 1}",
5893
+ system_type: args[:solar_thermal_system_type],
5894
+ collector_area: collector_area,
5895
+ collector_loop_type: collector_loop_type,
5896
+ collector_type: collector_type,
5897
+ collector_azimuth: collector_azimuth,
5898
+ collector_tilt: collector_tilt,
5899
+ collector_frta: collector_frta,
5900
+ collector_frul: collector_frul,
5901
+ storage_volume: storage_volume,
5902
+ water_heating_system_idref: hpxml_bldg.water_heating_systems[0].id,
5903
+ solar_fraction: solar_fraction)
5615
5904
  end
5616
5905
 
5617
- def self.set_pv_systems(hpxml, args, epw_file)
5906
+ def self.set_pv_systems(hpxml_bldg, args, epw_file)
5618
5907
  [args[:pv_system_present], args[:pv_system_2_present]].each_with_index do |pv_system_present, i|
5619
5908
  next unless pv_system_present
5620
5909
 
@@ -5643,36 +5932,36 @@ class HPXMLFile
5643
5932
  end
5644
5933
  end
5645
5934
 
5646
- hpxml.pv_systems.add(id: "PVSystem#{hpxml.pv_systems.size + 1}",
5647
- location: location,
5648
- module_type: module_type,
5649
- tracking: tracking,
5650
- array_azimuth: [args[:pv_system_array_azimuth], args[:pv_system_2_array_azimuth]][i],
5651
- array_tilt: Geometry.get_absolute_tilt([args[:pv_system_array_tilt], args[:pv_system_2_array_tilt]][i], args[:geometry_roof_pitch], epw_file),
5652
- max_power_output: max_power_output,
5653
- system_losses_fraction: system_losses_fraction,
5654
- is_shared_system: is_shared_system,
5655
- number_of_bedrooms_served: number_of_bedrooms_served)
5935
+ hpxml_bldg.pv_systems.add(id: "PVSystem#{hpxml_bldg.pv_systems.size + 1}",
5936
+ location: location,
5937
+ module_type: module_type,
5938
+ tracking: tracking,
5939
+ array_azimuth: [args[:pv_system_array_azimuth], args[:pv_system_2_array_azimuth]][i],
5940
+ array_tilt: Geometry.get_absolute_tilt([args[:pv_system_array_tilt], args[:pv_system_2_array_tilt]][i], args[:geometry_roof_pitch], epw_file),
5941
+ max_power_output: max_power_output,
5942
+ system_losses_fraction: system_losses_fraction,
5943
+ is_shared_system: is_shared_system,
5944
+ number_of_bedrooms_served: number_of_bedrooms_served)
5656
5945
  end
5657
- if hpxml.pv_systems.size > 0
5946
+ if hpxml_bldg.pv_systems.size > 0
5658
5947
  # Add inverter efficiency; assume a single inverter even if multiple PV arrays
5659
5948
  if args[:pv_system_inverter_efficiency].is_initialized
5660
5949
  inverter_efficiency = args[:pv_system_inverter_efficiency].get
5661
5950
  end
5662
5951
 
5663
- hpxml.inverters.add(id: "Inverter#{hpxml.inverters.size + 1}",
5664
- inverter_efficiency: inverter_efficiency)
5665
- hpxml.pv_systems.each do |pv_system|
5666
- pv_system.inverter_idref = hpxml.inverters[-1].id
5952
+ hpxml_bldg.inverters.add(id: "Inverter#{hpxml_bldg.inverters.size + 1}",
5953
+ inverter_efficiency: inverter_efficiency)
5954
+ hpxml_bldg.pv_systems.each do |pv_system|
5955
+ pv_system.inverter_idref = hpxml_bldg.inverters[-1].id
5667
5956
  end
5668
5957
  end
5669
5958
  end
5670
5959
 
5671
- def self.set_battery(hpxml, args)
5960
+ def self.set_battery(hpxml_bldg, args)
5672
5961
  return unless args[:battery_present]
5673
5962
 
5674
5963
  if args[:battery_location].is_initialized
5675
- location = args[:battery_location].get
5964
+ location = get_location(args[:battery_location].get, hpxml_bldg.foundations[-1].foundation_type, hpxml_bldg.attics[-1].attic_type)
5676
5965
  end
5677
5966
 
5678
5967
  if args[:battery_power].is_initialized
@@ -5691,16 +5980,16 @@ class HPXMLFile
5691
5980
  round_trip_efficiency = args[:battery_round_trip_efficiency].get
5692
5981
  end
5693
5982
 
5694
- hpxml.batteries.add(id: "Battery#{hpxml.batteries.size + 1}",
5695
- type: HPXML::BatteryTypeLithiumIon,
5696
- location: location,
5697
- rated_power_output: rated_power_output,
5698
- nominal_capacity_kwh: nominal_capacity_kwh,
5699
- usable_capacity_kwh: usable_capacity_kwh,
5700
- round_trip_efficiency: round_trip_efficiency)
5983
+ hpxml_bldg.batteries.add(id: "Battery#{hpxml_bldg.batteries.size + 1}",
5984
+ type: HPXML::BatteryTypeLithiumIon,
5985
+ location: location,
5986
+ rated_power_output: rated_power_output,
5987
+ nominal_capacity_kwh: nominal_capacity_kwh,
5988
+ usable_capacity_kwh: usable_capacity_kwh,
5989
+ round_trip_efficiency: round_trip_efficiency)
5701
5990
  end
5702
5991
 
5703
- def self.set_lighting(hpxml, args)
5992
+ def self.set_lighting(hpxml_bldg, args)
5704
5993
  if args[:lighting_present]
5705
5994
  has_garage = (args[:geometry_garage_width] * args[:geometry_garage_depth] > 0)
5706
5995
 
@@ -5709,19 +5998,19 @@ class HPXMLFile
5709
5998
  interior_usage_multiplier = args[:lighting_interior_usage_multiplier].get
5710
5999
  end
5711
6000
  if interior_usage_multiplier.nil? || interior_usage_multiplier.to_f > 0
5712
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5713
- location: HPXML::LocationInterior,
5714
- fraction_of_units_in_location: args[:lighting_interior_fraction_cfl],
5715
- lighting_type: HPXML::LightingTypeCFL)
5716
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5717
- location: HPXML::LocationInterior,
5718
- fraction_of_units_in_location: args[:lighting_interior_fraction_lfl],
5719
- lighting_type: HPXML::LightingTypeLFL)
5720
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5721
- location: HPXML::LocationInterior,
5722
- fraction_of_units_in_location: args[:lighting_interior_fraction_led],
5723
- lighting_type: HPXML::LightingTypeLED)
5724
- hpxml.lighting.interior_usage_multiplier = interior_usage_multiplier
6001
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
6002
+ location: HPXML::LocationInterior,
6003
+ fraction_of_units_in_location: args[:lighting_interior_fraction_cfl],
6004
+ lighting_type: HPXML::LightingTypeCFL)
6005
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
6006
+ location: HPXML::LocationInterior,
6007
+ fraction_of_units_in_location: args[:lighting_interior_fraction_lfl],
6008
+ lighting_type: HPXML::LightingTypeLFL)
6009
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
6010
+ location: HPXML::LocationInterior,
6011
+ fraction_of_units_in_location: args[:lighting_interior_fraction_led],
6012
+ lighting_type: HPXML::LightingTypeLED)
6013
+ hpxml_bldg.lighting.interior_usage_multiplier = interior_usage_multiplier
5725
6014
  end
5726
6015
 
5727
6016
  # Exterior
@@ -5729,19 +6018,19 @@ class HPXMLFile
5729
6018
  exterior_usage_multiplier = args[:lighting_exterior_usage_multiplier].get
5730
6019
  end
5731
6020
  if exterior_usage_multiplier.nil? || exterior_usage_multiplier.to_f > 0
5732
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5733
- location: HPXML::LocationExterior,
5734
- fraction_of_units_in_location: args[:lighting_exterior_fraction_cfl],
5735
- lighting_type: HPXML::LightingTypeCFL)
5736
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5737
- location: HPXML::LocationExterior,
5738
- fraction_of_units_in_location: args[:lighting_exterior_fraction_lfl],
5739
- lighting_type: HPXML::LightingTypeLFL)
5740
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5741
- location: HPXML::LocationExterior,
5742
- fraction_of_units_in_location: args[:lighting_exterior_fraction_led],
5743
- lighting_type: HPXML::LightingTypeLED)
5744
- hpxml.lighting.exterior_usage_multiplier = exterior_usage_multiplier
6021
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
6022
+ location: HPXML::LocationExterior,
6023
+ fraction_of_units_in_location: args[:lighting_exterior_fraction_cfl],
6024
+ lighting_type: HPXML::LightingTypeCFL)
6025
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
6026
+ location: HPXML::LocationExterior,
6027
+ fraction_of_units_in_location: args[:lighting_exterior_fraction_lfl],
6028
+ lighting_type: HPXML::LightingTypeLFL)
6029
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
6030
+ location: HPXML::LocationExterior,
6031
+ fraction_of_units_in_location: args[:lighting_exterior_fraction_led],
6032
+ lighting_type: HPXML::LightingTypeLED)
6033
+ hpxml_bldg.lighting.exterior_usage_multiplier = exterior_usage_multiplier
5745
6034
  end
5746
6035
 
5747
6036
  # Garage
@@ -5750,41 +6039,41 @@ class HPXMLFile
5750
6039
  garage_usage_multiplier = args[:lighting_garage_usage_multiplier].get
5751
6040
  end
5752
6041
  if garage_usage_multiplier.nil? || garage_usage_multiplier.to_f > 0
5753
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5754
- location: HPXML::LocationGarage,
5755
- fraction_of_units_in_location: args[:lighting_garage_fraction_cfl],
5756
- lighting_type: HPXML::LightingTypeCFL)
5757
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5758
- location: HPXML::LocationGarage,
5759
- fraction_of_units_in_location: args[:lighting_garage_fraction_lfl],
5760
- lighting_type: HPXML::LightingTypeLFL)
5761
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5762
- location: HPXML::LocationGarage,
5763
- fraction_of_units_in_location: args[:lighting_garage_fraction_led],
5764
- lighting_type: HPXML::LightingTypeLED)
5765
- hpxml.lighting.garage_usage_multiplier = garage_usage_multiplier
6042
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
6043
+ location: HPXML::LocationGarage,
6044
+ fraction_of_units_in_location: args[:lighting_garage_fraction_cfl],
6045
+ lighting_type: HPXML::LightingTypeCFL)
6046
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
6047
+ location: HPXML::LocationGarage,
6048
+ fraction_of_units_in_location: args[:lighting_garage_fraction_lfl],
6049
+ lighting_type: HPXML::LightingTypeLFL)
6050
+ hpxml_bldg.lighting_groups.add(id: "LightingGroup#{hpxml_bldg.lighting_groups.size + 1}",
6051
+ location: HPXML::LocationGarage,
6052
+ fraction_of_units_in_location: args[:lighting_garage_fraction_led],
6053
+ lighting_type: HPXML::LightingTypeLED)
6054
+ hpxml_bldg.lighting.garage_usage_multiplier = garage_usage_multiplier
5766
6055
  end
5767
6056
  end
5768
6057
  end
5769
6058
 
5770
6059
  return unless args[:holiday_lighting_present]
5771
6060
 
5772
- hpxml.lighting.holiday_exists = true
6061
+ hpxml_bldg.lighting.holiday_exists = true
5773
6062
 
5774
6063
  if args[:holiday_lighting_daily_kwh].is_initialized
5775
- hpxml.lighting.holiday_kwh_per_day = args[:holiday_lighting_daily_kwh].get
6064
+ hpxml_bldg.lighting.holiday_kwh_per_day = args[:holiday_lighting_daily_kwh].get
5776
6065
  end
5777
6066
 
5778
6067
  if args[:holiday_lighting_period].is_initialized
5779
6068
  begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:holiday_lighting_period].get)
5780
- hpxml.lighting.holiday_period_begin_month = begin_month
5781
- hpxml.lighting.holiday_period_begin_day = begin_day
5782
- hpxml.lighting.holiday_period_end_month = end_month
5783
- hpxml.lighting.holiday_period_end_day = end_day
6069
+ hpxml_bldg.lighting.holiday_period_begin_month = begin_month
6070
+ hpxml_bldg.lighting.holiday_period_begin_day = begin_day
6071
+ hpxml_bldg.lighting.holiday_period_end_month = end_month
6072
+ hpxml_bldg.lighting.holiday_period_end_day = end_day
5784
6073
  end
5785
6074
  end
5786
6075
 
5787
- def self.set_dehumidifier(hpxml, args)
6076
+ def self.set_dehumidifier(hpxml_bldg, args)
5788
6077
  return if args[:dehumidifier_type] == 'none'
5789
6078
 
5790
6079
  if args[:dehumidifier_efficiency_type] == 'EnergyFactor'
@@ -5793,17 +6082,17 @@ class HPXMLFile
5793
6082
  integrated_energy_factor = args[:dehumidifier_efficiency]
5794
6083
  end
5795
6084
 
5796
- hpxml.dehumidifiers.add(id: "Dehumidifier#{hpxml.dehumidifiers.size + 1}",
5797
- type: args[:dehumidifier_type],
5798
- capacity: args[:dehumidifier_capacity],
5799
- energy_factor: energy_factor,
5800
- integrated_energy_factor: integrated_energy_factor,
5801
- rh_setpoint: args[:dehumidifier_rh_setpoint],
5802
- fraction_served: args[:dehumidifier_fraction_dehumidification_load_served],
5803
- location: HPXML::LocationLivingSpace)
6085
+ hpxml_bldg.dehumidifiers.add(id: "Dehumidifier#{hpxml_bldg.dehumidifiers.size + 1}",
6086
+ type: args[:dehumidifier_type],
6087
+ capacity: args[:dehumidifier_capacity],
6088
+ energy_factor: energy_factor,
6089
+ integrated_energy_factor: integrated_energy_factor,
6090
+ rh_setpoint: args[:dehumidifier_rh_setpoint],
6091
+ fraction_served: args[:dehumidifier_fraction_dehumidification_load_served],
6092
+ location: HPXML::LocationConditionedSpace)
5804
6093
  end
5805
6094
 
5806
- def self.set_clothes_washer(hpxml, args)
6095
+ def self.set_clothes_washer(hpxml_bldg, args)
5807
6096
  return if args[:water_heater_type] == 'none'
5808
6097
  return unless args[:clothes_washer_present]
5809
6098
 
@@ -5847,20 +6136,20 @@ class HPXMLFile
5847
6136
  usage_multiplier = args[:clothes_washer_usage_multiplier].get
5848
6137
  end
5849
6138
 
5850
- hpxml.clothes_washers.add(id: "ClothesWasher#{hpxml.clothes_washers.size + 1}",
5851
- location: location,
5852
- modified_energy_factor: modified_energy_factor,
5853
- integrated_modified_energy_factor: integrated_modified_energy_factor,
5854
- rated_annual_kwh: rated_annual_kwh,
5855
- label_electric_rate: label_electric_rate,
5856
- label_gas_rate: label_gas_rate,
5857
- label_annual_gas_cost: label_annual_gas_cost,
5858
- label_usage: label_usage,
5859
- capacity: capacity,
5860
- usage_multiplier: usage_multiplier)
6139
+ hpxml_bldg.clothes_washers.add(id: "ClothesWasher#{hpxml_bldg.clothes_washers.size + 1}",
6140
+ location: location,
6141
+ modified_energy_factor: modified_energy_factor,
6142
+ integrated_modified_energy_factor: integrated_modified_energy_factor,
6143
+ rated_annual_kwh: rated_annual_kwh,
6144
+ label_electric_rate: label_electric_rate,
6145
+ label_gas_rate: label_gas_rate,
6146
+ label_annual_gas_cost: label_annual_gas_cost,
6147
+ label_usage: label_usage,
6148
+ capacity: capacity,
6149
+ usage_multiplier: usage_multiplier)
5861
6150
  end
5862
6151
 
5863
- def self.set_clothes_dryer(hpxml, args)
6152
+ def self.set_clothes_dryer(hpxml_bldg, args)
5864
6153
  return if args[:water_heater_type] == 'none'
5865
6154
  return unless args[:clothes_washer_present]
5866
6155
  return unless args[:clothes_dryer_present]
@@ -5889,17 +6178,17 @@ class HPXMLFile
5889
6178
  usage_multiplier = args[:clothes_dryer_usage_multiplier].get
5890
6179
  end
5891
6180
 
5892
- hpxml.clothes_dryers.add(id: "ClothesDryer#{hpxml.clothes_dryers.size + 1}",
5893
- location: location,
5894
- fuel_type: args[:clothes_dryer_fuel_type],
5895
- energy_factor: energy_factor,
5896
- combined_energy_factor: combined_energy_factor,
5897
- is_vented: is_vented,
5898
- vented_flow_rate: vented_flow_rate,
5899
- usage_multiplier: usage_multiplier)
6181
+ hpxml_bldg.clothes_dryers.add(id: "ClothesDryer#{hpxml_bldg.clothes_dryers.size + 1}",
6182
+ location: location,
6183
+ fuel_type: args[:clothes_dryer_fuel_type],
6184
+ energy_factor: energy_factor,
6185
+ combined_energy_factor: combined_energy_factor,
6186
+ is_vented: is_vented,
6187
+ vented_flow_rate: vented_flow_rate,
6188
+ usage_multiplier: usage_multiplier)
5900
6189
  end
5901
6190
 
5902
- def self.set_dishwasher(hpxml, args)
6191
+ def self.set_dishwasher(hpxml_bldg, args)
5903
6192
  return if args[:water_heater_type] == 'none'
5904
6193
  return unless args[:dishwasher_present]
5905
6194
 
@@ -5941,19 +6230,19 @@ class HPXMLFile
5941
6230
  usage_multiplier = args[:dishwasher_usage_multiplier].get
5942
6231
  end
5943
6232
 
5944
- hpxml.dishwashers.add(id: "Dishwasher#{hpxml.dishwashers.size + 1}",
5945
- location: location,
5946
- rated_annual_kwh: rated_annual_kwh,
5947
- energy_factor: energy_factor,
5948
- label_electric_rate: label_electric_rate,
5949
- label_gas_rate: label_gas_rate,
5950
- label_annual_gas_cost: label_annual_gas_cost,
5951
- label_usage: label_usage,
5952
- place_setting_capacity: place_setting_capacity,
5953
- usage_multiplier: usage_multiplier)
6233
+ hpxml_bldg.dishwashers.add(id: "Dishwasher#{hpxml_bldg.dishwashers.size + 1}",
6234
+ location: location,
6235
+ rated_annual_kwh: rated_annual_kwh,
6236
+ energy_factor: energy_factor,
6237
+ label_electric_rate: label_electric_rate,
6238
+ label_gas_rate: label_gas_rate,
6239
+ label_annual_gas_cost: label_annual_gas_cost,
6240
+ label_usage: label_usage,
6241
+ place_setting_capacity: place_setting_capacity,
6242
+ usage_multiplier: usage_multiplier)
5954
6243
  end
5955
6244
 
5956
- def self.set_refrigerator(hpxml, args)
6245
+ def self.set_refrigerator(hpxml_bldg, args)
5957
6246
  return unless args[:refrigerator_present]
5958
6247
 
5959
6248
  if args[:refrigerator_rated_annual_kwh].is_initialized
@@ -5968,14 +6257,14 @@ class HPXMLFile
5968
6257
  usage_multiplier = args[:refrigerator_usage_multiplier].get
5969
6258
  end
5970
6259
 
5971
- hpxml.refrigerators.add(id: "Refrigerator#{hpxml.refrigerators.size + 1}",
5972
- location: location,
5973
- rated_annual_kwh: rated_annual_kwh,
5974
- primary_indicator: true,
5975
- usage_multiplier: usage_multiplier)
6260
+ hpxml_bldg.refrigerators.add(id: "Refrigerator#{hpxml_bldg.refrigerators.size + 1}",
6261
+ location: location,
6262
+ rated_annual_kwh: rated_annual_kwh,
6263
+ primary_indicator: true,
6264
+ usage_multiplier: usage_multiplier)
5976
6265
  end
5977
6266
 
5978
- def self.set_extra_refrigerator(hpxml, args)
6267
+ def self.set_extra_refrigerator(hpxml_bldg, args)
5979
6268
  return unless args[:extra_refrigerator_present]
5980
6269
 
5981
6270
  if args[:extra_refrigerator_rated_annual_kwh].is_initialized
@@ -5990,14 +6279,14 @@ class HPXMLFile
5990
6279
  usage_multiplier = args[:extra_refrigerator_usage_multiplier].get
5991
6280
  end
5992
6281
 
5993
- hpxml.refrigerators.add(id: "Refrigerator#{hpxml.refrigerators.size + 1}",
5994
- location: location,
5995
- rated_annual_kwh: rated_annual_kwh,
5996
- primary_indicator: false,
5997
- usage_multiplier: usage_multiplier)
6282
+ hpxml_bldg.refrigerators.add(id: "Refrigerator#{hpxml_bldg.refrigerators.size + 1}",
6283
+ location: location,
6284
+ rated_annual_kwh: rated_annual_kwh,
6285
+ primary_indicator: false,
6286
+ usage_multiplier: usage_multiplier)
5998
6287
  end
5999
6288
 
6000
- def self.set_freezer(hpxml, args)
6289
+ def self.set_freezer(hpxml_bldg, args)
6001
6290
  return unless args[:freezer_present]
6002
6291
 
6003
6292
  if args[:freezer_rated_annual_kwh].is_initialized
@@ -6012,13 +6301,13 @@ class HPXMLFile
6012
6301
  usage_multiplier = args[:freezer_usage_multiplier].get
6013
6302
  end
6014
6303
 
6015
- hpxml.freezers.add(id: "Freezer#{hpxml.freezers.size + 1}",
6016
- location: location,
6017
- rated_annual_kwh: rated_annual_kwh,
6018
- usage_multiplier: usage_multiplier)
6304
+ hpxml_bldg.freezers.add(id: "Freezer#{hpxml_bldg.freezers.size + 1}",
6305
+ location: location,
6306
+ rated_annual_kwh: rated_annual_kwh,
6307
+ usage_multiplier: usage_multiplier)
6019
6308
  end
6020
6309
 
6021
- def self.set_cooking_range_oven(hpxml, args)
6310
+ def self.set_cooking_range_oven(hpxml_bldg, args)
6022
6311
  return unless args[:cooking_range_oven_present]
6023
6312
 
6024
6313
  if args[:cooking_range_oven_location].is_initialized
@@ -6033,21 +6322,21 @@ class HPXMLFile
6033
6322
  usage_multiplier = args[:cooking_range_oven_usage_multiplier].get
6034
6323
  end
6035
6324
 
6036
- hpxml.cooking_ranges.add(id: "CookingRange#{hpxml.cooking_ranges.size + 1}",
6037
- location: location,
6038
- fuel_type: args[:cooking_range_oven_fuel_type],
6039
- is_induction: is_induction,
6040
- usage_multiplier: usage_multiplier)
6325
+ hpxml_bldg.cooking_ranges.add(id: "CookingRange#{hpxml_bldg.cooking_ranges.size + 1}",
6326
+ location: location,
6327
+ fuel_type: args[:cooking_range_oven_fuel_type],
6328
+ is_induction: is_induction,
6329
+ usage_multiplier: usage_multiplier)
6041
6330
 
6042
6331
  if args[:cooking_range_oven_is_convection].is_initialized
6043
6332
  is_convection = args[:cooking_range_oven_is_convection].get
6044
6333
  end
6045
6334
 
6046
- hpxml.ovens.add(id: "Oven#{hpxml.ovens.size + 1}",
6047
- is_convection: is_convection)
6335
+ hpxml_bldg.ovens.add(id: "Oven#{hpxml_bldg.ovens.size + 1}",
6336
+ is_convection: is_convection)
6048
6337
  end
6049
6338
 
6050
- def self.set_ceiling_fans(hpxml, args)
6339
+ def self.set_ceiling_fans(hpxml_bldg, args)
6051
6340
  return unless args[:ceiling_fan_present]
6052
6341
 
6053
6342
  if args[:ceiling_fan_efficiency].is_initialized
@@ -6058,12 +6347,12 @@ class HPXMLFile
6058
6347
  quantity = args[:ceiling_fan_quantity].get
6059
6348
  end
6060
6349
 
6061
- hpxml.ceiling_fans.add(id: "CeilingFan#{hpxml.ceiling_fans.size + 1}",
6062
- efficiency: efficiency,
6063
- count: quantity)
6350
+ hpxml_bldg.ceiling_fans.add(id: "CeilingFan#{hpxml_bldg.ceiling_fans.size + 1}",
6351
+ efficiency: efficiency,
6352
+ count: quantity)
6064
6353
  end
6065
6354
 
6066
- def self.set_misc_plug_loads_television(hpxml, args)
6355
+ def self.set_misc_plug_loads_television(hpxml_bldg, args)
6067
6356
  return unless args[:misc_plug_loads_television_present]
6068
6357
 
6069
6358
  if args[:misc_plug_loads_television_annual_kwh].is_initialized
@@ -6074,13 +6363,13 @@ class HPXMLFile
6074
6363
  usage_multiplier = args[:misc_plug_loads_television_usage_multiplier].get
6075
6364
  end
6076
6365
 
6077
- hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
6078
- plug_load_type: HPXML::PlugLoadTypeTelevision,
6079
- kwh_per_year: kwh_per_year,
6080
- usage_multiplier: usage_multiplier)
6366
+ hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}",
6367
+ plug_load_type: HPXML::PlugLoadTypeTelevision,
6368
+ kwh_per_year: kwh_per_year,
6369
+ usage_multiplier: usage_multiplier)
6081
6370
  end
6082
6371
 
6083
- def self.set_misc_plug_loads_other(hpxml, args)
6372
+ def self.set_misc_plug_loads_other(hpxml_bldg, args)
6084
6373
  if args[:misc_plug_loads_other_annual_kwh].is_initialized
6085
6374
  kwh_per_year = args[:misc_plug_loads_other_annual_kwh].get
6086
6375
  end
@@ -6097,15 +6386,15 @@ class HPXMLFile
6097
6386
  usage_multiplier = args[:misc_plug_loads_other_usage_multiplier].get
6098
6387
  end
6099
6388
 
6100
- hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
6101
- plug_load_type: HPXML::PlugLoadTypeOther,
6102
- kwh_per_year: kwh_per_year,
6103
- frac_sensible: frac_sensible,
6104
- frac_latent: frac_latent,
6105
- usage_multiplier: usage_multiplier)
6389
+ hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}",
6390
+ plug_load_type: HPXML::PlugLoadTypeOther,
6391
+ kwh_per_year: kwh_per_year,
6392
+ frac_sensible: frac_sensible,
6393
+ frac_latent: frac_latent,
6394
+ usage_multiplier: usage_multiplier)
6106
6395
  end
6107
6396
 
6108
- def self.set_misc_plug_loads_well_pump(hpxml, args)
6397
+ def self.set_misc_plug_loads_well_pump(hpxml_bldg, args)
6109
6398
  return unless args[:misc_plug_loads_well_pump_present]
6110
6399
 
6111
6400
  if args[:misc_plug_loads_well_pump_annual_kwh].is_initialized
@@ -6116,13 +6405,13 @@ class HPXMLFile
6116
6405
  usage_multiplier = args[:misc_plug_loads_well_pump_usage_multiplier].get
6117
6406
  end
6118
6407
 
6119
- hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
6120
- plug_load_type: HPXML::PlugLoadTypeWellPump,
6121
- kwh_per_year: kwh_per_year,
6122
- usage_multiplier: usage_multiplier)
6408
+ hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}",
6409
+ plug_load_type: HPXML::PlugLoadTypeWellPump,
6410
+ kwh_per_year: kwh_per_year,
6411
+ usage_multiplier: usage_multiplier)
6123
6412
  end
6124
6413
 
6125
- def self.set_misc_plug_loads_vehicle(hpxml, args)
6414
+ def self.set_misc_plug_loads_vehicle(hpxml_bldg, args)
6126
6415
  return unless args[:misc_plug_loads_vehicle_present]
6127
6416
 
6128
6417
  if args[:misc_plug_loads_vehicle_annual_kwh].is_initialized
@@ -6133,13 +6422,13 @@ class HPXMLFile
6133
6422
  usage_multiplier = args[:misc_plug_loads_vehicle_usage_multiplier].get
6134
6423
  end
6135
6424
 
6136
- hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
6137
- plug_load_type: HPXML::PlugLoadTypeElectricVehicleCharging,
6138
- kwh_per_year: kwh_per_year,
6139
- usage_multiplier: usage_multiplier)
6425
+ hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}",
6426
+ plug_load_type: HPXML::PlugLoadTypeElectricVehicleCharging,
6427
+ kwh_per_year: kwh_per_year,
6428
+ usage_multiplier: usage_multiplier)
6140
6429
  end
6141
6430
 
6142
- def self.set_misc_fuel_loads_grill(hpxml, args)
6431
+ def self.set_misc_fuel_loads_grill(hpxml_bldg, args)
6143
6432
  return unless args[:misc_fuel_loads_grill_present]
6144
6433
 
6145
6434
  if args[:misc_fuel_loads_grill_annual_therm].is_initialized
@@ -6150,14 +6439,14 @@ class HPXMLFile
6150
6439
  usage_multiplier = args[:misc_fuel_loads_grill_usage_multiplier].get
6151
6440
  end
6152
6441
 
6153
- hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
6154
- fuel_load_type: HPXML::FuelLoadTypeGrill,
6155
- fuel_type: args[:misc_fuel_loads_grill_fuel_type],
6156
- therm_per_year: therm_per_year,
6157
- usage_multiplier: usage_multiplier)
6442
+ hpxml_bldg.fuel_loads.add(id: "FuelLoad#{hpxml_bldg.fuel_loads.size + 1}",
6443
+ fuel_load_type: HPXML::FuelLoadTypeGrill,
6444
+ fuel_type: args[:misc_fuel_loads_grill_fuel_type],
6445
+ therm_per_year: therm_per_year,
6446
+ usage_multiplier: usage_multiplier)
6158
6447
  end
6159
6448
 
6160
- def self.set_misc_fuel_loads_lighting(hpxml, args)
6449
+ def self.set_misc_fuel_loads_lighting(hpxml_bldg, args)
6161
6450
  return unless args[:misc_fuel_loads_lighting_present]
6162
6451
 
6163
6452
  if args[:misc_fuel_loads_lighting_annual_therm].is_initialized
@@ -6168,14 +6457,14 @@ class HPXMLFile
6168
6457
  usage_multiplier = args[:misc_fuel_loads_lighting_usage_multiplier].get
6169
6458
  end
6170
6459
 
6171
- hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
6172
- fuel_load_type: HPXML::FuelLoadTypeLighting,
6173
- fuel_type: args[:misc_fuel_loads_lighting_fuel_type],
6174
- therm_per_year: therm_per_year,
6175
- usage_multiplier: usage_multiplier)
6460
+ hpxml_bldg.fuel_loads.add(id: "FuelLoad#{hpxml_bldg.fuel_loads.size + 1}",
6461
+ fuel_load_type: HPXML::FuelLoadTypeLighting,
6462
+ fuel_type: args[:misc_fuel_loads_lighting_fuel_type],
6463
+ therm_per_year: therm_per_year,
6464
+ usage_multiplier: usage_multiplier)
6176
6465
  end
6177
6466
 
6178
- def self.set_misc_fuel_loads_fireplace(hpxml, args)
6467
+ def self.set_misc_fuel_loads_fireplace(hpxml_bldg, args)
6179
6468
  return unless args[:misc_fuel_loads_fireplace_present]
6180
6469
 
6181
6470
  if args[:misc_fuel_loads_fireplace_annual_therm].is_initialized
@@ -6194,16 +6483,16 @@ class HPXMLFile
6194
6483
  usage_multiplier = args[:misc_fuel_loads_fireplace_usage_multiplier].get
6195
6484
  end
6196
6485
 
6197
- hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
6198
- fuel_load_type: HPXML::FuelLoadTypeFireplace,
6199
- fuel_type: args[:misc_fuel_loads_fireplace_fuel_type],
6200
- therm_per_year: therm_per_year,
6201
- frac_sensible: frac_sensible,
6202
- frac_latent: frac_latent,
6203
- usage_multiplier: usage_multiplier)
6486
+ hpxml_bldg.fuel_loads.add(id: "FuelLoad#{hpxml_bldg.fuel_loads.size + 1}",
6487
+ fuel_load_type: HPXML::FuelLoadTypeFireplace,
6488
+ fuel_type: args[:misc_fuel_loads_fireplace_fuel_type],
6489
+ therm_per_year: therm_per_year,
6490
+ frac_sensible: frac_sensible,
6491
+ frac_latent: frac_latent,
6492
+ usage_multiplier: usage_multiplier)
6204
6493
  end
6205
6494
 
6206
- def self.set_pool(hpxml, args)
6495
+ def self.set_pool(hpxml_bldg, args)
6207
6496
  return unless args[:pool_present]
6208
6497
 
6209
6498
  if args[:pool_pump_annual_kwh].is_initialized
@@ -6234,101 +6523,101 @@ class HPXMLFile
6234
6523
  heater_usage_multiplier = args[:pool_heater_usage_multiplier].get
6235
6524
  end
6236
6525
 
6237
- hpxml.pools.add(id: "Pool#{hpxml.pools.size + 1}",
6238
- type: HPXML::TypeUnknown,
6239
- pump_type: HPXML::TypeUnknown,
6240
- pump_kwh_per_year: pump_kwh_per_year,
6241
- pump_usage_multiplier: pump_usage_multiplier,
6242
- heater_type: pool_heater_type,
6243
- heater_load_units: heater_load_units,
6244
- heater_load_value: heater_load_value,
6245
- heater_usage_multiplier: heater_usage_multiplier)
6526
+ hpxml_bldg.pools.add(id: "Pool#{hpxml_bldg.pools.size + 1}",
6527
+ type: HPXML::TypeUnknown,
6528
+ pump_type: HPXML::TypeUnknown,
6529
+ pump_kwh_per_year: pump_kwh_per_year,
6530
+ pump_usage_multiplier: pump_usage_multiplier,
6531
+ heater_type: pool_heater_type,
6532
+ heater_load_units: heater_load_units,
6533
+ heater_load_value: heater_load_value,
6534
+ heater_usage_multiplier: heater_usage_multiplier)
6246
6535
  end
6247
6536
 
6248
- def self.set_hot_tub(hpxml, args)
6249
- return unless args[:hot_tub_present]
6537
+ def self.set_permanent_spa(hpxml_bldg, args)
6538
+ return unless args[:permanent_spa_present]
6250
6539
 
6251
- if args[:hot_tub_pump_annual_kwh].is_initialized
6252
- pump_kwh_per_year = args[:hot_tub_pump_annual_kwh].get
6540
+ if args[:permanent_spa_pump_annual_kwh].is_initialized
6541
+ pump_kwh_per_year = args[:permanent_spa_pump_annual_kwh].get
6253
6542
  end
6254
6543
 
6255
- if args[:hot_tub_pump_usage_multiplier].is_initialized
6256
- pump_usage_multiplier = args[:hot_tub_pump_usage_multiplier].get
6544
+ if args[:permanent_spa_pump_usage_multiplier].is_initialized
6545
+ pump_usage_multiplier = args[:permanent_spa_pump_usage_multiplier].get
6257
6546
  end
6258
6547
 
6259
- hot_tub_heater_type = args[:hot_tub_heater_type]
6548
+ permanent_spa_heater_type = args[:permanent_spa_heater_type]
6260
6549
 
6261
- if [HPXML::HeaterTypeElectricResistance, HPXML::HeaterTypeHeatPump].include?(hot_tub_heater_type)
6262
- if args[:hot_tub_heater_annual_kwh].is_initialized
6550
+ if [HPXML::HeaterTypeElectricResistance, HPXML::HeaterTypeHeatPump].include?(permanent_spa_heater_type)
6551
+ if args[:permanent_spa_heater_annual_kwh].is_initialized
6263
6552
  heater_load_units = HPXML::UnitsKwhPerYear
6264
- heater_load_value = args[:hot_tub_heater_annual_kwh].get
6553
+ heater_load_value = args[:permanent_spa_heater_annual_kwh].get
6265
6554
  end
6266
6555
  end
6267
6556
 
6268
- if [HPXML::HeaterTypeGas].include?(hot_tub_heater_type)
6269
- if args[:hot_tub_heater_annual_therm].is_initialized
6557
+ if [HPXML::HeaterTypeGas].include?(permanent_spa_heater_type)
6558
+ if args[:permanent_spa_heater_annual_therm].is_initialized
6270
6559
  heater_load_units = HPXML::UnitsThermPerYear
6271
- heater_load_value = args[:hot_tub_heater_annual_therm].get
6560
+ heater_load_value = args[:permanent_spa_heater_annual_therm].get
6272
6561
  end
6273
6562
  end
6274
6563
 
6275
- if args[:hot_tub_heater_usage_multiplier].is_initialized
6276
- heater_usage_multiplier = args[:hot_tub_heater_usage_multiplier].get
6564
+ if args[:permanent_spa_heater_usage_multiplier].is_initialized
6565
+ heater_usage_multiplier = args[:permanent_spa_heater_usage_multiplier].get
6277
6566
  end
6278
6567
 
6279
- hpxml.hot_tubs.add(id: "HotTub#{hpxml.hot_tubs.size + 1}",
6280
- type: HPXML::TypeUnknown,
6281
- pump_type: HPXML::TypeUnknown,
6282
- pump_kwh_per_year: pump_kwh_per_year,
6283
- pump_usage_multiplier: pump_usage_multiplier,
6284
- heater_type: hot_tub_heater_type,
6285
- heater_load_units: heater_load_units,
6286
- heater_load_value: heater_load_value,
6287
- heater_usage_multiplier: heater_usage_multiplier)
6568
+ hpxml_bldg.permanent_spas.add(id: "PermanentSpa#{hpxml_bldg.permanent_spas.size + 1}",
6569
+ type: HPXML::TypeUnknown,
6570
+ pump_type: HPXML::TypeUnknown,
6571
+ pump_kwh_per_year: pump_kwh_per_year,
6572
+ pump_usage_multiplier: pump_usage_multiplier,
6573
+ heater_type: permanent_spa_heater_type,
6574
+ heater_load_units: heater_load_units,
6575
+ heater_load_value: heater_load_value,
6576
+ heater_usage_multiplier: heater_usage_multiplier)
6288
6577
  end
6289
6578
 
6290
- def self.collapse_surfaces(hpxml, args)
6579
+ def self.collapse_surfaces(hpxml_bldg, args)
6291
6580
  if args[:combine_like_surfaces].is_initialized && args[:combine_like_surfaces].get
6292
6581
  # Collapse some surfaces whose azimuth is a minor effect to simplify HPXMLs.
6293
- (hpxml.roofs + hpxml.rim_joists + hpxml.walls + hpxml.foundation_walls).each do |surface|
6582
+ (hpxml_bldg.roofs + hpxml_bldg.rim_joists + hpxml_bldg.walls + hpxml_bldg.foundation_walls).each do |surface|
6294
6583
  surface.azimuth = nil
6295
6584
  end
6296
- hpxml.collapse_enclosure_surfaces()
6585
+ hpxml_bldg.collapse_enclosure_surfaces()
6297
6586
  else
6298
6587
  # Collapse surfaces so that we don't get, e.g., individual windows
6299
6588
  # or the front wall split because of the door. Exclude foundation walls
6300
6589
  # from the list so we get all 4 foundation walls.
6301
- hpxml.collapse_enclosure_surfaces([:roofs, :walls, :rim_joists, :floors,
6302
- :slabs, :windows, :skylights, :doors])
6590
+ hpxml_bldg.collapse_enclosure_surfaces([:roofs, :walls, :rim_joists, :floors,
6591
+ :slabs, :windows, :skylights, :doors])
6303
6592
  end
6304
6593
 
6305
6594
  # After surfaces are collapsed, round all areas
6306
- (hpxml.roofs +
6307
- hpxml.rim_joists +
6308
- hpxml.walls +
6309
- hpxml.foundation_walls +
6310
- hpxml.floors +
6311
- hpxml.slabs +
6312
- hpxml.windows +
6313
- hpxml.skylights +
6314
- hpxml.doors).each do |s|
6595
+ (hpxml_bldg.roofs +
6596
+ hpxml_bldg.rim_joists +
6597
+ hpxml_bldg.walls +
6598
+ hpxml_bldg.foundation_walls +
6599
+ hpxml_bldg.floors +
6600
+ hpxml_bldg.slabs +
6601
+ hpxml_bldg.windows +
6602
+ hpxml_bldg.skylights +
6603
+ hpxml_bldg.doors).each do |s|
6315
6604
  s.area = s.area.round(1)
6316
6605
  end
6317
6606
  end
6318
6607
 
6319
- def self.renumber_hpxml_ids(hpxml)
6608
+ def self.renumber_hpxml_ids(hpxml_bldg)
6320
6609
  # Renumber surfaces
6321
- { hpxml.walls => 'Wall',
6322
- hpxml.foundation_walls => 'FoundationWall',
6323
- hpxml.rim_joists => 'RimJoist',
6324
- hpxml.floors => 'Floor',
6325
- hpxml.roofs => 'Roof',
6326
- hpxml.slabs => 'Slab',
6327
- hpxml.windows => 'Window',
6328
- hpxml.doors => 'Door',
6329
- hpxml.skylights => 'Skylight' }.each do |surfs, surf_name|
6610
+ { hpxml_bldg.walls => 'Wall',
6611
+ hpxml_bldg.foundation_walls => 'FoundationWall',
6612
+ hpxml_bldg.rim_joists => 'RimJoist',
6613
+ hpxml_bldg.floors => 'Floor',
6614
+ hpxml_bldg.roofs => 'Roof',
6615
+ hpxml_bldg.slabs => 'Slab',
6616
+ hpxml_bldg.windows => 'Window',
6617
+ hpxml_bldg.doors => 'Door',
6618
+ hpxml_bldg.skylights => 'Skylight' }.each do |surfs, surf_name|
6330
6619
  surfs.each_with_index do |surf, i|
6331
- (hpxml.attics + hpxml.foundations).each do |attic_or_fnd|
6620
+ (hpxml_bldg.attics + hpxml_bldg.foundations).each do |attic_or_fnd|
6332
6621
  if attic_or_fnd.respond_to?(:attached_to_roof_idrefs) && !attic_or_fnd.attached_to_roof_idrefs.nil? && !attic_or_fnd.attached_to_roof_idrefs.delete(surf.id).nil?
6333
6622
  attic_or_fnd.attached_to_roof_idrefs << "#{surf_name}#{i + 1}"
6334
6623
  end
@@ -6348,12 +6637,12 @@ class HPXMLFile
6348
6637
  attic_or_fnd.attached_to_foundation_wall_idrefs << "#{surf_name}#{i + 1}"
6349
6638
  end
6350
6639
  end
6351
- (hpxml.windows + hpxml.doors).each do |subsurf|
6640
+ (hpxml_bldg.windows + hpxml_bldg.doors).each do |subsurf|
6352
6641
  if subsurf.respond_to?(:wall_idref) && (subsurf.wall_idref == surf.id)
6353
6642
  subsurf.wall_idref = "#{surf_name}#{i + 1}"
6354
6643
  end
6355
6644
  end
6356
- hpxml.skylights.each do |subsurf|
6645
+ hpxml_bldg.skylights.each do |subsurf|
6357
6646
  if subsurf.respond_to?(:roof_idref) && (subsurf.roof_idref == surf.id)
6358
6647
  subsurf.roof_idref = "#{surf_name}#{i + 1}"
6359
6648
  end