urbanopt-cli 0.5.2 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (829) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +2 -2
  4. data/CHANGELOG.md +40 -0
  5. data/CMakeLists.txt +13 -13
  6. data/FindOpenStudioSDK.cmake +11 -6
  7. data/Gemfile +12 -6
  8. data/example_files/Gemfile +11 -8
  9. data/example_files/base_workflow_res.osw +10 -0
  10. data/example_files/example_project_combined.json +13 -3
  11. data/example_files/example_project_with_PV.json +751 -0
  12. data/example_files/example_project_with_streets.json +826 -0
  13. data/example_files/mappers/Baseline.rb +106 -50
  14. data/example_files/mappers/CreateBar.rb +31 -1
  15. data/example_files/mappers/FlexibleHotWater.rb +69 -0
  16. data/example_files/mappers/Floorspace.rb +31 -1
  17. data/example_files/mappers/HighEfficiency.rb +20 -8
  18. data/example_files/mappers/HighEfficiencyCreateBar.rb +3 -2
  19. data/example_files/mappers/HighEfficiencyFloorspace.rb +3 -2
  20. data/example_files/mappers/base_workflow.osw +5 -0
  21. data/example_files/mappers/createbar_workflow.osw +3 -1
  22. data/example_files/mappers/floorspace_workflow.osw +2 -1
  23. data/example_files/measures/BuildResidentialModel/measure.rb +70 -37
  24. data/example_files/osm_building/7.osm +0 -307
  25. data/example_files/osm_building/8.osm +0 -419
  26. data/example_files/osm_building/9.osm +0 -664
  27. data/example_files/reopt/base_assumptions.json +4 -4
  28. data/example_files/reopt/multiPV_assumptions.json +6 -5
  29. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +1 -1
  30. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +96 -3
  31. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +138 -73
  32. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +509 -487
  33. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +11 -11
  34. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules.rb +33 -32
  35. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.json +388 -0
  36. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.md +43 -0
  37. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +5 -5
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-portable.osw +5 -5
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-whole-home.osw +5 -5
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +5 -5
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +5 -5
  42. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +5 -5
  43. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +5 -5
  44. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +5 -5
  45. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +5 -5
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +5 -5
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +5 -5
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +5 -5
  49. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +5 -5
  50. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +5 -5
  51. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-baseboard.osw +341 -0
  52. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-fan-coil.osw +341 -0
  53. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent-preconditioning.osw +8 -8
  54. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent.osw +8 -8
  55. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +8 -8
  56. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +8 -8
  57. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +8 -8
  58. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-single-family-attached.osw +5 -5
  59. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +5 -5
  60. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +5 -5
  61. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +5 -5
  62. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +5 -5
  63. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +5 -5
  64. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +5 -5
  65. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +5 -5
  66. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +5 -5
  67. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +5 -5
  68. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +5 -5
  69. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +5 -5
  70. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +5 -5
  71. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +5 -5
  72. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +5 -5
  73. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +5 -5
  74. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +5 -5
  75. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +5 -5
  76. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +5 -5
  77. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +5 -5
  78. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +5 -5
  79. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +5 -5
  80. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +5 -5
  81. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +5 -5
  82. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +5 -5
  83. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +5 -5
  84. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +5 -5
  85. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +5 -5
  86. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +5 -5
  87. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +5 -5
  88. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +5 -5
  89. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +5 -5
  90. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +5 -5
  91. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +5 -5
  92. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +5 -5
  93. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +5 -5
  94. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +5 -5
  95. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +5 -5
  96. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +5 -5
  97. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +5 -5
  98. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +5 -5
  99. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +5 -5
  100. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +5 -5
  101. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +5 -5
  102. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +5 -5
  103. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +5 -5
  104. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +5 -5
  105. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +5 -5
  106. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +5 -5
  107. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +5 -5
  108. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +5 -5
  109. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +5 -5
  110. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +5 -5
  111. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +5 -5
  112. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +5 -5
  113. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +5 -5
  114. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +6 -6
  115. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +5 -5
  116. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +5 -5
  117. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +5 -5
  118. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +5 -5
  119. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +5 -5
  120. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +5 -5
  121. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +5 -5
  122. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +5 -5
  123. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +5 -5
  124. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +5 -5
  125. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +4 -4
  126. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +5 -5
  127. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +6 -6
  128. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +6 -6
  129. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +6 -6
  130. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +5 -5
  131. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +5 -5
  132. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +5 -5
  133. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +5 -5
  134. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +5 -5
  135. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +5 -5
  136. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +5 -5
  137. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +5 -5
  138. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +5 -5
  139. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +5 -5
  140. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +6 -6
  141. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +5 -5
  142. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +5 -5
  143. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +5 -5
  144. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +5 -5
  145. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +5 -5
  146. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +5 -5
  147. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +5 -5
  148. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +5 -5
  149. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +5 -5
  150. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +5 -5
  151. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +5 -5
  152. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +6 -6
  153. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +5 -5
  154. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +5 -5
  155. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +5 -5
  156. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +5 -5
  157. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +5 -5
  158. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +5 -5
  159. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +5 -5
  160. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +5 -5
  161. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +5 -5
  162. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +5 -5
  163. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +5 -5
  164. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +4 -4
  165. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +4 -4
  166. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +5 -5
  167. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw +5 -5
  168. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +6 -6
  169. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +6 -6
  170. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +6 -6
  171. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +5 -5
  172. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +5 -5
  173. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +5 -5
  174. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +5 -5
  175. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +5 -5
  176. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +5 -5
  177. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +6 -6
  178. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +5 -5
  179. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +5 -5
  180. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +5 -5
  181. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +5 -5
  182. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +4 -4
  183. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +5 -5
  184. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +6 -6
  185. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +6 -6
  186. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +5 -5
  187. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +6 -6
  188. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +8 -8
  189. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +5 -5
  190. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +5 -5
  191. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +5 -5
  192. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +5 -5
  193. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +5 -5
  194. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +5 -5
  195. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +5 -5
  196. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +5 -5
  197. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +5 -5
  198. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +5 -5
  199. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +5 -5
  200. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +5 -5
  201. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +5 -5
  202. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +5 -5
  203. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-honolulu-hi.osw +5 -5
  204. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +5 -5
  205. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +5 -5
  206. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +5 -5
  207. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +5 -5
  208. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +5 -5
  209. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +5 -5
  210. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +5 -5
  211. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +5 -5
  212. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +5 -5
  213. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +5 -5
  214. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +5 -5
  215. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +5 -5
  216. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +5 -5
  217. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +5 -5
  218. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +5 -5
  219. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +5 -5
  220. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +5 -5
  221. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +5 -5
  222. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +5 -5
  223. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +5 -5
  224. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +5 -5
  225. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +5 -5
  226. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic-vacant.osw +5 -5
  227. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +5 -5
  228. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +5 -5
  229. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +5 -5
  230. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +5 -5
  231. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +5 -5
  232. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +5 -5
  233. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +5 -5
  234. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +5 -5
  235. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +4 -2
  236. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +5 -5
  237. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +8 -8
  238. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +8 -8
  239. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +8 -8
  240. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +8 -8
  241. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +8 -8
  242. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +8 -8
  243. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +8 -8
  244. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +8 -8
  245. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +8 -8
  246. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +8 -8
  247. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +8 -8
  248. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +8 -8
  249. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +8 -8
  250. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +8 -8
  251. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +8 -8
  252. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +8 -8
  253. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +8 -8
  254. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +8 -8
  255. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +8 -8
  256. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +8 -8
  257. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +8 -8
  258. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +8 -8
  259. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +8 -8
  260. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +8 -8
  261. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +8 -8
  262. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +8 -8
  263. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +8 -8
  264. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +8 -8
  265. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +8 -8
  266. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +8 -8
  267. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +8 -8
  268. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +8 -8
  269. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +8 -8
  270. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +8 -8
  271. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +8 -8
  272. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +8 -8
  273. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +8 -8
  274. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +8 -8
  275. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +8 -8
  276. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +8 -8
  277. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +8 -8
  278. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +8 -8
  279. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +8 -8
  280. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +8 -8
  281. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +8 -8
  282. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +8 -8
  283. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +8 -8
  284. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +8 -8
  285. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +8 -8
  286. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +8 -8
  287. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +8 -8
  288. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +8 -8
  289. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +8 -8
  290. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +8 -8
  291. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +8 -8
  292. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +8 -8
  293. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +8 -8
  294. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +8 -8
  295. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +8 -8
  296. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +8 -8
  297. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +8 -8
  298. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +8 -8
  299. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +8 -8
  300. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +8 -8
  301. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +5 -5
  302. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +5 -5
  303. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-flat.osw +339 -0
  304. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-exterior.osw +5 -5
  305. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +5 -5
  306. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-single-exterior-front.osw +5 -5
  307. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +5 -5
  308. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +5 -5
  309. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +5 -5
  310. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +5 -5
  311. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +5 -5
  312. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement.osw +5 -5
  313. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +5 -5
  314. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +5 -5
  315. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +5 -5
  316. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +5 -5
  317. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +5 -5
  318. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +5 -5
  319. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +5 -5
  320. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +5 -5
  321. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +5 -5
  322. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +5 -5
  323. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +5 -5
  324. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +5 -5
  325. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-hot-tub-heater-with-zero-kwh.osw +337 -0
  326. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-pool-heater-with-zero-kwh.osw +337 -0
  327. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +5 -5
  328. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +5 -5
  329. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +5 -5
  330. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +5 -5
  331. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +5 -5
  332. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heating-system.osw +4 -4
  333. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +5 -5
  334. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heating-system.osw +4 -4
  335. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +5 -5
  336. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +5 -5
  337. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +5 -5
  338. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +5 -5
  339. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +5 -5
  340. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +5 -5
  341. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +5 -5
  342. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +5 -5
  343. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +5 -5
  344. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +5 -5
  345. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +5 -5
  346. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +5 -5
  347. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +5 -5
  348. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +5 -5
  349. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +8 -8
  350. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +8 -8
  351. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +7 -7
  352. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-fuel-loads.osw +5 -5
  353. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +5 -5
  354. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-tv-plug-loads.osw +5 -5
  355. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-vehicle-plug-loads.osw +5 -5
  356. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +5 -5
  357. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +5 -5
  358. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +5 -5
  359. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +5 -5
  360. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +5 -5
  361. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +5 -5
  362. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +5 -5
  363. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +5 -5
  364. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +5 -5
  365. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +5 -5
  366. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +5 -5
  367. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-appliances-dehumidifier-50percent.osw → invalid_files/single-family-detached-with-shared-system.osw} +22 -22
  368. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +5 -5
  369. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +5 -5
  370. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +5 -5
  371. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +5 -5
  372. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +5 -5
  373. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +5 -5
  374. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +5 -5
  375. data/example_files/resources/hpxml-measures/Changelog.md +14 -3
  376. data/example_files/resources/hpxml-measures/Gemfile +1 -4
  377. data/example_files/resources/hpxml-measures/Gemfile.lock +6 -25
  378. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +136 -528
  379. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +131 -106
  380. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +2 -0
  381. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +31 -14
  382. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +19 -0
  383. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +5 -1
  384. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +4 -0
  385. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +62 -0
  386. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  387. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +2 -1
  388. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +388 -4
  389. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +54 -14
  390. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +40 -4
  391. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +110 -89
  392. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +2 -4
  393. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +21 -10
  394. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +4 -26
  395. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +12 -11
  396. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +2 -1
  397. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +28 -1
  398. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +20 -9
  399. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +1 -1
  400. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +1 -0
  401. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +1 -0
  402. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +2 -28
  403. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +16 -7
  404. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/{test_constructions.rb → test_enclosure.rb} +12 -16
  405. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +0 -1
  406. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +0 -1
  407. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +13 -38
  408. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +0 -1
  409. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +0 -1
  410. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +0 -1
  411. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +0 -1
  412. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +0 -1
  413. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +0 -1
  414. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +1 -2
  415. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +0 -1
  416. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +26 -0
  417. data/example_files/resources/hpxml-measures/README.md +0 -1
  418. data/example_files/resources/hpxml-measures/Rakefile +1 -2
  419. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +32 -13
  420. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.xml +37 -9
  421. data/example_files/resources/hpxml-measures/SimulationOutputReport/tests/output_report_test.rb +24 -7
  422. data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +1 -1
  423. data/example_files/resources/hpxml-measures/docs/source/intro.rst +1 -0
  424. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +75 -58
  425. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +5 -1
  426. data/example_files/resources/hpxml-measures/tasks.rb +248 -263
  427. data/example_files/resources/hpxml-measures/weather/USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv +10 -10
  428. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +17 -4
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +3 -2
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +3 -2
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +3 -2
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +3 -2
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +3 -2
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +3 -2
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +3 -2
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +3 -2
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +3 -2
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +3 -2
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +3 -2
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +3 -2
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +3 -2
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +3 -2
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +3 -2
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +3 -2
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +3 -2
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +3 -2
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +3 -2
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +3 -2
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +3 -2
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +3 -2
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +0 -18
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +1 -0
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +1 -0
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +0 -18
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +0 -18
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +1 -0
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +0 -18
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +1 -0
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +1 -0
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +3 -2
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +4 -3
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +3 -2
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +6 -4
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +3 -2
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +3 -2
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +3 -2
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +3 -2
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +3 -2
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +3 -2
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +3 -2
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +1 -1
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +1 -1
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +2 -1
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +4 -3
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +3 -2
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +2 -1
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +2 -1
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +2 -1
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +3 -2
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +1 -1
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +1 -1
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +1 -1
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +1 -1
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +1 -1
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +3 -2
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +3 -2
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +3 -2
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +1 -1
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +3 -2
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +1 -1
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +3 -2
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +3 -2
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +3 -2
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +3 -2
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +3 -2
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +3 -2
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +3 -2
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +3 -2
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +3 -2
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +3 -2
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +3 -2
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +3 -2
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +3 -2
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +3 -2
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +3 -2
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +3 -2
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +3 -2
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +3 -2
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +3 -2
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +3 -2
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +3 -2
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +3 -2
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +3 -2
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +3 -2
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +3 -2
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +3 -2
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +3 -2
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +3 -2
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +3 -2
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +3 -2
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +3 -2
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +3 -2
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +3 -2
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +3 -2
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +3 -2
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +3 -2
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +3 -2
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +3 -2
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +3 -2
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +3 -2
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +3 -2
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +3 -2
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +3 -2
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +4 -3
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +3 -2
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +3 -2
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +5 -4
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +5 -4
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +3 -2
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +21 -20
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +21 -20
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +3 -2
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +3 -2
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +3 -2
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +3 -2
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +3 -2
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +3 -2
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +3 -2
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +3 -2
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +3 -2
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +3 -2
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +3 -2
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +3 -2
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +3 -2
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +3 -2
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +3 -2
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +3 -2
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +3 -2
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +2 -1
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +4 -3
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +5 -4
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +5 -4
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +5 -4
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +1 -0
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +1 -0
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-manual-s-oversize-allowances.xml +1 -0
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed.xml +1 -0
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-manual-s-oversize-allowances.xml +1 -0
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed.xml +1 -0
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-manual-s-oversize-allowances.xml +1 -0
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed.xml +1 -0
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +1 -0
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +1 -0
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +1 -0
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +1 -0
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +1 -0
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml +1 -0
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +1 -0
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +1 -0
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +1 -0
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +1 -0
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +1 -0
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +1 -0
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +1 -0
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +1 -0
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +1 -0
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-manual-s-oversize-allowances.xml +1 -0
  588. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump.xml +1 -0
  589. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +1 -0
  590. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +1 -0
  591. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +1 -0
  592. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml +1 -0
  593. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted.xml +1 -0
  594. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +1 -0
  595. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +1 -1
  596. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +1 -1
  597. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +3 -2
  598. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +1 -1
  599. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +1 -1
  600. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +1 -1
  601. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +1 -1
  602. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +2 -1
  603. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +2 -1
  604. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +2 -1
  605. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +6 -5
  606. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +2 -2
  607. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +4 -3
  608. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +4 -3
  609. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +4 -3
  610. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +4 -3
  611. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +4 -3
  612. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +3 -2
  613. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +1 -1
  614. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +3 -2
  615. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +3 -2
  616. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +1 -1
  617. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +1 -1
  618. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +1 -52
  619. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +1 -1
  620. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +2 -1
  621. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +3 -2
  622. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +2 -1
  623. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +3 -2
  624. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +3 -2
  625. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +2 -1
  626. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +3 -2
  627. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +2 -1
  628. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +2 -1
  629. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +2 -1
  630. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +4 -4
  631. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +2 -1
  632. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +3 -2
  633. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +4 -3
  634. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.xml +3 -2
  635. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.xml +5 -4
  636. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.xml +5 -4
  637. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.xml +5 -4
  638. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.xml +3 -2
  639. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.xml +3 -2
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.xml +3 -2
  641. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-only.xml +2 -1
  642. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-ground-to-air-heat-pump.xml +4 -3
  643. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.xml +2 -1
  644. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-mini-split-heat-pump-ducted.xml +5 -4
  645. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-blower-efficiency-furnace-gas-central-ac-1-speed.xml +3 -2
  646. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.xml +3 -2
  647. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.xml +3 -2
  648. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +2 -1
  649. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +1 -1
  650. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +2 -1
  651. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +4 -3
  652. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +5 -4
  653. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +3 -3
  654. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +9 -5
  655. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +1 -52
  656. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +6 -5
  657. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +3 -2
  658. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +1 -1
  659. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +1 -1
  660. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +3 -2
  661. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +1 -1
  662. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +1 -1
  663. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +3 -2
  664. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +3 -2
  665. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +1 -1
  666. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +3 -2
  667. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-detailed.xml +3 -2
  668. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +3 -2
  669. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +3 -2
  670. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +3 -2
  671. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +3 -2
  672. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +3 -2
  673. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +3 -2
  674. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +3 -2
  675. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +3 -2
  676. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +3 -2
  677. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +3 -2
  678. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +3 -2
  679. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +3 -2
  680. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +2 -2
  681. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +3 -2
  682. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +3 -2
  683. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +3 -2
  684. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +3 -2
  685. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +3 -2
  686. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +3 -2
  687. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +3 -2
  688. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +3 -2
  689. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +30 -28
  690. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +3 -2
  691. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +3 -2
  692. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +3 -2
  693. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +4 -3
  694. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +3 -2
  695. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +3 -2
  696. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +3 -2
  697. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +3 -2
  698. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +3 -2
  699. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +3 -2
  700. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +9 -6
  701. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +3 -2
  702. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +3 -2
  703. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +3 -2
  704. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +3 -2
  705. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +3 -2
  706. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +3 -2
  707. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +3 -2
  708. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +3 -2
  709. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +3 -2
  710. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +3 -2
  711. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/boiler-invalid-afue.xml +1 -1
  712. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml +1 -1
  713. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +3 -2
  714. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +3 -2
  715. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +3 -2
  716. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +3 -2
  717. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +3 -2
  718. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +1 -1
  719. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-ef-tank.xml +3 -2
  720. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +3 -2
  721. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +3 -2
  722. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +3 -2
  723. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +3 -2
  724. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +3 -2
  725. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +3 -2
  726. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +3 -2
  727. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +3 -2
  728. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +3 -2
  729. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +3 -2
  730. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +4 -3
  731. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +4 -3
  732. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +3 -2
  733. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml +3 -2
  734. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +3 -2
  735. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +3 -2
  736. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +3 -2
  737. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +3 -2
  738. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +3 -2
  739. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +3 -2
  740. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +3 -2
  741. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +3 -2
  742. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +3 -2
  743. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +3 -2
  744. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-output-greater-than-consumption.xml +4 -3
  745. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +2 -1
  746. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +9 -5
  747. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +9 -5
  748. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml +3 -2
  749. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +3 -3
  750. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +3 -3
  751. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +9 -5
  752. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +3 -2
  753. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml +3 -2
  754. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-shared-negative-seer-eq.xml +407 -0
  755. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +3 -2
  756. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +3 -2
  757. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +3 -2
  758. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +3 -2
  759. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +3 -2
  760. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +3 -2
  761. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +3 -2
  762. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +3 -2
  763. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-surfaces.xml +3 -2
  764. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-foundation-wall-properties.xml +3 -2
  765. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id.xml +5 -4
  766. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +5 -4
  767. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +3 -2
  768. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +3 -2
  769. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +3 -2
  770. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +3 -2
  771. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-conditioned-floors.xml +3 -2
  772. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +3 -2
  773. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +2 -1
  774. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml +1 -1
  775. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +3 -2
  776. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +3 -2
  777. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +3 -2
  778. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +3 -2
  779. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +3 -2
  780. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +3 -2
  781. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +9 -5
  782. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +3 -2
  783. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +3 -2
  784. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +3 -2
  785. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-surface.xml +3 -2
  786. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +3 -2
  787. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +9 -6
  788. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +9 -6
  789. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +4 -3
  790. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +3 -2
  791. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +3 -2
  792. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +2 -1
  793. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +3 -2
  794. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +3 -2
  795. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +3 -2
  796. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +2 -1
  797. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +1 -1
  798. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-appliances-dehumidifier-50percent.xml → invalid_files/solar-fraction-one.xml} +570 -524
  799. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +1 -1
  800. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +2 -1
  801. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +1 -1
  802. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +3 -2
  803. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +3 -2
  804. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +3 -2
  805. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +3 -2
  806. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +3 -2
  807. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +5 -4
  808. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml +3 -2
  809. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +3 -2
  810. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +3 -2
  811. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +3 -2
  812. data/example_files/resources/hpxml-measures/workflow/template.osw +1 -0
  813. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +294 -0
  814. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +27 -0
  815. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +294 -0
  816. data/example_files/resources/hpxml-measures/workflow/tests/compare.rb +130 -0
  817. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +108 -38
  818. data/example_files/visualization/input_visualization_feature.html +15 -16
  819. data/example_files/visualization/input_visualization_scenario.html +16 -11
  820. data/lib/uo_cli/version.rb +1 -1
  821. data/lib/uo_cli.rb +158 -26
  822. data/scripts/setup-env-gitbash.sh +4 -4
  823. data/scripts/setup-env-unix.sh +4 -4
  824. data/scripts/setup-env.bat +3 -3
  825. data/scripts/setup-env.ps1 +3 -3
  826. data/uo_cli.gemspec +10 -7
  827. metadata +80 -24
  828. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.yml +0 -74
  829. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple2.xml +0 -838
@@ -72,6 +72,12 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
72
72
  arg.setDefaultValue(false)
73
73
  args << arg
74
74
 
75
+ arg = OpenStudio::Measure::OSArgument.makeBoolArgument('add_component_loads', false)
76
+ arg.setDisplayName('Add component loads?')
77
+ arg.setDescription('If true, adds the calculation of heating/cooling component loads (not enabled by default for faster performance).')
78
+ arg.setDefaultValue(false)
79
+ args << arg
80
+
75
81
  arg = OpenStudio::Measure::OSArgument.makeBoolArgument('skip_validation', false)
76
82
  arg.setDisplayName('Skip Validation?')
77
83
  arg.setDescription('If true, bypasses HPXML input validation for faster performance. WARNING: This should only be used if the supplied HPXML file has already been validated against the Schema & Schematron documents.')
@@ -102,6 +108,7 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
102
108
  # assign the user inputs to variables
103
109
  hpxml_path = runner.getStringArgumentValue('hpxml_path', user_arguments)
104
110
  output_dir = runner.getStringArgumentValue('output_dir', user_arguments)
111
+ add_component_loads = runner.getBoolArgumentValue('add_component_loads', user_arguments)
105
112
  debug = runner.getBoolArgumentValue('debug', user_arguments)
106
113
  skip_validation = runner.getBoolArgumentValue('skip_validation', user_arguments)
107
114
  building_id = runner.getOptionalStringArgumentValue('building_id', user_arguments)
@@ -146,7 +153,8 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
146
153
  FileUtils.cp(epw_path, epw_output_path)
147
154
  end
148
155
 
149
- OSModel.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir, building_id, debug)
156
+ OSModel.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir,
157
+ add_component_loads, building_id, debug)
150
158
  rescue Exception => e
151
159
  runner.registerError("#{e.message}\n#{e.backtrace.join("\n")}")
152
160
  return false
@@ -195,7 +203,8 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
195
203
  end
196
204
 
197
205
  class OSModel
198
- def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir, building_id, debug)
206
+ def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir,
207
+ add_component_loads, building_id, debug)
199
208
  @hpxml = hpxml
200
209
  @debug = debug
201
210
 
@@ -238,8 +247,8 @@ class OSModel
238
247
  add_conditioned_floor_area(runner, model, spaces)
239
248
  add_thermal_mass(runner, model, spaces)
240
249
  update_conditioned_basement(runner, model, spaces)
241
- set_zone_volumes(runner, model, spaces)
242
- explode_surfaces(runner, model)
250
+ Geometry.set_zone_volumes(runner, model, spaces, @hpxml, @apply_ashrae140_assumptions)
251
+ Geometry.explode_surfaces(runner, model, @hpxml, @walls_top)
243
252
  add_num_occupants(model, runner, spaces)
244
253
 
245
254
  # HVAC
@@ -274,7 +283,7 @@ class OSModel
274
283
 
275
284
  # Output
276
285
 
277
- add_component_loads_output(runner, model, spaces)
286
+ add_loads_output(runner, model, spaces, add_component_loads)
278
287
  add_output_control_files(runner, model)
279
288
  # Uncomment to debug EMS
280
289
  # add_ems_debug_output(runner, model)
@@ -309,7 +318,7 @@ class OSModel
309
318
  @default_azimuths = get_default_azimuths()
310
319
 
311
320
  # Apply defaults to HPXML object
312
- HPXMLDefaults.apply(@hpxml, @eri_version, weather, epw_file)
321
+ HPXMLDefaults.apply(@hpxml, @eri_version, weather, epw_file: epw_file)
313
322
 
314
323
  @frac_windows_operable = @hpxml.fraction_of_windows_operable()
315
324
 
@@ -323,204 +332,18 @@ class OSModel
323
332
  end
324
333
 
325
334
  def self.add_simulation_params(model)
326
- SimControls.apply(model, @hpxml.header)
327
- end
328
-
329
- def self.set_zone_volumes(runner, model, spaces)
330
- # Living space
331
- spaces[HPXML::LocationLivingSpace].thermalZone.get.setVolume(UnitConversions.convert(@hpxml.building_construction.conditioned_building_volume, 'ft^3', 'm^3'))
332
-
333
- # Basement, crawlspace, garage
334
- spaces.keys.each do |space_type|
335
- next unless [HPXML::LocationBasementUnconditioned, HPXML::LocationCrawlspaceUnvented, HPXML::LocationCrawlspaceVented, HPXML::LocationGarage].include? space_type
336
-
337
- floor_area = @hpxml.slabs.select { |s| s.interior_adjacent_to == space_type }.map { |s| s.area }.sum(0.0)
338
- if space_type == HPXML::LocationGarage
339
- height = 8.0
340
- else
341
- height = @hpxml.foundation_walls.select { |w| w.interior_adjacent_to == space_type }.map { |w| w.height }.max
342
- end
343
-
344
- spaces[space_type].thermalZone.get.setVolume(UnitConversions.convert(floor_area * height, 'ft^3', 'm^3'))
345
- end
346
-
347
- # Attic
348
- spaces.keys.each do |space_type|
349
- next unless [HPXML::LocationAtticUnvented, HPXML::LocationAtticVented].include? space_type
350
-
351
- floor_area = @hpxml.frame_floors.select { |f| [f.interior_adjacent_to, f.exterior_adjacent_to].include? space_type }.map { |s| s.area }.sum(0.0)
352
- roofs = @hpxml.roofs.select { |r| r.interior_adjacent_to == space_type }
353
- avg_pitch = roofs.map { |r| r.pitch }.sum(0.0) / roofs.size
354
-
355
- if @apply_ashrae140_assumptions
356
- # Hardcode the attic volume to match ASHRAE 140 Table 7-2 specification
357
- volume = 3463
358
- else
359
- # Assume square hip roof for volume calculations; energy results are very insensitive to actual volume
360
- length = floor_area**0.5
361
- height = 0.5 * Math.sin(Math.atan(avg_pitch / 12.0)) * length
362
- volume = [floor_area * height / 3.0, 0.01].max
363
- end
364
-
365
- spaces[space_type].thermalZone.get.setVolume(UnitConversions.convert(volume, 'ft^3', 'm^3'))
366
- end
367
- end
368
-
369
- def self.explode_surfaces(runner, model)
370
- # Re-position surfaces so as to not shade each other and to make it easier to visualize the building.
371
-
372
- gap_distance = UnitConversions.convert(10.0, 'ft', 'm') # distance between surfaces of the same azimuth
373
- rad90 = UnitConversions.convert(90, 'deg', 'rad')
374
-
375
- # Determine surfaces to shift and distance with which to explode surfaces horizontally outward
376
- surfaces = []
377
- azimuth_lengths = {}
378
- model.getSurfaces.sort.each do |surface|
379
- next unless ['wall', 'roofceiling'].include? surface.surfaceType.downcase
380
- next unless ['outdoors', 'foundation', 'adiabatic'].include? surface.outsideBoundaryCondition.downcase
381
- next if surface.additionalProperties.getFeatureAsDouble('Tilt').get <= 0 # skip flat roofs
382
-
383
- surfaces << surface
384
- azimuth = surface.additionalProperties.getFeatureAsInteger('Azimuth').get
385
- if azimuth_lengths[azimuth].nil?
386
- azimuth_lengths[azimuth] = 0.0
387
- end
388
- azimuth_lengths[azimuth] += surface.additionalProperties.getFeatureAsDouble('Length').get + gap_distance
389
- end
390
- max_azimuth_length = azimuth_lengths.values.max
391
-
392
- # Using the max length for a given azimuth, calculate the apothem (radius of the incircle) of a regular
393
- # n-sided polygon to create the smallest polygon possible without self-shading. The number of polygon
394
- # sides is defined by the minimum difference between two azimuths.
395
- min_azimuth_diff = 360
396
- azimuths_sorted = azimuth_lengths.keys.sort
397
- azimuths_sorted.each_with_index do |az, idx|
398
- diff1 = (az - azimuths_sorted[(idx + 1) % azimuths_sorted.size]).abs
399
- diff2 = 360.0 - diff1 # opposite direction
400
- if diff1 < min_azimuth_diff
401
- min_azimuth_diff = diff1
402
- end
403
- if diff2 < min_azimuth_diff
404
- min_azimuth_diff = diff2
405
- end
406
- end
407
- if min_azimuth_diff > 0
408
- nsides = [(360.0 / min_azimuth_diff).ceil, 4].max # assume rectangle at the minimum
409
- else
410
- nsides = 4
411
- end
412
- explode_distance = max_azimuth_length / (2.0 * Math.tan(UnitConversions.convert(180.0 / nsides, 'deg', 'rad')))
413
-
414
- add_neighbors(runner, model, max_azimuth_length)
415
-
416
- # Initial distance of shifts at 90-degrees to horizontal outward
417
- azimuth_side_shifts = {}
418
- azimuth_lengths.keys.each do |azimuth|
419
- azimuth_side_shifts[azimuth] = max_azimuth_length / 2.0
420
- end
421
-
422
- # Explode neighbors
423
- model.getShadingSurfaceGroups.each do |shading_group|
424
- next unless shading_group.name.to_s == Constants.ObjectNameNeighbors
425
-
426
- shading_group.shadingSurfaces.each do |shading_surface|
427
- azimuth = shading_surface.additionalProperties.getFeatureAsInteger('Azimuth').get
428
- azimuth_rad = UnitConversions.convert(azimuth, 'deg', 'rad')
429
- distance = shading_surface.additionalProperties.getFeatureAsDouble('Distance').get
430
-
431
- unless azimuth_lengths.keys.include? azimuth
432
- fail "A neighbor building has an azimuth (#{azimuth}) not equal to the azimuth of any wall."
433
- end
434
-
435
- # Push out horizontally
436
- distance += explode_distance
437
- transformation = get_surface_transformation(distance, Math::sin(azimuth_rad), Math::cos(azimuth_rad), 0)
438
-
439
- shading_surface.setVertices(transformation * shading_surface.vertices)
440
- end
441
- end
442
-
443
- # Explode walls, windows, doors, roofs, and skylights
444
- surfaces_moved = []
445
-
446
- surfaces.sort.each do |surface|
447
- next if surface.additionalProperties.getFeatureAsDouble('Tilt').get <= 0 # skip flat roofs
448
-
449
- if surface.adjacentSurface.is_initialized
450
- next if surfaces_moved.include? surface.adjacentSurface.get
451
- end
452
-
453
- azimuth = surface.additionalProperties.getFeatureAsInteger('Azimuth').get
454
- azimuth_rad = UnitConversions.convert(azimuth, 'deg', 'rad')
455
-
456
- # Get associated shading surfaces (e.g., overhangs, interior shading surfaces)
457
- overhang_surfaces = []
458
- shading_surfaces = []
459
- surface.subSurfaces.each do |subsurface|
460
- next unless subsurface.subSurfaceType.downcase == 'fixedwindow'
461
-
462
- subsurface.shadingSurfaceGroups.each do |overhang_group|
463
- overhang_group.shadingSurfaces.each do |overhang|
464
- overhang_surfaces << overhang
465
- end
466
- end
467
- end
468
- model.getShadingSurfaceGroups.each do |shading_group|
469
- next unless [Constants.ObjectNameSkylightShade, Constants.ObjectNameWindowShade].include? shading_group.name.to_s
470
-
471
- shading_group.shadingSurfaces.each do |window_shade|
472
- next unless window_shade.additionalProperties.getFeatureAsString('ParentSurface').get == surface.name.to_s
473
-
474
- shading_surfaces << window_shade
475
- end
476
- end
477
-
478
- # Push out horizontally
479
- distance = explode_distance
480
-
481
- if surface.surfaceType.downcase == 'roofceiling'
482
- # Ensure pitched surfaces are positioned outward justified with walls, etc.
483
- tilt = surface.additionalProperties.getFeatureAsDouble('Tilt').get
484
- width = surface.additionalProperties.getFeatureAsDouble('Width').get
485
- distance -= 0.5 * Math.cos(Math.atan(tilt)) * width
486
- end
487
- transformation = get_surface_transformation(distance, Math::sin(azimuth_rad), Math::cos(azimuth_rad), 0)
488
- transformation_shade = get_surface_transformation(distance + 0.001, Math::sin(azimuth_rad), Math::cos(azimuth_rad), 0) # Offset slightly from window
489
-
490
- ([surface] + surface.subSurfaces + overhang_surfaces).each do |s|
491
- s.setVertices(transformation * s.vertices)
492
- end
493
- shading_surfaces.each do |s|
494
- s.setVertices(transformation_shade * s.vertices)
495
- end
496
- if surface.adjacentSurface.is_initialized
497
- surface.adjacentSurface.get.setVertices(transformation * surface.adjacentSurface.get.vertices)
498
- end
499
-
500
- # Shift at 90-degrees to previous transformation, so surfaces don't overlap and shade each other
501
- azimuth_side_shifts[azimuth] -= surface.additionalProperties.getFeatureAsDouble('Length').get / 2.0
502
- transformation_shift = get_surface_transformation(azimuth_side_shifts[azimuth], Math::sin(azimuth_rad + rad90), Math::cos(azimuth_rad + rad90), 0)
503
-
504
- ([surface] + surface.subSurfaces + overhang_surfaces + shading_surfaces).each do |s|
505
- s.setVertices(transformation_shift * s.vertices)
506
- end
507
- if surface.adjacentSurface.is_initialized
508
- surface.adjacentSurface.get.setVertices(transformation_shift * surface.adjacentSurface.get.vertices)
509
- end
510
-
511
- azimuth_side_shifts[azimuth] -= (surface.additionalProperties.getFeatureAsDouble('Length').get / 2.0 + gap_distance)
512
-
513
- surfaces_moved << surface
514
- end
335
+ SimControls.apply(model, @hpxml)
515
336
  end
516
337
 
517
338
  def self.update_conditioned_basement(runner, model, spaces)
518
339
  return if @cond_bsmnt_surfaces.empty?
340
+
519
341
  # Update @cond_bsmnt_surfaces to include subsurfaces
520
342
  new_cond_bsmnt_surfaces = @cond_bsmnt_surfaces.dup
521
343
  @cond_bsmnt_surfaces.each do |cond_bsmnt_surface|
522
344
  next if cond_bsmnt_surface.is_a? OpenStudio::Model::InternalMassDefinition
523
345
  next if cond_bsmnt_surface.subSurfaces.empty?
346
+
524
347
  cond_bsmnt_surface.subSurfaces.each do |ss|
525
348
  new_cond_bsmnt_surfaces << ss
526
349
  end
@@ -538,6 +361,7 @@ class OSModel
538
361
  @cond_bsmnt_surfaces.each do |cond_bsmnt_surface|
539
362
  # skip windows because windows don't have such property to change.
540
363
  next if cond_bsmnt_surface.is_a?(OpenStudio::Model::SubSurface) && (cond_bsmnt_surface.subSurfaceType.downcase == 'fixedwindow')
364
+
541
365
  adj_surface = nil
542
366
  if not cond_bsmnt_surface.is_a? OpenStudio::Model::InternalMassDefinition
543
367
  if not cond_bsmnt_surface.is_a? OpenStudio::Model::SubSurface
@@ -576,6 +400,7 @@ class OSModel
576
400
  innermost_material.setSolarAbsorptance(0.0)
577
401
  innermost_material.setVisibleAbsorptance(0.0)
578
402
  next if adj_surface.nil?
403
+
579
404
  # Create new construction in case of shared construciton.
580
405
  layered_const_adj = OpenStudio::Model::Construction.new(model)
581
406
  layered_const_adj.setName(cond_bsmnt_surface.construction.get.name.get + ' Reversed Bsmnt')
@@ -717,163 +542,26 @@ class OSModel
717
542
  return vf_map
718
543
  end
719
544
 
720
- # FUTURE: Move this method and many below to geometry.rb
721
- def self.create_space_and_zone(model, spaces, space_type)
722
- if not spaces.keys.include? space_type
723
- thermal_zone = OpenStudio::Model::ThermalZone.new(model)
724
- thermal_zone.setName(space_type)
725
-
726
- space = OpenStudio::Model::Space.new(model)
727
- space.setName(space_type)
728
-
729
- st = OpenStudio::Model::SpaceType.new(model)
730
- st.setStandardsSpaceType(space_type)
731
- space.setSpaceType(st)
732
-
733
- space.setThermalZone(thermal_zone)
734
- spaces[space_type] = space
735
- end
736
- end
737
-
738
- def self.get_surface_transformation(offset, x, y, z)
739
- x = UnitConversions.convert(x, 'ft', 'm')
740
- y = UnitConversions.convert(y, 'ft', 'm')
741
- z = UnitConversions.convert(z, 'ft', 'm')
742
-
743
- m = OpenStudio::Matrix.new(4, 4, 0)
744
- m[0, 0] = 1
745
- m[1, 1] = 1
746
- m[2, 2] = 1
747
- m[3, 3] = 1
748
- m[0, 3] = x * offset
749
- m[1, 3] = y * offset
750
- m[2, 3] = z.abs * offset
751
-
752
- return OpenStudio::Transformation.new(m)
753
- end
754
-
755
- def self.add_floor_polygon(x, y, z)
756
- x = UnitConversions.convert(x, 'ft', 'm')
757
- y = UnitConversions.convert(y, 'ft', 'm')
758
- z = UnitConversions.convert(z, 'ft', 'm')
759
-
760
- vertices = OpenStudio::Point3dVector.new
761
- vertices << OpenStudio::Point3d.new(0 - x / 2, 0 - y / 2, z)
762
- vertices << OpenStudio::Point3d.new(0 - x / 2, y / 2, z)
763
- vertices << OpenStudio::Point3d.new(x / 2, y / 2, z)
764
- vertices << OpenStudio::Point3d.new(x / 2, 0 - y / 2, z)
765
-
766
- # Rotate about the z axis
767
- # This is not strictly needed, but will make the floor edges
768
- # parallel to the walls for a better geometry rendering.
769
- azimuth_rad = UnitConversions.convert(@default_azimuths[0], 'deg', 'rad')
770
- m = OpenStudio::Matrix.new(4, 4, 0)
771
- m[0, 0] = Math::cos(-azimuth_rad)
772
- m[1, 1] = Math::cos(-azimuth_rad)
773
- m[0, 1] = -Math::sin(-azimuth_rad)
774
- m[1, 0] = Math::sin(-azimuth_rad)
775
- m[2, 2] = 1
776
- m[3, 3] = 1
777
- transformation = OpenStudio::Transformation.new(m)
778
-
779
- return transformation * vertices
780
- end
781
-
782
- def self.add_wall_polygon(x, y, z, azimuth, offsets = [0] * 4, subsurface_area = 0)
783
- x = UnitConversions.convert(x, 'ft', 'm')
784
- y = UnitConversions.convert(y, 'ft', 'm')
785
- z = UnitConversions.convert(z, 'ft', 'm')
786
-
787
- vertices = OpenStudio::Point3dVector.new
788
- vertices << OpenStudio::Point3d.new(0 - (x / 2) - offsets[1], 0, z - offsets[0])
789
- vertices << OpenStudio::Point3d.new(0 - (x / 2) - offsets[1], 0, z + y + offsets[2])
790
- if subsurface_area > 0
791
- subsurface_area = UnitConversions.convert(subsurface_area, 'ft^2', 'm^2')
792
- sub_length = x / 10.0
793
- sub_height = subsurface_area / sub_length
794
- if sub_height >= y
795
- sub_height = y - 0.1
796
- sub_length = subsurface_area / sub_height
797
- end
798
- vertices << OpenStudio::Point3d.new(x - (x / 2) + offsets[3] - sub_length, 0, z + y + offsets[2])
799
- vertices << OpenStudio::Point3d.new(x - (x / 2) + offsets[3] - sub_length, 0, z + y + offsets[2] - sub_height)
800
- vertices << OpenStudio::Point3d.new(x - (x / 2) + offsets[3], 0, z + y + offsets[2] - sub_height)
801
- else
802
- vertices << OpenStudio::Point3d.new(x - (x / 2) + offsets[3], 0, z + y + offsets[2])
803
- end
804
- vertices << OpenStudio::Point3d.new(x - (x / 2) + offsets[3], 0, z - offsets[0])
805
-
806
- # Rotate about the z axis
807
- azimuth_rad = UnitConversions.convert(azimuth, 'deg', 'rad')
808
- m = OpenStudio::Matrix.new(4, 4, 0)
809
- m[0, 0] = Math::cos(-azimuth_rad)
810
- m[1, 1] = Math::cos(-azimuth_rad)
811
- m[0, 1] = -Math::sin(-azimuth_rad)
812
- m[1, 0] = Math::sin(-azimuth_rad)
813
- m[2, 2] = 1
814
- m[3, 3] = 1
815
- transformation = OpenStudio::Transformation.new(m)
816
-
817
- return transformation * vertices
818
- end
819
-
820
- def self.add_roof_polygon(x, y, z, azimuth, tilt)
821
- x = UnitConversions.convert(x, 'ft', 'm')
822
- y = UnitConversions.convert(y, 'ft', 'm')
823
- z = UnitConversions.convert(z, 'ft', 'm')
824
-
825
- vertices = OpenStudio::Point3dVector.new
826
- vertices << OpenStudio::Point3d.new(x / 2, -y / 2, 0)
827
- vertices << OpenStudio::Point3d.new(x / 2, y / 2, 0)
828
- vertices << OpenStudio::Point3d.new(-x / 2, y / 2, 0)
829
- vertices << OpenStudio::Point3d.new(-x / 2, -y / 2, 0)
830
-
831
- # Rotate about the x axis
832
- m = OpenStudio::Matrix.new(4, 4, 0)
833
- m[0, 0] = 1
834
- m[1, 1] = Math::cos(Math::atan(tilt))
835
- m[1, 2] = -Math::sin(Math::atan(tilt))
836
- m[2, 1] = Math::sin(Math::atan(tilt))
837
- m[2, 2] = Math::cos(Math::atan(tilt))
838
- m[3, 3] = 1
839
- transformation = OpenStudio::Transformation.new(m)
840
- vertices = transformation * vertices
841
-
842
- # Rotate about the z axis
843
- azimuth_rad = UnitConversions.convert(azimuth, 'deg', 'rad')
844
- rad180 = UnitConversions.convert(180, 'deg', 'rad')
845
- m = OpenStudio::Matrix.new(4, 4, 0)
846
- m[0, 0] = Math::cos(rad180 - azimuth_rad)
847
- m[1, 1] = Math::cos(rad180 - azimuth_rad)
848
- m[0, 1] = -Math::sin(rad180 - azimuth_rad)
849
- m[1, 0] = Math::sin(rad180 - azimuth_rad)
850
- m[2, 2] = 1
851
- m[3, 3] = 1
852
- transformation = OpenStudio::Transformation.new(m)
853
- vertices = transformation * vertices
854
-
855
- # Shift up by z
856
- new_vertices = OpenStudio::Point3dVector.new
857
- vertices.each do |vertex|
858
- new_vertices << OpenStudio::Point3d.new(vertex.x, vertex.y, vertex.z + z)
859
- end
860
-
861
- return new_vertices
862
- end
863
-
864
- def self.add_ceiling_polygon(x, y, z)
865
- return OpenStudio::reverse(add_floor_polygon(x, y, z))
866
- end
867
-
868
545
  def self.add_num_occupants(model, runner, spaces)
869
546
  # Occupants
870
547
  num_occ = @hpxml.building_occupancy.number_of_residents
871
548
  return if num_occ <= 0
872
549
 
873
- Geometry.process_occupants(model, num_occ, @cfa, spaces[HPXML::LocationLivingSpace], @schedules_file)
550
+ Geometry.apply_occupants(model, num_occ, @cfa, spaces[HPXML::LocationLivingSpace], @schedules_file)
874
551
  end
875
552
 
876
553
  def self.get_default_azimuths()
554
+ def self.sanitize_azimuth(azimuth)
555
+ # Ensure 0 <= orientation < 360
556
+ while azimuth < 0
557
+ azimuth += 360
558
+ end
559
+ while azimuth >= 360
560
+ azimuth -= 360
561
+ end
562
+ return azimuth
563
+ end
564
+
877
565
  # Returns a list of four azimuths (facing each direction). Determined based
878
566
  # on the primary azimuth, as defined by the azimuth with the largest surface
879
567
  # area, plus azimuths that are offset by 90/180/270 degrees. Used for
@@ -898,20 +586,9 @@ class OSModel
898
586
  sanitize_azimuth(primary_azimuth + 270)].sort
899
587
  end
900
588
 
901
- def self.sanitize_azimuth(azimuth)
902
- # Ensure 0 <= orientation < 360
903
- while azimuth < 0
904
- azimuth += 360
905
- end
906
- while azimuth >= 360
907
- azimuth -= 360
908
- end
909
- return azimuth
910
- end
911
-
912
589
  def self.create_or_get_space(model, spaces, spacetype)
913
590
  if spaces[spacetype].nil?
914
- create_space_and_zone(model, spaces, spacetype)
591
+ Geometry.create_space_and_zone(model, spaces, spacetype)
915
592
  end
916
593
  return spaces[spacetype]
917
594
  end
@@ -938,7 +615,8 @@ class OSModel
938
615
  tilt = roof.pitch / 12.0
939
616
  z_origin = @walls_top + 0.5 * Math.sin(Math.atan(tilt)) * width
940
617
 
941
- surface = OpenStudio::Model::Surface.new(add_roof_polygon(length, width, z_origin, azimuth, tilt), model)
618
+ vertices = Geometry.create_roof_vertices(length, width, z_origin, azimuth, tilt)
619
+ surface = OpenStudio::Model::Surface.new(vertices, model)
942
620
  surfaces << surface
943
621
  surface.additionalProperties.setFeature('Length', length)
944
622
  surface.additionalProperties.setFeature('Width', width)
@@ -1040,7 +718,8 @@ class OSModel
1040
718
  length = (wall.net_area / height) / azimuths.size
1041
719
  z_origin = @foundation_top
1042
720
 
1043
- surface = OpenStudio::Model::Surface.new(add_wall_polygon(length, height, z_origin, azimuth), model)
721
+ vertices = Geometry.create_wall_vertices(length, height, z_origin, azimuth)
722
+ surface = OpenStudio::Model::Surface.new(vertices, model)
1044
723
  surfaces << surface
1045
724
  surface.additionalProperties.setFeature('Length', length)
1046
725
  surface.additionalProperties.setFeature('Azimuth', azimuth)
@@ -1108,7 +787,8 @@ class OSModel
1108
787
  length = (rim_joist.area / height) / azimuths.size
1109
788
  z_origin = @foundation_top
1110
789
 
1111
- surface = OpenStudio::Model::Surface.new(add_wall_polygon(length, height, z_origin, azimuth), model)
790
+ vertices = Geometry.create_wall_vertices(length, height, z_origin, azimuth)
791
+ surface = OpenStudio::Model::Surface.new(vertices, model)
1112
792
  surfaces << surface
1113
793
  surface.additionalProperties.setFeature('Length', length)
1114
794
  surface.additionalProperties.setFeature('Azimuth', azimuth)
@@ -1176,10 +856,12 @@ class OSModel
1176
856
  end
1177
857
 
1178
858
  if frame_floor.is_ceiling
1179
- surface = OpenStudio::Model::Surface.new(add_ceiling_polygon(length, width, z_origin), model)
859
+ vertices = Geometry.create_ceiling_vertices(length, width, z_origin, @default_azimuths)
860
+ surface = OpenStudio::Model::Surface.new(vertices, model)
1180
861
  surface.additionalProperties.setFeature('SurfaceType', 'Ceiling')
1181
862
  else
1182
- surface = OpenStudio::Model::Surface.new(add_floor_polygon(length, width, z_origin), model)
863
+ vertices = Geometry.create_floor_vertices(length, width, z_origin, @default_azimuths)
864
+ surface = OpenStudio::Model::Surface.new(vertices, model)
1183
865
  surface.additionalProperties.setFeature('SurfaceType', 'Floor')
1184
866
  end
1185
867
  surface.additionalProperties.setFeature('Tilt', 0.0)
@@ -1371,7 +1053,8 @@ class OSModel
1371
1053
  azimuth = foundation_wall.azimuth
1372
1054
  end
1373
1055
 
1374
- surface = OpenStudio::Model::Surface.new(add_wall_polygon(length, ag_height, z_origin, azimuth), model)
1056
+ vertices = Geometry.create_wall_vertices(length, ag_height, z_origin, azimuth)
1057
+ surface = OpenStudio::Model::Surface.new(vertices, model)
1375
1058
  surface.additionalProperties.setFeature('Length', length)
1376
1059
  surface.additionalProperties.setFeature('Azimuth', azimuth)
1377
1060
  surface.additionalProperties.setFeature('Tilt', 90.0)
@@ -1436,7 +1119,8 @@ class OSModel
1436
1119
  subsurface_area = 0
1437
1120
  end
1438
1121
 
1439
- surface = OpenStudio::Model::Surface.new(add_wall_polygon(length, height, z_origin, azimuth, [0] * 4, subsurface_area), model)
1122
+ vertices = Geometry.create_wall_vertices(length, height, z_origin, azimuth, subsurface_area: subsurface_area)
1123
+ surface = OpenStudio::Model::Surface.new(vertices, model)
1440
1124
  surface.additionalProperties.setFeature('Length', length)
1441
1125
  surface.additionalProperties.setFeature('Azimuth', azimuth)
1442
1126
  surface.additionalProperties.setFeature('Tilt', 90.0)
@@ -1505,7 +1189,8 @@ class OSModel
1505
1189
  slab_length = slab_tot_perim / 4.0 + Math.sqrt(sqrt_term) / 4.0
1506
1190
  slab_width = slab_tot_perim / 4.0 - Math.sqrt(sqrt_term) / 4.0
1507
1191
 
1508
- surface = OpenStudio::Model::Surface.new(add_floor_polygon(slab_length, slab_width, z_origin), model)
1192
+ vertices = Geometry.create_floor_vertices(slab_length, slab_width, z_origin, @default_azimuths)
1193
+ surface = OpenStudio::Model::Surface.new(vertices, model)
1509
1194
  surface.setName(slab.id)
1510
1195
  surface.setSurfaceType('Floor')
1511
1196
  surface.setOutsideBoundaryCondition('Foundation')
@@ -1580,7 +1265,8 @@ class OSModel
1580
1265
  z_origin = @foundation_top + 8.0 * (@ncfl_ag - 1)
1581
1266
 
1582
1267
  # Add floor surface
1583
- floor_surface = OpenStudio::Model::Surface.new(add_floor_polygon(-floor_width, -floor_length, z_origin), model)
1268
+ vertices = Geometry.create_floor_vertices(floor_length, floor_width, z_origin, @default_azimuths)
1269
+ floor_surface = OpenStudio::Model::Surface.new(vertices, model)
1584
1270
 
1585
1271
  floor_surface.setSunExposure('NoSun')
1586
1272
  floor_surface.setWindExposure('NoWind')
@@ -1592,7 +1278,8 @@ class OSModel
1592
1278
  floor_surface.additionalProperties.setFeature('Tilt', 0.0)
1593
1279
 
1594
1280
  # Add ceiling surface
1595
- ceiling_surface = OpenStudio::Model::Surface.new(add_ceiling_polygon(-floor_width, -floor_length, z_origin), model)
1281
+ vertices = Geometry.create_ceiling_vertices(floor_length, floor_width, z_origin, @default_azimuths)
1282
+ ceiling_surface = OpenStudio::Model::Surface.new(vertices, model)
1596
1283
 
1597
1284
  ceiling_surface.setSunExposure('NoSun')
1598
1285
  ceiling_surface.setWindExposure('NoWind')
@@ -1637,27 +1324,6 @@ class OSModel
1637
1324
  end
1638
1325
 
1639
1326
  def self.add_neighbors(runner, model, length)
1640
- z_origin = 0 # shading surface always starts at grade
1641
-
1642
- shading_surfaces = []
1643
- @hpxml.neighbor_buildings.each do |neighbor_building|
1644
- height = neighbor_building.height.nil? ? @walls_top : neighbor_building.height
1645
-
1646
- shading_surface = OpenStudio::Model::ShadingSurface.new(add_wall_polygon(length, height, z_origin, neighbor_building.azimuth), model)
1647
- shading_surface.additionalProperties.setFeature('Azimuth', neighbor_building.azimuth)
1648
- shading_surface.additionalProperties.setFeature('Distance', neighbor_building.distance)
1649
- shading_surface.setName("Neighbor azimuth #{neighbor_building.azimuth} distance #{neighbor_building.distance}")
1650
-
1651
- shading_surfaces << shading_surface
1652
- end
1653
-
1654
- unless shading_surfaces.empty?
1655
- shading_surface_group = OpenStudio::Model::ShadingSurfaceGroup.new(model)
1656
- shading_surface_group.setName(Constants.ObjectNameNeighbors)
1657
- shading_surfaces.each do |shading_surface|
1658
- shading_surface.setShadingSurfaceGroup(shading_surface_group)
1659
- end
1660
- end
1661
1327
  end
1662
1328
 
1663
1329
  def self.add_shading_schedule(runner, model, weather)
@@ -1682,9 +1348,10 @@ class OSModel
1682
1348
 
1683
1349
  shading_group = nil
1684
1350
  shading_schedules = {}
1351
+ shading_ems = { sensors: {}, program: nil }
1685
1352
 
1686
1353
  surfaces = []
1687
- @hpxml.windows.each do |window|
1354
+ @hpxml.windows.each_with_index do |window, i|
1688
1355
  window_height = 4.0 # ft, default
1689
1356
 
1690
1357
  overhang_depth = nil
@@ -1695,16 +1362,16 @@ class OSModel
1695
1362
  window_height = overhang_distance_to_bottom - overhang_distance_to_top
1696
1363
  end
1697
1364
 
1698
- window_width = window.area / window_height
1365
+ window_length = window.area / window_height
1699
1366
  z_origin = @foundation_top
1700
1367
 
1701
1368
  if window.is_exterior
1702
1369
 
1703
1370
  # Create parent surface slightly bigger than window
1704
- surface = OpenStudio::Model::Surface.new(add_wall_polygon(window_width, window_height, z_origin,
1705
- window.azimuth, [0, 0.001, 0.001, 0.001]), model)
1371
+ vertices = Geometry.create_wall_vertices(window_length, window_height, z_origin, window.azimuth, add_buffer: true)
1372
+ surface = OpenStudio::Model::Surface.new(vertices, model)
1706
1373
 
1707
- surface.additionalProperties.setFeature('Length', window_width)
1374
+ surface.additionalProperties.setFeature('Length', window_length)
1708
1375
  surface.additionalProperties.setFeature('Azimuth', window.azimuth)
1709
1376
  surface.additionalProperties.setFeature('Tilt', 90.0)
1710
1377
  surface.additionalProperties.setFeature('SurfaceType', 'Window')
@@ -1712,8 +1379,8 @@ class OSModel
1712
1379
  surface.setSurfaceType('Wall')
1713
1380
  set_surface_interior(model, spaces, surface, window.wall)
1714
1381
 
1715
- sub_surface = OpenStudio::Model::SubSurface.new(add_wall_polygon(window_width, window_height, z_origin,
1716
- window.azimuth, [-0.001, 0, 0.001, 0]), model)
1382
+ vertices = Geometry.create_wall_vertices(window_length, window_height, z_origin, window.azimuth)
1383
+ sub_surface = OpenStudio::Model::SubSurface.new(vertices, model)
1717
1384
  sub_surface.setName(window.id)
1718
1385
  sub_surface.setSurface(surface)
1719
1386
  sub_surface.setSubSurfaceType('FixedWindow')
@@ -1730,18 +1397,19 @@ class OSModel
1730
1397
  Constructions.apply_window(runner, model, sub_surface, 'WindowConstruction', window.ufactor, window.shgc)
1731
1398
 
1732
1399
  # Apply interior/exterior shading (as needed)
1733
- shading_polygon = add_wall_polygon(window_width, window_height, z_origin, window.azimuth, [0, 0, 0, 0])
1734
- shading_group = apply_shading(model, window, shading_polygon, surface, sub_surface, shading_group, shading_schedules, Constants.ObjectNameWindowShade)
1400
+ shading_vertices = Geometry.create_wall_vertices(window_length, window_height, z_origin, window.azimuth)
1401
+ shading_group = Constructions.apply_window_skylight_shading(model, window, i, shading_vertices, surface, sub_surface, shading_group,
1402
+ shading_schedules, shading_ems, Constants.ObjectNameWindowShade, @cooling_season)
1735
1403
  else
1736
1404
  # Window is on an interior surface, which E+ does not allow. Model
1737
1405
  # as a door instead so that we can get the appropriate conduction
1738
1406
  # heat transfer; there is no solar gains anyway.
1739
1407
 
1740
1408
  # Create parent surface slightly bigger than window
1741
- surface = OpenStudio::Model::Surface.new(add_wall_polygon(window_width, window_height, z_origin,
1742
- window.azimuth, [0, 0.001, 0.001, 0.001]), model)
1409
+ vertices = Geometry.create_wall_vertices(window_length, window_height, z_origin, window.azimuth, add_buffer: true)
1410
+ surface = OpenStudio::Model::Surface.new(vertices, model)
1743
1411
 
1744
- surface.additionalProperties.setFeature('Length', window_width)
1412
+ surface.additionalProperties.setFeature('Length', window_length)
1745
1413
  surface.additionalProperties.setFeature('Azimuth', window.azimuth)
1746
1414
  surface.additionalProperties.setFeature('Tilt', 90.0)
1747
1415
  surface.additionalProperties.setFeature('SurfaceType', 'Door')
@@ -1749,8 +1417,8 @@ class OSModel
1749
1417
  surface.setSurfaceType('Wall')
1750
1418
  set_surface_interior(model, spaces, surface, window.wall)
1751
1419
 
1752
- sub_surface = OpenStudio::Model::SubSurface.new(add_wall_polygon(window_width, window_height, z_origin,
1753
- window.azimuth, [0, 0, 0, 0]), model)
1420
+ vertices = Geometry.create_wall_vertices(window_length, window_height, z_origin, window.azimuth)
1421
+ sub_surface = OpenStudio::Model::SubSurface.new(vertices, model)
1754
1422
  sub_surface.setName(window.id)
1755
1423
  sub_surface.setSurface(surface)
1756
1424
  sub_surface.setSubSurfaceType('Door')
@@ -1773,17 +1441,17 @@ class OSModel
1773
1441
 
1774
1442
  shading_group = nil
1775
1443
  shading_schedules = {}
1444
+ shading_ems = { sensors: {}, program: nil }
1776
1445
 
1777
- @hpxml.skylights.each do |skylight|
1446
+ @hpxml.skylights.each_with_index do |skylight, i|
1778
1447
  tilt = skylight.roof.pitch / 12.0
1779
1448
  width = Math::sqrt(skylight.area)
1780
1449
  length = skylight.area / width
1781
1450
  z_origin = @walls_top + 0.5 * Math.sin(Math.atan(tilt)) * width
1782
1451
 
1783
1452
  # Create parent surface slightly bigger than skylight
1784
- surface = OpenStudio::Model::Surface.new(add_roof_polygon(length + 0.001, width + 0.001, z_origin,
1785
- skylight.azimuth, tilt), model)
1786
-
1453
+ vertices = Geometry.create_roof_vertices(length, width, z_origin, skylight.azimuth, tilt, add_buffer: true)
1454
+ surface = OpenStudio::Model::Surface.new(vertices, model)
1787
1455
  surface.additionalProperties.setFeature('Length', length)
1788
1456
  surface.additionalProperties.setFeature('Width', width)
1789
1457
  surface.additionalProperties.setFeature('Azimuth', skylight.azimuth)
@@ -1795,8 +1463,8 @@ class OSModel
1795
1463
  surface.setOutsideBoundaryCondition('Outdoors') # cannot be adiabatic because subsurfaces won't be created
1796
1464
  surfaces << surface
1797
1465
 
1798
- sub_surface = OpenStudio::Model::SubSurface.new(add_roof_polygon(length, width, z_origin,
1799
- skylight.azimuth, tilt), model)
1466
+ vertices = Geometry.create_roof_vertices(length, width, z_origin, skylight.azimuth, tilt)
1467
+ sub_surface = OpenStudio::Model::SubSurface.new(vertices, model)
1800
1468
  sub_surface.setName(skylight.id)
1801
1469
  sub_surface.setSurface(surface)
1802
1470
  sub_surface.setSubSurfaceType('Skylight')
@@ -1805,62 +1473,26 @@ class OSModel
1805
1473
  Constructions.apply_skylight(runner, model, sub_surface, 'SkylightConstruction', skylight.ufactor, skylight.shgc)
1806
1474
 
1807
1475
  # Apply interior/exterior shading (as needed)
1808
- shading_polygon = add_roof_polygon(length, width, z_origin, skylight.azimuth, tilt)
1809
- shading_group = apply_shading(model, skylight, shading_polygon, surface, sub_surface, shading_group, shading_schedules, Constants.ObjectNameSkylightShade)
1476
+ shading_vertices = Geometry.create_roof_vertices(length, width, z_origin, skylight.azimuth, tilt)
1477
+ shading_group = Constructions.apply_window_skylight_shading(model, skylight, i, shading_vertices, surface, sub_surface, shading_group,
1478
+ shading_schedules, shading_ems, Constants.ObjectNameSkylightShade, @cooling_season)
1810
1479
  end
1811
1480
 
1812
1481
  apply_adiabatic_construction(runner, model, surfaces, 'roof')
1813
1482
  end
1814
1483
 
1815
- def self.apply_shading(model, window_or_skylight, shading_polygon, parent_surface, sub_surface, shading_group, shading_schedules, name)
1816
- sf_summer = window_or_skylight.interior_shading_factor_summer * window_or_skylight.exterior_shading_factor_summer
1817
- sf_winter = window_or_skylight.interior_shading_factor_winter * window_or_skylight.exterior_shading_factor_winter
1818
- if (sf_summer < 1.0) || (sf_winter < 1.0)
1819
- # Apply shading
1820
- # We use a ShadingSurface instead of a Shade so that we perfectly get the result we want.
1821
- # The latter object is complex and it is essentially impossible to achieve the target reduction in transmitted
1822
- # solar (due to, e.g., re-reflectance, absorptance, angle modifiers, effects on convection, etc.).
1823
-
1824
- # Shading surface is used to reduce beam solar and sky diffuse solar
1825
- shading_surface = OpenStudio::Model::ShadingSurface.new(shading_polygon, model)
1826
- shading_surface.setName("#{window_or_skylight.id} shading surface")
1827
- shading_surface.additionalProperties.setFeature('Azimuth', window_or_skylight.azimuth)
1828
- shading_surface.additionalProperties.setFeature('ParentSurface', parent_surface.name.to_s)
1829
-
1830
- # Create transmittance schedule for heating/cooling seasons
1831
- trans_values = @cooling_season.map { |c| c == 1 ? sf_summer : sf_winter }
1832
- if shading_schedules[trans_values].nil?
1833
- trans_sch = MonthWeekdayWeekendSchedule.new(model, "trans schedule winter=#{sf_winter} summer=#{sf_summer}", Array.new(24, 1), Array.new(24, 1), trans_values, Constants.ScheduleTypeLimitsFraction, false)
1834
- shading_schedules[trans_values] = trans_sch
1835
- end
1836
- shading_surface.setTransmittanceSchedule(shading_schedules[trans_values].schedule)
1837
-
1838
- # Adjustment to default view factor is used to reduce ground diffuse solar
1839
- avg_trans_value = trans_values.sum(0.0) / 12.0 # FUTURE: Create EnergyPlus actuator to adjust this
1840
- default_vf_to_ground = ((1.0 - Math::cos(parent_surface.tilt)) / 2.0).round(2)
1841
- sub_surface.setViewFactortoGround(default_vf_to_ground * avg_trans_value)
1842
-
1843
- if shading_group.nil?
1844
- shading_group = OpenStudio::Model::ShadingSurfaceGroup.new(model)
1845
- shading_group.setName(name)
1846
- end
1847
- shading_surface.setShadingSurfaceGroup(shading_group)
1848
- end
1849
- return shading_group
1850
- end
1851
-
1852
1484
  def self.add_doors(runner, model, spaces)
1853
1485
  surfaces = []
1854
1486
  @hpxml.doors.each do |door|
1855
1487
  door_height = 6.67 # ft
1856
- door_width = door.area / door_height
1488
+ door_length = door.area / door_height
1857
1489
  z_origin = @foundation_top
1858
1490
 
1859
1491
  # Create parent surface slightly bigger than door
1860
- surface = OpenStudio::Model::Surface.new(add_wall_polygon(door_width, door_height, z_origin,
1861
- door.azimuth, [0, 0.001, 0.001, 0.001]), model)
1492
+ vertices = Geometry.create_wall_vertices(door_length, door_height, z_origin, door.azimuth, add_buffer: true)
1493
+ surface = OpenStudio::Model::Surface.new(vertices, model)
1862
1494
 
1863
- surface.additionalProperties.setFeature('Length', door_width)
1495
+ surface.additionalProperties.setFeature('Length', door_length)
1864
1496
  surface.additionalProperties.setFeature('Azimuth', door.azimuth)
1865
1497
  surface.additionalProperties.setFeature('Tilt', 90.0)
1866
1498
  surface.additionalProperties.setFeature('SurfaceType', 'Door')
@@ -1868,8 +1500,8 @@ class OSModel
1868
1500
  surface.setSurfaceType('Wall')
1869
1501
  set_surface_interior(model, spaces, surface, door.wall)
1870
1502
 
1871
- sub_surface = OpenStudio::Model::SubSurface.new(add_wall_polygon(door_width, door_height, z_origin,
1872
- door.azimuth, [0, 0, 0, 0]), model)
1503
+ vertices = Geometry.create_wall_vertices(door_length, door_height, z_origin, door.azimuth)
1504
+ sub_surface = OpenStudio::Model::SubSurface.new(vertices, model)
1873
1505
  sub_surface.setName(door.id)
1874
1506
  sub_surface.setSurface(surface)
1875
1507
  sub_surface.setSubSurfaceType('Door')
@@ -2458,31 +2090,71 @@ class OSModel
2458
2090
  return map_str.to_s
2459
2091
  end
2460
2092
 
2461
- def self.add_component_loads_output(runner, model, spaces)
2093
+ def self.add_loads_output(runner, model, spaces, add_component_loads)
2462
2094
  living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
2463
2095
 
2464
- # Prevent certain objects (e.g., OtherEquipment) from being counted towards both, e.g., ducts and internal gains
2465
- objects_already_processed = []
2096
+ liv_load_sensors, intgain_dehumidifier = add_total_loads_output(runner, model, living_zone)
2097
+ return unless add_component_loads
2466
2098
 
2467
- # EMS Sensors: Global
2099
+ add_component_loads_output(runner, model, living_zone, liv_load_sensors, intgain_dehumidifier)
2100
+ end
2468
2101
 
2102
+ def self.add_total_loads_output(runner, model, living_zone)
2469
2103
  liv_load_sensors = {}
2470
-
2471
2104
  liv_load_sensors[:htg] = OpenStudio::Model::EnergyManagementSystemSensor.new(model, "Heating:EnergyTransfer:Zone:#{living_zone.name.to_s.upcase}")
2472
2105
  liv_load_sensors[:htg].setName('htg_load_liv')
2473
-
2474
2106
  liv_load_sensors[:clg] = OpenStudio::Model::EnergyManagementSystemSensor.new(model, "Cooling:EnergyTransfer:Zone:#{living_zone.name.to_s.upcase}")
2475
2107
  liv_load_sensors[:clg].setName('clg_load_liv')
2476
2108
 
2477
2109
  tot_load_sensors = {}
2478
-
2479
2110
  tot_load_sensors[:htg] = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Heating:EnergyTransfer')
2480
2111
  tot_load_sensors[:htg].setName('htg_load_tot')
2481
-
2482
2112
  tot_load_sensors[:clg] = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Cooling:EnergyTransfer')
2483
2113
  tot_load_sensors[:clg].setName('clg_load_tot')
2484
2114
 
2485
- load_adj_sensors = {} # Sensors used to adjust E+ EnergyTransfer meter, eg. dehumidifier as load in our program, but included in Heating:EnergyTransfer as HVAC equipment
2115
+ # Need to adjusted E+ EnergyTransfer meters for dehumidifiers
2116
+ intgain_dehumidifier = nil
2117
+ model.getZoneHVACDehumidifierDXs.each do |e|
2118
+ next unless e.thermalZone.get.name.to_s == living_zone.name.to_s
2119
+
2120
+ { 'Zone Dehumidifier Sensible Heating Energy' => 'ig_dehumidifier' }.each do |var, name|
2121
+ intgain_dehumidifier = OpenStudio::Model::EnergyManagementSystemSensor.new(model, var)
2122
+ intgain_dehumidifier.setName(name)
2123
+ intgain_dehumidifier.setKeyName(e.name.to_s)
2124
+ end
2125
+ end
2126
+
2127
+ # EMS program
2128
+ program = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
2129
+ program.setName(Constants.ObjectNameTotalLoadsProgram)
2130
+ program.addLine('Set loads_htg_tot = 0')
2131
+ program.addLine('Set loads_clg_tot = 0')
2132
+ program.addLine("If #{liv_load_sensors[:htg].name} > 0")
2133
+ s = " Set loads_htg_tot = #{tot_load_sensors[:htg].name} - #{tot_load_sensors[:clg].name}"
2134
+ if not intgain_dehumidifier.nil?
2135
+ s += " - #{intgain_dehumidifier.name}"
2136
+ end
2137
+ program.addLine(s)
2138
+ program.addLine("ElseIf #{liv_load_sensors[:clg].name} > 0")
2139
+ s = " Set loads_clg_tot = #{tot_load_sensors[:clg].name} - #{tot_load_sensors[:htg].name}"
2140
+ if not intgain_dehumidifier.nil?
2141
+ s += " + #{intgain_dehumidifier.name}"
2142
+ end
2143
+ program.addLine(s)
2144
+ program.addLine('EndIf')
2145
+
2146
+ # EMS calling manager
2147
+ program_calling_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
2148
+ program_calling_manager.setName("#{program.name} calling manager")
2149
+ program_calling_manager.setCallingPoint('EndOfZoneTimestepAfterZoneReporting')
2150
+ program_calling_manager.addProgram(program)
2151
+
2152
+ return liv_load_sensors, intgain_dehumidifier
2153
+ end
2154
+
2155
+ def self.add_component_loads_output(runner, model, living_zone, liv_load_sensors, intgain_dehumidifier)
2156
+ # Prevent certain objects (e.g., OtherEquipment) from being counted towards both, e.g., ducts and internal gains
2157
+ objects_already_processed = []
2486
2158
 
2487
2159
  # EMS Sensors: Surfaces, SubSurfaces, InternalMass
2488
2160
 
@@ -2672,27 +2344,7 @@ class OSModel
2672
2344
  ducts_mix_loss_sensor.setKeyName(living_zone.name.to_s)
2673
2345
  end
2674
2346
 
2675
- # Return duct losses
2676
- model.getOtherEquipments.sort.each do |o|
2677
- next if objects_already_processed.include? o
2678
-
2679
- is_duct_load = o.additionalProperties.getFeatureAsBoolean(Constants.IsDuctLoadForReport)
2680
- next unless is_duct_load.is_initialized
2681
-
2682
- objects_already_processed << o
2683
- next unless is_duct_load.get
2684
-
2685
- ducts_sensors << []
2686
- { 'Other Equipment Convective Heating Energy' => 'ducts_conv',
2687
- 'Other Equipment Radiant Heating Energy' => 'ducts_rad' }.each do |var, name|
2688
- ducts_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, var)
2689
- ducts_sensor.setName(name)
2690
- ducts_sensor.setKeyName(o.name.to_s)
2691
- ducts_sensors[-1] << ducts_sensor
2692
- end
2693
- end
2694
-
2695
- # Supply duct losses
2347
+ # Duct losses
2696
2348
  model.getOtherEquipments.sort.each do |o|
2697
2349
  next if objects_already_processed.include? o
2698
2350
 
@@ -2730,20 +2382,6 @@ class OSModel
2730
2382
  end
2731
2383
  end
2732
2384
 
2733
- model.getGasEquipments.sort.each do |o|
2734
- next unless o.space.get.thermalZone.get.name.to_s == living_zone.name.to_s
2735
- next if objects_already_processed.include? o
2736
-
2737
- intgains_sensors << []
2738
- { 'Gas Equipment Convective Heating Energy' => 'ig_ge_conv',
2739
- 'Gas Equipment Radiant Heating Energy' => 'ig_ge_rad' }.each do |var, name|
2740
- intgains_gas_equip_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, var)
2741
- intgains_gas_equip_sensor.setName(name)
2742
- intgains_gas_equip_sensor.setKeyName(o.name.to_s)
2743
- intgains_sensors[-1] << intgains_gas_equip_sensor
2744
- end
2745
- end
2746
-
2747
2385
  model.getOtherEquipments.sort.each do |o|
2748
2386
  next unless o.space.get.thermalZone.get.name.to_s == living_zone.name.to_s
2749
2387
  next if objects_already_processed.include? o
@@ -2785,17 +2423,8 @@ class OSModel
2785
2423
  end
2786
2424
  end
2787
2425
 
2788
- model.getZoneHVACDehumidifierDXs.each do |e|
2789
- next unless e.thermalZone.get.name.to_s == living_zone.name.to_s
2790
-
2791
- intgains_sensors << []
2792
- { 'Zone Dehumidifier Sensible Heating Energy' => 'ig_dehumidifier' }.each do |var, name|
2793
- intgain_dehumidifier = OpenStudio::Model::EnergyManagementSystemSensor.new(model, var)
2794
- intgain_dehumidifier.setName(name)
2795
- intgain_dehumidifier.setKeyName(e.name.to_s)
2796
- load_adj_sensors[:dehumidifier] = intgain_dehumidifier
2797
- intgains_sensors[-1] << intgain_dehumidifier
2798
- end
2426
+ if not intgain_dehumidifier.nil?
2427
+ intgains_sensors[-1] << intgain_dehumidifier
2799
2428
  end
2800
2429
 
2801
2430
  intgains_dhw_sensors = {}
@@ -2917,27 +2546,6 @@ class OSModel
2917
2546
  end
2918
2547
  end
2919
2548
 
2920
- # EMS program: Total loads
2921
- program.addLine('Set loads_htg_tot = 0')
2922
- program.addLine('Set loads_clg_tot = 0')
2923
- program.addLine("If #{liv_load_sensors[:htg].name} > 0")
2924
- s = " Set loads_htg_tot = #{tot_load_sensors[:htg].name} - #{tot_load_sensors[:clg].name}"
2925
- load_adj_sensors.each do |key, adj_sensor|
2926
- if ['dehumidifier'].include? key.to_s
2927
- s += " - #{adj_sensor.name}"
2928
- end
2929
- end
2930
- program.addLine(s)
2931
- program.addLine("ElseIf #{liv_load_sensors[:clg].name} > 0")
2932
- s = " Set loads_clg_tot = #{tot_load_sensors[:clg].name} - #{tot_load_sensors[:htg].name}"
2933
- load_adj_sensors.each do |key, adj_sensor|
2934
- if ['dehumidifier'].include? key.to_s
2935
- s += " + #{adj_sensor.name}"
2936
- end
2937
- end
2938
- program.addLine(s)
2939
- program.addLine('EndIf')
2940
-
2941
2549
  # EMS calling manager
2942
2550
  program_calling_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
2943
2551
  program_calling_manager.setName("#{program.name} calling manager")