urbanopt-cli 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (650) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -6
  3. data/CHANGELOG.md +21 -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 +601 -101
  635. data/scripts/setup-env.bat +6 -7
  636. data/uo_cli.gemspec +6 -5
  637. metadata +121 -36
  638. data/example_files/residential/exhaust.tsv +0 -3
  639. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
  640. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
  641. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
  642. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
  643. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
  644. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
  645. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
  646. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
  647. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
  648. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
  649. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
  650. 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']