urbanopt-cli 0.4.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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