urbanopt-cli 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (871) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -1
  3. data/CMakeLists.txt +8 -8
  4. data/LICENSE.md +11 -1
  5. data/Rakefile +16 -6
  6. data/example_files/example_project_combined.json +100 -5
  7. data/example_files/mappers/Baseline.rb +31 -18
  8. data/example_files/mappers/CreateBar.rb +16 -6
  9. data/example_files/mappers/EvCharging.rb +20 -10
  10. data/example_files/mappers/Floorspace.rb +16 -6
  11. data/example_files/mappers/HighEfficiencyCreateBar.rb +16 -6
  12. data/example_files/mappers/HighEfficiencyFloorspace.rb +16 -6
  13. data/example_files/mappers/ThermalStorage.rb +16 -6
  14. data/example_files/measures/BuildResidentialModel/measure.rb +211 -129
  15. data/example_files/residential/clothes_dryer.tsv +7 -7
  16. data/example_files/residential/clothes_washer.tsv +1 -1
  17. data/example_files/residential/cooling_system.tsv +42 -22
  18. data/example_files/residential/dishwasher.tsv +1 -1
  19. data/example_files/residential/exhaust.tsv +3 -0
  20. data/example_files/residential/heat_pump.tsv +62 -40
  21. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +1 -0
  22. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +23 -0
  23. data/example_files/resources/hpxml-measures/.gitignore +1 -8
  24. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +633 -1188
  25. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +1524 -1211
  26. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -8
  27. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +424 -335
  28. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules.rb +104 -62
  29. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_state_and_monthly_schedule_shift.csv +613 -0
  30. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_state_and_monthly_schedule_shift.csv +613 -0
  31. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +31 -55
  32. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-50percent.osw +30 -54
  33. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-portable.osw +30 -54
  34. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-whole-home.osw +30 -54
  35. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +30 -54
  36. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +31 -55
  37. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +31 -55
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +36 -60
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +31 -55
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +31 -55
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +31 -55
  42. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +31 -55
  43. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +31 -55
  44. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +31 -55
  45. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +31 -55
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent-preconditioning.osw +31 -55
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent.osw +31 -55
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +31 -55
  49. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +31 -55
  50. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +31 -55
  51. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-single-family-attached.osw +31 -55
  52. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +31 -56
  53. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +31 -56
  54. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +31 -55
  55. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +31 -56
  56. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +31 -56
  57. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +31 -56
  58. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +31 -56
  59. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +31 -55
  60. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +31 -55
  61. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +31 -55
  62. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +31 -56
  63. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +31 -55
  64. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +32 -56
  65. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +31 -55
  66. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +31 -55
  67. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +31 -55
  68. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +31 -55
  69. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +31 -55
  70. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +31 -55
  71. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +31 -55
  72. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +31 -55
  73. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +31 -55
  74. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +31 -55
  75. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +31 -55
  76. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +31 -55
  77. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +31 -55
  78. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +31 -55
  79. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +31 -55
  80. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +31 -55
  81. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +31 -55
  82. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +31 -55
  83. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +31 -55
  84. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +31 -55
  85. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +31 -55
  86. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +31 -55
  87. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +31 -55
  88. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +31 -55
  89. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +31 -55
  90. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +31 -55
  91. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +31 -55
  92. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +31 -55
  93. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +31 -55
  94. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +31 -55
  95. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +31 -55
  96. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +31 -55
  97. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +31 -55
  98. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +31 -55
  99. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +31 -55
  100. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +31 -55
  101. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +31 -55
  102. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +31 -55
  103. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +31 -55
  104. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +31 -55
  105. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +31 -55
  106. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +31 -55
  107. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +31 -55
  108. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +32 -56
  109. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +31 -55
  110. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +31 -55
  111. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +31 -55
  112. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +31 -55
  113. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +30 -54
  114. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +30 -54
  115. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +30 -54
  116. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +30 -54
  117. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +30 -54
  118. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +337 -0
  119. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +337 -0
  120. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +31 -56
  121. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +31 -55
  122. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +31 -55
  123. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +31 -55
  124. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +31 -55
  125. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +31 -56
  126. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +31 -56
  127. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +31 -55
  128. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +31 -55
  129. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +31 -55
  130. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +31 -56
  131. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +31 -55
  132. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +31 -55
  133. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +31 -57
  134. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +31 -56
  135. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +31 -56
  136. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +31 -55
  137. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +31 -55
  138. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +32 -57
  139. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +31 -55
  140. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +31 -55
  141. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +31 -55
  142. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +32 -56
  143. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +31 -56
  144. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +31 -56
  145. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +31 -56
  146. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +31 -56
  147. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +337 -0
  148. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +31 -55
  149. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +31 -55
  150. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +31 -55
  151. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +31 -55
  152. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +31 -56
  153. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +31 -55
  154. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +31 -55
  155. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +31 -55
  156. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +31 -55
  157. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +336 -0
  158. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +336 -0
  159. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +31 -57
  160. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-plug-loads-additional-multipliers.osw → base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw} +36 -58
  161. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +339 -0
  162. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +339 -0
  163. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +339 -0
  164. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +340 -0
  165. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +340 -0
  166. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +340 -0
  167. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +338 -0
  168. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +338 -0
  169. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +338 -0
  170. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +339 -0
  171. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +338 -0
  172. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +340 -0
  173. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +31 -56
  174. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +31 -56
  175. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +32 -57
  176. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +32 -57
  177. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +32 -57
  178. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +32 -57
  179. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +31 -55
  180. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +31 -56
  181. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +337 -0
  182. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +31 -55
  183. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +31 -55
  184. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +31 -55
  185. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +31 -56
  186. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +31 -56
  187. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +31 -55
  188. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +31 -56
  189. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +31 -55
  190. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +31 -55
  191. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +31 -55
  192. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +40 -64
  193. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +31 -55
  194. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +44 -68
  195. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +337 -0
  196. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-honolulu-hi.osw +337 -0
  197. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +31 -55
  198. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +337 -0
  199. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +337 -0
  200. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +31 -55
  201. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +39 -65
  202. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +32 -56
  203. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +31 -55
  204. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +31 -55
  205. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +31 -55
  206. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +337 -0
  207. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +31 -55
  208. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +31 -55
  209. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +31 -55
  210. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +31 -55
  211. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +31 -55
  212. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +29 -53
  213. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +29 -53
  214. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +29 -53
  215. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +31 -55
  216. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +337 -0
  217. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +30 -54
  218. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +31 -55
  219. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-vacancy-6-months.osw → base-schedules-stochastic-vacant.osw} +34 -58
  220. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +31 -55
  221. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +31 -55
  222. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +31 -55
  223. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +31 -55
  224. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +31 -55
  225. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +31 -55
  226. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +31 -55
  227. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +31 -55
  228. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +57 -56
  229. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +31 -55
  230. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +341 -0
  231. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +341 -0
  232. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +341 -0
  233. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +341 -0
  234. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +341 -0
  235. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +341 -0
  236. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +341 -0
  237. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +341 -0
  238. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +341 -0
  239. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +341 -0
  240. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +341 -0
  241. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +341 -0
  242. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +341 -0
  243. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +341 -0
  244. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +341 -0
  245. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +341 -0
  246. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +341 -0
  247. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +341 -0
  248. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +341 -0
  249. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +341 -0
  250. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +341 -0
  251. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +341 -0
  252. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +341 -0
  253. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +341 -0
  254. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +341 -0
  255. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
  256. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +341 -0
  257. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
  258. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +341 -0
  259. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +341 -0
  260. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +341 -0
  261. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
  262. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +341 -0
  263. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
  264. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +341 -0
  265. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
  266. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +341 -0
  267. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
  268. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +341 -0
  269. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
  270. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +341 -0
  271. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +341 -0
  272. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +341 -0
  273. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +341 -0
  274. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +341 -0
  275. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
  276. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +341 -0
  277. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
  278. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +341 -0
  279. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +341 -0
  280. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +341 -0
  281. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
  282. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +341 -0
  283. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
  284. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +341 -0
  285. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
  286. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +341 -0
  287. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
  288. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +341 -0
  289. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
  290. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +341 -0
  291. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +341 -0
  292. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +341 -0
  293. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +341 -0
  294. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +339 -0
  295. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +339 -0
  296. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-exterior.osw +339 -0
  297. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +339 -0
  298. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-single-exterior-front.osw +339 -0
  299. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +339 -0
  300. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +339 -0
  301. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +339 -0
  302. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +339 -0
  303. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +339 -0
  304. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement.osw +339 -0
  305. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +339 -0
  306. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +339 -0
  307. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +339 -0
  308. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +339 -0
  309. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +339 -0
  310. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +339 -0
  311. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +31 -55
  312. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +337 -0
  313. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +337 -0
  314. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +337 -0
  315. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +31 -55
  316. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +339 -0
  317. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +31 -55
  318. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +31 -55
  319. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +336 -0
  320. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +337 -0
  321. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +337 -0
  322. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-second-heating-system-fireplace.osw → extra-second-heating-system-fireplace-to-heating-system.osw} +34 -58
  323. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +337 -0
  324. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-second-heating-system-portable-heater.osw → extra-second-heating-system-portable-heater-to-heating-system.osw} +32 -56
  325. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +31 -55
  326. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +337 -0
  327. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +337 -0
  328. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +337 -0
  329. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +337 -0
  330. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +337 -0
  331. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +34 -58
  332. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +337 -0
  333. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +31 -55
  334. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +31 -55
  335. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +31 -55
  336. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +31 -55
  337. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +337 -0
  338. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +31 -55
  339. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +31 -55
  340. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +31 -55
  341. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +31 -55
  342. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-fuel-loads.osw +31 -55
  343. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +337 -0
  344. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/{multipliers-without-plug-loads.osw → multipliers-without-tv-plug-loads.osw} +35 -59
  345. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-vehicle-plug-loads.osw +337 -0
  346. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +337 -0
  347. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +31 -55
  348. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +31 -55
  349. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +31 -55
  350. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +337 -0
  351. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +31 -55
  352. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +337 -0
  353. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +31 -55
  354. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +31 -55
  355. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +31 -55
  356. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +31 -55
  357. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +31 -55
  358. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +31 -55
  359. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +31 -55
  360. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +31 -55
  361. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +33 -57
  362. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +31 -55
  363. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +337 -0
  364. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/vacant.csv +8761 -0
  365. data/example_files/resources/hpxml-measures/Changelog.md +238 -0
  366. data/example_files/resources/hpxml-measures/Gemfile +4 -2
  367. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +265 -838
  368. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +135 -114
  369. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +5 -97
  370. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +573 -193
  371. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +2 -28
  372. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +114 -22
  373. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +107 -176
  374. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +12 -180
  375. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +481 -94
  376. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +2 -6
  377. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +23 -11
  378. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +27 -25
  379. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +735 -453
  380. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +417 -105
  381. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +1377 -1335
  382. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +1393 -1467
  383. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +2 -1
  384. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +20 -7
  385. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +64 -3
  386. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +2 -22
  387. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +1 -3
  388. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +15 -6
  389. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +7 -1
  390. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +2 -0
  391. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +1 -1
  392. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +3 -4
  393. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +31 -30
  394. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +4 -1
  395. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_constructions.rb +62 -16
  396. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +507 -628
  397. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +3 -0
  398. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +4 -1
  399. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +321 -6
  400. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -0
  401. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +3 -0
  402. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +3 -0
  403. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +3 -0
  404. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +3 -0
  405. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +25 -1
  406. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +3 -0
  407. data/example_files/resources/hpxml-measures/README.md +4 -4
  408. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +111 -37
  409. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.xml +318 -490
  410. data/example_files/resources/hpxml-measures/SimulationOutputReport/tests/output_report_test.rb +237 -183
  411. data/example_files/resources/hpxml-measures/docs/source/conf.py +4 -1
  412. data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +2 -2
  413. data/example_files/resources/hpxml-measures/docs/source/intro.rst +3 -105
  414. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +476 -351
  415. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +154 -130
  416. data/example_files/resources/hpxml-measures/tasks.rb +1287 -511
  417. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3-cache.csv +35 -0
  418. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3.epw +8768 -0
  419. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3-cache.csv +35 -0
  420. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3.epw +8768 -0
  421. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3-cache.csv +35 -0
  422. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3.epw +8768 -0
  423. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3-cache.csv +35 -0
  424. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3.epw +8768 -0
  425. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +23 -5
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +1 -1
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-50percent.xml +2 -1
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +2 -1
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +2 -1
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +534 -0
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +2 -1
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +1 -1
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +1 -1
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +1 -0
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +1 -1
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +1 -1
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +1 -1
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +1 -1
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +3 -3
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +1 -1
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +1 -1
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +1 -1
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +1 -1
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +1 -1
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +1 -1
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +1 -1
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +1 -1
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +1 -1
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +0 -1
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +4 -4
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +20 -4
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +27 -18
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +27 -18
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +0 -1
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +4 -4
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +20 -4
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +20 -4
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +22 -11
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +0 -1
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +4 -4
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +20 -4
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +22 -12
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +22 -12
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +1 -1
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +2 -3
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +1 -1
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +2 -1
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +1 -1
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +1 -1
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +1 -1
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +1 -1
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +1 -1
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +1 -1
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +14 -2
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +0 -1
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +0 -1
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +1 -1
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +563 -564
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +1 -1
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +1 -4
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +1 -1
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +1 -4
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +1 -1
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +0 -1
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +0 -1
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +0 -1
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +0 -1
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +0 -1
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +1 -1
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +1 -1
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +1 -1
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +0 -1
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +1 -1
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +0 -1
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +1 -0
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +1 -1
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +1 -1
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +1 -1
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +1 -1
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +1 -1
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +1 -1
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +1 -1
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +1 -1
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +1 -1
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +1 -1
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +1 -1
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +1 -1
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +1 -1
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +1 -1
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +1 -1
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +1 -1
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +1 -1
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +1 -1
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +1 -1
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +1 -1
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +1 -1
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +1 -1
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +1 -1
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +1 -1
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +1 -1
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +1 -1
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +1 -1
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +1 -1
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +1 -1
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +1 -1
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +1 -1
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +2 -2
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +1 -1
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +1 -1
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +1 -1
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +1 -1
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +1 -1
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +1 -1
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +1 -1
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +1 -1
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +1 -1
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +1 -1
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +1 -1
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +6 -1
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +1 -1
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +600 -0
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +1 -1
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +1 -1
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +1 -1
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2474 -0
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +1 -1
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +1 -1
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-windows-interior-shading.xml → base-enclosure-windows-shading.xml} +576 -561
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +1 -1
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +643 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +1 -1
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +1 -1
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +1 -1
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +3 -3
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +1 -1
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +2 -2
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +2 -2
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +1 -1
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +2 -2
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +1 -1
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +1 -1
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +1 -1
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +555 -0
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +561 -0
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +1 -4
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +1 -1
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +1 -1
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +552 -0
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +557 -0
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-air-to-air-heat-pump-1-speed-manual-s-oversize-allowances.xml} +1 -4
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-1-speed.xml} +1 -4
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-air-to-air-heat-pump-2-speed-manual-s-oversize-allowances.xml} +559 -559
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-2-speed.xml} +556 -556
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-var-speed-manual-s-oversize-allowances.xml} +559 -556
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-air-to-air-heat-pump-var-speed.xml} +556 -559
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-elec-only-autosize.xml → base-hvac-autosize-boiler-elec-only.xml} +517 -518
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-gas-central-ac-1-speed-autosize.xml → base-hvac-autosize-boiler-gas-central-ac-1-speed.xml} +568 -569
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-gas-only-autosize.xml → base-hvac-autosize-boiler-gas-only.xml} +518 -519
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-1-speed-autosize.xml → base-hvac-autosize-central-ac-only-1-speed.xml} +1 -4
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-2-speed-autosize.xml → base-hvac-autosize-central-ac-only-2-speed.xml} +546 -546
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-var-speed-autosize.xml → base-hvac-autosize-central-ac-only-var-speed.xml} +546 -546
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-plus-air-to-air-heat-pump-heating-autosize.xml → base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml} +1 -7
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-autosize.xml → base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml} +1 -4
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-dual-fuel-mini-split-heat-pump-ducted-autosize.xml → base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml} +1 -4
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-elec-resistance-only-autosize.xml → base-hvac-autosize-elec-resistance-only.xml} +508 -509
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-evap-cooler-furnace-gas-autosize.xml → base-hvac-autosize-evap-cooler-furnace-gas.xml} +552 -552
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-floor-furnace-propane-only-autosize.xml → base-hvac-autosize-floor-furnace-propane-only.xml} +511 -512
  588. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-elec-only-autosize.xml → base-hvac-autosize-furnace-elec-only.xml} +546 -546
  589. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-central-ac-2-speed-autosize.xml → base-hvac-autosize-furnace-gas-central-ac-2-speed.xml} +559 -559
  590. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-central-ac-var-speed-autosize.xml → base-hvac-autosize-furnace-gas-central-ac-var-speed.xml} +559 -559
  591. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +547 -0
  592. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-room-ac-autosize.xml → base-hvac-autosize-furnace-gas-room-ac.xml} +557 -557
  593. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +554 -0
  594. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +559 -0
  595. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-ground-to-air-heat-pump-manual-s-oversize-allowances.xml} +561 -562
  596. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize.xml → base-hvac-autosize-ground-to-air-heat-pump.xml} +558 -559
  597. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +546 -0
  598. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-cooling-only-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml} +1 -4
  599. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-heating-only-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml} +1 -4
  600. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml} +1 -4
  601. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted.xml +556 -0
  602. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-room-ac-only-autosize.xml → base-hvac-autosize-room-ac-only.xml} +507 -508
  603. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-stove-oil-only-autosize.xml → base-hvac-autosize-stove-oil-only.xml} +511 -512
  604. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-wall-furnace-elec-only-autosize.xml → base-hvac-autosize-wall-furnace-elec-only.xml} +511 -512
  605. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-autosize.xml → base-hvac-autosize.xml} +559 -559
  606. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +0 -1
  607. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +0 -1
  608. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +1 -2
  609. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +0 -1
  610. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +0 -1
  611. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +0 -1
  612. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +0 -1
  613. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +1 -4
  614. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +1 -1
  615. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +1 -1
  616. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +1 -7
  617. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +0 -1
  618. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +1 -4
  619. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +1 -4
  620. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +1 -1
  621. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +1 -1
  622. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +1 -4
  623. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +1 -1
  624. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +0 -1
  625. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +2 -1
  626. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +10 -1
  627. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +1 -4
  628. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +512 -513
  629. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +563 -563
  630. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +512 -513
  631. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +547 -547
  632. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +1 -1
  633. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +1 -1
  634. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +1 -1
  635. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +1 -1
  636. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +547 -550
  637. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +1 -1
  638. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +1 -1
  639. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +1 -1
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +1 -1
  641. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +0 -1
  642. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +556 -0
  643. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +562 -0
  644. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +561 -562
  645. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/slab-zero-exposed-perimeter.xml → base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.xml} +567 -561
  646. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml → base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.xml} +565 -562
  647. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.xml +566 -0
  648. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.xml +566 -0
  649. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-misc-shelter-coefficient.xml → base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.xml} +570 -564
  650. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.xml +571 -0
  651. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.xml +571 -0
  652. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml → base-hvac-install-quality-all-furnace-gas-only.xml} +551 -549
  653. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-ground-to-air-heat-pump.xml +565 -0
  654. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-air-conditioner-only-ducted-autosize.xml → base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.xml} +551 -548
  655. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml → base-hvac-install-quality-all-mini-split-heat-pump-ducted.xml} +564 -558
  656. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-blower-efficiency-furnace-gas-central-ac-1-speed.xml +568 -0
  657. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.xml +565 -0
  658. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.xml +569 -0
  659. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +1 -4
  660. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +0 -4
  661. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +1 -4
  662. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +1 -4
  663. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +1 -4
  664. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +0 -4
  665. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +916 -913
  666. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple2.xml +837 -834
  667. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +0 -1
  668. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +563 -563
  669. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +1 -1
  670. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +1 -1
  671. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +0 -1
  672. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +0 -1
  673. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +1 -1
  674. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +512 -513
  675. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +512 -513
  676. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +1 -1
  677. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +1 -1
  678. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +512 -513
  679. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +1 -1
  680. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-detailed.xml +1 -1
  681. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +1 -1
  682. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +1 -1
  683. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +34 -23
  684. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +1 -1
  685. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +34 -23
  686. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +562 -0
  687. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +516 -0
  688. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +1 -1
  689. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +516 -0
  690. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +576 -0
  691. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +1 -1
  692. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +1 -1
  693. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +0 -1
  694. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +10 -1
  695. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +1 -1
  696. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +1 -1
  697. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +1 -1
  698. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +1 -1
  699. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +1 -1
  700. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +1 -1
  701. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +1 -1
  702. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +2 -1
  703. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +1 -1
  704. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +1 -1
  705. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +1 -0
  706. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +1 -1
  707. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +5 -1
  708. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +9 -1
  709. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +1 -1
  710. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +1 -1
  711. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +563 -0
  712. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +5 -1
  713. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1654 -0
  714. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +1 -1
  715. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +563 -0
  716. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +1 -1
  717. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +1 -1
  718. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +1 -1
  719. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +1 -1
  720. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +1 -1
  721. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +1 -1
  722. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +1 -1
  723. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +1 -1
  724. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/boiler-invalid-afue.xml +519 -0
  725. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml +0 -1
  726. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +1 -1
  727. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +1 -1
  728. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +1 -1
  729. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +534 -0
  730. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +534 -0
  731. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +0 -1
  732. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-ef-tank.xml +1 -1
  733. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +1 -1
  734. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +1 -1
  735. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +562 -0
  736. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +562 -0
  737. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +1 -1
  738. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +1 -1
  739. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +1 -1
  740. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +1 -1
  741. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +2 -2
  742. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +2 -2
  743. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +4 -4
  744. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +447 -0
  745. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +1 -1
  746. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml +1 -1
  747. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +1 -1
  748. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +1 -1
  749. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +1 -1
  750. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +11 -58
  751. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +759 -0
  752. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +758 -0
  753. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +760 -0
  754. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +758 -0
  755. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +562 -0
  756. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +459 -0
  757. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-output-greater-than-consumption.xml +578 -0
  758. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +1 -4
  759. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +916 -913
  760. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +916 -913
  761. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml +2 -7
  762. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +0 -1
  763. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +0 -1
  764. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +916 -913
  765. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +1 -1
  766. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml +1 -1
  767. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +562 -0
  768. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +1 -1
  769. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +1 -1
  770. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +1 -1
  771. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +1 -1
  772. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +2 -2
  773. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +1 -1
  774. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +1 -1
  775. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-surfaces.xml +1 -1
  776. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-foundation-wall-properties.xml +573 -0
  777. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id.xml +590 -0
  778. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +590 -0
  779. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +562 -0
  780. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +1 -1
  781. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +1 -1
  782. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +464 -0
  783. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-conditioned-floors.xml +562 -0
  784. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +450 -0
  785. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +1 -4
  786. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml +0 -1
  787. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +1 -1
  788. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +1 -1
  789. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +472 -0
  790. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +1 -1
  791. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +6 -1
  792. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +1 -1
  793. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +912 -909
  794. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +1 -1
  795. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +1 -1
  796. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +1 -1
  797. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-surface.xml +12 -2
  798. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +1 -1
  799. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +1654 -0
  800. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +1654 -0
  801. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-ideal-air.xml → invalid_files/multiple-shared-cooling-systems.xml} +431 -498
  802. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-heating-systems.xml +434 -0
  803. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +1 -1
  804. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +1 -1
  805. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +1 -1
  806. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +1 -1
  807. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +1 -1
  808. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +1 -1
  809. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +1 -1
  810. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +1 -4
  811. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +0 -1
  812. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +0 -1
  813. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +1 -4
  814. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +0 -1
  815. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +1 -1
  816. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +1 -1
  817. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +1 -1
  818. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +1 -1
  819. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +1 -1
  820. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +1 -1
  821. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml +1 -1
  822. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +1 -1
  823. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +1 -1
  824. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +1 -1
  825. data/example_files/resources/hpxml-measures/workflow/template.osw +4 -1
  826. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +0 -3
  827. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +0 -3
  828. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +0 -3
  829. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +0 -3
  830. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +0 -3
  831. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +0 -3
  832. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +0 -3
  833. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +0 -3
  834. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +0 -3
  835. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +0 -3
  836. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +0 -3
  837. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +0 -3
  838. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +0 -3
  839. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +0 -3
  840. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +0 -3
  841. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +0 -3
  842. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +0 -3
  843. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +0 -3
  844. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +0 -3
  845. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +0 -3
  846. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +0 -3
  847. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +0 -3
  848. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +0 -3
  849. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +0 -3
  850. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +0 -3
  851. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +0 -3
  852. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +232 -360
  853. data/example_files/{measures/BuildResidentialModel/resources → resources}/measure-info.json +0 -0
  854. data/example_files/{measures/BuildResidentialModel/resources → resources}/meta_measure.rb +53 -44
  855. data/lib/uo_cli.rb +187 -44
  856. data/lib/uo_cli/version.rb +17 -7
  857. data/requirements.txt +2 -0
  858. data/uo_cli.gemspec +2 -2
  859. metadata +248 -64
  860. data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.rb +0 -1005
  861. data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.xml +0 -326
  862. data/example_files/measures/ResidentialGeometryCreateMultifamily/tests/create_residential_multifamily_geometry_test.rb +0 -477
  863. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.rb +0 -1039
  864. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.xml +0 -393
  865. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/tests/create_residential_single_family_attached_geometry_test.rb +0 -456
  866. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.rb +0 -979
  867. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.xml +0 -388
  868. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/tests/create_residential_single_family_detached_geometry_test.rb +0 -704
  869. data/example_files/resources/hpxml-measures/.circleci/config.yml +0 -20
  870. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/location.rb +0 -24
  871. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-hvac-programmable-thermostat.osw +0 -369
@@ -0,0 +1,238 @@
1
+ ## OpenStudio-HPXML v1.2.0 (Pending)
2
+
3
+ __New Features__
4
+ - Allow `Slab/ExposedPerimeter` to be zero.
5
+ - **Breaking change**: Replaces `Site/extension/ShelterCoefficient` with `Site/ShieldingofHome`.
6
+ - Removes `ClothesDryer/ControlType` from being a required input, it is not used.
7
+ - Moves additional error-checking from the ruby measure to the schematron validator.
8
+ - Adds more detail to error messages regarding the wrong data type in the HPXML file.
9
+ - Relaxes tolerance for duct leakage to outside warning when ducts solely in conditioned space.
10
+
11
+ __Bugfixes__
12
+ - Fixes ruby error if elements (e.g., `SystemIdentifier`) exist without the proper 'id'/'idref' attribute.
13
+ - Fixes error if boiler/GSHP pump power is zero
14
+ - Fixes possible "Electricity category end uses do not sum to total" error due to boiler pump energy.
15
+ - Fixes possible "Construction R-value ... does not match Assembly R-value" error for highly insulated enclosure elements.
16
+
17
+ ## OpenStudio-HPXML v1.1.0
18
+
19
+ __New Features__
20
+ - **Breaking change**: `Type` is now a required input for dehumidifiers; can be "portable" or "whole-home".
21
+ - **Breaking change**: `Location` is now a required input for dehumidifiers; must be "living space" as dehumidifiers are currently modeled as located in living space.
22
+ - **Breaking change**: `Type` is now a required input for Pool, PoolPump, HotTub, and HotTubPump.
23
+ - **Breaking change**: Both supply and return duct leakage to outside are now required inputs for AirDistribution systems.
24
+ - **Breaking change**: Simplifies inputs for fan coils and water loop heat pumps by A) removing HydronicAndAirDistribution element and B) moving WLHP inputs from extension elements to HeatPump element.
25
+ - Allows modeling airflow/charge defects for air conditioners, heat pumps, and furnaces (RESNET Standard 310).
26
+ - Allows modeling *multiple* dehumidifiers (previously only one allowed).
27
+ - Allows modeling generators (generic on-site power production).
28
+ - Allows detailed heating/cooling setpoints to be specified: 24-hour weekday & weekend values.
29
+ - Allows modeling window/skylight *exterior* shading via summer/winter shading coefficients.
30
+ - Allows JSON annual/timeseries output files to be generated instead of CSV. **Breaking change**: For CSV outputs, the first two sections in the results_annual.csv file are now prefixed with "Fuel Use:" and "End Use:", respectively.
31
+ - Allows more defaulting (optional inputs) for a variety of HPXML elements.
32
+ - Allows requesting timeseries unmet heating/cooling loads.
33
+ - Allows skipping schema/schematron validation (for speed); should only be used if the HPXML was already validated upstream.
34
+ - Allows HPXML files w/ multiple `Building` elements; requires providing the ID of the single building to be simulated.
35
+ - Includes hot water loads (in addition to heating/cooling loads) when timeseries total loads are requested.
36
+ - The `in.xml` HPXML file is now always produced for inspection of default values (e.g., autosized HVAC capacities). **Breaking change**: The `output_dir` HPXMLtoOpenStudio measure argument is now required.
37
+ - Overhauls documentation to be more comprehensive and standardized.
38
+ - `run_simulation.rb` now returns exit code 1 if not successful (i.e., either invalid inputs or simulation fails).
39
+
40
+ __Bugfixes__
41
+ - Improved modeling of window/skylight interior shading -- better reflects shading coefficient inputs.
42
+ - Adds error-checking on the HPXML schemaVersion.
43
+ - Adds various error-checking to the schematron validator.
44
+ - Adds error-checking for empty IDs in the HPXML file.
45
+ - Fixes heat pump water heater fan energy not included in SimulationOutputReport outputs.
46
+ - Fixes possibility of incorrect "A neighbor building has an azimuth (XXX) not equal to the azimuth of any wall" error.
47
+ - Fixes possibility of errors encountered before schematron validation has occurred.
48
+ - Small bugfixes related to basement interior surface solar absorptances.
49
+ - Allows NumberofConditionedFloors/NumberofConditionedFloorsAboveGrade to be non-integer values per the HPXML schema.
50
+ - HVAC sizing design load improvements for floors above crawlspaces/basements, walls, ducts, and heat pumps.
51
+ - Now recognizes Type="none" to prevent modeling of pools and hot tubs (pumps and heaters).
52
+ - Fixes error for overhangs with zero depth.
53
+ - Fixes possible error where the normalized flue height for the AIM-2 infiltration model is negative.
54
+ - Slight adjustment of default water heater recovery efficiency equation to prevent errors from values being too high.
55
+ - Fixes schematron file not being valid per ISO Schematron standard.
56
+
57
+ ## OpenStudio-HPXML v1.0.0
58
+
59
+ __New Features__
60
+ - Updates to OpenStudio 3.1.0/EnergyPlus 9.4.0.
61
+ - **Breaking change**: Deprecates `WeatherStation/WMO` HPXML input, use `WeatherStation/extension/EPWFilePath` instead; also removes `weather_dir` argument from HPXMLtoOpenStudio measure.
62
+ - Implements water heater Uniform Energy Factor (UEF) model; replaces RESNET UEF->EF regression. **Breaking change**: `FirstHourRating` is now a required input for storage water heaters when UEF is provided.
63
+ - Adds optional HPXML fan power inputs for most HVAC system types. **Breaking change**: Removes ElectricAuxiliaryEnergy input for non-boiler heating systems.
64
+ - Uses air-source heat pump cooling performance curves for central air conditioners.
65
+ - Updates rated fan power assumption for mini-split heat pump models.
66
+ - Allows coal fuel type for non-boiler heating systems.
67
+ - Accommodates common walls adjacent to unconditioned space by using HPXML surfaces where InteriorAdjacentTo == ExteriorAdjacentTo.
68
+ - Adds optional HPXML inputs to define whether a clothes dryer is vented and its ventilation rate.
69
+ - Adds optional HPXML input for `SimulationControl/CalendarYear` for TMY weather files.
70
+ - Schematron validation improvements.
71
+ - Adds some HPXML XSD schema validation and additional error-checking.
72
+ - Various small updates to ASHRAE 140 test files.
73
+ - Reduces number of EnergyPlus output files produced by using new OutputControlFiles object.
74
+ - Release packages now include ASHRAE 140 test files/results.
75
+
76
+ __Bugfixes__
77
+ - EnergyPlus 9.4.0 fix for negative window solar absorptances at certain hours.
78
+ - Fixes airflow timeseries outputs to be averaged instead of summed.
79
+ - Updates HVAC sizing methodology for slab-on-grade foundation types.
80
+ - Fixes an error that could prevent schematron validation errors from being produced.
81
+ - Skips weather caching if filesystem is read only.
82
+
83
+ ## OpenStudio-HPXML v0.11.0 Beta
84
+
85
+ __New Features__
86
+ - New [Schematron](http://schematron.com) validation (EPvalidator.xml) replaces custom ruby validation (EPvalidator.rb)
87
+ - **[Breaking Change]** `BuildingConstruction/ResidentialFacilityType` ("single-family detached", "single-family attached", "apartment unit", or "manufactured home") is a required input
88
+ - Ability to model shared systems for Attached/Multifamily dwelling units
89
+ - Shared HVAC systems (cooling towers, chillers, central boilers, water loop heat pumps, fan coils, ground source heat pumps on shared hydronic circulation loops)
90
+ - Shared water heaters serving either A) multiple dwelling units' service hot water or B) a shared laundry/equipment room, as well as hot water recirculation systems
91
+ - Shared appliances (e.g., clothes dryer in a shared laundry room)
92
+ - Shared hot water recirculation systems
93
+ - Shared ventilation systems (optionally with preconditioning equipment and recirculation)
94
+ - Shared PV systems
95
+ - **[Breaking Change]** Appliances located in MF spaces (i.e., "other") must now be specified in more detail (i.e., "other heated space", "other non-freezing space", "other multifamily buffer space", or "other housing unit")
96
+ - Enclosure
97
+ - New optional inputs: `Roof/RoofType`, `Wall/Siding`, and `RimJoist/Siding`
98
+ - New optional inputs: `Skylight/InteriorShading/SummerShadingCoefficient` and `Skylight/InteriorShading/SummerShadingCoefficient`
99
+ - New optional inputs: `Roof/RoofColor`, `Wall/Color`, and `RimJoist/Color` can be provided instead of `SolarAbsorptance`
100
+ - New optional input to specify presence of flue/chimney, which results in increased infiltration
101
+ - Allows adobe wall type
102
+ - Allows `AirInfiltrationMeasurement/HousePressure` to be any value (previously required to be 50 Pa)
103
+ - **[Breaking Change]** `Roof/RadiantBarrierGrade` input now required when there is a radiant barrier
104
+ - HVAC
105
+ - Adds optional high-level HVAC autosizing controls
106
+ - `AllowIncreasedFixedCapacities`: Describes how HVAC equipment with fixed capacities are handled. If true, the maximum of the user-specified fixed capacity and the heating/cooling design load will be used to reduce potential for unmet loads. Defaults to false.
107
+ - `UseMaxLoadForHeatPumps`: Describes how autosized heat pumps are handled. If true, heat pumps are sized based on the maximum of heating and cooling design loads. If false, heat pumps are sized per ACCA Manual J/S based on cooling design loads with some oversizing allowances for heating design loads. Defaults to true.
108
+ - Additional HVAC types: mini-split air conditioners and fixed (non-portable) space heaters
109
+ - Adds optional inputs for ground-to-air heat pumps: `extension/PumpPowerWattsPerTon` and `extension/FanPowerWattsPerCFM`
110
+ - Ventilation
111
+ - Allows _multiple_ whole-home ventilation, spot ventilation, and/or whole house fans
112
+ - Appliances & Plug Loads
113
+ - Allows _multiple_ `Refrigerator` and `Freezer`
114
+ - Allows `Pool`, `HotTub`, `PlugLoad` of type "electric vehicle charging" and "well pump", and `FuelLoad` of type "grill", "lighting", and "fireplace"
115
+ - **[Breaking Change]** "other" and "TV other" plug loads now required
116
+ - Lighting
117
+ - Allows lighting schedules and holiday lighting
118
+ - **[Breaking Change]** For hydronic distributions, `HydronicDistributionType` is now required
119
+ - **[Breaking Change]** For DSE distributions, `AnnualHeatingDistributionSystemEfficiency` and `AnnualCoolingDistributionSystemEfficiency` are both always required
120
+ - Allows more HPXML fuel types to be used for HVAC, water heating, appliances, etc.
121
+ - New inputs to define Daylight Saving period; defaults to enabled
122
+ - Adds more reporting of warnings/errors to run.log
123
+
124
+ __Bugfixes__
125
+ - Fixes pump energy for boilers and ground source heat pumps
126
+ - Fixes incorrect gallons of hot water use reported when there are multiple water heaters
127
+ - No longer report unmet load for buildings where the HVAC system only meets part of the load (e.g., room AC serving 33% of the load)
128
+ - Schedule bugfix for leap years
129
+
130
+ ## OpenStudio-HPXML v0.10.0 Beta
131
+
132
+ __New Features__
133
+ - Dwelling units of single-family attached/multifamily buildings:
134
+ - Adds new generic space types "other heated space", "other multifamily buffer space", and "other non-freezing space" for surface `ExteriorAdjacentTo` elements. "other housing unit", i.e. adiabatic surfaces, was already supported.
135
+ - **[Breaking Change]** For `FrameFloors`, replaces "other housing unit above" and "other housing unit below" enumerations with "other housing unit". All four "other ..." spaces must have an `extension/OtherSpaceAboveOrBelow` property set to either "above" or "below".
136
+ - Allows ducts and water heaters to be located in all "other ..." spaces.
137
+ - Allows all appliances to be located in "other", in which internal gains are neglected.
138
+ - Allows `Fireplace` and `FloorFurnace` for heating system types.
139
+ - Allows "exterior wall", "under slab", and "roof deck" for `DuctLocation`.
140
+ - Allows "wood" and "wood pellets" as fuel types for additional HVAC systems, water heaters, and appliances.
141
+ - Allows `Location` to be provided for `Dishwasher` and `CookingRange`.
142
+ - Allows `BuildingSummary/Site/SiteType` ("urban", "suburban", or "rural") to be provided.
143
+ - Allows user-specified `Refrigerator` and `CookingRange` schedules to be provided.
144
+ - HVAC capacity elements are no longer required; if not provided, ACCA Manual J autosizing calculations will be used (-1 can continue to be used for capacity elements but is discouraged).
145
+ - Duct locations/areas can be defaulted by specifying supply/return `Duct` elements without `DuctSurfaceArea` and `DuctLocation`. `HVACDistribution/DistributionSystemType/AirDistribution/NumberofReturnRegisters` can be optionally provided to inform the default duct area calculations.
146
+ - **[Breaking Change]** Lighting inputs now use `LightingType[LightEmittingDiode | CompactFluorescent | FluorescentTube]` instead of `ThirdPartyCertification="ERI Tier I" or ThirdPartyCertification="ERI Tier II"`.
147
+ - **[Breaking Change]** `HVACDistribution/ConditionedFloorAreaServed` is now required for air distribution systems.
148
+ - **[Breaking Change]** Infiltration and attic ventilation specified using natural air changes per hour now uses `ACHnatural` instead of `extension/ConstantACHnatural`.
149
+ - **[Breaking Change]** The optional `PerformanceAdjustment` input for instantaneous water heaters is now treated as a performance multiplier (e.g., 0.92) instead of derate (e.g., 0.08).
150
+ - Adds ASHRAE 140 Class II test files.
151
+ - SimulationOutputReport reporting measure:
152
+ - New optional timeseries outputs: airflows (e.g., infiltration, mechanical ventilation, natural ventilation, whole house fan) and weather (e.g., temperatures, wind speed, solar).
153
+ - Timeseries frequency can now be set to 'none' as an alternative to setting all include_timeseries_foo variables to false.
154
+ - **[Breaking Change]** Renames "Wood" to "Wood Cord" to better distinguish from "Wood Pellets".
155
+ - Modeling improvements:
156
+ - Improved calculation for infiltration height
157
+ - Infiltration & mechanical ventilation now combined using ASHRAE 62.2 Normative Appendix C.
158
+ - Runtime improvements:
159
+ - Optimized ruby require calls.
160
+ - Skip ViewFactor calculations when not needed (i.e., no conditioned basement).
161
+ - Error-checking:
162
+ - Adds more space type-specific error checking of adjacent surfaces.
163
+ - Adds additional HPXML datatype checks.
164
+ - Adds a warning if a `HVACDistribution` system has ducts entirely within conditioned space and non-zero leakage to the outside.
165
+ - Adds warnings if appliance inputs may be inappropriate and result in negative energy or hot water use.
166
+
167
+ __Bugfixes__
168
+ - Fixes error if there's a `FoundationWall` whose height is less than 0.5 ft.
169
+ - Fixes HVAC defrost control in EnergyPlus model to use "Timed" instead of "OnDemand".
170
+ - Fixes exterior air film and wind exposure for a `FrameFloor` over ambient conditions.
171
+ - Fixes air films for a `FrameFloor` ceiling.
172
+ - Fixes error if there are additional `LightingGroup` elements beyond the ones required.
173
+ - Fixes vented attic ventilation rate.
174
+ - Reported unmet heating/cooling load now correctly excludes latent energy.
175
+ - Ground-source heat pump backup fuel is now correctly honored instead of always using electricity.
176
+
177
+ ## OpenStudio-HPXML v0.9.0 Beta
178
+
179
+ __New Features__
180
+ - **[Breaking Change]** Updates to OpenStudio v3.0.0 and EnergyPlus 9.3
181
+ - Numerous HPXML inputs are now optional with built-in defaulting, particularly for water heating, appliances, and PV. Set the `debug` argument to true to output a in.xml HPXML file with defaults applied for inspection. See the documentation for defaulting equations/assumptions/references.
182
+ - **[Breaking Change]** If clothes washer efficiency inputs are provided, `LabelUsage` is now required.
183
+ - **[Breaking Change]** If dishwasher efficiency inputs are provided, `LabelElectricRate`, `LabelGasRate`, `LabelAnnualGasCost`, and `LabelUsage` are now required.
184
+ - Adds optional specification of simulation controls including timestep and begin/end dates.
185
+ - Adds optional `extension/UsageMultiplier` inputs for appliances, plug loads, lighting, and water fixtures. Can be used to, e.g., reflect high/low usage occupants.
186
+ - Adds ability to model a dehumidifier.
187
+ - Adds ability to model kitchen/bath fans (spot ventilation).
188
+ - Improved desuperheater model; desuperheater can now be connected to heat pump water heaters.
189
+ - Updated clothes washer/dryer and dishwasher models per ANSI/RESNET/ICC 301-2019 Addendum A.
190
+ - Solar thermal systems modeled with `SolarFraction` can now be connected to combi water heating systems.
191
+ - **[Breaking Change]** Replaces optional `epw_output_path` and `osm_output_path` arguments with a single optional `output_dir` argument; adds an optional `debug` argument.
192
+ - **[Breaking Change]** Replaces optional `BuildingConstruction/extension/FractionofOperableWindowArea` with optional `Window/FractionOperable`.
193
+ - **[Breaking Change]** Replaces optional `extension/EPWFileName` with optional `extension/EPWFilePath` to allow absolute paths to be provided as an alternative to just the file name.
194
+ - Replaces REXML xml library with Oga for better runtime performance.
195
+ - Additional error-checking.
196
+ - SimulationOutputReport reporting measure:
197
+ - Now reports wood and wood pellets
198
+ - Can report monthly timeseries values if requested
199
+ - Adds hot water outputs (gallons) for clothes washer, dishwasher, fixtures, and distribution waste.
200
+ - Small improvement to calculation of component loads
201
+
202
+ __Bugfixes__
203
+ - Fixes possible simulation error for buildings with complex HVAC/duct systems.
204
+ - Fixes handling of infiltration induced by duct leakage imbalance (i.e., supply leakage != return leakage). Only affects ducts located in a vented crawlspace or vented attic.
205
+ - Fixes an unsuccessful simulation for buildings where the sum of multiple HVAC systems' fraction load served was slightly above 1 due to rounding.
206
+ - Small fix for interior partition wall thermal mass model.
207
+ - Skip building surfaces with areas that are extremely small.
208
+
209
+ ## OpenStudio-HPXML v0.8.0 Beta
210
+
211
+ __Breaking Changes__
212
+ - Weather cache files are now in .csv instead of .cache format.
213
+ - `extension/StandbyLoss` changed to `StandbyLoss` for indirect water heaters.
214
+ - `Site/extension/DisableNaturalVentilation` changed to `BuildingConstruction/extension/FractionofOperableWindowArea` for more granularity.
215
+
216
+ __New Features__
217
+ - Adds a SimulationOutputReport reporting measure that provides a variety of annual/timeseries outputs in CSV format.
218
+ - Allows modeling of whole-house fans to address cooling.
219
+ - Improved natural ventilation algorithm that reduces the potential for incurring additional heating energy.
220
+ - Optional `HotWaterTemperature` input for water heaters.
221
+ - Optional `CompressorType` input for air conditioners and air-source heat pumps.
222
+ - Allows specifying the EnergyPlus simulation timestep.
223
+ - Runtime performance improvements.
224
+ - Additional HPXML error-checking.
225
+
226
+ __Bugfixes__
227
+ - Fix for central fan integrated supply (CFIS) fan energy.
228
+ - Fix simulation error when `FractionHeatLoadServed` (or `FractionCoolLoadServed`) sums to slightly greater than 1.
229
+ - Fix for running simulations on a different drive (either local or remote network).
230
+ - Fix for HVAC sizing error when latitude is exactly 64 (Big Delta, Alaska).
231
+ - Fixes running simulations when there is no weather cache file.
232
+ - Fixes view factors when conditioned basement foundation walls have a window/door.
233
+ - Fixes weather file download.
234
+ - Allow a building with ceiling fans and without lighting.
235
+
236
+ ## OpenStudio-HPXML v0.7.0 Beta
237
+
238
+ - Initial beta release
@@ -2,11 +2,13 @@
2
2
 
3
3
  source 'http://rubygems.org'
4
4
 
5
+ gem 'nokogiri', '~> 1.10'
5
6
  gem 'oga'
7
+ gem 'schematron-nokogiri'
6
8
  gem 'rake'
7
9
  gem 'minitest', '~> 5.9'
8
10
  gem 'ci_reporter_minitest', '~> 1.0.0'
9
11
  gem 'simplecov'
10
- gem 'codecov'
12
+ gem 'codecov', '0.2.12'
11
13
  gem 'minitest-reporters'
12
- gem 'minitest-ci' # For CircleCI Automatic test metadata collection
14
+ gem 'parallel'
@@ -61,17 +61,28 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
61
61
  arg.setDescription('Absolute/relative path of the HPXML file.')
62
62
  args << arg
63
63
 
64
- arg = OpenStudio::Measure::OSArgument.makeStringArgument('output_dir', false)
64
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('output_dir', true)
65
65
  arg.setDisplayName('Directory for Output Files')
66
66
  arg.setDescription('Absolute/relative path for the output files directory.')
67
67
  args << arg
68
68
 
69
69
  arg = OpenStudio::Measure::OSArgument.makeBoolArgument('debug', false)
70
70
  arg.setDisplayName('Debug Mode?')
71
- arg.setDescription('If enabled: 1) Writes in.osm file, 2) Writes in.xml HPXML file with defaults populated, 3) Generates additional log output, and 4) Creates all EnergyPlus output files. Any files written will be in the output path specified above.')
71
+ arg.setDescription('If true: 1) Writes in.osm file, 2) Generates additional log output, and 3) Creates all EnergyPlus output files.')
72
72
  arg.setDefaultValue(false)
73
73
  args << arg
74
74
 
75
+ arg = OpenStudio::Measure::OSArgument.makeBoolArgument('skip_validation', false)
76
+ arg.setDisplayName('Skip Validation?')
77
+ 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.')
78
+ arg.setDefaultValue(false)
79
+ args << arg
80
+
81
+ arg = OpenStudio::Measure::OSArgument.makeStringArgument('building_id', false)
82
+ arg.setDisplayName('BuildingID')
83
+ arg.setDescription('The ID of the HPXML Building. Only required if there are multiple Building elements in the HPXML file.')
84
+ args << arg
85
+
75
86
  return args
76
87
  end
77
88
 
@@ -84,14 +95,16 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
84
95
  return false
85
96
  end
86
97
 
87
- tear_down_model(model, runner)
98
+ Geometry.tear_down_model(model, runner)
88
99
 
89
100
  Version.check_openstudio_version()
90
101
 
91
102
  # assign the user inputs to variables
92
103
  hpxml_path = runner.getStringArgumentValue('hpxml_path', user_arguments)
93
- output_dir = runner.getOptionalStringArgumentValue('output_dir', user_arguments)
104
+ output_dir = runner.getStringArgumentValue('output_dir', user_arguments)
94
105
  debug = runner.getBoolArgumentValue('debug', user_arguments)
106
+ skip_validation = runner.getBoolArgumentValue('skip_validation', user_arguments)
107
+ building_id = runner.getOptionalStringArgumentValue('building_id', user_arguments)
95
108
 
96
109
  unless (Pathname.new hpxml_path).absolute?
97
110
  hpxml_path = File.expand_path(File.join(File.dirname(__FILE__), hpxml_path))
@@ -100,19 +113,24 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
100
113
  fail "'#{hpxml_path}' does not exist or is not an .xml file."
101
114
  end
102
115
 
103
- if output_dir.is_initialized
104
- output_dir = output_dir.get
105
- unless (Pathname.new output_dir).absolute?
106
- output_dir = File.expand_path(File.join(File.dirname(__FILE__), output_dir))
107
- end
116
+ unless (Pathname.new output_dir).absolute?
117
+ output_dir = File.expand_path(File.join(File.dirname(__FILE__), output_dir))
118
+ end
119
+
120
+ if building_id.is_initialized
121
+ building_id = building_id.get
108
122
  else
109
- output_dir = nil
123
+ building_id = nil
110
124
  end
111
125
 
112
126
  begin
113
- stron_paths = [File.join(File.dirname(__FILE__), 'resources', 'HPXMLvalidator.xml'),
114
- File.join(File.dirname(__FILE__), 'resources', 'EPvalidator.xml')]
115
- hpxml = HPXML.new(hpxml_path: hpxml_path, schematron_validators: stron_paths)
127
+ if skip_validation
128
+ stron_paths = []
129
+ else
130
+ stron_paths = [File.join(File.dirname(__FILE__), 'resources', 'HPXMLvalidator.xml'),
131
+ File.join(File.dirname(__FILE__), 'resources', 'EPvalidator.xml')]
132
+ end
133
+ hpxml = HPXML.new(hpxml_path: hpxml_path, schematron_validators: stron_paths, building_id: building_id)
116
134
  hpxml.errors.each do |error|
117
135
  runner.registerError(error)
118
136
  end
@@ -121,9 +139,14 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
121
139
  end
122
140
  return false unless hpxml.errors.empty?
123
141
 
124
- epw_path, cache_path = process_weather(hpxml, runner, model, output_dir, hpxml_path)
142
+ epw_path, cache_path = process_weather(hpxml, runner, model, hpxml_path)
143
+
144
+ if debug
145
+ epw_output_path = File.join(output_dir, 'in.epw')
146
+ FileUtils.cp(epw_path, epw_output_path)
147
+ end
125
148
 
126
- OSModel.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir, debug)
149
+ OSModel.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir, building_id, debug)
127
150
  rescue Exception => e
128
151
  runner.registerError("#{e.message}\n#{e.backtrace.join("\n")}")
129
152
  return false
@@ -132,20 +155,7 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
132
155
  return true
133
156
  end
134
157
 
135
- def tear_down_model(model, runner)
136
- # Tear down the existing model if it exists
137
- has_existing_objects = (model.getThermalZones.size > 0)
138
- handles = OpenStudio::UUIDVector.new
139
- model.objects.each do |obj|
140
- handles << obj.handle
141
- end
142
- model.removeObjects(handles)
143
- if has_existing_objects
144
- runner.registerWarning('The model contains existing objects and is being reset.')
145
- end
146
- end
147
-
148
- def process_weather(hpxml, runner, model, output_dir, hpxml_path)
158
+ def process_weather(hpxml, runner, model, hpxml_path)
149
159
  epw_path = hpxml.climate_and_risk_zones.weather_station_epw_filepath
150
160
 
151
161
  if not File.exist? epw_path
@@ -185,7 +195,7 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
185
195
  end
186
196
 
187
197
  class OSModel
188
- def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir, debug)
198
+ def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir, building_id, debug)
189
199
  @hpxml = hpxml
190
200
  @debug = debug
191
201
 
@@ -199,14 +209,13 @@ class OSModel
199
209
  # Init
200
210
 
201
211
  weather, epw_file = Location.apply_weather_file(model, runner, epw_path, cache_path)
202
- check_for_errors()
203
- set_defaults_and_globals(runner, output_dir, epw_file)
212
+ set_defaults_and_globals(runner, output_dir, epw_file, weather)
204
213
  Location.apply(model, runner, weather, epw_file, @hpxml)
205
214
  add_simulation_params(model)
206
215
 
207
216
  @schedules_file = nil
208
- if not @hpxml.header.schedules_path.nil?
209
- @schedules_file = SchedulesFile.new(runner: runner, model: model, schedules_path: @hpxml.header.schedules_path, col_names: ScheduleGenerator.col_names)
217
+ unless @hpxml.header.schedules_path.nil?
218
+ @schedules_file = SchedulesFile.new(runner: runner, model: model, schedules_path: @hpxml.header.schedules_path, col_names: ScheduleGenerator.col_names.keys)
210
219
  end
211
220
 
212
221
  # Conditioned space/zone
@@ -222,7 +231,7 @@ class OSModel
222
231
  add_rim_joists(runner, model, spaces)
223
232
  add_frame_floors(runner, model, spaces)
224
233
  add_foundation_walls_slabs(runner, model, spaces)
225
- add_interior_shading_schedule(runner, model, weather)
234
+ add_shading_schedule(runner, model, weather)
226
235
  add_windows(runner, model, spaces, weather)
227
236
  add_doors(runner, model, spaces)
228
237
  add_skylights(runner, model, spaces, weather)
@@ -235,12 +244,11 @@ class OSModel
235
244
 
236
245
  # HVAC
237
246
 
238
- update_shared_hvac_systems()
239
247
  add_ideal_system(runner, model, spaces, epw_path)
240
248
  add_cooling_system(runner, model, spaces)
241
249
  add_heating_system(runner, model, spaces)
242
250
  add_heat_pump(runner, model, weather, spaces)
243
- add_dehumidifier(runner, model, spaces)
251
+ add_dehumidifiers(runner, model, spaces)
244
252
  add_residual_ideal_system(runner, model, spaces)
245
253
  add_ceiling_fans(runner, model, weather, spaces)
246
254
 
@@ -260,10 +268,9 @@ class OSModel
260
268
  # Other
261
269
 
262
270
  add_airflow(runner, model, weather, spaces)
263
- add_hvac_sizing(runner, model, weather, spaces)
264
271
  add_photovoltaics(runner, model)
265
272
  add_generators(runner, model)
266
- add_additional_properties(runner, model, hpxml_path)
273
+ add_additional_properties(runner, model, hpxml_path, building_id)
267
274
 
268
275
  # Output
269
276
 
@@ -273,9 +280,11 @@ class OSModel
273
280
  # add_ems_debug_output(runner, model)
274
281
 
275
282
  # Vacancy
276
- set_vacancy(runner, model)
283
+ unless @schedules_file.nil?
284
+ @schedules_file.set_vacancy
285
+ end
277
286
 
278
- if debug && (not output_dir.nil?)
287
+ if debug
279
288
  osm_output_path = File.join(output_dir, 'in.osm')
280
289
  File.write(osm_output_path, model.to_s)
281
290
  runner.registerInfo("Wrote file: #{osm_output_path}")
@@ -284,80 +293,7 @@ class OSModel
284
293
 
285
294
  private
286
295
 
287
- def self.check_for_errors()
288
- # Conditioned space
289
- location = HPXML::LocationLivingSpace
290
- if (@hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size +
291
- @hpxml.frame_floors.select { |s| s.is_ceiling && (s.interior_adjacent_to == location) }.size) == 0
292
- fail 'There must be at least one ceiling/roof adjacent to conditioned space.'
293
- end
294
- if @hpxml.walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size == 0
295
- fail 'There must be at least one exterior wall adjacent to conditioned space.'
296
- end
297
- if (@hpxml.slabs.select { |s| [location, HPXML::LocationBasementConditioned].include? s.interior_adjacent_to }.size +
298
- @hpxml.frame_floors.select { |s| s.is_floor && (s.interior_adjacent_to == location) }.size) == 0
299
- fail 'There must be at least one floor/slab adjacent to conditioned space.'
300
- end
301
-
302
- # Basement/Crawlspace
303
- [HPXML::LocationBasementConditioned,
304
- HPXML::LocationBasementUnconditioned,
305
- HPXML::LocationCrawlspaceVented,
306
- HPXML::LocationCrawlspaceUnvented].each do |location|
307
- next unless @hpxml.has_space_type(location)
308
-
309
- if location != HPXML::LocationBasementConditioned # HPXML file doesn't need to have FrameFloor between living and conditioned basement
310
- if @hpxml.frame_floors.select { |s| s.is_floor && (s.interior_adjacent_to == HPXML::LocationLivingSpace) && (s.exterior_adjacent_to == location) }.size == 0
311
- fail "There must be at least one ceiling adjacent to #{location}."
312
- end
313
- end
314
- if @hpxml.foundation_walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size == 0
315
- fail "There must be at least one exterior foundation wall adjacent to #{location}."
316
- end
317
- if @hpxml.slabs.select { |s| s.interior_adjacent_to == location }.size == 0
318
- fail "There must be at least one slab adjacent to #{location}."
319
- end
320
- end
321
-
322
- # Garage
323
- location = HPXML::LocationGarage
324
- if @hpxml.has_space_type(location)
325
- if (@hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size +
326
- @hpxml.frame_floors.select { |s| [s.interior_adjacent_to, s.exterior_adjacent_to].include? location }.size) == 0
327
- fail "There must be at least one roof/ceiling adjacent to #{location}."
328
- end
329
- if (@hpxml.walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size +
330
- @hpxml.foundation_walls.select { |s| [s.interior_adjacent_to, s.exterior_adjacent_to].include?(location) && s.is_exterior }.size) == 0
331
- fail "There must be at least one exterior wall/foundation wall adjacent to #{location}."
332
- end
333
- if @hpxml.slabs.select { |s| s.interior_adjacent_to == location }.size == 0
334
- fail "There must be at least one slab adjacent to #{location}."
335
- end
336
- end
337
-
338
- # Attic
339
- [HPXML::LocationAtticVented,
340
- HPXML::LocationAtticUnvented].each do |location|
341
- next unless @hpxml.has_space_type(location)
342
-
343
- if @hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size == 0
344
- fail "There must be at least one roof adjacent to #{location}."
345
- end
346
-
347
- if @hpxml.frame_floors.select { |s| s.is_ceiling && [s.interior_adjacent_to, s.exterior_adjacent_to].include?(location) }.size == 0
348
- fail "There must be at least one floor adjacent to #{location}."
349
- end
350
- end
351
-
352
- # Error-checking from RESNET Pub 002: Number of bedrooms
353
- nbeds = @hpxml.building_construction.number_of_bedrooms
354
- nbeds_limit = (@hpxml.building_construction.conditioned_floor_area - 120.0) / 70.0
355
- if nbeds > nbeds_limit
356
- fail "Number of bedrooms (#{nbeds}) exceeds limit of (CFA-120)/70=#{nbeds_limit.round(1)}."
357
- end
358
- end
359
-
360
- def self.set_defaults_and_globals(runner, output_dir, epw_file)
296
+ def self.set_defaults_and_globals(runner, output_dir, epw_file, weather)
361
297
  # Initialize
362
298
  @remaining_heat_load_frac = 1.0
363
299
  @remaining_cool_load_frac = 1.0
@@ -370,25 +306,20 @@ class OSModel
370
306
  @ncfl = @hpxml.building_construction.number_of_conditioned_floors
371
307
  @ncfl_ag = @hpxml.building_construction.number_of_conditioned_floors_above_grade
372
308
  @nbeds = @hpxml.building_construction.number_of_bedrooms
373
- @min_neighbor_distance = get_min_neighbor_distance()
374
309
  @default_azimuths = get_default_azimuths()
375
- @has_uncond_bsmnt = @hpxml.has_space_type(HPXML::LocationBasementUnconditioned)
376
-
377
- if @hpxml.building_construction.use_only_ideal_air_system.nil?
378
- @hpxml.building_construction.use_only_ideal_air_system = false
379
- end
380
310
 
381
311
  # Apply defaults to HPXML object
382
- HPXMLDefaults.apply(@hpxml, @cfa, @nbeds, @ncfl, @ncfl_ag, @has_uncond_bsmnt, @eri_version, epw_file, runner)
312
+ HPXMLDefaults.apply(@hpxml, @eri_version, weather, epw_file)
383
313
 
384
314
  @frac_windows_operable = @hpxml.fraction_of_windows_operable()
385
315
 
386
- if @debug && (not output_dir.nil?)
387
- # Write updated HPXML object to file
388
- hpxml_defaults_path = File.join(output_dir, 'in.xml')
389
- XMLHelper.write_file(@hpxml.to_oga, hpxml_defaults_path)
390
- runner.registerInfo("Wrote file: #{hpxml_defaults_path}")
391
- end
316
+ # Write updated HPXML object (w/ defaults) to file for inspection
317
+ hpxml_defaults_path = File.join(output_dir, 'in.xml')
318
+ XMLHelper.write_file(@hpxml.to_oga, hpxml_defaults_path)
319
+
320
+ # Now that we've written in.xml, ensure that no capacities/airflows
321
+ # are zero in order to prevent potential E+ errors.
322
+ HVAC.ensure_nonzero_sizing_values(@hpxml)
392
323
  end
393
324
 
394
325
  def self.add_simulation_params(model)
@@ -437,7 +368,6 @@ class OSModel
437
368
 
438
369
  def self.explode_surfaces(runner, model)
439
370
  # Re-position surfaces so as to not shade each other and to make it easier to visualize the building.
440
- # FUTURE: Might be able to use the new self-shading options in E+ 8.9 ShadowCalculation object instead?
441
371
 
442
372
  gap_distance = UnitConversions.convert(10.0, 'ft', 'm') # distance between surfaces of the same azimuth
443
373
  rad90 = UnitConversions.convert(90, 'deg', 'rad')
@@ -490,10 +420,10 @@ class OSModel
490
420
  end
491
421
 
492
422
  # Explode neighbors
493
- model.getShadingSurfaceGroups.each do |shading_surface_group|
494
- next if shading_surface_group.name.to_s != Constants.ObjectNameNeighbors
423
+ model.getShadingSurfaceGroups.each do |shading_group|
424
+ next unless shading_group.name.to_s == Constants.ObjectNameNeighbors
495
425
 
496
- shading_surface_group.shadingSurfaces.each do |shading_surface|
426
+ shading_group.shadingSurfaces.each do |shading_surface|
497
427
  azimuth = shading_surface.additionalProperties.getFeatureAsInteger('Azimuth').get
498
428
  azimuth_rad = UnitConversions.convert(azimuth, 'deg', 'rad')
499
429
  distance = shading_surface.additionalProperties.getFeatureAsDouble('Distance').get
@@ -523,6 +453,28 @@ class OSModel
523
453
  azimuth = surface.additionalProperties.getFeatureAsInteger('Azimuth').get
524
454
  azimuth_rad = UnitConversions.convert(azimuth, 'deg', 'rad')
525
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
+
526
478
  # Push out horizontally
527
479
  distance = explode_distance
528
480
 
@@ -533,40 +485,28 @@ class OSModel
533
485
  distance -= 0.5 * Math.cos(Math.atan(tilt)) * width
534
486
  end
535
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
536
489
 
537
- surface.setVertices(transformation * surface.vertices)
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
538
496
  if surface.adjacentSurface.is_initialized
539
497
  surface.adjacentSurface.get.setVertices(transformation * surface.adjacentSurface.get.vertices)
540
498
  end
541
- surface.subSurfaces.each do |subsurface|
542
- subsurface.setVertices(transformation * subsurface.vertices)
543
- next unless subsurface.subSurfaceType.downcase == 'fixedwindow'
544
-
545
- subsurface.shadingSurfaceGroups.each do |overhang_group|
546
- overhang_group.shadingSurfaces.each do |overhang|
547
- overhang.setVertices(transformation * overhang.vertices)
548
- end
549
- end
550
- end
551
499
 
552
- # Shift at 90-degrees to previous transformation
500
+ # Shift at 90-degrees to previous transformation, so surfaces don't overlap and shade each other
553
501
  azimuth_side_shifts[azimuth] -= surface.additionalProperties.getFeatureAsDouble('Length').get / 2.0
554
502
  transformation_shift = get_surface_transformation(azimuth_side_shifts[azimuth], Math::sin(azimuth_rad + rad90), Math::cos(azimuth_rad + rad90), 0)
555
503
 
556
- surface.setVertices(transformation_shift * surface.vertices)
504
+ ([surface] + surface.subSurfaces + overhang_surfaces + shading_surfaces).each do |s|
505
+ s.setVertices(transformation_shift * s.vertices)
506
+ end
557
507
  if surface.adjacentSurface.is_initialized
558
508
  surface.adjacentSurface.get.setVertices(transformation_shift * surface.adjacentSurface.get.vertices)
559
509
  end
560
- surface.subSurfaces.each do |subsurface|
561
- subsurface.setVertices(transformation_shift * subsurface.vertices)
562
- next unless subsurface.subSurfaceType.downcase == 'fixedwindow'
563
-
564
- subsurface.shadingSurfaceGroups.each do |overhang_group|
565
- overhang_group.shadingSurfaces.each do |overhang|
566
- overhang.setVertices(transformation_shift * overhang.vertices)
567
- end
568
- end
569
- end
570
510
 
571
511
  azimuth_side_shifts[azimuth] -= (surface.additionalProperties.getFeatureAsDouble('Length').get / 2.0 + gap_distance)
572
512
 
@@ -576,6 +516,16 @@ class OSModel
576
516
 
577
517
  def self.update_conditioned_basement(runner, model, spaces)
578
518
  return if @cond_bsmnt_surfaces.empty?
519
+ # Update @cond_bsmnt_surfaces to include subsurfaces
520
+ new_cond_bsmnt_surfaces = @cond_bsmnt_surfaces.dup
521
+ @cond_bsmnt_surfaces.each do |cond_bsmnt_surface|
522
+ next if cond_bsmnt_surface.is_a? OpenStudio::Model::InternalMassDefinition
523
+ next if cond_bsmnt_surface.subSurfaces.empty?
524
+ cond_bsmnt_surface.subSurfaces.each do |ss|
525
+ new_cond_bsmnt_surfaces << ss
526
+ end
527
+ end
528
+ @cond_bsmnt_surfaces = new_cond_bsmnt_surfaces.dup
579
529
 
580
530
  update_solar_absorptances(runner, model)
581
531
  assign_view_factors(runner, model, spaces)
@@ -584,7 +534,18 @@ class OSModel
584
534
  def self.update_solar_absorptances(runner, model)
585
535
  # modify conditioned basement surface properties
586
536
  # zero out interior solar absorptance in conditioned basement
537
+
587
538
  @cond_bsmnt_surfaces.each do |cond_bsmnt_surface|
539
+ # skip windows because windows don't have such property to change.
540
+ next if cond_bsmnt_surface.is_a?(OpenStudio::Model::SubSurface) && (cond_bsmnt_surface.subSurfaceType.downcase == 'fixedwindow')
541
+ adj_surface = nil
542
+ if not cond_bsmnt_surface.is_a? OpenStudio::Model::InternalMassDefinition
543
+ if not cond_bsmnt_surface.is_a? OpenStudio::Model::SubSurface
544
+ adj_surface = cond_bsmnt_surface.adjacentSurface.get if cond_bsmnt_surface.adjacentSurface.is_initialized
545
+ else
546
+ adj_surface = cond_bsmnt_surface.adjacentSubSurface.get if cond_bsmnt_surface.adjacentSubSurface.is_initialized
547
+ end
548
+ end
588
549
  const = cond_bsmnt_surface.construction.get
589
550
  layered_const = const.to_LayeredConstruction.get
590
551
  innermost_material = layered_const.layers[layered_const.numLayers() - 1].to_StandardOpaqueMaterial.get
@@ -614,6 +575,12 @@ class OSModel
614
575
  innermost_material = layered_const.layers[layered_const.numLayers() - 1].to_StandardOpaqueMaterial.get
615
576
  innermost_material.setSolarAbsorptance(0.0)
616
577
  innermost_material.setVisibleAbsorptance(0.0)
578
+ next if adj_surface.nil?
579
+ # Create new construction in case of shared construciton.
580
+ layered_const_adj = OpenStudio::Model::Construction.new(model)
581
+ layered_const_adj.setName(cond_bsmnt_surface.construction.get.name.get + ' Reversed Bsmnt')
582
+ adj_surface.setConstruction(layered_const_adj)
583
+ layered_const_adj.setLayers(cond_bsmnt_surface.construction.get.to_LayeredConstruction.get.layers.reverse())
617
584
  end
618
585
  end
619
586
 
@@ -635,8 +602,7 @@ class OSModel
635
602
 
636
603
  all_surfaces.each do |surface|
637
604
  if @cond_bsmnt_surfaces.include?(surface) ||
638
- ((@cond_bsmnt_surfaces.include? surface.internalMassDefinition) if surface.is_a? OpenStudio::Model::InternalMass) ||
639
- ((@cond_bsmnt_surfaces.include? surface.surface.get) if surface.is_a? OpenStudio::Model::SubSurface)
605
+ ((@cond_bsmnt_surfaces.include? surface.internalMassDefinition) if surface.is_a? OpenStudio::Model::InternalMass)
640
606
  cond_base_surfaces << surface
641
607
  else
642
608
  lv_surfaces << surface
@@ -902,19 +868,9 @@ class OSModel
902
868
  def self.add_num_occupants(model, runner, spaces)
903
869
  # Occupants
904
870
  num_occ = @hpxml.building_occupancy.number_of_residents
905
- if num_occ > 0
906
- occ_gain, hrs_per_day, sens_frac, lat_frac = Geometry.get_occupancy_default_values()
907
- weekday_sch = Schedule.OccupantsWeekdayFractions
908
- weekday_sch_sum = weekday_sch.split(',').map(&:to_f).sum(0.0)
909
- if (weekday_sch_sum - hrs_per_day).abs > 0.1
910
- fail 'Occupancy schedule inconsistent with hrs_per_day.'
911
- end
871
+ return if num_occ <= 0
912
872
 
913
- weekend_sch = Schedule.OccupantsWeekendFractions
914
- monthly_sch = Schedule.OccupantsMonthlyMultipliers
915
-
916
- Geometry.process_occupants(model, num_occ, occ_gain, sens_frac, lat_frac, weekday_sch, weekend_sch, monthly_sch, @cfa, @nbeds, spaces[HPXML::LocationLivingSpace], @schedules_file)
917
- end
873
+ Geometry.process_occupants(model, num_occ, @cfa, spaces[HPXML::LocationLivingSpace], @schedules_file)
918
874
  end
919
875
 
920
876
  def self.get_default_azimuths()
@@ -1022,14 +978,14 @@ class OSModel
1022
978
 
1023
979
  if roof.is_thermal_boundary
1024
980
  constr_sets = [
981
+ WoodStudConstructionSet.new(Material.Stud2x(8.0), 0.07, 20.0, 0.75, 0.5, mat_roofing), # 2x8, 24" o.c. + R20
1025
982
  WoodStudConstructionSet.new(Material.Stud2x(8.0), 0.07, 10.0, 0.75, 0.5, mat_roofing), # 2x8, 24" o.c. + R10
1026
- WoodStudConstructionSet.new(Material.Stud2x(8.0), 0.07, 5.0, 0.75, 0.5, mat_roofing), # 2x8, 24" o.c. + R5
1027
983
  WoodStudConstructionSet.new(Material.Stud2x(8.0), 0.07, 0.0, 0.75, 0.5, mat_roofing), # 2x8, 24" o.c.
1028
984
  WoodStudConstructionSet.new(Material.Stud2x6, 0.07, 0.0, 0.75, 0.5, mat_roofing), # 2x6, 24" o.c.
1029
985
  WoodStudConstructionSet.new(Material.Stud2x4, 0.07, 0.0, 0.5, 0.5, mat_roofing), # 2x4, 16" o.c.
1030
986
  WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, 0.0, mat_roofing), # Fallback
1031
987
  ]
1032
- match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, roof.id)
988
+ match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, roof.id)
1033
989
 
1034
990
  Constructions.apply_closed_cavity_roof(runner, model, surfaces, "#{roof.id} construction",
1035
991
  cavity_r, install_grade,
@@ -1045,7 +1001,7 @@ class OSModel
1045
1001
  GenericConstructionSet.new(0.0, 0.5, 0.0, mat_roofing), # Standard
1046
1002
  GenericConstructionSet.new(0.0, 0.0, 0.0, mat_roofing), # Fallback
1047
1003
  ]
1048
- match, constr_set, layer_r = pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, roof.id)
1004
+ match, constr_set, layer_r = Constructions.pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, roof.id)
1049
1005
 
1050
1006
  cavity_r = 0
1051
1007
  cavity_ins_thick_in = 0
@@ -1059,7 +1015,7 @@ class OSModel
1059
1015
  mat_roofing, has_radiant_barrier,
1060
1016
  inside_film, outside_film, radiant_barrier_grade)
1061
1017
  end
1062
- check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
1018
+ Constructions.check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
1063
1019
  end
1064
1020
  end
1065
1021
 
@@ -1128,8 +1084,8 @@ class OSModel
1128
1084
  outside_film = Material.AirFilmOutsideASHRAE140
1129
1085
  end
1130
1086
 
1131
- apply_wall_construction(runner, model, surfaces, wall, wall.id, wall.wall_type, wall.insulation_assembly_r_value,
1132
- drywall_thick_in, inside_film, outside_film, mat_ext_finish)
1087
+ Constructions.apply_wall_construction(runner, model, surfaces, wall, wall.id, wall.wall_type, wall.insulation_assembly_r_value,
1088
+ drywall_thick_in, inside_film, outside_film, mat_ext_finish)
1133
1089
  end
1134
1090
  end
1135
1091
 
@@ -1191,12 +1147,12 @@ class OSModel
1191
1147
  assembly_r = rim_joist.insulation_assembly_r_value
1192
1148
 
1193
1149
  constr_sets = [
1150
+ WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.17, 20.0, 2.0, drywall_thick_in, mat_ext_finish), # 2x4 + R20
1194
1151
  WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.17, 10.0, 2.0, drywall_thick_in, mat_ext_finish), # 2x4 + R10
1195
- WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.17, 5.0, 2.0, drywall_thick_in, mat_ext_finish), # 2x4 + R5
1196
1152
  WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.17, 0.0, 2.0, drywall_thick_in, mat_ext_finish), # 2x4
1197
1153
  WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.01, 0.0, 0.0, 0.0, mat_ext_finish), # Fallback
1198
1154
  ]
1199
- match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, rim_joist.id)
1155
+ match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, rim_joist.id)
1200
1156
  install_grade = 1
1201
1157
 
1202
1158
  Constructions.apply_rim_joist(runner, model, surfaces, rim_joist, "#{rim_joist.id} construction",
@@ -1204,7 +1160,7 @@ class OSModel
1204
1160
  constr_set.drywall_thick_in, constr_set.osb_thick_in,
1205
1161
  constr_set.rigid_r, constr_set.exterior_material,
1206
1162
  inside_film, outside_film)
1207
- check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
1163
+ Constructions.check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
1208
1164
  end
1209
1165
  end
1210
1166
 
@@ -1272,6 +1228,7 @@ class OSModel
1272
1228
  end
1273
1229
  end
1274
1230
  constr_sets = [
1231
+ WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 20.0, 0.75, 0.0, covering), # 2x6, 24" o.c. + R20
1275
1232
  WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 10.0, 0.75, 0.0, covering), # 2x6, 24" o.c. + R10
1276
1233
  WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 0.0, 0.75, 0.0, covering), # 2x6, 24" o.c.
1277
1234
  WoodStudConstructionSet.new(Material.Stud2x4, 0.13, 0.0, 0.5, 0.0, covering), # 2x4, 16" o.c.
@@ -1280,7 +1237,7 @@ class OSModel
1280
1237
  end
1281
1238
  assembly_r = frame_floor.insulation_assembly_r_value
1282
1239
 
1283
- match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, frame_floor.id)
1240
+ match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, frame_floor.id)
1284
1241
 
1285
1242
  install_grade = 1
1286
1243
  if frame_floor.is_ceiling
@@ -1298,7 +1255,7 @@ class OSModel
1298
1255
  constr_set.exterior_material, inside_film, outside_film)
1299
1256
  end
1300
1257
 
1301
- check_surface_assembly_rvalue(runner, [surface], inside_film, outside_film, assembly_r, match)
1258
+ Constructions.check_surface_assembly_rvalue(runner, [surface], inside_film, outside_film, assembly_r, match)
1302
1259
  end
1303
1260
  end
1304
1261
 
@@ -1319,6 +1276,7 @@ class OSModel
1319
1276
  next unless slab.interior_adjacent_to == foundation_type
1320
1277
 
1321
1278
  slabs << slab
1279
+ slab.exposed_perimeter = [slab.exposed_perimeter, 1.0].max # minimum value to prevent error if no exposed slab
1322
1280
  end
1323
1281
 
1324
1282
  # Calculate combinations of slabs/walls for each Kiva instance
@@ -1444,8 +1402,8 @@ class OSModel
1444
1402
  end
1445
1403
  mat_ext_finish = nil
1446
1404
 
1447
- apply_wall_construction(runner, model, [surface], foundation_wall, foundation_wall.id, wall_type, assembly_r,
1448
- drywall_thick_in, inside_film, outside_film, mat_ext_finish)
1405
+ Constructions.apply_wall_construction(runner, model, [surface], foundation_wall, foundation_wall.id, wall_type, assembly_r,
1406
+ drywall_thick_in, inside_film, outside_film, mat_ext_finish)
1449
1407
  end
1450
1408
  end
1451
1409
  end
@@ -1528,7 +1486,7 @@ class OSModel
1528
1486
  ext_rigid_r, int_rigid_r, drywall_thick_in, concrete_thick_in, height_ag)
1529
1487
 
1530
1488
  if not assembly_r.nil?
1531
- check_surface_assembly_rvalue(runner, [surface], inside_film, nil, assembly_r, match)
1489
+ Constructions.check_surface_assembly_rvalue(runner, [surface], inside_film, nil, assembly_r, match)
1532
1490
  end
1533
1491
 
1534
1492
  return surface.adjacentFoundation.get
@@ -1613,9 +1571,7 @@ class OSModel
1613
1571
 
1614
1572
  addtl_cfa = @cfa - sum_cfa
1615
1573
 
1616
- if addtl_cfa < -1.0 # Allow some rounding
1617
- fail "Sum of floor/slab area adjacent to conditioned space (#{sum_cfa.round(1)}) is greater than conditioned floor area (#{@cfa.round(1)})."
1618
- end
1574
+ fail if addtl_cfa < -1.0 # Allow some rounding; EPvalidator.xml should prevent this
1619
1575
 
1620
1576
  return unless addtl_cfa > 1.0 # Allow some rounding
1621
1577
 
@@ -1704,17 +1660,14 @@ class OSModel
1704
1660
  end
1705
1661
  end
1706
1662
 
1707
- def self.add_interior_shading_schedule(runner, model, weather)
1708
- heating_season, cooling_season = HVAC.get_default_heating_and_cooling_seasons(weather)
1709
- @clg_season_sch = MonthWeekdayWeekendSchedule.new(model, 'cooling season schedule', Array.new(24, 1), Array.new(24, 1), cooling_season, Constants.ScheduleTypeLimitsFraction)
1710
-
1711
- # Create heating season as opposite of cooling season (i.e., with overlap months)
1712
- non_cooling_season = cooling_season.map { |m| (m - 1).abs }
1713
- @htg_season_sch = MonthWeekdayWeekendSchedule.new(model, 'heating season schedule', Array.new(24, 1), Array.new(24, 1), non_cooling_season, Constants.ScheduleTypeLimitsFraction)
1663
+ def self.add_shading_schedule(runner, model, weather)
1664
+ heating_season, @cooling_season = HVAC.get_default_heating_and_cooling_seasons(weather)
1714
1665
 
1666
+ # Create cooling season schedule
1667
+ clg_season_sch = MonthWeekdayWeekendSchedule.new(model, 'cooling season schedule', Array.new(24, 1), Array.new(24, 1), @cooling_season, Constants.ScheduleTypeLimitsFraction)
1715
1668
  @clg_ssn_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value')
1716
1669
  @clg_ssn_sensor.setName('cool_season')
1717
- @clg_ssn_sensor.setKeyName(@clg_season_sch.schedule.name.to_s)
1670
+ @clg_ssn_sensor.setKeyName(clg_season_sch.schedule.name.to_s)
1718
1671
  end
1719
1672
 
1720
1673
  def self.add_windows(runner, model, spaces, weather)
@@ -1727,12 +1680,15 @@ class OSModel
1727
1680
  end
1728
1681
  @hpxml.collapse_enclosure_surfaces()
1729
1682
 
1683
+ shading_group = nil
1684
+ shading_schedules = {}
1685
+
1730
1686
  surfaces = []
1731
1687
  @hpxml.windows.each do |window|
1732
1688
  window_height = 4.0 # ft, default
1733
1689
 
1734
1690
  overhang_depth = nil
1735
- if not window.overhangs_depth.nil?
1691
+ if (not window.overhangs_depth.nil?) && (window.overhangs_depth > 0)
1736
1692
  overhang_depth = window.overhangs_depth
1737
1693
  overhang_distance_to_top = window.overhangs_distance_to_top_of_window
1738
1694
  overhang_distance_to_bottom = window.overhangs_distance_to_bottom_of_window
@@ -1771,11 +1727,11 @@ class OSModel
1771
1727
  end
1772
1728
 
1773
1729
  # Apply construction
1774
- cool_shade_mult = window.interior_shading_factor_summer
1775
- heat_shade_mult = window.interior_shading_factor_winter
1776
- Constructions.apply_window(runner, model, sub_surface, 'WindowConstruction',
1777
- weather, @htg_season_sch, @clg_season_sch, window.ufactor, window.shgc,
1778
- heat_shade_mult, cool_shade_mult)
1730
+ Constructions.apply_window(runner, model, sub_surface, 'WindowConstruction', window.ufactor, window.shgc)
1731
+
1732
+ # 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)
1779
1735
  else
1780
1736
  # Window is on an interior surface, which E+ does not allow. Model
1781
1737
  # as a door instead so that we can get the appropriate conduction
@@ -1814,6 +1770,10 @@ class OSModel
1814
1770
 
1815
1771
  def self.add_skylights(runner, model, spaces, weather)
1816
1772
  surfaces = []
1773
+
1774
+ shading_group = nil
1775
+ shading_schedules = {}
1776
+
1817
1777
  @hpxml.skylights.each do |skylight|
1818
1778
  tilt = skylight.roof.pitch / 12.0
1819
1779
  width = Math::sqrt(skylight.area)
@@ -1842,18 +1802,53 @@ class OSModel
1842
1802
  sub_surface.setSubSurfaceType('Skylight')
1843
1803
 
1844
1804
  # Apply construction
1845
- ufactor = skylight.ufactor
1846
- shgc = skylight.shgc
1847
- cool_shade_mult = skylight.interior_shading_factor_summer
1848
- heat_shade_mult = skylight.interior_shading_factor_winter
1849
- Constructions.apply_skylight(runner, model, sub_surface, 'SkylightConstruction',
1850
- weather, @htg_season_sch, @clg_season_sch, ufactor, shgc,
1851
- heat_shade_mult, cool_shade_mult)
1805
+ Constructions.apply_skylight(runner, model, sub_surface, 'SkylightConstruction', skylight.ufactor, skylight.shgc)
1806
+
1807
+ # 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)
1852
1810
  end
1853
1811
 
1854
1812
  apply_adiabatic_construction(runner, model, surfaces, 'roof')
1855
1813
  end
1856
1814
 
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
+
1857
1852
  def self.add_doors(runner, model, spaces)
1858
1853
  surfaces = []
1859
1854
  @hpxml.doors.each do |door|
@@ -1958,10 +1953,11 @@ class OSModel
1958
1953
  end
1959
1954
 
1960
1955
  # Water Heater
1956
+ has_uncond_bsmnt = @hpxml.has_space_type(HPXML::LocationBasementUnconditioned)
1961
1957
  @hpxml.water_heating_systems.each do |water_heating_system|
1962
1958
  loc_space, loc_schedule = get_space_or_schedule_from_location(water_heating_system.location, 'WaterHeatingSystem', model, spaces)
1963
1959
 
1964
- ec_adj = HotWaterAndAppliances.get_dist_energy_consumption_adjustment(@has_uncond_bsmnt, @cfa, @ncfl, water_heating_system, hot_water_distribution)
1960
+ ec_adj = HotWaterAndAppliances.get_dist_energy_consumption_adjustment(has_uncond_bsmnt, @cfa, @ncfl, water_heating_system, hot_water_distribution)
1965
1961
 
1966
1962
  if water_heating_system.water_heater_type == HPXML::WaterHeaterTypeStorage
1967
1963
 
@@ -1993,11 +1989,7 @@ class OSModel
1993
1989
  end
1994
1990
 
1995
1991
  # Hot water fixtures and appliances
1996
- HotWaterAndAppliances.apply(model, runner, weather, spaces[HPXML::LocationLivingSpace],
1997
- @cfa, @nbeds, @ncfl, @has_uncond_bsmnt, @hpxml.clothes_washers,
1998
- @hpxml.clothes_dryers, @hpxml.dishwashers, @hpxml.refrigerators,
1999
- @hpxml.freezers, @hpxml.cooking_ranges, @hpxml.ovens, @hpxml.water_heating,
2000
- @hpxml.water_heating_systems, hot_water_distribution, @hpxml.water_fixtures,
1992
+ HotWaterAndAppliances.apply(model, runner, @hpxml, weather, spaces, hot_water_distribution,
2001
1993
  solar_thermal_system, @eri_version, @dhw_map, @schedules_file)
2002
1994
 
2003
1995
  if (not solar_thermal_system.nil?) && (not solar_thermal_system.collector_area.nil?) # Detailed solar water heater
@@ -2009,33 +2001,19 @@ class OSModel
2009
2001
  Waterheater.apply_combi_system_EMS(model, @dhw_map, @hpxml.water_heating_systems)
2010
2002
  end
2011
2003
 
2012
- def self.is_central_air_conditioner_and_furnace(heating_system, cooling_system)
2013
- if not (@hpxml.heating_systems.include?(heating_system) && (heating_system.heating_system_type == HPXML::HVACTypeFurnace))
2014
- return false
2015
- end
2016
- if not (@hpxml.cooling_systems.include?(cooling_system) && (cooling_system.cooling_system_type == HPXML::HVACTypeCentralAirConditioner))
2017
- return false
2018
- end
2019
-
2020
- return true
2021
- end
2022
-
2023
- def self.update_shared_hvac_systems()
2024
- HVAC.apply_shared_systems(@hpxml)
2025
- end
2026
-
2027
2004
  def self.add_cooling_system(runner, model, spaces)
2028
2005
  living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
2029
2006
 
2030
- @hpxml.cooling_systems.each do |cooling_system|
2031
- check_distribution_system(cooling_system.distribution_system, cooling_system.cooling_system_type)
2007
+ HVAC.get_hpxml_hvac_systems(@hpxml).each do |hvac_system|
2008
+ next if hvac_system[:cooling].nil?
2009
+ next unless hvac_system[:cooling].is_a? HPXML::CoolingSystem
2032
2010
 
2033
- if cooling_system.cooling_system_type == HPXML::HVACTypeCentralAirConditioner
2011
+ cooling_system = hvac_system[:cooling]
2012
+ heating_system = hvac_system[:heating]
2034
2013
 
2035
- heating_system = cooling_system.attached_heating_system
2036
- if not is_central_air_conditioner_and_furnace(heating_system, cooling_system)
2037
- heating_system = nil
2038
- end
2014
+ check_distribution_system(cooling_system.distribution_system, cooling_system.cooling_system_type)
2015
+
2016
+ if [HPXML::HVACTypeCentralAirConditioner].include? cooling_system.cooling_system_type
2039
2017
 
2040
2018
  HVAC.apply_central_air_conditioner_furnace(model, runner, cooling_system, heating_system,
2041
2019
  @remaining_cool_load_frac, @remaining_heat_load_frac,
@@ -2045,19 +2023,19 @@ class OSModel
2045
2023
  @remaining_heat_load_frac -= heating_system.fraction_heat_load_served
2046
2024
  end
2047
2025
 
2048
- elsif cooling_system.cooling_system_type == HPXML::HVACTypeRoomAirConditioner
2026
+ elsif [HPXML::HVACTypeRoomAirConditioner].include? cooling_system.cooling_system_type
2049
2027
 
2050
2028
  HVAC.apply_room_air_conditioner(model, runner, cooling_system,
2051
2029
  @remaining_cool_load_frac, living_zone,
2052
2030
  @hvac_map)
2053
2031
 
2054
- elsif cooling_system.cooling_system_type == HPXML::HVACTypeEvaporativeCooler
2032
+ elsif [HPXML::HVACTypeEvaporativeCooler].include? cooling_system.cooling_system_type
2055
2033
 
2056
2034
  HVAC.apply_evaporative_cooler(model, runner, cooling_system,
2057
2035
  @remaining_cool_load_frac, living_zone,
2058
2036
  @hvac_map)
2059
2037
 
2060
- elsif cooling_system.cooling_system_type == HPXML::HVACTypeMiniSplitAirConditioner
2038
+ elsif [HPXML::HVACTypeMiniSplitAirConditioner].include? cooling_system.cooling_system_type
2061
2039
 
2062
2040
  HVAC.apply_mini_split_air_conditioner(model, runner, cooling_system,
2063
2041
  @remaining_cool_load_frac,
@@ -2071,13 +2049,18 @@ class OSModel
2071
2049
  def self.add_heating_system(runner, model, spaces)
2072
2050
  living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
2073
2051
 
2074
- @hpxml.heating_systems.each do |heating_system|
2052
+ HVAC.get_hpxml_hvac_systems(@hpxml).each do |hvac_system|
2053
+ next if hvac_system[:heating].nil?
2054
+ next unless hvac_system[:heating].is_a? HPXML::HeatingSystem
2055
+
2056
+ cooling_system = hvac_system[:cooling]
2057
+ heating_system = hvac_system[:heating]
2058
+
2075
2059
  check_distribution_system(heating_system.distribution_system, heating_system.heating_system_type)
2076
2060
 
2077
- if heating_system.heating_system_type == HPXML::HVACTypeFurnace
2061
+ if [HPXML::HVACTypeFurnace].include? heating_system.heating_system_type
2078
2062
 
2079
- cooling_system = heating_system.attached_cooling_system
2080
- if is_central_air_conditioner_and_furnace(heating_system, cooling_system)
2063
+ if not cooling_system.nil?
2081
2064
  next # Already processed combined AC+furnace
2082
2065
  end
2083
2066
 
@@ -2085,22 +2068,22 @@ class OSModel
2085
2068
  nil, @remaining_heat_load_frac,
2086
2069
  living_zone, @hvac_map)
2087
2070
 
2088
- elsif heating_system.heating_system_type == HPXML::HVACTypeBoiler
2071
+ elsif [HPXML::HVACTypeBoiler].include? heating_system.heating_system_type
2089
2072
 
2090
2073
  HVAC.apply_boiler(model, runner, heating_system,
2091
2074
  @remaining_heat_load_frac, living_zone, @hvac_map)
2092
2075
 
2093
- elsif heating_system.heating_system_type == HPXML::HVACTypeElectricResistance
2076
+ elsif [HPXML::HVACTypeElectricResistance].include? heating_system.heating_system_type
2094
2077
 
2095
2078
  HVAC.apply_electric_baseboard(model, runner, heating_system,
2096
2079
  @remaining_heat_load_frac, living_zone, @hvac_map)
2097
2080
 
2098
- elsif (heating_system.heating_system_type == HPXML::HVACTypeStove ||
2099
- heating_system.heating_system_type == HPXML::HVACTypePortableHeater ||
2100
- heating_system.heating_system_type == HPXML::HVACTypeFixedHeater ||
2101
- heating_system.heating_system_type == HPXML::HVACTypeWallFurnace ||
2102
- heating_system.heating_system_type == HPXML::HVACTypeFloorFurnace ||
2103
- heating_system.heating_system_type == HPXML::HVACTypeFireplace)
2081
+ elsif [HPXML::HVACTypeStove,
2082
+ HPXML::HVACTypePortableHeater,
2083
+ HPXML::HVACTypeFixedHeater,
2084
+ HPXML::HVACTypeWallFurnace,
2085
+ HPXML::HVACTypeFloorFurnace,
2086
+ HPXML::HVACTypeFireplace].include? heating_system.heating_system_type
2104
2087
 
2105
2088
  HVAC.apply_unit_heater(model, runner, heating_system,
2106
2089
  @remaining_heat_load_frac, living_zone, @hvac_map)
@@ -2113,45 +2096,36 @@ class OSModel
2113
2096
  def self.add_heat_pump(runner, model, weather, spaces)
2114
2097
  living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
2115
2098
 
2116
- @hpxml.heat_pumps.each do |heat_pump|
2117
- # FUTURE: Move these checks into hvac.rb
2118
- if not heat_pump.heating_capacity_17F.nil?
2119
- if heat_pump.heating_capacity.nil?
2120
- fail "HeatPump '#{heat_pump.id}' must have both HeatingCapacity and HeatingCapacity17F provided or not provided."
2121
- elsif heat_pump.heating_capacity == 0.0
2122
- heat_pump.heating_capacity_17F = nil
2123
- end
2124
- end
2125
- if not heat_pump.backup_heating_fuel.nil?
2126
- if heat_pump.backup_heating_capacity.nil? ^ heat_pump.heating_capacity.nil?
2127
- fail "HeatPump '#{heat_pump.id}' must have both HeatingCapacity and BackupHeatingCapacity provided or not provided."
2128
- end
2129
- end
2099
+ HVAC.get_hpxml_hvac_systems(@hpxml).each do |hvac_system|
2100
+ next if hvac_system[:cooling].nil?
2101
+ next unless hvac_system[:cooling].is_a? HPXML::HeatPump
2102
+
2103
+ heat_pump = hvac_system[:cooling]
2130
2104
 
2131
2105
  check_distribution_system(heat_pump.distribution_system, heat_pump.heat_pump_type)
2132
2106
 
2133
- if heat_pump.heat_pump_type == HPXML::HVACTypeHeatPumpWaterLoopToAir
2107
+ if [HPXML::HVACTypeHeatPumpWaterLoopToAir].include? heat_pump.heat_pump_type
2134
2108
 
2135
2109
  HVAC.apply_water_loop_to_air_heat_pump(model, runner, heat_pump,
2136
2110
  @remaining_heat_load_frac,
2137
2111
  @remaining_cool_load_frac,
2138
2112
  living_zone, @hvac_map)
2139
2113
 
2140
- elsif heat_pump.heat_pump_type == HPXML::HVACTypeHeatPumpAirToAir
2114
+ elsif [HPXML::HVACTypeHeatPumpAirToAir].include? heat_pump.heat_pump_type
2141
2115
 
2142
2116
  HVAC.apply_central_air_to_air_heat_pump(model, runner, heat_pump,
2143
2117
  @remaining_heat_load_frac,
2144
2118
  @remaining_cool_load_frac,
2145
2119
  living_zone, @hvac_map)
2146
2120
 
2147
- elsif heat_pump.heat_pump_type == HPXML::HVACTypeHeatPumpMiniSplit
2121
+ elsif [HPXML::HVACTypeHeatPumpMiniSplit].include? heat_pump.heat_pump_type
2148
2122
 
2149
2123
  HVAC.apply_mini_split_heat_pump(model, runner, heat_pump,
2150
2124
  @remaining_heat_load_frac,
2151
2125
  @remaining_cool_load_frac,
2152
2126
  living_zone, @hvac_map)
2153
2127
 
2154
- elsif heat_pump.heat_pump_type == HPXML::HVACTypeHeatPumpGroundToAir
2128
+ elsif [HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump.heat_pump_type
2155
2129
 
2156
2130
  HVAC.apply_ground_to_air_heat_pump(model, runner, weather, heat_pump,
2157
2131
  @remaining_heat_load_frac,
@@ -2171,7 +2145,7 @@ class OSModel
2171
2145
  living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
2172
2146
  obj_name = Constants.ObjectNameIdealAirSystem
2173
2147
 
2174
- if @hpxml.building_construction.use_only_ideal_air_system
2148
+ if @apply_ashrae140_assumptions && (@hpxml.total_fraction_heat_load_served + @hpxml.total_fraction_heat_load_served == 0.0)
2175
2149
  cooling_load_frac = 1.0
2176
2150
  heating_load_frac = 1.0
2177
2151
  if @apply_ashrae140_assumptions
@@ -2218,19 +2192,17 @@ class OSModel
2218
2192
  obj_name = Constants.ObjectNameIdealAirSystemResidual
2219
2193
 
2220
2194
  if @remaining_cool_load_frac < 1.0
2221
- sequential_cool_load_frac = 1
2195
+ sequential_cool_load_frac = 1.0
2222
2196
  else
2223
- sequential_cool_load_frac = 0 # no cooling system, don't add ideal air for cooling either
2224
- runner.registerWarning('No cooling system specified, the model will not include space cooling energy use.')
2197
+ sequential_cool_load_frac = 0.0 # no cooling system, don't add ideal air for cooling either
2225
2198
  end
2226
2199
 
2227
2200
  if @remaining_heat_load_frac < 1.0
2228
- sequential_heat_load_frac = 1
2201
+ sequential_heat_load_frac = 1.0
2229
2202
  else
2230
- sequential_heat_load_frac = 0 # no heating system, don't add ideal air for heating either
2231
- runner.registerWarning('No heating system specified, the model will not include space heating energy use.')
2203
+ sequential_heat_load_frac = 0.0 # no heating system, don't add ideal air for heating either
2232
2204
  end
2233
- if (sequential_heat_load_frac > 0) || (sequential_cool_load_frac > 0)
2205
+ if (sequential_heat_load_frac > 0.0) || (sequential_cool_load_frac > 0.0)
2234
2206
  HVAC.apply_ideal_air_loads(model, runner, obj_name, sequential_cool_load_frac, sequential_heat_load_frac,
2235
2207
  living_zone)
2236
2208
  end
@@ -2253,25 +2225,24 @@ class OSModel
2253
2225
  HVAC.apply_ceiling_fans(model, runner, weather, ceiling_fan, spaces[HPXML::LocationLivingSpace], @schedules_file)
2254
2226
  end
2255
2227
 
2256
- def self.add_dehumidifier(runner, model, spaces)
2228
+ def self.add_dehumidifiers(runner, model, spaces)
2257
2229
  return if @hpxml.dehumidifiers.size == 0
2258
2230
 
2259
- dehumidifier = @hpxml.dehumidifiers[0]
2260
- HVAC.apply_dehumidifier(model, runner, dehumidifier, spaces[HPXML::LocationLivingSpace], @hvac_map)
2231
+ HVAC.apply_dehumidifiers(model, runner, @hpxml.dehumidifiers, spaces[HPXML::LocationLivingSpace], @hvac_map)
2261
2232
  end
2262
2233
 
2263
2234
  def self.check_distribution_system(hvac_distribution, system_type)
2264
2235
  return if hvac_distribution.nil?
2265
2236
 
2266
2237
  hvac_distribution_type_map = { HPXML::HVACTypeFurnace => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
2267
- HPXML::HVACTypeBoiler => [HPXML::HVACDistributionTypeHydronic, HPXML::HVACDistributionTypeHydronicAndAir, HPXML::HVACDistributionTypeDSE],
2238
+ HPXML::HVACTypeBoiler => [HPXML::HVACDistributionTypeHydronic, HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
2268
2239
  HPXML::HVACTypeCentralAirConditioner => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
2269
2240
  HPXML::HVACTypeEvaporativeCooler => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
2270
2241
  HPXML::HVACTypeMiniSplitAirConditioner => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
2271
2242
  HPXML::HVACTypeHeatPumpAirToAir => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
2272
2243
  HPXML::HVACTypeHeatPumpMiniSplit => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
2273
2244
  HPXML::HVACTypeHeatPumpGroundToAir => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
2274
- HPXML::HVACTypeHeatPumpWaterLoopToAir => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeHydronicAndAir, HPXML::HVACDistributionTypeDSE] }
2245
+ HPXML::HVACTypeHeatPumpWaterLoopToAir => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE] }
2275
2246
 
2276
2247
  if not hvac_distribution_type_map[system_type].include? hvac_distribution.distribution_system_type
2277
2248
  # validator.rb only checks that a HVAC distribution system of the correct type (for the given HVAC system) exists
@@ -2282,7 +2253,6 @@ class OSModel
2282
2253
 
2283
2254
  def self.add_mels(runner, model, spaces)
2284
2255
  # Misc
2285
- modeled_mels = []
2286
2256
  @hpxml.plug_loads.each do |plug_load|
2287
2257
  if plug_load.plug_load_type == HPXML::PlugLoadTypeOther
2288
2258
  obj_name = Constants.ObjectNameMiscPlugLoads
@@ -2297,7 +2267,6 @@ class OSModel
2297
2267
  runner.registerWarning("Unexpected plug load type '#{plug_load.plug_load_type}'. The plug load will not be modeled.")
2298
2268
  next
2299
2269
  end
2300
- modeled_mels << plug_load.plug_load_type
2301
2270
 
2302
2271
  MiscLoads.apply_plug(model, plug_load, obj_name, spaces[HPXML::LocationLivingSpace], @apply_ashrae140_assumptions, @schedules_file)
2303
2272
  end
@@ -2329,37 +2298,25 @@ class OSModel
2329
2298
 
2330
2299
  def self.add_pools_and_hot_tubs(runner, model, spaces)
2331
2300
  @hpxml.pools.each do |pool|
2301
+ next if pool.type == HPXML::TypeNone
2302
+
2332
2303
  MiscLoads.apply_pool_or_hot_tub_heater(model, pool, Constants.ObjectNameMiscPoolHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
2333
2304
  MiscLoads.apply_pool_or_hot_tub_pump(model, pool, Constants.ObjectNameMiscPoolPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
2334
2305
  end
2335
2306
 
2336
2307
  @hpxml.hot_tubs.each do |hot_tub|
2308
+ next if hot_tub.type == HPXML::TypeNone
2309
+
2337
2310
  MiscLoads.apply_pool_or_hot_tub_heater(model, hot_tub, Constants.ObjectNameMiscHotTubHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
2338
2311
  MiscLoads.apply_pool_or_hot_tub_pump(model, hot_tub, Constants.ObjectNameMiscHotTubPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
2339
2312
  end
2340
2313
  end
2341
2314
 
2342
2315
  def self.add_airflow(runner, model, weather, spaces)
2343
- # Vented Attic
2344
- vented_attic = nil
2345
- @hpxml.attics.each do |attic|
2346
- next unless attic.attic_type == HPXML::AtticTypeVented
2347
-
2348
- vented_attic = attic
2349
- end
2350
-
2351
- # Vented Crawlspace
2352
- vented_crawl = nil
2353
- @hpxml.foundations.each do |foundation|
2354
- next unless foundation.foundation_type == HPXML::FoundationTypeCrawlspaceVented
2355
-
2356
- vented_crawl = foundation
2357
- end
2358
-
2359
2316
  # Ducts
2360
2317
  duct_systems = {}
2361
2318
  @hpxml.hvac_distributions.each do |hvac_distribution|
2362
- next unless [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeHydronicAndAir].include? hvac_distribution.distribution_system_type
2319
+ next unless hvac_distribution.distribution_system_type == HPXML::HVACDistributionTypeAir
2363
2320
 
2364
2321
  air_ducts = create_ducts(runner, model, hvac_distribution, spaces)
2365
2322
  next if air_ducts.empty?
@@ -2368,7 +2325,7 @@ class OSModel
2368
2325
  added_ducts = false
2369
2326
  hvac_distribution.hvac_systems.each do |hvac_system|
2370
2327
  @hvac_map[hvac_system.id].each do |object|
2371
- next unless object.is_a? OpenStudio::Model::AirLoopHVAC
2328
+ next unless object.is_a?(OpenStudio::Model::AirLoopHVAC) || object.is_a?(OpenStudio::Model::ZoneHVACFourPipeFanCoil)
2372
2329
 
2373
2330
  if duct_systems[air_ducts].nil?
2374
2331
  duct_systems[air_ducts] = object
@@ -2382,37 +2339,14 @@ class OSModel
2382
2339
  end
2383
2340
  end
2384
2341
  end
2385
- if not added_ducts
2386
- # Check if ducted fan coil, which doesn't have an AirLoopHVAC;
2387
- # assign to FanCoil instead.
2388
- if hvac_distribution.distribution_system_type && hvac_distribution.hydronic_and_air_type == HPXML::HydronicAndAirTypeFanCoil
2389
- hvac_distribution.hvac_systems.each do |hvac_system|
2390
- @hvac_map[hvac_system.id].each do |object|
2391
- next unless object.is_a? OpenStudio::Model::ZoneHVACFourPipeFanCoil
2392
-
2393
- duct_systems[air_ducts] = object
2394
- added_ducts = true
2395
- end
2396
- end
2397
- end
2398
- end
2399
2342
  if not added_ducts
2400
2343
  fail 'Unexpected error adding ducts to model.'
2401
2344
  end
2402
2345
  end
2403
2346
 
2404
- air_infils = @hpxml.air_infiltration_measurements
2405
- window_area = @hpxml.windows.map { |w| w.area }.sum(0.0)
2406
- open_window_area = window_area * @frac_windows_operable * 0.5 * 0.2 # Assume A) 50% of the area of an operable window can be open, and B) 20% of openable window area is actually open
2407
- site_type = @hpxml.site.site_type
2408
- shelter_coef = @hpxml.site.shelter_coefficient
2409
- @infil_volume = air_infils.select { |i| !i.infiltration_volume.nil? }[0].infiltration_volume
2410
- infil_height = @hpxml.inferred_infiltration_height(@infil_volume)
2411
- Airflow.apply(model, runner, weather, spaces, air_infils, @hpxml.ventilation_fans, @hpxml.clothes_dryers, @nbeds,
2412
- duct_systems, @infil_volume, infil_height, open_window_area,
2413
- @clg_ssn_sensor, @min_neighbor_distance, vented_attic, vented_crawl,
2414
- site_type, shelter_coef, @hpxml.building_construction.has_flue_or_chimney, @hvac_map, @eri_version,
2415
- @apply_ashrae140_assumptions, @schedules_file)
2347
+ Airflow.apply(model, runner, weather, spaces, @hpxml, @cfa, @nbeds,
2348
+ @ncfl_ag, duct_systems, @clg_ssn_sensor, @hvac_map, @eri_version,
2349
+ @frac_windows_operable, @apply_ashrae140_assumptions, @schedules_file)
2416
2350
  end
2417
2351
 
2418
2352
  def self.create_ducts(runner, model, hvac_distribution, spaces)
@@ -2465,14 +2399,9 @@ class OSModel
2465
2399
  end
2466
2400
 
2467
2401
  # If all ducts are in conditioned space, model leakage as going to outside
2468
- registered_warning = false
2469
2402
  [HPXML::DuctTypeSupply, HPXML::DuctTypeReturn].each do |duct_side|
2470
2403
  next unless (leakage_to_outside[duct_side][0] > 0) && (total_unconditioned_duct_area[duct_side] == 0)
2471
2404
 
2472
- if not registered_warning
2473
- runner.registerWarning("HVACDistribution '#{hvac_distribution.id}' has ducts entirely within conditioned space but there is non-zero leakage to the outside. Leakage to the outside is typically zero in these situations; consider revising leakage values. Leakage will be modeled as heat lost to the ambient environment.")
2474
- registered_warning = true
2475
- end
2476
2405
  duct_area = 0.0
2477
2406
  duct_rvalue = 0.0
2478
2407
  duct_loc_space = nil # outside
@@ -2496,10 +2425,6 @@ class OSModel
2496
2425
  return air_ducts
2497
2426
  end
2498
2427
 
2499
- def self.add_hvac_sizing(runner, model, weather, spaces)
2500
- HVACSizing.apply(model, runner, weather, spaces, @hpxml, @infil_volume, @nbeds, @min_neighbor_distance, @debug)
2501
- end
2502
-
2503
2428
  def self.add_photovoltaics(runner, model)
2504
2429
  @hpxml.pv_systems.each do |pv_system|
2505
2430
  PV.apply(model, @nbeds, pv_system)
@@ -2512,10 +2437,11 @@ class OSModel
2512
2437
  end
2513
2438
  end
2514
2439
 
2515
- def self.add_additional_properties(runner, model, hpxml_path)
2440
+ def self.add_additional_properties(runner, model, hpxml_path, building_id)
2516
2441
  # Store some data for use in reporting measure
2517
2442
  additionalProperties = model.getBuilding.additionalProperties
2518
2443
  additionalProperties.setFeature('hpxml_path', hpxml_path)
2444
+ additionalProperties.setFeature('building_id', building_id.to_s)
2519
2445
  additionalProperties.setFeature('hvac_map', map_to_string(@hvac_map))
2520
2446
  additionalProperties.setFeature('dhw_map', map_to_string(@dhw_map))
2521
2447
  end
@@ -3019,12 +2945,6 @@ class OSModel
3019
2945
  program_calling_manager.addProgram(program)
3020
2946
  end
3021
2947
 
3022
- def self.set_vacancy(runner, model)
3023
- return if @schedules_file.nil?
3024
-
3025
- @schedules_file.set_vacancy(col_names: ScheduleGenerator.col_names)
3026
- end
3027
-
3028
2948
  def self.add_output_control_files(runner, model)
3029
2949
  return if @debug
3030
2950
 
@@ -3049,396 +2969,6 @@ class OSModel
3049
2969
  oems.setEMSRuntimeLanguageDebugOutputLevel('Verbose')
3050
2970
  end
3051
2971
 
3052
- # FUTURE: Move all of these construction methods to constructions.rb
3053
- def self.calc_non_cavity_r(film_r, constr_set)
3054
- # Calculate R-value for all non-cavity layers
3055
- non_cavity_r = film_r
3056
- if not constr_set.exterior_material.nil?
3057
- non_cavity_r += constr_set.exterior_material.rvalue
3058
- end
3059
- if not constr_set.rigid_r.nil?
3060
- non_cavity_r += constr_set.rigid_r
3061
- end
3062
- if not constr_set.osb_thick_in.nil?
3063
- non_cavity_r += Material.Plywood(constr_set.osb_thick_in).rvalue
3064
- end
3065
- if not constr_set.drywall_thick_in.nil?
3066
- non_cavity_r += Material.GypsumWall(constr_set.drywall_thick_in).rvalue
3067
- end
3068
- return non_cavity_r
3069
- end
3070
-
3071
- def self.apply_wall_construction(runner, model, surfaces, wall, wall_id, wall_type, assembly_r,
3072
- drywall_thick_in, inside_film, outside_film, mat_ext_finish)
3073
-
3074
- film_r = inside_film.rvalue + outside_film.rvalue
3075
- if mat_ext_finish.nil?
3076
- fallback_mat_ext_finish = nil
3077
- else
3078
- fallback_mat_ext_finish = Material.ExteriorFinishMaterial(mat_ext_finish.name, mat_ext_finish.tAbs, mat_ext_finish.sAbs, 0.1)
3079
- end
3080
-
3081
- if wall_type == HPXML::WallTypeWoodStud
3082
- install_grade = 1
3083
- cavity_filled = true
3084
-
3085
- constr_sets = [
3086
- WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 10.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R10
3087
- WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 5.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R5
3088
- WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c.
3089
- WoodStudConstructionSet.new(Material.Stud2x4, 0.23, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x4, 16" o.c.
3090
- WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
3091
- ]
3092
- match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
3093
-
3094
- Constructions.apply_wood_stud_wall(runner, model, surfaces, wall, "#{wall_id} construction",
3095
- cavity_r, install_grade, constr_set.stud.thick_in,
3096
- cavity_filled, constr_set.framing_factor,
3097
- constr_set.drywall_thick_in, constr_set.osb_thick_in,
3098
- constr_set.rigid_r, constr_set.exterior_material,
3099
- 0, inside_film, outside_film)
3100
- elsif wall_type == HPXML::WallTypeSteelStud
3101
- install_grade = 1
3102
- cavity_filled = true
3103
- corr_factor = 0.45
3104
-
3105
- constr_sets = [
3106
- SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 10.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R10
3107
- SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 5.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R5
3108
- SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c.
3109
- SteelStudConstructionSet.new(3.5, corr_factor, 0.23, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x4, 16" o.c.
3110
- SteelStudConstructionSet.new(3.5, 1.0, 0.01, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
3111
- ]
3112
- match, constr_set, cavity_r = pick_steel_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
3113
-
3114
- Constructions.apply_steel_stud_wall(runner, model, surfaces, wall, "#{wall_id} construction",
3115
- cavity_r, install_grade, constr_set.cavity_thick_in,
3116
- cavity_filled, constr_set.framing_factor,
3117
- constr_set.corr_factor, constr_set.drywall_thick_in,
3118
- constr_set.osb_thick_in, constr_set.rigid_r,
3119
- constr_set.exterior_material, inside_film, outside_film)
3120
- elsif wall_type == HPXML::WallTypeDoubleWoodStud
3121
- install_grade = 1
3122
- is_staggered = false
3123
-
3124
- constr_sets = [
3125
- DoubleStudConstructionSet.new(Material.Stud2x4, 0.23, 24.0, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x4, 24" o.c.
3126
- DoubleStudConstructionSet.new(Material.Stud2x4, 0.01, 16.0, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
3127
- ]
3128
- match, constr_set, cavity_r = pick_double_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
3129
-
3130
- Constructions.apply_double_stud_wall(runner, model, surfaces, wall, "#{wall_id} construction",
3131
- cavity_r, install_grade, constr_set.stud.thick_in,
3132
- constr_set.stud.thick_in, constr_set.framing_factor,
3133
- constr_set.framing_spacing, is_staggered,
3134
- constr_set.drywall_thick_in, constr_set.osb_thick_in,
3135
- constr_set.rigid_r, constr_set.exterior_material,
3136
- inside_film, outside_film)
3137
- elsif wall_type == HPXML::WallTypeCMU
3138
- density = 119.0 # lb/ft^3
3139
- furring_r = 0
3140
- furring_cavity_depth_in = 0 # in
3141
- furring_spacing = 0
3142
-
3143
- constr_sets = [
3144
- CMUConstructionSet.new(8.0, 1.4, 0.08, 0.5, drywall_thick_in, mat_ext_finish), # 8" perlite-filled CMU
3145
- CMUConstructionSet.new(6.0, 5.29, 0.01, 0.0, 0.0, fallback_mat_ext_finish), # Fallback (6" hollow CMU)
3146
- ]
3147
- match, constr_set, rigid_r = pick_cmu_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
3148
-
3149
- Constructions.apply_cmu_wall(runner, model, surfaces, wall, "#{wall_id} construction",
3150
- constr_set.thick_in, constr_set.cond_in, density,
3151
- constr_set.framing_factor, furring_r,
3152
- furring_cavity_depth_in, furring_spacing,
3153
- constr_set.drywall_thick_in, constr_set.osb_thick_in,
3154
- rigid_r, constr_set.exterior_material, inside_film,
3155
- outside_film)
3156
- elsif wall_type == HPXML::WallTypeSIP
3157
- sheathing_thick_in = 0.44
3158
-
3159
- constr_sets = [
3160
- SIPConstructionSet.new(10.0, 0.16, 0.0, sheathing_thick_in, 0.5, drywall_thick_in, mat_ext_finish), # 10" SIP core
3161
- SIPConstructionSet.new(5.0, 0.16, 0.0, sheathing_thick_in, 0.5, drywall_thick_in, mat_ext_finish), # 5" SIP core
3162
- SIPConstructionSet.new(1.0, 0.01, 0.0, sheathing_thick_in, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
3163
- ]
3164
- match, constr_set, cavity_r = pick_sip_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
3165
-
3166
- Constructions.apply_sip_wall(runner, model, surfaces, wall, "#{wall_id} construction",
3167
- cavity_r, constr_set.thick_in, constr_set.framing_factor,
3168
- constr_set.sheath_thick_in, constr_set.drywall_thick_in,
3169
- constr_set.osb_thick_in, constr_set.rigid_r,
3170
- constr_set.exterior_material, inside_film, outside_film)
3171
- elsif wall_type == HPXML::WallTypeICF
3172
- constr_sets = [
3173
- ICFConstructionSet.new(2.0, 4.0, 0.08, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # ICF w/4" concrete and 2" rigid ins layers
3174
- ICFConstructionSet.new(1.0, 1.0, 0.01, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
3175
- ]
3176
- match, constr_set, icf_r = pick_icf_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
3177
-
3178
- Constructions.apply_icf_wall(runner, model, surfaces, wall, "#{wall_id} construction",
3179
- icf_r, constr_set.ins_thick_in,
3180
- constr_set.concrete_thick_in, constr_set.framing_factor,
3181
- constr_set.drywall_thick_in, constr_set.osb_thick_in,
3182
- constr_set.rigid_r, constr_set.exterior_material,
3183
- inside_film, outside_film)
3184
- elsif [HPXML::WallTypeConcrete, HPXML::WallTypeBrick, HPXML::WallTypeAdobe, HPXML::WallTypeStrawBale, HPXML::WallTypeStone, HPXML::WallTypeLog].include? wall_type
3185
- constr_sets = [
3186
- GenericConstructionSet.new(10.0, 0.5, drywall_thick_in, mat_ext_finish), # w/R-10 rigid
3187
- GenericConstructionSet.new(0.0, 0.5, drywall_thick_in, mat_ext_finish), # Standard
3188
- GenericConstructionSet.new(0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
3189
- ]
3190
- match, constr_set, layer_r = pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
3191
-
3192
- if wall_type == HPXML::WallTypeConcrete
3193
- thick_in = 6.0
3194
- base_mat = BaseMaterial.Concrete
3195
- elsif wall_type == HPXML::WallTypeBrick
3196
- thick_in = 8.0
3197
- base_mat = BaseMaterial.Brick
3198
- elsif wall_type == HPXML::WallTypeAdobe
3199
- thick_in = 10.0
3200
- base_mat = BaseMaterial.Soil
3201
- elsif wall_type == HPXML::WallTypeStrawBale
3202
- thick_in = 23.0
3203
- base_mat = BaseMaterial.StrawBale
3204
- elsif wall_type == HPXML::WallTypeStone
3205
- thick_in = 6.0
3206
- base_mat = BaseMaterial.Stone
3207
- elsif wall_type == HPXML::WallTypeLog
3208
- thick_in = 6.0
3209
- base_mat = BaseMaterial.Wood
3210
- end
3211
- thick_ins = [thick_in]
3212
- if layer_r == 0
3213
- conds = [99]
3214
- else
3215
- conds = [thick_in / layer_r]
3216
- end
3217
- denss = [base_mat.rho]
3218
- specheats = [base_mat.cp]
3219
-
3220
- Constructions.apply_generic_layered_wall(runner, model, surfaces, wall, "#{wall_id} construction",
3221
- thick_ins, conds, denss, specheats,
3222
- constr_set.drywall_thick_in, constr_set.osb_thick_in,
3223
- constr_set.rigid_r, constr_set.exterior_material,
3224
- inside_film, outside_film)
3225
- else
3226
- fail "Unexpected wall type '#{wall_type}'."
3227
- end
3228
-
3229
- check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
3230
- end
3231
-
3232
- def self.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
3233
- # Picks a construction set from supplied constr_sets for which a positive R-value
3234
- # can be calculated for the unknown insulation to achieve the assembly R-value.
3235
-
3236
- constr_sets.each do |constr_set|
3237
- fail 'Unexpected object.' unless constr_set.is_a? WoodStudConstructionSet
3238
-
3239
- film_r = inside_film.rvalue + outside_film.rvalue
3240
- non_cavity_r = calc_non_cavity_r(film_r, constr_set)
3241
-
3242
- # Calculate effective cavity R-value
3243
- # Assumes installation quality 1
3244
- cavity_frac = 1.0 - constr_set.framing_factor
3245
- cavity_r = cavity_frac / (1.0 / assembly_r - constr_set.framing_factor / (constr_set.stud.rvalue + non_cavity_r)) - non_cavity_r
3246
- if cavity_r > 0 # Choose this construction set
3247
- return true, constr_set, cavity_r
3248
- end
3249
- end
3250
-
3251
- return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
3252
- end
3253
-
3254
- def self.pick_steel_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
3255
- # Picks a construction set from supplied constr_sets for which a positive R-value
3256
- # can be calculated for the unknown insulation to achieve the assembly R-value.
3257
-
3258
- constr_sets.each do |constr_set|
3259
- fail 'Unexpected object.' unless constr_set.is_a? SteelStudConstructionSet
3260
-
3261
- film_r = inside_film.rvalue + outside_film.rvalue
3262
- non_cavity_r = calc_non_cavity_r(film_r, constr_set)
3263
-
3264
- # Calculate effective cavity R-value
3265
- # Assumes installation quality 1
3266
- cavity_r = (assembly_r - non_cavity_r) / constr_set.corr_factor
3267
- if cavity_r > 0 # Choose this construction set
3268
- return true, constr_set, cavity_r
3269
- end
3270
- end
3271
-
3272
- return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
3273
- end
3274
-
3275
- def self.pick_double_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
3276
- # Picks a construction set from supplied constr_sets for which a positive R-value
3277
- # can be calculated for the unknown insulation to achieve the assembly R-value.
3278
-
3279
- constr_sets.each do |constr_set|
3280
- fail 'Unexpected object.' unless constr_set.is_a? DoubleStudConstructionSet
3281
-
3282
- film_r = inside_film.rvalue + outside_film.rvalue
3283
- non_cavity_r = calc_non_cavity_r(film_r, constr_set)
3284
-
3285
- # Calculate effective cavity R-value
3286
- # Assumes installation quality 1, not staggered, gap depth == stud depth
3287
- # Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(2*C%2Bx%2BD)+%2B+E%2F(3*C%2BD)+%2B+(1-B-E)%2F(3*x%2BD)
3288
- stud_frac = 1.5 / constr_set.framing_spacing
3289
- misc_framing_factor = constr_set.framing_factor - stud_frac
3290
- cavity_frac = 1.0 - (2 * stud_frac + misc_framing_factor)
3291
- a = assembly_r
3292
- b = stud_frac
3293
- c = constr_set.stud.rvalue
3294
- d = non_cavity_r
3295
- e = misc_framing_factor
3296
- cavity_r = ((3 * c + d) * Math.sqrt(4 * a**2 * b**2 + 12 * a**2 * b * e + 4 * a**2 * b + 9 * a**2 * e**2 - 6 * a**2 * e + a**2 - 48 * a * b * c - 16 * a * b * d - 36 * a * c * e + 12 * a * c - 12 * a * d * e + 4 * a * d + 36 * c**2 + 24 * c * d + 4 * d**2) + 6 * a * b * c + 2 * a * b * d + 3 * a * c * e + 3 * a * c + 3 * a * d * e + a * d - 18 * c**2 - 18 * c * d - 4 * d**2) / (2 * (-3 * a * e + 9 * c + 3 * d))
3297
- cavity_r = 3 * cavity_r
3298
- if cavity_r > 0 # Choose this construction set
3299
- return true, constr_set, cavity_r
3300
- end
3301
- end
3302
-
3303
- return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
3304
- end
3305
-
3306
- def self.pick_sip_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
3307
- # Picks a construction set from supplied constr_sets for which a positive R-value
3308
- # can be calculated for the unknown insulation to achieve the assembly R-value.
3309
-
3310
- constr_sets.each do |constr_set|
3311
- fail 'Unexpected object.' unless constr_set.is_a? SIPConstructionSet
3312
-
3313
- film_r = inside_film.rvalue + outside_film.rvalue
3314
- non_cavity_r = calc_non_cavity_r(film_r, constr_set)
3315
- non_cavity_r += Material.new(nil, constr_set.sheath_thick_in, BaseMaterial.Wood).rvalue
3316
-
3317
- # Calculate effective SIP core R-value
3318
- # Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(C%2BD)+%2B+E%2F(2*F%2BG%2FH*x%2BD)+%2B+(1-B-E)%2F(x%2BD)
3319
- spline_thick_in = 0.5 # in
3320
- ins_thick_in = constr_set.thick_in - (2.0 * spline_thick_in) # in
3321
- framing_r = Material.new(nil, constr_set.thick_in, BaseMaterial.Wood).rvalue
3322
- spline_r = Material.new(nil, spline_thick_in, BaseMaterial.Wood).rvalue
3323
- spline_frac = 4.0 / 48.0 # One 4" spline for every 48" wide panel
3324
- cavity_frac = 1.0 - (spline_frac + constr_set.framing_factor)
3325
- a = assembly_r
3326
- b = constr_set.framing_factor
3327
- c = framing_r
3328
- d = non_cavity_r
3329
- e = spline_frac
3330
- f = spline_r
3331
- g = ins_thick_in
3332
- h = constr_set.thick_in
3333
- cavity_r = (Math.sqrt((a * b * c * g - a * b * d * h - 2 * a * b * f * h + a * c * e * g - a * c * e * h - a * c * g + a * d * e * g - a * d * e * h - a * d * g + c * d * g + c * d * h + 2 * c * f * h + d**2 * g + d**2 * h + 2 * d * f * h)**2 - 4 * (-a * b * g + c * g + d * g) * (a * b * c * d * h + 2 * a * b * c * f * h - a * c * d * h + 2 * a * c * e * f * h - 2 * a * c * f * h - a * d**2 * h + 2 * a * d * e * f * h - 2 * a * d * f * h + c * d**2 * h + 2 * c * d * f * h + d**3 * h + 2 * d**2 * f * h)) - a * b * c * g + a * b * d * h + 2 * a * b * f * h - a * c * e * g + a * c * e * h + a * c * g - a * d * e * g + a * d * e * h + a * d * g - c * d * g - c * d * h - 2 * c * f * h - g * d**2 - d**2 * h - 2 * d * f * h) / (2 * (-a * b * g + c * g + d * g))
3334
- if cavity_r > 0 # Choose this construction set
3335
- return true, constr_set, cavity_r
3336
- end
3337
- end
3338
-
3339
- return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
3340
- end
3341
-
3342
- def self.pick_cmu_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
3343
- # Picks a construction set from supplied constr_sets for which a positive R-value
3344
- # can be calculated for the unknown insulation to achieve the assembly R-value.
3345
-
3346
- constr_sets.each do |constr_set|
3347
- fail 'Unexpected object.' unless constr_set.is_a? CMUConstructionSet
3348
-
3349
- film_r = inside_film.rvalue + outside_film.rvalue
3350
- non_cavity_r = calc_non_cavity_r(film_r, constr_set)
3351
-
3352
- # Calculate effective other CMU R-value
3353
- # Assumes no furring strips
3354
- # Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(C%2BE%2Bx)+%2B+(1-B)%2F(D%2BE%2Bx)
3355
- a = assembly_r
3356
- b = constr_set.framing_factor
3357
- c = Material.new(nil, constr_set.thick_in, BaseMaterial.Wood).rvalue # Framing
3358
- d = Material.new(nil, constr_set.thick_in, BaseMaterial.Concrete, constr_set.cond_in).rvalue # Concrete
3359
- e = non_cavity_r
3360
- rigid_r = 0.5 * (Math.sqrt(a**2 - 4 * a * b * c + 4 * a * b * d + 2 * a * c - 2 * a * d + c**2 - 2 * c * d + d**2) + a - c - d - 2 * e)
3361
- if rigid_r > 0 # Choose this construction set
3362
- return true, constr_set, rigid_r
3363
- end
3364
- end
3365
-
3366
- return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
3367
- end
3368
-
3369
- def self.pick_icf_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
3370
- # Picks a construction set from supplied constr_sets for which a positive R-value
3371
- # can be calculated for the unknown insulation to achieve the assembly R-value.
3372
-
3373
- constr_sets.each do |constr_set|
3374
- fail 'Unexpected object.' unless constr_set.is_a? ICFConstructionSet
3375
-
3376
- film_r = inside_film.rvalue + outside_film.rvalue
3377
- non_cavity_r = calc_non_cavity_r(film_r, constr_set)
3378
-
3379
- # Calculate effective ICF rigid ins R-value
3380
- # Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(C%2BE)+%2B+(1-B)%2F(D%2BE%2B2*x)
3381
- a = assembly_r
3382
- b = constr_set.framing_factor
3383
- c = Material.new(nil, 2 * constr_set.ins_thick_in + constr_set.concrete_thick_in, BaseMaterial.Wood).rvalue # Framing
3384
- d = Material.new(nil, constr_set.concrete_thick_in, BaseMaterial.Concrete).rvalue # Concrete
3385
- e = non_cavity_r
3386
- icf_r = (a * b * c - a * b * d - a * c - a * e + c * d + c * e + d * e + e**2) / (2 * (a * b - c - e))
3387
- if icf_r > 0 # Choose this construction set
3388
- return true, constr_set, icf_r
3389
- end
3390
- end
3391
-
3392
- return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
3393
- end
3394
-
3395
- def self.pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
3396
- # Picks a construction set from supplied constr_sets for which a positive R-value
3397
- # can be calculated for the unknown insulation to achieve the assembly R-value.
3398
-
3399
- constr_sets.each do |constr_set|
3400
- fail 'Unexpected object.' unless constr_set.is_a? GenericConstructionSet
3401
-
3402
- film_r = inside_film.rvalue + outside_film.rvalue
3403
- non_cavity_r = calc_non_cavity_r(film_r, constr_set)
3404
-
3405
- # Calculate effective ins layer R-value
3406
- layer_r = assembly_r - non_cavity_r
3407
- if layer_r > 0 # Choose this construction set
3408
- return true, constr_set, layer_r
3409
- end
3410
- end
3411
-
3412
- return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
3413
- end
3414
-
3415
- def self.check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
3416
- # Verify that the actual OpenStudio construction R-value matches our target assembly R-value
3417
-
3418
- film_r = 0.0
3419
- film_r += inside_film.rvalue unless inside_film.nil?
3420
- film_r += outside_film.rvalue unless outside_film.nil?
3421
- surfaces.each do |surface|
3422
- constr_r = UnitConversions.convert(1.0 / surface.construction.get.uFactor(0.0).get, 'm^2*k/w', 'hr*ft^2*f/btu') + film_r
3423
-
3424
- if surface.adjacentFoundation.is_initialized
3425
- foundation = surface.adjacentFoundation.get
3426
- foundation.customBlocks.each do |custom_block|
3427
- ins_mat = custom_block.material.to_StandardOpaqueMaterial.get
3428
- constr_r += UnitConversions.convert(ins_mat.thickness, 'm', 'ft') / UnitConversions.convert(ins_mat.thermalConductivity, 'W/(m*K)', 'Btu/(hr*ft*R)')
3429
- end
3430
- end
3431
-
3432
- if (assembly_r - constr_r).abs > 0.1
3433
- if match
3434
- fail "Construction R-value (#{constr_r}) does not match Assembly R-value (#{assembly_r}) for '#{surface.name}'."
3435
- else
3436
- runner.registerWarning("Assembly R-value (#{assembly_r}) for '#{surface.name}' below minimum expected value. Construction R-value increased to #{constr_r.round(2)}.")
3437
- end
3438
- end
3439
- end
3440
- end
3441
-
3442
2972
  def self.set_surface_interior(model, spaces, surface, hpxml_surface)
3443
2973
  interior_adjacent_to = hpxml_surface.interior_adjacent_to
3444
2974
  if [HPXML::LocationBasementConditioned].include? interior_adjacent_to
@@ -3464,7 +2994,7 @@ class OSModel
3464
2994
  set_surface_otherside_coefficients(surface, exterior_adjacent_to, model, spaces)
3465
2995
  elsif exterior_adjacent_to == HPXML::LocationBasementConditioned
3466
2996
  surface.createAdjacentSurface(create_or_get_space(model, spaces, HPXML::LocationLivingSpace))
3467
- @cond_bsmnt_surfaces << surface
2997
+ @cond_bsmnt_surfaces << surface.adjacentSurface.get
3468
2998
  else
3469
2999
  surface.createAdjacentSurface(create_or_get_space(model, spaces, exterior_adjacent_to))
3470
3000
  end
@@ -3606,9 +3136,7 @@ class OSModel
3606
3136
  space = create_or_get_space(model, spaces, location)
3607
3137
  end
3608
3138
 
3609
- if spaces.size != num_orig_spaces
3610
- fail "#{object_name} location is '#{location}' but building does not have this location specified."
3611
- end
3139
+ fail if spaces.size != num_orig_spaces # EPvalidator.xml should prevent this
3612
3140
 
3613
3141
  return space
3614
3142
  end
@@ -3625,19 +3153,6 @@ class OSModel
3625
3153
  end
3626
3154
  end
3627
3155
 
3628
- def self.get_min_neighbor_distance()
3629
- min_neighbor_distance = nil
3630
- @hpxml.neighbor_buildings.each do |neighbor_building|
3631
- if min_neighbor_distance.nil?
3632
- min_neighbor_distance = 9e99
3633
- end
3634
- if neighbor_building.distance < min_neighbor_distance
3635
- min_neighbor_distance = neighbor_building.distance
3636
- end
3637
- end
3638
- return min_neighbor_distance
3639
- end
3640
-
3641
3156
  def self.get_kiva_instances(fnd_walls, slabs)
3642
3157
  # Identify unique Kiva foundations that are required.
3643
3158
  kiva_fnd_walls = []
@@ -3665,93 +3180,5 @@ class OSModel
3665
3180
  end
3666
3181
  end
3667
3182
 
3668
- # FUTURE: Move all of these construction classes to constructions.rb
3669
- class WoodStudConstructionSet
3670
- def initialize(stud, framing_factor, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
3671
- @stud = stud
3672
- @framing_factor = framing_factor
3673
- @rigid_r = rigid_r
3674
- @osb_thick_in = osb_thick_in
3675
- @drywall_thick_in = drywall_thick_in
3676
- @exterior_material = exterior_material
3677
- end
3678
- attr_accessor(:stud, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
3679
- end
3680
-
3681
- class SteelStudConstructionSet
3682
- def initialize(cavity_thick_in, corr_factor, framing_factor, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
3683
- @cavity_thick_in = cavity_thick_in
3684
- @corr_factor = corr_factor
3685
- @framing_factor = framing_factor
3686
- @rigid_r = rigid_r
3687
- @osb_thick_in = osb_thick_in
3688
- @drywall_thick_in = drywall_thick_in
3689
- @exterior_material = exterior_material
3690
- end
3691
- attr_accessor(:cavity_thick_in, :corr_factor, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
3692
- end
3693
-
3694
- class DoubleStudConstructionSet
3695
- def initialize(stud, framing_factor, framing_spacing, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
3696
- @stud = stud
3697
- @framing_factor = framing_factor
3698
- @framing_spacing = framing_spacing
3699
- @rigid_r = rigid_r
3700
- @osb_thick_in = osb_thick_in
3701
- @drywall_thick_in = drywall_thick_in
3702
- @exterior_material = exterior_material
3703
- end
3704
- attr_accessor(:stud, :framing_factor, :framing_spacing, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
3705
- end
3706
-
3707
- class SIPConstructionSet
3708
- def initialize(thick_in, framing_factor, rigid_r, sheath_thick_in, osb_thick_in, drywall_thick_in, exterior_material)
3709
- @thick_in = thick_in
3710
- @framing_factor = framing_factor
3711
- @rigid_r = rigid_r
3712
- @sheath_thick_in = sheath_thick_in
3713
- @osb_thick_in = osb_thick_in
3714
- @drywall_thick_in = drywall_thick_in
3715
- @exterior_material = exterior_material
3716
- end
3717
- attr_accessor(:thick_in, :framing_factor, :rigid_r, :sheath_thick_in, :osb_thick_in, :drywall_thick_in, :exterior_material)
3718
- end
3719
-
3720
- class CMUConstructionSet
3721
- def initialize(thick_in, cond_in, framing_factor, osb_thick_in, drywall_thick_in, exterior_material)
3722
- @thick_in = thick_in
3723
- @cond_in = cond_in
3724
- @framing_factor = framing_factor
3725
- @osb_thick_in = osb_thick_in
3726
- @drywall_thick_in = drywall_thick_in
3727
- @exterior_material = exterior_material
3728
- @rigid_r = nil # solved for
3729
- end
3730
- attr_accessor(:thick_in, :cond_in, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
3731
- end
3732
-
3733
- class ICFConstructionSet
3734
- def initialize(ins_thick_in, concrete_thick_in, framing_factor, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
3735
- @ins_thick_in = ins_thick_in
3736
- @concrete_thick_in = concrete_thick_in
3737
- @framing_factor = framing_factor
3738
- @rigid_r = rigid_r
3739
- @osb_thick_in = osb_thick_in
3740
- @drywall_thick_in = drywall_thick_in
3741
- @exterior_material = exterior_material
3742
- end
3743
- attr_accessor(:ins_thick_in, :concrete_thick_in, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
3744
- end
3745
-
3746
- class GenericConstructionSet
3747
- def initialize(rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
3748
- @rigid_r = rigid_r
3749
- @osb_thick_in = osb_thick_in
3750
- @drywall_thick_in = drywall_thick_in
3751
- @exterior_material = exterior_material
3752
- end
3753
- attr_accessor(:rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
3754
- end
3755
-
3756
3183
  # register the measure to be used by the application
3757
3184
  HPXMLtoOpenStudio.new.registerWithApplication