urbanopt-cli 0.8.3 → 0.9.1

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 (657) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -6
  3. data/CHANGELOG.md +20 -0
  4. data/CMakeLists.txt +7 -7
  5. data/Gemfile +3 -1
  6. data/LICENSE.md +1 -1
  7. data/README.md +9 -0
  8. data/Rakefile +1 -1
  9. data/example_files/Gemfile +23 -16
  10. data/example_files/Gemfile.lock +177 -0
  11. data/example_files/base_workflow_res.osw +57 -14
  12. data/example_files/class_project_coincident.json +1322 -0
  13. data/example_files/class_project_diverse.json +1322 -0
  14. data/example_files/disco/config.json +42 -0
  15. data/example_files/disco/cost_database.xlsx +0 -0
  16. data/example_files/disco/technical_catalog.json +12126 -0
  17. data/example_files/mappers/Baseline.rb +11 -8
  18. data/example_files/mappers/ChilledWaterStorage.rb +98 -0
  19. data/example_files/mappers/ClassProject.rb +110 -0
  20. data/example_files/mappers/CreateBar.rb +2 -1
  21. data/example_files/mappers/EvCharging.rb +1 -1
  22. data/example_files/mappers/FlexibleHotWater.rb +1 -1
  23. data/example_files/mappers/Floorspace.rb +1 -1
  24. data/example_files/mappers/HighEfficiency.rb +14 -12
  25. data/example_files/mappers/HighEfficiencyCreateBar.rb +1 -1
  26. data/example_files/mappers/HighEfficiencyFloorspace.rb +1 -1
  27. data/example_files/mappers/PeakHoursMelsShedding.rb +72 -0
  28. data/example_files/mappers/PeakHoursThermostatAdjust.rb +78 -0
  29. data/example_files/mappers/ThermalStorage.rb +2 -1
  30. data/example_files/mappers/base_workflow.osw +55 -14
  31. data/example_files/mappers/class_project_workflow.osw +328 -0
  32. data/example_files/mappers/createbar_workflow.osw +16 -16
  33. data/example_files/measures/BuildResidentialModel/measure.rb +7 -1
  34. data/example_files/measures/BuildResidentialModel/measure.xml +1313 -706
  35. data/example_files/opendss/electrical_database.json +1446 -1446
  36. data/example_files/python_deps/dependencies.json +5 -0
  37. data/example_files/python_deps/install_python.ps1 +96 -0
  38. data/example_files/python_deps/install_python.sh +120 -0
  39. data/example_files/residential/clothes_dryer.tsv +11 -11
  40. data/example_files/residential/clothes_washer.tsv +3 -3
  41. data/example_files/residential/dishwasher.tsv +3 -3
  42. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +0 -1
  43. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +8 -21
  44. data/example_files/resources/hpxml-measures/.gitignore +2 -0
  45. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1272 -1094
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +978 -659
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +52 -74
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +77 -140
  49. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +37 -27
  50. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +42 -15
  51. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +70 -51
  52. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +142 -21
  53. data/example_files/resources/hpxml-measures/Changelog.md +95 -19
  54. data/example_files/resources/hpxml-measures/Gemfile +2 -4
  55. data/example_files/resources/hpxml-measures/Gemfile.lock +2 -13
  56. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +276 -300
  57. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +220 -214
  58. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +215 -170
  59. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +115 -18
  60. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +24 -44
  61. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +564 -197
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/cambium/README.md +8 -8
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +7 -55
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +24 -19
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +541 -211
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +305 -176
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +0 -2
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +230 -141
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +145 -137
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +191 -97
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/iso-schematron.xsd +391 -0
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +194 -198
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +140 -145
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +11 -11
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +33 -1
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +4 -4
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -9
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +14 -12
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +39 -17
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +1 -1
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/battery.csv +8761 -0
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +114 -57
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +1 -0
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +148 -0
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +90 -128
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +26 -32
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +2 -14
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +67 -0
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +117 -56
  92. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +141 -14
  93. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +471 -344
  94. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +124 -20
  95. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +1 -1
  96. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +28 -32
  97. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +172 -79
  98. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +54 -8
  99. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -3
  100. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +4 -4
  101. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +7 -7
  102. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +1 -1
  103. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +6 -9
  104. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +8 -8
  105. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +213 -95
  106. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +1 -10
  107. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +76 -0
  108. data/example_files/resources/hpxml-measures/README.md +2 -3
  109. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +587 -284
  110. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +304 -352
  111. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +404 -279
  112. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +222 -501
  113. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +137 -200
  114. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json +649 -0
  115. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json +649 -0
  116. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json +647 -0
  117. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Annual Charge.json +8776 -0
  118. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Monthly Charge.json +8776 -0
  119. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json +8774 -0
  120. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Annual Charge.json +659 -0
  121. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Monthly Charge.json +659 -0
  122. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json +657 -0
  123. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Annual Charge.json +670 -0
  124. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Monthly Charge.json +670 -0
  125. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json +668 -0
  126. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Annual Charge.json +655 -0
  127. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Monthly Charge.json +655 -0
  128. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json +653 -0
  129. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/openei_rates.zip +0 -0
  130. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/Average_retail_price_of_electricity.csv +0 -0
  131. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/HouseholdConsumption.csv +0 -0
  132. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +0 -0
  133. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +0 -0
  134. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +0 -0
  135. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/README.md +0 -0
  136. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +506 -25
  137. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Contains Demand Charges.json +1312 -0
  138. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Fixed Charge Units.json +657 -0
  139. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Min Charge Units.json +659 -0
  140. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json +681 -0
  141. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Missing Required Fields.json +54 -0
  142. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/data.csv +8761 -0
  143. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +1006 -235
  144. data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -1
  145. data/example_files/resources/hpxml-measures/docs/source/intro.rst +0 -1
  146. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +4 -3
  147. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +468 -264
  148. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +148 -154
  149. data/example_files/resources/hpxml-measures/tasks.rb +616 -802
  150. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +19 -11
  151. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +20 -12
  152. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +12 -7
  153. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +12 -7
  154. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +19 -11
  155. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +12 -7
  156. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +20 -12
  157. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +28 -16
  158. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +28 -17
  159. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +28 -16
  160. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +20 -12
  161. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +20 -12
  162. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +20 -12
  163. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +20 -12
  164. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +20 -12
  165. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +22 -12
  166. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +19 -11
  167. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +20 -12
  168. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +13 -7
  169. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +12 -7
  170. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +31 -16
  171. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +22 -12
  172. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +21 -12
  173. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +37 -22
  174. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +24 -12
  175. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +33 -21
  176. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +28 -16
  177. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +28 -16
  178. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +30 -17
  179. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +10 -7
  180. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +22 -11
  181. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +12 -7
  182. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +18 -12
  183. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +25 -16
  184. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +22 -12
  185. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +20 -12
  186. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +26 -17
  187. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +19 -11
  188. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +25 -16
  189. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +20 -12
  190. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +35 -21
  191. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +28 -17
  192. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +20 -12
  193. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +35 -21
  194. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +20 -12
  195. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +20 -13
  196. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +12 -9
  197. data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +25 -14
  198. data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +10 -7
  199. data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +20 -11
  200. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +91 -88
  201. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +18 -7
  202. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +546 -535
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +546 -535
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +555 -544
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +18 -7
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +18 -7
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +18 -7
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +18 -7
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +580 -569
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +18 -7
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +580 -569
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +18 -7
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +18 -7
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +7 -0
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +17 -6
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +7 -0
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +18 -7
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +18 -7
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +18 -7
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +600 -0
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +598 -587
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +494 -485
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +606 -593
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +494 -485
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +494 -485
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +494 -485
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-calctype-operational.xml +480 -471
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +464 -457
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +496 -487
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +466 -459
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +518 -509
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +513 -504
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +445 -438
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +476 -467
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +443 -436
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +446 -439
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +494 -485
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +445 -438
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +476 -467
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +446 -439
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +494 -485
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +489 -480
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +499 -490
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +491 -482
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +510 -0
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +495 -486
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +709 -695
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +528 -519
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +512 -503
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +504 -495
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +497 -488
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +490 -481
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +487 -478
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-2stories.xml +639 -628
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-atticroof-cathedral.xml +587 -580
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +639 -628
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-defaults.xml +539 -528
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon.xml +644 -633
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon2.xml +644 -633
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational.xml +575 -564
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +16 -7
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +16 -7
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +18 -7
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +585 -574
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +18 -7
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +18 -7
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +18 -7
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +18 -7
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +18 -7
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +536 -0
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +16 -7
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +16 -7
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +20 -8
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +16 -7
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +16 -7
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +18 -7
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +18 -7
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +18 -7
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +16 -7
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +18 -7
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +16 -7
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +18 -7
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +19 -8
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +19 -8
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +19 -8
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +19 -8
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +19 -8
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +18 -7
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +18 -7
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +18 -7
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +18 -7
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +18 -7
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +18 -7
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +18 -7
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +582 -571
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +583 -572
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +18 -7
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +584 -573
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +584 -573
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +18 -7
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +583 -572
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +585 -574
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +18 -7
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +582 -571
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +18 -7
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +18 -7
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +18 -7
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +586 -575
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +585 -574
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +18 -7
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +18 -7
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +580 -569
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +18 -7
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +580 -569
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +18 -7
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +580 -569
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +18 -7
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +18 -7
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +18 -7
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +18 -7
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +28 -11
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +20 -7
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +18 -7
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +18 -7
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +18 -7
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +18 -7
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +607 -0
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +550 -0
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +27 -12
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +18 -7
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +18 -7
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +18 -7
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +18 -7
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +18 -7
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +589 -578
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +18 -7
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +18 -7
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +619 -608
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +620 -609
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +618 -607
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +18 -7
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +537 -526
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +90 -43
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2507 -2460
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +595 -584
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -8
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +584 -0
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +18 -7
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +594 -583
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +597 -586
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +598 -587
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +27 -12
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +671 -656
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -7
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +18 -7
  356. 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
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +582 -571
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +35 -16
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +18 -7
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +27 -12
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +27 -12
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +27 -12
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +27 -12
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +27 -12
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +27 -12
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +18 -7
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml +586 -575
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +580 -569
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +583 -0
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +18 -7
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +18 -7
  373. 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
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +599 -588
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +629 -616
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +18 -7
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +579 -568
  379. 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
  380. 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
  381. 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
  382. 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
  383. 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
  384. 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
  385. 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
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +598 -587
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +628 -615
  388. 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
  389. 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
  390. 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
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +535 -526
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +589 -578
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +536 -527
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +18 -7
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +565 -554
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +565 -554
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  398. 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
  399. 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
  400. 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
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +526 -517
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +573 -562
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +529 -520
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +565 -554
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +580 -569
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +580 -569
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +565 -554
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +578 -567
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +575 -564
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +581 -570
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +583 -572
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +583 -572
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +583 -572
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +18 -7
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +580 -569
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +580 -569
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +580 -569
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +551 -542
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +532 -530
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +525 -516
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +541 -532
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +541 -532
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +541 -532
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +525 -516
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +533 -0
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +542 -0
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +542 -0
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +542 -0
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +529 -520
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +529 -520
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +580 -569
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +16 -7
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +16 -7
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +18 -7
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +16 -7
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +16 -7
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +16 -7
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +16 -7
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +567 -0
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +18 -7
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +18 -7
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +18 -7
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +16 -7
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +18 -7
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +18 -7
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +18 -7
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +18 -7
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +611 -598
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +589 -0
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +582 -571
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +18 -7
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +16 -7
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +18 -7
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +17 -7
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +16 -7
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +530 -521
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +530 -521
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +530 -521
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +566 -555
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +18 -7
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +18 -7
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +18 -7
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +18 -7
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +566 -555
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +566 -555
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +18 -7
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +18 -7
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +18 -7
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +18 -7
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +16 -7
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +574 -563
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +581 -570
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +583 -572
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +587 -576
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +587 -576
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +587 -576
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +591 -580
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +591 -580
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +591 -580
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +570 -559
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +586 -575
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +570 -559
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +586 -575
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +18 -7
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +16 -7
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +18 -7
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +552 -543
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -7
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +963 -938
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +33 -69
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +530 -521
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +535 -0
  500. 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
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +526 -517
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +541 -532
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +16 -7
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +526 -517
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +526 -517
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +16 -7
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +535 -0
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +542 -0
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +594 -583
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +586 -575
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +18 -7
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +18 -7
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +530 -521
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +530 -521
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +18 -7
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +18 -7
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +530 -521
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +18 -7
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +18 -7
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +18 -7
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +18 -7
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +27 -12
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +591 -576
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +18 -7
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +27 -12
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +582 -571
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +537 -526
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +18 -7
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +537 -526
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +601 -586
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +18 -7
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +18 -7
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +601 -587
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +19 -7
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +20 -7
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +607 -0
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +607 -0
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +21 -7
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +18 -7
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +18 -7
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +18 -7
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +18 -7
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +18 -7
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +18 -7
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +37 -19
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +18 -7
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +18 -7
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +590 -579
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +578 -0
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +632 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +614 -0
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +677 -0
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +593 -0
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +27 -9
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +676 -665
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +616 -0
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +615 -0
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +598 -587
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +586 -0
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +18 -7
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +18 -7
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +18 -7
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +18 -7
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +583 -572
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +18 -7
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1700 -1677
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +622 -611
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +697 -682
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-pv-battery-lifetime-model.xml → base-pv-battery-round-trip-efficiency.xml} +20 -11
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +624 -0
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +622 -611
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +640 -0
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +639 -0
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +623 -0
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +606 -595
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +582 -571
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-smooth.xml +583 -572
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +584 -0
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +583 -572
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +583 -572
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +581 -570
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +581 -570
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +581 -570
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +636 -625
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +18 -7
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +27 -14
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +21 -10
  588. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +21 -10
  589. 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
  590. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +584 -0
  591. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +584 -0
  592. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +18 -7
  593. 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
  594. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +18 -7
  595. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +18 -13
  596. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy-subset.osw +64 -0
  597. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +12 -7
  598. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +8 -24
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +366 -358
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +369 -361
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +369 -361
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +369 -361
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +369 -361
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +369 -361
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +369 -361
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +369 -361
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +311 -303
  608. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +311 -303
  609. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +327 -319
  610. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +327 -319
  611. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +332 -324
  612. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +332 -324
  613. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +341 -333
  614. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +341 -333
  615. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +369 -361
  616. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +369 -361
  617. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +369 -361
  618. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +369 -361
  619. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +369 -361
  620. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +369 -361
  621. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +383 -379
  622. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +383 -379
  623. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +538 -534
  624. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +550 -546
  625. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +444 -410
  626. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +8 -8
  627. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +444 -410
  628. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +18 -4
  629. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +163 -392
  630. data/example_files/scripts/convert_urbanopt_to_disco.py +130 -0
  631. data/example_files/scripts/default_control_changes.csv +8 -0
  632. data/example_files/scripts/default_voltage_regulators.csv +3 -0
  633. data/example_files/scripts/read_data.py +331 -0
  634. data/example_files/visualization/input_visualization_feature.html +172 -81
  635. data/example_files/visualization/input_visualization_scenario.html +178 -82
  636. data/example_files/xml_building/17/README.md +2 -2
  637. data/example_files/xml_building/17/unit 1.xml +40 -41
  638. data/example_files/xml_building/17/unit 2.xml +35 -36
  639. data/example_files/xml_building/17/unit 3.xml +35 -36
  640. data/example_files/xml_building/17/unit 4.xml +41 -42
  641. data/lib/uo_cli/version.rb +2 -2
  642. data/lib/uo_cli.rb +597 -97
  643. data/uo_cli.gemspec +6 -5
  644. metadata +122 -36
  645. data/example_files/residential/exhaust.tsv +0 -3
  646. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
  647. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
  648. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
  649. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
  650. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
  651. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
  652. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
  653. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
  654. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
  655. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
  656. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
  657. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +0 -410
@@ -5,10 +5,6 @@ require 'openstudio'
5
5
  require 'fileutils'
6
6
  require 'parallel'
7
7
  require_relative '../../HPXMLtoOpenStudio/measure.rb'
8
- require_relative '../../HPXMLtoOpenStudio/resources/constants'
9
- require_relative '../../HPXMLtoOpenStudio/resources/meta_measure'
10
- require_relative '../../HPXMLtoOpenStudio/resources/unit_conversions'
11
- require_relative '../../HPXMLtoOpenStudio/resources/xmlhelper'
12
8
 
13
9
  class HPXMLTest < MiniTest::Test
14
10
  def setup
@@ -20,8 +16,6 @@ class HPXMLTest < MiniTest::Test
20
16
  def test_simulations
21
17
  results_out = File.join(@results_dir, 'results.csv')
22
18
  File.delete(results_out) if File.exist? results_out
23
- sizing_out = File.join(@results_dir, 'results_hvac_sizing.csv')
24
- File.delete(sizing_out) if File.exist? sizing_out
25
19
  bills_out = File.join(@results_dir, 'results_bills.csv')
26
20
  File.delete(bills_out) if File.exist? bills_out
27
21
 
@@ -39,17 +33,14 @@ class HPXMLTest < MiniTest::Test
39
33
  # Test simulations
40
34
  puts "Running #{xmls.size} HPXML files..."
41
35
  all_results = {}
42
- all_sizing_results = {}
43
36
  all_bill_results = {}
44
37
  Parallel.map(xmls, in_threads: Parallel.processor_count) do |xml|
45
- _test_schema_validation(xml)
46
38
  xml_name = File.basename(xml)
47
- all_results[xml_name], all_sizing_results[xml_name], all_bill_results[xml_name] = _run_xml(xml, Parallel.worker_number)
39
+ all_results[xml_name], all_bill_results[xml_name] = _run_xml(xml, Parallel.worker_number)
48
40
  end
49
41
 
50
- _write_summary_results(all_results.sort_by { |k, v| k.downcase }.to_h, results_out)
51
- _write_hvac_sizing_results(all_sizing_results.sort_by { |k, v| k.downcase }.to_h, sizing_out)
52
- _write_bill_results(all_bill_results.sort_by { |k, v| k.downcase }.to_h, bills_out)
42
+ _write_results(all_results.sort_by { |k, _v| k.downcase }.to_h, results_out)
43
+ _write_results(all_bill_results.sort_by { |k, _v| k.downcase }.to_h, bills_out)
53
44
  end
54
45
 
55
46
  def test_ashrae_140
@@ -70,30 +61,30 @@ class HPXMLTest < MiniTest::Test
70
61
  all_results[xml_name], _, _ = _run_xml(xml, Parallel.worker_number)
71
62
  end
72
63
 
73
- _write_ashrae_140_results(all_results.sort_by { |k, v| k.downcase }.to_h, ashrae140_out)
64
+ _write_ashrae_140_results(all_results.sort_by { |k, _v| k.downcase }.to_h, ashrae140_out)
74
65
  end
75
66
 
76
67
  def test_run_simulation_output_formats
77
68
  # Check that the simulation produces outputs in the appropriate format
78
- ['csv', 'json', 'msgpack'].each do |output_format|
69
+ ['csv', 'json', 'msgpack', 'csv_dview'].each do |output_format|
79
70
  rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
80
71
  xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
81
- command = "#{OpenStudio.getOpenStudioCLI} #{rb_path} -x #{xml} --debug --hourly ALL --add-utility-bills --output-format #{output_format}"
72
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --debug --hourly ALL --output-format #{output_format}"
82
73
  system(command, err: File::NULL)
83
74
 
75
+ output_format = 'csv' if output_format == 'csv_dview'
76
+
84
77
  # Check for output files
85
78
  assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
86
79
  assert(File.exist? File.join(File.dirname(xml), 'run', "results_annual.#{output_format}"))
87
80
  assert(File.exist? File.join(File.dirname(xml), 'run', "results_timeseries.#{output_format}"))
88
- assert(File.exist? File.join(File.dirname(xml), 'run', "results_hpxml.#{output_format}"))
89
- assert(File.exist? File.join(File.dirname(xml), 'run', "results_bills.#{output_format}"))
81
+ assert(File.exist?(File.join(File.dirname(xml), 'run', "results_bills.#{output_format}")))
90
82
 
91
83
  # Check for debug files
92
84
  osm_path = File.join(File.dirname(xml), 'run', 'in.osm')
93
85
  assert(File.exist? osm_path)
94
86
  hpxml_defaults_path = File.join(File.dirname(xml), 'run', 'in.xml')
95
87
  assert(File.exist? hpxml_defaults_path)
96
- _test_schema_validation(hpxml_defaults_path)
97
88
  end
98
89
  end
99
90
 
@@ -101,7 +92,7 @@ class HPXMLTest < MiniTest::Test
101
92
  # Check that we can run a simulation using epJSON (instead of IDF) if requested
102
93
  rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
103
94
  xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
104
- command = "#{OpenStudio.getOpenStudioCLI} #{rb_path} -x #{xml} --ep-input-format epjson"
95
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --ep-input-format epjson"
105
96
  system(command, err: File::NULL)
106
97
 
107
98
  # Check for epjson file
@@ -110,14 +101,13 @@ class HPXMLTest < MiniTest::Test
110
101
  # Check for output files
111
102
  assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
112
103
  assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
113
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_hpxml.csv'))
114
104
  end
115
105
 
116
106
  def test_run_simulation_idf_input
117
107
  # Check that we can run a simulation using IDF (instead of epJSON) if requested
118
108
  rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
119
109
  xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
120
- command = "#{OpenStudio.getOpenStudioCLI} #{rb_path} -x #{xml} --ep-input-format idf"
110
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --ep-input-format idf"
121
111
  system(command, err: File::NULL)
122
112
 
123
113
  # Check for idf file
@@ -126,24 +116,22 @@ class HPXMLTest < MiniTest::Test
126
116
  # Check for output files
127
117
  assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
128
118
  assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
129
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_hpxml.csv'))
130
119
  end
131
120
 
132
121
  def test_run_simulation_faster_performance
133
122
  # Run w/ --skip-validation and w/o --add-component-loads arguments
134
123
  rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
135
124
  xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
136
- command = "#{OpenStudio.getOpenStudioCLI} #{rb_path} -x #{xml} --skip-validation"
125
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --skip-validation"
137
126
  system(command, err: File::NULL)
138
127
 
139
128
  # Check for output files
140
129
  assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
141
130
  assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
142
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_hpxml.csv'))
143
131
 
144
132
  # Check component loads don't exist
145
133
  component_loads = {}
146
- CSV.read(File.join(File.dirname(xml), 'run', 'results_hpxml.csv'), headers: false).each do |data|
134
+ CSV.read(File.join(File.dirname(xml), 'run', 'results_annual.csv'), headers: false).each do |data|
147
135
  next unless data[0].to_s.start_with? 'Component Load'
148
136
 
149
137
  component_loads[data[0]] = Float(data[1])
@@ -152,25 +140,35 @@ class HPXMLTest < MiniTest::Test
152
140
  end
153
141
 
154
142
  def test_run_simulation_detailed_occupancy_schedules
155
- # Check that the simulation produces stochastic schedules if requested
156
- sample_files_path = File.join(File.dirname(__FILE__), '..', 'sample_files')
157
- tmp_hpxml_path = File.join(sample_files_path, 'tmp.xml')
158
- hpxml = HPXML.new(hpxml_path: File.join(sample_files_path, 'base.xml'))
159
- XMLHelper.write_file(hpxml.to_oga, tmp_hpxml_path)
143
+ [false, true].each do |debug|
144
+ # Check that the simulation produces stochastic schedules if requested
145
+ sample_files_path = File.join(File.dirname(__FILE__), '..', 'sample_files')
146
+ tmp_hpxml_path = File.join(sample_files_path, 'tmp.xml')
147
+ hpxml = HPXML.new(hpxml_path: File.join(sample_files_path, 'base.xml'))
148
+ XMLHelper.write_file(hpxml.to_oga, tmp_hpxml_path)
160
149
 
161
- rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
162
- xml = File.absolute_path(tmp_hpxml_path)
163
- command = "#{OpenStudio.getOpenStudioCLI} #{rb_path} -x #{xml} --add-detailed-schedule stochastic"
164
- system(command, err: File::NULL)
150
+ rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
151
+ xml = File.absolute_path(tmp_hpxml_path)
152
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --add-detailed-schedule stochastic"
153
+ command += ' -d' if debug
154
+ system(command, err: File::NULL)
165
155
 
166
- # Check for output files
167
- assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
168
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
169
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_hpxml.csv'))
170
- assert(File.exist? File.join(File.dirname(xml), 'run', 'stochastic.csv'))
156
+ # Check for output files
157
+ assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
158
+ assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
159
+ assert(File.exist? File.join(File.dirname(xml), 'run', 'stochastic.csv'))
160
+
161
+ # Check stochastic.csv headers
162
+ schedules = CSV.read(File.join(File.dirname(xml), 'run', 'stochastic.csv'), headers: true)
163
+ if debug
164
+ assert(schedules.headers.include?(SchedulesFile::ColumnSleeping))
165
+ else
166
+ refute(schedules.headers.include?(SchedulesFile::ColumnSleeping))
167
+ end
171
168
 
172
- # Cleanup
173
- File.delete(tmp_hpxml_path) if File.exist? tmp_hpxml_path
169
+ # Cleanup
170
+ File.delete(tmp_hpxml_path) if File.exist? tmp_hpxml_path
171
+ end
174
172
  end
175
173
 
176
174
  def test_run_simulation_timeseries_outputs
@@ -178,7 +176,7 @@ class HPXMLTest < MiniTest::Test
178
176
  # Check that the simulation produces timeseries with requested outputs
179
177
  rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
180
178
  xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
181
- command = "#{OpenStudio.getOpenStudioCLI} #{rb_path} -x #{xml}"
179
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\""
182
180
  if not invalid_variable_only
183
181
  command += ' --hourly ALL'
184
182
  command += ' --add-timeseries-time-column DST'
@@ -192,7 +190,6 @@ class HPXMLTest < MiniTest::Test
192
190
  # Check for output files
193
191
  assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
194
192
  assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
195
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_hpxml.csv'))
196
193
  if not invalid_variable_only
197
194
  assert(File.exist? File.join(File.dirname(xml), 'run', 'results_timeseries.csv'))
198
195
  # Check timeseries columns exist
@@ -213,171 +210,85 @@ class HPXMLTest < MiniTest::Test
213
210
  end
214
211
  end
215
212
 
216
- def test_template_osw
217
- # Check that simulation works using template-run-hpxml.osw
218
- require 'json'
219
-
220
- osw_path = File.join(File.dirname(__FILE__), '..', 'template-run-hpxml.osw')
221
-
222
- # Create derivative OSW for testing
223
- osw_path_test = osw_path.gsub('.osw', '_test.osw')
224
- FileUtils.cp(osw_path, osw_path_test)
225
-
226
- # Turn on debug mode
227
- json = JSON.parse(File.read(osw_path_test), symbolize_names: true)
228
- json[:steps][0][:arguments][:debug] = true
229
-
230
- if Dir.exist? File.join(File.dirname(__FILE__), '..', '..', 'project')
231
- # CI checks out the repo as "project", so update dir name
232
- json[:steps][0][:measure_dir_name] = 'project'
233
- end
234
-
235
- File.open(osw_path_test, 'w') do |f|
236
- f.write(JSON.pretty_generate(json))
237
- end
238
-
239
- command = "#{OpenStudio.getOpenStudioCLI} run -w \"#{osw_path_test}\""
240
- system(command, err: File::NULL)
241
-
242
- # Check for output files
243
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'eplusout.msgpack'))
244
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'results_annual.csv'))
245
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'results_hpxml.csv'))
246
-
247
- # Check for debug files
248
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'in.osm'))
249
- hpxml_defaults_path = File.join(File.dirname(osw_path_test), 'run', 'in.xml')
250
- assert(File.exist? hpxml_defaults_path)
251
-
252
- # Cleanup
253
- File.delete(osw_path_test)
254
- end
255
-
256
- def test_template_osw_with_schedule
257
- # Check that simulation works using template-run-hpxml-with-stochastic-occupancy.osw
213
+ def test_template_osws
214
+ # Check that simulation works using template-*.osw
258
215
  require 'json'
259
216
 
260
- osw_path = File.join(File.dirname(__FILE__), '..', 'template-run-hpxml-with-stochastic-occupancy.osw')
217
+ ['template-run-hpxml.osw',
218
+ 'template-run-hpxml-with-stochastic-occupancy.osw',
219
+ 'template-run-hpxml-with-stochastic-occupancy-subset.osw',
220
+ 'template-build-and-run-hpxml-with-stochastic-occupancy.osw'].each do |osw_name|
221
+ osw_path = File.join(File.dirname(__FILE__), '..', osw_name)
261
222
 
262
- # Create derivative OSW for testing
263
- osw_path_test = osw_path.gsub('.osw', '_test.osw')
264
- FileUtils.cp(osw_path, osw_path_test)
223
+ # Create derivative OSW for testing
224
+ osw_path_test = osw_path.gsub('.osw', '_test.osw')
225
+ FileUtils.cp(osw_path, osw_path_test)
265
226
 
266
- # Turn on debug mode
267
- json = JSON.parse(File.read(osw_path_test), symbolize_names: true)
268
- json[:steps][1][:arguments][:debug] = true
227
+ # Turn on debug mode
228
+ json = JSON.parse(File.read(osw_path_test), symbolize_names: true)
229
+ measure_index = json[:steps].find_index { |m| m[:measure_dir_name] == 'HPXMLtoOpenStudio' }
230
+ json[:steps][measure_index][:arguments][:debug] = true
269
231
 
270
- if Dir.exist? File.join(File.dirname(__FILE__), '..', '..', 'project')
271
- # CI checks out the repo as "project", so update dir name
272
- json[:steps][1][:measure_dir_name] = 'project'
273
- end
274
-
275
- File.open(osw_path_test, 'w') do |f|
276
- f.write(JSON.pretty_generate(json))
277
- end
278
-
279
- command = "#{OpenStudio.getOpenStudioCLI} run -w \"#{osw_path_test}\""
280
- system(command, err: File::NULL)
281
-
282
- # Check for output files
283
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'eplusout.msgpack'))
284
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'results_annual.csv'))
285
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'results_hpxml.csv'))
286
-
287
- # Check for debug files
288
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'in.osm'))
289
- hpxml_defaults_path = File.join(File.dirname(osw_path_test), 'run', 'in.xml')
290
- assert(File.exist? hpxml_defaults_path)
291
-
292
- # Cleanup
293
- File.delete(osw_path_test)
294
- xml_path_test = File.join(File.dirname(__FILE__), '..', 'base-stochastic-schedules.xml')
295
- File.delete(xml_path_test)
296
- end
297
-
298
- def test_template_osw_with_build_hpxml_and_schedule
299
- # Check that simulation works using template-build-and-run-hpxml-with-stochastic-occupancy.osw
300
- require 'json'
232
+ if Dir.exist? File.join(File.dirname(__FILE__), '..', '..', 'project')
233
+ # CI checks out the repo as "project", so update dir name
234
+ json[:steps][measure_index][:measure_dir_name] = 'project'
235
+ end
301
236
 
302
- osw_path = File.join(File.dirname(__FILE__), '..', 'template-build-and-run-hpxml-with-stochastic-occupancy.osw')
237
+ File.open(osw_path_test, 'w') do |f|
238
+ f.write(JSON.pretty_generate(json))
239
+ end
303
240
 
304
- # Create derivative OSW for testing
305
- osw_path_test = osw_path.gsub('.osw', '_test.osw')
306
- FileUtils.cp(osw_path, osw_path_test)
241
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" run -w \"#{osw_path_test}\""
242
+ system(command, err: File::NULL)
307
243
 
308
- # Turn on debug mode
309
- json = JSON.parse(File.read(osw_path_test), symbolize_names: true)
310
- json[:steps][2][:arguments][:debug] = true
244
+ # Check for output files
245
+ assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'eplusout.msgpack'))
246
+ assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'results_annual.csv'))
311
247
 
312
- if Dir.exist? File.join(File.dirname(__FILE__), '..', '..', 'project')
313
- # CI checks out the repo as "project", so update dir name
314
- json[:steps][1][:measure_dir_name] = 'project'
315
- end
248
+ # Check for debug files
249
+ assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'in.osm'))
250
+ hpxml_defaults_path = File.join(File.dirname(osw_path_test), 'run', 'in.xml')
251
+ assert(File.exist? hpxml_defaults_path)
316
252
 
317
- File.open(osw_path_test, 'w') do |f|
318
- f.write(JSON.pretty_generate(json))
253
+ # Cleanup
254
+ File.delete(osw_path_test)
255
+ xml_path_test = File.join(File.dirname(__FILE__), '..', 'run', 'built.xml')
256
+ File.delete(xml_path_test) if File.exist?(xml_path_test)
257
+ xml_path_test = File.join(File.dirname(__FILE__), '..', 'run', 'built-stochastic-schedules.xml')
258
+ File.delete(xml_path_test) if File.exist?(xml_path_test)
319
259
  end
320
-
321
- command = "#{OpenStudio.getOpenStudioCLI} run -w \"#{osw_path_test}\""
322
- system(command, err: File::NULL)
323
-
324
- # Check for output files
325
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'eplusout.msgpack'))
326
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'results_annual.csv'))
327
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'results_hpxml.csv'))
328
-
329
- # Check for debug files
330
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'in.osm'))
331
- hpxml_defaults_path = File.join(File.dirname(osw_path_test), 'run', 'in.xml')
332
- assert(File.exist? hpxml_defaults_path)
333
-
334
- # Cleanup
335
- File.delete(osw_path_test)
336
- xml_path_test = File.join(File.dirname(__FILE__), '..', 'built.xml')
337
- File.delete(xml_path_test)
338
- xml_path_test = File.join(File.dirname(__FILE__), '..', 'built-stochastic-schedules.xml')
339
- File.delete(xml_path_test)
340
260
  end
341
261
 
342
262
  def test_multiple_building_ids
343
- os_cli = OpenStudio.getOpenStudioCLI
344
263
  rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
345
264
  xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base-multiple-buildings.xml')
346
265
  csv_output_path = File.join(File.dirname(xml), 'run', 'results_annual.csv')
347
266
  run_log = File.join(File.dirname(xml), 'run', 'run.log')
348
267
 
349
268
  # Check successful simulation when providing correct building ID
350
- command = "#{OpenStudio.getOpenStudioCLI} #{rb_path} -x #{xml} --building-id MyBuilding"
269
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --building-id MyBuilding"
351
270
  system(command, err: File::NULL)
352
271
  assert_equal(true, File.exist?(csv_output_path))
353
272
 
354
273
  # Check unsuccessful simulation when providing incorrect building ID
355
- command = "#{OpenStudio.getOpenStudioCLI} #{rb_path} -x #{xml} --building-id MyFoo"
274
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --building-id MyFoo"
356
275
  system(command, err: File::NULL)
357
276
  assert_equal(false, File.exist?(csv_output_path))
358
277
  assert(File.readlines(run_log).select { |l| l.include? "Could not find Building element with ID 'MyFoo'." }.size > 0)
359
278
 
360
279
  # Check unsuccessful simulation when not providing building ID
361
- command = "#{OpenStudio.getOpenStudioCLI} #{rb_path} -x #{xml}"
280
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\""
362
281
  system(command, err: File::NULL)
363
282
  assert_equal(false, File.exist?(csv_output_path))
364
283
  assert(File.readlines(run_log).select { |l| l.include? 'Multiple Building elements defined in HPXML file; Building ID argument must be provided.' }.size > 0)
365
284
  end
366
285
 
367
- def test_weather_cache
368
- cache_orig = File.join(@this_dir, '..', '..', 'weather', 'USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv')
369
- cache_bak = cache_orig + '.bak'
370
- File.rename(cache_orig, cache_bak)
371
- _run_xml(File.absolute_path(File.join(@this_dir, '..', 'sample_files', 'base.xml')))
372
- File.rename(cache_bak, cache_orig) # Put original file back
373
- end
374
-
375
286
  def test_release_zips
376
287
  # Check release zips successfully created
377
288
  top_dir = File.join(@this_dir, '..', '..')
378
- command = "#{OpenStudio.getOpenStudioCLI} #{File.join(top_dir, 'tasks.rb')} create_release_zips"
289
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{File.join(top_dir, 'tasks.rb')}\" create_release_zips"
379
290
  system(command)
380
- assert_equal(2, Dir["#{top_dir}/*.zip"].size)
291
+ assert_equal(1, Dir["#{top_dir}/*.zip"].size)
381
292
 
382
293
  # Check successful running of simulation from release zips
383
294
  require 'zip'
@@ -391,10 +302,9 @@ class HPXMLTest < MiniTest::Test
391
302
  end
392
303
 
393
304
  # Test run_simulation.rb
394
- command = "#{OpenStudio.getOpenStudioCLI} OpenStudio-HPXML/workflow/run_simulation.rb -x OpenStudio-HPXML/workflow/sample_files/base.xml"
305
+ command = "\"#{OpenStudio.getOpenStudioCLI}\" OpenStudio-HPXML/workflow/run_simulation.rb -x OpenStudio-HPXML/workflow/sample_files/base.xml"
395
306
  system(command)
396
307
  assert(File.exist? 'OpenStudio-HPXML/workflow/sample_files/run/results_annual.csv')
397
- assert(File.exist? 'OpenStudio-HPXML/workflow/sample_files/run/results_hpxml.csv')
398
308
 
399
309
  File.delete(zip_path)
400
310
  rm_path('OpenStudio-HPXML')
@@ -410,32 +320,27 @@ class HPXMLTest < MiniTest::Test
410
320
  # Uses 'monthly' to verify timeseries results match annual results via error-checking
411
321
  # inside the ReportSimulationOutput measure.
412
322
  cli_path = OpenStudio.getOpenStudioCLI
413
- command = "\"#{cli_path}\" \"#{File.join(File.dirname(__FILE__), '../run_simulation.rb')}\" -x #{xml} --add-component-loads -o #{rundir} --debug --monthly ALL --add-utility-bills"
414
- workflow_start = Time.now
323
+ command = "\"#{cli_path}\" \"#{File.join(File.dirname(__FILE__), '../run_simulation.rb')}\" -x \"#{xml}\" --add-component-loads -o \"#{rundir}\" --debug --monthly ALL"
415
324
  success = system(command)
416
- workflow_time = Time.now - workflow_start
417
325
 
418
326
  rundir = File.join(rundir, 'run')
419
327
 
420
328
  # Check results
329
+ print "Simulation failed: #{xml}.\n" unless success
421
330
  assert_equal(true, success)
422
331
 
423
332
  # Check for output files
424
333
  annual_csv_path = File.join(rundir, 'results_annual.csv')
425
334
  timeseries_csv_path = File.join(rundir, 'results_timeseries.csv')
426
- hpxml_csv_path = File.join(rundir, 'results_hpxml.csv')
427
335
  bills_csv_path = File.join(rundir, 'results_bills.csv')
428
336
  assert(File.exist? annual_csv_path)
429
337
  assert(File.exist? timeseries_csv_path)
430
- assert(File.exist? hpxml_csv_path)
431
-
432
- # Get results
433
- results = _get_simulation_results(annual_csv_path, xml)
434
338
 
435
339
  # Check outputs
436
340
  hpxml_defaults_path = File.join(rundir, 'in.xml')
437
- stron_paths = [File.join(File.dirname(__FILE__), '..', '..', 'HPXMLtoOpenStudio', 'resources', 'hpxml_schematron', 'EPvalidator.xml')]
438
- hpxml = HPXML.new(hpxml_path: hpxml_defaults_path, schematron_validators: stron_paths) # Validate in.xml to ensure it can be run back through OS-HPXML
341
+ xsd_path = File.join(File.dirname(__FILE__), '..', '..', 'HPXMLtoOpenStudio', 'resources', 'hpxml_schema', 'HPXML.xsd')
342
+ stron_path = File.join(File.dirname(__FILE__), '..', '..', 'HPXMLtoOpenStudio', 'resources', 'hpxml_schematron', 'EPvalidator.xml')
343
+ hpxml = HPXML.new(hpxml_path: hpxml_defaults_path, schema_path: xsd_path, schematron_path: stron_path) # Validate in.xml to ensure it can be run back through OS-HPXML
439
344
  if not hpxml.errors.empty?
440
345
  puts 'ERRORS:'
441
346
  hpxml.errors.each do |error|
@@ -443,14 +348,14 @@ class HPXMLTest < MiniTest::Test
443
348
  end
444
349
  flunk "EPvalidator.xml error in #{hpxml_defaults_path}."
445
350
  end
446
- sizing_results = _get_hvac_sizing_results(hpxml, xml)
447
- bill_results = _get_bill_results(bills_csv_path, xml)
351
+ bill_results = _get_bill_results(bills_csv_path)
352
+ results = _get_simulation_results(annual_csv_path, xml, hpxml)
448
353
  _verify_outputs(rundir, xml, results, hpxml)
449
354
 
450
- return results, sizing_results, bill_results
355
+ return results, bill_results
451
356
  end
452
357
 
453
- def _get_simulation_results(annual_csv_path, xml)
358
+ def _get_simulation_results(annual_csv_path, xml, hpxml)
454
359
  # Grab all outputs from reporting measure CSV annual results
455
360
  results = {}
456
361
  CSV.foreach(annual_csv_path) do |row|
@@ -461,94 +366,29 @@ class HPXMLTest < MiniTest::Test
461
366
 
462
367
  # Check discrepancy between total load and sum of component loads
463
368
  if not xml.include? 'ASHRAE_Standard_140'
464
- sum_component_htg_loads = results.select { |k, v| k.start_with? 'Component Load: Heating:' }.map { |k, v| v }.sum(0.0)
465
- sum_component_clg_loads = results.select { |k, v| k.start_with? 'Component Load: Cooling:' }.map { |k, v| v }.sum(0.0)
466
- total_htg_load = results['Load: Heating: Delivered (MBtu)']
467
- total_clg_load = results['Load: Cooling: Delivered (MBtu)']
468
- abs_htg_load_delta = (total_htg_load - sum_component_htg_loads).abs
469
- abs_clg_load_delta = (total_clg_load - sum_component_clg_loads).abs
470
- avg_htg_load = ([total_htg_load, abs_htg_load_delta].sum / 2.0)
471
- avg_clg_load = ([total_htg_load, abs_htg_load_delta].sum / 2.0)
369
+ sum_component_htg_loads = results.select { |k, _v| k.start_with? 'Component Load: Heating:' }.values.sum(0.0)
370
+ sum_component_clg_loads = results.select { |k, _v| k.start_with? 'Component Load: Cooling:' }.values.sum(0.0)
371
+ total_htg_load_delivered = results['Load: Heating: Delivered (MBtu)']
372
+ total_clg_load_delivered = results['Load: Cooling: Delivered (MBtu)']
373
+ abs_htg_load_delta = (total_htg_load_delivered - sum_component_htg_loads).abs
374
+ abs_clg_load_delta = (total_clg_load_delivered - sum_component_clg_loads).abs
375
+ avg_htg_load = ([total_htg_load_delivered, abs_htg_load_delta].sum / 2.0)
376
+ avg_clg_load = ([total_clg_load_delivered, abs_clg_load_delta].sum / 2.0)
472
377
  abs_htg_load_frac = abs_htg_load_delta / avg_htg_load
473
378
  abs_clg_load_frac = abs_clg_load_delta / avg_clg_load
474
379
  # Check that the difference is less than 0.6MBtu or less than 10%
475
- assert((abs_htg_load_delta < 0.6) || (abs_htg_load_frac < 0.1))
476
- assert((abs_clg_load_delta < 0.6) || (abs_clg_load_frac < 0.1))
477
- end
478
-
479
- return results
480
- end
481
-
482
- def _get_hvac_sizing_results(hpxml, xml)
483
- results = {}
484
- return if xml.include? 'ASHRAE_Standard_140'
485
-
486
- # Heating design loads
487
- hpxml.hvac_plant.class::HDL_ATTRS.each do |attr, element_name|
488
- results["heating_load_#{attr.to_s.gsub('hdl_', '')} [Btuh]"] = hpxml.hvac_plant.send(attr.to_s)
489
- end
490
-
491
- # Cooling sensible design loads
492
- hpxml.hvac_plant.class::CDL_SENS_ATTRS.each do |attr, element_name|
493
- results["cooling_load_#{attr.to_s.gsub('cdl_', '')} [Btuh]"] = hpxml.hvac_plant.send(attr.to_s)
494
- end
495
-
496
- # Cooling latent design loads
497
- hpxml.hvac_plant.class::CDL_LAT_ATTRS.each do |attr, element_name|
498
- results["cooling_load_#{attr.to_s.gsub('cdl_', '')} [Btuh]"] = hpxml.hvac_plant.send(attr.to_s)
499
- end
500
-
501
- # Heating capacities/airflows
502
- results['heating_capacity [Btuh]'] = 0.0
503
- results['heating_backup_capacity [Btuh]'] = 0.0
504
- results['heating_airflow [cfm]'] = 0.0
505
- (hpxml.heating_systems + hpxml.heat_pumps).each do |htg_sys|
506
- results['heating_capacity [Btuh]'] += htg_sys.heating_capacity
507
- if htg_sys.is_a? HPXML::HeatPump
508
- if not htg_sys.backup_heating_capacity.nil?
509
- results['heating_backup_capacity [Btuh]'] += htg_sys.backup_heating_capacity
510
- elsif not htg_sys.backup_system.nil?
511
- results['heating_backup_capacity [Btuh]'] += htg_sys.backup_system.heating_capacity
512
- end
380
+ if hpxml.total_fraction_heat_load_served > 0
381
+ assert((abs_htg_load_delta < 0.6) || (abs_htg_load_frac < 0.1))
382
+ end
383
+ if hpxml.total_fraction_cool_load_served > 0
384
+ assert((abs_clg_load_delta < 1.1) || (abs_clg_load_frac < 0.1))
513
385
  end
514
- results['heating_airflow [cfm]'] += htg_sys.heating_airflow_cfm.to_f
515
- end
516
-
517
- # Cooling capacity/airflows
518
- results['cooling_capacity [Btuh]'] = 0.0
519
- results['cooling_airflow [cfm]'] = 0.0
520
- (hpxml.cooling_systems + hpxml.heat_pumps).each do |clg_sys|
521
- results['cooling_capacity [Btuh]'] += clg_sys.cooling_capacity
522
- results['cooling_airflow [cfm]'] += clg_sys.cooling_airflow_cfm
523
- end
524
-
525
- assert(!results.empty?)
526
-
527
- if (hpxml.heating_systems + hpxml.heat_pumps).select { |h| h.fraction_heat_load_served.to_f > 0 }.empty?
528
- # No heating equipment; check for zero heating capacities/airflows/duct loads
529
- assert_equal(0.0, results['heating_capacity [Btuh]'])
530
- assert_equal(0.0, results['heating_backup_capacity [Btuh]'])
531
- assert_equal(0.0, results['heating_airflow [cfm]'])
532
- assert_equal(0.0, results['heating_load_ducts [Btuh]'])
533
- end
534
- if (hpxml.cooling_systems + hpxml.heat_pumps).select { |c| c.fraction_cool_load_served.to_f > 0 }.empty?
535
- # No cooling equipment; check for zero cooling capacities/airflows/duct loads
536
- assert_equal(0.0, results['cooling_capacity [Btuh]'])
537
- assert_equal(0.0, results['cooling_airflow [cfm]'])
538
- assert_equal(0.0, results['cooling_load_sens_ducts [Btuh]'])
539
- assert_equal(0.0, results['cooling_load_lat_ducts [Btuh]'])
540
- end
541
- if hpxml.hvac_distributions.map { |dist| dist.ducts.size }.empty?
542
- # No ducts; check for zero duct loads
543
- assert_equal(0.0, results['heating_load_ducts [Btuh]'])
544
- assert_equal(0.0, results['cooling_load_sens_ducts [Btuh]'])
545
- assert_equal(0.0, results['cooling_load_lat_ducts [Btuh]'])
546
386
  end
547
387
 
548
388
  return results
549
389
  end
550
390
 
551
- def _get_bill_results(bill_csv_path, xml)
391
+ def _get_bill_results(bill_csv_path)
552
392
  # Grab all outputs from reporting measure CSV bill results
553
393
  results = {}
554
394
  if File.exist? bill_csv_path
@@ -562,17 +402,6 @@ class HPXMLTest < MiniTest::Test
562
402
  return results
563
403
  end
564
404
 
565
- def _test_schema_validation(xml)
566
- # TODO: Remove this when schema validation is included with CLI calls
567
- schemas_dir = File.absolute_path(File.join(File.dirname(__FILE__), '..', '..', 'HPXMLtoOpenStudio', 'resources', 'hpxml_schema'))
568
- hpxml_doc = XMLHelper.parse_file(xml)
569
- errors = XMLHelper.validate(hpxml_doc.to_xml, File.join(schemas_dir, 'HPXML.xsd'), nil)
570
- if errors.size > 0
571
- puts "#{xml}: #{errors}"
572
- end
573
- assert_equal(0, errors.size)
574
- end
575
-
576
405
  def _verify_outputs(rundir, hpxml_path, results, hpxml)
577
406
  assert(File.exist? File.join(rundir, 'eplusout.msgpack'))
578
407
 
@@ -585,24 +414,8 @@ class HPXMLTest < MiniTest::Test
585
414
  hpxml.collapse_enclosure_surfaces()
586
415
 
587
416
  # Check run.log warnings
588
- def skip_utility_bill_warning(err_line)
589
- utility_bill_warnings = ["#{EPlus::FuelTypeElectricity}:Facility".upcase,
590
- "#{EPlus::FuelTypeElectricity}Produced:Facility".upcase,
591
- "#{EPlus::FuelTypeNaturalGas}:Facility".upcase,
592
- "#{EPlus::FuelTypeOil}:Facility".upcase,
593
- "#{EPlus::FuelTypePropane}:Facility".upcase,
594
- "#{EPlus::FuelTypeWoodCord}:Facility".upcase,
595
- "#{EPlus::FuelTypeWoodPellets}:Facility".upcase,
596
- "#{EPlus::FuelTypeCoal}:Facility".upcase]
597
- skip_warning = false
598
- utility_bill_warnings.each do |utility_bill_warning|
599
- skip_warning = true if err_line.include? utility_bill_warning
600
- end
601
- return skip_warning
602
- end
603
417
  File.readlines(File.join(rundir, 'run.log')).each do |log_line|
604
418
  next if log_line.strip.empty?
605
- next if log_line.include? 'Warning: Could not load nokogiri, no HPXML validation performed.'
606
419
  next if log_line.start_with? 'Info: '
607
420
  next if log_line.start_with? 'Executing command'
608
421
  next if log_line.include? "-cache.csv' could not be found; regenerating it."
@@ -647,8 +460,8 @@ class HPXMLTest < MiniTest::Test
647
460
  if hpxml.windows.empty?
648
461
  next if log_line.include? 'No windows specified, the model will not include window heat transfer.'
649
462
  end
650
- if hpxml.pv_systems.empty? && !hpxml.batteries.empty?
651
- next if log_line.include? 'Battery without PV specified; battery is assumed to operate as backup and will not be modeled.'
463
+ if hpxml.pv_systems.empty? && !hpxml.batteries.empty? && hpxml.header.schedules_filepaths.empty?
464
+ next if log_line.include? 'Battery without PV specified, and no charging/discharging schedule provided; battery is assumed to operate as backup and will not be modeled.'
652
465
  end
653
466
  if hpxml_path.include? 'base-location-capetown-zaf.xml'
654
467
  next if log_line.include? 'OS Message: Minutes field (60) on line 9 of EPW file'
@@ -659,7 +472,7 @@ class HPXMLTest < MiniTest::Test
659
472
  next if log_line.include? 'DSE is not currently supported when calculating utility bills.'
660
473
  end
661
474
 
662
- flunk "Unexpected warning found in run.log: #{log_line}"
475
+ flunk "Unexpected run.log warning found for #{File.basename(hpxml_path)}: #{log_line}"
663
476
  end
664
477
 
665
478
  # Check for unexpected warnings
@@ -701,10 +514,7 @@ class HPXMLTest < MiniTest::Test
701
514
  next if err_line.include? 'Actual air mass flow rate is smaller than 25% of water-to-air heat pump coil rated air flow rate.' # FUTURE: Remove this when https://github.com/NREL/EnergyPlus/issues/9125 is resolved
702
515
  next if err_line.include? 'DetailedSkyDiffuseModeling is chosen but not needed as either the shading transmittance for shading devices does not change throughout the year'
703
516
  next if err_line.include? 'View factors not complete'
704
-
705
- if err_line.include? 'Output:Meter: invalid Key Name'
706
- next if skip_utility_bill_warning(err_line)
707
- end
517
+ next if err_line.include?('CheckSimpleWAHPRatedCurvesOutputs') && err_line.include?('WaterToAirHeatPump:EquationFit') # FIXME: Check these
708
518
 
709
519
  # HPWHs
710
520
  if hpxml.water_heating_systems.select { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump }.size > 0
@@ -722,7 +532,7 @@ class HPXMLTest < MiniTest::Test
722
532
  next if err_line.include? 'Recovery Efficiency and Energy Factor could not be calculated during the test for standard ratings'
723
533
  end
724
534
  # HP defrost curves
725
- if hpxml.heat_pumps.select { |hp| [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit, HPXML::HVACTypeHeatPumpPTHP].include? hp.heat_pump_type }.size > 0
535
+ if hpxml.heat_pumps.select { |hp| [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit, HPXML::HVACTypeHeatPumpPTHP, HPXML::HVACTypeHeatPumpRoom].include? hp.heat_pump_type }.size > 0
726
536
  next if err_line.include?('GetDXCoils: Coil:Heating:DX') && err_line.include?('curve values')
727
537
  end
728
538
  if hpxml.cooling_systems.select { |c| c.cooling_system_type == HPXML::HVACTypeEvaporativeCooler }.size > 0
@@ -747,7 +557,7 @@ class HPXMLTest < MiniTest::Test
747
557
  next if err_line.include? 'Supply Side is storing excess heat the majority of the time.'
748
558
  end
749
559
 
750
- flunk "Unexpected warning found: #{err_line}"
560
+ flunk "Unexpected eplusout.err warning found for #{File.basename(hpxml_path)}: #{err_line}"
751
561
  end
752
562
 
753
563
  # Check for unused objects/schedules/constructions warnings
@@ -772,8 +582,6 @@ class HPXMLTest < MiniTest::Test
772
582
  num_invalid_output_variables = 0
773
583
  File.readlines(File.join(rundir, 'eplusout.err')).each do |err_line|
774
584
  if err_line.include? 'Output:Meter: invalid Key Name'
775
- next if skip_utility_bill_warning(err_line)
776
-
777
585
  num_invalid_output_meters += 1
778
586
  elsif err_line.include?('Key=') && err_line.include?('VarName=')
779
587
  num_invalid_output_variables += 1
@@ -873,6 +681,7 @@ class HPXMLTest < MiniTest::Test
873
681
  assert_equal(0, num_kiva_instances) # no foundation, above dwelling unit
874
682
  else
875
683
  num_expected_kiva_instances = { 'base-foundation-ambient.xml' => 0, # no foundation in contact w/ ground
684
+ 'base-enclosure-floortypes.xml' => 0, # no foundation in contact w/ ground
876
685
  'base-foundation-multiple.xml' => 2, # additional instance for 2nd foundation type
877
686
  'base-enclosure-2stories-garage.xml' => 2, # additional instance for garage
878
687
  'base-foundation-basement-garage.xml' => 2, # additional instance for garage
@@ -1018,68 +827,68 @@ class HPXMLTest < MiniTest::Test
1018
827
  assert_in_epsilon(hpxml_value, sql_value, 0.01)
1019
828
  end
1020
829
 
1021
- # Enclosure FrameFloors
1022
- hpxml.frame_floors.each do |frame_floor|
1023
- frame_floor_id = frame_floor.id.upcase
830
+ # Enclosure Floors
831
+ hpxml.floors.each do |floor|
832
+ floor_id = floor.id.upcase
1024
833
 
1025
- if frame_floor.is_adiabatic
834
+ if floor.is_adiabatic
1026
835
  # Adiabatic surfaces have their "BaseSurfaceIndex" as their "ExtBoundCond" in "Surfaces" table in SQL simulation results
1027
- query_base_surf_idx = "SELECT BaseSurfaceIndex FROM Surfaces WHERE SurfaceName='#{frame_floor_id}'"
1028
- query_ext_bound = "SELECT ExtBoundCond FROM Surfaces WHERE SurfaceName='#{frame_floor_id}'"
836
+ query_base_surf_idx = "SELECT BaseSurfaceIndex FROM Surfaces WHERE SurfaceName='#{floor_id}'"
837
+ query_ext_bound = "SELECT ExtBoundCond FROM Surfaces WHERE SurfaceName='#{floor_id}'"
1029
838
  sql_value_base_surf_idx = sqlFile.execAndReturnFirstDouble(query_base_surf_idx).get
1030
839
  sql_value_ext_bound_cond = sqlFile.execAndReturnFirstDouble(query_ext_bound).get
1031
840
  assert_equal(sql_value_base_surf_idx, sql_value_ext_bound_cond)
1032
841
  end
1033
842
 
1034
- if frame_floor.is_exterior
843
+ if floor.is_exterior
1035
844
  table_name = 'Opaque Exterior'
1036
845
  else
1037
846
  table_name = 'Opaque Interior'
1038
847
  end
1039
848
 
1040
849
  # R-value
1041
- hpxml_value = frame_floor.insulation_assembly_r_value
850
+ hpxml_value = floor.insulation_assembly_r_value
1042
851
  if hpxml_path.include? 'ASHRAE_Standard_140'
1043
852
  # Compare R-value w/o film
1044
- if frame_floor.is_exterior # Raised floor
853
+ if floor.is_exterior # Raised floor
1045
854
  hpxml_value -= Material.AirFilmFloorASHRAE140.rvalue
1046
855
  hpxml_value -= Material.AirFilmFloorZeroWindASHRAE140.rvalue
1047
- elsif frame_floor.is_ceiling # Attic floor
856
+ elsif floor.is_ceiling # Attic floor
1048
857
  hpxml_value -= Material.AirFilmFloorASHRAE140.rvalue
1049
858
  hpxml_value -= Material.AirFilmFloorASHRAE140.rvalue
1050
859
  end
1051
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{frame_floor_id}' AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
1052
- elsif frame_floor.is_interior
860
+ query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{floor_id}' AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
861
+ elsif floor.is_interior
1053
862
  # Compare R-value w/o film
1054
- if frame_floor.is_ceiling
863
+ if floor.is_ceiling
1055
864
  hpxml_value -= Material.AirFilmFloorAverage.rvalue
1056
865
  hpxml_value -= Material.AirFilmFloorAverage.rvalue
1057
866
  else
1058
867
  hpxml_value -= Material.AirFilmFloorReduced.rvalue
1059
868
  hpxml_value -= Material.AirFilmFloorReduced.rvalue
1060
869
  end
1061
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{frame_floor_id}' AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
870
+ query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{floor_id}' AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
1062
871
  else
1063
872
  # Compare R-value w/ film
1064
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{frame_floor_id}' AND ColumnName='U-Factor with Film' AND Units='W/m2-K'"
873
+ query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{floor_id}' AND ColumnName='U-Factor with Film' AND Units='W/m2-K'"
1065
874
  end
1066
875
  sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
1067
876
  assert_in_epsilon(hpxml_value, sql_value, 0.1)
1068
877
 
1069
878
  # Area
1070
- hpxml_value = frame_floor.area
1071
- query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{frame_floor_id}' AND ColumnName='Net Area' AND Units='m2'"
879
+ hpxml_value = floor.area
880
+ query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{floor_id}' AND ColumnName='Net Area' AND Units='m2'"
1072
881
  sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
1073
882
  assert_operator(sql_value, :>, 0.01)
1074
883
  assert_in_epsilon(hpxml_value, sql_value, 0.1)
1075
884
 
1076
885
  # Tilt
1077
- if frame_floor.is_ceiling
886
+ if floor.is_ceiling
1078
887
  hpxml_value = 0
1079
888
  else
1080
889
  hpxml_value = 180
1081
890
  end
1082
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{frame_floor_id}' AND ColumnName='Tilt' AND Units='deg'"
891
+ query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{floor_id}' AND ColumnName='Tilt' AND Units='deg'"
1083
892
  sql_value = sqlFile.execAndReturnFirstDouble(query).get
1084
893
  assert_in_epsilon(hpxml_value, sql_value, 0.01)
1085
894
  end
@@ -1197,19 +1006,21 @@ class HPXMLTest < MiniTest::Test
1197
1006
 
1198
1007
  # HVAC Load Fractions
1199
1008
  if (not hpxml_path.include? 'location-miami') && (not hpxml_path.include? 'location-honolulu') && (not hpxml_path.include? 'location-phoenix')
1200
- htg_energy = results.select { |k, v| (k.include?(': Heating (MBtu)') || k.include?(': Heating Fans/Pumps (MBtu)')) && !k.include?('Load') }.map { |k, v| v }.sum(0.0)
1009
+ htg_energy = results.select { |k, _v| (k.include?(': Heating (MBtu)') || k.include?(': Heating Fans/Pumps (MBtu)')) && !k.include?('Load') }.values.sum(0.0)
1201
1010
  assert_equal(hpxml.total_fraction_heat_load_served > 0, htg_energy > 0)
1202
1011
  end
1203
- clg_energy = results.select { |k, v| (k.include?(': Cooling (MBtu)') || k.include?(': Cooling Fans/Pumps (MBtu)')) && !k.include?('Load') }.map { |k, v| v }.sum(0.0)
1012
+ clg_energy = results.select { |k, _v| (k.include?(': Cooling (MBtu)') || k.include?(': Cooling Fans/Pumps (MBtu)')) && !k.include?('Load') }.values.sum(0.0)
1204
1013
  assert_equal(hpxml.total_fraction_cool_load_served > 0, clg_energy > 0)
1205
1014
 
1206
1015
  # Mechanical Ventilation
1207
- fan_cfis = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_whole_building_ventilation && (vent_mech.fan_type == HPXML::MechVentTypeCFIS) }
1208
- fan_sup = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_whole_building_ventilation && (vent_mech.fan_type == HPXML::MechVentTypeSupply) }
1209
- fan_exh = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_whole_building_ventilation && (vent_mech.fan_type == HPXML::MechVentTypeExhaust) }
1210
- fan_bal = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_whole_building_ventilation && [HPXML::MechVentTypeBalanced, HPXML::MechVentTypeERV, HPXML::MechVentTypeHRV].include?(vent_mech.fan_type) }
1211
- vent_fan_kitchen = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_local_ventilation && (vent_mech.fan_location == HPXML::LocationKitchen) }
1212
- vent_fan_bath = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_local_ventilation && (vent_mech.fan_location == HPXML::LocationBath) }
1016
+ whole_vent_fans = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_whole_building_ventilation && !vent_mech.is_cfis_supplemental_fan? }
1017
+ local_vent_fans = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_local_ventilation }
1018
+ fan_cfis = whole_vent_fans.select { |vent_mech| vent_mech.fan_type == HPXML::MechVentTypeCFIS }
1019
+ fan_sup = whole_vent_fans.select { |vent_mech| vent_mech.fan_type == HPXML::MechVentTypeSupply }
1020
+ fan_exh = whole_vent_fans.select { |vent_mech| vent_mech.fan_type == HPXML::MechVentTypeExhaust }
1021
+ fan_bal = whole_vent_fans.select { |vent_mech| [HPXML::MechVentTypeBalanced, HPXML::MechVentTypeERV, HPXML::MechVentTypeHRV].include?(vent_mech.fan_type) }
1022
+ vent_fan_kitchen = local_vent_fans.select { |vent_mech| vent_mech.fan_location == HPXML::LocationKitchen }
1023
+ vent_fan_bath = local_vent_fans.select { |vent_mech| vent_mech.fan_location == HPXML::LocationBath }
1213
1024
 
1214
1025
  if not (fan_cfis + fan_sup + fan_exh + fan_bal + vent_fan_kitchen + vent_fan_bath).empty?
1215
1026
  mv_energy = UnitConversions.convert(results['End Use: Electricity: Mech Vent (MBtu)'], 'MBtu', 'GJ')
@@ -1265,7 +1076,7 @@ class HPXMLTest < MiniTest::Test
1265
1076
  end
1266
1077
 
1267
1078
  # Lighting
1268
- ltg_energy = results.select { |k, v| k.include? 'End Use: Electricity: Lighting' }.map { |k, v| v }.sum(0.0)
1079
+ ltg_energy = results.select { |k, _v| k.include? 'End Use: Electricity: Lighting' }.values.sum(0.0)
1269
1080
  assert_equal(hpxml.lighting_groups.size > 0, ltg_energy > 0)
1270
1081
 
1271
1082
  # Get fuels
@@ -1279,6 +1090,11 @@ class HPXMLTest < MiniTest::Test
1279
1090
  htg_fuels << heating_system.heating_system_fuel
1280
1091
  end
1281
1092
  end
1093
+ hpxml.cooling_systems.each do |cooling_system|
1094
+ if cooling_system.has_integrated_heating
1095
+ htg_fuels << cooling_system.integrated_heating_system_fuel
1096
+ end
1097
+ end
1282
1098
  hpxml.heat_pumps.each do |heat_pump|
1283
1099
  if heat_pump.fraction_heat_load_served > 0
1284
1100
  htg_backup_fuels << heat_pump.backup_heating_fuel
@@ -1347,14 +1163,22 @@ class HPXMLTest < MiniTest::Test
1347
1163
  end
1348
1164
 
1349
1165
  # Check unmet hours
1350
- unmet_hours_htg = results.select { |k, v| k.include? 'Unmet Hours: Heating' }.map { |k, v| v }.sum(0.0)
1351
- unmet_hours_clg = results.select { |k, v| k.include? 'Unmet Hours: Cooling' }.map { |k, v| v }.sum(0.0)
1166
+ unmet_hours_htg = results.select { |k, _v| k.include? 'Unmet Hours: Heating' }.values.sum(0.0)
1167
+ unmet_hours_clg = results.select { |k, _v| k.include? 'Unmet Hours: Cooling' }.values.sum(0.0)
1352
1168
  if hpxml_path.include? 'base-hvac-undersized.xml'
1353
1169
  assert_operator(unmet_hours_htg, :>, 1000)
1354
1170
  assert_operator(unmet_hours_clg, :>, 1000)
1355
1171
  else
1356
- assert_operator(unmet_hours_htg, :<, 350)
1357
- assert_operator(unmet_hours_clg, :<, 350)
1172
+ if hpxml.total_fraction_heat_load_served == 0
1173
+ assert_equal(0, unmet_hours_htg)
1174
+ else
1175
+ assert_operator(unmet_hours_htg, :<, 350)
1176
+ end
1177
+ if hpxml.total_fraction_cool_load_served == 0
1178
+ assert_equal(0, unmet_hours_clg)
1179
+ else
1180
+ assert_operator(unmet_hours_clg, :<, 350)
1181
+ end
1358
1182
  end
1359
1183
 
1360
1184
  sqlFile.close
@@ -1364,11 +1188,11 @@ class HPXMLTest < MiniTest::Test
1364
1188
  GC.start()
1365
1189
  end
1366
1190
 
1367
- def _write_summary_results(results, csv_out)
1191
+ def _write_results(results, csv_out)
1368
1192
  require 'csv'
1369
1193
 
1370
1194
  output_keys = []
1371
- results.each do |xml, xml_results|
1195
+ results.values.each do |xml_results|
1372
1196
  xml_results.keys.each do |key|
1373
1197
  next if output_keys.include? key
1374
1198
 
@@ -1376,13 +1200,8 @@ class HPXMLTest < MiniTest::Test
1376
1200
  end
1377
1201
  end
1378
1202
 
1379
- column_headers = ['HPXML']
1380
- output_keys.each do |key|
1381
- column_headers << key
1382
- end
1383
-
1384
1203
  CSV.open(csv_out, 'w') do |csv|
1385
- csv << column_headers
1204
+ csv << ['HPXML'] + output_keys
1386
1205
  results.sort.each do |xml, xml_results|
1387
1206
  csv_row = [xml]
1388
1207
  output_keys.each do |key|
@@ -1396,55 +1215,7 @@ class HPXMLTest < MiniTest::Test
1396
1215
  end
1397
1216
  end
1398
1217
 
1399
- puts "Wrote summary results to #{csv_out}."
1400
- end
1401
-
1402
- def _write_hvac_sizing_results(all_sizing_results, csv_out)
1403
- require 'csv'
1404
-
1405
- output_keys = nil
1406
- all_sizing_results.each do |xml, xml_results|
1407
- output_keys = xml_results.keys
1408
- break
1409
- end
1410
- return if output_keys.nil?
1411
-
1412
- CSV.open(csv_out, 'w') do |csv|
1413
- csv << ['HPXML'] + output_keys
1414
- all_sizing_results.sort.each do |xml, xml_results|
1415
- csv_row = [xml]
1416
- output_keys.each do |key|
1417
- csv_row << xml_results[key]
1418
- end
1419
- csv << csv_row
1420
- end
1421
- end
1422
-
1423
- puts "Wrote HVAC sizing results to #{csv_out}."
1424
- end
1425
-
1426
- def _write_bill_results(all_bill_results, csv_out)
1427
- require 'csv'
1428
-
1429
- output_keys = nil
1430
- all_bill_results.each do |xml, xml_results|
1431
- output_keys = xml_results.keys
1432
- break
1433
- end
1434
- return if output_keys.nil?
1435
-
1436
- CSV.open(csv_out, 'w') do |csv|
1437
- csv << ['HPXML'] + output_keys
1438
- all_bill_results.sort.each do |xml, xml_results|
1439
- csv_row = [xml]
1440
- output_keys.each do |key|
1441
- csv_row << xml_results[key]
1442
- end
1443
- csv << csv_row
1444
- end
1445
- end
1446
-
1447
- puts "Wrote utility bill results to #{csv_out}."
1218
+ puts "Wrote results to #{csv_out}."
1448
1219
  end
1449
1220
 
1450
1221
  def _write_ashrae_140_results(all_results, csv_out)