urbanopt-cli 0.8.3 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (649) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -6
  3. data/CHANGELOG.md +14 -0
  4. data/CMakeLists.txt +7 -7
  5. data/Gemfile +3 -1
  6. data/README.md +9 -0
  7. data/example_files/Gemfile +23 -16
  8. data/example_files/Gemfile.lock +177 -0
  9. data/example_files/base_workflow_res.osw +57 -14
  10. data/example_files/class_project_coincident.json +1322 -0
  11. data/example_files/class_project_diverse.json +1322 -0
  12. data/example_files/disco/config.json +42 -0
  13. data/example_files/disco/cost_database.xlsx +0 -0
  14. data/example_files/disco/technical_catalog.json +12126 -0
  15. data/example_files/mappers/Baseline.rb +10 -7
  16. data/example_files/mappers/ChilledWaterStorage.rb +98 -0
  17. data/example_files/mappers/ClassProject.rb +110 -0
  18. data/example_files/mappers/CreateBar.rb +1 -0
  19. data/example_files/mappers/HighEfficiency.rb +13 -11
  20. data/example_files/mappers/PeakHoursMelsShedding.rb +72 -0
  21. data/example_files/mappers/PeakHoursThermostatAdjust.rb +78 -0
  22. data/example_files/mappers/ThermalStorage.rb +1 -0
  23. data/example_files/mappers/base_workflow.osw +55 -14
  24. data/example_files/mappers/class_project_workflow.osw +328 -0
  25. data/example_files/mappers/createbar_workflow.osw +16 -16
  26. data/example_files/measures/BuildResidentialModel/measure.rb +7 -1
  27. data/example_files/measures/BuildResidentialModel/measure.xml +1313 -706
  28. data/example_files/opendss/electrical_database.json +1446 -1446
  29. data/example_files/python_deps/dependencies.json +5 -0
  30. data/example_files/python_deps/install_python.ps1 +96 -0
  31. data/example_files/python_deps/install_python.sh +120 -0
  32. data/example_files/residential/clothes_dryer.tsv +11 -11
  33. data/example_files/residential/clothes_washer.tsv +3 -3
  34. data/example_files/residential/dishwasher.tsv +3 -3
  35. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +0 -1
  36. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +8 -21
  37. data/example_files/resources/hpxml-measures/.gitignore +2 -0
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1272 -1094
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +978 -659
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +52 -74
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +77 -140
  42. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +30 -27
  43. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +32 -13
  44. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +55 -51
  45. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +89 -16
  46. data/example_files/resources/hpxml-measures/Changelog.md +65 -0
  47. data/example_files/resources/hpxml-measures/Gemfile +2 -4
  48. data/example_files/resources/hpxml-measures/Gemfile.lock +2 -13
  49. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +276 -300
  50. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +221 -215
  51. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +215 -170
  52. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +108 -16
  53. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +24 -44
  54. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +564 -197
  55. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/cambium/README.md +8 -8
  56. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  57. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +7 -55
  58. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +24 -19
  59. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +541 -211
  60. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +300 -172
  61. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +0 -2
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +230 -141
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +145 -137
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +191 -97
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/iso-schematron.xsd +391 -0
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +194 -198
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +140 -145
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +11 -11
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +33 -1
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +4 -4
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -9
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +14 -12
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +39 -17
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +1 -1
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/battery.csv +8761 -0
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +114 -57
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +1 -0
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +148 -0
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +85 -127
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +26 -32
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +2 -14
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +67 -0
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +117 -56
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +141 -14
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +453 -344
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +124 -20
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +1 -1
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +28 -32
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +172 -79
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +54 -8
  92. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -3
  93. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +4 -4
  94. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +7 -7
  95. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +1 -1
  96. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +6 -9
  97. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +8 -8
  98. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +213 -95
  99. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +1 -10
  100. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +76 -0
  101. data/example_files/resources/hpxml-measures/README.md +2 -3
  102. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +585 -287
  103. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +304 -352
  104. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +404 -279
  105. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +222 -501
  106. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +137 -200
  107. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json +649 -0
  108. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json +649 -0
  109. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json +647 -0
  110. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Annual Charge.json +8776 -0
  111. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Monthly Charge.json +8776 -0
  112. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json +8774 -0
  113. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Annual Charge.json +659 -0
  114. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Monthly Charge.json +659 -0
  115. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json +657 -0
  116. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Annual Charge.json +670 -0
  117. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Monthly Charge.json +670 -0
  118. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json +668 -0
  119. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Annual Charge.json +655 -0
  120. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Monthly Charge.json +655 -0
  121. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json +653 -0
  122. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/openei_rates.zip +0 -0
  123. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/Average_retail_price_of_electricity.csv +0 -0
  124. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/HouseholdConsumption.csv +0 -0
  125. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +0 -0
  126. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +0 -0
  127. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +0 -0
  128. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/README.md +0 -0
  129. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +506 -25
  130. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Contains Demand Charges.json +1312 -0
  131. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Fixed Charge Units.json +657 -0
  132. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Min Charge Units.json +659 -0
  133. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json +681 -0
  134. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Missing Required Fields.json +54 -0
  135. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/data.csv +8761 -0
  136. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +1006 -235
  137. data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -1
  138. data/example_files/resources/hpxml-measures/docs/source/intro.rst +0 -1
  139. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +2 -2
  140. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +461 -261
  141. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +146 -152
  142. data/example_files/resources/hpxml-measures/tasks.rb +616 -802
  143. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +19 -11
  144. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +20 -12
  145. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +12 -7
  146. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +12 -7
  147. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +19 -11
  148. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +12 -7
  149. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +20 -12
  150. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +28 -16
  151. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +28 -17
  152. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +28 -16
  153. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +20 -12
  154. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +20 -12
  155. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +20 -12
  156. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +20 -12
  157. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +20 -12
  158. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +22 -12
  159. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +19 -11
  160. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +20 -12
  161. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +13 -7
  162. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +12 -7
  163. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +31 -16
  164. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +22 -12
  165. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +21 -12
  166. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +37 -22
  167. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +24 -12
  168. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +33 -21
  169. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +28 -16
  170. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +28 -16
  171. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +30 -17
  172. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +10 -7
  173. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +22 -11
  174. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +12 -7
  175. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +18 -12
  176. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +25 -16
  177. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +22 -12
  178. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +20 -12
  179. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +26 -17
  180. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +19 -11
  181. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +25 -16
  182. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +20 -12
  183. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +35 -21
  184. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +28 -17
  185. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +20 -12
  186. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +35 -21
  187. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +20 -12
  188. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +20 -13
  189. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +12 -9
  190. data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +25 -14
  191. data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +10 -7
  192. data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +20 -11
  193. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +91 -88
  194. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +18 -7
  195. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +546 -535
  196. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +546 -535
  197. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +555 -544
  198. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +18 -7
  199. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +18 -7
  200. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +18 -7
  201. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +18 -7
  202. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +580 -569
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +18 -7
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +580 -569
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +18 -7
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +18 -7
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +7 -0
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +17 -6
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +7 -0
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +18 -7
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +18 -7
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +18 -7
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +600 -0
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +598 -587
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +494 -485
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +606 -593
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +494 -485
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +494 -485
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +494 -485
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-calctype-operational.xml +480 -471
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +464 -457
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +496 -487
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +466 -459
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +518 -509
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +513 -504
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +445 -438
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +476 -467
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +443 -436
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +446 -439
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +494 -485
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +445 -438
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +476 -467
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +446 -439
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +494 -485
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +489 -480
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +499 -490
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +491 -482
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +510 -0
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +495 -486
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +709 -695
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +528 -519
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +512 -503
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +504 -495
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +497 -488
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +490 -481
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +487 -478
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-2stories.xml +639 -628
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-atticroof-cathedral.xml +587 -580
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +639 -628
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-defaults.xml +539 -528
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon.xml +644 -633
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon2.xml +644 -633
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational.xml +575 -564
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +16 -7
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +16 -7
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +18 -7
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +585 -574
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +18 -7
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +18 -7
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +18 -7
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +18 -7
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +18 -7
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +536 -0
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +16 -7
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +16 -7
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +20 -8
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +16 -7
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +16 -7
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +18 -7
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +18 -7
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +18 -7
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +16 -7
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +18 -7
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +16 -7
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +18 -7
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +19 -8
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +19 -8
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +19 -8
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +19 -8
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +19 -8
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +18 -7
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +18 -7
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +18 -7
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +18 -7
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +18 -7
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +18 -7
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +18 -7
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +582 -571
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +583 -572
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +18 -7
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +584 -573
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +584 -573
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +18 -7
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +583 -572
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +585 -574
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +18 -7
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +582 -571
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +18 -7
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +18 -7
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +18 -7
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +586 -575
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +585 -574
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +18 -7
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +18 -7
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +580 -569
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +18 -7
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +580 -569
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +18 -7
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +580 -569
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +18 -7
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +18 -7
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +18 -7
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +18 -7
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +28 -11
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +20 -7
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +18 -7
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +18 -7
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +18 -7
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +18 -7
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +607 -0
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +550 -0
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +27 -12
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +18 -7
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +18 -7
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +18 -7
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +18 -7
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +18 -7
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +589 -578
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +18 -7
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +18 -7
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +619 -608
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +620 -609
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +618 -607
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +18 -7
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +537 -526
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +90 -43
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2507 -2460
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +595 -584
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -8
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +584 -0
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +18 -7
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +594 -583
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +597 -586
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +598 -587
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +27 -12
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +671 -656
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -7
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +18 -7
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-foundation-conditioned-basement-wall-interior-insulation.xml → base-foundation-conditioned-basement-wall-insulation.xml} +585 -574
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +582 -571
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +35 -16
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +18 -7
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +27 -12
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +27 -12
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +27 -12
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +27 -12
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +27 -12
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +27 -12
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +18 -7
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml +586 -575
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +580 -569
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +583 -0
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +18 -7
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +18 -7
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +600 -589
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +599 -588
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +629 -616
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +18 -7
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +579 -568
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +581 -570
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +581 -570
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload-miami-fl.xml +582 -0
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +581 -570
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +581 -570
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +581 -570
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +581 -570
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +598 -587
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +628 -615
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml +581 -570
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml +581 -570
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +581 -570
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +535 -526
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +589 -578
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +536 -527
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +18 -7
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +565 -554
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +565 -554
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +582 -571
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +582 -571
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +582 -571
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +526 -517
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +573 -562
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +529 -520
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +565 -554
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +580 -569
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +580 -569
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +565 -554
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +578 -567
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +575 -564
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +581 -570
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +583 -572
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +583 -572
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +583 -572
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +18 -7
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +580 -569
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +580 -569
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +580 -569
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +551 -542
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +532 -530
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +525 -516
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +541 -532
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +541 -532
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +541 -532
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +525 -516
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +533 -0
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +542 -0
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +542 -0
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +542 -0
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +529 -520
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +529 -520
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +580 -569
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +16 -7
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +16 -7
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +18 -7
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +16 -7
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +16 -7
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +16 -7
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +16 -7
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +567 -0
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +18 -7
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +18 -7
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +18 -7
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +16 -7
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +18 -7
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +18 -7
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +18 -7
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +18 -7
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +611 -598
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +589 -0
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +582 -571
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +18 -7
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +16 -7
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +18 -7
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +17 -7
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +16 -7
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +530 -521
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +530 -521
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +530 -521
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +566 -555
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +18 -7
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +18 -7
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +18 -7
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +18 -7
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +566 -555
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +566 -555
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +18 -7
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +18 -7
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +18 -7
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +18 -7
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +16 -7
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +574 -563
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +581 -570
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +583 -572
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +587 -576
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +587 -576
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +587 -576
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +591 -580
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +591 -580
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +591 -580
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +570 -559
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +586 -575
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +570 -559
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +586 -575
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +18 -7
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +16 -7
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +18 -7
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +552 -543
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -7
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +963 -938
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +33 -69
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +530 -521
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +535 -0
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-ptac-with-heating.xml → base-hvac-ptac-with-heating-natural-gas.xml} +23 -21
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +526 -517
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +541 -532
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +16 -7
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +526 -517
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +526 -517
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +16 -7
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +535 -0
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +542 -0
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +594 -583
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +586 -575
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +18 -7
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +18 -7
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +530 -521
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +530 -521
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +18 -7
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +18 -7
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +530 -521
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +18 -7
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +18 -7
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +18 -7
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +18 -7
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +27 -12
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +591 -576
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +18 -7
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +27 -12
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +582 -571
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +537 -526
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +18 -7
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +537 -526
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +601 -586
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +18 -7
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +18 -7
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +601 -587
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +19 -7
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +20 -7
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +607 -0
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +607 -0
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +21 -7
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +18 -7
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +18 -7
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +18 -7
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +18 -7
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +18 -7
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +18 -7
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +37 -19
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +18 -7
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +18 -7
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +590 -579
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +578 -0
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +632 -0
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +614 -0
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +677 -0
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +593 -0
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +27 -9
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +676 -665
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +616 -0
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +615 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +598 -587
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +586 -0
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +18 -7
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +18 -7
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +18 -7
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +18 -7
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +583 -572
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +18 -7
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1700 -1677
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +622 -611
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +697 -682
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-pv-battery-lifetime-model.xml → base-pv-battery-round-trip-efficiency.xml} +20 -11
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +624 -0
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +622 -611
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +640 -0
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +639 -0
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +623 -0
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +606 -595
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +582 -571
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-smooth.xml +583 -572
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +584 -0
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +583 -572
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +583 -572
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +581 -570
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +581 -570
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +581 -570
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +636 -625
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +18 -7
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +27 -14
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +21 -10
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +21 -10
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-operating-modes.xml → base-simcontrol-temperature-capacitance-multiplier.xml} +25 -13
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +584 -0
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +584 -0
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +18 -7
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-setpoints.xml → base-simcontrol-timestep-30-mins.xml} +25 -14
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +18 -7
  588. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +18 -13
  589. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +12 -7
  590. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +8 -24
  591. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +366 -358
  592. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +369 -361
  593. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +369 -361
  594. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +369 -361
  595. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +369 -361
  596. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +369 -361
  597. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +369 -361
  598. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +369 -361
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +311 -303
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +311 -303
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +327 -319
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +327 -319
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +332 -324
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +332 -324
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +341 -333
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +341 -333
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +369 -361
  608. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +369 -361
  609. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +369 -361
  610. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +369 -361
  611. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +369 -361
  612. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +369 -361
  613. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +383 -379
  614. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +383 -379
  615. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +538 -534
  616. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +550 -546
  617. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +444 -410
  618. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +8 -8
  619. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +444 -410
  620. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +18 -4
  621. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +133 -288
  622. data/example_files/scripts/convert_urbanopt_to_disco.py +130 -0
  623. data/example_files/scripts/default_control_changes.csv +8 -0
  624. data/example_files/scripts/default_voltage_regulators.csv +3 -0
  625. data/example_files/scripts/read_data.py +331 -0
  626. data/example_files/visualization/input_visualization_feature.html +172 -81
  627. data/example_files/visualization/input_visualization_scenario.html +178 -82
  628. data/example_files/xml_building/17/README.md +2 -2
  629. data/example_files/xml_building/17/unit 1.xml +40 -41
  630. data/example_files/xml_building/17/unit 2.xml +35 -36
  631. data/example_files/xml_building/17/unit 3.xml +35 -36
  632. data/example_files/xml_building/17/unit 4.xml +41 -42
  633. data/lib/uo_cli/version.rb +1 -1
  634. data/lib/uo_cli.rb +596 -96
  635. data/uo_cli.gemspec +6 -5
  636. metadata +121 -36
  637. data/example_files/residential/exhaust.tsv +0 -3
  638. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
  639. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
  640. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
  641. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
  642. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
  643. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
  644. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
  645. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
  646. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
  647. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
  648. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
  649. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +0 -410
@@ -6,33 +6,11 @@
6
6
  require 'pathname'
7
7
  require 'csv'
8
8
  require 'oga'
9
- require_relative 'resources/airflow'
10
- require_relative 'resources/battery'
11
- require_relative 'resources/constants'
12
- require_relative 'resources/constructions'
13
- require_relative 'resources/energyplus'
14
- require_relative 'resources/generator'
15
- require_relative 'resources/geometry'
16
- require_relative 'resources/hotwater_appliances'
17
- require_relative 'resources/hpxml'
18
- require_relative 'resources/hpxml_defaults'
19
- require_relative 'resources/hvac'
20
- require_relative 'resources/hvac_sizing'
21
- require_relative 'resources/lighting'
22
- require_relative 'resources/location'
23
- require_relative 'resources/materials'
24
- require_relative 'resources/misc_loads'
25
- require_relative 'resources/psychrometrics'
26
- require_relative 'resources/pv'
27
- require_relative 'resources/schedules'
28
- require_relative 'resources/simcontrols'
29
- require_relative 'resources/unit_conversions'
30
- require_relative 'resources/util'
31
- require_relative 'resources/validator'
32
- require_relative 'resources/version'
33
- require_relative 'resources/waterheater'
34
- require_relative 'resources/weather'
35
- require_relative 'resources/xmlhelper'
9
+ Dir["#{File.dirname(__FILE__)}/resources/*.rb"].each do |resource_file|
10
+ next if resource_file.include? 'minitest_helper.rb'
11
+
12
+ require resource_file
13
+ end
36
14
 
37
15
  # start the measure
38
16
  class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
@@ -52,7 +30,7 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
52
30
  end
53
31
 
54
32
  # define the arguments that the user will input
55
- def arguments(model)
33
+ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
56
34
  args = OpenStudio::Measure::OSArgumentVector.new
57
35
 
58
36
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('hpxml_path', true)
@@ -113,14 +91,14 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
113
91
  building_id = runner.getOptionalStringArgumentValue('building_id', user_arguments)
114
92
 
115
93
  unless (Pathname.new hpxml_path).absolute?
116
- hpxml_path = File.expand_path(File.join(File.dirname(__FILE__), hpxml_path))
94
+ hpxml_path = File.expand_path(hpxml_path)
117
95
  end
118
96
  unless File.exist?(hpxml_path) && hpxml_path.downcase.end_with?('.xml')
119
97
  fail "'#{hpxml_path}' does not exist or is not an .xml file."
120
98
  end
121
99
 
122
100
  unless (Pathname.new output_dir).absolute?
123
- output_dir = File.expand_path(File.join(File.dirname(__FILE__), output_dir))
101
+ output_dir = File.expand_path(output_dir)
124
102
  end
125
103
 
126
104
  if building_id.is_initialized
@@ -131,12 +109,13 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
131
109
 
132
110
  begin
133
111
  if skip_validation
134
- stron_paths = []
112
+ xsd_path = nil
113
+ stron_path = nil
135
114
  else
136
- stron_paths = [File.join(File.dirname(__FILE__), 'resources', 'hpxml_schematron', 'HPXMLvalidator.xml'),
137
- File.join(File.dirname(__FILE__), 'resources', 'hpxml_schematron', 'EPvalidator.xml')]
115
+ xsd_path = File.join(File.dirname(__FILE__), 'resources', 'hpxml_schema', 'HPXML.xsd')
116
+ stron_path = File.join(File.dirname(__FILE__), 'resources', 'hpxml_schematron', 'EPvalidator.xml')
138
117
  end
139
- hpxml = HPXML.new(hpxml_path: hpxml_path, schematron_validators: stron_paths, building_id: building_id)
118
+ hpxml = HPXML.new(hpxml_path: hpxml_path, schema_path: xsd_path, schematron_path: stron_path, building_id: building_id)
140
119
  hpxml.errors.each do |error|
141
120
  runner.registerError(error)
142
121
  end
@@ -163,33 +142,17 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
163
142
  end
164
143
 
165
144
  def process_weather(hpxml, runner, model, hpxml_path)
166
- epw_path = hpxml.climate_and_risk_zones.weather_station_epw_filepath
167
-
168
- if not File.exist? epw_path
169
- test_epw_path = File.join(File.dirname(hpxml_path), epw_path)
170
- epw_path = test_epw_path if File.exist? test_epw_path
171
- end
172
- if not File.exist? epw_path
173
- test_epw_path = File.join(File.dirname(__FILE__), '..', 'weather', epw_path)
174
- epw_path = test_epw_path if File.exist? test_epw_path
175
- end
176
- if not File.exist? epw_path
177
- test_epw_path = File.join(File.dirname(__FILE__), '..', '..', 'weather', epw_path)
178
- epw_path = test_epw_path if File.exist? test_epw_path
179
- end
180
- if not File.exist?(epw_path)
181
- fail "'#{epw_path}' could not be found."
182
- end
145
+ epw_path = Location.get_epw_path(hpxml, hpxml_path)
183
146
 
184
147
  cache_path = epw_path.gsub('.epw', '-cache.csv')
185
148
  if not File.exist?(cache_path)
186
149
  # Process weather file to create cache .csv
187
- runner.registerWarning("'#{cache_path}' could not be found; regenerating it.")
188
- epw_file = OpenStudio::EpwFile.new(epw_path)
189
- OpenStudio::Model::WeatherFile.setWeatherFile(model, epw_file)
190
- weather = WeatherProcess.new(model, runner)
191
150
  begin
192
151
  File.open(cache_path, 'wb') do |file|
152
+ runner.registerWarning("'#{cache_path}' could not be found; regenerating it.")
153
+ epw_file = OpenStudio::EpwFile.new(epw_path)
154
+ OpenStudio::Model::WeatherFile.setWeatherFile(model, epw_file)
155
+ weather = WeatherProcess.new(model, runner)
193
156
  weather.dump_to_csv(file)
194
157
  end
195
158
  rescue SystemCallError
@@ -226,8 +189,7 @@ class OSModel
226
189
 
227
190
  check_file_references(hpxml_path)
228
191
  @schedules_file = SchedulesFile.new(runner: runner, model: model,
229
- schedules_paths: @hpxml.header.schedules_filepaths,
230
- col_names: SchedulesFile.ColumnNames)
192
+ schedules_paths: @hpxml.header.schedules_filepaths)
231
193
 
232
194
  weather, epw_file = Location.apply_weather_file(model, runner, epw_path, cache_path)
233
195
  set_defaults_and_globals(runner, output_dir, epw_file, weather, @schedules_file)
@@ -248,26 +210,26 @@ class OSModel
248
210
  add_roofs(runner, model, spaces)
249
211
  add_walls(runner, model, spaces)
250
212
  add_rim_joists(runner, model, spaces)
251
- add_frame_floors(runner, model, spaces)
252
- add_foundation_walls_slabs(runner, model, spaces)
253
- add_shading_schedule(runner, model, weather)
254
- add_windows(runner, model, spaces, weather)
255
- add_doors(runner, model, spaces)
256
- add_skylights(runner, model, spaces, weather)
257
- add_conditioned_floor_area(runner, model, spaces)
258
- add_thermal_mass(runner, model, spaces)
259
- Geometry.set_zone_volumes(runner, model, spaces, @hpxml, @apply_ashrae140_assumptions)
260
- Geometry.explode_surfaces(runner, model, @hpxml, @walls_top)
213
+ add_floors(runner, model, spaces)
214
+ add_foundation_walls_slabs(runner, model, weather, spaces)
215
+ add_shading_schedule(model, weather)
216
+ add_windows(model, spaces)
217
+ add_doors(model, spaces)
218
+ add_skylights(model, spaces)
219
+ add_conditioned_floor_area(model, spaces)
220
+ add_thermal_mass(model, spaces)
221
+ Geometry.set_zone_volumes(spaces, @hpxml, @apply_ashrae140_assumptions)
222
+ Geometry.explode_surfaces(model, @hpxml, @walls_top)
261
223
  add_num_occupants(model, runner, spaces)
262
224
 
263
225
  # HVAC
264
226
 
265
227
  airloop_map = {} # Map of HPXML System ID -> AirLoopHVAC (or ZoneHVACFourPipeFanCoil)
266
- add_ideal_system(runner, model, spaces, epw_path)
267
- add_cooling_system(runner, model, spaces, airloop_map)
228
+ add_ideal_system(model, spaces, epw_path)
229
+ add_cooling_system(model, spaces, airloop_map)
268
230
  add_heating_system(runner, model, spaces, airloop_map)
269
231
  add_heat_pump(runner, model, weather, spaces, airloop_map)
270
- add_dehumidifiers(runner, model, spaces)
232
+ add_dehumidifiers(model, spaces)
271
233
  add_ceiling_fans(runner, model, weather, spaces)
272
234
 
273
235
  # Hot Water
@@ -286,17 +248,18 @@ class OSModel
286
248
  # Other
287
249
 
288
250
  add_airflow(runner, model, weather, spaces, airloop_map)
289
- add_photovoltaics(runner, model)
290
- add_generators(runner, model)
251
+ add_photovoltaics(model)
252
+ add_generators(model)
291
253
  add_batteries(runner, model, spaces)
292
- add_additional_properties(runner, model, hpxml_path, building_id)
254
+ add_additional_properties(model, hpxml_path, building_id)
293
255
 
294
256
  # Output
295
257
 
296
- add_loads_output(runner, model, spaces, add_component_loads)
297
- set_output_files(runner, model)
258
+ add_unmet_hours_output(model, spaces)
259
+ add_loads_output(model, spaces, add_component_loads)
260
+ set_output_files(model)
298
261
  # Uncomment to debug EMS
299
- # add_ems_debug_output(runner, model)
262
+ # add_ems_debug_output(model)
300
263
 
301
264
  if debug
302
265
  osm_output_path = File.join(output_dir, 'in.osm')
@@ -351,15 +314,13 @@ class OSModel
351
314
 
352
315
  # Set globals
353
316
  @cfa = @hpxml.building_construction.conditioned_floor_area
354
- @gfa = @hpxml.slabs.select { |s| s.interior_adjacent_to == HPXML::LocationGarage }.map { |s| s.area }.sum(0.0)
355
- @ubfa = @hpxml.slabs.select { |s| s.interior_adjacent_to == HPXML::LocationBasementUnconditioned }.map { |s| s.area }.sum(0.0)
356
317
  @ncfl = @hpxml.building_construction.number_of_conditioned_floors
357
318
  @ncfl_ag = @hpxml.building_construction.number_of_conditioned_floors_above_grade
358
319
  @nbeds = @hpxml.building_construction.number_of_bedrooms
359
320
  @default_azimuths = HPXMLDefaults.get_default_azimuths(@hpxml)
360
321
 
361
322
  # Apply defaults to HPXML object
362
- HPXMLDefaults.apply(@hpxml, @eri_version, weather, epw_file: epw_file, schedules_file: schedules_file)
323
+ HPXMLDefaults.apply(runner, @hpxml, @eri_version, weather, epw_file: epw_file, schedules_file: schedules_file)
363
324
 
364
325
  @frac_windows_operable = @hpxml.fraction_of_windows_operable()
365
326
 
@@ -381,7 +342,7 @@ class OSModel
381
342
  num_occ = @hpxml.building_occupancy.number_of_residents
382
343
  return if num_occ <= 0
383
344
 
384
- Geometry.apply_occupants(model, runner, @hpxml, num_occ, @cfa, spaces[HPXML::LocationLivingSpace], @schedules_file)
345
+ Geometry.apply_occupants(model, runner, @hpxml, num_occ, spaces[HPXML::LocationLivingSpace], @schedules_file)
385
346
  end
386
347
 
387
348
  def self.create_or_get_space(model, spaces, location)
@@ -466,9 +427,9 @@ class OSModel
466
427
  WoodStudConstructionSet.new(Material.Stud2x4, 0.07, 0.0, 0.5, mat_int_finish, mat_roofing), # 2x4, 16" o.c.
467
428
  WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, fallback_mat_int_finish, mat_roofing), # Fallback
468
429
  ]
469
- match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, roof.id)
430
+ match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
470
431
 
471
- Constructions.apply_closed_cavity_roof(runner, model, surfaces, "#{roof.id} construction",
432
+ Constructions.apply_closed_cavity_roof(model, surfaces, "#{roof.id} construction",
472
433
  cavity_r, install_grade,
473
434
  constr_set.stud.thick_in,
474
435
  true, constr_set.framing_factor,
@@ -484,14 +445,14 @@ class OSModel
484
445
  GenericConstructionSet.new(0.0, 0.5, nil, mat_roofing), # Standard
485
446
  GenericConstructionSet.new(0.0, 0.0, nil, mat_roofing), # Fallback
486
447
  ]
487
- match, constr_set, layer_r = Constructions.pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, roof.id)
448
+ match, constr_set, layer_r = Constructions.pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film)
488
449
 
489
450
  cavity_r = 0
490
451
  cavity_ins_thick_in = 0
491
452
  framing_factor = 0
492
453
  framing_thick_in = 0
493
454
 
494
- Constructions.apply_open_cavity_roof(runner, model, surfaces, "#{roof.id} construction",
455
+ Constructions.apply_open_cavity_roof(model, surfaces, "#{roof.id} construction",
495
456
  cavity_r, install_grade, cavity_ins_thick_in,
496
457
  framing_factor, framing_thick_in,
497
458
  constr_set.osb_thick_in, layer_r + constr_set.rigid_r,
@@ -630,10 +591,10 @@ class OSModel
630
591
  WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.17, 0.0, 2.0, nil, mat_ext_finish), # 2x4
631
592
  WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.01, 0.0, 0.0, nil, mat_ext_finish), # Fallback
632
593
  ]
633
- match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, rim_joist.id)
594
+ match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
634
595
  install_grade = 1
635
596
 
636
- Constructions.apply_rim_joist(runner, model, surfaces, "#{rim_joist.id} construction",
597
+ Constructions.apply_rim_joist(model, surfaces, "#{rim_joist.id} construction",
637
598
  cavity_r, install_grade, constr_set.framing_factor,
638
599
  constr_set.mat_int_finish, constr_set.osb_thick_in,
639
600
  constr_set.rigid_r, constr_set.mat_ext_finish,
@@ -643,18 +604,18 @@ class OSModel
643
604
  end
644
605
  end
645
606
 
646
- def self.add_frame_floors(runner, model, spaces)
647
- @hpxml.frame_floors.each do |frame_floor|
648
- area = frame_floor.area
607
+ def self.add_floors(runner, model, spaces)
608
+ @hpxml.floors.each do |floor|
609
+ area = floor.area
649
610
  width = Math::sqrt(area)
650
611
  length = area / width
651
- if frame_floor.interior_adjacent_to.include?('attic') || frame_floor.exterior_adjacent_to.include?('attic')
612
+ if floor.interior_adjacent_to.include?('attic') || floor.exterior_adjacent_to.include?('attic')
652
613
  z_origin = @walls_top
653
614
  else
654
615
  z_origin = @foundation_top
655
616
  end
656
617
 
657
- if frame_floor.is_ceiling
618
+ if floor.is_ceiling
658
619
  vertices = Geometry.create_ceiling_vertices(length, width, z_origin, @default_azimuths)
659
620
  surface = OpenStudio::Model::Surface.new(vertices, model)
660
621
  surface.additionalProperties.setFeature('SurfaceType', 'Ceiling')
@@ -664,19 +625,19 @@ class OSModel
664
625
  surface.additionalProperties.setFeature('SurfaceType', 'Floor')
665
626
  end
666
627
  surface.additionalProperties.setFeature('Tilt', 0.0)
667
- set_surface_interior(model, spaces, surface, frame_floor)
668
- set_surface_exterior(model, spaces, surface, frame_floor)
669
- surface.setName(frame_floor.id)
670
- if frame_floor.is_interior
628
+ set_surface_interior(model, spaces, surface, floor)
629
+ set_surface_exterior(model, spaces, surface, floor)
630
+ surface.setName(floor.id)
631
+ if floor.is_interior
671
632
  surface.setSunExposure('NoSun')
672
633
  surface.setWindExposure('NoWind')
673
- elsif frame_floor.is_floor
634
+ elsif floor.is_floor
674
635
  surface.setSunExposure('NoSun')
675
636
  end
676
637
 
677
638
  # Apply construction
678
639
 
679
- if frame_floor.is_ceiling
640
+ if floor.is_ceiling
680
641
  if @apply_ashrae140_assumptions
681
642
  # Attic floor
682
643
  inside_film = Material.AirFilmFloorASHRAE140
@@ -685,78 +646,33 @@ class OSModel
685
646
  inside_film = Material.AirFilmFloorAverage
686
647
  outside_film = Material.AirFilmFloorAverage
687
648
  end
688
- mat_int_finish = Material.InteriorFinishMaterial(frame_floor.interior_finish_type, frame_floor.interior_finish_thickness)
689
- if mat_int_finish.nil?
690
- fallback_mat_int_finish = nil
691
- else
692
- fallback_mat_int_finish = Material.InteriorFinishMaterial(mat_int_finish.name, 0.1) # Try thin material
693
- end
694
- constr_sets = [
695
- WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 50.0, 0.0, mat_int_finish, nil), # 2x6, 24" o.c. + R50
696
- WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 40.0, 0.0, mat_int_finish, nil), # 2x6, 24" o.c. + R40
697
- WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 30.0, 0.0, mat_int_finish, nil), # 2x6, 24" o.c. + R30
698
- WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 20.0, 0.0, mat_int_finish, nil), # 2x6, 24" o.c. + R20
699
- WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 10.0, 0.0, mat_int_finish, nil), # 2x6, 24" o.c. + R10
700
- WoodStudConstructionSet.new(Material.Stud2x4, 0.13, 0.0, 0.0, mat_int_finish, nil), # 2x4, 16" o.c.
701
- WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, fallback_mat_int_finish, nil), # Fallback
702
- ]
649
+ mat_int_finish_or_covering = Material.InteriorFinishMaterial(floor.interior_finish_type, floor.interior_finish_thickness)
703
650
  else # Floor
704
651
  if @apply_ashrae140_assumptions
705
652
  # Raised floor
706
653
  inside_film = Material.AirFilmFloorASHRAE140
707
654
  outside_film = Material.AirFilmFloorZeroWindASHRAE140
708
655
  surface.setWindExposure('NoWind')
709
- covering = Material.CoveringBare(1.0)
656
+ mat_int_finish_or_covering = Material.CoveringBare(1.0)
710
657
  else
711
658
  inside_film = Material.AirFilmFloorReduced
712
- if frame_floor.is_exterior
659
+ if floor.is_exterior
713
660
  outside_film = Material.AirFilmOutside
714
661
  else
715
662
  outside_film = Material.AirFilmFloorReduced
716
663
  end
717
- if frame_floor.interior_adjacent_to == HPXML::LocationLivingSpace
718
- covering = Material.CoveringBare
664
+ if floor.interior_adjacent_to == HPXML::LocationLivingSpace
665
+ mat_int_finish_or_covering = Material.CoveringBare
719
666
  end
720
667
  end
721
- if covering.nil?
722
- fallback_covering = nil
723
- else
724
- fallback_covering = Material.CoveringBare(0.8, 0.01) # Try thin material
725
- end
726
- constr_sets = [
727
- WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 20.0, 0.75, nil, covering), # 2x6, 24" o.c. + R20
728
- WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 10.0, 0.75, nil, covering), # 2x6, 24" o.c. + R10
729
- WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 0.0, 0.75, nil, covering), # 2x6, 24" o.c.
730
- WoodStudConstructionSet.new(Material.Stud2x4, 0.13, 0.0, 0.5, nil, covering), # 2x4, 16" o.c.
731
- WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, nil, fallback_covering), # Fallback
732
- ]
733
668
  end
734
- assembly_r = frame_floor.insulation_assembly_r_value
735
-
736
- match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, frame_floor.id)
737
-
738
- install_grade = 1
739
- if frame_floor.is_ceiling
740
669
 
741
- Constructions.apply_ceiling(runner, model, [surface], "#{frame_floor.id} construction",
742
- cavity_r, install_grade,
743
- constr_set.rigid_r, constr_set.framing_factor,
744
- constr_set.stud.thick_in, constr_set.mat_int_finish,
745
- inside_film, outside_film)
746
-
747
- else # Floor
748
- Constructions.apply_floor(runner, model, [surface], "#{frame_floor.id} construction",
749
- cavity_r, install_grade,
750
- constr_set.framing_factor, constr_set.stud.thick_in,
751
- constr_set.osb_thick_in, constr_set.rigid_r,
752
- constr_set.mat_ext_finish, inside_film, outside_film)
753
- end
754
-
755
- Constructions.check_surface_assembly_rvalue(runner, [surface], inside_film, outside_film, assembly_r, match)
670
+ Constructions.apply_floor_ceiling_construction(runner, model, [surface], floor.id, floor.floor_type, floor.is_ceiling, floor.insulation_assembly_r_value,
671
+ mat_int_finish_or_covering, inside_film, outside_film)
756
672
  end
757
673
  end
758
674
 
759
- def self.add_foundation_walls_slabs(runner, model, spaces)
675
+ def self.add_foundation_walls_slabs(runner, model, weather, spaces)
760
676
  foundation_types = @hpxml.slabs.map { |s| s.interior_adjacent_to }.uniq
761
677
 
762
678
  foundation_types.each do |foundation_type|
@@ -835,8 +751,8 @@ class OSModel
835
751
  else
836
752
  z_origin = -1 * slab.depth_below_grade
837
753
  end
838
- kiva_foundation = add_foundation_slab(runner, model, spaces, slab, slab_exp_perim,
839
- slab_area, z_origin, kiva_foundation)
754
+ add_foundation_slab(model, weather, spaces, slab, slab_exp_perim,
755
+ slab_area, z_origin, kiva_foundation)
840
756
  end
841
757
 
842
758
  # For each slab, create a no-wall Kiva slab instance if needed.
@@ -845,8 +761,8 @@ class OSModel
845
761
 
846
762
  z_origin = 0
847
763
  slab_area = total_slab_area * no_wall_slab_exp_perim[slab] / total_slab_exp_perim
848
- kiva_foundation = add_foundation_slab(runner, model, spaces, slab, no_wall_slab_exp_perim[slab],
849
- slab_area, z_origin, nil)
764
+ add_foundation_slab(model, weather, spaces, slab, no_wall_slab_exp_perim[slab],
765
+ slab_area, z_origin, nil)
850
766
  end
851
767
 
852
768
  # Interzonal foundation wall surfaces
@@ -924,6 +840,8 @@ class OSModel
924
840
  length *= total_slab_exp_perim / total_fnd_wall_length
925
841
  end
926
842
 
843
+ return if length < 0.1 # Avoid Kiva error if exposed wall length is too small
844
+
927
845
  if gross_area > net_area
928
846
  # Create a "notch" in the wall to account for the subsurfaces. This ensures that
929
847
  # we preserve the appropriate wall height, length, and area for Kiva.
@@ -976,9 +894,12 @@ class OSModel
976
894
  int_rigid_r = foundation_wall.insulation_interior_r_value
977
895
  end
978
896
 
979
- Constructions.apply_foundation_wall(runner, model, [surface], "#{foundation_wall.id} construction",
897
+ soil_k_in = UnitConversions.convert(@hpxml.site.ground_conductivity, 'ft', 'in')
898
+
899
+ Constructions.apply_foundation_wall(model, [surface], "#{foundation_wall.id} construction",
980
900
  ext_rigid_offset, int_rigid_offset, ext_rigid_height, int_rigid_height,
981
- ext_rigid_r, int_rigid_r, mat_int_finish, mat_wall, height_ag)
901
+ ext_rigid_r, int_rigid_r, mat_int_finish, mat_wall, height_ag,
902
+ soil_k_in)
982
903
 
983
904
  if not assembly_r.nil?
984
905
  Constructions.check_surface_assembly_rvalue(runner, [surface], inside_film, nil, assembly_r, match)
@@ -987,7 +908,7 @@ class OSModel
987
908
  return surface.adjacentFoundation.get
988
909
  end
989
910
 
990
- def self.add_foundation_slab(runner, model, spaces, slab, slab_exp_perim,
911
+ def self.add_foundation_slab(model, weather, spaces, slab, slab_exp_perim,
991
912
  slab_area, z_origin, kiva_foundation)
992
913
 
993
914
  slab_tot_perim = slab_exp_perim
@@ -1041,27 +962,57 @@ class OSModel
1041
962
  mat_carpet = Material.CoveringBare(slab.carpet_fraction,
1042
963
  slab.carpet_r_value)
1043
964
  end
965
+ soil_k_in = UnitConversions.convert(@hpxml.site.ground_conductivity, 'ft', 'in')
1044
966
 
1045
- Constructions.apply_foundation_slab(runner, model, surface, "#{slab.id} construction",
967
+ Constructions.apply_foundation_slab(model, surface, "#{slab.id} construction",
1046
968
  slab_under_r, slab_under_width, slab_gap_r, slab_perim_r,
1047
969
  slab_perim_depth, slab_whole_r, slab.thickness,
1048
- slab_exp_perim, mat_carpet, kiva_foundation)
970
+ slab_exp_perim, mat_carpet, soil_k_in, kiva_foundation)
1049
971
 
1050
- return surface.adjacentFoundation.get
972
+ kiva_foundation = surface.adjacentFoundation.get
973
+
974
+ foundation_walls_insulated = false
975
+ foundation_ceiling_insulated = false
976
+ @hpxml.foundation_walls.each do |fnd_wall|
977
+ next unless fnd_wall.interior_adjacent_to == slab.interior_adjacent_to
978
+ next unless fnd_wall.exterior_adjacent_to == HPXML::LocationGround
979
+
980
+ if fnd_wall.insulation_assembly_r_value.to_f > 5
981
+ foundation_walls_insulated = true
982
+ elsif fnd_wall.insulation_exterior_r_value.to_f + fnd_wall.insulation_interior_r_value.to_f > 0
983
+ foundation_walls_insulated = true
984
+ end
985
+ end
986
+ @hpxml.floors.each do |floor|
987
+ next unless floor.interior_adjacent_to == HPXML::LocationLivingSpace
988
+ next unless floor.exterior_adjacent_to == slab.interior_adjacent_to
989
+
990
+ if floor.insulation_assembly_r_value > 5
991
+ foundation_ceiling_insulated = true
992
+ end
993
+ end
994
+
995
+ Constructions.apply_kiva_initial_temp(kiva_foundation, slab, weather,
996
+ spaces[HPXML::LocationLivingSpace].thermalZone.get,
997
+ @hpxml.header.sim_begin_month, @hpxml.header.sim_begin_day,
998
+ @hpxml.header.sim_calendar_year, @schedules_file,
999
+ foundation_walls_insulated, foundation_ceiling_insulated)
1000
+
1001
+ return kiva_foundation
1051
1002
  end
1052
1003
 
1053
- def self.add_conditioned_floor_area(runner, model, spaces)
1004
+ def self.add_conditioned_floor_area(model, spaces)
1054
1005
  # Check if we need to add floors between conditioned spaces (e.g., between first
1055
1006
  # and second story or conditioned basement ceiling).
1056
1007
  # This ensures that the E+ reported Conditioned Floor Area is correct.
1057
1008
 
1058
1009
  sum_cfa = 0.0
1059
- @hpxml.frame_floors.each do |frame_floor|
1060
- next unless frame_floor.is_floor
1061
- next unless [HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include?(frame_floor.interior_adjacent_to) ||
1062
- [HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include?(frame_floor.exterior_adjacent_to)
1010
+ @hpxml.floors.each do |floor|
1011
+ next unless floor.is_floor
1012
+ next unless [HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include?(floor.interior_adjacent_to) ||
1013
+ [HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include?(floor.exterior_adjacent_to)
1063
1014
 
1064
- sum_cfa += frame_floor.area
1015
+ sum_cfa += floor.area
1065
1016
  end
1066
1017
  @hpxml.slabs.each do |slab|
1067
1018
  next unless [HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include? slab.interior_adjacent_to
@@ -1106,32 +1057,27 @@ class OSModel
1106
1057
  ceiling_surface.additionalProperties.setFeature('Tilt', 0.0)
1107
1058
 
1108
1059
  # Apply Construction
1109
- apply_adiabatic_construction(runner, model, [floor_surface, ceiling_surface], 'floor')
1060
+ apply_adiabatic_construction(model, [floor_surface, ceiling_surface], 'floor')
1110
1061
  end
1111
1062
 
1112
- def self.add_thermal_mass(runner, model, spaces)
1113
- cfa_basement = @hpxml.slabs.select { |s| s.interior_adjacent_to == HPXML::LocationBasementConditioned }.map { |s| s.area }.sum(0.0)
1114
- basement_frac_of_cfa = cfa_basement / @cfa
1063
+ def self.add_thermal_mass(model, spaces)
1115
1064
  if @apply_ashrae140_assumptions
1116
1065
  # 1024 ft2 of interior partition wall mass, no furniture mass
1117
1066
  mat_int_finish = Material.InteriorFinishMaterial(HPXML::InteriorFinishGypsumBoard, 0.5)
1118
1067
  partition_wall_area = 1024.0 * 2 # Exposed partition wall area (both sides)
1119
- Constructions.apply_partition_walls(runner, model, 'PartitionWallConstruction', mat_int_finish, partition_wall_area,
1120
- basement_frac_of_cfa, spaces[HPXML::LocationLivingSpace])
1068
+ Constructions.apply_partition_walls(model, 'PartitionWallConstruction', mat_int_finish, partition_wall_area, spaces)
1121
1069
  else
1122
1070
  mat_int_finish = Material.InteriorFinishMaterial(@hpxml.partition_wall_mass.interior_finish_type, @hpxml.partition_wall_mass.interior_finish_thickness)
1123
1071
  partition_wall_area = @hpxml.partition_wall_mass.area_fraction * @cfa # Exposed partition wall area (both sides)
1124
- Constructions.apply_partition_walls(runner, model, 'PartitionWallConstruction', mat_int_finish, partition_wall_area,
1125
- basement_frac_of_cfa, spaces[HPXML::LocationLivingSpace])
1072
+ Constructions.apply_partition_walls(model, 'PartitionWallConstruction', mat_int_finish, partition_wall_area, spaces)
1126
1073
 
1127
- Constructions.apply_furniture(runner, model, @hpxml.furniture_mass, @cfa, @ubfa, @gfa,
1128
- basement_frac_of_cfa, spaces[HPXML::LocationLivingSpace])
1074
+ Constructions.apply_furniture(model, @hpxml.furniture_mass, spaces)
1129
1075
  end
1130
1076
  end
1131
1077
 
1132
- def self.add_shading_schedule(runner, model, weather)
1078
+ def self.add_shading_schedule(model, weather)
1133
1079
  # Use BAHSP cooling season, and not year-round or user-specified cooling season, to ensure windows use appropriate interior shading factors
1134
- default_heating_months, @default_cooling_months = HVAC.get_default_heating_and_cooling_seasons(weather)
1080
+ _default_heating_months, @default_cooling_months = HVAC.get_default_heating_and_cooling_seasons(weather)
1135
1081
 
1136
1082
  # Create cooling season schedule
1137
1083
  clg_season_sch = MonthWeekdayWeekendSchedule.new(model, 'cooling season schedule', Array.new(24, 1), Array.new(24, 1), @default_cooling_months, Constants.ScheduleTypeLimitsFraction)
@@ -1140,7 +1086,7 @@ class OSModel
1140
1086
  @clg_ssn_sensor.setKeyName(clg_season_sch.schedule.name.to_s)
1141
1087
  end
1142
1088
 
1143
- def self.add_windows(runner, model, spaces, weather)
1089
+ def self.add_windows(model, spaces)
1144
1090
  # We already stored @fraction_of_windows_operable, so lets remove the
1145
1091
  # fraction_operable properties from windows and re-collapse the enclosure
1146
1092
  # so as to prevent potentially modeling multiple identical windows in E+,
@@ -1200,7 +1146,7 @@ class OSModel
1200
1146
  end
1201
1147
 
1202
1148
  # Apply construction
1203
- Constructions.apply_window(runner, model, sub_surface, 'WindowConstruction', ufactor, shgc)
1149
+ Constructions.apply_window(model, sub_surface, 'WindowConstruction', ufactor, shgc)
1204
1150
 
1205
1151
  # Apply interior/exterior shading (as needed)
1206
1152
  shading_vertices = Geometry.create_wall_vertices(window_length, window_height, z_origin, window.azimuth)
@@ -1235,14 +1181,14 @@ class OSModel
1235
1181
  # Apply construction
1236
1182
  inside_film = Material.AirFilmVertical
1237
1183
  outside_film = Material.AirFilmVertical
1238
- Constructions.apply_door(runner, model, [sub_surface], 'Window', ufactor, inside_film, outside_film)
1184
+ Constructions.apply_door(model, [sub_surface], 'Window', ufactor, inside_film, outside_film)
1239
1185
  end
1240
1186
  end
1241
1187
 
1242
- apply_adiabatic_construction(runner, model, surfaces, 'wall')
1188
+ apply_adiabatic_construction(model, surfaces, 'wall')
1243
1189
  end
1244
1190
 
1245
- def self.add_skylights(runner, model, spaces, weather)
1191
+ def self.add_skylights(model, spaces)
1246
1192
  surfaces = []
1247
1193
 
1248
1194
  shading_group = nil
@@ -1278,7 +1224,7 @@ class OSModel
1278
1224
  sub_surface.setSubSurfaceType('Skylight')
1279
1225
 
1280
1226
  # Apply construction
1281
- Constructions.apply_skylight(runner, model, sub_surface, 'SkylightConstruction', ufactor, shgc)
1227
+ Constructions.apply_skylight(model, sub_surface, 'SkylightConstruction', ufactor, shgc)
1282
1228
 
1283
1229
  # Apply interior/exterior shading (as needed)
1284
1230
  shading_vertices = Geometry.create_roof_vertices(length, width, z_origin, skylight.azimuth, tilt)
@@ -1286,10 +1232,10 @@ class OSModel
1286
1232
  shading_schedules, shading_ems, Constants.ObjectNameSkylightShade, @default_cooling_months)
1287
1233
  end
1288
1234
 
1289
- apply_adiabatic_construction(runner, model, surfaces, 'roof')
1235
+ apply_adiabatic_construction(model, surfaces, 'roof')
1290
1236
  end
1291
1237
 
1292
- def self.add_doors(runner, model, spaces)
1238
+ def self.add_doors(model, spaces)
1293
1239
  surfaces = []
1294
1240
  @hpxml.doors.each do |door|
1295
1241
  door_height = 6.67 # ft
@@ -1325,13 +1271,13 @@ class OSModel
1325
1271
  else
1326
1272
  outside_film = Material.AirFilmVertical
1327
1273
  end
1328
- Constructions.apply_door(runner, model, [sub_surface], 'Door', ufactor, inside_film, outside_film)
1274
+ Constructions.apply_door(model, [sub_surface], 'Door', ufactor, inside_film, outside_film)
1329
1275
  end
1330
1276
 
1331
- apply_adiabatic_construction(runner, model, surfaces, 'wall')
1277
+ apply_adiabatic_construction(model, surfaces, 'wall')
1332
1278
  end
1333
1279
 
1334
- def self.apply_adiabatic_construction(runner, model, surfaces, type)
1280
+ def self.apply_adiabatic_construction(model, surfaces, type)
1335
1281
  # Arbitrary construction for heat capacitance.
1336
1282
  # Only applies to surfaces where outside boundary conditioned is
1337
1283
  # adiabatic or surface net area is near zero.
@@ -1340,15 +1286,15 @@ class OSModel
1340
1286
  if type == 'wall'
1341
1287
  mat_int_finish = Material.InteriorFinishMaterial(HPXML::InteriorFinishGypsumBoard, 0.5)
1342
1288
  mat_ext_finish = Material.ExteriorFinishMaterial(HPXML::SidingTypeWood)
1343
- Constructions.apply_wood_stud_wall(runner, model, surfaces, 'AdiabaticWallConstruction',
1289
+ Constructions.apply_wood_stud_wall(model, surfaces, 'AdiabaticWallConstruction',
1344
1290
  0, 1, 3.5, true, 0.1, mat_int_finish, 0, 99, mat_ext_finish,
1345
1291
  Material.AirFilmVertical, Material.AirFilmVertical)
1346
1292
  elsif type == 'floor'
1347
- Constructions.apply_floor(runner, model, surfaces, 'AdiabaticFloorConstruction',
1348
- 0, 1, 0.07, 5.5, 0.75, 99, Material.CoveringBare,
1349
- Material.AirFilmFloorReduced, Material.AirFilmFloorReduced)
1293
+ Constructions.apply_wood_frame_floor_ceiling(model, surfaces, 'AdiabaticFloorConstruction', false,
1294
+ 0, 1, 0.07, 5.5, 0.75, 99, Material.CoveringBare,
1295
+ Material.AirFilmFloorReduced, Material.AirFilmFloorReduced)
1350
1296
  elsif type == 'roof'
1351
- Constructions.apply_open_cavity_roof(runner, model, surfaces, 'AdiabaticRoofConstruction',
1297
+ Constructions.apply_open_cavity_roof(model, surfaces, 'AdiabaticRoofConstruction',
1352
1298
  0, 1, 7.25, 0.07, 7.25, 0.75, 99,
1353
1299
  Material.RoofMaterial(HPXML::RoofTypeAsphaltShingles),
1354
1300
  false, Material.AirFilmOutside,
@@ -1359,22 +1305,22 @@ class OSModel
1359
1305
  def self.add_hot_water_and_appliances(runner, model, weather, spaces)
1360
1306
  # Assign spaces
1361
1307
  @hpxml.clothes_washers.each do |clothes_washer|
1362
- clothes_washer.additional_properties.space = get_space_from_location(clothes_washer.location, 'ClothesWasher', model, spaces)
1308
+ clothes_washer.additional_properties.space = get_space_from_location(clothes_washer.location, spaces)
1363
1309
  end
1364
1310
  @hpxml.clothes_dryers.each do |clothes_dryer|
1365
- clothes_dryer.additional_properties.space = get_space_from_location(clothes_dryer.location, 'ClothesDryer', model, spaces)
1311
+ clothes_dryer.additional_properties.space = get_space_from_location(clothes_dryer.location, spaces)
1366
1312
  end
1367
1313
  @hpxml.dishwashers.each do |dishwasher|
1368
- dishwasher.additional_properties.space = get_space_from_location(dishwasher.location, 'Dishwasher', model, spaces)
1314
+ dishwasher.additional_properties.space = get_space_from_location(dishwasher.location, spaces)
1369
1315
  end
1370
1316
  @hpxml.refrigerators.each do |refrigerator|
1371
- refrigerator.additional_properties.space = get_space_from_location(refrigerator.location, 'Refrigerator', model, spaces)
1317
+ refrigerator.additional_properties.space = get_space_from_location(refrigerator.location, spaces)
1372
1318
  end
1373
1319
  @hpxml.freezers.each do |freezer|
1374
- freezer.additional_properties.space = get_space_from_location(freezer.location, 'Freezer', model, spaces)
1320
+ freezer.additional_properties.space = get_space_from_location(freezer.location, spaces)
1375
1321
  end
1376
1322
  @hpxml.cooking_ranges.each do |cooking_range|
1377
- cooking_range.additional_properties.space = get_space_from_location(cooking_range.location, 'CookingRange', model, spaces)
1323
+ cooking_range.additional_properties.space = get_space_from_location(cooking_range.location, spaces)
1378
1324
  end
1379
1325
 
1380
1326
  # Distribution
@@ -1392,7 +1338,7 @@ class OSModel
1392
1338
  has_uncond_bsmnt = @hpxml.has_location(HPXML::LocationBasementUnconditioned)
1393
1339
  plantloop_map = {}
1394
1340
  @hpxml.water_heating_systems.each do |water_heating_system|
1395
- loc_space, loc_schedule = get_space_or_schedule_from_location(water_heating_system.location, 'WaterHeatingSystem', model, spaces)
1341
+ loc_space, loc_schedule = get_space_or_schedule_from_location(water_heating_system.location, model, spaces)
1396
1342
 
1397
1343
  ec_adj = HotWaterAndAppliances.get_dist_energy_consumption_adjustment(has_uncond_bsmnt, @cfa, @ncfl, water_heating_system, hot_water_distribution)
1398
1344
 
@@ -1400,7 +1346,7 @@ class OSModel
1400
1346
  if water_heating_system.water_heater_type == HPXML::WaterHeaterTypeStorage
1401
1347
  plantloop_map[sys_id] = Waterheater.apply_tank(model, runner, loc_space, loc_schedule, water_heating_system, ec_adj, solar_thermal_system, @eri_version, @schedules_file)
1402
1348
  elsif water_heating_system.water_heater_type == HPXML::WaterHeaterTypeTankless
1403
- plantloop_map[sys_id] = Waterheater.apply_tankless(model, runner, loc_space, loc_schedule, water_heating_system, ec_adj, @nbeds, solar_thermal_system, @eri_version, @schedules_file)
1349
+ plantloop_map[sys_id] = Waterheater.apply_tankless(model, runner, loc_space, loc_schedule, water_heating_system, ec_adj, solar_thermal_system, @eri_version, @schedules_file)
1404
1350
  elsif water_heating_system.water_heater_type == HPXML::WaterHeaterTypeHeatPump
1405
1351
  living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
1406
1352
  plantloop_map[sys_id] = Waterheater.apply_heatpump(model, runner, loc_space, loc_schedule, weather, water_heating_system, ec_adj, solar_thermal_system, living_zone, @eri_version, @schedules_file)
@@ -1416,7 +1362,7 @@ class OSModel
1416
1362
  solar_thermal_system, @eri_version, @schedules_file, plantloop_map)
1417
1363
 
1418
1364
  if (not solar_thermal_system.nil?) && (not solar_thermal_system.collector_area.nil?) # Detailed solar water heater
1419
- loc_space, loc_schedule = get_space_or_schedule_from_location(solar_thermal_system.water_heating_system.location, 'WaterHeatingSystem', model, spaces)
1365
+ loc_space, loc_schedule = get_space_or_schedule_from_location(solar_thermal_system.water_heating_system.location, model, spaces)
1420
1366
  Waterheater.apply_solar_thermal(model, loc_space, loc_schedule, solar_thermal_system, plantloop_map)
1421
1367
  end
1422
1368
 
@@ -1424,7 +1370,7 @@ class OSModel
1424
1370
  Waterheater.apply_combi_system_EMS(model, @hpxml.water_heating_systems, plantloop_map)
1425
1371
  end
1426
1372
 
1427
- def self.add_cooling_system(runner, model, spaces, airloop_map)
1373
+ def self.add_cooling_system(model, spaces, airloop_map)
1428
1374
  living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
1429
1375
 
1430
1376
  HVAC.get_hpxml_hvac_systems(@hpxml).each do |hvac_system|
@@ -1444,6 +1390,9 @@ class OSModel
1444
1390
  if not heating_system.nil?
1445
1391
  sequential_heat_load_fracs = HVAC.calc_sequential_load_fractions(heating_system.fraction_heat_load_served, @remaining_heat_load_frac, @heating_days)
1446
1392
  @remaining_heat_load_frac -= heating_system.fraction_heat_load_served
1393
+ elsif cooling_system.has_integrated_heating
1394
+ sequential_heat_load_fracs = HVAC.calc_sequential_load_fractions(cooling_system.integrated_heating_system_fraction_heat_load_served, @remaining_heat_load_frac, @heating_days)
1395
+ @remaining_heat_load_frac -= cooling_system.integrated_heating_system_fraction_heat_load_served
1447
1396
  else
1448
1397
  sequential_heat_load_fracs = [0]
1449
1398
  end
@@ -1454,13 +1403,13 @@ class OSModel
1454
1403
  HPXML::HVACTypeMiniSplitAirConditioner,
1455
1404
  HPXML::HVACTypePTAC].include? cooling_system.cooling_system_type
1456
1405
 
1457
- airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, runner, cooling_system, heating_system,
1406
+ airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, cooling_system, heating_system,
1458
1407
  sequential_cool_load_fracs, sequential_heat_load_fracs,
1459
1408
  living_zone)
1460
1409
 
1461
1410
  elsif [HPXML::HVACTypeEvaporativeCooler].include? cooling_system.cooling_system_type
1462
1411
 
1463
- airloop_map[sys_id] = HVAC.apply_evaporative_cooler(model, runner, cooling_system,
1412
+ airloop_map[sys_id] = HVAC.apply_evaporative_cooler(model, cooling_system,
1464
1413
  sequential_cool_load_fracs, living_zone)
1465
1414
  end
1466
1415
  end
@@ -1481,9 +1430,6 @@ class OSModel
1481
1430
  if (heating_system.heating_system_type == HPXML::HVACTypeFurnace) && (not cooling_system.nil?)
1482
1431
  next # Already processed combined AC+furnace
1483
1432
  end
1484
- if (heating_system.heating_system_type == HPXML::HVACTypePTACHeating) && (not cooling_system.nil?)
1485
- fail 'Unhandled ducted PTAC/PTHP system.'
1486
- end
1487
1433
 
1488
1434
  # Calculate heating sequential load fractions
1489
1435
  if heating_system.is_heat_pump_backup_system
@@ -1499,9 +1445,9 @@ class OSModel
1499
1445
  end
1500
1446
 
1501
1447
  sys_id = heating_system.id
1502
- if [HPXML::HVACTypeFurnace, HPXML::HVACTypePTACHeating].include? heating_system.heating_system_type
1448
+ if [HPXML::HVACTypeFurnace].include? heating_system.heating_system_type
1503
1449
 
1504
- airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, runner, nil, heating_system,
1450
+ airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, nil, heating_system,
1505
1451
  [0], sequential_heat_load_fracs,
1506
1452
  living_zone)
1507
1453
 
@@ -1512,7 +1458,7 @@ class OSModel
1512
1458
 
1513
1459
  elsif [HPXML::HVACTypeElectricResistance].include? heating_system.heating_system_type
1514
1460
 
1515
- HVAC.apply_electric_baseboard(model, runner, heating_system,
1461
+ HVAC.apply_electric_baseboard(model, heating_system,
1516
1462
  sequential_heat_load_fracs, living_zone)
1517
1463
 
1518
1464
  elsif [HPXML::HVACTypeStove,
@@ -1522,7 +1468,7 @@ class OSModel
1522
1468
  HPXML::HVACTypeFloorFurnace,
1523
1469
  HPXML::HVACTypeFireplace].include? heating_system.heating_system_type
1524
1470
 
1525
- HVAC.apply_unit_heater(model, runner, heating_system,
1471
+ HVAC.apply_unit_heater(model, heating_system,
1526
1472
  sequential_heat_load_fracs, living_zone)
1527
1473
  end
1528
1474
 
@@ -1556,21 +1502,22 @@ class OSModel
1556
1502
  sys_id = heat_pump.id
1557
1503
  if [HPXML::HVACTypeHeatPumpWaterLoopToAir].include? heat_pump.heat_pump_type
1558
1504
 
1559
- airloop_map[sys_id] = HVAC.apply_water_loop_to_air_heat_pump(model, runner, heat_pump,
1505
+ airloop_map[sys_id] = HVAC.apply_water_loop_to_air_heat_pump(model, heat_pump,
1560
1506
  sequential_heat_load_fracs, sequential_cool_load_fracs,
1561
1507
  living_zone)
1562
1508
 
1563
1509
  elsif [HPXML::HVACTypeHeatPumpAirToAir,
1564
1510
  HPXML::HVACTypeHeatPumpMiniSplit,
1565
- HPXML::HVACTypeHeatPumpPTHP].include? heat_pump.heat_pump_type
1566
- airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, runner, heat_pump, heat_pump,
1511
+ HPXML::HVACTypeHeatPumpPTHP,
1512
+ HPXML::HVACTypeHeatPumpRoom].include? heat_pump.heat_pump_type
1513
+ airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, heat_pump, heat_pump,
1567
1514
  sequential_cool_load_fracs, sequential_heat_load_fracs,
1568
1515
  living_zone)
1569
1516
  elsif [HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump.heat_pump_type
1570
1517
 
1571
1518
  airloop_map[sys_id] = HVAC.apply_ground_to_air_heat_pump(model, runner, weather, heat_pump,
1572
1519
  sequential_heat_load_fracs, sequential_cool_load_fracs,
1573
- living_zone)
1520
+ living_zone, @hpxml.site.ground_conductivity)
1574
1521
 
1575
1522
  end
1576
1523
 
@@ -1584,11 +1531,10 @@ class OSModel
1584
1531
  end
1585
1532
  end
1586
1533
 
1587
- def self.add_ideal_system(runner, model, spaces, epw_path)
1534
+ def self.add_ideal_system(model, spaces, epw_path)
1588
1535
  # Adds an ideal air system as needed to meet the load under certain circumstances:
1589
1536
  # 1. the sum of fractions load served is less than 1, or
1590
- # 2. there are non-year-round HVAC seasons, or
1591
- # 3. we're using an ideal air system for e.g. ASHRAE 140 loads calculation.
1537
+ # 2. we're using an ideal air system for e.g. ASHRAE 140 loads calculation.
1592
1538
  living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
1593
1539
  obj_name = Constants.ObjectNameIdealAirSystem
1594
1540
 
@@ -1604,7 +1550,7 @@ class OSModel
1604
1550
  fail 'Unexpected weather file for ASHRAE 140 run.'
1605
1551
  end
1606
1552
  end
1607
- HVAC.apply_ideal_air_loads(model, runner, obj_name, [cooling_load_frac], [heating_load_frac],
1553
+ HVAC.apply_ideal_air_loads(model, obj_name, [cooling_load_frac], [heating_load_frac],
1608
1554
  living_zone)
1609
1555
  return
1610
1556
  end
@@ -1623,16 +1569,8 @@ class OSModel
1623
1569
  sequential_cool_load_frac = 0.0
1624
1570
  end
1625
1571
 
1626
- return if @heating_days.nil?
1627
-
1628
- # For periods of the year outside the HVAC season, operate this ideal air system to meet
1629
- # 100% of the load; for all other periods, operate to meet the fraction of the load not
1630
- # met by the HVAC system(s).
1631
- sequential_heat_load_fracs = @heating_days.map { |d| d == 0 ? 1.0 : sequential_heat_load_frac }
1632
- sequential_cool_load_fracs = @cooling_days.map { |d| d == 0 ? 1.0 : sequential_cool_load_frac }
1633
-
1634
- if (sequential_heat_load_fracs.sum > 0.0) || (sequential_cool_load_fracs.sum > 0.0)
1635
- HVAC.apply_ideal_air_loads(model, runner, obj_name, sequential_cool_load_fracs, sequential_heat_load_fracs,
1572
+ if (sequential_heat_load_frac > 0.0) || (sequential_cool_load_frac > 0.0)
1573
+ HVAC.apply_ideal_air_loads(model, obj_name, [sequential_cool_load_frac], [sequential_heat_load_frac],
1636
1574
  living_zone)
1637
1575
  end
1638
1576
  end
@@ -1654,10 +1592,10 @@ class OSModel
1654
1592
  HVAC.apply_ceiling_fans(model, runner, weather, ceiling_fan, spaces[HPXML::LocationLivingSpace], @schedules_file)
1655
1593
  end
1656
1594
 
1657
- def self.add_dehumidifiers(runner, model, spaces)
1595
+ def self.add_dehumidifiers(model, spaces)
1658
1596
  return if @hpxml.dehumidifiers.size == 0
1659
1597
 
1660
- HVAC.apply_dehumidifiers(model, runner, @hpxml.dehumidifiers, spaces[HPXML::LocationLivingSpace])
1598
+ HVAC.apply_dehumidifiers(model, @hpxml.dehumidifiers, spaces[HPXML::LocationLivingSpace])
1661
1599
  end
1662
1600
 
1663
1601
  def self.check_distribution_system(hvac_distribution, system_type)
@@ -1674,8 +1612,6 @@ class OSModel
1674
1612
  HPXML::HVACTypeHeatPumpWaterLoopToAir => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE] }
1675
1613
 
1676
1614
  if not hvac_distribution_type_map[system_type].include? hvac_distribution.distribution_system_type
1677
- # validator.rb only checks that a HVAC distribution system of the correct type (for the given HVAC system) exists
1678
- # in the HPXML file, not that it is attached to this HVAC system. So here we perform the more rigorous check.
1679
1615
  fail "Incorrect HVAC distribution system type for HVAC type: '#{system_type}'. Should be one of: #{hvac_distribution_type_map[system_type]}"
1680
1616
  end
1681
1617
  end
@@ -1722,26 +1658,26 @@ class OSModel
1722
1658
 
1723
1659
  def self.add_lighting(runner, model, epw_file, spaces)
1724
1660
  Lighting.apply(runner, model, epw_file, spaces, @hpxml.lighting_groups,
1725
- @hpxml.lighting, @eri_version, @schedules_file, @cfa, @gfa)
1661
+ @hpxml.lighting, @eri_version, @schedules_file, @cfa)
1726
1662
  end
1727
1663
 
1728
1664
  def self.add_pools_and_hot_tubs(runner, model, spaces)
1729
1665
  @hpxml.pools.each do |pool|
1730
1666
  next if pool.type == HPXML::TypeNone
1731
1667
 
1732
- MiscLoads.apply_pool_or_hot_tub_heater(model, pool, Constants.ObjectNameMiscPoolHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
1668
+ MiscLoads.apply_pool_or_hot_tub_heater(runner, model, pool, Constants.ObjectNameMiscPoolHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
1733
1669
  next if pool.pump_type == HPXML::TypeNone
1734
1670
 
1735
- MiscLoads.apply_pool_or_hot_tub_pump(model, pool, Constants.ObjectNameMiscPoolPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
1671
+ MiscLoads.apply_pool_or_hot_tub_pump(runner, model, pool, Constants.ObjectNameMiscPoolPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
1736
1672
  end
1737
1673
 
1738
1674
  @hpxml.hot_tubs.each do |hot_tub|
1739
1675
  next if hot_tub.type == HPXML::TypeNone
1740
1676
 
1741
- MiscLoads.apply_pool_or_hot_tub_heater(model, hot_tub, Constants.ObjectNameMiscHotTubHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
1677
+ MiscLoads.apply_pool_or_hot_tub_heater(runner, model, hot_tub, Constants.ObjectNameMiscHotTubHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
1742
1678
  next if hot_tub.pump_type == HPXML::TypeNone
1743
1679
 
1744
- MiscLoads.apply_pool_or_hot_tub_pump(model, hot_tub, Constants.ObjectNameMiscHotTubPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
1680
+ MiscLoads.apply_pool_or_hot_tub_pump(runner, model, hot_tub, Constants.ObjectNameMiscHotTubPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
1745
1681
  end
1746
1682
  end
1747
1683
 
@@ -1751,7 +1687,7 @@ class OSModel
1751
1687
  @hpxml.hvac_distributions.each do |hvac_distribution|
1752
1688
  next unless hvac_distribution.distribution_system_type == HPXML::HVACDistributionTypeAir
1753
1689
 
1754
- air_ducts = create_ducts(runner, model, hvac_distribution, spaces)
1690
+ air_ducts = create_ducts(model, hvac_distribution, spaces)
1755
1691
  next if air_ducts.empty?
1756
1692
 
1757
1693
  # Connect AirLoopHVACs to ducts
@@ -1766,7 +1702,7 @@ class OSModel
1766
1702
  elsif duct_systems[air_ducts] != object
1767
1703
  # Multiple air loops associated with this duct system, treat
1768
1704
  # as separate duct systems.
1769
- air_ducts2 = create_ducts(runner, model, hvac_distribution, spaces)
1705
+ air_ducts2 = create_ducts(model, hvac_distribution, spaces)
1770
1706
  duct_systems[air_ducts2] = object
1771
1707
  added_ducts = true
1772
1708
  end
@@ -1781,7 +1717,7 @@ class OSModel
1781
1717
  @frac_windows_operable, @apply_ashrae140_assumptions, @schedules_file)
1782
1718
  end
1783
1719
 
1784
- def self.create_ducts(runner, model, hvac_distribution, spaces)
1720
+ def self.create_ducts(model, hvac_distribution, spaces)
1785
1721
  air_ducts = []
1786
1722
 
1787
1723
  # Duct leakage (supply/return => [value, units])
@@ -1802,7 +1738,7 @@ class OSModel
1802
1738
  next if ducts.duct_type.nil?
1803
1739
 
1804
1740
  # Calculate total duct area in unconditioned spaces
1805
- total_unconditioned_duct_area[ducts.duct_type] += ducts.duct_surface_area
1741
+ total_unconditioned_duct_area[ducts.duct_type] += ducts.duct_surface_area * ducts.duct_surface_area_multiplier
1806
1742
  end
1807
1743
 
1808
1744
  # Create duct objects
@@ -1811,13 +1747,12 @@ class OSModel
1811
1747
  next if ducts.duct_type.nil?
1812
1748
  next if total_unconditioned_duct_area[ducts.duct_type] <= 0
1813
1749
 
1814
- duct_loc_space, duct_loc_schedule = get_space_or_schedule_from_location(ducts.duct_location, 'Duct', model, spaces)
1750
+ duct_loc_space, duct_loc_schedule = get_space_or_schedule_from_location(ducts.duct_location, model, spaces)
1815
1751
 
1816
1752
  # Apportion leakage to individual ducts by surface area
1817
- duct_leakage_value = leakage_to_outside[ducts.duct_type][0] * ducts.duct_surface_area / total_unconditioned_duct_area[ducts.duct_type]
1753
+ duct_leakage_value = leakage_to_outside[ducts.duct_type][0] * ducts.duct_surface_area * ducts.duct_surface_area_multiplier / total_unconditioned_duct_area[ducts.duct_type]
1818
1754
  duct_leakage_units = leakage_to_outside[ducts.duct_type][1]
1819
1755
 
1820
- duct_leakage_cfm = nil
1821
1756
  duct_leakage_frac = nil
1822
1757
  if duct_leakage_units == HPXML::UnitsCFM25
1823
1758
  duct_leakage_cfm25 = duct_leakage_value
@@ -1829,7 +1764,7 @@ class OSModel
1829
1764
  fail "#{ducts.duct_type.capitalize} ducts exist but leakage was not specified for distribution system '#{hvac_distribution.id}'."
1830
1765
  end
1831
1766
 
1832
- air_ducts << Duct.new(ducts.duct_type, duct_loc_space, duct_loc_schedule, duct_leakage_frac, duct_leakage_cfm25, duct_leakage_cfm50, ducts.duct_surface_area, ducts.duct_insulation_r_value)
1767
+ air_ducts << Duct.new(ducts.duct_type, duct_loc_space, duct_loc_schedule, duct_leakage_frac, duct_leakage_cfm25, duct_leakage_cfm50, ducts.duct_surface_area * ducts.duct_surface_area_multiplier, ducts.duct_insulation_r_value)
1833
1768
  end
1834
1769
 
1835
1770
  # If all ducts are in conditioned space, model leakage as going to outside
@@ -1843,8 +1778,6 @@ class OSModel
1843
1778
  duct_leakage_value = leakage_to_outside[duct_side][0]
1844
1779
  duct_leakage_units = leakage_to_outside[duct_side][1]
1845
1780
 
1846
- duct_leakage_cfm = nil
1847
- duct_leakage_frac = nil
1848
1781
  if duct_leakage_units == HPXML::UnitsCFM25
1849
1782
  duct_leakage_cfm25 = duct_leakage_value
1850
1783
  elsif duct_leakage_units == HPXML::UnitsCFM50
@@ -1861,7 +1794,7 @@ class OSModel
1861
1794
  return air_ducts
1862
1795
  end
1863
1796
 
1864
- def self.add_photovoltaics(runner, model)
1797
+ def self.add_photovoltaics(model)
1865
1798
  @hpxml.pv_systems.each do |pv_system|
1866
1799
  next if pv_system.inverter_efficiency == @hpxml.pv_systems[0].inverter_efficiency
1867
1800
 
@@ -1872,25 +1805,21 @@ class OSModel
1872
1805
  end
1873
1806
  end
1874
1807
 
1875
- def self.add_generators(runner, model)
1808
+ def self.add_generators(model)
1876
1809
  @hpxml.generators.each do |generator|
1877
1810
  Generator.apply(model, @nbeds, generator)
1878
1811
  end
1879
1812
  end
1880
1813
 
1881
1814
  def self.add_batteries(runner, model, spaces)
1882
- return if @hpxml.pv_systems.empty?
1883
-
1884
1815
  @hpxml.batteries.each do |battery|
1885
1816
  # Assign space
1886
- if battery.location != HPXML::LocationOutside
1887
- battery.additional_properties.space = get_space_from_location(battery.location, 'Battery', model, spaces)
1888
- end
1889
- Battery.apply(runner, model, battery)
1817
+ battery.additional_properties.space = get_space_from_location(battery.location, spaces)
1818
+ Battery.apply(runner, model, @hpxml.pv_systems, battery, @schedules_file)
1890
1819
  end
1891
1820
  end
1892
1821
 
1893
- def self.add_additional_properties(runner, model, hpxml_path, building_id)
1822
+ def self.add_additional_properties(model, hpxml_path, building_id)
1894
1823
  # Store some data for use in reporting measure
1895
1824
  additionalProperties = model.getBuilding.additionalProperties
1896
1825
  additionalProperties.setFeature('hpxml_path', hpxml_path)
@@ -1900,30 +1829,78 @@ class OSModel
1900
1829
  additionalProperties.setFeature('emissions_scenario_names', emissions_scenario_names)
1901
1830
  emissions_scenario_types = @hpxml.header.emissions_scenarios.map { |s| s.emissions_type }.to_s
1902
1831
  additionalProperties.setFeature('emissions_scenario_types', emissions_scenario_types)
1832
+ has_heating = (@hpxml.total_fraction_heat_load_served > 0)
1833
+ additionalProperties.setFeature('has_heating', has_heating)
1834
+ has_cooling = (@hpxml.total_fraction_cool_load_served > 0)
1835
+ additionalProperties.setFeature('has_cooling', has_cooling)
1903
1836
  end
1904
1837
 
1905
- def self.map_to_string(map)
1906
- map_str = {}
1907
- map.each do |sys_id, objects|
1908
- object_name_list = []
1909
- objects.uniq.each do |object|
1910
- object_name_list << object.name.to_s
1838
+ def self.add_unmet_hours_output(model, spaces)
1839
+ # We do our own unmet hours calculation via EMS so that we can incorporate,
1840
+ # e.g., heating/cooling seasons into the logic.
1841
+ hvac_control = @hpxml.hvac_controls[0]
1842
+ if not hvac_control.nil?
1843
+ sim_year = @hpxml.header.sim_calendar_year
1844
+ htg_start_day = Schedule.get_day_num_from_month_day(sim_year, hvac_control.seasons_heating_begin_month, hvac_control.seasons_heating_begin_day)
1845
+ htg_end_day = Schedule.get_day_num_from_month_day(sim_year, hvac_control.seasons_heating_end_month, hvac_control.seasons_heating_end_day)
1846
+ clg_start_day = Schedule.get_day_num_from_month_day(sim_year, hvac_control.seasons_cooling_begin_month, hvac_control.seasons_cooling_begin_day)
1847
+ clg_end_day = Schedule.get_day_num_from_month_day(sim_year, hvac_control.seasons_cooling_end_month, hvac_control.seasons_cooling_end_day)
1848
+ end
1849
+
1850
+ living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
1851
+
1852
+ # EMS sensors
1853
+ htg_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Heating Setpoint Not Met Time')
1854
+ htg_sensor.setName('zone htg unmet s')
1855
+ htg_sensor.setKeyName(living_zone.name.to_s)
1856
+
1857
+ clg_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Cooling Setpoint Not Met Time')
1858
+ clg_sensor.setName('zone clg unmet s')
1859
+ clg_sensor.setKeyName(living_zone.name.to_s)
1860
+
1861
+ # EMS program
1862
+ clg_hrs = 'clg_unmet_hours'
1863
+ htg_hrs = 'htg_unmet_hours'
1864
+ program = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
1865
+ program.setName(Constants.ObjectNameUnmetHoursProgram)
1866
+ program.addLine("Set #{htg_hrs} = 0")
1867
+ program.addLine("Set #{clg_hrs} = 0")
1868
+ if @hpxml.total_fraction_heat_load_served > 0
1869
+ if htg_end_day >= htg_start_day
1870
+ program.addLine("If (DayOfYear >= #{htg_start_day}) && (DayOfYear <= #{htg_end_day})")
1871
+ else
1872
+ program.addLine("If (DayOfYear >= #{htg_start_day}) || (DayOfYear <= #{htg_end_day})")
1873
+ end
1874
+ program.addLine(" Set #{htg_hrs} = #{htg_hrs} + #{htg_sensor.name}")
1875
+ program.addLine('EndIf')
1876
+ end
1877
+ if @hpxml.total_fraction_cool_load_served > 0
1878
+ if clg_end_day >= clg_start_day
1879
+ program.addLine("If (DayOfYear >= #{clg_start_day}) && (DayOfYear <= #{clg_end_day})")
1880
+ else
1881
+ program.addLine("If (DayOfYear >= #{clg_start_day}) || (DayOfYear <= #{clg_end_day})")
1911
1882
  end
1912
- map_str[sys_id] = object_name_list if object_name_list.size > 0
1883
+ program.addLine(" Set #{clg_hrs} = #{clg_hrs} + #{clg_sensor.name}")
1884
+ program.addLine('EndIf')
1913
1885
  end
1914
- return map_str.to_s
1886
+
1887
+ # EMS calling manager
1888
+ program_calling_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
1889
+ program_calling_manager.setName("#{program.name} calling manager")
1890
+ program_calling_manager.setCallingPoint('EndOfZoneTimestepBeforeZoneReporting')
1891
+ program_calling_manager.addProgram(program)
1915
1892
  end
1916
1893
 
1917
- def self.add_loads_output(runner, model, spaces, add_component_loads)
1894
+ def self.add_loads_output(model, spaces, add_component_loads)
1918
1895
  living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
1919
1896
 
1920
- liv_load_sensors, intgain_dehumidifier = add_total_loads_output(runner, model, living_zone)
1897
+ liv_load_sensors, intgain_dehumidifier = add_total_loads_output(model, living_zone)
1921
1898
  return unless add_component_loads
1922
1899
 
1923
- add_component_loads_output(runner, model, living_zone, liv_load_sensors, intgain_dehumidifier)
1900
+ add_component_loads_output(model, living_zone, liv_load_sensors, intgain_dehumidifier)
1924
1901
  end
1925
1902
 
1926
- def self.add_total_loads_output(runner, model, living_zone)
1903
+ def self.add_total_loads_output(model, living_zone)
1927
1904
  # Energy transferred in the conditioned space, used for determining heating (winter) vs cooling (summer)
1928
1905
  liv_load_sensors = {}
1929
1906
  liv_load_sensors[:htg] = OpenStudio::Model::EnergyManagementSystemSensor.new(model, "Heating:EnergyTransfer:Zone:#{living_zone.name.to_s.upcase}")
@@ -1978,7 +1955,7 @@ class OSModel
1978
1955
  return liv_load_sensors, intgain_dehumidifier
1979
1956
  end
1980
1957
 
1981
- def self.add_component_loads_output(runner, model, living_zone, liv_load_sensors, intgain_dehumidifier)
1958
+ def self.add_component_loads_output(model, living_zone, liv_load_sensors, intgain_dehumidifier)
1982
1959
  # Prevent certain objects (e.g., OtherEquipment) from being counted towards both, e.g., ducts and internal gains
1983
1960
  objects_already_processed = []
1984
1961
 
@@ -2002,7 +1979,7 @@ class OSModel
2002
1979
 
2003
1980
  area_tolerance = UnitConversions.convert(1.0, 'ft^2', 'm^2')
2004
1981
 
2005
- model.getSurfaces.sort.each_with_index do |s, idx|
1982
+ model.getSurfaces.sort.each do |s|
2006
1983
  next unless s.space.get.thermalZone.get.name.to_s == living_zone.name.to_s
2007
1984
 
2008
1985
  surface_type = s.additionalProperties.getFeatureAsString('SurfaceType')
@@ -2371,7 +2348,7 @@ class OSModel
2371
2348
  program_calling_manager.addProgram(program)
2372
2349
  end
2373
2350
 
2374
- def self.set_output_files(runner, model)
2351
+ def self.set_output_files(model)
2375
2352
  oj = model.getOutputJSON
2376
2353
  oj.setOptionType('TimeSeriesAndTabular')
2377
2354
  oj.setOutputJSON(false)
@@ -2390,7 +2367,7 @@ class OSModel
2390
2367
  ocf.setOutputPerfLog(@debug)
2391
2368
  end
2392
2369
 
2393
- def self.add_ems_debug_output(runner, model)
2370
+ def self.add_ems_debug_output(model)
2394
2371
  oems = model.getOutputEnergyManagementSystem
2395
2372
  oems.setActuatorAvailabilityDictionaryReporting('Verbose')
2396
2373
  oems.setInternalVariableAvailabilityDictionaryReporting('Verbose')
@@ -2408,7 +2385,6 @@ class OSModel
2408
2385
 
2409
2386
  def self.set_surface_exterior(model, spaces, surface, hpxml_surface)
2410
2387
  exterior_adjacent_to = hpxml_surface.exterior_adjacent_to
2411
- interior_adjacent_to = hpxml_surface.interior_adjacent_to
2412
2388
  is_adiabatic = hpxml_surface.is_adiabatic
2413
2389
  if exterior_adjacent_to == HPXML::LocationOutside
2414
2390
  surface.setOutsideBoundaryCondition('Outdoors')
@@ -2420,26 +2396,31 @@ class OSModel
2420
2396
  HPXML::LocationOtherNonFreezingSpace, HPXML::LocationOtherHousingUnit].include? exterior_adjacent_to
2421
2397
  set_surface_otherside_coefficients(surface, exterior_adjacent_to, model, spaces)
2422
2398
  elsif HPXML::conditioned_below_grade_locations.include? exterior_adjacent_to
2423
- surface.createAdjacentSurface(create_or_get_space(model, spaces, HPXML::LocationLivingSpace))
2399
+ adjacent_surface = surface.createAdjacentSurface(create_or_get_space(model, spaces, HPXML::LocationLivingSpace)).get
2400
+ adjacent_surface.additionalProperties.setFeature('SurfaceType', surface.additionalProperties.getFeatureAsString('SurfaceType').get)
2424
2401
  else
2425
- surface.createAdjacentSurface(create_or_get_space(model, spaces, exterior_adjacent_to))
2402
+ adjacent_surface = surface.createAdjacentSurface(create_or_get_space(model, spaces, exterior_adjacent_to)).get
2403
+ adjacent_surface.additionalProperties.setFeature('SurfaceType', surface.additionalProperties.getFeatureAsString('SurfaceType').get)
2426
2404
  end
2427
2405
  end
2428
2406
 
2429
2407
  def self.set_surface_otherside_coefficients(surface, exterior_adjacent_to, model, spaces)
2430
- if spaces[exterior_adjacent_to].nil?
2408
+ otherside_coeffs = nil
2409
+ model.getSurfacePropertyOtherSideCoefficientss.each do |c|
2410
+ next unless c.name.to_s == exterior_adjacent_to
2411
+
2412
+ otherside_coeffs = c
2413
+ end
2414
+ if otherside_coeffs.nil?
2431
2415
  # Create E+ other side coefficient object
2432
- otherside_object = OpenStudio::Model::SurfacePropertyOtherSideCoefficients.new(model)
2433
- otherside_object.setName(exterior_adjacent_to)
2434
- otherside_object.setCombinedConvectiveRadiativeFilmCoefficient(UnitConversions.convert(1.0 / Material.AirFilmVertical.rvalue, 'Btu/(hr*ft^2*F)', 'W/(m^2*K)'))
2416
+ otherside_coeffs = OpenStudio::Model::SurfacePropertyOtherSideCoefficients.new(model)
2417
+ otherside_coeffs.setName(exterior_adjacent_to)
2418
+ otherside_coeffs.setCombinedConvectiveRadiativeFilmCoefficient(UnitConversions.convert(1.0 / Material.AirFilmVertical.rvalue, 'Btu/(hr*ft^2*F)', 'W/(m^2*K)'))
2435
2419
  # Schedule of space temperature, can be shared with water heater/ducts
2436
2420
  sch = get_space_temperature_schedule(model, exterior_adjacent_to, spaces)
2437
- otherside_object.setConstantTemperatureSchedule(sch)
2438
- surface.setSurfacePropertyOtherSideCoefficients(otherside_object)
2439
- spaces[exterior_adjacent_to] = otherside_object
2440
- else
2441
- surface.setSurfacePropertyOtherSideCoefficients(spaces[exterior_adjacent_to])
2421
+ otherside_coeffs.setConstantTemperatureSchedule(sch)
2442
2422
  end
2423
+ surface.setSurfacePropertyOtherSideCoefficients(otherside_coeffs)
2443
2424
  surface.setSunExposure('NoSun')
2444
2425
  surface.setWindExposure('NoWind')
2445
2426
  end
@@ -2529,7 +2510,7 @@ class OSModel
2529
2510
  # Returns an OS:Space, or temperature OS:Schedule for a MF space, or nil if outside
2530
2511
  # Should be called when the object's energy use is sensitive to ambient temperature
2531
2512
  # (e.g., water heaters and ducts).
2532
- def self.get_space_or_schedule_from_location(location, object_name, model, spaces)
2513
+ def self.get_space_or_schedule_from_location(location, model, spaces)
2533
2514
  return if [HPXML::LocationOtherExterior,
2534
2515
  HPXML::LocationOutside,
2535
2516
  HPXML::LocationRoofDeck].include? location
@@ -2545,32 +2526,27 @@ class OSModel
2545
2526
  # if located in spaces where we don't model a thermal zone, create and return temperature schedule
2546
2527
  sch = get_space_temperature_schedule(model, location, spaces)
2547
2528
  else
2548
- space = get_space_from_location(location, object_name, model, spaces)
2529
+ space = get_space_from_location(location, spaces)
2549
2530
  end
2550
2531
 
2551
2532
  return space, sch
2552
2533
  end
2553
2534
 
2554
- # Returns an OS:Space, or nil if a MF space
2535
+ # Returns an OS:Space, or nil if a MF space or outside
2555
2536
  # Should be called when the object's energy use is NOT sensitive to ambient temperature
2556
2537
  # (e.g., appliances).
2557
- def self.get_space_from_location(location, object_name, model, spaces)
2558
- return if [HPXML::LocationOtherHeatedSpace,
2538
+ def self.get_space_from_location(location, spaces)
2539
+ return if [HPXML::LocationOutside,
2540
+ HPXML::LocationOtherHeatedSpace,
2559
2541
  HPXML::LocationOtherHousingUnit,
2560
2542
  HPXML::LocationOtherMultifamilyBufferSpace,
2561
2543
  HPXML::LocationOtherNonFreezingSpace].include? location
2562
2544
 
2563
- num_orig_spaces = spaces.size
2564
-
2565
2545
  if HPXML::conditioned_locations.include? location
2566
- space = create_or_get_space(model, spaces, HPXML::LocationLivingSpace)
2567
- else
2568
- space = create_or_get_space(model, spaces, location)
2546
+ location = HPXML::LocationLivingSpace
2569
2547
  end
2570
2548
 
2571
- fail if spaces.size != num_orig_spaces # EPvalidator.xml should prevent this
2572
-
2573
- return space
2549
+ return spaces[location]
2574
2550
  end
2575
2551
 
2576
2552
  def self.set_subsurface_exterior(surface, spaces, model, hpxml_surface)