urbanopt-cli 0.4.1 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (944) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/CHANGELOG.md +59 -0
  4. data/CMakeLists.txt +17 -17
  5. data/FindOpenStudioSDK.cmake +12 -7
  6. data/Gemfile +8 -10
  7. data/LICENSE.md +11 -1
  8. data/README.md +1 -0
  9. data/Rakefile +16 -6
  10. data/example_files/Gemfile +25 -9
  11. data/example_files/example_project.json +35 -20
  12. data/example_files/example_project_combined.json +100 -5
  13. data/example_files/example_project_with_electric_network.json +2116 -0
  14. data/example_files/mappers/Baseline.rb +111 -51
  15. data/example_files/mappers/CreateBar.rb +19 -7
  16. data/example_files/mappers/EvCharging.rb +141 -0
  17. data/example_files/mappers/Floorspace.rb +29 -17
  18. data/example_files/mappers/HighEfficiency.rb +20 -8
  19. data/example_files/mappers/HighEfficiencyCreateBar.rb +19 -8
  20. data/example_files/mappers/HighEfficiencyFloorspace.rb +19 -8
  21. data/example_files/mappers/ThermalStorage.rb +16 -6
  22. data/example_files/mappers/base_workflow.osw +26 -1
  23. data/example_files/mappers/floorspace_workflow.osw +9 -0
  24. data/example_files/measures/BuildResidentialModel/measure.rb +249 -134
  25. data/example_files/reopt/base_assumptions.json +2 -2
  26. data/example_files/reopt/multiPV_assumptions.json +4 -3
  27. data/example_files/residential/clothes_dryer.tsv +7 -7
  28. data/example_files/residential/clothes_washer.tsv +2 -2
  29. data/example_files/residential/cooling_system.tsv +42 -22
  30. data/example_files/residential/dishwasher.tsv +1 -1
  31. data/example_files/residential/exhaust.tsv +3 -0
  32. data/example_files/residential/heat_pump.tsv +62 -40
  33. data/example_files/residential/water_heater.tsv +1 -1
  34. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +14 -0
  35. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +116 -0
  36. data/example_files/resources/hpxml-measures/.gitignore +1 -8
  37. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1088 -1329
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +1819 -1383
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -8
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +450 -362
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules.rb +165 -112
  42. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.json +388 -0
  43. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.md +43 -0
  44. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_state_and_monthly_schedule_shift.csv +613 -0
  45. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_state_and_monthly_schedule_shift.csv +613 -0
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +56 -82
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-appliances-dehumidifier-ief.osw → base-appliances-dehumidifier-ief-portable.osw} +57 -83
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-appliances-dehumidifier-50percent.osw → base-appliances-dehumidifier-ief-whole-home.osw} +59 -85
  49. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +56 -82
  50. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +56 -82
  51. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +56 -82
  52. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +61 -87
  53. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +56 -82
  54. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +56 -82
  55. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +56 -82
  56. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +56 -82
  57. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +56 -82
  58. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +56 -82
  59. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +56 -82
  60. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-baseboard.osw +341 -0
  61. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-fan-coil.osw +341 -0
  62. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-mechvent-shared-preconditioning.osw → base-bldgtype-multifamily-shared-mechvent-preconditioning.osw} +70 -95
  63. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-mechvent-shared.osw → base-bldgtype-multifamily-shared-mechvent.osw} +70 -95
  64. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +341 -0
  65. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +341 -0
  66. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +341 -0
  67. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-single-family-attached.osw → base-bldgtype-single-family-attached.osw} +59 -85
  68. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +56 -82
  69. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +56 -82
  70. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +56 -82
  71. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +56 -82
  72. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +56 -82
  73. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +56 -82
  74. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +56 -82
  75. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +56 -82
  76. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +56 -82
  77. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +56 -82
  78. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +56 -82
  79. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +56 -82
  80. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +57 -83
  81. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +56 -82
  82. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +56 -82
  83. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +56 -82
  84. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +56 -82
  85. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +56 -82
  86. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +56 -82
  87. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +56 -82
  88. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +56 -82
  89. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +56 -82
  90. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +56 -82
  91. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +56 -82
  92. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +56 -82
  93. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +338 -0
  94. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +56 -82
  95. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +338 -0
  96. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +56 -82
  97. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +56 -82
  98. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +338 -0
  99. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +56 -82
  100. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +56 -82
  101. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +56 -82
  102. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +56 -82
  103. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +56 -82
  104. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +56 -83
  105. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +337 -0
  106. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +56 -82
  107. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +337 -0
  108. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +56 -82
  109. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +56 -82
  110. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +56 -82
  111. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +56 -82
  112. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +56 -82
  113. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +56 -82
  114. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +56 -82
  115. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +56 -82
  116. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +56 -82
  117. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +56 -82
  118. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +56 -82
  119. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +56 -82
  120. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +56 -82
  121. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +56 -82
  122. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +56 -82
  123. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +57 -83
  124. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +57 -83
  125. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +56 -82
  126. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +56 -82
  127. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +56 -82
  128. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +56 -82
  129. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +55 -81
  130. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +55 -81
  131. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +55 -81
  132. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +55 -81
  133. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +55 -81
  134. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +337 -0
  135. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +337 -0
  136. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +56 -82
  137. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +56 -82
  138. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +56 -82
  139. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +56 -82
  140. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +56 -82
  141. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +56 -82
  142. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +56 -82
  143. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +56 -82
  144. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +56 -82
  145. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +56 -82
  146. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +56 -82
  147. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +56 -82
  148. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +56 -82
  149. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +56 -82
  150. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +55 -81
  151. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +55 -81
  152. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +55 -81
  153. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +55 -81
  154. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +56 -82
  155. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +56 -82
  156. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +56 -82
  157. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +56 -82
  158. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +57 -83
  159. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +56 -82
  160. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +56 -82
  161. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +57 -83
  162. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +56 -82
  163. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +337 -0
  164. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +56 -82
  165. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +56 -82
  166. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +56 -82
  167. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +56 -82
  168. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +56 -82
  169. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +56 -82
  170. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +56 -82
  171. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +56 -82
  172. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +56 -82
  173. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +336 -0
  174. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +336 -0
  175. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +56 -84
  176. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw +339 -0
  177. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +339 -0
  178. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +339 -0
  179. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +339 -0
  180. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +340 -0
  181. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +340 -0
  182. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +340 -0
  183. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +338 -0
  184. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +338 -0
  185. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +338 -0
  186. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +339 -0
  187. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +338 -0
  188. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +340 -0
  189. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +56 -82
  190. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +56 -82
  191. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +56 -82
  192. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +56 -82
  193. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +57 -83
  194. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +57 -83
  195. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +56 -82
  196. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +57 -83
  197. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +337 -0
  198. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +56 -82
  199. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +56 -82
  200. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +56 -82
  201. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +56 -82
  202. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +56 -82
  203. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +56 -82
  204. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +56 -82
  205. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +57 -83
  206. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +56 -82
  207. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +56 -82
  208. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +64 -90
  209. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +56 -82
  210. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +69 -95
  211. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +337 -0
  212. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-honolulu-hi.osw +337 -0
  213. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +56 -82
  214. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +337 -0
  215. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +337 -0
  216. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +56 -82
  217. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +64 -92
  218. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +57 -83
  219. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +56 -82
  220. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +56 -82
  221. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +56 -82
  222. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +337 -0
  223. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +56 -82
  224. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +56 -82
  225. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +56 -82
  226. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +56 -82
  227. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +56 -82
  228. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +57 -83
  229. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +60 -86
  230. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +60 -86
  231. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +56 -82
  232. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +337 -0
  233. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +52 -78
  234. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +52 -78
  235. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-vacancy-6-months.osw → base-schedules-stochastic-vacant.osw} +59 -85
  236. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +56 -82
  237. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +56 -82
  238. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +56 -82
  239. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +56 -82
  240. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +56 -82
  241. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +56 -82
  242. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +56 -82
  243. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +56 -82
  244. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +71 -57
  245. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +56 -82
  246. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +341 -0
  247. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +341 -0
  248. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +341 -0
  249. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +341 -0
  250. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +341 -0
  251. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +341 -0
  252. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +341 -0
  253. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +341 -0
  254. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +341 -0
  255. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +341 -0
  256. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +341 -0
  257. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +341 -0
  258. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +341 -0
  259. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +341 -0
  260. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +341 -0
  261. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +341 -0
  262. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +341 -0
  263. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +341 -0
  264. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +341 -0
  265. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +341 -0
  266. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +341 -0
  267. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +341 -0
  268. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +341 -0
  269. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +341 -0
  270. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +341 -0
  271. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
  272. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +341 -0
  273. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
  274. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +341 -0
  275. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +341 -0
  276. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +341 -0
  277. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
  278. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +341 -0
  279. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
  280. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +341 -0
  281. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
  282. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +341 -0
  283. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
  284. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +341 -0
  285. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
  286. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +341 -0
  287. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +341 -0
  288. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +341 -0
  289. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +341 -0
  290. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +341 -0
  291. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
  292. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +341 -0
  293. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
  294. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +341 -0
  295. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +341 -0
  296. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +341 -0
  297. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
  298. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +341 -0
  299. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
  300. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +341 -0
  301. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
  302. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +341 -0
  303. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
  304. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +341 -0
  305. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
  306. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +341 -0
  307. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +341 -0
  308. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +341 -0
  309. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +341 -0
  310. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +339 -0
  311. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +339 -0
  312. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-flat.osw +339 -0
  313. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-pv-shared.osw → extra-bldgtype-single-family-attached-double-exterior.osw} +62 -89
  314. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +339 -0
  315. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-dhw-shared-water-heater.osw → extra-bldgtype-single-family-attached-single-exterior-front.osw} +60 -86
  316. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +339 -0
  317. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +339 -0
  318. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +339 -0
  319. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +339 -0
  320. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +339 -0
  321. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-multifamily.osw → extra-bldgtype-single-family-attached-unconditioned-basement.osw} +64 -91
  322. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +339 -0
  323. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +339 -0
  324. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +339 -0
  325. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +339 -0
  326. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +339 -0
  327. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +339 -0
  328. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +56 -82
  329. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +337 -0
  330. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +337 -0
  331. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +337 -0
  332. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +56 -82
  333. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +339 -0
  334. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-hot-tub-heater-with-zero-kwh.osw +337 -0
  335. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-pool-heater-with-zero-kwh.osw +337 -0
  336. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +56 -82
  337. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +338 -0
  338. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +336 -0
  339. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +337 -0
  340. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +337 -0
  341. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-second-heating-system-fireplace.osw → extra-second-heating-system-fireplace-to-heating-system.osw} +58 -84
  342. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +337 -0
  343. 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} +56 -82
  344. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +56 -82
  345. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +337 -0
  346. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +337 -0
  347. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +337 -0
  348. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +337 -0
  349. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +337 -0
  350. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +59 -85
  351. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +337 -0
  352. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +56 -82
  353. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +56 -82
  354. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +56 -82
  355. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +56 -82
  356. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +337 -0
  357. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +56 -82
  358. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +64 -89
  359. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +64 -89
  360. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +63 -88
  361. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-hvac-programmable-thermostat.osw → invalid_files/multipliers-without-fuel-loads.osw} +54 -80
  362. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +337 -0
  363. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-tv-plug-loads.osw +337 -0
  364. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-dhw-uef.osw → invalid_files/multipliers-without-vehicle-plug-loads.osw} +58 -84
  365. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +337 -0
  366. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +56 -82
  367. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +56 -82
  368. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +56 -82
  369. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +337 -0
  370. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +56 -82
  371. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +337 -0
  372. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +58 -84
  373. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +58 -84
  374. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +56 -82
  375. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +56 -82
  376. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-with-shared-system.osw +337 -0
  377. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +56 -82
  378. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +56 -82
  379. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +56 -82
  380. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +59 -85
  381. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +58 -84
  382. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +56 -82
  383. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +337 -0
  384. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/vacant.csv +8761 -0
  385. data/example_files/resources/hpxml-measures/Changelog.md +249 -0
  386. data/example_files/resources/hpxml-measures/Gemfile +2 -5
  387. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +404 -1357
  388. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +247 -171
  389. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +11 -101
  390. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +824 -301
  391. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +18 -35
  392. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +526 -0
  393. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +135 -207
  394. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +14 -186
  395. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +549 -93
  396. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +12 -15
  397. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +78 -0
  398. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +413 -15
  399. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +48 -37
  400. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +1627 -1227
  401. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +1192 -434
  402. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +1555 -1616
  403. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +1436 -1479
  404. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +3 -2
  405. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +22 -10
  406. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +85 -19
  407. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +4 -26
  408. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +22 -46
  409. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +22 -21
  410. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +51 -14
  411. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +24 -7
  412. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +2 -0
  413. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +80 -19
  414. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +9 -2
  415. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +106 -75
  416. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +109 -34
  417. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +22 -36
  418. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +1565 -768
  419. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +151 -0
  420. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +101 -0
  421. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +9 -18
  422. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +316 -28
  423. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +53 -0
  424. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +4 -2
  425. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +13 -11
  426. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +4 -2
  427. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +5 -3
  428. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +13 -11
  429. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +102 -62
  430. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +189 -35
  431. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +26 -0
  432. data/example_files/resources/hpxml-measures/README.md +5 -5
  433. data/example_files/resources/hpxml-measures/Rakefile +2 -10
  434. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +416 -299
  435. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.xml +364 -481
  436. data/example_files/resources/hpxml-measures/SimulationOutputReport/resources/constants.rb +1 -2
  437. data/example_files/resources/hpxml-measures/SimulationOutputReport/tests/output_report_test.rb +327 -320
  438. data/example_files/resources/hpxml-measures/docs/source/build_residential_hpxml.rst +3 -3
  439. data/example_files/resources/hpxml-measures/docs/source/conf.py +11 -5
  440. data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +6 -6
  441. data/example_files/resources/hpxml-measures/docs/source/index.rst +2 -2
  442. data/example_files/resources/hpxml-measures/docs/source/intro.rst +7 -109
  443. data/example_files/resources/hpxml-measures/docs/source/nstatic/stylesheet.css +13 -1
  444. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +2482 -0
  445. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +282 -0
  446. data/example_files/resources/hpxml-measures/tasks.rb +2494 -1248
  447. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3-cache.csv +35 -0
  448. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3.epw +8768 -0
  449. data/example_files/resources/hpxml-measures/weather/USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv +10 -10
  450. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3-cache.csv +35 -0
  451. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3.epw +8768 -0
  452. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3-cache.csv +35 -0
  453. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3.epw +8768 -0
  454. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3-cache.csv +35 -0
  455. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3.epw +8768 -0
  456. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +96 -21
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +558 -559
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-appliances-dehumidifier-ief.xml → base-appliances-dehumidifier-ief-portable.xml} +8 -7
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-appliances-dehumidifier-50percent.xml → base-appliances-dehumidifier-ief-whole-home.xml} +10 -9
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +535 -0
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +525 -524
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +558 -559
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +564 -565
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +513 -513
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +558 -559
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +558 -559
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +558 -559
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +565 -566
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +633 -634
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +531 -532
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +517 -518
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +562 -563
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +565 -566
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-multifamily-buffer-space.xml → base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml} +34 -62
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +554 -0
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-non-freezing-space.xml → base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml} +34 -62
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-heated-space.xml → base-bldgtype-multifamily-adjacent-to-other-heated-space.xml} +34 -62
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-housing-unit.xml → base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml} +34 -62
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +425 -0
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +457 -0
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +427 -0
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +479 -0
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +474 -0
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +408 -0
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +439 -0
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +406 -0
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +409 -0
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +457 -0
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +407 -0
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +438 -0
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +408 -0
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +456 -0
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +451 -0
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +460 -0
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +451 -0
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +466 -0
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-mechvent-shared-multiple.xml → base-bldgtype-multifamily-shared-mechvent-multiple.xml} +43 -415
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +489 -0
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +473 -0
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +465 -0
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +458 -0
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +451 -0
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +448 -0
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +619 -0
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +516 -519
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +516 -519
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +550 -551
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +7 -9
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +563 -564
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +548 -549
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +550 -551
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +550 -551
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +567 -568
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +517 -520
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +517 -520
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +518 -521
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +525 -528
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +517 -520
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +567 -568
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +568 -569
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +566 -567
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +522 -525
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +562 -563
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +575 -578
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +497 -497
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +565 -566
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +565 -566
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +565 -566
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +565 -566
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +565 -566
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +577 -578
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +577 -578
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +577 -578
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +570 -571
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +577 -578
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +577 -578
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +563 -564
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +564 -0
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +563 -564
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +565 -0
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +563 -564
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +561 -562
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +564 -0
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +569 -570
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +576 -577
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +561 -562
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +563 -564
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +563 -564
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +561 -562
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +561 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +560 -561
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +561 -0
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +568 -569
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +575 -576
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +560 -561
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +560 -561
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +661 -664
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +575 -576
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +562 -563
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +562 -563
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +562 -563
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +562 -563
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +636 -639
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +562 -563
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +562 -563
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +562 -563
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +565 -566
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +561 -562
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +582 -578
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +590 -591
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +601 -0
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +590 -591
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +517 -0
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +2474 -2493
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2475 -0
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +754 -755
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +504 -505
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-windows-interior-shading.xml → base-enclosure-windows-shading.xml} +23 -9
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +498 -497
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +644 -0
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +724 -729
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +562 -563
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +562 -563
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +685 -688
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +516 -517
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +609 -610
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +558 -559
  588. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +573 -574
  589. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +573 -574
  590. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +573 -574
  591. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +576 -577
  592. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +627 -628
  593. 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-air-to-air-heat-pump-1-speed-cooling-only.xml} +8 -12
  594. 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-air-to-air-heat-pump-1-speed-heating-only.xml} +9 -9
  595. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +561 -562
  596. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +561 -562
  597. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +561 -562
  598. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +553 -0
  599. 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-heating-only.xml} +5 -6
  600. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-manual-s-oversize-allowances.xml +561 -0
  601. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed.xml +558 -0
  602. 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} +4 -5
  603. 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} +4 -5
  604. 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-manual-s-oversize-allowances.xml} +4 -5
  605. 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.xml} +4 -5
  606. 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} +2 -5
  607. 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} +4 -6
  608. 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} +2 -5
  609. 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} +547 -548
  610. 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} +4 -5
  611. 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} +4 -5
  612. 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} +570 -571
  613. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml +559 -0
  614. 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} +557 -558
  615. 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} +2 -5
  616. 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} +4 -5
  617. 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} +5 -6
  618. 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} +4 -5
  619. 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} +4 -5
  620. 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} +4 -5
  621. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml → base-hvac-autosize-furnace-gas-only.xml} +4 -6
  622. 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} +4 -5
  623. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +555 -0
  624. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +560 -0
  625. 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} +4 -6
  626. 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} +4 -6
  627. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +547 -0
  628. 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} +551 -552
  629. 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} +556 -557
  630. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml +560 -0
  631. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted.xml} +556 -557
  632. 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} +2 -5
  633. 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} +5 -6
  634. 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} +5 -6
  635. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-autosize.xml → base-hvac-autosize.xml} +4 -5
  636. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +518 -521
  637. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +518 -521
  638. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +571 -573
  639. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +519 -522
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +518 -521
  641. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +518 -521
  642. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +518 -521
  643. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +548 -549
  644. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +548 -549
  645. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +548 -549
  646. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +575 -576
  647. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +532 -535
  648. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +562 -563
  649. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +562 -563
  650. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +562 -563
  651. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +562 -563
  652. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +561 -562
  653. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +562 -563
  654. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +509 -512
  655. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +555 -555
  656. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +536 -528
  657. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +503 -505
  658. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +6 -7
  659. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +6 -57
  660. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +6 -7
  661. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +549 -0
  662. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +562 -563
  663. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +548 -549
  664. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +562 -563
  665. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +562 -563
  666. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +5 -7
  667. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +560 -561
  668. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +548 -549
  669. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +548 -549
  670. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +548 -549
  671. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +576 -579
  672. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +557 -0
  673. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +563 -0
  674. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +7 -9
  675. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-flowrate.xml → base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.xml} +8 -9
  676. 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} +13 -8
  677. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.xml +567 -0
  678. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.xml +567 -0
  679. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.xml +572 -0
  680. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.xml +572 -0
  681. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.xml +572 -0
  682. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-only.xml +553 -0
  683. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-ground-to-air-heat-pump.xml +566 -0
  684. 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} +10 -5
  685. 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-install-quality-all-mini-split-heat-pump-ducted.xml} +13 -8
  686. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-blower-efficiency-furnace-gas-central-ac-1-speed.xml +569 -0
  687. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-misc-shelter-coefficient.xml → base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.xml} +9 -10
  688. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.xml +570 -0
  689. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +547 -548
  690. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +508 -511
  691. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +554 -555
  692. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +560 -561
  693. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +560 -561
  694. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +515 -518
  695. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +21 -13
  696. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +486 -489
  697. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +6 -57
  698. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +567 -0
  699. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +570 -571
  700. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +508 -511
  701. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +508 -511
  702. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +562 -563
  703. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +6 -7
  704. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +6 -7
  705. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +565 -566
  706. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +562 -563
  707. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +6 -7
  708. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +573 -574
  709. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-detailed.xml +585 -586
  710. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +488 -489
  711. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +562 -563
  712. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +573 -563
  713. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +516 -517
  714. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +573 -563
  715. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +563 -0
  716. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +517 -0
  717. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +516 -517
  718. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +517 -0
  719. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +577 -0
  720. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +574 -575
  721. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +590 -591
  722. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +545 -548
  723. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +549 -541
  724. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +575 -576
  725. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +576 -577
  726. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +576 -577
  727. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +574 -575
  728. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +574 -575
  729. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +575 -576
  730. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +575 -576
  731. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +796 -795
  732. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +574 -575
  733. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +572 -573
  734. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +478 -495
  735. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +579 -0
  736. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +758 -833
  737. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +749 -820
  738. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +550 -559
  739. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +575 -576
  740. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-calendar-year.xml → base-misc-shielding-of-home.xml} +7 -8
  741. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +728 -725
  742. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1657 -0
  743. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +6 -7
  744. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +564 -0
  745. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +6 -7
  746. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +6 -7
  747. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +563 -564
  748. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +569 -570
  749. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +565 -566
  750. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +566 -567
  751. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +562 -563
  752. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +562 -563
  753. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/boiler-invalid-afue.xml +519 -0
  754. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml +532 -535
  755. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +562 -563
  756. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +562 -563
  757. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +562 -563
  758. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +535 -0
  759. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +535 -0
  760. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +575 -578
  761. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-uef.xml → invalid_files/dhw-invalid-ef-tank.xml} +7 -8
  762. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +564 -0
  763. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +562 -563
  764. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +563 -0
  765. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +563 -0
  766. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +562 -563
  767. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +562 -563
  768. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +562 -563
  769. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +546 -547
  770. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +543 -544
  771. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +546 -545
  772. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +563 -0
  773. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +448 -0
  774. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +613 -616
  775. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml +626 -629
  776. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +610 -611
  777. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +550 -551
  778. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +472 -473
  779. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +488 -534
  780. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +760 -0
  781. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +759 -0
  782. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +761 -0
  783. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +759 -0
  784. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +563 -0
  785. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +460 -0
  786. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-output-greater-than-consumption.xml +579 -0
  787. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +559 -560
  788. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +21 -13
  789. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +21 -13
  790. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml +528 -534
  791. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +546 -549
  792. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +546 -549
  793. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +21 -13
  794. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +569 -0
  795. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml +570 -571
  796. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-shared-negative-seer-eq.xml +407 -0
  797. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +563 -0
  798. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +563 -0
  799. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +563 -0
  800. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +563 -0
  801. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +569 -567
  802. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +562 -563
  803. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +562 -563
  804. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +466 -0
  805. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-surfaces.xml +644 -0
  806. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/{appliances-location-unconditioned-space.xml → invalid-foundation-wall-properties.xml} +39 -29
  807. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id.xml +591 -0
  808. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +591 -0
  809. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +563 -0
  810. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +565 -0
  811. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +575 -576
  812. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +465 -0
  813. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/{slab-zero-exposed-perimeter.xml → invalid-number-of-conditioned-floors.xml} +7 -8
  814. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +451 -0
  815. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +550 -551
  816. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml +517 -520
  817. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +564 -565
  818. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +563 -0
  819. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +473 -0
  820. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +562 -563
  821. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +582 -578
  822. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +562 -563
  823. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +21 -13
  824. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +560 -561
  825. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +562 -563
  826. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +562 -563
  827. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-surface.xml +575 -566
  828. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +562 -563
  829. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +1657 -0
  830. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +1657 -0
  831. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-cooling-systems.xml +432 -0
  832. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-heating-systems.xml +434 -0
  833. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +590 -591
  834. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +562 -563
  835. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +563 -0
  836. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +546 -547
  837. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +562 -563
  838. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +568 -569
  839. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +568 -569
  840. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +563 -564
  841. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +526 -529
  842. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-fraction-one.xml +571 -0
  843. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +531 -534
  844. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +565 -566
  845. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +531 -534
  846. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +575 -576
  847. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +562 -563
  848. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +562 -563
  849. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +465 -827
  850. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +465 -827
  851. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +590 -591
  852. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml +577 -578
  853. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +562 -563
  854. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +562 -563
  855. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +562 -563
  856. data/example_files/resources/hpxml-measures/workflow/template.osw +5 -1
  857. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +6 -17
  858. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +6 -17
  859. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +6 -17
  860. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +6 -17
  861. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +6 -17
  862. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +6 -17
  863. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +6 -17
  864. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +6 -17
  865. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +6 -17
  866. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +6 -17
  867. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +6 -17
  868. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +6 -17
  869. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +6 -17
  870. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +6 -17
  871. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +6 -17
  872. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +6 -17
  873. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +6 -17
  874. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +6 -17
  875. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +6 -17
  876. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +6 -17
  877. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +6 -17
  878. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +6 -17
  879. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +6 -19
  880. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +6 -19
  881. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -19
  882. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -19
  883. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +294 -0
  884. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +27 -0
  885. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +294 -0
  886. data/example_files/resources/hpxml-measures/workflow/tests/compare.rb +130 -0
  887. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +522 -527
  888. data/example_files/{measures/BuildResidentialModel/resources → resources}/measure-info.json +0 -0
  889. data/example_files/{measures/BuildResidentialModel/resources → resources}/meta_measure.rb +53 -44
  890. data/example_files/validation_schema.yaml +149 -0
  891. data/example_files/visualization/input_visualization_feature.html +213 -56
  892. data/example_files/visualization/input_visualization_scenario.html +92 -30
  893. data/lib/uo_cli.rb +406 -128
  894. data/lib/uo_cli/version.rb +17 -7
  895. data/requirements.txt +2 -0
  896. data/scripts/setup-env-gitbash.sh +5 -5
  897. data/scripts/setup-env-unix.sh +4 -4
  898. data/scripts/setup-env.bat +14 -11
  899. data/scripts/setup-env.ps1 +13 -10
  900. data/uo_cli.gemspec +10 -8
  901. metadata +390 -130
  902. data/developer_nrel_key.rb +0 -31
  903. data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.rb +0 -1005
  904. data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.xml +0 -326
  905. data/example_files/measures/ResidentialGeometryCreateMultifamily/tests/create_residential_multifamily_geometry_test.rb +0 -477
  906. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.rb +0 -1039
  907. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.xml +0 -393
  908. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/tests/create_residential_single_family_attached_geometry_test.rb +0 -456
  909. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.rb +0 -979
  910. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.xml +0 -388
  911. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/tests/create_residential_single_family_detached_geometry_test.rb +0 -704
  912. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/location.rb +0 -24
  913. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.yml +0 -61
  914. data/example_files/resources/hpxml-measures/docs/source/hpxml_to_openstudio.rst +0 -1386
  915. data/example_files/resources/hpxml-measures/docs/source/simulation_output_report.rst +0 -252
  916. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-laundry-room.xml +0 -828
  917. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater-recirc.xml +0 -820
  918. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater.xml +0 -813
  919. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-attached-multifamily.xml +0 -810
  920. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-common-surfaces.xml +0 -928
  921. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ideal-air.xml +0 -501
  922. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple2.xml +0 -838
  923. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-baseboard.xml +0 -777
  924. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil-ducted.xml +0 -808
  925. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil.xml +0 -780
  926. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-water-loop-heat-pump.xml +0 -820
  927. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-cooling-tower-water-loop-heat-pump.xml +0 -815
  928. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-baseboard.xml +0 -760
  929. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-ducted.xml +0 -790
  930. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-eae.xml +0 -759
  931. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil.xml +0 -762
  932. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-water-loop-heat-pump.xml +0 -796
  933. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-baseboard.xml +0 -759
  934. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil-ducted.xml +0 -789
  935. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil.xml +0 -761
  936. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-water-loop-heat-pump.xml +0 -796
  937. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-cooling-tower-only-water-loop-heat-pump.xml +0 -791
  938. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-ground-loop-ground-to-air-heat-pump.xml +0 -814
  939. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared-preconditioning.xml +0 -851
  940. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared.xml +0 -835
  941. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-shared.xml +0 -827
  942. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/coal-for-non-boiler-heating.xml +0 -514
  943. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type.xml +0 -828
  944. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-interior-shading.xml +0 -564
@@ -3,20 +3,33 @@
3
3
  class XMLHelper
4
4
  # Adds the child element with 'element_name' and sets its value. Returns the
5
5
  # child element.
6
- def self.add_element(parent, element_name, value = nil)
6
+ def self.add_element(parent, element_name, value = nil, datatype = nil, defaulted = false)
7
7
  added = Oga::XML::Element.new(name: element_name)
8
8
  parent.children << added
9
9
  if not value.nil?
10
+ if datatype == :integer
11
+ value = to_integer(value, parent, element_name)
12
+ elsif datatype == :float
13
+ value = to_float(value, parent, element_name)
14
+ elsif datatype == :boolean
15
+ value = to_boolean(value, parent, element_name)
16
+ elsif datatype != :string
17
+ # If value provided, datatype required
18
+ fail 'Unexpected datatype.'
19
+ end
10
20
  added.inner_text = value.to_s
11
21
  end
22
+ if defaulted
23
+ XMLHelper.add_attribute(added, 'dataSource', 'software')
24
+ end
12
25
  return added
13
26
  end
14
27
 
15
28
  # Adds the child element with 'element_name' to a single extension element and
16
29
  # sets its value. Returns the extension element.
17
- def self.add_extension(parent, element_name, value)
30
+ def self.add_extension(parent, element_name, value, datatype, defaulted = false)
18
31
  extension = XMLHelper.create_elements_as_needed(parent, ['extension'])
19
- return XMLHelper.add_element(extension, element_name, value)
32
+ return XMLHelper.add_element(extension, element_name, value, datatype, defaulted)
20
33
  end
21
34
 
22
35
  # Creates a hierarchy of elements under the parent element based on the supplied
@@ -44,23 +57,47 @@ class XMLHelper
44
57
  end
45
58
 
46
59
  # Returns the value of 'element_name' in the parent element or nil.
47
- def self.get_value(parent, element_name)
48
- val = parent.at_xpath(element_name)
49
- if val.nil?
50
- return val
60
+ def self.get_value(parent, element_name, datatype)
61
+ element = parent.at_xpath(element_name)
62
+ if element.nil?
63
+ return
64
+ end
65
+
66
+ value = element.text
67
+
68
+ if datatype == :integer
69
+ value = to_integer_or_nil(value, parent, element_name)
70
+ elsif datatype == :float
71
+ value = to_float_or_nil(value, parent, element_name)
72
+ elsif datatype == :boolean
73
+ value = to_boolean_or_nil(value, parent, element_name)
74
+ elsif datatype != :string
75
+ fail 'Unexpected datatype.'
51
76
  end
52
77
 
53
- return val.text
78
+ return value
54
79
  end
55
80
 
56
81
  # Returns the value(s) of 'element_name' in the parent element or [].
57
- def self.get_values(parent, element_name)
58
- vals = []
59
- parent.xpath(element_name).each do |val|
60
- vals << val.text
82
+ def self.get_values(parent, element_name, datatype)
83
+ values = []
84
+ parent.xpath(element_name).each do |value|
85
+ value = value.text
86
+
87
+ if datatype == :integer
88
+ value = to_integer_or_nil(value, parent, element_name)
89
+ elsif datatype == :float
90
+ value = to_float_or_nil(value, parent, element_name)
91
+ elsif datatype == :boolean
92
+ value = to_boolean_or_nil(value, parent, element_name)
93
+ elsif datatype != :string
94
+ fail 'Unexpected datatype.'
95
+ end
96
+
97
+ values << value
61
98
  end
62
99
 
63
- return vals
100
+ return values
64
101
  end
65
102
 
66
103
  # Returns the element in the parent element.
@@ -105,28 +142,10 @@ class XMLHelper
105
142
  return element.get(attr_name)
106
143
  end
107
144
 
108
- # Copies the element if it exists
109
- def self.copy_element(dest, src, element_name, backup_val = nil)
110
- return if src.nil?
111
-
112
- element = src.at_xpath(element_name)
113
- if not element.nil?
114
- dest << element.dup
115
- elsif not backup_val.nil?
116
- # Element didn't exist in src, assign backup value instead
117
- add_element(dest, element_name.split('/')[-1], backup_val)
118
- end
119
- end
120
-
121
- # Copies the multiple elements
122
- def self.copy_elements(dest, src, element_name)
123
- return if src.nil?
145
+ def self.delete_attribute(element, attr_name)
146
+ return if element.nil?
124
147
 
125
- if not src.xpath(element_name).nil?
126
- src.xpath(element_name).each do |el|
127
- dest << el.dup
128
- end
129
- end
148
+ element.unset(attr_name)
130
149
  end
131
150
 
132
151
  def self.validate(doc, xsd_path, runner = nil)
@@ -191,6 +210,7 @@ class XMLHelper
191
210
  doc_s.gsub!('"', "'")
192
211
  doc_s.gsub!(' />', '/>')
193
212
  doc_s.gsub!(' ?>', '?>')
213
+ doc_s.gsub!('&quot;', '"')
194
214
 
195
215
  # Write XML file
196
216
  if not Dir.exist? File.dirname(out_path)
@@ -201,3 +221,58 @@ class XMLHelper
201
221
  end
202
222
  end
203
223
  end
224
+
225
+ def to_float(value, parent, element_name)
226
+ begin
227
+ return Float(value)
228
+ rescue
229
+ fail "Cannot convert '#{value}' to float for #{parent.name}/#{element_name}."
230
+ end
231
+ end
232
+
233
+ def to_integer(value, parent, element_name)
234
+ begin
235
+ value = Float(value)
236
+ rescue
237
+ fail "Cannot convert '#{value}' to integer for #{parent.name}/#{element_name}."
238
+ end
239
+ if value % 1 == 0
240
+ return Integer(value)
241
+ else
242
+ fail "Cannot convert '#{value}' to integer for #{parent.name}/#{element_name}."
243
+ end
244
+ end
245
+
246
+ def to_boolean(value, parent = nil, element_name = nil)
247
+ if value.is_a? TrueClass
248
+ return true
249
+ elsif value.is_a? FalseClass
250
+ return false
251
+ elsif (value.downcase.to_s == 'true') || (value == '1') || (value == 1)
252
+ return true
253
+ elsif (value.downcase.to_s == 'false') || (value == '0') || (value == 0)
254
+ return false
255
+ end
256
+
257
+ if (not parent.nil?) && (not element_name.nil?)
258
+ fail "Cannot convert '#{value}' to boolean for #{parent.name}/#{element_name}."
259
+ end
260
+ end
261
+
262
+ def to_float_or_nil(value, parent, element_name)
263
+ return if value.nil?
264
+
265
+ return to_float(value, parent, element_name)
266
+ end
267
+
268
+ def to_integer_or_nil(value, parent, element_name)
269
+ return if value.nil?
270
+
271
+ return to_integer(value, parent, element_name)
272
+ end
273
+
274
+ def to_boolean_or_nil(value, parent, element_name)
275
+ return if value.nil?
276
+
277
+ return to_boolean(value, parent, element_name)
278
+ end
@@ -2,43 +2,17 @@
2
2
 
3
3
  require_relative '../resources/minitest_helper'
4
4
  require 'openstudio'
5
- require 'openstudio/ruleset/ShowRunnerOutput'
6
- require 'minitest/autorun'
5
+ require 'openstudio/measure/ShowRunnerOutput'
7
6
  require 'fileutils'
8
7
  require_relative '../measure.rb'
9
8
  require_relative '../resources/util.rb'
9
+ require_relative 'util.rb'
10
10
 
11
11
  class HPXMLtoOpenStudioAirflowTest < MiniTest::Test
12
12
  def sample_files_dir
13
13
  return File.join(File.dirname(__FILE__), '..', '..', 'workflow', 'sample_files')
14
14
  end
15
15
 
16
- def get_ems_values(ems_objects, name)
17
- values = {}
18
- ems_objects.each do |ems_object|
19
- next unless ems_object.name.to_s.include? name.gsub(' ', '_')
20
-
21
- ems_object.lines.each do |line|
22
- next unless line.downcase.start_with? 'set'
23
-
24
- lhs, rhs = line.split('=')
25
- lhs = lhs.gsub('Set', '').gsub('set', '').strip
26
- rhs = rhs.gsub(',', '').gsub(';', '').strip
27
- values[lhs] = [] if values[lhs].nil?
28
- # eg. "Q = Q + 1.5"
29
- if rhs.include? '+'
30
- rhs_els = rhs.split('+')
31
- rhs = rhs_els.map { |s| s.to_f }.sum(0.0)
32
- else
33
- rhs = rhs.to_f
34
- end
35
- values[lhs] << rhs
36
- end
37
- end
38
- assert_operator(values.size, :>, 0)
39
- return values
40
- end
41
-
42
16
  def get_eed_for_ventilation(model, ee_name)
43
17
  eeds = []
44
18
  model.getElectricEquipmentDefinitions.each do |eed|
@@ -92,7 +66,7 @@ class HPXMLtoOpenStudioAirflowTest < MiniTest::Test
92
66
  # Check infiltration/ventilation program
93
67
  program_values = get_ems_values(model.getEnergyManagementSystemPrograms, "#{Constants.ObjectNameInfiltration} program")
94
68
  assert_in_epsilon(0.0436, program_values['c'].sum, 0.01)
95
- assert_in_epsilon(0.0818, program_values['Cs'].sum, 0.01)
69
+ assert_in_epsilon(0.0661, program_values['Cs'].sum, 0.01)
96
70
  assert_in_epsilon(0.1323, program_values['Cw'].sum, 0.01)
97
71
  end
98
72
 
@@ -127,7 +101,7 @@ class HPXMLtoOpenStudioAirflowTest < MiniTest::Test
127
101
 
128
102
  # Check infiltration/ventilation program
129
103
  program_values = get_ems_values(model.getEnergyManagementSystemPrograms, "#{Constants.ObjectNameInfiltration} program")
130
- assert_in_epsilon(0.3028, program_values['c'].sum, 0.01)
104
+ assert_in_epsilon(0.0904, program_values['c'].sum, 0.01)
131
105
  assert_in_epsilon(0.0573, program_values['Cs'].sum, 0.01)
132
106
  assert_in_epsilon(0.1446, program_values['Cw'].sum, 0.01)
133
107
  end
@@ -430,7 +404,7 @@ class HPXMLtoOpenStudioAirflowTest < MiniTest::Test
430
404
 
431
405
  def test_shared_mechvent_multiple
432
406
  args_hash = {}
433
- args_hash['hpxml_path'] = File.absolute_path(File.join(sample_files_dir, 'base-mechvent-shared-multiple.xml'))
407
+ args_hash['hpxml_path'] = File.absolute_path(File.join(sample_files_dir, 'base-bldgtype-multifamily-shared-mechvent-multiple.xml'))
434
408
  model, hpxml = _test_measure(args_hash)
435
409
 
436
410
  # Get HPXML values
@@ -540,14 +514,23 @@ class HPXMLtoOpenStudioAirflowTest < MiniTest::Test
540
514
  assert_equal(5066, exterior_area)
541
515
  assert_equal(5066, total_area)
542
516
 
543
- # Test complex SFA/MF building w/ unvented attic within infiltration volume
544
- hpxml = HPXML.new(hpxml_path: File.absolute_path(File.join(sample_files_dir, 'base-enclosure-attached-multifamily.xml')))
517
+ # Test unvented attic/crawlspace not within infiltration volume
518
+ hpxml = HPXML.new(hpxml_path: File.absolute_path(File.join(sample_files_dir, 'base-foundation-unvented-crawlspace.xml')))
545
519
  hpxml.attics.each do |attic|
546
- attic.within_infiltration_volume = true
520
+ attic.within_infiltration_volume = false
521
+ end
522
+ hpxml.foundations.each do |foundation|
523
+ foundation.within_infiltration_volume = false
547
524
  end
548
525
  total_area, exterior_area = hpxml.compartmentalization_boundary_areas
549
- assert_equal(5550, exterior_area)
550
- assert_equal(8076, total_area)
526
+ assert_equal(3900, exterior_area)
527
+ assert_equal(3900, total_area)
528
+
529
+ # Test multifamily
530
+ hpxml = HPXML.new(hpxml_path: File.absolute_path(File.join(sample_files_dir, 'base-bldgtype-multifamily.xml')))
531
+ total_area, exterior_area = hpxml.compartmentalization_boundary_areas
532
+ assert_equal(686, exterior_area)
533
+ assert_equal(2780, total_area)
551
534
  end
552
535
 
553
536
  def test_infiltration_assumed_height
@@ -590,6 +573,7 @@ class HPXMLtoOpenStudioAirflowTest < MiniTest::Test
590
573
  model = OpenStudio::Model::Model.new
591
574
 
592
575
  # get arguments
576
+ args_hash['output_dir'] = 'tests'
593
577
  arguments = measure.arguments(model)
594
578
  argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
595
579
 
@@ -614,6 +598,8 @@ class HPXMLtoOpenStudioAirflowTest < MiniTest::Test
614
598
 
615
599
  hpxml = HPXML.new(hpxml_path: args_hash['hpxml_path'])
616
600
 
601
+ File.delete(File.join(File.dirname(__FILE__), 'in.xml'))
602
+
617
603
  return model, hpxml
618
604
  end
619
605
  end
@@ -2,8 +2,7 @@
2
2
 
3
3
  require_relative '../resources/minitest_helper'
4
4
  require 'openstudio'
5
- require 'openstudio/ruleset/ShowRunnerOutput'
6
- require 'minitest/autorun'
5
+ require 'openstudio/measure/ShowRunnerOutput'
7
6
  require 'fileutils'
8
7
  require_relative '../measure.rb'
9
8
  require_relative '../resources/util.rb'
@@ -12,7 +11,7 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
12
11
  ConstantDaySchedule = '0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1'
13
12
  ConstantMonthSchedule = '1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1'
14
13
 
15
- def before_setup
14
+ def setup
16
15
  @root_path = File.absolute_path(File.join(File.dirname(__FILE__), '..', '..'))
17
16
  @sample_files_path = File.join(@root_path, 'workflow', 'sample_files')
18
17
  @tmp_hpxml_path = File.join(@sample_files_path, 'tmp.xml')
@@ -25,7 +24,7 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
25
24
  @args_hash['output_dir'] = File.absolute_path(@tmp_output_path)
26
25
  end
27
26
 
28
- def after_teardown
27
+ def teardown
29
28
  File.delete(@tmp_hpxml_path) if File.exist? @tmp_hpxml_path
30
29
  FileUtils.rm_rf(@tmp_output_path)
31
30
  end
@@ -35,15 +34,15 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
35
34
  hpxml = _create_hpxml('base.xml')
36
35
  hpxml.header.timestep = 30
37
36
  hpxml.header.sim_begin_month = 2
38
- hpxml.header.sim_begin_day_of_month = 2
37
+ hpxml.header.sim_begin_day = 2
39
38
  hpxml.header.sim_end_month = 11
40
- hpxml.header.sim_end_day_of_month = 11
39
+ hpxml.header.sim_end_day = 11
41
40
  hpxml.header.sim_calendar_year = 2008
42
41
  hpxml.header.dst_enabled = false
43
42
  hpxml.header.dst_begin_month = 3
44
- hpxml.header.dst_begin_day_of_month = 3
43
+ hpxml.header.dst_begin_day = 3
45
44
  hpxml.header.dst_end_month = 10
46
- hpxml.header.dst_end_day_of_month = 10
45
+ hpxml.header.dst_end_day = 10
47
46
  hpxml.header.use_max_load_for_heat_pumps = false
48
47
  hpxml.header.allow_increased_fixed_capacities = true
49
48
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
@@ -53,15 +52,15 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
53
52
  # Test defaults - DST not in weather file
54
53
  hpxml.header.timestep = nil
55
54
  hpxml.header.sim_begin_month = nil
56
- hpxml.header.sim_begin_day_of_month = nil
55
+ hpxml.header.sim_begin_day = nil
57
56
  hpxml.header.sim_end_month = nil
58
- hpxml.header.sim_end_day_of_month = nil
57
+ hpxml.header.sim_end_day = nil
59
58
  hpxml.header.sim_calendar_year = nil
60
59
  hpxml.header.dst_enabled = nil
61
60
  hpxml.header.dst_begin_month = nil
62
- hpxml.header.dst_begin_day_of_month = nil
61
+ hpxml.header.dst_begin_day = nil
63
62
  hpxml.header.dst_end_month = nil
64
- hpxml.header.dst_end_day_of_month = nil
63
+ hpxml.header.dst_end_day = nil
65
64
  hpxml.header.use_max_load_for_heat_pumps = nil
66
65
  hpxml.header.allow_increased_fixed_capacities = nil
67
66
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
@@ -72,15 +71,15 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
72
71
  hpxml = _create_hpxml('base-location-AMY-2012.xml')
73
72
  hpxml.header.timestep = nil
74
73
  hpxml.header.sim_begin_month = nil
75
- hpxml.header.sim_begin_day_of_month = nil
74
+ hpxml.header.sim_begin_day = nil
76
75
  hpxml.header.sim_end_month = nil
77
- hpxml.header.sim_end_day_of_month = nil
76
+ hpxml.header.sim_end_day = nil
78
77
  hpxml.header.sim_calendar_year = nil
79
78
  hpxml.header.dst_enabled = nil
80
79
  hpxml.header.dst_begin_month = nil
81
- hpxml.header.dst_begin_day_of_month = nil
80
+ hpxml.header.dst_begin_day = nil
82
81
  hpxml.header.dst_end_month = nil
83
- hpxml.header.dst_end_day_of_month = nil
82
+ hpxml.header.dst_end_day = nil
84
83
  hpxml.header.use_max_load_for_heat_pumps = nil
85
84
  hpxml.header.allow_increased_fixed_capacities = nil
86
85
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
@@ -92,17 +91,17 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
92
91
  # Test inputs not overridden by defaults
93
92
  hpxml = _create_hpxml('base.xml')
94
93
  hpxml.site.site_type = HPXML::SiteTypeRural
95
- hpxml.site.shelter_coefficient = 0.3
94
+ hpxml.site.shielding_of_home = HPXML::ShieldingExposed
96
95
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
97
96
  hpxml_default = _test_measure()
98
- _test_default_site_values(hpxml_default, HPXML::SiteTypeRural, 0.3)
97
+ _test_default_site_values(hpxml_default, HPXML::SiteTypeRural, HPXML::ShieldingExposed)
99
98
 
100
99
  # Test defaults
101
100
  hpxml.site.site_type = nil
102
- hpxml.site.shelter_coefficient = nil
101
+ hpxml.site.shielding_of_home = nil
103
102
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
104
103
  hpxml_default = _test_measure()
105
- _test_default_site_values(hpxml_default, HPXML::SiteTypeSuburban, 0.5)
104
+ _test_default_site_values(hpxml_default, HPXML::SiteTypeSuburban, HPXML::ShieldingNormal)
106
105
  end
107
106
 
108
107
  def test_occupancy
@@ -123,19 +122,57 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
123
122
  def test_building_construction
124
123
  # Test inputs not overridden by defaults
125
124
  hpxml = _create_hpxml('base-enclosure-infil-flue.xml')
126
- hpxml.building_construction.number_of_bathrooms = 4.0
125
+ hpxml.building_construction.number_of_bathrooms = 4
126
+ hpxml.building_construction.conditioned_building_volume = 20000
127
+ hpxml.building_construction.average_ceiling_height = 7
127
128
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
128
129
  hpxml_default = _test_measure()
129
- _test_default_building_construction_values(hpxml_default, 21600, true, 4)
130
+ _test_default_building_construction_values(hpxml_default, 20000, 7, true, 4)
130
131
 
131
- # Test defaults w/ average ceiling height
132
+ # Test defaults
132
133
  hpxml.building_construction.conditioned_building_volume = nil
133
- hpxml.building_construction.average_ceiling_height = 10
134
+ hpxml.building_construction.average_ceiling_height = nil
134
135
  hpxml.building_construction.has_flue_or_chimney = nil
135
136
  hpxml.building_construction.number_of_bathrooms = nil
136
137
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
137
138
  hpxml_default = _test_measure()
138
- _test_default_building_construction_values(hpxml_default, 27000, false, 2)
139
+ _test_default_building_construction_values(hpxml_default, 21600, 8, false, 2)
140
+
141
+ # Test defaults w/ average ceiling height
142
+ hpxml.building_construction.conditioned_building_volume = nil
143
+ hpxml.building_construction.average_ceiling_height = 10
144
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
145
+ hpxml_default = _test_measure()
146
+ _test_default_building_construction_values(hpxml_default, 27000, 10, false, 2)
147
+
148
+ # Test defaults w/ average ceiling height
149
+ hpxml.building_construction.conditioned_building_volume = 20000
150
+ hpxml.building_construction.average_ceiling_height = nil
151
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
152
+ hpxml_default = _test_measure()
153
+ _test_default_building_construction_values(hpxml_default, 20000, 7.4, false, 2)
154
+ end
155
+
156
+ def test_infiltration
157
+ # Test inputs not overridden by defaults
158
+ hpxml = _create_hpxml('base.xml')
159
+ hpxml.air_infiltration_measurements[0].infiltration_volume = 25000
160
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
161
+ hpxml_default = _test_measure()
162
+ _test_default_infiltration_values(hpxml_default, 25000)
163
+
164
+ # Test defaults w/ conditioned basement
165
+ hpxml.air_infiltration_measurements[0].infiltration_volume = nil
166
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
167
+ hpxml_default = _test_measure()
168
+ _test_default_infiltration_values(hpxml_default, 2700 * 8)
169
+
170
+ # Test defaults w/o conditioned basement
171
+ hpxml = _create_hpxml('base-foundation-slab.xml')
172
+ hpxml.air_infiltration_measurements[0].infiltration_volume = nil
173
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
174
+ hpxml_default = _test_measure()
175
+ _test_default_infiltration_values(hpxml_default, 1350 * 8)
139
176
  end
140
177
 
141
178
  def test_attics
@@ -168,45 +205,61 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
168
205
  _test_default_foundation_values(hpxml_default, 1.0 / 150.0)
169
206
  end
170
207
 
171
- def test_infiltration
208
+ def test_roofs
172
209
  # Test inputs not overridden by defaults
173
- hpxml = _create_hpxml('base.xml')
174
- hpxml.air_infiltration_measurements[0].infiltration_volume = 25000
210
+ hpxml = _create_hpxml('base-atticroof-radiant-barrier.xml')
211
+ hpxml.roofs[0].roof_type = HPXML::RoofTypeMetal
212
+ hpxml.roofs[0].solar_absorptance = 0.77
213
+ hpxml.roofs[0].roof_color = HPXML::ColorDark
214
+ hpxml.roofs[0].emittance = 0.88
175
215
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
176
216
  hpxml_default = _test_measure()
177
- _test_default_infiltration_values(hpxml_default, 25000)
217
+ _test_default_roof_values(hpxml_default, HPXML::RoofTypeMetal, 0.77, HPXML::ColorDark, 0.88, true)
178
218
 
179
- # Test defaults w/ conditioned basement
180
- hpxml.air_infiltration_measurements[0].infiltration_volume = nil
219
+ # Test defaults w/ RoofColor
220
+ hpxml.roofs[0].roof_type = nil
221
+ hpxml.roofs[0].solar_absorptance = nil
222
+ hpxml.roofs[0].roof_color = HPXML::ColorLight
223
+ hpxml.roofs[0].emittance = nil
224
+ hpxml.roofs[0].radiant_barrier = nil
181
225
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
182
226
  hpxml_default = _test_measure()
183
- _test_default_infiltration_values(hpxml_default, 2700 * 8)
227
+ _test_default_roof_values(hpxml_default, HPXML::RoofTypeAsphaltShingles, 0.75, HPXML::ColorLight, 0.90, false)
184
228
 
185
- # Test defaults w/o conditioned basement
186
- hpxml = _create_hpxml('base-foundation-slab.xml')
187
- hpxml.air_infiltration_measurements[0].infiltration_volume = nil
229
+ # Test defaults w/ SolarAbsorptance
230
+ hpxml.roofs[0].solar_absorptance = 0.99
231
+ hpxml.roofs[0].roof_color = nil
188
232
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
189
233
  hpxml_default = _test_measure()
190
- _test_default_infiltration_values(hpxml_default, 1350 * 8)
234
+ _test_default_roof_values(hpxml_default, HPXML::RoofTypeAsphaltShingles, 0.99, HPXML::ColorDark, 0.90, false)
191
235
  end
192
236
 
193
- def test_roofs
237
+ def test_rim_joists
194
238
  # Test inputs not overridden by defaults
195
239
  hpxml = _create_hpxml('base.xml')
196
- hpxml.roofs[0].roof_type = HPXML::RoofTypeMetal
197
- hpxml.roofs[0].solar_absorptance = 0.77
198
- hpxml.roofs[0].roof_color = HPXML::ColorDark
240
+ hpxml.rim_joists[0].siding = HPXML::SidingTypeBrick
241
+ hpxml.rim_joists[0].solar_absorptance = 0.55
242
+ hpxml.rim_joists[0].color = HPXML::ColorLight
243
+ hpxml.rim_joists[0].emittance = 0.88
199
244
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
200
245
  hpxml_default = _test_measure()
201
- _test_default_roof_values(hpxml_default, HPXML::RoofTypeMetal, 0.77, HPXML::ColorDark)
246
+ _test_default_rim_joist_values(hpxml_default, HPXML::SidingTypeBrick, 0.55, HPXML::ColorLight, 0.88)
202
247
 
203
- # Test defaults
204
- hpxml.roofs[0].roof_type = nil
205
- hpxml.roofs[0].solar_absorptance = nil
206
- hpxml.roofs[0].roof_color = HPXML::ColorLight
248
+ # Test defaults w/ Color
249
+ hpxml.rim_joists[0].siding = nil
250
+ hpxml.rim_joists[0].solar_absorptance = nil
251
+ hpxml.rim_joists[0].color = HPXML::ColorDark
252
+ hpxml.rim_joists[0].emittance = nil
207
253
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
208
254
  hpxml_default = _test_measure()
209
- _test_default_roof_values(hpxml_default, HPXML::RoofTypeAsphaltShingles, 0.75, HPXML::ColorLight)
255
+ _test_default_rim_joist_values(hpxml_default, HPXML::SidingTypeWood, 0.95, HPXML::ColorDark, 0.90)
256
+
257
+ # Test defaults w/ SolarAbsorptance
258
+ hpxml.rim_joists[0].solar_absorptance = 0.99
259
+ hpxml.rim_joists[0].color = nil
260
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
261
+ hpxml_default = _test_measure()
262
+ _test_default_rim_joist_values(hpxml_default, HPXML::SidingTypeWood, 0.99, HPXML::ColorDark, 0.90)
210
263
  end
211
264
 
212
265
  def test_walls
@@ -215,147 +268,497 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
215
268
  hpxml.walls[0].siding = HPXML::SidingTypeFiberCement
216
269
  hpxml.walls[0].solar_absorptance = 0.66
217
270
  hpxml.walls[0].color = HPXML::ColorDark
271
+ hpxml.walls[0].emittance = 0.88
218
272
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
219
273
  hpxml_default = _test_measure()
220
- _test_default_wall_values(hpxml_default, HPXML::SidingTypeFiberCement, 0.66, HPXML::ColorDark)
274
+ _test_default_wall_values(hpxml_default, HPXML::SidingTypeFiberCement, 0.66, HPXML::ColorDark, 0.88)
221
275
 
222
- # Test defaults
276
+ # Test defaults W/ Color
223
277
  hpxml.walls[0].siding = nil
224
278
  hpxml.walls[0].solar_absorptance = nil
225
279
  hpxml.walls[0].color = HPXML::ColorLight
280
+ hpxml.walls[0].emittance = nil
226
281
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
227
282
  hpxml_default = _test_measure()
228
- _test_default_wall_values(hpxml_default, HPXML::SidingTypeWood, 0.5, HPXML::ColorLight)
283
+ _test_default_wall_values(hpxml_default, HPXML::SidingTypeWood, 0.5, HPXML::ColorLight, 0.90)
284
+
285
+ # Test defaults W/ SolarAbsorptance
286
+ hpxml.walls[0].solar_absorptance = 0.99
287
+ hpxml.walls[0].color = nil
288
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
289
+ hpxml_default = _test_measure()
290
+ _test_default_wall_values(hpxml_default, HPXML::SidingTypeWood, 0.99, HPXML::ColorDark, 0.90)
229
291
  end
230
292
 
231
- def test_rim_joists
293
+ def test_foundation_walls
232
294
  # Test inputs not overridden by defaults
233
295
  hpxml = _create_hpxml('base.xml')
234
- hpxml.rim_joists[0].siding = HPXML::SidingTypeBrick
235
- hpxml.rim_joists[0].solar_absorptance = 0.55
236
- hpxml.rim_joists[0].color = HPXML::ColorLight
296
+ hpxml.foundation_walls[0].thickness = 7.0
237
297
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
238
298
  hpxml_default = _test_measure()
239
- _test_default_rim_joist_values(hpxml_default, HPXML::SidingTypeBrick, 0.55, HPXML::ColorLight)
299
+ _test_default_foundation_wall_values(hpxml_default, 7.0)
240
300
 
241
301
  # Test defaults
242
- hpxml.rim_joists[0].siding = nil
243
- hpxml.rim_joists[0].solar_absorptance = nil
244
- hpxml.rim_joists[0].color = HPXML::ColorDark
302
+ hpxml.foundation_walls[0].thickness = nil
303
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
304
+ hpxml_default = _test_measure()
305
+ _test_default_foundation_wall_values(hpxml_default, 8.0)
306
+ end
307
+
308
+ def test_slabs
309
+ # Test inputs not overridden by defaults
310
+ hpxml = _create_hpxml('base.xml')
311
+ hpxml.slabs[0].thickness = 7.0
312
+ hpxml.slabs[0].carpet_r_value = 1.1
313
+ hpxml.slabs[0].carpet_fraction = 0.5
245
314
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
246
315
  hpxml_default = _test_measure()
247
- _test_default_rim_joist_values(hpxml_default, HPXML::SidingTypeWood, 0.95, HPXML::ColorDark)
316
+ _test_default_slab_values(hpxml_default, 7.0, 1.1, 0.5)
317
+
318
+ # Test defaults w/ conditioned basement
319
+ hpxml.slabs[0].thickness = nil
320
+ hpxml.slabs[0].carpet_r_value = nil
321
+ hpxml.slabs[0].carpet_fraction = nil
322
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
323
+ hpxml_default = _test_measure()
324
+ _test_default_slab_values(hpxml_default, 4.0, 2.0, 0.8)
325
+
326
+ # Test defaults w/ crawlspace
327
+ hpxml = _create_hpxml('base-foundation-unvented-crawlspace.xml')
328
+ hpxml.slabs[0].thickness = nil
329
+ hpxml.slabs[0].carpet_r_value = nil
330
+ hpxml.slabs[0].carpet_fraction = nil
331
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
332
+ hpxml_default = _test_measure()
333
+ _test_default_slab_values(hpxml_default, 0.0, 0.0, 0.0)
248
334
  end
249
335
 
250
336
  def test_windows
251
337
  # Test inputs not overridden by defaults
252
- hpxml = _create_hpxml('base-enclosure-windows-interior-shading.xml')
338
+ hpxml = _create_hpxml('base-enclosure-windows-shading.xml')
253
339
  hpxml.windows.each do |window|
254
340
  window.fraction_operable = 0.5
341
+ window.exterior_shading_factor_summer = 0.44
342
+ window.exterior_shading_factor_winter = 0.55
255
343
  window.interior_shading_factor_summer = 0.66
256
344
  window.interior_shading_factor_winter = 0.77
257
345
  end
258
346
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
259
347
  hpxml_default = _test_measure()
260
348
  n_windows = hpxml_default.windows.size
261
- _test_default_window_values(hpxml_default, [0.66] * n_windows, [0.77] * n_windows, [0.5] * n_windows)
349
+ _test_default_window_values(hpxml_default, [0.44] * n_windows, [0.55] * n_windows, [0.66] * n_windows, [0.77] * n_windows, [0.5] * n_windows)
262
350
 
263
351
  # Test defaults
264
352
  hpxml.windows.each do |window|
265
353
  window.fraction_operable = nil
354
+ window.exterior_shading_factor_summer = nil
355
+ window.exterior_shading_factor_winter = nil
266
356
  window.interior_shading_factor_summer = nil
267
357
  window.interior_shading_factor_winter = nil
268
358
  end
269
359
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
270
360
  hpxml_default = _test_measure()
271
361
  n_windows = hpxml_default.windows.size
272
- _test_default_window_values(hpxml_default, [0.7] * n_windows, [0.85] * n_windows, [0.67] * n_windows)
362
+ _test_default_window_values(hpxml_default, [1.0] * n_windows, [1.0] * n_windows, [0.7] * n_windows, [0.85] * n_windows, [0.67] * n_windows)
273
363
  end
274
364
 
275
365
  def test_skylights
276
366
  # Test inputs not overridden by defaults
277
367
  hpxml = _create_hpxml('base-enclosure-skylights.xml')
278
368
  hpxml.skylights.each do |skylight|
369
+ skylight.exterior_shading_factor_summer = 0.44
370
+ skylight.exterior_shading_factor_winter = 0.55
279
371
  skylight.interior_shading_factor_summer = 0.66
280
372
  skylight.interior_shading_factor_winter = 0.77
281
373
  end
282
374
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
283
375
  hpxml_default = _test_measure()
284
376
  n_skylights = hpxml_default.skylights.size
285
- _test_default_skylight_values(hpxml_default, [0.66] * n_skylights, [0.77] * n_skylights)
377
+ _test_default_skylight_values(hpxml_default, [0.44] * n_skylights, [0.55] * n_skylights, [0.66] * n_skylights, [0.77] * n_skylights)
286
378
 
287
379
  # Test defaults
288
380
  hpxml.skylights.each do |skylight|
381
+ skylight.exterior_shading_factor_summer = nil
382
+ skylight.exterior_shading_factor_winter = nil
289
383
  skylight.interior_shading_factor_summer = nil
290
384
  skylight.interior_shading_factor_winter = nil
291
385
  end
292
386
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
293
387
  hpxml_default = _test_measure()
294
388
  n_skylights = hpxml_default.skylights.size
295
- _test_default_skylight_values(hpxml_default, [1.0] * n_skylights, [1.0] * n_skylights)
389
+ _test_default_skylight_values(hpxml_default, [1.0] * n_skylights, [1.0] * n_skylights, [1.0] * n_skylights, [1.0] * n_skylights)
296
390
  end
297
391
 
298
- def test_air_conditioners
392
+ def test_central_air_conditioners
299
393
  # Test inputs not overridden by defaults
300
- hpxml = _create_hpxml('base.xml')
394
+ hpxml = _create_hpxml('base-hvac-central-ac-only-1-speed.xml')
301
395
  hpxml.cooling_systems[0].cooling_shr = 0.88
302
396
  hpxml.cooling_systems[0].compressor_type = HPXML::HVACCompressorTypeVariableSpeed
397
+ hpxml.cooling_systems[0].fan_watts_per_cfm = 0.66
398
+ hpxml.cooling_systems[0].charge_defect_ratio = -0.11
399
+ hpxml.cooling_systems[0].airflow_defect_ratio = -0.22
400
+ hpxml.cooling_systems[0].cooling_capacity = 12345
303
401
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
304
402
  hpxml_default = _test_measure()
305
- _test_default_air_conditioner_values(hpxml_default, 0.88, HPXML::HVACCompressorTypeVariableSpeed)
403
+ _test_default_central_air_conditioner_values(hpxml_default, 0.88, HPXML::HVACCompressorTypeVariableSpeed, 0.66, -0.11, -0.22, 12345)
306
404
 
307
405
  # Test defaults
308
406
  hpxml.cooling_systems[0].cooling_shr = nil
309
407
  hpxml.cooling_systems[0].compressor_type = nil
408
+ hpxml.cooling_systems[0].fan_watts_per_cfm = nil
409
+ hpxml.cooling_systems[0].charge_defect_ratio = nil
410
+ hpxml.cooling_systems[0].airflow_defect_ratio = nil
411
+ hpxml.cooling_systems[0].cooling_capacity = nil
412
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
413
+ hpxml_default = _test_measure()
414
+ _test_default_central_air_conditioner_values(hpxml_default, 0.73, HPXML::HVACCompressorTypeSingleStage, 0.5, 0, 0, nil)
415
+ end
416
+
417
+ def test_room_air_conditioners
418
+ # Test inputs not overridden by defaults
419
+ hpxml = _create_hpxml('base-hvac-room-ac-only.xml')
420
+ hpxml.cooling_systems[0].cooling_shr = 0.88
421
+ hpxml.cooling_systems[0].cooling_capacity = 12345
422
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
423
+ hpxml_default = _test_measure()
424
+ _test_default_room_air_conditioner_values(hpxml_default, 0.88, 12345)
425
+
426
+ # Test defaults
427
+ hpxml.cooling_systems[0].cooling_shr = nil
428
+ hpxml.cooling_systems[0].cooling_capacity = nil
429
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
430
+ hpxml_default = _test_measure()
431
+ _test_default_room_air_conditioner_values(hpxml_default, 0.65, nil)
432
+ end
433
+
434
+ def test_evaporative_coolers
435
+ # Test inputs not overridden by defaults
436
+ hpxml = _create_hpxml('base-hvac-evap-cooler-only.xml')
437
+ hpxml.cooling_systems[0].cooling_capacity = 12345
438
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
439
+ hpxml_default = _test_measure()
440
+ _test_default_evap_cooler_values(hpxml_default, 12345)
441
+
442
+ # Test defaults
443
+ hpxml.cooling_systems[0].cooling_capacity = nil
444
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
445
+ hpxml_default = _test_measure()
446
+ _test_default_evap_cooler_values(hpxml_default, nil)
447
+ end
448
+
449
+ def test_mini_split_air_conditioners
450
+ # Test inputs not overridden by defaults
451
+ hpxml = _create_hpxml('base-hvac-mini-split-air-conditioner-only-ducted.xml')
452
+ hpxml.cooling_systems[0].cooling_shr = 0.78
453
+ hpxml.cooling_systems[0].fan_watts_per_cfm = 0.66
454
+ hpxml.cooling_systems[0].charge_defect_ratio = -0.11
455
+ hpxml.cooling_systems[0].airflow_defect_ratio = -0.22
456
+ hpxml.cooling_systems[0].cooling_capacity = 12345
457
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
458
+ hpxml_default = _test_measure()
459
+ _test_default_mini_split_air_conditioner_values(hpxml_default, 0.78, 0.66, -0.11, -0.22, 12345)
460
+
461
+ # Test defaults
462
+ hpxml.cooling_systems[0].cooling_shr = nil
463
+ hpxml.cooling_systems[0].fan_watts_per_cfm = nil
464
+ hpxml.cooling_systems[0].charge_defect_ratio = nil
465
+ hpxml.cooling_systems[0].airflow_defect_ratio = nil
466
+ hpxml.cooling_systems[0].cooling_capacity = nil
467
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
468
+ hpxml_default = _test_measure()
469
+ _test_default_mini_split_air_conditioner_values(hpxml_default, 0.73, 0.18, 0, 0, nil)
470
+ end
471
+
472
+ def test_furnaces
473
+ # Test inputs not overridden by defaults
474
+ hpxml = _create_hpxml('base.xml')
475
+ hpxml.heating_systems[0].fan_watts_per_cfm = 0.66
476
+ hpxml.heating_systems[0].airflow_defect_ratio = -0.22
477
+ hpxml.heating_systems[0].heating_capacity = 12345
478
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
479
+ hpxml_default = _test_measure()
480
+ _test_default_furnace_values(hpxml_default, 0.66, -0.22, 12345)
481
+
482
+ # Test defaults
483
+ hpxml.heating_systems[0].fan_watts_per_cfm = nil
484
+ hpxml.heating_systems[0].airflow_defect_ratio = nil
485
+ hpxml.heating_systems[0].heating_capacity = nil
486
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
487
+ hpxml_default = _test_measure()
488
+ _test_default_furnace_values(hpxml_default, 0.375, 0, nil)
489
+
490
+ # Test defaults w/ gravity distribution system
491
+ hpxml = _create_hpxml('base-hvac-furnace-gas-only.xml')
492
+ hpxml.heating_systems[0].distribution_system.air_type = HPXML::AirTypeGravity
493
+ hpxml.heating_systems[0].fan_watts_per_cfm = nil
494
+ hpxml.heating_systems[0].airflow_defect_ratio = nil
495
+ hpxml.heating_systems[0].heating_capacity = nil
496
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
497
+ hpxml_default = _test_measure()
498
+ _test_default_furnace_values(hpxml_default, 0.0, 0, nil)
499
+ end
500
+
501
+ def test_wall_furnaces
502
+ # Test inputs not overridden by defaults
503
+ hpxml = _create_hpxml('base-hvac-wall-furnace-elec-only.xml')
504
+ hpxml.heating_systems[0].fan_watts = 22
505
+ hpxml.heating_systems[0].heating_capacity = 12345
310
506
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
311
507
  hpxml_default = _test_measure()
312
- _test_default_air_conditioner_values(hpxml_default, 0.73, HPXML::HVACCompressorTypeSingleStage)
508
+ _test_default_wall_furnace_values(hpxml_default, 22, 12345)
509
+
510
+ # Test defaults
511
+ hpxml.heating_systems[0].fan_watts = nil
512
+ hpxml.heating_systems[0].heating_capacity = nil
513
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
514
+ hpxml_default = _test_measure()
515
+ _test_default_wall_furnace_values(hpxml_default, 0, nil)
516
+ end
517
+
518
+ def test_floor_furnaces
519
+ # Test inputs not overridden by defaults
520
+ hpxml = _create_hpxml('base-hvac-floor-furnace-propane-only.xml')
521
+ hpxml.heating_systems[0].fan_watts = 22
522
+ hpxml.heating_systems[0].heating_capacity = 12345
523
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
524
+ hpxml_default = _test_measure()
525
+ _test_default_floor_furnace_values(hpxml_default, 22, 12345)
526
+
527
+ # Test defaults
528
+ hpxml.heating_systems[0].fan_watts = nil
529
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
530
+ hpxml_default = _test_measure()
531
+ _test_default_floor_furnace_values(hpxml_default, 0, nil)
313
532
  end
314
533
 
315
534
  def test_boilers
316
535
  # Test inputs not overridden by defaults (in-unit boiler)
317
536
  hpxml = _create_hpxml('base-hvac-boiler-gas-only.xml')
318
537
  hpxml.heating_systems[0].electric_auxiliary_energy = 99.9
538
+ hpxml.heating_systems[0].heating_capacity = 12345
319
539
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
320
540
  hpxml_default = _test_measure()
321
- _test_default_boiler_values(hpxml_default, 99.9)
541
+ _test_default_boiler_values(hpxml_default, 99.9, 12345)
322
542
 
323
543
  # Test defaults w/ in-unit boiler
324
544
  hpxml.heating_systems[0].electric_auxiliary_energy = nil
545
+ hpxml.heating_systems[0].heating_capacity = nil
325
546
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
326
547
  hpxml_default = _test_measure()
327
- _test_default_boiler_values(hpxml_default, 170.0)
548
+ _test_default_boiler_values(hpxml_default, 170.0, nil)
328
549
 
329
550
  # Test inputs not overridden by defaults (shared boiler)
330
- hpxml = _create_hpxml('base-hvac-shared-boiler-only-baseboard.xml')
551
+ hpxml = _create_hpxml('base-bldgtype-multifamily-shared-boiler-only-baseboard.xml')
331
552
  hpxml.heating_systems[0].shared_loop_watts = nil
332
553
  hpxml.heating_systems[0].electric_auxiliary_energy = 99.9
333
554
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
334
555
  hpxml_default = _test_measure()
335
- _test_default_boiler_values(hpxml_default, 99.9)
556
+ _test_default_boiler_values(hpxml_default, 99.9, nil)
336
557
 
337
558
  # Test defaults w/ shared boiler
338
559
  hpxml.heating_systems[0].electric_auxiliary_energy = nil
339
560
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
340
561
  hpxml_default = _test_measure()
341
- _test_default_boiler_values(hpxml_default, 220.0)
562
+ _test_default_boiler_values(hpxml_default, 220.0, nil)
563
+ end
564
+
565
+ def test_stoves
566
+ # Test inputs not overridden by defaults
567
+ hpxml = _create_hpxml('base-hvac-stove-oil-only.xml')
568
+ hpxml.heating_systems[0].fan_watts = 22
569
+ hpxml.heating_systems[0].heating_capacity = 12345
570
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
571
+ hpxml_default = _test_measure()
572
+ _test_default_stove_values(hpxml_default, 22, 12345)
573
+
574
+ # Test defaults
575
+ hpxml.heating_systems[0].fan_watts = nil
576
+ hpxml.heating_systems[0].heating_capacity = nil
577
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
578
+ hpxml_default = _test_measure()
579
+ _test_default_stove_values(hpxml_default, 40, nil)
580
+ end
581
+
582
+ def test_portable_heaters
583
+ # Test inputs not overridden by defaults
584
+ hpxml = _create_hpxml('base-hvac-portable-heater-gas-only.xml')
585
+ hpxml.heating_systems[0].fan_watts = 22
586
+ hpxml.heating_systems[0].heating_capacity = 12345
587
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
588
+ hpxml_default = _test_measure()
589
+ _test_default_portable_heater_values(hpxml_default, 22, 12345)
590
+
591
+ # Test defaults
592
+ hpxml.heating_systems[0].fan_watts = nil
593
+ hpxml.heating_systems[0].heating_capacity = nil
594
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
595
+ hpxml_default = _test_measure()
596
+ _test_default_portable_heater_values(hpxml_default, 0, nil)
597
+ end
598
+
599
+ def test_fixed_heaters
600
+ # Test inputs not overridden by defaults
601
+ hpxml = _create_hpxml('base-hvac-fixed-heater-gas-only.xml')
602
+ hpxml.heating_systems[0].fan_watts = 22
603
+ hpxml.heating_systems[0].heating_capacity = 12345
604
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
605
+ hpxml_default = _test_measure()
606
+ _test_default_fixed_heater_values(hpxml_default, 22, 12345)
607
+
608
+ # Test defaults
609
+ hpxml.heating_systems[0].fan_watts = nil
610
+ hpxml.heating_systems[0].heating_capacity = nil
611
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
612
+ hpxml_default = _test_measure()
613
+ _test_default_fixed_heater_values(hpxml_default, 0, nil)
614
+ end
615
+
616
+ def test_fireplaces
617
+ # Test inputs not overridden by defaults
618
+ hpxml = _create_hpxml('base-hvac-fireplace-wood-only.xml')
619
+ hpxml.heating_systems[0].fan_watts = 22
620
+ hpxml.heating_systems[0].heating_capacity = 12345
621
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
622
+ hpxml_default = _test_measure()
623
+ _test_default_fireplace_values(hpxml_default, 22, 12345)
624
+
625
+ # Test defaults
626
+ hpxml.heating_systems[0].fan_watts = nil
627
+ hpxml.heating_systems[0].heating_capacity = nil
628
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
629
+ hpxml_default = _test_measure()
630
+ _test_default_fireplace_values(hpxml_default, 0, nil)
631
+ end
632
+
633
+ def test_air_source_heat_pumps
634
+ # Test inputs not overridden by defaults
635
+ hpxml = _create_hpxml('base-hvac-air-to-air-heat-pump-1-speed.xml')
636
+ hpxml.heat_pumps[0].cooling_shr = 0.88
637
+ hpxml.heat_pumps[0].compressor_type = HPXML::HVACCompressorTypeVariableSpeed
638
+ hpxml.heat_pumps[0].fan_watts_per_cfm = 0.66
639
+ hpxml.heat_pumps[0].charge_defect_ratio = -0.11
640
+ hpxml.heat_pumps[0].airflow_defect_ratio = -0.22
641
+ hpxml.heat_pumps[0].cooling_capacity = 12345
642
+ hpxml.heat_pumps[0].heating_capacity = 23456
643
+ hpxml.heat_pumps[0].heating_capacity_17F = 9876
644
+ hpxml.heat_pumps[0].backup_heating_capacity = 34567
645
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
646
+ hpxml_default = _test_measure()
647
+ _test_default_air_to_air_heat_pump_values(hpxml_default, 0.88, HPXML::HVACCompressorTypeVariableSpeed, 0.66, -0.11, -0.22, 12345, 23456, 9876, 34567)
648
+
649
+ # Test defaults
650
+ hpxml.heat_pumps[0].cooling_shr = nil
651
+ hpxml.heat_pumps[0].compressor_type = nil
652
+ hpxml.heat_pumps[0].fan_watts_per_cfm = nil
653
+ hpxml.heat_pumps[0].charge_defect_ratio = nil
654
+ hpxml.heat_pumps[0].airflow_defect_ratio = nil
655
+ hpxml.heat_pumps[0].cooling_capacity = nil
656
+ hpxml.heat_pumps[0].heating_capacity = nil
657
+ hpxml.heat_pumps[0].heating_capacity_17F = nil
658
+ hpxml.heat_pumps[0].backup_heating_capacity = nil
659
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
660
+ hpxml_default = _test_measure()
661
+ _test_default_air_to_air_heat_pump_values(hpxml_default, 0.73, HPXML::HVACCompressorTypeSingleStage, 0.5, 0, 0, nil, nil, nil, nil)
662
+ end
663
+
664
+ def test_mini_split_heat_pumps
665
+ # Test inputs not overridden by defaults
666
+ hpxml = _create_hpxml('base-hvac-mini-split-heat-pump-ducted.xml')
667
+ hpxml.heat_pumps[0].cooling_shr = 0.78
668
+ hpxml.heat_pumps[0].fan_watts_per_cfm = 0.66
669
+ hpxml.heat_pumps[0].charge_defect_ratio = -0.11
670
+ hpxml.heat_pumps[0].airflow_defect_ratio = -0.22
671
+ hpxml.heat_pumps[0].cooling_capacity = 12345
672
+ hpxml.heat_pumps[0].heating_capacity = 23456
673
+ hpxml.heat_pumps[0].heating_capacity_17F = 9876
674
+ hpxml.heat_pumps[0].backup_heating_capacity = 34567
675
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
676
+ hpxml_default = _test_measure()
677
+ _test_default_mini_split_heat_pump_values(hpxml_default, 0.78, 0.66, -0.11, -0.22, 12345, 23456, 9876, 34567)
678
+
679
+ # Test defaults
680
+ hpxml.heat_pumps[0].cooling_shr = nil
681
+ hpxml.heat_pumps[0].fan_watts_per_cfm = nil
682
+ hpxml.heat_pumps[0].charge_defect_ratio = nil
683
+ hpxml.heat_pumps[0].airflow_defect_ratio = nil
684
+ hpxml.heat_pumps[0].cooling_capacity = nil
685
+ hpxml.heat_pumps[0].heating_capacity = nil
686
+ hpxml.heat_pumps[0].heating_capacity_17F = nil
687
+ hpxml.heat_pumps[0].backup_heating_capacity = nil
688
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
689
+ hpxml_default = _test_measure()
690
+ _test_default_mini_split_heat_pump_values(hpxml_default, 0.73, 0.18, 0, 0, nil, nil, nil, nil)
342
691
  end
343
692
 
344
693
  def test_ground_source_heat_pumps
345
694
  # Test inputs not overridden by defaults
346
695
  hpxml = _create_hpxml('base-hvac-ground-to-air-heat-pump.xml')
347
696
  hpxml.heat_pumps[0].pump_watts_per_ton = 9.9
348
- hpxml.heat_pumps[0].fan_watts_per_cfm = 0.99
697
+ hpxml.heat_pumps[0].fan_watts_per_cfm = 0.66
698
+ hpxml.heat_pumps[0].airflow_defect_ratio = -0.22
699
+ hpxml.heat_pumps[0].cooling_capacity = 12345
700
+ hpxml.heat_pumps[0].heating_capacity = 23456
701
+ hpxml.heat_pumps[0].backup_heating_capacity = 34567
349
702
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
350
703
  hpxml_default = _test_measure()
351
- _test_default_gshp_values(hpxml_default, 9.9, 0.99)
704
+ _test_default_ground_to_air_heat_pump_values(hpxml_default, 9.9, 0.66, -0.22, 12345, 23456, 34567)
352
705
 
353
706
  # Test defaults
354
707
  hpxml.heat_pumps[0].pump_watts_per_ton = nil
355
708
  hpxml.heat_pumps[0].fan_watts_per_cfm = nil
709
+ hpxml.heat_pumps[0].airflow_defect_ratio = nil
710
+ hpxml.heat_pumps[0].cooling_capacity = nil
711
+ hpxml.heat_pumps[0].heating_capacity = nil
712
+ hpxml.heat_pumps[0].backup_heating_capacity = nil
713
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
714
+ hpxml_default = _test_measure()
715
+ _test_default_ground_to_air_heat_pump_values(hpxml_default, 30.0, 0.375, 0, nil, nil, nil)
716
+ end
717
+
718
+ def test_hvac_increased_hardsized_equipment
719
+ # Test hard-sized capacities are increased for air conditioner + furnace
720
+ hpxml = _create_hpxml('base-hvac-undersized-allow-increased-fixed-capacities.xml')
721
+ htg_cap = hpxml.heating_systems[0].heating_capacity
722
+ clg_cap = hpxml.cooling_systems[0].cooling_capacity
723
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
724
+ hpxml_default = _test_measure()
725
+ assert(hpxml_default.heating_systems[0].heating_capacity > htg_cap)
726
+ assert(hpxml_default.cooling_systems[0].cooling_capacity > clg_cap)
727
+
728
+ # Test hard-sized capacities are increased for heat pump
729
+ hpxml = _create_hpxml('base-hvac-air-to-air-heat-pump-1-speed.xml')
730
+ hpxml.header.allow_increased_fixed_capacities = true
731
+ hpxml.heat_pumps[0].heating_capacity /= 10.0
732
+ hpxml.heat_pumps[0].heating_capacity_17F /= 10.0
733
+ hpxml.heat_pumps[0].backup_heating_capacity /= 10.0
734
+ hpxml.heat_pumps[0].cooling_capacity /= 10.0
735
+ htg_cap = hpxml.heat_pumps[0].heating_capacity
736
+ htg_17f_cap = hpxml.heat_pumps[0].heating_capacity_17F
737
+ htg_bak_cap = hpxml.heat_pumps[0].backup_heating_capacity
738
+ clg_cap = hpxml.heat_pumps[0].cooling_capacity
739
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
740
+ hpxml_default = _test_measure()
741
+ assert(hpxml_default.heat_pumps[0].heating_capacity > htg_cap)
742
+ assert(hpxml_default.heat_pumps[0].heating_capacity_17F > htg_17f_cap)
743
+ assert(hpxml_default.heat_pumps[0].backup_heating_capacity > htg_bak_cap)
744
+ assert(hpxml_default.heat_pumps[0].cooling_capacity > clg_cap)
745
+ end
746
+
747
+ def test_hvac_controls
748
+ # Test inputs not overridden by defaults
749
+ hpxml = _create_hpxml('base-hvac-programmable-thermostat.xml')
750
+ hpxml.hvac_controls[0].heating_setback_start_hour = 12
751
+ hpxml.hvac_controls[0].cooling_setup_start_hour = 12
752
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
753
+ hpxml_default = _test_measure()
754
+ _test_default_hvac_control_values(hpxml_default, 12, 12)
755
+
756
+ # Test defaults
757
+ hpxml.hvac_controls[0].heating_setback_start_hour = nil
758
+ hpxml.hvac_controls[0].cooling_setup_start_hour = nil
356
759
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
357
760
  hpxml_default = _test_measure()
358
- _test_default_gshp_values(hpxml_default, 30.0, 0.5)
761
+ _test_default_hvac_control_values(hpxml_default, 23, 9)
359
762
  end
360
763
 
361
764
  def test_hvac_distribution
@@ -371,6 +774,7 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
371
774
  _test_default_duct_values(hpxml_default, expected_supply_locations, expected_return_locations, expected_supply_areas, expected_return_areas, expected_n_return_registers)
372
775
 
373
776
  # Test defaults w/ conditioned basement
777
+ hpxml.hvac_distributions[0].number_of_return_registers = nil
374
778
  hpxml.hvac_distributions.each do |hvac_distribution|
375
779
  hvac_distribution.ducts.each do |duct|
376
780
  duct.duct_location = nil
@@ -421,7 +825,7 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
421
825
  _test_default_duct_values(hpxml_default, expected_supply_locations, expected_return_locations, expected_supply_areas, expected_return_areas, expected_n_return_registers)
422
826
 
423
827
  # Test defaults w/ building/unit adjacent to other housing unit
424
- hpxml = _create_hpxml('base-enclosure-other-housing-unit.xml')
828
+ hpxml = _create_hpxml('base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml')
425
829
  hpxml.hvac_distributions.each do |hvac_distribution|
426
830
  hvac_distribution.ducts.each do |duct|
427
831
  duct.duct_location = nil
@@ -432,8 +836,8 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
432
836
  hpxml_default = _test_measure()
433
837
  expected_supply_locations = ['living space']
434
838
  expected_return_locations = ['living space']
435
- expected_supply_areas = [364.5]
436
- expected_return_areas = [67.5]
839
+ expected_supply_areas = [243.0]
840
+ expected_return_areas = [45.0]
437
841
  expected_n_return_registers = hpxml_default.building_construction.number_of_conditioned_floors
438
842
  _test_default_duct_values(hpxml_default, expected_supply_locations, expected_return_locations, expected_supply_areas, expected_return_areas, expected_n_return_registers)
439
843
 
@@ -466,8 +870,8 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
466
870
  hpxml_default = _test_measure()
467
871
  expected_supply_locations = ['basement - conditioned', 'basement - conditioned'] * hpxml_default.hvac_distributions.size
468
872
  expected_return_locations = ['basement - conditioned', 'basement - conditioned'] * hpxml_default.hvac_distributions.size
469
- expected_supply_areas = [91.125, 91.125] * hpxml_default.hvac_distributions.size
470
- expected_return_areas = [33.75, 33.75] * hpxml_default.hvac_distributions.size
873
+ expected_supply_areas = [36.45, 36.45] * hpxml_default.hvac_distributions.size
874
+ expected_return_areas = [13.5, 13.5] * hpxml_default.hvac_distributions.size
471
875
  expected_n_return_registers = hpxml_default.building_construction.number_of_conditioned_floors
472
876
  _test_default_duct_values(hpxml_default, expected_supply_locations, expected_return_locations, expected_supply_areas, expected_return_areas, expected_n_return_registers)
473
877
 
@@ -484,86 +888,198 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
484
888
  hpxml_default = _test_measure()
485
889
  expected_supply_locations = ['basement - conditioned', 'basement - conditioned', 'living space', 'living space'] * hpxml_default.hvac_distributions.size
486
890
  expected_return_locations = ['basement - conditioned', 'basement - conditioned', 'living space', 'living space'] * hpxml_default.hvac_distributions.size
487
- expected_supply_areas = [68.34, 68.34, 22.78, 22.78] * hpxml_default.hvac_distributions.size
488
- expected_return_areas = [25.31, 25.31, 8.44, 8.44] * hpxml_default.hvac_distributions.size
891
+ expected_supply_areas = [27.34, 27.34, 9.11, 9.11] * hpxml_default.hvac_distributions.size
892
+ expected_return_areas = [10.13, 10.13, 3.38, 3.38] * hpxml_default.hvac_distributions.size
489
893
  expected_n_return_registers = hpxml_default.building_construction.number_of_conditioned_floors
490
894
  _test_default_duct_values(hpxml_default, expected_supply_locations, expected_return_locations, expected_supply_areas, expected_return_areas, expected_n_return_registers)
491
895
  end
492
896
 
493
- def test_water_heaters
897
+ def test_mech_ventilation_fans
494
898
  # Test inputs not overridden by defaults
495
- hpxml = _create_hpxml('base.xml')
899
+ hpxml = _create_hpxml('base-mechvent-exhaust.xml')
496
900
  hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
497
- hpxml.water_heating_systems.each do |wh|
498
- wh.is_shared_system = true
499
- wh.number_of_units_served = 2
500
- wh.heating_capacity = 15000.0
501
- wh.tank_volume = 40.0
502
- wh.recovery_efficiency = 0.95
503
- end
901
+ vent_fan = hpxml.ventilation_fans.select { |f| f.used_for_whole_building_ventilation }[0]
902
+ vent_fan.is_shared_system = true
903
+ vent_fan.fraction_recirculation = 0.0
904
+ vent_fan.in_unit_flow_rate = 10.0
905
+ vent_fan.hours_in_operation = 22.0
504
906
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
505
907
  hpxml_default = _test_measure()
506
- _test_default_water_heater_values(hpxml_default, [true, 15000.0, 40.0, 0.95])
507
-
508
- # Test defaults w/ 3-bedroom house & electric storage water heater
509
- hpxml.water_heating_systems.each do |water_heating_system|
510
- water_heating_system.is_shared_system = nil
511
- next unless water_heating_system.water_heater_type == HPXML::WaterHeaterTypeStorage
908
+ _test_default_mech_vent_values(hpxml_default, true, 22.0)
512
909
 
513
- water_heating_system.heating_capacity = nil
514
- water_heating_system.tank_volume = nil
515
- water_heating_system.recovery_efficiency = nil
516
- end
910
+ # Test defaults
911
+ vent_fan.rated_flow_rate = nil
912
+ vent_fan.start_hour = nil
913
+ vent_fan.quantity = nil
914
+ vent_fan.is_shared_system = nil
915
+ vent_fan.fraction_recirculation = nil
916
+ vent_fan.in_unit_flow_rate = nil
917
+ vent_fan.hours_in_operation = nil
517
918
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
518
919
  hpxml_default = _test_measure()
519
- _test_default_water_heater_values(hpxml_default, [false, 18766.7, 50.0, 0.98])
920
+ _test_default_mech_vent_values(hpxml_default, false, 24.0)
921
+
922
+ # Test inputs not overridden by defaults w/ CFIS
923
+ hpxml = _create_hpxml('base-mechvent-cfis.xml')
924
+ vent_fan = hpxml.ventilation_fans.select { |f| f.used_for_whole_building_ventilation }[0]
925
+ vent_fan.is_shared_system = false
926
+ vent_fan.hours_in_operation = 12.0
927
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
928
+ hpxml_default = _test_measure()
929
+ _test_default_mech_vent_values(hpxml_default, false, 12.0)
930
+
931
+ # Test defaults w/ CFIS
932
+ vent_fan.is_shared_system = nil
933
+ vent_fan.hours_in_operation = nil
934
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
935
+ hpxml_default = _test_measure()
936
+ _test_default_mech_vent_values(hpxml_default, false, 8.0)
937
+ end
938
+
939
+ def test_local_ventilation_fans
940
+ # Test inputs not overridden by defaults
941
+ hpxml = _create_hpxml('base-mechvent-bath-kitchen-fans.xml')
942
+ kitchen_fan = hpxml.ventilation_fans.select { |f| f.used_for_local_ventilation && f.fan_location == HPXML::LocationKitchen }[0]
943
+ kitchen_fan.rated_flow_rate = 300
944
+ kitchen_fan.fan_power = 20
945
+ kitchen_fan.start_hour = 12
946
+ kitchen_fan.quantity = 2
947
+ kitchen_fan.hours_in_operation = 2
948
+ bath_fan = hpxml.ventilation_fans.select { |f| f.used_for_local_ventilation && f.fan_location == HPXML::LocationBath }[0]
949
+ bath_fan.rated_flow_rate = 80
950
+ bath_fan.fan_power = 33
951
+ bath_fan.start_hour = 6
952
+ bath_fan.quantity = 3
953
+ bath_fan.hours_in_operation = 3
954
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
955
+ hpxml_default = _test_measure()
956
+ _test_default_kitchen_fan_values(hpxml_default, 2, 300, 2, 20, 12)
957
+ _test_default_bath_fan_values(hpxml_default, 3, 80, 3, 33, 6)
958
+
959
+ # Test defaults
960
+ kitchen_fan.rated_flow_rate = nil
961
+ kitchen_fan.fan_power = nil
962
+ kitchen_fan.start_hour = nil
963
+ kitchen_fan.quantity = nil
964
+ kitchen_fan.hours_in_operation = nil
965
+ bath_fan.rated_flow_rate = nil
966
+ bath_fan.fan_power = nil
967
+ bath_fan.start_hour = nil
968
+ bath_fan.quantity = nil
969
+ bath_fan.hours_in_operation = nil
970
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
971
+ hpxml_default = _test_measure()
972
+ _test_default_kitchen_fan_values(hpxml_default, 1, 100, 1, 30, 18)
973
+ _test_default_bath_fan_values(hpxml_default, 2, 50, 1, 15, 7)
974
+ end
975
+
976
+ def test_storage_water_heaters
977
+ # Test inputs not overridden by defaults
978
+ hpxml = _create_hpxml('base.xml')
979
+ hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
980
+ hpxml.water_heating_systems.each do |wh|
981
+ wh.is_shared_system = true
982
+ wh.number_of_units_served = 2
983
+ wh.heating_capacity = 15000.0
984
+ wh.tank_volume = 40.0
985
+ wh.recovery_efficiency = 0.95
986
+ wh.location = HPXML::LocationLivingSpace
987
+ wh.temperature = 111
988
+ end
989
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
990
+ hpxml_default = _test_measure()
991
+ _test_default_storage_water_heater_values(hpxml_default,
992
+ [true, 15000.0, 40.0, 0.95, HPXML::LocationLivingSpace, 111])
993
+
994
+ # Test defaults w/ 3-bedroom house & electric storage water heater
995
+ hpxml.water_heating_systems.each do |wh|
996
+ wh.is_shared_system = nil
997
+ wh.heating_capacity = nil
998
+ wh.tank_volume = nil
999
+ wh.recovery_efficiency = nil
1000
+ wh.location = nil
1001
+ wh.temperature = nil
1002
+ end
1003
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1004
+ hpxml_default = _test_measure()
1005
+ _test_default_storage_water_heater_values(hpxml_default,
1006
+ [false, 18766.7, 50.0, 0.98, HPXML::LocationBasementConditioned, 125])
520
1007
 
521
1008
  # Test defaults w/ 5-bedroom house & electric storage water heater
522
1009
  hpxml = _create_hpxml('base-enclosure-beds-5.xml')
523
- hpxml.water_heating_systems.each do |water_heating_system|
524
- water_heating_system.is_shared_system = nil
525
- next unless water_heating_system.water_heater_type == HPXML::WaterHeaterTypeStorage
526
-
527
- water_heating_system.heating_capacity = nil
528
- water_heating_system.tank_volume = nil
529
- water_heating_system.recovery_efficiency = nil
1010
+ hpxml.water_heating_systems.each do |wh|
1011
+ wh.is_shared_system = nil
1012
+ wh.heating_capacity = nil
1013
+ wh.tank_volume = nil
1014
+ wh.recovery_efficiency = nil
1015
+ wh.location = nil
1016
+ wh.temperature = nil
530
1017
  end
531
1018
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
532
1019
  hpxml_default = _test_measure()
533
- _test_default_water_heater_values(hpxml_default, [false, 18766.7, 66.0, 0.98])
1020
+ _test_default_storage_water_heater_values(hpxml_default,
1021
+ [false, 18766.7, 66.0, 0.98, HPXML::LocationBasementConditioned, 125])
534
1022
 
535
1023
  # Test defaults w/ 3-bedroom house & 2 storage water heaters (1 electric and 1 natural gas)
536
1024
  hpxml = _create_hpxml('base-dhw-multiple.xml')
537
- hpxml.water_heating_systems.each do |water_heating_system|
538
- water_heating_system.is_shared_system = nil
539
- next unless water_heating_system.water_heater_type == HPXML::WaterHeaterTypeStorage
540
-
541
- water_heating_system.heating_capacity = nil
542
- water_heating_system.tank_volume = nil
543
- water_heating_system.recovery_efficiency = nil
1025
+ hpxml.water_heating_systems.each do |wh|
1026
+ wh.is_shared_system = nil
1027
+ next unless wh.water_heater_type == HPXML::WaterHeaterTypeStorage
1028
+
1029
+ wh.heating_capacity = nil
1030
+ wh.tank_volume = nil
1031
+ wh.recovery_efficiency = nil
1032
+ wh.location = nil
1033
+ wh.temperature = nil
544
1034
  end
545
1035
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
546
1036
  hpxml_default = _test_measure()
547
- _test_default_water_heater_values(hpxml_default, [false, 15354.6, 50.0, 0.98],
548
- [false, 36000.0, 40.0, 0.756])
1037
+ _test_default_storage_water_heater_values(hpxml_default,
1038
+ [false, 15354.6, 50.0, 0.98, HPXML::LocationBasementConditioned, 125],
1039
+ [false, 36000.0, 40.0, 0.756, HPXML::LocationBasementConditioned, 125])
1040
+ end
1041
+
1042
+ def test_tankless_water_heaters
1043
+ # Test inputs not overridden by defaults
1044
+ hpxml = _create_hpxml('base-dhw-tankless-gas.xml')
1045
+ hpxml.water_heating_systems[0].performance_adjustment = 0.88
1046
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1047
+ hpxml_default = _test_measure()
1048
+ _test_default_tankless_water_heater_values(hpxml_default, [0.88])
1049
+
1050
+ # Test defaults w/ EF
1051
+ hpxml.water_heating_systems[0].performance_adjustment = nil
1052
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1053
+ hpxml_default = _test_measure()
1054
+ _test_default_tankless_water_heater_values(hpxml_default, [0.92])
1055
+
1056
+ # Test defaults w/ UEF
1057
+ hpxml.water_heating_systems[0].energy_factor = nil
1058
+ hpxml.water_heating_systems[0].uniform_energy_factor = 0.93
1059
+ hpxml.water_heating_systems[0].first_hour_rating = 5.7
1060
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1061
+ hpxml_default = _test_measure()
1062
+ _test_default_tankless_water_heater_values(hpxml_default, [0.94])
549
1063
  end
550
1064
 
551
1065
  def test_hot_water_distribution
552
1066
  # Test inputs not overridden by defaults -- standard
553
1067
  hpxml = _create_hpxml('base.xml')
1068
+ hpxml.hot_water_distributions[0].pipe_r_value = 2.5
554
1069
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
555
1070
  hpxml_default = _test_measure()
556
- _test_default_standard_distribution_values(hpxml_default, 50.0)
1071
+ _test_default_standard_distribution_values(hpxml_default, 50.0, 2.5)
557
1072
 
558
1073
  # Test inputs not overridden by defaults -- recirculation
559
1074
  hpxml = _create_hpxml('base-dhw-recirc-demand.xml')
560
1075
  hpxml.hot_water_distributions[0].recirculation_pump_power = 65.0
1076
+ hpxml.hot_water_distributions[0].pipe_r_value = 2.5
561
1077
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
562
1078
  hpxml_default = _test_measure()
563
- _test_default_recirc_distribution_values(hpxml_default, 50.0, 50.0, 65.0)
1079
+ _test_default_recirc_distribution_values(hpxml_default, 50.0, 50.0, 65.0, 2.5)
564
1080
 
565
1081
  # Test inputs not overridden by defaults -- shared recirculation
566
- hpxml = _create_hpxml('base-dhw-shared-water-heater-recirc.xml')
1082
+ hpxml = _create_hpxml('base-bldgtype-multifamily-shared-water-heater-recirc.xml')
567
1083
  hpxml.hot_water_distributions[0].shared_recirculation_pump_power = 333.0
568
1084
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
569
1085
  hpxml_default = _test_measure()
@@ -572,57 +1088,59 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
572
1088
  # Test defaults w/ conditioned basement
573
1089
  hpxml = _create_hpxml('base.xml')
574
1090
  hpxml.hot_water_distributions[0].standard_piping_length = nil
1091
+ hpxml.hot_water_distributions[0].pipe_r_value = nil
575
1092
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
576
1093
  hpxml_default = _test_measure()
577
- _test_default_standard_distribution_values(hpxml_default, 93.48)
1094
+ _test_default_standard_distribution_values(hpxml_default, 93.48, 0.0)
578
1095
 
579
1096
  # Test defaults w/ unconditioned basement
580
1097
  hpxml = _create_hpxml('base-foundation-unconditioned-basement.xml')
581
1098
  hpxml.hot_water_distributions[0].standard_piping_length = nil
1099
+ hpxml.hot_water_distributions[0].pipe_r_value = nil
582
1100
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
583
1101
  hpxml_default = _test_measure()
584
- _test_default_standard_distribution_values(hpxml_default, 88.48)
1102
+ _test_default_standard_distribution_values(hpxml_default, 88.48, 0.0)
585
1103
 
586
1104
  # Test defaults w/ 2-story building
587
1105
  hpxml = _create_hpxml('base-enclosure-2stories.xml')
588
1106
  hpxml.hot_water_distributions[0].standard_piping_length = nil
1107
+ hpxml.hot_water_distributions[0].pipe_r_value = nil
589
1108
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
590
1109
  hpxml_default = _test_measure()
591
- _test_default_standard_distribution_values(hpxml_default, 103.48)
1110
+ _test_default_standard_distribution_values(hpxml_default, 103.48, 0.0)
592
1111
 
593
1112
  # Test defaults w/ recirculation & conditioned basement
594
1113
  hpxml = _create_hpxml('base-dhw-recirc-demand.xml')
595
1114
  hpxml.hot_water_distributions[0].recirculation_piping_length = nil
596
1115
  hpxml.hot_water_distributions[0].recirculation_branch_piping_length = nil
597
1116
  hpxml.hot_water_distributions[0].recirculation_pump_power = nil
1117
+ hpxml.hot_water_distributions[0].pipe_r_value = nil
598
1118
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
599
1119
  hpxml_default = _test_measure()
600
- _test_default_recirc_distribution_values(hpxml_default, 166.96, 10.0, 50.0)
1120
+ _test_default_recirc_distribution_values(hpxml_default, 166.96, 10.0, 50.0, 0.0)
601
1121
 
602
1122
  # Test defaults w/ recirculation & unconditioned basement
603
1123
  hpxml = _create_hpxml('base-foundation-unconditioned-basement.xml')
604
1124
  hpxml.hot_water_distributions.clear
605
1125
  hpxml.hot_water_distributions.add(id: 'HotWaterDistribution',
606
1126
  system_type: HPXML::DHWDistTypeRecirc,
607
- recirculation_control_type: HPXML::DHWRecirControlTypeSensor,
608
- pipe_r_value: 3.0)
1127
+ recirculation_control_type: HPXML::DHWRecirControlTypeSensor)
609
1128
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
610
1129
  hpxml_default = _test_measure()
611
- _test_default_recirc_distribution_values(hpxml_default, 156.96, 10.0, 50.0)
1130
+ _test_default_recirc_distribution_values(hpxml_default, 156.96, 10.0, 50.0, 0.0)
612
1131
 
613
1132
  # Test defaults w/ recirculation & 2-story building
614
1133
  hpxml = _create_hpxml('base-enclosure-2stories.xml')
615
1134
  hpxml.hot_water_distributions.clear
616
1135
  hpxml.hot_water_distributions.add(id: 'HotWaterDistribution',
617
1136
  system_type: HPXML::DHWDistTypeRecirc,
618
- recirculation_control_type: HPXML::DHWRecirControlTypeSensor,
619
- pipe_r_value: 3.0)
1137
+ recirculation_control_type: HPXML::DHWRecirControlTypeSensor)
620
1138
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
621
1139
  hpxml_default = _test_measure()
622
- _test_default_recirc_distribution_values(hpxml_default, 186.96, 10.0, 50.0)
1140
+ _test_default_recirc_distribution_values(hpxml_default, 186.96, 10.0, 50.0, 0.0)
623
1141
 
624
1142
  # Test defaults w/ shared recirculation
625
- hpxml = _create_hpxml('base-dhw-shared-water-heater-recirc.xml')
1143
+ hpxml = _create_hpxml('base-bldgtype-multifamily-shared-water-heater-recirc.xml')
626
1144
  hpxml.hot_water_distributions[0].shared_recirculation_pump_power = nil
627
1145
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
628
1146
  hpxml_default = _test_measure()
@@ -666,69 +1184,160 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
666
1184
  _test_default_solar_thermal_values(hpxml_default, 150.0)
667
1185
  end
668
1186
 
669
- def test_mech_ventilation_fans
1187
+ def test_pv_systems
670
1188
  # Test inputs not overridden by defaults
671
- hpxml = _create_hpxml('base-mechvent-exhaust.xml')
1189
+ hpxml = _create_hpxml('base-pv.xml')
672
1190
  hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
673
- vent_fan = hpxml.ventilation_fans.select { |f| f.used_for_whole_building_ventilation }[0]
674
- vent_fan.is_shared_system = true
675
- vent_fan.fraction_recirculation = 0.0
676
- vent_fan.in_unit_flow_rate = 10.0
1191
+ hpxml.pv_systems.each do |pv|
1192
+ pv.is_shared_system = true
1193
+ pv.number_of_bedrooms_served = 20
1194
+ pv.inverter_efficiency = 0.90
1195
+ pv.system_losses_fraction = 0.20
1196
+ pv.location = HPXML::LocationGround
1197
+ pv.tracking = HPXML::PVTrackingType1Axis
1198
+ pv.module_type = HPXML::PVModuleTypePremium
1199
+ end
1200
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1201
+ hpxml_default = _test_measure()
1202
+ _test_default_pv_system_values(hpxml_default, 0.90, 0.20, true, HPXML::LocationGround, HPXML::PVTrackingType1Axis, HPXML::PVModuleTypePremium)
1203
+
1204
+ # Test defaults w/o year modules manufactured
1205
+ hpxml.pv_systems.each do |pv|
1206
+ pv.is_shared_system = nil
1207
+ pv.inverter_efficiency = nil
1208
+ pv.system_losses_fraction = nil
1209
+ pv.location = nil
1210
+ pv.tracking = nil
1211
+ pv.module_type = nil
1212
+ end
1213
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1214
+ hpxml_default = _test_measure()
1215
+ _test_default_pv_system_values(hpxml_default, 0.96, 0.14, false, HPXML::LocationRoof, HPXML::PVTrackingTypeFixed, HPXML::PVModuleTypeStandard)
1216
+
1217
+ # Test defaults w/ year modules manufactured
1218
+ hpxml.pv_systems.each do |pv|
1219
+ pv.year_modules_manufactured = 2010
1220
+ end
1221
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1222
+ hpxml_default = _test_measure()
1223
+ _test_default_pv_system_values(hpxml_default, 0.96, 0.186, false, HPXML::LocationRoof, HPXML::PVTrackingTypeFixed, HPXML::PVModuleTypeStandard)
1224
+ end
1225
+
1226
+ def test_generators
1227
+ # Test inputs not overridden by defaults
1228
+ hpxml = _create_hpxml('base-misc-generators.xml')
1229
+ hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
1230
+ hpxml.generators.each do |generator|
1231
+ generator.is_shared_system = true
1232
+ generator.number_of_bedrooms_served = 20
1233
+ end
677
1234
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
678
1235
  hpxml_default = _test_measure()
679
- _test_default_mech_vent_values(hpxml_default, true)
1236
+ _test_default_generator_values(hpxml_default, true)
680
1237
 
681
1238
  # Test defaults
682
- vent_fan.rated_flow_rate = nil
683
- vent_fan.start_hour = nil
684
- vent_fan.quantity = nil
685
- vent_fan.is_shared_system = nil
686
- vent_fan.fraction_recirculation = nil
687
- vent_fan.in_unit_flow_rate = nil
1239
+ hpxml.generators.each do |generator|
1240
+ generator.is_shared_system = nil
1241
+ end
688
1242
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
689
1243
  hpxml_default = _test_measure()
690
- _test_default_mech_vent_values(hpxml_default, false)
1244
+ _test_default_generator_values(hpxml_default, false)
691
1245
  end
692
1246
 
693
- def test_local_ventilation_fans
1247
+ def test_clothes_washers
694
1248
  # Test inputs not overridden by defaults
695
- hpxml = _create_hpxml('base-mechvent-bath-kitchen-fans.xml')
696
- kitchen_fan = hpxml.ventilation_fans.select { |f| f.used_for_local_ventilation && f.fan_location == HPXML::LocationKitchen }[0]
697
- kitchen_fan.rated_flow_rate = 300
698
- kitchen_fan.fan_power = 20
699
- kitchen_fan.start_hour = 12
700
- kitchen_fan.quantity = 2
701
- kitchen_fan.hours_in_operation = 2
702
- bath_fan = hpxml.ventilation_fans.select { |f| f.used_for_local_ventilation && f.fan_location == HPXML::LocationBath }[0]
703
- bath_fan.rated_flow_rate = 80
704
- bath_fan.fan_power = 33
705
- bath_fan.start_hour = 6
706
- bath_fan.quantity = 3
707
- bath_fan.hours_in_operation = 3
1249
+ hpxml = _create_hpxml('base.xml')
1250
+ hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
1251
+ hpxml.water_heating_systems[0].is_shared_system = true
1252
+ hpxml.water_heating_systems[0].number_of_units_served = 6
1253
+ hpxml.water_heating_systems[0].fraction_dhw_load_served = 0
1254
+ hpxml.clothes_washers[0].location = HPXML::LocationBasementConditioned
1255
+ hpxml.clothes_washers[0].is_shared_appliance = true
1256
+ hpxml.clothes_washers[0].usage_multiplier = 1.5
1257
+ hpxml.clothes_washers[0].water_heating_system_idref = hpxml.water_heating_systems[0].id
708
1258
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
709
1259
  hpxml_default = _test_measure()
710
- _test_default_kitchen_fan_values(hpxml_default, 2, 300, 2, 20, 12)
711
- _test_default_bath_fan_values(hpxml_default, 3, 80, 3, 33, 6)
1260
+ _test_default_clothes_washer_values(hpxml_default, true, HPXML::LocationBasementConditioned, 1.21, 380.0, 0.12, 1.09, 27.0, 3.2, 6.0, 1.5)
712
1261
 
713
1262
  # Test defaults
714
- kitchen_fan.rated_flow_rate = nil
715
- kitchen_fan.fan_power = nil
716
- kitchen_fan.start_hour = nil
717
- kitchen_fan.quantity = nil
718
- kitchen_fan.hours_in_operation = nil
719
- bath_fan.rated_flow_rate = nil
720
- bath_fan.fan_power = nil
721
- bath_fan.start_hour = nil
722
- bath_fan.quantity = nil
723
- bath_fan.hours_in_operation = nil
1263
+ hpxml.clothes_washers[0].is_shared_appliance = nil
1264
+ hpxml.clothes_washers[0].location = nil
1265
+ hpxml.clothes_washers[0].integrated_modified_energy_factor = nil
1266
+ hpxml.clothes_washers[0].rated_annual_kwh = nil
1267
+ hpxml.clothes_washers[0].label_electric_rate = nil
1268
+ hpxml.clothes_washers[0].label_gas_rate = nil
1269
+ hpxml.clothes_washers[0].label_annual_gas_cost = nil
1270
+ hpxml.clothes_washers[0].capacity = nil
1271
+ hpxml.clothes_washers[0].label_usage = nil
1272
+ hpxml.clothes_washers[0].usage_multiplier = nil
724
1273
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
725
1274
  hpxml_default = _test_measure()
726
- _test_default_kitchen_fan_values(hpxml_default, 1, 100, 1, 30, 18)
727
- _test_default_bath_fan_values(hpxml_default, 2, 50, 1, 15, 7)
1275
+ _test_default_clothes_washer_values(hpxml_default, false, HPXML::LocationLivingSpace, 1.0, 400.0, 0.12, 1.09, 27.0, 3.0, 6.0, 1.0)
1276
+
1277
+ # Test defaults before 301-2019 Addendum A
1278
+ hpxml = _create_hpxml('base.xml')
1279
+ hpxml.header.eri_calculation_version = '2019'
1280
+ hpxml.clothes_washers[0].is_shared_appliance = nil
1281
+ hpxml.clothes_washers[0].location = nil
1282
+ hpxml.clothes_washers[0].integrated_modified_energy_factor = nil
1283
+ hpxml.clothes_washers[0].rated_annual_kwh = nil
1284
+ hpxml.clothes_washers[0].label_electric_rate = nil
1285
+ hpxml.clothes_washers[0].label_gas_rate = nil
1286
+ hpxml.clothes_washers[0].label_annual_gas_cost = nil
1287
+ hpxml.clothes_washers[0].capacity = nil
1288
+ hpxml.clothes_washers[0].label_usage = nil
1289
+ hpxml.clothes_washers[0].usage_multiplier = nil
1290
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1291
+ hpxml_default = _test_measure()
1292
+ _test_default_clothes_washer_values(hpxml_default, false, HPXML::LocationLivingSpace, 0.331, 704.0, 0.08, 0.58, 23.0, 2.874, 999, 1.0)
728
1293
  end
729
1294
 
730
- def test_clothes_dryer_exhaust
1295
+ def test_clothes_dryers
731
1296
  # Test inputs not overridden by defaults
1297
+ hpxml = _create_hpxml('base.xml')
1298
+ hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
1299
+ hpxml.water_heating_systems[0].is_shared_system = true
1300
+ hpxml.water_heating_systems[0].number_of_units_served = 6
1301
+ hpxml.water_heating_systems[0].fraction_dhw_load_served = 0
1302
+ hpxml.clothes_dryers[0].location = HPXML::LocationBasementConditioned
1303
+ hpxml.clothes_dryers[0].is_shared_appliance = true
1304
+ hpxml.clothes_dryers[0].combined_energy_factor = 3.33
1305
+ hpxml.clothes_dryers[0].usage_multiplier = 1.1
1306
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1307
+ hpxml_default = _test_measure()
1308
+ _test_default_clothes_dryer_values(hpxml_default, true, HPXML::LocationBasementConditioned, 3.33, 1.1)
1309
+
1310
+ # Test defaults w/ electric clothes dryer
1311
+ hpxml.clothes_dryers[0].location = nil
1312
+ hpxml.clothes_dryers[0].is_shared_appliance = nil
1313
+ hpxml.clothes_dryers[0].combined_energy_factor = nil
1314
+ hpxml.clothes_dryers[0].usage_multiplier = nil
1315
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1316
+ hpxml_default = _test_measure()
1317
+ _test_default_clothes_dryer_values(hpxml_default, false, HPXML::LocationLivingSpace, 3.01, 1.0)
1318
+
1319
+ # Test defaults w/ gas clothes dryer
1320
+ hpxml.clothes_dryers[0].fuel_type = HPXML::FuelTypeNaturalGas
1321
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1322
+ hpxml_default = _test_measure()
1323
+ _test_default_clothes_dryer_values(hpxml_default, false, HPXML::LocationLivingSpace, 3.01, 1.0)
1324
+
1325
+ # Test defaults w/ electric clothes dryer before 301-2019 Addendum A
1326
+ hpxml.header.eri_calculation_version = '2019'
1327
+ hpxml.clothes_dryers[0].fuel_type = HPXML::FuelTypeElectricity
1328
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1329
+ hpxml_default = _test_measure()
1330
+ _test_default_clothes_dryer_values(hpxml_default, false, HPXML::LocationLivingSpace, 2.62, 1.0)
1331
+
1332
+ # Test defaults w/ gas clothes dryer before 301-2019 Addendum A
1333
+ hpxml.clothes_dryers[0].fuel_type = HPXML::FuelTypeNaturalGas
1334
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1335
+ hpxml_default = _test_measure()
1336
+ _test_default_clothes_dryer_values(hpxml_default, false, HPXML::LocationLivingSpace, 2.32, 1.0)
1337
+ end
1338
+
1339
+ def test_clothes_dryer_exhaust
1340
+ # Test inputs not overridden by defaults w/ vented dryer
732
1341
  hpxml_name = 'base.xml'
733
1342
  hpxml = HPXML.new(hpxml_path: File.join(@root_path, 'workflow', 'sample_files', hpxml_name))
734
1343
  clothes_dryer = hpxml.clothes_dryers[0]
@@ -738,6 +1347,7 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
738
1347
  hpxml_default = _test_measure()
739
1348
  _test_default_clothes_dryer_exhaust_values(hpxml_default, true, 200)
740
1349
 
1350
+ # Test inputs not overridden by defaults w/ unvented dryer
741
1351
  clothes_dryer.is_vented = false
742
1352
  clothes_dryer.vented_flow_rate = nil
743
1353
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
@@ -752,18 +1362,283 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
752
1362
  _test_default_clothes_dryer_exhaust_values(hpxml_default, true, 100)
753
1363
  end
754
1364
 
755
- def test_ceiling_fans
1365
+ def test_dishwashers
756
1366
  # Test inputs not overridden by defaults
757
- hpxml = _create_hpxml('base-lighting-ceiling-fans.xml')
1367
+ hpxml = _create_hpxml('base.xml')
1368
+ hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
1369
+ hpxml.water_heating_systems[0].is_shared_system = true
1370
+ hpxml.water_heating_systems[0].number_of_units_served = 6
1371
+ hpxml.water_heating_systems[0].fraction_dhw_load_served = 0
1372
+ hpxml.dishwashers[0].location = HPXML::LocationBasementConditioned
1373
+ hpxml.dishwashers[0].is_shared_appliance = true
1374
+ hpxml.dishwashers[0].usage_multiplier = 1.3
1375
+ hpxml.dishwashers[0].water_heating_system_idref = hpxml.water_heating_systems[0].id
758
1376
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
759
1377
  hpxml_default = _test_measure()
760
- _test_default_ceiling_fan_values(hpxml_default, 2, 100)
1378
+ _test_default_dishwasher_values(hpxml_default, true, HPXML::LocationBasementConditioned, 307.0, 0.12, 1.09, 22.32, 4.0, 12, 1.3)
761
1379
 
762
1380
  # Test defaults
763
- hpxml.ceiling_fans.each do |ceiling_fan|
764
- ceiling_fan.quantity = nil
765
- ceiling_fan.efficiency = nil
766
- end
1381
+ hpxml.dishwashers[0].is_shared_appliance = nil
1382
+ hpxml.dishwashers[0].location = nil
1383
+ hpxml.dishwashers[0].rated_annual_kwh = nil
1384
+ hpxml.dishwashers[0].label_electric_rate = nil
1385
+ hpxml.dishwashers[0].label_gas_rate = nil
1386
+ hpxml.dishwashers[0].label_annual_gas_cost = nil
1387
+ hpxml.dishwashers[0].label_usage = nil
1388
+ hpxml.dishwashers[0].place_setting_capacity = nil
1389
+ hpxml.dishwashers[0].usage_multiplier = nil
1390
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1391
+ hpxml_default = _test_measure()
1392
+ _test_default_dishwasher_values(hpxml_default, false, HPXML::LocationLivingSpace, 467.0, 0.12, 1.09, 33.12, 4.0, 12, 1.0)
1393
+
1394
+ # Test defaults before 301-2019 Addendum A
1395
+ hpxml.header.eri_calculation_version = '2019'
1396
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1397
+ hpxml_default = _test_measure()
1398
+ _test_default_dishwasher_values(hpxml_default, false, HPXML::LocationLivingSpace, 467.0, 999, 999, 999, 999, 12, 1.0)
1399
+ end
1400
+
1401
+ def test_refrigerators
1402
+ # Test inputs not overridden by defaults
1403
+ hpxml = _create_hpxml('base.xml')
1404
+ hpxml.refrigerators[0].location = HPXML::LocationBasementConditioned
1405
+ hpxml.refrigerators[0].usage_multiplier = 1.2
1406
+ hpxml.refrigerators[0].weekday_fractions = ConstantDaySchedule
1407
+ hpxml.refrigerators[0].weekend_fractions = ConstantDaySchedule
1408
+ hpxml.refrigerators[0].monthly_multipliers = ConstantMonthSchedule
1409
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1410
+ hpxml_default = _test_measure()
1411
+ _test_default_refrigerator_values(hpxml_default, HPXML::LocationBasementConditioned, 650.0, 1.2, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1412
+
1413
+ # Test defaults
1414
+ hpxml.refrigerators[0].location = nil
1415
+ hpxml.refrigerators[0].rated_annual_kwh = nil
1416
+ hpxml.refrigerators[0].usage_multiplier = nil
1417
+ hpxml.refrigerators[0].weekday_fractions = nil
1418
+ hpxml.refrigerators[0].weekend_fractions = nil
1419
+ hpxml.refrigerators[0].monthly_multipliers = nil
1420
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1421
+ hpxml_default = _test_measure()
1422
+ _test_default_refrigerator_values(hpxml_default, HPXML::LocationLivingSpace, 691.0, 1.0, '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1423
+
1424
+ # Test defaults w/ refrigerator in 5-bedroom house
1425
+ hpxml.building_construction.number_of_bedrooms = 5
1426
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1427
+ hpxml_default = _test_measure()
1428
+ _test_default_refrigerator_values(hpxml_default, HPXML::LocationLivingSpace, 727.0, 1.0, '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1429
+
1430
+ # Test defaults before 301-2019 Addendum A
1431
+ hpxml.header.eri_calculation_version = '2019'
1432
+ hpxml.building_construction.number_of_bedrooms = 3
1433
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1434
+ hpxml_default = _test_measure()
1435
+ _test_default_refrigerator_values(hpxml_default, HPXML::LocationLivingSpace, 691.0, 1.0, '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1436
+ end
1437
+
1438
+ def test_extra_refrigerators
1439
+ # Test inputs not overridden by defaults
1440
+ hpxml = _create_hpxml('base-misc-loads-large-uncommon.xml')
1441
+ hpxml.refrigerators.each do |refrigerator|
1442
+ refrigerator.location = HPXML::LocationLivingSpace
1443
+ refrigerator.rated_annual_kwh = 333.0
1444
+ refrigerator.usage_multiplier = 1.5
1445
+ refrigerator.weekday_fractions = ConstantDaySchedule
1446
+ refrigerator.weekend_fractions = ConstantDaySchedule
1447
+ refrigerator.monthly_multipliers = ConstantMonthSchedule
1448
+ end
1449
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1450
+ hpxml_default = _test_measure()
1451
+ _test_default_extra_refrigerators_values(hpxml_default, HPXML::LocationLivingSpace, 333.0, 1.5, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1452
+
1453
+ # Test defaults
1454
+ hpxml.refrigerators.each do |refrigerator|
1455
+ refrigerator.location = nil
1456
+ refrigerator.rated_annual_kwh = nil
1457
+ refrigerator.usage_multiplier = nil
1458
+ refrigerator.weekday_fractions = nil
1459
+ refrigerator.weekend_fractions = nil
1460
+ refrigerator.monthly_multipliers = nil
1461
+ end
1462
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1463
+ hpxml_default = _test_measure()
1464
+ _test_default_extra_refrigerators_values(hpxml_default, HPXML::LocationBasementConditioned, 244.0, 1.0, '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1465
+ end
1466
+
1467
+ def test_freezers
1468
+ # Test inputs not overridden by defaults
1469
+ hpxml = _create_hpxml('base-misc-loads-large-uncommon.xml')
1470
+ hpxml.freezers.each do |freezer|
1471
+ freezer.location = HPXML::LocationLivingSpace
1472
+ freezer.rated_annual_kwh = 333.0
1473
+ freezer.usage_multiplier = 1.5
1474
+ freezer.weekday_fractions = ConstantDaySchedule
1475
+ freezer.weekend_fractions = ConstantDaySchedule
1476
+ freezer.monthly_multipliers = ConstantMonthSchedule
1477
+ end
1478
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1479
+ hpxml_default = _test_measure()
1480
+ _test_default_freezers_values(hpxml_default, HPXML::LocationLivingSpace, 333.0, 1.5, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1481
+
1482
+ # Test defaults
1483
+ hpxml.freezers.each do |freezer|
1484
+ freezer.location = nil
1485
+ freezer.rated_annual_kwh = nil
1486
+ freezer.usage_multiplier = nil
1487
+ freezer.weekday_fractions = nil
1488
+ freezer.weekend_fractions = nil
1489
+ freezer.monthly_multipliers = nil
1490
+ end
1491
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1492
+ hpxml_default = _test_measure()
1493
+ _test_default_freezers_values(hpxml_default, HPXML::LocationBasementConditioned, 320.0, 1.0, '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1494
+ end
1495
+
1496
+ def test_cooking_ranges
1497
+ # Test inputs not overridden by defaults
1498
+ hpxml = _create_hpxml('base.xml')
1499
+ hpxml.cooking_ranges[0].location = HPXML::LocationBasementConditioned
1500
+ hpxml.cooking_ranges[0].is_induction = true
1501
+ hpxml.cooking_ranges[0].usage_multiplier = 1.1
1502
+ hpxml.cooking_ranges[0].weekday_fractions = ConstantDaySchedule
1503
+ hpxml.cooking_ranges[0].weekend_fractions = ConstantDaySchedule
1504
+ hpxml.cooking_ranges[0].monthly_multipliers = ConstantMonthSchedule
1505
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1506
+ hpxml_default = _test_measure()
1507
+ _test_default_cooking_range_values(hpxml_default, HPXML::LocationBasementConditioned, true, 1.1, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1508
+
1509
+ # Test defaults
1510
+ hpxml.cooking_ranges[0].location = nil
1511
+ hpxml.cooking_ranges[0].is_induction = nil
1512
+ hpxml.cooking_ranges[0].usage_multiplier = nil
1513
+ hpxml.cooking_ranges[0].weekday_fractions = nil
1514
+ hpxml.cooking_ranges[0].weekend_fractions = nil
1515
+ hpxml.cooking_ranges[0].monthly_multipliers = nil
1516
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1517
+ hpxml_default = _test_measure()
1518
+ _test_default_cooking_range_values(hpxml_default, HPXML::LocationLivingSpace, false, 1.0, '0.007, 0.007, 0.004, 0.004, 0.007, 0.011, 0.025, 0.042, 0.046, 0.048, 0.042, 0.050, 0.057, 0.046, 0.057, 0.044, 0.092, 0.150, 0.117, 0.060, 0.035, 0.025, 0.016, 0.011', '0.007, 0.007, 0.004, 0.004, 0.007, 0.011, 0.025, 0.042, 0.046, 0.048, 0.042, 0.050, 0.057, 0.046, 0.057, 0.044, 0.092, 0.150, 0.117, 0.060, 0.035, 0.025, 0.016, 0.011', '1.097, 1.097, 0.991, 0.987, 0.991, 0.890, 0.896, 0.896, 0.890, 1.085, 1.085, 1.097')
1519
+
1520
+ # Test defaults before 301-2019 Addendum A
1521
+ hpxml.header.eri_calculation_version = '2019'
1522
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1523
+ hpxml_default = _test_measure()
1524
+ _test_default_cooking_range_values(hpxml_default, HPXML::LocationLivingSpace, false, 1.0, '0.007, 0.007, 0.004, 0.004, 0.007, 0.011, 0.025, 0.042, 0.046, 0.048, 0.042, 0.050, 0.057, 0.046, 0.057, 0.044, 0.092, 0.150, 0.117, 0.060, 0.035, 0.025, 0.016, 0.011', '0.007, 0.007, 0.004, 0.004, 0.007, 0.011, 0.025, 0.042, 0.046, 0.048, 0.042, 0.050, 0.057, 0.046, 0.057, 0.044, 0.092, 0.150, 0.117, 0.060, 0.035, 0.025, 0.016, 0.011', '1.097, 1.097, 0.991, 0.987, 0.991, 0.890, 0.896, 0.896, 0.890, 1.085, 1.085, 1.097')
1525
+ end
1526
+
1527
+ def test_ovens
1528
+ # Test inputs not overridden by defaults
1529
+ hpxml = _create_hpxml('base.xml')
1530
+ hpxml.ovens[0].is_convection = true
1531
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1532
+ hpxml_default = _test_measure()
1533
+ _test_default_oven_values(hpxml_default, true)
1534
+
1535
+ # Test defaults
1536
+ hpxml.ovens[0].is_convection = nil
1537
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1538
+ hpxml_default = _test_measure()
1539
+ _test_default_oven_values(hpxml_default, false)
1540
+
1541
+ # Test defaults before 301-2019 Addendum A
1542
+ hpxml.header.eri_calculation_version = '2019'
1543
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1544
+ hpxml_default = _test_measure()
1545
+ _test_default_oven_values(hpxml_default, false)
1546
+ end
1547
+
1548
+ def test_lighting
1549
+ # Test inputs not overridden by defaults
1550
+ hpxml = _create_hpxml('base.xml')
1551
+ hpxml.lighting.interior_usage_multiplier = 2.0
1552
+ hpxml.lighting.garage_usage_multiplier = 2.0
1553
+ hpxml.lighting.exterior_usage_multiplier = 2.0
1554
+ hpxml.lighting.interior_weekday_fractions = ConstantDaySchedule
1555
+ hpxml.lighting.interior_weekend_fractions = ConstantDaySchedule
1556
+ hpxml.lighting.interior_monthly_multipliers = ConstantMonthSchedule
1557
+ hpxml.lighting.exterior_weekday_fractions = ConstantDaySchedule
1558
+ hpxml.lighting.exterior_weekend_fractions = ConstantDaySchedule
1559
+ hpxml.lighting.exterior_monthly_multipliers = ConstantMonthSchedule
1560
+ hpxml.lighting.garage_weekday_fractions = ConstantDaySchedule
1561
+ hpxml.lighting.garage_weekend_fractions = ConstantDaySchedule
1562
+ hpxml.lighting.garage_monthly_multipliers = ConstantMonthSchedule
1563
+ hpxml.lighting.holiday_exists = true
1564
+ hpxml.lighting.holiday_kwh_per_day = 0.7
1565
+ hpxml.lighting.holiday_period_begin_month = 11
1566
+ hpxml.lighting.holiday_period_begin_day = 19
1567
+ hpxml.lighting.holiday_period_end_month = 12
1568
+ hpxml.lighting.holiday_period_end_day = 31
1569
+ hpxml.lighting.holiday_weekday_fractions = ConstantDaySchedule
1570
+ hpxml.lighting.holiday_weekend_fractions = ConstantDaySchedule
1571
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1572
+ hpxml_default = _test_measure()
1573
+ _test_default_lighting_values(hpxml_default, 2.0, 2.0, 2.0,
1574
+ { int_wk_sch: ConstantDaySchedule,
1575
+ int_wknd_sch: ConstantDaySchedule,
1576
+ int_month_mult: ConstantMonthSchedule,
1577
+ ext_wk_sch: ConstantDaySchedule,
1578
+ ext_wknd_sch: ConstantDaySchedule,
1579
+ ext_month_mult: ConstantMonthSchedule,
1580
+ grg_wk_sch: ConstantDaySchedule,
1581
+ grg_wknd_sch: ConstantDaySchedule,
1582
+ grg_month_mult: ConstantMonthSchedule,
1583
+ hol_kwh_per_day: 0.7,
1584
+ hol_begin_month: 11,
1585
+ hol_begin_day: 19,
1586
+ hol_end_month: 12,
1587
+ hol_end_day: 31,
1588
+ hol_wk_sch: ConstantDaySchedule,
1589
+ hol_wknd_sch: ConstantDaySchedule })
1590
+
1591
+ # Test defaults
1592
+ hpxml.lighting.interior_usage_multiplier = nil
1593
+ hpxml.lighting.garage_usage_multiplier = nil
1594
+ hpxml.lighting.exterior_usage_multiplier = nil
1595
+ hpxml.lighting.interior_weekday_fractions = nil
1596
+ hpxml.lighting.interior_weekend_fractions = nil
1597
+ hpxml.lighting.interior_monthly_multipliers = nil
1598
+ hpxml.lighting.exterior_weekday_fractions = nil
1599
+ hpxml.lighting.exterior_weekend_fractions = nil
1600
+ hpxml.lighting.exterior_monthly_multipliers = nil
1601
+ hpxml.lighting.garage_weekday_fractions = nil
1602
+ hpxml.lighting.garage_weekend_fractions = nil
1603
+ hpxml.lighting.garage_monthly_multipliers = nil
1604
+ hpxml.lighting.holiday_exists = nil
1605
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1606
+ hpxml_default = _test_measure()
1607
+ _test_default_lighting_values(hpxml_default, 1.0, 1.0, 1.0,
1608
+ { ext_wk_sch: '0.046, 0.046, 0.046, 0.046, 0.046, 0.037, 0.035, 0.034, 0.033, 0.028, 0.022, 0.015, 0.012, 0.011, 0.011, 0.012, 0.019, 0.037, 0.049, 0.065, 0.091, 0.105, 0.091, 0.063',
1609
+ ext_wknd_sch: '0.046, 0.046, 0.045, 0.045, 0.046, 0.045, 0.044, 0.041, 0.036, 0.03, 0.024, 0.016, 0.012, 0.011, 0.011, 0.012, 0.019, 0.038, 0.048, 0.06, 0.083, 0.098, 0.085, 0.059',
1610
+ ext_month_mult: '1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248' })
1611
+
1612
+ # Test defaults w/ garage
1613
+ hpxml = _create_hpxml('base-enclosure-garage.xml')
1614
+ hpxml.lighting.interior_usage_multiplier = nil
1615
+ hpxml.lighting.garage_usage_multiplier = nil
1616
+ hpxml.lighting.exterior_usage_multiplier = nil
1617
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1618
+ hpxml_default = _test_measure()
1619
+ _test_default_lighting_values(hpxml_default, 1.0, 1.0, 1.0,
1620
+ { ext_wk_sch: '0.046, 0.046, 0.046, 0.046, 0.046, 0.037, 0.035, 0.034, 0.033, 0.028, 0.022, 0.015, 0.012, 0.011, 0.011, 0.012, 0.019, 0.037, 0.049, 0.065, 0.091, 0.105, 0.091, 0.063',
1621
+ ext_wknd_sch: '0.046, 0.046, 0.045, 0.045, 0.046, 0.045, 0.044, 0.041, 0.036, 0.03, 0.024, 0.016, 0.012, 0.011, 0.011, 0.012, 0.019, 0.038, 0.048, 0.06, 0.083, 0.098, 0.085, 0.059',
1622
+ ext_month_mult: '1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248',
1623
+ grg_wk_sch: '0.046, 0.046, 0.046, 0.046, 0.046, 0.037, 0.035, 0.034, 0.033, 0.028, 0.022, 0.015, 0.012, 0.011, 0.011, 0.012, 0.019, 0.037, 0.049, 0.065, 0.091, 0.105, 0.091, 0.063',
1624
+ grg_wknd_sch: '0.046, 0.046, 0.045, 0.045, 0.046, 0.045, 0.044, 0.041, 0.036, 0.03, 0.024, 0.016, 0.012, 0.011, 0.011, 0.012, 0.019, 0.038, 0.048, 0.06, 0.083, 0.098, 0.085, 0.059',
1625
+ grg_month_mult: '1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248' })
1626
+ end
1627
+
1628
+ def test_ceiling_fans
1629
+ # Test inputs not overridden by defaults
1630
+ hpxml = _create_hpxml('base-lighting-ceiling-fans.xml')
1631
+ hpxml.ceiling_fans[0].quantity = 2
1632
+ hpxml.ceiling_fans[0].efficiency = 100
1633
+ XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1634
+ hpxml_default = _test_measure()
1635
+ _test_default_ceiling_fan_values(hpxml_default, 2, 100)
1636
+
1637
+ # Test defaults
1638
+ hpxml.ceiling_fans.each do |ceiling_fan|
1639
+ ceiling_fan.quantity = nil
1640
+ ceiling_fan.efficiency = nil
1641
+ end
767
1642
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
768
1643
  hpxml_default = _test_measure()
769
1644
  _test_default_ceiling_fan_values(hpxml_default, 4, 70.4)
@@ -775,50 +1650,56 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
775
1650
  pool = hpxml.pools[0]
776
1651
  pool.heater_load_units = HPXML::UnitsKwhPerYear
777
1652
  pool.heater_load_value = 1000
778
- pool.pump_kwh_per_year = 3000
1653
+ pool.heater_usage_multiplier = 1.4
779
1654
  pool.heater_weekday_fractions = ConstantDaySchedule
780
1655
  pool.heater_weekend_fractions = ConstantDaySchedule
781
1656
  pool.heater_monthly_multipliers = ConstantMonthSchedule
1657
+ pool.pump_kwh_per_year = 3000
1658
+ pool.pump_usage_multiplier = 1.3
782
1659
  pool.pump_weekday_fractions = ConstantDaySchedule
783
1660
  pool.pump_weekend_fractions = ConstantDaySchedule
784
1661
  pool.pump_monthly_multipliers = ConstantMonthSchedule
785
1662
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
786
1663
  hpxml_default = _test_measure()
787
- _test_default_pool_heater_values(hpxml_default, HPXML::UnitsKwhPerYear, 1000, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
788
- _test_default_pool_pump_values(hpxml_default, 3000, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1664
+ _test_default_pool_heater_values(hpxml_default, HPXML::UnitsKwhPerYear, 1000, 1.4, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1665
+ _test_default_pool_pump_values(hpxml_default, 3000, 1.3, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
789
1666
 
790
1667
  # Test defaults
791
1668
  pool = hpxml.pools[0]
792
1669
  pool.heater_load_units = nil
793
1670
  pool.heater_load_value = nil
794
- pool.pump_kwh_per_year = nil
1671
+ pool.heater_usage_multiplier = nil
795
1672
  pool.heater_weekday_fractions = nil
796
1673
  pool.heater_weekend_fractions = nil
797
1674
  pool.heater_monthly_multipliers = nil
1675
+ pool.pump_kwh_per_year = nil
1676
+ pool.pump_usage_multiplier = nil
798
1677
  pool.pump_weekday_fractions = nil
799
1678
  pool.pump_weekend_fractions = nil
800
1679
  pool.pump_monthly_multipliers = nil
801
1680
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
802
1681
  hpxml_default = _test_measure()
803
- _test_default_pool_heater_values(hpxml_default, HPXML::UnitsThermPerYear, 236, '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
804
- _test_default_pool_pump_values(hpxml_default, 2496, '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
1682
+ _test_default_pool_heater_values(hpxml_default, HPXML::UnitsThermPerYear, 236, 1.0, '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
1683
+ _test_default_pool_pump_values(hpxml_default, 2496, 1.0, '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
805
1684
 
806
1685
  # Test defaults 2
807
1686
  hpxml = _create_hpxml('base-misc-loads-large-uncommon2.xml')
808
1687
  pool = hpxml.pools[0]
809
1688
  pool.heater_load_units = nil
810
1689
  pool.heater_load_value = nil
811
- pool.pump_kwh_per_year = nil
1690
+ pool.heater_usage_multiplier = nil
812
1691
  pool.heater_weekday_fractions = nil
813
1692
  pool.heater_weekend_fractions = nil
814
1693
  pool.heater_monthly_multipliers = nil
1694
+ pool.pump_kwh_per_year = nil
1695
+ pool.pump_usage_multiplier = nil
815
1696
  pool.pump_weekday_fractions = nil
816
1697
  pool.pump_weekend_fractions = nil
817
1698
  pool.pump_monthly_multipliers = nil
818
1699
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
819
1700
  hpxml_default = _test_measure()
820
- _test_default_pool_heater_values(hpxml_default, nil, nil, nil, nil, nil)
821
- _test_default_pool_pump_values(hpxml_default, 2496, '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
1701
+ _test_default_pool_heater_values(hpxml_default, nil, nil, nil, nil, nil, nil)
1702
+ _test_default_pool_pump_values(hpxml_default, 2496, 1.0, '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '0.003, 0.003, 0.003, 0.004, 0.008, 0.015, 0.026, 0.044, 0.084, 0.121, 0.127, 0.121, 0.120, 0.090, 0.075, 0.061, 0.037, 0.023, 0.013, 0.008, 0.004, 0.003, 0.003, 0.003', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
822
1703
  end
823
1704
 
824
1705
  def test_hot_tubs
@@ -827,50 +1708,56 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
827
1708
  hot_tub = hpxml.hot_tubs[0]
828
1709
  hot_tub.heater_load_units = HPXML::UnitsThermPerYear
829
1710
  hot_tub.heater_load_value = 1000
830
- hot_tub.pump_kwh_per_year = 3000
1711
+ hot_tub.heater_usage_multiplier = 0.8
831
1712
  hot_tub.heater_weekday_fractions = ConstantDaySchedule
832
1713
  hot_tub.heater_weekend_fractions = ConstantDaySchedule
833
1714
  hot_tub.heater_monthly_multipliers = ConstantMonthSchedule
1715
+ hot_tub.pump_kwh_per_year = 3000
1716
+ hot_tub.pump_usage_multiplier = 0.7
834
1717
  hot_tub.pump_weekday_fractions = ConstantDaySchedule
835
1718
  hot_tub.pump_weekend_fractions = ConstantDaySchedule
836
1719
  hot_tub.pump_monthly_multipliers = ConstantMonthSchedule
837
1720
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
838
1721
  hpxml_default = _test_measure()
839
- _test_default_hot_tub_heater_values(hpxml_default, HPXML::UnitsThermPerYear, 1000, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
840
- _test_default_hot_tub_pump_values(hpxml_default, 3000, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1722
+ _test_default_hot_tub_heater_values(hpxml_default, HPXML::UnitsThermPerYear, 1000, 0.8, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1723
+ _test_default_hot_tub_pump_values(hpxml_default, 3000, 0.7, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
841
1724
 
842
1725
  # Test defaults
843
1726
  hot_tub = hpxml.hot_tubs[0]
844
1727
  hot_tub.heater_load_units = nil
845
1728
  hot_tub.heater_load_value = nil
846
- hot_tub.pump_kwh_per_year = nil
1729
+ hot_tub.heater_usage_multiplier = nil
847
1730
  hot_tub.heater_weekday_fractions = nil
848
1731
  hot_tub.heater_weekend_fractions = nil
849
1732
  hot_tub.heater_monthly_multipliers = nil
1733
+ hot_tub.pump_kwh_per_year = nil
1734
+ hot_tub.pump_usage_multiplier = nil
850
1735
  hot_tub.pump_weekday_fractions = nil
851
1736
  hot_tub.pump_weekend_fractions = nil
852
1737
  hot_tub.pump_monthly_multipliers = nil
853
1738
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
854
1739
  hpxml_default = _test_measure()
855
- _test_default_hot_tub_heater_values(hpxml_default, HPXML::UnitsKwhPerYear, 1125, '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
856
- _test_default_hot_tub_pump_values(hpxml_default, 1111, '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.921, 0.928, 0.921, 0.915, 0.921, 1.160, 1.158, 1.158, 1.160, 0.921, 0.915, 0.921')
1740
+ _test_default_hot_tub_heater_values(hpxml_default, HPXML::UnitsKwhPerYear, 1125, 1.0, '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1741
+ _test_default_hot_tub_pump_values(hpxml_default, 1111, 1.0, '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.921, 0.928, 0.921, 0.915, 0.921, 1.160, 1.158, 1.158, 1.160, 0.921, 0.915, 0.921')
857
1742
 
858
1743
  # Test defaults 2
859
1744
  hpxml = _create_hpxml('base-misc-loads-large-uncommon2.xml')
860
1745
  hot_tub = hpxml.hot_tubs[0]
861
1746
  hot_tub.heater_load_units = nil
862
1747
  hot_tub.heater_load_value = nil
863
- hot_tub.pump_kwh_per_year = nil
1748
+ hot_tub.heater_usage_multiplier = nil
864
1749
  hot_tub.heater_weekday_fractions = nil
865
1750
  hot_tub.heater_weekend_fractions = nil
866
1751
  hot_tub.heater_monthly_multipliers = nil
1752
+ hot_tub.pump_kwh_per_year = nil
1753
+ hot_tub.pump_usage_multiplier = nil
867
1754
  hot_tub.pump_weekday_fractions = nil
868
1755
  hot_tub.pump_weekend_fractions = nil
869
1756
  hot_tub.pump_monthly_multipliers = nil
870
1757
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
871
1758
  hpxml_default = _test_measure()
872
- _test_default_hot_tub_heater_values(hpxml_default, HPXML::UnitsKwhPerYear, 225, '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
873
- _test_default_hot_tub_pump_values(hpxml_default, 1111, '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.921, 0.928, 0.921, 0.915, 0.921, 1.160, 1.158, 1.158, 1.160, 0.921, 0.915, 0.921')
1759
+ _test_default_hot_tub_heater_values(hpxml_default, HPXML::UnitsKwhPerYear, 225, 1.0, '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1760
+ _test_default_hot_tub_pump_values(hpxml_default, 1111, 1.0, '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.024, 0.029, 0.024, 0.029, 0.047, 0.067, 0.057, 0.024, 0.024, 0.019, 0.015, 0.014, 0.014, 0.014, 0.024, 0.058, 0.126, 0.122, 0.068, 0.061, 0.051, 0.043, 0.024, 0.024', '0.921, 0.928, 0.921, 0.915, 0.921, 1.160, 1.158, 1.158, 1.160, 0.921, 0.915, 0.921')
874
1761
  end
875
1762
 
876
1763
  def test_plug_loads
@@ -878,59 +1765,59 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
878
1765
  hpxml = _create_hpxml('base-misc-loads-large-uncommon.xml')
879
1766
  tv_pl = hpxml.plug_loads.select { |pl| pl.plug_load_type == HPXML::PlugLoadTypeTelevision }[0]
880
1767
  tv_pl.kWh_per_year = 1000
1768
+ tv_pl.usage_multiplier = 1.1
881
1769
  tv_pl.frac_sensible = 0.6
882
1770
  tv_pl.frac_latent = 0.3
883
- tv_pl.location = HPXML::LocationExterior
884
1771
  tv_pl.weekday_fractions = ConstantDaySchedule
885
1772
  tv_pl.weekend_fractions = ConstantDaySchedule
886
1773
  tv_pl.monthly_multipliers = ConstantMonthSchedule
887
1774
  other_pl = hpxml.plug_loads.select { |pl| pl.plug_load_type == HPXML::PlugLoadTypeOther }[0]
888
1775
  other_pl.kWh_per_year = 2000
1776
+ other_pl.usage_multiplier = 1.2
889
1777
  other_pl.frac_sensible = 0.5
890
1778
  other_pl.frac_latent = 0.4
891
- other_pl.location = HPXML::LocationExterior
892
1779
  other_pl.weekday_fractions = ConstantDaySchedule
893
1780
  other_pl.weekend_fractions = ConstantDaySchedule
894
1781
  other_pl.monthly_multipliers = ConstantMonthSchedule
895
1782
  veh_pl = hpxml.plug_loads.select { |pl| pl.plug_load_type == HPXML::PlugLoadTypeElectricVehicleCharging }[0]
896
1783
  veh_pl.kWh_per_year = 4000
1784
+ veh_pl.usage_multiplier = 1.3
897
1785
  veh_pl.frac_sensible = 0.4
898
1786
  veh_pl.frac_latent = 0.5
899
- veh_pl.location = HPXML::LocationInterior
900
1787
  veh_pl.weekday_fractions = ConstantDaySchedule
901
1788
  veh_pl.weekend_fractions = ConstantDaySchedule
902
1789
  veh_pl.monthly_multipliers = ConstantMonthSchedule
903
1790
  wellpump_pl = hpxml.plug_loads.select { |pl| pl.plug_load_type == HPXML::PlugLoadTypeWellPump }[0]
904
1791
  wellpump_pl.kWh_per_year = 3000
1792
+ wellpump_pl.usage_multiplier = 1.4
905
1793
  wellpump_pl.frac_sensible = 0.3
906
1794
  wellpump_pl.frac_latent = 0.6
907
- wellpump_pl.location = HPXML::LocationInterior
908
1795
  wellpump_pl.weekday_fractions = ConstantDaySchedule
909
1796
  wellpump_pl.weekend_fractions = ConstantDaySchedule
910
1797
  wellpump_pl.monthly_multipliers = ConstantMonthSchedule
911
1798
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
912
1799
  hpxml_default = _test_measure()
913
- _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeTelevision, 1000, 0.6, 0.3, HPXML::LocationExterior, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
914
- _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeOther, 2000, 0.5, 0.4, HPXML::LocationExterior, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
915
- _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeElectricVehicleCharging, 4000, 0.4, 0.5, HPXML::LocationInterior, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
916
- _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeWellPump, 3000, 0.3, 0.6, HPXML::LocationInterior, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1800
+ _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeTelevision, 1000, 0.6, 0.3, 1.1, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1801
+ _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeOther, 2000, 0.5, 0.4, 1.2, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1802
+ _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeElectricVehicleCharging, 4000, 0.4, 0.5, 1.3, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1803
+ _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeWellPump, 3000, 0.3, 0.6, 1.4, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
917
1804
 
918
1805
  # Test defaults
919
1806
  hpxml.plug_loads.each do |plug_load|
920
1807
  plug_load.kWh_per_year = nil
1808
+ plug_load.usage_multiplier = nil
921
1809
  plug_load.frac_sensible = nil
922
1810
  plug_load.frac_latent = nil
923
- plug_load.location = nil
924
1811
  plug_load.weekday_fractions = nil
925
1812
  plug_load.weekend_fractions = nil
926
1813
  plug_load.monthly_multipliers = nil
927
1814
  end
928
1815
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
929
1816
  hpxml_default = _test_measure()
930
- _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeTelevision, 620, 1.0, 0.0, HPXML::LocationInterior, '0.037, 0.018, 0.009, 0.007, 0.011, 0.018, 0.029, 0.040, 0.049, 0.058, 0.065, 0.072, 0.076, 0.086, 0.091, 0.102, 0.127, 0.156, 0.210, 0.294, 0.363, 0.344, 0.208, 0.090', '0.044, 0.022, 0.012, 0.008, 0.011, 0.014, 0.024, 0.043, 0.071, 0.094, 0.112, 0.123, 0.132, 0.156, 0.178, 0.196, 0.206, 0.213, 0.251, 0.330, 0.388, 0.358, 0.226, 0.103', '1.137, 1.129, 0.961, 0.969, 0.961, 0.993, 0.996, 0.96, 0.993, 0.867, 0.86, 1.137')
931
- _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeOther, 2457, 0.855, 0.045, HPXML::LocationInterior, '0.035, 0.033, 0.032, 0.031, 0.032, 0.033, 0.037, 0.042, 0.043, 0.043, 0.043, 0.044, 0.045, 0.045, 0.044, 0.046, 0.048, 0.052, 0.053, 0.05, 0.047, 0.045, 0.04, 0.036', '0.035, 0.033, 0.032, 0.031, 0.032, 0.033, 0.037, 0.042, 0.043, 0.043, 0.043, 0.044, 0.045, 0.045, 0.044, 0.046, 0.048, 0.052, 0.053, 0.05, 0.047, 0.045, 0.04, 0.036', '1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248')
932
- _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeElectricVehicleCharging, 1667, 0.0, 0.0, HPXML::LocationExterior, '0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042', '0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042', '1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1')
933
- _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeWellPump, 441, 0.0, 0.0, HPXML::LocationExterior, '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
1817
+ _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeTelevision, 620, 1.0, 0.0, 1.0, '0.037, 0.018, 0.009, 0.007, 0.011, 0.018, 0.029, 0.040, 0.049, 0.058, 0.065, 0.072, 0.076, 0.086, 0.091, 0.102, 0.127, 0.156, 0.210, 0.294, 0.363, 0.344, 0.208, 0.090', '0.044, 0.022, 0.012, 0.008, 0.011, 0.014, 0.024, 0.043, 0.071, 0.094, 0.112, 0.123, 0.132, 0.156, 0.178, 0.196, 0.206, 0.213, 0.251, 0.330, 0.388, 0.358, 0.226, 0.103', '1.137, 1.129, 0.961, 0.969, 0.961, 0.993, 0.996, 0.96, 0.993, 0.867, 0.86, 1.137')
1818
+ _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeOther, 2457, 0.855, 0.045, 1.0, '0.035, 0.033, 0.032, 0.031, 0.032, 0.033, 0.037, 0.042, 0.043, 0.043, 0.043, 0.044, 0.045, 0.045, 0.044, 0.046, 0.048, 0.052, 0.053, 0.05, 0.047, 0.045, 0.04, 0.036', '0.035, 0.033, 0.032, 0.031, 0.032, 0.033, 0.037, 0.042, 0.043, 0.043, 0.043, 0.044, 0.045, 0.045, 0.044, 0.046, 0.048, 0.052, 0.053, 0.05, 0.047, 0.045, 0.04, 0.036', '1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248')
1819
+ _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeElectricVehicleCharging, 1667, 0.0, 0.0, 1.0, '0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042', '0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042', '1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1')
1820
+ _test_default_plug_load_values(hpxml_default, HPXML::PlugLoadTypeWellPump, 441, 0.0, 0.0, 1.0, '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
934
1821
  end
935
1822
 
936
1823
  def test_fuel_loads
@@ -938,531 +1825,444 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
938
1825
  hpxml = _create_hpxml('base-misc-loads-large-uncommon.xml')
939
1826
  gg_fl = hpxml.fuel_loads.select { |fl| fl.fuel_load_type == HPXML::FuelLoadTypeGrill }[0]
940
1827
  gg_fl.therm_per_year = 1000
1828
+ gg_fl.usage_multiplier = 0.9
941
1829
  gg_fl.frac_sensible = 0.6
942
1830
  gg_fl.frac_latent = 0.3
943
- gg_fl.location = HPXML::LocationInterior
944
1831
  gg_fl.weekday_fractions = ConstantDaySchedule
945
1832
  gg_fl.weekend_fractions = ConstantDaySchedule
946
1833
  gg_fl.monthly_multipliers = ConstantMonthSchedule
947
1834
  gl_fl = hpxml.fuel_loads.select { |fl| fl.fuel_load_type == HPXML::FuelLoadTypeLighting }[0]
948
1835
  gl_fl.therm_per_year = 2000
1836
+ gl_fl.usage_multiplier = 0.8
949
1837
  gl_fl.frac_sensible = 0.5
950
1838
  gl_fl.frac_latent = 0.4
951
- gl_fl.location = HPXML::LocationInterior
952
1839
  gl_fl.weekday_fractions = ConstantDaySchedule
953
1840
  gl_fl.weekend_fractions = ConstantDaySchedule
954
1841
  gl_fl.monthly_multipliers = ConstantMonthSchedule
955
1842
  gf_fl = hpxml.fuel_loads.select { |fl| fl.fuel_load_type == HPXML::FuelLoadTypeFireplace }[0]
956
1843
  gf_fl.therm_per_year = 3000
1844
+ gf_fl.usage_multiplier = 0.7
957
1845
  gf_fl.frac_sensible = 0.4
958
1846
  gf_fl.frac_latent = 0.5
959
- gf_fl.location = HPXML::LocationExterior
960
1847
  gf_fl.weekday_fractions = ConstantDaySchedule
961
1848
  gf_fl.weekend_fractions = ConstantDaySchedule
962
1849
  gf_fl.monthly_multipliers = ConstantMonthSchedule
963
1850
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
964
1851
  hpxml_default = _test_measure()
965
- _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeGrill, 1000, 0.6, 0.3, HPXML::LocationInterior, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
966
- _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeLighting, 2000, 0.5, 0.4, HPXML::LocationInterior, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
967
- _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeFireplace, 3000, 0.4, 0.5, HPXML::LocationExterior, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1852
+ _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeGrill, 1000, 0.6, 0.3, 0.9, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1853
+ _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeLighting, 2000, 0.5, 0.4, 0.8, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1854
+ _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeFireplace, 3000, 0.4, 0.5, 0.7, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
968
1855
 
969
1856
  # Test defaults
970
1857
  hpxml.fuel_loads.each do |fuel_load|
971
1858
  fuel_load.therm_per_year = nil
1859
+ fuel_load.usage_multiplier = nil
972
1860
  fuel_load.frac_sensible = nil
973
1861
  fuel_load.frac_latent = nil
974
- fuel_load.location = nil
975
1862
  fuel_load.weekday_fractions = nil
976
1863
  fuel_load.weekend_fractions = nil
977
1864
  fuel_load.monthly_multipliers = nil
978
1865
  end
979
1866
  XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
980
1867
  hpxml_default = _test_measure()
981
- _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeGrill, 33, 0.0, 0.0, HPXML::LocationExterior, '0.004, 0.001, 0.001, 0.002, 0.007, 0.012, 0.029, 0.046, 0.044, 0.041, 0.044, 0.046, 0.042, 0.038, 0.049, 0.059, 0.110, 0.161, 0.115, 0.070, 0.044, 0.019, 0.013, 0.007', '0.004, 0.001, 0.001, 0.002, 0.007, 0.012, 0.029, 0.046, 0.044, 0.041, 0.044, 0.046, 0.042, 0.038, 0.049, 0.059, 0.110, 0.161, 0.115, 0.070, 0.044, 0.019, 0.013, 0.007', '1.097, 1.097, 0.991, 0.987, 0.991, 0.890, 0.896, 0.896, 0.890, 1.085, 1.085, 1.097')
982
- _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeLighting, 20, 0.0, 0.0, HPXML::LocationExterior, '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
983
- _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeFireplace, 67, 0.5, 0.1, HPXML::LocationInterior, '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
1868
+ _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeGrill, 33, 0.0, 0.0, 1.0, '0.004, 0.001, 0.001, 0.002, 0.007, 0.012, 0.029, 0.046, 0.044, 0.041, 0.044, 0.046, 0.042, 0.038, 0.049, 0.059, 0.110, 0.161, 0.115, 0.070, 0.044, 0.019, 0.013, 0.007', '0.004, 0.001, 0.001, 0.002, 0.007, 0.012, 0.029, 0.046, 0.044, 0.041, 0.044, 0.046, 0.042, 0.038, 0.049, 0.059, 0.110, 0.161, 0.115, 0.070, 0.044, 0.019, 0.013, 0.007', '1.097, 1.097, 0.991, 0.987, 0.991, 0.890, 0.896, 0.896, 0.890, 1.085, 1.085, 1.097')
1869
+ _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeLighting, 20, 0.0, 0.0, 1.0, '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
1870
+ _test_default_fuel_load_values(hpxml_default, HPXML::FuelLoadTypeFireplace, 67, 0.5, 0.1, 1.0, '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '0.044, 0.023, 0.019, 0.015, 0.016, 0.018, 0.026, 0.033, 0.033, 0.032, 0.033, 0.033, 0.032, 0.032, 0.032, 0.033, 0.045, 0.057, 0.066, 0.076, 0.081, 0.086, 0.075, 0.065', '1.154, 1.161, 1.013, 1.010, 1.013, 0.888, 0.883, 0.883, 0.888, 0.978, 0.974, 1.154')
984
1871
  end
985
1872
 
986
- def test_clothes_washers
987
- # Test inputs not overridden by defaults
988
- hpxml = _create_hpxml('base.xml')
989
- hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
990
- hpxml.water_heating_systems[0].is_shared_system = true
991
- hpxml.water_heating_systems[0].number_of_units_served = 6
992
- hpxml.water_heating_systems[0].fraction_dhw_load_served = 0
993
- hpxml.clothes_washers[0].location = HPXML::LocationBasementConditioned
994
- hpxml.clothes_washers[0].is_shared_appliance = true
995
- hpxml.clothes_washers[0].usage_multiplier = 1.5
996
- hpxml.clothes_washers[0].water_heating_system_idref = hpxml.water_heating_systems[0].id
997
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
998
- hpxml_default = _test_measure()
999
- _test_default_clothes_washer_values(hpxml_default, true, HPXML::LocationBasementConditioned, 1.21, 380.0, 0.12, 1.09, 27.0, 3.2, 6.0, 1.5)
1873
+ def _test_measure()
1874
+ # create an instance of the measure
1875
+ measure = HPXMLtoOpenStudio.new
1000
1876
 
1001
- # Test defaults
1002
- hpxml.clothes_washers[0].is_shared_appliance = nil
1003
- hpxml.clothes_washers[0].location = nil
1004
- hpxml.clothes_washers[0].integrated_modified_energy_factor = nil
1005
- hpxml.clothes_washers[0].rated_annual_kwh = nil
1006
- hpxml.clothes_washers[0].label_electric_rate = nil
1007
- hpxml.clothes_washers[0].label_gas_rate = nil
1008
- hpxml.clothes_washers[0].label_annual_gas_cost = nil
1009
- hpxml.clothes_washers[0].capacity = nil
1010
- hpxml.clothes_washers[0].label_usage = nil
1011
- hpxml.clothes_washers[0].usage_multiplier = nil
1012
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1013
- hpxml_default = _test_measure()
1014
- _test_default_clothes_washer_values(hpxml_default, false, HPXML::LocationLivingSpace, 1.0, 400.0, 0.12, 1.09, 27.0, 3.0, 6.0, 1.0)
1877
+ runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
1878
+ model = OpenStudio::Model::Model.new
1015
1879
 
1016
- # Test defaults before 301-2019 Addendum A
1017
- hpxml = _create_hpxml('base.xml')
1018
- hpxml.header.eri_calculation_version = '2019'
1019
- hpxml.clothes_washers[0].is_shared_appliance = nil
1020
- hpxml.clothes_washers[0].location = nil
1021
- hpxml.clothes_washers[0].integrated_modified_energy_factor = nil
1022
- hpxml.clothes_washers[0].rated_annual_kwh = nil
1023
- hpxml.clothes_washers[0].label_electric_rate = nil
1024
- hpxml.clothes_washers[0].label_gas_rate = nil
1025
- hpxml.clothes_washers[0].label_annual_gas_cost = nil
1026
- hpxml.clothes_washers[0].capacity = nil
1027
- hpxml.clothes_washers[0].label_usage = nil
1028
- hpxml.clothes_washers[0].usage_multiplier = nil
1029
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1030
- hpxml_default = _test_measure()
1031
- _test_default_clothes_washer_values(hpxml_default, false, HPXML::LocationLivingSpace, 0.331, 704.0, 0.08, 0.58, 23.0, 2.874, 6.0, 1.0)
1032
- end
1880
+ # get arguments
1881
+ arguments = measure.arguments(model)
1882
+ argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
1033
1883
 
1034
- def test_clothes_dryers
1035
- # Test inputs not overridden by defaults
1036
- hpxml = _create_hpxml('base.xml')
1037
- hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
1038
- hpxml.water_heating_systems[0].is_shared_system = true
1039
- hpxml.water_heating_systems[0].number_of_units_served = 6
1040
- hpxml.water_heating_systems[0].fraction_dhw_load_served = 0
1041
- hpxml.clothes_dryers[0].location = HPXML::LocationBasementConditioned
1042
- hpxml.clothes_dryers[0].is_shared_appliance = true
1043
- hpxml.clothes_dryers[0].control_type = HPXML::ClothesDryerControlTypeMoisture
1044
- hpxml.clothes_dryers[0].combined_energy_factor = 3.33
1045
- hpxml.clothes_dryers[0].usage_multiplier = 1.1
1046
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1047
- hpxml_default = _test_measure()
1048
- _test_default_clothes_dryer_values(hpxml_default, true, HPXML::LocationBasementConditioned, HPXML::ClothesDryerControlTypeMoisture, 3.33, 1.1)
1884
+ # populate argument with specified hash value if specified
1885
+ arguments.each do |arg|
1886
+ temp_arg_var = arg.clone
1887
+ if @args_hash.has_key?(arg.name)
1888
+ assert(temp_arg_var.setValue(@args_hash[arg.name]))
1889
+ end
1890
+ argument_map[arg.name] = temp_arg_var
1891
+ end
1049
1892
 
1050
- # Test defaults w/ electric clothes dryer
1051
- hpxml.clothes_dryers[0].location = nil
1052
- hpxml.clothes_dryers[0].is_shared_appliance = false
1053
- hpxml.clothes_dryers[0].control_type = nil
1054
- hpxml.clothes_dryers[0].combined_energy_factor = nil
1055
- hpxml.clothes_dryers[0].usage_multiplier = nil
1056
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1057
- hpxml_default = _test_measure()
1058
- _test_default_clothes_dryer_values(hpxml_default, false, HPXML::LocationLivingSpace, HPXML::ClothesDryerControlTypeTimer, 3.01, 1.0)
1893
+ # run the measure
1894
+ measure.run(model, runner, argument_map)
1895
+ result = runner.result
1059
1896
 
1060
- # Test defaults w/ gas clothes dryer
1061
- hpxml.clothes_dryers[0].fuel_type = HPXML::FuelTypeNaturalGas
1062
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1063
- hpxml_default = _test_measure()
1064
- _test_default_clothes_dryer_values(hpxml_default, false, HPXML::LocationLivingSpace, HPXML::ClothesDryerControlTypeTimer, 3.01, 1.0)
1897
+ # show the output
1898
+ show_output(result) unless result.value.valueName == 'Success'
1065
1899
 
1066
- # Test defaults w/ electric clothes dryer before 301-2019 Addendum A
1067
- hpxml.header.eri_calculation_version = '2019'
1068
- hpxml.clothes_dryers[0].fuel_type = HPXML::FuelTypeElectricity
1069
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1070
- hpxml_default = _test_measure()
1071
- _test_default_clothes_dryer_values(hpxml_default, false, HPXML::LocationLivingSpace, HPXML::ClothesDryerControlTypeTimer, 2.62, 1.0)
1900
+ # assert that it ran correctly
1901
+ assert_equal('Success', result.value.valueName)
1072
1902
 
1073
- # Test defaults w/ gas clothes dryer before 301-2019 Addendum A
1074
- hpxml.clothes_dryers[0].fuel_type = HPXML::FuelTypeNaturalGas
1075
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1076
- hpxml_default = _test_measure()
1077
- _test_default_clothes_dryer_values(hpxml_default, false, HPXML::LocationLivingSpace, HPXML::ClothesDryerControlTypeTimer, 2.32, 1.0)
1903
+ hpxml_default = HPXML.new(hpxml_path: File.join(@tmp_output_path, 'in.xml'))
1904
+
1905
+ return hpxml_default
1078
1906
  end
1079
1907
 
1080
- def test_dishwashers
1081
- # Test inputs not overridden by defaults
1082
- hpxml = _create_hpxml('base.xml')
1083
- hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
1084
- hpxml.water_heating_systems[0].is_shared_system = true
1085
- hpxml.water_heating_systems[0].number_of_units_served = 6
1086
- hpxml.water_heating_systems[0].fraction_dhw_load_served = 0
1087
- hpxml.dishwashers[0].location = HPXML::LocationBasementConditioned
1088
- hpxml.dishwashers[0].is_shared_appliance = true
1089
- hpxml.dishwashers[0].usage_multiplier = 1.3
1090
- hpxml.dishwashers[0].water_heating_system_idref = hpxml.water_heating_systems[0].id
1091
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1092
- hpxml_default = _test_measure()
1093
- _test_default_dishwasher_values(hpxml_default, true, HPXML::LocationBasementConditioned, 307.0, 0.12, 1.09, 22.32, 4.0, 12, 1.3)
1908
+ def _test_default_header_values(hpxml, tstep, sim_begin_month, sim_begin_day, sim_end_month, sim_end_day, sim_calendar_year,
1909
+ dst_enabled, dst_begin_month, dst_begin_day, dst_end_month, dst_end_day,
1910
+ use_max_load_for_heat_pumps, allow_increased_fixed_capacities)
1911
+ assert_equal(tstep, hpxml.header.timestep)
1912
+ assert_equal(sim_begin_month, hpxml.header.sim_begin_month)
1913
+ assert_equal(sim_begin_day, hpxml.header.sim_begin_day)
1914
+ assert_equal(sim_end_month, hpxml.header.sim_end_month)
1915
+ assert_equal(sim_end_day, hpxml.header.sim_end_day)
1916
+ assert_equal(sim_calendar_year, hpxml.header.sim_calendar_year)
1917
+ assert_equal(dst_enabled, hpxml.header.dst_enabled)
1918
+ assert_equal(dst_begin_month, hpxml.header.dst_begin_month)
1919
+ assert_equal(dst_begin_day, hpxml.header.dst_begin_day)
1920
+ assert_equal(dst_end_month, hpxml.header.dst_end_month)
1921
+ assert_equal(dst_end_day, hpxml.header.dst_end_day)
1922
+ assert_equal(use_max_load_for_heat_pumps, hpxml.header.use_max_load_for_heat_pumps)
1923
+ assert_equal(allow_increased_fixed_capacities, hpxml.header.allow_increased_fixed_capacities)
1924
+ end
1094
1925
 
1095
- # Test defaults
1096
- hpxml.dishwashers[0].is_shared_appliance = nil
1097
- hpxml.dishwashers[0].location = nil
1098
- hpxml.dishwashers[0].rated_annual_kwh = nil
1099
- hpxml.dishwashers[0].label_electric_rate = nil
1100
- hpxml.dishwashers[0].label_gas_rate = nil
1101
- hpxml.dishwashers[0].label_annual_gas_cost = nil
1102
- hpxml.dishwashers[0].label_usage = nil
1103
- hpxml.dishwashers[0].place_setting_capacity = nil
1104
- hpxml.dishwashers[0].usage_multiplier = nil
1105
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1106
- hpxml_default = _test_measure()
1107
- _test_default_dishwasher_values(hpxml_default, false, HPXML::LocationLivingSpace, 467.0, 0.12, 1.09, 33.12, 4.0, 12, 1.0)
1926
+ def _test_default_site_values(hpxml, site_type, shielding_of_home)
1927
+ assert_equal(site_type, hpxml.site.site_type)
1928
+ assert_equal(shielding_of_home, hpxml.site.shielding_of_home)
1929
+ end
1108
1930
 
1109
- # Test defaults before 301-2019 Addendum A
1110
- hpxml.header.eri_calculation_version = '2019'
1111
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1112
- hpxml_default = _test_measure()
1113
- _test_default_dishwasher_values(hpxml_default, false, HPXML::LocationLivingSpace, 467.0, 0.12, 1.09, 33.12, 4.0, 12, 1.0)
1931
+ def _test_default_occupancy_values(hpxml, num_occupants)
1932
+ assert_equal(num_occupants, hpxml.building_occupancy.number_of_residents)
1114
1933
  end
1115
1934
 
1116
- def test_refrigerators
1117
- # Test inputs not overridden by defaults
1118
- hpxml = _create_hpxml('base.xml')
1119
- hpxml.refrigerators[0].location = HPXML::LocationBasementConditioned
1120
- hpxml.refrigerators[0].usage_multiplier = 1.2
1121
- hpxml.refrigerators[0].weekday_fractions = ConstantDaySchedule
1122
- hpxml.refrigerators[0].weekend_fractions = ConstantDaySchedule
1123
- hpxml.refrigerators[0].monthly_multipliers = ConstantMonthSchedule
1124
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1125
- hpxml_default = _test_measure()
1126
- _test_default_refrigerator_values(hpxml_default, HPXML::LocationBasementConditioned, 650.0, 1.2, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1935
+ def _test_default_building_construction_values(hpxml, building_volume, average_ceiling_height, has_flue_or_chimney, n_bathrooms)
1936
+ assert_equal(building_volume, hpxml.building_construction.conditioned_building_volume)
1937
+ assert_in_epsilon(average_ceiling_height, hpxml.building_construction.average_ceiling_height, 0.01)
1938
+ assert_equal(has_flue_or_chimney, hpxml.building_construction.has_flue_or_chimney)
1939
+ assert_equal(n_bathrooms, hpxml.building_construction.number_of_bathrooms)
1940
+ end
1127
1941
 
1128
- # Test defaults
1129
- hpxml.refrigerators[0].location = nil
1130
- hpxml.refrigerators[0].rated_annual_kwh = nil
1131
- hpxml.refrigerators[0].usage_multiplier = nil
1132
- hpxml.refrigerators[0].weekday_fractions = nil
1133
- hpxml.refrigerators[0].weekend_fractions = nil
1134
- hpxml.refrigerators[0].monthly_multipliers = nil
1135
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1136
- hpxml_default = _test_measure()
1137
- _test_default_refrigerator_values(hpxml_default, HPXML::LocationLivingSpace, 691.0, 1.0, '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1942
+ def _test_default_infiltration_values(hpxml, volume)
1943
+ air_infiltration_measurement = hpxml.air_infiltration_measurements[0]
1138
1944
 
1139
- # Test defaults w/ refrigerator in 5-bedroom house
1140
- hpxml.building_construction.number_of_bedrooms = 5
1141
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1142
- hpxml_default = _test_measure()
1143
- _test_default_refrigerator_values(hpxml_default, HPXML::LocationLivingSpace, 727.0, 1.0, '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1945
+ assert_equal(volume, air_infiltration_measurement.infiltration_volume)
1946
+ end
1144
1947
 
1145
- # Test defaults before 301-2019 Addendum A
1146
- hpxml.header.eri_calculation_version = '2019'
1147
- hpxml.building_construction.number_of_bedrooms = 3
1148
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1149
- hpxml_default = _test_measure()
1150
- _test_default_refrigerator_values(hpxml_default, HPXML::LocationLivingSpace, 691.0, 1.0, '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1948
+ def _test_default_attic_values(hpxml, sla)
1949
+ attic = hpxml.attics[0]
1950
+
1951
+ assert_in_epsilon(sla, attic.vented_attic_sla, 0.001)
1151
1952
  end
1152
1953
 
1153
- def test_cooking_ranges
1154
- # Test inputs not overridden by defaults
1155
- hpxml = _create_hpxml('base.xml')
1156
- hpxml.cooking_ranges[0].location = HPXML::LocationBasementConditioned
1157
- hpxml.cooking_ranges[0].is_induction = true
1158
- hpxml.cooking_ranges[0].usage_multiplier = 1.1
1159
- hpxml.cooking_ranges[0].weekday_fractions = ConstantDaySchedule
1160
- hpxml.cooking_ranges[0].weekend_fractions = ConstantDaySchedule
1161
- hpxml.cooking_ranges[0].monthly_multipliers = ConstantMonthSchedule
1162
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1163
- hpxml_default = _test_measure()
1164
- _test_default_cooking_range_values(hpxml_default, HPXML::LocationBasementConditioned, true, 1.1, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1954
+ def _test_default_foundation_values(hpxml, sla)
1955
+ foundation = hpxml.foundations[0]
1165
1956
 
1166
- # Test defaults
1167
- hpxml.cooking_ranges[0].location = nil
1168
- hpxml.cooking_ranges[0].is_induction = nil
1169
- hpxml.cooking_ranges[0].usage_multiplier = nil
1170
- hpxml.cooking_ranges[0].weekday_fractions = nil
1171
- hpxml.cooking_ranges[0].weekend_fractions = nil
1172
- hpxml.cooking_ranges[0].monthly_multipliers = nil
1173
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1174
- hpxml_default = _test_measure()
1175
- _test_default_cooking_range_values(hpxml_default, HPXML::LocationLivingSpace, false, 1.0, '0.007, 0.007, 0.004, 0.004, 0.007, 0.011, 0.025, 0.042, 0.046, 0.048, 0.042, 0.050, 0.057, 0.046, 0.057, 0.044, 0.092, 0.150, 0.117, 0.060, 0.035, 0.025, 0.016, 0.011', '0.007, 0.007, 0.004, 0.004, 0.007, 0.011, 0.025, 0.042, 0.046, 0.048, 0.042, 0.050, 0.057, 0.046, 0.057, 0.044, 0.092, 0.150, 0.117, 0.060, 0.035, 0.025, 0.016, 0.011', '1.097, 1.097, 0.991, 0.987, 0.991, 0.890, 0.896, 0.896, 0.890, 1.085, 1.085, 1.097')
1957
+ assert_in_epsilon(sla, foundation.vented_crawlspace_sla, 0.001)
1958
+ end
1176
1959
 
1177
- # Test defaults before 301-2019 Addendum A
1178
- hpxml.header.eri_calculation_version = '2019'
1179
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1180
- hpxml_default = _test_measure()
1181
- _test_default_cooking_range_values(hpxml_default, HPXML::LocationLivingSpace, false, 1.0, '0.007, 0.007, 0.004, 0.004, 0.007, 0.011, 0.025, 0.042, 0.046, 0.048, 0.042, 0.050, 0.057, 0.046, 0.057, 0.044, 0.092, 0.150, 0.117, 0.060, 0.035, 0.025, 0.016, 0.011', '0.007, 0.007, 0.004, 0.004, 0.007, 0.011, 0.025, 0.042, 0.046, 0.048, 0.042, 0.050, 0.057, 0.046, 0.057, 0.044, 0.092, 0.150, 0.117, 0.060, 0.035, 0.025, 0.016, 0.011', '1.097, 1.097, 0.991, 0.987, 0.991, 0.890, 0.896, 0.896, 0.890, 1.085, 1.085, 1.097')
1960
+ def _test_default_roof_values(hpxml, roof_type, solar_absorptance, roof_color, emittance, radiant_barrier)
1961
+ roof = hpxml.roofs[0]
1962
+
1963
+ assert_equal(roof_type, roof.roof_type)
1964
+ assert_equal(solar_absorptance, roof.solar_absorptance)
1965
+ assert_equal(roof_color, roof.roof_color)
1966
+ assert_equal(emittance, roof.emittance)
1967
+ assert_equal(radiant_barrier, roof.radiant_barrier)
1182
1968
  end
1183
1969
 
1184
- def test_ovens
1185
- # Test inputs not overridden by defaults
1186
- hpxml = _create_hpxml('base.xml')
1187
- hpxml.ovens[0].is_convection = true
1188
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1189
- hpxml_default = _test_measure()
1190
- _test_default_oven_values(hpxml_default, true)
1970
+ def _test_default_rim_joist_values(hpxml, siding, solar_absorptance, color, emittance)
1971
+ rim_joist = hpxml.rim_joists[0]
1191
1972
 
1192
- # Test defaults
1193
- hpxml.ovens[0].is_convection = nil
1194
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1195
- hpxml_default = _test_measure()
1196
- _test_default_oven_values(hpxml_default, false)
1973
+ assert_equal(siding, rim_joist.siding)
1974
+ assert_equal(solar_absorptance, rim_joist.solar_absorptance)
1975
+ assert_equal(color, rim_joist.color)
1976
+ assert_equal(emittance, rim_joist.emittance)
1977
+ end
1197
1978
 
1198
- # Test defaults before 301-2019 Addendum A
1199
- hpxml.header.eri_calculation_version = '2019'
1200
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1201
- hpxml_default = _test_measure()
1202
- _test_default_oven_values(hpxml_default, false)
1979
+ def _test_default_wall_values(hpxml, siding, solar_absorptance, color, emittance)
1980
+ wall = hpxml.walls[0]
1981
+
1982
+ assert_equal(siding, wall.siding)
1983
+ assert_equal(solar_absorptance, wall.solar_absorptance)
1984
+ assert_equal(color, wall.color)
1985
+ assert_equal(emittance, wall.emittance)
1203
1986
  end
1204
1987
 
1205
- def test_extra_refrigerators
1206
- # Test inputs not overridden by defaults
1207
- hpxml = _create_hpxml('base-misc-loads-large-uncommon.xml')
1208
- hpxml.refrigerators.each do |refrigerator|
1209
- refrigerator.location = HPXML::LocationBasementConditioned
1210
- refrigerator.rated_annual_kwh = 333.0
1211
- refrigerator.usage_multiplier = 1.5
1212
- refrigerator.weekday_fractions = ConstantDaySchedule
1213
- refrigerator.weekend_fractions = ConstantDaySchedule
1214
- refrigerator.monthly_multipliers = ConstantMonthSchedule
1215
- end
1216
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1217
- hpxml_default = _test_measure()
1218
- _test_default_extra_refrigerators_values(hpxml_default, HPXML::LocationBasementConditioned, 333.0, 1.5, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1988
+ def _test_default_foundation_wall_values(hpxml, thickness)
1989
+ foundation_wall = hpxml.foundation_walls[0]
1219
1990
 
1220
- # Test defaults
1221
- hpxml.refrigerators.each do |refrigerator|
1222
- refrigerator.location = nil
1223
- refrigerator.rated_annual_kwh = nil
1224
- refrigerator.usage_multiplier = nil
1225
- refrigerator.weekday_fractions = nil
1226
- refrigerator.weekend_fractions = nil
1227
- refrigerator.monthly_multipliers = nil
1228
- end
1229
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1230
- hpxml_default = _test_measure()
1231
- _test_default_extra_refrigerators_values(hpxml_default, HPXML::LocationGarage, 244.0, 1.0, '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1991
+ assert_equal(thickness, foundation_wall.thickness)
1232
1992
  end
1233
1993
 
1234
- def test_freezers
1235
- # Test inputs not overridden by defaults
1236
- hpxml = _create_hpxml('base-misc-loads-large-uncommon.xml')
1237
- hpxml.freezers.each do |freezer|
1238
- freezer.location = HPXML::LocationBasementConditioned
1239
- freezer.rated_annual_kwh = 333.0
1240
- freezer.usage_multiplier = 1.5
1241
- freezer.weekday_fractions = ConstantDaySchedule
1242
- freezer.weekend_fractions = ConstantDaySchedule
1243
- freezer.monthly_multipliers = ConstantMonthSchedule
1244
- end
1245
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1246
- hpxml_default = _test_measure()
1247
- _test_default_freezers_values(hpxml_default, HPXML::LocationBasementConditioned, 333.0, 1.5, ConstantDaySchedule, ConstantDaySchedule, ConstantMonthSchedule)
1994
+ def _test_default_slab_values(hpxml, thickness, carpet_r_value, carpet_fraction)
1995
+ slab = hpxml.slabs[0]
1248
1996
 
1249
- # Test defaults
1250
- hpxml.freezers.each do |freezer|
1251
- freezer.location = nil
1252
- freezer.rated_annual_kwh = nil
1253
- freezer.usage_multiplier = nil
1254
- freezer.weekday_fractions = nil
1255
- freezer.weekend_fractions = nil
1256
- freezer.monthly_multipliers = nil
1997
+ assert_equal(thickness, slab.thickness)
1998
+ assert_equal(carpet_r_value, slab.carpet_r_value)
1999
+ assert_equal(carpet_fraction, slab.carpet_fraction)
2000
+ end
2001
+
2002
+ def _test_default_window_values(hpxml, ext_summer_sfs, ext_winter_sfs, int_summer_sfs, int_winter_sfs, fraction_operable)
2003
+ assert_equal(ext_summer_sfs.size, hpxml.windows.size)
2004
+ hpxml.windows.each_with_index do |window, idx|
2005
+ assert_equal(ext_summer_sfs[idx], window.exterior_shading_factor_summer)
2006
+ assert_equal(ext_winter_sfs[idx], window.exterior_shading_factor_winter)
2007
+ assert_equal(int_summer_sfs[idx], window.interior_shading_factor_summer)
2008
+ assert_equal(int_winter_sfs[idx], window.interior_shading_factor_winter)
2009
+ assert_equal(fraction_operable[idx], window.fraction_operable)
1257
2010
  end
1258
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1259
- hpxml_default = _test_measure()
1260
- _test_default_freezers_values(hpxml_default, HPXML::LocationGarage, 320.0, 1.0, '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041', '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837')
1261
2011
  end
1262
2012
 
1263
- def test_lighting
1264
- # Test inputs not overridden by defaults
1265
- hpxml = _create_hpxml('base.xml')
1266
- hpxml.lighting.interior_usage_multiplier = 2.0
1267
- hpxml.lighting.garage_usage_multiplier = 2.0
1268
- hpxml.lighting.exterior_usage_multiplier = 2.0
1269
- hpxml.lighting.interior_weekday_fractions = ConstantDaySchedule
1270
- hpxml.lighting.interior_weekend_fractions = ConstantDaySchedule
1271
- hpxml.lighting.interior_monthly_multipliers = ConstantMonthSchedule
1272
- hpxml.lighting.exterior_weekday_fractions = ConstantDaySchedule
1273
- hpxml.lighting.exterior_weekend_fractions = ConstantDaySchedule
1274
- hpxml.lighting.exterior_monthly_multipliers = ConstantMonthSchedule
1275
- hpxml.lighting.garage_weekday_fractions = ConstantDaySchedule
1276
- hpxml.lighting.garage_weekend_fractions = ConstantDaySchedule
1277
- hpxml.lighting.garage_monthly_multipliers = ConstantMonthSchedule
1278
- hpxml.lighting.holiday_exists = true
1279
- hpxml.lighting.holiday_kwh_per_day = 0.7
1280
- hpxml.lighting.holiday_period_begin_month = 11
1281
- hpxml.lighting.holiday_period_begin_day_of_month = 19
1282
- hpxml.lighting.holiday_period_end_month = 12
1283
- hpxml.lighting.holiday_period_end_day_of_month = 31
1284
- hpxml.lighting.holiday_weekday_fractions = ConstantDaySchedule
1285
- hpxml.lighting.holiday_weekend_fractions = ConstantDaySchedule
1286
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1287
- hpxml_default = _test_measure()
1288
- _test_default_lighting_values(hpxml_default, 2.0, 2.0, 2.0,
1289
- { int_wk_sch: ConstantDaySchedule,
1290
- int_wknd_sch: ConstantDaySchedule,
1291
- int_month_mult: ConstantMonthSchedule,
1292
- ext_wk_sch: ConstantDaySchedule,
1293
- ext_wknd_sch: ConstantDaySchedule,
1294
- ext_month_mult: ConstantMonthSchedule,
1295
- grg_wk_sch: ConstantDaySchedule,
1296
- grg_wknd_sch: ConstantDaySchedule,
1297
- grg_month_mult: ConstantMonthSchedule,
1298
- hol_kwh_per_day: 0.7,
1299
- hol_begin_month: 11,
1300
- hol_begin_day_of_month: 19,
1301
- hol_end_month: 12,
1302
- hol_end_day_of_month: 31,
1303
- hol_wk_sch: ConstantDaySchedule,
1304
- hol_wknd_sch: ConstantDaySchedule })
2013
+ def _test_default_skylight_values(hpxml, ext_summer_sfs, ext_winter_sfs, int_summer_sfs, int_winter_sfs)
2014
+ assert_equal(ext_summer_sfs.size, hpxml.skylights.size)
2015
+ hpxml.skylights.each_with_index do |skylight, idx|
2016
+ assert_equal(ext_summer_sfs[idx], skylight.exterior_shading_factor_summer)
2017
+ assert_equal(ext_winter_sfs[idx], skylight.exterior_shading_factor_winter)
2018
+ assert_equal(int_summer_sfs[idx], skylight.interior_shading_factor_summer)
2019
+ assert_equal(int_winter_sfs[idx], skylight.interior_shading_factor_winter)
2020
+ end
2021
+ end
1305
2022
 
1306
- # Test defaults
1307
- hpxml.lighting.interior_usage_multiplier = nil
1308
- hpxml.lighting.garage_usage_multiplier = nil
1309
- hpxml.lighting.exterior_usage_multiplier = nil
1310
- hpxml.lighting.interior_weekday_fractions = nil
1311
- hpxml.lighting.interior_weekend_fractions = nil
1312
- hpxml.lighting.interior_monthly_multipliers = nil
1313
- hpxml.lighting.exterior_weekday_fractions = nil
1314
- hpxml.lighting.exterior_weekend_fractions = nil
1315
- hpxml.lighting.exterior_monthly_multipliers = nil
1316
- hpxml.lighting.garage_weekday_fractions = nil
1317
- hpxml.lighting.garage_weekend_fractions = nil
1318
- hpxml.lighting.garage_monthly_multipliers = nil
1319
- hpxml.lighting.holiday_exists = nil
1320
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1321
- hpxml_default = _test_measure()
1322
- _test_default_lighting_values(hpxml_default, 1.0, 1.0, 1.0,
1323
- { ext_wk_sch: '0.046, 0.046, 0.046, 0.046, 0.046, 0.037, 0.035, 0.034, 0.033, 0.028, 0.022, 0.015, 0.012, 0.011, 0.011, 0.012, 0.019, 0.037, 0.049, 0.065, 0.091, 0.105, 0.091, 0.063',
1324
- ext_wknd_sch: '0.046, 0.046, 0.045, 0.045, 0.046, 0.045, 0.044, 0.041, 0.036, 0.03, 0.024, 0.016, 0.012, 0.011, 0.011, 0.012, 0.019, 0.038, 0.048, 0.06, 0.083, 0.098, 0.085, 0.059',
1325
- ext_month_mult: '1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248' })
2023
+ def _test_default_central_air_conditioner_values(hpxml, shr, compressor_type, fan_watts_per_cfm, charge_defect_ratio,
2024
+ airflow_defect_ratio, cooling_capacity)
2025
+ cooling_system = hpxml.cooling_systems[0]
1326
2026
 
1327
- # Test defaults w/ garage
1328
- hpxml = _create_hpxml('base-enclosure-garage.xml')
1329
- hpxml.lighting.interior_usage_multiplier = nil
1330
- hpxml.lighting.garage_usage_multiplier = nil
1331
- hpxml.lighting.exterior_usage_multiplier = nil
1332
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1333
- hpxml_default = _test_measure()
1334
- _test_default_lighting_values(hpxml_default, 1.0, 1.0, 1.0,
1335
- { ext_wk_sch: '0.046, 0.046, 0.046, 0.046, 0.046, 0.037, 0.035, 0.034, 0.033, 0.028, 0.022, 0.015, 0.012, 0.011, 0.011, 0.012, 0.019, 0.037, 0.049, 0.065, 0.091, 0.105, 0.091, 0.063',
1336
- ext_wknd_sch: '0.046, 0.046, 0.045, 0.045, 0.046, 0.045, 0.044, 0.041, 0.036, 0.03, 0.024, 0.016, 0.012, 0.011, 0.011, 0.012, 0.019, 0.038, 0.048, 0.06, 0.083, 0.098, 0.085, 0.059',
1337
- ext_month_mult: '1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248',
1338
- grg_wk_sch: '0.046, 0.046, 0.046, 0.046, 0.046, 0.037, 0.035, 0.034, 0.033, 0.028, 0.022, 0.015, 0.012, 0.011, 0.011, 0.012, 0.019, 0.037, 0.049, 0.065, 0.091, 0.105, 0.091, 0.063',
1339
- grg_wknd_sch: '0.046, 0.046, 0.045, 0.045, 0.046, 0.045, 0.044, 0.041, 0.036, 0.03, 0.024, 0.016, 0.012, 0.011, 0.011, 0.012, 0.019, 0.038, 0.048, 0.06, 0.083, 0.098, 0.085, 0.059',
1340
- grg_month_mult: '1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248' })
2027
+ assert_equal(shr, cooling_system.cooling_shr)
2028
+ assert_equal(compressor_type, cooling_system.compressor_type)
2029
+ assert_equal(fan_watts_per_cfm, cooling_system.fan_watts_per_cfm)
2030
+ assert_equal(charge_defect_ratio, cooling_system.charge_defect_ratio)
2031
+ assert_equal(airflow_defect_ratio, cooling_system.airflow_defect_ratio)
2032
+ if cooling_capacity.nil?
2033
+ assert(cooling_system.cooling_capacity > 0)
2034
+ else
2035
+ assert_equal(cooling_system.cooling_capacity, cooling_capacity)
2036
+ end
1341
2037
  end
1342
2038
 
1343
- def test_pv_systems
1344
- # Test inputs not overridden by defaults
1345
- hpxml = _create_hpxml('base-pv.xml')
1346
- hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeSFA
1347
- hpxml.pv_systems.each do |pv|
1348
- pv.is_shared_system = true
1349
- pv.number_of_bedrooms_served = 20
1350
- pv.inverter_efficiency = 0.90
1351
- pv.system_losses_fraction = 0.20
2039
+ def _test_default_room_air_conditioner_values(hpxml, shr, cooling_capacity)
2040
+ cooling_system = hpxml.cooling_systems[0]
2041
+
2042
+ assert_equal(shr, cooling_system.cooling_shr)
2043
+ if cooling_capacity.nil?
2044
+ assert(cooling_system.cooling_capacity > 0)
2045
+ else
2046
+ assert_equal(cooling_system.cooling_capacity, cooling_capacity)
1352
2047
  end
1353
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1354
- hpxml_default = _test_measure()
1355
- expected_interver_efficiency = [0.90, 0.90]
1356
- expected_system_loss_frac = [0.20, 0.20]
1357
- _test_default_pv_system_values(hpxml_default, expected_interver_efficiency, expected_system_loss_frac, true)
2048
+ end
1358
2049
 
1359
- # Test defaults w/o year modules manufactured
1360
- hpxml.pv_systems.each do |pv|
1361
- pv.is_shared_system = nil
1362
- pv.inverter_efficiency = nil
1363
- pv.system_losses_fraction = nil
2050
+ def _test_default_evap_cooler_values(hpxml, cooling_capacity)
2051
+ cooling_system = hpxml.cooling_systems[0]
2052
+
2053
+ if cooling_capacity.nil?
2054
+ assert(cooling_system.cooling_capacity > 0)
2055
+ else
2056
+ assert_equal(cooling_system.cooling_capacity, cooling_capacity)
1364
2057
  end
1365
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1366
- hpxml_default = _test_measure()
1367
- expected_interver_efficiency = [0.96, 0.96]
1368
- expected_system_loss_frac = [0.14, 0.14]
1369
- _test_default_pv_system_values(hpxml_default, expected_interver_efficiency, expected_system_loss_frac, false)
2058
+ end
1370
2059
 
1371
- # Test defaults w/ year modules manufactured
1372
- hpxml.pv_systems.each do |pv|
1373
- pv.year_modules_manufactured = 2010
2060
+ def _test_default_mini_split_air_conditioner_values(hpxml, shr, fan_watts_per_cfm, charge_defect_ratio,
2061
+ airflow_defect_ratio, cooling_capacity)
2062
+ cooling_system = hpxml.cooling_systems[0]
2063
+
2064
+ assert_equal(shr, cooling_system.cooling_shr)
2065
+ assert_equal(fan_watts_per_cfm, cooling_system.fan_watts_per_cfm)
2066
+ assert_equal(charge_defect_ratio, cooling_system.charge_defect_ratio)
2067
+ assert_equal(airflow_defect_ratio, cooling_system.airflow_defect_ratio)
2068
+ if cooling_capacity.nil?
2069
+ assert(cooling_system.cooling_capacity > 0)
2070
+ else
2071
+ assert_equal(cooling_system.cooling_capacity, cooling_capacity)
1374
2072
  end
1375
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
1376
- hpxml_default = _test_measure()
1377
- expected_interver_efficiency = [0.96, 0.96]
1378
- expected_system_loss_frac = [0.182, 0.182]
1379
- _test_default_pv_system_values(hpxml_default, expected_interver_efficiency, expected_system_loss_frac, false)
1380
2073
  end
1381
2074
 
1382
- def _test_measure()
1383
- # create an instance of the measure
1384
- measure = HPXMLtoOpenStudio.new
2075
+ def _test_default_furnace_values(hpxml, fan_watts_per_cfm, airflow_defect_ratio,
2076
+ heating_capacity)
2077
+ heating_system = hpxml.heating_systems[0]
1385
2078
 
1386
- runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
1387
- model = OpenStudio::Model::Model.new
2079
+ assert_equal(fan_watts_per_cfm, heating_system.fan_watts_per_cfm)
2080
+ assert_equal(airflow_defect_ratio, heating_system.airflow_defect_ratio)
2081
+ if heating_capacity.nil?
2082
+ assert(heating_system.heating_capacity > 0)
2083
+ else
2084
+ assert_equal(heating_system.heating_capacity, heating_capacity)
2085
+ end
2086
+ end
1388
2087
 
1389
- # get arguments
1390
- arguments = measure.arguments(model)
1391
- argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
2088
+ def _test_default_wall_furnace_values(hpxml, fan_watts, heating_capacity)
2089
+ heating_system = hpxml.heating_systems[0]
1392
2090
 
1393
- # populate argument with specified hash value if specified
1394
- arguments.each do |arg|
1395
- temp_arg_var = arg.clone
1396
- if @args_hash.has_key?(arg.name)
1397
- assert(temp_arg_var.setValue(@args_hash[arg.name]))
1398
- end
1399
- argument_map[arg.name] = temp_arg_var
2091
+ assert_equal(fan_watts, heating_system.fan_watts)
2092
+ if heating_capacity.nil?
2093
+ assert(heating_system.heating_capacity > 0)
2094
+ else
2095
+ assert_equal(heating_system.heating_capacity, heating_capacity)
1400
2096
  end
2097
+ end
1401
2098
 
1402
- # run the measure
1403
- measure.run(model, runner, argument_map)
1404
- result = runner.result
2099
+ def _test_default_floor_furnace_values(hpxml, fan_watts, heating_capacity)
2100
+ heating_system = hpxml.heating_systems[0]
1405
2101
 
1406
- # show the output
1407
- show_output(result) unless result.value.valueName == 'Success'
2102
+ assert_equal(fan_watts, heating_system.fan_watts)
2103
+ if heating_capacity.nil?
2104
+ assert(heating_system.heating_capacity > 0)
2105
+ else
2106
+ assert_equal(heating_system.heating_capacity, heating_capacity)
2107
+ end
2108
+ end
1408
2109
 
1409
- # assert that it ran correctly
1410
- assert_equal('Success', result.value.valueName)
2110
+ def _test_default_boiler_values(hpxml, eae, heating_capacity)
2111
+ heating_system = hpxml.heating_systems[0]
1411
2112
 
1412
- hpxml_default = HPXML.new(hpxml_path: File.join(@tmp_output_path, 'in.xml'))
2113
+ assert_equal(eae, heating_system.electric_auxiliary_energy)
2114
+ if heating_capacity.nil?
2115
+ assert(heating_system.heating_capacity > 0)
2116
+ else
2117
+ assert_equal(heating_system.heating_capacity, heating_capacity)
2118
+ end
2119
+ end
1413
2120
 
1414
- return hpxml_default
2121
+ def _test_default_stove_values(hpxml, fan_watts, heating_capacity)
2122
+ heating_system = hpxml.heating_systems[0]
2123
+
2124
+ assert_equal(fan_watts, heating_system.fan_watts)
2125
+ if heating_capacity.nil?
2126
+ assert(heating_system.heating_capacity > 0)
2127
+ else
2128
+ assert_equal(heating_system.heating_capacity, heating_capacity)
2129
+ end
1415
2130
  end
1416
2131
 
1417
- def _test_default_header_values(hpxml, tstep, sim_begin_month, sim_begin_day, sim_end_month, sim_end_day, sim_calendar_year,
1418
- dst_enabled, dst_begin_month, dst_begin_day_of_month, dst_end_month, dst_end_day_of_month,
1419
- use_max_load_for_heat_pumps, allow_increased_fixed_capacities)
1420
- assert_equal(tstep, hpxml.header.timestep)
1421
- assert_equal(sim_begin_month, hpxml.header.sim_begin_month)
1422
- assert_equal(sim_begin_day, hpxml.header.sim_begin_day_of_month)
1423
- assert_equal(sim_end_month, hpxml.header.sim_end_month)
1424
- assert_equal(sim_end_day, hpxml.header.sim_end_day_of_month)
1425
- assert_equal(sim_calendar_year, hpxml.header.sim_calendar_year)
1426
- assert_equal(dst_enabled, hpxml.header.dst_enabled)
1427
- assert_equal(dst_begin_month, hpxml.header.dst_begin_month)
1428
- assert_equal(dst_begin_day_of_month, hpxml.header.dst_begin_day_of_month)
1429
- assert_equal(dst_end_month, hpxml.header.dst_end_month)
1430
- assert_equal(dst_end_day_of_month, hpxml.header.dst_end_day_of_month)
1431
- assert_equal(use_max_load_for_heat_pumps, hpxml.header.use_max_load_for_heat_pumps)
1432
- assert_equal(allow_increased_fixed_capacities, hpxml.header.allow_increased_fixed_capacities)
2132
+ def _test_default_portable_heater_values(hpxml, fan_watts, heating_capacity)
2133
+ heating_system = hpxml.heating_systems[0]
2134
+
2135
+ assert_equal(fan_watts, heating_system.fan_watts)
2136
+ if heating_capacity.nil?
2137
+ assert(heating_system.heating_capacity > 0)
2138
+ else
2139
+ assert_equal(heating_system.heating_capacity, heating_capacity)
2140
+ end
1433
2141
  end
1434
2142
 
1435
- def _test_default_site_values(hpxml, site_type, shelter_coefficient)
1436
- assert_equal(site_type, hpxml.site.site_type)
1437
- assert_equal(shelter_coefficient, hpxml.site.shelter_coefficient)
2143
+ def _test_default_fixed_heater_values(hpxml, fan_watts, heating_capacity)
2144
+ heating_system = hpxml.heating_systems[0]
2145
+
2146
+ assert_equal(fan_watts, heating_system.fan_watts)
2147
+ if heating_capacity.nil?
2148
+ assert(heating_system.heating_capacity > 0)
2149
+ else
2150
+ assert_equal(heating_system.heating_capacity, heating_capacity)
2151
+ end
1438
2152
  end
1439
2153
 
1440
- def _test_default_occupancy_values(hpxml, num_occupants)
1441
- assert_equal(num_occupants, hpxml.building_occupancy.number_of_residents)
2154
+ def _test_default_fireplace_values(hpxml, fan_watts, heating_capacity)
2155
+ heating_system = hpxml.heating_systems[0]
2156
+
2157
+ assert_equal(fan_watts, heating_system.fan_watts)
2158
+ if heating_capacity.nil?
2159
+ assert(heating_system.heating_capacity > 0)
2160
+ else
2161
+ assert_equal(heating_system.heating_capacity, heating_capacity)
2162
+ end
1442
2163
  end
1443
2164
 
1444
- def _test_default_air_conditioner_values(hpxml, shr, compressor_type)
1445
- cooling_system = hpxml.cooling_systems[0]
1446
- assert_equal(shr, cooling_system.cooling_shr)
1447
- assert_equal(compressor_type, cooling_system.compressor_type)
2165
+ def _test_default_air_to_air_heat_pump_values(hpxml, shr, compressor_type, fan_watts_per_cfm, charge_defect_ratio,
2166
+ airflow_defect_ratio, cooling_capacity, heating_capacity,
2167
+ heating_capacity_17F, backup_heating_capacity)
2168
+ heat_pump = hpxml.heat_pumps[0]
2169
+
2170
+ assert_equal(shr, heat_pump.cooling_shr)
2171
+ assert_equal(compressor_type, heat_pump.compressor_type)
2172
+ assert_equal(fan_watts_per_cfm, heat_pump.fan_watts_per_cfm)
2173
+ assert_equal(charge_defect_ratio, heat_pump.charge_defect_ratio)
2174
+ assert_equal(airflow_defect_ratio, heat_pump.airflow_defect_ratio)
2175
+ if cooling_capacity.nil?
2176
+ assert(heat_pump.cooling_capacity > 0)
2177
+ else
2178
+ assert_equal(heat_pump.cooling_capacity, cooling_capacity)
2179
+ end
2180
+ if heating_capacity.nil?
2181
+ assert(heat_pump.heating_capacity > 0)
2182
+ else
2183
+ assert_equal(heat_pump.heating_capacity, heating_capacity)
2184
+ end
2185
+ if heating_capacity_17F.nil?
2186
+ # assert(heat_pump.heating_capacity_17F > 0) # FUTURE
2187
+ else
2188
+ assert_equal(heat_pump.heating_capacity_17F, heating_capacity_17F)
2189
+ end
2190
+ if backup_heating_capacity.nil?
2191
+ assert(heat_pump.backup_heating_capacity > 0)
2192
+ else
2193
+ assert_equal(heat_pump.backup_heating_capacity, backup_heating_capacity)
2194
+ end
1448
2195
  end
1449
2196
 
1450
- def _test_default_boiler_values(hpxml, eae)
1451
- heating_system = hpxml.heating_systems[0]
1452
- assert_equal(eae, heating_system.electric_auxiliary_energy)
2197
+ def _test_default_mini_split_heat_pump_values(hpxml, shr, fan_watts_per_cfm, charge_defect_ratio,
2198
+ airflow_defect_ratio, cooling_capacity, heating_capacity,
2199
+ heating_capacity_17F, backup_heating_capacity)
2200
+ heat_pump = hpxml.heat_pumps[0]
2201
+
2202
+ assert_equal(shr, heat_pump.cooling_shr)
2203
+ assert_equal(fan_watts_per_cfm, heat_pump.fan_watts_per_cfm)
2204
+ assert_equal(charge_defect_ratio, heat_pump.charge_defect_ratio)
2205
+ assert_equal(airflow_defect_ratio, heat_pump.airflow_defect_ratio)
2206
+ if cooling_capacity.nil?
2207
+ assert(heat_pump.cooling_capacity > 0)
2208
+ else
2209
+ assert_equal(heat_pump.cooling_capacity, cooling_capacity)
2210
+ end
2211
+ if heating_capacity.nil?
2212
+ assert(heat_pump.heating_capacity > 0)
2213
+ else
2214
+ assert_equal(heat_pump.heating_capacity, heating_capacity)
2215
+ end
2216
+ if heating_capacity_17F.nil?
2217
+ # assert(heat_pump.heating_capacity_17F > 0) # FUTURE
2218
+ else
2219
+ assert_equal(heat_pump.heating_capacity_17F, heating_capacity_17F)
2220
+ end
2221
+ if backup_heating_capacity.nil?
2222
+ assert(heat_pump.backup_heating_capacity > 0)
2223
+ else
2224
+ assert_equal(heat_pump.backup_heating_capacity, backup_heating_capacity)
2225
+ end
1453
2226
  end
1454
2227
 
1455
- def _test_default_gshp_values(hpxml, pump_w_per_ton, fan_w_per_cfm)
2228
+ def _test_default_ground_to_air_heat_pump_values(hpxml, pump_watts_per_ton, fan_watts_per_cfm,
2229
+ airflow_defect_ratio, cooling_capacity, heating_capacity,
2230
+ backup_heating_capacity)
2231
+
1456
2232
  heat_pump = hpxml.heat_pumps[0]
1457
- assert_equal(pump_w_per_ton, heat_pump.pump_watts_per_ton)
1458
- assert_equal(fan_w_per_cfm, heat_pump.fan_watts_per_cfm)
2233
+
2234
+ assert_equal(pump_watts_per_ton, heat_pump.pump_watts_per_ton)
2235
+ assert_equal(fan_watts_per_cfm, heat_pump.fan_watts_per_cfm)
2236
+ assert_equal(airflow_defect_ratio, heat_pump.airflow_defect_ratio)
2237
+ if cooling_capacity.nil?
2238
+ assert(heat_pump.cooling_capacity > 0)
2239
+ else
2240
+ assert_equal(heat_pump.cooling_capacity, cooling_capacity)
2241
+ end
2242
+ if heating_capacity.nil?
2243
+ assert(heat_pump.heating_capacity > 0)
2244
+ else
2245
+ assert_equal(heat_pump.heating_capacity, heating_capacity)
2246
+ end
2247
+ if backup_heating_capacity.nil?
2248
+ assert(heat_pump.backup_heating_capacity > 0)
2249
+ else
2250
+ assert_equal(heat_pump.backup_heating_capacity, backup_heating_capacity)
2251
+ end
2252
+ end
2253
+
2254
+ def _test_default_hvac_control_values(hpxml, htg_setback_start_hr, clg_setup_start_hr)
2255
+ hvac_control = hpxml.hvac_controls[0]
2256
+
2257
+ assert_equal(htg_setback_start_hr, hvac_control.heating_setback_start_hour)
2258
+ assert_equal(clg_setup_start_hr, hvac_control.cooling_setup_start_hour)
1459
2259
  end
1460
2260
 
1461
2261
  def _test_default_duct_values(hpxml, supply_locations, return_locations, supply_areas, return_areas, n_return_registers)
1462
2262
  supply_duct_idx = 0
1463
2263
  return_duct_idx = 0
1464
2264
  hpxml.hvac_distributions.each do |hvac_distribution|
1465
- next unless [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeHydronicAndAir].include? hvac_distribution.distribution_system_type
2265
+ next unless [HPXML::HVACDistributionTypeAir].include? hvac_distribution.distribution_system_type
1466
2266
 
1467
2267
  assert_equal(n_return_registers, hvac_distribution.number_of_return_registers)
1468
2268
  hvac_distribution.ducts.each do |duct|
@@ -1479,76 +2279,109 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
1479
2279
  end
1480
2280
  end
1481
2281
 
1482
- def _test_default_pv_system_values(hpxml, interver_efficiency, system_loss_frac, is_shared_system)
1483
- assert_equal(interver_efficiency.size, hpxml.pv_systems.size)
1484
- hpxml.pv_systems.each_with_index do |pv, idx|
1485
- assert_equal(is_shared_system, pv.is_shared_system)
1486
- assert_equal(interver_efficiency[idx], pv.inverter_efficiency)
1487
- assert_in_epsilon(system_loss_frac[idx], pv.system_losses_fraction, 0.01)
1488
- end
2282
+ def _test_default_mech_vent_values(hpxml, is_shared_system, hours_in_operation)
2283
+ vent_fan = hpxml.ventilation_fans.select { |f| f.used_for_whole_building_ventilation }[0]
2284
+
2285
+ assert_equal(is_shared_system, vent_fan.is_shared_system)
2286
+ assert_equal(hours_in_operation, vent_fan.hours_in_operation)
1489
2287
  end
1490
2288
 
1491
- def _test_default_building_construction_values(hpxml, building_volume, has_flue_or_chimney, n_bathrooms)
1492
- assert_equal(building_volume, hpxml.building_construction.conditioned_building_volume)
1493
- assert_equal(has_flue_or_chimney, hpxml.building_construction.has_flue_or_chimney)
1494
- assert_equal(n_bathrooms, hpxml.building_construction.number_of_bathrooms)
2289
+ def _test_default_kitchen_fan_values(hpxml, quantity, rated_flow_rate, hours_in_operation, fan_power, start_hour)
2290
+ kitchen_fan = hpxml.ventilation_fans.select { |f| f.used_for_local_ventilation && f.fan_location == HPXML::LocationKitchen }[0]
2291
+
2292
+ assert_equal(quantity, kitchen_fan.quantity)
2293
+ assert_equal(rated_flow_rate, kitchen_fan.rated_flow_rate)
2294
+ assert_equal(hours_in_operation, kitchen_fan.hours_in_operation)
2295
+ assert_equal(fan_power, kitchen_fan.fan_power)
2296
+ assert_equal(start_hour, kitchen_fan.start_hour)
1495
2297
  end
1496
2298
 
1497
- def _test_default_attic_values(hpxml, sla)
1498
- attic = hpxml.attics[0]
1499
- assert_equal(sla, attic.vented_attic_sla)
2299
+ def _test_default_bath_fan_values(hpxml, quantity, rated_flow_rate, hours_in_operation, fan_power, start_hour)
2300
+ bath_fan = hpxml.ventilation_fans.select { |f| f.used_for_local_ventilation && f.fan_location == HPXML::LocationBath }[0]
2301
+
2302
+ assert_equal(quantity, bath_fan.quantity)
2303
+ assert_equal(rated_flow_rate, bath_fan.rated_flow_rate)
2304
+ assert_equal(hours_in_operation, bath_fan.hours_in_operation)
2305
+ assert_equal(fan_power, bath_fan.fan_power)
2306
+ assert_equal(start_hour, bath_fan.start_hour)
1500
2307
  end
1501
2308
 
1502
- def _test_default_foundation_values(hpxml, sla)
1503
- foundation = hpxml.foundations[0]
1504
- assert_equal(sla, foundation.vented_crawlspace_sla)
2309
+ def _test_default_storage_water_heater_values(hpxml, *expected_wh_values)
2310
+ storage_water_heaters = hpxml.water_heating_systems.select { |w| w.water_heater_type == HPXML::WaterHeaterTypeStorage }
2311
+ assert_equal(expected_wh_values.size, storage_water_heaters.size)
2312
+ storage_water_heaters.each_with_index do |wh_system, idx|
2313
+ is_shared, heating_capacity, tank_volume, recovery_efficiency, location = expected_wh_values[idx]
2314
+
2315
+ assert_equal(is_shared, wh_system.is_shared_system)
2316
+ assert_in_epsilon(heating_capacity, wh_system.heating_capacity, 0.01)
2317
+ assert_equal(tank_volume, wh_system.tank_volume)
2318
+ assert_in_epsilon(recovery_efficiency, wh_system.recovery_efficiency, 0.01)
2319
+ assert_equal(location, wh_system.location)
2320
+ end
1505
2321
  end
1506
2322
 
1507
- def _test_default_infiltration_values(hpxml, volume)
1508
- air_infiltration_measurement = hpxml.air_infiltration_measurements[0]
1509
- assert_equal(volume, air_infiltration_measurement.infiltration_volume)
2323
+ def _test_default_tankless_water_heater_values(hpxml, *expected_wh_values)
2324
+ tankless_water_heaters = hpxml.water_heating_systems.select { |w| w.water_heater_type == HPXML::WaterHeaterTypeTankless }
2325
+ assert_equal(expected_wh_values.size, tankless_water_heaters.size)
2326
+ tankless_water_heaters.each_with_index do |wh_system, idx|
2327
+ performance_adjustment, = expected_wh_values[idx]
2328
+
2329
+ assert_equal(performance_adjustment, wh_system.performance_adjustment)
2330
+ end
1510
2331
  end
1511
2332
 
1512
- def _test_default_roof_values(hpxml, roof_type, solar_absorptance, roof_color)
1513
- roof = hpxml.roofs[0]
1514
- assert_equal(roof_type, roof.roof_type)
1515
- assert_equal(solar_absorptance, roof.solar_absorptance)
1516
- assert_equal(roof_color, roof.roof_color)
2333
+ def _test_default_standard_distribution_values(hpxml, piping_length, pipe_r_value)
2334
+ hot_water_distribution = hpxml.hot_water_distributions[0]
2335
+
2336
+ assert_in_epsilon(piping_length, hot_water_distribution.standard_piping_length, 0.01)
2337
+ assert_equal(pipe_r_value, hot_water_distribution.pipe_r_value)
1517
2338
  end
1518
2339
 
1519
- def _test_default_wall_values(hpxml, siding, solar_absorptance, color)
1520
- wall = hpxml.walls[0]
1521
- assert_equal(siding, wall.siding)
1522
- assert_equal(solar_absorptance, wall.solar_absorptance)
1523
- assert_equal(color, wall.color)
2340
+ def _test_default_recirc_distribution_values(hpxml, piping_length, branch_piping_length, pump_power, pipe_r_value)
2341
+ hot_water_distribution = hpxml.hot_water_distributions[0]
2342
+
2343
+ assert_in_epsilon(piping_length, hot_water_distribution.recirculation_piping_length, 0.01)
2344
+ assert_in_epsilon(branch_piping_length, hot_water_distribution.recirculation_branch_piping_length, 0.01)
2345
+ assert_in_epsilon(pump_power, hot_water_distribution.recirculation_pump_power, 0.01)
2346
+ assert_equal(pipe_r_value, hot_water_distribution.pipe_r_value)
1524
2347
  end
1525
2348
 
1526
- def _test_default_rim_joist_values(hpxml, siding, solar_absorptance, color)
1527
- rim_joist = hpxml.rim_joists[0]
1528
- assert_equal(siding, rim_joist.siding)
1529
- assert_equal(solar_absorptance, rim_joist.solar_absorptance)
1530
- assert_equal(color, rim_joist.color)
2349
+ def _test_default_shared_recirc_distribution_values(hpxml, pump_power)
2350
+ hot_water_distribution = hpxml.hot_water_distributions[0]
2351
+
2352
+ assert_in_epsilon(pump_power, hot_water_distribution.shared_recirculation_pump_power, 0.01)
1531
2353
  end
1532
2354
 
1533
- def _test_default_window_values(hpxml, summer_shade_coeffs, winter_shade_coeffs, fraction_operable)
1534
- assert_equal(summer_shade_coeffs.size, hpxml.windows.size)
1535
- hpxml.windows.each_with_index do |window, idx|
1536
- assert_equal(summer_shade_coeffs[idx], window.interior_shading_factor_summer)
1537
- assert_equal(winter_shade_coeffs[idx], window.interior_shading_factor_winter)
1538
- assert_equal(fraction_operable[idx], window.fraction_operable)
2355
+ def _test_default_water_fixture_values(hpxml, usage_multiplier)
2356
+ assert_equal(usage_multiplier, hpxml.water_heating.water_fixtures_usage_multiplier)
2357
+ end
2358
+
2359
+ def _test_default_solar_thermal_values(hpxml, storage_volume)
2360
+ solar_thermal_system = hpxml.solar_thermal_systems[0]
2361
+
2362
+ assert_equal(storage_volume, solar_thermal_system.storage_volume)
2363
+ end
2364
+
2365
+ def _test_default_pv_system_values(hpxml, interver_efficiency, system_loss_frac, is_shared_system, location, tracking, module_type)
2366
+ hpxml.pv_systems.each_with_index do |pv, idx|
2367
+ assert_equal(is_shared_system, pv.is_shared_system)
2368
+ assert_equal(interver_efficiency, pv.inverter_efficiency)
2369
+ assert_in_epsilon(system_loss_frac, pv.system_losses_fraction, 0.01)
2370
+ assert_equal(location, pv.location)
2371
+ assert_equal(tracking, pv.tracking)
2372
+ assert_equal(module_type, pv.module_type)
1539
2373
  end
1540
2374
  end
1541
2375
 
1542
- def _test_default_skylight_values(hpxml, summer_shade_coeffs, winter_shade_coeffs)
1543
- assert_equal(summer_shade_coeffs.size, hpxml.skylights.size)
1544
- hpxml.skylights.each_with_index do |skylight, idx|
1545
- assert_equal(summer_shade_coeffs[idx], skylight.interior_shading_factor_summer)
1546
- assert_equal(winter_shade_coeffs[idx], skylight.interior_shading_factor_winter)
2376
+ def _test_default_generator_values(hpxml, is_shared_system)
2377
+ hpxml.generators.each_with_index do |generator, idx|
2378
+ assert_equal(is_shared_system, generator.is_shared_system)
1547
2379
  end
1548
2380
  end
1549
2381
 
1550
2382
  def _test_default_clothes_washer_values(hpxml, is_shared, location, imef, rated_annual_kwh, label_electric_rate, label_gas_rate, label_annual_gas_cost, capacity, label_usage, usage_multiplier)
1551
2383
  clothes_washer = hpxml.clothes_washers[0]
2384
+
1552
2385
  assert_equal(is_shared, clothes_washer.is_shared_appliance)
1553
2386
  assert_equal(location, clothes_washer.location)
1554
2387
  assert_equal(imef, clothes_washer.integrated_modified_energy_factor)
@@ -1561,17 +2394,29 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
1561
2394
  assert_equal(usage_multiplier, clothes_washer.usage_multiplier)
1562
2395
  end
1563
2396
 
1564
- def _test_default_clothes_dryer_values(hpxml, is_shared, location, control_type, cef, usage_multiplier)
2397
+ def _test_default_clothes_dryer_values(hpxml, is_shared, location, cef, usage_multiplier)
1565
2398
  clothes_dryer = hpxml.clothes_dryers[0]
2399
+
1566
2400
  assert_equal(is_shared, clothes_dryer.is_shared_appliance)
1567
2401
  assert_equal(location, clothes_dryer.location)
1568
- assert_equal(control_type, clothes_dryer.control_type)
1569
2402
  assert_equal(cef, clothes_dryer.combined_energy_factor)
1570
2403
  assert_equal(usage_multiplier, clothes_dryer.usage_multiplier)
1571
2404
  end
1572
2405
 
2406
+ def _test_default_clothes_dryer_exhaust_values(hpxml, is_vented, vented_flow_rate)
2407
+ clothes_dryer = hpxml.clothes_dryers[0]
2408
+
2409
+ assert_equal(is_vented, clothes_dryer.is_vented)
2410
+ if vented_flow_rate.nil?
2411
+ assert_nil(clothes_dryer.vented_flow_rate)
2412
+ else
2413
+ assert_equal(vented_flow_rate, clothes_dryer.vented_flow_rate)
2414
+ end
2415
+ end
2416
+
1573
2417
  def _test_default_dishwasher_values(hpxml, is_shared, location, rated_annual_kwh, label_electric_rate, label_gas_rate, label_annual_gas_cost, label_usage, place_setting_capacity, usage_multiplier)
1574
2418
  dishwasher = hpxml.dishwashers[0]
2419
+
1575
2420
  assert_equal(is_shared, dishwasher.is_shared_appliance)
1576
2421
  assert_equal(location, dishwasher.location)
1577
2422
  assert_equal(rated_annual_kwh, dishwasher.rated_annual_kwh)
@@ -1658,6 +2503,7 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
1658
2503
 
1659
2504
  def _test_default_cooking_range_values(hpxml, location, is_induction, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
1660
2505
  cooking_range = hpxml.cooking_ranges[0]
2506
+
1661
2507
  assert_equal(location, cooking_range.location)
1662
2508
  assert_equal(is_induction, cooking_range.is_induction)
1663
2509
  assert_equal(usage_multiplier, cooking_range.usage_multiplier)
@@ -1680,6 +2526,7 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
1680
2526
 
1681
2527
  def _test_default_oven_values(hpxml, is_convection)
1682
2528
  oven = hpxml.ovens[0]
2529
+
1683
2530
  assert_equal(is_convection, oven.is_convection)
1684
2531
  end
1685
2532
 
@@ -1727,20 +2574,20 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
1727
2574
  else
1728
2575
  assert_nil(hpxml.lighting.holiday_period_begin_month)
1729
2576
  end
1730
- if not schedules[:hol_begin_day_of_month].nil?
1731
- assert_equal(schedules[:hol_begin_day_of_month], hpxml.lighting.holiday_period_begin_day_of_month)
2577
+ if not schedules[:hol_begin_day].nil?
2578
+ assert_equal(schedules[:hol_begin_day], hpxml.lighting.holiday_period_begin_day)
1732
2579
  else
1733
- assert_nil(hpxml.lighting.holiday_period_begin_day_of_month)
2580
+ assert_nil(hpxml.lighting.holiday_period_begin_day)
1734
2581
  end
1735
2582
  if not schedules[:hol_end_month].nil?
1736
2583
  assert_equal(schedules[:hol_end_month], hpxml.lighting.holiday_period_end_month)
1737
2584
  else
1738
2585
  assert_nil(hpxml.lighting.holiday_period_end_month)
1739
2586
  end
1740
- if not schedules[:hol_end_day_of_month].nil?
1741
- assert_equal(schedules[:hol_end_day_of_month], hpxml.lighting.holiday_period_end_day_of_month)
2587
+ if not schedules[:hol_end_day].nil?
2588
+ assert_equal(schedules[:hol_end_day], hpxml.lighting.holiday_period_end_day)
1742
2589
  else
1743
- assert_nil(hpxml.lighting.holiday_period_end_day_of_month)
2590
+ assert_nil(hpxml.lighting.holiday_period_end_day)
1744
2591
  end
1745
2592
  if not schedules[:hol_wk_sch].nil?
1746
2593
  assert_equal(schedules[:hol_wk_sch], hpxml.lighting.holiday_weekday_fractions)
@@ -1754,71 +2601,16 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
1754
2601
  end
1755
2602
  end
1756
2603
 
1757
- def _test_default_standard_distribution_values(hpxml, piping_length)
1758
- hot_water_distribution = hpxml.hot_water_distributions[0]
1759
- assert_in_epsilon(piping_length, hot_water_distribution.standard_piping_length, 0.01)
1760
- end
1761
-
1762
- def _test_default_recirc_distribution_values(hpxml, piping_length, branch_piping_length, pump_power)
1763
- hot_water_distribution = hpxml.hot_water_distributions[0]
1764
- assert_in_epsilon(piping_length, hot_water_distribution.recirculation_piping_length, 0.01)
1765
- assert_in_epsilon(branch_piping_length, hot_water_distribution.recirculation_branch_piping_length, 0.01)
1766
- assert_in_epsilon(pump_power, hot_water_distribution.recirculation_pump_power, 0.01)
1767
- end
1768
-
1769
- def _test_default_shared_recirc_distribution_values(hpxml, pump_power)
1770
- hot_water_distribution = hpxml.hot_water_distributions[0]
1771
- assert_in_epsilon(pump_power, hot_water_distribution.shared_recirculation_pump_power, 0.01)
1772
- end
1773
-
1774
- def _test_default_water_fixture_values(hpxml, usage_multiplier)
1775
- assert_equal(usage_multiplier, hpxml.water_heating.water_fixtures_usage_multiplier)
1776
- end
1777
-
1778
- def _test_default_solar_thermal_values(hpxml, storage_volume)
1779
- assert_in_epsilon(storage_volume, hpxml.solar_thermal_systems[0].storage_volume)
1780
- end
1781
-
1782
- def _test_default_mech_vent_values(hpxml, is_shared_system)
1783
- vent_fan = hpxml.ventilation_fans.select { |f| f.used_for_whole_building_ventilation }[0]
1784
- assert_equal(is_shared_system, vent_fan.is_shared_system)
1785
- end
1786
-
1787
- def _test_default_kitchen_fan_values(hpxml, quantity, rated_flow_rate, hours_in_operation, fan_power, start_hour)
1788
- kitchen_fan = hpxml.ventilation_fans.select { |f| f.used_for_local_ventilation && f.fan_location == HPXML::LocationKitchen }[0]
1789
- assert_equal(quantity, kitchen_fan.quantity)
1790
- assert_equal(rated_flow_rate, kitchen_fan.rated_flow_rate)
1791
- assert_equal(hours_in_operation, kitchen_fan.hours_in_operation)
1792
- assert_equal(fan_power, kitchen_fan.fan_power)
1793
- assert_equal(start_hour, kitchen_fan.start_hour)
1794
- end
1795
-
1796
- def _test_default_bath_fan_values(hpxml, quantity, rated_flow_rate, hours_in_operation, fan_power, start_hour)
1797
- bath_fan = hpxml.ventilation_fans.select { |f| f.used_for_local_ventilation && f.fan_location == HPXML::LocationBath }[0]
1798
- assert_equal(quantity, bath_fan.quantity)
1799
- assert_equal(rated_flow_rate, bath_fan.rated_flow_rate)
1800
- assert_equal(hours_in_operation, bath_fan.hours_in_operation)
1801
- assert_equal(fan_power, bath_fan.fan_power)
1802
- assert_equal(start_hour, bath_fan.start_hour)
1803
- end
1804
-
1805
- def _test_default_clothes_dryer_exhaust_values(hpxml, is_vented, vented_flow_rate)
1806
- clothes_dryer = hpxml.clothes_dryers[0]
1807
- assert_equal(is_vented, clothes_dryer.is_vented)
1808
- if vented_flow_rate.nil?
1809
- assert_nil(clothes_dryer.vented_flow_rate)
1810
- else
1811
- assert_equal(vented_flow_rate, clothes_dryer.vented_flow_rate)
1812
- end
1813
- end
1814
-
1815
2604
  def _test_default_ceiling_fan_values(hpxml, quantity, efficiency)
1816
- assert_equal(quantity, hpxml.ceiling_fans[0].quantity)
1817
- assert_in_epsilon(efficiency, hpxml.ceiling_fans[0].efficiency, 0.01)
2605
+ ceiling_fan = hpxml.ceiling_fans[0]
2606
+
2607
+ assert_equal(quantity, ceiling_fan.quantity)
2608
+ assert_in_epsilon(efficiency, ceiling_fan.efficiency, 0.01)
1818
2609
  end
1819
2610
 
1820
- def _test_default_pool_heater_values(hpxml, load_units, load_value, weekday_sch, weekend_sch, monthly_mults)
2611
+ def _test_default_pool_heater_values(hpxml, load_units, load_value, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
1821
2612
  pool = hpxml.pools[0]
2613
+
1822
2614
  if load_units.nil?
1823
2615
  assert_nil(pool.heater_load_units)
1824
2616
  else
@@ -1827,7 +2619,12 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
1827
2619
  if load_value.nil?
1828
2620
  assert_nil(pool.heater_load_value)
1829
2621
  else
1830
- assert_in_epsilon(load_value, pool.heater_load_value.to_f, 0.01)
2622
+ assert_in_epsilon(load_value, pool.heater_load_value, 0.01)
2623
+ end
2624
+ if usage_multiplier.nil?
2625
+ assert_nil(pool.heater_usage_multiplier)
2626
+ else
2627
+ assert_equal(usage_multiplier, pool.heater_usage_multiplier)
1831
2628
  end
1832
2629
  if weekday_sch.nil?
1833
2630
  assert_nil(pool.heater_weekday_fractions)
@@ -1846,16 +2643,19 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
1846
2643
  end
1847
2644
  end
1848
2645
 
1849
- def _test_default_pool_pump_values(hpxml, kWh_per_year, weekday_sch, weekend_sch, monthly_mults)
2646
+ def _test_default_pool_pump_values(hpxml, kWh_per_year, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
1850
2647
  pool = hpxml.pools[0]
2648
+
1851
2649
  assert_in_epsilon(kWh_per_year, pool.pump_kwh_per_year, 0.01)
2650
+ assert_equal(usage_multiplier, pool.pump_usage_multiplier)
1852
2651
  assert_equal(weekday_sch, pool.pump_weekday_fractions)
1853
2652
  assert_equal(weekend_sch, pool.pump_weekend_fractions)
1854
2653
  assert_equal(monthly_mults, pool.pump_monthly_multipliers)
1855
2654
  end
1856
2655
 
1857
- def _test_default_hot_tub_heater_values(hpxml, load_units, load_value, weekday_sch, weekend_sch, monthly_mults)
2656
+ def _test_default_hot_tub_heater_values(hpxml, load_units, load_value, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
1858
2657
  hot_tub = hpxml.hot_tubs[0]
2658
+
1859
2659
  if load_units.nil?
1860
2660
  assert_nil(hot_tub.heater_load_units)
1861
2661
  else
@@ -1864,7 +2664,12 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
1864
2664
  if load_value.nil?
1865
2665
  assert_nil(hot_tub.heater_load_value)
1866
2666
  else
1867
- assert_in_epsilon(load_value, hot_tub.heater_load_value.to_f, 0.01)
2667
+ assert_in_epsilon(load_value, hot_tub.heater_load_value, 0.01)
2668
+ end
2669
+ if usage_multiplier.nil?
2670
+ assert_nil(hot_tub.heater_usage_multiplier)
2671
+ else
2672
+ assert_equal(usage_multiplier, hot_tub.heater_usage_multiplier)
1868
2673
  end
1869
2674
  if weekday_sch.nil?
1870
2675
  assert_nil(hot_tub.heater_weekday_fractions)
@@ -1883,48 +2688,40 @@ class HPXMLtoOpenStudioDefaultsTest < MiniTest::Test
1883
2688
  end
1884
2689
  end
1885
2690
 
1886
- def _test_default_hot_tub_pump_values(hpxml, kWh_per_year, weekday_sch, weekend_sch, monthly_mults)
2691
+ def _test_default_hot_tub_pump_values(hpxml, kWh_per_year, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
1887
2692
  hot_tub = hpxml.hot_tubs[0]
2693
+
1888
2694
  assert_in_epsilon(kWh_per_year, hot_tub.pump_kwh_per_year, 0.01)
2695
+ assert_equal(usage_multiplier, hot_tub.pump_usage_multiplier)
1889
2696
  assert_equal(weekday_sch, hot_tub.pump_weekday_fractions)
1890
2697
  assert_equal(weekend_sch, hot_tub.pump_weekend_fractions)
1891
2698
  assert_equal(monthly_mults, hot_tub.pump_monthly_multipliers)
1892
2699
  end
1893
2700
 
1894
- def _test_default_plug_load_values(hpxml, load_type, kWh_per_year, frac_sensible, frac_latent, location, weekday_sch, weekend_sch, monthly_mults)
2701
+ def _test_default_plug_load_values(hpxml, load_type, kWh_per_year, frac_sensible, frac_latent, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
1895
2702
  pl = hpxml.plug_loads.select { |pl| pl.plug_load_type == load_type }[0]
2703
+
1896
2704
  assert_in_epsilon(kWh_per_year, pl.kWh_per_year, 0.01)
2705
+ assert_equal(usage_multiplier, pl.usage_multiplier)
1897
2706
  assert_in_epsilon(frac_sensible, pl.frac_sensible, 0.01)
1898
2707
  assert_in_epsilon(frac_latent, pl.frac_latent, 0.01)
1899
- assert_equal(location, pl.location)
1900
2708
  assert_equal(weekday_sch, pl.weekday_fractions)
1901
2709
  assert_equal(weekend_sch, pl.weekend_fractions)
1902
2710
  assert_equal(monthly_mults, pl.monthly_multipliers)
1903
2711
  end
1904
2712
 
1905
- def _test_default_fuel_load_values(hpxml, load_type, therm_per_year, frac_sensible, frac_latent, location, weekday_sch, weekend_sch, monthly_mults)
2713
+ def _test_default_fuel_load_values(hpxml, load_type, therm_per_year, frac_sensible, frac_latent, usage_multiplier, weekday_sch, weekend_sch, monthly_mults)
1906
2714
  fl = hpxml.fuel_loads.select { |fl| fl.fuel_load_type == load_type }[0]
2715
+
1907
2716
  assert_in_epsilon(therm_per_year, fl.therm_per_year, 0.01)
2717
+ assert_equal(usage_multiplier, fl.usage_multiplier)
1908
2718
  assert_in_epsilon(frac_sensible, fl.frac_sensible, 0.01)
1909
2719
  assert_in_epsilon(frac_latent, fl.frac_latent, 0.01)
1910
- assert_equal(location, fl.location)
1911
2720
  assert_equal(weekday_sch, fl.weekday_fractions)
1912
2721
  assert_equal(weekend_sch, fl.weekend_fractions)
1913
2722
  assert_equal(monthly_mults, fl.monthly_multipliers)
1914
2723
  end
1915
2724
 
1916
- def _test_default_water_heater_values(hpxml, *expected_wh_values)
1917
- storage_water_heaters = hpxml.water_heating_systems.select { |w| w.water_heater_type == HPXML::WaterHeaterTypeStorage }
1918
- assert_equal(expected_wh_values.size, storage_water_heaters.size)
1919
- storage_water_heaters.each_with_index do |wh_system, idx|
1920
- is_shared, heating_capacity, tank_volume, recovery_efficiency = expected_wh_values[idx]
1921
- assert_equal(is_shared, wh_system.is_shared_system)
1922
- assert_in_epsilon(heating_capacity, wh_system.heating_capacity, 0.01)
1923
- assert_equal(tank_volume, wh_system.tank_volume)
1924
- assert_in_epsilon(recovery_efficiency, wh_system.recovery_efficiency, 0.01)
1925
- end
1926
- end
1927
-
1928
2725
  def _create_hpxml(hpxml_name)
1929
2726
  return HPXML.new(hpxml_path: File.join(@sample_files_path, hpxml_name))
1930
2727
  end