urbanopt-cli 0.8.3 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
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)