urbanopt-cli 0.8.3 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (649) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -6
  3. data/CHANGELOG.md +14 -0
  4. data/CMakeLists.txt +7 -7
  5. data/Gemfile +3 -1
  6. data/README.md +9 -0
  7. data/example_files/Gemfile +23 -16
  8. data/example_files/Gemfile.lock +177 -0
  9. data/example_files/base_workflow_res.osw +57 -14
  10. data/example_files/class_project_coincident.json +1322 -0
  11. data/example_files/class_project_diverse.json +1322 -0
  12. data/example_files/disco/config.json +42 -0
  13. data/example_files/disco/cost_database.xlsx +0 -0
  14. data/example_files/disco/technical_catalog.json +12126 -0
  15. data/example_files/mappers/Baseline.rb +10 -7
  16. data/example_files/mappers/ChilledWaterStorage.rb +98 -0
  17. data/example_files/mappers/ClassProject.rb +110 -0
  18. data/example_files/mappers/CreateBar.rb +1 -0
  19. data/example_files/mappers/HighEfficiency.rb +13 -11
  20. data/example_files/mappers/PeakHoursMelsShedding.rb +72 -0
  21. data/example_files/mappers/PeakHoursThermostatAdjust.rb +78 -0
  22. data/example_files/mappers/ThermalStorage.rb +1 -0
  23. data/example_files/mappers/base_workflow.osw +55 -14
  24. data/example_files/mappers/class_project_workflow.osw +328 -0
  25. data/example_files/mappers/createbar_workflow.osw +16 -16
  26. data/example_files/measures/BuildResidentialModel/measure.rb +7 -1
  27. data/example_files/measures/BuildResidentialModel/measure.xml +1313 -706
  28. data/example_files/opendss/electrical_database.json +1446 -1446
  29. data/example_files/python_deps/dependencies.json +5 -0
  30. data/example_files/python_deps/install_python.ps1 +96 -0
  31. data/example_files/python_deps/install_python.sh +120 -0
  32. data/example_files/residential/clothes_dryer.tsv +11 -11
  33. data/example_files/residential/clothes_washer.tsv +3 -3
  34. data/example_files/residential/dishwasher.tsv +3 -3
  35. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +0 -1
  36. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +8 -21
  37. data/example_files/resources/hpxml-measures/.gitignore +2 -0
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1272 -1094
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +978 -659
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +52 -74
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +77 -140
  42. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +30 -27
  43. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +32 -13
  44. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +55 -51
  45. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +89 -16
  46. data/example_files/resources/hpxml-measures/Changelog.md +65 -0
  47. data/example_files/resources/hpxml-measures/Gemfile +2 -4
  48. data/example_files/resources/hpxml-measures/Gemfile.lock +2 -13
  49. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +276 -300
  50. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +221 -215
  51. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +215 -170
  52. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +108 -16
  53. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +24 -44
  54. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +564 -197
  55. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/cambium/README.md +8 -8
  56. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  57. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +7 -55
  58. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +24 -19
  59. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +541 -211
  60. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +300 -172
  61. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +0 -2
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +230 -141
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +145 -137
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +191 -97
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/iso-schematron.xsd +391 -0
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +194 -198
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +140 -145
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +11 -11
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +33 -1
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +4 -4
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -9
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +14 -12
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +39 -17
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +1 -1
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/battery.csv +8761 -0
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +114 -57
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +1 -0
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +148 -0
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +85 -127
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +26 -32
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +2 -14
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +67 -0
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +117 -56
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +141 -14
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +453 -344
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +124 -20
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +1 -1
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +28 -32
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +172 -79
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +54 -8
  92. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -3
  93. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +4 -4
  94. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +7 -7
  95. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +1 -1
  96. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +6 -9
  97. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +8 -8
  98. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +213 -95
  99. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +1 -10
  100. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +76 -0
  101. data/example_files/resources/hpxml-measures/README.md +2 -3
  102. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +585 -287
  103. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +304 -352
  104. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +404 -279
  105. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +222 -501
  106. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +137 -200
  107. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json +649 -0
  108. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json +649 -0
  109. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json +647 -0
  110. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Annual Charge.json +8776 -0
  111. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Monthly Charge.json +8776 -0
  112. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json +8774 -0
  113. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Annual Charge.json +659 -0
  114. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Monthly Charge.json +659 -0
  115. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json +657 -0
  116. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Annual Charge.json +670 -0
  117. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Monthly Charge.json +670 -0
  118. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json +668 -0
  119. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Annual Charge.json +655 -0
  120. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Monthly Charge.json +655 -0
  121. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json +653 -0
  122. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/openei_rates.zip +0 -0
  123. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/Average_retail_price_of_electricity.csv +0 -0
  124. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/HouseholdConsumption.csv +0 -0
  125. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +0 -0
  126. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +0 -0
  127. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +0 -0
  128. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/README.md +0 -0
  129. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +506 -25
  130. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Contains Demand Charges.json +1312 -0
  131. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Fixed Charge Units.json +657 -0
  132. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Min Charge Units.json +659 -0
  133. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json +681 -0
  134. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Missing Required Fields.json +54 -0
  135. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/data.csv +8761 -0
  136. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +1006 -235
  137. data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -1
  138. data/example_files/resources/hpxml-measures/docs/source/intro.rst +0 -1
  139. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +2 -2
  140. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +461 -261
  141. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +146 -152
  142. data/example_files/resources/hpxml-measures/tasks.rb +616 -802
  143. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +19 -11
  144. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +20 -12
  145. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +12 -7
  146. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +12 -7
  147. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +19 -11
  148. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +12 -7
  149. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +20 -12
  150. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +28 -16
  151. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +28 -17
  152. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +28 -16
  153. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +20 -12
  154. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +20 -12
  155. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +20 -12
  156. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +20 -12
  157. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +20 -12
  158. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +22 -12
  159. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +19 -11
  160. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +20 -12
  161. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +13 -7
  162. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +12 -7
  163. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +31 -16
  164. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +22 -12
  165. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +21 -12
  166. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +37 -22
  167. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +24 -12
  168. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +33 -21
  169. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +28 -16
  170. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +28 -16
  171. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +30 -17
  172. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +10 -7
  173. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +22 -11
  174. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +12 -7
  175. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +18 -12
  176. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +25 -16
  177. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +22 -12
  178. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +20 -12
  179. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +26 -17
  180. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +19 -11
  181. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +25 -16
  182. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +20 -12
  183. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +35 -21
  184. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +28 -17
  185. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +20 -12
  186. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +35 -21
  187. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +20 -12
  188. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +20 -13
  189. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +12 -9
  190. data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +25 -14
  191. data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +10 -7
  192. data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +20 -11
  193. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +91 -88
  194. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +18 -7
  195. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +546 -535
  196. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +546 -535
  197. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +555 -544
  198. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +18 -7
  199. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +18 -7
  200. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +18 -7
  201. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +18 -7
  202. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +580 -569
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +18 -7
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +580 -569
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +18 -7
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +18 -7
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +7 -0
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +17 -6
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +7 -0
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +18 -7
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +18 -7
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +18 -7
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +600 -0
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +598 -587
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +494 -485
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +606 -593
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +494 -485
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +494 -485
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +494 -485
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-calctype-operational.xml +480 -471
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +464 -457
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +496 -487
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +466 -459
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +518 -509
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +513 -504
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +445 -438
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +476 -467
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +443 -436
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +446 -439
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +494 -485
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +445 -438
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +476 -467
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +446 -439
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +494 -485
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +489 -480
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +499 -490
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +491 -482
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +510 -0
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +495 -486
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +709 -695
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +528 -519
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +512 -503
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +504 -495
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +497 -488
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +490 -481
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +487 -478
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-2stories.xml +639 -628
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-atticroof-cathedral.xml +587 -580
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +639 -628
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-defaults.xml +539 -528
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon.xml +644 -633
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon2.xml +644 -633
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational.xml +575 -564
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +16 -7
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +16 -7
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +18 -7
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +585 -574
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +18 -7
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +18 -7
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +18 -7
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +18 -7
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +18 -7
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +536 -0
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +16 -7
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +16 -7
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +20 -8
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +16 -7
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +16 -7
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +18 -7
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +18 -7
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +18 -7
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +16 -7
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +18 -7
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +16 -7
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +18 -7
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +19 -8
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +19 -8
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +19 -8
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +19 -8
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +19 -8
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +18 -7
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +18 -7
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +18 -7
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +18 -7
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +18 -7
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +18 -7
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +18 -7
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +582 -571
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +583 -572
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +18 -7
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +584 -573
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +584 -573
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +18 -7
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +583 -572
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +585 -574
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +18 -7
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +582 -571
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +18 -7
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +18 -7
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +18 -7
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +586 -575
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +585 -574
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +18 -7
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +18 -7
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +580 -569
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +18 -7
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +580 -569
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +18 -7
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +580 -569
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +18 -7
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +18 -7
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +18 -7
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +18 -7
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +28 -11
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +20 -7
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +18 -7
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +18 -7
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +18 -7
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +18 -7
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +607 -0
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +550 -0
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +27 -12
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +18 -7
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +18 -7
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +18 -7
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +18 -7
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +18 -7
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +589 -578
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +18 -7
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +18 -7
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +619 -608
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +620 -609
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +618 -607
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +18 -7
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +537 -526
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +90 -43
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2507 -2460
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +595 -584
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -8
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +584 -0
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +18 -7
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +594 -583
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +597 -586
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +598 -587
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +27 -12
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +671 -656
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -7
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +18 -7
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-foundation-conditioned-basement-wall-interior-insulation.xml → base-foundation-conditioned-basement-wall-insulation.xml} +585 -574
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +582 -571
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +35 -16
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +18 -7
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +27 -12
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +27 -12
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +27 -12
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +27 -12
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +27 -12
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +27 -12
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +18 -7
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml +586 -575
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +580 -569
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +583 -0
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +18 -7
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +18 -7
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +600 -589
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +599 -588
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +629 -616
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +18 -7
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +579 -568
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +581 -570
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +581 -570
  374. 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 +582 -0
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +581 -570
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +581 -570
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +581 -570
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +581 -570
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +598 -587
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +628 -615
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml +581 -570
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml +581 -570
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +581 -570
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +535 -526
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +589 -578
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +536 -527
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +18 -7
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +565 -554
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +565 -554
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  391. 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 +582 -571
  392. 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 +582 -571
  393. 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 +582 -571
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +526 -517
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +573 -562
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +529 -520
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +565 -554
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +580 -569
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +580 -569
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +565 -554
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +578 -567
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +575 -564
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +581 -570
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +583 -572
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +583 -572
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +583 -572
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +18 -7
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +580 -569
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +580 -569
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +580 -569
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +551 -542
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +532 -530
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +525 -516
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +541 -532
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +541 -532
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +541 -532
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +525 -516
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +533 -0
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +542 -0
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +542 -0
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +542 -0
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +529 -520
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +529 -520
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +580 -569
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +16 -7
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +16 -7
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +18 -7
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +16 -7
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +16 -7
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +16 -7
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +16 -7
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +567 -0
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +18 -7
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +18 -7
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +18 -7
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +16 -7
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +18 -7
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +18 -7
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +18 -7
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +18 -7
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +611 -598
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +589 -0
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +582 -571
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +18 -7
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +16 -7
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +18 -7
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +17 -7
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +16 -7
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +530 -521
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +530 -521
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +530 -521
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +566 -555
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +18 -7
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +18 -7
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +18 -7
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +18 -7
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +566 -555
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +566 -555
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +18 -7
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +18 -7
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +18 -7
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +18 -7
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +16 -7
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +574 -563
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +581 -570
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +583 -572
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +587 -576
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +587 -576
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +587 -576
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +591 -580
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +591 -580
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +591 -580
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +570 -559
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +586 -575
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +570 -559
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +586 -575
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +18 -7
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +16 -7
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +18 -7
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +552 -543
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -7
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +963 -938
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +33 -69
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +530 -521
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +535 -0
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-ptac-with-heating.xml → base-hvac-ptac-with-heating-natural-gas.xml} +23 -21
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +526 -517
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +541 -532
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +16 -7
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +526 -517
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +526 -517
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +16 -7
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +535 -0
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +542 -0
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +594 -583
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +586 -575
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +18 -7
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +18 -7
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +530 -521
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +530 -521
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +18 -7
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +18 -7
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +530 -521
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +18 -7
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +18 -7
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +18 -7
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +18 -7
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +27 -12
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +591 -576
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +18 -7
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +27 -12
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +582 -571
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +537 -526
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +18 -7
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +537 -526
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +601 -586
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +18 -7
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +18 -7
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +601 -587
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +19 -7
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +20 -7
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +607 -0
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +607 -0
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +21 -7
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +18 -7
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +18 -7
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +18 -7
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +18 -7
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +18 -7
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +18 -7
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +37 -19
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +18 -7
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +18 -7
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +590 -579
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +578 -0
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +632 -0
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +614 -0
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +677 -0
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +593 -0
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +27 -9
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +676 -665
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +616 -0
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +615 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +598 -587
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +586 -0
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +18 -7
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +18 -7
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +18 -7
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +18 -7
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +583 -572
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +18 -7
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1700 -1677
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +622 -611
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +697 -682
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-pv-battery-lifetime-model.xml → base-pv-battery-round-trip-efficiency.xml} +20 -11
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +624 -0
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +622 -611
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +640 -0
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +639 -0
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +623 -0
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +606 -595
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +582 -571
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-smooth.xml +583 -572
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +584 -0
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +583 -572
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +583 -572
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +581 -570
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +581 -570
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +581 -570
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +636 -625
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +18 -7
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +27 -14
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +21 -10
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +21 -10
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-operating-modes.xml → base-simcontrol-temperature-capacitance-multiplier.xml} +25 -13
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +584 -0
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +584 -0
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +18 -7
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-setpoints.xml → base-simcontrol-timestep-30-mins.xml} +25 -14
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +18 -7
  588. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +18 -13
  589. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +12 -7
  590. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +8 -24
  591. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +366 -358
  592. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +369 -361
  593. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +369 -361
  594. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +369 -361
  595. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +369 -361
  596. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +369 -361
  597. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +369 -361
  598. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +369 -361
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +311 -303
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +311 -303
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +327 -319
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +327 -319
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +332 -324
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +332 -324
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +341 -333
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +341 -333
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +369 -361
  608. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +369 -361
  609. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +369 -361
  610. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +369 -361
  611. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +369 -361
  612. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +369 -361
  613. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +383 -379
  614. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +383 -379
  615. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +538 -534
  616. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +550 -546
  617. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +444 -410
  618. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +8 -8
  619. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +444 -410
  620. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +18 -4
  621. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +133 -288
  622. data/example_files/scripts/convert_urbanopt_to_disco.py +130 -0
  623. data/example_files/scripts/default_control_changes.csv +8 -0
  624. data/example_files/scripts/default_voltage_regulators.csv +3 -0
  625. data/example_files/scripts/read_data.py +331 -0
  626. data/example_files/visualization/input_visualization_feature.html +172 -81
  627. data/example_files/visualization/input_visualization_scenario.html +178 -82
  628. data/example_files/xml_building/17/README.md +2 -2
  629. data/example_files/xml_building/17/unit 1.xml +40 -41
  630. data/example_files/xml_building/17/unit 2.xml +35 -36
  631. data/example_files/xml_building/17/unit 3.xml +35 -36
  632. data/example_files/xml_building/17/unit 4.xml +41 -42
  633. data/lib/uo_cli/version.rb +1 -1
  634. data/lib/uo_cli.rb +596 -96
  635. data/uo_cli.gemspec +6 -5
  636. metadata +121 -36
  637. data/example_files/residential/exhaust.tsv +0 -3
  638. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
  639. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
  640. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
  641. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
  642. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
  643. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
  644. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
  645. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
  646. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
  647. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
  648. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
  649. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +0 -410
@@ -7,32 +7,14 @@ require 'openstudio'
7
7
  require 'pathname'
8
8
  require 'csv'
9
9
  require 'oga'
10
- require_relative 'resources/geometry'
11
- require_relative '../HPXMLtoOpenStudio/resources/airflow'
12
- require_relative '../HPXMLtoOpenStudio/resources/battery'
13
- require_relative '../HPXMLtoOpenStudio/resources/constants'
14
- require_relative '../HPXMLtoOpenStudio/resources/constructions'
15
- require_relative '../HPXMLtoOpenStudio/resources/geometry'
16
- require_relative '../HPXMLtoOpenStudio/resources/hotwater_appliances'
17
- require_relative '../HPXMLtoOpenStudio/resources/hpxml_defaults'
18
- require_relative '../HPXMLtoOpenStudio/resources/hpxml'
19
- require_relative '../HPXMLtoOpenStudio/resources/hvac'
20
- require_relative '../HPXMLtoOpenStudio/resources/hvac_sizing'
21
- require_relative '../HPXMLtoOpenStudio/resources/lighting'
22
- require_relative '../HPXMLtoOpenStudio/resources/location'
23
- require_relative '../HPXMLtoOpenStudio/resources/materials'
24
- require_relative '../HPXMLtoOpenStudio/resources/misc_loads'
25
- require_relative '../HPXMLtoOpenStudio/resources/meta_measure'
26
- require_relative '../HPXMLtoOpenStudio/resources/psychrometrics'
27
- require_relative '../HPXMLtoOpenStudio/resources/pv'
28
- require_relative '../HPXMLtoOpenStudio/resources/schedules'
29
- require_relative '../HPXMLtoOpenStudio/resources/unit_conversions'
30
- require_relative '../HPXMLtoOpenStudio/resources/util'
31
- require_relative '../HPXMLtoOpenStudio/resources/validator'
32
- require_relative '../HPXMLtoOpenStudio/resources/version'
33
- require_relative '../HPXMLtoOpenStudio/resources/waterheater'
34
- require_relative '../HPXMLtoOpenStudio/resources/weather'
35
- require_relative '../HPXMLtoOpenStudio/resources/xmlhelper'
10
+ Dir["#{File.dirname(__FILE__)}/resources/*.rb"].each do |resource_file|
11
+ require resource_file
12
+ end
13
+ Dir["#{File.dirname(__FILE__)}/../HPXMLtoOpenStudio/resources/*.rb"].each do |resource_file|
14
+ next if resource_file.include? 'minitest_helper.rb'
15
+
16
+ require resource_file
17
+ end
36
18
 
37
19
  # start the measure
38
20
  class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
@@ -48,11 +30,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
48
30
 
49
31
  # human readable description of modeling approach
50
32
  def modeler_description
51
- return ''
33
+ return "Note: OS-HPXML default values can be found in the OS-HPXML documentation or can be seen by using the 'apply_defaults' argument."
52
34
  end
53
35
 
54
36
  # define the arguments that the user will input
55
- def arguments(model)
37
+ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
56
38
  args = OpenStudio::Measure::OSArgumentVector.new
57
39
 
58
40
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('hpxml_path', true)
@@ -76,7 +58,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
76
58
 
77
59
  arg = OpenStudio::Measure::OSArgument.makeChoiceArgument('occupancy_calculation_type', occupancy_calculation_type_choices, false)
78
60
  arg.setDisplayName('Occupancy Calculation Type')
79
- arg.setDescription("The type of occupancy calculation type. If '#{HPXML::OccupancyCalculationTypeAsset}' is chosen, various end uses (e.g., clothes washer) are calculated using number of bedrooms and/or conditioned floor area. If '#{HPXML::OccupancyCalculationTypeOperational}' is chosen, end uses based on number of bedrooms are adjusted for the number of occupants. Defaults to '#{HPXML::OccupancyCalculationTypeAsset}'.")
61
+ arg.setDescription("The type of occupancy calculation type. If '#{HPXML::OccupancyCalculationTypeAsset}' is chosen, various end uses (e.g., clothes washer) are calculated using number of bedrooms and/or conditioned floor area. If '#{HPXML::OccupancyCalculationTypeOperational}' is chosen, end uses based on number of bedrooms are adjusted for the number of occupants. If not provided, the OS-HPXML default is used.")
80
62
  args << arg
81
63
 
82
64
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('schedules_filepaths', false)
@@ -87,28 +69,33 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
87
69
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('simulation_control_timestep', false)
88
70
  arg.setDisplayName('Simulation Control: Timestep')
89
71
  arg.setUnits('min')
90
- arg.setDescription('Value must be a divisor of 60.')
72
+ arg.setDescription('Value must be a divisor of 60. If not provided, the OS-HPXML default is used.')
91
73
  args << arg
92
74
 
93
75
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('simulation_control_run_period', false)
94
76
  arg.setDisplayName('Simulation Control: Run Period')
95
- arg.setDescription('Enter a date like "Jan 1 - Dec 31".')
77
+ arg.setDescription('Enter a date like "Jan 1 - Dec 31". If not provided, the OS-HPXML default is used.')
96
78
  args << arg
97
79
 
98
80
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('simulation_control_run_period_calendar_year', false)
99
81
  arg.setDisplayName('Simulation Control: Run Period Calendar Year')
100
82
  arg.setUnits('year')
101
- 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.')
83
+ 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.')
102
84
  args << arg
103
85
 
104
86
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('simulation_control_daylight_saving_enabled', false)
105
87
  arg.setDisplayName('Simulation Control: Daylight Saving Enabled')
106
- arg.setDescription('Whether to use daylight saving.')
88
+ arg.setDescription('Whether to use daylight saving. If not provided, the OS-HPXML default is used.')
107
89
  args << arg
108
90
 
109
91
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('simulation_control_daylight_saving_period', false)
110
92
  arg.setDisplayName('Simulation Control: Daylight Saving Period')
111
- arg.setDescription('Enter a date like "Mar 15 - Dec 15".')
93
+ arg.setDescription('Enter a date like "Mar 15 - Dec 15". If not provided, the OS-HPXML default is used.')
94
+ args << arg
95
+
96
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('simulation_control_temperature_capacitance_multiplier', false)
97
+ arg.setDisplayName('Simulation Control: Temperature Capacitance Multiplier')
98
+ arg.setDescription('Affects the transient calculation of indoor air temperatures. If not provided, the OS-HPXML default is used.')
112
99
  args << arg
113
100
 
114
101
  site_type_choices = OpenStudio::StringVector.new
@@ -118,19 +105,23 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
118
105
 
119
106
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('site_type', site_type_choices, false)
120
107
  arg.setDisplayName('Site: Type')
121
- arg.setDescription('The type of site.')
108
+ arg.setDescription('The type of site. If not provided, the OS-HPXML default is used.')
122
109
  args << arg
123
110
 
124
111
  site_shielding_of_home_choices = OpenStudio::StringVector.new
125
- site_shielding_of_home_choices << Constants.Auto
126
112
  site_shielding_of_home_choices << HPXML::ShieldingExposed
127
113
  site_shielding_of_home_choices << HPXML::ShieldingNormal
128
114
  site_shielding_of_home_choices << HPXML::ShieldingWellShielded
129
115
 
130
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('site_shielding_of_home', site_shielding_of_home_choices, true)
116
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('site_shielding_of_home', site_shielding_of_home_choices, false)
131
117
  arg.setDisplayName('Site: Shielding of Home')
132
- arg.setDescription("Presence of nearby buildings, trees, obstructions for infiltration model. A value of '#{Constants.Auto}' will use '#{HPXML::ShieldingNormal}'.")
133
- arg.setDefaultValue(Constants.Auto)
118
+ arg.setDescription('Presence of nearby buildings, trees, obstructions for infiltration model. If not provided, the OS-HPXML default is used.')
119
+ args << arg
120
+
121
+ arg = OpenStudio::Measure::OSArgument.makeDoubleArgument('site_ground_conductivity', false)
122
+ arg.setDisplayName('Site: Ground Conductivity')
123
+ arg.setDescription('Conductivity of the ground soil. If not provided, the OS-HPXML default is used.')
124
+ arg.setUnits('Btu/hr-ft-F')
134
125
  args << arg
135
126
 
136
127
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('site_zip_code', false)
@@ -172,7 +163,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
172
163
 
173
164
  arg = OpenStudio::Measure::OSArgument.makeIntegerArgument('year_built', false)
174
165
  arg.setDisplayName('Building Construction: Year Built')
175
- arg.setDescription('The year the building was built')
166
+ arg.setDescription('The year the building was built.')
176
167
  args << arg
177
168
 
178
169
  unit_type_choices = OpenStudio::StringVector.new
@@ -250,24 +241,22 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
250
241
  arg.setDefaultValue(3)
251
242
  args << arg
252
243
 
253
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('geometry_unit_num_bathrooms', true)
244
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('geometry_unit_num_bathrooms', false)
254
245
  arg.setDisplayName('Geometry: Unit Number of Bathrooms')
255
246
  arg.setUnits('#')
256
- arg.setDescription("The number of bathrooms in the unit. A value of '#{Constants.Auto}' will default the value based on the number of bedrooms.")
257
- arg.setDefaultValue(Constants.Auto)
247
+ arg.setDescription('The number of bathrooms in the unit. If not provided, the OS-HPXML default is used.')
258
248
  args << arg
259
249
 
260
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('geometry_unit_num_occupants', true)
250
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_unit_num_occupants', false)
261
251
  arg.setDisplayName('Geometry: Unit Number of Occupants')
262
252
  arg.setUnits('#')
263
- arg.setDescription("The number of occupants in the unit. A value of '#{Constants.Auto}' will default the value based on the number of bedrooms. Used to specify the internal gains from people only.")
264
- arg.setDefaultValue(Constants.Auto)
253
+ arg.setDescription("The number of occupants in the unit. If not provided, the OS-HPXML default is used. Required if Occupancy Calculation Type is '#{HPXML::OccupancyCalculationTypeOperational}'.")
265
254
  args << arg
266
255
 
267
256
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('geometry_building_num_units', false)
268
257
  arg.setDisplayName('Geometry: Building Number of Units')
269
258
  arg.setUnits('#')
270
- arg.setDescription("The number of units in the building. This is required for #{HPXML::ResidentialTypeSFA} and #{HPXML::ResidentialTypeApartment}s.")
259
+ arg.setDescription("The number of units in the building. Required for #{HPXML::ResidentialTypeSFA} and #{HPXML::ResidentialTypeApartment}s.")
271
260
  args << arg
272
261
 
273
262
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_average_ceiling_height', true)
@@ -394,10 +383,9 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
394
383
  arg.setDefaultValue(2.0)
395
384
  args << arg
396
385
 
397
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('geometry_has_flue_or_chimney', true)
386
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('geometry_has_flue_or_chimney', false)
398
387
  arg.setDisplayName('Geometry: Has Flue or Chimney')
399
- arg.setDescription("Presence of flue or chimney for infiltration model. A value of '#{Constants.Auto}' will default based on the fuel type and efficiency of space/water heating equipment in the home.")
400
- arg.setDefaultValue(Constants.Auto)
388
+ arg.setDescription('Presence of flue or chimney for infiltration model. If not provided, the OS-HPXML default is used.')
401
389
  args << arg
402
390
 
403
391
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_front_distance', true)
@@ -428,32 +416,28 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
428
416
  arg.setDefaultValue(10.0)
429
417
  args << arg
430
418
 
431
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('neighbor_front_height', true)
419
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_front_height', false)
432
420
  arg.setDisplayName('Neighbor: Front Height')
433
421
  arg.setUnits('ft')
434
- arg.setDescription("The height of the neighboring building to the front. A value of '#{Constants.Auto}' will use the same height as this building.")
435
- arg.setDefaultValue(Constants.Auto)
422
+ arg.setDescription('The height of the neighboring building to the front. If not provided, the OS-HPXML default is used.')
436
423
  args << arg
437
424
 
438
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('neighbor_back_height', true)
425
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_back_height', false)
439
426
  arg.setDisplayName('Neighbor: Back Height')
440
427
  arg.setUnits('ft')
441
- arg.setDescription("The height of the neighboring building to the back. A value of '#{Constants.Auto}' will use the same height as this building.")
442
- arg.setDefaultValue(Constants.Auto)
428
+ arg.setDescription('The height of the neighboring building to the back. If not provided, the OS-HPXML default is used.')
443
429
  args << arg
444
430
 
445
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('neighbor_left_height', true)
431
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_left_height', false)
446
432
  arg.setDisplayName('Neighbor: Left Height')
447
433
  arg.setUnits('ft')
448
- arg.setDescription("The height of the neighboring building to the left. A value of '#{Constants.Auto}' will use the same height as this building.")
449
- arg.setDefaultValue(Constants.Auto)
434
+ arg.setDescription('The height of the neighboring building to the left. If not provided, the OS-HPXML default is used.')
450
435
  args << arg
451
436
 
452
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('neighbor_right_height', true)
437
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_right_height', false)
453
438
  arg.setDisplayName('Neighbor: Right Height')
454
439
  arg.setUnits('ft')
455
- arg.setDescription("The height of the neighboring building to the right. A value of '#{Constants.Auto}' will use the same height as this building.")
456
- arg.setDefaultValue(Constants.Auto)
440
+ arg.setDescription('The height of the neighboring building to the right. If not provided, the OS-HPXML default is used.')
457
441
  args << arg
458
442
 
459
443
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('floor_over_foundation_assembly_r', true)
@@ -470,8 +454,19 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
470
454
  arg.setDefaultValue(28.1)
471
455
  args << arg
472
456
 
457
+ floor_type_choices = OpenStudio::StringVector.new
458
+ floor_type_choices << HPXML::FloorTypeWoodFrame
459
+ floor_type_choices << HPXML::FloorTypeSIP
460
+ floor_type_choices << HPXML::FloorTypeConcrete
461
+ floor_type_choices << HPXML::FloorTypeSteelFrame
462
+
463
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('floor_type', floor_type_choices, true)
464
+ arg.setDisplayName('Floor: Type')
465
+ arg.setDescription('The type of floors.')
466
+ arg.setDefaultValue(HPXML::FloorTypeWoodFrame)
467
+ args << arg
468
+
473
469
  foundation_wall_type_choices = OpenStudio::StringVector.new
474
- foundation_wall_type_choices << Constants.Auto
475
470
  foundation_wall_type_choices << HPXML::FoundationWallTypeSolidConcrete
476
471
  foundation_wall_type_choices << HPXML::FoundationWallTypeConcreteBlock
477
472
  foundation_wall_type_choices << HPXML::FoundationWallTypeConcreteBlockFoamCore
@@ -481,17 +476,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
481
476
  foundation_wall_type_choices << HPXML::FoundationWallTypeDoubleBrick
482
477
  foundation_wall_type_choices << HPXML::FoundationWallTypeWood
483
478
 
484
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('foundation_wall_type', true)
479
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('foundation_wall_type', foundation_wall_type_choices, false)
485
480
  arg.setDisplayName('Foundation Wall: Type')
486
- arg.setDescription('The material type of the foundation wall.')
487
- arg.setDefaultValue(Constants.Auto)
481
+ arg.setDescription('The material type of the foundation wall. If not provided, the OS-HPXML default is used.')
488
482
  args << arg
489
483
 
490
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('foundation_wall_thickness', true)
484
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_thickness', false)
491
485
  arg.setDisplayName('Foundation Wall: Thickness')
492
486
  arg.setUnits('in')
493
- arg.setDescription('The thickness of the foundation wall.')
494
- arg.setDefaultValue(Constants.Auto)
487
+ arg.setDescription('The thickness of the foundation wall. If not provided, the OS-HPXML default is used.')
495
488
  args << arg
496
489
 
497
490
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_insulation_r', true)
@@ -512,30 +505,28 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
512
505
  arg.setDefaultValue('exterior')
513
506
  args << arg
514
507
 
515
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('foundation_wall_insulation_distance_to_top', true)
508
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_insulation_distance_to_top', false)
516
509
  arg.setDisplayName('Foundation Wall: Insulation Distance To Top')
517
510
  arg.setUnits('ft')
518
- arg.setDescription("The distance from the top of the foundation wall to the top of the foundation wall insulation. Only applies to basements/crawlspaces. A value of '#{Constants.Auto}' will use zero.")
519
- arg.setDefaultValue(Constants.Auto)
511
+ 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.')
520
512
  args << arg
521
513
 
522
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('foundation_wall_insulation_distance_to_bottom', true)
514
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_insulation_distance_to_bottom', false)
523
515
  arg.setDisplayName('Foundation Wall: Insulation Distance To Bottom')
524
516
  arg.setUnits('ft')
525
- arg.setDescription("The distance from the top of the foundation wall to the bottom of the foundation wall insulation. Only applies to basements/crawlspaces. A value of '#{Constants.Auto}' will use the height of the foundation wall.")
526
- arg.setDefaultValue(Constants.Auto)
517
+ 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.')
527
518
  args << arg
528
519
 
529
520
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('foundation_wall_assembly_r', false)
530
521
  arg.setDisplayName('Foundation Wall: Assembly R-value')
531
522
  arg.setUnits('h-ft^2-R/Btu')
532
- arg.setDescription('Assembly R-value for the foundation walls. Only applies to basements/crawlspaces. If provided, overrides the previous foundation wall insulation inputs.')
523
+ arg.setDescription('Assembly R-value for the foundation walls. Only applies to basements/crawlspaces. If provided, overrides the previous foundation wall insulation inputs. If not provided, it is ignored.')
533
524
  args << arg
534
525
 
535
526
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('rim_joist_assembly_r', false)
536
527
  arg.setDisplayName('Rim Joist: Assembly R-value')
537
528
  arg.setUnits('h-ft^2-R/Btu')
538
- arg.setDescription('Assembly R-value for the rim joists. Only applies to basements/crawlspaces.')
529
+ arg.setDescription('Assembly R-value for the rim joists. Only applies to basements/crawlspaces. Required if a rim joist height is provided.')
539
530
  args << arg
540
531
 
541
532
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_perimeter_insulation_r', true)
@@ -566,25 +557,22 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
566
557
  arg.setDefaultValue(0)
567
558
  args << arg
568
559
 
569
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('slab_thickness', true)
560
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_thickness', false)
570
561
  arg.setDisplayName('Slab: Thickness')
571
562
  arg.setUnits('in')
572
- arg.setDescription('The thickness of the slab. Zero can be entered if there is a dirt floor instead of a slab.')
573
- arg.setDefaultValue(Constants.Auto)
563
+ 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.')
574
564
  args << arg
575
565
 
576
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('slab_carpet_fraction', true)
566
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_carpet_fraction', false)
577
567
  arg.setDisplayName('Slab: Carpet Fraction')
578
568
  arg.setUnits('Frac')
579
- arg.setDescription('Fraction of the slab floor area that is carpeted.')
580
- arg.setDefaultValue(Constants.Auto)
569
+ arg.setDescription('Fraction of the slab floor area that is carpeted. If not provided, the OS-HPXML default is used.')
581
570
  args << arg
582
571
 
583
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('slab_carpet_r', true)
572
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('slab_carpet_r', false)
584
573
  arg.setDisplayName('Slab: Carpet R-value')
585
574
  arg.setUnits('h-ft^2-R/Btu')
586
- arg.setDescription('R-value of the slab carpet.')
587
- arg.setDefaultValue(Constants.Auto)
575
+ arg.setDescription('R-value of the slab carpet. If not provided, the OS-HPXML default is used.')
588
576
  args << arg
589
577
 
590
578
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_assembly_r', true)
@@ -607,7 +595,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
607
595
 
608
596
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_material_type', roof_material_type_choices, false)
609
597
  arg.setDisplayName('Roof: Material Type')
610
- arg.setDescription('The material type of the roof.')
598
+ arg.setDescription('The material type of the roof. If not provided, the OS-HPXML default is used.')
611
599
  args << arg
612
600
 
613
601
  color_choices = OpenStudio::StringVector.new
@@ -617,10 +605,9 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
617
605
  color_choices << HPXML::ColorMediumDark
618
606
  color_choices << HPXML::ColorReflective
619
607
 
620
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_color', color_choices, true)
608
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_color', color_choices, false)
621
609
  arg.setDisplayName('Roof: Color')
622
- arg.setDescription('The color of the roof.')
623
- arg.setDefaultValue(HPXML::ColorMedium)
610
+ arg.setDescription('The color of the roof. If not provided, the OS-HPXML default is used.')
624
611
  args << arg
625
612
 
626
613
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('roof_assembly_r', true)
@@ -681,13 +668,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
681
668
 
682
669
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('wall_siding_type', wall_siding_type_choices, false)
683
670
  arg.setDisplayName('Wall: Siding Type')
684
- arg.setDescription('The siding type of the walls. Also applies to rim joists.')
671
+ arg.setDescription('The siding type of the walls. Also applies to rim joists. If not provided, the OS-HPXML default is used.')
685
672
  args << arg
686
673
 
687
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('wall_color', color_choices, true)
674
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('wall_color', color_choices, false)
688
675
  arg.setDisplayName('Wall: Color')
689
- arg.setDescription('The color of the walls. Also applies to rim joists.')
690
- arg.setDefaultValue(HPXML::ColorMedium)
676
+ arg.setDescription('The color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default is used.')
691
677
  args << arg
692
678
 
693
679
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('wall_assembly_r', true)
@@ -763,7 +749,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
763
749
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_fraction_operable', false)
764
750
  arg.setDisplayName('Windows: Fraction Operable')
765
751
  arg.setUnits('Frac')
766
- arg.setDescription('Fraction of windows that are operable.')
752
+ arg.setDescription('Fraction of windows that are operable. If not provided, the OS-HPXML default is used.')
753
+ args << arg
754
+
755
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('window_natvent_availability', false)
756
+ arg.setDisplayName('Windows: Natural Ventilation Availability')
757
+ arg.setUnits('Days/week')
758
+ 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.')
767
759
  args << arg
768
760
 
769
761
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_ufactor', true)
@@ -782,25 +774,25 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
782
774
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_interior_shading_winter', false)
783
775
  arg.setDisplayName('Windows: Winter Interior Shading')
784
776
  arg.setUnits('Frac')
785
- arg.setDescription('Interior shading multiplier for the heating season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc.')
777
+ arg.setDescription('Interior shading multiplier for the heating season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
786
778
  args << arg
787
779
 
788
780
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_interior_shading_summer', false)
789
781
  arg.setDisplayName('Windows: Summer Interior Shading')
790
782
  arg.setUnits('Frac')
791
- arg.setDescription('Interior shading multiplier for the cooling season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc.')
783
+ arg.setDescription('Interior shading multiplier for the cooling season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
792
784
  args << arg
793
785
 
794
786
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_exterior_shading_winter', false)
795
787
  arg.setDisplayName('Windows: Winter Exterior Shading')
796
788
  arg.setUnits('Frac')
797
- arg.setDescription('Exterior shading multiplier for the heating season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc.')
789
+ arg.setDescription('Exterior shading multiplier for the heating season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
798
790
  args << arg
799
791
 
800
792
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_exterior_shading_summer', false)
801
793
  arg.setDisplayName('Windows: Summer Exterior Shading')
802
794
  arg.setUnits('Frac')
803
- arg.setDescription('Exterior shading multiplier for the cooling season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc.')
795
+ arg.setDescription('Exterior shading multiplier for the cooling season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
804
796
  args << arg
805
797
 
806
798
  storm_window_type_choices = OpenStudio::StringVector.new
@@ -809,7 +801,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
809
801
 
810
802
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('window_storm_type', storm_window_type_choices, false)
811
803
  arg.setDisplayName('Windows: Storm Type')
812
- arg.setDescription('The type of storm, if present.')
804
+ arg.setDescription('The type of storm, if present. If not provided, assumes there is no storm.')
813
805
  args << arg
814
806
 
815
807
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('overhangs_front_depth', true)
@@ -939,7 +931,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
939
931
 
940
932
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('skylight_storm_type', storm_window_type_choices, false)
941
933
  arg.setDisplayName('Skylights: Storm Type')
942
- arg.setDescription('The type of storm, if present.')
934
+ arg.setDescription('The type of storm, if present. If not provided, assumes there is no storm.')
943
935
  args << arg
944
936
 
945
937
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('door_area', true)
@@ -991,7 +983,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
991
983
  heating_system_type_choices << HPXML::HVACTypePortableHeater
992
984
  heating_system_type_choices << HPXML::HVACTypeFireplace
993
985
  heating_system_type_choices << HPXML::HVACTypeFixedHeater
994
- heating_system_type_choices << HPXML::HVACTypePTACHeating
995
986
  heating_system_type_choices << "Shared #{HPXML::HVACTypeBoiler} w/ Baseboard"
996
987
  heating_system_type_choices << "Shared #{HPXML::HVACTypeBoiler} w/ Ductless Fan Coil"
997
988
 
@@ -1014,6 +1005,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1014
1005
 
1015
1006
  cooling_efficiency_type_choices = OpenStudio::StringVector.new
1016
1007
  cooling_efficiency_type_choices << HPXML::UnitsSEER
1008
+ cooling_efficiency_type_choices << HPXML::UnitsSEER2
1017
1009
  cooling_efficiency_type_choices << HPXML::UnitsEER
1018
1010
  cooling_efficiency_type_choices << HPXML::UnitsCEER
1019
1011
 
@@ -1024,13 +1016,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1024
1016
 
1025
1017
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system_type', heating_system_type_choices, true)
1026
1018
  arg.setDisplayName('Heating System: Type')
1027
- arg.setDescription("The type of heating system. Use 'none' if there is no heating system.")
1019
+ arg.setDescription("The type of heating system. Use 'none' if there is no heating system or if there is a heat pump serving a heating load.")
1028
1020
  arg.setDefaultValue(HPXML::HVACTypeFurnace)
1029
1021
  args << arg
1030
1022
 
1031
1023
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system_fuel', heating_system_fuel_choices, true)
1032
1024
  arg.setDisplayName('Heating System: Fuel Type')
1033
- arg.setDescription("The fuel type of the heating system. Ignored for #{HPXML::HVACTypeElectricResistance} and #{HPXML::HVACTypePTACHeating}.")
1025
+ arg.setDescription("The fuel type of the heating system. Ignored for #{HPXML::HVACTypeElectricResistance}.")
1034
1026
  arg.setDefaultValue(HPXML::FuelTypeNaturalGas)
1035
1027
  args << arg
1036
1028
 
@@ -1041,11 +1033,10 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1041
1033
  arg.setDefaultValue(0.78)
1042
1034
  args << arg
1043
1035
 
1044
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('heating_system_heating_capacity', true)
1036
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_heating_capacity', false)
1045
1037
  arg.setDisplayName('Heating System: Heating Capacity')
1046
- arg.setDescription("The output heating capacity of the heating system. Enter '#{Constants.Auto}' to size the capacity based on ACCA Manual J/S.")
1038
+ arg.setDescription('The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default is used.')
1047
1039
  arg.setUnits('Btu/hr')
1048
- arg.setDefaultValue(Constants.Auto)
1049
1040
  args << arg
1050
1041
 
1051
1042
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_fraction_heat_load_served', true)
@@ -1057,45 +1048,43 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1057
1048
 
1058
1049
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_airflow_defect_ratio', false)
1059
1050
  arg.setDisplayName('Heating System: Airflow Defect Ratio')
1060
- arg.setDescription("The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the heating system per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to #{HPXML::HVACTypeFurnace}.")
1051
+ arg.setDescription("The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the heating system per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to #{HPXML::HVACTypeFurnace}. If not provided, assumes no defect.")
1061
1052
  arg.setUnits('Frac')
1062
1053
  args << arg
1063
1054
 
1064
1055
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooling_system_type', cooling_system_type_choices, true)
1065
1056
  arg.setDisplayName('Cooling System: Type')
1066
- arg.setDescription("The type of cooling system. Use 'none' if there is no cooling system.")
1057
+ arg.setDescription("The type of cooling system. Use 'none' if there is no cooling system or if there is a heat pump serving a cooling load.")
1067
1058
  arg.setDefaultValue(HPXML::HVACTypeCentralAirConditioner)
1068
1059
  args << arg
1069
1060
 
1070
1061
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooling_system_cooling_efficiency_type', cooling_efficiency_type_choices, true)
1071
1062
  arg.setDisplayName('Cooling System: Efficiency Type')
1072
- arg.setDescription("The efficiency type of the cooling system. System types #{HPXML::HVACTypeCentralAirConditioner} and #{HPXML::HVACTypeMiniSplitAirConditioner} use #{HPXML::UnitsSEER}. System types #{HPXML::HVACTypeRoomAirConditioner} and #{HPXML::HVACTypePTAC} use #{HPXML::UnitsEER} or #{HPXML::UnitsCEER}. Ignored for system type #{HPXML::HVACTypeEvaporativeCooler}.")
1063
+ arg.setDescription("The efficiency type of the cooling system. System types #{HPXML::HVACTypeCentralAirConditioner} and #{HPXML::HVACTypeMiniSplitAirConditioner} use #{HPXML::UnitsSEER} or #{HPXML::UnitsSEER2}. System types #{HPXML::HVACTypeRoomAirConditioner} and #{HPXML::HVACTypePTAC} use #{HPXML::UnitsEER} or #{HPXML::UnitsCEER}. Ignored for system type #{HPXML::HVACTypeEvaporativeCooler}.")
1073
1064
  arg.setDefaultValue(HPXML::UnitsSEER)
1074
1065
  args << arg
1075
1066
 
1076
1067
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_cooling_efficiency', true)
1077
1068
  arg.setDisplayName('Cooling System: Efficiency')
1078
- arg.setUnits("#{HPXML::UnitsSEER} or #{HPXML::UnitsEER} or #{HPXML::UnitsCEER}")
1079
1069
  arg.setDescription("The rated efficiency value of the cooling system. Ignored for #{HPXML::HVACTypeEvaporativeCooler}.")
1080
1070
  arg.setDefaultValue(13.0)
1081
1071
  args << arg
1082
1072
 
1083
1073
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooling_system_cooling_compressor_type', compressor_type_choices, false)
1084
1074
  arg.setDisplayName('Cooling System: Cooling Compressor Type')
1085
- arg.setDescription("The compressor type of the cooling system. Only applies to #{HPXML::HVACTypeCentralAirConditioner}.")
1075
+ arg.setDescription("The compressor type of the cooling system. Only applies to #{HPXML::HVACTypeCentralAirConditioner}. If not provided, the OS-HPXML default is used.")
1086
1076
  args << arg
1087
1077
 
1088
1078
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_cooling_sensible_heat_fraction', false)
1089
1079
  arg.setDisplayName('Cooling System: Cooling Sensible Heat Fraction')
1090
- arg.setDescription("The sensible heat fraction of the cooling system. Ignored for #{HPXML::HVACTypeEvaporativeCooler}.")
1080
+ arg.setDescription("The sensible heat fraction of the cooling system. Ignored for #{HPXML::HVACTypeEvaporativeCooler}. If not provided, the OS-HPXML default is used.")
1091
1081
  arg.setUnits('Frac')
1092
1082
  args << arg
1093
1083
 
1094
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('cooling_system_cooling_capacity', true)
1084
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_cooling_capacity', false)
1095
1085
  arg.setDisplayName('Cooling System: Cooling Capacity')
1096
- arg.setDescription("The output cooling capacity of the cooling system. Enter '#{Constants.Auto}' to size the capacity based on ACCA Manual J/S.")
1086
+ arg.setDescription('The output cooling capacity of the cooling system. If not provided, the OS-HPXML autosized default is used.')
1097
1087
  arg.setUnits('Btu/hr')
1098
- arg.setDefaultValue(Constants.Auto)
1099
1088
  args << arg
1100
1089
 
1101
1090
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_fraction_cool_load_served', true)
@@ -1113,13 +1102,36 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1113
1102
 
1114
1103
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_airflow_defect_ratio', false)
1115
1104
  arg.setDisplayName('Cooling System: Airflow Defect Ratio')
1116
- arg.setDescription("The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the cooling system per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to #{HPXML::HVACTypeCentralAirConditioner} and ducted #{HPXML::HVACTypeMiniSplitAirConditioner}.")
1105
+ arg.setDescription("The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the cooling system per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to #{HPXML::HVACTypeCentralAirConditioner} and ducted #{HPXML::HVACTypeMiniSplitAirConditioner}. If not provided, assumes no defect.")
1117
1106
  arg.setUnits('Frac')
1118
1107
  args << arg
1119
1108
 
1120
1109
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_charge_defect_ratio', false)
1121
1110
  arg.setDisplayName('Cooling System: Charge Defect Ratio')
1122
- arg.setDescription("The refrigerant charge defect ratio, defined as (InstalledCharge - DesignCharge) / DesignCharge, of the cooling system per ANSI/RESNET/ACCA Standard 310. A value of zero means no refrigerant charge defect. Applies only to #{HPXML::HVACTypeCentralAirConditioner} and #{HPXML::HVACTypeMiniSplitAirConditioner}.")
1111
+ arg.setDescription("The refrigerant charge defect ratio, defined as (InstalledCharge - DesignCharge) / DesignCharge, of the cooling system per ANSI/RESNET/ACCA Standard 310. A value of zero means no refrigerant charge defect. Applies only to #{HPXML::HVACTypeCentralAirConditioner} and #{HPXML::HVACTypeMiniSplitAirConditioner}. If not provided, assumes no defect.")
1112
+ arg.setUnits('Frac')
1113
+ args << arg
1114
+
1115
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooling_system_integrated_heating_system_fuel', heating_system_fuel_choices, false)
1116
+ arg.setDisplayName('Cooling System: Integrated Heating System Fuel Type')
1117
+ arg.setDescription("The fuel type of the heating system integrated into cooling system. Only used for #{HPXML::HVACTypePTAC} and #{HPXML::HVACTypeRoomAirConditioner}.")
1118
+ args << arg
1119
+
1120
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_integrated_heating_system_efficiency_percent', false)
1121
+ arg.setDisplayName('Cooling System: Integrated Heating System Efficiency')
1122
+ arg.setUnits('Frac')
1123
+ arg.setDescription("The rated heating efficiency value of the heating system integrated into cooling system. Only used for #{HPXML::HVACTypePTAC} and #{HPXML::HVACTypeRoomAirConditioner}.")
1124
+ args << arg
1125
+
1126
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_integrated_heating_system_capacity', false)
1127
+ arg.setDisplayName('Cooling System: Integrated Heating System Heating Capacity')
1128
+ 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}.")
1129
+ arg.setUnits('Btu/hr')
1130
+ args << arg
1131
+
1132
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_integrated_heating_system_fraction_heat_load_served', false)
1133
+ arg.setDisplayName('Cooling System: Integrated Heating System Fraction Heat Load Served')
1134
+ arg.setDescription("The heating load served by the heating system integrated into cooling system. Only used for #{HPXML::HVACTypePTAC} and #{HPXML::HVACTypeRoomAirConditioner}.")
1123
1135
  arg.setUnits('Frac')
1124
1136
  args << arg
1125
1137
 
@@ -1129,9 +1141,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1129
1141
  heat_pump_type_choices << HPXML::HVACTypeHeatPumpMiniSplit
1130
1142
  heat_pump_type_choices << HPXML::HVACTypeHeatPumpGroundToAir
1131
1143
  heat_pump_type_choices << HPXML::HVACTypeHeatPumpPTHP
1144
+ heat_pump_type_choices << HPXML::HVACTypeHeatPumpRoom
1132
1145
 
1133
1146
  heat_pump_heating_efficiency_type_choices = OpenStudio::StringVector.new
1134
1147
  heat_pump_heating_efficiency_type_choices << HPXML::UnitsHSPF
1148
+ heat_pump_heating_efficiency_type_choices << HPXML::UnitsHSPF2
1135
1149
  heat_pump_heating_efficiency_type_choices << HPXML::UnitsCOP
1136
1150
 
1137
1151
  heat_pump_fuel_choices = OpenStudio::StringVector.new
@@ -1148,6 +1162,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1148
1162
  heat_pump_backup_fuel_choices << HPXML::FuelTypeOil
1149
1163
  heat_pump_backup_fuel_choices << HPXML::FuelTypePropane
1150
1164
 
1165
+ heat_pump_sizing_choices = OpenStudio::StringVector.new
1166
+ heat_pump_sizing_choices << HPXML::HeatPumpSizingACCA
1167
+ heat_pump_sizing_choices << HPXML::HeatPumpSizingHERS
1168
+ heat_pump_sizing_choices << HPXML::HeatPumpSizingMaxLoad
1169
+
1151
1170
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_type', heat_pump_type_choices, true)
1152
1171
  arg.setDisplayName('Heat Pump: Type')
1153
1172
  arg.setDescription("The type of heat pump. Use 'none' if there is no heat pump.")
@@ -1156,60 +1175,55 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1156
1175
 
1157
1176
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_heating_efficiency_type', heat_pump_heating_efficiency_type_choices, true)
1158
1177
  arg.setDisplayName('Heat Pump: Heating Efficiency Type')
1159
- arg.setDescription("The heating efficiency type of heat pump. System types #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit} use #{HPXML::UnitsHSPF}. System types #{HPXML::HVACTypeHeatPumpGroundToAir} and #{HPXML::HVACTypeHeatPumpPTHP} use #{HPXML::UnitsCOP}.")
1178
+ arg.setDescription("The heating efficiency type of heat pump. System types #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit} use #{HPXML::UnitsHSPF} or #{HPXML::UnitsHSPF2}. System types #{HPXML::HVACTypeHeatPumpGroundToAir}, #{HPXML::HVACTypeHeatPumpPTHP} and #{HPXML::HVACTypeHeatPumpRoom} use #{HPXML::UnitsCOP}.")
1160
1179
  arg.setDefaultValue(HPXML::UnitsHSPF)
1161
1180
  args << arg
1162
1181
 
1163
1182
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_efficiency', true)
1164
1183
  arg.setDisplayName('Heat Pump: Heating Efficiency')
1165
- arg.setUnits("#{HPXML::UnitsHSPF} or #{HPXML::UnitsCOP}")
1166
1184
  arg.setDescription('The rated heating efficiency value of the heat pump.')
1167
1185
  arg.setDefaultValue(7.7)
1168
1186
  args << arg
1169
1187
 
1170
1188
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_cooling_efficiency_type', cooling_efficiency_type_choices, true)
1171
1189
  arg.setDisplayName('Heat Pump: Cooling Efficiency Type')
1172
- arg.setDescription("The cooling efficiency type of heat pump. System types #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit} use #{HPXML::UnitsSEER}. System types #{HPXML::HVACTypeHeatPumpGroundToAir} and #{HPXML::HVACTypeHeatPumpPTHP} use #{HPXML::UnitsEER}.")
1190
+ arg.setDescription("The cooling efficiency type of heat pump. System types #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit} use #{HPXML::UnitsSEER} or #{HPXML::UnitsSEER2}. System types #{HPXML::HVACTypeHeatPumpGroundToAir}, #{HPXML::HVACTypeHeatPumpPTHP} and #{HPXML::HVACTypeHeatPumpRoom} use #{HPXML::UnitsEER}.")
1173
1191
  arg.setDefaultValue(HPXML::UnitsSEER)
1174
1192
  args << arg
1175
1193
 
1176
1194
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_cooling_efficiency', true)
1177
1195
  arg.setDisplayName('Heat Pump: Cooling Efficiency')
1178
- arg.setUnits("#{HPXML::UnitsSEER} or #{HPXML::UnitsEER}")
1179
1196
  arg.setDescription('The rated cooling efficiency value of the heat pump.')
1180
1197
  arg.setDefaultValue(13.0)
1181
1198
  args << arg
1182
1199
 
1183
1200
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_cooling_compressor_type', compressor_type_choices, false)
1184
1201
  arg.setDisplayName('Heat Pump: Cooling Compressor Type')
1185
- arg.setDescription("The compressor type of the heat pump. Only applies to #{HPXML::HVACTypeHeatPumpAirToAir}.")
1202
+ arg.setDescription("The compressor type of the heat pump. Only applies to #{HPXML::HVACTypeHeatPumpAirToAir}. If not provided, the OS-HPXML default is used.")
1186
1203
  args << arg
1187
1204
 
1188
1205
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_cooling_sensible_heat_fraction', false)
1189
1206
  arg.setDisplayName('Heat Pump: Cooling Sensible Heat Fraction')
1190
- arg.setDescription('The sensible heat fraction of the heat pump.')
1207
+ arg.setDescription('The sensible heat fraction of the heat pump. If not provided, the OS-HPXML default is used.')
1191
1208
  arg.setUnits('Frac')
1192
1209
  args << arg
1193
1210
 
1194
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('heat_pump_heating_capacity', true)
1211
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_capacity', false)
1195
1212
  arg.setDisplayName('Heat Pump: Heating Capacity')
1196
- arg.setDescription("The output heating capacity of the heat pump. Enter '#{Constants.Auto}' to size the capacity based on ACCA Manual J/S (i.e., based on cooling design loads with some oversizing allowances for heating design loads). Enter '#{Constants.AutoMaxLoadForHP}' to size the capacity based on the maximum of heating/cooling design loads, taking into account the heat pump's heating reduced capacity at cold temperature. Enter '#{Constants.AutoHERSForHP}' to size the capacity equal to the maximum of heating/cooling design loads.")
1213
+ arg.setDescription('The output heating capacity of the heat pump. If not provided, the OS-HPXML autosized default is used.')
1197
1214
  arg.setUnits('Btu/hr')
1198
- arg.setDefaultValue(Constants.Auto)
1199
1215
  args << arg
1200
1216
 
1201
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('heat_pump_heating_capacity_17_f', true)
1217
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_capacity_17_f', false)
1202
1218
  arg.setDisplayName('Heat Pump: Heating Capacity 17F')
1203
- arg.setDescription("The output heating capacity of the heat pump at 17F. Only applies to #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit}.")
1219
+ arg.setDescription("The output heating capacity of the heat pump at 17F. Only applies to #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit}. If not provided, the OS-HPXML default is used.")
1204
1220
  arg.setUnits('Btu/hr')
1205
- arg.setDefaultValue(Constants.Auto)
1206
1221
  args << arg
1207
1222
 
1208
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('heat_pump_cooling_capacity', true)
1223
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_cooling_capacity', false)
1209
1224
  arg.setDisplayName('Heat Pump: Cooling Capacity')
1210
- arg.setDescription("The output cooling capacity of the heat pump. Enter '#{Constants.Auto}' to size the capacity based on ACCA Manual J/S.")
1225
+ arg.setDescription('The output cooling capacity of the heat pump. If not provided, the OS-HPXML autosized default is used.')
1211
1226
  arg.setUnits('Btu/hr')
1212
- arg.setDefaultValue(Constants.Auto)
1213
1227
  args << arg
1214
1228
 
1215
1229
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_fraction_heat_load_served', true)
@@ -1244,11 +1258,10 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1244
1258
  arg.setDefaultValue(1)
1245
1259
  args << arg
1246
1260
 
1247
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('heat_pump_backup_heating_capacity', true)
1261
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_backup_heating_capacity', false)
1248
1262
  arg.setDisplayName('Heat Pump: Backup Heating Capacity')
1249
- arg.setDescription("The backup output heating capacity of the heat pump. Enter '#{Constants.Auto}' to size the capacity based on ACCA Manual J/S. Only applies if Backup Type is '#{HPXML::HeatPumpBackupTypeIntegrated}'.")
1263
+ 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}'.")
1250
1264
  arg.setUnits('Btu/hr')
1251
- arg.setDefaultValue(Constants.Auto)
1252
1265
  args << arg
1253
1266
 
1254
1267
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_backup_heating_switchover_temp', false)
@@ -1263,20 +1276,25 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1263
1276
  arg.setUnits('deg-F')
1264
1277
  args << arg
1265
1278
 
1279
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_sizing_methodology', heat_pump_sizing_choices, false)
1280
+ arg.setDisplayName('Heat Pump: Sizing Methodology')
1281
+ 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.')
1282
+ args << arg
1283
+
1266
1284
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('heat_pump_is_ducted', false)
1267
1285
  arg.setDisplayName('Heat Pump: Is Ducted')
1268
- arg.setDescription("Whether the heat pump is ducted or not. Only used for #{HPXML::HVACTypeHeatPumpMiniSplit}. It's assumed that #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpGroundToAir} are ducted.")
1286
+ arg.setDescription("Whether the heat pump is ducted or not. Only used for #{HPXML::HVACTypeHeatPumpMiniSplit}. It's assumed that #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpGroundToAir} are ducted. If not provided, assumes not ducted.")
1269
1287
  args << arg
1270
1288
 
1271
1289
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_airflow_defect_ratio', false)
1272
1290
  arg.setDisplayName('Heat Pump: Airflow Defect Ratio')
1273
- arg.setDescription("The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the heat pump per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to #{HPXML::HVACTypeHeatPumpAirToAir}, ducted #{HPXML::HVACTypeHeatPumpMiniSplit}, and #{HPXML::HVACTypeHeatPumpGroundToAir}.")
1291
+ arg.setDescription("The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the heat pump per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to #{HPXML::HVACTypeHeatPumpAirToAir}, ducted #{HPXML::HVACTypeHeatPumpMiniSplit}, and #{HPXML::HVACTypeHeatPumpGroundToAir}. If not provided, assumes no defect.")
1274
1292
  arg.setUnits('Frac')
1275
1293
  args << arg
1276
1294
 
1277
1295
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_charge_defect_ratio', false)
1278
1296
  arg.setDisplayName('Heat Pump: Charge Defect Ratio')
1279
- arg.setDescription('The refrigerant charge defect ratio, defined as (InstalledCharge - DesignCharge) / DesignCharge, of the heat pump per ANSI/RESNET/ACCA Standard 310. A value of zero means no refrigerant charge defect. Applies to all heat pump types.')
1297
+ arg.setDescription('The refrigerant charge defect ratio, defined as (InstalledCharge - DesignCharge) / DesignCharge, of the heat pump per ANSI/RESNET/ACCA Standard 310. A value of zero means no refrigerant charge defect. Applies to all heat pump types. If not provided, assumes no defect.')
1280
1298
  arg.setUnits('Frac')
1281
1299
  args << arg
1282
1300
 
@@ -1309,11 +1327,10 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1309
1327
  arg.setDefaultValue(1.0)
1310
1328
  args << arg
1311
1329
 
1312
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('heating_system_2_heating_capacity', true)
1330
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_2_heating_capacity', false)
1313
1331
  arg.setDisplayName('Heating System 2: Heating Capacity')
1314
- arg.setDescription("The output heating capacity of the second heating system. Enter '#{Constants.Auto}' to size the capacity based on ACCA Manual J/S.")
1332
+ arg.setDescription('The output heating capacity of the second heating system. If not provided, the OS-HPXML autosized default is used.')
1315
1333
  arg.setUnits('Btu/hr')
1316
- arg.setDefaultValue(Constants.Auto)
1317
1334
  args << arg
1318
1335
 
1319
1336
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_2_fraction_heat_load_served', true)
@@ -1323,42 +1340,38 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1323
1340
  arg.setDefaultValue(0.25)
1324
1341
  args << arg
1325
1342
 
1326
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_heating_weekday_setpoint', true)
1343
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_heating_weekday_setpoint', false)
1327
1344
  arg.setDisplayName('HVAC Control: Heating Weekday Setpoint Schedule')
1328
- arg.setDescription('Specify the constant or 24-hour comma-separated weekday heating setpoint schedule.')
1345
+ arg.setDescription('Specify the constant or 24-hour comma-separated weekday heating setpoint schedule. Required unless a detailed CSV schedule is provided.')
1329
1346
  arg.setUnits('deg-F')
1330
- arg.setDefaultValue(Constants.Auto)
1331
1347
  args << arg
1332
1348
 
1333
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_heating_weekend_setpoint', true)
1349
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_heating_weekend_setpoint', false)
1334
1350
  arg.setDisplayName('HVAC Control: Heating Weekend Setpoint Schedule')
1335
- arg.setDescription('Specify the constant or 24-hour comma-separated weekend heating setpoint schedule.')
1351
+ arg.setDescription('Specify the constant or 24-hour comma-separated weekend heating setpoint schedule. Required unless a detailed CSV schedule is provided.')
1336
1352
  arg.setUnits('deg-F')
1337
- arg.setDefaultValue(Constants.Auto)
1338
1353
  args << arg
1339
1354
 
1340
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_cooling_weekday_setpoint', true)
1355
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_cooling_weekday_setpoint', false)
1341
1356
  arg.setDisplayName('HVAC Control: Cooling Weekday Setpoint Schedule')
1342
- arg.setDescription('Specify the constant or 24-hour comma-separated weekday cooling setpoint schedule.')
1357
+ arg.setDescription('Specify the constant or 24-hour comma-separated weekday cooling setpoint schedule. Required unless a detailed CSV schedule is provided.')
1343
1358
  arg.setUnits('deg-F')
1344
- arg.setDefaultValue(Constants.Auto)
1345
1359
  args << arg
1346
1360
 
1347
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_cooling_weekend_setpoint', true)
1361
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_cooling_weekend_setpoint', false)
1348
1362
  arg.setDisplayName('HVAC Control: Cooling Weekend Setpoint Schedule')
1349
- arg.setDescription('Specify the constant or 24-hour comma-separated weekend cooling setpoint schedule.')
1363
+ arg.setDescription('Specify the constant or 24-hour comma-separated weekend cooling setpoint schedule. Required unless a detailed CSV schedule is provided.')
1350
1364
  arg.setUnits('deg-F')
1351
- arg.setDefaultValue(Constants.Auto)
1352
1365
  args << arg
1353
1366
 
1354
1367
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_heating_season_period', false)
1355
1368
  arg.setDisplayName('HVAC Control: Heating Season Period')
1356
- arg.setDescription('Enter a date like "Nov 1 - Jun 30".')
1369
+ 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.")
1357
1370
  args << arg
1358
1371
 
1359
1372
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('hvac_control_cooling_season_period', false)
1360
1373
  arg.setDisplayName('HVAC Control: Cooling Season Period')
1361
- arg.setDescription('Enter a date like "Jun 1 - Oct 31".')
1374
+ 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.")
1362
1375
  args << arg
1363
1376
 
1364
1377
  duct_leakage_units_choices = OpenStudio::StringVector.new
@@ -1367,7 +1380,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1367
1380
  duct_leakage_units_choices << HPXML::UnitsPercent
1368
1381
 
1369
1382
  duct_location_choices = OpenStudio::StringVector.new
1370
- duct_location_choices << Constants.Auto
1371
1383
  duct_location_choices << HPXML::LocationLivingSpace
1372
1384
  duct_location_choices << HPXML::LocationBasementConditioned
1373
1385
  duct_location_choices << HPXML::LocationBasementUnconditioned
@@ -1404,10 +1416,9 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1404
1416
  arg.setDefaultValue(0.1)
1405
1417
  args << arg
1406
1418
 
1407
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_supply_location', duct_location_choices, true)
1419
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_supply_location', duct_location_choices, false)
1408
1420
  arg.setDisplayName('Ducts: Supply Location')
1409
- arg.setDescription('The location of the supply ducts.')
1410
- arg.setDefaultValue(Constants.Auto)
1421
+ arg.setDescription('The location of the supply ducts. If not provided, the OS-HPXML default is used.')
1411
1422
  args << arg
1412
1423
 
1413
1424
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_supply_insulation_r', true)
@@ -1417,17 +1428,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1417
1428
  arg.setDefaultValue(0)
1418
1429
  args << arg
1419
1430
 
1420
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('ducts_supply_surface_area', true)
1431
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_supply_surface_area', false)
1421
1432
  arg.setDisplayName('Ducts: Supply Surface Area')
1422
- arg.setDescription('The surface area of the supply ducts.')
1433
+ arg.setDescription('The surface area of the supply ducts. If not provided, the OS-HPXML default is used.')
1423
1434
  arg.setUnits('ft^2')
1424
- arg.setDefaultValue(Constants.Auto)
1425
1435
  args << arg
1426
1436
 
1427
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_return_location', duct_location_choices, true)
1437
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_return_location', duct_location_choices, false)
1428
1438
  arg.setDisplayName('Ducts: Return Location')
1429
- arg.setDescription('The location of the return ducts.')
1430
- arg.setDefaultValue(Constants.Auto)
1439
+ arg.setDescription('The location of the return ducts. If not provided, the OS-HPXML default is used.')
1431
1440
  args << arg
1432
1441
 
1433
1442
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_return_insulation_r', true)
@@ -1437,18 +1446,16 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1437
1446
  arg.setDefaultValue(0)
1438
1447
  args << arg
1439
1448
 
1440
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('ducts_return_surface_area', true)
1449
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_return_surface_area', false)
1441
1450
  arg.setDisplayName('Ducts: Return Surface Area')
1442
- arg.setDescription('The surface area of the return ducts.')
1451
+ arg.setDescription('The surface area of the return ducts. If not provided, the OS-HPXML default is used.')
1443
1452
  arg.setUnits('ft^2')
1444
- arg.setDefaultValue(Constants.Auto)
1445
1453
  args << arg
1446
1454
 
1447
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('ducts_number_of_return_registers', false)
1455
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('ducts_number_of_return_registers', false)
1448
1456
  arg.setDisplayName('Ducts: Number of Return Registers')
1449
- arg.setDescription("The number of return registers of the ducts. Only used if duct surface areas are set to #{Constants.Auto}.")
1457
+ 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.')
1450
1458
  arg.setUnits('#')
1451
- arg.setDefaultValue(Constants.Auto)
1452
1459
  args << arg
1453
1460
 
1454
1461
  mech_vent_fan_type_choices = OpenStudio::StringVector.new
@@ -1470,18 +1477,16 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1470
1477
  arg.setDefaultValue('none')
1471
1478
  args << arg
1472
1479
 
1473
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('mech_vent_flow_rate', true)
1480
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_flow_rate', false)
1474
1481
  arg.setDisplayName('Mechanical Ventilation: Flow Rate')
1475
- arg.setDescription('The flow rate of the mechanical ventilation.')
1482
+ arg.setDescription('The flow rate of the mechanical ventilation. If not provided, the OS-HPXML default is used.')
1476
1483
  arg.setUnits('CFM')
1477
- arg.setDefaultValue(Constants.Auto)
1478
1484
  args << arg
1479
1485
 
1480
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('mech_vent_hours_in_operation', true)
1486
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_hours_in_operation', false)
1481
1487
  arg.setDisplayName('Mechanical Ventilation: Hours In Operation')
1482
- arg.setDescription('The hours in operation of the mechanical ventilation.')
1488
+ arg.setDescription('The hours in operation of the mechanical ventilation. If not provided, the OS-HPXML default is used.')
1483
1489
  arg.setUnits('hrs/day')
1484
- arg.setDefaultValue(Constants.Auto)
1485
1490
  args << arg
1486
1491
 
1487
1492
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('mech_vent_recovery_efficiency_type', mech_vent_recovery_efficiency_type_choices, true)
@@ -1504,11 +1509,10 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1504
1509
  arg.setDefaultValue(0.72)
1505
1510
  args << arg
1506
1511
 
1507
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('mech_vent_fan_power', true)
1512
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_fan_power', false)
1508
1513
  arg.setDisplayName('Mechanical Ventilation: Fan Power')
1509
- arg.setDescription('The fan power of the mechanical ventilation.')
1514
+ arg.setDescription('The fan power of the mechanical ventilation. If not provided, the OS-HPXML default is used.')
1510
1515
  arg.setUnits('W')
1511
- arg.setDefaultValue(Constants.Auto)
1512
1516
  args << arg
1513
1517
 
1514
1518
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('mech_vent_num_units_served', true)
@@ -1520,24 +1524,24 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1520
1524
 
1521
1525
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_shared_frac_recirculation', false)
1522
1526
  arg.setDisplayName('Shared Mechanical Ventilation: Fraction Recirculation')
1523
- arg.setDescription('Fraction of the total supply air that is recirculated, with the remainder assumed to be outdoor air. The value must be 0 for exhaust only systems. This is required for a shared mechanical ventilation system.')
1527
+ arg.setDescription('Fraction of the total supply air that is recirculated, with the remainder assumed to be outdoor air. The value must be 0 for exhaust only systems. Required for a shared mechanical ventilation system.')
1524
1528
  arg.setUnits('Frac')
1525
1529
  args << arg
1526
1530
 
1527
1531
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('mech_vent_shared_preheating_fuel', heating_system_fuel_choices, false)
1528
1532
  arg.setDisplayName('Shared Mechanical Ventilation: Preheating Fuel')
1529
- arg.setDescription('Fuel type of the preconditioning heating equipment. Only used for a shared mechanical ventilation system.')
1533
+ arg.setDescription('Fuel type of the preconditioning heating equipment. Only used for a shared mechanical ventilation system. If not provided, assumes no preheating.')
1530
1534
  args << arg
1531
1535
 
1532
1536
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_shared_preheating_efficiency', false)
1533
1537
  arg.setDisplayName('Shared Mechanical Ventilation: Preheating Efficiency')
1534
- arg.setDescription('Efficiency of the preconditioning heating equipment. Only used for a shared mechanical ventilation system.')
1538
+ arg.setDescription('Efficiency of the preconditioning heating equipment. Only used for a shared mechanical ventilation system. If not provided, assumes no preheating.')
1535
1539
  arg.setUnits('COP')
1536
1540
  args << arg
1537
1541
 
1538
1542
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_shared_preheating_fraction_heat_load_served', false)
1539
1543
  arg.setDisplayName('Shared Mechanical Ventilation: Preheating Fraction Ventilation Heat Load Served')
1540
- arg.setDescription('Fraction of heating load introduced by the shared ventilation system that is met by the preconditioning heating equipment.')
1544
+ arg.setDescription('Fraction of heating load introduced by the shared ventilation system that is met by the preconditioning heating equipment. If not provided, assumes no preheating.')
1541
1545
  arg.setUnits('Frac')
1542
1546
  args << arg
1543
1547
 
@@ -1546,18 +1550,18 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1546
1550
 
1547
1551
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('mech_vent_shared_precooling_fuel', cooling_system_fuel_choices, false)
1548
1552
  arg.setDisplayName('Shared Mechanical Ventilation: Precooling Fuel')
1549
- arg.setDescription('Fuel type of the preconditioning cooling equipment. Only used for a shared mechanical ventilation system.')
1553
+ arg.setDescription('Fuel type of the preconditioning cooling equipment. Only used for a shared mechanical ventilation system. If not provided, assumes no precooling.')
1550
1554
  args << arg
1551
1555
 
1552
1556
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_shared_precooling_efficiency', false)
1553
1557
  arg.setDisplayName('Shared Mechanical Ventilation: Precooling Efficiency')
1554
- arg.setDescription('Efficiency of the preconditioning cooling equipment. Only used for a shared mechanical ventilation system.')
1558
+ arg.setDescription('Efficiency of the preconditioning cooling equipment. Only used for a shared mechanical ventilation system. If not provided, assumes no precooling.')
1555
1559
  arg.setUnits('COP')
1556
1560
  args << arg
1557
1561
 
1558
1562
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('mech_vent_shared_precooling_fraction_cool_load_served', false)
1559
1563
  arg.setDisplayName('Shared Mechanical Ventilation: Precooling Fraction Ventilation Cool Load Served')
1560
- arg.setDescription('Fraction of cooling load introduced by the shared ventilation system that is met by the preconditioning cooling equipment.')
1564
+ arg.setDescription('Fraction of cooling load introduced by the shared ventilation system that is met by the preconditioning cooling equipment. If not provided, assumes no precooling.')
1561
1565
  arg.setUnits('Frac')
1562
1566
  args << arg
1563
1567
 
@@ -1616,74 +1620,64 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1616
1620
  arg.setDefaultValue(30)
1617
1621
  args << arg
1618
1622
 
1619
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('kitchen_fans_quantity', true)
1623
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('kitchen_fans_quantity', false)
1620
1624
  arg.setDisplayName('Kitchen Fans: Quantity')
1621
- arg.setDescription('The quantity of the kitchen fans.')
1625
+ arg.setDescription('The quantity of the kitchen fans. If not provided, the OS-HPXML default is used.')
1622
1626
  arg.setUnits('#')
1623
- arg.setDefaultValue(Constants.Auto)
1624
1627
  args << arg
1625
1628
 
1626
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('kitchen_fans_flow_rate', false)
1629
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_flow_rate', false)
1627
1630
  arg.setDisplayName('Kitchen Fans: Flow Rate')
1628
- arg.setDescription('The flow rate of the kitchen fan.')
1631
+ arg.setDescription('The flow rate of the kitchen fan. If not provided, the OS-HPXML default is used.')
1629
1632
  arg.setUnits('CFM')
1630
- arg.setDefaultValue(Constants.Auto)
1631
1633
  args << arg
1632
1634
 
1633
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('kitchen_fans_hours_in_operation', false)
1635
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_hours_in_operation', false)
1634
1636
  arg.setDisplayName('Kitchen Fans: Hours In Operation')
1635
- arg.setDescription('The hours in operation of the kitchen fan.')
1637
+ arg.setDescription('The hours in operation of the kitchen fan. If not provided, the OS-HPXML default is used.')
1636
1638
  arg.setUnits('hrs/day')
1637
- arg.setDefaultValue(Constants.Auto)
1638
1639
  args << arg
1639
1640
 
1640
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('kitchen_fans_power', false)
1641
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('kitchen_fans_power', false)
1641
1642
  arg.setDisplayName('Kitchen Fans: Fan Power')
1642
- arg.setDescription('The fan power of the kitchen fan.')
1643
+ arg.setDescription('The fan power of the kitchen fan. If not provided, the OS-HPXML default is used.')
1643
1644
  arg.setUnits('W')
1644
- arg.setDefaultValue(Constants.Auto)
1645
1645
  args << arg
1646
1646
 
1647
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('kitchen_fans_start_hour', false)
1647
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('kitchen_fans_start_hour', false)
1648
1648
  arg.setDisplayName('Kitchen Fans: Start Hour')
1649
- arg.setDescription('The start hour of the kitchen fan.')
1649
+ arg.setDescription('The start hour of the kitchen fan. If not provided, the OS-HPXML default is used.')
1650
1650
  arg.setUnits('hr')
1651
- arg.setDefaultValue(Constants.Auto)
1652
1651
  args << arg
1653
1652
 
1654
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('bathroom_fans_quantity', true)
1653
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('bathroom_fans_quantity', false)
1655
1654
  arg.setDisplayName('Bathroom Fans: Quantity')
1656
- arg.setDescription('The quantity of the bathroom fans.')
1655
+ arg.setDescription('The quantity of the bathroom fans. If not provided, the OS-HPXML default is used.')
1657
1656
  arg.setUnits('#')
1658
- arg.setDefaultValue(Constants.Auto)
1659
1657
  args << arg
1660
1658
 
1661
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('bathroom_fans_flow_rate', false)
1659
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_flow_rate', false)
1662
1660
  arg.setDisplayName('Bathroom Fans: Flow Rate')
1663
- arg.setDescription('The flow rate of the bathroom fans.')
1661
+ arg.setDescription('The flow rate of the bathroom fans. If not provided, the OS-HPXML default is used.')
1664
1662
  arg.setUnits('CFM')
1665
- arg.setDefaultValue(Constants.Auto)
1666
1663
  args << arg
1667
1664
 
1668
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('bathroom_fans_hours_in_operation', false)
1665
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_hours_in_operation', false)
1669
1666
  arg.setDisplayName('Bathroom Fans: Hours In Operation')
1670
- arg.setDescription('The hours in operation of the bathroom fans.')
1667
+ arg.setDescription('The hours in operation of the bathroom fans. If not provided, the OS-HPXML default is used.')
1671
1668
  arg.setUnits('hrs/day')
1672
- arg.setDefaultValue(Constants.Auto)
1673
1669
  args << arg
1674
1670
 
1675
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('bathroom_fans_power', false)
1671
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('bathroom_fans_power', false)
1676
1672
  arg.setDisplayName('Bathroom Fans: Fan Power')
1677
- arg.setDescription('The fan power of the bathroom fans.')
1673
+ arg.setDescription('The fan power of the bathroom fans. If not provided, the OS-HPXML default is used.')
1678
1674
  arg.setUnits('W')
1679
- arg.setDefaultValue(Constants.Auto)
1680
1675
  args << arg
1681
1676
 
1682
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('bathroom_fans_start_hour', false)
1677
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('bathroom_fans_start_hour', false)
1683
1678
  arg.setDisplayName('Bathroom Fans: Start Hour')
1684
- arg.setDescription('The start hour of the bathroom fans.')
1679
+ arg.setDescription('The start hour of the bathroom fans. If not provided, the OS-HPXML default is used.')
1685
1680
  arg.setUnits('hr')
1686
- arg.setDefaultValue(Constants.Auto)
1687
1681
  args << arg
1688
1682
 
1689
1683
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('whole_house_fan_present', true)
@@ -1692,18 +1686,16 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1692
1686
  arg.setDefaultValue(false)
1693
1687
  args << arg
1694
1688
 
1695
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('whole_house_fan_flow_rate', false)
1689
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('whole_house_fan_flow_rate', false)
1696
1690
  arg.setDisplayName('Whole House Fan: Flow Rate')
1697
- arg.setDescription('The flow rate of the whole house fan.')
1691
+ arg.setDescription('The flow rate of the whole house fan. If not provided, the OS-HPXML default is used.')
1698
1692
  arg.setUnits('CFM')
1699
- arg.setDefaultValue(Constants.Auto)
1700
1693
  args << arg
1701
1694
 
1702
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('whole_house_fan_power', false)
1695
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('whole_house_fan_power', false)
1703
1696
  arg.setDisplayName('Whole House Fan: Fan Power')
1704
- arg.setDescription('The fan power of the whole house fan.')
1697
+ arg.setDescription('The fan power of the whole house fan. If not provided, the OS-HPXML default is used.')
1705
1698
  arg.setUnits('W')
1706
- arg.setDefaultValue(Constants.Auto)
1707
1699
  args << arg
1708
1700
 
1709
1701
  water_heater_type_choices = OpenStudio::StringVector.new
@@ -1723,7 +1715,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1723
1715
  water_heater_fuel_choices << HPXML::FuelTypeCoal
1724
1716
 
1725
1717
  water_heater_location_choices = OpenStudio::StringVector.new
1726
- water_heater_location_choices << Constants.Auto
1727
1718
  water_heater_location_choices << HPXML::LocationLivingSpace
1728
1719
  water_heater_location_choices << HPXML::LocationBasementConditioned
1729
1720
  water_heater_location_choices << HPXML::LocationBasementUnconditioned
@@ -1761,17 +1752,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1761
1752
  arg.setDefaultValue(HPXML::FuelTypeNaturalGas)
1762
1753
  args << arg
1763
1754
 
1764
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_location', water_heater_location_choices, true)
1755
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_location', water_heater_location_choices, false)
1765
1756
  arg.setDisplayName('Water Heater: Location')
1766
- arg.setDescription('The location of water heater.')
1767
- arg.setDefaultValue(Constants.Auto)
1757
+ arg.setDescription('The location of water heater. If not provided, the OS-HPXML default is used.')
1768
1758
  args << arg
1769
1759
 
1770
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('water_heater_tank_volume', true)
1760
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_tank_volume', false)
1771
1761
  arg.setDisplayName('Water Heater: Tank Volume')
1772
- arg.setDescription("Nominal volume of water heater tank. Set to '#{Constants.Auto}' to have volume autosized. Only applies to #{HPXML::WaterHeaterTypeStorage}, #{HPXML::WaterHeaterTypeHeatPump}, and #{HPXML::WaterHeaterTypeCombiStorage}.")
1762
+ 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.")
1773
1763
  arg.setUnits('gal')
1774
- arg.setDefaultValue(Constants.Auto)
1775
1764
  args << arg
1776
1765
 
1777
1766
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_efficiency_type', water_heater_efficiency_type_choices, true)
@@ -1788,40 +1777,37 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1788
1777
 
1789
1778
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_usage_bin', water_heater_usage_bin_choices, false)
1790
1779
  arg.setDisplayName('Water Heater: Usage Bin')
1791
- arg.setDescription("The usage of the water heater. Required if Efficiency Type is UniformEnergyFactor and Type is not #{HPXML::WaterHeaterTypeTankless}. Does not apply to space-heating boilers.")
1780
+ 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.")
1792
1781
  args << arg
1793
1782
 
1794
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('water_heater_recovery_efficiency', true)
1783
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_recovery_efficiency', false)
1795
1784
  arg.setDisplayName('Water Heater: Recovery Efficiency')
1796
- 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.')
1785
+ 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.')
1797
1786
  arg.setUnits('Frac')
1798
- arg.setDefaultValue(Constants.Auto)
1799
1787
  args << arg
1800
1788
 
1801
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('water_heater_heating_capacity', true)
1789
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_heating_capacity', false)
1802
1790
  arg.setDisplayName('Water Heater: Heating Capacity')
1803
- arg.setDescription("Heating capacity. Set to '#{Constants.Auto}' to have heating capacity defaulted. Only applies to #{HPXML::WaterHeaterTypeStorage}.")
1791
+ arg.setDescription("Heating capacity. Only applies to #{HPXML::WaterHeaterTypeStorage}. If not provided, the OS-HPXML default is used.")
1804
1792
  arg.setUnits('Btu/hr')
1805
- arg.setDefaultValue(Constants.Auto)
1806
1793
  args << arg
1807
1794
 
1808
1795
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_standby_loss', false)
1809
1796
  arg.setDisplayName('Water Heater: Standby Loss')
1810
- arg.setDescription('The standby loss of water heater. Only applies to space-heating boilers.')
1797
+ arg.setDescription('The standby loss of water heater. Only applies to space-heating boilers. If not provided, the OS-HPXML default is used.')
1811
1798
  arg.setUnits('deg-F/hr')
1812
1799
  args << arg
1813
1800
 
1814
1801
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_jacket_rvalue', false)
1815
1802
  arg.setDisplayName('Water Heater: Jacket R-value')
1816
- arg.setDescription("The jacket R-value of water heater. Doesn't apply to #{HPXML::WaterHeaterTypeTankless} or #{HPXML::WaterHeaterTypeCombiTankless}.")
1803
+ arg.setDescription("The jacket R-value of water heater. Doesn't apply to #{HPXML::WaterHeaterTypeTankless} or #{HPXML::WaterHeaterTypeCombiTankless}. If not provided, defaults to no jacket insulation.")
1817
1804
  arg.setUnits('h-ft^2-R/Btu')
1818
1805
  args << arg
1819
1806
 
1820
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('water_heater_setpoint_temperature', true)
1807
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_heater_setpoint_temperature', false)
1821
1808
  arg.setDisplayName('Water Heater: Setpoint Temperature')
1822
- arg.setDescription('The setpoint temperature of water heater.')
1809
+ arg.setDescription('The setpoint temperature of water heater. If not provided, the OS-HPXML default is used.')
1823
1810
  arg.setUnits('deg-F')
1824
- arg.setDefaultValue(Constants.Auto)
1825
1811
  args << arg
1826
1812
 
1827
1813
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('water_heater_num_units_served', true)
@@ -1833,7 +1819,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1833
1819
 
1834
1820
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('water_heater_uses_desuperheater', false)
1835
1821
  arg.setDisplayName('Water Heater: Uses Desuperheater')
1836
- arg.setDescription("Requires that the dwelling unit has a #{HPXML::HVACTypeHeatPumpAirToAir}, #{HPXML::HVACTypeHeatPumpMiniSplit}, or #{HPXML::HVACTypeHeatPumpGroundToAir} heat pump or a #{HPXML::HVACTypeCentralAirConditioner} or #{HPXML::HVACTypeMiniSplitAirConditioner} air conditioner.")
1822
+ arg.setDescription("Requires that the dwelling unit has a #{HPXML::HVACTypeHeatPumpAirToAir}, #{HPXML::HVACTypeHeatPumpMiniSplit}, or #{HPXML::HVACTypeHeatPumpGroundToAir} heat pump or a #{HPXML::HVACTypeCentralAirConditioner} or #{HPXML::HVACTypeMiniSplitAirConditioner} air conditioner. If not provided, assumes no desuperheater.")
1837
1823
  args << arg
1838
1824
 
1839
1825
  water_heater_tank_model_type_choices = OpenStudio::StringVector.new
@@ -1842,7 +1828,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1842
1828
 
1843
1829
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_tank_model_type', water_heater_tank_model_type_choices, false)
1844
1830
  arg.setDisplayName('Water Heater: Tank Type')
1845
- 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}.")
1831
+ 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.")
1846
1832
  args << arg
1847
1833
 
1848
1834
  water_heater_operating_mode_choices = OpenStudio::StringVector.new
@@ -1851,7 +1837,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1851
1837
 
1852
1838
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_operating_mode', water_heater_operating_mode_choices, false)
1853
1839
  arg.setDisplayName('Water Heater: Operating Mode')
1854
- arg.setDescription("The water heater operating mode. The '#{HPXML::WaterHeaterOperatingModeHeatPumpOnly}' option only uses the heat pump, while '#{HPXML::WaterHeaterOperatingModeStandard}' 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}.")
1840
+ arg.setDescription("The water heater operating mode. The '#{HPXML::WaterHeaterOperatingModeHeatPumpOnly}' option only uses the heat pump, while '#{HPXML::WaterHeaterOperatingModeStandard}' 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.")
1855
1841
  args << arg
1856
1842
 
1857
1843
  hot_water_distribution_system_type_choices = OpenStudio::StringVector.new
@@ -1864,11 +1850,10 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1864
1850
  arg.setDefaultValue(HPXML::DHWDistTypeStandard)
1865
1851
  args << arg
1866
1852
 
1867
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hot_water_distribution_standard_piping_length', true)
1853
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_standard_piping_length', false)
1868
1854
  arg.setDisplayName('Hot Water Distribution: Standard Piping Length')
1869
1855
  arg.setUnits('ft')
1870
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeStandard}, the length of the piping. A value of '#{Constants.Auto}' will use a default.")
1871
- arg.setDefaultValue(Constants.Auto)
1856
+ arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeStandard}, the length of the piping. If not provided, the OS-HPXML default is used.")
1872
1857
  args << arg
1873
1858
 
1874
1859
  recirculation_control_type_choices = OpenStudio::StringVector.new
@@ -1884,32 +1869,28 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1884
1869
  arg.setDefaultValue(HPXML::DHWRecirControlTypeNone)
1885
1870
  args << arg
1886
1871
 
1887
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hot_water_distribution_recirc_piping_length', true)
1872
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_recirc_piping_length', false)
1888
1873
  arg.setDisplayName('Hot Water Distribution: Recirculation Piping Length')
1889
1874
  arg.setUnits('ft')
1890
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the length of the recirculation piping.")
1891
- arg.setDefaultValue(Constants.Auto)
1875
+ arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the length of the recirculation piping. If not provided, the OS-HPXML default is used.")
1892
1876
  args << arg
1893
1877
 
1894
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hot_water_distribution_recirc_branch_piping_length', true)
1878
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_recirc_branch_piping_length', false)
1895
1879
  arg.setDisplayName('Hot Water Distribution: Recirculation Branch Piping Length')
1896
1880
  arg.setUnits('ft')
1897
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the length of the recirculation branch piping.")
1898
- arg.setDefaultValue(Constants.Auto)
1881
+ 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.")
1899
1882
  args << arg
1900
1883
 
1901
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hot_water_distribution_recirc_pump_power', true)
1884
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_recirc_pump_power', false)
1902
1885
  arg.setDisplayName('Hot Water Distribution: Recirculation Pump Power')
1903
1886
  arg.setUnits('W')
1904
- arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the recirculation pump power.")
1905
- arg.setDefaultValue(Constants.Auto)
1887
+ arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the recirculation pump power. If not provided, the OS-HPXML default is used.")
1906
1888
  args << arg
1907
1889
 
1908
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hot_water_distribution_pipe_r', true)
1890
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_water_distribution_pipe_r', false)
1909
1891
  arg.setDisplayName('Hot Water Distribution: Pipe Insulation Nominal R-Value')
1910
1892
  arg.setUnits('h-ft^2-R/Btu')
1911
- arg.setDescription('Nominal R-value of the pipe insulation.')
1912
- arg.setDefaultValue(Constants.Auto)
1893
+ arg.setDescription('Nominal R-value of the pipe insulation. If not provided, the OS-HPXML default is used.')
1913
1894
  args << arg
1914
1895
 
1915
1896
  dwhr_facilities_connected_choices = OpenStudio::StringVector.new
@@ -1948,10 +1929,9 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1948
1929
  arg.setDefaultValue(false)
1949
1930
  args << arg
1950
1931
 
1951
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_fixtures_usage_multiplier', true)
1932
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('water_fixtures_usage_multiplier', false)
1952
1933
  arg.setDisplayName('Hot Water Fixtures: Usage Multiplier')
1953
- arg.setDescription('Multiplier on the hot water usage that can reflect, e.g., high/low usage occupants.')
1954
- arg.setDefaultValue(1.0)
1934
+ 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.')
1955
1935
  args << arg
1956
1936
 
1957
1937
  solar_thermal_system_type_choices = OpenStudio::StringVector.new
@@ -2017,16 +1997,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2017
1997
 
2018
1998
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('solar_thermal_collector_rated_thermal_losses', true)
2019
1999
  arg.setDisplayName('Solar Thermal: Collector Rated Thermal Losses')
2020
- arg.setUnits('Frac')
2000
+ arg.setUnits('Btu/hr-ft^2-R')
2021
2001
  arg.setDescription('The collector rated thermal losses of the solar thermal system.')
2022
2002
  arg.setDefaultValue(0.2799)
2023
2003
  args << arg
2024
2004
 
2025
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('solar_thermal_storage_volume', true)
2005
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('solar_thermal_storage_volume', false)
2026
2006
  arg.setDisplayName('Solar Thermal: Storage Volume')
2027
- arg.setUnits('Frac')
2028
- arg.setDescription('The storage volume of the solar thermal system.')
2029
- arg.setDefaultValue(Constants.Auto)
2007
+ arg.setUnits('gal')
2008
+ arg.setDescription('The storage volume of the solar thermal system. If not provided, the OS-HPXML default is used.')
2030
2009
  args << arg
2031
2010
 
2032
2011
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('solar_thermal_solar_fraction', true)
@@ -2037,40 +2016,39 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2037
2016
  args << arg
2038
2017
 
2039
2018
  pv_system_module_type_choices = OpenStudio::StringVector.new
2040
- pv_system_module_type_choices << 'none'
2041
- pv_system_module_type_choices << Constants.Auto
2042
2019
  pv_system_module_type_choices << HPXML::PVModuleTypeStandard
2043
2020
  pv_system_module_type_choices << HPXML::PVModuleTypePremium
2044
2021
  pv_system_module_type_choices << HPXML::PVModuleTypeThinFilm
2045
2022
 
2046
2023
  pv_system_location_choices = OpenStudio::StringVector.new
2047
- pv_system_location_choices << Constants.Auto
2048
2024
  pv_system_location_choices << HPXML::LocationRoof
2049
2025
  pv_system_location_choices << HPXML::LocationGround
2050
2026
 
2051
2027
  pv_system_tracking_choices = OpenStudio::StringVector.new
2052
- pv_system_tracking_choices << Constants.Auto
2053
2028
  pv_system_tracking_choices << HPXML::PVTrackingTypeFixed
2054
2029
  pv_system_tracking_choices << HPXML::PVTrackingType1Axis
2055
2030
  pv_system_tracking_choices << HPXML::PVTrackingType1AxisBacktracked
2056
2031
  pv_system_tracking_choices << HPXML::PVTrackingType2Axis
2057
2032
 
2058
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_module_type', pv_system_module_type_choices, true)
2033
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('pv_system_present', true)
2034
+ arg.setDisplayName('PV System: Present')
2035
+ arg.setDescription('Whether there is a PV system present.')
2036
+ arg.setDefaultValue(false)
2037
+ args << arg
2038
+
2039
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_module_type', pv_system_module_type_choices, false)
2059
2040
  arg.setDisplayName('PV System: Module Type')
2060
- arg.setDescription("Module type of the PV system. Use 'none' if there is no PV system.")
2061
- arg.setDefaultValue('none')
2041
+ arg.setDescription('Module type of the PV system. If not provided, the OS-HPXML default is used.')
2062
2042
  args << arg
2063
2043
 
2064
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_location', pv_system_location_choices, true)
2044
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_location', pv_system_location_choices, false)
2065
2045
  arg.setDisplayName('PV System: Location')
2066
- arg.setDescription('Location of the PV system.')
2067
- arg.setDefaultValue(Constants.Auto)
2046
+ arg.setDescription('Location of the PV system. If not provided, the OS-HPXML default is used.')
2068
2047
  args << arg
2069
2048
 
2070
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_tracking', pv_system_tracking_choices, true)
2049
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_tracking', pv_system_tracking_choices, false)
2071
2050
  arg.setDisplayName('PV System: Tracking')
2072
- arg.setDescription('Tracking of the PV system.')
2073
- arg.setDefaultValue(Constants.Auto)
2051
+ arg.setDescription('Type of tracking for the PV system. If not provided, the OS-HPXML default is used.')
2074
2052
  args << arg
2075
2053
 
2076
2054
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_array_azimuth', true)
@@ -2097,38 +2075,40 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2097
2075
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_inverter_efficiency', false)
2098
2076
  arg.setDisplayName('PV System: Inverter Efficiency')
2099
2077
  arg.setUnits('Frac')
2100
- arg.setDescription('Inverter efficiency of the PV system. If there are two PV systems, this will apply to both.')
2078
+ 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.')
2101
2079
  args << arg
2102
2080
 
2103
2081
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_system_losses_fraction', false)
2104
2082
  arg.setDisplayName('PV System: System Losses Fraction')
2105
2083
  arg.setUnits('Frac')
2106
- arg.setDescription('System losses fraction of the PV system. If there are two PV systems, this will apply to both.')
2084
+ 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.')
2107
2085
  args << arg
2108
2086
 
2109
- arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('pv_system_num_bedrooms_served', true)
2087
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('pv_system_num_bedrooms_served', false)
2110
2088
  arg.setDisplayName('PV System: Number of Bedrooms Served')
2111
- arg.setDescription("Number of bedrooms served by PV system. Ignored if #{HPXML::ResidentialTypeSFD}. Used to apportion PV generation to the unit of a SFA/MF building. If there are two PV systems, this will apply to both.")
2089
+ arg.setDescription("Number of bedrooms served by PV system. Required if #{HPXML::ResidentialTypeSFA} or #{HPXML::ResidentialTypeApartment}. Used to apportion PV generation to the unit of a SFA/MF building. If there are two PV systems, this will apply to both.")
2112
2090
  arg.setUnits('#')
2113
- arg.setDefaultValue(3)
2114
2091
  args << arg
2115
2092
 
2116
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_module_type', pv_system_module_type_choices, true)
2093
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('pv_system_2_present', true)
2094
+ arg.setDisplayName('PV System 2: Present')
2095
+ arg.setDescription('Whether there is a second PV system present.')
2096
+ arg.setDefaultValue(false)
2097
+ args << arg
2098
+
2099
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_module_type', pv_system_module_type_choices, false)
2117
2100
  arg.setDisplayName('PV System 2: Module Type')
2118
- arg.setDescription("Module type of the second PV system. Use 'none' if there is no PV system 2.")
2119
- arg.setDefaultValue('none')
2101
+ arg.setDescription('Module type of the second PV system. If not provided, the OS-HPXML default is used.')
2120
2102
  args << arg
2121
2103
 
2122
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_location', pv_system_location_choices, true)
2104
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_location', pv_system_location_choices, false)
2123
2105
  arg.setDisplayName('PV System 2: Location')
2124
- arg.setDescription('Location of the second PV system.')
2125
- arg.setDefaultValue(Constants.Auto)
2106
+ arg.setDescription('Location of the second PV system. If not provided, the OS-HPXML default is used.')
2126
2107
  args << arg
2127
2108
 
2128
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_tracking', pv_system_tracking_choices, true)
2109
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_tracking', pv_system_tracking_choices, false)
2129
2110
  arg.setDisplayName('PV System 2: Tracking')
2130
- arg.setDescription('Tracking of the second PV system.')
2131
- arg.setDefaultValue(Constants.Auto)
2111
+ arg.setDescription('Type of tracking for the second PV system. If not provided, the OS-HPXML default is used.')
2132
2112
  args << arg
2133
2113
 
2134
2114
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_2_array_azimuth', true)
@@ -2153,8 +2133,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2153
2133
  args << arg
2154
2134
 
2155
2135
  battery_location_choices = OpenStudio::StringVector.new
2156
- battery_location_choices << Constants.Auto
2157
- battery_location_choices << 'none'
2158
2136
  battery_location_choices << HPXML::LocationLivingSpace
2159
2137
  battery_location_choices << HPXML::LocationBasementConditioned
2160
2138
  battery_location_choices << HPXML::LocationBasementUnconditioned
@@ -2166,33 +2144,42 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2166
2144
  battery_location_choices << HPXML::LocationGarage
2167
2145
  battery_location_choices << HPXML::LocationOutside
2168
2146
 
2169
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('battery_location', battery_location_choices, true)
2147
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('battery_present', true)
2148
+ arg.setDisplayName('Battery: Present')
2149
+ arg.setDescription('Whether there is a lithium ion battery present.')
2150
+ arg.setDefaultValue(false)
2151
+ args << arg
2152
+
2153
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('battery_location', battery_location_choices, false)
2170
2154
  arg.setDisplayName('Battery: Location')
2171
- arg.setDescription('The space type for the lithium ion battery location.')
2172
- arg.setDefaultValue('none')
2155
+ arg.setDescription('The space type for the lithium ion battery location. If not provided, the OS-HPXML default is used.')
2173
2156
  args << arg
2174
2157
 
2175
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('battery_power', true)
2158
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_power', false)
2176
2159
  arg.setDisplayName('Battery: Rated Power Output')
2177
- arg.setDescription('The rated power output of the lithium ion battery.')
2160
+ arg.setDescription('The rated power output of the lithium ion battery. If not provided, the OS-HPXML default is used.')
2178
2161
  arg.setUnits('W')
2179
- arg.setDefaultValue(Constants.Auto)
2180
2162
  args << arg
2181
2163
 
2182
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('battery_capacity', true)
2164
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_capacity', false)
2183
2165
  arg.setDisplayName('Battery: Nominal Capacity')
2184
- arg.setDescription('The nominal capacity of the lithium ion battery.')
2166
+ arg.setDescription('The nominal capacity of the lithium ion battery. If not provided, the OS-HPXML default is used.')
2185
2167
  arg.setUnits('kWh')
2186
- arg.setDefaultValue(Constants.Auto)
2187
2168
  args << arg
2188
2169
 
2189
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('battery_usable_capacity', false)
2170
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_usable_capacity', false)
2190
2171
  arg.setDisplayName('Battery: Usable Capacity')
2191
- arg.setDescription('The usable capacity of the lithium ion battery.')
2172
+ arg.setDescription('The usable capacity of the lithium ion battery. If not provided, the OS-HPXML default is used.')
2192
2173
  arg.setUnits('kWh')
2193
2174
  args << arg
2194
2175
 
2195
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('lighting_present', false)
2176
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('battery_round_trip_efficiency', false)
2177
+ arg.setDisplayName('Battery: Round Trip Efficiency')
2178
+ arg.setDescription('The round trip efficiency of the lithium ion battery. If not provided, the OS-HPXML default is used.')
2179
+ arg.setUnits('Frac')
2180
+ args << arg
2181
+
2182
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('lighting_present', true)
2196
2183
  arg.setDisplayName('Lighting: Present')
2197
2184
  arg.setDescription('Whether there is lighting energy use.')
2198
2185
  arg.setDefaultValue(true)
@@ -2216,10 +2203,9 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2216
2203
  arg.setDefaultValue(0.0)
2217
2204
  args << arg
2218
2205
 
2219
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_interior_usage_multiplier', true)
2206
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_interior_usage_multiplier', false)
2220
2207
  arg.setDisplayName('Lighting: Interior Usage Multiplier')
2221
- arg.setDescription('Multiplier on the lighting energy usage (interior) that can reflect, e.g., high/low usage occupants.')
2222
- arg.setDefaultValue(1.0)
2208
+ 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.')
2223
2209
  args << arg
2224
2210
 
2225
2211
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_exterior_fraction_cfl', true)
@@ -2240,10 +2226,9 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2240
2226
  arg.setDefaultValue(0.0)
2241
2227
  args << arg
2242
2228
 
2243
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_exterior_usage_multiplier', true)
2229
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_exterior_usage_multiplier', false)
2244
2230
  arg.setDisplayName('Lighting: Exterior Usage Multiplier')
2245
- arg.setDescription('Multiplier on the lighting energy usage (exterior) that can reflect, e.g., high/low usage occupants.')
2246
- arg.setDefaultValue(1.0)
2231
+ 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.')
2247
2232
  args << arg
2248
2233
 
2249
2234
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_garage_fraction_cfl', true)
@@ -2264,10 +2249,9 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2264
2249
  arg.setDefaultValue(0.0)
2265
2250
  args << arg
2266
2251
 
2267
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_garage_usage_multiplier', true)
2252
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('lighting_garage_usage_multiplier', false)
2268
2253
  arg.setDisplayName('Lighting: Garage Usage Multiplier')
2269
- arg.setDescription('Multiplier on the lighting energy usage (garage) that can reflect, e.g., high/low usage occupants.')
2270
- arg.setDefaultValue(1.0)
2254
+ 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.')
2271
2255
  args << arg
2272
2256
 
2273
2257
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('holiday_lighting_present', true)
@@ -2276,16 +2260,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2276
2260
  arg.setDefaultValue(false)
2277
2261
  args << arg
2278
2262
 
2279
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('holiday_lighting_daily_kwh', true)
2263
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('holiday_lighting_daily_kwh', false)
2280
2264
  arg.setDisplayName('Holiday Lighting: Daily Consumption')
2281
2265
  arg.setUnits('kWh/day')
2282
- arg.setDescription('The daily energy consumption for holiday lighting (exterior).')
2283
- arg.setDefaultValue(Constants.Auto)
2266
+ arg.setDescription('The daily energy consumption for holiday lighting (exterior). If not provided, the OS-HPXML default is used.')
2284
2267
  args << arg
2285
2268
 
2286
2269
  arg = OpenStudio::Measure::OSArgument::makeStringArgument('holiday_lighting_period', false)
2287
2270
  arg.setDisplayName('Holiday Lighting: Period')
2288
- arg.setDescription('Enter a date like "Nov 25 - Jan 5".')
2271
+ arg.setDescription('Enter a date like "Nov 25 - Jan 5". If not provided, the OS-HPXML default is used.')
2289
2272
  args << arg
2290
2273
 
2291
2274
  dehumidifier_type_choices = OpenStudio::StringVector.new
@@ -2338,8 +2321,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2338
2321
  args << arg
2339
2322
 
2340
2323
  appliance_location_choices = OpenStudio::StringVector.new
2341
- appliance_location_choices << Constants.Auto
2342
- appliance_location_choices << 'none'
2343
2324
  appliance_location_choices << HPXML::LocationLivingSpace
2344
2325
  appliance_location_choices << HPXML::LocationBasementConditioned
2345
2326
  appliance_location_choices << HPXML::LocationBasementUnconditioned
@@ -2353,10 +2334,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2353
2334
  clothes_washer_efficiency_type_choices << 'ModifiedEnergyFactor'
2354
2335
  clothes_washer_efficiency_type_choices << 'IntegratedModifiedEnergyFactor'
2355
2336
 
2356
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_washer_location', appliance_location_choices, true)
2337
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('clothes_washer_present', true)
2338
+ arg.setDisplayName('Clothes Washer: Present')
2339
+ arg.setDescription('Whether there is a clothes washer present.')
2340
+ arg.setDefaultValue(true)
2341
+ args << arg
2342
+
2343
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_washer_location', appliance_location_choices, false)
2357
2344
  arg.setDisplayName('Clothes Washer: Location')
2358
- arg.setDescription('The space type for the clothes washer location.')
2359
- arg.setDefaultValue(Constants.Auto)
2345
+ arg.setDescription('The space type for the clothes washer location. If not provided, the OS-HPXML default is used.')
2360
2346
  args << arg
2361
2347
 
2362
2348
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_washer_efficiency_type', clothes_washer_efficiency_type_choices, true)
@@ -2365,65 +2351,62 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2365
2351
  arg.setDefaultValue('IntegratedModifiedEnergyFactor')
2366
2352
  args << arg
2367
2353
 
2368
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_washer_efficiency', true)
2354
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_efficiency', false)
2369
2355
  arg.setDisplayName('Clothes Washer: Efficiency')
2370
2356
  arg.setUnits('ft^3/kWh-cyc')
2371
- arg.setDescription('The efficiency of the clothes washer.')
2372
- arg.setDefaultValue(Constants.Auto)
2357
+ arg.setDescription('The efficiency of the clothes washer. If not provided, the OS-HPXML default is used.')
2373
2358
  args << arg
2374
2359
 
2375
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_washer_rated_annual_kwh', true)
2360
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_rated_annual_kwh', false)
2376
2361
  arg.setDisplayName('Clothes Washer: Rated Annual Consumption')
2377
2362
  arg.setUnits('kWh/yr')
2378
- 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.')
2379
- arg.setDefaultValue(Constants.Auto)
2363
+ 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.')
2380
2364
  args << arg
2381
2365
 
2382
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_washer_label_electric_rate', true)
2366
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_electric_rate', false)
2383
2367
  arg.setDisplayName('Clothes Washer: Label Electric Rate')
2384
2368
  arg.setUnits('$/kWh')
2385
- 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.')
2386
- arg.setDefaultValue(Constants.Auto)
2369
+ 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.')
2387
2370
  args << arg
2388
2371
 
2389
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_washer_label_gas_rate', true)
2372
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_gas_rate', false)
2390
2373
  arg.setDisplayName('Clothes Washer: Label Gas Rate')
2391
2374
  arg.setUnits('$/therm')
2392
- 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.')
2393
- arg.setDefaultValue(Constants.Auto)
2375
+ 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.')
2394
2376
  args << arg
2395
2377
 
2396
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_washer_label_annual_gas_cost', true)
2378
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_annual_gas_cost', false)
2397
2379
  arg.setDisplayName('Clothes Washer: Label Annual Cost with Gas DHW')
2398
2380
  arg.setUnits('$')
2399
- arg.setDescription('The annual cost of using the system under test conditions. Input is obtained from the EnergyGuide label.')
2400
- arg.setDefaultValue(Constants.Auto)
2381
+ 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.')
2401
2382
  args << arg
2402
2383
 
2403
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_washer_label_usage', true)
2384
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_label_usage', false)
2404
2385
  arg.setDisplayName('Clothes Washer: Label Usage')
2405
2386
  arg.setUnits('cyc/wk')
2406
- arg.setDescription('The clothes washer loads per week.')
2407
- arg.setDefaultValue(Constants.Auto)
2387
+ arg.setDescription('The clothes washer loads per week. If not provided, the OS-HPXML default is used.')
2408
2388
  args << arg
2409
2389
 
2410
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_washer_capacity', true)
2390
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_capacity', false)
2411
2391
  arg.setDisplayName('Clothes Washer: Drum Volume')
2412
2392
  arg.setUnits('ft^3')
2413
- arg.setDescription("Volume of the washer drum. Obtained from the EnergyStar website or the manufacturer's literature.")
2414
- arg.setDefaultValue(Constants.Auto)
2393
+ 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.")
2415
2394
  args << arg
2416
2395
 
2417
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_usage_multiplier', true)
2396
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_washer_usage_multiplier', false)
2418
2397
  arg.setDisplayName('Clothes Washer: Usage Multiplier')
2419
- arg.setDescription('Multiplier on the clothes washer energy and hot water usage that can reflect, e.g., high/low usage occupants.')
2420
- arg.setDefaultValue(1.0)
2398
+ 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.')
2421
2399
  args << arg
2422
2400
 
2423
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_dryer_location', appliance_location_choices, true)
2401
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('clothes_dryer_present', true)
2402
+ arg.setDisplayName('Clothes Dryer: Present')
2403
+ arg.setDescription('Whether there is a clothes dryer present.')
2404
+ arg.setDefaultValue(true)
2405
+ args << arg
2406
+
2407
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('clothes_dryer_location', appliance_location_choices, false)
2424
2408
  arg.setDisplayName('Clothes Dryer: Location')
2425
- arg.setDescription('The space type for the clothes dryer location.')
2426
- arg.setDefaultValue(Constants.Auto)
2409
+ arg.setDescription('The space type for the clothes dryer location. If not provided, the OS-HPXML default is used.')
2427
2410
  args << arg
2428
2411
 
2429
2412
  clothes_dryer_fuel_choices = OpenStudio::StringVector.new
@@ -2450,30 +2433,32 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2450
2433
  arg.setDefaultValue('CombinedEnergyFactor')
2451
2434
  args << arg
2452
2435
 
2453
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_dryer_efficiency', true)
2436
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_dryer_efficiency', false)
2454
2437
  arg.setDisplayName('Clothes Dryer: Efficiency')
2455
2438
  arg.setUnits('lb/kWh')
2456
- arg.setDescription('The efficiency of the clothes dryer.')
2457
- arg.setDefaultValue(Constants.Auto)
2439
+ arg.setDescription('The efficiency of the clothes dryer. If not provided, the OS-HPXML default is used.')
2458
2440
  args << arg
2459
2441
 
2460
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('clothes_dryer_vented_flow_rate', true)
2442
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_dryer_vented_flow_rate', false)
2461
2443
  arg.setDisplayName('Clothes Dryer: Vented Flow Rate')
2462
- arg.setDescription('The exhaust flow rate of the vented clothes dryer.')
2444
+ arg.setDescription('The exhaust flow rate of the vented clothes dryer. If not provided, the OS-HPXML default is used.')
2463
2445
  arg.setUnits('CFM')
2464
- arg.setDefaultValue(Constants.Auto)
2465
2446
  args << arg
2466
2447
 
2467
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_dryer_usage_multiplier', true)
2448
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('clothes_dryer_usage_multiplier', false)
2468
2449
  arg.setDisplayName('Clothes Dryer: Usage Multiplier')
2469
- arg.setDescription('Multiplier on the clothes dryer energy usage that can reflect, e.g., high/low usage occupants.')
2470
- arg.setDefaultValue(1.0)
2450
+ 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.')
2471
2451
  args << arg
2472
2452
 
2473
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('dishwasher_location', appliance_location_choices, true)
2453
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('dishwasher_present', true)
2454
+ arg.setDisplayName('Dishwasher: Present')
2455
+ arg.setDescription('Whether there is a dishwasher present.')
2456
+ arg.setDefaultValue(true)
2457
+ args << arg
2458
+
2459
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('dishwasher_location', appliance_location_choices, false)
2474
2460
  arg.setDisplayName('Dishwasher: Location')
2475
- arg.setDescription('The space type for the dishwasher location.')
2476
- arg.setDefaultValue(Constants.Auto)
2461
+ arg.setDescription('The space type for the dishwasher location. If not provided, the OS-HPXML default is used.')
2477
2462
  args << arg
2478
2463
 
2479
2464
  dishwasher_efficiency_type_choices = OpenStudio::StringVector.new
@@ -2486,109 +2471,111 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2486
2471
  arg.setDefaultValue('RatedAnnualkWh')
2487
2472
  args << arg
2488
2473
 
2489
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('dishwasher_efficiency', true)
2474
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_efficiency', false)
2490
2475
  arg.setDisplayName('Dishwasher: Efficiency')
2491
2476
  arg.setUnits('RatedAnnualkWh or EnergyFactor')
2492
- arg.setDescription('The efficiency of the dishwasher.')
2493
- arg.setDefaultValue(Constants.Auto)
2477
+ arg.setDescription('The efficiency of the dishwasher. If not provided, the OS-HPXML default is used.')
2494
2478
  args << arg
2495
2479
 
2496
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('dishwasher_label_electric_rate', true)
2480
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_electric_rate', false)
2497
2481
  arg.setDisplayName('Dishwasher: Label Electric Rate')
2498
2482
  arg.setUnits('$/kWh')
2499
- arg.setDescription('The label electric rate of the dishwasher.')
2500
- arg.setDefaultValue(Constants.Auto)
2483
+ arg.setDescription('The label electric rate of the dishwasher. If not provided, the OS-HPXML default is used.')
2501
2484
  args << arg
2502
2485
 
2503
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('dishwasher_label_gas_rate', true)
2486
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_gas_rate', false)
2504
2487
  arg.setDisplayName('Dishwasher: Label Gas Rate')
2505
2488
  arg.setUnits('$/therm')
2506
- arg.setDescription('The label gas rate of the dishwasher.')
2507
- arg.setDefaultValue(Constants.Auto)
2489
+ arg.setDescription('The label gas rate of the dishwasher. If not provided, the OS-HPXML default is used.')
2508
2490
  args << arg
2509
2491
 
2510
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('dishwasher_label_annual_gas_cost', true)
2492
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_annual_gas_cost', false)
2511
2493
  arg.setDisplayName('Dishwasher: Label Annual Gas Cost')
2512
2494
  arg.setUnits('$')
2513
- arg.setDescription('The label annual gas cost of the dishwasher.')
2514
- arg.setDefaultValue(Constants.Auto)
2495
+ arg.setDescription('The label annual gas cost of the dishwasher. If not provided, the OS-HPXML default is used.')
2515
2496
  args << arg
2516
2497
 
2517
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('dishwasher_label_usage', true)
2498
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_label_usage', false)
2518
2499
  arg.setDisplayName('Dishwasher: Label Usage')
2519
2500
  arg.setUnits('cyc/wk')
2520
- arg.setDescription('The dishwasher loads per week.')
2521
- arg.setDefaultValue(Constants.Auto)
2501
+ arg.setDescription('The dishwasher loads per week. If not provided, the OS-HPXML default is used.')
2522
2502
  args << arg
2523
2503
 
2524
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('dishwasher_place_setting_capacity', true)
2504
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('dishwasher_place_setting_capacity', false)
2525
2505
  arg.setDisplayName('Dishwasher: Number of Place Settings')
2526
2506
  arg.setUnits('#')
2527
- arg.setDescription("The number of place settings for the unit. Data obtained from manufacturer's literature.")
2528
- arg.setDefaultValue(Constants.Auto)
2507
+ 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.")
2529
2508
  args << arg
2530
2509
 
2531
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_usage_multiplier', true)
2510
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dishwasher_usage_multiplier', false)
2532
2511
  arg.setDisplayName('Dishwasher: Usage Multiplier')
2533
- arg.setDescription('Multiplier on the dishwasher energy usage that can reflect, e.g., high/low usage occupants.')
2534
- arg.setDefaultValue(1.0)
2512
+ 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.')
2535
2513
  args << arg
2536
2514
 
2537
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('refrigerator_location', appliance_location_choices, true)
2515
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('refrigerator_present', true)
2516
+ arg.setDisplayName('Refrigerator: Present')
2517
+ arg.setDescription('Whether there is a refrigerator present.')
2518
+ arg.setDefaultValue(true)
2519
+ args << arg
2520
+
2521
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('refrigerator_location', appliance_location_choices, false)
2538
2522
  arg.setDisplayName('Refrigerator: Location')
2539
- arg.setDescription('The space type for the refrigerator location.')
2540
- arg.setDefaultValue(Constants.Auto)
2523
+ arg.setDescription('The space type for the refrigerator location. If not provided, the OS-HPXML default is used.')
2541
2524
  args << arg
2542
2525
 
2543
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('refrigerator_rated_annual_kwh', true)
2526
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('refrigerator_rated_annual_kwh', false)
2544
2527
  arg.setDisplayName('Refrigerator: Rated Annual Consumption')
2545
2528
  arg.setUnits('kWh/yr')
2546
- arg.setDescription('The EnergyGuide rated annual energy consumption for a refrigerator.')
2547
- arg.setDefaultValue(Constants.Auto)
2529
+ arg.setDescription('The EnergyGuide rated annual energy consumption for a refrigerator. If not provided, the OS-HPXML default is used.')
2548
2530
  args << arg
2549
2531
 
2550
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('refrigerator_usage_multiplier', true)
2532
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('refrigerator_usage_multiplier', false)
2551
2533
  arg.setDisplayName('Refrigerator: Usage Multiplier')
2552
- arg.setDescription('Multiplier on the refrigerator energy usage that can reflect, e.g., high/low usage occupants.')
2553
- arg.setDefaultValue(1.0)
2534
+ 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.')
2554
2535
  args << arg
2555
2536
 
2556
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('extra_refrigerator_location', appliance_location_choices, true)
2537
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('extra_refrigerator_present', true)
2538
+ arg.setDisplayName('Extra Refrigerator: Present')
2539
+ arg.setDescription('Whether there is an extra refrigerator present.')
2540
+ arg.setDefaultValue(false)
2541
+ args << arg
2542
+
2543
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('extra_refrigerator_location', appliance_location_choices, false)
2557
2544
  arg.setDisplayName('Extra Refrigerator: Location')
2558
- arg.setDescription('The space type for the extra refrigerator location.')
2559
- arg.setDefaultValue('none')
2545
+ arg.setDescription('The space type for the extra refrigerator location. If not provided, the OS-HPXML default is used.')
2560
2546
  args << arg
2561
2547
 
2562
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('extra_refrigerator_rated_annual_kwh', true)
2548
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('extra_refrigerator_rated_annual_kwh', false)
2563
2549
  arg.setDisplayName('Extra Refrigerator: Rated Annual Consumption')
2564
2550
  arg.setUnits('kWh/yr')
2565
- arg.setDescription('The EnergyGuide rated annual energy consumption for an extra rrefrigerator.')
2566
- arg.setDefaultValue(Constants.Auto)
2551
+ arg.setDescription('The EnergyGuide rated annual energy consumption for an extra rrefrigerator. If not provided, the OS-HPXML default is used.')
2567
2552
  args << arg
2568
2553
 
2569
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('extra_refrigerator_usage_multiplier', true)
2554
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('extra_refrigerator_usage_multiplier', false)
2570
2555
  arg.setDisplayName('Extra Refrigerator: Usage Multiplier')
2571
- arg.setDescription('Multiplier on the extra refrigerator energy usage that can reflect, e.g., high/low usage occupants.')
2572
- arg.setDefaultValue(1.0)
2556
+ 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.')
2573
2557
  args << arg
2574
2558
 
2575
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('freezer_location', appliance_location_choices, true)
2559
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('freezer_present', true)
2560
+ arg.setDisplayName('Freezer: Present')
2561
+ arg.setDescription('Whether there is a freezer present.')
2562
+ arg.setDefaultValue(false)
2563
+ args << arg
2564
+
2565
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('freezer_location', appliance_location_choices, false)
2576
2566
  arg.setDisplayName('Freezer: Location')
2577
- arg.setDescription('The space type for the freezer location.')
2578
- arg.setDefaultValue('none')
2567
+ arg.setDescription('The space type for the freezer location. If not provided, the OS-HPXML default is used.')
2579
2568
  args << arg
2580
2569
 
2581
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('freezer_rated_annual_kwh', true)
2570
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('freezer_rated_annual_kwh', false)
2582
2571
  arg.setDisplayName('Freezer: Rated Annual Consumption')
2583
2572
  arg.setUnits('kWh/yr')
2584
- arg.setDescription('The EnergyGuide rated annual energy consumption for a freezer.')
2585
- arg.setDefaultValue(Constants.Auto)
2573
+ arg.setDescription('The EnergyGuide rated annual energy consumption for a freezer. If not provided, the OS-HPXML default is used.')
2586
2574
  args << arg
2587
2575
 
2588
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('freezer_usage_multiplier', true)
2576
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('freezer_usage_multiplier', false)
2589
2577
  arg.setDisplayName('Freezer: Usage Multiplier')
2590
- arg.setDescription('Multiplier on the freezer energy usage that can reflect, e.g., high/low usage occupants.')
2591
- arg.setDefaultValue(1.0)
2578
+ 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.')
2592
2579
  args << arg
2593
2580
 
2594
2581
  cooking_range_oven_fuel_choices = OpenStudio::StringVector.new
@@ -2599,10 +2586,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2599
2586
  cooking_range_oven_fuel_choices << HPXML::FuelTypeWoodCord
2600
2587
  cooking_range_oven_fuel_choices << HPXML::FuelTypeCoal
2601
2588
 
2602
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooking_range_oven_location', appliance_location_choices, true)
2589
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('cooking_range_oven_present', true)
2590
+ arg.setDisplayName('Cooking Range/Oven: Present')
2591
+ arg.setDescription('Whether there is a cooking range/oven present.')
2592
+ arg.setDefaultValue(true)
2593
+ args << arg
2594
+
2595
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooking_range_oven_location', appliance_location_choices, false)
2603
2596
  arg.setDisplayName('Cooking Range/Oven: Location')
2604
- arg.setDescription('The space type for the cooking range/oven location.')
2605
- arg.setDefaultValue(Constants.Auto)
2597
+ arg.setDescription('The space type for the cooking range/oven location. If not provided, the OS-HPXML default is used.')
2606
2598
  args << arg
2607
2599
 
2608
2600
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooking_range_oven_fuel_type', cooking_range_oven_fuel_choices, true)
@@ -2613,45 +2605,41 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2613
2605
 
2614
2606
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('cooking_range_oven_is_induction', false)
2615
2607
  arg.setDisplayName('Cooking Range/Oven: Is Induction')
2616
- arg.setDescription('Whether the cooking range is induction.')
2608
+ arg.setDescription('Whether the cooking range is induction. If not provided, the OS-HPXML default is used.')
2617
2609
  args << arg
2618
2610
 
2619
2611
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('cooking_range_oven_is_convection', false)
2620
2612
  arg.setDisplayName('Cooking Range/Oven: Is Convection')
2621
- arg.setDescription('Whether the oven is convection.')
2613
+ arg.setDescription('Whether the oven is convection. If not provided, the OS-HPXML default is used.')
2622
2614
  args << arg
2623
2615
 
2624
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooking_range_oven_usage_multiplier', true)
2616
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooking_range_oven_usage_multiplier', false)
2625
2617
  arg.setDisplayName('Cooking Range/Oven: Usage Multiplier')
2626
- arg.setDescription('Multiplier on the cooking range/oven energy usage that can reflect, e.g., high/low usage occupants.')
2627
- arg.setDefaultValue(1.0)
2618
+ 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.')
2628
2619
  args << arg
2629
2620
 
2630
2621
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('ceiling_fan_present', true)
2631
2622
  arg.setDisplayName('Ceiling Fan: Present')
2632
- arg.setDescription('Whether there is are any ceiling fans.')
2623
+ arg.setDescription('Whether there are any ceiling fans.')
2633
2624
  arg.setDefaultValue(true)
2634
2625
  args << arg
2635
2626
 
2636
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('ceiling_fan_efficiency', true)
2627
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_fan_efficiency', false)
2637
2628
  arg.setDisplayName('Ceiling Fan: Efficiency')
2638
2629
  arg.setUnits('CFM/W')
2639
- arg.setDescription('The efficiency rating of the ceiling fan(s) at medium speed.')
2640
- arg.setDefaultValue(Constants.Auto)
2630
+ arg.setDescription('The efficiency rating of the ceiling fan(s) at medium speed. If not provided, the OS-HPXML default is used.')
2641
2631
  args << arg
2642
2632
 
2643
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('ceiling_fan_quantity', true)
2633
+ arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('ceiling_fan_quantity', false)
2644
2634
  arg.setDisplayName('Ceiling Fan: Quantity')
2645
2635
  arg.setUnits('#')
2646
- arg.setDescription('Total number of ceiling fans.')
2647
- arg.setDefaultValue(Constants.Auto)
2636
+ arg.setDescription('Total number of ceiling fans. If not provided, the OS-HPXML default is used.')
2648
2637
  args << arg
2649
2638
 
2650
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_fan_cooling_setpoint_temp_offset', true)
2639
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_fan_cooling_setpoint_temp_offset', false)
2651
2640
  arg.setDisplayName('Ceiling Fan: Cooling Setpoint Temperature Offset')
2652
2641
  arg.setUnits('deg-F')
2653
- arg.setDescription('The setpoint temperature offset during cooling season for the ceiling fan(s). Only applies if ceiling fan quantity is greater than zero.')
2654
- arg.setDefaultValue(0.0)
2642
+ arg.setDescription('The setpoint temperature offset during cooling season for the ceiling fan(s). Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default is used.')
2655
2643
  args << arg
2656
2644
 
2657
2645
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_plug_loads_television_present', true)
@@ -2660,44 +2648,38 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2660
2648
  arg.setDefaultValue(true)
2661
2649
  args << arg
2662
2650
 
2663
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('misc_plug_loads_television_annual_kwh', true)
2651
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_television_annual_kwh', false)
2664
2652
  arg.setDisplayName('Misc Plug Loads: Television Annual kWh')
2665
- arg.setDescription('The annual energy consumption of the television plug loads.')
2653
+ arg.setDescription('The annual energy consumption of the television plug loads. If not provided, the OS-HPXML default is used.')
2666
2654
  arg.setUnits('kWh/yr')
2667
- arg.setDefaultValue(Constants.Auto)
2668
2655
  args << arg
2669
2656
 
2670
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_television_usage_multiplier', true)
2657
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_television_usage_multiplier', false)
2671
2658
  arg.setDisplayName('Misc Plug Loads: Television Usage Multiplier')
2672
- arg.setDescription('Multiplier on the television energy usage that can reflect, e.g., high/low usage occupants.')
2673
- arg.setDefaultValue(1.0)
2659
+ 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.')
2674
2660
  args << arg
2675
2661
 
2676
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('misc_plug_loads_other_annual_kwh', true)
2662
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_annual_kwh', false)
2677
2663
  arg.setDisplayName('Misc Plug Loads: Other Annual kWh')
2678
- arg.setDescription('The annual energy consumption of the other residual plug loads.')
2664
+ arg.setDescription('The annual energy consumption of the other residual plug loads. If not provided, the OS-HPXML default is used.')
2679
2665
  arg.setUnits('kWh/yr')
2680
- arg.setDefaultValue(Constants.Auto)
2681
2666
  args << arg
2682
2667
 
2683
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('misc_plug_loads_other_frac_sensible', true)
2668
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_frac_sensible', false)
2684
2669
  arg.setDisplayName('Misc Plug Loads: Other Sensible Fraction')
2685
- arg.setDescription("Fraction of other residual plug loads' internal gains that are sensible.")
2670
+ arg.setDescription("Fraction of other residual plug loads' internal gains that are sensible. If not provided, the OS-HPXML default is used.")
2686
2671
  arg.setUnits('Frac')
2687
- arg.setDefaultValue(Constants.Auto)
2688
2672
  args << arg
2689
2673
 
2690
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('misc_plug_loads_other_frac_latent', true)
2674
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_frac_latent', false)
2691
2675
  arg.setDisplayName('Misc Plug Loads: Other Latent Fraction')
2692
- arg.setDescription("Fraction of other residual plug loads' internal gains that are latent.")
2676
+ arg.setDescription("Fraction of other residual plug loads' internal gains that are latent. If not provided, the OS-HPXML default is used.")
2693
2677
  arg.setUnits('Frac')
2694
- arg.setDefaultValue(Constants.Auto)
2695
2678
  args << arg
2696
2679
 
2697
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_usage_multiplier', true)
2680
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_other_usage_multiplier', false)
2698
2681
  arg.setDisplayName('Misc Plug Loads: Other Usage Multiplier')
2699
- arg.setDescription('Multiplier on the other energy usage that can reflect, e.g., high/low usage occupants.')
2700
- arg.setDefaultValue(1.0)
2682
+ 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.')
2701
2683
  args << arg
2702
2684
 
2703
2685
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_plug_loads_well_pump_present', true)
@@ -2706,17 +2688,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2706
2688
  arg.setDefaultValue(false)
2707
2689
  args << arg
2708
2690
 
2709
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('misc_plug_loads_well_pump_annual_kwh', true)
2691
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_well_pump_annual_kwh', false)
2710
2692
  arg.setDisplayName('Misc Plug Loads: Well Pump Annual kWh')
2711
- arg.setDescription('The annual energy consumption of the well pump plug loads.')
2693
+ arg.setDescription('The annual energy consumption of the well pump plug loads. If not provided, the OS-HPXML default is used.')
2712
2694
  arg.setUnits('kWh/yr')
2713
- arg.setDefaultValue(Constants.Auto)
2714
2695
  args << arg
2715
2696
 
2716
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_well_pump_usage_multiplier', true)
2697
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_well_pump_usage_multiplier', false)
2717
2698
  arg.setDisplayName('Misc Plug Loads: Well Pump Usage Multiplier')
2718
- arg.setDescription('Multiplier on the well pump energy usage that can reflect, e.g., high/low usage occupants.')
2719
- arg.setDefaultValue(1.0)
2699
+ 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.')
2720
2700
  args << arg
2721
2701
 
2722
2702
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_plug_loads_vehicle_present', true)
@@ -2725,17 +2705,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2725
2705
  arg.setDefaultValue(false)
2726
2706
  args << arg
2727
2707
 
2728
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('misc_plug_loads_vehicle_annual_kwh', true)
2708
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_vehicle_annual_kwh', false)
2729
2709
  arg.setDisplayName('Misc Plug Loads: Vehicle Annual kWh')
2730
- arg.setDescription('The annual energy consumption of the electric vehicle plug loads.')
2710
+ arg.setDescription('The annual energy consumption of the electric vehicle plug loads. If not provided, the OS-HPXML default is used.')
2731
2711
  arg.setUnits('kWh/yr')
2732
- arg.setDefaultValue(Constants.Auto)
2733
2712
  args << arg
2734
2713
 
2735
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_vehicle_usage_multiplier', true)
2714
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_plug_loads_vehicle_usage_multiplier', false)
2736
2715
  arg.setDisplayName('Misc Plug Loads: Vehicle Usage Multiplier')
2737
- arg.setDescription('Multiplier on the electric vehicle energy usage that can reflect, e.g., high/low usage occupants.')
2738
- arg.setDefaultValue(1.0)
2716
+ 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.')
2739
2717
  args << arg
2740
2718
 
2741
2719
  misc_fuel_loads_fuel_choices = OpenStudio::StringVector.new
@@ -2745,11 +2723,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2745
2723
  misc_fuel_loads_fuel_choices << HPXML::FuelTypeWoodCord
2746
2724
  misc_fuel_loads_fuel_choices << HPXML::FuelTypeWoodPellets
2747
2725
 
2748
- misc_fuel_loads_location_choices = OpenStudio::StringVector.new
2749
- misc_fuel_loads_location_choices << Constants.Auto
2750
- misc_fuel_loads_location_choices << HPXML::LocationInterior
2751
- misc_fuel_loads_location_choices << HPXML::LocationExterior
2752
-
2753
2726
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_fuel_loads_grill_present', true)
2754
2727
  arg.setDisplayName('Misc Fuel Loads: Grill Present')
2755
2728
  arg.setDescription('Whether there is a fuel loads grill.')
@@ -2762,17 +2735,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2762
2735
  arg.setDefaultValue(HPXML::FuelTypeNaturalGas)
2763
2736
  args << arg
2764
2737
 
2765
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('misc_fuel_loads_grill_annual_therm', true)
2738
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_grill_annual_therm', false)
2766
2739
  arg.setDisplayName('Misc Fuel Loads: Grill Annual therm')
2767
- arg.setDescription('The annual energy consumption of the fuel loads grill.')
2740
+ arg.setDescription('The annual energy consumption of the fuel loads grill. If not provided, the OS-HPXML default is used.')
2768
2741
  arg.setUnits('therm/yr')
2769
- arg.setDefaultValue(Constants.Auto)
2770
2742
  args << arg
2771
2743
 
2772
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_grill_usage_multiplier', true)
2744
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_grill_usage_multiplier', false)
2773
2745
  arg.setDisplayName('Misc Fuel Loads: Grill Usage Multiplier')
2774
- arg.setDescription('Multiplier on the fuel loads grill energy usage that can reflect, e.g., high/low usage occupants.')
2775
- arg.setDefaultValue(0.0)
2746
+ 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.')
2776
2747
  args << arg
2777
2748
 
2778
2749
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_fuel_loads_lighting_present', true)
@@ -2787,17 +2758,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2787
2758
  arg.setDefaultValue(HPXML::FuelTypeNaturalGas)
2788
2759
  args << arg
2789
2760
 
2790
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('misc_fuel_loads_lighting_annual_therm', true)
2761
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_lighting_annual_therm', false)
2791
2762
  arg.setDisplayName('Misc Fuel Loads: Lighting Annual therm')
2792
- arg.setDescription('The annual energy consumption of the fuel loads lighting.')
2763
+ arg.setDescription('The annual energy consumption of the fuel loads lighting. If not provided, the OS-HPXML default is used.')
2793
2764
  arg.setUnits('therm/yr')
2794
- arg.setDefaultValue(Constants.Auto)
2795
2765
  args << arg
2796
2766
 
2797
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_lighting_usage_multiplier', true)
2767
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_lighting_usage_multiplier', false)
2798
2768
  arg.setDisplayName('Misc Fuel Loads: Lighting Usage Multiplier')
2799
- arg.setDescription('Multiplier on the fuel loads lighting energy usage that can reflect, e.g., high/low usage occupants.')
2800
- arg.setDefaultValue(0.0)
2769
+ 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.')
2801
2770
  args << arg
2802
2771
 
2803
2772
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_fuel_loads_fireplace_present', true)
@@ -2812,31 +2781,27 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2812
2781
  arg.setDefaultValue(HPXML::FuelTypeNaturalGas)
2813
2782
  args << arg
2814
2783
 
2815
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('misc_fuel_loads_fireplace_annual_therm', true)
2784
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_annual_therm', false)
2816
2785
  arg.setDisplayName('Misc Fuel Loads: Fireplace Annual therm')
2817
- arg.setDescription('The annual energy consumption of the fuel loads fireplace.')
2786
+ arg.setDescription('The annual energy consumption of the fuel loads fireplace. If not provided, the OS-HPXML default is used.')
2818
2787
  arg.setUnits('therm/yr')
2819
- arg.setDefaultValue(Constants.Auto)
2820
2788
  args << arg
2821
2789
 
2822
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('misc_fuel_loads_fireplace_frac_sensible', true)
2790
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_frac_sensible', false)
2823
2791
  arg.setDisplayName('Misc Fuel Loads: Fireplace Sensible Fraction')
2824
- arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are sensible.")
2792
+ arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are sensible. If not provided, the OS-HPXML default is used.")
2825
2793
  arg.setUnits('Frac')
2826
- arg.setDefaultValue(Constants.Auto)
2827
2794
  args << arg
2828
2795
 
2829
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('misc_fuel_loads_fireplace_frac_latent', true)
2796
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_frac_latent', false)
2830
2797
  arg.setDisplayName('Misc Fuel Loads: Fireplace Latent Fraction')
2831
- arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are latent.")
2798
+ arg.setDescription("Fraction of fireplace residual fuel loads' internal gains that are latent. If not provided, the OS-HPXML default is used.")
2832
2799
  arg.setUnits('Frac')
2833
- arg.setDefaultValue(Constants.Auto)
2834
2800
  args << arg
2835
2801
 
2836
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_usage_multiplier', true)
2802
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('misc_fuel_loads_fireplace_usage_multiplier', false)
2837
2803
  arg.setDisplayName('Misc Fuel Loads: Fireplace Usage Multiplier')
2838
- arg.setDescription('Multiplier on the fuel loads fireplace energy usage that can reflect, e.g., high/low usage occupants.')
2839
- arg.setDefaultValue(0.0)
2804
+ 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.')
2840
2805
  args << arg
2841
2806
 
2842
2807
  heater_type_choices = OpenStudio::StringVector.new
@@ -2851,43 +2816,38 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2851
2816
  arg.setDefaultValue(false)
2852
2817
  args << arg
2853
2818
 
2854
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('pool_pump_annual_kwh', true)
2819
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_pump_annual_kwh', false)
2855
2820
  arg.setDisplayName('Pool: Pump Annual kWh')
2856
- arg.setDescription('The annual energy consumption of the pool pump.')
2821
+ arg.setDescription('The annual energy consumption of the pool pump. If not provided, the OS-HPXML default is used.')
2857
2822
  arg.setUnits('kWh/yr')
2858
- arg.setDefaultValue(Constants.Auto)
2859
2823
  args << arg
2860
2824
 
2861
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_pump_usage_multiplier', true)
2825
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_pump_usage_multiplier', false)
2862
2826
  arg.setDisplayName('Pool: Pump Usage Multiplier')
2863
- arg.setDescription('Multiplier on the pool pump energy usage that can reflect, e.g., high/low usage occupants.')
2864
- arg.setDefaultValue(1.0)
2827
+ 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.')
2865
2828
  args << arg
2866
2829
 
2867
2830
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pool_heater_type', heater_type_choices, true)
2868
2831
  arg.setDisplayName('Pool: Heater Type')
2869
- arg.setDescription("The type of pool heater. Use 'none' if there is no pool heater.")
2832
+ arg.setDescription("The type of pool heater. Use '#{HPXML::TypeNone}' if there is no pool heater.")
2870
2833
  arg.setDefaultValue(HPXML::TypeNone)
2871
2834
  args << arg
2872
2835
 
2873
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('pool_heater_annual_kwh', true)
2836
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_heater_annual_kwh', false)
2874
2837
  arg.setDisplayName('Pool: Heater Annual kWh')
2875
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} pool heater.")
2838
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} pool heater. If not provided, the OS-HPXML default is used.")
2876
2839
  arg.setUnits('kWh/yr')
2877
- arg.setDefaultValue(Constants.Auto)
2878
2840
  args << arg
2879
2841
 
2880
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('pool_heater_annual_therm', true)
2842
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_heater_annual_therm', false)
2881
2843
  arg.setDisplayName('Pool: Heater Annual therm')
2882
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} pool heater.")
2844
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} pool heater. If not provided, the OS-HPXML default is used.")
2883
2845
  arg.setUnits('therm/yr')
2884
- arg.setDefaultValue(Constants.Auto)
2885
2846
  args << arg
2886
2847
 
2887
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_heater_usage_multiplier', true)
2848
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pool_heater_usage_multiplier', false)
2888
2849
  arg.setDisplayName('Pool: Heater Usage Multiplier')
2889
- arg.setDescription('Multiplier on the pool heater energy usage that can reflect, e.g., high/low usage occupants.')
2890
- arg.setDefaultValue(1.0)
2850
+ 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.')
2891
2851
  args << arg
2892
2852
 
2893
2853
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('hot_tub_present', true)
@@ -2896,48 +2856,43 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2896
2856
  arg.setDefaultValue(false)
2897
2857
  args << arg
2898
2858
 
2899
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hot_tub_pump_annual_kwh', true)
2859
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_pump_annual_kwh', false)
2900
2860
  arg.setDisplayName('Hot Tub: Pump Annual kWh')
2901
- arg.setDescription('The annual energy consumption of the hot tub pump.')
2861
+ arg.setDescription('The annual energy consumption of the hot tub pump. If not provided, the OS-HPXML default is used.')
2902
2862
  arg.setUnits('kWh/yr')
2903
- arg.setDefaultValue(Constants.Auto)
2904
2863
  args << arg
2905
2864
 
2906
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_pump_usage_multiplier', true)
2865
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_pump_usage_multiplier', false)
2907
2866
  arg.setDisplayName('Hot Tub: Pump Usage Multiplier')
2908
- arg.setDescription('Multiplier on the hot tub pump energy usage that can reflect, e.g., high/low usage occupants.')
2909
- arg.setDefaultValue(1.0)
2867
+ 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.')
2910
2868
  args << arg
2911
2869
 
2912
2870
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('hot_tub_heater_type', heater_type_choices, true)
2913
2871
  arg.setDisplayName('Hot Tub: Heater Type')
2914
- arg.setDescription("The type of hot tub heater. Use 'none' if there is no hot tub heater.")
2872
+ arg.setDescription("The type of hot tub heater. Use '#{HPXML::TypeNone}' if there is no hot tub heater.")
2915
2873
  arg.setDefaultValue(HPXML::TypeNone)
2916
2874
  args << arg
2917
2875
 
2918
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hot_tub_heater_annual_kwh', true)
2876
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_annual_kwh', false)
2919
2877
  arg.setDisplayName('Hot Tub: Heater Annual kWh')
2920
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} hot tub heater.")
2878
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeElectricResistance} hot tub heater. If not provided, the OS-HPXML default is used.")
2921
2879
  arg.setUnits('kWh/yr')
2922
- arg.setDefaultValue(Constants.Auto)
2923
2880
  args << arg
2924
2881
 
2925
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('hot_tub_heater_annual_therm', true)
2882
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_annual_therm', false)
2926
2883
  arg.setDisplayName('Hot Tub: Heater Annual therm')
2927
- arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} hot tub heater.")
2884
+ arg.setDescription("The annual energy consumption of the #{HPXML::HeaterTypeGas} hot tub heater. If not provided, the OS-HPXML default is used.")
2928
2885
  arg.setUnits('therm/yr')
2929
- arg.setDefaultValue(Constants.Auto)
2930
2886
  args << arg
2931
2887
 
2932
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_usage_multiplier', true)
2888
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('hot_tub_heater_usage_multiplier', false)
2933
2889
  arg.setDisplayName('Hot Tub: Heater Usage Multiplier')
2934
- arg.setDescription('Multiplier on the hot tub heater energy usage that can reflect, e.g., high/low usage occupants.')
2935
- arg.setDefaultValue(1.0)
2890
+ 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.')
2936
2891
  args << arg
2937
2892
 
2938
2893
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('emissions_scenario_names', false)
2939
2894
  arg.setDisplayName('Emissions: Scenario Names')
2940
- arg.setDescription('Names of emissions scenarios. If multiple scenarios, use a comma-separated list.')
2895
+ arg.setDescription('Names of emissions scenarios. If multiple scenarios, use a comma-separated list. If not provided, no emissions scenarios are calculated.')
2941
2896
  args << arg
2942
2897
 
2943
2898
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('emissions_types', false)
@@ -2981,6 +2936,68 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2981
2936
  args << arg
2982
2937
  end
2983
2938
 
2939
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('utility_bill_scenario_names', false)
2940
+ arg.setDisplayName('Utility Bills: Scenario Names')
2941
+ arg.setDescription('Names of utility bill scenarios. If multiple scenarios, use a comma-separated list. If not provided, no utility bills scenarios are calculated.')
2942
+ args << arg
2943
+
2944
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('utility_bill_electricity_filepaths', false)
2945
+ arg.setDisplayName('Utility Bills: Electricity File Paths')
2946
+ arg.setDescription('Electricity tariff file specified as an absolute/relative path to a file with utility rate structure information. Tariff file must be formatted to OpenEI API version 7. If multiple scenarios, use a comma-separated list.')
2947
+ args << arg
2948
+
2949
+ ([HPXML::FuelTypeElectricity] + Constants.FossilFuels).each do |fuel|
2950
+ underscore_case = OpenStudio::toUnderscoreCase(fuel)
2951
+ all_caps_case = fuel.split(' ').map(&:capitalize).join(' ')
2952
+ cap_case = fuel.capitalize
2953
+
2954
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument("utility_bill_#{underscore_case}_fixed_charges", false)
2955
+ arg.setDisplayName("Utility Bills: #{all_caps_case} Fixed Charges")
2956
+ arg.setDescription("#{cap_case} utility bill monthly fixed charges. If multiple scenarios, use a comma-separated list.")
2957
+ args << arg
2958
+ end
2959
+
2960
+ ([HPXML::FuelTypeElectricity] + Constants.FossilFuels).each do |fuel|
2961
+ underscore_case = OpenStudio::toUnderscoreCase(fuel)
2962
+ all_caps_case = fuel.split(' ').map(&:capitalize).join(' ')
2963
+ cap_case = fuel.capitalize
2964
+
2965
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument("utility_bill_#{underscore_case}_marginal_rates", false)
2966
+ arg.setDisplayName("Utility Bills: #{all_caps_case} Marginal Rates")
2967
+ arg.setDescription("#{cap_case} utility bill marginal rates. If multiple scenarios, use a comma-separated list.")
2968
+ args << arg
2969
+ end
2970
+
2971
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('utility_bill_pv_compensation_types', false)
2972
+ arg.setDisplayName('Utility Bills: PV Compensation Types')
2973
+ arg.setDescription('Utility bill PV compensation types. If multiple scenarios, use a comma-separated list.')
2974
+ args << arg
2975
+
2976
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('utility_bill_pv_net_metering_annual_excess_sellback_rate_types', false)
2977
+ arg.setDisplayName('Utility Bills: PV Net Metering Annual Excess Sellback Rate Types')
2978
+ arg.setDescription("Utility bill PV net metering annual excess sellback rate types. Only applies if the PV compensation type is '#{HPXML::PVCompensationTypeNetMetering}'. If multiple scenarios, use a comma-separated list.")
2979
+ args << arg
2980
+
2981
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('utility_bill_pv_net_metering_annual_excess_sellback_rates', false)
2982
+ arg.setDisplayName('Utility Bills: PV Net Metering Annual Excess Sellback Rates')
2983
+ arg.setDescription("Utility bill PV net metering annual excess sellback rates. Only applies if the PV compensation type is '#{HPXML::PVCompensationTypeNetMetering}' and the PV annual excess sellback rate type is '#{HPXML::PVAnnualExcessSellbackRateTypeUserSpecified}'. If multiple scenarios, use a comma-separated list.")
2984
+ args << arg
2985
+
2986
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('utility_bill_pv_feed_in_tariff_rates', false)
2987
+ arg.setDisplayName('Utility Bills: PV Feed-In Tariff Rates')
2988
+ arg.setDescription("Utility bill PV annual full/gross feed-in tariff rates. Only applies if the PV compensation type is '#{HPXML::PVCompensationTypeFeedInTariff}'. If multiple scenarios, use a comma-separated list.")
2989
+ args << arg
2990
+
2991
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('utility_bill_pv_monthly_grid_connection_fee_units', false)
2992
+ arg.setDisplayName('Utility Bills: PV Monthly Grid Connection Fee Units')
2993
+ arg.setDescription('Utility bill PV monthly grid connection fee units. If multiple scenarios, use a comma-separated list.')
2994
+ args << arg
2995
+
2996
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('utility_bill_pv_monthly_grid_connection_fees', false)
2997
+ arg.setDisplayName('Utility Bills: PV Monthly Grid Connection Fees')
2998
+ arg.setDescription('Utility bill PV monthly grid connection fees. If multiple scenarios, use a comma-separated list.')
2999
+ args << arg
3000
+
2984
3001
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('additional_properties', false)
2985
3002
  arg.setDisplayName('Additional Properties')
2986
3003
  arg.setDescription("Additional properties specified as key-value pairs (i.e., key=value). If multiple additional properties, use a |-separated list. For example, 'LowIncome=false|Remodeled|Description=2-story home in Denver'. These properties will be stored in the HPXML file under /HPXML/SoftwareInfo/extension/AdditionalProperties.")
@@ -3052,9 +3069,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3052
3069
 
3053
3070
  hpxml_path = args[:hpxml_path]
3054
3071
  unless (Pathname.new hpxml_path).absolute?
3055
- hpxml_path = File.expand_path(File.join(File.dirname(__FILE__), hpxml_path))
3072
+ hpxml_path = File.expand_path(hpxml_path)
3056
3073
  end
3057
3074
 
3075
+ XMLHelper.write_file(hpxml_doc, hpxml_path)
3076
+ runner.registerInfo("Wrote file: #{hpxml_path}")
3077
+
3058
3078
  # Check for invalid HPXML file
3059
3079
  if args[:apply_validation].is_initialized && args[:apply_validation].get
3060
3080
  if not validate_hpxml(runner, hpxml_path, hpxml_doc)
@@ -3062,9 +3082,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3062
3082
  end
3063
3083
  end
3064
3084
 
3065
- XMLHelper.write_file(hpxml_doc, hpxml_path)
3066
- runner.registerInfo("Wrote file: #{hpxml_path}")
3067
-
3068
3085
  # Uncomment for debugging purposes
3069
3086
  # File.write(hpxml_path.gsub('.xml', '.osm'), model.to_s)
3070
3087
 
@@ -3105,29 +3122,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3105
3122
  warning = (args[:geometry_attic_type] == HPXML::AtticTypeConditioned) && (args[:ceiling_assembly_r] > 2.1)
3106
3123
  warnings << 'Home with conditioned attic has ceiling insulation.' if warning
3107
3124
 
3108
- if args[:misc_plug_loads_television_annual_kwh] != Constants.Auto
3109
- warning = (args[:misc_plug_loads_television_annual_kwh].to_f == 0.0 && args[:misc_plug_loads_television_usage_multiplier] != 0.0)
3110
- warnings << 'Specified a non-zero usage multiplier for zero television plug loads.' if warning
3111
- end
3112
-
3113
- if args[:misc_plug_loads_other_annual_kwh] != Constants.Auto
3114
- warning = (args[:misc_plug_loads_other_annual_kwh].to_f == 0.0 && args[:misc_plug_loads_other_usage_multiplier] != 0.0)
3115
- warnings << 'Specified a non-zero usage multiplier for zero other plug loads.' if warning
3116
- end
3117
-
3118
- if args[:misc_plug_loads_well_pump_annual_kwh] != Constants.Auto
3119
- warning = (args[:misc_plug_loads_well_pump_annual_kwh].to_f == 0.0 && args[:misc_plug_loads_well_pump_usage_multiplier] != 0.0)
3120
- warnings << 'Specified a non-zero usage multiplier for zero well pump plug loads.' if warning
3121
- end
3122
-
3123
- if args[:misc_plug_loads_vehicle_annual_kwh] != Constants.Auto
3124
- warning = (args[:misc_plug_loads_vehicle_annual_kwh].to_f && args[:misc_plug_loads_vehicle_usage_multiplier] != 0.0)
3125
- warnings << 'Specified a non-zero usage multiplier for zero vehicle plug loads.' if warning
3126
- end
3127
-
3128
- warning = (!args[:misc_fuel_loads_grill_present] && args[:misc_fuel_loads_grill_usage_multiplier] != 0.0) || (!args[:misc_fuel_loads_lighting_present] && args[:misc_fuel_loads_lighting_usage_multiplier] != 0.0) || (!args[:misc_fuel_loads_fireplace_present] && args[:misc_fuel_loads_fireplace_usage_multiplier] != 0.0)
3129
- warnings << 'Specified a non-zero usage multiplier for a fuel load that is zero.' if warning
3130
-
3131
3125
  return warnings
3132
3126
  end
3133
3127
 
@@ -3140,24 +3134,14 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3140
3134
  error = (args[:cooling_system_type] != 'none') && (args[:heat_pump_type] != 'none') && (args[:cooling_system_fraction_cool_load_served] > 0) && (args[:heat_pump_fraction_cool_load_served] > 0)
3141
3135
  errors << 'Multiple central cooling systems are not currently supported.' if error
3142
3136
 
3143
- if args[:geometry_unit_num_bathrooms] != Constants.Auto
3144
- error = (Float(args[:geometry_unit_num_bathrooms]) % 1 != 0)
3145
- errors << 'Number of bathrooms must be an integer.' if error
3146
- end
3147
-
3148
- if args[:ceiling_fan_quantity] != Constants.Auto
3149
- error = (Float(args[:ceiling_fan_quantity]) % 1 != 0)
3150
- errors << 'Quantity of ceiling fans must be an integer.' if error
3151
- end
3152
-
3153
3137
  error = ![HPXML::FoundationTypeSlab, HPXML::FoundationTypeAboveApartment].include?(args[:geometry_foundation_type]) && (args[:geometry_foundation_height] == 0)
3154
3138
  errors << "Foundation type of '#{args[:geometry_foundation_type]}' cannot have a height of zero." if error
3155
3139
 
3156
3140
  error = (args[:geometry_unit_type] == HPXML::ResidentialTypeApartment) && ([HPXML::FoundationTypeBasementConditioned, HPXML::FoundationTypeCrawlspaceConditioned].include? args[:geometry_foundation_type])
3157
3141
  errors << 'Conditioned basement/crawlspace foundation type for apartment units is not currently supported.' if error
3158
3142
 
3159
- error = ((args[:ducts_supply_location] == Constants.Auto) && (args[:ducts_supply_surface_area] != Constants.Auto)) || ((args[:ducts_supply_location] != Constants.Auto) && (args[:ducts_supply_surface_area] == Constants.Auto)) || ((args[:ducts_return_location] == Constants.Auto) && (args[:ducts_return_surface_area] != Constants.Auto)) || ((args[:ducts_return_location] != Constants.Auto) && (args[:ducts_return_surface_area] == Constants.Auto))
3160
- errors << 'Duct location and surface area not both auto or not both specified.' if error
3143
+ 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)
3144
+ errors << 'Duct location and surface area not both defaulted or not both specified.' if error
3161
3145
 
3162
3146
  error = (args[:heating_system_2_type] != 'none') && (args[:heating_system_2_fraction_heat_load_served] == 1.0)
3163
3147
  errors << 'The fraction of heat load served by the second heating system is 100%.' if error
@@ -3230,6 +3214,20 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3230
3214
  errors << 'One or more emissions arguments does not have enough comma-separated elements specified.' if error
3231
3215
  end
3232
3216
 
3217
+ bills_args_initialized = [args[:utility_bill_scenario_names].is_initialized]
3218
+ if bills_args_initialized.uniq[0]
3219
+ bills_scenario_lengths = [args[:utility_bill_scenario_names].get.count(',')]
3220
+ ([HPXML::FuelTypeElectricity] + Constants.FossilFuels).each do |fuel|
3221
+ underscore_case = OpenStudio::toUnderscoreCase(fuel)
3222
+
3223
+ bills_scenario_lengths += [args["utility_bill_#{underscore_case}_fixed_charges".to_sym].get.count(',')] if args["utility_bill_#{underscore_case}_fixed_charges".to_sym].is_initialized
3224
+ bills_scenario_lengths += [args["utility_bill_#{underscore_case}_marginal_rates".to_sym].get.count(',')] if args["utility_bill_#{underscore_case}_marginal_rates".to_sym].is_initialized
3225
+ end
3226
+
3227
+ error = (bills_scenario_lengths.uniq.size != 1)
3228
+ errors << 'One or more utility bill arguments does not have enough comma-separated elements specified.' if error
3229
+ end
3230
+
3233
3231
  error = (args[:geometry_unit_aspect_ratio] <= 0)
3234
3232
  errors << 'Aspect ratio must be greater than zero.' if error
3235
3233
 
@@ -3270,27 +3268,25 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3270
3268
  end
3271
3269
 
3272
3270
  def validate_hpxml(runner, hpxml_path, hpxml_doc)
3273
- schemas_dir = File.join(File.dirname(__FILE__), '../HPXMLtoOpenStudio/resources/hpxml_schema')
3274
- schematron_dir = File.join(File.dirname(__FILE__), '../HPXMLtoOpenStudio/resources/hpxml_schematron')
3275
-
3276
3271
  is_valid = true
3277
3272
 
3278
3273
  # Validate input HPXML against schema
3279
- XMLHelper.validate(hpxml_doc.to_xml, File.join(schemas_dir, 'HPXML.xsd'), runner).each do |error|
3280
- runner.registerError("#{hpxml_path}: #{error}")
3281
- is_valid = false
3282
- end
3274
+ schema_dir = File.join(File.dirname(__FILE__), '../HPXMLtoOpenStudio/resources/hpxml_schema')
3275
+ schema_path = File.join(schema_dir, 'HPXML.xsd')
3276
+ xsd_errors, xsd_warnings = XMLValidator.validate_against_schema(hpxml_path, schema_path)
3283
3277
 
3284
3278
  # Validate input HPXML against schematron docs
3285
- stron_paths = [File.join(schematron_dir, 'HPXMLvalidator.xml'),
3286
- File.join(schematron_dir, 'EPvalidator.xml')]
3287
- errors, warnings = Validator.run_validators(hpxml_doc, stron_paths)
3288
- errors.each do |error|
3279
+ schematron_dir = File.join(File.dirname(__FILE__), '../HPXMLtoOpenStudio/resources/hpxml_schematron')
3280
+ schematron_path = File.join(schematron_dir, 'EPvalidator.xml')
3281
+ sct_errors, sct_warnings = XMLValidator.validate_against_schematron(hpxml_path, schematron_path, hpxml_doc)
3282
+
3283
+ # Handle errors/warnings
3284
+ (xsd_errors + sct_errors).each do |error|
3289
3285
  runner.registerError("#{hpxml_path}: #{error}")
3290
3286
  is_valid = false
3291
3287
  end
3292
- warnings.each do |warning|
3293
- runner.registerWarning("#{warning}")
3288
+ (xsd_warnings + sct_warnings).each do |warning|
3289
+ runner.registerWarning("#{hpxml_path}: #{warning}")
3294
3290
  end
3295
3291
 
3296
3292
  return is_valid
@@ -3299,6 +3295,11 @@ end
3299
3295
 
3300
3296
  class HPXMLFile
3301
3297
  def self.create(runner, model, args, epw_file)
3298
+ if (args[:hvac_control_heating_season_period].to_s == HPXML::BuildingAmerica) || (args[:hvac_control_cooling_season_period].to_s == HPXML::BuildingAmerica) || (args[:apply_defaults].is_initialized && args[:apply_defaults].get)
3299
+ OpenStudio::Model::WeatherFile.setWeatherFile(model, epw_file)
3300
+ weather = WeatherProcess.new(model, runner)
3301
+ end
3302
+
3302
3303
  success = create_geometry_envelope(runner, model, args)
3303
3304
  return false if not success
3304
3305
 
@@ -3310,61 +3311,61 @@ class HPXMLFile
3310
3311
 
3311
3312
  hpxml = HPXML.new
3312
3313
 
3313
- set_header(hpxml, runner, args)
3314
- set_site(hpxml, runner, args)
3315
- set_neighbor_buildings(hpxml, runner, args)
3316
- set_building_occupancy(hpxml, runner, args)
3317
- set_building_construction(hpxml, runner, args)
3318
- set_climate_and_risk_zones(hpxml, runner, args, epw_file)
3319
- set_air_infiltration_measurements(hpxml, runner, args)
3320
- set_roofs(hpxml, runner, model, args, sorted_surfaces)
3321
- set_rim_joists(hpxml, runner, model, args, sorted_surfaces)
3322
- set_walls(hpxml, runner, model, args, sorted_surfaces)
3323
- set_foundation_walls(hpxml, runner, model, args, sorted_surfaces)
3324
- set_frame_floors(hpxml, runner, model, args, sorted_surfaces)
3325
- set_slabs(hpxml, runner, model, args, sorted_surfaces)
3326
- set_windows(hpxml, runner, model, args, sorted_subsurfaces)
3327
- set_skylights(hpxml, runner, model, args, sorted_subsurfaces)
3328
- set_doors(hpxml, runner, model, args, sorted_subsurfaces)
3329
- set_attics(hpxml, runner, model, args)
3330
- set_foundations(hpxml, runner, model, args)
3331
- set_heating_systems(hpxml, runner, args)
3332
- set_cooling_systems(hpxml, runner, args)
3333
- set_heat_pumps(hpxml, runner, args)
3334
- set_secondary_heating_systems(hpxml, runner, args)
3335
- set_hvac_distribution(hpxml, runner, args)
3336
- set_hvac_control(hpxml, runner, args)
3337
- set_ventilation_fans(hpxml, runner, args)
3338
- set_water_heating_systems(hpxml, runner, args)
3339
- set_hot_water_distribution(hpxml, runner, args)
3340
- set_water_fixtures(hpxml, runner, args)
3341
- set_solar_thermal(hpxml, runner, args, epw_file)
3342
- set_pv_systems(hpxml, runner, args, epw_file)
3343
- set_battery(hpxml, runner, args)
3344
- set_lighting(hpxml, runner, args)
3345
- set_dehumidifier(hpxml, runner, args)
3346
- set_clothes_washer(hpxml, runner, args)
3347
- set_clothes_dryer(hpxml, runner, args)
3348
- set_dishwasher(hpxml, runner, args)
3349
- set_refrigerator(hpxml, runner, args)
3350
- set_extra_refrigerator(hpxml, runner, args)
3351
- set_freezer(hpxml, runner, args)
3352
- set_cooking_range_oven(hpxml, runner, args)
3353
- set_ceiling_fans(hpxml, runner, args)
3354
- set_misc_plug_loads_television(hpxml, runner, args)
3355
- set_misc_plug_loads_other(hpxml, runner, args)
3356
- set_misc_plug_loads_vehicle(hpxml, runner, args)
3357
- set_misc_plug_loads_well_pump(hpxml, runner, args)
3358
- set_misc_fuel_loads_grill(hpxml, runner, args)
3359
- set_misc_fuel_loads_lighting(hpxml, runner, args)
3360
- set_misc_fuel_loads_fireplace(hpxml, runner, args)
3361
- set_pool(hpxml, runner, args)
3362
- set_hot_tub(hpxml, runner, args)
3314
+ set_header(hpxml, args)
3315
+ set_site(hpxml, args)
3316
+ set_neighbor_buildings(hpxml, args)
3317
+ set_building_occupancy(hpxml, args)
3318
+ set_building_construction(hpxml, args)
3319
+ set_climate_and_risk_zones(hpxml, args)
3320
+ set_air_infiltration_measurements(hpxml, args)
3321
+ set_roofs(hpxml, args, sorted_surfaces)
3322
+ set_rim_joists(hpxml, model, args, sorted_surfaces)
3323
+ set_walls(hpxml, model, args, sorted_surfaces)
3324
+ set_foundation_walls(hpxml, model, args, sorted_surfaces)
3325
+ set_floors(hpxml, args, sorted_surfaces)
3326
+ set_slabs(hpxml, model, args, sorted_surfaces)
3327
+ set_windows(hpxml, model, args, sorted_subsurfaces)
3328
+ set_skylights(hpxml, args, sorted_subsurfaces)
3329
+ set_doors(hpxml, model, args, sorted_subsurfaces)
3330
+ set_attics(hpxml, args)
3331
+ set_foundations(hpxml, args)
3332
+ set_heating_systems(hpxml, args)
3333
+ set_cooling_systems(hpxml, args)
3334
+ set_heat_pumps(hpxml, args)
3335
+ set_secondary_heating_systems(hpxml, args)
3336
+ set_hvac_distribution(hpxml, args)
3337
+ set_hvac_control(hpxml, args, epw_file, weather)
3338
+ set_ventilation_fans(hpxml, args)
3339
+ set_water_heating_systems(hpxml, args)
3340
+ set_hot_water_distribution(hpxml, args)
3341
+ set_water_fixtures(hpxml, args)
3342
+ set_solar_thermal(hpxml, args, epw_file)
3343
+ set_pv_systems(hpxml, args, epw_file)
3344
+ set_battery(hpxml, args)
3345
+ set_lighting(hpxml, args)
3346
+ set_dehumidifier(hpxml, args)
3347
+ set_clothes_washer(hpxml, args)
3348
+ set_clothes_dryer(hpxml, args)
3349
+ set_dishwasher(hpxml, args)
3350
+ set_refrigerator(hpxml, args)
3351
+ set_extra_refrigerator(hpxml, args)
3352
+ set_freezer(hpxml, args)
3353
+ set_cooking_range_oven(hpxml, args)
3354
+ set_ceiling_fans(hpxml, args)
3355
+ set_misc_plug_loads_television(hpxml, args)
3356
+ set_misc_plug_loads_other(hpxml, args)
3357
+ set_misc_plug_loads_vehicle(hpxml, args)
3358
+ set_misc_plug_loads_well_pump(hpxml, args)
3359
+ set_misc_fuel_loads_grill(hpxml, args)
3360
+ set_misc_fuel_loads_lighting(hpxml, args)
3361
+ set_misc_fuel_loads_fireplace(hpxml, args)
3362
+ set_pool(hpxml, args)
3363
+ set_hot_tub(hpxml, args)
3363
3364
 
3364
3365
  # Collapse surfaces so that we don't get, e.g., individual windows
3365
3366
  # or the front wall split because of the door. Exclude foundation walls
3366
3367
  # from the list so we get all 4 foundation walls.
3367
- hpxml.collapse_enclosure_surfaces([:roofs, :walls, :rim_joists, :frame_floors,
3368
+ hpxml.collapse_enclosure_surfaces([:roofs, :walls, :rim_joists, :floors,
3368
3369
  :slabs, :windows, :skylights, :doors])
3369
3370
 
3370
3371
  # After surfaces are collapsed, round all areas
@@ -3372,7 +3373,7 @@ class HPXMLFile
3372
3373
  hpxml.rim_joists +
3373
3374
  hpxml.walls +
3374
3375
  hpxml.foundation_walls +
3375
- hpxml.frame_floors +
3376
+ hpxml.floors +
3376
3377
  hpxml.slabs +
3377
3378
  hpxml.windows +
3378
3379
  hpxml.skylights +
@@ -3390,9 +3391,7 @@ class HPXMLFile
3390
3391
 
3391
3392
  if args[:apply_defaults].is_initialized && args[:apply_defaults].get
3392
3393
  eri_version = Constants.ERIVersions[-1]
3393
- OpenStudio::Model::WeatherFile.setWeatherFile(model, epw_file)
3394
- weather = WeatherProcess.new(model, runner)
3395
- HPXMLDefaults.apply(hpxml, eri_version, weather, epw_file: epw_file)
3394
+ HPXMLDefaults.apply(runner, hpxml, eri_version, weather, epw_file: epw_file)
3396
3395
  end
3397
3396
 
3398
3397
  hpxml_doc = hpxml.to_oga()
@@ -3436,9 +3435,9 @@ class HPXMLFile
3436
3435
  if args[:geometry_unit_type] == HPXML::ResidentialTypeSFD
3437
3436
  success = Geometry.create_single_family_detached(runner: runner, model: model, **args)
3438
3437
  elsif args[:geometry_unit_type] == HPXML::ResidentialTypeSFA
3439
- success = Geometry.create_single_family_attached(runner: runner, model: model, **args)
3438
+ success = Geometry.create_single_family_attached(model: model, **args)
3440
3439
  elsif args[:geometry_unit_type] == HPXML::ResidentialTypeApartment
3441
- success = Geometry.create_apartment(runner: runner, model: model, **args)
3440
+ success = Geometry.create_apartment(model: model, **args)
3442
3441
  end
3443
3442
  return false if not success
3444
3443
 
@@ -3451,7 +3450,7 @@ class HPXMLFile
3451
3450
  return true
3452
3451
  end
3453
3452
 
3454
- def self.set_header(hpxml, runner, args)
3453
+ def self.set_header(hpxml, args)
3455
3454
  hpxml.header.xml_type = 'HPXML'
3456
3455
  hpxml.header.xml_generated_by = 'BuildResidentialHPXML'
3457
3456
  hpxml.header.transaction = 'create'
@@ -3459,6 +3458,9 @@ class HPXMLFile
3459
3458
  if args[:occupancy_calculation_type].is_initialized
3460
3459
  hpxml.header.occupancy_calculation_type = args[:occupancy_calculation_type].get
3461
3460
  end
3461
+ if args[:window_natvent_availability].is_initialized
3462
+ hpxml.header.natvent_days_per_week = args[:window_natvent_availability].get
3463
+ end
3462
3464
  if args[:schedules_filepaths].is_initialized
3463
3465
  hpxml.header.schedules_filepaths = args[:schedules_filepaths].get.split(',').map(&:strip)
3464
3466
  end
@@ -3466,7 +3468,6 @@ class HPXMLFile
3466
3468
  if args[:software_info_program_used].is_initialized
3467
3469
  hpxml.header.software_program_used = args[:software_info_program_used].get
3468
3470
  end
3469
-
3470
3471
  if args[:software_info_program_version].is_initialized
3471
3472
  hpxml.header.software_program_version = args[:software_info_program_version].get
3472
3473
  end
@@ -3498,6 +3499,10 @@ class HPXMLFile
3498
3499
  hpxml.header.dst_end_day = end_day
3499
3500
  end
3500
3501
 
3502
+ if args[:simulation_control_temperature_capacitance_multiplier].is_initialized
3503
+ hpxml.header.temperature_capacitance_multiplier = args[:simulation_control_temperature_capacitance_multiplier].get
3504
+ end
3505
+
3501
3506
  hpxml.header.building_id = 'MyBuilding'
3502
3507
  hpxml.header.event_type = 'proposed workscope'
3503
3508
 
@@ -3595,6 +3600,157 @@ class HPXMLFile
3595
3600
  end
3596
3601
  end
3597
3602
 
3603
+ if args[:utility_bill_scenario_names].is_initialized
3604
+ bills_scenario_names = args[:utility_bill_scenario_names].get.split(',').map(&:strip)
3605
+
3606
+ if args[:utility_bill_electricity_filepaths].is_initialized
3607
+ bills_electricity_filepaths = args[:utility_bill_electricity_filepaths].get.split(',').map(&:strip)
3608
+ else
3609
+ bills_electricity_filepaths = [nil] * bills_scenario_names.size
3610
+ end
3611
+
3612
+ fixed_charges = {}
3613
+ ([HPXML::FuelTypeElectricity] + Constants.FossilFuels).each do |fuel|
3614
+ underscore_case = OpenStudio::toUnderscoreCase(fuel)
3615
+
3616
+ if args["utility_bill_#{underscore_case}_fixed_charges".to_sym].is_initialized
3617
+ fixed_charges[fuel] = args["utility_bill_#{underscore_case}_fixed_charges".to_sym].get.split(',').map(&:strip)
3618
+ else
3619
+ fixed_charges[fuel] = [nil] * bills_scenario_names.size
3620
+ end
3621
+ end
3622
+
3623
+ marginal_rates = {}
3624
+ ([HPXML::FuelTypeElectricity] + Constants.FossilFuels).each do |fuel|
3625
+ underscore_case = OpenStudio::toUnderscoreCase(fuel)
3626
+
3627
+ if args["utility_bill_#{underscore_case}_marginal_rates".to_sym].is_initialized
3628
+ marginal_rates[fuel] = args["utility_bill_#{underscore_case}_marginal_rates".to_sym].get.split(',').map(&:strip)
3629
+ else
3630
+ marginal_rates[fuel] = [nil] * bills_scenario_names.size
3631
+ end
3632
+ end
3633
+
3634
+ if args[:utility_bill_pv_compensation_types].is_initialized
3635
+ bills_pv_compensation_types = args[:utility_bill_pv_compensation_types].get.split(',').map(&:strip)
3636
+ else
3637
+ bills_pv_compensation_types = [nil] * bills_scenario_names.size
3638
+ end
3639
+
3640
+ if args[:utility_bill_pv_net_metering_annual_excess_sellback_rate_types].is_initialized
3641
+ bills_pv_net_metering_annual_excess_sellback_rate_types = args[:utility_bill_pv_net_metering_annual_excess_sellback_rate_types].get.split(',').map(&:strip)
3642
+ else
3643
+ bills_pv_net_metering_annual_excess_sellback_rate_types = [nil] * bills_scenario_names.size
3644
+ end
3645
+
3646
+ if args[:utility_bill_pv_net_metering_annual_excess_sellback_rates].is_initialized
3647
+ bills_pv_net_metering_annual_excess_sellback_rates = args[:utility_bill_pv_net_metering_annual_excess_sellback_rates].get.split(',').map(&:strip)
3648
+ else
3649
+ bills_pv_net_metering_annual_excess_sellback_rates = [nil] * bills_scenario_names.size
3650
+ end
3651
+
3652
+ if args[:utility_bill_pv_feed_in_tariff_rates].is_initialized
3653
+ bills_pv_feed_in_tariff_rates = args[:utility_bill_pv_feed_in_tariff_rates].get.split(',').map(&:strip)
3654
+ else
3655
+ bills_pv_feed_in_tariff_rates = [nil] * bills_scenario_names.size
3656
+ end
3657
+
3658
+ if args[:utility_bill_pv_monthly_grid_connection_fee_units].is_initialized
3659
+ bills_pv_monthly_grid_connection_fee_units = args[:utility_bill_pv_monthly_grid_connection_fee_units].get.split(',').map(&:strip)
3660
+ else
3661
+ bills_pv_monthly_grid_connection_fee_units = [nil] * bills_scenario_names.size
3662
+ end
3663
+
3664
+ if args[:utility_bill_pv_monthly_grid_connection_fees].is_initialized
3665
+ bills_pv_monthly_grid_connection_fees = args[:utility_bill_pv_monthly_grid_connection_fees].get.split(',').map(&:strip)
3666
+ else
3667
+ bills_pv_monthly_grid_connection_fees = [nil] * bills_scenario_names.size
3668
+ end
3669
+
3670
+ bills_scenarios = bills_scenario_names.zip(bills_electricity_filepaths,
3671
+ fixed_charges[HPXML::FuelTypeElectricity],
3672
+ fixed_charges[HPXML::FuelTypeNaturalGas],
3673
+ fixed_charges[HPXML::FuelTypePropane],
3674
+ fixed_charges[HPXML::FuelTypeOil],
3675
+ fixed_charges[HPXML::FuelTypeCoal],
3676
+ fixed_charges[HPXML::FuelTypeWoodCord],
3677
+ fixed_charges[HPXML::FuelTypeWoodPellets],
3678
+ marginal_rates[HPXML::FuelTypeElectricity],
3679
+ marginal_rates[HPXML::FuelTypeNaturalGas],
3680
+ marginal_rates[HPXML::FuelTypePropane],
3681
+ marginal_rates[HPXML::FuelTypeOil],
3682
+ marginal_rates[HPXML::FuelTypeCoal],
3683
+ marginal_rates[HPXML::FuelTypeWoodCord],
3684
+ marginal_rates[HPXML::FuelTypeWoodPellets],
3685
+ bills_pv_compensation_types,
3686
+ bills_pv_net_metering_annual_excess_sellback_rate_types,
3687
+ bills_pv_net_metering_annual_excess_sellback_rates,
3688
+ bills_pv_feed_in_tariff_rates,
3689
+ bills_pv_monthly_grid_connection_fee_units,
3690
+ bills_pv_monthly_grid_connection_fees)
3691
+
3692
+ bills_scenarios.each do |bills_scenario|
3693
+ 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
3694
+ elec_tariff_filepath = (elec_tariff_filepath.to_s.include?('.') ? elec_tariff_filepath : nil)
3695
+ elec_fixed_charge = Float(elec_fixed_charge) rescue nil
3696
+ natural_gas_fixed_charge = Float(natural_gas_fixed_charge) rescue nil
3697
+ propane_fixed_charge = Float(propane_fixed_charge) rescue nil
3698
+ fuel_oil_fixed_charge = Float(fuel_oil_fixed_charge) rescue nil
3699
+ coal_fixed_charge = Float(coal_fixed_charge) rescue nil
3700
+ wood_fixed_charge = Float(wood_fixed_charge) rescue nil
3701
+ wood_pellets_fixed_charge = Float(wood_pellets_fixed_charge) rescue nil
3702
+ elec_marginal_rate = Float(elec_marginal_rate) rescue nil
3703
+ natural_gas_marginal_rate = Float(natural_gas_marginal_rate) rescue nil
3704
+ propane_marginal_rate = Float(propane_marginal_rate) rescue nil
3705
+ fuel_oil_marginal_rate = Float(fuel_oil_marginal_rate) rescue nil
3706
+ coal_marginal_rate = Float(coal_marginal_rate) rescue nil
3707
+ wood_marginal_rate = Float(wood_marginal_rate) rescue nil
3708
+ wood_pellets_marginal_rate = Float(wood_pellets_marginal_rate) rescue nil
3709
+
3710
+ if pv_compensation_type == HPXML::PVCompensationTypeNetMetering
3711
+ if pv_net_metering_annual_excess_sellback_rate_type == HPXML::PVAnnualExcessSellbackRateTypeUserSpecified
3712
+ pv_net_metering_annual_excess_sellback_rate = Float(pv_net_metering_annual_excess_sellback_rate) rescue nil
3713
+ else
3714
+ pv_net_metering_annual_excess_sellback_rate = nil
3715
+ end
3716
+ pv_feed_in_tariff_rate = nil
3717
+ elsif pv_compensation_type == HPXML::PVCompensationTypeFeedInTariff
3718
+ pv_feed_in_tariff_rate = Float(pv_feed_in_tariff_rate) rescue nil
3719
+ pv_net_metering_annual_excess_sellback_rate_type = nil
3720
+ pv_net_metering_annual_excess_sellback_rate = nil
3721
+ end
3722
+
3723
+ if pv_monthly_grid_connection_fee_unit == HPXML::UnitsDollarsPerkW
3724
+ pv_monthly_grid_connection_fee_dollars_per_kw = Float(pv_monthly_grid_connection_fee) rescue nil
3725
+ elsif pv_monthly_grid_connection_fee_unit == HPXML::UnitsDollars
3726
+ pv_monthly_grid_connection_fee_dollars = Float(pv_monthly_grid_connection_fee) rescue nil
3727
+ end
3728
+
3729
+ hpxml.header.utility_bill_scenarios.add(name: name,
3730
+ elec_tariff_filepath: elec_tariff_filepath,
3731
+ elec_fixed_charge: elec_fixed_charge,
3732
+ natural_gas_fixed_charge: natural_gas_fixed_charge,
3733
+ propane_fixed_charge: propane_fixed_charge,
3734
+ fuel_oil_fixed_charge: fuel_oil_fixed_charge,
3735
+ coal_fixed_charge: coal_fixed_charge,
3736
+ wood_fixed_charge: wood_fixed_charge,
3737
+ wood_pellets_fixed_charge: wood_pellets_fixed_charge,
3738
+ elec_marginal_rate: elec_marginal_rate,
3739
+ natural_gas_marginal_rate: natural_gas_marginal_rate,
3740
+ propane_marginal_rate: propane_marginal_rate,
3741
+ fuel_oil_marginal_rate: fuel_oil_marginal_rate,
3742
+ coal_marginal_rate: coal_marginal_rate,
3743
+ wood_marginal_rate: wood_marginal_rate,
3744
+ wood_pellets_marginal_rate: wood_pellets_marginal_rate,
3745
+ pv_compensation_type: pv_compensation_type,
3746
+ pv_net_metering_annual_excess_sellback_rate_type: pv_net_metering_annual_excess_sellback_rate_type,
3747
+ pv_net_metering_annual_excess_sellback_rate: pv_net_metering_annual_excess_sellback_rate,
3748
+ pv_feed_in_tariff_rate: pv_feed_in_tariff_rate,
3749
+ pv_monthly_grid_connection_fee_dollars_per_kw: pv_monthly_grid_connection_fee_dollars_per_kw,
3750
+ pv_monthly_grid_connection_fee_dollars: pv_monthly_grid_connection_fee_dollars)
3751
+ end
3752
+ end
3753
+
3598
3754
  if args[:additional_properties].is_initialized
3599
3755
  extension_properties = {}
3600
3756
  additional_properties = args[:additional_properties].get.split('|').map(&:strip)
@@ -3606,9 +3762,13 @@ class HPXMLFile
3606
3762
  end
3607
3763
  end
3608
3764
 
3609
- def self.set_site(hpxml, runner, args)
3610
- if args[:site_shielding_of_home] != Constants.Auto
3611
- shielding_of_home = args[:site_shielding_of_home]
3765
+ def self.set_site(hpxml, args)
3766
+ if args[:site_shielding_of_home].is_initialized
3767
+ hpxml.site.shielding_of_home = args[:site_shielding_of_home].get
3768
+ end
3769
+
3770
+ if args[:site_ground_conductivity].is_initialized
3771
+ hpxml.site.ground_conductivity = args[:site_ground_conductivity].get
3612
3772
  end
3613
3773
 
3614
3774
  if args[:site_type].is_initialized
@@ -3647,10 +3807,9 @@ class HPXMLFile
3647
3807
  end
3648
3808
 
3649
3809
  hpxml.site.azimuth_of_front_of_home = args[:geometry_unit_orientation]
3650
- hpxml.site.shielding_of_home = shielding_of_home
3651
3810
  end
3652
3811
 
3653
- def self.set_neighbor_buildings(hpxml, runner, args)
3812
+ def self.set_neighbor_buildings(hpxml, args)
3654
3813
  nbr_map = { Constants.FacadeFront => [args[:neighbor_front_distance], args[:neighbor_front_height]],
3655
3814
  Constants.FacadeBack => [args[:neighbor_back_distance], args[:neighbor_back_height]],
3656
3815
  Constants.FacadeLeft => [args[:neighbor_left_distance], args[:neighbor_left_height]],
@@ -3662,8 +3821,8 @@ class HPXMLFile
3662
3821
 
3663
3822
  azimuth = Geometry.get_azimuth_from_facade(facade: facade, orientation: args[:geometry_unit_orientation])
3664
3823
 
3665
- if (distance > 0) && (neighbor_height != Constants.Auto)
3666
- height = Float(neighbor_height)
3824
+ if (distance > 0) && neighbor_height.is_initialized
3825
+ height = neighbor_height.get
3667
3826
  end
3668
3827
 
3669
3828
  hpxml.neighbor_buildings.add(azimuth: azimuth,
@@ -3672,13 +3831,13 @@ class HPXMLFile
3672
3831
  end
3673
3832
  end
3674
3833
 
3675
- def self.set_building_occupancy(hpxml, runner, args)
3676
- if args[:geometry_unit_num_occupants] != Constants.Auto
3677
- hpxml.building_occupancy.number_of_residents = Float(args[:geometry_unit_num_occupants])
3834
+ def self.set_building_occupancy(hpxml, args)
3835
+ if args[:geometry_unit_num_occupants].is_initialized
3836
+ hpxml.building_occupancy.number_of_residents = args[:geometry_unit_num_occupants].get
3678
3837
  end
3679
3838
  end
3680
3839
 
3681
- def self.set_building_construction(hpxml, runner, args)
3840
+ def self.set_building_construction(hpxml, args)
3682
3841
  if args[:geometry_unit_type] == HPXML::ResidentialTypeApartment
3683
3842
  args[:geometry_unit_num_floors_above_grade] = 1
3684
3843
  end
@@ -3688,8 +3847,8 @@ class HPXMLFile
3688
3847
  number_of_conditioned_floors += 1
3689
3848
  end
3690
3849
 
3691
- if args[:geometry_unit_num_bathrooms] != Constants.Auto
3692
- number_of_bathrooms = Integer(args[:geometry_unit_num_bathrooms])
3850
+ if args[:geometry_unit_num_bathrooms].is_initialized
3851
+ number_of_bathrooms = args[:geometry_unit_num_bathrooms].get
3693
3852
  end
3694
3853
 
3695
3854
  conditioned_building_volume = args[:geometry_unit_cfa] * args[:geometry_average_ceiling_height]
@@ -3706,17 +3865,17 @@ class HPXMLFile
3706
3865
  if args[:year_built].is_initialized
3707
3866
  hpxml.building_construction.year_built = args[:year_built].get
3708
3867
  end
3709
- if args[:geometry_has_flue_or_chimney] != Constants.Auto
3710
- hpxml.building_construction.has_flue_or_chimney = args[:geometry_has_flue_or_chimney]
3868
+ if args[:geometry_has_flue_or_chimney].is_initialized
3869
+ hpxml.building_construction.has_flue_or_chimney = args[:geometry_has_flue_or_chimney].get
3711
3870
  end
3712
3871
  end
3713
3872
 
3714
- def self.set_climate_and_risk_zones(hpxml, runner, args, epw_file)
3873
+ def self.set_climate_and_risk_zones(hpxml, args)
3715
3874
  hpxml.climate_and_risk_zones.weather_station_id = 'WeatherStation'
3716
3875
 
3717
3876
  if args[:site_iecc_zone].is_initialized
3718
- hpxml.climate_and_risk_zones.iecc_zone = args[:site_iecc_zone].get
3719
- hpxml.climate_and_risk_zones.iecc_year = 2006
3877
+ hpxml.climate_and_risk_zones.climate_zone_ieccs.add(zone: args[:site_iecc_zone].get,
3878
+ year: 2006)
3720
3879
  end
3721
3880
 
3722
3881
  weather_station_name = File.basename(args[:weather_station_epw_filepath]).gsub('.epw', '')
@@ -3724,7 +3883,7 @@ class HPXMLFile
3724
3883
  hpxml.climate_and_risk_zones.weather_station_epw_filepath = args[:weather_station_epw_filepath]
3725
3884
  end
3726
3885
 
3727
- def self.set_air_infiltration_measurements(hpxml, runner, args)
3886
+ def self.set_air_infiltration_measurements(hpxml, args)
3728
3887
  if args[:air_leakage_units] == HPXML::UnitsACH
3729
3888
  house_pressure = args[:air_leakage_house_pressure]
3730
3889
  unit_of_measure = HPXML::UnitsACH
@@ -3744,7 +3903,7 @@ class HPXMLFile
3744
3903
  infiltration_volume: infiltration_volume)
3745
3904
  end
3746
3905
 
3747
- def self.set_roofs(hpxml, runner, model, args, sorted_surfaces)
3906
+ def self.set_roofs(hpxml, args, sorted_surfaces)
3748
3907
  args[:geometry_roof_pitch] *= 12.0
3749
3908
  if (args[:geometry_attic_type] == HPXML::AtticTypeFlatRoof) || (args[:geometry_attic_type] == HPXML::AtticTypeBelowApartment)
3750
3909
  args[:geometry_roof_pitch] = 0.0
@@ -3761,8 +3920,8 @@ class HPXMLFile
3761
3920
  roof_type = args[:roof_material_type].get
3762
3921
  end
3763
3922
 
3764
- if args[:roof_color] != Constants.Auto
3765
- roof_color = args[:roof_color]
3923
+ if args[:roof_color].is_initialized
3924
+ roof_color = args[:roof_color].get
3766
3925
  end
3767
3926
 
3768
3927
  radiant_barrier = args[:roof_radiant_barrier]
@@ -3790,7 +3949,7 @@ class HPXMLFile
3790
3949
  end
3791
3950
  end
3792
3951
 
3793
- def self.set_rim_joists(hpxml, runner, model, args, sorted_surfaces)
3952
+ def self.set_rim_joists(hpxml, model, args, sorted_surfaces)
3794
3953
  sorted_surfaces.each do |surface|
3795
3954
  next if surface.surfaceType != 'Wall'
3796
3955
  next unless ['Outdoors', 'Adiabatic'].include? surface.outsideBoundaryCondition
@@ -3822,8 +3981,8 @@ class HPXMLFile
3822
3981
  siding = args[:wall_siding_type].get
3823
3982
  end
3824
3983
 
3825
- if args[:wall_color] != Constants.Auto
3826
- color = args[:wall_color]
3984
+ if args[:wall_color].is_initialized
3985
+ color = args[:wall_color].get
3827
3986
  end
3828
3987
 
3829
3988
  if interior_adjacent_to == exterior_adjacent_to
@@ -3846,7 +4005,7 @@ class HPXMLFile
3846
4005
  end
3847
4006
  end
3848
4007
 
3849
- def self.set_walls(hpxml, runner, model, args, sorted_surfaces)
4008
+ def self.set_walls(hpxml, model, args, sorted_surfaces)
3850
4009
  sorted_surfaces.each do |surface|
3851
4010
  next if surface.surfaceType != 'Wall'
3852
4011
  next if Geometry.surface_is_rim_joist(surface, args[:geometry_rim_joist_height])
@@ -3890,8 +4049,8 @@ class HPXMLFile
3890
4049
  end
3891
4050
  end
3892
4051
 
3893
- if args[:wall_color] != Constants.Auto
3894
- color = args[:wall_color]
4052
+ if args[:wall_color].is_initialized
4053
+ color = args[:wall_color].get
3895
4054
  end
3896
4055
 
3897
4056
  azimuth = Geometry.get_surface_azimuth(surface: surface, orientation: args[:geometry_unit_orientation])
@@ -3924,7 +4083,7 @@ class HPXMLFile
3924
4083
  end
3925
4084
  end
3926
4085
 
3927
- def self.set_foundation_walls(hpxml, runner, model, args, sorted_surfaces)
4086
+ def self.set_foundation_walls(hpxml, model, args, sorted_surfaces)
3928
4087
  sorted_surfaces.each do |surface|
3929
4088
  next if surface.surfaceType != 'Wall'
3930
4089
  next unless ['Foundation', 'Adiabatic'].include? surface.outsideBoundaryCondition
@@ -3967,32 +4126,32 @@ class HPXMLFile
3967
4126
  elsif foundation_wall_insulation_location == 'interior'
3968
4127
  insulation_interior_r_value = args[:foundation_wall_insulation_r]
3969
4128
  if insulation_interior_r_value > 0
3970
- if args[:foundation_wall_insulation_distance_to_top] != Constants.Auto
3971
- insulation_interior_distance_to_top = Float(args[:foundation_wall_insulation_distance_to_top])
4129
+ if args[:foundation_wall_insulation_distance_to_top].is_initialized
4130
+ insulation_interior_distance_to_top = args[:foundation_wall_insulation_distance_to_top].get
3972
4131
  end
3973
- if args[:foundation_wall_insulation_distance_to_bottom] != Constants.Auto
3974
- insulation_interior_distance_to_bottom = Float(args[:foundation_wall_insulation_distance_to_bottom])
4132
+ if args[:foundation_wall_insulation_distance_to_bottom].is_initialized
4133
+ insulation_interior_distance_to_bottom = args[:foundation_wall_insulation_distance_to_bottom].get
3975
4134
  end
3976
4135
  end
3977
4136
  elsif foundation_wall_insulation_location == 'exterior'
3978
4137
  insulation_exterior_r_value = args[:foundation_wall_insulation_r]
3979
4138
  if insulation_exterior_r_value > 0
3980
- if args[:foundation_wall_insulation_distance_to_top] != Constants.Auto
3981
- insulation_exterior_distance_to_top = Float(args[:foundation_wall_insulation_distance_to_top])
4139
+ if args[:foundation_wall_insulation_distance_to_top].is_initialized
4140
+ insulation_exterior_distance_to_top = args[:foundation_wall_insulation_distance_to_top].get
3982
4141
  end
3983
- if args[:foundation_wall_insulation_distance_to_bottom] != Constants.Auto
3984
- insulation_exterior_distance_to_bottom = Float(args[:foundation_wall_insulation_distance_to_bottom])
4142
+ if args[:foundation_wall_insulation_distance_to_bottom].is_initialized
4143
+ insulation_exterior_distance_to_bottom = args[:foundation_wall_insulation_distance_to_bottom].get
3985
4144
  end
3986
4145
  end
3987
4146
  end
3988
4147
  end
3989
4148
 
3990
- if args[:foundation_wall_thickness] != Constants.Auto
3991
- thickness = Float(args[:foundation_wall_thickness])
4149
+ if args[:foundation_wall_thickness].is_initialized
4150
+ thickness = args[:foundation_wall_thickness].get
3992
4151
  end
3993
4152
 
3994
- if args[:foundation_wall_type] != Constants.Auto
3995
- type = args[:foundation_wall_type]
4153
+ if args[:foundation_wall_type].is_initialized
4154
+ type = args[:foundation_wall_type].get
3996
4155
  end
3997
4156
 
3998
4157
  azimuth = Geometry.get_surface_azimuth(surface: surface, orientation: args[:geometry_unit_orientation])
@@ -4017,7 +4176,7 @@ class HPXMLFile
4017
4176
  end
4018
4177
  end
4019
4178
 
4020
- def self.set_frame_floors(hpxml, runner, model, args, sorted_surfaces)
4179
+ def self.set_floors(hpxml, args, sorted_surfaces)
4021
4180
  if [HPXML::FoundationTypeBasementConditioned,
4022
4181
  HPXML::FoundationTypeCrawlspaceConditioned].include?(args[:geometry_foundation_type]) && (args[:floor_over_foundation_assembly_r] > 2.1)
4023
4182
  args[:floor_over_foundation_assembly_r] = 2.1 # Uninsulated
@@ -4040,9 +4199,9 @@ class HPXMLFile
4040
4199
  elsif surface.outsideBoundaryCondition == 'Adiabatic'
4041
4200
  exterior_adjacent_to = HPXML::LocationOtherHousingUnit
4042
4201
  if surface.surfaceType == 'Floor'
4043
- other_space_above_or_below = HPXML::FrameFloorOtherSpaceBelow
4202
+ floor_or_ceiling = HPXML::FloorOrCeilingFloor
4044
4203
  elsif surface.surfaceType == 'RoofCeiling'
4045
- other_space_above_or_below = HPXML::FrameFloorOtherSpaceAbove
4204
+ floor_or_ceiling = HPXML::FloorOrCeilingCeiling
4046
4205
  end
4047
4206
  end
4048
4207
 
@@ -4052,28 +4211,36 @@ class HPXMLFile
4052
4211
  HPXML::LocationBasementConditioned,
4053
4212
  HPXML::LocationCrawlspaceConditioned].include? exterior_adjacent_to
4054
4213
 
4055
- hpxml.frame_floors.add(id: "FrameFloor#{hpxml.frame_floors.size + 1}",
4056
- exterior_adjacent_to: exterior_adjacent_to,
4057
- interior_adjacent_to: interior_adjacent_to,
4058
- area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4059
- other_space_above_or_below: other_space_above_or_below)
4060
- @surface_ids[surface.name.to_s] = hpxml.frame_floors[-1].id
4214
+ hpxml.floors.add(id: "Floor#{hpxml.floors.size + 1}",
4215
+ exterior_adjacent_to: exterior_adjacent_to,
4216
+ interior_adjacent_to: interior_adjacent_to,
4217
+ floor_type: args[:floor_type],
4218
+ area: UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2'),
4219
+ floor_or_ceiling: floor_or_ceiling)
4220
+ if hpxml.floors[-1].floor_or_ceiling.nil?
4221
+ if hpxml.floors[-1].is_floor
4222
+ hpxml.floors[-1].floor_or_ceiling = HPXML::FloorOrCeilingFloor
4223
+ elsif hpxml.floors[-1].is_ceiling
4224
+ hpxml.floors[-1].floor_or_ceiling = HPXML::FloorOrCeilingCeiling
4225
+ end
4226
+ end
4227
+ @surface_ids[surface.name.to_s] = hpxml.floors[-1].id
4061
4228
 
4062
- if hpxml.frame_floors[-1].is_thermal_boundary
4229
+ if hpxml.floors[-1].is_thermal_boundary
4063
4230
  if [HPXML::LocationAtticUnvented, HPXML::LocationAtticVented].include? exterior_adjacent_to
4064
- hpxml.frame_floors[-1].insulation_assembly_r_value = args[:ceiling_assembly_r]
4231
+ hpxml.floors[-1].insulation_assembly_r_value = args[:ceiling_assembly_r]
4065
4232
  elsif [HPXML::LocationGarage].include? exterior_adjacent_to
4066
- hpxml.frame_floors[-1].insulation_assembly_r_value = args[:floor_over_garage_assembly_r]
4233
+ hpxml.floors[-1].insulation_assembly_r_value = args[:floor_over_garage_assembly_r]
4067
4234
  else
4068
- hpxml.frame_floors[-1].insulation_assembly_r_value = args[:floor_over_foundation_assembly_r]
4235
+ hpxml.floors[-1].insulation_assembly_r_value = args[:floor_over_foundation_assembly_r]
4069
4236
  end
4070
4237
  else
4071
- hpxml.frame_floors[-1].insulation_assembly_r_value = 2.1 # Uninsulated
4238
+ hpxml.floors[-1].insulation_assembly_r_value = 2.1 # Uninsulated
4072
4239
  end
4073
4240
  end
4074
4241
  end
4075
4242
 
4076
- def self.set_slabs(hpxml, runner, model, args, sorted_surfaces)
4243
+ def self.set_slabs(hpxml, model, args, sorted_surfaces)
4077
4244
  sorted_surfaces.each do |surface|
4078
4245
  next unless ['Foundation'].include? surface.outsideBoundaryCondition
4079
4246
  next if surface.surfaceType != 'Floor'
@@ -4110,16 +4277,16 @@ class HPXMLFile
4110
4277
  under_slab_insulation_width = args[:slab_under_width]
4111
4278
  end
4112
4279
 
4113
- if args[:slab_thickness] != Constants.Auto
4114
- thickness = Float(args[:slab_thickness])
4280
+ if args[:slab_thickness].is_initialized
4281
+ thickness = args[:slab_thickness].get
4115
4282
  end
4116
4283
 
4117
- if args[:slab_carpet_fraction] != Constants.Auto
4118
- carpet_fraction = Float(args[:slab_carpet_fraction])
4284
+ if args[:slab_carpet_fraction].is_initialized
4285
+ carpet_fraction = args[:slab_carpet_fraction].get
4119
4286
  end
4120
4287
 
4121
- if args[:slab_carpet_r] != Constants.Auto
4122
- carpet_r_value = Float(args[:slab_carpet_r])
4288
+ if args[:slab_carpet_r].is_initialized
4289
+ carpet_r_value = args[:slab_carpet_r].get
4123
4290
  end
4124
4291
 
4125
4292
  hpxml.slabs.add(id: "Slab#{hpxml.slabs.size + 1}",
@@ -4146,7 +4313,7 @@ class HPXMLFile
4146
4313
  end
4147
4314
  end
4148
4315
 
4149
- def self.set_windows(hpxml, runner, model, args, sorted_subsurfaces)
4316
+ def self.set_windows(hpxml, model, args, sorted_subsurfaces)
4150
4317
  sorted_subsurfaces.each do |sub_surface|
4151
4318
  next if sub_surface.subSurfaceType != 'FixedWindow'
4152
4319
 
@@ -4236,7 +4403,7 @@ class HPXMLFile
4236
4403
  end
4237
4404
  end
4238
4405
 
4239
- def self.set_skylights(hpxml, runner, model, args, sorted_subsurfaces)
4406
+ def self.set_skylights(hpxml, args, sorted_subsurfaces)
4240
4407
  sorted_subsurfaces.each do |sub_surface|
4241
4408
  next if sub_surface.subSurfaceType != 'Skylight'
4242
4409
 
@@ -4262,7 +4429,7 @@ class HPXMLFile
4262
4429
  end
4263
4430
  end
4264
4431
 
4265
- def self.set_doors(hpxml, runner, model, args, sorted_subsurfaces)
4432
+ def self.set_doors(hpxml, model, args, sorted_subsurfaces)
4266
4433
  sorted_subsurfaces.each do |sub_surface|
4267
4434
  next if sub_surface.subSurfaceType != 'Door'
4268
4435
 
@@ -4270,14 +4437,11 @@ class HPXMLFile
4270
4437
 
4271
4438
  interior_adjacent_to = Geometry.get_adjacent_to(surface: surface)
4272
4439
 
4273
- adjacent_surface = surface
4274
4440
  if [HPXML::LocationOtherHousingUnit].include?(interior_adjacent_to)
4275
4441
  adjacent_surface = Geometry.get_adiabatic_adjacent_surface(model: model, surface: surface)
4276
4442
  next if adjacent_surface.nil?
4277
4443
  end
4278
4444
 
4279
- sub_surface_facade = Geometry.get_facade_for_surface(sub_surface)
4280
-
4281
4445
  wall_idref = @surface_ids[surface.name.to_s]
4282
4446
  next if wall_idref.nil?
4283
4447
 
@@ -4289,13 +4453,13 @@ class HPXMLFile
4289
4453
  end
4290
4454
  end
4291
4455
 
4292
- def self.set_attics(hpxml, runner, model, args)
4456
+ def self.set_attics(hpxml, args)
4293
4457
  surf_ids = { 'roofs' => { 'surfaces' => hpxml.roofs, 'ids' => [] },
4294
4458
  'walls' => { 'surfaces' => hpxml.walls, 'ids' => [] },
4295
- 'frame_floors' => { 'surfaces' => hpxml.frame_floors, 'ids' => [] } }
4459
+ 'floors' => { 'surfaces' => hpxml.floors, 'ids' => [] } }
4296
4460
 
4297
4461
  attic_locations = [HPXML::LocationAtticUnconditioned, HPXML::LocationAtticUnvented, HPXML::LocationAtticVented]
4298
- surf_ids.each do |surf_type, surf_hash|
4462
+ surf_ids.values.each do |surf_hash|
4299
4463
  surf_hash['surfaces'].each do |surface|
4300
4464
  next if (not attic_locations.include? surface.interior_adjacent_to) &&
4301
4465
  (not attic_locations.include? surface.exterior_adjacent_to)
@@ -4317,12 +4481,12 @@ class HPXMLFile
4317
4481
  attic_type: args[:geometry_attic_type],
4318
4482
  attached_to_roof_idrefs: surf_ids['roofs']['ids'],
4319
4483
  attached_to_wall_idrefs: surf_ids['walls']['ids'],
4320
- attached_to_frame_floor_idrefs: surf_ids['frame_floors']['ids'])
4484
+ attached_to_floor_idrefs: surf_ids['floors']['ids'])
4321
4485
  end
4322
4486
 
4323
- def self.set_foundations(hpxml, runner, model, args)
4487
+ def self.set_foundations(hpxml, args)
4324
4488
  surf_ids = { 'slabs' => { 'surfaces' => hpxml.slabs, 'ids' => [] },
4325
- 'frame_floors' => { 'surfaces' => hpxml.frame_floors, 'ids' => [] },
4489
+ 'floors' => { 'surfaces' => hpxml.floors, 'ids' => [] },
4326
4490
  'foundation_walls' => { 'surfaces' => hpxml.foundation_walls, 'ids' => [] },
4327
4491
  'walls' => { 'surfaces' => hpxml.walls, 'ids' => [] },
4328
4492
  'rim_joists' => { 'surfaces' => hpxml.rim_joists, 'ids' => [] }, }
@@ -4338,7 +4502,7 @@ class HPXMLFile
4338
4502
  next unless (foundation_locations.include? surface.interior_adjacent_to) ||
4339
4503
  (foundation_locations.include? surface.exterior_adjacent_to) ||
4340
4504
  (surf_type == 'slabs' && surface.interior_adjacent_to == HPXML::LocationLivingSpace) ||
4341
- (surf_type == 'frame_floors' && surface.exterior_adjacent_to == HPXML::LocationOutside)
4505
+ (surf_type == 'floors' && surface.exterior_adjacent_to == HPXML::LocationOutside)
4342
4506
 
4343
4507
  surf_hash['ids'] << surface.id
4344
4508
  end
@@ -4347,22 +4511,22 @@ class HPXMLFile
4347
4511
  hpxml.foundations.add(id: "Foundation#{hpxml.foundations.size + 1}",
4348
4512
  foundation_type: args[:geometry_foundation_type],
4349
4513
  attached_to_slab_idrefs: surf_ids['slabs']['ids'],
4350
- attached_to_frame_floor_idrefs: surf_ids['frame_floors']['ids'],
4514
+ attached_to_floor_idrefs: surf_ids['floors']['ids'],
4351
4515
  attached_to_foundation_wall_idrefs: surf_ids['foundation_walls']['ids'],
4352
4516
  attached_to_wall_idrefs: surf_ids['walls']['ids'],
4353
4517
  attached_to_rim_joist_idrefs: surf_ids['rim_joists']['ids'])
4354
4518
  end
4355
4519
 
4356
- def self.set_heating_systems(hpxml, runner, args)
4520
+ def self.set_heating_systems(hpxml, args)
4357
4521
  heating_system_type = args[:heating_system_type]
4358
4522
 
4359
4523
  return if heating_system_type == 'none'
4360
4524
 
4361
- if args[:heating_system_heating_capacity] != Constants.Auto
4362
- heating_capacity = Float(args[:heating_system_heating_capacity])
4525
+ if args[:heating_system_heating_capacity].is_initialized
4526
+ heating_capacity = args[:heating_system_heating_capacity].get
4363
4527
  end
4364
4528
 
4365
- if [HPXML::HVACTypeElectricResistance, HPXML::HVACTypePTACHeating].include? heating_system_type
4529
+ if [HPXML::HVACTypeElectricResistance].include? heating_system_type
4366
4530
  heating_system_fuel = HPXML::FuelTypeElectricity
4367
4531
  else
4368
4532
  heating_system_fuel = args[:heating_system_fuel]
@@ -4376,8 +4540,7 @@ class HPXMLFile
4376
4540
  HPXML::HVACTypeStove,
4377
4541
  HPXML::HVACTypePortableHeater,
4378
4542
  HPXML::HVACTypeFireplace,
4379
- HPXML::HVACTypeFixedHeater,
4380
- HPXML::HVACTypePTACHeating].include?(heating_system_type)
4543
+ HPXML::HVACTypeFixedHeater].include?(heating_system_type)
4381
4544
  heating_efficiency_percent = args[:heating_system_heating_efficiency]
4382
4545
  end
4383
4546
 
@@ -4412,13 +4575,13 @@ class HPXMLFile
4412
4575
  primary_system: true)
4413
4576
  end
4414
4577
 
4415
- def self.set_cooling_systems(hpxml, runner, args)
4578
+ def self.set_cooling_systems(hpxml, args)
4416
4579
  cooling_system_type = args[:cooling_system_type]
4417
4580
 
4418
4581
  return if cooling_system_type == 'none'
4419
4582
 
4420
- if args[:cooling_system_cooling_capacity] != Constants.Auto
4421
- cooling_capacity = Float(args[:cooling_system_cooling_capacity])
4583
+ if args[:cooling_system_cooling_capacity].is_initialized
4584
+ cooling_capacity = args[:cooling_system_cooling_capacity].get
4422
4585
  end
4423
4586
 
4424
4587
  if args[:cooling_system_cooling_compressor_type].is_initialized
@@ -4436,6 +4599,8 @@ class HPXMLFile
4436
4599
  if cooling_system_type != HPXML::HVACTypeEvaporativeCooler
4437
4600
  if args[:cooling_system_cooling_efficiency_type] == HPXML::UnitsSEER
4438
4601
  cooling_efficiency_seer = args[:cooling_system_cooling_efficiency]
4602
+ elsif args[:cooling_system_cooling_efficiency_type] == HPXML::UnitsSEER2
4603
+ cooling_efficiency_seer2 = args[:cooling_system_cooling_efficiency]
4439
4604
  elsif args[:cooling_system_cooling_efficiency_type] == HPXML::UnitsEER
4440
4605
  cooling_efficiency_eer = args[:cooling_system_cooling_efficiency]
4441
4606
  elsif args[:cooling_system_cooling_efficiency_type] == HPXML::UnitsCEER
@@ -4455,6 +4620,24 @@ class HPXMLFile
4455
4620
  end
4456
4621
  end
4457
4622
 
4623
+ if [HPXML::HVACTypePTAC, HPXML::HVACTypeRoomAirConditioner].include?(cooling_system_type)
4624
+ if args[:cooling_system_integrated_heating_system_fuel].is_initialized
4625
+ integrated_heating_system_fuel = args[:cooling_system_integrated_heating_system_fuel].get
4626
+ end
4627
+
4628
+ if args[:cooling_system_integrated_heating_system_fraction_heat_load_served].is_initialized
4629
+ integrated_heating_system_fraction_heat_load_served = args[:cooling_system_integrated_heating_system_fraction_heat_load_served].get
4630
+ end
4631
+
4632
+ if args[:cooling_system_integrated_heating_system_capacity].is_initialized
4633
+ integrated_heating_system_capacity = args[:cooling_system_integrated_heating_system_capacity].get
4634
+ end
4635
+
4636
+ if args[:cooling_system_integrated_heating_system_efficiency_percent].is_initialized
4637
+ integrated_heating_system_efficiency_percent = args[:cooling_system_integrated_heating_system_efficiency_percent].get
4638
+ end
4639
+ end
4640
+
4458
4641
  hpxml.cooling_systems.add(id: "CoolingSystem#{hpxml.cooling_systems.size + 1}",
4459
4642
  cooling_system_type: cooling_system_type,
4460
4643
  cooling_system_fuel: HPXML::FuelTypeElectricity,
@@ -4463,31 +4646,30 @@ class HPXMLFile
4463
4646
  compressor_type: compressor_type,
4464
4647
  cooling_shr: cooling_shr,
4465
4648
  cooling_efficiency_seer: cooling_efficiency_seer,
4649
+ cooling_efficiency_seer2: cooling_efficiency_seer2,
4466
4650
  cooling_efficiency_eer: cooling_efficiency_eer,
4467
4651
  cooling_efficiency_ceer: cooling_efficiency_ceer,
4468
4652
  airflow_defect_ratio: airflow_defect_ratio,
4469
4653
  charge_defect_ratio: charge_defect_ratio,
4470
- primary_system: true)
4654
+ primary_system: true,
4655
+ integrated_heating_system_fuel: integrated_heating_system_fuel,
4656
+ integrated_heating_system_capacity: integrated_heating_system_capacity,
4657
+ integrated_heating_system_efficiency_percent: integrated_heating_system_efficiency_percent,
4658
+ integrated_heating_system_fraction_heat_load_served: integrated_heating_system_fraction_heat_load_served)
4471
4659
  end
4472
4660
 
4473
- def self.set_heat_pumps(hpxml, runner, args)
4661
+ def self.set_heat_pumps(hpxml, args)
4474
4662
  heat_pump_type = args[:heat_pump_type]
4475
4663
 
4476
4664
  return if heat_pump_type == 'none'
4477
4665
 
4478
- if args[:heat_pump_heating_capacity] == Constants.Auto
4479
- hpxml.header.heat_pump_sizing_methodology = HPXML::HeatPumpSizingACCA
4480
- elsif args[:heat_pump_heating_capacity] == Constants.AutoHERSForHP
4481
- hpxml.header.heat_pump_sizing_methodology = HPXML::HeatPumpSizingHERS
4482
- elsif args[:heat_pump_heating_capacity] == Constants.AutoMaxLoadForHP
4483
- hpxml.header.heat_pump_sizing_methodology = HPXML::HeatPumpSizingMaxLoad
4484
- else
4485
- heating_capacity = Float(args[:heat_pump_heating_capacity])
4666
+ if args[:heat_pump_heating_capacity].is_initialized
4667
+ heating_capacity = args[:heat_pump_heating_capacity].get
4486
4668
  end
4487
4669
 
4488
4670
  if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit].include? heat_pump_type
4489
- if args[:heat_pump_heating_capacity_17_f] != Constants.Auto
4490
- heating_capacity_17F = Float(args[:heat_pump_heating_capacity_17_f])
4671
+ if args[:heat_pump_heating_capacity_17_f].is_initialized
4672
+ heating_capacity_17F = args[:heat_pump_heating_capacity_17_f].get
4491
4673
  end
4492
4674
  end
4493
4675
 
@@ -4495,8 +4677,8 @@ class HPXMLFile
4495
4677
  backup_type = args[:heat_pump_backup_type]
4496
4678
  backup_heating_fuel = args[:heat_pump_backup_fuel]
4497
4679
 
4498
- if args[:heat_pump_backup_heating_capacity] != Constants.Auto
4499
- backup_heating_capacity = Float(args[:heat_pump_backup_heating_capacity])
4680
+ if args[:heat_pump_backup_heating_capacity].is_initialized
4681
+ backup_heating_capacity = args[:heat_pump_backup_heating_capacity].get
4500
4682
  end
4501
4683
 
4502
4684
  if backup_heating_fuel == HPXML::FuelTypeElectricity
@@ -4527,8 +4709,8 @@ class HPXMLFile
4527
4709
  end
4528
4710
  end
4529
4711
 
4530
- if args[:heat_pump_cooling_capacity] != Constants.Auto
4531
- cooling_capacity = Float(args[:heat_pump_cooling_capacity])
4712
+ if args[:heat_pump_cooling_capacity].is_initialized
4713
+ cooling_capacity = args[:heat_pump_cooling_capacity].get
4532
4714
  end
4533
4715
 
4534
4716
  if args[:heat_pump_cooling_compressor_type].is_initialized
@@ -4543,12 +4725,16 @@ class HPXMLFile
4543
4725
 
4544
4726
  if args[:heat_pump_heating_efficiency_type] == HPXML::UnitsHSPF
4545
4727
  heating_efficiency_hspf = args[:heat_pump_heating_efficiency]
4728
+ elsif args[:heat_pump_heating_efficiency_type] == HPXML::UnitsHSPF2
4729
+ heating_efficiency_hspf2 = args[:heat_pump_heating_efficiency]
4546
4730
  elsif args[:heat_pump_heating_efficiency_type] == HPXML::UnitsCOP
4547
4731
  heating_efficiency_cop = args[:heat_pump_heating_efficiency]
4548
4732
  end
4549
4733
 
4550
4734
  if args[:heat_pump_cooling_efficiency_type] == HPXML::UnitsSEER
4551
4735
  cooling_efficiency_seer = args[:heat_pump_cooling_efficiency]
4736
+ elsif args[:heat_pump_cooling_efficiency_type] == HPXML::UnitsSEER2
4737
+ cooling_efficiency_seer2 = args[:heat_pump_cooling_efficiency]
4552
4738
  elsif args[:heat_pump_cooling_efficiency_type] == HPXML::UnitsEER
4553
4739
  cooling_efficiency_eer = args[:heat_pump_cooling_efficiency]
4554
4740
  end
@@ -4574,6 +4760,10 @@ class HPXMLFile
4574
4760
  primary_cooling_system = true
4575
4761
  end
4576
4762
 
4763
+ if args[:heat_pump_sizing_methodology].is_initialized
4764
+ hpxml.header.heat_pump_sizing_methodology = args[:heat_pump_sizing_methodology].get
4765
+ end
4766
+
4577
4767
  hpxml.heat_pumps.add(id: "HeatPump#{hpxml.heat_pumps.size + 1}",
4578
4768
  heat_pump_type: heat_pump_type,
4579
4769
  heat_pump_fuel: HPXML::FuelTypeElectricity,
@@ -4593,7 +4783,9 @@ class HPXMLFile
4593
4783
  backup_heating_switchover_temp: backup_heating_switchover_temp,
4594
4784
  backup_heating_lockout_temp: backup_heating_lockout_temp,
4595
4785
  heating_efficiency_hspf: heating_efficiency_hspf,
4786
+ heating_efficiency_hspf2: heating_efficiency_hspf2,
4596
4787
  cooling_efficiency_seer: cooling_efficiency_seer,
4788
+ cooling_efficiency_seer2: cooling_efficiency_seer2,
4597
4789
  heating_efficiency_cop: heating_efficiency_cop,
4598
4790
  cooling_efficiency_eer: cooling_efficiency_eer,
4599
4791
  airflow_defect_ratio: airflow_defect_ratio,
@@ -4602,14 +4794,14 @@ class HPXMLFile
4602
4794
  primary_cooling_system: primary_cooling_system)
4603
4795
  end
4604
4796
 
4605
- def self.set_secondary_heating_systems(hpxml, runner, args)
4797
+ def self.set_secondary_heating_systems(hpxml, args)
4606
4798
  heating_system_type = args[:heating_system_2_type]
4607
4799
  heating_system_is_heatpump_backup = (args[:heat_pump_type] != 'none' && args[:heat_pump_backup_type] == HPXML::HeatPumpBackupTypeSeparate)
4608
4800
 
4609
4801
  return if heating_system_type == 'none' && (not heating_system_is_heatpump_backup)
4610
4802
 
4611
- if args[:heating_system_2_heating_capacity] != Constants.Auto
4612
- heating_capacity = Float(args[:heating_system_2_heating_capacity])
4803
+ if args[:heating_system_2_heating_capacity].is_initialized
4804
+ heating_capacity = args[:heating_system_2_heating_capacity].get
4613
4805
  end
4614
4806
 
4615
4807
  if args[:heating_system_2_fuel] == HPXML::HVACTypeElectricResistance
@@ -4641,7 +4833,7 @@ class HPXMLFile
4641
4833
  heating_efficiency_percent: heating_efficiency_percent)
4642
4834
  end
4643
4835
 
4644
- def self.set_hvac_distribution(hpxml, runner, args)
4836
+ def self.set_hvac_distribution(hpxml, args)
4645
4837
  # HydronicDistribution?
4646
4838
  hpxml.heating_systems.each do |heating_system|
4647
4839
  next unless [heating_system.heating_system_type].include?(HPXML::HVACTypeBoiler)
@@ -4688,9 +4880,7 @@ class HPXMLFile
4688
4880
  return if air_distribution_systems.size == 0 && fan_coil_distribution_systems.size == 0
4689
4881
 
4690
4882
  if args[:ducts_number_of_return_registers].is_initialized
4691
- if args[:ducts_number_of_return_registers].get != Constants.Auto
4692
- number_of_return_registers = Integer(args[:ducts_number_of_return_registers].get)
4693
- end
4883
+ number_of_return_registers = args[:ducts_number_of_return_registers].get
4694
4884
  end
4695
4885
 
4696
4886
  if [HPXML::HVACTypeEvaporativeCooler].include?(args[:cooling_system_type]) && hpxml.heating_systems.size == 0 && hpxml.heat_pumps.size == 0
@@ -4735,29 +4925,31 @@ class HPXMLFile
4735
4925
  end
4736
4926
 
4737
4927
  def self.set_ducts(args, hvac_distribution)
4738
- if args[:ducts_supply_location] != Constants.Auto
4739
- ducts_supply_location = args[:ducts_supply_location]
4928
+ if args[:ducts_supply_location].is_initialized
4929
+ ducts_supply_location = args[:ducts_supply_location].get
4740
4930
  end
4741
4931
 
4742
- if args[:ducts_return_location] != Constants.Auto
4743
- ducts_return_location = args[:ducts_return_location]
4932
+ if args[:ducts_return_location].is_initialized
4933
+ ducts_return_location = args[:ducts_return_location].get
4744
4934
  end
4745
4935
 
4746
- if args[:ducts_supply_surface_area] != Constants.Auto
4747
- ducts_supply_surface_area = Float(args[:ducts_supply_surface_area])
4936
+ if args[:ducts_supply_surface_area].is_initialized
4937
+ ducts_supply_surface_area = args[:ducts_supply_surface_area].get
4748
4938
  end
4749
4939
 
4750
- if args[:ducts_return_surface_area] != Constants.Auto
4751
- ducts_return_surface_area = Float(args[:ducts_return_surface_area])
4940
+ if args[:ducts_return_surface_area].is_initialized
4941
+ ducts_return_surface_area = args[:ducts_return_surface_area].get
4752
4942
  end
4753
4943
 
4754
- hvac_distribution.ducts.add(duct_type: HPXML::DuctTypeSupply,
4944
+ hvac_distribution.ducts.add(id: "Ducts#{hvac_distribution.ducts.size + 1}",
4945
+ duct_type: HPXML::DuctTypeSupply,
4755
4946
  duct_insulation_r_value: args[:ducts_supply_insulation_r],
4756
4947
  duct_location: ducts_supply_location,
4757
4948
  duct_surface_area: ducts_supply_surface_area)
4758
4949
 
4759
4950
  if not ([HPXML::HVACTypeEvaporativeCooler].include?(args[:cooling_system_type]) && args[:cooling_system_is_ducted])
4760
- hvac_distribution.ducts.add(duct_type: HPXML::DuctTypeReturn,
4951
+ hvac_distribution.ducts.add(id: "Ducts#{hvac_distribution.ducts.size + 1}",
4952
+ duct_type: HPXML::DuctTypeReturn,
4761
4953
  duct_insulation_r_value: args[:ducts_return_insulation_r],
4762
4954
  duct_location: ducts_return_location,
4763
4955
  duct_surface_area: ducts_return_surface_area)
@@ -4769,27 +4961,30 @@ class HPXMLFile
4769
4961
  end
4770
4962
  end
4771
4963
 
4772
- def self.set_hvac_control(hpxml, runner, args)
4964
+ def self.set_hvac_control(hpxml, args, epw_file, weather)
4773
4965
  return if (args[:heating_system_type] == 'none') && (args[:cooling_system_type] == 'none') && (args[:heat_pump_type] == 'none')
4774
4966
 
4775
4967
  # Heating
4776
4968
  if hpxml.total_fraction_heat_load_served > 0
4777
4969
 
4778
- if args[:hvac_control_heating_weekday_setpoint] == args[:hvac_control_heating_weekend_setpoint] && !args[:hvac_control_heating_weekday_setpoint].include?(',')
4779
- if args[:hvac_control_heating_weekday_setpoint] != Constants.Auto
4780
- heating_setpoint_temp = args[:hvac_control_heating_weekday_setpoint]
4781
- end
4782
- else
4783
- if args[:hvac_control_heating_weekday_setpoint] != Constants.Auto
4784
- weekday_heating_setpoints = args[:hvac_control_heating_weekday_setpoint]
4785
- end
4786
- if args[:hvac_control_heating_weekend_setpoint] != Constants.Auto
4787
- weekend_heating_setpoints = args[:hvac_control_heating_weekend_setpoint]
4970
+ if args[:hvac_control_heating_weekday_setpoint].is_initialized && args[:hvac_control_heating_weekend_setpoint].is_initialized
4971
+ if args[:hvac_control_heating_weekday_setpoint].get == args[:hvac_control_heating_weekend_setpoint].get && !args[:hvac_control_heating_weekday_setpoint].get.include?(',')
4972
+ heating_setpoint_temp = Float(args[:hvac_control_heating_weekday_setpoint].get)
4973
+ else
4974
+ weekday_heating_setpoints = args[:hvac_control_heating_weekday_setpoint].get
4975
+ weekend_heating_setpoints = args[:hvac_control_heating_weekend_setpoint].get
4788
4976
  end
4789
4977
  end
4790
4978
 
4791
4979
  if args[:hvac_control_heating_season_period].is_initialized
4792
- begin_month, begin_day, end_month, end_day = Schedule.parse_date_range(args[:hvac_control_heating_season_period].get)
4980
+ hvac_control_heating_season_period = args[:hvac_control_heating_season_period].get
4981
+ if hvac_control_heating_season_period == HPXML::BuildingAmerica
4982
+ heating_months, _cooling_months = HVAC.get_default_heating_and_cooling_seasons(weather)
4983
+ sim_calendar_year = Location.get_sim_calendar_year(hpxml.header.sim_calendar_year, epw_file)
4984
+ begin_month, begin_day, end_month, end_day = Schedule.get_begin_and_end_dates_from_monthly_array(heating_months, sim_calendar_year)
4985
+ else
4986
+ begin_month, begin_day, end_month, end_day = Schedule.parse_date_range(hvac_control_heating_season_period)
4987
+ end
4793
4988
  seasons_heating_begin_month = begin_month
4794
4989
  seasons_heating_begin_day = begin_day
4795
4990
  seasons_heating_end_month = end_month
@@ -4801,29 +4996,28 @@ class HPXMLFile
4801
4996
  # Cooling
4802
4997
  if hpxml.total_fraction_cool_load_served > 0
4803
4998
 
4804
- if args[:hvac_control_cooling_weekday_setpoint] == args[:hvac_control_cooling_weekend_setpoint] && !args[:hvac_control_cooling_weekday_setpoint].include?(',')
4805
- if args[:hvac_control_cooling_weekday_setpoint] != Constants.Auto
4806
- cooling_setpoint_temp = args[:hvac_control_cooling_weekday_setpoint]
4807
- end
4808
- else
4809
- if args[:hvac_control_cooling_weekday_setpoint] != Constants.Auto
4810
- weekday_cooling_setpoints = args[:hvac_control_cooling_weekday_setpoint]
4811
- end
4812
- if args[:hvac_control_cooling_weekend_setpoint] != Constants.Auto
4813
- weekend_cooling_setpoints = args[:hvac_control_cooling_weekend_setpoint]
4999
+ if args[:hvac_control_cooling_weekday_setpoint].is_initialized && args[:hvac_control_cooling_weekend_setpoint].is_initialized
5000
+ if args[:hvac_control_cooling_weekday_setpoint].get == args[:hvac_control_cooling_weekend_setpoint].get && !args[:hvac_control_cooling_weekday_setpoint].get.include?(',')
5001
+ cooling_setpoint_temp = Float(args[:hvac_control_cooling_weekday_setpoint].get)
5002
+ else
5003
+ weekday_cooling_setpoints = args[:hvac_control_cooling_weekday_setpoint].get
5004
+ weekend_cooling_setpoints = args[:hvac_control_cooling_weekend_setpoint].get
4814
5005
  end
4815
5006
  end
4816
5007
 
4817
- if args[:ceiling_fan_quantity] != Constants.Auto
4818
- ceiling_fan_quantity = Integer(args[:ceiling_fan_quantity])
4819
- end
4820
-
4821
- if (args[:ceiling_fan_cooling_setpoint_temp_offset] > 0) && (ceiling_fan_quantity.nil? || ceiling_fan_quantity > 0)
4822
- ceiling_fan_cooling_setpoint_temp_offset = args[:ceiling_fan_cooling_setpoint_temp_offset]
5008
+ if args[:ceiling_fan_cooling_setpoint_temp_offset].is_initialized
5009
+ ceiling_fan_cooling_setpoint_temp_offset = args[:ceiling_fan_cooling_setpoint_temp_offset].get
4823
5010
  end
4824
5011
 
4825
5012
  if args[:hvac_control_cooling_season_period].is_initialized
4826
- begin_month, begin_day, end_month, end_day = Schedule.parse_date_range(args[:hvac_control_cooling_season_period].get)
5013
+ hvac_control_cooling_season_period = args[:hvac_control_cooling_season_period].get
5014
+ if hvac_control_cooling_season_period == HPXML::BuildingAmerica
5015
+ _heating_months, cooling_months = HVAC.get_default_heating_and_cooling_seasons(weather)
5016
+ sim_calendar_year = Location.get_sim_calendar_year(hpxml.header.sim_calendar_year, epw_file)
5017
+ begin_month, begin_day, end_month, end_day = Schedule.get_begin_and_end_dates_from_monthly_array(cooling_months, sim_calendar_year)
5018
+ else
5019
+ begin_month, begin_day, end_month, end_day = Schedule.parse_date_range(args[:hvac_control_cooling_season_period].get)
5020
+ end
4827
5021
  seasons_cooling_begin_month = begin_month
4828
5022
  seasons_cooling_begin_day = begin_day
4829
5023
  seasons_cooling_end_month = end_month
@@ -4850,7 +5044,7 @@ class HPXMLFile
4850
5044
  seasons_cooling_end_day: seasons_cooling_end_day)
4851
5045
  end
4852
5046
 
4853
- def self.set_ventilation_fans(hpxml, runner, args)
5047
+ def self.set_ventilation_fans(hpxml, args)
4854
5048
  if args[:mech_vent_fan_type] != 'none'
4855
5049
 
4856
5050
  if [HPXML::MechVentTypeERV].include?(args[:mech_vent_fan_type])
@@ -4877,11 +5071,12 @@ class HPXMLFile
4877
5071
 
4878
5072
  distribution_system_idref = hvac_distribution.id
4879
5073
  end
5074
+ cfis_addtl_runtime_operating_mode = HPXML::CFISModeAirHandler
4880
5075
  end
4881
5076
 
4882
5077
  if args[:mech_vent_num_units_served] > 1
4883
5078
  is_shared_system = true
4884
- in_unit_flow_rate = Float(args[:mech_vent_flow_rate]) / args[:mech_vent_num_units_served].to_f
5079
+ in_unit_flow_rate = args[:mech_vent_flow_rate].get / args[:mech_vent_num_units_served].to_f
4885
5080
  fraction_recirculation = args[:mech_vent_shared_frac_recirculation].get
4886
5081
  if args[:mech_vent_shared_preheating_fuel].is_initialized && args[:mech_vent_shared_preheating_efficiency].is_initialized && args[:mech_vent_shared_preheating_fraction_heat_load_served].is_initialized
4887
5082
  preheating_fuel = args[:mech_vent_shared_preheating_fuel].get
@@ -4895,20 +5090,21 @@ class HPXMLFile
4895
5090
  end
4896
5091
  end
4897
5092
 
4898
- if args[:mech_vent_hours_in_operation] != Constants.Auto
4899
- hours_in_operation = Float(args[:mech_vent_hours_in_operation])
5093
+ if args[:mech_vent_hours_in_operation].is_initialized
5094
+ hours_in_operation = args[:mech_vent_hours_in_operation].get
4900
5095
  end
4901
5096
 
4902
- if args[:mech_vent_fan_power] != Constants.Auto
4903
- fan_power = Float(args[:mech_vent_fan_power])
5097
+ if args[:mech_vent_fan_power].is_initialized
5098
+ fan_power = args[:mech_vent_fan_power].get
4904
5099
  end
4905
5100
 
4906
- if args[:mech_vent_flow_rate] != Constants.Auto
4907
- rated_flow_rate = Float(args[:mech_vent_flow_rate])
5101
+ if args[:mech_vent_flow_rate].is_initialized
5102
+ rated_flow_rate = args[:mech_vent_flow_rate].get
4908
5103
  end
4909
5104
 
4910
5105
  hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
4911
5106
  fan_type: args[:mech_vent_fan_type],
5107
+ cfis_addtl_runtime_operating_mode: cfis_addtl_runtime_operating_mode,
4912
5108
  rated_flow_rate: rated_flow_rate,
4913
5109
  hours_in_operation: hours_in_operation,
4914
5110
  used_for_whole_building_ventilation: true,
@@ -4948,13 +5144,8 @@ class HPXMLFile
4948
5144
  end
4949
5145
  end
4950
5146
 
4951
- if args[:mech_vent_2_hours_in_operation] != Constants.Auto
4952
- hours_in_operation = Float(args[:mech_vent_2_hours_in_operation])
4953
- end
4954
-
4955
- if args[:mech_vent_2_fan_power] != Constants.Auto
4956
- fan_power = Float(args[:mech_vent_2_fan_power])
4957
- end
5147
+ hours_in_operation = args[:mech_vent_2_hours_in_operation]
5148
+ fan_power = args[:mech_vent_2_fan_power]
4958
5149
 
4959
5150
  hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
4960
5151
  fan_type: args[:mech_vent_2_fan_type],
@@ -4968,33 +5159,25 @@ class HPXMLFile
4968
5159
  fan_power: fan_power)
4969
5160
  end
4970
5161
 
4971
- if (args[:kitchen_fans_quantity] == Constants.Auto) || (args[:kitchen_fans_quantity].to_i > 0)
5162
+ if !args[:kitchen_fans_quantity].is_initialized || (args[:kitchen_fans_quantity].get > 0)
4972
5163
  if args[:kitchen_fans_flow_rate].is_initialized
4973
- if args[:kitchen_fans_flow_rate].get != Constants.Auto
4974
- rated_flow_rate = Float(args[:kitchen_fans_flow_rate].get)
4975
- end
5164
+ rated_flow_rate = args[:kitchen_fans_flow_rate].get
4976
5165
  end
4977
5166
 
4978
5167
  if args[:kitchen_fans_power].is_initialized
4979
- if args[:kitchen_fans_power].get != Constants.Auto
4980
- fan_power = Float(args[:kitchen_fans_power].get)
4981
- end
5168
+ fan_power = args[:kitchen_fans_power].get
4982
5169
  end
4983
5170
 
4984
5171
  if args[:kitchen_fans_hours_in_operation].is_initialized
4985
- if args[:kitchen_fans_hours_in_operation].get != Constants.Auto
4986
- hours_in_operation = Float(args[:kitchen_fans_hours_in_operation].get)
4987
- end
5172
+ hours_in_operation = args[:kitchen_fans_hours_in_operation].get
4988
5173
  end
4989
5174
 
4990
5175
  if args[:kitchen_fans_start_hour].is_initialized
4991
- if args[:kitchen_fans_start_hour].get != Constants.Auto
4992
- start_hour = Integer(args[:kitchen_fans_start_hour].get)
4993
- end
5176
+ start_hour = args[:kitchen_fans_start_hour].get
4994
5177
  end
4995
5178
 
4996
- if args[:kitchen_fans_quantity] != Constants.Auto
4997
- quantity = Integer(args[:kitchen_fans_quantity])
5179
+ if args[:kitchen_fans_quantity].is_initialized
5180
+ quantity = args[:kitchen_fans_quantity].get
4998
5181
  end
4999
5182
 
5000
5183
  hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
@@ -5007,33 +5190,25 @@ class HPXMLFile
5007
5190
  quantity: quantity)
5008
5191
  end
5009
5192
 
5010
- if (args[:bathroom_fans_quantity] == Constants.Auto) || (args[:bathroom_fans_quantity].to_i > 0)
5193
+ if !args[:bathroom_fans_quantity].is_initialized || (args[:bathroom_fans_quantity].get > 0)
5011
5194
  if args[:bathroom_fans_flow_rate].is_initialized
5012
- if args[:bathroom_fans_flow_rate].get != Constants.Auto
5013
- rated_flow_rate = Float(args[:bathroom_fans_flow_rate].get)
5014
- end
5195
+ rated_flow_rate = args[:bathroom_fans_flow_rate].get
5015
5196
  end
5016
5197
 
5017
5198
  if args[:bathroom_fans_power].is_initialized
5018
- if args[:bathroom_fans_power].get != Constants.Auto
5019
- fan_power = Float(args[:bathroom_fans_power].get)
5020
- end
5199
+ fan_power = args[:bathroom_fans_power].get
5021
5200
  end
5022
5201
 
5023
5202
  if args[:bathroom_fans_hours_in_operation].is_initialized
5024
- if args[:bathroom_fans_hours_in_operation].get != Constants.Auto
5025
- hours_in_operation = Float(args[:bathroom_fans_hours_in_operation].get)
5026
- end
5203
+ hours_in_operation = args[:bathroom_fans_hours_in_operation].get
5027
5204
  end
5028
5205
 
5029
5206
  if args[:bathroom_fans_start_hour].is_initialized
5030
- if args[:bathroom_fans_start_hour].get != Constants.Auto
5031
- start_hour = Integer(args[:bathroom_fans_start_hour].get)
5032
- end
5207
+ start_hour = args[:bathroom_fans_start_hour].get
5033
5208
  end
5034
5209
 
5035
- if args[:bathroom_fans_quantity] != Constants.Auto
5036
- quantity = Integer(args[:bathroom_fans_quantity])
5210
+ if args[:bathroom_fans_quantity].is_initialized
5211
+ quantity = args[:bathroom_fans_quantity].get
5037
5212
  end
5038
5213
 
5039
5214
  hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
@@ -5048,15 +5223,11 @@ class HPXMLFile
5048
5223
 
5049
5224
  if args[:whole_house_fan_present]
5050
5225
  if args[:whole_house_fan_flow_rate].is_initialized
5051
- if args[:whole_house_fan_flow_rate].get != Constants.Auto
5052
- rated_flow_rate = Float(args[:whole_house_fan_flow_rate].get)
5053
- end
5226
+ rated_flow_rate = args[:whole_house_fan_flow_rate].get
5054
5227
  end
5055
5228
 
5056
5229
  if args[:whole_house_fan_power].is_initialized
5057
- if args[:whole_house_fan_power].get != Constants.Auto
5058
- fan_power = Float(args[:whole_house_fan_power].get)
5059
- end
5230
+ fan_power = args[:whole_house_fan_power].get
5060
5231
  end
5061
5232
 
5062
5233
  hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
@@ -5066,7 +5237,7 @@ class HPXMLFile
5066
5237
  end
5067
5238
  end
5068
5239
 
5069
- def self.set_water_heating_systems(hpxml, runner, args)
5240
+ def self.set_water_heating_systems(hpxml, args)
5070
5241
  water_heater_type = args[:water_heater_type]
5071
5242
  return if water_heater_type == 'none'
5072
5243
 
@@ -5076,16 +5247,16 @@ class HPXMLFile
5076
5247
  fuel_type = HPXML::FuelTypeElectricity
5077
5248
  end
5078
5249
 
5079
- if args[:water_heater_location] != Constants.Auto
5080
- location = args[:water_heater_location]
5250
+ if args[:water_heater_location].is_initialized
5251
+ location = args[:water_heater_location].get
5081
5252
  end
5082
5253
 
5083
- if args[:water_heater_tank_volume] != Constants.Auto
5084
- tank_volume = Float(args[:water_heater_tank_volume])
5254
+ if args[:water_heater_tank_volume].is_initialized
5255
+ tank_volume = args[:water_heater_tank_volume].get
5085
5256
  end
5086
5257
 
5087
- if args[:water_heater_setpoint_temperature] != Constants.Auto
5088
- temperature = Float(args[:water_heater_setpoint_temperature])
5258
+ if args[:water_heater_setpoint_temperature].is_initialized
5259
+ temperature = args[:water_heater_setpoint_temperature].get
5089
5260
  end
5090
5261
 
5091
5262
  if not [HPXML::WaterHeaterTypeCombiStorage, HPXML::WaterHeaterTypeCombiTankless].include? water_heater_type
@@ -5100,8 +5271,8 @@ class HPXMLFile
5100
5271
  end
5101
5272
 
5102
5273
  if (fuel_type != HPXML::FuelTypeElectricity) && (water_heater_type == HPXML::WaterHeaterTypeStorage)
5103
- if args[:water_heater_recovery_efficiency] != Constants.Auto
5104
- recovery_efficiency = Float(args[:water_heater_recovery_efficiency])
5274
+ if args[:water_heater_recovery_efficiency].is_initialized
5275
+ recovery_efficiency = args[:water_heater_recovery_efficiency].get
5105
5276
  end
5106
5277
  end
5107
5278
 
@@ -5124,7 +5295,8 @@ class HPXMLFile
5124
5295
  if [HPXML::WaterHeaterTypeCombiTankless, HPXML::WaterHeaterTypeCombiStorage].include? water_heater_type
5125
5296
  if args[:water_heater_standby_loss].is_initialized
5126
5297
  if args[:water_heater_standby_loss].get > 0
5127
- standby_loss = args[:water_heater_standby_loss].get
5298
+ standby_loss_units = HPXML::UnitsDegFPerHour
5299
+ standby_loss_value = args[:water_heater_standby_loss].get
5128
5300
  end
5129
5301
  end
5130
5302
  end
@@ -5162,8 +5334,8 @@ class HPXMLFile
5162
5334
  end
5163
5335
 
5164
5336
  if [HPXML::WaterHeaterTypeStorage].include? water_heater_type
5165
- if args[:water_heater_heating_capacity] != Constants.Auto
5166
- heating_capacity = Float(args[:water_heater_heating_capacity])
5337
+ if args[:water_heater_heating_capacity].is_initialized
5338
+ heating_capacity = args[:water_heater_heating_capacity].get
5167
5339
  end
5168
5340
 
5169
5341
  if args[:water_heater_tank_model_type].is_initialized
@@ -5187,7 +5359,8 @@ class HPXMLFile
5187
5359
  recovery_efficiency: recovery_efficiency,
5188
5360
  uses_desuperheater: uses_desuperheater,
5189
5361
  related_hvac_idref: related_hvac_idref,
5190
- standby_loss: standby_loss,
5362
+ standby_loss_units: standby_loss_units,
5363
+ standby_loss_value: standby_loss_value,
5191
5364
  jacket_r_value: jacket_r_value,
5192
5365
  temperature: temperature,
5193
5366
  heating_capacity: heating_capacity,
@@ -5197,7 +5370,7 @@ class HPXMLFile
5197
5370
  operating_mode: operating_mode)
5198
5371
  end
5199
5372
 
5200
- def self.set_hot_water_distribution(hpxml, runner, args)
5373
+ def self.set_hot_water_distribution(hpxml, args)
5201
5374
  return if args[:water_heater_type] == 'none'
5202
5375
 
5203
5376
  if args[:dwhr_facilities_connected] != 'none'
@@ -5207,27 +5380,27 @@ class HPXMLFile
5207
5380
  end
5208
5381
 
5209
5382
  if args[:hot_water_distribution_system_type] == HPXML::DHWDistTypeStandard
5210
- if args[:hot_water_distribution_standard_piping_length] != Constants.Auto
5211
- standard_piping_length = Float(args[:hot_water_distribution_standard_piping_length])
5383
+ if args[:hot_water_distribution_standard_piping_length].is_initialized
5384
+ standard_piping_length = args[:hot_water_distribution_standard_piping_length].get
5212
5385
  end
5213
5386
  else
5214
5387
  recirculation_control_type = args[:hot_water_distribution_recirc_control_type]
5215
5388
 
5216
- if args[:hot_water_distribution_recirc_piping_length] != Constants.Auto
5217
- recirculation_piping_length = Float(args[:hot_water_distribution_recirc_piping_length])
5389
+ if args[:hot_water_distribution_recirc_piping_length].is_initialized
5390
+ recirculation_piping_length = args[:hot_water_distribution_recirc_piping_length].get
5218
5391
  end
5219
5392
 
5220
- if args[:hot_water_distribution_recirc_branch_piping_length] != Constants.Auto
5221
- recirculation_branch_piping_length = Float(args[:hot_water_distribution_recirc_branch_piping_length])
5393
+ if args[:hot_water_distribution_recirc_branch_piping_length].is_initialized
5394
+ recirculation_branch_piping_length = args[:hot_water_distribution_recirc_branch_piping_length].get
5222
5395
  end
5223
5396
 
5224
- if args[:hot_water_distribution_recirc_pump_power] != Constants.Auto
5225
- recirculation_pump_power = Float(args[:hot_water_distribution_recirc_pump_power])
5397
+ if args[:hot_water_distribution_recirc_pump_power].is_initialized
5398
+ recirculation_pump_power = args[:hot_water_distribution_recirc_pump_power].get
5226
5399
  end
5227
5400
  end
5228
5401
 
5229
- if args[:hot_water_distribution_pipe_r] != Constants.Auto
5230
- pipe_r_value = Float(args[:hot_water_distribution_pipe_r])
5402
+ if args[:hot_water_distribution_pipe_r].is_initialized
5403
+ pipe_r_value = args[:hot_water_distribution_pipe_r].get
5231
5404
  end
5232
5405
 
5233
5406
  hpxml.hot_water_distributions.add(id: "HotWaterDistribution#{hpxml.hot_water_distributions.size + 1}",
@@ -5243,7 +5416,7 @@ class HPXMLFile
5243
5416
  dwhr_efficiency: dwhr_efficiency)
5244
5417
  end
5245
5418
 
5246
- def self.set_water_fixtures(hpxml, runer, args)
5419
+ def self.set_water_fixtures(hpxml, args)
5247
5420
  return if args[:water_heater_type] == 'none'
5248
5421
 
5249
5422
  hpxml.water_fixtures.add(id: "WaterFixture#{hpxml.water_fixtures.size + 1}",
@@ -5254,12 +5427,12 @@ class HPXMLFile
5254
5427
  water_fixture_type: HPXML::WaterFixtureTypeFaucet,
5255
5428
  low_flow: args[:water_fixtures_sink_low_flow])
5256
5429
 
5257
- if args[:water_fixtures_usage_multiplier] != 1.0
5258
- hpxml.water_heating.water_fixtures_usage_multiplier = args[:water_fixtures_usage_multiplier]
5430
+ if args[:water_fixtures_usage_multiplier].is_initialized
5431
+ hpxml.water_heating.water_fixtures_usage_multiplier = args[:water_fixtures_usage_multiplier].get
5259
5432
  end
5260
5433
  end
5261
5434
 
5262
- def self.set_solar_thermal(hpxml, runner, args, epw_file)
5435
+ def self.set_solar_thermal(hpxml, args, epw_file)
5263
5436
  return if args[:solar_thermal_system_type] == 'none'
5264
5437
 
5265
5438
  if args[:solar_thermal_solar_fraction] > 0
@@ -5273,8 +5446,8 @@ class HPXMLFile
5273
5446
  collector_frta = args[:solar_thermal_collector_rated_optical_efficiency]
5274
5447
  collector_frul = args[:solar_thermal_collector_rated_thermal_losses]
5275
5448
 
5276
- if args[:solar_thermal_storage_volume] != Constants.Auto
5277
- storage_volume = Float(args[:solar_thermal_storage_volume])
5449
+ if args[:solar_thermal_storage_volume].is_initialized
5450
+ storage_volume = args[:solar_thermal_storage_volume].get
5278
5451
  end
5279
5452
  end
5280
5453
 
@@ -5296,20 +5469,20 @@ class HPXMLFile
5296
5469
  solar_fraction: solar_fraction)
5297
5470
  end
5298
5471
 
5299
- def self.set_pv_systems(hpxml, runner, args, epw_file)
5300
- [args[:pv_system_module_type], args[:pv_system_2_module_type]].each_with_index do |pv_system_module_type, i|
5301
- next if pv_system_module_type == 'none'
5472
+ def self.set_pv_systems(hpxml, args, epw_file)
5473
+ [args[:pv_system_present], args[:pv_system_2_present]].each_with_index do |pv_system_present, i|
5474
+ next unless pv_system_present
5302
5475
 
5303
- if [args[:pv_system_module_type], args[:pv_system_2_module_type]][i] != Constants.Auto
5304
- module_type = [args[:pv_system_module_type], args[:pv_system_2_module_type]][i]
5476
+ if [args[:pv_system_module_type], args[:pv_system_2_module_type]][i].is_initialized
5477
+ module_type = [args[:pv_system_module_type], args[:pv_system_2_module_type]][i].get
5305
5478
  end
5306
5479
 
5307
- if [args[:pv_system_location], args[:pv_system_2_location]][i] != Constants.Auto
5308
- location = [args[:pv_system_location], args[:pv_system_2_location]][i]
5480
+ if [args[:pv_system_location], args[:pv_system_2_location]][i].is_initialized
5481
+ location = [args[:pv_system_location], args[:pv_system_2_location]][i].get
5309
5482
  end
5310
5483
 
5311
- if [args[:pv_system_tracking], args[:pv_system_2_tracking]][i] != Constants.Auto
5312
- tracking = [args[:pv_system_tracking], args[:pv_system_2_tracking]][i]
5484
+ if [args[:pv_system_tracking], args[:pv_system_2_tracking]][i].is_initialized
5485
+ tracking = [args[:pv_system_tracking], args[:pv_system_2_tracking]][i].get
5313
5486
  end
5314
5487
 
5315
5488
  max_power_output = [args[:pv_system_max_power_output], args[:pv_system_2_max_power_output]][i]
@@ -5323,9 +5496,9 @@ class HPXMLFile
5323
5496
  end
5324
5497
 
5325
5498
  if [HPXML::ResidentialTypeSFA, HPXML::ResidentialTypeApartment].include? args[:geometry_unit_type]
5326
- if args[:pv_system_num_bedrooms_served] > args[:geometry_unit_num_bedrooms]
5499
+ if args[:pv_system_num_bedrooms_served].get > args[:geometry_unit_num_bedrooms]
5327
5500
  is_shared_system = true
5328
- number_of_bedrooms_served = args[:pv_system_num_bedrooms_served]
5501
+ number_of_bedrooms_served = args[:pv_system_num_bedrooms_served].get
5329
5502
  end
5330
5503
  end
5331
5504
 
@@ -5343,25 +5516,27 @@ class HPXMLFile
5343
5516
  end
5344
5517
  end
5345
5518
 
5346
- def self.set_battery(hpxml, runner, args)
5347
- return if args[:battery_location] == 'none'
5519
+ def self.set_battery(hpxml, args)
5520
+ return unless args[:battery_present]
5348
5521
 
5349
- if args[:battery_location] != Constants.Auto
5350
- location = args[:battery_location]
5522
+ if args[:battery_location].is_initialized
5523
+ location = args[:battery_location].get
5351
5524
  end
5352
5525
 
5353
- if args[:battery_power] != Constants.Auto
5354
- rated_power_output = Float(args[:battery_power])
5526
+ if args[:battery_power].is_initialized
5527
+ rated_power_output = args[:battery_power].get
5355
5528
  end
5356
5529
 
5357
- if args[:battery_capacity] != Constants.Auto
5358
- nominal_capacity_kwh = Float(args[:battery_capacity])
5530
+ if args[:battery_capacity].is_initialized
5531
+ nominal_capacity_kwh = args[:battery_capacity].get
5359
5532
  end
5360
5533
 
5361
5534
  if args[:battery_usable_capacity].is_initialized
5362
- if args[:battery_usable_capacity].get != Constants.Auto
5363
- usable_capacity_kwh = Float(args[:battery_usable_capacity].get)
5364
- end
5535
+ usable_capacity_kwh = args[:battery_usable_capacity].get
5536
+ end
5537
+
5538
+ if args[:battery_round_trip_efficiency].is_initialized
5539
+ round_trip_efficiency = args[:battery_round_trip_efficiency].get
5365
5540
  end
5366
5541
 
5367
5542
  hpxml.batteries.add(id: "Battery#{hpxml.batteries.size + 1}",
@@ -5369,11 +5544,12 @@ class HPXMLFile
5369
5544
  location: location,
5370
5545
  rated_power_output: rated_power_output,
5371
5546
  nominal_capacity_kwh: nominal_capacity_kwh,
5372
- usable_capacity_kwh: usable_capacity_kwh)
5547
+ usable_capacity_kwh: usable_capacity_kwh,
5548
+ round_trip_efficiency: round_trip_efficiency)
5373
5549
  end
5374
5550
 
5375
- def self.set_lighting(hpxml, runner, args)
5376
- return if args[:lighting_present].is_initialized && (not args[:lighting_present].get)
5551
+ def self.set_lighting(hpxml, args)
5552
+ return unless args[:lighting_present] || args[:ceiling_fan_present] # If ceiling fans present but not lighting present, need to continue and use lighting multipliers = 0 instead
5377
5553
 
5378
5554
  hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5379
5555
  location: HPXML::LocationInterior,
@@ -5412,24 +5588,30 @@ class HPXMLFile
5412
5588
  fraction_of_units_in_location: args[:lighting_garage_fraction_led],
5413
5589
  lighting_type: HPXML::LightingTypeLED)
5414
5590
 
5415
- if args[:lighting_interior_usage_multiplier] != 1.0
5416
- hpxml.lighting.interior_usage_multiplier = args[:lighting_interior_usage_multiplier]
5417
- end
5591
+ if args[:lighting_present]
5592
+ if args[:lighting_interior_usage_multiplier].is_initialized
5593
+ hpxml.lighting.interior_usage_multiplier = args[:lighting_interior_usage_multiplier].get
5594
+ end
5418
5595
 
5419
- if args[:lighting_exterior_usage_multiplier] != 1.0
5420
- hpxml.lighting.exterior_usage_multiplier = args[:lighting_exterior_usage_multiplier]
5421
- end
5596
+ if args[:lighting_exterior_usage_multiplier].is_initialized
5597
+ hpxml.lighting.exterior_usage_multiplier = args[:lighting_exterior_usage_multiplier].get
5598
+ end
5422
5599
 
5423
- if args[:lighting_garage_usage_multiplier] != 1.0
5424
- hpxml.lighting.garage_usage_multiplier = args[:lighting_garage_usage_multiplier]
5600
+ if args[:lighting_garage_usage_multiplier].is_initialized
5601
+ hpxml.lighting.garage_usage_multiplier = args[:lighting_garage_usage_multiplier].get
5602
+ end
5603
+ elsif args[:ceiling_fan_present]
5604
+ hpxml.lighting.interior_usage_multiplier = 0.0
5605
+ hpxml.lighting.exterior_usage_multiplier = 0.0
5606
+ hpxml.lighting.garage_usage_multiplier = 0.0
5425
5607
  end
5426
5608
 
5427
5609
  return unless args[:holiday_lighting_present]
5428
5610
 
5429
5611
  hpxml.lighting.holiday_exists = true
5430
5612
 
5431
- if args[:holiday_lighting_daily_kwh] != Constants.Auto
5432
- hpxml.lighting.holiday_kwh_per_day = Float(args[:holiday_lighting_daily_kwh])
5613
+ if args[:holiday_lighting_daily_kwh].is_initialized
5614
+ hpxml.lighting.holiday_kwh_per_day = args[:holiday_lighting_daily_kwh].get
5433
5615
  end
5434
5616
 
5435
5617
  if args[:holiday_lighting_period].is_initialized
@@ -5441,7 +5623,7 @@ class HPXMLFile
5441
5623
  end
5442
5624
  end
5443
5625
 
5444
- def self.set_dehumidifier(hpxml, runner, args)
5626
+ def self.set_dehumidifier(hpxml, args)
5445
5627
  return if args[:dehumidifier_type] == 'none'
5446
5628
 
5447
5629
  if args[:dehumidifier_efficiency_type] == 'EnergyFactor'
@@ -5460,52 +5642,48 @@ class HPXMLFile
5460
5642
  location: HPXML::LocationLivingSpace)
5461
5643
  end
5462
5644
 
5463
- def self.set_clothes_washer(hpxml, runner, args)
5464
- if args[:water_heater_type] == 'none'
5465
- args[:clothes_washer_location] = 'none'
5466
- end
5467
-
5468
- return if args[:clothes_washer_location] == 'none'
5645
+ def self.set_clothes_washer(hpxml, args)
5646
+ return if args[:water_heater_type] == 'none'
5647
+ return unless args[:clothes_washer_present]
5469
5648
 
5470
- if args[:clothes_washer_rated_annual_kwh] != Constants.Auto
5471
- rated_annual_kwh = Float(args[:clothes_washer_rated_annual_kwh])
5472
- return if Float(rated_annual_kwh) == 0
5649
+ if args[:clothes_washer_rated_annual_kwh].is_initialized
5650
+ rated_annual_kwh = args[:clothes_washer_rated_annual_kwh].get
5473
5651
  end
5474
5652
 
5475
- if args[:clothes_washer_location] != Constants.Auto
5476
- location = args[:clothes_washer_location]
5653
+ if args[:clothes_washer_location].is_initialized
5654
+ location = args[:clothes_washer_location].get
5477
5655
  end
5478
5656
 
5479
- if args[:clothes_washer_efficiency] != Constants.Auto
5657
+ if args[:clothes_washer_efficiency].is_initialized
5480
5658
  if args[:clothes_washer_efficiency_type] == 'ModifiedEnergyFactor'
5481
- modified_energy_factor = Float(args[:clothes_washer_efficiency])
5659
+ modified_energy_factor = args[:clothes_washer_efficiency].get
5482
5660
  elsif args[:clothes_washer_efficiency_type] == 'IntegratedModifiedEnergyFactor'
5483
- integrated_modified_energy_factor = Float(args[:clothes_washer_efficiency])
5661
+ integrated_modified_energy_factor = args[:clothes_washer_efficiency].get
5484
5662
  end
5485
5663
  end
5486
5664
 
5487
- if args[:clothes_washer_label_electric_rate] != Constants.Auto
5488
- label_electric_rate = Float(args[:clothes_washer_label_electric_rate])
5665
+ if args[:clothes_washer_label_electric_rate].is_initialized
5666
+ label_electric_rate = args[:clothes_washer_label_electric_rate].get
5489
5667
  end
5490
5668
 
5491
- if args[:clothes_washer_label_gas_rate] != Constants.Auto
5492
- label_gas_rate = Float(args[:clothes_washer_label_gas_rate])
5669
+ if args[:clothes_washer_label_gas_rate].is_initialized
5670
+ label_gas_rate = args[:clothes_washer_label_gas_rate].get
5493
5671
  end
5494
5672
 
5495
- if args[:clothes_washer_label_annual_gas_cost] != Constants.Auto
5496
- label_annual_gas_cost = Float(args[:clothes_washer_label_annual_gas_cost])
5673
+ if args[:clothes_washer_label_annual_gas_cost].is_initialized
5674
+ label_annual_gas_cost = args[:clothes_washer_label_annual_gas_cost].get
5497
5675
  end
5498
5676
 
5499
- if args[:clothes_washer_label_usage] != Constants.Auto
5500
- label_usage = Float(args[:clothes_washer_label_usage])
5677
+ if args[:clothes_washer_label_usage].is_initialized
5678
+ label_usage = args[:clothes_washer_label_usage].get
5501
5679
  end
5502
5680
 
5503
- if args[:clothes_washer_capacity] != Constants.Auto
5504
- capacity = Float(args[:clothes_washer_capacity])
5681
+ if args[:clothes_washer_capacity].is_initialized
5682
+ capacity = args[:clothes_washer_capacity].get
5505
5683
  end
5506
5684
 
5507
- if args[:clothes_washer_usage_multiplier] != 1.0
5508
- usage_multiplier = Float(args[:clothes_washer_usage_multiplier])
5685
+ if args[:clothes_washer_usage_multiplier].is_initialized
5686
+ usage_multiplier = args[:clothes_washer_usage_multiplier].get
5509
5687
  end
5510
5688
 
5511
5689
  hpxml.clothes_washers.add(id: "ClothesWasher#{hpxml.clothes_washers.size + 1}",
@@ -5521,32 +5699,33 @@ class HPXMLFile
5521
5699
  usage_multiplier: usage_multiplier)
5522
5700
  end
5523
5701
 
5524
- def self.set_clothes_dryer(hpxml, runner, args)
5525
- return if args[:clothes_washer_location] == 'none'
5526
- return if args[:clothes_dryer_location] == 'none'
5702
+ def self.set_clothes_dryer(hpxml, args)
5703
+ return if args[:water_heater_type] == 'none'
5704
+ return unless args[:clothes_washer_present]
5705
+ return unless args[:clothes_dryer_present]
5527
5706
 
5528
- if args[:clothes_dryer_efficiency] != Constants.Auto
5707
+ if args[:clothes_dryer_efficiency].is_initialized
5529
5708
  if args[:clothes_dryer_efficiency_type] == 'EnergyFactor'
5530
- energy_factor = Float(args[:clothes_dryer_efficiency])
5709
+ energy_factor = args[:clothes_dryer_efficiency].get
5531
5710
  elsif args[:clothes_dryer_efficiency_type] == 'CombinedEnergyFactor'
5532
- combined_energy_factor = Float(args[:clothes_dryer_efficiency])
5711
+ combined_energy_factor = args[:clothes_dryer_efficiency].get
5533
5712
  end
5534
5713
  end
5535
5714
 
5536
- if args[:clothes_dryer_location] != Constants.Auto
5537
- location = args[:clothes_dryer_location]
5715
+ if args[:clothes_dryer_location].is_initialized
5716
+ location = args[:clothes_dryer_location].get
5538
5717
  end
5539
5718
 
5540
- if args[:clothes_dryer_vented_flow_rate] != Constants.Auto
5719
+ if args[:clothes_dryer_vented_flow_rate].is_initialized
5541
5720
  is_vented = false
5542
- if Float(args[:clothes_dryer_vented_flow_rate]) > 0
5721
+ if args[:clothes_dryer_vented_flow_rate].get > 0
5543
5722
  is_vented = true
5544
- vented_flow_rate = Float(args[:clothes_dryer_vented_flow_rate])
5723
+ vented_flow_rate = args[:clothes_dryer_vented_flow_rate].get
5545
5724
  end
5546
5725
  end
5547
5726
 
5548
- if args[:clothes_dryer_usage_multiplier] != 1.0
5549
- usage_multiplier = args[:clothes_dryer_usage_multiplier]
5727
+ if args[:clothes_dryer_usage_multiplier].is_initialized
5728
+ usage_multiplier = args[:clothes_dryer_usage_multiplier].get
5550
5729
  end
5551
5730
 
5552
5731
  hpxml.clothes_dryers.add(id: "ClothesDryer#{hpxml.clothes_dryers.size + 1}",
@@ -5559,44 +5738,46 @@ class HPXMLFile
5559
5738
  usage_multiplier: usage_multiplier)
5560
5739
  end
5561
5740
 
5562
- def self.set_dishwasher(hpxml, runner, args)
5563
- return if args[:dishwasher_location] == 'none'
5741
+ def self.set_dishwasher(hpxml, args)
5742
+ return if args[:water_heater_type] == 'none'
5743
+ return unless args[:dishwasher_present]
5564
5744
 
5565
- if args[:dishwasher_location] != Constants.Auto
5566
- location = args[:dishwasher_location]
5745
+ if args[:dishwasher_location].is_initialized
5746
+ location = args[:dishwasher_location].get
5567
5747
  end
5568
5748
 
5569
5749
  if args[:dishwasher_efficiency_type] == 'RatedAnnualkWh'
5570
- if args[:dishwasher_efficiency] != Constants.Auto
5571
- rated_annual_kwh = Float(args[:dishwasher_efficiency])
5572
- return if Float(rated_annual_kwh) == 0
5750
+ if args[:dishwasher_efficiency].is_initialized
5751
+ rated_annual_kwh = args[:dishwasher_efficiency].get
5573
5752
  end
5574
5753
  elsif args[:dishwasher_efficiency_type] == 'EnergyFactor'
5575
- energy_factor = Float(args[:dishwasher_efficiency])
5754
+ if args[:dishwasher_efficiency].is_initialized
5755
+ energy_factor = args[:dishwasher_efficiency].get
5756
+ end
5576
5757
  end
5577
5758
 
5578
- if args[:dishwasher_label_electric_rate] != Constants.Auto
5579
- label_electric_rate = Float(args[:dishwasher_label_electric_rate])
5759
+ if args[:dishwasher_label_electric_rate].is_initialized
5760
+ label_electric_rate = args[:dishwasher_label_electric_rate].get
5580
5761
  end
5581
5762
 
5582
- if args[:dishwasher_label_gas_rate] != Constants.Auto
5583
- label_gas_rate = Float(args[:dishwasher_label_gas_rate])
5763
+ if args[:dishwasher_label_gas_rate].is_initialized
5764
+ label_gas_rate = args[:dishwasher_label_gas_rate].get
5584
5765
  end
5585
5766
 
5586
- if args[:dishwasher_label_annual_gas_cost] != Constants.Auto
5587
- label_annual_gas_cost = Float(args[:dishwasher_label_annual_gas_cost])
5767
+ if args[:dishwasher_label_annual_gas_cost].is_initialized
5768
+ label_annual_gas_cost = args[:dishwasher_label_annual_gas_cost].get
5588
5769
  end
5589
5770
 
5590
- if args[:dishwasher_label_usage] != Constants.Auto
5591
- label_usage = Float(args[:dishwasher_label_usage])
5771
+ if args[:dishwasher_label_usage].is_initialized
5772
+ label_usage = args[:dishwasher_label_usage].get
5592
5773
  end
5593
5774
 
5594
- if args[:dishwasher_place_setting_capacity] != Constants.Auto
5595
- place_setting_capacity = Float(args[:dishwasher_place_setting_capacity])
5775
+ if args[:dishwasher_place_setting_capacity].is_initialized
5776
+ place_setting_capacity = args[:dishwasher_place_setting_capacity].get
5596
5777
  end
5597
5778
 
5598
- if args[:dishwasher_usage_multiplier] != 1.0
5599
- usage_multiplier = args[:dishwasher_usage_multiplier]
5779
+ if args[:dishwasher_usage_multiplier].is_initialized
5780
+ usage_multiplier = args[:dishwasher_usage_multiplier].get
5600
5781
  end
5601
5782
 
5602
5783
  hpxml.dishwashers.add(id: "Dishwasher#{hpxml.dishwashers.size + 1}",
@@ -5611,20 +5792,19 @@ class HPXMLFile
5611
5792
  usage_multiplier: usage_multiplier)
5612
5793
  end
5613
5794
 
5614
- def self.set_refrigerator(hpxml, runner, args)
5615
- return if args[:refrigerator_location] == 'none'
5795
+ def self.set_refrigerator(hpxml, args)
5796
+ return unless args[:refrigerator_present]
5616
5797
 
5617
- if args[:refrigerator_rated_annual_kwh] != Constants.Auto
5618
- rated_annual_kwh = Float(args[:refrigerator_rated_annual_kwh])
5619
- return if Float(rated_annual_kwh) == 0
5798
+ if args[:refrigerator_rated_annual_kwh].is_initialized
5799
+ rated_annual_kwh = args[:refrigerator_rated_annual_kwh].get
5620
5800
  end
5621
5801
 
5622
- if args[:refrigerator_location] != Constants.Auto
5623
- location = args[:refrigerator_location]
5802
+ if args[:refrigerator_location].is_initialized
5803
+ location = args[:refrigerator_location].get
5624
5804
  end
5625
5805
 
5626
- if args[:refrigerator_usage_multiplier] != 1.0
5627
- usage_multiplier = args[:refrigerator_usage_multiplier]
5806
+ if args[:refrigerator_usage_multiplier].is_initialized
5807
+ usage_multiplier = args[:refrigerator_usage_multiplier].get
5628
5808
  end
5629
5809
 
5630
5810
  hpxml.refrigerators.add(id: "Refrigerator#{hpxml.refrigerators.size + 1}",
@@ -5634,20 +5814,19 @@ class HPXMLFile
5634
5814
  usage_multiplier: usage_multiplier)
5635
5815
  end
5636
5816
 
5637
- def self.set_extra_refrigerator(hpxml, runner, args)
5638
- return if args[:extra_refrigerator_location] == 'none'
5817
+ def self.set_extra_refrigerator(hpxml, args)
5818
+ return unless args[:extra_refrigerator_present]
5639
5819
 
5640
- if args[:extra_refrigerator_rated_annual_kwh] != Constants.Auto
5641
- rated_annual_kwh = Float(args[:extra_refrigerator_rated_annual_kwh])
5642
- return if Float(rated_annual_kwh) == 0
5820
+ if args[:extra_refrigerator_rated_annual_kwh].is_initialized
5821
+ rated_annual_kwh = args[:extra_refrigerator_rated_annual_kwh].get
5643
5822
  end
5644
5823
 
5645
- if args[:extra_refrigerator_location] != Constants.Auto
5646
- location = args[:extra_refrigerator_location]
5824
+ if args[:extra_refrigerator_location].is_initialized
5825
+ location = args[:extra_refrigerator_location].get
5647
5826
  end
5648
5827
 
5649
- if args[:extra_refrigerator_usage_multiplier] != 1.0
5650
- usage_multiplier = args[:extra_refrigerator_usage_multiplier]
5828
+ if args[:extra_refrigerator_usage_multiplier].is_initialized
5829
+ usage_multiplier = args[:extra_refrigerator_usage_multiplier].get
5651
5830
  end
5652
5831
 
5653
5832
  hpxml.refrigerators.add(id: "Refrigerator#{hpxml.refrigerators.size + 1}",
@@ -5657,20 +5836,19 @@ class HPXMLFile
5657
5836
  usage_multiplier: usage_multiplier)
5658
5837
  end
5659
5838
 
5660
- def self.set_freezer(hpxml, runner, args)
5661
- return if args[:freezer_location] == 'none'
5839
+ def self.set_freezer(hpxml, args)
5840
+ return unless args[:freezer_present]
5662
5841
 
5663
- if args[:freezer_rated_annual_kwh] != Constants.Auto
5664
- rated_annual_kwh = Float(args[:freezer_rated_annual_kwh])
5665
- return if Float(rated_annual_kwh) == 0
5842
+ if args[:freezer_rated_annual_kwh].is_initialized
5843
+ rated_annual_kwh = args[:freezer_rated_annual_kwh].get
5666
5844
  end
5667
5845
 
5668
- if args[:freezer_location] != Constants.Auto
5669
- location = args[:freezer_location]
5846
+ if args[:freezer_location].is_initialized
5847
+ location = args[:freezer_location].get
5670
5848
  end
5671
5849
 
5672
- if args[:freezer_usage_multiplier] != 1.0
5673
- usage_multiplier = args[:freezer_usage_multiplier]
5850
+ if args[:freezer_usage_multiplier].is_initialized
5851
+ usage_multiplier = args[:freezer_usage_multiplier].get
5674
5852
  end
5675
5853
 
5676
5854
  hpxml.freezers.add(id: "Freezer#{hpxml.freezers.size + 1}",
@@ -5679,19 +5857,19 @@ class HPXMLFile
5679
5857
  usage_multiplier: usage_multiplier)
5680
5858
  end
5681
5859
 
5682
- def self.set_cooking_range_oven(hpxml, runner, args)
5683
- return if args[:cooking_range_oven_location] == 'none'
5860
+ def self.set_cooking_range_oven(hpxml, args)
5861
+ return unless args[:cooking_range_oven_present]
5684
5862
 
5685
- if args[:cooking_range_oven_location] != Constants.Auto
5686
- location = args[:cooking_range_oven_location]
5863
+ if args[:cooking_range_oven_location].is_initialized
5864
+ location = args[:cooking_range_oven_location].get
5687
5865
  end
5688
5866
 
5689
5867
  if args[:cooking_range_oven_is_induction].is_initialized
5690
5868
  is_induction = args[:cooking_range_oven_is_induction].get
5691
5869
  end
5692
5870
 
5693
- if args[:cooking_range_oven_usage_multiplier] != 1.0
5694
- usage_multiplier = args[:cooking_range_oven_usage_multiplier]
5871
+ if args[:cooking_range_oven_usage_multiplier].is_initialized
5872
+ usage_multiplier = args[:cooking_range_oven_usage_multiplier].get
5695
5873
  end
5696
5874
 
5697
5875
  hpxml.cooking_ranges.add(id: "CookingRange#{hpxml.cooking_ranges.size + 1}",
@@ -5708,15 +5886,15 @@ class HPXMLFile
5708
5886
  is_convection: is_convection)
5709
5887
  end
5710
5888
 
5711
- def self.set_ceiling_fans(hpxml, runner, args)
5889
+ def self.set_ceiling_fans(hpxml, args)
5712
5890
  return unless args[:ceiling_fan_present]
5713
5891
 
5714
- if args[:ceiling_fan_efficiency] != Constants.Auto
5715
- efficiency = Float(args[:ceiling_fan_efficiency])
5892
+ if args[:ceiling_fan_efficiency].is_initialized
5893
+ efficiency = args[:ceiling_fan_efficiency].get
5716
5894
  end
5717
5895
 
5718
- if args[:ceiling_fan_quantity] != Constants.Auto
5719
- quantity = Integer(args[:ceiling_fan_quantity])
5896
+ if args[:ceiling_fan_quantity].is_initialized
5897
+ quantity = args[:ceiling_fan_quantity].get
5720
5898
  end
5721
5899
 
5722
5900
  hpxml.ceiling_fans.add(id: "CeilingFan#{hpxml.ceiling_fans.size + 1}",
@@ -5724,15 +5902,15 @@ class HPXMLFile
5724
5902
  quantity: quantity)
5725
5903
  end
5726
5904
 
5727
- def self.set_misc_plug_loads_television(hpxml, runner, args)
5905
+ def self.set_misc_plug_loads_television(hpxml, args)
5728
5906
  return unless args[:misc_plug_loads_television_present]
5729
5907
 
5730
- if args[:misc_plug_loads_television_annual_kwh] != Constants.Auto
5731
- kWh_per_year = Float(args[:misc_plug_loads_television_annual_kwh])
5908
+ if args[:misc_plug_loads_television_annual_kwh].is_initialized
5909
+ kWh_per_year = args[:misc_plug_loads_television_annual_kwh].get
5732
5910
  end
5733
5911
 
5734
- if args[:misc_plug_loads_television_usage_multiplier] != 1.0
5735
- usage_multiplier = args[:misc_plug_loads_television_usage_multiplier]
5912
+ if args[:misc_plug_loads_television_usage_multiplier].is_initialized
5913
+ usage_multiplier = args[:misc_plug_loads_television_usage_multiplier].get
5736
5914
  end
5737
5915
 
5738
5916
  hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
@@ -5741,21 +5919,21 @@ class HPXMLFile
5741
5919
  usage_multiplier: usage_multiplier)
5742
5920
  end
5743
5921
 
5744
- def self.set_misc_plug_loads_other(hpxml, runner, args)
5745
- if args[:misc_plug_loads_other_annual_kwh] != Constants.Auto
5746
- kWh_per_year = Float(args[:misc_plug_loads_other_annual_kwh])
5922
+ def self.set_misc_plug_loads_other(hpxml, args)
5923
+ if args[:misc_plug_loads_other_annual_kwh].is_initialized
5924
+ kWh_per_year = args[:misc_plug_loads_other_annual_kwh].get
5747
5925
  end
5748
5926
 
5749
- if args[:misc_plug_loads_other_frac_sensible] != Constants.Auto
5750
- frac_sensible = Float(args[:misc_plug_loads_other_frac_sensible])
5927
+ if args[:misc_plug_loads_other_frac_sensible].is_initialized
5928
+ frac_sensible = args[:misc_plug_loads_other_frac_sensible].get
5751
5929
  end
5752
5930
 
5753
- if args[:misc_plug_loads_other_frac_latent] != Constants.Auto
5754
- frac_latent = Float(args[:misc_plug_loads_other_frac_latent])
5931
+ if args[:misc_plug_loads_other_frac_latent].is_initialized
5932
+ frac_latent = args[:misc_plug_loads_other_frac_latent].get
5755
5933
  end
5756
5934
 
5757
- if args[:misc_plug_loads_other_usage_multiplier] != 1.0
5758
- usage_multiplier = args[:misc_plug_loads_other_usage_multiplier]
5935
+ if args[:misc_plug_loads_other_usage_multiplier].is_initialized
5936
+ usage_multiplier = args[:misc_plug_loads_other_usage_multiplier].get
5759
5937
  end
5760
5938
 
5761
5939
  hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
@@ -5766,15 +5944,15 @@ class HPXMLFile
5766
5944
  usage_multiplier: usage_multiplier)
5767
5945
  end
5768
5946
 
5769
- def self.set_misc_plug_loads_well_pump(hpxml, runner, args)
5947
+ def self.set_misc_plug_loads_well_pump(hpxml, args)
5770
5948
  return unless args[:misc_plug_loads_well_pump_present]
5771
5949
 
5772
- if args[:misc_plug_loads_well_pump_annual_kwh] != Constants.Auto
5773
- kWh_per_year = Float(args[:misc_plug_loads_well_pump_annual_kwh])
5950
+ if args[:misc_plug_loads_well_pump_annual_kwh].is_initialized
5951
+ kWh_per_year = args[:misc_plug_loads_well_pump_annual_kwh].get
5774
5952
  end
5775
5953
 
5776
- if args[:misc_plug_loads_well_pump_usage_multiplier] != 1.0
5777
- usage_multiplier = args[:misc_plug_loads_well_pump_usage_multiplier]
5954
+ if args[:misc_plug_loads_well_pump_usage_multiplier].is_initialized
5955
+ usage_multiplier = args[:misc_plug_loads_well_pump_usage_multiplier].get
5778
5956
  end
5779
5957
 
5780
5958
  hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
@@ -5783,15 +5961,15 @@ class HPXMLFile
5783
5961
  usage_multiplier: usage_multiplier)
5784
5962
  end
5785
5963
 
5786
- def self.set_misc_plug_loads_vehicle(hpxml, runner, args)
5964
+ def self.set_misc_plug_loads_vehicle(hpxml, args)
5787
5965
  return unless args[:misc_plug_loads_vehicle_present]
5788
5966
 
5789
- if args[:misc_plug_loads_vehicle_annual_kwh] != Constants.Auto
5790
- kWh_per_year = Float(args[:misc_plug_loads_vehicle_annual_kwh])
5967
+ if args[:misc_plug_loads_vehicle_annual_kwh].is_initialized
5968
+ kWh_per_year = args[:misc_plug_loads_vehicle_annual_kwh].get
5791
5969
  end
5792
5970
 
5793
- if args[:misc_plug_loads_vehicle_usage_multiplier] != 1.0
5794
- usage_multiplier = args[:misc_plug_loads_vehicle_usage_multiplier]
5971
+ if args[:misc_plug_loads_vehicle_usage_multiplier].is_initialized
5972
+ usage_multiplier = args[:misc_plug_loads_vehicle_usage_multiplier].get
5795
5973
  end
5796
5974
 
5797
5975
  hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
@@ -5800,99 +5978,99 @@ class HPXMLFile
5800
5978
  usage_multiplier: usage_multiplier)
5801
5979
  end
5802
5980
 
5803
- def self.set_misc_fuel_loads_grill(hpxml, runner, args)
5804
- if args[:misc_fuel_loads_grill_present]
5805
- if args[:misc_fuel_loads_grill_annual_therm] != Constants.Auto
5806
- therm_per_year = Float(args[:misc_fuel_loads_grill_annual_therm])
5807
- end
5981
+ def self.set_misc_fuel_loads_grill(hpxml, args)
5982
+ return unless args[:misc_fuel_loads_grill_present]
5808
5983
 
5809
- if args[:misc_fuel_loads_grill_usage_multiplier] != 1.0
5810
- usage_multiplier = args[:misc_fuel_loads_grill_usage_multiplier]
5811
- end
5984
+ if args[:misc_fuel_loads_grill_annual_therm].is_initialized
5985
+ therm_per_year = args[:misc_fuel_loads_grill_annual_therm].get
5986
+ end
5812
5987
 
5813
- hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
5814
- fuel_load_type: HPXML::FuelLoadTypeGrill,
5815
- fuel_type: args[:misc_fuel_loads_grill_fuel_type],
5816
- therm_per_year: therm_per_year,
5817
- usage_multiplier: usage_multiplier)
5988
+ if args[:misc_fuel_loads_grill_usage_multiplier].is_initialized
5989
+ usage_multiplier = args[:misc_fuel_loads_grill_usage_multiplier].get
5818
5990
  end
5991
+
5992
+ hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
5993
+ fuel_load_type: HPXML::FuelLoadTypeGrill,
5994
+ fuel_type: args[:misc_fuel_loads_grill_fuel_type],
5995
+ therm_per_year: therm_per_year,
5996
+ usage_multiplier: usage_multiplier)
5819
5997
  end
5820
5998
 
5821
- def self.set_misc_fuel_loads_lighting(hpxml, runner, args)
5822
- if args[:misc_fuel_loads_lighting_present]
5823
- if args[:misc_fuel_loads_lighting_annual_therm] != Constants.Auto
5824
- therm_per_year = Float(args[:misc_fuel_loads_lighting_annual_therm])
5825
- end
5999
+ def self.set_misc_fuel_loads_lighting(hpxml, args)
6000
+ return unless args[:misc_fuel_loads_lighting_present]
5826
6001
 
5827
- if args[:misc_fuel_loads_lighting_usage_multiplier] != 1.0
5828
- usage_multiplier = args[:misc_fuel_loads_lighting_usage_multiplier]
5829
- end
6002
+ if args[:misc_fuel_loads_lighting_annual_therm].is_initialized
6003
+ therm_per_year = args[:misc_fuel_loads_lighting_annual_therm].get
6004
+ end
5830
6005
 
5831
- hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
5832
- fuel_load_type: HPXML::FuelLoadTypeLighting,
5833
- fuel_type: args[:misc_fuel_loads_lighting_fuel_type],
5834
- therm_per_year: therm_per_year,
5835
- usage_multiplier: usage_multiplier)
6006
+ if args[:misc_fuel_loads_lighting_usage_multiplier].is_initialized
6007
+ usage_multiplier = args[:misc_fuel_loads_lighting_usage_multiplier].get
5836
6008
  end
6009
+
6010
+ hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
6011
+ fuel_load_type: HPXML::FuelLoadTypeLighting,
6012
+ fuel_type: args[:misc_fuel_loads_lighting_fuel_type],
6013
+ therm_per_year: therm_per_year,
6014
+ usage_multiplier: usage_multiplier)
5837
6015
  end
5838
6016
 
5839
- def self.set_misc_fuel_loads_fireplace(hpxml, runner, args)
5840
- if args[:misc_fuel_loads_fireplace_present]
5841
- if args[:misc_fuel_loads_fireplace_annual_therm] != Constants.Auto
5842
- therm_per_year = Float(args[:misc_fuel_loads_fireplace_annual_therm])
5843
- end
6017
+ def self.set_misc_fuel_loads_fireplace(hpxml, args)
6018
+ return unless args[:misc_fuel_loads_fireplace_present]
5844
6019
 
5845
- if args[:misc_fuel_loads_fireplace_frac_sensible] != Constants.Auto
5846
- frac_sensible = Float(args[:misc_fuel_loads_fireplace_frac_sensible])
5847
- end
6020
+ if args[:misc_fuel_loads_fireplace_annual_therm].is_initialized
6021
+ therm_per_year = args[:misc_fuel_loads_fireplace_annual_therm].get
6022
+ end
5848
6023
 
5849
- if args[:misc_fuel_loads_fireplace_frac_latent] != Constants.Auto
5850
- frac_latent = Float(args[:misc_fuel_loads_fireplace_frac_latent])
5851
- end
6024
+ if args[:misc_fuel_loads_fireplace_frac_sensible].is_initialized
6025
+ frac_sensible = args[:misc_fuel_loads_fireplace_frac_sensible].get
6026
+ end
5852
6027
 
5853
- if args[:misc_fuel_loads_fireplace_usage_multiplier] != 1.0
5854
- usage_multiplier = args[:misc_fuel_loads_fireplace_usage_multiplier]
5855
- end
6028
+ if args[:misc_fuel_loads_fireplace_frac_latent].is_initialized
6029
+ frac_latent = args[:misc_fuel_loads_fireplace_frac_latent].get
6030
+ end
5856
6031
 
5857
- hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
5858
- fuel_load_type: HPXML::FuelLoadTypeFireplace,
5859
- fuel_type: args[:misc_fuel_loads_fireplace_fuel_type],
5860
- therm_per_year: therm_per_year,
5861
- frac_sensible: frac_sensible,
5862
- frac_latent: frac_latent,
5863
- usage_multiplier: usage_multiplier)
6032
+ if args[:misc_fuel_loads_fireplace_usage_multiplier].is_initialized
6033
+ usage_multiplier = args[:misc_fuel_loads_fireplace_usage_multiplier].get
5864
6034
  end
6035
+
6036
+ hpxml.fuel_loads.add(id: "FuelLoad#{hpxml.fuel_loads.size + 1}",
6037
+ fuel_load_type: HPXML::FuelLoadTypeFireplace,
6038
+ fuel_type: args[:misc_fuel_loads_fireplace_fuel_type],
6039
+ therm_per_year: therm_per_year,
6040
+ frac_sensible: frac_sensible,
6041
+ frac_latent: frac_latent,
6042
+ usage_multiplier: usage_multiplier)
5865
6043
  end
5866
6044
 
5867
- def self.set_pool(hpxml, runner, args)
6045
+ def self.set_pool(hpxml, args)
5868
6046
  return unless args[:pool_present]
5869
6047
 
5870
- if args[:pool_pump_annual_kwh] != Constants.Auto
5871
- pump_kwh_per_year = Float(args[:pool_pump_annual_kwh])
6048
+ if args[:pool_pump_annual_kwh].is_initialized
6049
+ pump_kwh_per_year = args[:pool_pump_annual_kwh].get
5872
6050
  end
5873
6051
 
5874
- if args[:pool_pump_usage_multiplier] != 1.0
5875
- pump_usage_multiplier = args[:pool_pump_usage_multiplier]
6052
+ if args[:pool_pump_usage_multiplier].is_initialized
6053
+ pump_usage_multiplier = args[:pool_pump_usage_multiplier].get
5876
6054
  end
5877
6055
 
5878
6056
  pool_heater_type = args[:pool_heater_type]
5879
6057
 
5880
6058
  if [HPXML::HeaterTypeElectricResistance, HPXML::HeaterTypeHeatPump].include?(pool_heater_type)
5881
- if args[:pool_heater_annual_kwh] != Constants.Auto
5882
- heater_load_units = 'kWh/year'
5883
- heater_load_value = Float(args[:pool_heater_annual_kwh])
6059
+ if args[:pool_heater_annual_kwh].is_initialized
6060
+ heater_load_units = HPXML::UnitsKwhPerYear
6061
+ heater_load_value = args[:pool_heater_annual_kwh].get
5884
6062
  end
5885
6063
  end
5886
6064
 
5887
6065
  if [HPXML::HeaterTypeGas].include?(pool_heater_type)
5888
- if args[:pool_heater_annual_therm] != Constants.Auto
5889
- heater_load_units = 'therm/year'
5890
- heater_load_value = Float(args[:pool_heater_annual_therm])
6066
+ if args[:pool_heater_annual_therm].is_initialized
6067
+ heater_load_units = HPXML::UnitsThermPerYear
6068
+ heater_load_value = args[:pool_heater_annual_therm].get
5891
6069
  end
5892
6070
  end
5893
6071
 
5894
- if args[:pool_heater_usage_multiplier] != 1.0
5895
- heater_usage_multiplier = args[:pool_heater_usage_multiplier]
6072
+ if args[:pool_heater_usage_multiplier].is_initialized
6073
+ heater_usage_multiplier = args[:pool_heater_usage_multiplier].get
5896
6074
  end
5897
6075
 
5898
6076
  hpxml.pools.add(id: "Pool#{hpxml.pools.size + 1}",
@@ -5906,35 +6084,35 @@ class HPXMLFile
5906
6084
  heater_usage_multiplier: heater_usage_multiplier)
5907
6085
  end
5908
6086
 
5909
- def self.set_hot_tub(hpxml, runner, args)
6087
+ def self.set_hot_tub(hpxml, args)
5910
6088
  return unless args[:hot_tub_present]
5911
6089
 
5912
- if args[:hot_tub_pump_annual_kwh] != Constants.Auto
5913
- pump_kwh_per_year = Float(args[:hot_tub_pump_annual_kwh])
6090
+ if args[:hot_tub_pump_annual_kwh].is_initialized
6091
+ pump_kwh_per_year = args[:hot_tub_pump_annual_kwh].get
5914
6092
  end
5915
6093
 
5916
- if args[:hot_tub_pump_usage_multiplier] != 1.0
5917
- pump_usage_multiplier = args[:hot_tub_pump_usage_multiplier]
6094
+ if args[:hot_tub_pump_usage_multiplier].is_initialized
6095
+ pump_usage_multiplier = args[:hot_tub_pump_usage_multiplier].get
5918
6096
  end
5919
6097
 
5920
6098
  hot_tub_heater_type = args[:hot_tub_heater_type]
5921
6099
 
5922
6100
  if [HPXML::HeaterTypeElectricResistance, HPXML::HeaterTypeHeatPump].include?(hot_tub_heater_type)
5923
- if args[:hot_tub_heater_annual_kwh] != Constants.Auto
5924
- heater_load_units = 'kWh/year'
5925
- heater_load_value = Float(args[:hot_tub_heater_annual_kwh])
6101
+ if args[:hot_tub_heater_annual_kwh].is_initialized
6102
+ heater_load_units = HPXML::UnitsKwhPerYear
6103
+ heater_load_value = args[:hot_tub_heater_annual_kwh].get
5926
6104
  end
5927
6105
  end
5928
6106
 
5929
6107
  if [HPXML::HeaterTypeGas].include?(hot_tub_heater_type)
5930
- if args[:hot_tub_heater_annual_therm] != Constants.Auto
5931
- heater_load_units = 'therm/year'
5932
- heater_load_value = Float(args[:hot_tub_heater_annual_therm])
6108
+ if args[:hot_tub_heater_annual_therm].is_initialized
6109
+ heater_load_units = HPXML::UnitsThermPerYear
6110
+ heater_load_value = args[:hot_tub_heater_annual_therm].get
5933
6111
  end
5934
6112
  end
5935
6113
 
5936
- if args[:hot_tub_heater_usage_multiplier] != 1.0
5937
- heater_usage_multiplier = args[:hot_tub_heater_usage_multiplier]
6114
+ if args[:hot_tub_heater_usage_multiplier].is_initialized
6115
+ heater_usage_multiplier = args[:hot_tub_heater_usage_multiplier].get
5938
6116
  end
5939
6117
 
5940
6118
  hpxml.hot_tubs.add(id: "HotTub#{hpxml.hot_tubs.size + 1}",