urbanopt-cli 0.9.3 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (641) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/{nightly_build.yml → nightly_ci_build.yml} +6 -5
  3. data/CHANGELOG.md +11 -2
  4. data/CMakeLists.txt +7 -7
  5. data/Gemfile +6 -5
  6. data/LICENSE.md +18 -15
  7. data/README.md +2 -1
  8. data/Rakefile +2 -37
  9. data/example_files/Gemfile +8 -8
  10. data/example_files/mappers/Baseline.rb +170 -191
  11. data/example_files/mappers/ChilledWaterStorage.rb +8 -30
  12. data/example_files/mappers/ClassProject.rb +2 -27
  13. data/example_files/mappers/CreateBar.rb +2 -28
  14. data/example_files/mappers/EvCharging.rb +2 -27
  15. data/example_files/mappers/FlexibleHotWater.rb +2 -27
  16. data/example_files/mappers/Floorspace.rb +2 -27
  17. data/example_files/mappers/HighEfficiency.rb +2 -27
  18. data/example_files/mappers/HighEfficiencyCreateBar.rb +2 -27
  19. data/example_files/mappers/HighEfficiencyFloorspace.rb +2 -27
  20. data/example_files/mappers/PeakHoursMelsShedding.rb +4 -27
  21. data/example_files/mappers/PeakHoursThermostatAdjust.rb +4 -27
  22. data/example_files/mappers/ThermalStorage.rb +2 -28
  23. data/example_files/measures/BuildResidentialModel/measure.rb +30 -60
  24. data/example_files/measures/BuildResidentialModel/measure.xml +253 -84
  25. data/example_files/measures/BuildResidentialModel/resources/util.rb +45 -45
  26. data/example_files/python_deps/dependencies.json +3 -3
  27. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +1 -1
  28. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +28 -19
  29. data/example_files/resources/hpxml-measures/.gitignore +0 -997
  30. data/example_files/resources/hpxml-measures/.readthedocs.yml +9 -0
  31. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +476 -230
  32. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +244 -75
  33. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +42 -15
  34. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +24 -9
  35. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +11 -33
  36. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +23 -50
  37. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/README.md +2 -2
  38. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/constants.rb +119 -0
  39. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +67 -290
  40. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules_config.md +6 -5
  41. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +78 -349
  42. data/example_files/resources/hpxml-measures/Changelog.md +80 -10
  43. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +212 -144
  44. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +164 -170
  45. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +238 -167
  46. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +1 -1
  47. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +12 -4
  48. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +36 -6
  49. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv +33 -0
  50. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  51. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +9 -7
  52. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +79 -61
  53. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +387 -124
  54. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +427 -196
  55. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +11515 -2
  56. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/README.md +1 -0
  57. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +224 -85
  58. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +334 -319
  59. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +572 -838
  60. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +162 -68
  61. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +4 -20
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +12 -10
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +34 -37
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +8 -101
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +31 -40
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +1 -1
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv +8761 -0
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-10-mins.csv +52561 -52561
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic.csv +8761 -8761
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +384 -155
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +1 -1
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/util.rb +2 -2
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +68 -90
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +34 -223
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +1 -1
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +16 -4
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +94 -40
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +765 -302
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +119 -69
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +8 -8
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +1 -1
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +51 -11
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +196 -9
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +36 -13
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +3 -3
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +2 -2
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +571 -61
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +190 -81
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +11 -11
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +188 -50
  92. data/example_files/resources/hpxml-measures/README.md +3 -3
  93. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +659 -815
  94. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +301 -1112
  95. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +605 -350
  96. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +18 -14
  97. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +15 -15
  98. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +13 -3
  99. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +3 -3
  100. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +894 -596
  101. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +127 -76
  102. data/example_files/resources/hpxml-measures/tasks.rb +185 -2802
  103. data/example_files/resources/hpxml-measures/workflow/hpxml_inputs.json +3401 -0
  104. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +0 -1
  105. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +0 -1
  106. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +0 -1
  107. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +0 -1
  108. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +0 -1
  109. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +1 -3
  110. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +0 -1
  111. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +1 -3
  112. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +0 -1
  113. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +1 -3
  114. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +0 -1
  115. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +0 -1
  116. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +0 -1
  117. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +0 -1
  118. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +0 -1
  119. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +3 -4
  120. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +17 -4
  121. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +2 -3
  122. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +3 -4
  123. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +3 -4
  124. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +4 -5
  125. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +3 -4
  126. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +3 -4
  127. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +3 -4
  128. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +3 -4
  129. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +1 -1
  130. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +1 -1
  131. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +1 -1
  132. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +1 -1
  133. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +0 -1
  134. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +4 -5
  135. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +3 -3
  136. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +3 -3
  137. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +3 -4
  138. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +3 -3
  139. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +3 -4
  140. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +3 -3
  141. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +3 -4
  142. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +3 -3
  143. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +3 -4
  144. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +0 -1
  145. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +0 -1
  146. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +0 -1
  147. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +0 -1
  148. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +0 -1
  149. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +1 -0
  150. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +1 -0
  151. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +12 -8
  152. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +10 -40
  153. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +10 -40
  154. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +10 -40
  155. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +10 -40
  156. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +10 -40
  157. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +10 -40
  158. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +10 -40
  159. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +10 -40
  160. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +10 -40
  161. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +10 -40
  162. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +10 -40
  163. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +10 -40
  164. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +10 -40
  165. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +10 -40
  166. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +9 -39
  167. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +9 -39
  168. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +10 -40
  169. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +10 -40
  170. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +10 -40
  171. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +10 -40
  172. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +10 -40
  173. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-single-family-attached-2stories.xml → base-bldgtype-attached-2stories.xml} +610 -639
  174. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-single-family-attached-atticroof-cathedral.xml → base-bldgtype-attached-atticroof-cathedral.xml} +558 -587
  175. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-attached-infil-compartmentalization-test.xml +611 -0
  176. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-single-family-attached.xml → base-bldgtype-attached.xml} +610 -639
  177. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +10 -39
  178. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +10 -39
  179. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +10 -39
  180. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +10 -39
  181. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +10 -39
  182. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-infil-compartmentalization-test.xml +462 -0
  183. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-calctype-operational.xml → base-bldgtype-multifamily-residents-1.xml} +453 -480
  184. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +10 -39
  185. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +10 -39
  186. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +10 -39
  187. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +10 -39
  188. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +10 -39
  189. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +10 -39
  190. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +10 -39
  191. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +10 -39
  192. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +10 -39
  193. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +10 -39
  194. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +10 -39
  195. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +10 -39
  196. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +10 -39
  197. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +10 -39
  198. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +10 -39
  199. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +11 -40
  200. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +10 -39
  201. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +10 -39
  202. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +10 -39
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +10 -39
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +10 -39
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +10 -39
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +15 -40
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +10 -39
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +10 -39
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +10 -39
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +10 -40
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +10 -40
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +10 -40
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +10 -40
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +10 -40
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +10 -40
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +10 -40
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +10 -40
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +10 -40
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +10 -40
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +10 -40
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +10 -40
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +10 -40
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +10 -40
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +10 -40
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +10 -40
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +10 -40
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +10 -40
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +10 -40
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +10 -40
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +10 -40
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +10 -40
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +10 -40
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +10 -40
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +10 -40
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +10 -40
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +10 -40
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +10 -40
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +10 -40
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +10 -40
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +10 -40
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +10 -40
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +10 -40
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +10 -40
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +10 -40
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +10 -40
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +10 -40
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +10 -40
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +10 -40
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +10 -40
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +10 -40
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +11 -43
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +10 -40
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +10 -40
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +10 -40
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +10 -40
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +10 -40
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +10 -40
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +10 -40
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +10 -40
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +10 -40
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +10 -40
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +10 -40
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +10 -40
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +10 -40
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +10 -40
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +10 -40
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +10 -40
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +10 -40
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +10 -40
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +19 -25
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +10 -40
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +10 -40
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +10 -40
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +10 -40
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +10 -40
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +10 -40
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +10 -40
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +18 -24
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +11 -41
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +11 -41
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +10 -40
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ela.xml +549 -0
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +13 -43
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +10 -40
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-cfm.xml +552 -0
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +10 -40
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +10 -40
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +17 -47
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +10 -40
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +10 -40
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +10 -40
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +10 -40
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +10 -40
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +10 -40
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +10 -40
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +10 -40
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +10 -40
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +10 -40
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading-seasons.xml +559 -0
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +10 -40
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +10 -40
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +10 -40
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +19 -25
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +10 -40
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +10 -40
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-insulation.xml +10 -40
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +10 -40
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +10 -40
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +10 -40
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +10 -40
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +10 -40
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +10 -40
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +10 -40
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +10 -40
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +10 -40
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +10 -40
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-autosized-backup.xml +557 -0
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +16 -41
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml → base-hvac-air-to-air-heat-pump-1-speed-heating-capacity-17f.xml} +552 -583
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +16 -41
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml → base-hvac-air-to-air-heat-pump-1-speed-lockout-temperatures.xml} +562 -586
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +16 -41
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +16 -41
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +16 -41
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-hvac-seasons.xml +587 -0
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +17 -42
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +16 -41
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +16 -41
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +16 -41
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +10 -40
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +10 -40
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +10 -40
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +10 -40
  334. 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 +10 -40
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +10 -40
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +10 -40
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +10 -40
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +10 -40
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +10 -40
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +10 -40
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml +10 -40
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml +10 -40
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +10 -40
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +10 -40
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +10 -40
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +10 -40
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +10 -40
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +10 -40
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +10 -40
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +10 -40
  351. 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 +11 -41
  352. 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 +11 -41
  353. 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 +11 -41
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted-backup-hardsized.xml +553 -0
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +11 -41
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +10 -40
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +10 -40
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +10 -40
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +10 -40
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +10 -40
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +10 -40
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +10 -40
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +10 -40
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +10 -40
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +10 -40
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +10 -40
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +10 -40
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +10 -40
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +10 -40
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +10 -40
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +10 -40
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +10 -40
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +10 -40
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +10 -40
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-baseboard.xml +519 -0
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +10 -40
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +10 -40
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +10 -40
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +16 -40
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +16 -40
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +16 -40
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +10 -40
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +10 -40
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +16 -40
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +16 -40
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +16 -40
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-sizing-controls.xml +566 -0
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +10 -40
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +10 -40
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +10 -40
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +10 -40
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +10 -40
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +10 -40
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only-pilot.xml +513 -0
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +10 -40
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +10 -40
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +10 -40
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +10 -40
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +10 -40
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +10 -40
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +10 -40
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +10 -40
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +16 -41
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-crankcase-heater-40w.xml +556 -0
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +10 -40
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-lockout-temperatures.xml +560 -0
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +17 -42
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +17 -42
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +17 -42
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +17 -42
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +10 -40
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +10 -40
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-buried.xml +555 -0
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-effective-rvalue.xml +553 -0
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +10 -40
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +10 -40
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +10 -40
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +10 -40
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +10 -40
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +10 -40
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +10 -40
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +10 -40
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only-pilot-light.xml +506 -0
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +10 -40
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +10 -40
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +10 -40
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +10 -40
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +10 -40
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +10 -40
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +10 -40
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-pilot.xml +542 -0
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +10 -40
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +10 -40
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +10 -40
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +10 -40
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +10 -40
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +10 -40
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +10 -40
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +10 -40
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +10 -40
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +14 -41
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +14 -41
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +14 -41
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +10 -40
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +10 -40
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +10 -40
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +10 -40
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +10 -40
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +10 -40
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +14 -41
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +10 -40
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +10 -40
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +16 -41
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +16 -41
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +16 -41
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-baseboard.xml +525 -0
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-furnace.xml +564 -0
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +16 -41
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-heating-capacity-17f.xml +506 -0
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -41
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +10 -40
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +10 -40
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +10 -40
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +10 -40
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-natural-gas.xml +10 -40
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +10 -40
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp-heating-capacity-17f.xml +513 -0
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +16 -40
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +10 -40
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +10 -40
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +10 -40
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +10 -40
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +10 -40
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +16 -40
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +10 -40
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +10 -40
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +10 -40
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +10 -40
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +10 -40
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +10 -40
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +10 -40
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +10 -40
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +10 -40
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +11 -41
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +10 -40
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-kwh-per-year.xml +529 -0
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-mixed.xml +537 -0
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none-ceiling-fans.xml +516 -0
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +1 -7
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +10 -40
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +10 -40
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +10 -40
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +10 -40
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +10 -40
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +10 -40
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +10 -40
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +10 -40
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +10 -40
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +10 -40
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +10 -40
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +12 -42
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +10 -40
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +10 -40
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +10 -40
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +10 -40
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +10 -40
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +10 -40
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +10 -40
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +10 -40
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +10 -40
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +10 -40
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +10 -40
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +10 -40
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +14 -44
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +10 -40
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +10 -40
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +10 -38
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +10 -40
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +16 -42
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +16 -42
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +16 -42
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +10 -40
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +14 -37
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +16 -42
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +12 -42
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +12 -42
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +12 -42
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +10 -40
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +10 -38
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +10 -38
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +10 -40
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading-bldgtype-multifamily.xml +509 -0
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +10 -40
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +10 -40
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +10 -41
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +30 -138
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +16 -42
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +24 -26
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-round-trip-efficiency.xml +16 -42
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +16 -42
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +16 -42
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +18 -44
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +18 -44
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +18 -44
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +16 -42
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0-runperiod-1-month.xml +560 -0
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0.xml +556 -0
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational-misc-loads-large-uncommon.xml → base-residents-1-misc-loads-large-uncommon.xml} +616 -644
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational-misc-loads-large-uncommon2.xml → base-residents-1-misc-loads-large-uncommon2.xml} +616 -644
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational.xml → base-residents-1.xml} +547 -575
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational-misc-defaults.xml → base-residents-5.xml} +515 -539
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +10 -40
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +10 -40
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-power-outage.xml +565 -0
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-detailed-occupancy-smooth.xml → base-schedules-detailed-occupancy-stochastic-vacancy-year-round.xml} +563 -583
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +21 -41
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +10 -40
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +10 -40
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +10 -40
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +10 -40
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage-natvent-available.xml +565 -0
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage-natvent-unavailable.xml +565 -0
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage.xml +620 -0
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy-year-round.xml +619 -0
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy.xml +619 -0
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +10 -38
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +10 -40
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +10 -40
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +10 -40
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +10 -40
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-temperature-capacitance-multiplier.xml +10 -40
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +10 -40
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +10 -40
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +10 -40
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-30-mins.xml +10 -40
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +10 -37
  577. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +16 -4
  578. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy-subset.osw +16 -3
  579. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +16 -3
  580. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +16 -2
  581. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Long_Residence.xml +386 -0
  582. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Vatilo_Residence.xml +381 -0
  583. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Victor_Residence.xml +370 -0
  584. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +2 -2
  585. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +2 -5
  586. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +2 -5
  587. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +2 -5
  588. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +2 -5
  589. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +2 -5
  590. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +2 -5
  591. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +2 -5
  592. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +2 -5
  593. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +2 -5
  594. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +2 -5
  595. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +2 -5
  596. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +2 -5
  597. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +2 -5
  598. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +2 -5
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +2 -5
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +2 -12
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +2 -12
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +2 -5
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +2 -5
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +2 -5
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +2 -5
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +2 -5
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +2 -5
  608. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -9
  609. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -9
  610. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +475 -444
  611. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +475 -444
  612. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +177 -112
  613. data/example_files/resources/meta_measure.rb +2 -27
  614. data/example_files/xml_building/17/README.md +3 -3
  615. data/lib/uo_cli/version.rb +3 -38
  616. data/lib/uo_cli.rb +3 -38
  617. data/uo_cli.gemspec +6 -7
  618. metadata +70 -51
  619. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules_config.json +0 -388
  620. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +0 -6136
  621. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +0 -4846
  622. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-smooth.csv +0 -8761
  623. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-vacancy.csv +0 -8761
  624. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3-cache.csv +0 -35
  625. data/example_files/resources/hpxml-measures/weather/USA_CO_Colorado.Springs-Peterson.Field.724660_TMY3-cache.csv +0 -35
  626. data/example_files/resources/hpxml-measures/weather/USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv +0 -35
  627. data/example_files/resources/hpxml-measures/weather/USA_DE_Wilmington-New.Castle.County.AP.724089_TMY3-cache.csv +0 -35
  628. data/example_files/resources/hpxml-measures/weather/USA_FL_Miami.Intl.AP.722020_TMY3-cache.csv +0 -35
  629. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3-cache.csv +0 -35
  630. data/example_files/resources/hpxml-measures/weather/USA_MD_Baltimore-Washington.Intl.AP.724060_TMY3-cache.csv +0 -35
  631. data/example_files/resources/hpxml-measures/weather/USA_MN_Duluth.Intl.AP.727450_TMY3-cache.csv +0 -35
  632. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3-cache.csv +0 -35
  633. data/example_files/resources/hpxml-measures/weather/USA_NC_Charlotte-Douglas.Intl.AP.723140_TMY3-cache.csv +0 -35
  634. data/example_files/resources/hpxml-measures/weather/USA_NJ_Cape.May.County.AP.745966_TMY3-cache.csv +0 -35
  635. data/example_files/resources/hpxml-measures/weather/USA_NV_Las.Vegas-McCarran.Intl.AP.723860_TMY3-cache.csv +0 -35
  636. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3-cache.csv +0 -35
  637. data/example_files/resources/hpxml-measures/weather/USA_TX_Dallas-Fort.Worth.Intl.AP.722590_TMY3-cache.csv +0 -35
  638. data/example_files/resources/hpxml-measures/weather/US_CO_Boulder_AMY_2012-cache.csv +0 -35
  639. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC-cache.csv +0 -35
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +0 -2508
  641. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +0 -2508
@@ -52,20 +52,31 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
52
52
  arg.setDescription('The version of the software program used.')
53
53
  args << arg
54
54
 
55
- occupancy_calculation_type_choices = OpenStudio::StringVector.new
56
- occupancy_calculation_type_choices << HPXML::OccupancyCalculationTypeAsset
57
- occupancy_calculation_type_choices << HPXML::OccupancyCalculationTypeOperational
58
-
59
- arg = OpenStudio::Measure::OSArgument.makeChoiceArgument('occupancy_calculation_type', occupancy_calculation_type_choices, false)
60
- arg.setDisplayName('Occupancy Calculation Type')
61
- arg.setDescription("The type of occupancy calculation type. If '#{HPXML::OccupancyCalculationTypeAsset}' is chosen, various end uses (e.g., clothes washer) are calculated using number of bedrooms and/or conditioned floor area. If '#{HPXML::OccupancyCalculationTypeOperational}' is chosen, end uses based on number of bedrooms are adjusted for the number of occupants. If not provided, the OS-HPXML default is used.")
62
- args << arg
63
-
64
55
  arg = OpenStudio::Measure::OSArgument.makeStringArgument('schedules_filepaths', false)
65
56
  arg.setDisplayName('Schedules: CSV File Paths')
66
57
  arg.setDescription('Absolute/relative paths of csv files containing user-specified detailed schedules. If multiple files, use a comma-separated list.')
67
58
  args << arg
68
59
 
60
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('schedules_vacancy_period', false)
61
+ arg.setDisplayName('Schedules: Vacancy Period')
62
+ arg.setDescription('Specifies the vacancy period. Enter a date like "Dec 15 - Jan 15". Optionally, can enter hour of the day like "Dec 15 2 - Jan 15 20" (start hour can be 0 through 23 and end hour can be 1 through 24).')
63
+ args << arg
64
+
65
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('schedules_power_outage_period', false)
66
+ arg.setDisplayName('Schedules: Power Outage Period')
67
+ arg.setDescription('Specifies the power outage period. Enter a date like "Dec 15 - Jan 15". Optionally, can enter hour of the day like "Dec 15 2 - Jan 15 20" (start hour can be 0 through 23 and end hour can be 1 through 24).')
68
+ args << arg
69
+
70
+ natvent_availability_choices = OpenStudio::StringVector.new
71
+ natvent_availability_choices << HPXML::ScheduleRegular
72
+ natvent_availability_choices << HPXML::ScheduleAvailable
73
+ natvent_availability_choices << HPXML::ScheduleUnavailable
74
+
75
+ arg = OpenStudio::Measure::OSArgument.makeChoiceArgument('schedules_power_outage_window_natvent_availability', natvent_availability_choices, false)
76
+ arg.setDisplayName('Schedules: Power Outage Period Window Natural Ventilation Availability')
77
+ arg.setDescription('The availability of the natural ventilation schedule during the outage period.')
78
+ args << arg
79
+
69
80
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('simulation_control_timestep', false)
70
81
  arg.setDisplayName('Simulation Control: Timestep')
71
82
  arg.setUnits('min')
@@ -182,25 +193,25 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
182
193
  level_choices << 'Middle'
183
194
  level_choices << 'Top'
184
195
 
185
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('geometry_unit_left_wall_is_adiabatic', true)
196
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('geometry_unit_left_wall_is_adiabatic', false)
186
197
  arg.setDisplayName('Geometry: Unit Left Wall Is Adiabatic')
187
198
  arg.setDescription('Presence of an adiabatic left wall.')
188
199
  arg.setDefaultValue(false)
189
200
  args << arg
190
201
 
191
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('geometry_unit_right_wall_is_adiabatic', true)
202
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('geometry_unit_right_wall_is_adiabatic', false)
192
203
  arg.setDisplayName('Geometry: Unit Right Wall Is Adiabatic')
193
204
  arg.setDescription('Presence of an adiabatic right wall.')
194
205
  arg.setDefaultValue(false)
195
206
  args << arg
196
207
 
197
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('geometry_unit_front_wall_is_adiabatic', true)
208
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('geometry_unit_front_wall_is_adiabatic', false)
198
209
  arg.setDisplayName('Geometry: Unit Front Wall Is Adiabatic')
199
210
  arg.setDescription('Presence of an adiabatic front wall, for example, the unit is adjacent to a conditioned corridor.')
200
211
  arg.setDefaultValue(false)
201
212
  args << arg
202
213
 
203
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('geometry_unit_back_wall_is_adiabatic', true)
214
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('geometry_unit_back_wall_is_adiabatic', false)
204
215
  arg.setDisplayName('Geometry: Unit Back Wall Is Adiabatic')
205
216
  arg.setDescription('Presence of an adiabatic back wall.')
206
217
  arg.setDefaultValue(false)
@@ -237,7 +248,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
237
248
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('geometry_unit_num_bedrooms', true)
238
249
  arg.setDisplayName('Geometry: Unit Number of Bedrooms')
239
250
  arg.setUnits('#')
240
- arg.setDescription('The number of bedrooms in the unit. Used to determine the energy usage of appliances and plug loads, hot water usage, etc.')
251
+ arg.setDescription('The number of bedrooms in the unit.')
241
252
  arg.setDefaultValue(3)
242
253
  args << arg
243
254
 
@@ -250,7 +261,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
250
261
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_unit_num_occupants', false)
251
262
  arg.setDisplayName('Geometry: Unit Number of Occupants')
252
263
  arg.setUnits('#')
253
- arg.setDescription("The number of occupants in the unit. If not provided, the OS-HPXML default is used. Required if Occupancy Calculation Type is '#{HPXML::OccupancyCalculationTypeOperational}'.")
264
+ arg.setDescription('The number of occupants in the unit. If not provided, an *asset* calculation is performed assuming standard occupancy, in which various end use defaults (e.g., plug loads, appliances, and hot water usage) are calculated based on Number of Bedrooms and Conditioned Floor Area per ANSI/RESNET/ICC 301-2019. If provided, an *operational* calculation is instead performed in which the end use defaults are adjusted using the relationship between Number of Bedrooms and Number of Occupants from RECS 2015.')
254
265
  args << arg
255
266
 
256
267
  arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('geometry_building_num_units', false)
@@ -383,11 +394,6 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
383
394
  arg.setDefaultValue(2.0)
384
395
  args << arg
385
396
 
386
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('geometry_has_flue_or_chimney', false)
387
- arg.setDisplayName('Geometry: Has Flue or Chimney')
388
- arg.setDescription('Presence of flue or chimney for infiltration model. If not provided, the OS-HPXML default is used.')
389
- args << arg
390
-
391
397
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('neighbor_front_distance', true)
392
398
  arg.setDisplayName('Neighbor: Front Distance')
393
399
  arg.setUnits('ft')
@@ -628,9 +634,9 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
628
634
  roof_radiant_barrier_grade_choices << '2'
629
635
  roof_radiant_barrier_grade_choices << '3'
630
636
 
631
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_radiant_barrier_grade', roof_radiant_barrier_grade_choices, true)
637
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_radiant_barrier_grade', roof_radiant_barrier_grade_choices, false)
632
638
  arg.setDisplayName('Roof: Radiant Barrier Grade')
633
- arg.setDescription('The grade of the radiant barrier, if it exists.')
639
+ arg.setDescription('The grade of the radiant barrier. If not provided, the OS-HPXML default is used.')
634
640
  arg.setDefaultValue('1')
635
641
  args << arg
636
642
 
@@ -774,25 +780,30 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
774
780
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_interior_shading_winter', false)
775
781
  arg.setDisplayName('Windows: Winter Interior Shading')
776
782
  arg.setUnits('Frac')
777
- arg.setDescription('Interior shading multiplier for the heating season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
783
+ arg.setDescription('Interior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
778
784
  args << arg
779
785
 
780
786
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_interior_shading_summer', false)
781
787
  arg.setDisplayName('Windows: Summer Interior Shading')
782
788
  arg.setUnits('Frac')
783
- arg.setDescription('Interior shading multiplier for the cooling season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
789
+ arg.setDescription('Interior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
784
790
  args << arg
785
791
 
786
792
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_exterior_shading_winter', false)
787
793
  arg.setDisplayName('Windows: Winter Exterior Shading')
788
794
  arg.setUnits('Frac')
789
- arg.setDescription('Exterior shading multiplier for the heating season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
795
+ arg.setDescription('Exterior shading coefficient for the winter season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
790
796
  args << arg
791
797
 
792
798
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('window_exterior_shading_summer', false)
793
799
  arg.setDisplayName('Windows: Summer Exterior Shading')
794
800
  arg.setUnits('Frac')
795
- arg.setDescription('Exterior shading multiplier for the cooling season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
801
+ arg.setDescription('Exterior shading coefficient for the summer season. 1.0 indicates no reduction in solar gain, 0.85 indicates 15% reduction, etc. If not provided, the OS-HPXML default is used.')
802
+ args << arg
803
+
804
+ arg = OpenStudio::Measure::OSArgument::makeStringArgument('window_shading_summer_season', false)
805
+ arg.setDisplayName('Windows: Shading Summer Season')
806
+ arg.setDescription('Enter a date like "May 1 - Sep 30". Defines the summer season for purposes of shading coefficients; the rest of the year is assumed to be winter. If not provided, the OS-HPXML default is used.')
796
807
  args << arg
797
808
 
798
809
  storm_window_type_choices = OpenStudio::StringVector.new
@@ -952,6 +963,8 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
952
963
  air_leakage_units_choices << HPXML::UnitsACH
953
964
  air_leakage_units_choices << HPXML::UnitsCFM
954
965
  air_leakage_units_choices << HPXML::UnitsACHNatural
966
+ air_leakage_units_choices << HPXML::UnitsCFMNatural
967
+ air_leakage_units_choices << HPXML::UnitsELA
955
968
 
956
969
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('air_leakage_units', air_leakage_units_choices, true)
957
970
  arg.setDisplayName('Air Leakage: Units')
@@ -968,10 +981,24 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
968
981
 
969
982
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('air_leakage_value', true)
970
983
  arg.setDisplayName('Air Leakage: Value')
971
- arg.setDescription('Air exchange rate value.')
984
+ arg.setDescription("Air exchange rate value. For '#{HPXML::UnitsELA}', provide value in sq. in.")
972
985
  arg.setDefaultValue(3)
973
986
  args << arg
974
987
 
988
+ air_leakage_type_choices = OpenStudio::StringVector.new
989
+ air_leakage_type_choices << HPXML::InfiltrationTypeUnitTotal
990
+ air_leakage_type_choices << HPXML::InfiltrationTypeUnitExterior
991
+
992
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('air_leakage_type', air_leakage_type_choices, false)
993
+ arg.setDisplayName('Air Leakage: Type')
994
+ arg.setDescription("Type of air leakage. If '#{HPXML::InfiltrationTypeUnitTotal}', represents the total infiltration to the unit as measured by a compartmentalization test, in which case the air leakage value will be adjusted by the ratio of exterior envelope surface area to total envelope surface area. Otherwise, if '#{HPXML::InfiltrationTypeUnitExterior}', represents the infiltration to the unit from outside only as measured by a guarded test. Required when unit type is #{HPXML::ResidentialTypeSFA} or #{HPXML::ResidentialTypeApartment}.")
995
+ args << arg
996
+
997
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('air_leakage_has_flue_or_chimney_in_conditioned_space', false)
998
+ arg.setDisplayName('Air Leakage: Has Flue or Chimney in Conditioned Space')
999
+ arg.setDescription('Presence of flue or chimney with combustion air from conditioned space; used for infiltration model. If not provided, the OS-HPXML default is used.')
1000
+ args << arg
1001
+
975
1002
  heating_system_type_choices = OpenStudio::StringVector.new
976
1003
  heating_system_type_choices << 'none'
977
1004
  heating_system_type_choices << HPXML::HVACTypeFurnace
@@ -1046,6 +1073,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1046
1073
  arg.setDefaultValue(1)
1047
1074
  args << arg
1048
1075
 
1076
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_pilot_light', false)
1077
+ arg.setDisplayName('Heating System: Pilot Light')
1078
+ arg.setDescription("The fuel usage of the pilot light. Applies only to #{HPXML::HVACTypeFurnace}, #{HPXML::HVACTypeWallFurnace}, #{HPXML::HVACTypeFloorFurnace}, #{HPXML::HVACTypeStove}, #{HPXML::HVACTypeBoiler}, and #{HPXML::HVACTypeFireplace} with non-electric fuel type. If not provided, assumes no pilot light.")
1079
+ arg.setUnits('Btuh')
1080
+ args << arg
1081
+
1049
1082
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_airflow_defect_ratio', false)
1050
1083
  arg.setDisplayName('Heating System: Airflow Defect Ratio')
1051
1084
  arg.setDescription("The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the heating system per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to #{HPXML::HVACTypeFurnace}. If not provided, assumes no defect.")
@@ -1094,7 +1127,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1094
1127
  arg.setDefaultValue(1)
1095
1128
  args << arg
1096
1129
 
1097
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('cooling_system_is_ducted', true)
1130
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('cooling_system_is_ducted', false)
1098
1131
  arg.setDisplayName('Cooling System: Is Ducted')
1099
1132
  arg.setDescription("Whether the cooling system is ducted or not. Only used for #{HPXML::HVACTypeMiniSplitAirConditioner} and #{HPXML::HVACTypeEvaporativeCooler}. It's assumed that #{HPXML::HVACTypeCentralAirConditioner} is ducted, and #{HPXML::HVACTypeRoomAirConditioner} and #{HPXML::HVACTypePTAC} are not ducted.")
1100
1133
  arg.setDefaultValue(false)
@@ -1112,6 +1145,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1112
1145
  arg.setUnits('Frac')
1113
1146
  args << arg
1114
1147
 
1148
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('cooling_system_crankcase_heater_watts', false)
1149
+ arg.setDisplayName('Cooling System: Crankcase Heater Power Watts')
1150
+ arg.setDescription("Cooling system crankcase heater power consumption in Watts. Applies only to #{HPXML::HVACTypeCentralAirConditioner}, #{HPXML::HVACTypeMiniSplitAirConditioner}, #{HPXML::HVACTypePTAC} and #{HPXML::HVACTypeRoomAirConditioner}. If not provided, the OS-HPXML default is used.")
1151
+ arg.setUnits('W')
1152
+ args << arg
1153
+
1115
1154
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooling_system_integrated_heating_system_fuel', heating_system_fuel_choices, false)
1116
1155
  arg.setDisplayName('Cooling System: Integrated Heating System Fuel Type')
1117
1156
  arg.setDescription("The fuel type of the heating system integrated into cooling system. Only used for #{HPXML::HVACTypePTAC} and #{HPXML::HVACTypeRoomAirConditioner}.")
@@ -1214,10 +1253,16 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1214
1253
  arg.setUnits('Btu/hr')
1215
1254
  args << arg
1216
1255
 
1217
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_capacity_17_f', false)
1218
- arg.setDisplayName('Heat Pump: Heating Capacity 17F')
1219
- arg.setDescription("The output heating capacity of the heat pump at 17F. Only applies to #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit}. If not provided, the OS-HPXML default is used.")
1220
- arg.setUnits('Btu/hr')
1256
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_capacity_retention_fraction', false)
1257
+ arg.setDisplayName('Heat Pump: Heating Capacity Retention Fraction')
1258
+ arg.setDescription("The output heating capacity of the heat pump at a user-specified temperature (e.g., 17F or 5F) divided by the above nominal heating capacity. Applies to all heat pump types except #{HPXML::HVACTypeHeatPumpGroundToAir}. If not provided, the OS-HPXML default is used.")
1259
+ arg.setUnits('Frac')
1260
+ args << arg
1261
+
1262
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_heating_capacity_retention_temp', false)
1263
+ arg.setDisplayName('Heat Pump: Heating Capacity Retention Temperature')
1264
+ arg.setDescription("The user-specified temperature (e.g., 17F or 5F) for the above heating capacity retention fraction. Applies to all heat pump types except #{HPXML::HVACTypeHeatPumpGroundToAir}. Required if the Heating Capacity Retention Fraction is provided.")
1265
+ arg.setUnits('deg-F')
1221
1266
  args << arg
1222
1267
 
1223
1268
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_cooling_capacity', false)
@@ -1240,6 +1285,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1240
1285
  arg.setDefaultValue(1)
1241
1286
  args << arg
1242
1287
 
1288
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_compressor_lockout_temp', false)
1289
+ arg.setDisplayName('Heat Pump: Compressor Lockout Temperature')
1290
+ arg.setDescription("The temperature below which the heat pump compressor is disabled. If both this and Backup Heating Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies to all heat pump types other than #{HPXML::HVACTypeHeatPumpGroundToAir}. If not provided, the OS-HPXML default is used.")
1291
+ arg.setUnits('deg-F')
1292
+ args << arg
1293
+
1243
1294
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heat_pump_backup_type', heat_pump_backup_type_choices, true)
1244
1295
  arg.setDisplayName('Heat Pump: Backup Type')
1245
1296
  arg.setDescription("The backup type of the heat pump. If '#{HPXML::HeatPumpBackupTypeIntegrated}', represents e.g. built-in electric strip heat or dual-fuel integrated furnace. If '#{HPXML::HeatPumpBackupTypeSeparate}', represents e.g. electric baseboard or boiler based on the Heating System 2 specified below. Use 'none' if there is no backup heating.")
@@ -1264,15 +1315,9 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1264
1315
  arg.setUnits('Btu/hr')
1265
1316
  args << arg
1266
1317
 
1267
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_backup_heating_switchover_temp', false)
1268
- arg.setDisplayName('Heat Pump: Backup Heating Switchover Temperature')
1269
- arg.setDescription("The temperature at which the heat pump stops operating and the backup heating system starts running. Only applies to #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpMiniSplit}. If not provided, backup heating will operate as needed when heat pump capacity is insufficient. Applies if Backup Type is either '#{HPXML::HeatPumpBackupTypeIntegrated}' or '#{HPXML::HeatPumpBackupTypeSeparate}'. Both Switchover Temperature and Lockout Temperature cannot be specified.")
1270
- arg.setUnits('deg-F')
1271
- args << arg
1272
-
1273
1318
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_backup_heating_lockout_temp', false)
1274
1319
  arg.setDisplayName('Heat Pump: Backup Heating Lockout Temperature')
1275
- arg.setDescription("The temperature above which the backup system is disabled in order to prevent backup heating operation during, e.g., a thermostat heating setback recovery event. If not provided, backup heating will operate as needed when heat pump capacity is insufficient. Only applies if Backup Type is '#{HPXML::HeatPumpBackupTypeIntegrated}'. Both Switchover Temperature and Lockout Temperature cannot be specified.")
1320
+ arg.setDescription("The temperature above which the heat pump backup system is disabled. If both this and Compressor Lockout Temperature are provided and use the same value, it essentially defines a switchover temperature (for, e.g., a dual-fuel heat pump). Applies for both Backup Type of '#{HPXML::HeatPumpBackupTypeIntegrated}' and '#{HPXML::HeatPumpBackupTypeSeparate}'. If not provided, the OS-HPXML default is used.")
1276
1321
  arg.setUnits('deg-F')
1277
1322
  args << arg
1278
1323
 
@@ -1283,7 +1328,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1283
1328
 
1284
1329
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('heat_pump_is_ducted', false)
1285
1330
  arg.setDisplayName('Heat Pump: Is Ducted')
1286
- arg.setDescription("Whether the heat pump is ducted or not. Only used for #{HPXML::HVACTypeHeatPumpMiniSplit}. It's assumed that #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpGroundToAir} are ducted. If not provided, assumes not ducted.")
1331
+ arg.setDescription("Whether the heat pump is ducted or not. Only used for #{HPXML::HVACTypeHeatPumpMiniSplit}. It's assumed that #{HPXML::HVACTypeHeatPumpAirToAir} and #{HPXML::HVACTypeHeatPumpGroundToAir} are ducted, and #{HPXML::HVACTypeHeatPumpPTHP} and #{HPXML::HVACTypeHeatPumpRoom} are not ducted. If not provided, assumes not ducted.")
1287
1332
  args << arg
1288
1333
 
1289
1334
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_airflow_defect_ratio', false)
@@ -1298,8 +1343,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1298
1343
  arg.setUnits('Frac')
1299
1344
  args << arg
1300
1345
 
1346
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heat_pump_crankcase_heater_watts', false)
1347
+ arg.setDisplayName('Heat Pump: Crankcase Heater Power Watts')
1348
+ arg.setDescription("Heat Pump crankcase heater power consumption in Watts. Applies only to #{HPXML::HVACTypeHeatPumpAirToAir}, #{HPXML::HVACTypeHeatPumpMiniSplit}, #{HPXML::HVACTypeHeatPumpPTHP} and #{HPXML::HVACTypeHeatPumpRoom}. If not provided, the OS-HPXML default is used.")
1349
+ arg.setUnits('W')
1350
+ args << arg
1351
+
1301
1352
  heating_system_2_type_choices = OpenStudio::StringVector.new
1302
1353
  heating_system_2_type_choices << 'none'
1354
+ heating_system_2_type_choices << HPXML::HVACTypeFurnace
1303
1355
  heating_system_2_type_choices << HPXML::HVACTypeWallFurnace
1304
1356
  heating_system_2_type_choices << HPXML::HVACTypeFloorFurnace
1305
1357
  heating_system_2_type_choices << HPXML::HVACTypeBoiler
@@ -1307,6 +1359,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1307
1359
  heating_system_2_type_choices << HPXML::HVACTypeStove
1308
1360
  heating_system_2_type_choices << HPXML::HVACTypePortableHeater
1309
1361
  heating_system_2_type_choices << HPXML::HVACTypeFireplace
1362
+ heating_system_2_type_choices << HPXML::HVACTypeFixedHeater
1310
1363
 
1311
1364
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system_2_type', heating_system_2_type_choices, true)
1312
1365
  arg.setDisplayName('Heating System 2: Type')
@@ -1428,6 +1481,17 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1428
1481
  arg.setDefaultValue(0)
1429
1482
  args << arg
1430
1483
 
1484
+ duct_buried_level_choices = OpenStudio::StringVector.new
1485
+ duct_buried_level_choices << HPXML::DuctBuriedInsulationNone
1486
+ duct_buried_level_choices << HPXML::DuctBuriedInsulationPartial
1487
+ duct_buried_level_choices << HPXML::DuctBuriedInsulationFull
1488
+ duct_buried_level_choices << HPXML::DuctBuriedInsulationDeep
1489
+
1490
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_supply_buried_insulation_level', duct_buried_level_choices, false)
1491
+ arg.setDisplayName('Ducts: Supply Buried Insulation Level')
1492
+ arg.setDescription('Whether the supply ducts are buried in, e.g., attic loose-fill insulation. Partially buried ducts have insulation that does not cover the top of the ducts. Fully buried ducts have insulation that just covers the top of the ducts. Deeply buried ducts have insulation that continues above the top of the ducts.')
1493
+ args << arg
1494
+
1431
1495
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_supply_surface_area', false)
1432
1496
  arg.setDisplayName('Ducts: Supply Surface Area')
1433
1497
  arg.setDescription('The surface area of the supply ducts. If not provided, the OS-HPXML default is used.')
@@ -1446,6 +1510,11 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1446
1510
  arg.setDefaultValue(0)
1447
1511
  args << arg
1448
1512
 
1513
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ducts_return_buried_insulation_level', duct_buried_level_choices, false)
1514
+ arg.setDisplayName('Ducts: Return Buried Insulation Level')
1515
+ arg.setDescription('Whether the return ducts are buried in, e.g., attic loose-fill insulation. Partially buried ducts have insulation that does not cover the top of the ducts. Fully buried ducts have insulation that just covers the top of the ducts. Deeply buried ducts have insulation that continues above the top of the ducts.')
1516
+ args << arg
1517
+
1449
1518
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ducts_return_surface_area', false)
1450
1519
  arg.setDisplayName('Ducts: Return Surface Area')
1451
1520
  arg.setDescription('The surface area of the return ducts. If not provided, the OS-HPXML default is used.')
@@ -1832,12 +1901,12 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1832
1901
  args << arg
1833
1902
 
1834
1903
  water_heater_operating_mode_choices = OpenStudio::StringVector.new
1835
- water_heater_operating_mode_choices << HPXML::WaterHeaterOperatingModeStandard
1904
+ water_heater_operating_mode_choices << HPXML::WaterHeaterOperatingModeHybridAuto
1836
1905
  water_heater_operating_mode_choices << HPXML::WaterHeaterOperatingModeHeatPumpOnly
1837
1906
 
1838
1907
  arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('water_heater_operating_mode', water_heater_operating_mode_choices, false)
1839
1908
  arg.setDisplayName('Water Heater: Operating Mode')
1840
- arg.setDescription("The water heater operating mode. The '#{HPXML::WaterHeaterOperatingModeHeatPumpOnly}' option only uses the heat pump, while '#{HPXML::WaterHeaterOperatingModeStandard}' allows the backup electric resistance to come on in high demand situations. This is ignored if a scheduled operating mode type is selected. Applies only to #{HPXML::WaterHeaterTypeHeatPump}. If not provided, the OS-HPXML default is used.")
1909
+ arg.setDescription("The water heater operating mode. The '#{HPXML::WaterHeaterOperatingModeHeatPumpOnly}' option only uses the heat pump, while '#{HPXML::WaterHeaterOperatingModeHybridAuto}' allows the backup electric resistance to come on in high demand situations. This is ignored if a scheduled operating mode type is selected. Applies only to #{HPXML::WaterHeaterTypeHeatPump}. If not provided, the OS-HPXML default is used.")
1841
1910
  args << arg
1842
1911
 
1843
1912
  hot_water_distribution_system_type_choices = OpenStudio::StringVector.new
@@ -1863,7 +1932,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1863
1932
  recirculation_control_type_choices << HPXML::DHWRecirControlTypeSensor
1864
1933
  recirculation_control_type_choices << HPXML::DHWRecirControlTypeManual
1865
1934
 
1866
- arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('hot_water_distribution_recirc_control_type', recirculation_control_type_choices, true)
1935
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('hot_water_distribution_recirc_control_type', recirculation_control_type_choices, false)
1867
1936
  arg.setDisplayName('Hot Water Distribution: Recirculation Control Type')
1868
1937
  arg.setDescription("If the distribution system is #{HPXML::DHWDistTypeRecirc}, the type of hot water recirculation control, if any.")
1869
1938
  arg.setDefaultValue(HPXML::DHWRecirControlTypeNone)
@@ -1904,13 +1973,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
1904
1973
  arg.setDefaultValue('none')
1905
1974
  args << arg
1906
1975
 
1907
- arg = OpenStudio::Measure::OSArgument::makeBoolArgument('dwhr_equal_flow', true)
1976
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('dwhr_equal_flow', false)
1908
1977
  arg.setDisplayName('Drain Water Heat Recovery: Equal Flow')
1909
1978
  arg.setDescription('Whether the drain water heat recovery has equal flow.')
1910
1979
  arg.setDefaultValue(true)
1911
1980
  args << arg
1912
1981
 
1913
- arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dwhr_efficiency', true)
1982
+ arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('dwhr_efficiency', false)
1914
1983
  arg.setDisplayName('Drain Water Heat Recovery: Efficiency')
1915
1984
  arg.setUnits('Frac')
1916
1985
  arg.setDescription('The efficiency of the drain water heat recovery.')
@@ -2639,7 +2708,7 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
2639
2708
  arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ceiling_fan_cooling_setpoint_temp_offset', false)
2640
2709
  arg.setDisplayName('Ceiling Fan: Cooling Setpoint Temperature Offset')
2641
2710
  arg.setUnits('deg-F')
2642
- arg.setDescription('The setpoint temperature offset during cooling season for the ceiling fan(s). Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default is used.')
2711
+ arg.setDescription('The cooling setpoint temperature offset during months when the ceiling fans are operating. Only applies if ceiling fan quantity is greater than zero. If not provided, the OS-HPXML default is used.')
2643
2712
  args << arg
2644
2713
 
2645
2714
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('misc_plug_loads_television_present', true)
@@ -3003,9 +3072,15 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3003
3072
  arg.setDescription("Additional properties specified as key-value pairs (i.e., key=value). If multiple additional properties, use a |-separated list. For example, 'LowIncome=false|Remodeled|Description=2-story home in Denver'. These properties will be stored in the HPXML file under /HPXML/SoftwareInfo/extension/AdditionalProperties.")
3004
3073
  args << arg
3005
3074
 
3075
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('combine_like_surfaces', false)
3076
+ arg.setDisplayName('Combine like surfaces?')
3077
+ arg.setDescription('If true, combines like surfaces to simplify the HPXML file generated.')
3078
+ arg.setDefaultValue(false)
3079
+ args << arg
3080
+
3006
3081
  arg = OpenStudio::Measure::OSArgument::makeBoolArgument('apply_defaults', false)
3007
3082
  arg.setDisplayName('Apply Default Values?')
3008
- arg.setDescription('If true, applies OS-HPXML default values to the HPXML output file.')
3083
+ arg.setDescription('If true, applies OS-HPXML default values to the HPXML output file. Setting to true will also force validation of the HPXML output file before applying OS-HPXML default values.')
3009
3084
  arg.setDefaultValue(false)
3010
3085
  args << arg
3011
3086
 
@@ -3033,7 +3108,16 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3033
3108
 
3034
3109
  # assign the user inputs to variables
3035
3110
  args = get_argument_values(runner, arguments(model), user_arguments)
3036
- args = Hash[args.collect { |k, v| [k.to_sym, v] }]
3111
+
3112
+ args[:apply_validation] = args[:apply_validation].is_initialized ? args[:apply_validation].get : false
3113
+ args[:apply_defaults] = args[:apply_defaults].is_initialized ? args[:apply_defaults].get : false
3114
+ args[:apply_validation] = true if args[:apply_defaults]
3115
+ args[:geometry_unit_left_wall_is_adiabatic] = (args[:geometry_unit_left_wall_is_adiabatic].is_initialized && args[:geometry_unit_left_wall_is_adiabatic].get)
3116
+ args[:geometry_unit_right_wall_is_adiabatic] = (args[:geometry_unit_right_wall_is_adiabatic].is_initialized && args[:geometry_unit_right_wall_is_adiabatic].get)
3117
+ args[:geometry_unit_front_wall_is_adiabatic] = (args[:geometry_unit_front_wall_is_adiabatic].is_initialized && args[:geometry_unit_front_wall_is_adiabatic].get)
3118
+ args[:geometry_unit_back_wall_is_adiabatic] = (args[:geometry_unit_back_wall_is_adiabatic].is_initialized && args[:geometry_unit_back_wall_is_adiabatic].get)
3119
+ args[:cooling_system_is_ducted] = (args[:cooling_system_is_ducted].is_initialized && args[:cooling_system_is_ducted].get)
3120
+ args[:heat_pump_is_ducted] = (args[:heat_pump_is_ducted].is_initialized && args[:heat_pump_is_ducted].get)
3037
3121
 
3038
3122
  # Argument error checks
3039
3123
  warnings, errors = validate_arguments(args)
@@ -3058,29 +3142,24 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3058
3142
  runner.registerError("Could not find EPW file at '#{epw_path}'.")
3059
3143
  return false
3060
3144
  end
3061
- epw_file = OpenStudio::EpwFile.new(epw_path)
3062
3145
 
3063
3146
  # Create HPXML file
3064
- hpxml_doc = HPXMLFile.create(runner, model, args, epw_file)
3065
- if not hpxml_doc
3066
- runner.registerError('Unsuccessful creation of HPXML file.')
3067
- return false
3068
- end
3069
-
3070
3147
  hpxml_path = args[:hpxml_path]
3071
3148
  unless (Pathname.new hpxml_path).absolute?
3072
3149
  hpxml_path = File.expand_path(hpxml_path)
3073
3150
  end
3074
3151
 
3075
- XMLHelper.write_file(hpxml_doc, hpxml_path)
3076
- runner.registerInfo("Wrote file: #{hpxml_path}")
3152
+ hpxml_doc = HPXMLFile.create(runner, model, args, epw_path, hpxml_path)
3153
+ if not hpxml_doc
3154
+ runner.registerError('Unsuccessful creation of HPXML file.')
3155
+ return false
3156
+ end
3077
3157
 
3078
- # Check for invalid HPXML file
3079
- if args[:apply_validation].is_initialized && args[:apply_validation].get
3080
- if not validate_hpxml(runner, hpxml_path, hpxml_doc)
3081
- return false
3082
- end
3158
+ # Write HPXML file again if defaults applied
3159
+ if args[:apply_defaults]
3160
+ XMLHelper.write_file(hpxml_doc, hpxml_path)
3083
3161
  end
3162
+ runner.registerInfo("Wrote file: #{hpxml_path}")
3084
3163
 
3085
3164
  # Uncomment for debugging purposes
3086
3165
  # File.write(hpxml_path.gsub('.xml', '.osm'), model.to_s)
@@ -3149,6 +3228,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3149
3228
  error = (args[:heating_system_type] == 'none') && (args[:heat_pump_type] == 'none') && (args[:heating_system_2_type] != 'none')
3150
3229
  errors << 'A second heating system was specified without a primary heating system.' if error
3151
3230
 
3231
+ if ((args[:heat_pump_backup_type] == HPXML::HeatPumpBackupTypeSeparate) && (args[:heating_system_2_type] == HPXML::HVACTypeFurnace)) # separate ducted backup
3232
+ if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpGroundToAir].include?(args[:heat_pump_type]) ||
3233
+ ((args[:heat_pump_type] == HPXML::HVACTypeHeatPumpMiniSplit) && args[:heat_pump_is_ducted]) # ducted heat pump
3234
+ errors << "A ducted heat pump with '#{HPXML::HeatPumpBackupTypeSeparate}' ducted backup is not supported."
3235
+ end
3236
+ end
3237
+
3152
3238
  error = [HPXML::ResidentialTypeSFA, HPXML::ResidentialTypeApartment].include?(args[:geometry_unit_type]) && !args[:geometry_building_num_units].is_initialized
3153
3239
  errors << 'Did not specify the number of units in the building for single-family attached or apartment units.' if error
3154
3240
 
@@ -3266,38 +3352,13 @@ class BuildResidentialHPXML < OpenStudio::Measure::ModelMeasure
3266
3352
 
3267
3353
  return errors
3268
3354
  end
3269
-
3270
- def validate_hpxml(runner, hpxml_path, hpxml_doc)
3271
- is_valid = true
3272
-
3273
- # Validate input HPXML against schema
3274
- schema_dir = File.join(File.dirname(__FILE__), '../HPXMLtoOpenStudio/resources/hpxml_schema')
3275
- schema_path = File.join(schema_dir, 'HPXML.xsd')
3276
- xsd_errors, xsd_warnings = XMLValidator.validate_against_schema(hpxml_path, schema_path)
3277
-
3278
- # Validate input HPXML against schematron docs
3279
- schematron_dir = File.join(File.dirname(__FILE__), '../HPXMLtoOpenStudio/resources/hpxml_schematron')
3280
- schematron_path = File.join(schematron_dir, 'EPvalidator.xml')
3281
- sct_errors, sct_warnings = XMLValidator.validate_against_schematron(hpxml_path, schematron_path, hpxml_doc)
3282
-
3283
- # Handle errors/warnings
3284
- (xsd_errors + sct_errors).each do |error|
3285
- runner.registerError("#{hpxml_path}: #{error}")
3286
- is_valid = false
3287
- end
3288
- (xsd_warnings + sct_warnings).each do |warning|
3289
- runner.registerWarning("#{hpxml_path}: #{warning}")
3290
- end
3291
-
3292
- return is_valid
3293
- end
3294
3355
  end
3295
3356
 
3296
3357
  class HPXMLFile
3297
- def self.create(runner, model, args, epw_file)
3298
- if (args[:hvac_control_heating_season_period].to_s == HPXML::BuildingAmerica) || (args[:hvac_control_cooling_season_period].to_s == HPXML::BuildingAmerica) || (args[:apply_defaults].is_initialized && args[:apply_defaults].get)
3299
- OpenStudio::Model::WeatherFile.setWeatherFile(model, epw_file)
3300
- weather = WeatherProcess.new(model, runner)
3358
+ def self.create(runner, model, args, epw_path, hpxml_path)
3359
+ epw_file = OpenStudio::EpwFile.new(epw_path)
3360
+ if (args[:hvac_control_heating_season_period].to_s == HPXML::BuildingAmerica) || (args[:hvac_control_cooling_season_period].to_s == HPXML::BuildingAmerica) || (args[:apply_defaults])
3361
+ weather = WeatherProcess.new(epw_path: epw_path, runner: nil)
3301
3362
  end
3302
3363
 
3303
3364
  success = create_geometry_envelope(runner, model, args)
@@ -3361,44 +3422,59 @@ class HPXMLFile
3361
3422
  set_misc_fuel_loads_fireplace(hpxml, args)
3362
3423
  set_pool(hpxml, args)
3363
3424
  set_hot_tub(hpxml, args)
3425
+ collapse_surfaces(hpxml, args)
3426
+ renumber_hpxml_ids(hpxml)
3364
3427
 
3365
- # Collapse surfaces so that we don't get, e.g., individual windows
3366
- # or the front wall split because of the door. Exclude foundation walls
3367
- # from the list so we get all 4 foundation walls.
3368
- hpxml.collapse_enclosure_surfaces([:roofs, :walls, :rim_joists, :floors,
3369
- :slabs, :windows, :skylights, :doors])
3370
-
3371
- # After surfaces are collapsed, round all areas
3372
- (hpxml.roofs +
3373
- hpxml.rim_joists +
3374
- hpxml.walls +
3375
- hpxml.foundation_walls +
3376
- hpxml.floors +
3377
- hpxml.slabs +
3378
- hpxml.windows +
3379
- hpxml.skylights +
3380
- hpxml.doors).each do |s|
3381
- s.area = s.area.round(1)
3382
- end
3428
+ hpxml_doc = hpxml.to_oga()
3429
+ XMLHelper.write_file(hpxml_doc, hpxml_path)
3383
3430
 
3384
- # Check for errors in the HPXML object
3385
- if args[:apply_validation].is_initialized && args[:apply_validation].get
3386
- errors = hpxml.check_for_errors()
3387
- if errors.size > 0
3388
- fail "ERROR: Invalid HPXML object produced.\n#{errors}"
3431
+ if args[:apply_validation]
3432
+ # Check for invalid HPXML file
3433
+ if not validate_hpxml(runner, hpxml, hpxml_doc, hpxml_path)
3434
+ return false
3389
3435
  end
3390
3436
  end
3391
3437
 
3392
- if args[:apply_defaults].is_initialized && args[:apply_defaults].get
3438
+ if args[:apply_defaults]
3393
3439
  eri_version = Constants.ERIVersions[-1]
3394
3440
  HPXMLDefaults.apply(runner, hpxml, eri_version, weather, epw_file: epw_file)
3441
+ hpxml_doc = hpxml.to_oga()
3395
3442
  end
3396
3443
 
3397
- hpxml_doc = hpxml.to_oga()
3398
-
3399
3444
  return hpxml_doc
3400
3445
  end
3401
3446
 
3447
+ def self.validate_hpxml(runner, hpxml, hpxml_doc, hpxml_path)
3448
+ # Check for errors in the HPXML object
3449
+ errors = hpxml.check_for_errors()
3450
+ if errors.size > 0
3451
+ fail "ERROR: Invalid HPXML object produced.\n#{errors}"
3452
+ end
3453
+
3454
+ is_valid = true
3455
+
3456
+ # Validate input HPXML against schema
3457
+ schema_path = File.join(File.dirname(__FILE__), '..', 'HPXMLtoOpenStudio', 'resources', 'hpxml_schema', 'HPXML.xsd')
3458
+ schema_validator = XMLValidator.get_schema_validator(schema_path)
3459
+ xsd_errors, xsd_warnings = XMLValidator.validate_against_schema(hpxml_path, schema_validator)
3460
+
3461
+ # Validate input HPXML against schematron docs
3462
+ schematron_path = File.join(File.dirname(__FILE__), '..', 'HPXMLtoOpenStudio', 'resources', 'hpxml_schematron', 'EPvalidator.xml')
3463
+ schematron_validator = XMLValidator.get_schematron_validator(schematron_path)
3464
+ sct_errors, sct_warnings = XMLValidator.validate_against_schematron(hpxml_path, schematron_validator, hpxml_doc)
3465
+
3466
+ # Handle errors/warnings
3467
+ (xsd_errors + sct_errors).each do |error|
3468
+ runner.registerError("#{hpxml_path}: #{error}")
3469
+ is_valid = false
3470
+ end
3471
+ (xsd_warnings + sct_warnings).each do |warning|
3472
+ runner.registerWarning("#{hpxml_path}: #{warning}")
3473
+ end
3474
+
3475
+ return is_valid
3476
+ end
3477
+
3402
3478
  def self.create_geometry_envelope(runner, model, args)
3403
3479
  args[:geometry_roof_pitch] = { '1:12' => 1.0 / 12.0,
3404
3480
  '2:12' => 2.0 / 12.0,
@@ -3454,16 +3530,29 @@ class HPXMLFile
3454
3530
  hpxml.header.xml_type = 'HPXML'
3455
3531
  hpxml.header.xml_generated_by = 'BuildResidentialHPXML'
3456
3532
  hpxml.header.transaction = 'create'
3533
+ hpxml.header.building_id = 'MyBuilding'
3534
+ hpxml.header.event_type = 'proposed workscope'
3457
3535
 
3458
- if args[:occupancy_calculation_type].is_initialized
3459
- hpxml.header.occupancy_calculation_type = args[:occupancy_calculation_type].get
3460
- end
3461
3536
  if args[:window_natvent_availability].is_initialized
3462
3537
  hpxml.header.natvent_days_per_week = args[:window_natvent_availability].get
3463
3538
  end
3539
+
3464
3540
  if args[:schedules_filepaths].is_initialized
3465
3541
  hpxml.header.schedules_filepaths = args[:schedules_filepaths].get.split(',').map(&:strip)
3466
3542
  end
3543
+ if args[:schedules_vacancy_period].is_initialized
3544
+ begin_month, begin_day, begin_hour, end_month, end_day, end_hour = Schedule.parse_date_time_range(args[:schedules_vacancy_period].get)
3545
+ hpxml.header.unavailable_periods.add(column_name: 'Vacancy', begin_month: begin_month, begin_day: begin_day, begin_hour: begin_hour, end_month: end_month, end_day: end_day, end_hour: end_hour, natvent_availability: HPXML::ScheduleUnavailable)
3546
+ end
3547
+ if args[:schedules_power_outage_period].is_initialized
3548
+ begin_month, begin_day, begin_hour, end_month, end_day, end_hour = Schedule.parse_date_time_range(args[:schedules_power_outage_period].get)
3549
+
3550
+ if args[:schedules_power_outage_window_natvent_availability].is_initialized
3551
+ natvent_availability = args[:schedules_power_outage_window_natvent_availability].get
3552
+ end
3553
+
3554
+ hpxml.header.unavailable_periods.add(column_name: 'Power Outage', begin_month: begin_month, begin_day: begin_day, begin_hour: begin_hour, end_month: end_month, end_day: end_day, end_hour: end_hour, natvent_availability: natvent_availability)
3555
+ end
3467
3556
 
3468
3557
  if args[:software_info_program_used].is_initialized
3469
3558
  hpxml.header.software_program_used = args[:software_info_program_used].get
@@ -3477,7 +3566,7 @@ class HPXMLFile
3477
3566
  end
3478
3567
 
3479
3568
  if args[:simulation_control_run_period].is_initialized
3480
- begin_month, begin_day, end_month, end_day = Schedule.parse_date_range(args[:simulation_control_run_period].get)
3569
+ begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:simulation_control_run_period].get)
3481
3570
  hpxml.header.sim_begin_month = begin_month
3482
3571
  hpxml.header.sim_begin_day = begin_day
3483
3572
  hpxml.header.sim_end_month = end_month
@@ -3492,7 +3581,7 @@ class HPXMLFile
3492
3581
  hpxml.header.dst_enabled = args[:simulation_control_daylight_saving_enabled].get
3493
3582
  end
3494
3583
  if args[:simulation_control_daylight_saving_period].is_initialized
3495
- begin_month, begin_day, end_month, end_day = Schedule.parse_date_range(args[:simulation_control_daylight_saving_period].get)
3584
+ begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:simulation_control_daylight_saving_period].get)
3496
3585
  hpxml.header.dst_begin_month = begin_month
3497
3586
  hpxml.header.dst_begin_day = begin_day
3498
3587
  hpxml.header.dst_end_month = end_month
@@ -3503,8 +3592,13 @@ class HPXMLFile
3503
3592
  hpxml.header.temperature_capacitance_multiplier = args[:simulation_control_temperature_capacitance_multiplier].get
3504
3593
  end
3505
3594
 
3506
- hpxml.header.building_id = 'MyBuilding'
3507
- hpxml.header.event_type = 'proposed workscope'
3595
+ if args[:window_shading_summer_season].is_initialized
3596
+ begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:window_shading_summer_season].get)
3597
+ hpxml.header.shading_summer_begin_month = begin_month
3598
+ hpxml.header.shading_summer_begin_day = begin_day
3599
+ hpxml.header.shading_summer_end_month = end_month
3600
+ hpxml.header.shading_summer_end_day = end_day
3601
+ end
3508
3602
 
3509
3603
  if args[:site_zip_code].is_initialized
3510
3604
  hpxml.header.zip_code = args[:site_zip_code].get
@@ -3865,9 +3959,6 @@ class HPXMLFile
3865
3959
  if args[:year_built].is_initialized
3866
3960
  hpxml.building_construction.year_built = args[:year_built].get
3867
3961
  end
3868
- if args[:geometry_has_flue_or_chimney].is_initialized
3869
- hpxml.building_construction.has_flue_or_chimney = args[:geometry_has_flue_or_chimney].get
3870
- end
3871
3962
  end
3872
3963
 
3873
3964
  def self.set_climate_and_risk_zones(hpxml, args)
@@ -3884,23 +3975,33 @@ class HPXMLFile
3884
3975
  end
3885
3976
 
3886
3977
  def self.set_air_infiltration_measurements(hpxml, args)
3887
- if args[:air_leakage_units] == HPXML::UnitsACH
3888
- house_pressure = args[:air_leakage_house_pressure]
3889
- unit_of_measure = HPXML::UnitsACH
3890
- elsif args[:air_leakage_units] == HPXML::UnitsCFM
3891
- house_pressure = args[:air_leakage_house_pressure]
3892
- unit_of_measure = HPXML::UnitsCFM
3893
- elsif args[:air_leakage_units] == HPXML::UnitsACHNatural
3894
- house_pressure = nil
3895
- unit_of_measure = HPXML::UnitsACHNatural
3978
+ if args[:air_leakage_units] == HPXML::UnitsELA
3979
+ effective_leakage_area = args[:air_leakage_value]
3980
+ else
3981
+ unit_of_measure = args[:air_leakage_units]
3982
+ air_leakage = args[:air_leakage_value]
3983
+ if [HPXML::UnitsACH, HPXML::UnitsCFM].include? args[:air_leakage_units]
3984
+ house_pressure = args[:air_leakage_house_pressure]
3985
+ end
3986
+ end
3987
+ if args[:air_leakage_type].is_initialized
3988
+ if [HPXML::ResidentialTypeSFA, HPXML::ResidentialTypeApartment].include? args[:geometry_unit_type]
3989
+ air_leakage_type = args[:air_leakage_type]
3990
+ end
3896
3991
  end
3897
3992
  infiltration_volume = hpxml.building_construction.conditioned_building_volume
3898
3993
 
3899
3994
  hpxml.air_infiltration_measurements.add(id: "AirInfiltrationMeasurement#{hpxml.air_infiltration_measurements.size + 1}",
3900
3995
  house_pressure: house_pressure,
3901
3996
  unit_of_measure: unit_of_measure,
3902
- air_leakage: args[:air_leakage_value],
3903
- infiltration_volume: infiltration_volume)
3997
+ air_leakage: air_leakage,
3998
+ effective_leakage_area: effective_leakage_area,
3999
+ infiltration_volume: infiltration_volume,
4000
+ infiltration_type: air_leakage_type)
4001
+
4002
+ if args[:air_leakage_has_flue_or_chimney_in_conditioned_space].is_initialized
4003
+ hpxml.air_infiltration.has_flue_or_chimney_in_conditioned_space = args[:air_leakage_has_flue_or_chimney_in_conditioned_space].get
4004
+ end
3904
4005
  end
3905
4006
 
3906
4007
  def self.set_roofs(hpxml, args, sorted_surfaces)
@@ -3925,8 +4026,8 @@ class HPXMLFile
3925
4026
  end
3926
4027
 
3927
4028
  radiant_barrier = args[:roof_radiant_barrier]
3928
- if args[:roof_radiant_barrier]
3929
- radiant_barrier_grade = args[:roof_radiant_barrier_grade]
4029
+ if args[:roof_radiant_barrier] && args[:roof_radiant_barrier_grade].is_initialized
4030
+ radiant_barrier_grade = args[:roof_radiant_barrier_grade].get
3930
4031
  end
3931
4032
 
3932
4033
  if args[:geometry_attic_type] == HPXML::AtticTypeFlatRoof
@@ -4550,6 +4651,13 @@ class HPXMLFile
4550
4651
  end
4551
4652
  end
4552
4653
 
4654
+ if args[:heating_system_pilot_light].is_initialized && heating_system_fuel != HPXML::FuelTypeElectricity
4655
+ pilot_light_btuh = args[:heating_system_pilot_light].get
4656
+ if pilot_light_btuh > 0
4657
+ pilot_light = true
4658
+ end
4659
+ end
4660
+
4553
4661
  fraction_heat_load_served = args[:heating_system_fraction_heat_load_served]
4554
4662
 
4555
4663
  if heating_system_type.include?('Shared')
@@ -4570,6 +4678,8 @@ class HPXMLFile
4570
4678
  heating_efficiency_afue: heating_efficiency_afue,
4571
4679
  heating_efficiency_percent: heating_efficiency_percent,
4572
4680
  airflow_defect_ratio: airflow_defect_ratio,
4681
+ pilot_light: pilot_light,
4682
+ pilot_light_btuh: pilot_light_btuh,
4573
4683
  is_shared_system: is_shared_system,
4574
4684
  number_of_units_served: number_of_units_served,
4575
4685
  primary_system: true)
@@ -4620,6 +4730,12 @@ class HPXMLFile
4620
4730
  end
4621
4731
  end
4622
4732
 
4733
+ if args[:cooling_system_crankcase_heater_watts].is_initialized
4734
+ if [HPXML::HVACTypeCentralAirConditioner, HPXML::HVACTypeMiniSplitAirConditioner, HPXML::HVACTypeRoomAirConditioner, HPXML::HVACTypePTAC].include?(cooling_system_type)
4735
+ cooling_system_crankcase_heater_watts = args[:cooling_system_crankcase_heater_watts].get
4736
+ end
4737
+ end
4738
+
4623
4739
  if [HPXML::HVACTypePTAC, HPXML::HVACTypeRoomAirConditioner].include?(cooling_system_type)
4624
4740
  if args[:cooling_system_integrated_heating_system_fuel].is_initialized
4625
4741
  integrated_heating_system_fuel = args[:cooling_system_integrated_heating_system_fuel].get
@@ -4651,6 +4767,7 @@ class HPXMLFile
4651
4767
  cooling_efficiency_ceer: cooling_efficiency_ceer,
4652
4768
  airflow_defect_ratio: airflow_defect_ratio,
4653
4769
  charge_defect_ratio: charge_defect_ratio,
4770
+ crankcase_heater_watts: cooling_system_crankcase_heater_watts,
4654
4771
  primary_system: true,
4655
4772
  integrated_heating_system_fuel: integrated_heating_system_fuel,
4656
4773
  integrated_heating_system_capacity: integrated_heating_system_capacity,
@@ -4667,10 +4784,12 @@ class HPXMLFile
4667
4784
  heating_capacity = args[:heat_pump_heating_capacity].get
4668
4785
  end
4669
4786
 
4670
- if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit].include? heat_pump_type
4671
- if args[:heat_pump_heating_capacity_17_f].is_initialized
4672
- heating_capacity_17F = args[:heat_pump_heating_capacity_17_f].get
4673
- end
4787
+ if args[:heat_pump_heating_capacity_retention_fraction].is_initialized
4788
+ heating_capacity_retention_fraction = args[:heat_pump_heating_capacity_retention_fraction].get
4789
+ end
4790
+
4791
+ if args[:heat_pump_heating_capacity_retention_temp].is_initialized
4792
+ heating_capacity_retention_temp = args[:heat_pump_heating_capacity_retention_temp].get
4674
4793
  end
4675
4794
 
4676
4795
  if args[:heat_pump_backup_type] == HPXML::HeatPumpBackupTypeIntegrated
@@ -4695,18 +4814,19 @@ class HPXMLFile
4695
4814
  backup_system_idref = "HeatingSystem#{hpxml.heating_systems.size + 1}"
4696
4815
  end
4697
4816
 
4698
- if args[:heat_pump_backup_type] != 'none'
4699
- if args[:heat_pump_backup_heating_switchover_temp].is_initialized
4700
- if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit].include? heat_pump_type
4701
- backup_heating_switchover_temp = args[:heat_pump_backup_heating_switchover_temp].get
4702
- end
4703
- end
4817
+ if args[:heat_pump_compressor_lockout_temp].is_initialized
4818
+ compressor_lockout_temp = args[:heat_pump_compressor_lockout_temp].get
4704
4819
  end
4705
4820
 
4706
- if args[:heat_pump_backup_type] == HPXML::HeatPumpBackupTypeIntegrated
4707
- if args[:heat_pump_backup_heating_lockout_temp].is_initialized
4708
- backup_heating_lockout_temp = args[:heat_pump_backup_heating_lockout_temp].get
4709
- end
4821
+ if args[:heat_pump_backup_heating_lockout_temp].is_initialized
4822
+ backup_heating_lockout_temp = args[:heat_pump_backup_heating_lockout_temp].get
4823
+ end
4824
+
4825
+ if compressor_lockout_temp == backup_heating_lockout_temp && backup_heating_fuel != HPXML::FuelTypeElectricity
4826
+ # Translate to HPXML as switchover temperature instead
4827
+ backup_heating_switchover_temp = compressor_lockout_temp
4828
+ compressor_lockout_temp = nil
4829
+ backup_heating_lockout_temp = nil
4710
4830
  end
4711
4831
 
4712
4832
  if args[:heat_pump_cooling_capacity].is_initialized
@@ -4749,6 +4869,12 @@ class HPXMLFile
4749
4869
  charge_defect_ratio = args[:heat_pump_charge_defect_ratio].get
4750
4870
  end
4751
4871
 
4872
+ if args[:heat_pump_crankcase_heater_watts].is_initialized
4873
+ if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit, HPXML::HVACTypeHeatPumpPTHP, HPXML::HVACTypeHeatPumpRoom].include?(heat_pump_type)
4874
+ heat_pump_crankcase_heater_watts = args[:heat_pump_crankcase_heater_watts].get
4875
+ end
4876
+ end
4877
+
4752
4878
  fraction_heat_load_served = args[:heat_pump_fraction_heat_load_served]
4753
4879
  fraction_cool_load_served = args[:heat_pump_fraction_cool_load_served]
4754
4880
 
@@ -4768,8 +4894,10 @@ class HPXMLFile
4768
4894
  heat_pump_type: heat_pump_type,
4769
4895
  heat_pump_fuel: HPXML::FuelTypeElectricity,
4770
4896
  heating_capacity: heating_capacity,
4771
- heating_capacity_17F: heating_capacity_17F,
4897
+ heating_capacity_retention_fraction: heating_capacity_retention_fraction,
4898
+ heating_capacity_retention_temp: heating_capacity_retention_temp,
4772
4899
  compressor_type: compressor_type,
4900
+ compressor_lockout_temp: compressor_lockout_temp,
4773
4901
  cooling_shr: cooling_shr,
4774
4902
  cooling_capacity: cooling_capacity,
4775
4903
  fraction_heat_load_served: fraction_heat_load_served,
@@ -4790,6 +4918,7 @@ class HPXMLFile
4790
4918
  cooling_efficiency_eer: cooling_efficiency_eer,
4791
4919
  airflow_defect_ratio: airflow_defect_ratio,
4792
4920
  charge_defect_ratio: charge_defect_ratio,
4921
+ crankcase_heater_watts: heat_pump_crankcase_heater_watts,
4793
4922
  primary_heating_system: primary_heating_system,
4794
4923
  primary_cooling_system: primary_cooling_system)
4795
4924
  end
@@ -4863,8 +4992,8 @@ class HPXMLFile
4863
4992
  if [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump.heat_pump_type
4864
4993
  air_distribution_systems << heat_pump
4865
4994
  elsif [HPXML::HVACTypeHeatPumpMiniSplit].include?(heat_pump.heat_pump_type)
4866
- if args[:heat_pump_is_ducted].is_initialized
4867
- air_distribution_systems << heat_pump if args[:heat_pump_is_ducted].get
4995
+ if args[:heat_pump_is_ducted]
4996
+ air_distribution_systems << heat_pump if args[:heat_pump_is_ducted]
4868
4997
  end
4869
4998
  end
4870
4999
  end
@@ -4941,9 +5070,18 @@ class HPXMLFile
4941
5070
  ducts_return_surface_area = args[:ducts_return_surface_area].get
4942
5071
  end
4943
5072
 
5073
+ if args[:ducts_supply_buried_insulation_level].is_initialized
5074
+ ducts_supply_buried_insulation_level = args[:ducts_supply_buried_insulation_level].get
5075
+ end
5076
+
5077
+ if args[:ducts_return_buried_insulation_level].is_initialized
5078
+ ducts_return_buried_insulation_level = args[:ducts_return_buried_insulation_level].get
5079
+ end
5080
+
4944
5081
  hvac_distribution.ducts.add(id: "Ducts#{hvac_distribution.ducts.size + 1}",
4945
5082
  duct_type: HPXML::DuctTypeSupply,
4946
5083
  duct_insulation_r_value: args[:ducts_supply_insulation_r],
5084
+ duct_buried_insulation_level: ducts_supply_buried_insulation_level,
4947
5085
  duct_location: ducts_supply_location,
4948
5086
  duct_surface_area: ducts_supply_surface_area)
4949
5087
 
@@ -4951,6 +5089,7 @@ class HPXMLFile
4951
5089
  hvac_distribution.ducts.add(id: "Ducts#{hvac_distribution.ducts.size + 1}",
4952
5090
  duct_type: HPXML::DuctTypeReturn,
4953
5091
  duct_insulation_r_value: args[:ducts_return_insulation_r],
5092
+ duct_buried_insulation_level: ducts_return_buried_insulation_level,
4954
5093
  duct_location: ducts_return_location,
4955
5094
  duct_surface_area: ducts_return_surface_area)
4956
5095
  end
@@ -4983,7 +5122,7 @@ class HPXMLFile
4983
5122
  sim_calendar_year = Location.get_sim_calendar_year(hpxml.header.sim_calendar_year, epw_file)
4984
5123
  begin_month, begin_day, end_month, end_day = Schedule.get_begin_and_end_dates_from_monthly_array(heating_months, sim_calendar_year)
4985
5124
  else
4986
- begin_month, begin_day, end_month, end_day = Schedule.parse_date_range(hvac_control_heating_season_period)
5125
+ begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(hvac_control_heating_season_period)
4987
5126
  end
4988
5127
  seasons_heating_begin_month = begin_month
4989
5128
  seasons_heating_begin_day = begin_day
@@ -5016,7 +5155,7 @@ class HPXMLFile
5016
5155
  sim_calendar_year = Location.get_sim_calendar_year(hpxml.header.sim_calendar_year, epw_file)
5017
5156
  begin_month, begin_day, end_month, end_day = Schedule.get_begin_and_end_dates_from_monthly_array(cooling_months, sim_calendar_year)
5018
5157
  else
5019
- begin_month, begin_day, end_month, end_day = Schedule.parse_date_range(args[:hvac_control_cooling_season_period].get)
5158
+ begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(hvac_control_cooling_season_period)
5020
5159
  end
5021
5160
  seasons_cooling_begin_month = begin_month
5022
5161
  seasons_cooling_begin_day = begin_day
@@ -5187,7 +5326,7 @@ class HPXMLFile
5187
5326
  fan_location: HPXML::LocationKitchen,
5188
5327
  fan_power: fan_power,
5189
5328
  start_hour: start_hour,
5190
- quantity: quantity)
5329
+ count: quantity)
5191
5330
  end
5192
5331
 
5193
5332
  if !args[:bathroom_fans_quantity].is_initialized || (args[:bathroom_fans_quantity].get > 0)
@@ -5218,7 +5357,7 @@ class HPXMLFile
5218
5357
  fan_location: HPXML::LocationBath,
5219
5358
  fan_power: fan_power,
5220
5359
  start_hour: start_hour,
5221
- quantity: quantity)
5360
+ count: quantity)
5222
5361
  end
5223
5362
 
5224
5363
  if args[:whole_house_fan_present]
@@ -5375,8 +5514,12 @@ class HPXMLFile
5375
5514
 
5376
5515
  if args[:dwhr_facilities_connected] != 'none'
5377
5516
  dwhr_facilities_connected = args[:dwhr_facilities_connected]
5378
- dwhr_equal_flow = args[:dwhr_equal_flow]
5379
- dwhr_efficiency = args[:dwhr_efficiency]
5517
+ if args[:dwhr_equal_flow].is_initialized
5518
+ dwhr_equal_flow = args[:dwhr_equal_flow].get
5519
+ end
5520
+ if args[:dwhr_efficiency].is_initialized
5521
+ dwhr_efficiency = args[:dwhr_efficiency].get
5522
+ end
5380
5523
  end
5381
5524
 
5382
5525
  if args[:hot_water_distribution_system_type] == HPXML::DHWDistTypeStandard
@@ -5384,7 +5527,9 @@ class HPXMLFile
5384
5527
  standard_piping_length = args[:hot_water_distribution_standard_piping_length].get
5385
5528
  end
5386
5529
  else
5387
- recirculation_control_type = args[:hot_water_distribution_recirc_control_type]
5530
+ if args[:hot_water_distribution_recirc_control_type].is_initialized
5531
+ recirculation_control_type = args[:hot_water_distribution_recirc_control_type].get
5532
+ end
5388
5533
 
5389
5534
  if args[:hot_water_distribution_recirc_piping_length].is_initialized
5390
5535
  recirculation_piping_length = args[:hot_water_distribution_recirc_piping_length].get
@@ -5487,10 +5632,6 @@ class HPXMLFile
5487
5632
 
5488
5633
  max_power_output = [args[:pv_system_max_power_output], args[:pv_system_2_max_power_output]][i]
5489
5634
 
5490
- if args[:pv_system_inverter_efficiency].is_initialized
5491
- inverter_efficiency = args[:pv_system_inverter_efficiency].get
5492
- end
5493
-
5494
5635
  if args[:pv_system_system_losses_fraction].is_initialized
5495
5636
  system_losses_fraction = args[:pv_system_system_losses_fraction].get
5496
5637
  end
@@ -5509,11 +5650,22 @@ class HPXMLFile
5509
5650
  array_azimuth: [args[:pv_system_array_azimuth], args[:pv_system_2_array_azimuth]][i],
5510
5651
  array_tilt: Geometry.get_absolute_tilt([args[:pv_system_array_tilt], args[:pv_system_2_array_tilt]][i], args[:geometry_roof_pitch], epw_file),
5511
5652
  max_power_output: max_power_output,
5512
- inverter_efficiency: inverter_efficiency,
5513
5653
  system_losses_fraction: system_losses_fraction,
5514
5654
  is_shared_system: is_shared_system,
5515
5655
  number_of_bedrooms_served: number_of_bedrooms_served)
5516
5656
  end
5657
+ if hpxml.pv_systems.size > 0
5658
+ # Add inverter efficiency; assume a single inverter even if multiple PV arrays
5659
+ if args[:pv_system_inverter_efficiency].is_initialized
5660
+ inverter_efficiency = args[:pv_system_inverter_efficiency].get
5661
+ end
5662
+
5663
+ hpxml.inverters.add(id: "Inverter#{hpxml.inverters.size + 1}",
5664
+ inverter_efficiency: inverter_efficiency)
5665
+ hpxml.pv_systems.each do |pv_system|
5666
+ pv_system.inverter_idref = hpxml.inverters[-1].id
5667
+ end
5668
+ end
5517
5669
  end
5518
5670
 
5519
5671
  def self.set_battery(hpxml, args)
@@ -5549,61 +5701,70 @@ class HPXMLFile
5549
5701
  end
5550
5702
 
5551
5703
  def self.set_lighting(hpxml, args)
5552
- return unless args[:lighting_present] || args[:ceiling_fan_present] # If ceiling fans present but not lighting present, need to continue and use lighting multipliers = 0 instead
5553
-
5554
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5555
- location: HPXML::LocationInterior,
5556
- fraction_of_units_in_location: args[:lighting_interior_fraction_cfl],
5557
- lighting_type: HPXML::LightingTypeCFL)
5558
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5559
- location: HPXML::LocationExterior,
5560
- fraction_of_units_in_location: args[:lighting_exterior_fraction_cfl],
5561
- lighting_type: HPXML::LightingTypeCFL)
5562
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5563
- location: HPXML::LocationGarage,
5564
- fraction_of_units_in_location: args[:lighting_garage_fraction_cfl],
5565
- lighting_type: HPXML::LightingTypeCFL)
5566
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5567
- location: HPXML::LocationInterior,
5568
- fraction_of_units_in_location: args[:lighting_interior_fraction_lfl],
5569
- lighting_type: HPXML::LightingTypeLFL)
5570
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5571
- location: HPXML::LocationExterior,
5572
- fraction_of_units_in_location: args[:lighting_exterior_fraction_lfl],
5573
- lighting_type: HPXML::LightingTypeLFL)
5574
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5575
- location: HPXML::LocationGarage,
5576
- fraction_of_units_in_location: args[:lighting_garage_fraction_lfl],
5577
- lighting_type: HPXML::LightingTypeLFL)
5578
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5579
- location: HPXML::LocationInterior,
5580
- fraction_of_units_in_location: args[:lighting_interior_fraction_led],
5581
- lighting_type: HPXML::LightingTypeLED)
5582
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5583
- location: HPXML::LocationExterior,
5584
- fraction_of_units_in_location: args[:lighting_exterior_fraction_led],
5585
- lighting_type: HPXML::LightingTypeLED)
5586
- hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5587
- location: HPXML::LocationGarage,
5588
- fraction_of_units_in_location: args[:lighting_garage_fraction_led],
5589
- lighting_type: HPXML::LightingTypeLED)
5590
-
5591
5704
  if args[:lighting_present]
5592
- if args[:lighting_interior_usage_multiplier].is_initialized
5593
- hpxml.lighting.interior_usage_multiplier = args[:lighting_interior_usage_multiplier].get
5594
- end
5705
+ has_garage = (args[:geometry_garage_width] * args[:geometry_garage_depth] > 0)
5595
5706
 
5707
+ # Interior
5708
+ if args[:lighting_interior_usage_multiplier].is_initialized
5709
+ interior_usage_multiplier = args[:lighting_interior_usage_multiplier].get
5710
+ end
5711
+ if interior_usage_multiplier.nil? || interior_usage_multiplier.to_f > 0
5712
+ hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5713
+ location: HPXML::LocationInterior,
5714
+ fraction_of_units_in_location: args[:lighting_interior_fraction_cfl],
5715
+ lighting_type: HPXML::LightingTypeCFL)
5716
+ hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5717
+ location: HPXML::LocationInterior,
5718
+ fraction_of_units_in_location: args[:lighting_interior_fraction_lfl],
5719
+ lighting_type: HPXML::LightingTypeLFL)
5720
+ hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5721
+ location: HPXML::LocationInterior,
5722
+ fraction_of_units_in_location: args[:lighting_interior_fraction_led],
5723
+ lighting_type: HPXML::LightingTypeLED)
5724
+ hpxml.lighting.interior_usage_multiplier = interior_usage_multiplier
5725
+ end
5726
+
5727
+ # Exterior
5596
5728
  if args[:lighting_exterior_usage_multiplier].is_initialized
5597
- hpxml.lighting.exterior_usage_multiplier = args[:lighting_exterior_usage_multiplier].get
5598
- end
5599
-
5600
- if args[:lighting_garage_usage_multiplier].is_initialized
5601
- hpxml.lighting.garage_usage_multiplier = args[:lighting_garage_usage_multiplier].get
5729
+ exterior_usage_multiplier = args[:lighting_exterior_usage_multiplier].get
5730
+ end
5731
+ if exterior_usage_multiplier.nil? || exterior_usage_multiplier.to_f > 0
5732
+ hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5733
+ location: HPXML::LocationExterior,
5734
+ fraction_of_units_in_location: args[:lighting_exterior_fraction_cfl],
5735
+ lighting_type: HPXML::LightingTypeCFL)
5736
+ hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5737
+ location: HPXML::LocationExterior,
5738
+ fraction_of_units_in_location: args[:lighting_exterior_fraction_lfl],
5739
+ lighting_type: HPXML::LightingTypeLFL)
5740
+ hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5741
+ location: HPXML::LocationExterior,
5742
+ fraction_of_units_in_location: args[:lighting_exterior_fraction_led],
5743
+ lighting_type: HPXML::LightingTypeLED)
5744
+ hpxml.lighting.exterior_usage_multiplier = exterior_usage_multiplier
5745
+ end
5746
+
5747
+ # Garage
5748
+ if has_garage
5749
+ if args[:lighting_garage_usage_multiplier].is_initialized
5750
+ garage_usage_multiplier = args[:lighting_garage_usage_multiplier].get
5751
+ end
5752
+ if garage_usage_multiplier.nil? || garage_usage_multiplier.to_f > 0
5753
+ hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5754
+ location: HPXML::LocationGarage,
5755
+ fraction_of_units_in_location: args[:lighting_garage_fraction_cfl],
5756
+ lighting_type: HPXML::LightingTypeCFL)
5757
+ hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5758
+ location: HPXML::LocationGarage,
5759
+ fraction_of_units_in_location: args[:lighting_garage_fraction_lfl],
5760
+ lighting_type: HPXML::LightingTypeLFL)
5761
+ hpxml.lighting_groups.add(id: "LightingGroup#{hpxml.lighting_groups.size + 1}",
5762
+ location: HPXML::LocationGarage,
5763
+ fraction_of_units_in_location: args[:lighting_garage_fraction_led],
5764
+ lighting_type: HPXML::LightingTypeLED)
5765
+ hpxml.lighting.garage_usage_multiplier = garage_usage_multiplier
5766
+ end
5602
5767
  end
5603
- elsif args[:ceiling_fan_present]
5604
- hpxml.lighting.interior_usage_multiplier = 0.0
5605
- hpxml.lighting.exterior_usage_multiplier = 0.0
5606
- hpxml.lighting.garage_usage_multiplier = 0.0
5607
5768
  end
5608
5769
 
5609
5770
  return unless args[:holiday_lighting_present]
@@ -5615,7 +5776,7 @@ class HPXMLFile
5615
5776
  end
5616
5777
 
5617
5778
  if args[:holiday_lighting_period].is_initialized
5618
- begin_month, begin_day, end_month, end_day = Schedule.parse_date_range(args[:holiday_lighting_period].get)
5779
+ begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Schedule.parse_date_time_range(args[:holiday_lighting_period].get)
5619
5780
  hpxml.lighting.holiday_period_begin_month = begin_month
5620
5781
  hpxml.lighting.holiday_period_begin_day = begin_day
5621
5782
  hpxml.lighting.holiday_period_end_month = end_month
@@ -5899,14 +6060,14 @@ class HPXMLFile
5899
6060
 
5900
6061
  hpxml.ceiling_fans.add(id: "CeilingFan#{hpxml.ceiling_fans.size + 1}",
5901
6062
  efficiency: efficiency,
5902
- quantity: quantity)
6063
+ count: quantity)
5903
6064
  end
5904
6065
 
5905
6066
  def self.set_misc_plug_loads_television(hpxml, args)
5906
6067
  return unless args[:misc_plug_loads_television_present]
5907
6068
 
5908
6069
  if args[:misc_plug_loads_television_annual_kwh].is_initialized
5909
- kWh_per_year = args[:misc_plug_loads_television_annual_kwh].get
6070
+ kwh_per_year = args[:misc_plug_loads_television_annual_kwh].get
5910
6071
  end
5911
6072
 
5912
6073
  if args[:misc_plug_loads_television_usage_multiplier].is_initialized
@@ -5915,13 +6076,13 @@ class HPXMLFile
5915
6076
 
5916
6077
  hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
5917
6078
  plug_load_type: HPXML::PlugLoadTypeTelevision,
5918
- kWh_per_year: kWh_per_year,
6079
+ kwh_per_year: kwh_per_year,
5919
6080
  usage_multiplier: usage_multiplier)
5920
6081
  end
5921
6082
 
5922
6083
  def self.set_misc_plug_loads_other(hpxml, args)
5923
6084
  if args[:misc_plug_loads_other_annual_kwh].is_initialized
5924
- kWh_per_year = args[:misc_plug_loads_other_annual_kwh].get
6085
+ kwh_per_year = args[:misc_plug_loads_other_annual_kwh].get
5925
6086
  end
5926
6087
 
5927
6088
  if args[:misc_plug_loads_other_frac_sensible].is_initialized
@@ -5938,7 +6099,7 @@ class HPXMLFile
5938
6099
 
5939
6100
  hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
5940
6101
  plug_load_type: HPXML::PlugLoadTypeOther,
5941
- kWh_per_year: kWh_per_year,
6102
+ kwh_per_year: kwh_per_year,
5942
6103
  frac_sensible: frac_sensible,
5943
6104
  frac_latent: frac_latent,
5944
6105
  usage_multiplier: usage_multiplier)
@@ -5948,7 +6109,7 @@ class HPXMLFile
5948
6109
  return unless args[:misc_plug_loads_well_pump_present]
5949
6110
 
5950
6111
  if args[:misc_plug_loads_well_pump_annual_kwh].is_initialized
5951
- kWh_per_year = args[:misc_plug_loads_well_pump_annual_kwh].get
6112
+ kwh_per_year = args[:misc_plug_loads_well_pump_annual_kwh].get
5952
6113
  end
5953
6114
 
5954
6115
  if args[:misc_plug_loads_well_pump_usage_multiplier].is_initialized
@@ -5957,7 +6118,7 @@ class HPXMLFile
5957
6118
 
5958
6119
  hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
5959
6120
  plug_load_type: HPXML::PlugLoadTypeWellPump,
5960
- kWh_per_year: kWh_per_year,
6121
+ kwh_per_year: kwh_per_year,
5961
6122
  usage_multiplier: usage_multiplier)
5962
6123
  end
5963
6124
 
@@ -5965,7 +6126,7 @@ class HPXMLFile
5965
6126
  return unless args[:misc_plug_loads_vehicle_present]
5966
6127
 
5967
6128
  if args[:misc_plug_loads_vehicle_annual_kwh].is_initialized
5968
- kWh_per_year = args[:misc_plug_loads_vehicle_annual_kwh].get
6129
+ kwh_per_year = args[:misc_plug_loads_vehicle_annual_kwh].get
5969
6130
  end
5970
6131
 
5971
6132
  if args[:misc_plug_loads_vehicle_usage_multiplier].is_initialized
@@ -5974,7 +6135,7 @@ class HPXMLFile
5974
6135
 
5975
6136
  hpxml.plug_loads.add(id: "PlugLoad#{hpxml.plug_loads.size + 1}",
5976
6137
  plug_load_type: HPXML::PlugLoadTypeElectricVehicleCharging,
5977
- kWh_per_year: kWh_per_year,
6138
+ kwh_per_year: kwh_per_year,
5978
6139
  usage_multiplier: usage_multiplier)
5979
6140
  end
5980
6141
 
@@ -6125,6 +6286,91 @@ class HPXMLFile
6125
6286
  heater_load_value: heater_load_value,
6126
6287
  heater_usage_multiplier: heater_usage_multiplier)
6127
6288
  end
6289
+
6290
+ def self.collapse_surfaces(hpxml, args)
6291
+ if args[:combine_like_surfaces].is_initialized && args[:combine_like_surfaces].get
6292
+ # Collapse some surfaces whose azimuth is a minor effect to simplify HPXMLs.
6293
+ (hpxml.roofs + hpxml.rim_joists + hpxml.walls + hpxml.foundation_walls).each do |surface|
6294
+ surface.azimuth = nil
6295
+ end
6296
+ hpxml.collapse_enclosure_surfaces()
6297
+ else
6298
+ # Collapse surfaces so that we don't get, e.g., individual windows
6299
+ # or the front wall split because of the door. Exclude foundation walls
6300
+ # from the list so we get all 4 foundation walls.
6301
+ hpxml.collapse_enclosure_surfaces([:roofs, :walls, :rim_joists, :floors,
6302
+ :slabs, :windows, :skylights, :doors])
6303
+ end
6304
+
6305
+ # After surfaces are collapsed, round all areas
6306
+ (hpxml.roofs +
6307
+ hpxml.rim_joists +
6308
+ hpxml.walls +
6309
+ hpxml.foundation_walls +
6310
+ hpxml.floors +
6311
+ hpxml.slabs +
6312
+ hpxml.windows +
6313
+ hpxml.skylights +
6314
+ hpxml.doors).each do |s|
6315
+ s.area = s.area.round(1)
6316
+ end
6317
+ end
6318
+
6319
+ def self.renumber_hpxml_ids(hpxml)
6320
+ # Renumber surfaces
6321
+ { hpxml.walls => 'Wall',
6322
+ hpxml.foundation_walls => 'FoundationWall',
6323
+ hpxml.rim_joists => 'RimJoist',
6324
+ hpxml.floors => 'Floor',
6325
+ hpxml.roofs => 'Roof',
6326
+ hpxml.slabs => 'Slab',
6327
+ hpxml.windows => 'Window',
6328
+ hpxml.doors => 'Door',
6329
+ hpxml.skylights => 'Skylight' }.each do |surfs, surf_name|
6330
+ surfs.each_with_index do |surf, i|
6331
+ (hpxml.attics + hpxml.foundations).each do |attic_or_fnd|
6332
+ if attic_or_fnd.respond_to?(:attached_to_roof_idrefs) && !attic_or_fnd.attached_to_roof_idrefs.nil? && !attic_or_fnd.attached_to_roof_idrefs.delete(surf.id).nil?
6333
+ attic_or_fnd.attached_to_roof_idrefs << "#{surf_name}#{i + 1}"
6334
+ end
6335
+ if attic_or_fnd.respond_to?(:attached_to_wall_idrefs) && !attic_or_fnd.attached_to_wall_idrefs.nil? && !attic_or_fnd.attached_to_wall_idrefs.delete(surf.id).nil?
6336
+ attic_or_fnd.attached_to_wall_idrefs << "#{surf_name}#{i + 1}"
6337
+ end
6338
+ if attic_or_fnd.respond_to?(:attached_to_rim_joist_idrefs) && !attic_or_fnd.attached_to_rim_joist_idrefs.nil? && !attic_or_fnd.attached_to_rim_joist_idrefs.delete(surf.id).nil?
6339
+ attic_or_fnd.attached_to_rim_joist_idrefs << "#{surf_name}#{i + 1}"
6340
+ end
6341
+ if attic_or_fnd.respond_to?(:attached_to_floor_idrefs) && !attic_or_fnd.attached_to_floor_idrefs.nil? && !attic_or_fnd.attached_to_floor_idrefs.delete(surf.id).nil?
6342
+ attic_or_fnd.attached_to_floor_idrefs << "#{surf_name}#{i + 1}"
6343
+ end
6344
+ if attic_or_fnd.respond_to?(:attached_to_slab_idrefs) && !attic_or_fnd.attached_to_slab_idrefs.nil? && !attic_or_fnd.attached_to_slab_idrefs.delete(surf.id).nil?
6345
+ attic_or_fnd.attached_to_slab_idrefs << "#{surf_name}#{i + 1}"
6346
+ end
6347
+ if attic_or_fnd.respond_to?(:attached_to_foundation_wall_idrefs) && !attic_or_fnd.attached_to_foundation_wall_idrefs.nil? && !attic_or_fnd.attached_to_foundation_wall_idrefs.delete(surf.id).nil?
6348
+ attic_or_fnd.attached_to_foundation_wall_idrefs << "#{surf_name}#{i + 1}"
6349
+ end
6350
+ end
6351
+ (hpxml.windows + hpxml.doors).each do |subsurf|
6352
+ if subsurf.respond_to?(:wall_idref) && (subsurf.wall_idref == surf.id)
6353
+ subsurf.wall_idref = "#{surf_name}#{i + 1}"
6354
+ end
6355
+ end
6356
+ hpxml.skylights.each do |subsurf|
6357
+ if subsurf.respond_to?(:roof_idref) && (subsurf.roof_idref == surf.id)
6358
+ subsurf.roof_idref = "#{surf_name}#{i + 1}"
6359
+ end
6360
+ end
6361
+ surf.id = "#{surf_name}#{i + 1}"
6362
+ if surf.respond_to? :insulation_id
6363
+ surf.insulation_id = "#{surf_name}#{i + 1}Insulation"
6364
+ end
6365
+ if surf.respond_to? :perimeter_insulation_id
6366
+ surf.perimeter_insulation_id = "#{surf_name}#{i + 1}PerimeterInsulation"
6367
+ end
6368
+ if surf.respond_to? :under_slab_insulation_id
6369
+ surf.under_slab_insulation_id = "#{surf_name}#{i + 1}UnderSlabInsulation"
6370
+ end
6371
+ end
6372
+ end
6373
+ end
6128
6374
  end
6129
6375
 
6130
6376
  # register the measure to be used by the application