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
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- def create_hpxmls
4
- require_relative 'HPXMLtoOpenStudio/resources/constants'
5
- require_relative 'HPXMLtoOpenStudio/resources/hpxml'
6
- require_relative 'HPXMLtoOpenStudio/resources/meta_measure'
3
+ Dir["#{File.dirname(__FILE__)}/HPXMLtoOpenStudio/resources/*.rb"].each do |resource_file|
4
+ next if resource_file.include? 'minitest_helper.rb'
5
+
6
+ require resource_file
7
+ end
7
8
 
9
+ def create_hpxmls
8
10
  this_dir = File.dirname(__FILE__)
9
11
  tests_dir = File.join(this_dir, 'workflow/sample_files')
10
12
 
@@ -59,6 +61,7 @@ def create_hpxmls
59
61
  'base-atticroof-unvented-insulated-roof.xml' => 'base.xml',
60
62
  'base-atticroof-vented.xml' => 'base.xml',
61
63
  'base-battery.xml' => 'base.xml',
64
+ 'base-battery-scheduled.xml' => 'base-battery.xml',
62
65
  'base-bldgtype-multifamily.xml' => 'base.xml',
63
66
  'base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml' => 'base-bldgtype-multifamily.xml',
64
67
  'base-bldgtype-multifamily-adjacent-to-multiple.xml' => 'base-bldgtype-multifamily.xml',
@@ -84,6 +87,7 @@ def create_hpxmls
84
87
  'base-bldgtype-multifamily-shared-generator.xml' => 'base-bldgtype-multifamily.xml',
85
88
  'base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml' => 'base-bldgtype-multifamily.xml',
86
89
  'base-bldgtype-multifamily-shared-laundry-room.xml' => 'base-bldgtype-multifamily.xml',
90
+ 'base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml' => 'base-bldgtype-multifamily-shared-laundry-room.xml',
87
91
  'base-bldgtype-multifamily-shared-mechvent.xml' => 'base-bldgtype-multifamily.xml',
88
92
  'base-bldgtype-multifamily-shared-mechvent-multiple.xml' => 'base-bldgtype-multifamily.xml',
89
93
  'base-bldgtype-multifamily-shared-mechvent-preconditioning.xml' => 'base-bldgtype-multifamily-shared-mechvent.xml',
@@ -107,6 +111,7 @@ def create_hpxmls
107
111
  'base-dhw-desuperheater-var-speed.xml' => 'base-hvac-central-ac-only-var-speed.xml',
108
112
  'base-dhw-dwhr.xml' => 'base.xml',
109
113
  'base-dhw-indirect.xml' => 'base-hvac-boiler-gas-only.xml',
114
+ 'base-dhw-indirect-detailed-setpoints.xml' => 'base-dhw-indirect.xml',
110
115
  'base-dhw-indirect-dse.xml' => 'base-dhw-indirect.xml',
111
116
  'base-dhw-indirect-outside.xml' => 'base-dhw-indirect.xml',
112
117
  'base-dhw-indirect-standbyloss.xml' => 'base-dhw-indirect.xml',
@@ -130,6 +135,7 @@ def create_hpxmls
130
135
  'base-dhw-solar-indirect-flat-plate.xml' => 'base.xml',
131
136
  'base-dhw-solar-thermosyphon-flat-plate.xml' => 'base-dhw-solar-indirect-flat-plate.xml',
132
137
  'base-dhw-tank-coal.xml' => 'base-dhw-tank-gas.xml',
138
+ 'base-dhw-tank-detailed-setpoints.xml' => 'base.xml',
133
139
  'base-dhw-tank-elec-uef.xml' => 'base.xml',
134
140
  'base-dhw-tank-gas.xml' => 'base.xml',
135
141
  'base-dhw-tank-gas-uef.xml' => 'base-dhw-tank-gas.xml',
@@ -141,11 +147,8 @@ def create_hpxmls
141
147
  'base-dhw-tank-heat-pump-with-solar.xml' => 'base-dhw-tank-heat-pump.xml',
142
148
  'base-dhw-tank-heat-pump-with-solar-fraction.xml' => 'base-dhw-tank-heat-pump.xml',
143
149
  'base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml' => 'base-dhw-tank-heat-pump-uef.xml',
144
- 'base-dhw-tank-heat-pump-detailed-setpoints.xml' => 'base-dhw-tank-heat-pump-uef.xml',
145
- 'base-dhw-tank-heat-pump-detailed-operating-modes.xml' => 'base-dhw-tank-heat-pump-uef.xml',
146
150
  'base-dhw-tank-heat-pump-detailed-schedules.xml' => 'base-dhw-tank-heat-pump-uef.xml',
147
151
  'base-dhw-tank-model-type-stratified.xml' => 'base.xml',
148
- 'base-dhw-tank-detailed-setpoints.xml' => 'base.xml',
149
152
  'base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml' => 'base-dhw-tank-model-type-stratified.xml',
150
153
  'base-dhw-tank-oil.xml' => 'base-dhw-tank-gas.xml',
151
154
  'base-dhw-tank-wood.xml' => 'base-dhw-tank-gas.xml',
@@ -164,6 +167,8 @@ def create_hpxmls
164
167
  'base-enclosure-beds-2.xml' => 'base.xml',
165
168
  'base-enclosure-beds-4.xml' => 'base.xml',
166
169
  'base-enclosure-beds-5.xml' => 'base.xml',
170
+ 'base-enclosure-ceilingtypes.xml' => 'base.xml',
171
+ 'base-enclosure-floortypes.xml' => 'base-foundation-ambient.xml',
167
172
  'base-enclosure-garage.xml' => 'base.xml',
168
173
  'base-enclosure-infil-ach-house-pressure.xml' => 'base.xml',
169
174
  'base-enclosure-infil-cfm-house-pressure.xml' => 'base-enclosure-infil-cfm50.xml',
@@ -181,6 +186,7 @@ def create_hpxmls
181
186
  'base-enclosure-split-surfaces.xml' => 'base-enclosure-skylights.xml', # Surfaces should collapse via HPXML.collapse_enclosure_surfaces()
182
187
  'base-enclosure-split-surfaces2.xml' => 'base-enclosure-skylights.xml', # Surfaces should NOT collapse via HPXML.collapse_enclosure_surfaces()
183
188
  'base-enclosure-walltypes.xml' => 'base.xml',
189
+ 'base-enclosure-windows-natural-ventilation-availability.xml' => 'base.xml',
184
190
  'base-enclosure-windows-none.xml' => 'base.xml',
185
191
  'base-enclosure-windows-physical-properties.xml' => 'base.xml',
186
192
  'base-enclosure-windows-shading.xml' => 'base.xml',
@@ -190,7 +196,7 @@ def create_hpxmls
190
196
  'base-foundation-basement-garage.xml' => 'base.xml',
191
197
  'base-foundation-complex.xml' => 'base.xml',
192
198
  'base-foundation-conditioned-basement-slab-insulation.xml' => 'base.xml',
193
- 'base-foundation-conditioned-basement-wall-interior-insulation.xml' => 'base.xml',
199
+ 'base-foundation-conditioned-basement-wall-insulation.xml' => 'base.xml',
194
200
  'base-foundation-conditioned-crawlspace.xml' => 'base.xml',
195
201
  'base-foundation-multiple.xml' => 'base-foundation-unconditioned-basement.xml',
196
202
  'base-foundation-slab.xml' => 'base.xml',
@@ -205,6 +211,7 @@ def create_hpxmls
205
211
  'base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml' => 'base-hvac-air-to-air-heat-pump-1-speed.xml',
206
212
  'base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml' => 'base-hvac-air-to-air-heat-pump-1-speed.xml',
207
213
  'base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml' => 'base-hvac-air-to-air-heat-pump-1-speed.xml',
214
+ 'base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml' => 'base-hvac-air-to-air-heat-pump-1-speed.xml',
208
215
  'base-hvac-air-to-air-heat-pump-2-speed.xml' => 'base.xml',
209
216
  'base-hvac-air-to-air-heat-pump-var-speed.xml' => 'base.xml',
210
217
  'base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml' => 'base-hvac-air-to-air-heat-pump-var-speed.xml',
@@ -216,6 +223,7 @@ def create_hpxmls
216
223
  'base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml' => 'base-hvac-air-to-air-heat-pump-1-speed.xml',
217
224
  'base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml' => 'base-hvac-air-to-air-heat-pump-1-speed.xml',
218
225
  'base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml' => 'base-hvac-air-to-air-heat-pump-1-speed.xml',
226
+ 'base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload-miami-fl.xml' => 'base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml',
219
227
  'base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml' => 'base-hvac-air-to-air-heat-pump-2-speed.xml',
220
228
  'base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml' => 'base-hvac-air-to-air-heat-pump-2-speed.xml',
221
229
  'base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml' => 'base-hvac-air-to-air-heat-pump-2-speed.xml',
@@ -256,10 +264,14 @@ def create_hpxmls
256
264
  'base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml' => 'base-hvac-mini-split-heat-pump-ductless-backup-stove.xml',
257
265
  'base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml' => 'base-hvac-mini-split-air-conditioner-only-ducted.xml',
258
266
  'base-hvac-autosize-ptac.xml' => 'base-hvac-ptac.xml',
259
- 'base-hvac-autosize-ptac-with-heating.xml' => 'base-hvac-ptac-with-heating.xml',
267
+ 'base-hvac-autosize-ptac-with-heating.xml' => 'base-hvac-ptac-with-heating-electricity.xml',
260
268
  'base-hvac-autosize-pthp-sizing-methodology-acca.xml' => 'base-hvac-pthp.xml',
261
269
  'base-hvac-autosize-pthp-sizing-methodology-hers.xml' => 'base-hvac-pthp.xml',
262
270
  'base-hvac-autosize-pthp-sizing-methodology-maxload.xml' => 'base-hvac-pthp.xml',
271
+ 'base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml' => 'base-hvac-room-ac-with-reverse-cycle.xml',
272
+ 'base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml' => 'base-hvac-room-ac-with-reverse-cycle.xml',
273
+ 'base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml' => 'base-hvac-room-ac-with-reverse-cycle.xml',
274
+ 'base-hvac-autosize-room-ac-with-heating.xml' => 'base-hvac-room-ac-with-heating.xml',
263
275
  'base-hvac-autosize-room-ac-only.xml' => 'base-hvac-room-ac-only.xml',
264
276
  'base-hvac-autosize-stove-oil-only.xml' => 'base-hvac-stove-oil-only.xml',
265
277
  'base-hvac-autosize-wall-furnace-elec-only.xml' => 'base-hvac-wall-furnace-elec-only.xml',
@@ -271,6 +283,7 @@ def create_hpxmls
271
283
  'base-hvac-boiler-propane-only.xml' => 'base-hvac-boiler-gas-only.xml',
272
284
  'base-hvac-boiler-wood-only.xml' => 'base-hvac-boiler-gas-only.xml',
273
285
  'base-hvac-central-ac-only-1-speed.xml' => 'base.xml',
286
+ 'base-hvac-central-ac-only-1-speed-seer2.xml' => 'base-hvac-central-ac-only-1-speed.xml',
274
287
  'base-hvac-central-ac-only-2-speed.xml' => 'base.xml',
275
288
  'base-hvac-central-ac-only-var-speed.xml' => 'base.xml',
276
289
  'base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml' => 'base-hvac-central-ac-only-1-speed.xml',
@@ -283,6 +296,7 @@ def create_hpxmls
283
296
  'base-hvac-ducts-leakage-cfm50.xml' => 'base.xml',
284
297
  'base-hvac-ducts-leakage-percent.xml' => 'base.xml',
285
298
  'base-hvac-ducts-area-fractions.xml' => 'base-enclosure-2stories.xml',
299
+ 'base-hvac-ducts-area-multipliers.xml' => 'base.xml',
286
300
  'base-hvac-elec-resistance-only.xml' => 'base.xml',
287
301
  'base-hvac-evap-cooler-furnace-gas.xml' => 'base.xml',
288
302
  'base-hvac-evap-cooler-only.xml' => 'base.xml',
@@ -323,14 +337,17 @@ def create_hpxmls
323
337
  'base-hvac-mini-split-heat-pump-ductless.xml' => 'base-hvac-mini-split-heat-pump-ducted.xml',
324
338
  'base-hvac-mini-split-heat-pump-ductless-backup-stove.xml' => 'base-hvac-mini-split-heat-pump-ductless.xml',
325
339
  'base-hvac-multiple.xml' => 'base.xml',
326
- 'base-hvac-none.xml' => 'base.xml',
340
+ 'base-hvac-none.xml' => 'base-location-honolulu-hi.xml',
327
341
  'base-hvac-portable-heater-gas-only.xml' => 'base.xml',
328
342
  'base-hvac-ptac.xml' => 'base.xml',
329
- 'base-hvac-ptac-with-heating.xml' => 'base-hvac-ptac.xml',
343
+ 'base-hvac-ptac-with-heating-electricity.xml' => 'base-hvac-ptac.xml',
344
+ 'base-hvac-ptac-with-heating-natural-gas.xml' => 'base-hvac-ptac.xml',
330
345
  'base-hvac-pthp.xml' => 'base-hvac-ground-to-air-heat-pump.xml',
331
346
  'base-hvac-room-ac-only.xml' => 'base.xml',
332
347
  'base-hvac-room-ac-only-33percent.xml' => 'base-hvac-room-ac-only.xml',
333
348
  'base-hvac-room-ac-only-ceer.xml' => 'base-hvac-room-ac-only.xml',
349
+ 'base-hvac-room-ac-with-heating.xml' => 'base-hvac-room-ac-only.xml',
350
+ 'base-hvac-room-ac-with-reverse-cycle.xml' => 'base-hvac-pthp.xml',
334
351
  'base-hvac-room-ac-only-detailed-setpoints.xml' => 'base-hvac-room-ac-only.xml',
335
352
  'base-hvac-seasons.xml' => 'base.xml',
336
353
  'base-hvac-setpoints.xml' => 'base.xml',
@@ -360,6 +377,8 @@ def create_hpxmls
360
377
  'base-mechvent-cfis-airflow-fraction-zero.xml' => 'base-mechvent-cfis.xml',
361
378
  'base-mechvent-cfis-dse.xml' => 'base-hvac-dse.xml',
362
379
  'base-mechvent-cfis-evap-cooler-only-ducted.xml' => 'base-hvac-evap-cooler-only-ducted.xml',
380
+ 'base-mechvent-cfis-supplemental-fan-exhaust.xml' => 'base-mechvent-cfis.xml',
381
+ 'base-mechvent-cfis-supplemental-fan-supply.xml' => 'base-mechvent-cfis.xml',
363
382
  'base-mechvent-erv.xml' => 'base.xml',
364
383
  'base-mechvent-erv-atre-asre.xml' => 'base.xml',
365
384
  'base-mechvent-exhaust.xml' => 'base.xml',
@@ -370,9 +389,17 @@ def create_hpxmls
370
389
  'base-mechvent-supply.xml' => 'base.xml',
371
390
  'base-mechvent-whole-house-fan.xml' => 'base.xml',
372
391
  'base-misc-additional-properties.xml' => 'base.xml',
392
+ 'base-misc-bills.xml' => 'base.xml',
393
+ 'base-misc-bills-none.xml' => 'base.xml',
394
+ 'base-misc-bills-pv.xml' => 'base-pv.xml',
395
+ 'base-misc-bills-pv-detailed-only.xml' => 'base-pv.xml',
396
+ 'base-misc-bills-pv-mixed.xml' => 'base-pv.xml',
373
397
  'base-misc-defaults.xml' => 'base.xml',
374
398
  'base-misc-emissions.xml' => 'base-pv-battery.xml',
375
399
  'base-misc-generators.xml' => 'base.xml',
400
+ 'base-misc-generators-battery.xml' => 'base-misc-generators.xml',
401
+ 'base-misc-generators-battery-scheduled.xml' => 'base-misc-generators-battery.xml',
402
+ 'base-misc-ground-conductivity.xml' => 'base.xml',
376
403
  'base-misc-loads-large-uncommon.xml' => 'base-schedules-simple.xml',
377
404
  'base-misc-loads-large-uncommon2.xml' => 'base-misc-loads-large-uncommon.xml',
378
405
  'base-misc-loads-none.xml' => 'base.xml',
@@ -383,13 +410,19 @@ def create_hpxmls
383
410
  'base-pv.xml' => 'base.xml',
384
411
  'base-pv-battery.xml' => 'base-battery.xml',
385
412
  'base-pv-battery-ah.xml' => 'base-pv-battery.xml',
386
- 'base-pv-battery-lifetime-model.xml' => 'base-pv-battery.xml',
387
413
  'base-pv-battery-garage.xml' => 'base-enclosure-garage.xml',
414
+ # 'base-pv-battery-lifetime-model.xml' => 'base-pv-battery.xml',
415
+ 'base-pv-battery-round-trip-efficiency.xml' => 'base-pv-battery.xml',
416
+ 'base-pv-battery-scheduled.xml' => 'base-pv-battery.xml',
417
+ 'base-pv-generators.xml' => 'base-pv.xml',
418
+ 'base-pv-generators-battery.xml' => 'base-pv-generators.xml',
419
+ 'base-pv-generators-battery-scheduled.xml' => 'base-pv-generators-battery.xml',
388
420
  'base-schedules-simple.xml' => 'base.xml',
389
421
  'base-schedules-detailed-all-10-mins.xml' => 'base-simcontrol-timestep-10-mins.xml',
390
422
  'base-schedules-detailed-occupancy-smooth.xml' => 'base.xml',
391
423
  'base-schedules-detailed-occupancy-stochastic.xml' => 'base.xml',
392
424
  'base-schedules-detailed-occupancy-stochastic-vacancy.xml' => 'base.xml',
425
+ 'base-schedules-detailed-occupancy-stochastic-10-mins.xml' => 'base.xml',
393
426
  'base-schedules-detailed-setpoints.xml' => 'base.xml',
394
427
  'base-schedules-detailed-setpoints-daily-schedules.xml' => 'base.xml',
395
428
  'base-schedules-detailed-setpoints-daily-setbacks.xml' => 'base.xml',
@@ -397,12 +430,15 @@ def create_hpxmls
397
430
  'base-simcontrol-daylight-saving-custom.xml' => 'base.xml',
398
431
  'base-simcontrol-daylight-saving-disabled.xml' => 'base.xml',
399
432
  'base-simcontrol-runperiod-1-month.xml' => 'base.xml',
400
- 'base-simcontrol-timestep-10-mins.xml' => 'base.xml'
433
+ 'base-simcontrol-temperature-capacitance-multiplier.xml' => 'base.xml',
434
+ 'base-simcontrol-timestep-10-mins.xml' => 'base.xml',
435
+ 'base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml' => 'base-simcontrol-timestep-10-mins.xml',
436
+ 'base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml' => 'base-simcontrol-timestep-10-mins.xml',
437
+ 'base-simcontrol-timestep-30-mins.xml' => 'base.xml',
401
438
  }
402
439
 
403
440
  puts "Generating #{hpxmls_files.size} HPXML files..."
404
441
 
405
- hpxml_docs = {}
406
442
  hpxmls_files.each_with_index do |(hpxml_file, orig_parent), i|
407
443
  puts "[#{i + 1}/#{hpxmls_files.size}] Generating #{hpxml_file}..."
408
444
 
@@ -451,7 +487,7 @@ def create_hpxmls
451
487
  if hpxml_file.include? 'ASHRAE_Standard_140'
452
488
  hpxml_path = File.absolute_path(File.join(tests_dir, '..', 'tests', hpxml_file))
453
489
  hpxml = HPXML.new(hpxml_path: hpxml_path, collapse_enclosure: false)
454
- apply_hpxml_modification_ashrae_140(hpxml_file, hpxml)
490
+ apply_hpxml_modification_ashrae_140(hpxml)
455
491
  else
456
492
  hpxml_path = File.absolute_path(File.join(tests_dir, hpxml_file))
457
493
  hpxml = HPXML.new(hpxml_path: hpxml_path, collapse_enclosure: false)
@@ -465,14 +501,17 @@ def create_hpxmls
465
501
  hpxml_element = XMLHelper.get_element(hpxml_doc, '/HPXML')
466
502
  building_element = XMLHelper.get_element(hpxml_element, 'Building')
467
503
  for i in 2..3
468
- new_building_element = deep_copy_object(building_element)
504
+ new_building_element = Marshal.load(Marshal.dump(building_element)) # Deep copy
469
505
 
470
506
  # Make all IDs unique so the HPXML is valid
471
507
  new_building_element.each_node do |node|
472
508
  next unless node.is_a?(Oga::XML::Element)
473
- next if XMLHelper.get_attribute_value(node, 'id').nil?
474
509
 
475
- XMLHelper.add_attribute(node, 'id', "#{XMLHelper.get_attribute_value(node, 'id')}_#{i}")
510
+ if not XMLHelper.get_attribute_value(node, 'id').nil?
511
+ XMLHelper.add_attribute(node, 'id', "#{XMLHelper.get_attribute_value(node, 'id')}_#{i}")
512
+ elsif not XMLHelper.get_attribute_value(node, 'idref').nil?
513
+ XMLHelper.add_attribute(node, 'idref', "#{XMLHelper.get_attribute_value(node, 'idref')}_#{i}")
514
+ end
476
515
  end
477
516
 
478
517
  hpxml_element.children << new_building_element
@@ -480,7 +519,13 @@ def create_hpxmls
480
519
  end
481
520
 
482
521
  XMLHelper.write_file(hpxml_doc, hpxml_path)
483
- hpxml_docs[File.basename(hpxml_file)] = deep_copy_object(hpxml_doc)
522
+
523
+ schema_path = File.join(File.dirname(__FILE__), 'HPXMLtoOpenStudio', 'resources', 'hpxml_schema', 'HPXML.xsd')
524
+ errors, _ = XMLValidator.validate_against_schema(hpxml_path, schema_path)
525
+ if errors.size > 0
526
+ puts "\nError: Did not successfully validate #{hpxml_file}."
527
+ exit!
528
+ end
484
529
  rescue Exception => e
485
530
  puts "\n#{e}\n#{e.backtrace.join('\n')}"
486
531
  puts "\nError: Did not successfully generate #{hpxml_file}."
@@ -506,21 +551,15 @@ def create_hpxmls
506
551
  puts "Warning: Extra HPXML file found at #{File.absolute_path(hpxml)}"
507
552
  end
508
553
  end
509
-
510
- if hpxml_docs.size != hpxmls_files.size
511
- return
512
- end
513
-
514
- return hpxml_docs
515
554
  end
516
555
 
517
556
  def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
518
557
  if hpxml_file.include? 'ASHRAE_Standard_140'
519
- args['hpxml_path'] = "../workflow/tests/#{hpxml_file}"
558
+ args['hpxml_path'] = "workflow/tests/#{hpxml_file}"
520
559
  else
521
- args['hpxml_path'] = "../workflow/sample_files/#{hpxml_file}"
560
+ args['hpxml_path'] = "workflow/sample_files/#{hpxml_file}"
522
561
  end
523
- args['apply_validation'] = true
562
+ args['apply_validation'] = false
524
563
 
525
564
  if ['base.xml'].include? hpxml_file
526
565
  args['simulation_control_timestep'] = 60
@@ -553,10 +592,9 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
553
592
  args['geometry_unit_num_bedrooms'] = 3
554
593
  args['geometry_unit_num_bathrooms'] = 2
555
594
  args['geometry_unit_num_occupants'] = 3
556
- args['geometry_has_flue_or_chimney'] = Constants.Auto
557
595
  args['floor_over_foundation_assembly_r'] = 0
558
596
  args['floor_over_garage_assembly_r'] = 0
559
- args['foundation_wall_type'] = Constants.Auto
597
+ args['floor_type'] = HPXML::FloorTypeWoodFrame
560
598
  args['foundation_wall_thickness'] = 8.0
561
599
  args['foundation_wall_insulation_r'] = 8.9
562
600
  args['foundation_wall_insulation_distance_to_top'] = 0.0
@@ -579,10 +617,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
579
617
  args['neighbor_back_distance'] = 0
580
618
  args['neighbor_left_distance'] = 0
581
619
  args['neighbor_right_distance'] = 0
582
- args['neighbor_front_height'] = Constants.Auto
583
- args['neighbor_back_height'] = Constants.Auto
584
- args['neighbor_left_height'] = Constants.Auto
585
- args['neighbor_right_height'] = Constants.Auto
586
620
  args['wall_type'] = HPXML::WallTypeWoodStud
587
621
  args['wall_siding_type'] = HPXML::SidingTypeWood
588
622
  args['wall_color'] = HPXML::ColorMedium
@@ -624,7 +658,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
624
658
  args['air_leakage_units'] = HPXML::UnitsACH
625
659
  args['air_leakage_house_pressure'] = 50
626
660
  args['air_leakage_value'] = 3
627
- args['site_shielding_of_home'] = Constants.Auto
628
661
  args['heating_system_type'] = HPXML::HVACTypeFurnace
629
662
  args['heating_system_fuel'] = HPXML::FuelTypeNaturalGas
630
663
  args['heating_system_heating_efficiency'] = 0.92
@@ -646,7 +679,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
646
679
  args['heat_pump_cooling_compressor_type'] = HPXML::HVACCompressorTypeSingleStage
647
680
  args['heat_pump_cooling_sensible_heat_fraction'] = 0.73
648
681
  args['heat_pump_heating_capacity'] = 36000.0
649
- args['heat_pump_heating_capacity_17_f'] = Constants.Auto
650
682
  args['heat_pump_cooling_capacity'] = 36000.0
651
683
  args['heat_pump_fraction_heat_load_served'] = 1
652
684
  args['heat_pump_fraction_cool_load_served'] = 1
@@ -670,7 +702,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
670
702
  args['heating_system_2_type'] = 'none'
671
703
  args['heating_system_2_fuel'] = HPXML::FuelTypeElectricity
672
704
  args['heating_system_2_heating_efficiency'] = 1.0
673
- args['heating_system_2_heating_capacity'] = Constants.Auto
674
705
  args['heating_system_2_fraction_heat_load_served'] = 0.25
675
706
  args['mech_vent_fan_type'] = 'none'
676
707
  args['mech_vent_flow_rate'] = 110
@@ -690,8 +721,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
690
721
  args['kitchen_fans_quantity'] = 0
691
722
  args['bathroom_fans_quantity'] = 0
692
723
  args['whole_house_fan_present'] = false
693
- args['whole_house_fan_flow_rate'] = 4500
694
- args['whole_house_fan_power'] = 300
695
724
  args['water_heater_type'] = HPXML::WaterHeaterTypeStorage
696
725
  args['water_heater_fuel_type'] = HPXML::FuelTypeElectricity
697
726
  args['water_heater_location'] = HPXML::LocationLivingSpace
@@ -700,7 +729,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
700
729
  args['water_heater_efficiency'] = 0.95
701
730
  args['water_heater_recovery_efficiency'] = 0.76
702
731
  args['water_heater_heating_capacity'] = 18767
703
- args['water_heater_standby_loss'] = 0
704
732
  args['water_heater_jacket_rvalue'] = 0
705
733
  args['water_heater_setpoint_temperature'] = 125
706
734
  args['water_heater_num_units_served'] = 1
@@ -716,7 +744,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
716
744
  args['dwhr_efficiency'] = 0.55
717
745
  args['water_fixtures_shower_low_flow'] = true
718
746
  args['water_fixtures_sink_low_flow'] = false
719
- args['water_fixtures_usage_multiplier'] = 1.0
720
747
  args['solar_thermal_system_type'] = 'none'
721
748
  args['solar_thermal_collector_area'] = 40.0
722
749
  args['solar_thermal_collector_loop_type'] = HPXML::SolarThermalLoopTypeDirect
@@ -725,46 +752,34 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
725
752
  args['solar_thermal_collector_tilt'] = 20
726
753
  args['solar_thermal_collector_rated_optical_efficiency'] = 0.5
727
754
  args['solar_thermal_collector_rated_thermal_losses'] = 0.2799
728
- args['solar_thermal_storage_volume'] = Constants.Auto
729
755
  args['solar_thermal_solar_fraction'] = 0
730
- args['pv_system_module_type'] = 'none'
731
- args['pv_system_location'] = Constants.Auto
732
- args['pv_system_tracking'] = Constants.Auto
756
+ args['pv_system_present'] = false
733
757
  args['pv_system_array_azimuth'] = 180
734
758
  args['pv_system_array_tilt'] = 20
735
759
  args['pv_system_max_power_output'] = 4000
736
- args['pv_system_inverter_efficiency'] = 0.96
737
- args['pv_system_system_losses_fraction'] = 0.14
738
- args['pv_system_num_bedrooms_served'] = 3
739
- args['pv_system_2_module_type'] = 'none'
740
- args['pv_system_2_location'] = Constants.Auto
741
- args['pv_system_2_tracking'] = Constants.Auto
760
+ args['pv_system_2_present'] = false
742
761
  args['pv_system_2_array_azimuth'] = 180
743
762
  args['pv_system_2_array_tilt'] = 20
744
763
  args['pv_system_2_max_power_output'] = 4000
745
- args['battery_location'] = 'none'
746
- args['battery_power'] = Constants.Auto
747
- args['battery_capacity'] = Constants.Auto
764
+ args['battery_present'] = false
765
+ args['lighting_present'] = true
748
766
  args['lighting_interior_fraction_cfl'] = 0.4
749
767
  args['lighting_interior_fraction_lfl'] = 0.1
750
768
  args['lighting_interior_fraction_led'] = 0.25
751
- args['lighting_interior_usage_multiplier'] = 1.0
752
769
  args['lighting_exterior_fraction_cfl'] = 0.4
753
770
  args['lighting_exterior_fraction_lfl'] = 0.1
754
771
  args['lighting_exterior_fraction_led'] = 0.25
755
- args['lighting_exterior_usage_multiplier'] = 1.0
756
772
  args['lighting_garage_fraction_cfl'] = 0.4
757
773
  args['lighting_garage_fraction_lfl'] = 0.1
758
774
  args['lighting_garage_fraction_led'] = 0.25
759
- args['lighting_garage_usage_multiplier'] = 1.0
760
775
  args['holiday_lighting_present'] = false
761
- args['holiday_lighting_daily_kwh'] = Constants.Auto
762
776
  args['dehumidifier_type'] = 'none'
763
777
  args['dehumidifier_efficiency_type'] = 'EnergyFactor'
764
778
  args['dehumidifier_efficiency'] = 1.8
765
779
  args['dehumidifier_capacity'] = 40
766
780
  args['dehumidifier_rh_setpoint'] = 0.5
767
781
  args['dehumidifier_fraction_dehumidification_load_served'] = 1
782
+ args['clothes_washer_present'] = true
768
783
  args['clothes_washer_location'] = HPXML::LocationLivingSpace
769
784
  args['clothes_washer_efficiency_type'] = 'IntegratedModifiedEnergyFactor'
770
785
  args['clothes_washer_efficiency'] = 1.21
@@ -774,13 +789,13 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
774
789
  args['clothes_washer_label_annual_gas_cost'] = 27.0
775
790
  args['clothes_washer_label_usage'] = 6.0
776
791
  args['clothes_washer_capacity'] = 3.2
777
- args['clothes_washer_usage_multiplier'] = 1.0
792
+ args['clothes_dryer_present'] = true
778
793
  args['clothes_dryer_location'] = HPXML::LocationLivingSpace
779
794
  args['clothes_dryer_fuel_type'] = HPXML::FuelTypeElectricity
780
795
  args['clothes_dryer_efficiency_type'] = 'CombinedEnergyFactor'
781
796
  args['clothes_dryer_efficiency'] = 3.73
782
797
  args['clothes_dryer_vented_flow_rate'] = 150.0
783
- args['clothes_dryer_usage_multiplier'] = 1.0
798
+ args['dishwasher_present'] = true
784
799
  args['dishwasher_location'] = HPXML::LocationLivingSpace
785
800
  args['dishwasher_efficiency_type'] = 'RatedAnnualkWh'
786
801
  args['dishwasher_efficiency'] = 307
@@ -789,66 +804,35 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
789
804
  args['dishwasher_label_annual_gas_cost'] = 22.32
790
805
  args['dishwasher_label_usage'] = 4.0
791
806
  args['dishwasher_place_setting_capacity'] = 12
792
- args['dishwasher_usage_multiplier'] = 1.0
807
+ args['refrigerator_present'] = true
793
808
  args['refrigerator_location'] = HPXML::LocationLivingSpace
794
809
  args['refrigerator_rated_annual_kwh'] = 650.0
795
- args['refrigerator_usage_multiplier'] = 1.0
796
- args['extra_refrigerator_location'] = 'none'
797
- args['extra_refrigerator_rated_annual_kwh'] = Constants.Auto
798
- args['extra_refrigerator_usage_multiplier'] = 1.0
799
- args['freezer_location'] = 'none'
800
- args['freezer_rated_annual_kwh'] = Constants.Auto
801
- args['freezer_usage_multiplier'] = 1.0
810
+ args['extra_refrigerator_present'] = false
811
+ args['freezer_present'] = false
812
+ args['cooking_range_oven_present'] = true
802
813
  args['cooking_range_oven_location'] = HPXML::LocationLivingSpace
803
814
  args['cooking_range_oven_fuel_type'] = HPXML::FuelTypeElectricity
804
815
  args['cooking_range_oven_is_induction'] = false
805
816
  args['cooking_range_oven_is_convection'] = false
806
- args['cooking_range_oven_usage_multiplier'] = 1.0
807
817
  args['ceiling_fan_present'] = false
808
- args['ceiling_fan_efficiency'] = Constants.Auto
809
- args['ceiling_fan_quantity'] = Constants.Auto
810
- args['ceiling_fan_cooling_setpoint_temp_offset'] = 0
811
818
  args['misc_plug_loads_television_present'] = true
812
819
  args['misc_plug_loads_television_annual_kwh'] = 620.0
813
- args['misc_plug_loads_television_usage_multiplier'] = 1.0
814
820
  args['misc_plug_loads_other_annual_kwh'] = 2457.0
815
821
  args['misc_plug_loads_other_frac_sensible'] = 0.855
816
822
  args['misc_plug_loads_other_frac_latent'] = 0.045
817
- args['misc_plug_loads_other_usage_multiplier'] = 1.0
818
823
  args['misc_plug_loads_well_pump_present'] = false
819
- args['misc_plug_loads_well_pump_annual_kwh'] = Constants.Auto
820
- args['misc_plug_loads_well_pump_usage_multiplier'] = 0.0
821
824
  args['misc_plug_loads_vehicle_present'] = false
822
- args['misc_plug_loads_vehicle_annual_kwh'] = Constants.Auto
823
- args['misc_plug_loads_vehicle_usage_multiplier'] = 0.0
824
825
  args['misc_fuel_loads_grill_present'] = false
825
826
  args['misc_fuel_loads_grill_fuel_type'] = HPXML::FuelTypeNaturalGas
826
- args['misc_fuel_loads_grill_annual_therm'] = Constants.Auto
827
- args['misc_fuel_loads_grill_usage_multiplier'] = 0.0
828
827
  args['misc_fuel_loads_lighting_present'] = false
829
828
  args['misc_fuel_loads_lighting_fuel_type'] = HPXML::FuelTypeNaturalGas
830
- args['misc_fuel_loads_lighting_annual_therm'] = Constants.Auto
831
- args['misc_fuel_loads_lighting_usage_multiplier'] = 0.0
832
829
  args['misc_fuel_loads_fireplace_present'] = false
833
830
  args['misc_fuel_loads_fireplace_fuel_type'] = HPXML::FuelTypeNaturalGas
834
- args['misc_fuel_loads_fireplace_annual_therm'] = Constants.Auto
835
- args['misc_fuel_loads_fireplace_frac_sensible'] = Constants.Auto
836
- args['misc_fuel_loads_fireplace_frac_latent'] = Constants.Auto
837
- args['misc_fuel_loads_fireplace_usage_multiplier'] = 0.0
838
831
  args['pool_present'] = false
839
- args['pool_pump_annual_kwh'] = Constants.Auto
840
- args['pool_pump_usage_multiplier'] = 1.0
841
832
  args['pool_heater_type'] = HPXML::HeaterTypeElectricResistance
842
- args['pool_heater_annual_kwh'] = Constants.Auto
843
- args['pool_heater_annual_therm'] = Constants.Auto
844
- args['pool_heater_usage_multiplier'] = 1.0
845
833
  args['hot_tub_present'] = false
846
- args['hot_tub_pump_annual_kwh'] = Constants.Auto
847
- args['hot_tub_pump_usage_multiplier'] = 1.0
848
834
  args['hot_tub_heater_type'] = HPXML::HeaterTypeElectricResistance
849
- args['hot_tub_heater_annual_kwh'] = Constants.Auto
850
- args['hot_tub_heater_annual_therm'] = Constants.Auto
851
- args['hot_tub_heater_usage_multiplier'] = 1.0
835
+ args['utility_bill_scenario_names'] = 'Bills'
852
836
  elsif ['ASHRAE_Standard_140/L100AC.xml'].include? hpxml_file
853
837
  args['weather_station_epw_filepath'] = 'USA_CO_Colorado.Springs-Peterson.Field.724660_TMY3.epw'
854
838
  args['geometry_unit_type'] = HPXML::ResidentialTypeSFD
@@ -874,12 +858,10 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
874
858
  args['geometry_attic_type'] = HPXML::AtticTypeVented
875
859
  args['geometry_eaves_depth'] = 0
876
860
  args['geometry_unit_num_bedrooms'] = 3
877
- args['geometry_unit_num_bathrooms'] = Constants.Auto
878
861
  args['geometry_unit_num_occupants'] = 0
879
- args['geometry_has_flue_or_chimney'] = Constants.Auto
880
862
  args['floor_over_foundation_assembly_r'] = 14.15
881
863
  args['floor_over_garage_assembly_r'] = 0
882
- args['foundation_wall_type'] = Constants.Auto
864
+ args['floor_type'] = HPXML::FloorTypeWoodFrame
883
865
  args['foundation_wall_thickness'] = 6.0
884
866
  args['foundation_wall_insulation_r'] = 0
885
867
  args['foundation_wall_insulation_distance_to_top'] = 0
@@ -902,10 +884,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
902
884
  args['neighbor_back_distance'] = 0
903
885
  args['neighbor_left_distance'] = 0
904
886
  args['neighbor_right_distance'] = 0
905
- args['neighbor_front_height'] = Constants.Auto
906
- args['neighbor_back_height'] = Constants.Auto
907
- args['neighbor_left_height'] = Constants.Auto
908
- args['neighbor_right_height'] = Constants.Auto
909
887
  args['wall_type'] = HPXML::WallTypeWoodStud
910
888
  args['wall_siding_type'] = HPXML::SidingTypeWood
911
889
  args['wall_color'] = HPXML::ColorMedium
@@ -947,18 +925,15 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
947
925
  args['air_leakage_units'] = HPXML::UnitsACHNatural
948
926
  args['air_leakage_house_pressure'] = 50
949
927
  args['air_leakage_value'] = 0.67
950
- args['site_shielding_of_home'] = Constants.Auto
951
928
  args['heating_system_type'] = 'none'
952
929
  args['heating_system_fuel'] = HPXML::FuelTypeNaturalGas
953
930
  args['heating_system_heating_efficiency'] = 0
954
- args['heating_system_heating_capacity'] = Constants.Auto
955
931
  args['heating_system_fraction_heat_load_served'] = 0
956
932
  args['cooling_system_type'] = 'none'
957
933
  args['cooling_system_cooling_efficiency_type'] = HPXML::UnitsSEER
958
934
  args['cooling_system_cooling_efficiency'] = 0
959
935
  args['cooling_system_cooling_compressor_type'] = HPXML::HVACCompressorTypeSingleStage
960
936
  args['cooling_system_cooling_sensible_heat_fraction'] = 0
961
- args['cooling_system_cooling_capacity'] = Constants.Auto
962
937
  args['cooling_system_fraction_cool_load_served'] = 0
963
938
  args['cooling_system_is_ducted'] = false
964
939
  args['heat_pump_type'] = 'none'
@@ -968,15 +943,11 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
968
943
  args['heat_pump_cooling_efficiency'] = 0
969
944
  args['heat_pump_cooling_compressor_type'] = HPXML::HVACCompressorTypeSingleStage
970
945
  args['heat_pump_cooling_sensible_heat_fraction'] = 0
971
- args['heat_pump_heating_capacity'] = Constants.Auto
972
- args['heat_pump_heating_capacity_17_f'] = Constants.Auto
973
- args['heat_pump_cooling_capacity'] = Constants.Auto
974
946
  args['heat_pump_fraction_heat_load_served'] = 0
975
947
  args['heat_pump_fraction_cool_load_served'] = 0
976
948
  args['heat_pump_backup_type'] = 'none'
977
949
  args['heat_pump_backup_fuel'] = HPXML::FuelTypeElectricity
978
950
  args['heat_pump_backup_heating_efficiency'] = 0
979
- args['heat_pump_backup_heating_capacity'] = Constants.Auto
980
951
  args['hvac_control_heating_weekday_setpoint'] = 68
981
952
  args['hvac_control_heating_weekend_setpoint'] = 68
982
953
  args['hvac_control_cooling_weekday_setpoint'] = 78
@@ -993,7 +964,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
993
964
  args['heating_system_2_type'] = 'none'
994
965
  args['heating_system_2_fuel'] = HPXML::FuelTypeElectricity
995
966
  args['heating_system_2_heating_efficiency'] = 0
996
- args['heating_system_2_heating_capacity'] = Constants.Auto
997
967
  args['heating_system_2_fraction_heat_load_served'] = 0
998
968
  args['mech_vent_fan_type'] = 'none'
999
969
  args['mech_vent_flow_rate'] = 0
@@ -1013,8 +983,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1013
983
  args['kitchen_fans_quantity'] = 0
1014
984
  args['bathroom_fans_quantity'] = 0
1015
985
  args['whole_house_fan_present'] = false
1016
- args['whole_house_fan_flow_rate'] = 0
1017
- args['whole_house_fan_power'] = 0
1018
986
  args['water_heater_type'] = 'none'
1019
987
  args['water_heater_fuel_type'] = HPXML::FuelTypeElectricity
1020
988
  args['water_heater_location'] = HPXML::LocationLivingSpace
@@ -1022,8 +990,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1022
990
  args['water_heater_efficiency_type'] = 'EnergyFactor'
1023
991
  args['water_heater_efficiency'] = 0
1024
992
  args['water_heater_recovery_efficiency'] = 0
1025
- args['water_heater_heating_capacity'] = Constants.Auto
1026
- args['water_heater_standby_loss'] = 0
1027
993
  args['water_heater_jacket_rvalue'] = 0
1028
994
  args['water_heater_setpoint_temperature'] = 0
1029
995
  args['water_heater_num_units_served'] = 0
@@ -1048,26 +1014,16 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1048
1014
  args['solar_thermal_collector_tilt'] = 0
1049
1015
  args['solar_thermal_collector_rated_optical_efficiency'] = 0
1050
1016
  args['solar_thermal_collector_rated_thermal_losses'] = 0
1051
- args['solar_thermal_storage_volume'] = Constants.Auto
1052
1017
  args['solar_thermal_solar_fraction'] = 0
1053
- args['pv_system_module_type'] = 'none'
1054
- args['pv_system_location'] = Constants.Auto
1055
- args['pv_system_tracking'] = Constants.Auto
1018
+ args['pv_system_present'] = false
1056
1019
  args['pv_system_array_azimuth'] = 0
1057
1020
  args['pv_system_array_tilt'] = 0
1058
1021
  args['pv_system_max_power_output'] = 0
1059
- args['pv_system_inverter_efficiency'] = 0
1060
- args['pv_system_system_losses_fraction'] = 0
1061
- args['pv_system_num_bedrooms_served'] = 0
1062
- args['pv_system_2_module_type'] = 'none'
1063
- args['pv_system_2_location'] = Constants.Auto
1064
- args['pv_system_2_tracking'] = Constants.Auto
1022
+ args['pv_system_2_present'] = false
1065
1023
  args['pv_system_2_array_azimuth'] = 0
1066
1024
  args['pv_system_2_array_tilt'] = 0
1067
1025
  args['pv_system_2_max_power_output'] = 0
1068
- args['battery_location'] = 'none'
1069
- args['battery_power'] = Constants.Auto
1070
- args['battery_capacity'] = Constants.Auto
1026
+ args['battery_present'] = false
1071
1027
  args['lighting_present'] = false
1072
1028
  args['lighting_interior_fraction_cfl'] = 0
1073
1029
  args['lighting_interior_fraction_lfl'] = 0
@@ -1082,97 +1038,41 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1082
1038
  args['lighting_garage_fraction_led'] = 0
1083
1039
  args['lighting_garage_usage_multiplier'] = 0
1084
1040
  args['holiday_lighting_present'] = false
1085
- args['holiday_lighting_daily_kwh'] = Constants.Auto
1086
1041
  args['dehumidifier_type'] = 'none'
1087
1042
  args['dehumidifier_efficiency_type'] = 'EnergyFactor'
1088
1043
  args['dehumidifier_efficiency'] = 0
1089
1044
  args['dehumidifier_capacity'] = 0
1090
1045
  args['dehumidifier_rh_setpoint'] = 0
1091
1046
  args['dehumidifier_fraction_dehumidification_load_served'] = 0
1092
- args['clothes_washer_location'] = 'none'
1047
+ args['clothes_washer_present'] = false
1093
1048
  args['clothes_washer_efficiency_type'] = 'IntegratedModifiedEnergyFactor'
1094
- args['clothes_washer_efficiency'] = 0
1095
- args['clothes_washer_rated_annual_kwh'] = 0
1096
- args['clothes_washer_label_electric_rate'] = 0
1097
- args['clothes_washer_label_gas_rate'] = 0
1098
- args['clothes_washer_label_annual_gas_cost'] = 0
1099
- args['clothes_washer_label_usage'] = 0
1100
- args['clothes_washer_capacity'] = 0
1101
- args['clothes_washer_usage_multiplier'] = 0
1102
- args['clothes_dryer_location'] = 'none'
1049
+ args['clothes_dryer_present'] = false
1103
1050
  args['clothes_dryer_fuel_type'] = HPXML::FuelTypeElectricity
1104
1051
  args['clothes_dryer_efficiency_type'] = 'CombinedEnergyFactor'
1105
- args['clothes_dryer_efficiency'] = 0
1106
- args['clothes_dryer_vented_flow_rate'] = 0
1107
- args['clothes_dryer_usage_multiplier'] = 0
1108
- args['dishwasher_location'] = 'none'
1052
+ args['dishwasher_present'] = false
1109
1053
  args['dishwasher_efficiency_type'] = 'RatedAnnualkWh'
1110
- args['dishwasher_efficiency'] = 0
1111
- args['dishwasher_label_electric_rate'] = 0
1112
- args['dishwasher_label_gas_rate'] = 0
1113
- args['dishwasher_label_annual_gas_cost'] = 0
1114
- args['dishwasher_label_usage'] = 0
1115
- args['dishwasher_place_setting_capacity'] = 0
1116
- args['dishwasher_usage_multiplier'] = 0
1117
- args['refrigerator_location'] = 'none'
1118
- args['refrigerator_rated_annual_kwh'] = 0
1119
- args['refrigerator_usage_multiplier'] = 0
1120
- args['extra_refrigerator_location'] = 'none'
1121
- args['extra_refrigerator_rated_annual_kwh'] = Constants.Auto
1122
- args['extra_refrigerator_usage_multiplier'] = 0
1123
- args['freezer_location'] = 'none'
1124
- args['freezer_rated_annual_kwh'] = Constants.Auto
1125
- args['freezer_usage_multiplier'] = 0
1126
- args['cooking_range_oven_location'] = 'none'
1054
+ args['refrigerator_present'] = false
1055
+ args['extra_refrigerator_present'] = false
1056
+ args['freezer_present'] = false
1057
+ args['cooking_range_oven_present'] = false
1127
1058
  args['cooking_range_oven_fuel_type'] = HPXML::FuelTypeElectricity
1128
- args['cooking_range_oven_is_induction'] = false
1129
- args['cooking_range_oven_is_convection'] = false
1130
- args['cooking_range_oven_usage_multiplier'] = 0
1131
1059
  args['ceiling_fan_present'] = false
1132
- args['ceiling_fan_efficiency'] = Constants.Auto
1133
- args['ceiling_fan_quantity'] = Constants.Auto
1134
- args['ceiling_fan_cooling_setpoint_temp_offset'] = 0
1135
1060
  args['misc_plug_loads_television_present'] = false
1136
- args['misc_plug_loads_television_annual_kwh'] = 0
1137
- args['misc_plug_loads_television_usage_multiplier'] = 0
1138
1061
  args['misc_plug_loads_other_annual_kwh'] = 7302.0
1139
1062
  args['misc_plug_loads_other_frac_sensible'] = 0.822
1140
1063
  args['misc_plug_loads_other_frac_latent'] = 0.178
1141
- args['misc_plug_loads_other_usage_multiplier'] = 1.0
1142
1064
  args['misc_plug_loads_well_pump_present'] = false
1143
- args['misc_plug_loads_well_pump_annual_kwh'] = Constants.Auto
1144
- args['misc_plug_loads_well_pump_usage_multiplier'] = 0
1145
1065
  args['misc_plug_loads_vehicle_present'] = false
1146
- args['misc_plug_loads_vehicle_annual_kwh'] = Constants.Auto
1147
- args['misc_plug_loads_vehicle_usage_multiplier'] = 0
1148
1066
  args['misc_fuel_loads_grill_present'] = false
1149
1067
  args['misc_fuel_loads_grill_fuel_type'] = HPXML::FuelTypeNaturalGas
1150
- args['misc_fuel_loads_grill_annual_therm'] = Constants.Auto
1151
- args['misc_fuel_loads_grill_usage_multiplier'] = 0
1152
1068
  args['misc_fuel_loads_lighting_present'] = false
1153
1069
  args['misc_fuel_loads_lighting_fuel_type'] = HPXML::FuelTypeNaturalGas
1154
- args['misc_fuel_loads_lighting_annual_therm'] = Constants.Auto
1155
- args['misc_fuel_loads_lighting_usage_multiplier'] = 0
1156
1070
  args['misc_fuel_loads_fireplace_present'] = false
1157
1071
  args['misc_fuel_loads_fireplace_fuel_type'] = HPXML::FuelTypeNaturalGas
1158
- args['misc_fuel_loads_fireplace_annual_therm'] = Constants.Auto
1159
- args['misc_fuel_loads_fireplace_frac_sensible'] = Constants.Auto
1160
- args['misc_fuel_loads_fireplace_frac_latent'] = Constants.Auto
1161
- args['misc_fuel_loads_fireplace_usage_multiplier'] = 0
1162
1072
  args['pool_present'] = false
1163
- args['pool_pump_annual_kwh'] = Constants.Auto
1164
- args['pool_pump_usage_multiplier'] = 0
1165
1073
  args['pool_heater_type'] = HPXML::HeaterTypeElectricResistance
1166
- args['pool_heater_annual_kwh'] = Constants.Auto
1167
- args['pool_heater_annual_therm'] = Constants.Auto
1168
- args['pool_heater_usage_multiplier'] = 0
1169
1074
  args['hot_tub_present'] = false
1170
- args['hot_tub_pump_annual_kwh'] = Constants.Auto
1171
- args['hot_tub_pump_usage_multiplier'] = 0
1172
1075
  args['hot_tub_heater_type'] = HPXML::HeaterTypeElectricResistance
1173
- args['hot_tub_heater_annual_kwh'] = Constants.Auto
1174
- args['hot_tub_heater_annual_therm'] = Constants.Auto
1175
- args['hot_tub_heater_usage_multiplier'] = 0
1176
1076
  end
1177
1077
 
1178
1078
  # ASHRAE 140
@@ -1249,7 +1149,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1249
1149
  if ['base-appliances-coal.xml'].include? hpxml_file
1250
1150
  args['clothes_dryer_fuel_type'] = HPXML::FuelTypeCoal
1251
1151
  args['clothes_dryer_efficiency'] = 3.3
1252
- args['clothes_dryer_vented_flow_rate'] = Constants.Auto
1152
+ args.delete('clothes_dryer_vented_flow_rate')
1253
1153
  args['cooking_range_oven_fuel_type'] = HPXML::FuelTypeCoal
1254
1154
  elsif ['base-appliances-dehumidifier.xml'].include? hpxml_file
1255
1155
  args['dehumidifier_type'] = HPXML::DehumidifierTypePortable
@@ -1261,7 +1161,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1261
1161
  elsif ['base-appliances-gas.xml'].include? hpxml_file
1262
1162
  args['clothes_dryer_fuel_type'] = HPXML::FuelTypeNaturalGas
1263
1163
  args['clothes_dryer_efficiency'] = 3.3
1264
- args['clothes_dryer_vented_flow_rate'] = Constants.Auto
1164
+ args.delete('clothes_dryer_vented_flow_rate')
1265
1165
  args['cooking_range_oven_fuel_type'] = HPXML::FuelTypeNaturalGas
1266
1166
  elsif ['base-appliances-modified.xml'].include? hpxml_file
1267
1167
  args['clothes_washer_efficiency_type'] = 'ModifiedEnergyFactor'
@@ -1273,27 +1173,27 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1273
1173
  args['dishwasher_efficiency'] = 0.7
1274
1174
  args['dishwasher_place_setting_capacity'] = 6
1275
1175
  elsif ['base-appliances-none.xml'].include? hpxml_file
1276
- args['clothes_washer_location'] = 'none'
1277
- args['clothes_dryer_location'] = 'none'
1278
- args['dishwasher_location'] = 'none'
1279
- args['refrigerator_location'] = 'none'
1280
- args['cooking_range_oven_location'] = 'none'
1176
+ args['clothes_washer_present'] = false
1177
+ args['clothes_dryer_present'] = false
1178
+ args['dishwasher_present'] = false
1179
+ args['refrigerator_present'] = false
1180
+ args['cooking_range_oven_present'] = false
1281
1181
  elsif ['base-appliances-oil.xml',
1282
1182
  'base-appliances-oil-location-miami-fl.xml'].include? hpxml_file
1283
1183
  args['clothes_dryer_fuel_type'] = HPXML::FuelTypeOil
1284
1184
  args['clothes_dryer_efficiency'] = 3.3
1285
- args['clothes_dryer_vented_flow_rate'] = Constants.Auto
1185
+ args.delete('clothes_dryer_vented_flow_rate')
1286
1186
  args['cooking_range_oven_fuel_type'] = HPXML::FuelTypeOil
1287
1187
  elsif ['base-appliances-propane.xml',
1288
1188
  'base-appliances-propane-location-portland-or.xml'].include? hpxml_file
1289
1189
  args['clothes_dryer_fuel_type'] = HPXML::FuelTypePropane
1290
1190
  args['clothes_dryer_efficiency'] = 3.3
1291
- args['clothes_dryer_vented_flow_rate'] = Constants.Auto
1191
+ args.delete('clothes_dryer_vented_flow_rate')
1292
1192
  args['cooking_range_oven_fuel_type'] = HPXML::FuelTypePropane
1293
1193
  elsif ['base-appliances-wood.xml'].include? hpxml_file
1294
1194
  args['clothes_dryer_fuel_type'] = HPXML::FuelTypeWoodCord
1295
1195
  args['clothes_dryer_efficiency'] = 3.3
1296
- args['clothes_dryer_vented_flow_rate'] = Constants.Auto
1196
+ args.delete('clothes_dryer_vented_flow_rate')
1297
1197
  args['cooking_range_oven_fuel_type'] = HPXML::FuelTypeWoodCord
1298
1198
  end
1299
1199
 
@@ -1352,6 +1252,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1352
1252
  if ['base-bldgtype-single-family-attached.xml'].include? hpxml_file
1353
1253
  args['geometry_unit_type'] = HPXML::ResidentialTypeSFA
1354
1254
  args['geometry_unit_cfa'] = 1800.0
1255
+ args['geometry_unit_aspect_ratio'] = 0.6667
1355
1256
  args['geometry_building_num_units'] = 3
1356
1257
  args['geometry_unit_right_wall_is_adiabatic'] = true
1357
1258
  args['window_front_wwr'] = 0.18
@@ -1384,6 +1285,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1384
1285
  if ['base-bldgtype-multifamily.xml'].include? hpxml_file
1385
1286
  args['geometry_unit_type'] = HPXML::ResidentialTypeApartment
1386
1287
  args['geometry_unit_cfa'] = 900.0
1288
+ args['geometry_unit_aspect_ratio'] = 0.6667
1387
1289
  args['geometry_foundation_type'] = HPXML::FoundationTypeAboveApartment
1388
1290
  args['geometry_attic_type'] = HPXML::AtticTypeBelowApartment
1389
1291
  args['geometry_unit_right_wall_is_adiabatic'] = true
@@ -1432,6 +1334,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1432
1334
  args['mech_vent_shared_precooling_efficiency'] = 4.0
1433
1335
  args['mech_vent_shared_precooling_fraction_cool_load_served'] = 0.8
1434
1336
  elsif ['base-bldgtype-multifamily-shared-pv.xml'].include? hpxml_file
1337
+ args['pv_system_present'] = true
1435
1338
  args['pv_system_num_bedrooms_served'] = 6 * 3
1436
1339
  args['pv_system_location'] = HPXML::LocationGround
1437
1340
  args['pv_system_module_type'] = HPXML::PVModuleTypeStandard
@@ -1457,19 +1360,19 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1457
1360
  'base-bldgtype-multifamily-calctype-operational.xml'].include? hpxml_file
1458
1361
  args['occupancy_calculation_type'] = HPXML::OccupancyCalculationTypeOperational
1459
1362
  args['geometry_unit_num_occupants'] = 1
1460
- args['misc_plug_loads_television_annual_kwh'] = Constants.Auto
1461
- args['misc_plug_loads_other_annual_kwh'] = Constants.Auto
1462
- args['pool_pump_annual_kwh'] = Constants.Auto
1463
- args['pool_heater_annual_therm'] = Constants.Auto
1464
- args['pool_heater_annual_kwh'] = Constants.Auto
1465
- args['hot_tub_pump_annual_kwh'] = Constants.Auto
1466
- args['hot_tub_heater_annual_therm'] = Constants.Auto
1467
- args['hot_tub_heater_annual_kwh'] = Constants.Auto
1468
- args['misc_plug_loads_well_pump_annual_kwh'] = Constants.Auto
1469
- args['misc_plug_loads_vehicle_annual_kwh'] = Constants.Auto
1470
- args['misc_fuel_loads_grill_annual_therm'] = Constants.Auto
1471
- args['misc_fuel_loads_lighting_annual_therm'] = Constants.Auto
1472
- args['misc_fuel_loads_fireplace_annual_therm'] = Constants.Auto
1363
+ args.delete('misc_plug_loads_television_annual_kwh')
1364
+ args.delete('misc_plug_loads_other_annual_kwh')
1365
+ args.delete('pool_pump_annual_kwh')
1366
+ args.delete('pool_heater_annual_therm')
1367
+ args.delete('pool_heater_annual_kwh')
1368
+ args.delete('hot_tub_pump_annual_kwh')
1369
+ args.delete('hot_tub_heater_annual_therm')
1370
+ args.delete('hot_tub_heater_annual_kwh')
1371
+ args.delete('misc_plug_loads_well_pump_annual_kwh')
1372
+ args.delete('misc_plug_loads_vehicle_annual_kwh')
1373
+ args.delete('misc_fuel_loads_grill_annual_therm')
1374
+ args.delete('misc_fuel_loads_lighting_annual_therm')
1375
+ args.delete('misc_fuel_loads_fireplace_annual_therm')
1473
1376
  elsif ['base-calctype-operational-misc-defaults.xml'].include? hpxml_file
1474
1377
  args['occupancy_calculation_type'] = HPXML::OccupancyCalculationTypeOperational
1475
1378
  args['geometry_unit_num_occupants'] = 5
@@ -1478,7 +1381,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1478
1381
  # DHW
1479
1382
  if ['base-dhw-combi-tankless.xml'].include? hpxml_file
1480
1383
  args['water_heater_type'] = HPXML::WaterHeaterTypeCombiTankless
1481
- args['water_heater_tank_volume'] = Constants.Auto
1384
+ args.delete('water_heater_tank_volume')
1482
1385
  elsif ['base-dhw-combi-tankless-outside.xml',
1483
1386
  'base-dhw-indirect-outside.xml',
1484
1387
  'base-dhw-tank-gas-outside.xml',
@@ -1507,7 +1410,6 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1507
1410
  args['water_fixtures_sink_low_flow'] = true
1508
1411
  elsif ['base-dhw-none.xml'].include? hpxml_file
1509
1412
  args['water_heater_type'] = 'none'
1510
- args['dishwasher_location'] = 'none'
1511
1413
  elsif ['base-dhw-recirc-demand.xml'].include? hpxml_file
1512
1414
  args['hot_water_distribution_system_type'] = HPXML::DHWDistTypeRecirc
1513
1415
  args['hot_water_distribution_recirc_control_type'] = HPXML::DHWRecirControlTypeSensor
@@ -1581,7 +1483,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1581
1483
  args['solar_thermal_storage_volume'] = 60
1582
1484
  elsif ['base-dhw-tankless-electric.xml'].include? hpxml_file
1583
1485
  args['water_heater_type'] = HPXML::WaterHeaterTypeTankless
1584
- args['water_heater_tank_volume'] = Constants.Auto
1486
+ args.delete('water_heater_tank_volume')
1585
1487
  args['water_heater_efficiency'] = 0.99
1586
1488
  elsif ['base-dhw-tankless-electric-uef.xml'].include? hpxml_file
1587
1489
  args['water_heater_efficiency_type'] = 'UniformEnergyFactor'
@@ -1589,7 +1491,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1589
1491
  elsif ['base-dhw-tankless-gas.xml'].include? hpxml_file
1590
1492
  args['water_heater_type'] = HPXML::WaterHeaterTypeTankless
1591
1493
  args['water_heater_fuel_type'] = HPXML::FuelTypeNaturalGas
1592
- args['water_heater_tank_volume'] = Constants.Auto
1494
+ args.delete('water_heater_tank_volume')
1593
1495
  args['water_heater_efficiency'] = 0.82
1594
1496
  elsif ['base-dhw-tankless-gas-uef.xml'].include? hpxml_file
1595
1497
  args['water_heater_efficiency_type'] = 'UniformEnergyFactor'
@@ -1609,7 +1511,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1609
1511
  elsif ['base-dhw-desuperheater-tankless.xml'].include? hpxml_file
1610
1512
  args['water_heater_uses_desuperheater'] = true
1611
1513
  args['water_heater_type'] = HPXML::WaterHeaterTypeTankless
1612
- args['water_heater_tank_volume'] = Constants.Auto
1514
+ args.delete('water_heater_tank_volume')
1613
1515
  args['water_heater_efficiency'] = 0.99
1614
1516
  elsif ['base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml'].include? hpxml_file
1615
1517
  args['water_heater_operating_mode'] = HPXML::WaterHeaterOperatingModeHeatPumpOnly
@@ -1688,6 +1590,8 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1688
1590
  args['overhangs_right_depth'] = 1.5
1689
1591
  args['overhangs_right_distance_to_top_of_window'] = 2.0
1690
1592
  args['overhangs_right_distance_to_bottom_of_window'] = 6.0
1593
+ elsif ['base-enclosure-windows-natural-ventilation-availability.xml'].include? hpxml_file
1594
+ args['window_natvent_availability'] = 7
1691
1595
  elsif ['base-enclosure-windows-none.xml'].include? hpxml_file
1692
1596
  args['window_area_front'] = 0
1693
1597
  args['window_area_back'] = 0
@@ -1715,7 +1619,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1715
1619
  elsif ['base-foundation-conditioned-basement-slab-insulation.xml'].include? hpxml_file
1716
1620
  args['slab_under_insulation_r'] = 10
1717
1621
  args['slab_under_width'] = 4
1718
- elsif ['base-foundation-conditioned-basement-wall-interior-insulation.xml'].include? hpxml_file
1622
+ elsif ['base-foundation-conditioned-basement-wall-insulation.xml'].include? hpxml_file
1719
1623
  args['foundation_wall_type'] = HPXML::FoundationWallTypeConcreteBlockFoamCore
1720
1624
  args['foundation_wall_insulation_r'] = 18.9
1721
1625
  args['foundation_wall_insulation_distance_to_top'] = 1.0
@@ -1724,7 +1628,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1724
1628
  args['geometry_foundation_type'] = HPXML::FoundationTypeSlab
1725
1629
  args['geometry_foundation_height'] = 0.0
1726
1630
  args['geometry_foundation_height_above_grade'] = 0.0
1727
- args['foundation_wall_insulation_distance_to_bottom'] = Constants.Auto
1631
+ args.delete('foundation_wall_insulation_distance_to_bottom')
1728
1632
  args['slab_under_insulation_r'] = 5
1729
1633
  args['slab_under_width'] = 999
1730
1634
  args['slab_carpet_fraction'] = 1.0
@@ -1805,6 +1709,11 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1805
1709
  args['heat_pump_type'] = HPXML::HVACTypeHeatPumpAirToAir
1806
1710
  args['heat_pump_heating_capacity_17_f'] = args['heat_pump_heating_capacity'] * 0.6
1807
1711
  args['heat_pump_backup_type'] = HPXML::HeatPumpBackupTypeIntegrated
1712
+ elsif ['base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml'].include? hpxml_file
1713
+ args['heat_pump_cooling_efficiency_type'] = HPXML::UnitsSEER2
1714
+ args['heat_pump_cooling_efficiency'] = (args['heat_pump_cooling_efficiency'] * 0.95).round(1)
1715
+ args['heat_pump_heating_efficiency_type'] = HPXML::UnitsHSPF2
1716
+ args['heat_pump_heating_efficiency'] = (args['heat_pump_heating_efficiency'] * 0.85).round(1)
1808
1717
  elsif ['base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml'].include? hpxml_file
1809
1718
  args['heat_pump_heating_capacity'] = 0.0
1810
1719
  args['heat_pump_heating_capacity_17_f'] = 0.0
@@ -1848,21 +1757,23 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1848
1757
  elsif ['base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml'].include? hpxml_file
1849
1758
  args['heat_pump_backup_heating_switchover_temp'] = 25
1850
1759
  elsif hpxml_file.include? 'autosize'
1851
- args['heating_system_heating_capacity'] = Constants.Auto
1852
- args['heating_system_2_heating_capacity'] = Constants.Auto
1853
- args['cooling_system_cooling_capacity'] = Constants.Auto
1760
+ args.delete('heating_system_heating_capacity')
1761
+ args.delete('heating_system_2_heating_capacity')
1762
+ args.delete('cooling_system_cooling_capacity')
1763
+ args.delete('heat_pump_heating_capacity')
1764
+ args.delete('cooling_system_integrated_heating_system_capacity')
1854
1765
  if hpxml_file.include? 'sizing-methodology-hers'
1855
- args['heat_pump_heating_capacity'] = Constants.AutoHERSForHP
1766
+ args['heat_pump_sizing_methodology'] = HPXML::HeatPumpSizingHERS
1856
1767
  elsif hpxml_file.include? 'sizing-methodology-maxload'
1857
- args['heat_pump_heating_capacity'] = Constants.AutoMaxLoadForHP
1768
+ args['heat_pump_sizing_methodology'] = HPXML::HeatPumpSizingMaxLoad
1858
1769
  elsif hpxml_file.include? 'sizing-methodology-acca'
1859
- args['heat_pump_heating_capacity'] = Constants.Auto
1770
+ args['heat_pump_sizing_methodology'] = HPXML::HeatPumpSizingACCA
1860
1771
  else
1861
- args['heat_pump_heating_capacity'] = Constants.AutoHERSForHP
1772
+ args['heat_pump_sizing_methodology'] = HPXML::HeatPumpSizingHERS
1862
1773
  end
1863
- args['heat_pump_heating_capacity_17_f'] = Constants.Auto
1864
- args['heat_pump_backup_heating_capacity'] = Constants.Auto
1865
- args['heat_pump_cooling_capacity'] = Constants.Auto
1774
+ args.delete('heat_pump_heating_capacity_17_f')
1775
+ args.delete('heat_pump_backup_heating_capacity')
1776
+ args.delete('heat_pump_cooling_capacity')
1866
1777
  elsif ['base-hvac-boiler-coal-only.xml',
1867
1778
  'base-hvac-furnace-coal-only.xml'].include? hpxml_file
1868
1779
  args['heating_system_fuel'] = HPXML::FuelTypeCoal
@@ -1887,6 +1798,9 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
1887
1798
  args['heating_system_fuel'] = HPXML::FuelTypeWoodCord
1888
1799
  elsif ['base-hvac-central-ac-only-1-speed.xml'].include? hpxml_file
1889
1800
  args['heating_system_type'] = 'none'
1801
+ elsif ['base-hvac-central-ac-only-1-speed-seer2.xml'].include? hpxml_file
1802
+ args['cooling_system_cooling_efficiency_type'] = HPXML::UnitsSEER2
1803
+ args['cooling_system_cooling_efficiency'] = (args['cooling_system_cooling_efficiency'] * 0.95).round(1)
1890
1804
  elsif ['base-hvac-central-ac-only-2-speed.xml'].include? hpxml_file
1891
1805
  args['heating_system_type'] = 'none'
1892
1806
  args['cooling_system_cooling_efficiency'] = 18.0
@@ -2013,8 +1927,8 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2013
1927
  args['heat_pump_cooling_capacity'] = 0.0
2014
1928
  args['heat_pump_fraction_cool_load_served'] = 0
2015
1929
  elsif ['base-hvac-seasons.xml'].include? hpxml_file
2016
- args['hvac_control_heating_season_period'] = 'Nov 1 - Jun 30'
2017
- args['hvac_control_cooling_season_period'] = 'Jun 1 - Oct 31'
1930
+ args['hvac_control_heating_season_period'] = 'Nov 1 - May 1'
1931
+ args['hvac_control_cooling_season_period'] = 'Jun 1 - Oct 1'
2018
1932
  elsif ['base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml',
2019
1933
  'base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml',
2020
1934
  'base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml',
@@ -2094,6 +2008,18 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2094
2008
  elsif ['base-hvac-room-ac-only-33percent.xml'].include? hpxml_file
2095
2009
  args['cooling_system_fraction_cool_load_served'] = 0.33
2096
2010
  args['cooling_system_cooling_capacity'] = 8000.0
2011
+ elsif ['base-hvac-room-ac-with-heating.xml',
2012
+ 'base-hvac-ptac-with-heating-electricity.xml',
2013
+ 'base-hvac-ptac-with-heating-natural-gas.xml'].include? hpxml_file
2014
+ args['cooling_system_integrated_heating_system_capacity'] = 36000.0
2015
+ args['cooling_system_integrated_heating_system_fraction_heat_load_served'] = 1.0
2016
+ if ['base-hvac-ptac-with-heating-natural-gas.xml'].include? hpxml_file
2017
+ args['cooling_system_integrated_heating_system_fuel'] = HPXML::FuelTypeNaturalGas
2018
+ args['cooling_system_integrated_heating_system_efficiency_percent'] = 0.8
2019
+ else
2020
+ args['cooling_system_integrated_heating_system_fuel'] = HPXML::FuelTypeElectricity
2021
+ args['cooling_system_integrated_heating_system_efficiency_percent'] = 1.0
2022
+ end
2097
2023
  elsif ['base-hvac-setpoints.xml'].include? hpxml_file
2098
2024
  args['hvac_control_heating_weekday_setpoint'] = 60
2099
2025
  args['hvac_control_heating_weekend_setpoint'] = 60
@@ -2120,15 +2046,14 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2120
2046
  args['heat_pump_type'] = HPXML::HVACTypeHeatPumpPTHP
2121
2047
  args['heat_pump_cooling_efficiency'] = 11.4
2122
2048
  args['heat_pump_cooling_sensible_heat_fraction'] = 0.65
2049
+ elsif ['base-hvac-room-ac-with-reverse-cycle.xml'].include? hpxml_file
2050
+ args['heat_pump_type'] = HPXML::HVACTypeHeatPumpRoom
2123
2051
  elsif ['base-hvac-ptac.xml'].include? hpxml_file
2124
2052
  args['heating_system_type'] = 'none'
2125
2053
  args['cooling_system_type'] = HPXML::HVACTypePTAC
2126
2054
  args['cooling_system_cooling_efficiency_type'] = HPXML::UnitsEER
2127
2055
  args['cooling_system_cooling_efficiency'] = 10.7
2128
2056
  args['cooling_system_cooling_sensible_heat_fraction'] = 0.65
2129
- elsif ['base-hvac-ptac-with-heating.xml'].include? hpxml_file
2130
- args['heating_system_type'] = HPXML::HVACTypePTACHeating
2131
- args['heating_system_heating_efficiency'] = 1.0
2132
2057
  end
2133
2058
 
2134
2059
  # Lighting
@@ -2178,6 +2103,10 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2178
2103
  args['site_state_code'] = 'FL'
2179
2104
  args['weather_station_epw_filepath'] = 'USA_FL_Miami.Intl.AP.722020_TMY3.epw'
2180
2105
  args['heating_system_heating_capacity'] = 12000.0
2106
+ elsif ['base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload-miami-fl.xml'].include? hpxml_file
2107
+ args['site_iecc_zone'] = '1A'
2108
+ args['site_state_code'] = 'FL'
2109
+ args['weather_station_epw_filepath'] = 'USA_FL_Miami.Intl.AP.722020_TMY3.epw'
2181
2110
  elsif ['base-location-phoenix-az.xml'].include? hpxml_file
2182
2111
  args['site_iecc_zone'] = '2B'
2183
2112
  args['site_state_code'] = 'AZ'
@@ -2197,6 +2126,8 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2197
2126
  elsif ['base-misc-defaults.xml'].include? hpxml_file
2198
2127
  args.delete('site_iecc_zone')
2199
2128
  args.delete('site_state_code')
2129
+ elsif ['base-misc-ground-conductivity.xml'].include? hpxml_file
2130
+ args['site_ground_conductivity'] = 0.8
2200
2131
  end
2201
2132
 
2202
2133
  # Mechanical Ventilation
@@ -2250,6 +2181,8 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2250
2181
  args['mech_vent_fan_type'] = HPXML::MechVentTypeSupply
2251
2182
  elsif ['base-mechvent-whole-house-fan.xml'].include? hpxml_file
2252
2183
  args['whole_house_fan_present'] = true
2184
+ args['whole_house_fan_flow_rate'] = 4500.0
2185
+ args['whole_house_fan_power'] = 300.0
2253
2186
  end
2254
2187
 
2255
2188
  # Misc
@@ -2258,16 +2191,43 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2258
2191
  end
2259
2192
  if ['base-misc-additional-properties.xml'].include? hpxml_file
2260
2193
  args['additional_properties'] += '|LowIncome=false|Remodeled|Description=2-story home in Denver|comma=,|special=<|special2=>|special3=/|special4=\\'
2194
+ elsif ['base-misc-bills.xml'].include? hpxml_file
2195
+ args['utility_bill_scenario_names'] = 'Bills'
2196
+ args['utility_bill_electricity_fixed_charges'] = '12'
2197
+ args['utility_bill_electricity_marginal_rates'] = '0.12'
2198
+ args['utility_bill_natural_gas_fixed_charges'] = '12'
2199
+ args['utility_bill_natural_gas_marginal_rates'] = '1.10'
2200
+ elsif ['base-misc-bills-none.xml'].include? hpxml_file
2201
+ args.delete('utility_bill_scenario_names')
2202
+ elsif ['base-misc-bills-pv.xml'].include? hpxml_file
2203
+ args['pv_system_max_power_output'] = 10000 # Ensure there is excess annual PV production
2204
+ args['utility_bill_scenario_names'] = 'Net Metering w/ Wholesale Excess Rate, Net Metering w/ Retail Excess Rate, Feed-In Tariff'
2205
+ args['utility_bill_electricity_fixed_charges'] = '10, 10, 10'
2206
+ args['utility_bill_electricity_marginal_rates'] = '0.12, 0.12, 0.12'
2207
+ args['utility_bill_natural_gas_fixed_charges'] = '11, 11, 11'
2208
+ args['utility_bill_natural_gas_marginal_rates'] = '1.10, 1.10, 1.10'
2209
+ args['utility_bill_pv_compensation_types'] = "#{HPXML::PVCompensationTypeNetMetering}, #{HPXML::PVCompensationTypeNetMetering}, #{HPXML::PVCompensationTypeFeedInTariff}"
2210
+ args['utility_bill_pv_net_metering_annual_excess_sellback_rate_types'] = "#{HPXML::PVAnnualExcessSellbackRateTypeUserSpecified}, #{HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost}, NA"
2211
+ args['utility_bill_pv_net_metering_annual_excess_sellback_rates'] = '0.035, NA, NA'
2212
+ args['utility_bill_pv_feed_in_tariff_rates'] = 'NA, NA, 0.13'
2213
+ args['utility_bill_pv_monthly_grid_connection_fee_units'] = "#{HPXML::UnitsDollarsPerkW}, #{HPXML::UnitsDollarsPerkW}, #{HPXML::UnitsDollars}"
2214
+ args['utility_bill_pv_monthly_grid_connection_fees'] = '2.5, 2.5, 7.5'
2215
+ elsif ['base-misc-bills-pv-detailed-only.xml'].include? hpxml_file
2216
+ args['utility_bill_scenario_names'] = 'Tiered, TOU, Tiered and TOU, Real-Time Pricing'
2217
+ args['utility_bill_electricity_filepaths'] = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json, ../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json, ../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json, ../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json'
2218
+ elsif ['base-misc-bills-pv-mixed.xml'].include? hpxml_file
2219
+ args['utility_bill_scenario_names'] = 'Simple, Detailed'
2220
+ args['utility_bill_electricity_filepaths'] = 'NA, ../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json'
2261
2221
  elsif ['base-misc-defaults.xml'].include? hpxml_file
2262
2222
  args.delete('simulation_control_timestep')
2263
2223
  args.delete('site_type')
2264
- args['geometry_unit_num_bathrooms'] = Constants.Auto
2265
- args['geometry_unit_num_occupants'] = Constants.Auto
2266
- args['foundation_wall_insulation_distance_to_top'] = Constants.Auto
2267
- args['foundation_wall_insulation_distance_to_bottom'] = Constants.Auto
2268
- args['foundation_wall_thickness'] = Constants.Auto
2269
- args['slab_thickness'] = Constants.Auto
2270
- args['slab_carpet_fraction'] = Constants.Auto
2224
+ args.delete('geometry_unit_num_bathrooms')
2225
+ args.delete('geometry_unit_num_occupants')
2226
+ args.delete('foundation_wall_insulation_distance_to_top')
2227
+ args.delete('foundation_wall_insulation_distance_to_bottom')
2228
+ args.delete('foundation_wall_thickness')
2229
+ args.delete('slab_thickness')
2230
+ args.delete('slab_carpet_fraction')
2271
2231
  args.delete('roof_material_type')
2272
2232
  args['roof_color'] = HPXML::ColorLight
2273
2233
  args.delete('roof_material_type')
@@ -2278,66 +2238,68 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2278
2238
  args.delete('cooling_system_cooling_compressor_type')
2279
2239
  args.delete('cooling_system_cooling_sensible_heat_fraction')
2280
2240
  args['mech_vent_fan_type'] = HPXML::MechVentTypeExhaust
2281
- args['mech_vent_hours_in_operation'] = Constants.Auto
2282
- args['mech_vent_fan_power'] = Constants.Auto
2283
- args['ducts_supply_location'] = Constants.Auto
2284
- args['ducts_return_location'] = Constants.Auto
2285
- args['ducts_supply_surface_area'] = Constants.Auto
2286
- args['ducts_return_surface_area'] = Constants.Auto
2241
+ args.delete('mech_vent_hours_in_operation')
2242
+ args.delete('mech_vent_fan_power')
2243
+ args.delete('ducts_supply_location')
2244
+ args.delete('ducts_return_location')
2245
+ args.delete('ducts_supply_surface_area')
2246
+ args.delete('ducts_return_surface_area')
2287
2247
  args['ducts_number_of_return_registers'] = 2
2288
- args['kitchen_fans_quantity'] = Constants.Auto
2289
- args['bathroom_fans_quantity'] = Constants.Auto
2290
- args['water_heater_location'] = Constants.Auto
2291
- args['water_heater_tank_volume'] = Constants.Auto
2292
- args['water_heater_setpoint_temperature'] = Constants.Auto
2293
- args['hot_water_distribution_standard_piping_length'] = Constants.Auto
2294
- args['hot_water_distribution_pipe_r'] = Constants.Auto
2248
+ args.delete('kitchen_fans_quantity')
2249
+ args.delete('bathroom_fans_quantity')
2250
+ args.delete('water_heater_location')
2251
+ args.delete('water_heater_tank_volume')
2252
+ args.delete('water_heater_setpoint_temperature')
2253
+ args.delete('hot_water_distribution_standard_piping_length')
2254
+ args.delete('hot_water_distribution_pipe_r')
2295
2255
  args['solar_thermal_system_type'] = HPXML::SolarThermalSystemType
2296
2256
  args['solar_thermal_collector_type'] = HPXML::SolarThermalTypeSingleGlazing
2297
2257
  args['solar_thermal_collector_rated_optical_efficiency'] = 0.77
2298
2258
  args['solar_thermal_collector_rated_thermal_losses'] = 0.793
2299
- args['pv_system_module_type'] = Constants.Auto
2259
+ args['pv_system_present'] = true
2260
+ args.delete('pv_system_module_type')
2300
2261
  args.delete('pv_system_inverter_efficiency')
2301
2262
  args.delete('pv_system_system_losses_fraction')
2302
- args['battery_location'] = Constants.Auto
2303
- args['clothes_washer_location'] = Constants.Auto
2304
- args['clothes_washer_efficiency'] = Constants.Auto
2305
- args['clothes_washer_rated_annual_kwh'] = Constants.Auto
2306
- args['clothes_washer_label_electric_rate'] = Constants.Auto
2307
- args['clothes_washer_label_gas_rate'] = Constants.Auto
2308
- args['clothes_washer_label_annual_gas_cost'] = Constants.Auto
2309
- args['clothes_washer_label_usage'] = Constants.Auto
2310
- args['clothes_washer_capacity'] = Constants.Auto
2311
- args['clothes_dryer_location'] = Constants.Auto
2312
- args['clothes_dryer_efficiency'] = Constants.Auto
2313
- args['clothes_dryer_vented_flow_rate'] = Constants.Auto
2314
- args['dishwasher_location'] = Constants.Auto
2315
- args['dishwasher_efficiency'] = Constants.Auto
2316
- args['dishwasher_label_electric_rate'] = Constants.Auto
2317
- args['dishwasher_label_gas_rate'] = Constants.Auto
2318
- args['dishwasher_label_annual_gas_cost'] = Constants.Auto
2319
- args['dishwasher_label_usage'] = Constants.Auto
2320
- args['dishwasher_place_setting_capacity'] = Constants.Auto
2321
- args['refrigerator_location'] = Constants.Auto
2322
- args['refrigerator_rated_annual_kwh'] = Constants.Auto
2323
- args['cooking_range_oven_location'] = Constants.Auto
2263
+ args['battery_present'] = true
2264
+ args.delete('battery_location')
2265
+ args.delete('clothes_washer_location')
2266
+ args.delete('clothes_washer_efficiency')
2267
+ args.delete('clothes_washer_rated_annual_kwh')
2268
+ args.delete('clothes_washer_label_electric_rate')
2269
+ args.delete('clothes_washer_label_gas_rate')
2270
+ args.delete('clothes_washer_label_annual_gas_cost')
2271
+ args.delete('clothes_washer_label_usage')
2272
+ args.delete('clothes_washer_capacity')
2273
+ args.delete('clothes_dryer_location')
2274
+ args.delete('clothes_dryer_efficiency')
2275
+ args.delete('clothes_dryer_vented_flow_rate')
2276
+ args.delete('dishwasher_location')
2277
+ args.delete('dishwasher_efficiency')
2278
+ args.delete('dishwasher_label_electric_rate')
2279
+ args.delete('dishwasher_label_gas_rate')
2280
+ args.delete('dishwasher_label_annual_gas_cost')
2281
+ args.delete('dishwasher_label_usage')
2282
+ args.delete('dishwasher_place_setting_capacity')
2283
+ args.delete('refrigerator_location')
2284
+ args.delete('refrigerator_rated_annual_kwh')
2285
+ args.delete('cooking_range_oven_location')
2324
2286
  args.delete('cooking_range_oven_is_induction')
2325
2287
  args.delete('cooking_range_oven_is_convection')
2326
2288
  args['ceiling_fan_present'] = true
2327
- args['misc_plug_loads_television_annual_kwh'] = Constants.Auto
2328
- args['misc_plug_loads_other_annual_kwh'] = Constants.Auto
2329
- args['misc_plug_loads_other_frac_sensible'] = Constants.Auto
2330
- args['misc_plug_loads_other_frac_latent'] = Constants.Auto
2331
- args['mech_vent_flow_rate'] = Constants.Auto
2332
- args['kitchen_fans_flow_rate'] = Constants.Auto
2333
- args['bathroom_fans_flow_rate'] = Constants.Auto
2289
+ args.delete('misc_plug_loads_television_annual_kwh')
2290
+ args.delete('misc_plug_loads_other_annual_kwh')
2291
+ args.delete('misc_plug_loads_other_frac_sensible')
2292
+ args.delete('misc_plug_loads_other_frac_latent')
2293
+ args.delete('mech_vent_flow_rate')
2294
+ args.delete('kitchen_fans_flow_rate')
2295
+ args.delete('bathroom_fans_flow_rate')
2334
2296
  args['whole_house_fan_present'] = true
2335
- args['whole_house_fan_flow_rate'] = Constants.Auto
2336
- args['whole_house_fan_power'] = Constants.Auto
2337
- args['hvac_control_heating_weekday_setpoint'] = Constants.Auto
2338
- args['hvac_control_heating_weekend_setpoint'] = Constants.Auto
2339
- args['hvac_control_cooling_weekday_setpoint'] = Constants.Auto
2340
- args['hvac_control_cooling_weekend_setpoint'] = Constants.Auto
2297
+ args.delete('whole_house_fan_flow_rate')
2298
+ args.delete('whole_house_fan_power')
2299
+ args.delete('hvac_control_heating_weekday_setpoint')
2300
+ args.delete('hvac_control_heating_weekend_setpoint')
2301
+ args.delete('hvac_control_cooling_weekday_setpoint')
2302
+ args.delete('hvac_control_cooling_weekend_setpoint')
2341
2303
  elsif ['base-misc-emissions.xml'].include? hpxml_file
2342
2304
  args['emissions_scenario_names'] = 'Cambium Hourly MidCase LRMER RMPA, Cambium Hourly LowRECosts LRMER RMPA, Cambium Annual MidCase AER National, eGRID RMPA, eGRID RMPA'
2343
2305
  args['emissions_types'] = 'CO2e, CO2e, CO2e, SO2, NOx'
@@ -2346,29 +2308,26 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2346
2308
  args['emissions_electricity_number_of_header_rows'] = '1, 1, , , '
2347
2309
  args['emissions_electricity_column_numbers'] = '17, 17, , , '
2348
2310
  elsif ['base-misc-loads-large-uncommon.xml'].include? hpxml_file
2349
- args['extra_refrigerator_location'] = Constants.Auto
2311
+ args.delete('extra_refrigerator_location')
2312
+ args['extra_refrigerator_present'] = true
2350
2313
  args['extra_refrigerator_rated_annual_kwh'] = 700.0
2314
+ args['freezer_present'] = true
2351
2315
  args['freezer_location'] = HPXML::LocationLivingSpace
2352
2316
  args['freezer_rated_annual_kwh'] = 300.0
2353
2317
  args['misc_plug_loads_well_pump_present'] = true
2354
2318
  args['misc_plug_loads_well_pump_annual_kwh'] = 475.0
2355
- args['misc_plug_loads_well_pump_usage_multiplier'] = 1.0
2356
2319
  args['misc_plug_loads_vehicle_present'] = true
2357
2320
  args['misc_plug_loads_vehicle_annual_kwh'] = 1500.0
2358
- args['misc_plug_loads_vehicle_usage_multiplier'] = 1.0
2359
2321
  args['misc_fuel_loads_grill_present'] = true
2360
2322
  args['misc_fuel_loads_grill_fuel_type'] = HPXML::FuelTypePropane
2361
2323
  args['misc_fuel_loads_grill_annual_therm'] = 25.0
2362
- args['misc_fuel_loads_grill_usage_multiplier'] = 1.0
2363
2324
  args['misc_fuel_loads_lighting_present'] = true
2364
2325
  args['misc_fuel_loads_lighting_annual_therm'] = 28.0
2365
- args['misc_fuel_loads_lighting_usage_multiplier'] = 1.0
2366
2326
  args['misc_fuel_loads_fireplace_present'] = true
2367
2327
  args['misc_fuel_loads_fireplace_fuel_type'] = HPXML::FuelTypeWoodCord
2368
2328
  args['misc_fuel_loads_fireplace_annual_therm'] = 55.0
2369
2329
  args['misc_fuel_loads_fireplace_frac_sensible'] = 0.5
2370
2330
  args['misc_fuel_loads_fireplace_frac_latent'] = 0.1
2371
- args['misc_fuel_loads_fireplace_usage_multiplier'] = 1.0
2372
2331
  args['pool_present'] = true
2373
2332
  args['pool_heater_type'] = HPXML::HeaterTypeGas
2374
2333
  args['pool_pump_annual_kwh'] = 2700.0
@@ -2397,6 +2356,7 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2397
2356
  args['clothes_dryer_usage_multiplier'] = 0.9
2398
2357
  args['dishwasher_usage_multiplier'] = 0.9
2399
2358
  args['refrigerator_usage_multiplier'] = 0.9
2359
+ args['freezer_present'] = true
2400
2360
  args['freezer_location'] = HPXML::LocationLivingSpace
2401
2361
  args['freezer_rated_annual_kwh'] = 300.0
2402
2362
  args['freezer_usage_multiplier'] = 0.9
@@ -2430,15 +2390,21 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2430
2390
  elsif ['base-misc-loads-none.xml'].include? hpxml_file
2431
2391
  args['misc_plug_loads_television_present'] = false
2432
2392
  args['misc_plug_loads_other_annual_kwh'] = 0.0
2433
- args['misc_plug_loads_other_frac_sensible'] = Constants.Auto
2434
- args['misc_plug_loads_other_frac_latent'] = Constants.Auto
2393
+ args.delete('misc_plug_loads_other_frac_sensible')
2394
+ args.delete('misc_plug_loads_other_frac_latent')
2435
2395
  end
2436
2396
 
2437
2397
  # PV
2438
- if ['base-pv.xml'].include? hpxml_file
2398
+ if ['base-pv.xml',
2399
+ 'base-pv-battery.xml',
2400
+ 'base-pv-battery-garage.xml'].include? hpxml_file
2401
+ args['pv_system_present'] = true
2439
2402
  args['pv_system_module_type'] = HPXML::PVModuleTypeStandard
2440
2403
  args['pv_system_location'] = HPXML::LocationRoof
2441
2404
  args['pv_system_tracking'] = HPXML::PVTrackingTypeFixed
2405
+ args['pv_system_inverter_efficiency'] = 0.96
2406
+ args['pv_system_system_losses_fraction'] = 0.14
2407
+ args['pv_system_2_present'] = true
2442
2408
  args['pv_system_2_module_type'] = HPXML::PVModuleTypePremium
2443
2409
  args['pv_system_2_location'] = HPXML::LocationRoof
2444
2410
  args['pv_system_2_tracking'] = HPXML::PVTrackingTypeFixed
@@ -2447,33 +2413,21 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2447
2413
  end
2448
2414
 
2449
2415
  # Battery
2450
- if ['base-battery.xml'].include? hpxml_file
2451
- args['battery_location'] = HPXML::LocationOutside
2452
- args['battery_power'] = '15000'
2453
- args['battery_capacity'] = '20'
2454
- args['battery_usable_capacity'] = '18'
2455
- elsif ['base-pv-battery.xml'].include? hpxml_file
2456
- args['pv_system_module_type'] = HPXML::PVModuleTypeStandard
2457
- args['pv_system_location'] = HPXML::LocationRoof
2458
- args['pv_system_tracking'] = HPXML::PVTrackingTypeFixed
2459
- args['pv_system_2_module_type'] = HPXML::PVModuleTypePremium
2460
- args['pv_system_2_location'] = HPXML::LocationRoof
2461
- args['pv_system_2_tracking'] = HPXML::PVTrackingTypeFixed
2462
- args['pv_system_2_array_azimuth'] = 90
2463
- args['pv_system_2_max_power_output'] = 1500
2464
- elsif ['base-pv-battery-garage.xml'].include? hpxml_file
2465
- args['pv_system_module_type'] = HPXML::PVModuleTypeStandard
2466
- args['pv_system_location'] = HPXML::LocationRoof
2467
- args['pv_system_tracking'] = HPXML::PVTrackingTypeFixed
2468
- args['pv_system_2_module_type'] = HPXML::PVModuleTypePremium
2469
- args['pv_system_2_location'] = HPXML::LocationRoof
2470
- args['pv_system_2_tracking'] = HPXML::PVTrackingTypeFixed
2471
- args['pv_system_2_array_azimuth'] = 90
2472
- args['pv_system_2_max_power_output'] = 1500
2473
- args['battery_location'] = HPXML::LocationGarage
2474
- args['battery_power'] = '15000'
2475
- args['battery_capacity'] = '20'
2476
- args['battery_usable_capacity'] = '18'
2416
+ if ['base-battery.xml',
2417
+ 'base-misc-generators-battery.xml',
2418
+ 'base-pv-battery-garage.xml',
2419
+ 'base-pv-generators-battery.xml'].include? hpxml_file
2420
+ args['battery_present'] = true
2421
+ if hpxml_file == 'base-pv-battery-garage.xml'
2422
+ args['battery_location'] = HPXML::LocationGarage
2423
+ else
2424
+ args['battery_location'] = HPXML::LocationOutside
2425
+ end
2426
+ args['battery_power'] = 6000
2427
+ args['battery_capacity'] = 20
2428
+ args['battery_usable_capacity'] = 18
2429
+ elsif ['base-pv-battery-round-trip-efficiency.xml'].include? hpxml_file
2430
+ args['battery_round_trip_efficiency'] = 0.8
2477
2431
  end
2478
2432
 
2479
2433
  # Simulation Control
@@ -2485,9 +2439,17 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2485
2439
  elsif ['base-simcontrol-daylight-saving-disabled.xml'].include? hpxml_file
2486
2440
  args['simulation_control_daylight_saving_enabled'] = false
2487
2441
  elsif ['base-simcontrol-runperiod-1-month.xml'].include? hpxml_file
2488
- args['simulation_control_run_period'] = 'Jan 1 - Jan 31'
2442
+ args['simulation_control_run_period'] = 'Feb 1 - Feb 28'
2443
+ elsif ['base-simcontrol-temperature-capacitance-multiplier.xml'].include? hpxml_file
2444
+ args['simulation_control_temperature_capacitance_multiplier'] = 7.0
2489
2445
  elsif ['base-simcontrol-timestep-10-mins.xml'].include? hpxml_file
2490
2446
  args['simulation_control_timestep'] = 10
2447
+ elsif ['base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml'].include? hpxml_file
2448
+ args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-10-mins.csv'
2449
+ elsif ['base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml'].include? hpxml_file
2450
+ args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic.csv'
2451
+ elsif ['base-simcontrol-timestep-30-mins.xml'].include? hpxml_file
2452
+ args['simulation_control_timestep'] = 30
2491
2453
  end
2492
2454
 
2493
2455
  # Occupancy Schedules
@@ -2507,6 +2469,8 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2507
2469
  sch_args['schedules_vacancy_period'] = 'Dec 1 - Jan 31'
2508
2470
  sch_args['output_csv_path'] = '../../HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-vacancy.csv'
2509
2471
  sch_args['hpxml_output_path'] = sch_args['hpxml_path']
2472
+ elsif ['base-schedules-detailed-occupancy-stochastic-10-mins.xml'].include? hpxml_file
2473
+ args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-10-mins.csv'
2510
2474
  elsif ['base-schedules-detailed-all-10-mins.xml'].include? hpxml_file
2511
2475
  sch_args['hpxml_path'] = args['hpxml_path']
2512
2476
  sch_args['schedules_type'] = 'stochastic'
@@ -2516,67 +2480,72 @@ def set_measure_argument_values(hpxml_file, args, sch_args, orig_parent)
2516
2480
 
2517
2481
  # Setpoint Schedules
2518
2482
  if ['base-schedules-detailed-setpoints.xml'].include? hpxml_file
2519
- args['hvac_control_heating_weekday_setpoint'] = Constants.Auto
2520
- args['hvac_control_heating_weekend_setpoint'] = Constants.Auto
2521
- args['hvac_control_cooling_weekday_setpoint'] = Constants.Auto
2522
- args['hvac_control_cooling_weekend_setpoint'] = Constants.Auto
2483
+ args.delete('hvac_control_heating_weekday_setpoint')
2484
+ args.delete('hvac_control_heating_weekend_setpoint')
2485
+ args.delete('hvac_control_cooling_weekday_setpoint')
2486
+ args.delete('hvac_control_cooling_weekend_setpoint')
2523
2487
  args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/setpoints.csv'
2524
2488
  elsif ['base-schedules-detailed-setpoints-daily-schedules.xml'].include? hpxml_file
2525
- args['hvac_control_heating_weekday_setpoint'] = Constants.Auto
2526
- args['hvac_control_heating_weekend_setpoint'] = Constants.Auto
2527
- args['hvac_control_cooling_weekday_setpoint'] = Constants.Auto
2528
- args['hvac_control_cooling_weekend_setpoint'] = Constants.Auto
2489
+ args.delete('hvac_control_heating_weekday_setpoint')
2490
+ args.delete('hvac_control_heating_weekend_setpoint')
2491
+ args.delete('hvac_control_cooling_weekday_setpoint')
2492
+ args.delete('hvac_control_cooling_weekend_setpoint')
2529
2493
  args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/setpoints-daily-schedules.csv'
2530
2494
  elsif ['base-schedules-detailed-setpoints-daily-setbacks.xml'].include? hpxml_file
2531
- args['hvac_control_heating_weekday_setpoint'] = Constants.Auto
2532
- args['hvac_control_heating_weekend_setpoint'] = Constants.Auto
2533
- args['hvac_control_cooling_weekday_setpoint'] = Constants.Auto
2534
- args['hvac_control_cooling_weekend_setpoint'] = Constants.Auto
2495
+ args.delete('hvac_control_heating_weekday_setpoint')
2496
+ args.delete('hvac_control_heating_weekend_setpoint')
2497
+ args.delete('hvac_control_cooling_weekday_setpoint')
2498
+ args.delete('hvac_control_cooling_weekend_setpoint')
2535
2499
  args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/setpoints-daily-setbacks.csv'
2536
2500
  elsif ['base-schedules-detailed-all-10-mins.xml'].include? hpxml_file
2537
- args['hvac_control_heating_weekday_setpoint'] = Constants.Auto
2538
- args['hvac_control_heating_weekend_setpoint'] = Constants.Auto
2539
- args['hvac_control_cooling_weekday_setpoint'] = Constants.Auto
2540
- args['hvac_control_cooling_weekend_setpoint'] = Constants.Auto
2501
+ args.delete('hvac_control_heating_weekday_setpoint')
2502
+ args.delete('hvac_control_heating_weekend_setpoint')
2503
+ args.delete('hvac_control_cooling_weekday_setpoint')
2504
+ args.delete('hvac_control_cooling_weekend_setpoint')
2541
2505
  args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/setpoints-10-mins.csv'
2542
2506
  elsif ['base-hvac-furnace-gas-only-detailed-setpoints.xml'].include? hpxml_file
2543
- args['hvac_control_heating_weekday_setpoint'] = Constants.Auto
2544
- args['hvac_control_heating_weekend_setpoint'] = Constants.Auto
2507
+ args.delete('hvac_control_heating_weekday_setpoint')
2508
+ args.delete('hvac_control_heating_weekend_setpoint')
2545
2509
  args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/setpoints-heating-only.csv'
2546
2510
  elsif ['base-hvac-room-ac-only-detailed-setpoints.xml'].include? hpxml_file
2547
- args['hvac_control_cooling_weekday_setpoint'] = Constants.Auto
2548
- args['hvac_control_cooling_weekend_setpoint'] = Constants.Auto
2511
+ args.delete('hvac_control_cooling_weekday_setpoint')
2512
+ args.delete('hvac_control_cooling_weekend_setpoint')
2549
2513
  args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/setpoints-cooling-only.csv'
2550
2514
  end
2551
2515
 
2552
2516
  # Water Heater Schedules
2553
- if ['base-dhw-tank-heat-pump-detailed-setpoints.xml'].include? hpxml_file
2554
- args['water_heater_setpoint_temperature'] = Constants.Auto
2517
+ if ['base-dhw-tank-heat-pump-detailed-setpoints.xml',
2518
+ 'base-dhw-indirect-detailed-setpoints.xml',
2519
+ 'base-dhw-tank-detailed-setpoints.xml',
2520
+ 'base-dhw-tankless-detailed-setpoints.xml'].include? hpxml_file
2521
+ args.delete('water_heater_setpoint_temperature')
2555
2522
  args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/water-heater-setpoints.csv'
2556
2523
  elsif ['base-dhw-tank-heat-pump-detailed-operating-modes.xml'].include? hpxml_file
2557
- args['water_heater_setpoint_temperature'] = Constants.Auto
2524
+ args.delete('water_heater_setpoint_temperature')
2558
2525
  args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/water-heater-operating-modes.csv'
2559
2526
  elsif ['base-dhw-tank-heat-pump-detailed-schedules.xml'].include? hpxml_file
2560
- args['water_heater_setpoint_temperature'] = Constants.Auto
2527
+ args.delete('water_heater_setpoint_temperature')
2561
2528
  args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/water-heater-setpoints.csv, ../../HPXMLtoOpenStudio/resources/schedule_files/water-heater-operating-modes.csv'
2562
- elsif ['base-dhw-tank-detailed-setpoints.xml'].include? hpxml_file
2563
- args['water_heater_setpoint_temperature'] = Constants.Auto
2564
- args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/water-heater-setpoints.csv'
2565
- elsif ['base-dhw-tankless-detailed-setpoints.xml'].include? hpxml_file
2566
- args['water_heater_setpoint_temperature'] = Constants.Auto
2567
- args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/water-heater-setpoints.csv'
2568
2529
  elsif ['base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml'].include? hpxml_file
2569
2530
  sch_args['hpxml_path'] = args['hpxml_path']
2570
2531
  sch_args['schedules_type'] = 'stochastic'
2571
2532
  sch_args['output_csv_path'] = '../../HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic.csv'
2572
2533
  sch_args['hpxml_output_path'] = sch_args['hpxml_path']
2573
2534
  elsif ['base-schedules-detailed-all-10-mins.xml'].include? hpxml_file
2574
- args['water_heater_setpoint_temperature'] = Constants.Auto
2535
+ args.delete('water_heater_setpoint_temperature')
2575
2536
  args['schedules_filepaths'] += ', ../../HPXMLtoOpenStudio/resources/schedule_files/water-heater-setpoints-10-mins.csv'
2576
2537
  end
2538
+
2539
+ # Battery Schedules
2540
+ if ['base-battery-scheduled.xml',
2541
+ 'base-misc-generators-battery-scheduled.xml',
2542
+ 'base-pv-battery-scheduled.xml',
2543
+ 'base-pv-generators-battery-scheduled.xml'].include? hpxml_file
2544
+ args['schedules_filepaths'] = '../../HPXMLtoOpenStudio/resources/schedule_files/battery.csv'
2545
+ end
2577
2546
  end
2578
2547
 
2579
- def apply_hpxml_modification_ashrae_140(hpxml_file, hpxml)
2548
+ def apply_hpxml_modification_ashrae_140(hpxml)
2580
2549
  # Set detailed HPXML values for ASHRAE 140 test files
2581
2550
 
2582
2551
  renumber_hpxml_ids(hpxml)
@@ -2586,7 +2555,7 @@ def apply_hpxml_modification_ashrae_140(hpxml_file, hpxml)
2586
2555
  # ------------ #
2587
2556
 
2588
2557
  hpxml.header.xml_generated_by = 'tasks.rb'
2589
- hpxml.header.created_date_and_time = Time.new(2000, 1, 1).strftime('%Y-%m-%dT%H:%M:%S%:z') # Hard-code to prevent diffs
2558
+ hpxml.header.created_date_and_time = Time.new(2000, 1, 1, 0, 0, 0, '-07:00').strftime('%Y-%m-%dT%H:%M:%S%:z') # Hard-code to prevent diffs
2590
2559
  hpxml.header.apply_ashrae140_assumptions = true
2591
2560
 
2592
2561
  # --------------------- #
@@ -2630,11 +2599,11 @@ def apply_hpxml_modification_ashrae_140(hpxml_file, hpxml)
2630
2599
  end
2631
2600
  end
2632
2601
  end
2633
- hpxml.frame_floors.each do |frame_floor|
2634
- next unless frame_floor.is_ceiling
2602
+ hpxml.floors.each do |floor|
2603
+ next unless floor.is_ceiling
2635
2604
 
2636
- frame_floor.interior_finish_type = HPXML::InteriorFinishGypsumBoard
2637
- frame_floor.interior_finish_thickness = 0.5
2605
+ floor.interior_finish_type = HPXML::InteriorFinishGypsumBoard
2606
+ floor.interior_finish_thickness = 0.5
2638
2607
  end
2639
2608
  hpxml.foundation_walls.each do |fwall|
2640
2609
  if fwall.insulation_interior_r_value == 0
@@ -2695,7 +2664,7 @@ def apply_hpxml_modification(hpxml_file, hpxml)
2695
2664
 
2696
2665
  # General logic for all files
2697
2666
  hpxml.header.xml_generated_by = 'tasks.rb'
2698
- hpxml.header.created_date_and_time = Time.new(2000, 1, 1).strftime('%Y-%m-%dT%H:%M:%S%:z') # Hard-code to prevent diffs
2667
+ hpxml.header.created_date_and_time = Time.new(2000, 1, 1, 0, 0, 0, '-07:00').strftime('%Y-%m-%dT%H:%M:%S%:z') # Hard-code to prevent diffs
2699
2668
 
2700
2669
  # Logic that can only be applied based on the file name
2701
2670
  if ['base-hvac-undersized-allow-increased-fixed-capacities.xml'].include? hpxml_file
@@ -2762,7 +2731,7 @@ def apply_hpxml_modification(hpxml_file, hpxml)
2762
2731
 
2763
2732
  roof.interior_finish_type = HPXML::InteriorFinishGypsumBoard
2764
2733
  end
2765
- (hpxml.walls + hpxml.foundation_walls + hpxml.frame_floors).each do |surface|
2734
+ (hpxml.walls + hpxml.foundation_walls + hpxml.floors).each do |surface|
2766
2735
  if surface.is_a?(HPXML::FoundationWall) && surface.interior_adjacent_to != HPXML::LocationBasementConditioned
2767
2736
  surface.interior_finish_type = HPXML::InteriorFinishNone
2768
2737
  end
@@ -2775,7 +2744,7 @@ def apply_hpxml_modification(hpxml_file, hpxml)
2775
2744
  HPXML::LocationAtticVented,
2776
2745
  HPXML::LocationOtherHousingUnit,
2777
2746
  HPXML::LocationBasementConditioned].include?(surface.exterior_adjacent_to)
2778
- next if surface.is_a?(HPXML::FrameFloor) && surface.is_floor
2747
+ next if surface.is_a?(HPXML::Floor) && surface.is_floor
2779
2748
 
2780
2749
  surface.interior_finish_type = HPXML::InteriorFinishGypsumBoard
2781
2750
  end
@@ -2817,12 +2786,12 @@ def apply_hpxml_modification(hpxml_file, hpxml)
2817
2786
  w.exterior_adjacent_to == HPXML::LocationOtherHousingUnit
2818
2787
  } [0]
2819
2788
  wall.exterior_adjacent_to = adjacent_to
2820
- hpxml.frame_floors[0].exterior_adjacent_to = adjacent_to
2821
- hpxml.frame_floors[1].exterior_adjacent_to = adjacent_to
2789
+ hpxml.floors[0].exterior_adjacent_to = adjacent_to
2790
+ hpxml.floors[1].exterior_adjacent_to = adjacent_to
2822
2791
  if hpxml_file != 'base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml'
2823
2792
  wall.insulation_assembly_r_value = 23
2824
- hpxml.frame_floors[0].insulation_assembly_r_value = 18.7
2825
- hpxml.frame_floors[1].insulation_assembly_r_value = 18.7
2793
+ hpxml.floors[0].insulation_assembly_r_value = 18.7
2794
+ hpxml.floors[1].insulation_assembly_r_value = 18.7
2826
2795
  end
2827
2796
  hpxml.windows.each do |window|
2828
2797
  window.area *= 0.35
@@ -2885,25 +2854,28 @@ def apply_hpxml_modification(hpxml_file, hpxml)
2885
2854
  emittance: 0.92,
2886
2855
  interior_finish_type: HPXML::InteriorFinishGypsumBoard,
2887
2856
  insulation_assembly_r_value: 4.0)
2888
- hpxml.frame_floors[0].delete
2889
- hpxml.frame_floors.add(id: "FrameFloor#{hpxml.frame_floors.size + 1}",
2890
- exterior_adjacent_to: HPXML::LocationOtherNonFreezingSpace,
2891
- interior_adjacent_to: HPXML::LocationLivingSpace,
2892
- area: 550,
2893
- insulation_assembly_r_value: 18.7,
2894
- other_space_above_or_below: HPXML::FrameFloorOtherSpaceBelow)
2895
- hpxml.frame_floors.add(id: "FrameFloor#{hpxml.frame_floors.size + 1}",
2896
- exterior_adjacent_to: HPXML::LocationOtherMultifamilyBufferSpace,
2897
- interior_adjacent_to: HPXML::LocationLivingSpace,
2898
- area: 200,
2899
- insulation_assembly_r_value: 18.7,
2900
- other_space_above_or_below: HPXML::FrameFloorOtherSpaceBelow)
2901
- hpxml.frame_floors.add(id: "FrameFloor#{hpxml.frame_floors.size + 1}",
2902
- exterior_adjacent_to: HPXML::LocationOtherHeatedSpace,
2903
- interior_adjacent_to: HPXML::LocationLivingSpace,
2904
- area: 150,
2905
- insulation_assembly_r_value: 2.1,
2906
- other_space_above_or_below: HPXML::FrameFloorOtherSpaceBelow)
2857
+ hpxml.floors[0].delete
2858
+ hpxml.floors.add(id: "Floor#{hpxml.floors.size + 1}",
2859
+ exterior_adjacent_to: HPXML::LocationOtherNonFreezingSpace,
2860
+ interior_adjacent_to: HPXML::LocationLivingSpace,
2861
+ floor_type: HPXML::FloorTypeWoodFrame,
2862
+ area: 550,
2863
+ insulation_assembly_r_value: 18.7,
2864
+ floor_or_ceiling: HPXML::FloorOrCeilingFloor)
2865
+ hpxml.floors.add(id: "Floor#{hpxml.floors.size + 1}",
2866
+ exterior_adjacent_to: HPXML::LocationOtherMultifamilyBufferSpace,
2867
+ interior_adjacent_to: HPXML::LocationLivingSpace,
2868
+ floor_type: HPXML::FloorTypeWoodFrame,
2869
+ area: 200,
2870
+ insulation_assembly_r_value: 18.7,
2871
+ floor_or_ceiling: HPXML::FloorOrCeilingFloor)
2872
+ hpxml.floors.add(id: "Floor#{hpxml.floors.size + 1}",
2873
+ exterior_adjacent_to: HPXML::LocationOtherHeatedSpace,
2874
+ interior_adjacent_to: HPXML::LocationLivingSpace,
2875
+ floor_type: HPXML::FloorTypeWoodFrame,
2876
+ area: 150,
2877
+ insulation_assembly_r_value: 2.1,
2878
+ floor_or_ceiling: HPXML::FloorOrCeilingFloor)
2907
2879
  wall = hpxml.walls.select { |w|
2908
2880
  w.interior_adjacent_to == HPXML::LocationLivingSpace &&
2909
2881
  w.exterior_adjacent_to == HPXML::LocationOtherMultifamilyBufferSpace
@@ -3006,12 +2978,14 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3006
2978
  hpxml.foundation_walls.each do |foundation_wall|
3007
2979
  foundation_wall.area = 1200.0 / hpxml.foundation_walls.size
3008
2980
  end
3009
- hpxml.frame_floors.add(id: "FrameFloor#{hpxml.frame_floors.size + 1}",
3010
- exterior_adjacent_to: HPXML::LocationAtticUnvented,
3011
- interior_adjacent_to: HPXML::LocationLivingSpace,
3012
- area: 450,
3013
- interior_finish_type: HPXML::InteriorFinishGypsumBoard,
3014
- insulation_assembly_r_value: 39.3)
2981
+ hpxml.floors.add(id: "Floor#{hpxml.floors.size + 1}",
2982
+ exterior_adjacent_to: HPXML::LocationAtticUnvented,
2983
+ interior_adjacent_to: HPXML::LocationLivingSpace,
2984
+ floor_type: HPXML::FloorTypeWoodFrame,
2985
+ area: 450,
2986
+ interior_finish_type: HPXML::InteriorFinishGypsumBoard,
2987
+ insulation_assembly_r_value: 39.3,
2988
+ floor_or_ceiling: HPXML::FloorOrCeilingCeiling)
3015
2989
  hpxml.slabs[0].area = 1350
3016
2990
  hpxml.slabs[0].exposed_perimeter = 150
3017
2991
  hpxml.windows[1].area = 108
@@ -3152,10 +3126,10 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3152
3126
  hpxml.rim_joists[-1].id = "RimJoist#{hpxml.rim_joists.size}"
3153
3127
  hpxml.rim_joists[-1].interior_adjacent_to = HPXML::LocationLivingSpace
3154
3128
  hpxml.rim_joists[-1].area = 116
3155
- elsif ['base-foundation-conditioned-basement-wall-interior-insulation.xml'].include? hpxml_file
3129
+ elsif ['base-foundation-conditioned-basement-wall-insulation.xml'].include? hpxml_file
3156
3130
  hpxml.foundation_walls.each do |foundation_wall|
3157
3131
  foundation_wall.insulation_interior_r_value = 10
3158
- foundation_wall.insulation_interior_distance_to_top = 0
3132
+ foundation_wall.insulation_interior_distance_to_top = 1
3159
3133
  foundation_wall.insulation_interior_distance_to_bottom = 8
3160
3134
  foundation_wall.insulation_exterior_r_value = 8.9
3161
3135
  foundation_wall.insulation_exterior_distance_to_top = 1
@@ -3250,12 +3224,14 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3250
3224
  depth_below_grade: 3,
3251
3225
  insulation_interior_r_value: 0,
3252
3226
  insulation_exterior_r_value: 0)
3253
- hpxml.frame_floors[0].area = 675
3254
- hpxml.frame_floors.add(id: "FrameFloor#{hpxml.frame_floors.size + 1}",
3255
- exterior_adjacent_to: HPXML::LocationCrawlspaceUnvented,
3256
- interior_adjacent_to: HPXML::LocationLivingSpace,
3257
- area: 675,
3258
- insulation_assembly_r_value: 18.7)
3227
+ hpxml.floors[0].area = 675
3228
+ hpxml.floors.add(id: "Floor#{hpxml.floors.size + 1}",
3229
+ exterior_adjacent_to: HPXML::LocationCrawlspaceUnvented,
3230
+ interior_adjacent_to: HPXML::LocationLivingSpace,
3231
+ floor_type: HPXML::FloorTypeWoodFrame,
3232
+ area: 675,
3233
+ insulation_assembly_r_value: 18.7,
3234
+ floor_or_ceiling: HPXML::FloorOrCeilingFloor)
3259
3235
  hpxml.slabs[0].area = 675
3260
3236
  hpxml.slabs[0].exposed_perimeter = 75
3261
3237
  hpxml.slabs.add(id: "Slab#{hpxml.slabs.size + 1}",
@@ -3392,11 +3368,13 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3392
3368
  solar_absorptance: 0.7,
3393
3369
  emittance: 0.92,
3394
3370
  insulation_assembly_r_value: 4)
3395
- hpxml.frame_floors.add(id: "FrameFloor#{hpxml.frame_floors.size + 1}",
3396
- exterior_adjacent_to: HPXML::LocationGarage,
3397
- interior_adjacent_to: HPXML::LocationLivingSpace,
3398
- area: 400,
3399
- insulation_assembly_r_value: 39.3)
3371
+ hpxml.floors.add(id: "Floor#{hpxml.floors.size + 1}",
3372
+ exterior_adjacent_to: HPXML::LocationGarage,
3373
+ interior_adjacent_to: HPXML::LocationLivingSpace,
3374
+ floor_type: HPXML::FloorTypeWoodFrame,
3375
+ area: 400,
3376
+ insulation_assembly_r_value: 39.3,
3377
+ floor_or_ceiling: HPXML::FloorOrCeilingFloor)
3400
3378
  hpxml.slabs[0].area -= 400
3401
3379
  hpxml.slabs[0].exposed_perimeter -= 40
3402
3380
  hpxml.slabs.add(id: "Slab#{hpxml.slabs.size + 1}",
@@ -3421,6 +3399,45 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3421
3399
  area: 4,
3422
3400
  azimuth: 0,
3423
3401
  r_value: 4.4)
3402
+ elsif ['base-enclosure-ceilingtypes.xml'].include? hpxml_file
3403
+ exterior_adjacent_to = hpxml.floors[0].exterior_adjacent_to
3404
+ area = hpxml.floors[0].area
3405
+ hpxml.floors.reverse_each do |floor|
3406
+ floor.delete
3407
+ end
3408
+ floors_map = { HPXML::FloorTypeSIP => 16.1,
3409
+ HPXML::FloorTypeConcrete => 3.2,
3410
+ HPXML::FloorTypeSteelFrame => 8.1 }
3411
+ floors_map.each_with_index do |(floor_type, assembly_r), _i|
3412
+ hpxml.floors.add(id: "Floor#{hpxml.floors.size + 1}",
3413
+ exterior_adjacent_to: exterior_adjacent_to,
3414
+ interior_adjacent_to: HPXML::LocationLivingSpace,
3415
+ floor_type: floor_type,
3416
+ area: area / floors_map.size,
3417
+ insulation_assembly_r_value: assembly_r,
3418
+ floor_or_ceiling: HPXML::FloorOrCeilingCeiling)
3419
+ end
3420
+ elsif ['base-enclosure-floortypes.xml'].include? hpxml_file
3421
+ exterior_adjacent_to = hpxml.floors[0].exterior_adjacent_to
3422
+ area = hpxml.floors[0].area
3423
+ ceiling = hpxml.floors[1].dup
3424
+ hpxml.floors.reverse_each do |floor|
3425
+ floor.delete
3426
+ end
3427
+ floors_map = { HPXML::FloorTypeSIP => 16.1,
3428
+ HPXML::FloorTypeConcrete => 3.2,
3429
+ HPXML::FloorTypeSteelFrame => 8.1 }
3430
+ floors_map.each_with_index do |(floor_type, assembly_r), _i|
3431
+ hpxml.floors.add(id: "Floor#{hpxml.floors.size + 1}",
3432
+ exterior_adjacent_to: exterior_adjacent_to,
3433
+ interior_adjacent_to: HPXML::LocationLivingSpace,
3434
+ floor_type: floor_type,
3435
+ area: area / floors_map.size,
3436
+ insulation_assembly_r_value: assembly_r,
3437
+ floor_or_ceiling: HPXML::FloorOrCeilingFloor)
3438
+ end
3439
+ hpxml.floors << ceiling
3440
+ hpxml.floors[-1].id = "Floor#{hpxml.floors.size}"
3424
3441
  elsif ['base-enclosure-walltypes.xml'].include? hpxml_file
3425
3442
  hpxml.rim_joists.reverse_each do |rim_joist|
3426
3443
  rim_joist.delete
@@ -3435,7 +3452,7 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3435
3452
  [HPXML::SidingTypeSyntheticStucco, HPXML::ColorMediumDark],
3436
3453
  [HPXML::SidingTypeVinyl, HPXML::ColorLight],
3437
3454
  [HPXML::SidingTypeNone, HPXML::ColorMedium]]
3438
- siding_types.each_with_index do |siding_type, i|
3455
+ siding_types.each do |siding_type|
3439
3456
  hpxml.rim_joists.add(id: "RimJoist#{hpxml.rim_joists.size + 1}",
3440
3457
  exterior_adjacent_to: HPXML::LocationOutside,
3441
3458
  interior_adjacent_to: HPXML::LocationBasementConditioned,
@@ -3622,19 +3639,19 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3622
3639
  hpxml.foundation_walls << hpxml.foundation_walls[-1].dup
3623
3640
  hpxml.foundation_walls[-1].id += '_tiny'
3624
3641
  hpxml.foundation_walls[-1].area = 0.05
3625
- for n in 1..hpxml.frame_floors.size
3626
- hpxml.frame_floors[n - 1].area /= 9.0
3642
+ for n in 1..hpxml.floors.size
3643
+ hpxml.floors[n - 1].area /= 9.0
3627
3644
  for i in 2..9
3628
- hpxml.frame_floors << hpxml.frame_floors[n - 1].dup
3629
- hpxml.frame_floors[-1].id += "_#{i}"
3645
+ hpxml.floors << hpxml.floors[n - 1].dup
3646
+ hpxml.floors[-1].id += "_#{i}"
3630
3647
  if hpxml_file == 'base-enclosure-split-surfaces2.xml'
3631
- hpxml.frame_floors[-1].insulation_assembly_r_value += 0.01 * i
3648
+ hpxml.floors[-1].insulation_assembly_r_value += 0.01 * i
3632
3649
  end
3633
3650
  end
3634
3651
  end
3635
- hpxml.frame_floors << hpxml.frame_floors[-1].dup
3636
- hpxml.frame_floors[-1].id += '_tiny'
3637
- hpxml.frame_floors[-1].area = 0.05
3652
+ hpxml.floors << hpxml.floors[-1].dup
3653
+ hpxml.floors[-1].id += '_tiny'
3654
+ hpxml.floors[-1].area = 0.05
3638
3655
  for n in 1..hpxml.slabs.size
3639
3656
  hpxml.slabs[n - 1].area /= 9.0
3640
3657
  hpxml.slabs[n - 1].exposed_perimeter /= 9.0
@@ -3650,7 +3667,6 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3650
3667
  hpxml.slabs << hpxml.slabs[-1].dup
3651
3668
  hpxml.slabs[-1].id += '_tiny'
3652
3669
  hpxml.slabs[-1].area = 0.05
3653
- area_adjustments = []
3654
3670
  for n in 1..hpxml.windows.size
3655
3671
  hpxml.windows[n - 1].area /= 9.0
3656
3672
  hpxml.windows[n - 1].fraction_operable = 0.0
@@ -3687,7 +3703,6 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3687
3703
  hpxml.skylights << hpxml.skylights[-1].dup
3688
3704
  hpxml.skylights[-1].id += '_tiny'
3689
3705
  hpxml.skylights[-1].area = 0.05
3690
- area_adjustments = []
3691
3706
  for n in 1..hpxml.doors.size
3692
3707
  hpxml.doors[n - 1].area /= 9.0
3693
3708
  for i in 2..9
@@ -3835,11 +3850,13 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3835
3850
  duct_leakage_units: HPXML::UnitsCFM25,
3836
3851
  duct_leakage_value: 10,
3837
3852
  duct_leakage_total_or_to_outside: HPXML::DuctLeakageToOutside)
3838
- hpxml.hvac_distributions[-1].ducts.add(duct_type: HPXML::DuctTypeSupply,
3853
+ hpxml.hvac_distributions[-1].ducts.add(id: "Ducts#{hpxml.hvac_distributions[-1].ducts.size + 1}",
3854
+ duct_type: HPXML::DuctTypeSupply,
3839
3855
  duct_insulation_r_value: 0,
3840
3856
  duct_location: HPXML::LocationOtherMultifamilyBufferSpace,
3841
3857
  duct_surface_area: 50)
3842
- hpxml.hvac_distributions[-1].ducts.add(duct_type: HPXML::DuctTypeReturn,
3858
+ hpxml.hvac_distributions[-1].ducts.add(id: "Ducts#{hpxml.hvac_distributions[-1].ducts.size + 1}",
3859
+ duct_type: HPXML::DuctTypeReturn,
3843
3860
  duct_insulation_r_value: 0,
3844
3861
  duct_location: HPXML::LocationOtherMultifamilyBufferSpace,
3845
3862
  duct_surface_area: 20)
@@ -3939,11 +3956,6 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3939
3956
  hpxml.heating_systems[i].fraction_heat_load_served = 0.35
3940
3957
  end
3941
3958
  end
3942
- elsif ['base-misc-defaults.xml'].include? hpxml_file
3943
- hpxml.heating_systems[0].year_installed = 2009
3944
- hpxml.heating_systems[0].heating_efficiency_afue = nil
3945
- hpxml.cooling_systems[0].year_installed = 2009
3946
- hpxml.cooling_systems[0].cooling_efficiency_seer = nil
3947
3959
  elsif ['base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml'].include? hpxml_file
3948
3960
  hpxml.heat_pumps[0].backup_heating_efficiency_afue = hpxml.heat_pumps[0].backup_heating_efficiency_percent
3949
3961
  hpxml.heat_pumps[0].backup_heating_efficiency_percent = nil
@@ -3951,7 +3963,9 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3951
3963
  'base-enclosure-2stories-garage.xml',
3952
3964
  'base-hvac-ducts-area-fractions.xml'].include? hpxml_file
3953
3965
  hpxml.hvac_distributions[0].ducts << hpxml.hvac_distributions[0].ducts[0].dup
3966
+ hpxml.hvac_distributions[0].ducts[-1].id = "Ducts#{hpxml.hvac_distributions[0].ducts.size}"
3954
3967
  hpxml.hvac_distributions[0].ducts << hpxml.hvac_distributions[0].ducts[1].dup
3968
+ hpxml.hvac_distributions[0].ducts[-1].id = "Ducts#{hpxml.hvac_distributions[0].ducts.size}"
3955
3969
  hpxml.hvac_distributions[0].ducts[2].duct_location = HPXML::LocationExteriorWall
3956
3970
  hpxml.hvac_distributions[0].ducts[2].duct_surface_area = 37.5
3957
3971
  hpxml.hvac_distributions[0].ducts[3].duct_location = HPXML::LocationLivingSpace
@@ -3975,42 +3989,67 @@ def apply_hpxml_modification(hpxml_file, hpxml)
3975
3989
  hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
3976
3990
  distribution_system_type: HPXML::HVACDistributionTypeAir,
3977
3991
  air_type: HPXML::AirTypeRegularVelocity)
3978
- hpxml.hvac_distributions[-1].duct_leakage_measurements.add(duct_type: HPXML::DuctTypeSupply,
3979
- duct_leakage_units: HPXML::UnitsCFM25,
3980
- duct_leakage_value: 75,
3981
- duct_leakage_total_or_to_outside: HPXML::DuctLeakageToOutside)
3982
- hpxml.hvac_distributions[-1].duct_leakage_measurements.add(duct_type: HPXML::DuctTypeReturn,
3983
- duct_leakage_units: HPXML::UnitsCFM25,
3984
- duct_leakage_value: 25,
3985
- duct_leakage_total_or_to_outside: HPXML::DuctLeakageToOutside)
3986
- hpxml.hvac_distributions[0].ducts.add(duct_type: HPXML::DuctTypeSupply,
3992
+ hpxml.hvac_distributions[0].duct_leakage_measurements.add(duct_type: HPXML::DuctTypeSupply,
3993
+ duct_leakage_units: HPXML::UnitsCFM25,
3994
+ duct_leakage_value: 75,
3995
+ duct_leakage_total_or_to_outside: HPXML::DuctLeakageToOutside)
3996
+ hpxml.hvac_distributions[0].duct_leakage_measurements.add(duct_type: HPXML::DuctTypeReturn,
3997
+ duct_leakage_units: HPXML::UnitsCFM25,
3998
+ duct_leakage_value: 25,
3999
+ duct_leakage_total_or_to_outside: HPXML::DuctLeakageToOutside)
4000
+ hpxml.hvac_distributions[0].ducts.add(id: "Ducts#{hpxml.hvac_distributions[0].ducts.size + 1}",
4001
+ duct_type: HPXML::DuctTypeSupply,
3987
4002
  duct_insulation_r_value: 8,
3988
4003
  duct_location: HPXML::LocationAtticUnvented,
3989
4004
  duct_surface_area: 75)
3990
- hpxml.hvac_distributions[0].ducts.add(duct_type: HPXML::DuctTypeSupply,
4005
+ hpxml.hvac_distributions[0].ducts.add(id: "Ducts#{hpxml.hvac_distributions[0].ducts.size + 1}",
4006
+ duct_type: HPXML::DuctTypeSupply,
3991
4007
  duct_insulation_r_value: 8,
3992
4008
  duct_location: HPXML::LocationOutside,
3993
4009
  duct_surface_area: 75)
3994
- hpxml.hvac_distributions[0].ducts.add(duct_type: HPXML::DuctTypeReturn,
4010
+ hpxml.hvac_distributions[0].ducts.add(id: "Ducts#{hpxml.hvac_distributions[0].ducts.size + 1}",
4011
+ duct_type: HPXML::DuctTypeReturn,
3995
4012
  duct_insulation_r_value: 4,
3996
4013
  duct_location: HPXML::LocationAtticUnvented,
3997
4014
  duct_surface_area: 25)
3998
- hpxml.hvac_distributions[0].ducts.add(duct_type: HPXML::DuctTypeReturn,
4015
+ hpxml.hvac_distributions[0].ducts.add(id: "Ducts#{hpxml.hvac_distributions[0].ducts.size + 1}",
4016
+ duct_type: HPXML::DuctTypeReturn,
3999
4017
  duct_insulation_r_value: 4,
4000
4018
  duct_location: HPXML::LocationOutside,
4001
4019
  duct_surface_area: 25)
4002
- hpxml.hvac_distributions << hpxml.hvac_distributions[0].dup
4003
- hpxml.hvac_distributions[-1].id = "HVACDistribution#{hpxml.hvac_distributions.size}"
4020
+ hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
4021
+ distribution_system_type: HPXML::HVACDistributionTypeAir,
4022
+ air_type: HPXML::AirTypeRegularVelocity)
4023
+ hpxml.hvac_distributions[-1].duct_leakage_measurements << hpxml.hvac_distributions[0].duct_leakage_measurements[0].dup
4024
+ hpxml.hvac_distributions[-1].duct_leakage_measurements << hpxml.hvac_distributions[0].duct_leakage_measurements[1].dup
4025
+ for i in 0..3
4026
+ hpxml.hvac_distributions[-1].ducts << hpxml.hvac_distributions[0].ducts[i].dup
4027
+ hpxml.hvac_distributions[-1].ducts[-1].id = "Ducts#{hpxml.hvac_distributions[0].ducts.size + i + 1}"
4028
+ end
4004
4029
  hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
4005
4030
  distribution_system_type: HPXML::HVACDistributionTypeHydronic,
4006
4031
  hydronic_type: HPXML::HydronicTypeBaseboard)
4007
4032
  hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
4008
4033
  distribution_system_type: HPXML::HVACDistributionTypeHydronic,
4009
4034
  hydronic_type: HPXML::HydronicTypeBaseboard)
4010
- hpxml.hvac_distributions << hpxml.hvac_distributions[0].dup
4011
- hpxml.hvac_distributions[-1].id = "HVACDistribution#{hpxml.hvac_distributions.size}"
4012
- hpxml.hvac_distributions << hpxml.hvac_distributions[0].dup
4013
- hpxml.hvac_distributions[-1].id = "HVACDistribution#{hpxml.hvac_distributions.size}"
4035
+ hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
4036
+ distribution_system_type: HPXML::HVACDistributionTypeAir,
4037
+ air_type: HPXML::AirTypeRegularVelocity)
4038
+ hpxml.hvac_distributions[-1].duct_leakage_measurements << hpxml.hvac_distributions[0].duct_leakage_measurements[0].dup
4039
+ hpxml.hvac_distributions[-1].duct_leakage_measurements << hpxml.hvac_distributions[0].duct_leakage_measurements[1].dup
4040
+ for i in 0..3
4041
+ hpxml.hvac_distributions[-1].ducts << hpxml.hvac_distributions[0].ducts[i].dup
4042
+ hpxml.hvac_distributions[-1].ducts[-1].id = "Ducts#{hpxml.hvac_distributions[0].ducts.size * 2 + i + 1}"
4043
+ end
4044
+ hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
4045
+ distribution_system_type: HPXML::HVACDistributionTypeAir,
4046
+ air_type: HPXML::AirTypeRegularVelocity)
4047
+ hpxml.hvac_distributions[-1].duct_leakage_measurements << hpxml.hvac_distributions[0].duct_leakage_measurements[0].dup
4048
+ hpxml.hvac_distributions[-1].duct_leakage_measurements << hpxml.hvac_distributions[0].duct_leakage_measurements[1].dup
4049
+ for i in 0..3
4050
+ hpxml.hvac_distributions[-1].ducts << hpxml.hvac_distributions[0].ducts[i].dup
4051
+ hpxml.hvac_distributions[-1].ducts[-1].id = "Ducts#{hpxml.hvac_distributions[0].ducts.size * 3 + i + 1}"
4052
+ end
4014
4053
  hpxml.heating_systems.reverse_each do |heating_system|
4015
4054
  heating_system.delete
4016
4055
  end
@@ -4133,8 +4172,15 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4133
4172
  primary_heating_system: true)
4134
4173
  elsif ['base-mechvent-multiple.xml',
4135
4174
  'base-bldgtype-multifamily-shared-mechvent-multiple.xml'].include? hpxml_file
4136
- hpxml.hvac_distributions << hpxml.hvac_distributions[0].dup
4137
- hpxml.hvac_distributions[1].id = "HVACDistribution#{hpxml.hvac_distributions.size}"
4175
+ hpxml.hvac_distributions.add(id: "HVACDistribution#{hpxml.hvac_distributions.size + 1}",
4176
+ distribution_system_type: HPXML::HVACDistributionTypeAir,
4177
+ air_type: HPXML::AirTypeRegularVelocity)
4178
+ hpxml.hvac_distributions[1].duct_leakage_measurements << hpxml.hvac_distributions[0].duct_leakage_measurements[0].dup
4179
+ hpxml.hvac_distributions[1].duct_leakage_measurements << hpxml.hvac_distributions[0].duct_leakage_measurements[1].dup
4180
+ hpxml.hvac_distributions[1].ducts << hpxml.hvac_distributions[0].ducts[0].dup
4181
+ hpxml.hvac_distributions[1].ducts << hpxml.hvac_distributions[0].ducts[1].dup
4182
+ hpxml.hvac_distributions[1].ducts[0].id = "Ducts#{hpxml.hvac_distributions[0].ducts.size + 1}"
4183
+ hpxml.hvac_distributions[1].ducts[1].id = "Ducts#{hpxml.hvac_distributions[0].ducts.size + 2}"
4138
4184
  hpxml.heating_systems[0].heating_capacity /= 2.0
4139
4185
  hpxml.heating_systems[0].fraction_heat_load_served /= 2.0
4140
4186
  hpxml.heating_systems[0].primary_system = false
@@ -4151,11 +4197,13 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4151
4197
  hpxml.cooling_systems[1].primary_system = true
4152
4198
  elsif ['base-bldgtype-multifamily-adjacent-to-multiple.xml'].include? hpxml_file
4153
4199
  hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationOtherHousingUnit
4154
- hpxml.hvac_distributions[0].ducts.add(duct_type: HPXML::DuctTypeSupply,
4200
+ hpxml.hvac_distributions[0].ducts.add(id: "Ducts#{hpxml.hvac_distributions[0].ducts.size + 1}",
4201
+ duct_type: HPXML::DuctTypeSupply,
4155
4202
  duct_insulation_r_value: 4,
4156
4203
  duct_location: HPXML::LocationRoofDeck,
4157
4204
  duct_surface_area: 150)
4158
- hpxml.hvac_distributions[0].ducts.add(duct_type: HPXML::DuctTypeReturn,
4205
+ hpxml.hvac_distributions[0].ducts.add(id: "Ducts#{hpxml.hvac_distributions[0].ducts.size + 1}",
4206
+ duct_type: HPXML::DuctTypeReturn,
4159
4207
  duct_insulation_r_value: 0,
4160
4208
  duct_location: HPXML::LocationRoofDeck,
4161
4209
  duct_surface_area: 50)
@@ -4179,6 +4227,12 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4179
4227
  hpxml.hvac_distributions[0].duct_leakage_measurements << hpxml.hvac_distributions[1].duct_leakage_measurements[1].dup
4180
4228
  hpxml.hvac_distributions[0].ducts << hpxml.hvac_distributions[1].ducts[0].dup
4181
4229
  hpxml.hvac_distributions[0].ducts << hpxml.hvac_distributions[1].ducts[1].dup
4230
+ hpxml.hvac_distributions[1].ducts[0].id = "Ducts#{hpxml.hvac_distributions[0].ducts.size + 1}"
4231
+ hpxml.hvac_distributions[1].ducts[1].id = "Ducts#{hpxml.hvac_distributions[0].ducts.size + 2}"
4232
+ end
4233
+ if ['base-hvac-ducts-area-multipliers.xml'].include? hpxml_file
4234
+ hpxml.hvac_distributions[0].ducts[0].duct_surface_area_multiplier = 0.5
4235
+ hpxml.hvac_distributions[0].ducts[1].duct_surface_area_multiplier = 1.5
4182
4236
  end
4183
4237
 
4184
4238
  # ------------------ #
@@ -4197,7 +4251,8 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4197
4251
  hpxml.hot_water_distributions[0].shared_recirculation_number_of_units_served = 6
4198
4252
  hpxml.hot_water_distributions[0].shared_recirculation_pump_power = 220
4199
4253
  hpxml.hot_water_distributions[0].shared_recirculation_control_type = HPXML::DHWRecirControlTypeTimer
4200
- elsif ['base-bldgtype-multifamily-shared-laundry-room.xml'].include? hpxml_file
4254
+ elsif ['base-bldgtype-multifamily-shared-laundry-room.xml',
4255
+ 'base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml'].include? hpxml_file
4201
4256
  hpxml.water_heating_systems.reverse_each do |water_heating_system|
4202
4257
  water_heating_system.delete
4203
4258
  end
@@ -4213,15 +4268,18 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4213
4268
  energy_factor: 0.59,
4214
4269
  recovery_efficiency: 0.76,
4215
4270
  temperature: 125.0)
4271
+ if hpxml_file == 'base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml'
4272
+ hpxml.water_heating_systems[0].fraction_dhw_load_served /= 2.0
4273
+ hpxml.water_heating_systems[0].tank_volume /= 2.0
4274
+ hpxml.water_heating_systems[0].number_of_units_served /= 2.0
4275
+ hpxml.water_heating_systems << hpxml.water_heating_systems[0].dup
4276
+ hpxml.water_heating_systems[1].id = "WaterHeatingSystem#{hpxml.water_heating_systems.size}"
4277
+ end
4216
4278
  elsif ['base-dhw-tank-gas-uef-fhr.xml'].include? hpxml_file
4217
4279
  hpxml.water_heating_systems[0].first_hour_rating = 56.0
4218
4280
  hpxml.water_heating_systems[0].usage_bin = nil
4219
4281
  elsif ['base-dhw-tankless-electric-outside.xml'].include? hpxml_file
4220
4282
  hpxml.water_heating_systems[0].performance_adjustment = 0.92
4221
- elsif ['base-misc-defaults.xml'].include? hpxml_file
4222
- hpxml.water_heating_systems[0].year_installed = 2009
4223
- hpxml.water_heating_systems[0].heating_capacity = nil
4224
- hpxml.water_heating_systems[0].energy_factor = nil
4225
4283
  elsif ['base-dhw-multiple.xml'].include? hpxml_file
4226
4284
  hpxml.water_heating_systems[0].fraction_dhw_load_served = 0.2
4227
4285
  hpxml.water_heating_systems.add(id: "WaterHeatingSystem#{hpxml.water_heating_systems.size + 1}",
@@ -4359,6 +4417,7 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4359
4417
  hours_in_operation: 8,
4360
4418
  fan_power: 150,
4361
4419
  used_for_whole_building_ventilation: true,
4420
+ cfis_addtl_runtime_operating_mode: HPXML::CFISModeAirHandler,
4362
4421
  distribution_system_idref: 'HVACDistribution1')
4363
4422
  elsif ['base-mechvent-multiple.xml'].include? hpxml_file
4364
4423
  hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
@@ -4367,16 +4426,15 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4367
4426
  used_for_seasonal_cooling_load_reduction: true)
4368
4427
  hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
4369
4428
  fan_type: HPXML::MechVentTypeSupply,
4370
- tested_flow_rate: 27.5,
4371
- hours_in_operation: 24,
4372
- fan_power: 7.5,
4373
- used_for_whole_building_ventilation: true)
4374
- hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
4375
- fan_type: HPXML::MechVentTypeExhaust,
4376
4429
  tested_flow_rate: 12.5,
4377
4430
  hours_in_operation: 14,
4378
4431
  fan_power: 2.5,
4379
4432
  used_for_whole_building_ventilation: true)
4433
+ hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
4434
+ fan_type: HPXML::MechVentTypeExhaust,
4435
+ tested_flow_rate: 30.0,
4436
+ fan_power: 7.5,
4437
+ used_for_whole_building_ventilation: true)
4380
4438
  hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
4381
4439
  fan_type: HPXML::MechVentTypeBalanced,
4382
4440
  tested_flow_rate: 27.5,
@@ -4413,6 +4471,7 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4413
4471
  hours_in_operation: 8,
4414
4472
  fan_power: 37.5,
4415
4473
  used_for_whole_building_ventilation: true,
4474
+ cfis_addtl_runtime_operating_mode: HPXML::CFISModeAirHandler,
4416
4475
  distribution_system_idref: 'HVACDistribution1')
4417
4476
  hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
4418
4477
  fan_type: HPXML::MechVentTypeCFIS,
@@ -4420,6 +4479,8 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4420
4479
  hours_in_operation: 8,
4421
4480
  fan_power: 37.5,
4422
4481
  used_for_whole_building_ventilation: true,
4482
+ cfis_addtl_runtime_operating_mode: HPXML::CFISModeSupplementalFan,
4483
+ cfis_supplemental_fan_idref: hpxml.ventilation_fans.select { |f| f.fan_type == HPXML::MechVentTypeExhaust }[0].id,
4423
4484
  distribution_system_idref: 'HVACDistribution2')
4424
4485
  # Test ventilation system w/ zero airflow and hours
4425
4486
  hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
@@ -4438,6 +4499,19 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4438
4499
  used_for_whole_building_ventilation: true)
4439
4500
  elsif ['base-mechvent-cfis-airflow-fraction-zero.xml'].include? hpxml_file
4440
4501
  hpxml.ventilation_fans[0].cfis_vent_mode_airflow_fraction = 0.0
4502
+ elsif ['base-mechvent-cfis-supplemental-fan-exhaust.xml',
4503
+ 'base-mechvent-cfis-supplemental-fan-supply.xml'].include? hpxml_file
4504
+ hpxml.ventilation_fans.add(id: "VentilationFan#{hpxml.ventilation_fans.size + 1}",
4505
+ tested_flow_rate: 120,
4506
+ fan_power: 30,
4507
+ used_for_whole_building_ventilation: true)
4508
+ if hpxml_file == 'base-mechvent-cfis-supplemental-fan-exhaust.xml'
4509
+ hpxml.ventilation_fans[-1].fan_type = HPXML::MechVentTypeExhaust
4510
+ else
4511
+ hpxml.ventilation_fans[-1].fan_type = HPXML::MechVentTypeSupply
4512
+ end
4513
+ hpxml.ventilation_fans[0].cfis_addtl_runtime_operating_mode = HPXML::CFISModeSupplementalFan
4514
+ hpxml.ventilation_fans[0].cfis_supplemental_fan_idref = hpxml.ventilation_fans[1].id
4441
4515
  end
4442
4516
 
4443
4517
  # ---------------- #
@@ -4447,7 +4521,12 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4447
4521
  # Logic that can only be applied based on the file name
4448
4522
  if ['base-misc-defaults.xml'].include? hpxml_file
4449
4523
  hpxml.pv_systems[0].year_modules_manufactured = 2015
4450
- elsif ['base-misc-generators.xml'].include? hpxml_file
4524
+ elsif ['base-misc-generators.xml',
4525
+ 'base-misc-generators-battery.xml',
4526
+ 'base-misc-generators-battery-scheduled.xml',
4527
+ 'base-pv-generators.xml',
4528
+ 'base-pv-generators-battery.xml',
4529
+ 'base-pv-generators-battery-scheduled.xml'].include? hpxml_file
4451
4530
  hpxml.generators.add(id: "Generator#{hpxml.generators.size + 1}",
4452
4531
  fuel_type: HPXML::FuelTypeNaturalGas,
4453
4532
  annual_consumption_kbtu: 8500,
@@ -4538,15 +4617,21 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4538
4617
  hpxml.hot_tubs[0].heater_weekend_fractions = '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024'
4539
4618
  hpxml.hot_tubs[0].heater_monthly_multipliers = '0.921, 0.928, 0.921, 0.915, 0.921, 1.160, 1.158, 1.158, 1.160, 0.921, 0.915, 0.921'
4540
4619
  end
4541
- if ['base-bldgtype-multifamily-shared-laundry-room.xml'].include? hpxml_file
4620
+ if ['base-bldgtype-multifamily-shared-laundry-room.xml',
4621
+ 'base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml'].include? hpxml_file
4542
4622
  hpxml.clothes_washers[0].is_shared_appliance = true
4543
4623
  hpxml.clothes_washers[0].location = HPXML::LocationOtherHeatedSpace
4544
- hpxml.clothes_washers[0].water_heating_system_idref = hpxml.water_heating_systems[0].id
4545
4624
  hpxml.clothes_dryers[0].location = HPXML::LocationOtherHeatedSpace
4546
4625
  hpxml.clothes_dryers[0].is_shared_appliance = true
4547
4626
  hpxml.dishwashers[0].is_shared_appliance = true
4548
4627
  hpxml.dishwashers[0].location = HPXML::LocationOtherHeatedSpace
4549
- hpxml.dishwashers[0].water_heating_system_idref = hpxml.water_heating_systems[0].id
4628
+ if hpxml_file == 'base-bldgtype-multifamily-shared-laundry-room.xml'
4629
+ hpxml.clothes_washers[0].water_heating_system_idref = hpxml.water_heating_systems[0].id
4630
+ hpxml.dishwashers[0].water_heating_system_idref = hpxml.water_heating_systems[0].id
4631
+ elsif hpxml_file == 'base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml'
4632
+ hpxml.clothes_washers[0].hot_water_distribution_idref = hpxml.hot_water_distributions[0].id
4633
+ hpxml.dishwashers[0].hot_water_distribution_idref = hpxml.hot_water_distributions[0].id
4634
+ end
4550
4635
  elsif ['base-misc-defaults.xml'].include? hpxml_file
4551
4636
  hpxml.refrigerators[0].primary_indicator = nil
4552
4637
  end
@@ -4631,7 +4716,7 @@ def apply_hpxml_modification(hpxml_file, hpxml)
4631
4716
  hpxml.rim_joists +
4632
4717
  hpxml.walls +
4633
4718
  hpxml.foundation_walls +
4634
- hpxml.frame_floors +
4719
+ hpxml.floors +
4635
4720
  hpxml.slabs +
4636
4721
  hpxml.windows +
4637
4722
  hpxml.skylights +
@@ -4649,7 +4734,7 @@ def renumber_hpxml_ids(hpxml)
4649
4734
  { hpxml.walls => 'Wall',
4650
4735
  hpxml.foundation_walls => 'FoundationWall',
4651
4736
  hpxml.rim_joists => 'RimJoist',
4652
- hpxml.frame_floors => 'FrameFloor',
4737
+ hpxml.floors => 'Floor',
4653
4738
  hpxml.roofs => 'Roof',
4654
4739
  hpxml.slabs => 'Slab',
4655
4740
  hpxml.windows => 'Window',
@@ -4666,8 +4751,8 @@ def renumber_hpxml_ids(hpxml)
4666
4751
  if attic_or_fnd.respond_to?(:attached_to_rim_joist_idrefs) && !attic_or_fnd.attached_to_rim_joist_idrefs.nil? && !attic_or_fnd.attached_to_rim_joist_idrefs.delete(surf.id).nil?
4667
4752
  attic_or_fnd.attached_to_rim_joist_idrefs << "#{surf_name}#{i + 1}"
4668
4753
  end
4669
- if attic_or_fnd.respond_to?(:attached_to_frame_floor_idrefs) && !attic_or_fnd.attached_to_frame_floor_idrefs.nil? && !attic_or_fnd.attached_to_frame_floor_idrefs.delete(surf.id).nil?
4670
- attic_or_fnd.attached_to_frame_floor_idrefs << "#{surf_name}#{i + 1}"
4754
+ if attic_or_fnd.respond_to?(:attached_to_floor_idrefs) && !attic_or_fnd.attached_to_floor_idrefs.nil? && !attic_or_fnd.attached_to_floor_idrefs.delete(surf.id).nil?
4755
+ attic_or_fnd.attached_to_floor_idrefs << "#{surf_name}#{i + 1}"
4671
4756
  end
4672
4757
  if attic_or_fnd.respond_to?(:attached_to_slab_idrefs) && !attic_or_fnd.attached_to_slab_idrefs.nil? && !attic_or_fnd.attached_to_slab_idrefs.delete(surf.id).nil?
4673
4758
  attic_or_fnd.attached_to_slab_idrefs << "#{surf_name}#{i + 1}"
@@ -4700,291 +4785,37 @@ def renumber_hpxml_ids(hpxml)
4700
4785
  end
4701
4786
  end
4702
4787
 
4703
- def download_epws
4788
+ def download_utility_rates
4704
4789
  require_relative 'HPXMLtoOpenStudio/resources/util'
4790
+ require_relative 'ReportUtilityBills/resources/util'
4705
4791
 
4706
- require 'tempfile'
4707
- tmpfile = Tempfile.new('epw')
4708
-
4709
- UrlResolver.fetch('https://data.nrel.gov/system/files/128/tmy3s-cache-csv.zip', tmpfile)
4710
-
4711
- puts 'Extracting weather files...'
4712
- require 'zip'
4713
- weather_dir = File.join(File.dirname(__FILE__), 'weather')
4714
- Zip.on_exists_proc = true
4715
- Zip::File.open(tmpfile.path.to_s) do |zip_file|
4716
- zip_file.each do |f|
4717
- zip_file.extract(f, File.join(weather_dir, f.name))
4718
- end
4719
- end
4720
-
4721
- num_epws_actual = Dir[File.join(weather_dir, '*.epw')].count
4722
- puts "#{num_epws_actual} weather files are available in the weather directory."
4723
- puts 'Completed.'
4724
- exit!
4725
- end
4726
-
4727
- def get_elements_from_sample_files(hpxml_docs)
4728
- elements_being_used = []
4729
- hpxml_docs.each do |xml, hpxml_doc|
4730
- root = XMLHelper.get_element(hpxml_doc, '/HPXML')
4731
- root.each_node do |node|
4732
- next unless node.is_a?(Oga::XML::Element)
4733
-
4734
- ancestors = []
4735
- node.each_ancestor do |parent_node|
4736
- ancestors << ['h:', parent_node.name].join()
4737
- end
4738
- parent_element_xpath = ancestors.reverse
4739
- child_element_xpath = ['h:', node.name].join()
4740
- element_xpath = [parent_element_xpath, child_element_xpath].join('/')
4741
-
4742
- next if element_xpath.include? 'extension'
4743
-
4744
- elements_being_used << element_xpath if not elements_being_used.include? element_xpath
4745
- end
4746
- end
4747
-
4748
- return elements_being_used
4749
- end
4750
-
4751
- def create_schematron_hpxml_validator(hpxml_docs)
4752
- puts 'Generating HPXMLvalidator.xml...'
4753
- elements_in_sample_files = get_elements_from_sample_files(hpxml_docs)
4754
-
4755
- hpxml_base_elements_xsd = File.read(File.join(File.dirname(__FILE__), 'HPXMLtoOpenStudio', 'resources', 'hpxml_schema', 'HPXMLBaseElements.xsd'))
4756
- hpxml_base_elements_xsd_doc = Oga.parse_xml(hpxml_base_elements_xsd)
4757
-
4758
- # construct dictionary for enumerations and min/max values of HPXML data types
4759
- hpxml_data_types_xsd = File.read(File.join(File.dirname(__FILE__), 'HPXMLtoOpenStudio', 'resources', 'hpxml_schema', 'HPXMLDataTypes.xsd'))
4760
- hpxml_data_types_xsd_doc = Oga.parse_xml(hpxml_data_types_xsd)
4761
- hpxml_data_types_dict = {}
4762
- hpxml_data_types_xsd_doc.xpath('//xs:simpleType | //xs:complexType').each do |simple_type_element|
4763
- enums = []
4764
- simple_type_element.xpath('xs:restriction/xs:enumeration').each do |enum|
4765
- enums << enum.get('value')
4766
- end
4767
- minInclusive_element = simple_type_element.at_xpath('xs:restriction/xs:minInclusive')
4768
- min_inclusive = minInclusive_element.get('value') if not minInclusive_element.nil?
4769
- maxInclusive_element = simple_type_element.at_xpath('xs:restriction/xs:maxInclusive')
4770
- max_inclusive = maxInclusive_element.get('value') if not maxInclusive_element.nil?
4771
- minExclusive_element = simple_type_element.at_xpath('xs:restriction/xs:minExclusive')
4772
- min_exclusive = minExclusive_element.get('value') if not minExclusive_element.nil?
4773
- maxExclusive_element = simple_type_element.at_xpath('xs:restriction/xs:maxExclusive')
4774
- max_exclusive = maxExclusive_element.get('value') if not maxExclusive_element.nil?
4775
-
4776
- simple_type_element_name = simple_type_element.get('name')
4777
- hpxml_data_types_dict[simple_type_element_name] = {}
4778
- hpxml_data_types_dict[simple_type_element_name][:enums] = enums
4779
- hpxml_data_types_dict[simple_type_element_name][:min_inclusive] = min_inclusive
4780
- hpxml_data_types_dict[simple_type_element_name][:max_inclusive] = max_inclusive
4781
- hpxml_data_types_dict[simple_type_element_name][:min_exclusive] = min_exclusive
4782
- hpxml_data_types_dict[simple_type_element_name][:max_exclusive] = max_exclusive
4783
- end
4784
-
4785
- # construct HPXMLvalidator.xml
4786
- hpxml_validator = XMLHelper.create_doc(version = '1.0', encoding = 'UTF-8')
4787
- root = XMLHelper.add_element(hpxml_validator, 'sch:schema')
4788
- XMLHelper.add_attribute(root, 'xmlns:sch', 'http://purl.oclc.org/dsdl/schematron')
4789
- XMLHelper.add_element(root, 'sch:title', 'HPXML Schematron Validator: HPXML.xsd', :string)
4790
- name_space = XMLHelper.add_element(root, 'sch:ns')
4791
- XMLHelper.add_attribute(name_space, 'uri', 'http://hpxmlonline.com/2019/10')
4792
- XMLHelper.add_attribute(name_space, 'prefix', 'h')
4793
- pattern = XMLHelper.add_element(root, 'sch:pattern')
4794
-
4795
- # construct complexType and group elements dictionary
4796
- complex_type_or_group_dict = {}
4797
- ['//xs:complexType', '//xs:group', '//xs:element'].each do |param|
4798
- hpxml_base_elements_xsd_doc.xpath(param).each do |param_type|
4799
- next if param_type.name == 'element' && (not ['XMLTransactionHeaderInformation', 'ProjectStatus', 'SoftwareInfo'].include?(param_type.get('name')))
4800
- next if param_type.get('name').nil?
4801
-
4802
- param_type_name = param_type.get('name')
4803
- complex_type_or_group_dict[param_type_name] = {}
4804
-
4805
- elements = { 'child' => [], 'base' => [] }
4806
- param_type.each_node do |element|
4807
- elements['child'] << element
4808
- next unless element.is_a? Oga::XML::Element
4809
-
4810
- next unless element.name == 'extension'
4811
-
4812
- base_element_name = element.get('base').to_s
4813
- hpxml_base_elements_xsd_doc.xpath("#{param}[@name='#{base_element_name}']").each do |base_element|
4814
- base_element.each_node do |element|
4815
- elements['base'] << element
4816
- end
4817
- end
4818
- end
4792
+ rates_dir = File.join(File.dirname(__FILE__), 'ReportUtilityBills/resources/detailed_rates')
4793
+ FileUtils.mkdir(rates_dir) if !File.exist?(rates_dir)
4794
+ filepath = File.join(rates_dir, 'usurdb.csv')
4819
4795
 
4820
- elements.each do |element_child_or_base, element_list|
4821
- element_list.each do |element|
4822
- next unless element.is_a? Oga::XML::Element
4823
- next unless (element.name == 'element' || element.name == 'group')
4824
- next if element.name == 'element' && (element.get('name').nil? && element.get('ref').nil?)
4825
- next if element.name == 'group' && element.get('ref').nil?
4796
+ if !File.exist?(filepath)
4797
+ require 'tempfile'
4798
+ tmpfile = Tempfile.new('rates')
4826
4799
 
4827
- ancestors = []
4828
- element.each_ancestor do |node|
4829
- next if node.get('name').nil?
4830
- next if node.get('name') == param_type.get('name') # exclude complexType name from element xpath
4800
+ UrlResolver.fetch('https://openei.org/apps/USURDB/download/usurdb.csv.gz', tmpfile)
4831
4801
 
4832
- ancestors << node.get('name')
4833
- end
4834
- ancestors.shift if element_child_or_base == 'base'
4835
-
4836
- parent_element_names = ancestors.reverse
4837
- if element.name == 'element'
4838
- child_element_name = element.get('name')
4839
- child_element_name = element.get('ref') if child_element_name.nil? # Backup
4840
- element_type = element.get('type')
4841
- element_type = element.get('ref') if element_type.nil? # Backup
4842
- elsif element.name == 'group'
4843
- child_element_name = nil # exclude group name from the element's xpath
4844
- element_type = element.get('ref')
4845
- end
4846
- element_xpath = parent_element_names.push(child_element_name)
4847
- complex_type_or_group_dict[param_type_name][element_xpath] = element_type
4848
- end
4802
+ puts 'Extracting utility rates...'
4803
+ require 'zlib'
4804
+ Zlib::GzipReader.open(tmpfile.path.to_s) do |input_stream|
4805
+ File.open(filepath, 'w') do |output_stream|
4806
+ IO.copy_stream(input_stream, output_stream)
4849
4807
  end
4850
4808
  end
4851
4809
  end
4852
4810
 
4853
- element_xpaths = {}
4854
- top_level_elements_of_interest = elements_in_sample_files.map { |e| e.split('/')[1].gsub('h:', '') }.uniq
4855
- top_level_elements_of_interest.each do |element|
4856
- top_level_element = []
4857
- top_level_element << element
4858
- top_level_element_type = element
4859
- get_element_full_xpaths(element_xpaths, complex_type_or_group_dict, top_level_element, top_level_element_type)
4860
- end
4861
-
4862
- # Add enumeration and min/max numeric values
4863
- rules = {}
4864
- element_xpaths.each do |element_xpath, element_type|
4865
- next if element_type.nil?
4866
-
4867
- # Skip element xpaths not being used in sample files
4868
- element_xpath_with_prefix = element_xpath.compact.map { |e| "h:#{e}" }
4869
- context_xpath = element_xpath_with_prefix.join('/').chomp('/')
4870
- next unless elements_in_sample_files.any? { |item| item.include? context_xpath }
4871
-
4872
- hpxml_data_type_name = [element_type, '_simple'].join() # FUTURE: This may need to be improved later since enumeration and minimum/maximum values cannot be guaranteed to always be placed within simpleType.
4873
- hpxml_data_type = hpxml_data_types_dict[hpxml_data_type_name]
4874
- hpxml_data_type = hpxml_data_types_dict[element_type] if hpxml_data_type.nil? # Backup
4875
- if hpxml_data_type.nil?
4876
- fail "Could not find data type name for '#{element_type}'."
4877
- end
4878
-
4879
- next if hpxml_data_type[:enums].empty? && hpxml_data_type[:min_inclusive].nil? && hpxml_data_type[:max_inclusive].nil? && hpxml_data_type[:min_exclusive].nil? && hpxml_data_type[:max_exclusive].nil?
4880
-
4881
- element_name = context_xpath.split('/')[-1]
4882
- context_xpath = context_xpath.split('/')[0..-2].join('/').chomp('/').prepend('/h:HPXML/')
4883
- rule = rules[context_xpath]
4884
- if rule.nil?
4885
- # Need new rule
4886
- rule = XMLHelper.add_element(pattern, 'sch:rule')
4887
- XMLHelper.add_attribute(rule, 'context', context_xpath)
4888
- rules[context_xpath] = rule
4889
- end
4890
-
4891
- if not hpxml_data_type[:enums].empty?
4892
- assertion = XMLHelper.add_element(rule, 'sch:assert', "Expected #{element_name.gsub('h:', '')} to be \"#{hpxml_data_type[:enums].join('" or "')}\"", :string)
4893
- XMLHelper.add_attribute(assertion, 'role', 'ERROR')
4894
- XMLHelper.add_attribute(assertion, 'test', "#{element_name}[#{hpxml_data_type[:enums].map { |e| "text()=\"#{e}\"" }.join(' or ')}] or not(#{element_name})")
4895
- else
4896
- if hpxml_data_type[:min_inclusive]
4897
- assertion = XMLHelper.add_element(rule, 'sch:assert', "Expected #{element_name.gsub('h:', '')} to be greater than or equal to #{hpxml_data_type[:min_inclusive]}", :string)
4898
- XMLHelper.add_attribute(assertion, 'role', 'ERROR')
4899
- XMLHelper.add_attribute(assertion, 'test', "number(#{element_name}) &gt;= #{hpxml_data_type[:min_inclusive]} or not(#{element_name})")
4900
- end
4901
- if hpxml_data_type[:max_inclusive]
4902
- assertion = XMLHelper.add_element(rule, 'sch:assert', "Expected #{element_name.gsub('h:', '')} to be less than or equal to #{hpxml_data_type[:max_inclusive]}", :string)
4903
- XMLHelper.add_attribute(assertion, 'role', 'ERROR')
4904
- XMLHelper.add_attribute(assertion, 'test', "number(#{element_name}) &lt;= #{hpxml_data_type[:max_inclusive]} or not(#{element_name})")
4905
- end
4906
- if hpxml_data_type[:min_exclusive]
4907
- assertion = XMLHelper.add_element(rule, 'sch:assert', "Expected #{element_name.gsub('h:', '')} to be greater than #{hpxml_data_type[:min_exclusive]}", :string)
4908
- XMLHelper.add_attribute(assertion, 'role', 'ERROR')
4909
- XMLHelper.add_attribute(assertion, 'test', "number(#{element_name}) &gt; #{hpxml_data_type[:min_exclusive]} or not(#{element_name})")
4910
- end
4911
- if hpxml_data_type[:max_exclusive]
4912
- assertion = XMLHelper.add_element(rule, 'sch:assert', "Expected #{element_name.gsub('h:', '')} to be less than #{hpxml_data_type[:max_exclusive]}", :string)
4913
- XMLHelper.add_attribute(assertion, 'role', 'ERROR')
4914
- XMLHelper.add_attribute(assertion, 'test', "number(#{element_name}) &lt; #{hpxml_data_type[:max_exclusive]} or not(#{element_name})")
4915
- end
4916
- end
4917
- end
4811
+ num_rates_actual = process_usurdb(filepath)
4918
4812
 
4919
- # Add ID/IDref checks
4920
- # FUTURE: Dynamically obtain these lists
4921
- id_names = ['SystemIdentifier',
4922
- 'BuildingID']
4923
- idref_names = ['AttachedToRoof',
4924
- 'AttachedToFrameFloor',
4925
- 'AttachedToSlab',
4926
- 'AttachedToFoundationWall',
4927
- 'AttachedToWall',
4928
- 'AttachedToRimJoist',
4929
- 'DistributionSystem',
4930
- 'AttachedToHVACDistributionSystem',
4931
- 'RelatedHVACSystem',
4932
- 'ConnectedTo']
4933
- elements_in_sample_files.each do |element_xpath|
4934
- element_name = element_xpath.split('/')[-1].gsub('h:', '')
4935
- context_xpath = "/#{element_xpath.split('/')[0..-2].join('/')}"
4936
- if id_names.include? element_name
4937
- rule = rules[context_xpath]
4938
- if rule.nil?
4939
- # Need new rule
4940
- rule = XMLHelper.add_element(pattern, 'sch:rule')
4941
- XMLHelper.add_attribute(rule, 'context', context_xpath)
4942
- rules[context_xpath] = rule
4943
- end
4944
- assertion = XMLHelper.add_element(rule, 'sch:assert', "Expected #{element_name} with id attribute", :string)
4945
- XMLHelper.add_attribute(assertion, 'role', 'ERROR')
4946
- XMLHelper.add_attribute(assertion, 'test', "count(h:#{element_name}[@id]) = 1")
4947
- elsif idref_names.include?(element_name)
4948
- rule = rules[context_xpath]
4949
- if rule.nil?
4950
- # Need new rule
4951
- rule = XMLHelper.add_element(pattern, 'sch:rule')
4952
- XMLHelper.add_attribute(rule, 'context', context_xpath)
4953
- rules[context_xpath] = rule
4954
- end
4955
- assertion = XMLHelper.add_element(rule, 'sch:assert', "Expected idref attribute for #{element_name}", :string)
4956
- XMLHelper.add_attribute(assertion, 'role', 'ERROR')
4957
- XMLHelper.add_attribute(assertion, 'test', "count(h:#{element_name}[@idref]) = count(h:#{element_name})")
4958
- end
4959
- end
4960
-
4961
- XMLHelper.write_file(hpxml_validator, File.join(File.dirname(__FILE__), 'HPXMLtoOpenStudio', 'resources', 'hpxml_schematron', 'HPXMLvalidator.xml'))
4962
- end
4963
-
4964
- def get_element_full_xpaths(element_xpaths, complex_type_or_group_dict, element_xpath, element_type)
4965
- if not complex_type_or_group_dict.keys.include? element_type
4966
- element_xpaths[element_xpath] = element_type
4967
- else
4968
- complex_type_or_group = deep_copy_object(complex_type_or_group_dict[element_type])
4969
- complex_type_or_group.each do |k, v|
4970
- child_element_xpath = k.unshift(element_xpath).flatten!
4971
- child_element_type = v
4972
-
4973
- if not complex_type_or_group_dict.keys.include? child_element_type
4974
- element_xpaths[child_element_xpath] = child_element_type
4975
- next
4976
- end
4977
-
4978
- get_element_full_xpaths(element_xpaths, complex_type_or_group_dict, child_element_xpath, child_element_type)
4979
- end
4980
- end
4981
- end
4982
-
4983
- def deep_copy_object(obj)
4984
- return Marshal.load(Marshal.dump(obj))
4813
+ puts "#{num_rates_actual} rate files are available in openei_rates.zip."
4814
+ puts 'Completed.'
4815
+ exit!
4985
4816
  end
4986
4817
 
4987
- command_list = [:update_measures, :update_hpxmls, :cache_weather, :create_release_zips, :download_weather]
4818
+ command_list = [:update_measures, :update_hpxmls, :cache_weather, :create_release_zips, :download_utility_rates]
4988
4819
 
4989
4820
  def display_usage(command_list)
4990
4821
  puts "Usage: openstudio #{File.basename(__FILE__)} [COMMAND]\nCommands:\n " + command_list.join("\n ")
@@ -5012,7 +4843,17 @@ if ARGV[0].to_sym == :update_measures
5012
4843
  # Apply rubocop
5013
4844
  cops = ['Layout',
5014
4845
  'Lint/DeprecatedClassMethods',
4846
+ 'Lint/DuplicateElsifCondition',
4847
+ 'Lint/DuplicateHashKey',
4848
+ 'Lint/DuplicateMethods',
4849
+ 'Lint/InterpolationCheck',
4850
+ 'Lint/LiteralAsCondition',
5015
4851
  'Lint/RedundantStringCoercion',
4852
+ 'Lint/SelfAssignment',
4853
+ 'Lint/UnderscorePrefixedVariableName',
4854
+ 'Lint/UnusedBlockArgument',
4855
+ 'Lint/UnusedMethodArgument',
4856
+ 'Lint/UselessAssignment',
5016
4857
  'Style/AndOr',
5017
4858
  'Style/FrozenStringLiteralComment',
5018
4859
  'Style/HashSyntax',
@@ -5034,9 +4875,8 @@ if ARGV[0].to_sym == :update_measures
5034
4875
  # Update measures XMLs
5035
4876
  puts 'Updating measure.xmls...'
5036
4877
  require 'oga'
5037
- require_relative 'HPXMLtoOpenStudio/resources/xmlhelper'
5038
4878
  Dir['**/measure.xml'].each do |measure_xml|
5039
- for n_attempt in 1..5 # For some reason CLI randomly generates errors, so try multiple times; FIXME: Fix CLI so this doesn't happen
4879
+ for n_attempt in 1..5 # For some reason CLI randomly generates errors, so try multiple times
5040
4880
  measure_dir = File.dirname(measure_xml)
5041
4881
  command = "#{OpenStudio.getOpenStudioCLI} measure -u '#{measure_dir}'"
5042
4882
  system(command, [:out, :err] => File::NULL)
@@ -5054,7 +4894,21 @@ if ARGV[0].to_sym == :update_measures
5054
4894
  fail "#{measure_xml}: #{err_val}" # Error generated all 5 times, fail
5055
4895
  else
5056
4896
  # Remove error from measure XML, try again
5057
- new_lines = File.readlines(measure_xml).select { |l| !l.include?('<error>') }
4897
+ orig_lines = File.readlines(measure_xml)
4898
+ new_lines = []
4899
+ inside_error = false
4900
+ orig_lines.each do |l|
4901
+ if l.include? '<error>'
4902
+ inside_error = true
4903
+ end
4904
+ if l.include? '</error>'
4905
+ inside_error = false
4906
+ next
4907
+ end
4908
+ next if inside_error
4909
+
4910
+ new_lines << l
4911
+ end
5058
4912
  File.open(measure_xml, 'w') do |file|
5059
4913
  file.puts new_lines
5060
4914
  end
@@ -5072,17 +4926,10 @@ if ARGV[0].to_sym == :update_hpxmls
5072
4926
  ENV['HOMEDRIVE'] = 'C:\\' if !ENV['HOMEDRIVE'].nil? && ENV['HOMEDRIVE'].start_with?('U:')
5073
4927
 
5074
4928
  # Create sample/test HPXMLs
5075
- hpxml_docs = create_hpxmls()
5076
-
5077
- # Create Schematron file that reflects HPXML schema
5078
- if not hpxml_docs.nil?
5079
- create_schematron_hpxml_validator(hpxml_docs)
5080
- end
4929
+ create_hpxmls()
5081
4930
  end
5082
4931
 
5083
4932
  if ARGV[0].to_sym == :cache_weather
5084
- require_relative 'HPXMLtoOpenStudio/resources/weather'
5085
-
5086
4933
  OpenStudio::Logger.instance.standardOutLogger.setLogLevel(OpenStudio::Fatal)
5087
4934
  runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
5088
4935
  puts 'Creating cache *.csv for weather files...'
@@ -5101,20 +4948,11 @@ if ARGV[0].to_sym == :cache_weather
5101
4948
  end
5102
4949
  end
5103
4950
 
5104
- if ARGV[0].to_sym == :download_weather
5105
- download_epws
4951
+ if ARGV[0].to_sym == :download_utility_rates
4952
+ download_utility_rates
5106
4953
  end
5107
4954
 
5108
4955
  if ARGV[0].to_sym == :create_release_zips
5109
- require_relative 'HPXMLtoOpenStudio/resources/version'
5110
-
5111
- release_map = { File.join(File.dirname(__FILE__), "OpenStudio-HPXML-v#{Version::OS_HPXML_Version}-minimal.zip") => false,
5112
- File.join(File.dirname(__FILE__), "OpenStudio-HPXML-v#{Version::OS_HPXML_Version}-full.zip") => true }
5113
-
5114
- release_map.keys.each do |zip_path|
5115
- File.delete(zip_path) if File.exist? zip_path
5116
- end
5117
-
5118
4956
  if ENV['CI']
5119
4957
  # CI doesn't have git, so default to everything
5120
4958
  git_files = Dir['**/*.*']
@@ -5137,8 +4975,6 @@ if ARGV[0].to_sym == :create_release_zips
5137
4975
  'BuildResidentialScheduleFile/resources/**/*.*',
5138
4976
  'HPXMLtoOpenStudio/measure.*',
5139
4977
  'HPXMLtoOpenStudio/resources/**/*.*',
5140
- 'ReportHPXMLOutput/measure.*',
5141
- 'ReportHPXMLOutput/resources/**/*.*',
5142
4978
  'ReportSimulationOutput/measure.*',
5143
4979
  'ReportSimulationOutput/resources/**/*.*',
5144
4980
  'ReportUtilityBills/measure.*',
@@ -5172,50 +5008,28 @@ if ARGV[0].to_sym == :create_release_zips
5172
5008
  if Dir.exist? fonts_dir
5173
5009
  FileUtils.rm_r(fonts_dir)
5174
5010
  end
5175
-
5176
- # Check if we need to download weather files for the full release zip
5177
- num_epws_expected = 1011
5178
- num_epws_local = 0
5179
- files.each do |f|
5180
- Dir[f].each do |file|
5181
- next unless file.end_with? '.epw'
5182
-
5183
- num_epws_local += 1
5184
- end
5185
- end
5186
-
5187
- # Make sure we have the full set of weather files
5188
- if num_epws_local < num_epws_expected
5189
- puts 'Fetching all weather files...'
5190
- command = "#{OpenStudio.getOpenStudioCLI} #{__FILE__} download_weather"
5191
- log = `#{command}`
5192
- end
5193
5011
  end
5194
5012
 
5195
5013
  # Create zip files
5196
5014
  require 'zip'
5197
- release_map.each do |zip_path, include_all_epws|
5198
- puts "Creating #{zip_path}..."
5199
- Zip::File.open(zip_path, create: true) do |zipfile|
5200
- files.each do |f|
5201
- Dir[f].each do |file|
5202
- if file.start_with? 'documentation'
5203
- # always include
5204
- elsif include_all_epws
5205
- if (not git_files.include? file) && (not file.start_with? 'weather')
5206
- next
5207
- end
5208
- else
5209
- if not git_files.include? file
5210
- next
5211
- end
5015
+ zip_path = File.join(File.dirname(__FILE__), "OpenStudio-HPXML-v#{Version::OS_HPXML_Version}.zip")
5016
+ File.delete(zip_path) if File.exist? zip_path
5017
+ puts "Creating #{zip_path}..."
5018
+ Zip::File.open(zip_path, create: true) do |zipfile|
5019
+ files.each do |f|
5020
+ Dir[f].each do |file|
5021
+ if file.start_with? 'documentation'
5022
+ # always include
5023
+ else
5024
+ if not git_files.include? file
5025
+ next
5212
5026
  end
5213
- zipfile.add(File.join('OpenStudio-HPXML', file), file)
5214
5027
  end
5028
+ zipfile.add(File.join('OpenStudio-HPXML', file), file)
5215
5029
  end
5216
5030
  end
5217
- puts "Wrote file at #{zip_path}."
5218
5031
  end
5032
+ puts "Wrote file at #{zip_path}."
5219
5033
 
5220
5034
  # Cleanup
5221
5035
  if not ENV['CI']