urbanopt-cli 0.10.0 → 0.11.0

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