urbanopt-cli 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (712) hide show
  1. checksums.yaml +4 -4
  2. data/.github/release.yml +24 -0
  3. data/.github/workflows/nightly_ci_build.yml +39 -29
  4. data/.gitignore +1 -0
  5. data/CHANGELOG.md +17 -0
  6. data/CMakeLists.txt +7 -7
  7. data/FindOpenStudioSDK.cmake +8 -8
  8. data/LICENSE.md +8 -35
  9. data/README.md +25 -10
  10. data/example_files/Gemfile +9 -9
  11. data/example_files/example_project_combined.json +6 -2
  12. data/example_files/example_project_with_ghe.json +859 -0
  13. data/example_files/mappers/Baseline.rb +39 -415
  14. data/example_files/mappers/ChilledWaterStorage.rb +1 -1
  15. data/example_files/mappers/CreateBar.rb +1 -1
  16. data/example_files/mappers/EvCharging.rb +1 -1
  17. data/example_files/mappers/FlexibleHotWater.rb +1 -1
  18. data/example_files/mappers/Floorspace.rb +1 -1
  19. data/example_files/mappers/HighEfficiency.rb +1 -1
  20. data/example_files/mappers/HighEfficiencyCreateBar.rb +1 -1
  21. data/example_files/mappers/HighEfficiencyFloorspace.rb +1 -1
  22. data/example_files/mappers/PeakHoursMelsShedding.rb +1 -1
  23. data/example_files/mappers/PeakHoursThermostatAdjust.rb +1 -1
  24. data/example_files/mappers/ThermalStorage.rb +1 -1
  25. data/example_files/mappers/base_workflow.osw +11 -4
  26. data/example_files/mappers/residential/template/util.rb +138 -0
  27. data/example_files/mappers/residential/util.rb +276 -0
  28. data/example_files/measures/BuildResidentialModel/measure.rb +118 -230
  29. data/example_files/measures/BuildResidentialModel/measure.xml +344 -233
  30. data/example_files/measures/BuildResidentialModel/resources/geometry.rb +7 -2
  31. data/example_files/measures/BuildResidentialModel/resources/unit_conversions.rb +5 -0
  32. data/example_files/measures/BuildResidentialModel/resources/util.rb +5 -0
  33. data/example_files/measures/BuildResidentialModel/tests/test_build_residential_model.rb +344 -0
  34. data/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature1.xml +2112 -0
  35. data/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature2.xml +2112 -0
  36. data/example_files/osm_building/7.osm +0 -2
  37. data/example_files/osm_building/8.osm +0 -2
  38. data/example_files/osm_building/9.osm +0 -2
  39. data/example_files/python_deps/dependencies.json +4 -3
  40. data/example_files/resources/hpxml-measures/.gitattributes +3 -0
  41. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +2 -2
  42. data/example_files/resources/hpxml-measures/.github/workflows/add_to_project.yml +17 -0
  43. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +37 -8
  44. data/example_files/resources/hpxml-measures/.gitignore +1 -0
  45. data/example_files/resources/hpxml-measures/.readthedocs.yml +6 -2
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md +5596 -0
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md.erb +41 -0
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1324 -1035
  49. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +325 -236
  50. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +119 -152
  51. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{build_residential_hpxml_test.rb → test_build_residential_hpxml.rb} +225 -107
  52. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/README.md +96 -0
  53. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/README.md.erb +41 -0
  54. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +73 -31
  55. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +60 -40
  56. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/README.md +48 -23
  57. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/constants.rb +5 -0
  58. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +6 -12
  59. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/{build_residential_schedule_file_test.rb → test_build_residential_schedule_file.rb} +162 -35
  60. data/example_files/resources/hpxml-measures/Changelog.md +57 -1
  61. data/example_files/resources/hpxml-measures/Gemfile +1 -1
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/README.md +83 -0
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/README.md.erb +41 -0
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +1081 -878
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +258 -204
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +205 -178
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +43 -18
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +37 -112
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +34 -73
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/Xing_okstate_0664D_13659_Table_A-3.csv +4165 -0
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv +2 -2
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +5 -1
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +13 -7
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +95 -42
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +132 -108
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +1695 -1267
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +668 -589
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +304 -553
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +197 -112
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +1140 -1745
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +412 -325
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +56 -48
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +49 -38
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +5 -0
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -1
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +5 -0
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +94 -78
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +60 -2
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +6 -1
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +11 -5
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv +1 -1
  92. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-30-mins.csv +52561 -0
  93. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_2.csv +8761 -0
  94. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_3.csv +8761 -0
  95. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_4.csv +8761 -0
  96. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_5.csv +8761 -0
  97. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_6.csv +8761 -0
  98. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +129 -137
  99. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +12 -21
  100. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +5 -0
  101. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/util.rb +7 -2
  102. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +6 -1
  103. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +7 -2
  104. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +179 -144
  105. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +129 -71
  106. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +5 -0
  107. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +23 -6
  108. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +129 -118
  109. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +25 -20
  110. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +2282 -2239
  111. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +395 -204
  112. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +12 -7
  113. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +56 -51
  114. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +369 -230
  115. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +371 -191
  116. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +27 -20
  117. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +55 -5
  118. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +35 -30
  119. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +13 -8
  120. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +107 -93
  121. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +11 -6
  122. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +757 -573
  123. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +77 -72
  124. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +36 -6
  125. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +5 -0
  126. data/example_files/resources/hpxml-measures/README.md +2 -0
  127. data/example_files/resources/hpxml-measures/Rakefile +10 -3
  128. data/example_files/resources/hpxml-measures/ReportSimulationOutput/README.md +787 -0
  129. data/example_files/resources/hpxml-measures/ReportSimulationOutput/README.md.erb +41 -0
  130. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +730 -418
  131. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +1215 -9
  132. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/{output_report_test.rb → test_report_sim_output.rb} +130 -299
  133. data/example_files/resources/hpxml-measures/ReportUtilityBills/README.md +87 -0
  134. data/example_files/resources/hpxml-measures/ReportUtilityBills/README.md.erb +41 -0
  135. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +261 -89
  136. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +179 -94
  137. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/Average_retail_price_of_electricity.csv +68 -68
  138. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +3 -2
  139. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +713 -685
  140. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +716 -688
  141. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/README.md +5 -2
  142. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +18 -9
  143. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/test_report_utility_bills.rb +1308 -0
  144. data/example_files/resources/hpxml-measures/docs/requirements.txt +5 -0
  145. data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -2
  146. data/example_files/resources/hpxml-measures/docs/source/intro.rst +3 -20
  147. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +1 -1
  148. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +917 -564
  149. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +79 -42
  150. data/example_files/resources/hpxml-measures/tasks.rb +2305 -2055
  151. data/example_files/resources/hpxml-measures/workflow/hpxml_inputs.json +270 -587
  152. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +559 -557
  153. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +522 -520
  154. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +534 -532
  155. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +547 -545
  156. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +546 -544
  157. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +603 -623
  158. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +613 -633
  159. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +699 -721
  160. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +662 -661
  161. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +657 -677
  162. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +470 -467
  163. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +441 -438
  164. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +468 -465
  165. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +469 -466
  166. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +468 -465
  167. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +717 -714
  168. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +647 -645
  169. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +569 -566
  170. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +602 -599
  171. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +630 -627
  172. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +776 -774
  173. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +670 -667
  174. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +632 -629
  175. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +731 -729
  176. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +672 -669
  177. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +667 -644
  178. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +646 -644
  179. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +690 -688
  180. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +701 -699
  181. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +637 -615
  182. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +690 -688
  183. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +557 -554
  184. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +534 -531
  185. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +636 -635
  186. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +616 -613
  187. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +601 -598
  188. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +581 -578
  189. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +624 -622
  190. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +584 -582
  191. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +631 -629
  192. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +922 -921
  193. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +855 -853
  194. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +739 -737
  195. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +798 -796
  196. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +696 -694
  197. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +487 -483
  198. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +443 -440
  199. data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +688 -686
  200. data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +722 -720
  201. data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +619 -617
  202. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +13 -20
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +9 -9
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +11 -12
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +11 -12
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +12 -13
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +11 -12
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +9 -9
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +9 -9
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +4 -4
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +9 -9
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +9 -9
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +9 -9
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +11 -11
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +10 -10
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +9 -9
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +10 -11
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +9 -9
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +8 -8
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +571 -569
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +9 -9
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml → base-bldgtype-mf-unit-adjacent-to-multifamily-buffer-space.xml} +5 -5
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-multiple.xml → base-bldgtype-mf-unit-adjacent-to-multiple.xml} +17 -17
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml → base-bldgtype-mf-unit-adjacent-to-non-freezing-space.xml} +5 -5
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-other-heated-space.xml → base-bldgtype-mf-unit-adjacent-to-other-heated-space.xml} +5 -5
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml → base-bldgtype-mf-unit-adjacent-to-other-housing-unit.xml} +5 -5
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-infil-compartmentalization-test.xml → base-bldgtype-mf-unit-infil-compartmentalization-test.xml} +461 -461
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-residents-1.xml → base-bldgtype-mf-unit-residents-1.xml} +453 -453
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml → base-bldgtype-mf-unit-shared-boiler-chiller-baseboard.xml} +11 -11
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-boiler-chiller-fan-coil-ducted.xml} +11 -11
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml → base-bldgtype-mf-unit-shared-boiler-chiller-fan-coil.xml} +11 -11
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-chiller-water-loop-heat-pump.xml} +11 -11
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-cooling-tower-water-loop-heat-pump.xml} +11 -11
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-baseboard.xml → base-bldgtype-mf-unit-shared-boiler-only-baseboard.xml} +11 -11
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil-ducted.xml} +11 -11
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil-eae.xml} +11 -11
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-mf-unit-shared-boiler-only-fan-coil-fireplace-elec.xml +433 -0
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil.xml} +11 -11
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-only-water-loop-heat-pump.xml} +11 -11
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-baseboard.xml → base-bldgtype-mf-unit-shared-chiller-only-baseboard.xml} +11 -11
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-chiller-only-fan-coil-ducted.xml} +11 -11
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml → base-bldgtype-mf-unit-shared-chiller-only-fan-coil.xml} +11 -11
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-chiller-only-water-loop-heat-pump.xml} +11 -11
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-cooling-tower-only-water-loop-heat-pump.xml} +11 -11
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-generator.xml → base-bldgtype-mf-unit-shared-generator.xml} +13 -13
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml → base-bldgtype-mf-unit-shared-ground-loop-ground-to-air-heat-pump.xml} +13 -13
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml → base-bldgtype-mf-unit-shared-laundry-room-multiple-water-heaters.xml} +480 -480
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-laundry-room.xml → base-bldgtype-mf-unit-shared-laundry-room.xml} +10 -10
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent-multiple.xml → base-bldgtype-mf-unit-shared-mechvent-multiple.xml} +15 -15
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent-preconditioning.xml → base-bldgtype-mf-unit-shared-mechvent-preconditioning.xml} +13 -13
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent.xml → base-bldgtype-mf-unit-shared-mechvent.xml} +13 -13
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-pv.xml → base-bldgtype-mf-unit-shared-pv.xml} +13 -13
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-water-heater-recirc.xml → base-bldgtype-mf-unit-shared-water-heater-recirc.xml} +13 -13
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-water-heater.xml → base-bldgtype-mf-unit-shared-water-heater.xml} +13 -13
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily.xml → base-bldgtype-mf-unit.xml} +13 -13
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-2stories.xml → base-bldgtype-sfa-unit-2stories.xml} +610 -610
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-atticroof-cathedral.xml → base-bldgtype-sfa-unit-atticroof-cathedral.xml} +558 -558
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-infil-compartmentalization-test.xml → base-bldgtype-sfa-unit-infil-compartmentalization-test.xml} +610 -610
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached.xml → base-bldgtype-sfa-unit.xml} +610 -610
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +8 -8
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +9 -9
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +9 -9
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +9 -9
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +9 -9
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +9 -9
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +9 -9
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +9 -9
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +9 -9
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +507 -505
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +9 -9
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +8 -8
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +9 -9
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +9 -9
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +9 -9
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +9 -9
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +9 -9
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +9 -9
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +9 -9
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +12 -10
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +14 -14
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +5 -5
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +9 -9
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +9 -9
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +9 -9
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +9 -9
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +9 -9
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +9 -9
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +9 -9
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +9 -9
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +9 -9
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +9 -9
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +9 -9
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +9 -9
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +12 -10
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +9 -9
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +8 -8
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +9 -9
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +9 -9
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +9 -9
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +13 -11
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +9 -9
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +8 -8
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +9 -9
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +9 -9
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +9 -9
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +9 -9
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +12 -10
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +9 -9
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +9 -9
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +9 -9
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +12 -10
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +8 -8
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +9 -9
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +9 -9
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +9 -9
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +9 -9
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +9 -9
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +9 -9
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +9 -9
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +13 -14
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +11 -11
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +9 -9
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +9 -9
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +9 -9
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +9 -9
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +576 -576
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +519 -519
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +4 -5
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +9 -9
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +9 -9
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +9 -9
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ela.xml +548 -548
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +9 -9
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +9 -9
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-cfm.xml +551 -551
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +9 -9
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +9 -9
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +9 -9
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +9 -9
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +9 -9
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +9 -9
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +9 -9
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +10 -11
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +9 -9
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -19
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +555 -553
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +9 -9
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +9 -9
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading-seasons.xml +560 -558
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +9 -9
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +9 -9
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +10 -10
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +10 -11
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-belly-wing-no-skirt.xml +496 -0
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-belly-wing-skirt.xml +496 -0
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -18
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-simple-power-outage-natvent-unavailable.xml → base-foundation-conditioned-basement-slab-insulation-full.xml} +552 -564
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +9 -9
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-insulation.xml +555 -555
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +8 -8
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +5 -5
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +10 -11
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +4 -4
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +4 -4
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +4 -4
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +4 -4
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +9 -9
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace-above-grade.xml +558 -0
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +9 -9
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +15 -15
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +9 -9
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-capacity-17f.xml +552 -552
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +9 -9
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-lockout-temperatures.xml +562 -562
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +557 -557
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +9 -9
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +9 -9
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-hvac-seasons.xml +586 -586
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +9 -9
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +9 -9
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +9 -9
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml → base-hvac-air-to-air-heat-pump-var-speed-detailed-performance-other-temperatures.xml} +89 -13
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml → base-hvac-air-to-air-heat-pump-var-speed-detailed-performance.xml} +107 -13
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +9 -9
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-sizing-controls.xml +567 -565
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +9 -9
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +9 -9
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +9 -9
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +9 -9
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only-pilot.xml +512 -512
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +9 -9
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +9 -9
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +9 -9
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +9 -9
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +536 -536
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +9 -9
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +9 -9
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-central-ac-only-var-speed.xml → base-hvac-central-ac-only-var-speed-detailed-performance.xml} +49 -10
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +9 -9
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +9 -9
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +9 -9
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-lockout-temperatures.xml +559 -559
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +9 -9
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +9 -9
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +9 -9
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +9 -9
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +11 -12
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +558 -558
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-buried.xml +554 -554
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-furnace-gas-room-ac.xml → base-hvac-ducts-defaults.xml} +28 -14
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-effective-rvalue.xml +552 -552
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +9 -9
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +9 -9
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +9 -9
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +9 -9
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +9 -9
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +9 -9
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +9 -9
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +15 -10
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +9 -9
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +9 -9
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +9 -9
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +9 -9
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +9 -9
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +12 -10
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-pilot.xml +541 -541
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +9 -9
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +9 -9
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +9 -9
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +9 -9
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +9 -9
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +9 -9
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +9 -9
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +9 -9
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +9 -9
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +9 -9
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +9 -9
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-air-to-air-heat-pump-1-speed-autosized-backup.xml → base-hvac-install-quality-air-to-air-heat-pump-var-speed-detailed-performance.xml} +650 -556
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +9 -9
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +9 -9
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +9 -9
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +9 -9
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +9 -9
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +9 -9
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +9 -9
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +9 -9
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +9 -9
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml → base-hvac-mini-split-air-conditioner-only-ductless-detailed-performance.xml} +50 -49
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +9 -9
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +9 -9
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml → base-hvac-mini-split-heat-pump-ducted-detailed-performance.xml} +109 -14
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +9 -9
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +9 -9
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-baseboard.xml +524 -524
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted-backup-hardsized.xml → base-hvac-mini-split-heat-pump-ductless-backup-furnace-ducts-defaults.xml} +560 -552
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-furnace.xml +563 -563
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +9 -9
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml → base-hvac-mini-split-heat-pump-ductless-detailed-performance.xml} +108 -60
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-heating-capacity-17f.xml +505 -505
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +9 -9
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +9 -9
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +10 -11
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +9 -9
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-natural-gas.xml +504 -504
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +9 -9
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp-heating-capacity-17f.xml +512 -512
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +9 -9
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +9 -9
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +9 -9
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +12 -10
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +9 -9
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +504 -504
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +517 -517
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +9 -9
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +9 -9
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +9 -9
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +9 -9
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-fixed-heater-gas-only.xml → base-hvac-space-heater-gas-only.xml} +10 -10
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +9 -9
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +9 -9
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +9 -9
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +9 -9
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +9 -9
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +9 -9
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-kwh-per-year.xml +531 -528
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-mixed.xml +536 -536
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none-ceiling-fans.xml +515 -515
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +9 -9
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +9 -9
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +9 -9
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +9 -9
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +10 -11
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +4 -4
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +9 -9
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +10 -11
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +10 -11
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +10 -11
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +9 -9
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +9 -9
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +9 -9
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +9 -9
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +9 -9
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +9 -9
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +576 -576
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +576 -576
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +9 -9
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +9 -9
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +9 -9
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +9 -9
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +9 -9
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +9 -9
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +9 -9
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +9 -9
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +9 -9
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +9 -9
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +21 -19
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +605 -605
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +587 -587
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +9 -9
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +9 -9
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +3 -3
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +9 -9
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +587 -585
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +584 -584
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +9 -9
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +555 -555
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +26 -26
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +26 -26
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +9 -9
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading-bldgtype-multifamily.xml +508 -508
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +9 -9
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +9 -9
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-simple-power-outage-natvent-available.xml → base-misc-unit-multiplier.xml} +553 -564
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +26 -26
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-mf-units.xml +2755 -0
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-multiple-buildings.xml → base-multiple-sfd-buildings.xml} +31 -22
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +9 -9
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +4 -5
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-round-trip-efficiency.xml +597 -597
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +599 -597
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +9 -9
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +615 -613
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +612 -612
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +596 -596
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +9 -9
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0-runperiod-1-month.xml +559 -559
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0.xml +555 -555
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1-misc-loads-large-uncommon.xml +616 -616
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1-misc-loads-large-uncommon2.xml +616 -616
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1.xml +547 -547
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-5.xml +515 -515
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +14 -12
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-crankcase-heater-40w.xml → base-schedules-detailed-mixed-timesteps-power-outage.xml} +565 -555
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-detailed-occupancy-stochastic-vacancy-year-round.xml → base-schedules-detailed-mixed-timesteps.xml} +554 -563
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +12 -10
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-power-outage.xml +566 -564
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +12 -10
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +12 -10
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +12 -10
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +12 -10
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +12 -10
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage.xml +619 -619
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy.xml +618 -618
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +9 -9
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +9 -9
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +9 -9
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +9 -9
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +9 -9
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-temperature-capacitance-multiplier.xml +553 -553
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +12 -10
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +12 -10
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +9 -9
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-30-mins.xml +552 -552
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +9 -9
  575. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +2 -0
  576. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy-subset.osw +2 -0
  577. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +2 -0
  578. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +4 -1
  579. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Long_Residence.xml +385 -385
  580. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Vatilo_Residence.xml +378 -380
  581. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Victor_Residence.xml +369 -369
  582. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +7 -7
  583. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +7 -7
  584. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +7 -7
  585. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +7 -7
  586. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +7 -7
  587. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +7 -7
  588. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +7 -7
  589. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +7 -7
  590. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +7 -7
  591. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +7 -7
  592. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +7 -7
  593. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +7 -7
  594. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +7 -7
  595. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +7 -7
  596. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +7 -7
  597. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +7 -7
  598. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +7 -7
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +7 -7
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +7 -7
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +7 -7
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +7 -7
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +7 -7
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +7 -8
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +7 -8
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -6
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -6
  608. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_sizing.csv +363 -0
  609. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations1.csv +281 -0
  610. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations1_bills.csv +281 -0
  611. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations2.csv +141 -0
  612. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations2_bills.csv +141 -0
  613. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +12 -6
  614. data/example_files/resources/hpxml-measures/workflow/tests/util.rb +1141 -0
  615. data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.ddy +536 -0
  616. data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.epw +8768 -0
  617. data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.stat +554 -0
  618. data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.ddy +536 -0
  619. data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.epw +8768 -0
  620. data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.stat +553 -0
  621. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3-cache.csv +35 -0
  622. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.ddy +536 -0
  623. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.epw +8768 -0
  624. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.stat +553 -0
  625. data/example_files/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3-cache.csv +35 -0
  626. data/example_files/xml_building/17/README.md +4 -2
  627. data/example_files/xml_building/17/feature.xml +2112 -0
  628. data/lib/uo_cli/version.rb +1 -1
  629. data/lib/uo_cli.rb +110 -17
  630. data/uo_cli.gemspec +6 -8
  631. metadata +130 -177
  632. data/Jenkinsfile +0 -10
  633. data/example_files/base_workflow_res.osw +0 -276
  634. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +0 -1226
  635. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +0 -551
  636. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +0 -551
  637. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +0 -544
  638. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +0 -550
  639. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +0 -552
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +0 -552
  641. 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 +0 -552
  642. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +0 -552
  643. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +0 -552
  644. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +0 -552
  645. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +0 -552
  646. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +0 -569
  647. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +0 -599
  648. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +0 -552
  649. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +0 -506
  650. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +0 -560
  651. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +0 -507
  652. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +0 -536
  653. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +0 -536
  654. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +0 -565
  655. 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 +0 -553
  656. 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 +0 -553
  657. 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 +0 -553
  658. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +0 -497
  659. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +0 -544
  660. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +0 -500
  661. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +0 -536
  662. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +0 -551
  663. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +0 -551
  664. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +0 -536
  665. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +0 -546
  666. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +0 -552
  667. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +0 -554
  668. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +0 -554
  669. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +0 -554
  670. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +0 -543
  671. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +0 -549
  672. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +0 -551
  673. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +0 -551
  674. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-baseboard.xml +0 -519
  675. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +0 -522
  676. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +0 -503
  677. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +0 -496
  678. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +0 -518
  679. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +0 -518
  680. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +0 -518
  681. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +0 -496
  682. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +0 -503
  683. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +0 -518
  684. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +0 -518
  685. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +0 -518
  686. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +0 -500
  687. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +0 -500
  688. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only-pilot-light.xml +0 -506
  689. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +0 -501
  690. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +0 -556
  691. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +0 -548
  692. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy-year-round.xml +0 -619
  693. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +0 -475
  694. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +0 -475
  695. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +0 -1313
  696. data/example_files/resources/measure-info.json +0 -26
  697. data/example_files/resources/meta_measure.rb +0 -301
  698. data/example_files/xml_building/17/unit 1.xml +0 -580
  699. data/example_files/xml_building/17/unit 2.xml +0 -553
  700. data/example_files/xml_building/17/unit 3.xml +0 -553
  701. data/example_files/xml_building/17/unit 4.xml +0 -580
  702. /data/example_files/{residential → mappers/residential/template/iecc}/clothes_dryer.tsv +0 -0
  703. /data/example_files/{residential → mappers/residential/template/iecc}/clothes_washer.tsv +0 -0
  704. /data/example_files/{residential → mappers/residential/template/iecc}/cooling_system.tsv +0 -0
  705. /data/example_files/{residential → mappers/residential/template/iecc}/dishwasher.tsv +0 -0
  706. /data/example_files/{residential → mappers/residential/template/iecc}/enclosure.tsv +0 -0
  707. /data/example_files/{residential → mappers/residential/template/iecc}/heat_pump.tsv +0 -0
  708. /data/example_files/{residential → mappers/residential/template/iecc}/heating_system.tsv +0 -0
  709. /data/example_files/{residential → mappers/residential/template/iecc}/mechanical_ventilation.tsv +0 -0
  710. /data/example_files/{residential → mappers/residential/template/iecc}/refrigerator.tsv +0 -0
  711. /data/example_files/{residential → mappers/residential/template/iecc}/water_heater.tsv +0 -0
  712. /data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/{JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json → Detailed Rate.json} +0 -0
@@ -1,1313 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../HPXMLtoOpenStudio/resources/minitest_helper'
4
- require 'openstudio'
5
- require 'fileutils'
6
- require 'parallel'
7
- require_relative '../../HPXMLtoOpenStudio/measure.rb'
8
-
9
- class HPXMLTest < MiniTest::Test
10
- def setup
11
- @this_dir = File.dirname(__FILE__)
12
- @results_dir = File.join(@this_dir, 'results')
13
- FileUtils.mkdir_p @results_dir
14
-
15
- schema_path = File.join(File.dirname(__FILE__), '..', '..', 'HPXMLtoOpenStudio', 'resources', 'hpxml_schema', 'HPXML.xsd')
16
- @schema_validator = XMLValidator.get_schema_validator(schema_path)
17
- schematron_path = File.join(File.dirname(__FILE__), '..', '..', 'HPXMLtoOpenStudio', 'resources', 'hpxml_schematron', 'EPvalidator.xml')
18
- @schematron_validator = XMLValidator.get_schematron_validator(schematron_path)
19
- end
20
-
21
- def test_simulations
22
- results_out = File.join(@results_dir, 'results.csv')
23
- File.delete(results_out) if File.exist? results_out
24
- bills_out = File.join(@results_dir, 'results_bills.csv')
25
- File.delete(bills_out) if File.exist? bills_out
26
-
27
- xmls = []
28
- sample_files_dirs = [File.absolute_path(File.join(@this_dir, '..', 'sample_files')),
29
- File.absolute_path(File.join(@this_dir, '..', 'real_homes'))]
30
- sample_files_dirs.each do |sample_files_dir|
31
- Dir["#{sample_files_dir}/*.xml"].sort.each do |xml|
32
- next if xml.include? 'base-multiple-buildings.xml' # This is tested in test_multiple_building_ids
33
-
34
- xmls << File.absolute_path(xml)
35
- end
36
- end
37
-
38
- # Test simulations
39
- puts "Running #{xmls.size} HPXML files..."
40
- all_results = {}
41
- all_bill_results = {}
42
- Parallel.map(xmls, in_threads: Parallel.processor_count) do |xml|
43
- xml_name = File.basename(xml)
44
- all_results[xml_name], all_bill_results[xml_name] = _run_xml(xml, Parallel.worker_number)
45
- end
46
-
47
- _write_results(all_results.sort_by { |k, _v| k.downcase }.to_h, results_out)
48
- _write_results(all_bill_results.sort_by { |k, _v| k.downcase }.to_h, bills_out)
49
- end
50
-
51
- def test_ashrae_140
52
- ashrae140_out = File.join(@results_dir, 'results_ashrae_140.csv')
53
- File.delete(ashrae140_out) if File.exist? ashrae140_out
54
-
55
- xmls = []
56
- ashrae_140_dir = File.absolute_path(File.join(@this_dir, 'ASHRAE_Standard_140'))
57
- Dir["#{ashrae_140_dir}/*.xml"].sort.each do |xml|
58
- xmls << File.absolute_path(xml)
59
- end
60
-
61
- # Test simulations
62
- puts "Running #{xmls.size} HPXML files..."
63
- all_results = {}
64
- Parallel.map(xmls, in_threads: Parallel.processor_count) do |xml|
65
- xml_name = File.basename(xml)
66
- all_results[xml_name], _, _ = _run_xml(xml, Parallel.worker_number)
67
- end
68
-
69
- _write_ashrae_140_results(all_results.sort_by { |k, _v| k.downcase }.to_h, ashrae140_out)
70
- end
71
-
72
- def test_run_simulation_output_formats
73
- # Check that the simulation produces outputs in the appropriate format
74
- ['csv', 'json', 'msgpack', 'csv_dview'].each do |output_format|
75
- rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
76
- xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
77
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --debug --hourly ALL --output-format #{output_format}"
78
- system(command, err: File::NULL)
79
-
80
- output_format = 'csv' if output_format == 'csv_dview'
81
-
82
- # Check for output files
83
- assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
84
- assert(File.exist? File.join(File.dirname(xml), 'run', "results_annual.#{output_format}"))
85
- assert(File.exist? File.join(File.dirname(xml), 'run', "results_timeseries.#{output_format}"))
86
- assert(File.exist?(File.join(File.dirname(xml), 'run', "results_bills.#{output_format}")))
87
-
88
- # Check for debug files
89
- osm_path = File.join(File.dirname(xml), 'run', 'in.osm')
90
- assert(File.exist? osm_path)
91
- hpxml_defaults_path = File.join(File.dirname(xml), 'run', 'in.xml')
92
- assert(File.exist? hpxml_defaults_path)
93
-
94
- next unless output_format == 'msgpack'
95
-
96
- # Check timeseries output isn't rounded
97
- require 'msgpack'
98
- data = MessagePack.unpack(File.read(File.join(File.dirname(xml), 'run', "results_timeseries.#{output_format}"), mode: 'rb'))
99
- value = data['Energy Use']['Total (kBtu)'][0]
100
- assert_operator((value - value.round(8)).abs, :>, 0)
101
- end
102
- end
103
-
104
- def test_run_simulation_epjson_input
105
- # Check that we can run a simulation using epJSON (instead of IDF) if requested
106
- rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
107
- xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
108
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --ep-input-format epjson"
109
- system(command, err: File::NULL)
110
-
111
- # Check for epjson file
112
- assert(File.exist? File.join(File.dirname(xml), 'run', 'in.epJSON'))
113
-
114
- # Check for output files
115
- assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
116
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
117
- end
118
-
119
- def test_run_simulation_idf_input
120
- # Check that we can run a simulation using IDF (instead of epJSON) if requested
121
- rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
122
- xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
123
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --ep-input-format idf"
124
- system(command, err: File::NULL)
125
-
126
- # Check for idf file
127
- assert(File.exist? File.join(File.dirname(xml), 'run', 'in.idf'))
128
-
129
- # Check for output files
130
- assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
131
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
132
- end
133
-
134
- def test_run_simulation_faster_performance
135
- # Run w/ --skip-validation and w/o --add-component-loads arguments
136
- rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
137
- xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
138
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --skip-validation"
139
- system(command, err: File::NULL)
140
-
141
- # Check for output files
142
- assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
143
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
144
-
145
- # Check component loads don't exist
146
- component_loads = {}
147
- CSV.read(File.join(File.dirname(xml), 'run', 'results_annual.csv'), headers: false).each do |data|
148
- next unless data[0].to_s.start_with? 'Component Load'
149
-
150
- component_loads[data[0]] = Float(data[1])
151
- end
152
- assert_equal(0, component_loads.size)
153
- end
154
-
155
- def test_run_simulation_detailed_occupancy_schedules
156
- [false, true].each do |debug|
157
- # Check that the simulation produces stochastic schedules if requested
158
- sample_files_path = File.join(File.dirname(__FILE__), '..', 'sample_files')
159
- tmp_hpxml_path = File.join(sample_files_path, 'tmp.xml')
160
- hpxml = HPXML.new(hpxml_path: File.join(sample_files_path, 'base.xml'))
161
- XMLHelper.write_file(hpxml.to_oga, tmp_hpxml_path)
162
-
163
- rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
164
- xml = File.absolute_path(tmp_hpxml_path)
165
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --add-stochastic-schedules"
166
- command += ' -d' if debug
167
- system(command, err: File::NULL)
168
-
169
- # Check for output files
170
- assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
171
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
172
- assert(File.exist? File.join(File.dirname(xml), 'run', 'in.schedules.csv'))
173
- assert(File.exist? File.join(File.dirname(xml), 'run', 'stochastic.csv'))
174
-
175
- # Check stochastic.csv headers
176
- schedules = CSV.read(File.join(File.dirname(xml), 'run', 'stochastic.csv'), headers: true)
177
- if debug
178
- assert(schedules.headers.include?(SchedulesFile::ColumnSleeping))
179
- else
180
- refute(schedules.headers.include?(SchedulesFile::ColumnSleeping))
181
- end
182
-
183
- # Cleanup
184
- File.delete(tmp_hpxml_path) if File.exist? tmp_hpxml_path
185
- end
186
- end
187
-
188
- def test_run_simulation_timeseries_outputs
189
- [true, false].each do |invalid_variable_only|
190
- # Check that the simulation produces timeseries with requested outputs
191
- rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
192
- xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
193
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\""
194
- if not invalid_variable_only
195
- command += ' --hourly ALL'
196
- command += ' --add-timeseries-time-column DST'
197
- command += ' --add-timeseries-time-column UTC'
198
- command += " --add-timeseries-output-variable 'Zone People Occupant Count'"
199
- command += " --add-timeseries-output-variable 'Zone People Total Heating Energy'"
200
- end
201
- command += " --add-timeseries-output-variable 'Foobar Variable'" # Test invalid output variable request
202
- system(command, err: File::NULL)
203
-
204
- # Check for output files
205
- assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
206
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
207
- if not invalid_variable_only
208
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_timeseries.csv'))
209
- # Check timeseries columns exist
210
- timeseries_rows = CSV.read(File.join(File.dirname(xml), 'run', 'results_timeseries.csv'))
211
- assert_equal(1, timeseries_rows[0].select { |r| r == 'Time' }.size)
212
- assert_equal(1, timeseries_rows[0].select { |r| r == 'TimeDST' }.size)
213
- assert_equal(1, timeseries_rows[0].select { |r| r == 'TimeUTC' }.size)
214
- assert_equal(1, timeseries_rows[0].select { |r| r == 'Zone People Occupant Count: Living Space' }.size)
215
- assert_equal(1, timeseries_rows[0].select { |r| r == 'Zone People Total Heating Energy: Living Space' }.size)
216
- else
217
- refute(File.exist? File.join(File.dirname(xml), 'run', 'results_timeseries.csv'))
218
- end
219
-
220
- # Check run.log has warning about missing Foobar Variable
221
- assert(File.exist? File.join(File.dirname(xml), 'run', 'run.log'))
222
- log_lines = File.readlines(File.join(File.dirname(xml), 'run', 'run.log')).map(&:strip)
223
- assert(log_lines.include? "Warning: Request for output variable 'Foobar Variable' returned no key values.")
224
- end
225
- end
226
-
227
- def test_run_defaulted_in_xml
228
- # Check that if we simulate the in.xml file (HPXML w/ defaults), we get
229
- # the same results as the original HPXML.
230
-
231
- # Run base.xml
232
- rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
233
- xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
234
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\""
235
- system(command, err: File::NULL)
236
- assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
237
- base_results = CSV.read(File.join(File.dirname(xml), 'run', 'results_annual.csv'))
238
-
239
- # Run in.xml (generated from base.xml)
240
- xml2 = File.join(File.dirname(xml), 'run', 'in.xml')
241
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml2}\""
242
- system(command, err: File::NULL)
243
- assert(File.exist? File.join(File.dirname(xml2), 'run', 'results_annual.csv'))
244
- default_results = CSV.read(File.join(File.dirname(xml2), 'run', 'results_annual.csv'))
245
-
246
- # Check two output files are identical
247
- assert_equal(base_results, default_results)
248
- end
249
-
250
- def test_template_osws
251
- # Check that simulation works using template-*.osw
252
- require 'json'
253
-
254
- ['template-run-hpxml.osw',
255
- 'template-run-hpxml-with-stochastic-occupancy.osw',
256
- 'template-run-hpxml-with-stochastic-occupancy-subset.osw',
257
- 'template-build-and-run-hpxml-with-stochastic-occupancy.osw'].each do |osw_name|
258
- osw_path = File.join(File.dirname(__FILE__), '..', osw_name)
259
-
260
- # Create derivative OSW for testing
261
- osw_path_test = osw_path.gsub('.osw', '_test.osw')
262
- FileUtils.cp(osw_path, osw_path_test)
263
-
264
- # Turn on debug mode
265
- json = JSON.parse(File.read(osw_path_test), symbolize_names: true)
266
- measure_index = json[:steps].find_index { |m| m[:measure_dir_name] == 'HPXMLtoOpenStudio' }
267
- json[:steps][measure_index][:arguments][:debug] = true
268
-
269
- if Dir.exist? File.join(File.dirname(__FILE__), '..', '..', 'project')
270
- # CI checks out the repo as "project", so update dir name
271
- json[:steps][measure_index][:measure_dir_name] = 'project'
272
- end
273
-
274
- File.open(osw_path_test, 'w') do |f|
275
- f.write(JSON.pretty_generate(json))
276
- end
277
-
278
- command = "\"#{OpenStudio.getOpenStudioCLI}\" run -w \"#{osw_path_test}\""
279
- system(command, err: File::NULL)
280
-
281
- # Check for output files
282
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'eplusout.msgpack'))
283
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'results_annual.csv'))
284
-
285
- # Check for debug files
286
- assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'in.osm'))
287
- hpxml_defaults_path = File.join(File.dirname(osw_path_test), 'run', 'in.xml')
288
- assert(File.exist? hpxml_defaults_path)
289
-
290
- # Cleanup
291
- File.delete(osw_path_test)
292
- xml_path_test = File.join(File.dirname(__FILE__), '..', 'run', 'built.xml')
293
- File.delete(xml_path_test) if File.exist?(xml_path_test)
294
- xml_path_test = File.join(File.dirname(__FILE__), '..', 'run', 'built-stochastic-schedules.xml')
295
- File.delete(xml_path_test) if File.exist?(xml_path_test)
296
- end
297
- end
298
-
299
- def test_multiple_building_ids
300
- rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
301
- xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base-multiple-buildings.xml')
302
- csv_output_path = File.join(File.dirname(xml), 'run', 'results_annual.csv')
303
- run_log = File.join(File.dirname(xml), 'run', 'run.log')
304
-
305
- # Check successful simulation when providing correct building ID
306
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --building-id MyBuilding"
307
- system(command, err: File::NULL)
308
- assert_equal(true, File.exist?(csv_output_path))
309
-
310
- # Check that we have exactly one warning (i.e., check we are only validating a single Building element against schematron)
311
- assert_equal(1, File.readlines(run_log).select { |l| l.include? 'Warning: No clothes dryer specified, the model will not include clothes dryer energy use.' }.size)
312
-
313
- # Check unsuccessful simulation when providing incorrect building ID
314
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --building-id MyFoo"
315
- system(command, err: File::NULL)
316
- assert_equal(false, File.exist?(csv_output_path))
317
- assert_equal(1, File.readlines(run_log).select { |l| l.include? "Could not find Building element with ID 'MyFoo'." }.size)
318
-
319
- # Check unsuccessful simulation when not providing building ID
320
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\""
321
- system(command, err: File::NULL)
322
- assert_equal(false, File.exist?(csv_output_path))
323
- assert_equal(1, File.readlines(run_log).select { |l| l.include? 'Multiple Building elements defined in HPXML file; Building ID argument must be provided.' }.size)
324
- end
325
-
326
- def test_release_zips
327
- # Check release zips successfully created
328
- top_dir = File.join(@this_dir, '..', '..')
329
- command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{File.join(top_dir, 'tasks.rb')}\" create_release_zips"
330
- system(command)
331
- assert_equal(1, Dir["#{top_dir}/*.zip"].size)
332
-
333
- # Check successful running of simulation from release zips
334
- require 'zip'
335
- Zip.on_exists_proc = true
336
- Dir["#{top_dir}/OpenStudio-HPXML*.zip"].each do |zip_path|
337
- Zip::File.open(zip_path) do |zip_file|
338
- zip_file.each do |f|
339
- FileUtils.mkdir_p(File.dirname(f.name)) unless File.exist?(File.dirname(f.name))
340
- zip_file.extract(f, f.name)
341
- end
342
- end
343
-
344
- # Test run_simulation.rb
345
- command = "\"#{OpenStudio.getOpenStudioCLI}\" OpenStudio-HPXML/workflow/run_simulation.rb -x OpenStudio-HPXML/workflow/sample_files/base.xml"
346
- system(command)
347
- assert(File.exist? 'OpenStudio-HPXML/workflow/sample_files/run/results_annual.csv')
348
-
349
- File.delete(zip_path)
350
- rm_path('OpenStudio-HPXML')
351
- end
352
- end
353
-
354
- private
355
-
356
- def _run_xml(xml, worker_num = nil)
357
- print "Testing #{File.basename(xml)}...\n"
358
- rundir = File.join(@this_dir, "test#{worker_num}")
359
-
360
- # Uses 'monthly' to verify timeseries results match annual results via error-checking
361
- # inside the ReportSimulationOutput measure.
362
- cli_path = OpenStudio.getOpenStudioCLI
363
- command = "\"#{cli_path}\" \"#{File.join(File.dirname(__FILE__), '../run_simulation.rb')}\" -x \"#{xml}\" --add-component-loads -o \"#{rundir}\" --debug --monthly ALL"
364
- success = system(command)
365
-
366
- rundir = File.join(rundir, 'run')
367
-
368
- # Check results
369
- print "Simulation failed: #{xml}.\n" unless success
370
- assert_equal(true, success)
371
-
372
- # Check for output files
373
- annual_csv_path = File.join(rundir, 'results_annual.csv')
374
- timeseries_csv_path = File.join(rundir, 'results_timeseries.csv')
375
- bills_csv_path = File.join(rundir, 'results_bills.csv')
376
- assert(File.exist? annual_csv_path)
377
- assert(File.exist? timeseries_csv_path)
378
-
379
- # Check outputs
380
- hpxml_defaults_path = File.join(rundir, 'in.xml')
381
- hpxml = HPXML.new(hpxml_path: hpxml_defaults_path, schema_validator: @schema_validator, schematron_validator: @schematron_validator) # Validate in.xml to ensure it can be run back through OS-HPXML
382
- if not hpxml.errors.empty?
383
- puts 'ERRORS:'
384
- hpxml.errors.each do |error|
385
- puts error
386
- end
387
- flunk "EPvalidator.xml error in #{hpxml_defaults_path}."
388
- end
389
- bill_results = _get_bill_results(bills_csv_path)
390
- results = _get_simulation_results(annual_csv_path, xml)
391
- _verify_outputs(rundir, xml, results, hpxml)
392
-
393
- return results, bill_results
394
- end
395
-
396
- def _get_simulation_results(annual_csv_path, xml)
397
- # Grab all outputs from reporting measure CSV annual results
398
- results = {}
399
- CSV.foreach(annual_csv_path) do |row|
400
- next if row.nil? || (row.size < 2)
401
- next if row[0].start_with? 'System Use:'
402
- next if row[0].start_with? 'Emissions:'
403
-
404
- results[row[0]] = Float(row[1])
405
- end
406
-
407
- # Check discrepancy between total load and sum of component loads
408
- if not xml.include? 'ASHRAE_Standard_140'
409
- sum_component_htg_loads = results.select { |k, _v| k.start_with? 'Component Load: Heating:' }.values.sum(0.0)
410
- sum_component_clg_loads = results.select { |k, _v| k.start_with? 'Component Load: Cooling:' }.values.sum(0.0)
411
- total_htg_load_delivered = results['Load: Heating: Delivered (MBtu)']
412
- total_clg_load_delivered = results['Load: Cooling: Delivered (MBtu)']
413
- abs_htg_load_delta = (total_htg_load_delivered - sum_component_htg_loads).abs
414
- abs_clg_load_delta = (total_clg_load_delivered - sum_component_clg_loads).abs
415
- avg_htg_load = ([total_htg_load_delivered, sum_component_htg_loads].sum / 2.0)
416
- avg_clg_load = ([total_clg_load_delivered, sum_component_clg_loads].sum / 2.0)
417
- if avg_htg_load > 0
418
- abs_htg_load_frac = abs_htg_load_delta / avg_htg_load
419
- end
420
- if avg_clg_load > 0
421
- abs_clg_load_frac = abs_clg_load_delta / avg_clg_load
422
- end
423
- # Check that the difference is less than 1.5 MBtu or less than 10%
424
- assert((abs_htg_load_delta < 1.5) || (!abs_htg_load_frac.nil? && abs_htg_load_frac < 0.1))
425
- assert((abs_clg_load_delta < 1.5) || (!abs_clg_load_frac.nil? && abs_clg_load_frac < 0.1))
426
- end
427
-
428
- return results
429
- end
430
-
431
- def _get_bill_results(bill_csv_path)
432
- # Grab all outputs from reporting measure CSV bill results
433
- results = {}
434
- if File.exist? bill_csv_path
435
- CSV.foreach(bill_csv_path) do |row|
436
- next if row.nil? || (row.size < 2)
437
-
438
- results[row[0]] = Float(row[1])
439
- end
440
- end
441
-
442
- return results
443
- end
444
-
445
- def _verify_outputs(rundir, hpxml_path, results, hpxml)
446
- assert(File.exist? File.join(rundir, 'eplusout.msgpack'))
447
-
448
- sqlFile = OpenStudio::SqlFile.new(File.join(rundir, 'eplusout.sql'), false)
449
-
450
- # Collapse windows further using same logic as measure.rb
451
- hpxml.windows.each do |window|
452
- window.fraction_operable = nil
453
- end
454
- hpxml.collapse_enclosure_surfaces()
455
- hpxml.delete_adiabatic_subsurfaces()
456
-
457
- # Check run.log warnings
458
- File.readlines(File.join(rundir, 'run.log')).each do |message|
459
- next if message.strip.empty?
460
- next if message.start_with? 'Info: '
461
- next if message.start_with? 'Executing command'
462
- next if message.include? 'Could not find state average'
463
-
464
- if hpxml_path.include? 'base-atticroof-conditioned.xml'
465
- next if message.include?('Ducts are entirely within conditioned space but there is moderate leakage to the outside. Leakage to the outside is typically zero or near-zero in these situations, consider revising leakage values. Leakage will be modeled as heat lost to the ambient environment.')
466
- end
467
- if hpxml.clothes_washers.empty?
468
- next if message.include? 'No clothes washer specified, the model will not include clothes washer energy use.'
469
- end
470
- if hpxml.clothes_dryers.empty?
471
- next if message.include? 'No clothes dryer specified, the model will not include clothes dryer energy use.'
472
- end
473
- if hpxml.dishwashers.empty?
474
- next if message.include? 'No dishwasher specified, the model will not include dishwasher energy use.'
475
- end
476
- if hpxml.refrigerators.empty?
477
- next if message.include? 'No refrigerator specified, the model will not include refrigerator energy use.'
478
- end
479
- if hpxml.cooking_ranges.empty?
480
- next if message.include? 'No cooking range specified, the model will not include cooking range/oven energy use.'
481
- end
482
- if hpxml.water_heating_systems.empty?
483
- next if message.include? 'No water heating specified, the model will not include water heating energy use.'
484
- end
485
- if (hpxml.heating_systems + hpxml.heat_pumps).select { |h| h.fraction_heat_load_served.to_f > 0 }.empty?
486
- next if message.include? 'No space heating specified, the model will not include space heating energy use.'
487
- end
488
- if (hpxml.cooling_systems + hpxml.heat_pumps).select { |c| c.fraction_cool_load_served.to_f > 0 }.empty?
489
- next if message.include? 'No space cooling specified, the model will not include space cooling energy use.'
490
- end
491
- if hpxml.plug_loads.select { |p| p.plug_load_type == HPXML::PlugLoadTypeOther }.empty?
492
- next if message.include? "No '#{HPXML::PlugLoadTypeOther}' plug loads specified, the model will not include misc plug load energy use."
493
- end
494
- if hpxml.plug_loads.select { |p| p.plug_load_type == HPXML::PlugLoadTypeTelevision }.empty?
495
- next if message.include? "No '#{HPXML::PlugLoadTypeTelevision}' plug loads specified, the model will not include television plug load energy use."
496
- end
497
- if hpxml.lighting_groups.empty?
498
- next if message.include? 'No interior lighting specified, the model will not include interior lighting energy use.'
499
- next if message.include? 'No exterior lighting specified, the model will not include exterior lighting energy use.'
500
- next if message.include? 'No garage lighting specified, the model will not include garage lighting energy use.'
501
- end
502
- if hpxml.windows.empty?
503
- next if message.include? 'No windows specified, the model will not include window heat transfer.'
504
- end
505
- if hpxml.pv_systems.empty? && !hpxml.batteries.empty? && hpxml.header.schedules_filepaths.empty?
506
- next if message.include? 'Battery without PV specified, and no charging/discharging schedule provided; battery is assumed to operate as backup and will not be modeled.'
507
- end
508
- if hpxml_path.include? 'base-location-capetown-zaf.xml'
509
- next if message.include? 'OS Message: Minutes field (60) on line 9 of EPW file'
510
- next if message.include? 'Could not find a marginal Electricity rate.'
511
- next if message.include? 'Could not find a marginal Natural Gas rate.'
512
- end
513
- if !hpxml.hvac_distributions.select { |d| d.distribution_system_type == HPXML::HVACDistributionTypeDSE }.empty?
514
- next if message.include? 'DSE is not currently supported when calculating utility bills.'
515
- end
516
- if !hpxml.header.unavailable_periods.select { |up| up.column_name == 'Power Outage' }.empty?
517
- next if message.include? 'It is not possible to eliminate all HVAC energy use (e.g. crankcase/defrost energy) in EnergyPlus during an unavailable period.'
518
- next if message.include? 'It is not possible to eliminate all water heater energy use (e.g. parasitics) in EnergyPlus during an unavailable period.'
519
- end
520
- if hpxml_path.include? 'base-location-AMY-2012.xml'
521
- next if message.include? 'No design condition info found; calculating design conditions from EPW weather data.'
522
- end
523
-
524
- flunk "Unexpected run.log message found for #{File.basename(hpxml_path)}: #{message}"
525
- end
526
-
527
- # Check for unexpected eplusout.err messages
528
- messages = []
529
- message = nil
530
- File.readlines(File.join(rundir, 'eplusout.err')).each do |err_line|
531
- if err_line.include?('** Warning **') || err_line.include?('** Severe **') || err_line.include?('** Fatal **')
532
- messages << message unless message.nil?
533
- message = err_line
534
- else
535
- message += err_line unless message.nil?
536
- end
537
- end
538
-
539
- messages.each do |message|
540
- # General
541
- next if message.include? 'Schedule:Constant="ALWAYS ON CONTINUOUS", Blank Schedule Type Limits Name input'
542
- next if message.include? 'Schedule:Constant="ALWAYS OFF DISCRETE", Blank Schedule Type Limits Name input'
543
- next if message.include? 'Entered Zone Volumes differ from calculated zone volume'
544
- next if message.include? 'PerformancePrecisionTradeoffs: Carroll MRT radiant exchange method is selected.'
545
- next if message.include?('CalculateZoneVolume') && message.include?('not fully enclosed')
546
- next if message.include? 'do not define an enclosure'
547
- next if message.include? 'Pump nominal power or motor efficiency is set to 0'
548
- next if message.include? 'volume flow rate per watt of rated total cooling capacity is out of range'
549
- next if message.include? 'volume flow rate per watt of rated total heating capacity is out of range'
550
- next if message.include? 'Timestep: Requested number'
551
- next if message.include? 'The Standard Ratings is calculated for'
552
- next if message.include?('WetBulb not converged after') && message.include?('iterations(PsyTwbFnTdbWPb)')
553
- next if message.include? 'Inside surface heat balance did not converge with Max Temp Difference'
554
- next if message.include? 'Inside surface heat balance convergence problem continues'
555
- next if message.include? 'Missing temperature setpoint for LeavingSetpointModulated mode' # These warnings are fine, simulation continues with assigning plant loop setpoint to boiler, which is the expected one
556
- next if message.include?('Glycol: Temperature') && message.include?('out of range (too low) for fluid')
557
- next if message.include?('Glycol: Temperature') && message.include?('out of range (too high) for fluid')
558
- next if message.include? 'Plant loop exceeding upper temperature limit'
559
- next if message.include? 'Plant loop falling below lower temperature limit'
560
- next if message.include?('Foundation:Kiva') && message.include?('wall surfaces with more than four vertices') # TODO: Check alternative approach
561
- next if message.include? 'Temperature out of range [-100. to 200.] (PsyPsatFnTemp)'
562
- next if message.include? 'Enthalpy out of range (PsyTsatFnHPb)'
563
- next if message.include? 'Full load outlet air dry-bulb temperature < 2C. This indicates the possibility of coil frost/freeze.'
564
- next if message.include? 'Full load outlet temperature indicates a possibility of frost/freeze error continues.'
565
- next if message.include? 'Air-cooled condenser inlet dry-bulb temperature below 0 C.'
566
- next if message.include? 'Low condenser dry-bulb temperature error continues.'
567
- next if message.include? 'Coil control failed'
568
- next if message.include? 'sensible part-load ratio out of range error continues'
569
- next if message.include? 'Iteration limit exceeded in calculating sensible part-load ratio error continues'
570
- next if message.include?('setupIHGOutputs: Output variables=Zone Other Equipment') && message.include?('are not available.')
571
- next if message.include?('setupIHGOutputs: Output variables=Space Other Equipment') && message.include?('are not available')
572
- next if message.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
573
- next if message.include? 'DetailedSkyDiffuseModeling is chosen but not needed as either the shading transmittance for shading devices does not change throughout the year'
574
- next if message.include? 'View factors not complete'
575
- next if message.include?('CheckSimpleWAHPRatedCurvesOutputs') && message.include?('WaterToAirHeatPump:EquationFit') # FIXME: Check these
576
-
577
- # HPWHs
578
- if hpxml.water_heating_systems.select { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump }.size > 0
579
- next if message.include? 'Recovery Efficiency and Energy Factor could not be calculated during the test for standard ratings'
580
- next if message.include? 'SimHVAC: Maximum iterations (20) exceeded for all HVAC loops'
581
- next if message.include? 'Rated air volume flow rate per watt of rated total water heating capacity is out of range'
582
- next if message.include? 'For object = Coil:WaterHeating:AirToWaterHeatPump:Wrapped'
583
- next if message.include? 'Enthalpy out of range (PsyTsatFnHPb)'
584
- next if message.include?('CheckWarmupConvergence: Loads Initialization') && message.include?('did not converge after 25 warmup days')
585
- end
586
- if hpxml.water_heating_systems.select { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump && wh.location == HPXML::LocationOtherExterior }.size > 0
587
- next if message.include? 'Water heater tank set point temperature is greater than or equal to the cut-in temperature of the heat pump water heater.'
588
- end
589
- # Stratified tank WHs
590
- if hpxml.water_heating_systems.select { |wh| wh.tank_model_type == HPXML::WaterHeaterTankModelTypeStratified }.size > 0
591
- next if message.include? 'Recovery Efficiency and Energy Factor could not be calculated during the test for standard ratings'
592
- end
593
- # HP defrost curves
594
- if hpxml.heat_pumps.select { |hp| [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit, HPXML::HVACTypeHeatPumpPTHP, HPXML::HVACTypeHeatPumpRoom].include? hp.heat_pump_type }.size > 0
595
- next if message.include?('GetDXCoils: Coil:Heating:DX') && message.include?('curve values')
596
- end
597
- if hpxml.cooling_systems.select { |c| c.cooling_system_type == HPXML::HVACTypeEvaporativeCooler }.size > 0
598
- # Evap cooler model is not really using Controller:MechanicalVentilation object, so these warnings of ignoring some features are fine.
599
- # OS requires a Controller:MechanicalVentilation to be attached to the oa controller, however it's not required by E+.
600
- # Manually removing Controller:MechanicalVentilation from idf eliminates these two warnings.
601
- # FUTURE: Can we update OS to allow removing it?
602
- next if message.include?('Zone') && message.include?('is not accounted for by Controller:MechanicalVentilation object')
603
- next if message.include?('PEOPLE object for zone') && message.include?('is not accounted for by Controller:MechanicalVentilation object')
604
- # "The only valid controller type for an AirLoopHVAC is Controller:WaterCoil.", evap cooler doesn't need one.
605
- next if message.include?('GetAirPathData: AirLoopHVAC') && message.include?('has no Controllers')
606
- # input "Autosize" for Fixed Minimum Air Flow Rate is added by OS translation, now set it to 0 to skip potential sizing process, though no way to prevent this warning.
607
- next if message.include? 'Since Zone Minimum Air Flow Input Method = CONSTANT, input for Fixed Minimum Air Flow Rate will be ignored'
608
- end
609
- if hpxml.hvac_distributions.select { |d| d.air_type.to_s == HPXML::AirTypeFanCoil }.size > 0
610
- next if message.include? 'In calculating the design coil UA for Coil:Cooling:Water' # Warning for unused cooling coil for fan coil
611
- end
612
- if hpxml_path.include?('ground-to-air-heat-pump-cooling-only.xml') || hpxml_path.include?('ground-to-air-heat-pump-heating-only.xml')
613
- next if message.include? 'COIL:HEATING:WATERTOAIRHEATPUMP:EQUATIONFIT' # heating capacity is > 20% different than cooling capacity; safe to ignore
614
- end
615
- if hpxml.solar_thermal_systems.size > 0
616
- next if message.include? 'Supply Side is storing excess heat the majority of the time.'
617
- end
618
- if !hpxml.header.unavailable_periods.empty?
619
- next if message.include? 'Target water temperature is greater than the hot water temperature'
620
- next if message.include? 'Target water temperature should be less than or equal to the hot water temperature'
621
- end
622
-
623
- flunk "Unexpected eplusout.err message found for #{File.basename(hpxml_path)}: #{message}"
624
- end
625
-
626
- # Check for unused objects/schedules/constructions warnings
627
- num_unused_objects = 0
628
- num_unused_schedules = 0
629
- num_unused_constructions = 0
630
- File.readlines(File.join(rundir, 'eplusout.err')).each do |err_line|
631
- if err_line.include? 'unused objects in input'
632
- num_unused_objects = Integer(err_line.split(' ')[3])
633
- elsif err_line.include? 'unused schedules in input'
634
- num_unused_schedules = Integer(err_line.split(' ')[3])
635
- elsif err_line.include? 'unused constructions in input'
636
- num_unused_constructions = Integer(err_line.split(' ')[6])
637
- end
638
- end
639
- assert_equal(0, num_unused_objects)
640
- assert_equal(0, num_unused_schedules)
641
- assert_equal(0, num_unused_constructions)
642
-
643
- # Check for Output:Meter and Output:Variable warnings
644
- num_invalid_output_meters = 0
645
- num_invalid_output_variables = 0
646
- File.readlines(File.join(rundir, 'eplusout.err')).each do |err_line|
647
- if err_line.include? 'Output:Meter: invalid Key Name'
648
- num_invalid_output_meters += 1
649
- elsif err_line.include?('Key=') && err_line.include?('VarName=')
650
- num_invalid_output_variables += 1
651
- end
652
- end
653
- assert_equal(0, num_invalid_output_meters)
654
- assert_equal(0, num_invalid_output_variables)
655
-
656
- # Timestep
657
- timestep = hpxml.header.timestep
658
- if timestep.nil?
659
- timestep = 60
660
- end
661
- query = 'SELECT NumTimestepsPerHour FROM Simulations'
662
- sql_value = sqlFile.execAndReturnFirstDouble(query).get
663
- assert_equal(60 / timestep, sql_value)
664
-
665
- # Conditioned Floor Area
666
- if (hpxml.total_fraction_cool_load_served > 0) || (hpxml.total_fraction_heat_load_served > 0) # EnergyPlus will only report conditioned floor area if there is an HVAC system
667
- hpxml_value = hpxml.building_construction.conditioned_floor_area
668
- if hpxml.has_location(HPXML::LocationCrawlspaceConditioned)
669
- hpxml_value += hpxml.slabs.select { |s| s.interior_adjacent_to == HPXML::LocationCrawlspaceConditioned }.map { |s| s.area }.sum
670
- end
671
- query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='InputVerificationandResultsSummary' AND ReportForString='Entire Facility' AND TableName='Zone Summary' AND RowName='Conditioned Total' AND ColumnName='Area' AND Units='m2'"
672
- sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
673
- assert_in_epsilon(hpxml_value, sql_value, 0.1)
674
- end
675
-
676
- # Enclosure Roofs
677
- hpxml.roofs.each do |roof|
678
- roof_id = roof.id.upcase
679
-
680
- # R-value
681
- hpxml_value = roof.insulation_assembly_r_value
682
- if hpxml_path.include? 'ASHRAE_Standard_140'
683
- # Compare R-value w/o film
684
- hpxml_value -= Material.AirFilmRoofASHRAE140.rvalue
685
- hpxml_value -= Material.AirFilmOutsideASHRAE140.rvalue
686
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
687
- else
688
- # Compare R-value w/ film
689
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='U-Factor with Film' AND Units='W/m2-K'"
690
- end
691
- sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
692
- assert_in_epsilon(hpxml_value, sql_value, 0.1)
693
-
694
- # Net area
695
- hpxml_value = roof.area
696
- hpxml.skylights.each do |subsurface|
697
- next if subsurface.roof_idref.upcase != roof_id
698
-
699
- hpxml_value -= subsurface.area
700
- end
701
- query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='Net Area' AND Units='m2'"
702
- sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
703
- assert_operator(sql_value, :>, 0.01)
704
- assert_in_epsilon(hpxml_value, sql_value, 0.1)
705
-
706
- # Solar absorptance
707
- hpxml_value = roof.solar_absorptance
708
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='Reflectance'"
709
- sql_value = 1.0 - sqlFile.execAndReturnFirstDouble(query).get
710
- assert_in_epsilon(hpxml_value, sql_value, 0.01)
711
-
712
- # Tilt
713
- hpxml_value = UnitConversions.convert(Math.atan(roof.pitch / 12.0), 'rad', 'deg')
714
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='Tilt' AND Units='deg'"
715
- sql_value = sqlFile.execAndReturnFirstDouble(query).get
716
- assert_in_epsilon(hpxml_value, sql_value, 0.01)
717
-
718
- # Azimuth
719
- next unless (not roof.azimuth.nil?) && (Float(roof.pitch) > 0)
720
-
721
- hpxml_value = roof.azimuth
722
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='Azimuth' AND Units='deg'"
723
- sql_value = sqlFile.execAndReturnFirstDouble(query).get
724
- assert_in_epsilon(hpxml_value, sql_value, 0.01)
725
- end
726
-
727
- # Enclosure Foundations
728
- # Ensure Kiva instances have perimeter fraction of 1.0 as we explicitly define them to end up this way.
729
- num_kiva_instances = 0
730
- File.readlines(File.join(rundir, 'eplusout.eio')).each do |eio_line|
731
- next unless eio_line.downcase.start_with? 'foundation kiva'
732
-
733
- kiva_perim_frac = Float(eio_line.split(',')[5])
734
- assert_equal(1.0, kiva_perim_frac)
735
-
736
- num_kiva_instances += 1
737
- end
738
-
739
- if hpxml_path.include? 'ASHRAE_Standard_140'
740
- # nop
741
- elsif hpxml_path.include? 'real_homes'
742
- # nop
743
- elsif hpxml.building_construction.residential_facility_type == HPXML::ResidentialTypeApartment
744
- # no foundation, above dwelling unit
745
- assert_equal(0, num_kiva_instances)
746
- elsif hpxml.slabs.empty?
747
- assert_equal(0, num_kiva_instances)
748
- else
749
- num_expected_kiva_instances = { 'base-foundation-multiple.xml' => 2, # additional instance for 2nd foundation type
750
- 'base-enclosure-2stories-garage.xml' => 2, # additional instance for garage
751
- 'base-foundation-basement-garage.xml' => 2, # additional instance for garage
752
- 'base-enclosure-garage.xml' => 2, # additional instance for garage
753
- 'base-foundation-walkout-basement.xml' => 4, # 3 foundation walls plus a no-wall exposed perimeter
754
- 'base-foundation-complex.xml' => 10, # lots of foundations for testing
755
- 'base-pv-battery-garage.xml' => 2 } # additional instance for garage
756
- num_expected = num_expected_kiva_instances[File.basename(hpxml_path)]
757
- num_expected = 1 if num_expected.nil?
758
- assert_equal(num_expected, num_kiva_instances)
759
- end
760
-
761
- # Enclosure Foundation Slabs
762
- num_slabs = hpxml.slabs.size
763
- if (num_slabs <= 1) && (num_kiva_instances <= 1) # The slab surfaces may be combined in these situations, so skip tests
764
- hpxml.slabs.each do |slab|
765
- slab_id = slab.id.upcase
766
-
767
- # Exposed Area
768
- hpxml_value = Float(slab.area)
769
- query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND RowName='#{slab_id}' AND ColumnName='Gross Area' AND Units='m2'"
770
- sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
771
- assert_operator(sql_value, :>, 0.01)
772
- assert_in_epsilon(hpxml_value, sql_value, 0.1)
773
-
774
- # Tilt
775
- query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND RowName='#{slab_id}' AND ColumnName='Tilt' AND Units='deg'"
776
- sql_value = sqlFile.execAndReturnFirstDouble(query).get
777
- assert_in_epsilon(180.0, sql_value, 0.01)
778
- end
779
- end
780
-
781
- # Enclosure Walls/RimJoists/FoundationWalls
782
- (hpxml.walls + hpxml.rim_joists + hpxml.foundation_walls).each do |wall|
783
- wall_id = wall.id.upcase
784
-
785
- if wall.is_adiabatic
786
- # Adiabatic surfaces have their "BaseSurfaceIndex" as their "ExtBoundCond" in "Surfaces" table in SQL simulation results
787
- query_base_surf_idx = "SELECT BaseSurfaceIndex FROM Surfaces WHERE SurfaceName='#{wall_id}'"
788
- query_ext_bound = "SELECT ExtBoundCond FROM Surfaces WHERE SurfaceName='#{wall_id}'"
789
- sql_value_base_surf_idx = sqlFile.execAndReturnFirstDouble(query_base_surf_idx).get
790
- sql_value_ext_bound_cond = sqlFile.execAndReturnFirstDouble(query_ext_bound).get
791
- assert_equal(sql_value_base_surf_idx, sql_value_ext_bound_cond)
792
- end
793
-
794
- if wall.is_exterior
795
- table_name = 'Opaque Exterior'
796
- else
797
- table_name = 'Opaque Interior'
798
- end
799
-
800
- # R-value
801
- if (not wall.insulation_assembly_r_value.nil?) && (not wall.is_a? HPXML::FoundationWall) # FoundationWalls use Foundation:Kiva for insulation
802
- hpxml_value = wall.insulation_assembly_r_value
803
- if hpxml_path.include? 'ASHRAE_Standard_140'
804
- # Compare R-value w/o film
805
- hpxml_value -= Material.AirFilmVerticalASHRAE140.rvalue
806
- if wall.is_exterior
807
- hpxml_value -= Material.AirFilmOutsideASHRAE140.rvalue
808
- else
809
- hpxml_value -= Material.AirFilmVerticalASHRAE140.rvalue
810
- end
811
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
812
- elsif wall.is_interior
813
- # Compare R-value w/o film
814
- hpxml_value -= Material.AirFilmVertical.rvalue
815
- hpxml_value -= Material.AirFilmVertical.rvalue
816
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
817
- else
818
- # Compare R-value w/ film
819
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='U-Factor with Film' AND Units='W/m2-K'"
820
- end
821
- sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
822
- assert_in_epsilon(hpxml_value, sql_value, 0.1)
823
- end
824
-
825
- # Net area
826
- hpxml_value = wall.area
827
- (hpxml.windows + hpxml.doors).each do |subsurface|
828
- next if subsurface.wall_idref.upcase != wall_id
829
-
830
- hpxml_value -= subsurface.area
831
- end
832
- if wall.exterior_adjacent_to == HPXML::LocationGround
833
- # Calculate total length of walls
834
- wall_total_length = 0
835
- hpxml.foundation_walls.each do |foundation_wall|
836
- next unless foundation_wall.exterior_adjacent_to == HPXML::LocationGround
837
- next unless wall.interior_adjacent_to == foundation_wall.interior_adjacent_to
838
-
839
- wall_total_length += foundation_wall.area / foundation_wall.height
840
- end
841
-
842
- # Calculate total slab exposed perimeter
843
- slab_exposed_length = 0
844
- hpxml.slabs.each do |slab|
845
- next unless wall.interior_adjacent_to == slab.interior_adjacent_to
846
-
847
- slab_exposed_length += slab.exposed_perimeter
848
- end
849
-
850
- # Calculate exposed foundation wall area
851
- if slab_exposed_length < wall_total_length
852
- hpxml_value *= (slab_exposed_length / wall_total_length)
853
- end
854
- end
855
- if (hpxml.foundation_walls.include? wall) && (not wall.is_exterior)
856
- # interzonal foundation walls: only above-grade portion modeled
857
- hpxml_value *= (wall.height - wall.depth_below_grade) / wall.height
858
- end
859
- if wall.is_exterior
860
- query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%' OR RowName LIKE '#{wall_id} %') AND ColumnName='Net Area' AND Units='m2'"
861
- else
862
- query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Net Area' AND Units='m2'"
863
- end
864
- sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
865
- assert_operator(sql_value, :>, 0.01)
866
- assert_in_epsilon(hpxml_value, sql_value, 0.1)
867
-
868
- # Solar absorptance
869
- if wall.respond_to?(:solar_absorptance) && (not wall.solar_absorptance.nil?)
870
- hpxml_value = wall.solar_absorptance
871
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Reflectance'"
872
- sql_value = 1.0 - sqlFile.execAndReturnFirstDouble(query).get
873
- assert_in_epsilon(hpxml_value, sql_value, 0.01)
874
- end
875
-
876
- # Tilt
877
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Tilt' AND Units='deg'"
878
- sql_value = sqlFile.execAndReturnFirstDouble(query).get
879
- assert_in_epsilon(90.0, sql_value, 0.01)
880
-
881
- # Azimuth
882
- next if wall.azimuth.nil?
883
-
884
- hpxml_value = wall.azimuth
885
- query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Azimuth' AND Units='deg'"
886
- sql_value = sqlFile.execAndReturnFirstDouble(query).get
887
- assert_in_epsilon(hpxml_value, sql_value, 0.01)
888
- end
889
-
890
- # Enclosure Floors
891
- hpxml.floors.each do |floor|
892
- floor_id = floor.id.upcase
893
-
894
- if floor.is_adiabatic
895
- # Adiabatic surfaces have their "BaseSurfaceIndex" as their "ExtBoundCond" in "Surfaces" table in SQL simulation results
896
- query_base_surf_idx = "SELECT BaseSurfaceIndex FROM Surfaces WHERE SurfaceName='#{floor_id}'"
897
- query_ext_bound = "SELECT ExtBoundCond FROM Surfaces WHERE SurfaceName='#{floor_id}'"
898
- sql_value_base_surf_idx = sqlFile.execAndReturnFirstDouble(query_base_surf_idx).get
899
- sql_value_ext_bound_cond = sqlFile.execAndReturnFirstDouble(query_ext_bound).get
900
- assert_equal(sql_value_base_surf_idx, sql_value_ext_bound_cond)
901
- end
902
-
903
- if floor.is_exterior
904
- table_name = 'Opaque Exterior'
905
- else
906
- table_name = 'Opaque Interior'
907
- end
908
-
909
- # R-value
910
- hpxml_value = floor.insulation_assembly_r_value
911
- if hpxml_path.include? 'ASHRAE_Standard_140'
912
- # Compare R-value w/o film
913
- if floor.is_exterior # Raised floor
914
- hpxml_value -= Material.AirFilmFloorASHRAE140.rvalue
915
- hpxml_value -= Material.AirFilmFloorZeroWindASHRAE140.rvalue
916
- elsif floor.is_ceiling # Attic floor
917
- hpxml_value -= Material.AirFilmFloorASHRAE140.rvalue
918
- hpxml_value -= Material.AirFilmFloorASHRAE140.rvalue
919
- end
920
- 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'"
921
- elsif floor.is_interior
922
- # Compare R-value w/o film
923
- if floor.is_ceiling
924
- hpxml_value -= Material.AirFilmFloorAverage.rvalue
925
- hpxml_value -= Material.AirFilmFloorAverage.rvalue
926
- else
927
- hpxml_value -= Material.AirFilmFloorReduced.rvalue
928
- hpxml_value -= Material.AirFilmFloorReduced.rvalue
929
- end
930
- 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'"
931
- else
932
- # Compare R-value w/ film
933
- 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'"
934
- end
935
- sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
936
- assert_in_epsilon(hpxml_value, sql_value, 0.1)
937
-
938
- # Area
939
- hpxml_value = floor.area
940
- 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'"
941
- sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
942
- assert_operator(sql_value, :>, 0.01)
943
- assert_in_epsilon(hpxml_value, sql_value, 0.1)
944
-
945
- # Tilt
946
- if floor.is_ceiling
947
- hpxml_value = 0
948
- else
949
- hpxml_value = 180
950
- end
951
- 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'"
952
- sql_value = sqlFile.execAndReturnFirstDouble(query).get
953
- assert_in_epsilon(hpxml_value, sql_value, 0.01)
954
- end
955
-
956
- # Enclosure Windows/Skylights
957
- (hpxml.windows + hpxml.skylights).each do |subsurface|
958
- subsurface_id = subsurface.id.upcase
959
-
960
- if subsurface.is_exterior
961
- table_name = 'Exterior Fenestration'
962
- else
963
- table_name = 'Interior Door'
964
- end
965
-
966
- # Area
967
- if subsurface.is_exterior
968
- col_name = 'Area of Multiplied Openings'
969
- else
970
- col_name = 'Gross Area'
971
- end
972
- hpxml_value = subsurface.area
973
- query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='#{col_name}' AND Units='m2'"
974
- sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
975
- assert_operator(sql_value, :>, 0.01)
976
- assert_in_epsilon(hpxml_value, sql_value, 0.1)
977
-
978
- # U-Factor
979
- if subsurface.is_exterior
980
- col_name = 'Glass U-Factor'
981
- else
982
- col_name = 'U-Factor no Film'
983
- end
984
- hpxml_value = Constructions.get_ufactor_shgc_adjusted_by_storms(subsurface.storm_type, subsurface.ufactor, subsurface.shgc)[0]
985
- if subsurface.is_interior
986
- hpxml_value = 1.0 / (1.0 / hpxml_value - Material.AirFilmVertical.rvalue)
987
- hpxml_value = 1.0 / (1.0 / hpxml_value - Material.AirFilmVertical.rvalue)
988
- end
989
- if subsurface.is_a? HPXML::Skylight
990
- hpxml_value /= 1.2 # converted to the 20-deg slope from the vertical position by multiplying the tested value at vertical
991
- end
992
- query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='#{col_name}' AND Units='W/m2-K'"
993
- sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
994
- assert_in_epsilon(hpxml_value, sql_value, 0.02)
995
-
996
- next unless subsurface.is_exterior
997
-
998
- # SHGC
999
- hpxml_value = Constructions.get_ufactor_shgc_adjusted_by_storms(subsurface.storm_type, subsurface.ufactor, subsurface.shgc)[1]
1000
- query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Glass SHGC'"
1001
- sql_value = sqlFile.execAndReturnFirstDouble(query).get
1002
- assert_in_delta(hpxml_value, sql_value, 0.01)
1003
-
1004
- # Azimuth
1005
- hpxml_value = subsurface.azimuth
1006
- query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Azimuth' AND Units='deg'"
1007
- sql_value = sqlFile.execAndReturnFirstDouble(query).get
1008
- assert_in_epsilon(hpxml_value, sql_value, 0.01)
1009
-
1010
- # Tilt
1011
- if subsurface.is_a? HPXML::Window
1012
- query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Tilt' AND Units='deg'"
1013
- sql_value = sqlFile.execAndReturnFirstDouble(query).get
1014
- assert_in_epsilon(90.0, sql_value, 0.01)
1015
- elsif subsurface.is_a? HPXML::Skylight
1016
- hpxml_value = nil
1017
- hpxml.roofs.each do |roof|
1018
- next if roof.id != subsurface.roof_idref
1019
-
1020
- hpxml_value = UnitConversions.convert(Math.atan(roof.pitch / 12.0), 'rad', 'deg')
1021
- end
1022
- query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Tilt' AND Units='deg'"
1023
- sql_value = sqlFile.execAndReturnFirstDouble(query).get
1024
- assert_in_epsilon(hpxml_value, sql_value, 0.01)
1025
- else
1026
- flunk "Subsurface '#{subsurface_id}' should have either AttachedToWall or AttachedToRoof element."
1027
- end
1028
- end
1029
-
1030
- # Enclosure Doors
1031
- hpxml.doors.each do |door|
1032
- door_id = door.id.upcase
1033
-
1034
- if door.wall.is_exterior
1035
- table_name = 'Exterior Door'
1036
- else
1037
- table_name = 'Interior Door'
1038
- end
1039
-
1040
- # Area
1041
- if not door.area.nil?
1042
- hpxml_value = door.area
1043
- query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{door_id}' AND ColumnName='Gross Area' AND Units='m2'"
1044
- sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
1045
- assert_operator(sql_value, :>, 0.01)
1046
- assert_in_epsilon(hpxml_value, sql_value, 0.1)
1047
- end
1048
-
1049
- # R-Value
1050
- next if door.r_value.nil?
1051
-
1052
- if door.is_exterior
1053
- col_name = 'U-Factor with Film'
1054
- else
1055
- col_name = 'U-Factor no Film'
1056
- end
1057
- hpxml_value = door.r_value
1058
- if door.is_interior
1059
- hpxml_value -= Material.AirFilmVertical.rvalue
1060
- hpxml_value -= Material.AirFilmVertical.rvalue
1061
- end
1062
- query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{door_id}' AND ColumnName='#{col_name}' AND Units='W/m2-K'"
1063
- sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
1064
- assert_in_epsilon(hpxml_value, sql_value, 0.1)
1065
- end
1066
-
1067
- # HVAC Load Fractions
1068
- if (not hpxml_path.include? 'location-miami') && (not hpxml_path.include? 'location-honolulu') && (not hpxml_path.include? 'location-phoenix')
1069
- htg_energy = results.select { |k, _v| (k.include?(': Heating (MBtu)') || k.include?(': Heating Fans/Pumps (MBtu)')) && !k.include?('Load') }.values.sum(0.0)
1070
- assert_equal(hpxml.total_fraction_heat_load_served > 0, htg_energy > 0)
1071
- end
1072
- clg_energy = results.select { |k, _v| (k.include?(': Cooling (MBtu)') || k.include?(': Cooling Fans/Pumps (MBtu)')) && !k.include?('Load') }.values.sum(0.0)
1073
- assert_equal(hpxml.total_fraction_cool_load_served > 0, clg_energy > 0)
1074
-
1075
- # Mechanical Ventilation
1076
- whole_vent_fans = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_whole_building_ventilation && !vent_mech.is_cfis_supplemental_fan? }
1077
- local_vent_fans = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_local_ventilation }
1078
- fan_cfis = whole_vent_fans.select { |vent_mech| vent_mech.fan_type == HPXML::MechVentTypeCFIS }
1079
- fan_sup = whole_vent_fans.select { |vent_mech| vent_mech.fan_type == HPXML::MechVentTypeSupply }
1080
- fan_exh = whole_vent_fans.select { |vent_mech| vent_mech.fan_type == HPXML::MechVentTypeExhaust }
1081
- fan_bal = whole_vent_fans.select { |vent_mech| [HPXML::MechVentTypeBalanced, HPXML::MechVentTypeERV, HPXML::MechVentTypeHRV].include?(vent_mech.fan_type) }
1082
- vent_fan_kitchen = local_vent_fans.select { |vent_mech| vent_mech.fan_location == HPXML::LocationKitchen }
1083
- vent_fan_bath = local_vent_fans.select { |vent_mech| vent_mech.fan_location == HPXML::LocationBath }
1084
-
1085
- if not (fan_cfis + fan_sup + fan_exh + fan_bal + vent_fan_kitchen + vent_fan_bath).empty?
1086
- mv_energy = UnitConversions.convert(results['End Use: Electricity: Mech Vent (MBtu)'], 'MBtu', 'GJ')
1087
-
1088
- if not fan_cfis.empty?
1089
- if (fan_sup + fan_exh + fan_bal + vent_fan_kitchen + vent_fan_bath).empty?
1090
- # CFIS only, check for positive mech vent energy that is less than the energy if it had run 24/7
1091
- fan_gj = fan_cfis.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
1092
- assert_operator(mv_energy, :>, 0)
1093
- assert_operator(mv_energy, :<, fan_gj)
1094
- end
1095
- else
1096
- # Supply, exhaust, ERV, HRV, etc., check for appropriate mech vent energy
1097
- fan_gj = 0
1098
- if not fan_sup.empty?
1099
- fan_gj += fan_sup.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
1100
- end
1101
- if not fan_exh.empty?
1102
- fan_gj += fan_exh.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
1103
- end
1104
- if not fan_bal.empty?
1105
- fan_gj += fan_bal.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
1106
- end
1107
- if not vent_fan_kitchen.empty?
1108
- fan_gj += vent_fan_kitchen.map { |vent_kitchen| UnitConversions.convert(vent_kitchen.unit_fan_power * vent_kitchen.hours_in_operation * vent_kitchen.count * 365.0, 'Wh', 'GJ') }.sum(0.0)
1109
- end
1110
- if not vent_fan_bath.empty?
1111
- fan_gj += vent_fan_bath.map { |vent_bath| UnitConversions.convert(vent_bath.unit_fan_power * vent_bath.hours_in_operation * vent_bath.count * 365.0, 'Wh', 'GJ') }.sum(0.0)
1112
- end
1113
- # Maximum error that can be caused by rounding
1114
- assert_in_delta(mv_energy, fan_gj, 0.006)
1115
- end
1116
- end
1117
-
1118
- tabular_map = { HPXML::ClothesWasher => Constants.ObjectNameClothesWasher,
1119
- HPXML::ClothesDryer => Constants.ObjectNameClothesDryer,
1120
- HPXML::Refrigerator => Constants.ObjectNameRefrigerator,
1121
- HPXML::Dishwasher => Constants.ObjectNameDishwasher,
1122
- HPXML::CookingRange => Constants.ObjectNameCookingRange }
1123
-
1124
- (hpxml.clothes_washers + hpxml.clothes_dryers + hpxml.refrigerators + hpxml.dishwashers + hpxml.cooking_ranges).each do |appliance|
1125
- next unless hpxml.water_heating_systems.size > 0
1126
-
1127
- # Location
1128
- hpxml_value = appliance.location
1129
- if hpxml_value.nil? || HPXML::conditioned_locations.include?(hpxml_value) || [HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].include?(hpxml_value)
1130
- hpxml_value = HPXML::LocationLivingSpace
1131
- end
1132
- tabular_value = tabular_map[appliance.class]
1133
- query = "SELECT Value FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Zone Name' AND RowName=(SELECT RowName FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Name' AND Value='#{tabular_value.upcase}')"
1134
- sql_value = sqlFile.execAndReturnFirstString(query).get
1135
- assert_equal(hpxml_value.upcase, sql_value)
1136
- end
1137
-
1138
- # Lighting
1139
- ltg_energy = results.select { |k, _v| k.include? 'End Use: Electricity: Lighting' }.values.sum(0.0)
1140
- if not (hpxml_path.include?('vacancy-year-round') || hpxml_path.include?('residents-0'))
1141
- assert_equal(hpxml.lighting_groups.size > 0, ltg_energy > 0)
1142
- else
1143
- assert_operator(hpxml.lighting_groups.size, :>, 0)
1144
- assert_equal(0, ltg_energy)
1145
- end
1146
-
1147
- # Get fuels
1148
- htg_fuels = []
1149
- htg_backup_fuels = []
1150
- wh_fuels = []
1151
- hpxml.heating_systems.each do |heating_system|
1152
- if heating_system.is_heat_pump_backup_system
1153
- htg_backup_fuels << heating_system.heating_system_fuel
1154
- else
1155
- htg_fuels << heating_system.heating_system_fuel
1156
- end
1157
- end
1158
- hpxml.cooling_systems.each do |cooling_system|
1159
- if cooling_system.has_integrated_heating
1160
- htg_fuels << cooling_system.integrated_heating_system_fuel
1161
- end
1162
- end
1163
- hpxml.heat_pumps.each do |heat_pump|
1164
- if heat_pump.fraction_heat_load_served > 0
1165
- htg_backup_fuels << heat_pump.backup_heating_fuel
1166
- end
1167
- end
1168
- hpxml.water_heating_systems.each do |water_heating_system|
1169
- related_hvac = water_heating_system.related_hvac_system
1170
- if related_hvac.nil?
1171
- wh_fuels << water_heating_system.fuel_type
1172
- elsif related_hvac.respond_to? :heating_system_fuel
1173
- wh_fuels << related_hvac.heating_system_fuel
1174
- end
1175
- end
1176
-
1177
- is_warm_climate = false
1178
- if ['USA_FL_Miami.Intl.AP.722020_TMY3.epw',
1179
- 'USA_HI_Honolulu.Intl.AP.911820_TMY3.epw',
1180
- 'USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3.epw'].include? hpxml.climate_and_risk_zones.weather_station_epw_filepath
1181
- is_warm_climate = true
1182
- end
1183
-
1184
- # Fuel consumption checks
1185
- [HPXML::FuelTypeNaturalGas,
1186
- HPXML::FuelTypeOil,
1187
- HPXML::FuelTypeKerosene,
1188
- HPXML::FuelTypePropane,
1189
- HPXML::FuelTypeWoodCord,
1190
- HPXML::FuelTypeWoodPellets,
1191
- HPXML::FuelTypeCoal].each do |fuel|
1192
- fuel_name = fuel.split.map(&:capitalize).join(' ')
1193
- fuel_name += ' Cord' if fuel_name == 'Wood'
1194
- energy_htg = results.fetch("End Use: #{fuel_name}: Heating (MBtu)", 0)
1195
- energy_hp_backup = results.fetch("End Use: #{fuel_name}: Heating Heat Pump Backup (MBtu)", 0)
1196
- energy_dhw = results.fetch("End Use: #{fuel_name}: Hot Water (MBtu)", 0)
1197
- energy_cd = results.fetch("End Use: #{fuel_name}: Clothes Dryer (MBtu)", 0)
1198
- energy_cr = results.fetch("End Use: #{fuel_name}: Range/Oven (MBtu)", 0)
1199
- if htg_fuels.include? fuel
1200
- if (not hpxml_path.include? 'autosize') && (not is_warm_climate)
1201
- assert_operator(energy_htg, :>, 0)
1202
- end
1203
- else
1204
- assert_equal(0, energy_htg)
1205
- end
1206
- if htg_backup_fuels.include? fuel
1207
- if (not hpxml_path.include? 'autosize') && (not is_warm_climate)
1208
- assert_operator(energy_hp_backup, :>, 0)
1209
- end
1210
- else
1211
- assert_equal(0, energy_hp_backup)
1212
- end
1213
- if wh_fuels.include? fuel
1214
- assert_operator(energy_dhw, :>, 0)
1215
- else
1216
- assert_equal(0, energy_dhw)
1217
- end
1218
- if (hpxml.clothes_dryers.size > 0) && (hpxml.clothes_dryers[0].fuel_type == fuel)
1219
- assert_operator(energy_cd, :>, 0)
1220
- else
1221
- assert_equal(0, energy_cd)
1222
- end
1223
- if (hpxml.cooking_ranges.size > 0) && (hpxml.cooking_ranges[0].fuel_type == fuel)
1224
- assert_operator(energy_cr, :>, 0)
1225
- else
1226
- assert_equal(0, energy_cr)
1227
- end
1228
- end
1229
-
1230
- # Check unmet hours
1231
- unmet_hours_htg = results.select { |k, _v| k.include? 'Unmet Hours: Heating' }.values.sum(0.0)
1232
- unmet_hours_clg = results.select { |k, _v| k.include? 'Unmet Hours: Cooling' }.values.sum(0.0)
1233
- if hpxml_path.include? 'base-hvac-undersized.xml'
1234
- assert_operator(unmet_hours_htg, :>, 1000)
1235
- assert_operator(unmet_hours_clg, :>, 1000)
1236
- else
1237
- if hpxml.total_fraction_heat_load_served == 0
1238
- assert_equal(0, unmet_hours_htg)
1239
- else
1240
- assert_operator(unmet_hours_htg, :<, 350)
1241
- end
1242
- if hpxml.total_fraction_cool_load_served == 0
1243
- assert_equal(0, unmet_hours_clg)
1244
- else
1245
- assert_operator(unmet_hours_clg, :<, 350)
1246
- end
1247
- end
1248
-
1249
- sqlFile.close
1250
-
1251
- # Ensure sql file is immediately freed; otherwise we can get
1252
- # errors on Windows when trying to delete this file.
1253
- GC.start()
1254
- end
1255
-
1256
- def _write_results(results, csv_out)
1257
- require 'csv'
1258
-
1259
- output_keys = []
1260
- results.values.each do |xml_results|
1261
- xml_results.keys.each do |key|
1262
- next if output_keys.include? key
1263
-
1264
- output_keys << key
1265
- end
1266
- end
1267
-
1268
- CSV.open(csv_out, 'w') do |csv|
1269
- csv << ['HPXML'] + output_keys
1270
- results.sort.each do |xml, xml_results|
1271
- csv_row = [xml]
1272
- output_keys.each do |key|
1273
- if xml_results[key].nil?
1274
- csv_row << 0
1275
- else
1276
- csv_row << xml_results[key]
1277
- end
1278
- end
1279
- csv << csv_row
1280
- end
1281
- end
1282
-
1283
- puts "Wrote results to #{csv_out}."
1284
- end
1285
-
1286
- def _write_ashrae_140_results(all_results, csv_out)
1287
- require 'csv'
1288
-
1289
- htg_loads = {}
1290
- clg_loads = {}
1291
- CSV.open(csv_out, 'w') do |csv|
1292
- csv << ['Test Case', 'Annual Heating Load [MMBtu]', 'Annual Cooling Load [MMBtu]']
1293
- all_results.sort.each do |xml, xml_results|
1294
- next unless xml.include? 'C.xml'
1295
-
1296
- htg_load = xml_results['Load: Heating: Delivered (MBtu)'].round(2)
1297
- csv << [File.basename(xml), htg_load, 'N/A']
1298
- test_name = File.basename(xml, File.extname(xml))
1299
- htg_loads[test_name] = htg_load
1300
- end
1301
- all_results.sort.each do |xml, xml_results|
1302
- next unless xml.include? 'L.xml'
1303
-
1304
- clg_load = xml_results['Load: Cooling: Delivered (MBtu)'].round(2)
1305
- csv << [File.basename(xml), 'N/A', clg_load]
1306
- test_name = File.basename(xml, File.extname(xml))
1307
- clg_loads[test_name] = clg_load
1308
- end
1309
- end
1310
-
1311
- puts "Wrote ASHRAE 140 results to #{csv_out}."
1312
- end
1313
- end