urbanopt-cli 0.8.3 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (649) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -6
  3. data/CHANGELOG.md +14 -0
  4. data/CMakeLists.txt +7 -7
  5. data/Gemfile +3 -1
  6. data/README.md +9 -0
  7. data/example_files/Gemfile +23 -16
  8. data/example_files/Gemfile.lock +177 -0
  9. data/example_files/base_workflow_res.osw +57 -14
  10. data/example_files/class_project_coincident.json +1322 -0
  11. data/example_files/class_project_diverse.json +1322 -0
  12. data/example_files/disco/config.json +42 -0
  13. data/example_files/disco/cost_database.xlsx +0 -0
  14. data/example_files/disco/technical_catalog.json +12126 -0
  15. data/example_files/mappers/Baseline.rb +10 -7
  16. data/example_files/mappers/ChilledWaterStorage.rb +98 -0
  17. data/example_files/mappers/ClassProject.rb +110 -0
  18. data/example_files/mappers/CreateBar.rb +1 -0
  19. data/example_files/mappers/HighEfficiency.rb +13 -11
  20. data/example_files/mappers/PeakHoursMelsShedding.rb +72 -0
  21. data/example_files/mappers/PeakHoursThermostatAdjust.rb +78 -0
  22. data/example_files/mappers/ThermalStorage.rb +1 -0
  23. data/example_files/mappers/base_workflow.osw +55 -14
  24. data/example_files/mappers/class_project_workflow.osw +328 -0
  25. data/example_files/mappers/createbar_workflow.osw +16 -16
  26. data/example_files/measures/BuildResidentialModel/measure.rb +7 -1
  27. data/example_files/measures/BuildResidentialModel/measure.xml +1313 -706
  28. data/example_files/opendss/electrical_database.json +1446 -1446
  29. data/example_files/python_deps/dependencies.json +5 -0
  30. data/example_files/python_deps/install_python.ps1 +96 -0
  31. data/example_files/python_deps/install_python.sh +120 -0
  32. data/example_files/residential/clothes_dryer.tsv +11 -11
  33. data/example_files/residential/clothes_washer.tsv +3 -3
  34. data/example_files/residential/dishwasher.tsv +3 -3
  35. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +0 -1
  36. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +8 -21
  37. data/example_files/resources/hpxml-measures/.gitignore +2 -0
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1272 -1094
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +978 -659
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +52 -74
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +77 -140
  42. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +30 -27
  43. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +32 -13
  44. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +55 -51
  45. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +89 -16
  46. data/example_files/resources/hpxml-measures/Changelog.md +65 -0
  47. data/example_files/resources/hpxml-measures/Gemfile +2 -4
  48. data/example_files/resources/hpxml-measures/Gemfile.lock +2 -13
  49. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +276 -300
  50. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +221 -215
  51. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +215 -170
  52. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +108 -16
  53. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +24 -44
  54. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +564 -197
  55. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/cambium/README.md +8 -8
  56. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  57. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +7 -55
  58. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +24 -19
  59. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +541 -211
  60. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +300 -172
  61. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +0 -2
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +230 -141
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +145 -137
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +191 -97
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/iso-schematron.xsd +391 -0
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +194 -198
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +140 -145
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +11 -11
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +33 -1
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +4 -4
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -9
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +14 -12
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +39 -17
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +1 -1
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/battery.csv +8761 -0
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +114 -57
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +1 -0
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +148 -0
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +85 -127
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +26 -32
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +2 -14
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +67 -0
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +117 -56
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +141 -14
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +453 -344
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +124 -20
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +1 -1
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +28 -32
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +172 -79
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +54 -8
  92. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -3
  93. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +4 -4
  94. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +7 -7
  95. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +1 -1
  96. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +6 -9
  97. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +8 -8
  98. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +213 -95
  99. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +1 -10
  100. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +76 -0
  101. data/example_files/resources/hpxml-measures/README.md +2 -3
  102. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +585 -287
  103. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +304 -352
  104. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +404 -279
  105. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +222 -501
  106. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +137 -200
  107. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json +649 -0
  108. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json +649 -0
  109. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json +647 -0
  110. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Annual Charge.json +8776 -0
  111. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Monthly Charge.json +8776 -0
  112. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json +8774 -0
  113. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Annual Charge.json +659 -0
  114. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Monthly Charge.json +659 -0
  115. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json +657 -0
  116. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Annual Charge.json +670 -0
  117. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Monthly Charge.json +670 -0
  118. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json +668 -0
  119. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Annual Charge.json +655 -0
  120. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Monthly Charge.json +655 -0
  121. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json +653 -0
  122. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/openei_rates.zip +0 -0
  123. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/Average_retail_price_of_electricity.csv +0 -0
  124. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/HouseholdConsumption.csv +0 -0
  125. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +0 -0
  126. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +0 -0
  127. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +0 -0
  128. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/README.md +0 -0
  129. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +506 -25
  130. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Contains Demand Charges.json +1312 -0
  131. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Fixed Charge Units.json +657 -0
  132. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Min Charge Units.json +659 -0
  133. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json +681 -0
  134. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Missing Required Fields.json +54 -0
  135. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/data.csv +8761 -0
  136. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +1006 -235
  137. data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -1
  138. data/example_files/resources/hpxml-measures/docs/source/intro.rst +0 -1
  139. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +2 -2
  140. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +461 -261
  141. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +146 -152
  142. data/example_files/resources/hpxml-measures/tasks.rb +616 -802
  143. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +19 -11
  144. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +20 -12
  145. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +12 -7
  146. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +12 -7
  147. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +19 -11
  148. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +12 -7
  149. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +20 -12
  150. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +28 -16
  151. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +28 -17
  152. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +28 -16
  153. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +20 -12
  154. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +20 -12
  155. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +20 -12
  156. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +20 -12
  157. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +20 -12
  158. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +22 -12
  159. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +19 -11
  160. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +20 -12
  161. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +13 -7
  162. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +12 -7
  163. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +31 -16
  164. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +22 -12
  165. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +21 -12
  166. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +37 -22
  167. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +24 -12
  168. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +33 -21
  169. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +28 -16
  170. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +28 -16
  171. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +30 -17
  172. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +10 -7
  173. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +22 -11
  174. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +12 -7
  175. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +18 -12
  176. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +25 -16
  177. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +22 -12
  178. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +20 -12
  179. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +26 -17
  180. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +19 -11
  181. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +25 -16
  182. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +20 -12
  183. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +35 -21
  184. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +28 -17
  185. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +20 -12
  186. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +35 -21
  187. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +20 -12
  188. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +20 -13
  189. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +12 -9
  190. data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +25 -14
  191. data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +10 -7
  192. data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +20 -11
  193. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +91 -88
  194. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +18 -7
  195. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +546 -535
  196. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +546 -535
  197. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +555 -544
  198. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +18 -7
  199. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +18 -7
  200. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +18 -7
  201. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +18 -7
  202. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +580 -569
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +18 -7
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +580 -569
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +18 -7
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +18 -7
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +7 -0
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +17 -6
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +7 -0
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +18 -7
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +18 -7
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +18 -7
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +600 -0
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +598 -587
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +494 -485
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +606 -593
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +494 -485
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +494 -485
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +494 -485
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-calctype-operational.xml +480 -471
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +464 -457
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +496 -487
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +466 -459
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +518 -509
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +513 -504
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +445 -438
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +476 -467
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +443 -436
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +446 -439
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +494 -485
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +445 -438
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +476 -467
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +446 -439
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +494 -485
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +489 -480
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +499 -490
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +491 -482
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +510 -0
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +495 -486
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +709 -695
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +528 -519
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +512 -503
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +504 -495
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +497 -488
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +490 -481
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +487 -478
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-2stories.xml +639 -628
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-atticroof-cathedral.xml +587 -580
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +639 -628
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-defaults.xml +539 -528
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon.xml +644 -633
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon2.xml +644 -633
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational.xml +575 -564
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +16 -7
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +16 -7
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +18 -7
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +585 -574
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +18 -7
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +18 -7
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +18 -7
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +18 -7
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +18 -7
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +536 -0
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +16 -7
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +16 -7
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +20 -8
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +16 -7
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +16 -7
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +18 -7
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +18 -7
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +18 -7
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +16 -7
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +18 -7
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +16 -7
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +18 -7
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +19 -8
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +19 -8
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +19 -8
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +19 -8
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +19 -8
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +18 -7
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +18 -7
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +18 -7
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +18 -7
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +18 -7
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +18 -7
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +18 -7
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +582 -571
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +583 -572
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +18 -7
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +584 -573
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +584 -573
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +18 -7
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +583 -572
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +585 -574
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +18 -7
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +582 -571
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +18 -7
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +18 -7
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +18 -7
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +586 -575
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +585 -574
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +18 -7
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +18 -7
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +580 -569
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +18 -7
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +580 -569
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +18 -7
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +580 -569
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +18 -7
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +18 -7
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +18 -7
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +18 -7
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +28 -11
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +20 -7
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +18 -7
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +18 -7
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +18 -7
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +18 -7
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +607 -0
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +550 -0
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +27 -12
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +18 -7
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +18 -7
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +18 -7
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +18 -7
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +18 -7
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +589 -578
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +18 -7
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +18 -7
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +619 -608
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +620 -609
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +618 -607
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +18 -7
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +537 -526
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +90 -43
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2507 -2460
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +595 -584
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -8
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +584 -0
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +18 -7
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +594 -583
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +597 -586
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +598 -587
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +27 -12
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +671 -656
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -7
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +18 -7
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-foundation-conditioned-basement-wall-interior-insulation.xml → base-foundation-conditioned-basement-wall-insulation.xml} +585 -574
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +582 -571
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +35 -16
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +18 -7
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +27 -12
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +27 -12
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +27 -12
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +27 -12
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +27 -12
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +27 -12
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +18 -7
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml +586 -575
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +580 -569
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +583 -0
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +18 -7
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +18 -7
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +600 -589
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +599 -588
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +629 -616
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +18 -7
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +579 -568
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +581 -570
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +581 -570
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload-miami-fl.xml +582 -0
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +581 -570
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +581 -570
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +581 -570
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +581 -570
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +598 -587
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +628 -615
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml +581 -570
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml +581 -570
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +581 -570
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +535 -526
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +589 -578
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +536 -527
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +18 -7
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +565 -554
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +565 -554
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +582 -571
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +582 -571
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +582 -571
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +526 -517
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +573 -562
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +529 -520
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +565 -554
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +580 -569
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +580 -569
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +565 -554
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +578 -567
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +575 -564
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +581 -570
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +583 -572
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +583 -572
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +583 -572
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +18 -7
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +580 -569
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +580 -569
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +580 -569
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +551 -542
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +532 -530
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +525 -516
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +541 -532
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +541 -532
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +541 -532
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +525 -516
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +533 -0
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +542 -0
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +542 -0
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +542 -0
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +529 -520
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +529 -520
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +580 -569
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +16 -7
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +16 -7
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +18 -7
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +16 -7
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +16 -7
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +16 -7
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +16 -7
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +567 -0
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +18 -7
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +18 -7
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +18 -7
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +16 -7
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +18 -7
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +18 -7
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +18 -7
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +18 -7
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +611 -598
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +589 -0
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +582 -571
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +18 -7
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +16 -7
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +18 -7
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +17 -7
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +16 -7
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +530 -521
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +530 -521
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +530 -521
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +566 -555
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +18 -7
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +18 -7
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +18 -7
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +18 -7
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +566 -555
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +566 -555
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +18 -7
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +18 -7
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +18 -7
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +18 -7
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +16 -7
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +574 -563
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +581 -570
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +583 -572
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +587 -576
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +587 -576
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +587 -576
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +591 -580
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +591 -580
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +591 -580
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +570 -559
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +586 -575
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +570 -559
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +586 -575
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +18 -7
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +16 -7
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +18 -7
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +552 -543
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -7
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +963 -938
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +33 -69
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +530 -521
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +535 -0
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-ptac-with-heating.xml → base-hvac-ptac-with-heating-natural-gas.xml} +23 -21
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +526 -517
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +541 -532
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +16 -7
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +526 -517
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +526 -517
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +16 -7
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +535 -0
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +542 -0
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +594 -583
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +586 -575
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +18 -7
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +18 -7
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +530 -521
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +530 -521
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +18 -7
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +18 -7
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +530 -521
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +18 -7
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +18 -7
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +18 -7
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +18 -7
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +27 -12
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +591 -576
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +18 -7
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +27 -12
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +582 -571
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +537 -526
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +18 -7
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +537 -526
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +601 -586
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +18 -7
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +18 -7
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +601 -587
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +19 -7
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +20 -7
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +607 -0
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +607 -0
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +21 -7
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +18 -7
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +18 -7
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +18 -7
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +18 -7
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +18 -7
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +18 -7
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +37 -19
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +18 -7
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +18 -7
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +590 -579
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +578 -0
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +632 -0
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +614 -0
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +677 -0
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +593 -0
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +27 -9
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +676 -665
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +616 -0
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +615 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +598 -587
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +586 -0
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +18 -7
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +18 -7
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +18 -7
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +18 -7
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +583 -572
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +18 -7
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1700 -1677
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +622 -611
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +697 -682
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-pv-battery-lifetime-model.xml → base-pv-battery-round-trip-efficiency.xml} +20 -11
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +624 -0
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +622 -611
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +640 -0
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +639 -0
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +623 -0
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +606 -595
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +582 -571
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-smooth.xml +583 -572
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +584 -0
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +583 -572
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +583 -572
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +581 -570
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +581 -570
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +581 -570
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +636 -625
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +18 -7
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +27 -14
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +21 -10
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +21 -10
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-operating-modes.xml → base-simcontrol-temperature-capacitance-multiplier.xml} +25 -13
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +584 -0
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +584 -0
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +18 -7
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-setpoints.xml → base-simcontrol-timestep-30-mins.xml} +25 -14
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +18 -7
  588. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +18 -13
  589. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +12 -7
  590. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +8 -24
  591. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +366 -358
  592. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +369 -361
  593. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +369 -361
  594. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +369 -361
  595. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +369 -361
  596. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +369 -361
  597. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +369 -361
  598. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +369 -361
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +311 -303
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +311 -303
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +327 -319
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +327 -319
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +332 -324
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +332 -324
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +341 -333
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +341 -333
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +369 -361
  608. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +369 -361
  609. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +369 -361
  610. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +369 -361
  611. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +369 -361
  612. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +369 -361
  613. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +383 -379
  614. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +383 -379
  615. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +538 -534
  616. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +550 -546
  617. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +444 -410
  618. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +8 -8
  619. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +444 -410
  620. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +18 -4
  621. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +133 -288
  622. data/example_files/scripts/convert_urbanopt_to_disco.py +130 -0
  623. data/example_files/scripts/default_control_changes.csv +8 -0
  624. data/example_files/scripts/default_voltage_regulators.csv +3 -0
  625. data/example_files/scripts/read_data.py +331 -0
  626. data/example_files/visualization/input_visualization_feature.html +172 -81
  627. data/example_files/visualization/input_visualization_scenario.html +178 -82
  628. data/example_files/xml_building/17/README.md +2 -2
  629. data/example_files/xml_building/17/unit 1.xml +40 -41
  630. data/example_files/xml_building/17/unit 2.xml +35 -36
  631. data/example_files/xml_building/17/unit 3.xml +35 -36
  632. data/example_files/xml_building/17/unit 4.xml +41 -42
  633. data/lib/uo_cli/version.rb +1 -1
  634. data/lib/uo_cli.rb +596 -96
  635. data/uo_cli.gemspec +6 -5
  636. metadata +121 -36
  637. data/example_files/residential/exhaust.tsv +0 -3
  638. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
  639. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
  640. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
  641. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
  642. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
  643. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
  644. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
  645. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
  646. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
  647. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
  648. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
  649. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +0 -410
@@ -6,8 +6,20 @@ require 'openstudio/measure/ShowRunnerOutput'
6
6
  require 'fileutils'
7
7
  require 'csv'
8
8
  require_relative '../measure.rb'
9
+ require_relative '../../HPXMLtoOpenStudio/resources/xmlhelper.rb'
10
+ require_relative '../../HPXMLtoOpenStudio/resources/constants.rb'
11
+ require_relative '../../HPXMLtoOpenStudio/resources/version.rb'
12
+ require 'oga'
9
13
 
10
14
  class ReportSimulationOutputTest < MiniTest::Test
15
+ def setup
16
+ @tmp_hpxml_path = File.join(File.dirname(__FILE__), 'tmp.xml')
17
+ end
18
+
19
+ def teardown
20
+ File.delete(@tmp_hpxml_path) if File.exist? @tmp_hpxml_path
21
+ end
22
+
11
23
  AnnualRows = [
12
24
  'Energy Use: Total (MBtu)',
13
25
  'Energy Use: Net (MBtu)',
@@ -52,6 +64,7 @@ class ReportSimulationOutputTest < MiniTest::Test
52
64
  'End Use: Electricity: Hot Tub Pump (MBtu)',
53
65
  'End Use: Electricity: PV (MBtu)',
54
66
  'End Use: Electricity: Generator (MBtu)',
67
+ 'End Use: Electricity: Battery (MBtu)',
55
68
  'End Use: Natural Gas: Heating (MBtu)',
56
69
  'End Use: Natural Gas: Heating Heat Pump Backup (MBtu)',
57
70
  'End Use: Natural Gas: Hot Water (MBtu)',
@@ -124,8 +137,8 @@ class ReportSimulationOutputTest < MiniTest::Test
124
137
  'Unmet Hours: Cooling (hr)',
125
138
  'Peak Electricity: Winter Total (W)',
126
139
  'Peak Electricity: Summer Total (W)',
127
- 'Peak Load: Heating: Delivered (kBtu)',
128
- 'Peak Load: Cooling: Delivered (kBtu)',
140
+ 'Peak Load: Heating: Delivered (kBtu/hr)',
141
+ 'Peak Load: Cooling: Delivered (kBtu/hr)',
129
142
  'Component Load: Heating: Roofs (MBtu)',
130
143
  'Component Load: Heating: Ceilings (MBtu)',
131
144
  'Component Load: Heating: Walls (MBtu)',
@@ -164,6 +177,38 @@ class ReportSimulationOutputTest < MiniTest::Test
164
177
  'Hot Water: Dishwasher (gal)',
165
178
  'Hot Water: Fixtures (gal)',
166
179
  'Hot Water: Distribution Waste (gal)',
180
+ 'HVAC Capacity: Cooling (Btu/h)',
181
+ 'HVAC Capacity: Heating (Btu/h)',
182
+ 'HVAC Capacity: Heat Pump Backup (Btu/h)',
183
+ 'HVAC Design Temperature: Heating (F)',
184
+ 'HVAC Design Temperature: Cooling (F)',
185
+ 'HVAC Design Load: Heating: Total (Btu/h)',
186
+ 'HVAC Design Load: Heating: Ducts (Btu/h)',
187
+ 'HVAC Design Load: Heating: Windows (Btu/h)',
188
+ 'HVAC Design Load: Heating: Skylights (Btu/h)',
189
+ 'HVAC Design Load: Heating: Doors (Btu/h)',
190
+ 'HVAC Design Load: Heating: Walls (Btu/h)',
191
+ 'HVAC Design Load: Heating: Roofs (Btu/h)',
192
+ 'HVAC Design Load: Heating: Floors (Btu/h)',
193
+ 'HVAC Design Load: Heating: Slabs (Btu/h)',
194
+ 'HVAC Design Load: Heating: Ceilings (Btu/h)',
195
+ 'HVAC Design Load: Heating: Infiltration/Ventilation (Btu/h)',
196
+ 'HVAC Design Load: Cooling Sensible: Total (Btu/h)',
197
+ 'HVAC Design Load: Cooling Sensible: Ducts (Btu/h)',
198
+ 'HVAC Design Load: Cooling Sensible: Windows (Btu/h)',
199
+ 'HVAC Design Load: Cooling Sensible: Skylights (Btu/h)',
200
+ 'HVAC Design Load: Cooling Sensible: Doors (Btu/h)',
201
+ 'HVAC Design Load: Cooling Sensible: Walls (Btu/h)',
202
+ 'HVAC Design Load: Cooling Sensible: Roofs (Btu/h)',
203
+ 'HVAC Design Load: Cooling Sensible: Floors (Btu/h)',
204
+ 'HVAC Design Load: Cooling Sensible: Slabs (Btu/h)',
205
+ 'HVAC Design Load: Cooling Sensible: Ceilings (Btu/h)',
206
+ 'HVAC Design Load: Cooling Sensible: Infiltration/Ventilation (Btu/h)',
207
+ 'HVAC Design Load: Cooling Sensible: Internal Gains (Btu/h)',
208
+ 'HVAC Design Load: Cooling Latent: Total (Btu/h)',
209
+ 'HVAC Design Load: Cooling Latent: Ducts (Btu/h)',
210
+ 'HVAC Design Load: Cooling Latent: Infiltration/Ventilation (Btu/h)',
211
+ 'HVAC Design Load: Cooling Latent: Internal Gains (Btu/h)'
167
212
  ]
168
213
 
169
214
  BaseHPXMLTimeseriesColsEnergy = [
@@ -233,9 +278,16 @@ class ReportSimulationOutputTest < MiniTest::Test
233
278
  'Component Load: Heating: Windows',
234
279
  ]
235
280
 
281
+ BaseHPXMLTimeseriesColsUnmetHours = [
282
+ 'Unmet Hours: Heating',
283
+ 'Unmet Hours: Cooling',
284
+ ]
285
+
236
286
  BaseHPXMLTimeseriesColsZoneTemps = [
237
287
  'Temperature: Attic - Unvented',
238
288
  'Temperature: Living Space',
289
+ 'Temperature: Heating Setpoint',
290
+ 'Temperature: Cooling Setpoint',
239
291
  ]
240
292
 
241
293
  BaseHPXMLTimeseriesColsAirflows = [
@@ -261,13 +313,11 @@ class ReportSimulationOutputTest < MiniTest::Test
261
313
  BaseHPXMLTimeseriesColsAdvancedOutputVariables = [
262
314
  'Surface Construction Index: Door1',
263
315
  'Surface Construction Index: Foundationwall1',
264
- 'Surface Construction Index: Framefloor1',
265
- 'Surface Construction Index: Furniture Mass Living Space 1 Above Grade',
266
- 'Surface Construction Index: Furniture Mass Living Space 1 Below Grade',
316
+ 'Surface Construction Index: Floor1',
317
+ 'Surface Construction Index: Furniture Mass Living Space 1',
267
318
  'Surface Construction Index: Inferred Conditioned Ceiling',
268
319
  'Surface Construction Index: Inferred Conditioned Floor',
269
- 'Surface Construction Index: Partition Wall Mass Above Grade',
270
- 'Surface Construction Index: Partition Wall Mass Below Grade',
320
+ 'Surface Construction Index: Partition Wall Mass',
271
321
  'Surface Construction Index: Rimjoist1:0',
272
322
  'Surface Construction Index: Rimjoist1:90',
273
323
  'Surface Construction Index: Rimjoist1:180',
@@ -303,176 +353,105 @@ class ReportSimulationOutputTest < MiniTest::Test
303
353
  'Surface Construction Index: Window4'
304
354
  ]
305
355
 
306
- ERIRows = [
307
- 'hpxml_heat_sys_ids',
308
- 'hpxml_cool_sys_ids',
309
- 'hpxml_dhw_sys_ids',
310
- 'hpxml_vent_preheat_sys_ids',
311
- 'hpxml_vent_precool_sys_ids',
312
- 'hpxml_eec_heats',
313
- 'hpxml_eec_cools',
314
- 'hpxml_eec_dhws',
315
- 'hpxml_eec_vent_preheats',
316
- 'hpxml_eec_vent_precools',
317
- 'hpxml_heat_fuels',
318
- 'hpxml_dwh_fuels',
319
- 'hpxml_vent_preheat_fuels',
320
- 'fuelElectricity',
321
- 'fuelNaturalGas',
322
- 'fuelFuelOil',
323
- 'fuelPropane',
324
- 'fuelWoodCord',
325
- 'fuelWoodPellets',
326
- 'fuelCoal',
327
- 'enduseElectricityHeating',
328
- 'enduseElectricityHeatingFansPumps',
329
- 'enduseElectricityCooling',
330
- 'enduseElectricityCoolingFansPumps',
331
- 'enduseElectricityHotWater',
332
- 'enduseElectricityHotWaterRecircPump',
333
- 'enduseElectricityHotWaterSolarThermalPump',
334
- 'enduseElectricityLightingInterior',
335
- 'enduseElectricityLightingGarage',
336
- 'enduseElectricityLightingExterior',
337
- 'enduseElectricityMechVent',
338
- 'enduseElectricityMechVentPreheating',
339
- 'enduseElectricityMechVentPrecooling',
340
- 'enduseElectricityWholeHouseFan',
341
- 'enduseElectricityRefrigerator',
342
- 'enduseElectricityDehumidifier',
343
- 'enduseElectricityDishwasher',
344
- 'enduseElectricityClothesWasher',
345
- 'enduseElectricityClothesDryer',
346
- 'enduseElectricityRangeOven',
347
- 'enduseElectricityCeilingFan',
348
- 'enduseElectricityTelevision',
349
- 'enduseElectricityPlugLoads',
350
- 'enduseElectricityPV',
351
- 'enduseElectricityGenerator',
352
- 'enduseNaturalGasHeating',
353
- 'enduseNaturalGasHotWater',
354
- 'enduseNaturalGasClothesDryer',
355
- 'enduseNaturalGasRangeOven',
356
- 'enduseNaturalGasMechVentPreheating',
357
- 'enduseNaturalGasGenerator',
358
- 'enduseFuelOilHeating',
359
- 'enduseFuelOilHotWater',
360
- 'enduseFuelOilClothesDryer',
361
- 'enduseFuelOilRangeOven',
362
- 'enduseFuelOilMechVentPreheating',
363
- 'enduseFuelOilGenerator',
364
- 'endusePropaneHeating',
365
- 'endusePropaneHotWater',
366
- 'endusePropaneClothesDryer',
367
- 'endusePropaneRangeOven',
368
- 'endusePropaneMechVentPreheating',
369
- 'endusePropaneGenerator',
370
- 'enduseWoodCordHeating',
371
- 'enduseWoodCordHotWater',
372
- 'enduseWoodCordClothesDryer',
373
- 'enduseWoodCordRangeOven',
374
- 'enduseWoodCordMechVentPreheating',
375
- 'enduseWoodCordGenerator',
376
- 'enduseWoodPelletsHeating',
377
- 'enduseWoodPelletsHotWater',
378
- 'enduseWoodPelletsClothesDryer',
379
- 'enduseWoodPelletsRangeOven',
380
- 'enduseWoodPelletsMechVentPreheating',
381
- 'enduseWoodPelletsGenerator',
382
- 'enduseCoalHeating',
383
- 'enduseCoalHotWater',
384
- 'enduseCoalClothesDryer',
385
- 'enduseCoalRangeOven',
386
- 'enduseCoalMechVentPreheating',
387
- 'enduseCoalGenerator',
388
- 'loadHeatingDelivered',
389
- 'loadCoolingDelivered',
390
- 'loadHotWaterDelivered',
391
- 'co2eCambiumHourlyMidCaseLRMERRMPATotal',
392
- 'co2eCambiumHourlyMidCaseLRMERRMPAElectricity',
393
- 'co2eCambiumHourlyMidCaseLRMERRMPANaturalGas',
394
- 'co2eCambiumHourlyMidCaseLRMERRMPAFuelOil',
395
- 'co2eCambiumHourlyMidCaseLRMERRMPAPropane',
396
- 'co2eCambiumHourlyMidCaseLRMERRMPAWoodCord',
397
- 'co2eCambiumHourlyMidCaseLRMERRMPAWoodPellets',
398
- 'co2eCambiumHourlyMidCaseLRMERRMPACoal',
399
- 'co2eCambiumHourlyLowRECostsLRMERRMPATotal',
400
- 'co2eCambiumHourlyLowRECostsLRMERRMPAElectricity',
401
- 'co2eCambiumHourlyLowRECostsLRMERRMPANaturalGas',
402
- 'co2eCambiumHourlyLowRECostsLRMERRMPAFuelOil',
403
- 'co2eCambiumHourlyLowRECostsLRMERRMPAPropane',
404
- 'co2eCambiumHourlyLowRECostsLRMERRMPAWoodCord',
405
- 'co2eCambiumHourlyLowRECostsLRMERRMPAWoodPellets',
406
- 'co2eCambiumHourlyLowRECostsLRMERRMPACoal',
407
- 'co2eCambiumAnnualMidCaseAERNationalTotal',
408
- 'co2eCambiumAnnualMidCaseAERNationalElectricity',
409
- 'co2eCambiumAnnualMidCaseAERNationalNaturalGas',
410
- 'co2eCambiumAnnualMidCaseAERNationalFuelOil',
411
- 'co2eCambiumAnnualMidCaseAERNationalPropane',
412
- 'co2eCambiumAnnualMidCaseAERNationalWoodCord',
413
- 'co2eCambiumAnnualMidCaseAERNationalWoodPellets',
414
- 'co2eCambiumAnnualMidCaseAERNationalCoal',
415
- 'so2eGRIDRMPATotal',
416
- 'so2eGRIDRMPAElectricity',
417
- 'so2eGRIDRMPANaturalGas',
418
- 'so2eGRIDRMPAFuelOil',
419
- 'so2eGRIDRMPAPropane',
420
- 'so2eGRIDRMPAWoodCord',
421
- 'so2eGRIDRMPAWoodPellets',
422
- 'so2eGRIDRMPACoal',
423
- 'noxeGRIDRMPATotal',
424
- 'noxeGRIDRMPAElectricity',
425
- 'noxeGRIDRMPANaturalGas',
426
- 'noxeGRIDRMPAFuelOil',
427
- 'noxeGRIDRMPAPropane',
428
- 'noxeGRIDRMPAWoodCord',
429
- 'noxeGRIDRMPAWoodPellets',
430
- 'noxeGRIDRMPACoal',
431
- 'hpxml_cfa',
432
- 'hpxml_nbr',
433
- 'hpxml_nst',
434
- 'hpxml_residential_facility_type',
435
- ]
436
-
437
356
  def all_base_hpxml_timeseries_cols
438
357
  return (BaseHPXMLTimeseriesColsEnergy +
439
358
  BaseHPXMLTimeseriesColsFuels +
440
359
  BaseHPXMLTimeseriesColsEndUses +
441
360
  BaseHPXMLTimeseriesColsWaterUses +
442
361
  BaseHPXMLTimeseriesColsTotalLoads +
362
+ BaseHPXMLTimeseriesColsUnmetHours +
443
363
  BaseHPXMLTimeseriesColsZoneTemps +
444
364
  BaseHPXMLTimeseriesColsAirflows +
445
365
  BaseHPXMLTimeseriesColsWeather)
446
366
  end
447
367
 
368
+ def emission_scenarios
369
+ return ['CO2e: Cambium Hourly MidCase LRMER RMPA',
370
+ 'CO2e: Cambium Hourly LowRECosts LRMER RMPA',
371
+ 'CO2e: Cambium Annual MidCase AER National',
372
+ 'SO2: eGRID RMPA',
373
+ 'NOx: eGRID RMPA']
374
+ end
375
+
376
+ def emission_annual_cols
377
+ cols = []
378
+ emission_scenarios.each do |scenario|
379
+ cols += ["Emissions: #{scenario}: Total (lb)",
380
+ "Emissions: #{scenario}: Electricity: Total (lb)",
381
+ "Emissions: #{scenario}: Electricity: Heating Fans/Pumps (lb)",
382
+ "Emissions: #{scenario}: Electricity: Cooling (lb)",
383
+ "Emissions: #{scenario}: Electricity: Cooling Fans/Pumps (lb)",
384
+ "Emissions: #{scenario}: Electricity: Hot Water (lb)",
385
+ "Emissions: #{scenario}: Electricity: Lighting Interior (lb)",
386
+ "Emissions: #{scenario}: Electricity: Lighting Exterior (lb)",
387
+ "Emissions: #{scenario}: Electricity: Refrigerator (lb)",
388
+ "Emissions: #{scenario}: Electricity: Dishwasher (lb)",
389
+ "Emissions: #{scenario}: Electricity: Clothes Washer (lb)",
390
+ "Emissions: #{scenario}: Electricity: Clothes Dryer (lb)",
391
+ "Emissions: #{scenario}: Electricity: Range/Oven (lb)",
392
+ "Emissions: #{scenario}: Electricity: Television (lb)",
393
+ "Emissions: #{scenario}: Electricity: Plug Loads (lb)",
394
+ "Emissions: #{scenario}: Electricity: PV (lb)",
395
+ "Emissions: #{scenario}: Electricity: Battery (lb)",
396
+ "Emissions: #{scenario}: Natural Gas: Total (lb)",
397
+ "Emissions: #{scenario}: Natural Gas: Heating (lb)"]
398
+ end
399
+ return cols
400
+ end
401
+
448
402
  def emissions_timeseries_cols
449
- return ['Emissions: CO2e: Cambium Hourly MidCase LRMER RMPA: Total',
450
- 'Emissions: CO2e: Cambium Hourly MidCase LRMER RMPA: Electricity',
451
- 'Emissions: CO2e: Cambium Hourly MidCase LRMER RMPA: Natural Gas',
452
- 'Emissions: CO2e: Cambium Hourly LowRECosts LRMER RMPA: Total',
453
- 'Emissions: CO2e: Cambium Hourly LowRECosts LRMER RMPA: Electricity',
454
- 'Emissions: CO2e: Cambium Hourly LowRECosts LRMER RMPA: Natural Gas',
455
- 'Emissions: CO2e: Cambium Annual MidCase AER National: Total',
456
- 'Emissions: CO2e: Cambium Annual MidCase AER National: Electricity',
457
- 'Emissions: CO2e: Cambium Annual MidCase AER National: Natural Gas',
458
- 'Emissions: SO2: eGRID RMPA: Total',
459
- 'Emissions: SO2: eGRID RMPA: Electricity',
460
- 'Emissions: SO2: eGRID RMPA: Natural Gas',
461
- 'Emissions: NOx: eGRID RMPA: Total',
462
- 'Emissions: NOx: eGRID RMPA: Electricity',
463
- 'Emissions: NOx: eGRID RMPA: Natural Gas']
403
+ cols = []
404
+ emission_scenarios.each do |scenario|
405
+ cols += ["Emissions: #{scenario}: Total"]
406
+ end
407
+ return cols
408
+ end
409
+
410
+ def emission_fuels_timeseries_cols
411
+ cols = []
412
+ emission_scenarios.each do |scenario|
413
+ cols += ["Emissions: #{scenario}: Electricity: Total",
414
+ "Emissions: #{scenario}: Natural Gas: Total"]
415
+ end
416
+ return cols
417
+ end
418
+
419
+ def emission_end_uses_timeseries_cols
420
+ cols = []
421
+ emission_scenarios.each do |scenario|
422
+ cols += ["Emissions: #{scenario}: Electricity: Heating Fans/Pumps",
423
+ "Emissions: #{scenario}: Electricity: Cooling",
424
+ "Emissions: #{scenario}: Electricity: Cooling Fans/Pumps",
425
+ "Emissions: #{scenario}: Electricity: Hot Water",
426
+ "Emissions: #{scenario}: Electricity: Lighting Interior",
427
+ "Emissions: #{scenario}: Electricity: Lighting Exterior",
428
+ "Emissions: #{scenario}: Electricity: Refrigerator",
429
+ "Emissions: #{scenario}: Electricity: Dishwasher",
430
+ "Emissions: #{scenario}: Electricity: Clothes Washer",
431
+ "Emissions: #{scenario}: Electricity: Clothes Dryer",
432
+ "Emissions: #{scenario}: Electricity: Range/Oven",
433
+ "Emissions: #{scenario}: Electricity: Television",
434
+ "Emissions: #{scenario}: Electricity: Plug Loads",
435
+ "Emissions: #{scenario}: Electricity: PV",
436
+ "Emissions: #{scenario}: Electricity: Battery",
437
+ "Emissions: #{scenario}: Natural Gas: Heating"]
438
+ end
439
+ return cols
464
440
  end
465
441
 
466
442
  def test_annual_only
467
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
443
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
468
444
  'add_component_loads' => true,
469
445
  'timeseries_frequency' => 'hourly',
470
446
  'include_timeseries_total_consumptions' => false,
471
447
  'include_timeseries_fuel_consumptions' => false,
472
448
  'include_timeseries_end_use_consumptions' => false,
473
449
  'include_timeseries_emissions' => false,
450
+ 'include_timeseries_emission_fuels' => false,
451
+ 'include_timeseries_emission_end_uses' => false,
474
452
  'include_timeseries_hot_water_uses' => false,
475
453
  'include_timeseries_total_loads' => false,
454
+ 'include_timeseries_unmet_hours' => false,
476
455
  'include_timeseries_component_loads' => false,
477
456
  'include_timeseries_zone_temperatures' => false,
478
457
  'include_timeseries_airflows' => false,
@@ -481,20 +460,24 @@ class ReportSimulationOutputTest < MiniTest::Test
481
460
  assert(File.exist?(annual_csv))
482
461
  assert(!File.exist?(timeseries_csv))
483
462
  expected_annual_rows = AnnualRows
484
- actual_annual_rows = File.readlines(annual_csv).map { |x| x.split(',')[0].strip }.select { |x| !x.empty? }
485
- assert_equal(expected_annual_rows.sort, actual_annual_rows.sort)
463
+ actual_annual_rows = _get_actual_annual_rows(annual_csv)
464
+ assert_equal(expected_annual_rows.sort, actual_annual_rows.keys.sort)
465
+ _check_for_runner_registered_values(File.join(File.dirname(annual_csv), 'results.json'), actual_annual_rows)
486
466
  end
487
467
 
488
468
  def test_annual_only2
489
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
469
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-misc-emissions.xml'),
490
470
  'add_component_loads' => true,
491
471
  'timeseries_frequency' => 'none',
492
472
  'include_timeseries_total_consumptions' => false,
493
473
  'include_timeseries_fuel_consumptions' => true,
494
474
  'include_timeseries_end_use_consumptions' => true,
495
475
  'include_timeseries_emissions' => true,
476
+ 'include_timeseries_emission_fuels' => true,
477
+ 'include_timeseries_emission_end_uses' => true,
496
478
  'include_timeseries_hot_water_uses' => true,
497
479
  'include_timeseries_total_loads' => true,
480
+ 'include_timeseries_unmet_hours' => true,
498
481
  'include_timeseries_component_loads' => true,
499
482
  'include_timeseries_zone_temperatures' => true,
500
483
  'include_timeseries_airflows' => true,
@@ -502,13 +485,14 @@ class ReportSimulationOutputTest < MiniTest::Test
502
485
  annual_csv, timeseries_csv = _test_measure(args_hash)
503
486
  assert(File.exist?(annual_csv))
504
487
  assert(!File.exist?(timeseries_csv))
505
- expected_annual_rows = AnnualRows
506
- actual_annual_rows = File.readlines(annual_csv).map { |x| x.split(',')[0].strip }.select { |x| !x.empty? }
507
- assert_equal(expected_annual_rows.sort, actual_annual_rows.sort)
488
+ expected_annual_rows = AnnualRows + emission_annual_cols
489
+ actual_annual_rows = _get_actual_annual_rows(annual_csv)
490
+ assert_equal(expected_annual_rows.sort, actual_annual_rows.keys.sort)
491
+ _check_for_runner_registered_values(File.join(File.dirname(annual_csv), 'results.json'), actual_annual_rows)
508
492
  end
509
493
 
510
494
  def test_timeseries_hourly_total_energy
511
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
495
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
512
496
  'timeseries_frequency' => 'hourly',
513
497
  'include_timeseries_total_consumptions' => true }
514
498
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -525,7 +509,7 @@ class ReportSimulationOutputTest < MiniTest::Test
525
509
  end
526
510
 
527
511
  def test_timeseries_hourly_total_energy_pv
528
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-pv.xml',
512
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-pv.xml'),
529
513
  'timeseries_frequency' => 'hourly',
530
514
  'include_timeseries_total_consumptions' => true }
531
515
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -543,7 +527,7 @@ class ReportSimulationOutputTest < MiniTest::Test
543
527
  end
544
528
 
545
529
  def test_timeseries_hourly_fuels
546
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
530
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
547
531
  'timeseries_frequency' => 'hourly',
548
532
  'include_timeseries_fuel_consumptions' => true }
549
533
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -560,7 +544,7 @@ class ReportSimulationOutputTest < MiniTest::Test
560
544
  end
561
545
 
562
546
  def test_timeseries_hourly_fuels_pv
563
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-pv.xml',
547
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-pv.xml'),
564
548
  'timeseries_frequency' => 'hourly',
565
549
  'include_timeseries_fuel_consumptions' => true }
566
550
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -578,7 +562,7 @@ class ReportSimulationOutputTest < MiniTest::Test
578
562
  end
579
563
 
580
564
  def test_timeseries_hourly_emissions
581
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-misc-emissions.xml',
565
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-misc-emissions.xml'),
582
566
  'timeseries_frequency' => 'hourly',
583
567
  'include_timeseries_emissions' => true }
584
568
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -594,8 +578,42 @@ class ReportSimulationOutputTest < MiniTest::Test
594
578
  _check_for_nonzero_timeseries_value(timeseries_csv, emissions_timeseries_cols[0..2])
595
579
  end
596
580
 
581
+ def test_timeseries_hourly_emission_end_uses
582
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-misc-emissions.xml'),
583
+ 'timeseries_frequency' => 'hourly',
584
+ 'include_timeseries_emission_end_uses' => true }
585
+ annual_csv, timeseries_csv = _test_measure(args_hash)
586
+ assert(File.exist?(annual_csv))
587
+ assert(File.exist?(timeseries_csv))
588
+ expected_timeseries_cols = ['Time'] + emission_end_uses_timeseries_cols
589
+ actual_timeseries_cols = File.readlines(timeseries_csv)[0].strip.split(',')
590
+ assert_equal(expected_timeseries_cols.sort, actual_timeseries_cols.sort)
591
+ timeseries_rows = CSV.read(timeseries_csv)
592
+ assert_equal(8760, timeseries_rows.size - 2)
593
+ timeseries_cols = timeseries_rows.transpose
594
+ _check_for_constant_timeseries_step(timeseries_cols[0])
595
+ _check_for_nonzero_timeseries_value(timeseries_csv, emission_end_uses_timeseries_cols[0..2])
596
+ end
597
+
598
+ def test_timeseries_hourly_emission_fuels
599
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-misc-emissions.xml'),
600
+ 'timeseries_frequency' => 'hourly',
601
+ 'include_timeseries_emission_fuels' => true }
602
+ annual_csv, timeseries_csv = _test_measure(args_hash)
603
+ assert(File.exist?(annual_csv))
604
+ assert(File.exist?(timeseries_csv))
605
+ expected_timeseries_cols = ['Time'] + emission_fuels_timeseries_cols
606
+ actual_timeseries_cols = File.readlines(timeseries_csv)[0].strip.split(',')
607
+ assert_equal(expected_timeseries_cols.sort, actual_timeseries_cols.sort)
608
+ timeseries_rows = CSV.read(timeseries_csv)
609
+ assert_equal(8760, timeseries_rows.size - 2)
610
+ timeseries_cols = timeseries_rows.transpose
611
+ _check_for_constant_timeseries_step(timeseries_cols[0])
612
+ _check_for_nonzero_timeseries_value(timeseries_csv, emission_fuels_timeseries_cols[0..2])
613
+ end
614
+
597
615
  def test_timeseries_hourly_enduses
598
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
616
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
599
617
  'timeseries_frequency' => 'hourly',
600
618
  'include_timeseries_end_use_consumptions' => true }
601
619
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -612,7 +630,7 @@ class ReportSimulationOutputTest < MiniTest::Test
612
630
  end
613
631
 
614
632
  def test_timeseries_hourly_hotwateruses
615
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
633
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
616
634
  'timeseries_frequency' => 'hourly',
617
635
  'include_timeseries_hot_water_uses' => true }
618
636
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -629,7 +647,7 @@ class ReportSimulationOutputTest < MiniTest::Test
629
647
  end
630
648
 
631
649
  def test_timeseries_hourly_total_loads
632
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
650
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
633
651
  'timeseries_frequency' => 'hourly',
634
652
  'include_timeseries_total_loads' => true }
635
653
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -646,7 +664,7 @@ class ReportSimulationOutputTest < MiniTest::Test
646
664
  end
647
665
 
648
666
  def test_timeseries_hourly_component_loads
649
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
667
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
650
668
  'add_component_loads' => true,
651
669
  'timeseries_frequency' => 'hourly',
652
670
  'include_timeseries_component_loads' => true }
@@ -663,8 +681,26 @@ class ReportSimulationOutputTest < MiniTest::Test
663
681
  _check_for_nonzero_timeseries_value(timeseries_csv, ['Component Load: Heating: Internal Gains', 'Component Load: Cooling: Internal Gains'])
664
682
  end
665
683
 
684
+ def test_timeseries_hourly_unmet_hours
685
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-hvac-undersized.xml'),
686
+ 'add_component_loads' => true,
687
+ 'timeseries_frequency' => 'hourly',
688
+ 'include_timeseries_unmet_hours' => true }
689
+ annual_csv, timeseries_csv = _test_measure(args_hash)
690
+ assert(File.exist?(annual_csv))
691
+ assert(File.exist?(timeseries_csv))
692
+ expected_timeseries_cols = ['Time'] + BaseHPXMLTimeseriesColsUnmetHours
693
+ actual_timeseries_cols = File.readlines(timeseries_csv)[0].strip.split(',')
694
+ assert_equal(expected_timeseries_cols.sort, actual_timeseries_cols.sort)
695
+ timeseries_rows = CSV.read(timeseries_csv)
696
+ assert_equal(8760, timeseries_rows.size - 2)
697
+ timeseries_cols = timeseries_rows.transpose
698
+ assert_equal(1, _check_for_constant_timeseries_step(timeseries_cols[0]))
699
+ _check_for_nonzero_timeseries_value(timeseries_csv, ['Unmet Hours: Heating', 'Unmet Hours: Cooling'])
700
+ end
701
+
666
702
  def test_timeseries_hourly_zone_temperatures
667
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
703
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
668
704
  'timeseries_frequency' => 'hourly',
669
705
  'include_timeseries_zone_temperatures' => true }
670
706
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -680,8 +716,25 @@ class ReportSimulationOutputTest < MiniTest::Test
680
716
  _check_for_nonzero_timeseries_value(timeseries_csv, BaseHPXMLTimeseriesColsZoneTemps)
681
717
  end
682
718
 
719
+ def test_timeseries_hourly_zone_temperatures_without_cooling
720
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-hvac-furnace-gas-only.xml'),
721
+ 'timeseries_frequency' => 'hourly',
722
+ 'include_timeseries_zone_temperatures' => true }
723
+ annual_csv, timeseries_csv = _test_measure(args_hash)
724
+ assert(File.exist?(annual_csv))
725
+ assert(File.exist?(timeseries_csv))
726
+ expected_timeseries_cols = ['Time'] + BaseHPXMLTimeseriesColsZoneTemps - ['Temperature: Cooling Setpoint']
727
+ actual_timeseries_cols = File.readlines(timeseries_csv)[0].strip.split(',')
728
+ assert_equal(expected_timeseries_cols.sort, actual_timeseries_cols.sort)
729
+ timeseries_rows = CSV.read(timeseries_csv)
730
+ assert_equal(8760, timeseries_rows.size - 2)
731
+ timeseries_cols = timeseries_rows.transpose
732
+ assert_equal(1, _check_for_constant_timeseries_step(timeseries_cols[0]))
733
+ _check_for_nonzero_timeseries_value(timeseries_csv, BaseHPXMLTimeseriesColsZoneTemps - ['Temperature: Cooling Setpoint'])
734
+ end
735
+
683
736
  def test_timeseries_hourly_zone_temperatures_mf_space
684
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml',
737
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml'),
685
738
  'timeseries_frequency' => 'hourly',
686
739
  'include_timeseries_zone_temperatures' => true }
687
740
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -705,7 +758,7 @@ class ReportSimulationOutputTest < MiniTest::Test
705
758
  end
706
759
 
707
760
  def test_timeseries_hourly_airflows_with_exhaust_mechvent
708
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-mechvent-exhaust.xml',
761
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-mechvent-exhaust.xml'),
709
762
  'timeseries_frequency' => 'hourly',
710
763
  'include_timeseries_airflows' => true }
711
764
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -722,7 +775,7 @@ class ReportSimulationOutputTest < MiniTest::Test
722
775
  end
723
776
 
724
777
  def test_timeseries_hourly_airflows_with_whf
725
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-mechvent-whole-house-fan.xml',
778
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-mechvent-whole-house-fan.xml'),
726
779
  'timeseries_frequency' => 'hourly',
727
780
  'include_timeseries_airflows' => true }
728
781
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -741,7 +794,7 @@ class ReportSimulationOutputTest < MiniTest::Test
741
794
  end
742
795
 
743
796
  def test_timeseries_hourly_airflows_with_clothes_dryer_exhaust
744
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-appliances-gas.xml',
797
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-appliances-gas.xml'),
745
798
  'timeseries_frequency' => 'hourly',
746
799
  'include_timeseries_airflows' => true }
747
800
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -758,7 +811,7 @@ class ReportSimulationOutputTest < MiniTest::Test
758
811
  end
759
812
 
760
813
  def test_timeseries_hourly_airflows_with_balanced_mechvent
761
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-mechvent-balanced.xml',
814
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-mechvent-balanced.xml'),
762
815
  'timeseries_frequency' => 'hourly',
763
816
  'include_timeseries_airflows' => true }
764
817
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -775,7 +828,7 @@ class ReportSimulationOutputTest < MiniTest::Test
775
828
  end
776
829
 
777
830
  def test_timeseries_hourly_airflows_with_cfis
778
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-mechvent-cfis.xml',
831
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-mechvent-cfis.xml'),
779
832
  'timeseries_frequency' => 'hourly',
780
833
  'include_timeseries_airflows' => true }
781
834
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -792,7 +845,7 @@ class ReportSimulationOutputTest < MiniTest::Test
792
845
  end
793
846
 
794
847
  def test_timeseries_hourly_weather
795
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
848
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
796
849
  'timeseries_frequency' => 'hourly',
797
850
  'include_timeseries_weather' => true }
798
851
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -809,14 +862,17 @@ class ReportSimulationOutputTest < MiniTest::Test
809
862
  end
810
863
 
811
864
  def test_timeseries_hourly_ALL
812
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-misc-emissions.xml',
865
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-misc-emissions.xml'),
813
866
  'timeseries_frequency' => 'hourly',
814
867
  'include_timeseries_total_consumptions' => true,
815
868
  'include_timeseries_fuel_consumptions' => true,
816
869
  'include_timeseries_end_use_consumptions' => true,
817
870
  'include_timeseries_emissions' => true,
871
+ 'include_timeseries_emission_fuels' => true,
872
+ 'include_timeseries_emission_end_uses' => true,
818
873
  'include_timeseries_hot_water_uses' => true,
819
874
  'include_timeseries_total_loads' => true,
875
+ 'include_timeseries_unmet_hours' => true,
820
876
  'include_timeseries_component_loads' => true,
821
877
  'include_timeseries_zone_temperatures' => true,
822
878
  'include_timeseries_airflows' => true,
@@ -824,8 +880,12 @@ class ReportSimulationOutputTest < MiniTest::Test
824
880
  annual_csv, timeseries_csv = _test_measure(args_hash)
825
881
  assert(File.exist?(annual_csv))
826
882
  assert(File.exist?(timeseries_csv))
827
- expected_timeseries_cols = ['Time'] + all_base_hpxml_timeseries_cols + emissions_timeseries_cols +
828
- ['End Use: Electricity: PV', 'Energy Use: Net', 'Fuel Use: Electricity: Net']
883
+ expected_timeseries_cols = ['Time'] +
884
+ all_base_hpxml_timeseries_cols +
885
+ emissions_timeseries_cols +
886
+ emission_fuels_timeseries_cols +
887
+ emission_end_uses_timeseries_cols +
888
+ ['End Use: Electricity: PV', 'End Use: Electricity: Battery', 'Energy Use: Net', 'Fuel Use: Electricity: Net']
829
889
  actual_timeseries_cols = File.readlines(timeseries_csv)[0].strip.split(',')
830
890
  assert_equal(expected_timeseries_cols.sort, actual_timeseries_cols.sort)
831
891
  timeseries_rows = CSV.read(timeseries_csv)
@@ -837,14 +897,17 @@ class ReportSimulationOutputTest < MiniTest::Test
837
897
  end
838
898
 
839
899
  def test_timeseries_daily_ALL
840
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-misc-emissions.xml',
900
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-misc-emissions.xml'),
841
901
  'timeseries_frequency' => 'daily',
842
902
  'include_timeseries_total_consumptions' => true,
843
903
  'include_timeseries_fuel_consumptions' => true,
844
904
  'include_timeseries_end_use_consumptions' => true,
845
905
  'include_timeseries_emissions' => true,
906
+ 'include_timeseries_emission_fuels' => true,
907
+ 'include_timeseries_emission_end_uses' => true,
846
908
  'include_timeseries_hot_water_uses' => true,
847
909
  'include_timeseries_total_loads' => true,
910
+ 'include_timeseries_unmet_hours' => true,
848
911
  'include_timeseries_component_loads' => true,
849
912
  'include_timeseries_zone_temperatures' => true,
850
913
  'include_timeseries_airflows' => true,
@@ -852,8 +915,12 @@ class ReportSimulationOutputTest < MiniTest::Test
852
915
  annual_csv, timeseries_csv = _test_measure(args_hash)
853
916
  assert(File.exist?(annual_csv))
854
917
  assert(File.exist?(timeseries_csv))
855
- expected_timeseries_cols = ['Time'] + all_base_hpxml_timeseries_cols + emissions_timeseries_cols +
856
- ['End Use: Electricity: PV', 'Energy Use: Net', 'Fuel Use: Electricity: Net']
918
+ expected_timeseries_cols = ['Time'] +
919
+ all_base_hpxml_timeseries_cols +
920
+ emissions_timeseries_cols +
921
+ emission_fuels_timeseries_cols +
922
+ emission_end_uses_timeseries_cols +
923
+ ['End Use: Electricity: PV', 'End Use: Electricity: Battery', 'Energy Use: Net', 'Fuel Use: Electricity: Net']
857
924
  actual_timeseries_cols = File.readlines(timeseries_csv)[0].strip.split(',')
858
925
  assert_equal(expected_timeseries_cols.sort, actual_timeseries_cols.sort)
859
926
  timeseries_rows = CSV.read(timeseries_csv)
@@ -865,14 +932,17 @@ class ReportSimulationOutputTest < MiniTest::Test
865
932
  end
866
933
 
867
934
  def test_timeseries_monthly_ALL
868
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-misc-emissions.xml',
935
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-misc-emissions.xml'),
869
936
  'timeseries_frequency' => 'monthly',
870
937
  'include_timeseries_total_consumptions' => true,
871
938
  'include_timeseries_fuel_consumptions' => true,
872
939
  'include_timeseries_end_use_consumptions' => true,
873
940
  'include_timeseries_emissions' => true,
941
+ 'include_timeseries_emission_fuels' => true,
942
+ 'include_timeseries_emission_end_uses' => true,
874
943
  'include_timeseries_hot_water_uses' => true,
875
944
  'include_timeseries_total_loads' => true,
945
+ 'include_timeseries_unmet_hours' => true,
876
946
  'include_timeseries_component_loads' => true,
877
947
  'include_timeseries_zone_temperatures' => true,
878
948
  'include_timeseries_airflows' => true,
@@ -880,8 +950,12 @@ class ReportSimulationOutputTest < MiniTest::Test
880
950
  annual_csv, timeseries_csv = _test_measure(args_hash)
881
951
  assert(File.exist?(annual_csv))
882
952
  assert(File.exist?(timeseries_csv))
883
- expected_timeseries_cols = ['Time'] + all_base_hpxml_timeseries_cols + emissions_timeseries_cols +
884
- ['End Use: Electricity: PV', 'Energy Use: Net', 'Fuel Use: Electricity: Net']
953
+ expected_timeseries_cols = ['Time'] +
954
+ all_base_hpxml_timeseries_cols +
955
+ emissions_timeseries_cols +
956
+ emission_fuels_timeseries_cols +
957
+ emission_end_uses_timeseries_cols +
958
+ ['End Use: Electricity: PV', 'End Use: Electricity: Battery', 'Energy Use: Net', 'Fuel Use: Electricity: Net']
885
959
  actual_timeseries_cols = File.readlines(timeseries_csv)[0].strip.split(',')
886
960
  assert_equal(expected_timeseries_cols.sort, actual_timeseries_cols.sort)
887
961
  timeseries_rows = CSV.read(timeseries_csv)
@@ -891,7 +965,7 @@ class ReportSimulationOutputTest < MiniTest::Test
891
965
  end
892
966
 
893
967
  def test_timeseries_timestep
894
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
968
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
895
969
  'timeseries_frequency' => 'timestep',
896
970
  'include_timeseries_fuel_consumptions' => true }
897
971
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -904,13 +978,16 @@ class ReportSimulationOutputTest < MiniTest::Test
904
978
  end
905
979
 
906
980
  def test_timeseries_timestep_emissions
907
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-misc-emissions.xml',
981
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-misc-emissions.xml'),
908
982
  'timeseries_frequency' => 'timestep',
909
983
  'include_timeseries_fuel_consumptions' => false,
910
984
  'include_timeseries_end_use_consumptions' => false,
911
985
  'include_timeseries_emissions' => true,
986
+ 'include_timeseries_emission_fuels' => true,
987
+ 'include_timeseries_emission_end_uses' => true,
912
988
  'include_timeseries_hot_water_uses' => false,
913
989
  'include_timeseries_total_loads' => false,
990
+ 'include_timeseries_unmet_hours' => false,
914
991
  'include_timeseries_component_loads' => false,
915
992
  'include_timeseries_zone_temperatures' => false,
916
993
  'include_timeseries_airflows' => false,
@@ -918,7 +995,10 @@ class ReportSimulationOutputTest < MiniTest::Test
918
995
  annual_csv, timeseries_csv = _test_measure(args_hash)
919
996
  assert(File.exist?(annual_csv))
920
997
  assert(File.exist?(timeseries_csv))
921
- expected_timeseries_cols = ['Time'] + emissions_timeseries_cols
998
+ expected_timeseries_cols = ['Time'] +
999
+ emissions_timeseries_cols +
1000
+ emission_fuels_timeseries_cols +
1001
+ emission_end_uses_timeseries_cols
922
1002
  actual_timeseries_cols = File.readlines(timeseries_csv)[0].strip.split(',')
923
1003
  assert_equal(expected_timeseries_cols.sort, actual_timeseries_cols.sort)
924
1004
  timeseries_rows = CSV.read(timeseries_csv)
@@ -929,7 +1009,7 @@ class ReportSimulationOutputTest < MiniTest::Test
929
1009
  end
930
1010
 
931
1011
  def test_timeseries_timestep_10min
932
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-simcontrol-timestep-10-mins.xml',
1012
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-simcontrol-timestep-10-mins.xml'),
933
1013
  'timeseries_frequency' => 'timestep',
934
1014
  'include_timeseries_fuel_consumptions' => true }
935
1015
  annual_csv, timeseries_csv = _test_measure(args_hash)
@@ -941,71 +1021,97 @@ class ReportSimulationOutputTest < MiniTest::Test
941
1021
  assert_equal(1, _check_for_constant_timeseries_step(timeseries_cols[0]))
942
1022
  end
943
1023
 
944
- def test_timeseries_hourly_runperiod_Jan
945
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-simcontrol-runperiod-1-month.xml',
946
- 'timeseries_frequency' => 'hourly',
947
- 'include_timeseries_fuel_consumptions' => true }
948
- annual_csv, timeseries_csv = _test_measure(args_hash)
949
- assert(File.exist?(annual_csv))
950
- assert(File.exist?(timeseries_csv))
951
- timeseries_rows = CSV.read(timeseries_csv)
952
- assert_equal(31 * 24, timeseries_rows.size - 2)
953
- timeseries_cols = timeseries_rows.transpose
954
- assert_equal(1, _check_for_constant_timeseries_step(timeseries_cols[0]))
1024
+ def test_timeseries_hourly_runperiod_1month
1025
+ expected_values = { 'timestep' => 28 * 24,
1026
+ 'hourly' => 28 * 24,
1027
+ 'daily' => 28,
1028
+ 'monthly' => 1 }
1029
+
1030
+ expected_values.each do |timeseries_frequency, expected_value|
1031
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-simcontrol-runperiod-1-month.xml'),
1032
+ 'timeseries_frequency' => timeseries_frequency,
1033
+ 'include_timeseries_fuel_consumptions' => true }
1034
+ annual_csv, timeseries_csv = _test_measure(args_hash)
1035
+ assert(File.exist?(annual_csv))
1036
+ assert(File.exist?(timeseries_csv))
1037
+ timeseries_rows = CSV.read(timeseries_csv)
1038
+ assert_equal(expected_value, timeseries_rows.size - 2)
1039
+ if timeseries_frequency != 'monthly'
1040
+ timeseries_cols = timeseries_rows.transpose
1041
+ assert_equal(1, _check_for_constant_timeseries_step(timeseries_cols[0]))
1042
+ end
1043
+ end
955
1044
  end
956
1045
 
957
- def test_timeseries_daily_runperiod_Jan
958
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-simcontrol-runperiod-1-month.xml',
959
- 'timeseries_frequency' => 'daily',
1046
+ def test_timeseries_hourly_AMY_2012
1047
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-location-AMY-2012.xml'),
1048
+ 'timeseries_frequency' => 'hourly',
960
1049
  'include_timeseries_fuel_consumptions' => true }
961
1050
  annual_csv, timeseries_csv = _test_measure(args_hash)
962
1051
  assert(File.exist?(annual_csv))
963
1052
  assert(File.exist?(timeseries_csv))
964
1053
  timeseries_rows = CSV.read(timeseries_csv)
965
- assert_equal(31, timeseries_rows.size - 2)
1054
+ assert_equal(8784, timeseries_rows.size - 2)
966
1055
  timeseries_cols = timeseries_rows.transpose
967
1056
  assert_equal(1, _check_for_constant_timeseries_step(timeseries_cols[0]))
968
1057
  end
969
1058
 
970
- def test_timeseries_monthly_runperiod_Jan
971
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-simcontrol-runperiod-1-month.xml',
972
- 'timeseries_frequency' => 'monthly',
973
- 'include_timeseries_fuel_consumptions' => true }
974
- annual_csv, timeseries_csv = _test_measure(args_hash)
975
- assert(File.exist?(annual_csv))
976
- assert(File.exist?(timeseries_csv))
977
- timeseries_rows = CSV.read(timeseries_csv)
978
- assert_equal(1, timeseries_rows.size - 2)
1059
+ def test_timeseries_timestamp_convention
1060
+ # Expected values are arrays of time offsets (in seconds) for each reported row of output
1061
+ expected_values_array = { 'timestep' => [30 * 60] * 17520,
1062
+ 'hourly' => [60 * 60] * 8760,
1063
+ 'daily' => [60 * 60 * 24] * 365,
1064
+ 'monthly' => Constants.NumDaysInMonths(1999).map { |n_days| n_days * 60 * 60 * 24 } }
1065
+
1066
+ expected_values_array.each do |timeseries_frequency, expected_values|
1067
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-simcontrol-timestep-30-mins.xml'),
1068
+ 'timeseries_frequency' => timeseries_frequency,
1069
+ 'include_timeseries_fuel_consumptions' => true,
1070
+ 'timeseries_timestamp_convention' => 'end' }
1071
+ annual_csv, timeseries_csv = _test_measure(args_hash)
1072
+ assert(File.exist?(annual_csv))
1073
+ assert(File.exist?(timeseries_csv))
1074
+ timeseries_csv = CSV.readlines(timeseries_csv)
1075
+
1076
+ args_hash['timeseries_timestamp_convention'] = 'start'
1077
+ annual_csv, timeseries_csv2 = _test_measure(args_hash)
1078
+ assert(File.exist?(annual_csv))
1079
+ assert(File.exist?(timeseries_csv2))
1080
+ timeseries_csv2 = CSV.readlines(timeseries_csv2)
1081
+
1082
+ for rownum in 2..timeseries_csv.size - 1
1083
+ timestamp_offset = _parse_time(timeseries_csv[rownum][0]) - _parse_time(timeseries_csv2[rownum][0])
1084
+ assert_equal(expected_values[rownum - 2], timestamp_offset)
1085
+ end
1086
+ end
979
1087
  end
980
1088
 
981
- def test_timeseries_timestep_runperiod_Jan
982
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-simcontrol-runperiod-1-month.xml',
1089
+ def test_timeseries_for_dview
1090
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
1091
+ 'output_format' => 'csv_dview',
983
1092
  'timeseries_frequency' => 'timestep',
984
- 'include_timeseries_fuel_consumptions' => true }
1093
+ 'include_timeseries_fuel_consumptions' => true,
1094
+ 'include_timeseries_weather' => true }
985
1095
  annual_csv, timeseries_csv = _test_measure(args_hash)
986
1096
  assert(File.exist?(annual_csv))
987
1097
  assert(File.exist?(timeseries_csv))
988
- timeseries_rows = CSV.read(timeseries_csv)
989
- assert_equal(31 * 24, timeseries_rows.size - 2)
990
- timeseries_cols = timeseries_rows.transpose
991
- assert_equal(1, _check_for_constant_timeseries_step(timeseries_cols[0]))
992
- end
1098
+ timeseries_csv = CSV.readlines(timeseries_csv)
1099
+ assert_equal('wxDVFileHeaderVer.1', timeseries_csv[0][0].strip)
993
1100
 
994
- def test_timeseries_hourly_AMY_2012
995
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base-location-AMY-2012.xml',
996
- 'timeseries_frequency' => 'hourly',
997
- 'include_timeseries_fuel_consumptions' => true }
998
- annual_csv, timeseries_csv = _test_measure(args_hash)
1101
+ args_hash['hpxml_path'] = File.join(File.dirname(__FILE__), '../../workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml')
1102
+ annual_csv, timeseries_csv2 = _test_measure(args_hash)
999
1103
  assert(File.exist?(annual_csv))
1000
- assert(File.exist?(timeseries_csv))
1001
- timeseries_rows = CSV.read(timeseries_csv)
1002
- assert_equal(8784, timeseries_rows.size - 2)
1003
- timeseries_cols = timeseries_rows.transpose
1004
- assert_equal(1, _check_for_constant_timeseries_step(timeseries_cols[0]))
1104
+ assert(File.exist?(timeseries_csv2))
1105
+ timeseries_csv2 = CSV.readlines(timeseries_csv2)
1106
+ assert_equal('wxDVFileHeaderVer.1', timeseries_csv2[0][0].strip)
1107
+
1108
+ col_ix = timeseries_csv[1].find_index('Weather| Drybulb Temperature')
1109
+ assert_equal(Float(timeseries_csv[5][col_ix].strip), Float(timeseries_csv2[5][col_ix].strip)) # not in dst period, values line up
1110
+ assert_equal(Float(timeseries_csv[5000 + 1][col_ix].strip), Float(timeseries_csv2[5000][col_ix].strip)) # in dst period, values are shifted forward
1005
1111
  end
1006
1112
 
1007
1113
  def test_timeseries_local_time_dst
1008
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
1114
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
1009
1115
  'timeseries_frequency' => 'timestep',
1010
1116
  'include_timeseries_fuel_consumptions' => true,
1011
1117
  'add_timeseries_dst_column' => true }
@@ -1022,7 +1128,7 @@ class ReportSimulationOutputTest < MiniTest::Test
1022
1128
  end
1023
1129
 
1024
1130
  def test_timeseries_local_time_utc
1025
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
1131
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
1026
1132
  'timeseries_frequency' => 'timestep',
1027
1133
  'include_timeseries_fuel_consumptions' => true,
1028
1134
  'add_timeseries_utc_column' => true }
@@ -1039,7 +1145,7 @@ class ReportSimulationOutputTest < MiniTest::Test
1039
1145
  end
1040
1146
 
1041
1147
  def test_timeseries_local_time_dst_and_utc
1042
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
1148
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
1043
1149
  'timeseries_frequency' => 'timestep',
1044
1150
  'include_timeseries_fuel_consumptions' => true,
1045
1151
  'add_timeseries_dst_column' => true,
@@ -1059,13 +1165,16 @@ class ReportSimulationOutputTest < MiniTest::Test
1059
1165
  end
1060
1166
 
1061
1167
  def test_timeseries_user_defined_standard_output_variables
1062
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
1168
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
1063
1169
  'timeseries_frequency' => 'hourly',
1064
1170
  'include_timeseries_fuel_consumptions' => false,
1065
1171
  'include_timeseries_end_use_consumptions' => false,
1066
1172
  'include_timeseries_emissions' => false,
1173
+ 'include_timeseries_emission_fuels' => false,
1174
+ 'include_timeseries_emission_end_uses' => false,
1067
1175
  'include_timeseries_hot_water_uses' => false,
1068
1176
  'include_timeseries_total_loads' => false,
1177
+ 'include_timeseries_unmet_hours' => false,
1069
1178
  'include_timeseries_component_loads' => false,
1070
1179
  'include_timeseries_zone_temperatures' => false,
1071
1180
  'include_timeseries_airflows' => false,
@@ -1086,14 +1195,17 @@ class ReportSimulationOutputTest < MiniTest::Test
1086
1195
  end
1087
1196
 
1088
1197
  def test_timeseries_user_defined_advanced_output_variables
1089
- args_hash = { 'hpxml_path' => '../workflow/sample_files/base.xml',
1198
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
1090
1199
  'add_component_loads' => true,
1091
1200
  'timeseries_frequency' => 'hourly',
1092
1201
  'include_timeseries_fuel_consumptions' => false,
1093
1202
  'include_timeseries_end_use_consumptions' => false,
1094
1203
  'include_timeseries_emissions' => false,
1204
+ 'include_timeseries_emission_fuels' => false,
1205
+ 'include_timeseries_emission_end_uses' => false,
1095
1206
  'include_timeseries_hot_water_uses' => false,
1096
1207
  'include_timeseries_total_loads' => false,
1208
+ 'include_timeseries_unmet_hours' => false,
1097
1209
  'include_timeseries_component_loads' => false,
1098
1210
  'include_timeseries_zone_temperatures' => false,
1099
1211
  'include_timeseries_airflows' => false,
@@ -1112,36 +1224,31 @@ class ReportSimulationOutputTest < MiniTest::Test
1112
1224
  _check_for_nonzero_timeseries_value(timeseries_csv, BaseHPXMLTimeseriesColsAdvancedOutputVariables)
1113
1225
  end
1114
1226
 
1115
- def test_eri_designs
1116
- # Create derivative HPXML file w/ ERI design type set
1117
- require 'fileutils'
1118
- require_relative '../../HPXMLtoOpenStudio/resources/xmlhelper.rb'
1119
- require_relative '../../HPXMLtoOpenStudio/resources/constants.rb'
1120
- require 'oga'
1121
- old_hpxml_path = File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml')
1122
- [Constants.CalcTypeERIReferenceHome, Constants.CalcTypeERIReferenceHome].each do |eri_design|
1123
- new_hpxml_path = File.join(File.dirname(__FILE__), '../../workflow/tests/test-eri.xml')
1124
- FileUtils.cp(old_hpxml_path, new_hpxml_path)
1125
- hpxml = HPXML.new(hpxml_path: new_hpxml_path)
1126
- hpxml.header.eri_design = eri_design
1127
- XMLHelper.write_file(hpxml.to_oga(), new_hpxml_path)
1128
-
1129
- # Run tests
1130
- args_hash = { 'hpxml_path' => '../workflow/tests/test-eri.xml' }
1131
- annual_csv, timeseries_csv = _test_measure(args_hash, eri_design)
1132
- assert(File.exist?(annual_csv))
1133
- assert(!File.exist?(timeseries_csv))
1134
- expected_annual_rows = AnnualRows
1135
- actual_annual_rows = File.readlines(annual_csv).map { |x| x.split(',')[0].strip }.select { |x| !x.empty? }
1136
- assert(actual_annual_rows.include? 'ERI: Building: CFA')
1137
-
1138
- # Cleanup
1139
- File.delete(new_hpxml_path)
1140
- File.delete(annual_csv)
1141
- end
1227
+ def test_eri_output
1228
+ args_hash = { 'hpxml_path' => File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml'),
1229
+ 'generate_eri_outputs' => true }
1230
+ annual_csv, timeseries_csv = _test_measure(args_hash)
1231
+ assert(File.exist?(annual_csv))
1232
+ assert(!File.exist?(timeseries_csv))
1233
+ actual_annual_rows = File.readlines(annual_csv).map { |x| x.split(',')[0].strip }.select { |x| !x.empty? }
1234
+ assert(actual_annual_rows.include? 'ERI: Building: CFA')
1235
+ end
1236
+
1237
+ def test_for_unsuccessful_simulation_infinity
1238
+ # Create HPXML w/ AFUE=0 to generate Infinity result
1239
+ hpxml_path = File.join(File.dirname(__FILE__), '../../workflow/sample_files/base.xml')
1240
+ hpxml = HPXML.new(hpxml_path: hpxml_path)
1241
+ hpxml.heating_systems[0].heating_efficiency_afue = 10.0**-315
1242
+ XMLHelper.write_file(hpxml.to_oga(), @tmp_hpxml_path)
1243
+
1244
+ args_hash = { 'hpxml_path' => @tmp_hpxml_path }
1245
+ annual_csv, timeseries_csv, run_log = _test_measure(args_hash, expect_success: false)
1246
+ assert(!File.exist?(annual_csv))
1247
+ assert(!File.exist?(timeseries_csv))
1248
+ assert(File.readlines(run_log).any? { |line| line.include?('Simulation used infinite energy; double-check inputs.') })
1142
1249
  end
1143
1250
 
1144
- def _test_measure(args_hash, eri_design = nil)
1251
+ def _test_measure(args_hash, expect_success: true)
1145
1252
  # Run measure via OSW
1146
1253
  require 'json'
1147
1254
  template_osw = File.join(File.dirname(__FILE__), '..', '..', 'workflow', 'template-run-hpxml.osw')
@@ -1152,6 +1259,8 @@ class ReportSimulationOutputTest < MiniTest::Test
1152
1259
  steps = OpenStudio::WorkflowStepVector.new
1153
1260
  found_args = []
1154
1261
  json['steps'].each do |json_step|
1262
+ next unless ['HPXMLtoOpenStudio', 'ReportSimulationOutput'].include? json_step['measure_dir_name']
1263
+
1155
1264
  step = OpenStudio::MeasureStep.new(json_step['measure_dir_name'])
1156
1265
  json_step['arguments'].each do |json_arg_name, json_arg_val|
1157
1266
  if args_hash.keys.include? json_arg_name
@@ -1170,35 +1279,27 @@ class ReportSimulationOutputTest < MiniTest::Test
1170
1279
 
1171
1280
  # Run OSW
1172
1281
  success = system("#{OpenStudio.getOpenStudioCLI} run -w \"#{osw_path}\"")
1173
- assert_equal(true, success)
1282
+ assert_equal(expect_success, success)
1174
1283
 
1175
1284
  # Cleanup
1176
1285
  File.delete(osw_path)
1177
1286
 
1178
- if not eri_design.nil?
1179
- output_dir = File.dirname(File.join(File.dirname(__FILE__), '..', args_hash['hpxml_path']))
1180
- hpxml_name = File.basename(args_hash['hpxml_path']).gsub('.xml', '')
1181
- annual_csv = File.join(output_dir, "#{hpxml_name}.csv")
1182
- timeseries_csv = File.join(output_dir, "#{hpxml_name}_Hourly.csv")
1183
- run_log = File.join(output_dir, 'run.log')
1184
- else
1185
- annual_csv = File.join(File.dirname(template_osw), 'run', 'results_annual.csv')
1186
- timeseries_csv = File.join(File.dirname(template_osw), 'run', 'results_timeseries.csv')
1187
- run_log = File.join(File.dirname(template_osw), 'run', 'run.log')
1188
- end
1287
+ annual_csv = File.join(File.dirname(template_osw), 'run', 'results_annual.csv')
1288
+ timeseries_csv = File.join(File.dirname(template_osw), 'run', 'results_timeseries.csv')
1289
+ run_log = File.join(File.dirname(template_osw), 'run', 'run.log')
1189
1290
  return annual_csv, timeseries_csv, run_log
1190
1291
  end
1191
1292
 
1192
1293
  def _parse_time(ts)
1193
1294
  date, time = ts.split('T')
1194
1295
  year, month, day = date.split('-')
1195
- hour, minute, second = time.split(':')
1296
+ hour, minute, _second = time.split(':')
1196
1297
  return Time.utc(year, month, day, hour, minute)
1197
1298
  end
1198
1299
 
1199
1300
  def _check_for_constant_timeseries_step(time_col)
1200
1301
  steps = []
1201
- time_col.each_with_index do |ts, i|
1302
+ time_col.each_with_index do |_ts, i|
1202
1303
  next if i < 3
1203
1304
 
1204
1305
  t0 = _parse_time(time_col[i - 1])
@@ -1250,4 +1351,28 @@ class ReportSimulationOutputTest < MiniTest::Test
1250
1351
  assert(has_no_zero_timeseries_value)
1251
1352
  end
1252
1353
  end
1354
+
1355
+ def _get_actual_annual_rows(annual_csv)
1356
+ actual_annual_rows = {}
1357
+ File.readlines(annual_csv).each do |line|
1358
+ next if line.strip.empty?
1359
+
1360
+ key, value = line.split(',').map { |x| x.strip }
1361
+ actual_annual_rows[key] = Float(value)
1362
+ end
1363
+ return actual_annual_rows
1364
+ end
1365
+
1366
+ def _check_for_runner_registered_values(results_json, actual_annual_rows)
1367
+ require 'json'
1368
+ runner_annual_rows = JSON.parse(File.read(results_json))
1369
+ runner_annual_rows = runner_annual_rows['ReportSimulationOutput']
1370
+
1371
+ actual_annual_rows.each do |name, value|
1372
+ name = OpenStudio::toUnderscoreCase(name).chomp('_')
1373
+
1374
+ assert_includes(runner_annual_rows.keys, name)
1375
+ assert_equal(value, runner_annual_rows[name])
1376
+ end
1377
+ end
1253
1378
  end