urbanopt-cli 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (650) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -6
  3. data/CHANGELOG.md +21 -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 +601 -101
  635. data/scripts/setup-env.bat +6 -7
  636. data/uo_cli.gemspec +6 -5
  637. metadata +121 -36
  638. data/example_files/residential/exhaust.tsv +0 -3
  639. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
  640. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
  641. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
  642. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
  643. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
  644. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
  645. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
  646. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
  647. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
  648. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
  649. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
  650. 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