urbanopt-cli 0.8.3 → 0.9.1

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 (657) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -6
  3. data/CHANGELOG.md +20 -0
  4. data/CMakeLists.txt +7 -7
  5. data/Gemfile +3 -1
  6. data/LICENSE.md +1 -1
  7. data/README.md +9 -0
  8. data/Rakefile +1 -1
  9. data/example_files/Gemfile +23 -16
  10. data/example_files/Gemfile.lock +177 -0
  11. data/example_files/base_workflow_res.osw +57 -14
  12. data/example_files/class_project_coincident.json +1322 -0
  13. data/example_files/class_project_diverse.json +1322 -0
  14. data/example_files/disco/config.json +42 -0
  15. data/example_files/disco/cost_database.xlsx +0 -0
  16. data/example_files/disco/technical_catalog.json +12126 -0
  17. data/example_files/mappers/Baseline.rb +11 -8
  18. data/example_files/mappers/ChilledWaterStorage.rb +98 -0
  19. data/example_files/mappers/ClassProject.rb +110 -0
  20. data/example_files/mappers/CreateBar.rb +2 -1
  21. data/example_files/mappers/EvCharging.rb +1 -1
  22. data/example_files/mappers/FlexibleHotWater.rb +1 -1
  23. data/example_files/mappers/Floorspace.rb +1 -1
  24. data/example_files/mappers/HighEfficiency.rb +14 -12
  25. data/example_files/mappers/HighEfficiencyCreateBar.rb +1 -1
  26. data/example_files/mappers/HighEfficiencyFloorspace.rb +1 -1
  27. data/example_files/mappers/PeakHoursMelsShedding.rb +72 -0
  28. data/example_files/mappers/PeakHoursThermostatAdjust.rb +78 -0
  29. data/example_files/mappers/ThermalStorage.rb +2 -1
  30. data/example_files/mappers/base_workflow.osw +55 -14
  31. data/example_files/mappers/class_project_workflow.osw +328 -0
  32. data/example_files/mappers/createbar_workflow.osw +16 -16
  33. data/example_files/measures/BuildResidentialModel/measure.rb +7 -1
  34. data/example_files/measures/BuildResidentialModel/measure.xml +1313 -706
  35. data/example_files/opendss/electrical_database.json +1446 -1446
  36. data/example_files/python_deps/dependencies.json +5 -0
  37. data/example_files/python_deps/install_python.ps1 +96 -0
  38. data/example_files/python_deps/install_python.sh +120 -0
  39. data/example_files/residential/clothes_dryer.tsv +11 -11
  40. data/example_files/residential/clothes_washer.tsv +3 -3
  41. data/example_files/residential/dishwasher.tsv +3 -3
  42. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +0 -1
  43. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +8 -21
  44. data/example_files/resources/hpxml-measures/.gitignore +2 -0
  45. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1272 -1094
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +978 -659
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +52 -74
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +77 -140
  49. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +37 -27
  50. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +42 -15
  51. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +70 -51
  52. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +142 -21
  53. data/example_files/resources/hpxml-measures/Changelog.md +95 -19
  54. data/example_files/resources/hpxml-measures/Gemfile +2 -4
  55. data/example_files/resources/hpxml-measures/Gemfile.lock +2 -13
  56. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +276 -300
  57. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +220 -214
  58. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +215 -170
  59. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +115 -18
  60. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +24 -44
  61. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +564 -197
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/cambium/README.md +8 -8
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +7 -55
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +24 -19
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +541 -211
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +305 -176
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +0 -2
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +230 -141
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +145 -137
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +191 -97
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/iso-schematron.xsd +391 -0
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +194 -198
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +140 -145
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +11 -11
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +33 -1
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +4 -4
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -9
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +14 -12
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +39 -17
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +1 -1
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/battery.csv +8761 -0
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +114 -57
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +1 -0
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +148 -0
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +90 -128
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +26 -32
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +2 -14
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +67 -0
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +117 -56
  92. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +141 -14
  93. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +471 -344
  94. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +124 -20
  95. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +1 -1
  96. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +28 -32
  97. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +172 -79
  98. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +54 -8
  99. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -3
  100. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +4 -4
  101. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +7 -7
  102. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +1 -1
  103. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +6 -9
  104. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +8 -8
  105. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +213 -95
  106. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +1 -10
  107. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +76 -0
  108. data/example_files/resources/hpxml-measures/README.md +2 -3
  109. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +587 -284
  110. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +304 -352
  111. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +404 -279
  112. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +222 -501
  113. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +137 -200
  114. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json +649 -0
  115. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json +649 -0
  116. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json +647 -0
  117. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Annual Charge.json +8776 -0
  118. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Monthly Charge.json +8776 -0
  119. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json +8774 -0
  120. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Annual Charge.json +659 -0
  121. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Monthly Charge.json +659 -0
  122. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json +657 -0
  123. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Annual Charge.json +670 -0
  124. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Monthly Charge.json +670 -0
  125. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json +668 -0
  126. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Annual Charge.json +655 -0
  127. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Monthly Charge.json +655 -0
  128. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json +653 -0
  129. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/openei_rates.zip +0 -0
  130. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/Average_retail_price_of_electricity.csv +0 -0
  131. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/HouseholdConsumption.csv +0 -0
  132. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +0 -0
  133. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +0 -0
  134. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +0 -0
  135. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/README.md +0 -0
  136. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +506 -25
  137. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Contains Demand Charges.json +1312 -0
  138. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Fixed Charge Units.json +657 -0
  139. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Min Charge Units.json +659 -0
  140. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json +681 -0
  141. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Missing Required Fields.json +54 -0
  142. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/data.csv +8761 -0
  143. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +1006 -235
  144. data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -1
  145. data/example_files/resources/hpxml-measures/docs/source/intro.rst +0 -1
  146. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +4 -3
  147. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +468 -264
  148. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +148 -154
  149. data/example_files/resources/hpxml-measures/tasks.rb +616 -802
  150. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +19 -11
  151. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +20 -12
  152. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +12 -7
  153. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +12 -7
  154. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +19 -11
  155. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +12 -7
  156. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +20 -12
  157. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +28 -16
  158. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +28 -17
  159. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +28 -16
  160. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +20 -12
  161. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +20 -12
  162. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +20 -12
  163. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +20 -12
  164. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +20 -12
  165. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +22 -12
  166. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +19 -11
  167. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +20 -12
  168. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +13 -7
  169. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +12 -7
  170. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +31 -16
  171. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +22 -12
  172. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +21 -12
  173. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +37 -22
  174. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +24 -12
  175. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +33 -21
  176. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +28 -16
  177. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +28 -16
  178. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +30 -17
  179. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +10 -7
  180. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +22 -11
  181. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +12 -7
  182. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +18 -12
  183. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +25 -16
  184. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +22 -12
  185. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +20 -12
  186. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +26 -17
  187. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +19 -11
  188. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +25 -16
  189. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +20 -12
  190. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +35 -21
  191. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +28 -17
  192. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +20 -12
  193. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +35 -21
  194. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +20 -12
  195. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +20 -13
  196. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +12 -9
  197. data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +25 -14
  198. data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +10 -7
  199. data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +20 -11
  200. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +91 -88
  201. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +18 -7
  202. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +546 -535
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +546 -535
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +555 -544
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +18 -7
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +18 -7
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +18 -7
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +18 -7
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +580 -569
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +18 -7
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +580 -569
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +18 -7
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +18 -7
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +7 -0
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +17 -6
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +7 -0
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +18 -7
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +18 -7
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +18 -7
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +600 -0
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +598 -587
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +494 -485
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +606 -593
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +494 -485
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +494 -485
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +494 -485
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-calctype-operational.xml +480 -471
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +464 -457
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +496 -487
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +466 -459
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +518 -509
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +513 -504
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +445 -438
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +476 -467
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +443 -436
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +446 -439
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +494 -485
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +445 -438
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +476 -467
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +446 -439
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +494 -485
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +489 -480
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +499 -490
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +491 -482
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +510 -0
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +495 -486
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +709 -695
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +528 -519
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +512 -503
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +504 -495
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +497 -488
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +490 -481
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +487 -478
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-2stories.xml +639 -628
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-atticroof-cathedral.xml +587 -580
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +639 -628
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-defaults.xml +539 -528
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon.xml +644 -633
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon2.xml +644 -633
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational.xml +575 -564
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +16 -7
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +16 -7
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +18 -7
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +585 -574
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +18 -7
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +18 -7
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +18 -7
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +18 -7
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +18 -7
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +536 -0
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +16 -7
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +16 -7
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +20 -8
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +16 -7
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +16 -7
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +18 -7
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +18 -7
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +18 -7
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +16 -7
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +18 -7
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +16 -7
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +18 -7
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +19 -8
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +19 -8
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +19 -8
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +19 -8
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +19 -8
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +18 -7
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +18 -7
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +18 -7
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +18 -7
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +18 -7
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +18 -7
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +18 -7
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +582 -571
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +583 -572
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +18 -7
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +584 -573
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +584 -573
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +18 -7
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +583 -572
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +585 -574
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +18 -7
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +582 -571
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +18 -7
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +18 -7
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +18 -7
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +586 -575
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +585 -574
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +18 -7
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +18 -7
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +580 -569
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +18 -7
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +580 -569
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +18 -7
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +580 -569
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +18 -7
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +18 -7
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +18 -7
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +18 -7
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +28 -11
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +20 -7
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +18 -7
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +18 -7
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +18 -7
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +18 -7
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +607 -0
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +550 -0
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +27 -12
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +18 -7
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +18 -7
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +18 -7
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +18 -7
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +18 -7
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +589 -578
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +18 -7
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +18 -7
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +619 -608
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +620 -609
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +618 -607
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +18 -7
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +537 -526
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +90 -43
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2507 -2460
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +595 -584
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -8
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +584 -0
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +18 -7
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +594 -583
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +597 -586
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +598 -587
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +27 -12
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +671 -656
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -7
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +18 -7
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-foundation-conditioned-basement-wall-interior-insulation.xml → base-foundation-conditioned-basement-wall-insulation.xml} +585 -574
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +582 -571
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +35 -16
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +18 -7
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +27 -12
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +27 -12
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +27 -12
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +27 -12
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +27 -12
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +27 -12
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +18 -7
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml +586 -575
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +580 -569
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +583 -0
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +18 -7
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +18 -7
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +600 -589
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +599 -588
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +629 -616
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +18 -7
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +579 -568
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +581 -570
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +581 -570
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload-miami-fl.xml +582 -0
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +581 -570
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +581 -570
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +581 -570
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +581 -570
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +598 -587
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +628 -615
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml +581 -570
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml +581 -570
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +581 -570
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +535 -526
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +589 -578
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +536 -527
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +18 -7
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +565 -554
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +565 -554
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +582 -571
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +582 -571
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +582 -571
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +526 -517
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +573 -562
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +529 -520
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +565 -554
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +580 -569
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +580 -569
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +565 -554
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +578 -567
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +575 -564
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +581 -570
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +583 -572
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +583 -572
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +583 -572
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +18 -7
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +580 -569
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +580 -569
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +580 -569
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +551 -542
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +532 -530
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +525 -516
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +541 -532
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +541 -532
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +541 -532
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +525 -516
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +533 -0
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +542 -0
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +542 -0
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +542 -0
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +529 -520
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +529 -520
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +580 -569
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +16 -7
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +16 -7
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +18 -7
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +16 -7
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +16 -7
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +16 -7
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +16 -7
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +567 -0
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +18 -7
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +18 -7
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +18 -7
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +16 -7
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +18 -7
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +18 -7
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +18 -7
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +18 -7
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +611 -598
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +589 -0
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +582 -571
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +18 -7
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +16 -7
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +18 -7
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +17 -7
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +16 -7
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +530 -521
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +530 -521
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +530 -521
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +566 -555
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +18 -7
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +18 -7
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +18 -7
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +18 -7
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +566 -555
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +566 -555
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +18 -7
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +18 -7
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +18 -7
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +18 -7
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +16 -7
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +574 -563
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +581 -570
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +583 -572
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +587 -576
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +587 -576
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +587 -576
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +591 -580
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +591 -580
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +591 -580
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +570 -559
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +586 -575
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +570 -559
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +586 -575
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +18 -7
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +16 -7
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +18 -7
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +552 -543
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -7
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +963 -938
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +33 -69
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +530 -521
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +535 -0
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-ptac-with-heating.xml → base-hvac-ptac-with-heating-natural-gas.xml} +23 -21
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +526 -517
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +541 -532
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +16 -7
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +526 -517
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +526 -517
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +16 -7
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +535 -0
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +542 -0
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +594 -583
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +586 -575
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +18 -7
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +18 -7
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +530 -521
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +530 -521
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +18 -7
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +18 -7
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +530 -521
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +18 -7
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +18 -7
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +18 -7
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +18 -7
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +27 -12
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +591 -576
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +18 -7
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +27 -12
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +582 -571
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +537 -526
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +18 -7
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +537 -526
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +601 -586
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +18 -7
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +18 -7
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +601 -587
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +19 -7
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +20 -7
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +607 -0
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +607 -0
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +21 -7
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +18 -7
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +18 -7
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +18 -7
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +18 -7
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +18 -7
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +18 -7
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +37 -19
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +18 -7
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +18 -7
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +590 -579
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +578 -0
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +632 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +614 -0
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +677 -0
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +593 -0
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +27 -9
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +676 -665
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +616 -0
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +615 -0
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +598 -587
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +586 -0
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +18 -7
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +18 -7
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +18 -7
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +18 -7
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +583 -572
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +18 -7
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1700 -1677
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +622 -611
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +697 -682
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-pv-battery-lifetime-model.xml → base-pv-battery-round-trip-efficiency.xml} +20 -11
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +624 -0
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +622 -611
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +640 -0
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +639 -0
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +623 -0
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +606 -595
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +582 -571
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-smooth.xml +583 -572
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +584 -0
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +583 -572
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +583 -572
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +581 -570
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +581 -570
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +581 -570
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +636 -625
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +18 -7
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +27 -14
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +21 -10
  588. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +21 -10
  589. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-operating-modes.xml → base-simcontrol-temperature-capacitance-multiplier.xml} +25 -13
  590. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +584 -0
  591. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +584 -0
  592. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +18 -7
  593. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-setpoints.xml → base-simcontrol-timestep-30-mins.xml} +25 -14
  594. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +18 -7
  595. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +18 -13
  596. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy-subset.osw +64 -0
  597. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +12 -7
  598. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +8 -24
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +366 -358
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +369 -361
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +369 -361
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +369 -361
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +369 -361
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +369 -361
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +369 -361
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +369 -361
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +311 -303
  608. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +311 -303
  609. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +327 -319
  610. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +327 -319
  611. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +332 -324
  612. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +332 -324
  613. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +341 -333
  614. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +341 -333
  615. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +369 -361
  616. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +369 -361
  617. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +369 -361
  618. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +369 -361
  619. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +369 -361
  620. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +369 -361
  621. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +383 -379
  622. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +383 -379
  623. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +538 -534
  624. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +550 -546
  625. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +444 -410
  626. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +8 -8
  627. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +444 -410
  628. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +18 -4
  629. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +163 -392
  630. data/example_files/scripts/convert_urbanopt_to_disco.py +130 -0
  631. data/example_files/scripts/default_control_changes.csv +8 -0
  632. data/example_files/scripts/default_voltage_regulators.csv +3 -0
  633. data/example_files/scripts/read_data.py +331 -0
  634. data/example_files/visualization/input_visualization_feature.html +172 -81
  635. data/example_files/visualization/input_visualization_scenario.html +178 -82
  636. data/example_files/xml_building/17/README.md +2 -2
  637. data/example_files/xml_building/17/unit 1.xml +40 -41
  638. data/example_files/xml_building/17/unit 2.xml +35 -36
  639. data/example_files/xml_building/17/unit 3.xml +35 -36
  640. data/example_files/xml_building/17/unit 4.xml +41 -42
  641. data/lib/uo_cli/version.rb +2 -2
  642. data/lib/uo_cli.rb +597 -97
  643. data/uo_cli.gemspec +6 -5
  644. metadata +122 -36
  645. data/example_files/residential/exhaust.tsv +0 -3
  646. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
  647. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
  648. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
  649. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
  650. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
  651. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
  652. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
  653. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
  654. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
  655. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
  656. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
  657. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +0 -410
@@ -9,6 +9,7 @@ require_relative '../HPXMLtoOpenStudio/resources/constants.rb'
9
9
  require_relative '../HPXMLtoOpenStudio/resources/location.rb'
10
10
  require_relative '../HPXMLtoOpenStudio/resources/meta_measure.rb'
11
11
  require_relative '../HPXMLtoOpenStudio/resources/output.rb'
12
+ require_relative '../HPXMLtoOpenStudio/resources/util'
12
13
 
13
14
  # start the measure
14
15
  class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
@@ -29,7 +30,7 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
29
30
  end
30
31
 
31
32
  # define the arguments that the user will input
32
- def arguments(model = nil)
33
+ def arguments(model = nil) # rubocop:disable Lint/UnusedMethodArgument
33
34
  args = OpenStudio::Measure::OSArgumentVector.new
34
35
 
35
36
  format_chs = OpenStudio::StringVector.new
@@ -42,173 +43,19 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
42
43
  arg.setDefaultValue('csv')
43
44
  args << arg
44
45
 
45
- # electricity_bill_type_choices = OpenStudio::StringVector.new
46
- # electricity_bill_type_choices << 'Simple'
47
- # electricity_bill_type_choices << 'Detailed'
48
-
49
- # arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('electricity_bill_type', electricity_bill_type_choices, true)
50
- # arg.setDisplayName('Electricity: Simple or Detailed')
51
- # arg.setDescription("Choose either 'Simple' or 'Detailed'. If 'Simple' is selected, electric utility bills are calculated based on user-defined fixed charge and marginal rate. If 'Detailed' is selected, electric utility bills are calculated based on either: a tariff from the OpenEI Utility Rate Database (URDB), or a real-time pricing rate.")
52
- # arg.setDefaultValue('Simple')
53
- # args << arg
54
-
55
- # utility_rate_type_choices = OpenStudio::StringVector.new
56
- # utility_rate_type_choices << 'Autoselect OpenEI'
57
- # utility_rate_type_choices << 'Sample Real-Time Pricing Rate'
58
- # utility_rate_type_choices << 'Sample Tiered Rate'
59
- # utility_rate_type_choices << 'Sample Time-of-Use Rate'
60
- # utility_rate_type_choices << 'Sample Tiered Time-of-Use Rate'
61
- # utility_rate_type_choices << 'User-Specified'
62
-
63
- # arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('electricity_utility_rate_type', utility_rate_type_choices, false)
64
- # arg.setDisplayName('Electricity: Utility Rate Type')
65
- # arg.setDescription("Type of the utility rate. Required if electricity bill type is 'Detailed'.")
66
- # arg.setDefaultValue('Autoselect OpenEI')
67
- # args << arg
68
-
69
- # arg = OpenStudio::Measure::OSArgument::makeStringArgument('electricity_utility_rate_user_specified', false)
70
- # arg.setDisplayName('Electricity: User-Specified Utility Rate')
71
- # arg.setDescription("Absolute/relative path of the json. Relative paths are relative to the HPXML file. Required if utility rate type is 'User-Specified'.")
72
- # args << arg
73
-
74
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('electricity_fixed_charge', false)
75
- arg.setDisplayName('Electricity: Fixed Charge')
76
- arg.setUnits('$/month')
77
- arg.setDescription('Monthly fixed charge for electricity.')
78
- arg.setDefaultValue(12.0) # https://www.nrdc.org/experts/samantha-williams/there-war-attrition-electricity-fixed-charges says $11.19/month in 2018
79
- args << arg
80
-
81
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('electricity_marginal_rate', false)
82
- arg.setDisplayName('Electricity: Marginal Rate')
83
- arg.setUnits('$/kWh')
84
- arg.setDescription("Price per kilowatt-hour for electricity. Use '#{Constants.Auto}' to obtain a state-average value from EIA.")
85
- arg.setDefaultValue(Constants.Auto)
86
- args << arg
87
-
88
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('natural_gas_fixed_charge', false)
89
- arg.setDisplayName('Natural Gas: Fixed Charge')
90
- arg.setUnits('$/month')
91
- arg.setDescription('Monthly fixed charge for natural gas.')
92
- arg.setDefaultValue(12.0) # https://www.aga.org/sites/default/files/aga_energy_analysis_-_natural_gas_utility_rate_structure.pdf says $11.25/month in 2015
93
- args << arg
94
-
95
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('natural_gas_marginal_rate', false)
96
- arg.setDisplayName('Natural Gas: Marginal Rate')
97
- arg.setUnits('$/therm')
98
- arg.setDescription("Price per therm for natural gas. Use '#{Constants.Auto}' to obtain a state-average value from EIA.")
99
- arg.setDefaultValue(Constants.Auto)
100
- args << arg
101
-
102
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('fuel_oil_marginal_rate', false)
103
- arg.setDisplayName('Fuel Oil: Marginal Rate')
104
- arg.setUnits('$/gal')
105
- arg.setDescription("Price per gallon for fuel oil. Use '#{Constants.Auto}' to obtain a state-average value from EIA.")
106
- arg.setDefaultValue(Constants.Auto)
107
- args << arg
108
-
109
- arg = OpenStudio::Measure::OSArgument::makeStringArgument('propane_marginal_rate', false)
110
- arg.setDisplayName('Propane: Marginal Rate')
111
- arg.setUnits('$/gal')
112
- arg.setDescription("Price per gallon for propane. Use '#{Constants.Auto}' to obtain a state-average value from EIA.")
113
- arg.setDefaultValue(Constants.Auto)
114
- args << arg
115
-
116
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('wood_cord_marginal_rate', false)
117
- arg.setDisplayName('Wood Cord: Marginal Rate')
118
- arg.setUnits('$/kBtu')
119
- arg.setDescription('Price per kBtu for wood cord.')
120
- arg.setDefaultValue(0.015)
121
- args << arg
122
-
123
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('wood_pellets_marginal_rate', false)
124
- arg.setDisplayName('Wood Pellets: Marginal Rate')
125
- arg.setUnits('$/kBtu')
126
- arg.setDescription('Price per kBtu for wood pellets.')
127
- arg.setDefaultValue(0.015)
128
- args << arg
129
-
130
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('coal_marginal_rate', false)
131
- arg.setDisplayName('Coal: Marginal Rate')
132
- arg.setUnits('$/kBtu')
133
- arg.setDescription('Price per kBtu for coal.')
134
- arg.setDefaultValue(0.015)
135
- args << arg
136
-
137
- pv_compensation_type_choices = OpenStudio::StringVector.new
138
- pv_compensation_type_choices << 'Net Metering'
139
- pv_compensation_type_choices << 'Feed-In Tariff'
140
-
141
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_compensation_type', pv_compensation_type_choices, false)
142
- arg.setDisplayName('PV: Compensation Type')
143
- arg.setDescription('The type of compensation for PV.')
144
- arg.setDefaultValue('Net Metering')
145
- args << arg
146
-
147
- pv_annual_excess_sellback_rate_type_choices = OpenStudio::StringVector.new
148
- pv_annual_excess_sellback_rate_type_choices << 'User-Specified'
149
- pv_annual_excess_sellback_rate_type_choices << 'Retail Electricity Cost'
150
-
151
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_annual_excess_sellback_rate_type', pv_annual_excess_sellback_rate_type_choices, false)
152
- arg.setDisplayName('PV: Net Metering Annual Excess Sellback Rate Type')
153
- arg.setDescription("The type of annual excess sellback rate for PV. Only applies if the PV compensation type is 'Net Metering'.")
154
- arg.setDefaultValue('User-Specified')
155
- args << arg
156
-
157
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_net_metering_annual_excess_sellback_rate', false)
158
- arg.setDisplayName('PV: Net Metering Annual Excess Sellback Rate')
159
- arg.setUnits('$/kWh')
160
- arg.setDescription("The annual excess sellback rate for PV. Only applies if the PV compensation type is 'Net Metering' and the PV annual excess sellback rate type is 'User-Specified'.")
161
- arg.setDefaultValue(0.03)
162
- args << arg
163
-
164
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_feed_in_tariff_rate', false)
165
- arg.setDisplayName('PV: Feed-In Tariff Rate')
166
- arg.setUnits('$/kWh')
167
- arg.setDescription("The annual full/gross tariff rate for PV. Only applies if the PV compensation type is 'Feed-In Tariff'.")
168
- arg.setDefaultValue(0.12)
169
- args << arg
170
-
171
- pv_grid_connection_fee_units_choices = OpenStudio::StringVector.new
172
- pv_grid_connection_fee_units_choices << '$/kW'
173
- pv_grid_connection_fee_units_choices << '$'
174
-
175
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_grid_connection_fee_units', pv_grid_connection_fee_units_choices, false)
176
- arg.setDisplayName('PV: Grid Connection Fee Units')
177
- arg.setDescription('Units for PV grid connection fee. Only applies when there is PV.')
178
- arg.setDefaultValue('$/kW')
179
- args << arg
180
-
181
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_monthly_grid_connection_fee', false)
182
- arg.setDisplayName('PV: Monthly Grid Connection Fee')
183
- arg.setUnits('$')
184
- arg.setDescription('Monthly fee for PV grid connection. Only applies when there is PV.')
185
- arg.setDefaultValue(0.0)
186
- args << arg
187
-
188
46
  return args
189
47
  end
190
48
 
191
- def timeseries_frequency
192
- # Use monthly for fossil fuels and simple electric rates
193
- # Use hourly for detailed electric rates (URDB tariff or real time pricing)
194
- return 'monthly'
195
- end
196
-
197
- def check_for_warnings(args, pv_systems)
49
+ def check_for_return_type_warnings()
198
50
  warnings = []
199
51
 
200
- # Require full annual simulation
52
+ # Require full annual simulation if PV
201
53
  if !(@hpxml.header.sim_begin_month == 1 && @hpxml.header.sim_begin_day == 1 && @hpxml.header.sim_end_month == 12 && @hpxml.header.sim_end_day == 31)
202
- if args[:electricity_bill_type] != 'Simple' || pv_systems.size > 0
203
- warnings << 'A full annual simulation is required for calculating detailed utility bills.'
54
+ if @hpxml.pv_systems.size > 0
55
+ warnings << 'A full annual simulation is required for calculating utility bills for homes with PV.'
204
56
  end
205
57
  end
206
58
 
207
- # Require user-specified utility rate if 'User-Specified'
208
- if args[:electricity_bill_type] == 'Detailed' && args[:electricity_utility_rate_type].get == 'User-Specified' && !args[:electricity_utility_rate_user_specified].is_initialized
209
- warnings << 'Must specify a utility rate json path when choosing User-Specified utility rate type.'
210
- end
211
-
212
59
  # Require not DSE
213
60
  (@hpxml.heating_systems + @hpxml.heat_pumps).each do |htg_system|
214
61
  next unless (htg_system.is_a?(HPXML::HeatingSystem) && htg_system.is_heat_pump_backup_system) || htg_system.fraction_heat_load_served > 0
@@ -232,6 +79,19 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
232
79
  return warnings.uniq
233
80
  end
234
81
 
82
+ def check_for_next_type_warnings(utility_bill_scenario)
83
+ warnings = []
84
+
85
+ # Require full annual simulation if 'Detailed'
86
+ if !(@hpxml.header.sim_begin_month == 1 && @hpxml.header.sim_begin_day == 1 && @hpxml.header.sim_end_month == 12 && @hpxml.header.sim_end_day == 31)
87
+ if !utility_bill_scenario.elec_tariff_filepath.nil?
88
+ warnings << 'A full annual simulation is required for calculating detailed utility bills.'
89
+ end
90
+ end
91
+
92
+ return warnings.uniq
93
+ end
94
+
235
95
  # return a vector of IdfObject's to request EnergyPlus objects needed by the run method
236
96
  def energyPlusOutputRequests(runner, user_arguments)
237
97
  super(runner, user_arguments)
@@ -251,24 +111,42 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
251
111
  return result
252
112
  end
253
113
 
254
- # assign the user inputs to variables
255
- args = get_argument_values(runner, arguments(@model), user_arguments)
256
- args = Hash[args.collect { |k, v| [k.to_sym, v] }]
257
- args[:electricity_bill_type] = 'Simple' # TODO: support Detailed
258
-
259
114
  hpxml_defaults_path = @model.getBuilding.additionalProperties.getFeatureAsString('hpxml_defaults_path').get
260
115
  building_id = @model.getBuilding.additionalProperties.getFeatureAsString('building_id').get
261
116
  @hpxml = HPXML.new(hpxml_path: hpxml_defaults_path, building_id: building_id)
262
117
 
263
- warnings = check_for_warnings(args, @hpxml.pv_systems)
118
+ warnings = check_for_return_type_warnings()
264
119
  return result if !warnings.empty?
265
120
 
266
- fuels, _, _ = setup_outputs()
121
+ fuels = setup_fuel_outputs()
122
+
123
+ hpxml_fuel_map = { FT::Elec => HPXML::FuelTypeElectricity,
124
+ FT::Gas => HPXML::FuelTypeNaturalGas,
125
+ FT::Oil => HPXML::FuelTypeOil,
126
+ FT::Propane => HPXML::FuelTypePropane,
127
+ FT::WoodCord => HPXML::FuelTypeWoodCord,
128
+ FT::WoodPellets => HPXML::FuelTypeWoodPellets,
129
+ FT::Coal => HPXML::FuelTypeCoal }
130
+
131
+ # Check for presence of fuels once
132
+ has_fuel = { HPXML::FuelTypeElectricity => true }
133
+ hpxml_doc = @hpxml.to_oga
134
+ Constants.FossilFuels.each do |fuel|
135
+ has_fuel[fuel] = @hpxml.has_fuel(fuel, hpxml_doc)
136
+ end
267
137
 
268
138
  # Fuel outputs
269
- fuels.each do |fuel_type, fuel|
139
+ fuels.each do |(fuel_type, is_production), fuel|
270
140
  fuel.meters.each do |meter|
271
- result << OpenStudio::IdfObject.load("Output:Meter,#{meter},#{timeseries_frequency};").get
141
+ next unless has_fuel[hpxml_fuel_map[fuel_type]]
142
+ next if is_production && @hpxml.pv_systems.empty?
143
+
144
+ if fuel_type == FT::Elec
145
+ result << OpenStudio::IdfObject.load("Output:Meter,#{meter},monthly;").get if @hpxml.header.utility_bill_scenarios.has_simple_electric_rates
146
+ result << OpenStudio::IdfObject.load("Output:Meter,#{meter},hourly;").get if @hpxml.header.utility_bill_scenarios.has_detailed_electric_rates
147
+ else
148
+ result << OpenStudio::IdfObject.load("Output:Meter,#{meter},monthly;").get
149
+ end
272
150
  end
273
151
  end
274
152
 
@@ -303,7 +181,6 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
303
181
  # assign the user inputs to variables
304
182
  args = get_argument_values(runner, arguments(model), user_arguments)
305
183
  args = Hash[args.collect { |k, v| [k.to_sym, v] }]
306
- args[:electricity_bill_type] = 'Simple' # TODO: support Detailed
307
184
  output_format = args[:output_format].get
308
185
 
309
186
  output_dir = File.dirname(runner.lastEpwFilePath.get.to_s)
@@ -314,245 +191,255 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
314
191
  end
315
192
  @msgpackData = MessagePack.unpack(File.read(File.join(output_dir, 'eplusout.msgpack'), mode: 'rb'))
316
193
 
194
+ hpxml_path = @model.getBuilding.additionalProperties.getFeatureAsString('hpxml_path').get
317
195
  hpxml_defaults_path = @model.getBuilding.additionalProperties.getFeatureAsString('hpxml_defaults_path').get
318
196
  building_id = @model.getBuilding.additionalProperties.getFeatureAsString('building_id').get
319
197
  @hpxml = HPXML.new(hpxml_path: hpxml_defaults_path, building_id: building_id)
320
198
 
321
- warnings = check_for_warnings(args, @hpxml.pv_systems)
199
+ return true if @hpxml.header.utility_bill_scenarios.empty?
200
+
201
+ warnings = check_for_return_type_warnings()
322
202
  if register_warnings(runner, warnings)
323
203
  return true
324
204
  end
325
205
 
326
206
  # Set paths
327
207
  output_path = File.join(output_dir, "results_bills.#{output_format}")
208
+ FileUtils.rm(output_path) if File.exist?(output_path)
328
209
 
329
- # Setup outputs
330
- fuels, utility_rates, utility_bills = setup_outputs()
210
+ @hpxml.header.utility_bill_scenarios.each do |utility_bill_scenario|
211
+ warnings = check_for_next_type_warnings(utility_bill_scenario)
212
+ if register_warnings(runner, warnings)
213
+ next
214
+ end
331
215
 
332
- # Get timestamps
333
- @timestamps, _, _ = OutputMethods.get_timestamps(timeseries_frequency, @msgpackData, @hpxml)
216
+ # Setup fuel outputs
217
+ fuels = setup_fuel_outputs()
334
218
 
335
- # Get outputs
336
- get_outputs(fuels)
219
+ # Get outputs
220
+ get_outputs(fuels, utility_bill_scenario)
337
221
 
338
- # Preprocess arguments
339
- preprocess_arguments(args)
222
+ # Setup utility outputs
223
+ utility_rates, utility_bills = setup_utility_outputs()
340
224
 
341
- # Get utility rates
342
- warnings = get_utility_rates(fuels, utility_rates, args, @hpxml.header.state_code, @hpxml.pv_systems, runner)
343
- if register_warnings(runner, warnings)
344
- return true
345
- end
225
+ # Get utility rates
226
+ warnings = get_utility_rates(hpxml_path, fuels, utility_rates, utility_bill_scenario, @hpxml.pv_systems)
227
+ if register_warnings(runner, warnings)
228
+ next
229
+ end
346
230
 
347
- # Calculate utility bills
348
- net_elec = get_utility_bills(fuels, utility_rates, utility_bills, args, @hpxml.header)
231
+ # Calculate utility bills
232
+ get_utility_bills(fuels, utility_rates, utility_bills, utility_bill_scenario, @hpxml.header)
349
233
 
350
- # Annual true up
351
- annual_true_up(utility_rates, utility_bills, net_elec)
234
+ # Write/report results
235
+ report_runperiod_output_results(runner, utility_bills, output_format, output_path, utility_bill_scenario.name)
236
+ end
352
237
 
353
- # Calculate annual bills
354
- get_annual_bills(utility_bills)
238
+ return true
239
+ end
355
240
 
356
- # Report results
357
- utility_bill_type_str = OpenStudio::toUnderscoreCase('Total USD')
358
- utility_bill_type_val = utility_bills.sum { |fuel_type, utility_bill| utility_bill.annual_total.round(2) }.round(2)
359
- runner.registerValue(utility_bill_type_str, utility_bill_type_val)
360
- runner.registerInfo("Registering #{utility_bill_type_val} for #{utility_bill_type_str}.")
241
+ def report_runperiod_output_results(runner, utility_bills, output_format, output_path, bill_scenario_name)
242
+ segment = utility_bills.keys[0].split(':', 2)[0]
243
+ segment = segment.strip
361
244
 
362
- utility_bills.each do |fuel_type, utility_bill|
363
- if [FT::Elec, FT::Gas].include? fuel_type
364
- utility_bill_type_str = OpenStudio::toUnderscoreCase("#{fuel_type} Fixed USD")
365
- utility_bill_type_val = utility_bill.annual_fixed_charge.round(2)
366
- runner.registerValue(utility_bill_type_str, utility_bill_type_val)
367
- runner.registerInfo("Registering #{utility_bill_type_val} for #{utility_bill_type_str}.")
368
- end
245
+ results_out = []
246
+ results_out << ["#{bill_scenario_name}: Total (USD)", utility_bills.values.sum { |bill| bill.annual_total.round(2) }.round(2)]
369
247
 
370
- if [FT::Elec, FT::Gas].include? fuel_type
371
- utility_bill_type_str = OpenStudio::toUnderscoreCase("#{fuel_type} Marginal USD")
372
- utility_bill_type_val = utility_bill.annual_energy_charge.round(2)
373
- runner.registerValue(utility_bill_type_str, utility_bill_type_val)
374
- runner.registerInfo("Registering #{utility_bill_type_val} for #{utility_bill_type_str}.")
248
+ utility_bills.each do |fuel_type, bill|
249
+ new_segment = fuel_type.split(':', 2)[0]
250
+ new_segment = new_segment.strip
251
+ if new_segment != segment
252
+ segment = new_segment
375
253
  end
376
254
 
377
- if [FT::Elec].include? fuel_type
378
- utility_bill_type_str = OpenStudio::toUnderscoreCase("#{fuel_type} PV Credit USD")
379
- utility_bill_type_val = utility_bill.annual_production_credit.round(2)
380
- runner.registerValue(utility_bill_type_str, utility_bill_type_val)
381
- runner.registerInfo("Registering #{utility_bill_type_val} for #{utility_bill_type_str}.")
255
+ results_out << ["#{bill_scenario_name}: #{fuel_type}: Fixed (USD)", bill.annual_fixed_charge.round(2)] if bill.annual_fixed_charge != 0
256
+ results_out << ["#{bill_scenario_name}: #{fuel_type}: Energy (USD)", bill.annual_energy_charge.round(2)] if bill.annual_energy_charge != 0
257
+ results_out << ["#{bill_scenario_name}: #{fuel_type}: PV Credit (USD)", bill.annual_production_credit.round(2)] if [FT::Elec].include?(fuel_type) && bill.annual_production_credit != 0
258
+ results_out << ["#{bill_scenario_name}: #{fuel_type}: Total (USD)", bill.annual_total.round(2)] if bill.annual_total != 0
259
+ end
260
+
261
+ if ['csv'].include? output_format
262
+ CSV.open(output_path, 'a') { |csv| results_out.to_a.each { |elem| csv << elem } }
263
+ elsif ['json', 'msgpack'].include? output_format
264
+ h = {}
265
+ results_out.each do |out|
266
+ if out[0].include? ':'
267
+ grp, name = out[0].split(':', 2)
268
+ h[grp] = {} if h[grp].nil?
269
+ h[grp][name.strip] = out[1]
270
+ else
271
+ h[out[0]] = out[1]
272
+ end
382
273
  end
383
274
 
384
- utility_bill_type_str = OpenStudio::toUnderscoreCase("#{fuel_type} Total USD")
385
- utility_bill_type_val = utility_bill.annual_total.round(2)
386
- runner.registerValue(utility_bill_type_str, utility_bill_type_val)
387
- runner.registerInfo("Registering #{utility_bill_type_val} for #{utility_bill_type_str}.")
275
+ if output_format == 'json'
276
+ require 'json'
277
+ File.open(output_path, 'a') { |json| json.write(JSON.pretty_generate(h)) }
278
+ elsif output_format == 'msgpack'
279
+ File.open(output_path, 'a') { |json| h.to_msgpack(json) }
280
+ end
388
281
  end
282
+ runner.registerInfo("Wrote bills output to #{output_path}.")
389
283
 
390
- # Write results
391
- write_output(runner, utility_bills, output_format, output_path)
284
+ results_out.each do |name, value|
285
+ next if name.nil? || value.nil?
392
286
 
393
- return true
394
- end
287
+ name = OpenStudio::toUnderscoreCase(name).chomp('_')
395
288
 
396
- def preprocess_arguments(args)
397
- args[:electricity_fixed_charge] = args[:electricity_fixed_charge].get
398
- args[:electricity_marginal_rate] = args[:electricity_marginal_rate].get
399
- args[:natural_gas_fixed_charge] = args[:natural_gas_fixed_charge].get
400
- args[:natural_gas_marginal_rate] = args[:natural_gas_marginal_rate].get
401
- args[:fuel_oil_marginal_rate] = args[:fuel_oil_marginal_rate].get
402
- args[:propane_marginal_rate] = args[:propane_marginal_rate].get
403
- args[:wood_cord_marginal_rate] = args[:wood_cord_marginal_rate].get
404
- args[:wood_pellets_marginal_rate] = args[:wood_pellets_marginal_rate].get
405
- args[:coal_marginal_rate] = args[:coal_marginal_rate].get
406
- args[:pv_compensation_type] = args[:pv_compensation_type].get
407
- args[:pv_annual_excess_sellback_rate_type] = args[:pv_annual_excess_sellback_rate_type].get
408
- args[:pv_net_metering_annual_excess_sellback_rate] = args[:pv_net_metering_annual_excess_sellback_rate].get
409
- args[:pv_feed_in_tariff_rate] = args[:pv_feed_in_tariff_rate].get
410
- args[:pv_grid_connection_fee_units] = args[:pv_grid_connection_fee_units].get
411
- args[:pv_monthly_grid_connection_fee] = args[:pv_monthly_grid_connection_fee].get
289
+ runner.registerValue(name, value)
290
+ runner.registerInfo("Registering #{value} for #{name}.")
291
+ end
412
292
  end
413
293
 
414
- def get_utility_rates(fuels, utility_rates, args, state_code, pv_systems, runner = nil)
294
+ def get_utility_rates(hpxml_path, fuels, utility_rates, bill_scenario, pv_systems)
415
295
  warnings = []
416
296
  utility_rates.each do |fuel_type, rate|
417
297
  next if fuels[[fuel_type, false]].timeseries.sum == 0
418
298
 
419
299
  if fuel_type == FT::Elec
420
- if args[:electricity_bill_type] == 'Simple'
421
- rate.fixedmonthlycharge = args[:electricity_fixed_charge]
422
- rate.flatratebuy = args[:electricity_marginal_rate]
423
- elsif args[:electricity_bill_type] == 'Detailed'
424
- if args[:electricity_utility_rate_type].get != 'Autoselect OpenEI'
425
- if args[:electricity_utility_rate_type].get == 'User-Specified'
426
- path = args[:electricity_utility_rate_user_specified].get
427
-
428
- hpxml_path = @model.getBuilding.additionalProperties.getFeatureAsString('hpxml_path').get
429
- filepath = FilePath.check_path(path,
430
- File.dirname(hpxml_path),
431
- 'Tariff File')
432
- else # sample rates
433
- custom_rates_folder = File.join(File.dirname(__FILE__), 'resources/Data/CustomRates')
434
- custom_rate_file = "#{args[:electricity_utility_rate_type].get}.json"
435
- filepath = File.join(custom_rates_folder, custom_rate_file)
436
- end
300
+ if bill_scenario.elec_tariff_filepath.nil?
301
+ rate.fixedmonthlycharge = bill_scenario.elec_fixed_charge
302
+ rate.flatratebuy = bill_scenario.elec_marginal_rate
303
+ else
304
+ require 'json'
437
305
 
438
- fileread = File.read(filepath)
439
- tariff = JSON.parse(fileread, symbolize_names: true)
440
- tariff = tariff[:items][0]
306
+ filepath = FilePath.check_path(bill_scenario.elec_tariff_filepath,
307
+ File.dirname(hpxml_path),
308
+ 'Tariff File')
441
309
 
442
- if tariff.keys.include?(:realtimepricing)
443
- rate.fixedmonthlycharge = tariff[:fixedmonthlycharge] if tariff.keys.include?(:fixedmonthlycharge)
444
- rate.realtimeprice = tariff[:realtimepricing].split(',').map { |v| Float(v) }
310
+ tariff = JSON.parse(File.read(filepath), symbolize_names: true)
311
+ tariff = tariff[:items][0]
312
+ fields = tariff.keys
445
313
 
314
+ if fields.include?(:fixedchargeunits)
315
+ if tariff[:fixedchargeunits] == '$/month'
316
+ rate.fixedmonthlycharge = 0.0 if fields.include?(:fixedchargefirstmeter) || fields.include?(:fixedchargeeaaddl)
317
+ rate.fixedmonthlycharge += tariff[:fixedchargefirstmeter] if fields.include?(:fixedchargefirstmeter)
318
+ rate.fixedmonthlycharge += tariff[:fixedchargeeaaddl] if fields.include?(:fixedchargeeaaddl)
446
319
  else
447
- rate.fixedmonthlycharge = tariff[:fixedmonthlycharge] if tariff.keys.include?(:fixedmonthlycharge)
448
- rate.flatratebuy = tariff[:flatratebuy] if tariff.keys.include?(:flatratebuy)
320
+ warnings << 'Fixed charge units must be $/month.'
321
+ end
322
+ end
449
323
 
450
- rate.energyratestructure = tariff[:energyratestructure] if tariff.keys.include?(:energyratestructure)
451
- rate.energyweekdayschedule = tariff[:energyweekdayschedule] if tariff.keys.include?(:energyweekdayschedule)
452
- rate.energyweekendschedule = tariff[:energyweekendschedule] if tariff.keys.include?(:energyweekendschedule)
324
+ if fields.include?(:minchargeunits)
325
+ if tariff[:minchargeunits] == '$/month'
326
+ rate.minmonthlycharge = tariff[:mincharge] if fields.include?(:mincharge)
327
+ elsif tariff[:minchargeunits] == '$/year'
328
+ rate.minannualcharge = tariff[:mincharge] if fields.include?(:mincharge)
329
+ else
330
+ warnings << 'Min charge units must be either $/month or $/year.'
331
+ end
332
+ end
453
333
 
454
- rate.demandratestructure = tariff[:demandratestructure] if tariff.keys.include?(:demandratestructure)
455
- rate.demandweekdayschedule = tariff[:demandweekdayschedule] if tariff.keys.include?(:demandweekdayschedule)
456
- rate.demandweekendschedule = tariff[:demandweekendschedule] if tariff.keys.include?(:demandweekendschedule)
334
+ if fields.include?(:realtimepricing)
335
+ rate.realtimeprice = tariff[:realtimepricing]
457
336
 
458
- rate.flatdemandstructure = tariff[:flatdemandstructure] if tariff.keys.include?(:flatdemandstructure)
459
- end
460
337
  else
461
- # TODO
338
+ if !fields.include?(:energyweekdayschedule) || !fields.include?(:energyweekendschedule) || !fields.include?(:energyratestructure)
339
+ warnings << 'Tariff file must contain energyweekdayschedule, energyweekendschedule, and energyratestructure fields.'
340
+ end
341
+
342
+ if fields.include?(:demandweekdayschedule) || fields.include?(:demandweekendschedule) || fields.include?(:demandratestructure) || fields.include?(:flatdemandstructure)
343
+ warnings << 'Demand charges are not currently supported when calculating detailed utility bills.'
344
+ end
345
+
346
+ rate.energyratestructure = tariff[:energyratestructure]
347
+ rate.energyweekdayschedule = tariff[:energyweekdayschedule]
348
+ rate.energyweekendschedule = tariff[:energyweekendschedule]
349
+
350
+ if rate.energyratestructure.collect { |r| r.collect { |s| s.keys.include?(:rate) } }.flatten.any? { |t| !t }
351
+ warnings << 'Every tier must contain a rate.'
352
+ end
353
+
354
+ if rate.energyratestructure.collect { |r| r.collect { |s| s.keys } }.flatten.uniq.include?(:sell)
355
+ warnings << 'No tier may contain a sell key.'
356
+ end
357
+
358
+ if rate.energyratestructure.collect { |r| r.collect { |s| s.keys.include?(:unit) } }.flatten.any? { |t| !t }
359
+ warnings << 'Every tier must contain a unit'
360
+ end
361
+
362
+ if rate.energyratestructure.collect { |r| r.collect { |s| s[:unit] == 'kWh' } }.flatten.any? { |t| !t }
363
+ warnings << 'All rates must be in units of kWh.'
364
+ end
462
365
  end
463
366
  end
464
367
 
465
368
  # Net Metering
466
- rate.net_metering_excess_sellback_type = args[:pv_annual_excess_sellback_rate_type] if args[:pv_compensation_type] == 'Net Metering'
467
- rate.net_metering_user_excess_sellback_rate = args[:pv_net_metering_annual_excess_sellback_rate] if rate.net_metering_excess_sellback_type == 'User-Specified'
369
+ rate.net_metering_excess_sellback_type = bill_scenario.pv_net_metering_annual_excess_sellback_rate_type if bill_scenario.pv_compensation_type == HPXML::PVCompensationTypeNetMetering
370
+ rate.net_metering_user_excess_sellback_rate = bill_scenario.pv_net_metering_annual_excess_sellback_rate if rate.net_metering_excess_sellback_type == HPXML::PVAnnualExcessSellbackRateTypeUserSpecified
468
371
 
469
372
  # Feed-In Tariff
470
- rate.feed_in_tariff_rate = args[:pv_feed_in_tariff_rate] if args[:pv_compensation_type] == 'Feed-In Tariff'
373
+ rate.feed_in_tariff_rate = bill_scenario.pv_feed_in_tariff_rate if bill_scenario.pv_compensation_type == HPXML::PVCompensationTypeFeedInTariff
471
374
  elsif fuel_type == FT::Gas
472
- rate.fixedmonthlycharge = args[:natural_gas_fixed_charge]
473
- rate.flatratebuy = args[:natural_gas_marginal_rate]
375
+ rate.fixedmonthlycharge = bill_scenario.natural_gas_fixed_charge
376
+ rate.flatratebuy = bill_scenario.natural_gas_marginal_rate
474
377
  elsif fuel_type == FT::Oil
475
- rate.flatratebuy = args[:fuel_oil_marginal_rate]
378
+ rate.fixedmonthlycharge = bill_scenario.fuel_oil_fixed_charge
379
+ rate.flatratebuy = bill_scenario.fuel_oil_marginal_rate
476
380
  elsif fuel_type == FT::Propane
477
- rate.flatratebuy = args[:propane_marginal_rate]
381
+ rate.fixedmonthlycharge = bill_scenario.propane_fixed_charge
382
+ rate.flatratebuy = bill_scenario.propane_marginal_rate
478
383
  elsif fuel_type == FT::WoodCord
479
- rate.flatratebuy = args[:wood_cord_marginal_rate]
384
+ rate.fixedmonthlycharge = bill_scenario.wood_fixed_charge
385
+ rate.flatratebuy = bill_scenario.wood_marginal_rate
480
386
  elsif fuel_type == FT::WoodPellets
481
- rate.flatratebuy = args[:wood_pellets_marginal_rate]
387
+ rate.fixedmonthlycharge = bill_scenario.wood_pellets_fixed_charge
388
+ rate.flatratebuy = bill_scenario.wood_pellets_marginal_rate
482
389
  elsif fuel_type == FT::Coal
483
- rate.flatratebuy = args[:coal_marginal_rate]
390
+ rate.fixedmonthlycharge = bill_scenario.coal_fixed_charge
391
+ rate.flatratebuy = bill_scenario.coal_marginal_rate
484
392
  end
485
393
 
486
- if rate.flatratebuy == Constants.Auto
487
- if [FT::Elec, FT::Gas, FT::Oil, FT::Propane].include? fuel_type
488
- rate.flatratebuy = get_auto_marginal_rate(runner, state_code, fuel_type, rate.fixedmonthlycharge)
489
-
490
- if !rate.flatratebuy.nil?
491
- runner.registerInfo("Found a marginal rate of '#{rate.flatratebuy}' for #{fuel_type}.") if !runner.nil?
492
- else
493
- warnings << "Could not find a marginal #{fuel_type} rate." if rate.flatratebuy.nil?
494
- end
495
- end
496
- else
497
- rate.flatratebuy = Float(rate.flatratebuy)
498
- end
394
+ warnings << "Could not find a marginal #{fuel_type} rate." if rate.flatratebuy.nil?
499
395
 
500
396
  # Grid connection fee
501
397
  next unless fuel_type == FT::Elec
502
398
 
503
- next unless args[:electricity_bill_type] == 'Simple'
504
-
505
399
  next unless pv_systems.size > 0
506
400
 
507
401
  monthly_fee = 0.0
508
- if args[:pv_grid_connection_fee_units] == '$/kW'
402
+ if not bill_scenario.pv_monthly_grid_connection_fee_dollars_per_kw.nil?
509
403
  pv_systems.each do |pv_system|
510
404
  max_power_output_kW = UnitConversions.convert(pv_system.max_power_output, 'W', 'kW')
511
- monthly_fee += args[:pv_monthly_grid_connection_fee] * max_power_output_kW
405
+ monthly_fee += bill_scenario.pv_monthly_grid_connection_fee_dollars_per_kw * max_power_output_kW
512
406
  end
513
- elsif args[:pv_grid_connection_fee_units] == '$'
514
- monthly_fee = args[:pv_monthly_grid_connection_fee]
407
+ elsif not bill_scenario.pv_monthly_grid_connection_fee_dollars.nil?
408
+ monthly_fee = bill_scenario.pv_monthly_grid_connection_fee_dollars
515
409
  end
516
410
  rate.fixedmonthlycharge += monthly_fee
517
411
  end
518
412
  return warnings
519
413
  end
520
414
 
521
- def get_utility_bills(fuels, utility_rates, utility_bills, args, header)
415
+ def get_utility_bills(fuels, utility_rates, utility_bills, utility_bill_scenario, header)
522
416
  net_elec = 0
417
+
418
+ # Simple
523
419
  fuels.each do |(fuel_type, is_production), fuel|
524
420
  rate = utility_rates[fuel_type]
525
421
  bill = utility_bills[fuel_type]
526
422
 
527
423
  if fuel_type == FT::Elec
528
- if args[:electricity_bill_type] == 'Detailed' && rate.realtimeprice.empty?
529
- net_elec = CalculateUtilityBill.detailed_electric(fuels, rate, bill, net_elec)
530
- else
424
+ if utility_bill_scenario.elec_tariff_filepath.nil?
531
425
  net_elec = CalculateUtilityBill.simple(fuel_type, header, fuel.timeseries, is_production, rate, bill, net_elec)
532
426
  end
533
427
  else
534
428
  net_elec = CalculateUtilityBill.simple(fuel_type, header, fuel.timeseries, is_production, rate, bill, net_elec)
535
429
  end
536
430
  end
537
- return net_elec
538
- end
539
431
 
540
- def annual_true_up(utility_rates, utility_bills, net_elec)
541
- rate = utility_rates[FT::Elec]
542
- bill = utility_bills[FT::Elec]
543
- if rate.net_metering_excess_sellback_type == 'User-Specified'
544
- if bill.annual_production_credit > bill.annual_energy_charge
545
- bill.annual_production_credit = bill.annual_energy_charge
546
- end
547
- if net_elec < 0
548
- bill.annual_production_credit += -net_elec * rate.net_metering_user_excess_sellback_rate
549
- end
432
+ # Detailed
433
+ if !utility_bill_scenario.elec_tariff_filepath.nil?
434
+ rate = utility_rates[FT::Elec]
435
+ bill = utility_bills[FT::Elec]
436
+
437
+ CalculateUtilityBill.detailed_electric(header, fuels, rate, bill)
550
438
  end
551
- end
552
439
 
553
- def get_annual_bills(utility_bills)
440
+ # Calculate totals
554
441
  utility_bills.values.each do |bill|
555
- if bill.annual_production_credit > 0
442
+ if bill.annual_production_credit != 0
556
443
  bill.annual_production_credit *= -1
557
444
  end
558
445
 
@@ -560,7 +447,7 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
560
447
  end
561
448
  end
562
449
 
563
- def setup_outputs()
450
+ def setup_fuel_outputs()
564
451
  def get_timeseries_units_from_fuel_type(fuel_type)
565
452
  if fuel_type == FT::Elec
566
453
  return 'kWh'
@@ -581,10 +468,14 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
581
468
  fuels[[FT::WoodPellets, false]] = Fuel.new(meters: ["#{EPlus::FuelTypeWoodPellets}:Facility"])
582
469
  fuels[[FT::Coal, false]] = Fuel.new(meters: ["#{EPlus::FuelTypeCoal}:Facility"])
583
470
 
584
- fuels.each do |(fuel_type, is_production), fuel|
471
+ fuels.each do |(fuel_type, _is_production), fuel|
585
472
  fuel.units = get_timeseries_units_from_fuel_type(fuel_type)
586
473
  end
587
474
 
475
+ return fuels
476
+ end
477
+
478
+ def setup_utility_outputs()
588
479
  utility_rates = {}
589
480
  utility_rates[FT::Elec] = UtilityRate.new
590
481
  utility_rates[FT::Gas] = UtilityRate.new
@@ -603,16 +494,19 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
603
494
  utility_bills[FT::WoodPellets] = UtilityBill.new
604
495
  utility_bills[FT::Coal] = UtilityBill.new
605
496
 
606
- return fuels, utility_rates, utility_bills
497
+ return utility_rates, utility_bills
607
498
  end
608
499
 
609
- def get_outputs(fuels)
610
- fuels.each do |(fuel_type, is_production), fuel|
500
+ def get_outputs(fuels, utility_bill_scenario)
501
+ fuels.each do |(fuel_type, _is_production), fuel|
611
502
  unit_conv = UnitConversions.convert(1.0, 'J', fuel.units)
612
503
  unit_conv /= 139.0 if fuel_type == FT::Oil
613
504
  unit_conv /= 91.6 if fuel_type == FT::Propane
614
505
 
615
- fuel.timeseries = get_report_meter_data_timeseries(fuel.meters, unit_conv, 0)
506
+ timeseries_freq = 'monthly'
507
+ timeseries_freq = 'hourly' if fuel_type == FT::Elec && !utility_bill_scenario.elec_tariff_filepath.nil?
508
+ num_timestamps = OutputMethods.get_timestamps(@msgpackData, @hpxml, false)[0].size
509
+ fuel.timeseries = get_report_meter_data_timeseries(fuel.meters, unit_conv, 0, num_timestamps, timeseries_freq)
616
510
  end
617
511
  end
618
512
 
@@ -625,15 +519,15 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
625
519
  }
626
520
  end
627
521
 
628
- def get_report_meter_data_timeseries(meter_names, unit_conv, unit_adder)
629
- return [0.0] * @timestamps.size if meter_names.empty?
522
+ def get_report_meter_data_timeseries(meter_names, unit_conv, unit_adder, num_timestamps, timeseries_freq)
523
+ return [0.0] * num_timestamps if meter_names.empty?
630
524
 
631
- msgpack_timeseries_name = OutputMethods.msgpack_frequency_map[timeseries_frequency]
525
+ msgpack_timeseries_name = OutputMethods.msgpack_frequency_map[timeseries_freq]
632
526
  cols = @msgpackData['MeterData'][msgpack_timeseries_name]['Cols']
633
527
  rows = @msgpackData['MeterData'][msgpack_timeseries_name]['Rows']
634
528
  indexes = cols.each_index.select { |i| meter_names.include? cols[i]['Variable'] }
635
529
  vals = []
636
- rows.each_with_index do |row, idx|
530
+ rows.each do |row|
637
531
  row = row[row.keys[0]]
638
532
  val = 0.0
639
533
  indexes.each do |i|
@@ -643,179 +537,6 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
643
537
  end
644
538
  return vals
645
539
  end
646
-
647
- def average_rate_to_marginal_rate(average_rate, fixed_rate, household_consumption)
648
- return average_rate - 12.0 * fixed_rate / household_consumption
649
- end
650
-
651
- def get_household_consumption(state_code, fuel_type)
652
- rows = CSV.read(File.join(File.dirname(__FILE__), 'resources/Data/UtilityRates/HouseholdConsumption.csv'))
653
- rows.each do |row|
654
- next if row[0] != state_code
655
-
656
- if fuel_type == FT::Elec
657
- return Float(row[1])
658
- elsif fuel_type == FT::Gas
659
- return Float(row[2])
660
- end
661
- end
662
- end
663
-
664
- def get_auto_marginal_rate(runner, state_code, fuel_type, fixed_rate)
665
- state_name = Constants.StateCodesMap[state_code]
666
- return if state_name.nil?
667
-
668
- average_rate = nil
669
- marginal_rate = nil
670
- if fuel_type == FT::Elec
671
- year_ix = nil
672
- rows = CSV.read(File.join(File.dirname(__FILE__), 'resources/Data/UtilityRates/Average_retail_price_of_electricity.csv'))
673
- rows.each do |row|
674
- year_ix = row.index('2021') if row[0] == 'description'
675
- next if row[0].upcase != "Residential : #{state_name}".upcase
676
-
677
- average_rate = Float(row[year_ix]) / 100.0 # Convert cents/kWh to $/kWh
678
- end
679
-
680
- household_consumption = get_household_consumption(state_code, fuel_type)
681
- marginal_rate = average_rate_to_marginal_rate(average_rate, fixed_rate, household_consumption)
682
-
683
- elsif fuel_type == FT::Gas
684
- rows = CSV.read(File.join(File.dirname(__FILE__), 'resources/Data/UtilityRates/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv'))
685
- rows = rows[2..-1]
686
-
687
- state_ix = rows[0].index("#{state_name} Price of Natural Gas Delivered to Residential Consumers (Dollars per Thousand Cubic Feet)")
688
- rows[1..-1].each do |row|
689
- average_rate = Float(row[state_ix]) / 10.37 if !row[state_ix].nil? # Convert Mcf to therms, from https://www.eia.gov/tools/faqs/faq.php?id=45&t=7
690
- end
691
-
692
- household_consumption = get_household_consumption(state_code, fuel_type)
693
- marginal_rate = average_rate_to_marginal_rate(average_rate, fixed_rate, household_consumption)
694
-
695
- elsif [FT::Oil, FT::Propane].include? fuel_type
696
- if fuel_type == FT::Oil
697
- marginal_rates = get_gallon_marginal_rates('PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv')
698
- header = "Weekly #{state_name} Weekly No. 2 Heating Oil Residential Price (Dollars per Gallon)"
699
- elsif fuel_type == FT::Propane
700
- marginal_rates = marginal_rates = get_gallon_marginal_rates('PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv')
701
- header = "Weekly #{state_name} Propane Residential Price (Dollars per Gallon)"
702
- end
703
-
704
- if marginal_rates[header].nil?
705
- padd = get_state_code_to_padd[state_code]
706
- marginal_rates.each do |k, v|
707
- header = k if k.include?(padd)
708
- end
709
- average = "region (#{padd})"
710
-
711
- if marginal_rates[header].nil?
712
- if fuel_type == FT::Oil
713
- header = 'Weekly U.S. Weekly No. 2 Heating Oil Residential Price (Dollars per Gallon)'
714
- elsif fuel_type == FT::Propane
715
- header = 'Weekly U.S. Propane Residential Price (Dollars per Gallon)'
716
- end
717
- average = 'national'
718
- end
719
-
720
- runner.registerWarning("Could not find state average #{fuel_type} rate based on #{state_name}; using #{average} average.") if !runner.nil?
721
- end
722
- marginal_rate = marginal_rates[header].sum / marginal_rates[header].size
723
- end
724
-
725
- return marginal_rate
726
- end
727
-
728
- def get_state_code_to_padd
729
- # https://www.eia.gov/tools/glossary/index.php?id=petroleum%20administration%20for%20defense%20district
730
- padd_to_state_codes = { 'PADD 1A' => ['CT', 'MA', 'ME', 'NH', 'RI', 'VT'],
731
- 'PADD 1B' => ['DE', 'DC', 'MD', 'NJ', 'NY', 'PA'],
732
- 'PADD 1C' => ['FL', 'GA', 'NC', 'SC', 'WV', 'VA'],
733
- 'PADD 2' => ['IA', 'IL', 'IN', 'KS', 'KY', 'MI', 'MN', 'MO', 'ND', 'NE', 'OH', 'OK', 'SD', 'TN', 'WI'],
734
- 'PADD 3' => ['AL', 'AR', 'LA', 'MS', 'NM', 'TX'],
735
- 'PADD 4' => ['CO', 'ID', 'MT', 'UT', 'WY'],
736
- 'PADD 5' => ['AK', 'AZ', 'CA', 'HI', 'NV', 'OR', 'WA'] }
737
-
738
- state_code_to_padd = {}
739
- padd_to_state_codes.each do |padd, state_codes|
740
- state_codes.each do |state_code|
741
- state_code_to_padd[state_code] = padd
742
- end
743
- end
744
-
745
- return state_code_to_padd
746
- end
747
-
748
- def get_gallon_marginal_rates(filename)
749
- marginal_rates = {}
750
-
751
- rows = CSV.read(File.join(File.dirname(__FILE__), "resources/Data/UtilityRates/#{filename}"))
752
- rows = rows[2..-1]
753
- headers = rows[0]
754
-
755
- rows = rows.reverse[1..26].transpose
756
- rows.each_with_index do |row, i|
757
- marginal_rates[headers[i]] = row
758
- end
759
-
760
- marginal_rates.delete('Date')
761
- marginal_rates.each do |header, values|
762
- if values.all? { |x| x.nil? }
763
- marginal_rates.delete(header)
764
- next
765
- end
766
- marginal_rates[header] = marginal_rates[header].map { |x| Float(x) }
767
- end
768
-
769
- return marginal_rates
770
- end
771
-
772
- def write_output(runner, utility_bills, output_format, output_path)
773
- line_break = nil
774
-
775
- segment = utility_bills.keys[0].split(':', 2)[0]
776
- segment = segment.strip
777
- results_out = []
778
- results_out << ['Total ($)', utility_bills.sum { |key, bill| bill.annual_total.round(2) }.round(2)]
779
- results_out << [line_break]
780
- utility_bills.each do |key, bill|
781
- new_segment = key.split(':', 2)[0]
782
- new_segment = new_segment.strip
783
- if new_segment != segment
784
- results_out << [line_break]
785
- segment = new_segment
786
- end
787
-
788
- results_out << ["#{key}: Fixed ($)", bill.annual_fixed_charge.round(2)] if [FT::Elec, FT::Gas].include? key
789
- results_out << ["#{key}: Marginal ($)", bill.annual_energy_charge.round(2)] if [FT::Elec, FT::Gas].include? key
790
- results_out << ["#{key}: PV Credit ($)", bill.annual_production_credit.round(2)] if [FT::Elec].include? key
791
- results_out << ["#{key}: Total ($)", bill.annual_total.round(2)]
792
- end
793
-
794
- if ['csv'].include? output_format
795
- CSV.open(output_path, 'wb') { |csv| results_out.to_a.each { |elem| csv << elem } }
796
- elsif ['json', 'msgpack'].include? output_format
797
- h = {}
798
- results_out.each do |out|
799
- next if out == [line_break]
800
-
801
- if out[0].include? ':'
802
- grp, name = out[0].split(':', 2)
803
- h[grp] = {} if h[grp].nil?
804
- h[grp][name.strip] = out[1]
805
- else
806
- h[out[0]] = out[1]
807
- end
808
- end
809
-
810
- if output_format == 'json'
811
- require 'json'
812
- File.open(output_path, 'w') { |json| json.write(JSON.pretty_generate(h)) }
813
- elsif output_format == 'msgpack'
814
- File.open(output_path, 'w') { |json| h.to_msgpack(json) }
815
- end
816
- end
817
- runner.registerInfo("Wrote bills output to #{output_path}.")
818
- end
819
540
  end
820
541
 
821
542
  # register the measure to be used by the application