urbanopt-cli 0.5.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (907) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -2
  3. data/CHANGELOG.md +43 -1
  4. data/CMakeLists.txt +14 -14
  5. data/FindOpenStudioSDK.cmake +11 -6
  6. data/Gemfile +11 -5
  7. data/LICENSE.md +11 -1
  8. data/Rakefile +16 -6
  9. data/example_files/Gemfile +8 -8
  10. data/example_files/example_project_combined.json +100 -5
  11. data/example_files/example_project_with_streets.json +826 -0
  12. data/example_files/mappers/Baseline.rb +107 -59
  13. data/example_files/mappers/CreateBar.rb +17 -7
  14. data/example_files/mappers/EvCharging.rb +20 -10
  15. data/example_files/mappers/Floorspace.rb +17 -7
  16. data/example_files/mappers/HighEfficiency.rb +20 -8
  17. data/example_files/mappers/HighEfficiencyCreateBar.rb +19 -8
  18. data/example_files/mappers/HighEfficiencyFloorspace.rb +19 -8
  19. data/example_files/mappers/ThermalStorage.rb +16 -6
  20. data/example_files/measures/BuildResidentialModel/measure.rb +249 -134
  21. data/example_files/reopt/base_assumptions.json +2 -2
  22. data/example_files/reopt/multiPV_assumptions.json +4 -3
  23. data/example_files/residential/clothes_dryer.tsv +7 -7
  24. data/example_files/residential/clothes_washer.tsv +1 -1
  25. data/example_files/residential/cooling_system.tsv +42 -22
  26. data/example_files/residential/dishwasher.tsv +1 -1
  27. data/example_files/residential/exhaust.tsv +3 -0
  28. data/example_files/residential/heat_pump.tsv +62 -40
  29. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +2 -1
  30. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +116 -0
  31. data/example_files/resources/hpxml-measures/.gitignore +1 -8
  32. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +746 -1236
  33. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +1550 -1215
  34. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -8
  35. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +432 -343
  36. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules.rb +134 -91
  37. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.json +388 -0
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.md +43 -0
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_state_and_monthly_schedule_shift.csv +613 -0
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_state_and_monthly_schedule_shift.csv +613 -0
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +36 -60
  42. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-portable.osw +35 -59
  43. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-whole-home.osw +35 -59
  44. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +35 -59
  45. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +36 -60
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +36 -60
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +41 -65
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +36 -60
  49. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +36 -60
  50. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +36 -60
  51. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +36 -60
  52. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +36 -60
  53. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +36 -60
  54. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +36 -60
  55. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-baseboard.osw +341 -0
  56. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-fan-coil.osw +341 -0
  57. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent-preconditioning.osw +39 -63
  58. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent.osw +39 -63
  59. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +39 -63
  60. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +39 -63
  61. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +39 -63
  62. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-single-family-attached.osw +36 -60
  63. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +36 -61
  64. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +36 -61
  65. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +36 -60
  66. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +36 -61
  67. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +36 -61
  68. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +36 -61
  69. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +36 -61
  70. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +36 -60
  71. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +36 -60
  72. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +36 -60
  73. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +36 -61
  74. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +36 -60
  75. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +37 -61
  76. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +36 -60
  77. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +36 -60
  78. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +36 -60
  79. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +36 -60
  80. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +36 -60
  81. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +36 -60
  82. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +36 -60
  83. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +36 -60
  84. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +36 -60
  85. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +36 -60
  86. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +36 -60
  87. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +36 -60
  88. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +36 -60
  89. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +36 -60
  90. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +36 -60
  91. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +36 -60
  92. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +36 -60
  93. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +36 -60
  94. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +36 -60
  95. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +36 -60
  96. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +36 -60
  97. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +36 -60
  98. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +36 -60
  99. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +36 -60
  100. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +36 -60
  101. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +36 -60
  102. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +36 -60
  103. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +36 -60
  104. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +36 -60
  105. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +36 -60
  106. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +36 -60
  107. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +36 -60
  108. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +36 -60
  109. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +36 -60
  110. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +36 -60
  111. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +36 -60
  112. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +36 -60
  113. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +36 -60
  114. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +36 -60
  115. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +36 -60
  116. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +36 -60
  117. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +36 -60
  118. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +37 -61
  119. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +37 -61
  120. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +36 -60
  121. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +36 -60
  122. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +36 -60
  123. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +36 -60
  124. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +35 -59
  125. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +35 -59
  126. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +35 -59
  127. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +35 -59
  128. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +35 -59
  129. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +337 -0
  130. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +337 -0
  131. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +36 -61
  132. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +36 -60
  133. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +36 -60
  134. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +36 -60
  135. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +36 -60
  136. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +36 -61
  137. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +36 -61
  138. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +36 -60
  139. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +36 -60
  140. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +36 -60
  141. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +36 -61
  142. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +36 -60
  143. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +36 -60
  144. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +36 -62
  145. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +35 -60
  146. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +35 -60
  147. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +35 -59
  148. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +35 -59
  149. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +36 -61
  150. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +36 -60
  151. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +36 -60
  152. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +36 -60
  153. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +37 -61
  154. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +36 -61
  155. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +36 -61
  156. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +37 -62
  157. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +36 -61
  158. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +337 -0
  159. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +36 -60
  160. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +36 -60
  161. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +36 -60
  162. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +36 -60
  163. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +36 -61
  164. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +36 -60
  165. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +36 -60
  166. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +36 -60
  167. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +36 -60
  168. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +336 -0
  169. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +336 -0
  170. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +36 -62
  171. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-plug-loads-additional-multipliers.osw → base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw} +41 -63
  172. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +339 -0
  173. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +339 -0
  174. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +339 -0
  175. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +340 -0
  176. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +340 -0
  177. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +340 -0
  178. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +338 -0
  179. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +338 -0
  180. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +338 -0
  181. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +339 -0
  182. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +338 -0
  183. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +340 -0
  184. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +36 -61
  185. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +36 -61
  186. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +36 -61
  187. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +36 -61
  188. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +37 -62
  189. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +37 -62
  190. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +36 -60
  191. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +37 -62
  192. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +337 -0
  193. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +36 -60
  194. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +36 -60
  195. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +36 -60
  196. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +36 -61
  197. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +36 -61
  198. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +36 -60
  199. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +36 -61
  200. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +36 -60
  201. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +36 -60
  202. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +36 -60
  203. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +45 -69
  204. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +36 -60
  205. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +49 -73
  206. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +337 -0
  207. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-appliances-dehumidifier-50percent.osw → base-location-honolulu-hi.osw} +39 -63
  208. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +36 -60
  209. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +337 -0
  210. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +337 -0
  211. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +36 -60
  212. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +44 -70
  213. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +37 -61
  214. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +36 -60
  215. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +36 -60
  216. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +36 -60
  217. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +337 -0
  218. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +36 -60
  219. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +36 -60
  220. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +36 -60
  221. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +36 -60
  222. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +36 -60
  223. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +34 -58
  224. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +34 -58
  225. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +34 -58
  226. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +36 -60
  227. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +337 -0
  228. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +35 -59
  229. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +36 -60
  230. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-vacancy-6-months.osw → base-schedules-stochastic-vacant.osw} +39 -63
  231. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +36 -60
  232. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +36 -60
  233. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +36 -60
  234. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +36 -60
  235. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +36 -60
  236. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +36 -60
  237. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +36 -60
  238. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +36 -60
  239. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +60 -57
  240. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +36 -60
  241. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +341 -0
  242. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +341 -0
  243. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +341 -0
  244. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +341 -0
  245. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +341 -0
  246. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +341 -0
  247. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +341 -0
  248. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +341 -0
  249. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +341 -0
  250. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +341 -0
  251. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +341 -0
  252. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +341 -0
  253. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +341 -0
  254. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +341 -0
  255. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +341 -0
  256. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +341 -0
  257. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +341 -0
  258. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +341 -0
  259. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +341 -0
  260. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +341 -0
  261. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +341 -0
  262. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +341 -0
  263. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +341 -0
  264. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +341 -0
  265. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +341 -0
  266. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
  267. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +341 -0
  268. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
  269. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +341 -0
  270. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +341 -0
  271. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +341 -0
  272. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
  273. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +341 -0
  274. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
  275. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +341 -0
  276. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
  277. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +341 -0
  278. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
  279. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +341 -0
  280. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
  281. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +341 -0
  282. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +341 -0
  283. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +341 -0
  284. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +341 -0
  285. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +341 -0
  286. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
  287. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +341 -0
  288. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
  289. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +341 -0
  290. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +341 -0
  291. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +341 -0
  292. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
  293. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +341 -0
  294. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
  295. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +341 -0
  296. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
  297. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +341 -0
  298. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
  299. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +341 -0
  300. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
  301. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +341 -0
  302. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +341 -0
  303. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +341 -0
  304. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +341 -0
  305. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +339 -0
  306. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +339 -0
  307. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-flat.osw +339 -0
  308. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-exterior.osw +339 -0
  309. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +339 -0
  310. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-single-exterior-front.osw +339 -0
  311. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +339 -0
  312. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +339 -0
  313. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +339 -0
  314. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +339 -0
  315. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +339 -0
  316. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement.osw +339 -0
  317. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +339 -0
  318. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +339 -0
  319. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +339 -0
  320. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +339 -0
  321. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +339 -0
  322. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +339 -0
  323. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +36 -60
  324. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +337 -0
  325. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +337 -0
  326. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +337 -0
  327. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +36 -60
  328. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +339 -0
  329. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-hot-tub-heater-with-zero-kwh.osw +337 -0
  330. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-pool-heater-with-zero-kwh.osw +337 -0
  331. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +36 -60
  332. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +36 -60
  333. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +336 -0
  334. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +337 -0
  335. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +337 -0
  336. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-second-heating-system-fireplace.osw → extra-second-heating-system-fireplace-to-heating-system.osw} +38 -62
  337. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +337 -0
  338. 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} +36 -60
  339. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +36 -60
  340. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +337 -0
  341. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +337 -0
  342. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +337 -0
  343. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +337 -0
  344. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +337 -0
  345. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +39 -63
  346. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +337 -0
  347. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +36 -60
  348. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +36 -60
  349. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +36 -60
  350. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +36 -60
  351. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +337 -0
  352. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +36 -60
  353. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +39 -63
  354. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +39 -63
  355. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +38 -62
  356. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-fuel-loads.osw +36 -60
  357. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +337 -0
  358. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/{multipliers-without-plug-loads.osw → multipliers-without-tv-plug-loads.osw} +40 -64
  359. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-vehicle-plug-loads.osw +337 -0
  360. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +337 -0
  361. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +36 -60
  362. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +36 -60
  363. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +36 -60
  364. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +337 -0
  365. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +36 -60
  366. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +337 -0
  367. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +36 -60
  368. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +36 -60
  369. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +36 -60
  370. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +36 -60
  371. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-with-shared-system.osw +337 -0
  372. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +36 -60
  373. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +36 -60
  374. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +36 -60
  375. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +36 -60
  376. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +38 -62
  377. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +36 -60
  378. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +337 -0
  379. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/vacant.csv +8761 -0
  380. data/example_files/resources/hpxml-measures/Changelog.md +249 -0
  381. data/example_files/resources/hpxml-measures/Gemfile +3 -4
  382. data/example_files/resources/hpxml-measures/Gemfile.lock +27 -32
  383. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +318 -1283
  384. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +167 -121
  385. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +7 -97
  386. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +600 -203
  387. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +21 -28
  388. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +114 -22
  389. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +112 -177
  390. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +16 -180
  391. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +543 -94
  392. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  393. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +4 -7
  394. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +410 -14
  395. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +27 -25
  396. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +782 -460
  397. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +455 -107
  398. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +1466 -1403
  399. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +1391 -1467
  400. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +2 -1
  401. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +20 -7
  402. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +85 -13
  403. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +4 -26
  404. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +14 -33
  405. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +3 -4
  406. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +43 -7
  407. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +24 -7
  408. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +2 -0
  409. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  410. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +4 -4
  411. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +32 -30
  412. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +6 -29
  413. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +523 -635
  414. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +151 -0
  415. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +3 -1
  416. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +4 -2
  417. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +297 -7
  418. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +0 -1
  419. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -1
  420. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +3 -1
  421. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +3 -1
  422. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +3 -1
  423. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +3 -1
  424. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +26 -3
  425. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +3 -1
  426. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +26 -0
  427. data/example_files/resources/hpxml-measures/README.md +4 -5
  428. data/example_files/resources/hpxml-measures/Rakefile +1 -2
  429. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +140 -47
  430. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.xml +351 -495
  431. data/example_files/resources/hpxml-measures/SimulationOutputReport/tests/output_report_test.rb +260 -189
  432. data/example_files/resources/hpxml-measures/docs/source/conf.py +4 -1
  433. data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +3 -3
  434. data/example_files/resources/hpxml-measures/docs/source/intro.rst +4 -105
  435. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +538 -396
  436. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +158 -130
  437. data/example_files/resources/hpxml-measures/tasks.rb +1497 -736
  438. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3-cache.csv +35 -0
  439. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3.epw +8768 -0
  440. data/example_files/resources/hpxml-measures/weather/USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv +10 -10
  441. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3-cache.csv +35 -0
  442. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3.epw +8768 -0
  443. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3-cache.csv +35 -0
  444. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3.epw +8768 -0
  445. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3-cache.csv +35 -0
  446. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3.epw +8768 -0
  447. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +36 -5
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +4 -3
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +5 -3
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +5 -3
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +535 -0
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +5 -3
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +4 -3
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +4 -3
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +4 -2
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +4 -3
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +4 -3
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +4 -3
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +4 -3
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +6 -5
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +4 -3
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +4 -3
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +4 -3
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +4 -3
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +4 -3
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +4 -3
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +4 -3
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +4 -3
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +4 -3
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +0 -1
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +4 -4
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +3 -5
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +28 -18
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +28 -18
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +0 -1
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +4 -4
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +3 -5
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +3 -5
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +23 -11
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +0 -1
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +4 -4
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +3 -5
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +23 -12
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +23 -12
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +4 -3
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +6 -6
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +4 -3
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +8 -5
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +4 -3
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +4 -3
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +4 -3
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +4 -3
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +4 -3
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +4 -3
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +17 -4
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +1 -2
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +1 -2
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +3 -2
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +564 -564
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +4 -3
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +3 -5
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +3 -2
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +3 -5
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +4 -3
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +1 -2
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +1 -2
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +1 -2
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +1 -2
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +1 -2
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +4 -3
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +4 -3
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +4 -3
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +1 -2
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +4 -3
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +1 -2
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +4 -2
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +4 -3
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +4 -3
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +4 -3
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +4 -3
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +4 -3
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +4 -3
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +4 -3
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +4 -3
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +4 -3
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +4 -3
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +4 -3
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +4 -3
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +4 -3
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +4 -3
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +4 -3
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +4 -3
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +4 -3
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +4 -3
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +4 -3
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +4 -3
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +4 -3
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +4 -3
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +4 -3
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +4 -3
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +4 -3
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +4 -3
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +4 -3
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +4 -3
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +4 -3
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +4 -3
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +4 -3
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +5 -4
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +4 -3
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +4 -3
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +4 -3
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +4 -3
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +4 -3
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +4 -3
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +4 -3
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +4 -3
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +4 -3
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +4 -3
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +5 -4
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +9 -3
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +4 -3
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +601 -0
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +6 -5
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +4 -3
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +22 -21
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2475 -0
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +4 -3
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +4 -3
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-windows-interior-shading.xml → base-enclosure-windows-shading.xml} +577 -561
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +4 -3
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +644 -0
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +4 -3
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +4 -3
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +4 -3
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +6 -5
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +4 -3
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +5 -4
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +5 -4
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +4 -3
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +5 -4
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +4 -3
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +4 -3
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +4 -3
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +556 -0
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +562 -0
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +6 -8
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +6 -5
  588. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +6 -5
  589. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +553 -0
  590. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +558 -0
  591. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-air-to-air-heat-pump-1-speed-manual-s-oversize-allowances.xml} +2 -4
  592. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed.xml +558 -0
  593. 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} +560 -559
  594. 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} +557 -556
  595. 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} +560 -559
  596. 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} +557 -556
  597. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-elec-only-autosize.xml → base-hvac-autosize-boiler-elec-only.xml} +517 -518
  598. 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} +569 -569
  599. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-gas-only-autosize.xml → base-hvac-autosize-boiler-gas-only.xml} +518 -519
  600. 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} +2 -4
  601. 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} +547 -546
  602. 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} +547 -546
  603. 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} +2 -7
  604. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-autosize.xml → base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml} +2 -4
  605. 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} +2 -4
  606. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-elec-resistance-only-autosize.xml → base-hvac-autosize-elec-resistance-only.xml} +508 -509
  607. 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} +553 -552
  608. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-floor-furnace-propane-only-autosize.xml → base-hvac-autosize-floor-furnace-propane-only.xml} +511 -512
  609. 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} +547 -546
  610. 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} +560 -559
  611. 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} +560 -559
  612. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +548 -0
  613. 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} +558 -557
  614. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +555 -0
  615. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +560 -0
  616. 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} +562 -562
  617. 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} +559 -559
  618. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +547 -0
  619. 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} +2 -4
  620. 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} +2 -4
  621. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml} +2 -4
  622. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted.xml +557 -0
  623. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-room-ac-only-autosize.xml → base-hvac-autosize-room-ac-only.xml} +507 -508
  624. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-stove-oil-only-autosize.xml → base-hvac-autosize-stove-oil-only.xml} +511 -512
  625. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-wall-furnace-elec-only-autosize.xml → base-hvac-autosize-wall-furnace-elec-only.xml} +511 -512
  626. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-autosize.xml → base-hvac-autosize.xml} +560 -559
  627. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +1 -2
  628. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +1 -2
  629. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +4 -4
  630. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +1 -2
  631. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +1 -2
  632. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +1 -2
  633. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +1 -2
  634. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +3 -5
  635. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +3 -2
  636. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +3 -2
  637. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +7 -12
  638. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +2 -3
  639. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +5 -7
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +5 -7
  641. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +5 -4
  642. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +5 -4
  643. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +5 -7
  644. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +4 -3
  645. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +1 -2
  646. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +4 -2
  647. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +11 -1
  648. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +1 -4
  649. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +512 -513
  650. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +512 -563
  651. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +512 -513
  652. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +548 -547
  653. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +4 -3
  654. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +3 -2
  655. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +4 -3
  656. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +4 -3
  657. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +548 -550
  658. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +4 -3
  659. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +3 -2
  660. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +3 -2
  661. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +3 -2
  662. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +4 -5
  663. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +557 -0
  664. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +563 -0
  665. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +562 -562
  666. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/slab-zero-exposed-perimeter.xml → base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.xml} +568 -561
  667. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize.xml → base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.xml} +566 -559
  668. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.xml +567 -0
  669. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.xml +567 -0
  670. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-misc-shelter-coefficient.xml → base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.xml} +571 -564
  671. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.xml +572 -0
  672. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.xml +572 -0
  673. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml → base-hvac-install-quality-all-furnace-gas-only.xml} +552 -549
  674. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-ground-to-air-heat-pump.xml +566 -0
  675. 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} +552 -548
  676. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml → base-hvac-install-quality-all-mini-split-heat-pump-ducted.xml} +565 -558
  677. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-blower-efficiency-furnace-gas-central-ac-1-speed.xml +569 -0
  678. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.xml +566 -0
  679. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.xml +570 -0
  680. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +3 -5
  681. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +1 -5
  682. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +3 -5
  683. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +5 -7
  684. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +6 -8
  685. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +3 -7
  686. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +920 -913
  687. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +0 -1
  688. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +512 -563
  689. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +7 -6
  690. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +4 -3
  691. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +1 -2
  692. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +1 -2
  693. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +4 -3
  694. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +512 -513
  695. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +512 -513
  696. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +4 -3
  697. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +4 -3
  698. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +512 -513
  699. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +4 -3
  700. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-detailed.xml +4 -3
  701. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +4 -3
  702. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +4 -3
  703. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +37 -25
  704. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +4 -3
  705. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +37 -25
  706. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +563 -0
  707. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +517 -0
  708. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +4 -3
  709. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +517 -0
  710. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +577 -0
  711. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +4 -3
  712. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +4 -3
  713. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +2 -3
  714. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +11 -1
  715. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +4 -3
  716. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +4 -3
  717. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +4 -3
  718. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +4 -3
  719. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +4 -3
  720. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +4 -3
  721. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +4 -3
  722. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +32 -29
  723. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +4 -3
  724. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +4 -3
  725. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +4 -2
  726. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +5 -4
  727. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +8 -3
  728. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +12 -3
  729. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +4 -3
  730. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +4 -3
  731. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +564 -0
  732. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +8 -3
  733. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1657 -0
  734. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +4 -3
  735. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +564 -0
  736. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +4 -3
  737. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +4 -3
  738. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +4 -3
  739. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +4 -3
  740. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +4 -3
  741. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +4 -3
  742. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +4 -3
  743. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +4 -3
  744. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/boiler-invalid-afue.xml +519 -0
  745. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml +1 -2
  746. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +4 -3
  747. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +4 -3
  748. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +4 -3
  749. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-appliances-dehumidifier-50percent.xml → invalid_files/dehumidifier-fraction-served.xml} +534 -523
  750. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +535 -0
  751. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +1 -2
  752. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-ef-tank.xml +4 -3
  753. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +4 -3
  754. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +4 -3
  755. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +563 -0
  756. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +563 -0
  757. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +4 -3
  758. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +4 -3
  759. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +4 -3
  760. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +4 -3
  761. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +5 -4
  762. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +5 -4
  763. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +7 -6
  764. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +448 -0
  765. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +4 -3
  766. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml +4 -3
  767. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +4 -3
  768. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +4 -3
  769. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +4 -3
  770. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +14 -60
  771. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +760 -0
  772. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +759 -0
  773. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +761 -0
  774. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +759 -0
  775. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +563 -0
  776. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +460 -0
  777. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-output-greater-than-consumption.xml +579 -0
  778. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +3 -5
  779. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +920 -913
  780. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +920 -913
  781. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml +3 -7
  782. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +3 -4
  783. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +3 -4
  784. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +920 -913
  785. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +4 -3
  786. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml +4 -3
  787. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-shared-negative-seer-eq.xml +407 -0
  788. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +563 -0
  789. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +4 -3
  790. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +4 -3
  791. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +4 -3
  792. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +4 -3
  793. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +5 -4
  794. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +4 -3
  795. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +4 -3
  796. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-surfaces.xml +4 -3
  797. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-foundation-wall-properties.xml +574 -0
  798. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id.xml +591 -0
  799. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +591 -0
  800. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +563 -0
  801. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +4 -3
  802. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +4 -3
  803. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +465 -0
  804. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-conditioned-floors.xml +563 -0
  805. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +451 -0
  806. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +3 -5
  807. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml +1 -2
  808. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +4 -3
  809. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +4 -3
  810. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +473 -0
  811. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +4 -3
  812. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +9 -3
  813. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +4 -3
  814. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +916 -909
  815. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +4 -3
  816. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +4 -3
  817. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +4 -3
  818. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-surface.xml +15 -4
  819. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +4 -3
  820. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +1657 -0
  821. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +1657 -0
  822. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-ideal-air.xml → invalid_files/multiple-shared-cooling-systems.xml} +431 -498
  823. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-heating-systems.xml +434 -0
  824. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +5 -4
  825. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +4 -3
  826. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +4 -3
  827. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +3 -2
  828. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +4 -3
  829. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +4 -3
  830. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +4 -3
  831. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +3 -5
  832. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +1 -2
  833. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-fraction-one.xml +571 -0
  834. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +1 -2
  835. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +3 -5
  836. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +1 -2
  837. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +4 -3
  838. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +4 -3
  839. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +4 -3
  840. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +4 -3
  841. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +4 -3
  842. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +6 -5
  843. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml +4 -3
  844. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +4 -3
  845. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +4 -3
  846. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +4 -3
  847. data/example_files/resources/hpxml-measures/workflow/template.osw +5 -1
  848. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +0 -3
  849. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +0 -3
  850. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +0 -3
  851. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +0 -3
  852. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +0 -3
  853. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +0 -3
  854. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +0 -3
  855. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +0 -3
  856. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +0 -3
  857. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +0 -3
  858. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +0 -3
  859. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +0 -3
  860. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +0 -3
  861. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +0 -3
  862. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +0 -3
  863. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +0 -3
  864. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +0 -3
  865. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +0 -3
  866. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +0 -3
  867. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +0 -3
  868. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +0 -3
  869. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +0 -3
  870. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +0 -3
  871. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +0 -3
  872. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +0 -3
  873. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +0 -3
  874. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +294 -0
  875. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +27 -0
  876. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +294 -0
  877. data/example_files/resources/hpxml-measures/workflow/tests/compare.rb +130 -0
  878. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +324 -382
  879. data/example_files/{measures/BuildResidentialModel/resources → resources}/measure-info.json +0 -0
  880. data/example_files/{measures/BuildResidentialModel/resources → resources}/meta_measure.rb +53 -44
  881. data/example_files/visualization/input_visualization_feature.html +13 -14
  882. data/example_files/visualization/input_visualization_scenario.html +14 -9
  883. data/lib/uo_cli.rb +293 -60
  884. data/lib/uo_cli/version.rb +17 -7
  885. data/requirements.txt +2 -0
  886. data/scripts/setup-env-gitbash.sh +4 -4
  887. data/scripts/setup-env-unix.sh +4 -4
  888. data/scripts/setup-env.bat +3 -3
  889. data/scripts/setup-env.ps1 +3 -3
  890. data/uo_cli.gemspec +10 -7
  891. metadata +320 -82
  892. data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.rb +0 -1005
  893. data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.xml +0 -326
  894. data/example_files/measures/ResidentialGeometryCreateMultifamily/tests/create_residential_multifamily_geometry_test.rb +0 -477
  895. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.rb +0 -1039
  896. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.xml +0 -393
  897. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/tests/create_residential_single_family_attached_geometry_test.rb +0 -456
  898. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.rb +0 -979
  899. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.xml +0 -388
  900. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/tests/create_residential_single_family_detached_geometry_test.rb +0 -704
  901. data/example_files/resources/hpxml-measures/.circleci/config.yml +0 -20
  902. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/location.rb +0 -24
  903. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.yml +0 -74
  904. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-hvac-programmable-thermostat.osw +0 -369
  905. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_constructions.rb +0 -109
  906. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple2.xml +0 -835
  907. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml +0 -563
@@ -1,28 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class HotWaterAndAppliances
4
- def self.apply(model, runner, weather, living_space,
5
- cfa, nbeds, ncfl, has_uncond_bsmnt, clothes_washers,
6
- clothes_dryers, dishwashers, refrigerators,
7
- freezers, cooking_ranges, ovens, water_heating,
8
- water_heating_systems, hot_water_distribution, water_fixtures,
4
+ def self.apply(model, runner, hpxml, weather, spaces, hot_water_distribution,
9
5
  solar_thermal_system, eri_version, dhw_map, schedules_file)
10
6
 
11
- # Get appliances
12
- if not clothes_washers.empty?
13
- clothes_washer = clothes_washers[0]
7
+ cfa = hpxml.building_construction.conditioned_floor_area
8
+ nbeds = hpxml.building_construction.number_of_bedrooms
9
+ ncfl = hpxml.building_construction.number_of_conditioned_floors
10
+ has_uncond_bsmnt = hpxml.has_space_type(HPXML::LocationBasementUnconditioned)
11
+ fixtures_usage_multiplier = hpxml.water_heating.water_fixtures_usage_multiplier
12
+ living_space = spaces[HPXML::LocationLivingSpace]
13
+
14
+ # Get appliances, etc.
15
+ if not hpxml.clothes_washers.empty?
16
+ clothes_washer = hpxml.clothes_washers[0]
14
17
  end
15
- if not clothes_dryers.empty?
16
- clothes_dryer = clothes_dryers[0]
18
+ if not hpxml.clothes_dryers.empty?
19
+ clothes_dryer = hpxml.clothes_dryers[0]
17
20
  end
18
- if not dishwashers.empty?
19
- dishwasher = dishwashers[0]
21
+ if not hpxml.dishwashers.empty?
22
+ dishwasher = hpxml.dishwashers[0]
20
23
  end
21
- if not cooking_ranges.empty?
22
- cooking_range = cooking_ranges[0]
24
+ if not hpxml.cooking_ranges.empty?
25
+ cooking_range = hpxml.cooking_ranges[0]
23
26
  end
24
- if not ovens.empty?
25
- oven = ovens[0]
27
+ if not hpxml.ovens.empty?
28
+ oven = hpxml.ovens[0]
26
29
  end
27
30
 
28
31
  # For each water heater (plant loop):
@@ -106,7 +109,7 @@ class HotWaterAndAppliances
106
109
  end
107
110
 
108
111
  # Refrigerator(s) energy
109
- refrigerators.each do |refrigerator|
112
+ hpxml.refrigerators.each do |refrigerator|
110
113
  rf_annual_kwh, rf_frac_sens, rf_frac_lat = calc_refrigerator_or_freezer_energy(refrigerator, refrigerator.additional_properties.space.nil?)
111
114
 
112
115
  if not schedules_file.nil?
@@ -127,7 +130,7 @@ class HotWaterAndAppliances
127
130
  end
128
131
 
129
132
  # Freezer(s) energy
130
- freezers.each do |freezer|
133
+ hpxml.freezers.each do |freezer|
131
134
  fz_annual_kwh, fz_frac_sens, fz_frac_lat = calc_refrigerator_or_freezer_energy(freezer, freezer.additional_properties.space.nil?)
132
135
 
133
136
  if not schedules_file.nil?
@@ -173,7 +176,7 @@ class HotWaterAndAppliances
173
176
 
174
177
  if not hot_water_distribution.nil?
175
178
  fixtures_all_low_flow = true
176
- water_fixtures.each do |water_fixture|
179
+ hpxml.water_fixtures.each do |water_fixture|
177
180
  next unless [HPXML::WaterFixtureTypeShowerhead, HPXML::WaterFixtureTypeFaucet].include? water_fixture.water_fixture_type
178
181
 
179
182
  fixtures_all_low_flow = false if not water_fixture.low_flow
@@ -182,7 +185,7 @@ class HotWaterAndAppliances
182
185
  # Calculate mixed water fractions
183
186
  t_mix = 105.0 # F, Temperature of mixed water at fixtures
184
187
  avg_setpoint_temp = 0.0 # WH Setpoint: Weighted average by fraction DHW load served
185
- water_heating_systems.each do |water_heating_system|
188
+ hpxml.water_heating_systems.each do |water_heating_system|
186
189
  avg_setpoint_temp += water_heating_system.temperature * water_heating_system.fraction_dhw_load_served
187
190
  end
188
191
  daily_wh_inlet_temperatures = calc_water_heater_daily_inlet_temperatures(weather, nbeds, hot_water_distribution, fixtures_all_low_flow)
@@ -210,14 +213,14 @@ class HotWaterAndAppliances
210
213
  end
211
214
  end
212
215
 
213
- water_heating_systems.each do |water_heating_system|
216
+ hpxml.water_heating_systems.each do |water_heating_system|
214
217
  non_solar_fraction = 1.0 - Waterheater.get_water_heater_solar_fraction(water_heating_system, solar_thermal_system)
215
218
 
216
219
  gpd_frac = water_heating_system.fraction_dhw_load_served # Fixtures fraction
217
220
  if gpd_frac > 0
218
221
 
219
- fx_gpd = get_fixtures_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fractions, water_heating.water_fixtures_usage_multiplier)
220
- w_gpd = get_dist_waste_gpd(eri_version, nbeds, has_uncond_bsmnt, cfa, ncfl, hot_water_distribution, fixtures_all_low_flow, water_heating.water_fixtures_usage_multiplier)
222
+ fx_gpd = get_fixtures_gpd(eri_version, nbeds, fixtures_all_low_flow, daily_mw_fractions, fixtures_usage_multiplier)
223
+ w_gpd = get_dist_waste_gpd(eri_version, nbeds, has_uncond_bsmnt, cfa, ncfl, hot_water_distribution, fixtures_all_low_flow, fixtures_usage_multiplier)
221
224
 
222
225
  if not schedules_file.nil?
223
226
  fx_peak_flow = schedules_file.calc_peak_flow_from_daily_gpm(col_name: 'fixtures', daily_water: fx_gpd)
@@ -435,8 +438,7 @@ class HotWaterAndAppliances
435
438
 
436
439
  def self.get_clothes_dryer_default_values(eri_version, fuel_type)
437
440
  if Constants.ERIVersions.index(eri_version) >= Constants.ERIVersions.index('2019A')
438
- return { combined_energy_factor: 3.01,
439
- control_type: HPXML::ClothesDryerControlTypeTimer }
441
+ return { combined_energy_factor: 3.01 }
440
442
  else
441
443
  if fuel_type == HPXML::FuelTypeElectricity
442
444
  return { combined_energy_factor: 2.62,
@@ -43,6 +43,7 @@ XMLHelper.write_file(hpxml.to_oga, "out.xml")
43
43
  '''
44
44
 
45
45
  require_relative 'version'
46
+ require 'ostruct'
46
47
 
47
48
  # FUTURE: Remove all idref attributes, make object attributes instead
48
49
  # E.g., in class Window, :wall_idref => :wall
@@ -51,20 +52,26 @@ class HPXML < Object
51
52
  HPXML_ATTRS = [:header, :site, :neighbor_buildings, :building_occupancy, :building_construction,
52
53
  :climate_and_risk_zones, :air_infiltration_measurements, :attics, :foundations,
53
54
  :roofs, :rim_joists, :walls, :foundation_walls, :frame_floors, :slabs, :windows,
54
- :skylights, :doors, :heating_systems, :cooling_systems, :heat_pumps, :hvac_controls,
55
- :hvac_distributions, :ventilation_fans, :water_heating_systems, :hot_water_distributions,
56
- :water_fixtures, :water_heating, :solar_thermal_systems, :pv_systems, :generators,
57
- :clothes_washers, :clothes_dryers, :dishwashers, :refrigerators, :freezers, :dehumidifiers,
58
- :cooking_ranges, :ovens, :lighting_groups, :lighting, :ceiling_fans, :pools, :hot_tubs,
59
- :plug_loads, :fuel_loads]
55
+ :skylights, :doors, :heating_systems, :cooling_systems, :heat_pumps, :hvac_plant,
56
+ :hvac_controls, :hvac_distributions, :ventilation_fans, :water_heating_systems,
57
+ :hot_water_distributions, :water_fixtures, :water_heating, :solar_thermal_systems,
58
+ :pv_systems, :generators, :clothes_washers, :clothes_dryers, :dishwashers, :refrigerators,
59
+ :freezers, :dehumidifiers, :cooking_ranges, :ovens, :lighting_groups, :lighting,
60
+ :ceiling_fans, :pools, :hot_tubs, :plug_loads, :fuel_loads]
60
61
  attr_reader(*HPXML_ATTRS, :doc, :errors, :warnings)
61
62
 
62
63
  # Constants
64
+ # FUTURE: Move some of these to within child classes (e.g., HPXML::Attic class)
65
+ AirTypeFanCoil = 'fan coil'
66
+ AirTypeGravity = 'gravity'
67
+ AirTypeHighVelocity = 'high velocity'
68
+ AirTypeRegularVelocity = 'regular velocity'
63
69
  AtticTypeCathedral = 'CathedralCeiling'
64
70
  AtticTypeConditioned = 'ConditionedAttic'
65
71
  AtticTypeFlatRoof = 'FlatRoof'
66
72
  AtticTypeUnvented = 'UnventedAttic'
67
73
  AtticTypeVented = 'VentedAttic'
74
+ CertificationEnergyStar = 'Energy Star'
68
75
  ClothesDryerControlTypeMoisture = 'moisture'
69
76
  ClothesDryerControlTypeTimer = 'timer'
70
77
  ColorDark = 'dark'
@@ -89,6 +96,7 @@ class HPXML < Object
89
96
  DuctTypeSupply = 'supply'
90
97
  DWHRFacilitiesConnectedAll = 'all'
91
98
  DWHRFacilitiesConnectedOne = 'one'
99
+ ExteriorShadingTypeSolarScreens = 'solar screens'
92
100
  FoundationTypeAmbient = 'Ambient'
93
101
  FoundationTypeBasementConditioned = 'ConditionedBasement'
94
102
  FoundationTypeBasementUnconditioned = 'UnconditionedBasement'
@@ -127,7 +135,6 @@ class HPXML < Object
127
135
  HVACDistributionTypeAir = 'AirDistribution'
128
136
  HVACDistributionTypeDSE = 'DSE'
129
137
  HVACDistributionTypeHydronic = 'HydronicDistribution'
130
- HVACDistributionTypeHydronicAndAir = 'HydronicAndAirDistribution'
131
138
  HVACTypeBoiler = 'Boiler'
132
139
  HVACTypeCentralAirConditioner = 'central air conditioner'
133
140
  HVACTypeChiller = 'chiller'
@@ -147,12 +154,11 @@ class HPXML < Object
147
154
  HVACTypeRoomAirConditioner = 'room air conditioner'
148
155
  HVACTypeStove = 'Stove'
149
156
  HVACTypeWallFurnace = 'WallFurnace'
150
- HydronicAndAirTypeFanCoil = 'fan coil'
151
- HydronicAndAirTypeWaterLoopHeatPump = 'water loop heat pump'
152
157
  HydronicTypeBaseboard = 'baseboard'
153
158
  HydronicTypeRadiantCeiling = 'radiant ceiling'
154
159
  HydronicTypeRadiantFloor = 'radiant floor'
155
160
  HydronicTypeRadiator = 'radiator'
161
+ HydronicTypeWaterLoop = 'water loop'
156
162
  LeakinessTight = 'tight'
157
163
  LeakinessAverage = 'average'
158
164
  LightingTypeCFL = 'CompactFluorescent'
@@ -181,6 +187,7 @@ class HPXML < Object
181
187
  LocationOutside = 'outside'
182
188
  LocationRoof = 'roof'
183
189
  LocationRoofDeck = 'roof deck'
190
+ LocationUnconditionedSpace = 'unconditioned space'
184
191
  LocationUnderSlab = 'under slab'
185
192
  MechVentTypeBalanced = 'balanced'
186
193
  MechVentTypeCFIS = 'central fan integrated supply'
@@ -217,6 +224,9 @@ class HPXML < Object
217
224
  RoofTypeMetal = 'metal surfacing'
218
225
  RoofTypePlasticRubber = 'plastic/rubber/synthetic sheeting'
219
226
  RoofTypeWoodShingles = 'wood shingles or shakes'
227
+ ShieldingExposed = 'exposed'
228
+ ShieldingNormal = 'normal'
229
+ ShieldingWellShielded = 'well-shielded'
220
230
  SidingTypeAluminum = 'aluminum siding'
221
231
  SidingTypeBrick = 'brick veneer'
222
232
  SidingTypeFiberCement = 'fiber cement siding'
@@ -233,6 +243,8 @@ class HPXML < Object
233
243
  SolarThermalTypeEvacuatedTube = 'evacuated tube'
234
244
  SolarThermalTypeICS = 'integrated collector storage'
235
245
  SolarThermalTypeSingleGlazing = 'single glazing black'
246
+ TypeNone = 'none'
247
+ TypeUnknown = 'unknown'
236
248
  UnitsACH = 'ACH'
237
249
  UnitsACHNatural = 'ACHnatural'
238
250
  UnitsAFUE = 'AFUE'
@@ -267,6 +279,10 @@ class HPXML < Object
267
279
  WaterHeaterTypeTankless = 'instantaneous water heater'
268
280
  WaterHeaterTypeStorage = 'storage water heater'
269
281
  WindowFrameTypeAluminum = 'Aluminum'
282
+ WindowFrameTypeComposite = 'Composite'
283
+ WindowFrameTypeFiberglass = 'Fiberglass'
284
+ WindowFrameTypeMetal = 'Metal'
285
+ WindowFrameTypeVinyl = 'Vinyl'
270
286
  WindowFrameTypeWood = 'Wood'
271
287
  WindowGasAir = 'air'
272
288
  WindowGasArgon = 'argon'
@@ -276,8 +292,13 @@ class HPXML < Object
276
292
  WindowLayersDoublePane = 'double-pane'
277
293
  WindowLayersSinglePane = 'single-pane'
278
294
  WindowLayersTriplePane = 'triple-pane'
295
+ WindowClassArchitectural = 'architectural'
296
+ WindowClassCommercial = 'commercial'
297
+ WindowClassHeavyCommercial = 'heavy commercial'
298
+ WindowClassResidential = 'residential'
299
+ WindowClassLightCommercial = 'light commercial'
279
300
 
280
- def initialize(hpxml_path: nil, schematron_validators: [], collapse_enclosure: true)
301
+ def initialize(hpxml_path: nil, schematron_validators: [], collapse_enclosure: true, building_id: nil)
281
302
  @doc = nil
282
303
  @hpxml_path = hpxml_path
283
304
  @errors = []
@@ -294,6 +315,25 @@ class HPXML < Object
294
315
  # Validate against Schematron docs
295
316
  @errors, @warnings = validate_against_schematron(schematron_validators: schematron_validators)
296
317
  return unless @errors.empty?
318
+
319
+ # Handle multiple buildings
320
+ if XMLHelper.get_elements(hpxml, 'Building').size > 1
321
+ if building_id.nil?
322
+ @errors << 'Multiple Building elements defined in HPXML file; Building ID argument must be provided.'
323
+ return unless @errors.empty?
324
+ end
325
+
326
+ # Discard all Building elements except the one of interest
327
+ XMLHelper.get_elements(hpxml, 'Building').reverse_each do |building|
328
+ next if XMLHelper.get_attribute_value(XMLHelper.get_element(building, 'BuildingID'), 'id') == building_id
329
+
330
+ building.remove
331
+ end
332
+ if XMLHelper.get_elements(hpxml, 'Building').size == 0
333
+ @errors << "Could not find Building element with ID '#{building_id}'."
334
+ return unless @errors.empty?
335
+ end
336
+ end
297
337
  end
298
338
 
299
339
  # Create/populate child objects
@@ -311,6 +351,10 @@ class HPXML < Object
311
351
  end
312
352
  end
313
353
 
354
+ def hvac_systems
355
+ return (@heating_systems + @cooling_systems + @heat_pumps)
356
+ end
357
+
314
358
  def has_space_type(space_type)
315
359
  # Look for surfaces attached to this space type
316
360
  (@roofs + @rim_joists + @walls + @foundation_walls + @frame_floors + @slabs).each do |surface|
@@ -516,6 +560,7 @@ class HPXML < Object
516
560
  @heating_systems.to_oga(@doc)
517
561
  @cooling_systems.to_oga(@doc)
518
562
  @heat_pumps.to_oga(@doc)
563
+ @hvac_plant.to_oga(@doc)
519
564
  @hvac_controls.to_oga(@doc)
520
565
  @hvac_distributions.to_oga(@doc)
521
566
  @ventilation_fans.to_oga(@doc)
@@ -566,6 +611,7 @@ class HPXML < Object
566
611
  @heating_systems = HeatingSystems.new(self, hpxml)
567
612
  @cooling_systems = CoolingSystems.new(self, hpxml)
568
613
  @heat_pumps = HeatPumps.new(self, hpxml)
614
+ @hvac_plant = HVACPlant.new(self, hpxml)
569
615
  @hvac_controls = HVACControls.new(self, hpxml)
570
616
  @hvac_distributions = HVACDistributions.new(self, hpxml)
571
617
  @ventilation_fans = VentilationFans.new(self, hpxml)
@@ -711,7 +757,7 @@ class HPXML < Object
711
757
  :sim_begin_month, :sim_begin_day, :sim_end_month, :sim_end_day, :sim_calendar_year,
712
758
  :dst_enabled, :dst_begin_month, :dst_begin_day, :dst_end_month, :dst_end_day,
713
759
  :use_max_load_for_heat_pumps, :allow_increased_fixed_capacities,
714
- :apply_ashrae140_assumptions, :schedules_path]
760
+ :apply_ashrae140_assumptions, :energystar_calculation_version, :schedules_path]
715
761
  attr_accessor(*ATTRS)
716
762
 
717
763
  def check_for_errors
@@ -752,6 +798,7 @@ class HPXML < Object
752
798
  end
753
799
  end
754
800
  next unless (not end_day.nil?) && (months.include? end_month)
801
+
755
802
  if not valid_days.include? end_day
756
803
  errors << "#{sim_ctl} End Day of Month (#{end_day}) must be one of: #{valid_days.join(', ')}."
757
804
  end
@@ -761,12 +808,14 @@ class HPXML < Object
761
808
  { 'Run Period' => [@sim_begin_month, @sim_begin_day, @sim_end_month, @sim_end_day] }.each do |sim_ctl, months_and_days|
762
809
  begin_month, begin_day, end_month, end_day = months_and_days
763
810
  next unless (not begin_month.nil?) && (not end_month.nil?)
811
+
764
812
  if begin_month > end_month
765
813
  errors << "#{sim_ctl} Begin Month (#{begin_month}) cannot come after #{sim_ctl} End Month (#{end_month})."
766
814
  end
767
815
 
768
816
  next unless (not begin_day.nil?) && (not end_day.nil?)
769
817
  next unless begin_month == end_month
818
+
770
819
  if begin_day > end_day
771
820
  errors << "#{sim_ctl} Begin Day of Month (#{begin_day}) cannot come after #{sim_ctl} End Day of Month (#{end_day}) for the same month (#{begin_month})."
772
821
  end
@@ -802,6 +851,11 @@ class HPXML < Object
802
851
  XMLHelper.add_element(eri_calculation, 'Version', @eri_calculation_version, :string) unless @eri_calculation_version.nil?
803
852
  XMLHelper.add_element(eri_calculation, 'Design', @eri_design, :string) unless @eri_design.nil?
804
853
  end
854
+ if not @energystar_calculation_version.nil?
855
+ extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
856
+ energystar_calculation = XMLHelper.add_element(extension, 'EnergyStarCalculation')
857
+ XMLHelper.add_element(energystar_calculation, 'Version', @energystar_calculation_version, :string) unless @energystar_calculation_version.nil?
858
+ end
805
859
  if (not @timestep.nil?) || (not @sim_begin_month.nil?) || (not @sim_begin_day.nil?) || (not @sim_end_month.nil?) || (not @sim_end_day.nil?) || (not @dst_enabled.nil?) || (not @dst_begin_month.nil?) || (not @dst_begin_day.nil?) || (not @dst_end_month.nil?) || (not @dst_end_day.nil?)
806
860
  extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
807
861
  simulation_control = XMLHelper.add_element(extension, 'SimulationControl')
@@ -856,20 +910,21 @@ class HPXML < Object
856
910
  @software_program_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/SoftwareProgramVersion', :string)
857
911
  @eri_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ERICalculation/Version', :string)
858
912
  @eri_design = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ERICalculation/Design', :string)
859
- @timestep, @timestep_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/SimulationControl/Timestep', :integer)
860
- @sim_begin_month, @sim_begin_month_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginMonth', :integer)
861
- @sim_begin_day, @sim_begin_day_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginDayOfMonth', :integer)
862
- @sim_end_month, @sim_end_month_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/SimulationControl/EndMonth', :integer)
863
- @sim_end_day, @sim_end_day_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/SimulationControl/EndDayOfMonth', :integer)
864
- @sim_calendar_year, @sim_calendar_year_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/SimulationControl/CalendarYear', :integer)
865
- @dst_enabled, @dst_enabled_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/Enabled', :boolean)
866
- @dst_begin_month, @dst_begin_month_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/BeginMonth', :integer)
867
- @dst_begin_day, @dst_begin_day_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/BeginDayOfMonth', :integer)
868
- @dst_end_month, @dst_end_month_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/EndMonth', :integer)
869
- @dst_end_day, @dst_end_day_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/EndDayOfMonth', :integer)
913
+ @energystar_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/EnergyStarCalculation/Version', :string)
914
+ @timestep = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/Timestep', :integer)
915
+ @sim_begin_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginMonth', :integer)
916
+ @sim_begin_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginDayOfMonth', :integer)
917
+ @sim_end_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndMonth', :integer)
918
+ @sim_end_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndDayOfMonth', :integer)
919
+ @sim_calendar_year = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/CalendarYear', :integer)
920
+ @dst_enabled = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/Enabled', :boolean)
921
+ @dst_begin_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/BeginMonth', :integer)
922
+ @dst_begin_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/BeginDayOfMonth', :integer)
923
+ @dst_end_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/EndMonth', :integer)
924
+ @dst_end_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/EndDayOfMonth', :integer)
870
925
  @apply_ashrae140_assumptions = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ApplyASHRAE140Assumptions', :boolean)
871
- @use_max_load_for_heat_pumps, @use_max_load_for_heat_pumps_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/HVACSizingControl/UseMaxLoadForHeatPumps', :boolean)
872
- @allow_increased_fixed_capacities, @allow_increased_fixed_capacities_isdefaulted = XMLHelper.get_value_and_defaulted(hpxml, 'SoftwareInfo/extension/HVACSizingControl/AllowIncreasedFixedCapacities', :boolean)
926
+ @use_max_load_for_heat_pumps = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/UseMaxLoadForHeatPumps', :boolean)
927
+ @allow_increased_fixed_capacities = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/AllowIncreasedFixedCapacities', :boolean)
873
928
  @schedules_path = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/OccupancySchedulesCSVPath', :string)
874
929
  @building_id = HPXML::get_id(hpxml, 'Building/BuildingID')
875
930
  @event_type = XMLHelper.get_value(hpxml, 'Building/ProjectStatus/EventType', :string)
@@ -878,7 +933,7 @@ class HPXML < Object
878
933
  end
879
934
 
880
935
  class Site < BaseElement
881
- ATTRS = [:site_type, :surroundings, :orientation_of_front_of_home, :fuels, :shelter_coefficient]
936
+ ATTRS = [:site_type, :surroundings, :shielding_of_home, :orientation_of_front_of_home, :fuels]
882
937
  attr_accessor(*ATTRS)
883
938
 
884
939
  def check_for_errors
@@ -892,6 +947,7 @@ class HPXML < Object
892
947
  site = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'BuildingSummary', 'Site'])
893
948
  XMLHelper.add_element(site, 'SiteType', @site_type, :string, @site_type_isdefaulted) unless @site_type.nil?
894
949
  XMLHelper.add_element(site, 'Surroundings', @surroundings, :string) unless @surroundings.nil?
950
+ XMLHelper.add_element(site, 'ShieldingofHome', @shielding_of_home, :string, @shielding_of_home_isdefaulted) unless @shielding_of_home.nil?
895
951
  XMLHelper.add_element(site, 'OrientationOfFrontOfHome', @orientation_of_front_of_home, :string) unless @orientation_of_front_of_home.nil?
896
952
  if (not @fuels.nil?) && (not @fuels.empty?)
897
953
  fuel_types_available = XMLHelper.add_element(site, 'FuelTypesAvailable')
@@ -899,7 +955,6 @@ class HPXML < Object
899
955
  XMLHelper.add_element(fuel_types_available, 'Fuel', fuel, :string)
900
956
  end
901
957
  end
902
- XMLHelper.add_extension(site, 'ShelterCoefficient', @shelter_coefficient, :float, shelter_coefficient_isdefaulted) unless @shelter_coefficient.nil?
903
958
  end
904
959
 
905
960
  def from_oga(hpxml)
@@ -908,11 +963,11 @@ class HPXML < Object
908
963
  site = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/BuildingSummary/Site')
909
964
  return if site.nil?
910
965
 
911
- @site_type, @site_type_isdefaulted = XMLHelper.get_value_and_defaulted(site, 'SiteType', :string)
966
+ @site_type = XMLHelper.get_value(site, 'SiteType', :string)
912
967
  @surroundings = XMLHelper.get_value(site, 'Surroundings', :string)
968
+ @shielding_of_home = XMLHelper.get_value(site, 'ShieldingofHome', :string)
913
969
  @orientation_of_front_of_home = XMLHelper.get_value(site, 'OrientationOfFrontOfHome', :string)
914
970
  @fuels = XMLHelper.get_values(site, 'FuelTypesAvailable/Fuel', :string)
915
- @shelter_coefficient, @shelter_coefficient_isdefaulted = XMLHelper.get_value_and_defaulted(site, 'extension/ShelterCoefficient', :float)
916
971
  end
917
972
  end
918
973
 
@@ -980,15 +1035,15 @@ class HPXML < Object
980
1035
  building_occupancy = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/BuildingSummary/BuildingOccupancy')
981
1036
  return if building_occupancy.nil?
982
1037
 
983
- @number_of_residents, @number_of_residents_isdefaulted = XMLHelper.get_value_and_defaulted(building_occupancy, 'NumberofResidents', :float)
1038
+ @number_of_residents = XMLHelper.get_value(building_occupancy, 'NumberofResidents', :float)
984
1039
  end
985
1040
  end
986
1041
 
987
1042
  class BuildingConstruction < BaseElement
988
1043
  ATTRS = [:year_built, :number_of_conditioned_floors, :number_of_conditioned_floors_above_grade,
989
1044
  :average_ceiling_height, :number_of_bedrooms, :number_of_bathrooms,
990
- :conditioned_floor_area, :conditioned_building_volume, :use_only_ideal_air_system,
991
- :residential_facility_type, :has_flue_or_chimney]
1045
+ :conditioned_floor_area, :conditioned_building_volume, :residential_facility_type,
1046
+ :has_flue_or_chimney]
992
1047
  attr_accessor(*ATTRS)
993
1048
 
994
1049
  def check_for_errors
@@ -1000,6 +1055,7 @@ class HPXML < Object
1000
1055
  return if nil?
1001
1056
 
1002
1057
  building_construction = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'BuildingSummary', 'BuildingConstruction'])
1058
+ XMLHelper.add_element(building_construction, 'YearBuilt', @year_built, :integer) unless @year_built.nil?
1003
1059
  XMLHelper.add_element(building_construction, 'ResidentialFacilityType', @residential_facility_type, :string) unless @residential_facility_type.nil?
1004
1060
  XMLHelper.add_element(building_construction, 'NumberofConditionedFloors', @number_of_conditioned_floors, :float) unless @number_of_conditioned_floors.nil?
1005
1061
  XMLHelper.add_element(building_construction, 'NumberofConditionedFloorsAboveGrade', @number_of_conditioned_floors_above_grade, :float) unless @number_of_conditioned_floors_above_grade.nil?
@@ -1008,7 +1064,6 @@ class HPXML < Object
1008
1064
  XMLHelper.add_element(building_construction, 'NumberofBathrooms', @number_of_bathrooms, :integer, @number_of_bathrooms_isdefaulted) unless @number_of_bathrooms.nil?
1009
1065
  XMLHelper.add_element(building_construction, 'ConditionedFloorArea', @conditioned_floor_area, :float) unless @conditioned_floor_area.nil?
1010
1066
  XMLHelper.add_element(building_construction, 'ConditionedBuildingVolume', @conditioned_building_volume, :float, @conditioned_building_volume_isdefaulted) unless @conditioned_building_volume.nil?
1011
- XMLHelper.add_extension(building_construction, 'UseOnlyIdealAirSystem', @use_only_ideal_air_system, :boolean) unless @use_only_ideal_air_system.nil?
1012
1067
  XMLHelper.add_extension(building_construction, 'HasFlueOrChimney', @has_flue_or_chimney, :boolean, @has_flue_or_chimney_isdefaulted) unless @has_flue_or_chimney.nil?
1013
1068
  end
1014
1069
 
@@ -1019,16 +1074,15 @@ class HPXML < Object
1019
1074
  return if building_construction.nil?
1020
1075
 
1021
1076
  @year_built = XMLHelper.get_value(building_construction, 'YearBuilt', :integer)
1077
+ @residential_facility_type = XMLHelper.get_value(building_construction, 'ResidentialFacilityType', :string)
1022
1078
  @number_of_conditioned_floors = XMLHelper.get_value(building_construction, 'NumberofConditionedFloors', :float)
1023
1079
  @number_of_conditioned_floors_above_grade = XMLHelper.get_value(building_construction, 'NumberofConditionedFloorsAboveGrade', :float)
1024
- @average_ceiling_height, @average_ceiling_height_isdefaulted = XMLHelper.get_value_and_defaulted(building_construction, 'AverageCeilingHeight', :float)
1080
+ @average_ceiling_height = XMLHelper.get_value(building_construction, 'AverageCeilingHeight', :float)
1025
1081
  @number_of_bedrooms = XMLHelper.get_value(building_construction, 'NumberofBedrooms', :integer)
1026
- @number_of_bathrooms, @number_of_bathrooms_isdefaulted = XMLHelper.get_value_and_defaulted(building_construction, 'NumberofBathrooms', :integer)
1082
+ @number_of_bathrooms = XMLHelper.get_value(building_construction, 'NumberofBathrooms', :integer)
1027
1083
  @conditioned_floor_area = XMLHelper.get_value(building_construction, 'ConditionedFloorArea', :float)
1028
- @conditioned_building_volume, @conditioned_building_volume_isdefaulted = XMLHelper.get_value_and_defaulted(building_construction, 'ConditionedBuildingVolume', :float)
1029
- @use_only_ideal_air_system = XMLHelper.get_value(building_construction, 'extension/UseOnlyIdealAirSystem', :boolean)
1030
- @residential_facility_type = XMLHelper.get_value(building_construction, 'ResidentialFacilityType', :string)
1031
- @has_flue_or_chimney, @has_flue_or_chimney_isdefaulted = XMLHelper.get_value_and_defaulted(building_construction, 'extension/HasFlueOrChimney', :boolean)
1084
+ @conditioned_building_volume = XMLHelper.get_value(building_construction, 'ConditionedBuildingVolume', :float)
1085
+ @has_flue_or_chimney = XMLHelper.get_value(building_construction, 'extension/HasFlueOrChimney', :boolean)
1032
1086
  end
1033
1087
  end
1034
1088
 
@@ -1096,7 +1150,7 @@ class HPXML < Object
1096
1150
  end
1097
1151
 
1098
1152
  class AirInfiltrationMeasurement < BaseElement
1099
- ATTRS = [:id, :house_pressure, :unit_of_measure, :air_leakage, :effective_leakage_area,
1153
+ ATTRS = [:id, :house_pressure, :unit_of_measure, :air_leakage, :effective_leakage_area, :type,
1100
1154
  :infiltration_volume, :leakiness_description, :infiltration_height, :a_ext]
1101
1155
  attr_accessor(*ATTRS)
1102
1156
 
@@ -1112,7 +1166,9 @@ class HPXML < Object
1112
1166
  air_infiltration_measurement = XMLHelper.add_element(air_infiltration, 'AirInfiltrationMeasurement')
1113
1167
  sys_id = XMLHelper.add_element(air_infiltration_measurement, 'SystemIdentifier')
1114
1168
  XMLHelper.add_attribute(sys_id, 'id', @id)
1169
+ XMLHelper.add_element(air_infiltration_measurement, 'TypeOfInfiltrationMeasurement', @type, :string) unless @type.nil?
1115
1170
  XMLHelper.add_element(air_infiltration_measurement, 'HousePressure', @house_pressure, :float) unless @house_pressure.nil?
1171
+ XMLHelper.add_element(air_infiltration_measurement, 'LeakinessDescription', @leakiness_description, :string) unless @leakiness_description.nil?
1116
1172
  if (not @unit_of_measure.nil?) && (not @air_leakage.nil?)
1117
1173
  building_air_leakage = XMLHelper.add_element(air_infiltration_measurement, 'BuildingAirLeakage')
1118
1174
  XMLHelper.add_element(building_air_leakage, 'UnitofMeasure', @unit_of_measure, :string)
@@ -1128,12 +1184,13 @@ class HPXML < Object
1128
1184
  return if air_infiltration_measurement.nil?
1129
1185
 
1130
1186
  @id = HPXML::get_id(air_infiltration_measurement)
1187
+ @type = XMLHelper.get_value(air_infiltration_measurement, 'TypeOfInfiltrationMeasurement', :string)
1131
1188
  @house_pressure = XMLHelper.get_value(air_infiltration_measurement, 'HousePressure', :float)
1189
+ @leakiness_description = XMLHelper.get_value(air_infiltration_measurement, 'LeakinessDescription', :string)
1132
1190
  @unit_of_measure = XMLHelper.get_value(air_infiltration_measurement, 'BuildingAirLeakage/UnitofMeasure', :string)
1133
1191
  @air_leakage = XMLHelper.get_value(air_infiltration_measurement, 'BuildingAirLeakage/AirLeakage', :float)
1134
1192
  @effective_leakage_area = XMLHelper.get_value(air_infiltration_measurement, 'EffectiveLeakageArea', :float)
1135
- @infiltration_volume, @infiltration_volume_isdefaulted = XMLHelper.get_value_and_defaulted(air_infiltration_measurement, 'InfiltrationVolume', :float)
1136
- @leakiness_description = XMLHelper.get_value(air_infiltration_measurement, 'LeakinessDescription', :string)
1193
+ @infiltration_volume = XMLHelper.get_value(air_infiltration_measurement, 'InfiltrationVolume', :float)
1137
1194
  @infiltration_height = XMLHelper.get_value(air_infiltration_measurement, 'extension/InfiltrationHeight', :float)
1138
1195
  @a_ext = XMLHelper.get_value(air_infiltration_measurement, 'extension/Aext', :float)
1139
1196
  end
@@ -1214,12 +1271,12 @@ class HPXML < Object
1214
1271
  sys_id = XMLHelper.add_element(attic, 'SystemIdentifier')
1215
1272
  XMLHelper.add_attribute(sys_id, 'id', @id)
1216
1273
  if not @attic_type.nil?
1217
- attic_type_e = XMLHelper.add_element(attic, 'AtticType')
1274
+ attic_type_el = XMLHelper.add_element(attic, 'AtticType')
1218
1275
  if @attic_type == AtticTypeUnvented
1219
- attic_type_attic = XMLHelper.add_element(attic_type_e, 'Attic')
1276
+ attic_type_attic = XMLHelper.add_element(attic_type_el, 'Attic')
1220
1277
  XMLHelper.add_element(attic_type_attic, 'Vented', false, :boolean)
1221
1278
  elsif @attic_type == AtticTypeVented
1222
- attic_type_attic = XMLHelper.add_element(attic_type_e, 'Attic')
1279
+ attic_type_attic = XMLHelper.add_element(attic_type_el, 'Attic')
1223
1280
  XMLHelper.add_element(attic_type_attic, 'Vented', true, :boolean)
1224
1281
  if not @vented_attic_sla.nil?
1225
1282
  ventilation_rate = XMLHelper.add_element(attic, 'VentilationRate')
@@ -1231,10 +1288,10 @@ class HPXML < Object
1231
1288
  XMLHelper.add_element(ventilation_rate, 'Value', @vented_attic_ach, :float)
1232
1289
  end
1233
1290
  elsif @attic_type == AtticTypeConditioned
1234
- attic_type_attic = XMLHelper.add_element(attic_type_e, 'Attic')
1291
+ attic_type_attic = XMLHelper.add_element(attic_type_el, 'Attic')
1235
1292
  XMLHelper.add_element(attic_type_attic, 'Conditioned', true, :boolean)
1236
1293
  elsif (@attic_type == AtticTypeFlatRoof) || (@attic_type == AtticTypeCathedral)
1237
- XMLHelper.add_element(attic_type_e, @attic_type)
1294
+ XMLHelper.add_element(attic_type_el, @attic_type)
1238
1295
  else
1239
1296
  fail "Unhandled attic type '#{@attic_type}'."
1240
1297
  end
@@ -1258,7 +1315,7 @@ class HPXML < Object
1258
1315
  @attic_type = AtticTypeCathedral
1259
1316
  end
1260
1317
  if @attic_type == AtticTypeVented
1261
- @vented_attic_sla, @vented_attic_sla_isdefaulted = XMLHelper.get_value_and_defaulted(attic, "VentilationRate[UnitofMeasure='#{UnitsSLA}']/Value", :float)
1318
+ @vented_attic_sla = XMLHelper.get_value(attic, "VentilationRate[UnitofMeasure='#{UnitsSLA}']/Value", :float)
1262
1319
  @vented_attic_ach = XMLHelper.get_value(attic, "VentilationRate[UnitofMeasure='#{UnitsACHNatural}']/Value", :float)
1263
1320
  end
1264
1321
  @within_infiltration_volume = XMLHelper.get_value(attic, 'WithinInfiltrationVolume', :boolean)
@@ -1377,17 +1434,17 @@ class HPXML < Object
1377
1434
  sys_id = XMLHelper.add_element(foundation, 'SystemIdentifier')
1378
1435
  XMLHelper.add_attribute(sys_id, 'id', @id)
1379
1436
  if not @foundation_type.nil?
1380
- foundation_type_e = XMLHelper.add_element(foundation, 'FoundationType')
1437
+ foundation_type_el = XMLHelper.add_element(foundation, 'FoundationType')
1381
1438
  if [FoundationTypeSlab, FoundationTypeAmbient].include? @foundation_type
1382
- XMLHelper.add_element(foundation_type_e, @foundation_type)
1439
+ XMLHelper.add_element(foundation_type_el, @foundation_type)
1383
1440
  elsif @foundation_type == FoundationTypeBasementConditioned
1384
- basement = XMLHelper.add_element(foundation_type_e, 'Basement')
1441
+ basement = XMLHelper.add_element(foundation_type_el, 'Basement')
1385
1442
  XMLHelper.add_element(basement, 'Conditioned', true, :boolean)
1386
1443
  elsif @foundation_type == FoundationTypeBasementUnconditioned
1387
- basement = XMLHelper.add_element(foundation_type_e, 'Basement')
1444
+ basement = XMLHelper.add_element(foundation_type_el, 'Basement')
1388
1445
  XMLHelper.add_element(basement, 'Conditioned', false, :boolean)
1389
1446
  elsif @foundation_type == FoundationTypeCrawlspaceVented
1390
- crawlspace = XMLHelper.add_element(foundation_type_e, 'Crawlspace')
1447
+ crawlspace = XMLHelper.add_element(foundation_type_el, 'Crawlspace')
1391
1448
  XMLHelper.add_element(crawlspace, 'Vented', true, :boolean)
1392
1449
  if not @vented_crawlspace_sla.nil?
1393
1450
  ventilation_rate = XMLHelper.add_element(foundation, 'VentilationRate')
@@ -1395,7 +1452,7 @@ class HPXML < Object
1395
1452
  XMLHelper.add_element(ventilation_rate, 'Value', @vented_crawlspace_sla, :float, @vented_crawlspace_sla_isdefaulted)
1396
1453
  end
1397
1454
  elsif @foundation_type == FoundationTypeCrawlspaceUnvented
1398
- crawlspace = XMLHelper.add_element(foundation_type_e, 'Crawlspace')
1455
+ crawlspace = XMLHelper.add_element(foundation_type_el, 'Crawlspace')
1399
1456
  XMLHelper.add_element(crawlspace, 'Vented', false, :boolean)
1400
1457
  else
1401
1458
  fail "Unhandled foundation type '#{@foundation_type}'."
@@ -1422,7 +1479,7 @@ class HPXML < Object
1422
1479
  @foundation_type = FoundationTypeAmbient
1423
1480
  end
1424
1481
  if @foundation_type == FoundationTypeCrawlspaceVented
1425
- @vented_crawlspace_sla, @vented_crawlspace_sla_isdefaulted = XMLHelper.get_value_and_defaulted(foundation, "VentilationRate[UnitofMeasure='#{UnitsSLA}']/Value", :float)
1482
+ @vented_crawlspace_sla = XMLHelper.get_value(foundation, "VentilationRate[UnitofMeasure='#{UnitsSLA}']/Value", :float)
1426
1483
  end
1427
1484
  @within_infiltration_volume = XMLHelper.get_value(foundation, 'WithinInfiltrationVolume', :boolean)
1428
1485
  @attached_to_slab_idrefs = []
@@ -1455,7 +1512,7 @@ class HPXML < Object
1455
1512
  end
1456
1513
 
1457
1514
  class Roof < BaseElement
1458
- ATTRS = [:id, :interior_adjacent_to, :area, :azimuth, :roof_type,
1515
+ ATTRS = [:id, :interior_adjacent_to, :area, :azimuth, :orientation, :roof_type,
1459
1516
  :roof_color, :solar_absorptance, :emittance, :pitch, :radiant_barrier,
1460
1517
  :insulation_id, :insulation_assembly_r_value, :insulation_cavity_r_value,
1461
1518
  :insulation_continuous_r_value, :radiant_barrier_grade]
@@ -1523,6 +1580,7 @@ class HPXML < Object
1523
1580
  XMLHelper.add_attribute(sys_id, 'id', @id)
1524
1581
  XMLHelper.add_element(roof, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
1525
1582
  XMLHelper.add_element(roof, 'Area', @area, :float) unless @area.nil?
1583
+ XMLHelper.add_element(roof, 'Orientation', @orientation, :string) unless @orientation.nil?
1526
1584
  XMLHelper.add_element(roof, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
1527
1585
  XMLHelper.add_element(roof, 'RoofType', @roof_type, :string, @roof_type_isdefaulted) unless @roof_type.nil?
1528
1586
  XMLHelper.add_element(roof, 'RoofColor', @roof_color, :string, @roof_color_isdefaulted) unless @roof_color.nil?
@@ -1539,6 +1597,16 @@ class HPXML < Object
1539
1597
  XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
1540
1598
  end
1541
1599
  XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', @insulation_assembly_r_value, :float) unless @insulation_assembly_r_value.nil?
1600
+ if not @insulation_cavity_r_value.nil?
1601
+ layer = XMLHelper.add_element(insulation, 'Layer')
1602
+ XMLHelper.add_element(layer, 'InstallationType', 'cavity', :string)
1603
+ XMLHelper.add_element(layer, 'NominalRValue', @insulation_cavity_r_value, :float)
1604
+ end
1605
+ if not @insulation_continuous_r_value.nil?
1606
+ layer = XMLHelper.add_element(insulation, 'Layer')
1607
+ XMLHelper.add_element(layer, 'InstallationType', 'continuous', :string)
1608
+ XMLHelper.add_element(layer, 'NominalRValue', @insulation_continuous_r_value, :float)
1609
+ end
1542
1610
  end
1543
1611
 
1544
1612
  def from_oga(roof)
@@ -1547,13 +1615,14 @@ class HPXML < Object
1547
1615
  @id = HPXML::get_id(roof)
1548
1616
  @interior_adjacent_to = XMLHelper.get_value(roof, 'InteriorAdjacentTo', :string)
1549
1617
  @area = XMLHelper.get_value(roof, 'Area', :float)
1618
+ @orientation = XMLHelper.get_value(roof, 'Orientation', :string)
1550
1619
  @azimuth = XMLHelper.get_value(roof, 'Azimuth', :integer)
1551
- @roof_type, @roof_type_isdefaulted = XMLHelper.get_value_and_defaulted(roof, 'RoofType', :string)
1552
- @roof_color, @roof_color_isdefaulted = XMLHelper.get_value_and_defaulted(roof, 'RoofColor', :string)
1553
- @solar_absorptance, @solar_absorptance_isdefaulted = XMLHelper.get_value_and_defaulted(roof, 'SolarAbsorptance', :float)
1554
- @emittance, @emittance_isdefaulted = XMLHelper.get_value_and_defaulted(roof, 'Emittance', :float)
1620
+ @roof_type = XMLHelper.get_value(roof, 'RoofType', :string)
1621
+ @roof_color = XMLHelper.get_value(roof, 'RoofColor', :string)
1622
+ @solar_absorptance = XMLHelper.get_value(roof, 'SolarAbsorptance', :float)
1623
+ @emittance = XMLHelper.get_value(roof, 'Emittance', :float)
1555
1624
  @pitch = XMLHelper.get_value(roof, 'Pitch', :float)
1556
- @radiant_barrier, @radiant_barrier_isdefaulted = XMLHelper.get_value_and_defaulted(roof, 'RadiantBarrier', :boolean)
1625
+ @radiant_barrier = XMLHelper.get_value(roof, 'RadiantBarrier', :boolean)
1557
1626
  @radiant_barrier_grade = XMLHelper.get_value(roof, 'RadiantBarrierGrade', :integer)
1558
1627
  insulation = XMLHelper.get_element(roof, 'Insulation')
1559
1628
  if not insulation.nil?
@@ -1580,8 +1649,8 @@ class HPXML < Object
1580
1649
  end
1581
1650
 
1582
1651
  class RimJoist < BaseElement
1583
- ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :area, :azimuth, :siding, :color,
1584
- :solar_absorptance, :emittance, :insulation_id, :insulation_assembly_r_value,
1652
+ ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :area, :orientation, :azimuth, :siding,
1653
+ :color, :solar_absorptance, :emittance, :insulation_id, :insulation_assembly_r_value,
1585
1654
  :insulation_cavity_r_value, :insulation_continuous_r_value]
1586
1655
  attr_accessor(*ATTRS)
1587
1656
 
@@ -1628,6 +1697,7 @@ class HPXML < Object
1628
1697
  XMLHelper.add_element(rim_joist, 'ExteriorAdjacentTo', @exterior_adjacent_to, :string) unless @exterior_adjacent_to.nil?
1629
1698
  XMLHelper.add_element(rim_joist, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
1630
1699
  XMLHelper.add_element(rim_joist, 'Area', @area, :float) unless @area.nil?
1700
+ XMLHelper.add_element(rim_joist, 'Orientation', @orientation, :string) unless @orientation.nil?
1631
1701
  XMLHelper.add_element(rim_joist, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
1632
1702
  XMLHelper.add_element(rim_joist, 'Siding', @siding, :string, @siding_isdefaulted) unless @siding.nil?
1633
1703
  XMLHelper.add_element(rim_joist, 'Color', @color, :string, @color_isdefaulted) unless @color.nil?
@@ -1641,6 +1711,16 @@ class HPXML < Object
1641
1711
  XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
1642
1712
  end
1643
1713
  XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', @insulation_assembly_r_value, :float) unless @insulation_assembly_r_value.nil?
1714
+ if not @insulation_cavity_r_value.nil?
1715
+ layer = XMLHelper.add_element(insulation, 'Layer')
1716
+ XMLHelper.add_element(layer, 'InstallationType', 'cavity', :string)
1717
+ XMLHelper.add_element(layer, 'NominalRValue', @insulation_cavity_r_value, :float)
1718
+ end
1719
+ if not @insulation_continuous_r_value.nil?
1720
+ layer = XMLHelper.add_element(insulation, 'Layer')
1721
+ XMLHelper.add_element(layer, 'InstallationType', 'continuous', :string)
1722
+ XMLHelper.add_element(layer, 'NominalRValue', @insulation_continuous_r_value, :float)
1723
+ end
1644
1724
  end
1645
1725
 
1646
1726
  def from_oga(rim_joist)
@@ -1650,11 +1730,12 @@ class HPXML < Object
1650
1730
  @exterior_adjacent_to = XMLHelper.get_value(rim_joist, 'ExteriorAdjacentTo', :string)
1651
1731
  @interior_adjacent_to = XMLHelper.get_value(rim_joist, 'InteriorAdjacentTo', :string)
1652
1732
  @area = XMLHelper.get_value(rim_joist, 'Area', :float)
1733
+ @orientation = XMLHelper.get_value(rim_joist, 'Orientation', :string)
1653
1734
  @azimuth = XMLHelper.get_value(rim_joist, 'Azimuth', :integer)
1654
- @siding, @siding_isdefaulted = XMLHelper.get_value_and_defaulted(rim_joist, 'Siding', :string)
1655
- @color, @color_isdefaulted = XMLHelper.get_value_and_defaulted(rim_joist, 'Color', :string)
1656
- @solar_absorptance, @solar_absorptance_isdefaulted = XMLHelper.get_value_and_defaulted(rim_joist, 'SolarAbsorptance', :float)
1657
- @emittance, @emittance_isdefaulted = XMLHelper.get_value_and_defaulted(rim_joist, 'Emittance', :float)
1735
+ @siding = XMLHelper.get_value(rim_joist, 'Siding', :string)
1736
+ @color = XMLHelper.get_value(rim_joist, 'Color', :string)
1737
+ @solar_absorptance = XMLHelper.get_value(rim_joist, 'SolarAbsorptance', :float)
1738
+ @emittance = XMLHelper.get_value(rim_joist, 'Emittance', :float)
1658
1739
  insulation = XMLHelper.get_element(rim_joist, 'Insulation')
1659
1740
  if not insulation.nil?
1660
1741
  @insulation_id = HPXML::get_id(insulation)
@@ -1756,10 +1837,14 @@ class HPXML < Object
1756
1837
  XMLHelper.add_element(wall, 'ExteriorAdjacentTo', @exterior_adjacent_to, :string) unless @exterior_adjacent_to.nil?
1757
1838
  XMLHelper.add_element(wall, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
1758
1839
  if not @wall_type.nil?
1759
- wall_type_e = XMLHelper.add_element(wall, 'WallType')
1760
- XMLHelper.add_element(wall_type_e, @wall_type)
1840
+ wall_type_el = XMLHelper.add_element(wall, 'WallType')
1841
+ wall_type = XMLHelper.add_element(wall_type_el, @wall_type)
1842
+ if @wall_type == HPXML::WallTypeWoodStud
1843
+ XMLHelper.add_element(wall_type, 'OptimumValueEngineering', @optimum_value_engineering, :boolean) unless @optimum_value_engineering.nil?
1844
+ end
1761
1845
  end
1762
1846
  XMLHelper.add_element(wall, 'Area', @area, :float) unless @area.nil?
1847
+ XMLHelper.add_element(wall, 'Orientation', @orientation, :string) unless @orientation.nil?
1763
1848
  XMLHelper.add_element(wall, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
1764
1849
  XMLHelper.add_element(wall, 'Siding', @siding, :string, @siding_isdefaulted) unless @siding.nil?
1765
1850
  XMLHelper.add_element(wall, 'Color', @color, :string, @color_isdefaulted) unless @color.nil?
@@ -1773,6 +1858,16 @@ class HPXML < Object
1773
1858
  XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
1774
1859
  end
1775
1860
  XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', @insulation_assembly_r_value, :float) unless @insulation_assembly_r_value.nil?
1861
+ if not @insulation_cavity_r_value.nil?
1862
+ layer = XMLHelper.add_element(insulation, 'Layer')
1863
+ XMLHelper.add_element(layer, 'InstallationType', 'cavity', :string)
1864
+ XMLHelper.add_element(layer, 'NominalRValue', @insulation_cavity_r_value, :float)
1865
+ end
1866
+ if not @insulation_continuous_r_value.nil?
1867
+ layer = XMLHelper.add_element(insulation, 'Layer')
1868
+ XMLHelper.add_element(layer, 'InstallationType', 'continuous', :string)
1869
+ XMLHelper.add_element(layer, 'NominalRValue', @insulation_continuous_r_value, :float)
1870
+ end
1776
1871
  end
1777
1872
 
1778
1873
  def from_oga(wall)
@@ -1782,14 +1877,16 @@ class HPXML < Object
1782
1877
  @exterior_adjacent_to = XMLHelper.get_value(wall, 'ExteriorAdjacentTo', :string)
1783
1878
  @interior_adjacent_to = XMLHelper.get_value(wall, 'InteriorAdjacentTo', :string)
1784
1879
  @wall_type = XMLHelper.get_child_name(wall, 'WallType')
1785
- @optimum_value_engineering = XMLHelper.get_value(wall, 'WallType/WoodStud/OptimumValueEngineering', :boolean)
1880
+ if @wall_type == HPXML::WallTypeWoodStud
1881
+ @optimum_value_engineering = XMLHelper.get_value(wall, 'WallType/WoodStud/OptimumValueEngineering', :boolean)
1882
+ end
1786
1883
  @area = XMLHelper.get_value(wall, 'Area', :float)
1787
1884
  @orientation = XMLHelper.get_value(wall, 'Orientation', :string)
1788
1885
  @azimuth = XMLHelper.get_value(wall, 'Azimuth', :integer)
1789
- @siding, @siding_isdefaulted = XMLHelper.get_value_and_defaulted(wall, 'Siding', :string)
1790
- @color, @color_isdefaulted = XMLHelper.get_value_and_defaulted(wall, 'Color', :string)
1791
- @solar_absorptance, @solar_absorptance_isdefaulted = XMLHelper.get_value_and_defaulted(wall, 'SolarAbsorptance', :float)
1792
- @emittance, @emittance_isdefaulted = XMLHelper.get_value_and_defaulted(wall, 'Emittance', :float)
1886
+ @siding = XMLHelper.get_value(wall, 'Siding', :string)
1887
+ @color = XMLHelper.get_value(wall, 'Color', :string)
1888
+ @solar_absorptance = XMLHelper.get_value(wall, 'SolarAbsorptance', :float)
1889
+ @emittance = XMLHelper.get_value(wall, 'Emittance', :float)
1793
1890
  insulation = XMLHelper.get_element(wall, 'Insulation')
1794
1891
  if not insulation.nil?
1795
1892
  @insulation_id = HPXML::get_id(insulation)
@@ -1815,8 +1912,8 @@ class HPXML < Object
1815
1912
  end
1816
1913
 
1817
1914
  class FoundationWall < BaseElement
1818
- ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :height, :area, :azimuth, :thickness,
1819
- :depth_below_grade, :insulation_id, :insulation_r_value, :insulation_interior_r_value,
1915
+ ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :height, :area, :orientation, :azimuth,
1916
+ :thickness, :depth_below_grade, :insulation_id, :insulation_interior_r_value,
1820
1917
  :insulation_interior_distance_to_top, :insulation_interior_distance_to_bottom,
1821
1918
  :insulation_exterior_r_value, :insulation_exterior_distance_to_top,
1822
1919
  :insulation_exterior_distance_to_bottom, :insulation_assembly_r_value,
@@ -1900,6 +1997,7 @@ class HPXML < Object
1900
1997
  XMLHelper.add_element(foundation_wall, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
1901
1998
  XMLHelper.add_element(foundation_wall, 'Height', @height, :float) unless @height.nil?
1902
1999
  XMLHelper.add_element(foundation_wall, 'Area', @area, :float) unless @area.nil?
2000
+ XMLHelper.add_element(foundation_wall, 'Orientation', @orientation, :string) unless @orientation.nil?
1903
2001
  XMLHelper.add_element(foundation_wall, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
1904
2002
  XMLHelper.add_element(foundation_wall, 'Thickness', @thickness, :float, @thickness_isdefaulted) unless @thickness.nil?
1905
2003
  XMLHelper.add_element(foundation_wall, 'DepthBelowGrade', @depth_below_grade, :float) unless @depth_below_grade.nil?
@@ -1935,21 +2033,21 @@ class HPXML < Object
1935
2033
  @interior_adjacent_to = XMLHelper.get_value(foundation_wall, 'InteriorAdjacentTo', :string)
1936
2034
  @height = XMLHelper.get_value(foundation_wall, 'Height', :float)
1937
2035
  @area = XMLHelper.get_value(foundation_wall, 'Area', :float)
2036
+ @orientation = XMLHelper.get_value(foundation_wall, 'Orientation', :string)
1938
2037
  @azimuth = XMLHelper.get_value(foundation_wall, 'Azimuth', :integer)
1939
- @thickness, @thickness_isdefaulted = XMLHelper.get_value_and_defaulted(foundation_wall, 'Thickness', :float)
2038
+ @thickness = XMLHelper.get_value(foundation_wall, 'Thickness', :float)
1940
2039
  @depth_below_grade = XMLHelper.get_value(foundation_wall, 'DepthBelowGrade', :float)
1941
2040
  insulation = XMLHelper.get_element(foundation_wall, 'Insulation')
1942
2041
  if not insulation.nil?
1943
2042
  @insulation_id = HPXML::get_id(insulation)
1944
- @insulation_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue", :float)
2043
+ @insulation_assembly_r_value = XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue', :float)
2044
+ @insulation_continuous_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue", :float)
1945
2045
  @insulation_interior_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/NominalRValue", :float)
1946
2046
  @insulation_interior_distance_to_top = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToTopOfInsulation", :float)
1947
2047
  @insulation_interior_distance_to_bottom = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToBottomOfInsulation", :float)
1948
2048
  @insulation_exterior_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/NominalRValue", :float)
1949
2049
  @insulation_exterior_distance_to_top = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToTopOfInsulation", :float)
1950
2050
  @insulation_exterior_distance_to_bottom = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToBottomOfInsulation", :float)
1951
- @insulation_continuous_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue", :float)
1952
- @insulation_assembly_r_value = XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue', :float)
1953
2051
  end
1954
2052
  end
1955
2053
  end
@@ -2047,6 +2145,16 @@ class HPXML < Object
2047
2145
  XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
2048
2146
  end
2049
2147
  XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', @insulation_assembly_r_value, :float) unless @insulation_assembly_r_value.nil?
2148
+ if not @insulation_cavity_r_value.nil?
2149
+ layer = XMLHelper.add_element(insulation, 'Layer')
2150
+ XMLHelper.add_element(layer, 'InstallationType', 'cavity', :string)
2151
+ XMLHelper.add_element(layer, 'NominalRValue', @insulation_cavity_r_value, :float)
2152
+ end
2153
+ if not @insulation_continuous_r_value.nil?
2154
+ layer = XMLHelper.add_element(insulation, 'Layer')
2155
+ XMLHelper.add_element(layer, 'InstallationType', 'continuous', :string)
2156
+ XMLHelper.add_element(layer, 'NominalRValue', @insulation_continuous_r_value, :float)
2157
+ end
2050
2158
  XMLHelper.add_extension(frame_floor, 'OtherSpaceAboveOrBelow', @other_space_above_or_below, :string) unless @other_space_above_or_below.nil?
2051
2159
  end
2052
2160
 
@@ -2119,13 +2227,6 @@ class HPXML < Object
2119
2227
 
2120
2228
  def check_for_errors
2121
2229
  errors = []
2122
-
2123
- if not @exposed_perimeter.nil?
2124
- if @exposed_perimeter <= 0
2125
- errors << "Exposed perimeter for Slab '#{@id}' must be greater than zero."
2126
- end
2127
- end
2128
-
2129
2230
  return errors
2130
2231
  end
2131
2232
 
@@ -2172,14 +2273,12 @@ class HPXML < Object
2172
2273
  @id = HPXML::get_id(slab)
2173
2274
  @interior_adjacent_to = XMLHelper.get_value(slab, 'InteriorAdjacentTo', :string)
2174
2275
  @area = XMLHelper.get_value(slab, 'Area', :float)
2175
- @thickness, @thickness_isdefaulted = XMLHelper.get_value_and_defaulted(slab, 'Thickness', :float)
2276
+ @thickness = XMLHelper.get_value(slab, 'Thickness', :float)
2176
2277
  @exposed_perimeter = XMLHelper.get_value(slab, 'ExposedPerimeter', :float)
2177
2278
  @perimeter_insulation_depth = XMLHelper.get_value(slab, 'PerimeterInsulationDepth', :float)
2178
2279
  @under_slab_insulation_width = XMLHelper.get_value(slab, 'UnderSlabInsulationWidth', :float)
2179
2280
  @under_slab_insulation_spans_entire_slab = XMLHelper.get_value(slab, 'UnderSlabInsulationSpansEntireSlab', :boolean)
2180
2281
  @depth_below_grade = XMLHelper.get_value(slab, 'DepthBelowGrade', :float)
2181
- @carpet_fraction, @carpet_fraction_isdefaulted = XMLHelper.get_value_and_defaulted(slab, 'extension/CarpetFraction', :float)
2182
- @carpet_r_value, @carpet_r_value_isdefaulted = XMLHelper.get_value_and_defaulted(slab, 'extension/CarpetRValue', :float)
2183
2282
  perimeter_insulation = XMLHelper.get_element(slab, 'PerimeterInsulation')
2184
2283
  if not perimeter_insulation.nil?
2185
2284
  @perimeter_insulation_id = HPXML::get_id(perimeter_insulation)
@@ -2190,6 +2289,8 @@ class HPXML < Object
2190
2289
  @under_slab_insulation_id = HPXML::get_id(under_slab_insulation)
2191
2290
  @under_slab_insulation_r_value = XMLHelper.get_value(under_slab_insulation, 'Layer/NominalRValue', :float)
2192
2291
  end
2292
+ @carpet_fraction = XMLHelper.get_value(slab, 'extension/CarpetFraction', :float)
2293
+ @carpet_r_value = XMLHelper.get_value(slab, 'extension/CarpetRValue', :float)
2193
2294
  end
2194
2295
  end
2195
2296
 
@@ -2210,9 +2311,10 @@ class HPXML < Object
2210
2311
  class Window < BaseElement
2211
2312
  ATTRS = [:id, :area, :azimuth, :orientation, :frame_type, :aluminum_thermal_break, :glass_layers,
2212
2313
  :glass_type, :gas_fill, :ufactor, :shgc, :interior_shading_factor_summer,
2213
- :interior_shading_factor_winter, :exterior_shading, :overhangs_depth,
2314
+ :interior_shading_factor_winter, :interior_shading_type, :exterior_shading_factor_summer,
2315
+ :exterior_shading_factor_winter, :exterior_shading_type, :overhangs_depth,
2214
2316
  :overhangs_distance_to_top_of_window, :overhangs_distance_to_bottom_of_window,
2215
- :fraction_operable, :wall_idref]
2317
+ :fraction_operable, :performance_class, :wall_idref]
2216
2318
  attr_accessor(*ATTRS)
2217
2319
 
2218
2320
  def wall
@@ -2249,12 +2351,6 @@ class HPXML < Object
2249
2351
  def check_for_errors
2250
2352
  errors = []
2251
2353
  begin; wall; rescue StandardError => e; errors << e.message; end
2252
- if (not @overhangs_distance_to_top_of_window.nil?) && (not @overhangs_distance_to_bottom_of_window.nil?)
2253
- if @overhangs_distance_to_bottom_of_window <= @overhangs_distance_to_top_of_window
2254
- errors << "For Window '#{@id}', overhangs distance to bottom (#{@overhangs_distance_to_bottom_of_window}) must be greater than distance to top (#{@overhangs_distance_to_top_of_window})."
2255
- end
2256
- end
2257
-
2258
2354
  return errors
2259
2355
  end
2260
2356
 
@@ -2267,12 +2363,32 @@ class HPXML < Object
2267
2363
  XMLHelper.add_attribute(sys_id, 'id', @id)
2268
2364
  XMLHelper.add_element(window, 'Area', @area, :float) unless @area.nil?
2269
2365
  XMLHelper.add_element(window, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
2366
+ XMLHelper.add_element(window, 'Orientation', @orientation, :string) unless @orientation.nil?
2367
+ if not @frame_type.nil?
2368
+ frame_type_el = XMLHelper.add_element(window, 'FrameType')
2369
+ frame_type = XMLHelper.add_element(frame_type_el, @frame_type)
2370
+ if @frame_type == HPXML::WindowFrameTypeAluminum
2371
+ XMLHelper.add_element(frame_type, 'ThermalBreak', @aluminum_thermal_break, :boolean) unless @aluminum_thermal_break.nil?
2372
+ end
2373
+ end
2374
+ XMLHelper.add_element(window, 'GlassLayers', @glass_layers, :string) unless @glass_layers.nil?
2375
+ XMLHelper.add_element(window, 'GlassType', @glass_type, :string) unless @glass_type.nil?
2376
+ XMLHelper.add_element(window, 'GasFill', @gas_fill, :string) unless @gas_fill.nil?
2270
2377
  XMLHelper.add_element(window, 'UFactor', @ufactor, :float) unless @ufactor.nil?
2271
2378
  XMLHelper.add_element(window, 'SHGC', @shgc, :float) unless @shgc.nil?
2272
- if (not @interior_shading_factor_summer.nil?) || (not @interior_shading_factor_winter.nil?)
2379
+ if (not @exterior_shading_type.nil?) || (not @exterior_shading_factor_summer.nil?) || (not @exterior_shading_factor_winter.nil?)
2380
+ exterior_shading = XMLHelper.add_element(window, 'ExteriorShading')
2381
+ sys_id = XMLHelper.add_element(exterior_shading, 'SystemIdentifier')
2382
+ XMLHelper.add_attribute(sys_id, 'id', "#{id}ExteriorShading")
2383
+ XMLHelper.add_element(exterior_shading, 'Type', @exterior_shading_type, :string) unless @exterior_shading_type.nil?
2384
+ XMLHelper.add_element(exterior_shading, 'SummerShadingCoefficient', @exterior_shading_factor_summer, :float, @exterior_shading_factor_summer_isdefaulted) unless @exterior_shading_factor_summer.nil?
2385
+ XMLHelper.add_element(exterior_shading, 'WinterShadingCoefficient', @exterior_shading_factor_winter, :float, @exterior_shading_factor_winter_isdefaulted) unless @exterior_shading_factor_winter.nil?
2386
+ end
2387
+ if (not @interior_shading_type.nil?) || (not @interior_shading_factor_summer.nil?) || (not @interior_shading_factor_winter.nil?)
2273
2388
  interior_shading = XMLHelper.add_element(window, 'InteriorShading')
2274
2389
  sys_id = XMLHelper.add_element(interior_shading, 'SystemIdentifier')
2275
2390
  XMLHelper.add_attribute(sys_id, 'id', "#{id}InteriorShading")
2391
+ XMLHelper.add_element(interior_shading, 'Type', @interior_shading_type, :string) unless @interior_shading_type.nil?
2276
2392
  XMLHelper.add_element(interior_shading, 'SummerShadingCoefficient', @interior_shading_factor_summer, :float, @interior_shading_factor_summer_isdefaulted) unless @interior_shading_factor_summer.nil?
2277
2393
  XMLHelper.add_element(interior_shading, 'WinterShadingCoefficient', @interior_shading_factor_winter, :float, @interior_shading_factor_winter_isdefaulted) unless @interior_shading_factor_winter.nil?
2278
2394
  end
@@ -2283,6 +2399,7 @@ class HPXML < Object
2283
2399
  XMLHelper.add_element(overhangs, 'DistanceToBottomOfWindow', @overhangs_distance_to_bottom_of_window, :float) unless @overhangs_distance_to_bottom_of_window.nil?
2284
2400
  end
2285
2401
  XMLHelper.add_element(window, 'FractionOperable', @fraction_operable, :float, @fraction_operable_isdefaulted) unless @fraction_operable.nil?
2402
+ XMLHelper.add_element(window, 'PerformanceClass', @performance_class, :string, @performance_class_isdefaulted) unless @performance_class.nil?
2286
2403
  if not @wall_idref.nil?
2287
2404
  attached_to_wall = XMLHelper.add_element(window, 'AttachedToWall')
2288
2405
  XMLHelper.add_attribute(attached_to_wall, 'idref', @wall_idref)
@@ -2297,19 +2414,25 @@ class HPXML < Object
2297
2414
  @azimuth = XMLHelper.get_value(window, 'Azimuth', :integer)
2298
2415
  @orientation = XMLHelper.get_value(window, 'Orientation', :string)
2299
2416
  @frame_type = XMLHelper.get_child_name(window, 'FrameType')
2300
- @aluminum_thermal_break = XMLHelper.get_value(window, 'FrameType/Aluminum/ThermalBreak', :boolean)
2417
+ if not @frame_type.nil?
2418
+ @aluminum_thermal_break = XMLHelper.get_value(window, 'FrameType/Aluminum/ThermalBreak', :boolean)
2419
+ end
2301
2420
  @glass_layers = XMLHelper.get_value(window, 'GlassLayers', :string)
2302
2421
  @glass_type = XMLHelper.get_value(window, 'GlassType', :string)
2303
2422
  @gas_fill = XMLHelper.get_value(window, 'GasFill', :string)
2304
2423
  @ufactor = XMLHelper.get_value(window, 'UFactor', :float)
2305
2424
  @shgc = XMLHelper.get_value(window, 'SHGC', :float)
2306
- @interior_shading_factor_summer, @interior_shading_factor_summer_isdefaulted = XMLHelper.get_value_and_defaulted(window, 'InteriorShading/SummerShadingCoefficient', :float)
2307
- @interior_shading_factor_winter, @interior_shading_factor_winter_isdefaulted = XMLHelper.get_value_and_defaulted(window, 'InteriorShading/WinterShadingCoefficient', :float)
2308
- @exterior_shading = XMLHelper.get_value(window, 'ExteriorShading/Type', :string)
2425
+ @exterior_shading_type = XMLHelper.get_value(window, 'ExteriorShading/Type', :string)
2426
+ @exterior_shading_factor_summer = XMLHelper.get_value(window, 'ExteriorShading/SummerShadingCoefficient', :float)
2427
+ @exterior_shading_factor_winter = XMLHelper.get_value(window, 'ExteriorShading/WinterShadingCoefficient', :float)
2428
+ @interior_shading_type = XMLHelper.get_value(window, 'InteriorShading/Type', :string)
2429
+ @interior_shading_factor_summer = XMLHelper.get_value(window, 'InteriorShading/SummerShadingCoefficient', :float)
2430
+ @interior_shading_factor_winter = XMLHelper.get_value(window, 'InteriorShading/WinterShadingCoefficient', :float)
2309
2431
  @overhangs_depth = XMLHelper.get_value(window, 'Overhangs/Depth', :float)
2310
2432
  @overhangs_distance_to_top_of_window = XMLHelper.get_value(window, 'Overhangs/DistanceToTopOfWindow', :float)
2311
2433
  @overhangs_distance_to_bottom_of_window = XMLHelper.get_value(window, 'Overhangs/DistanceToBottomOfWindow', :float)
2312
- @fraction_operable, @fraction_operable_isdefaulted = XMLHelper.get_value_and_defaulted(window, 'FractionOperable', :float)
2434
+ @fraction_operable = XMLHelper.get_value(window, 'FractionOperable', :float)
2435
+ @performance_class = XMLHelper.get_value(window, 'PerformanceClass', :string)
2313
2436
  @wall_idref = HPXML::get_idref(XMLHelper.get_element(window, 'AttachedToWall'))
2314
2437
  end
2315
2438
  end
@@ -2331,7 +2454,8 @@ class HPXML < Object
2331
2454
  class Skylight < BaseElement
2332
2455
  ATTRS = [:id, :area, :azimuth, :orientation, :frame_type, :aluminum_thermal_break, :glass_layers,
2333
2456
  :glass_type, :gas_fill, :ufactor, :shgc, :interior_shading_factor_summer,
2334
- :interior_shading_factor_winter, :exterior_shading, :roof_idref]
2457
+ :interior_shading_factor_winter, :interior_shading_type, :exterior_shading_factor_summer,
2458
+ :exterior_shading_factor_winter, :exterior_shading_type, :roof_idref]
2335
2459
  attr_accessor(*ATTRS)
2336
2460
 
2337
2461
  def roof
@@ -2380,12 +2504,32 @@ class HPXML < Object
2380
2504
  XMLHelper.add_attribute(sys_id, 'id', @id)
2381
2505
  XMLHelper.add_element(skylight, 'Area', @area, :float) unless @area.nil?
2382
2506
  XMLHelper.add_element(skylight, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
2507
+ XMLHelper.add_element(skylight, 'Orientation', @orientation, :string) unless @orientation.nil?
2508
+ if not @frame_type.nil?
2509
+ frame_type_el = XMLHelper.add_element(skylight, 'FrameType')
2510
+ frame_type = XMLHelper.add_element(frame_type_el, @frame_type)
2511
+ if @frame_type == HPXML::WindowFrameTypeAluminum
2512
+ XMLHelper.add_element(frame_type, 'ThermalBreak', @aluminum_thermal_break, :boolean) unless @aluminum_thermal_break.nil?
2513
+ end
2514
+ end
2515
+ XMLHelper.add_element(skylight, 'GlassLayers', @glass_layers, :string) unless @glass_layers.nil?
2516
+ XMLHelper.add_element(skylight, 'GlassType', @glass_type, :string) unless @glass_type.nil?
2517
+ XMLHelper.add_element(skylight, 'GasFill', @gas_fill, :string) unless @gas_fill.nil?
2383
2518
  XMLHelper.add_element(skylight, 'UFactor', @ufactor, :float) unless @ufactor.nil?
2384
2519
  XMLHelper.add_element(skylight, 'SHGC', @shgc, :float) unless @shgc.nil?
2385
- if (not @interior_shading_factor_summer.nil?) || (not @interior_shading_factor_winter.nil?)
2520
+ if (not @exterior_shading_type.nil?) || (not @exterior_shading_factor_summer.nil?) || (not @exterior_shading_factor_winter.nil?)
2521
+ exterior_shading = XMLHelper.add_element(skylight, 'ExteriorShading')
2522
+ sys_id = XMLHelper.add_element(exterior_shading, 'SystemIdentifier')
2523
+ XMLHelper.add_attribute(sys_id, 'id', "#{id}ExteriorShading")
2524
+ XMLHelper.add_element(exterior_shading, 'Type', @exterior_shading_type, :string) unless @exterior_shading_type.nil?
2525
+ XMLHelper.add_element(exterior_shading, 'SummerShadingCoefficient', @exterior_shading_factor_summer, :float, @exterior_shading_factor_summer_isdefaulted) unless @exterior_shading_factor_summer.nil?
2526
+ XMLHelper.add_element(exterior_shading, 'WinterShadingCoefficient', @exterior_shading_factor_winter, :float, @exterior_shading_factor_winter_isdefaulted) unless @exterior_shading_factor_winter.nil?
2527
+ end
2528
+ if (not @interior_shading_type.nil?) || (not @interior_shading_factor_summer.nil?) || (not @interior_shading_factor_winter.nil?)
2386
2529
  interior_shading = XMLHelper.add_element(skylight, 'InteriorShading')
2387
2530
  sys_id = XMLHelper.add_element(interior_shading, 'SystemIdentifier')
2388
2531
  XMLHelper.add_attribute(sys_id, 'id', "#{id}InteriorShading")
2532
+ XMLHelper.add_element(interior_shading, 'Type', @interior_shading_type, :string) unless @interior_shading_type.nil?
2389
2533
  XMLHelper.add_element(interior_shading, 'SummerShadingCoefficient', @interior_shading_factor_summer, :float, @interior_shading_factor_summer_isdefaulted) unless @interior_shading_factor_summer.nil?
2390
2534
  XMLHelper.add_element(interior_shading, 'WinterShadingCoefficient', @interior_shading_factor_winter, :float, @interior_shading_factor_winter_isdefaulted) unless @interior_shading_factor_winter.nil?
2391
2535
  end
@@ -2409,9 +2553,12 @@ class HPXML < Object
2409
2553
  @gas_fill = XMLHelper.get_value(skylight, 'GasFill', :string)
2410
2554
  @ufactor = XMLHelper.get_value(skylight, 'UFactor', :float)
2411
2555
  @shgc = XMLHelper.get_value(skylight, 'SHGC', :float)
2412
- @interior_shading_factor_summer, @interior_shading_factor_summer_isdefaulted = XMLHelper.get_value_and_defaulted(skylight, 'InteriorShading/SummerShadingCoefficient', :float)
2413
- @interior_shading_factor_winter, @interior_shading_factor_winter_isdefaulted = XMLHelper.get_value_and_defaulted(skylight, 'InteriorShading/WinterShadingCoefficient', :float)
2414
- @exterior_shading = XMLHelper.get_value(skylight, 'ExteriorShading/Type', :string)
2556
+ @exterior_shading_type = XMLHelper.get_value(skylight, 'ExteriorShading/Type', :string)
2557
+ @exterior_shading_factor_summer = XMLHelper.get_value(skylight, 'ExteriorShading/SummerShadingCoefficient', :float)
2558
+ @exterior_shading_factor_winter = XMLHelper.get_value(skylight, 'ExteriorShading/WinterShadingCoefficient', :float)
2559
+ @interior_shading_type = XMLHelper.get_value(skylight, 'InteriorShading/Type', :string)
2560
+ @interior_shading_factor_summer = XMLHelper.get_value(skylight, 'InteriorShading/SummerShadingCoefficient', :float)
2561
+ @interior_shading_factor_winter = XMLHelper.get_value(skylight, 'InteriorShading/WinterShadingCoefficient', :float)
2415
2562
  @roof_idref = HPXML::get_idref(XMLHelper.get_element(skylight, 'AttachedToRoof'))
2416
2563
  end
2417
2564
  end
@@ -2431,7 +2578,7 @@ class HPXML < Object
2431
2578
  end
2432
2579
 
2433
2580
  class Door < BaseElement
2434
- ATTRS = [:id, :wall_idref, :area, :azimuth, :r_value]
2581
+ ATTRS = [:id, :wall_idref, :area, :azimuth, :orientation, :r_value]
2435
2582
  attr_accessor(*ATTRS)
2436
2583
 
2437
2584
  def wall
@@ -2484,6 +2631,7 @@ class HPXML < Object
2484
2631
  end
2485
2632
  XMLHelper.add_element(door, 'Area', @area, :float) unless @area.nil?
2486
2633
  XMLHelper.add_element(door, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
2634
+ XMLHelper.add_element(door, 'Orientation', @orientation, :string) unless @orientation.nil?
2487
2635
  XMLHelper.add_element(door, 'RValue', @r_value, :float) unless @r_value.nil?
2488
2636
  end
2489
2637
 
@@ -2494,6 +2642,7 @@ class HPXML < Object
2494
2642
  @wall_idref = HPXML::get_idref(XMLHelper.get_element(door, 'AttachedToWall'))
2495
2643
  @area = XMLHelper.get_value(door, 'Area', :float)
2496
2644
  @azimuth = XMLHelper.get_value(door, 'Azimuth', :integer)
2645
+ @orientation = XMLHelper.get_value(door, 'Orientation', :string)
2497
2646
  @r_value = XMLHelper.get_value(door, 'RValue', :float)
2498
2647
  end
2499
2648
  end
@@ -2520,9 +2669,10 @@ class HPXML < Object
2520
2669
  ATTRS = [:id, :distribution_system_idref, :year_installed, :heating_system_type,
2521
2670
  :heating_system_fuel, :heating_capacity, :heating_efficiency_afue,
2522
2671
  :heating_efficiency_percent, :fraction_heat_load_served, :electric_auxiliary_energy,
2523
- :energy_star, :seed_id, :is_shared_system, :number_of_units_served,
2524
- :shared_loop_watts, :fan_coil_watts, :wlhp_heating_efficiency_cop, :fan_watts_per_cfm,
2525
- :fan_watts]
2672
+ :third_party_certification, :seed_id, :is_shared_system, :number_of_units_served,
2673
+ :shared_loop_watts, :shared_loop_motor_efficiency, :fan_coil_watts, :fan_watts_per_cfm,
2674
+ :fan_power_not_tested, :airflow_defect_ratio, :airflow_not_tested,
2675
+ :fan_watts, :heating_airflow_cfm, :location]
2526
2676
  attr_accessor(*ATTRS)
2527
2677
 
2528
2678
  def distribution_system
@@ -2569,6 +2719,9 @@ class HPXML < Object
2569
2719
  heating_system = XMLHelper.add_element(hvac_plant, 'HeatingSystem')
2570
2720
  sys_id = XMLHelper.add_element(heating_system, 'SystemIdentifier')
2571
2721
  XMLHelper.add_attribute(sys_id, 'id', @id)
2722
+ XMLHelper.add_element(heating_system, 'UnitLocation', @location, :string) unless @location.nil?
2723
+ XMLHelper.add_element(heating_system, 'YearInstalled', @year_installed, :integer) unless @year_installed.nil?
2724
+ XMLHelper.add_element(heating_system, 'ThirdPartyCertification', @third_party_certification, :string) unless @third_party_certification.nil?
2572
2725
  if not @distribution_system_idref.nil?
2573
2726
  distribution_system = XMLHelper.add_element(heating_system, 'DistributionSystem')
2574
2727
  XMLHelper.add_attribute(distribution_system, 'idref', @distribution_system_idref)
@@ -2576,11 +2729,11 @@ class HPXML < Object
2576
2729
  XMLHelper.add_element(heating_system, 'IsSharedSystem', @is_shared_system, :boolean) unless @is_shared_system.nil?
2577
2730
  XMLHelper.add_element(heating_system, 'NumberofUnitsServed', @number_of_units_served, :integer) unless @number_of_units_served.nil?
2578
2731
  if not @heating_system_type.nil?
2579
- heating_system_type_e = XMLHelper.add_element(heating_system, 'HeatingSystemType')
2580
- XMLHelper.add_element(heating_system_type_e, @heating_system_type)
2732
+ heating_system_type_el = XMLHelper.add_element(heating_system, 'HeatingSystemType')
2733
+ XMLHelper.add_element(heating_system_type_el, @heating_system_type)
2581
2734
  end
2582
2735
  XMLHelper.add_element(heating_system, 'HeatingSystemFuel', @heating_system_fuel, :string) unless @heating_system_fuel.nil?
2583
- XMLHelper.add_element(heating_system, 'HeatingCapacity', @heating_capacity, :float) unless @heating_capacity.nil?
2736
+ XMLHelper.add_element(heating_system, 'HeatingCapacity', @heating_capacity, :float, @heating_capacity_isdefaulted) unless @heating_capacity.nil?
2584
2737
 
2585
2738
  efficiency_units = nil
2586
2739
  efficiency_value = nil
@@ -2596,27 +2749,28 @@ class HPXML < Object
2596
2749
  XMLHelper.add_element(annual_efficiency, 'Units', efficiency_units, :string)
2597
2750
  XMLHelper.add_element(annual_efficiency, 'Value', efficiency_value, :float)
2598
2751
  end
2599
- XMLHelper.add_element(heating_system, 'FractionHeatLoadServed', @fraction_heat_load_served, :float) unless @fraction_heat_load_served.nil?
2752
+ XMLHelper.add_element(heating_system, 'FractionHeatLoadServed', @fraction_heat_load_served, :float, @fraction_heat_load_served_isdefaulted) unless @fraction_heat_load_served.nil?
2600
2753
  XMLHelper.add_element(heating_system, 'ElectricAuxiliaryEnergy', @electric_auxiliary_energy, :float, @electric_auxiliary_energy_isdefaulted) unless @electric_auxiliary_energy.nil?
2601
2754
  XMLHelper.add_extension(heating_system, 'SharedLoopWatts', @shared_loop_watts, :float) unless @shared_loop_watts.nil?
2755
+ XMLHelper.add_extension(heating_system, 'SharedLoopMotorEfficiency', @shared_loop_motor_efficiency, :float) unless @shared_loop_motor_efficiency.nil?
2602
2756
  XMLHelper.add_extension(heating_system, 'FanCoilWatts', @fan_coil_watts, :float) unless @fan_coil_watts.nil?
2603
2757
  XMLHelper.add_extension(heating_system, 'FanPowerWattsPerCFM', @fan_watts_per_cfm, :float, @fan_watts_per_cfm_isdefaulted) unless @fan_watts_per_cfm.nil?
2604
2758
  XMLHelper.add_extension(heating_system, 'FanPowerWatts', @fan_watts, :float, @fan_watts_isdefaulted) unless @fan_watts.nil?
2759
+ XMLHelper.add_extension(heating_system, 'FanPowerNotTested', @fan_power_not_tested, :boolean) unless @fan_power_not_tested.nil?
2760
+ XMLHelper.add_extension(heating_system, 'AirflowDefectRatio', @airflow_defect_ratio, :float, @airflow_defect_ratio_isdefaulted) unless @airflow_defect_ratio.nil?
2761
+ XMLHelper.add_extension(heating_system, 'AirflowNotTested', @airflow_not_tested, :boolean) unless @airflow_not_tested.nil?
2762
+ XMLHelper.add_extension(heating_system, 'HeatingAirflowCFM', @heating_airflow_cfm, :float, @heating_airflow_cfm_isdefaulted) unless @heating_airflow_cfm.nil?
2605
2763
  XMLHelper.add_extension(heating_system, 'SeedId', @seed_id, :string) unless @seed_id.nil?
2606
- if not @wlhp_heating_efficiency_cop.nil?
2607
- wlhp = XMLHelper.create_elements_as_needed(heating_system, ['extension', 'WaterLoopHeatPump'])
2608
- annual_efficiency = XMLHelper.add_element(wlhp, 'AnnualHeatingEfficiency')
2609
- XMLHelper.add_element(annual_efficiency, 'Units', UnitsCOP, :string)
2610
- XMLHelper.add_element(annual_efficiency, 'Value', @wlhp_heating_efficiency_cop, :float)
2611
- end
2612
2764
  end
2613
2765
 
2614
2766
  def from_oga(heating_system)
2615
2767
  return if heating_system.nil?
2616
2768
 
2617
2769
  @id = HPXML::get_id(heating_system)
2618
- @distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(heating_system, 'DistributionSystem'))
2770
+ @location = XMLHelper.get_value(heating_system, 'UnitLocation', :string)
2619
2771
  @year_installed = XMLHelper.get_value(heating_system, 'YearInstalled', :integer)
2772
+ @third_party_certification = XMLHelper.get_value(heating_system, 'ThirdPartyCertification', :string)
2773
+ @distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(heating_system, 'DistributionSystem'))
2620
2774
  @is_shared_system = XMLHelper.get_value(heating_system, 'IsSharedSystem', :boolean)
2621
2775
  @number_of_units_served = XMLHelper.get_value(heating_system, 'NumberofUnitsServed', :integer)
2622
2776
  @heating_system_type = XMLHelper.get_child_name(heating_system, 'HeatingSystemType')
@@ -2628,14 +2782,17 @@ class HPXML < Object
2628
2782
  @heating_efficiency_percent = XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='Percent']/Value", :float)
2629
2783
  end
2630
2784
  @fraction_heat_load_served = XMLHelper.get_value(heating_system, 'FractionHeatLoadServed', :float)
2631
- @electric_auxiliary_energy, @electric_auxiliary_energy_isdefaulted = XMLHelper.get_value_and_defaulted(heating_system, 'ElectricAuxiliaryEnergy', :float)
2632
- @energy_star = XMLHelper.get_values(heating_system, 'ThirdPartyCertification', :string).include?('Energy Star')
2633
- @seed_id = XMLHelper.get_value(heating_system, 'extension/SeedId', :string)
2634
- @fan_watts_per_cfm, @fan_watts_per_cfm_isdefaulted = XMLHelper.get_value_and_defaulted(heating_system, 'extension/FanPowerWattsPerCFM', :float)
2635
- @fan_watts, @fan_watts_isdefaulted = XMLHelper.get_value_and_defaulted(heating_system, 'extension/FanPowerWatts', :float)
2785
+ @electric_auxiliary_energy = XMLHelper.get_value(heating_system, 'ElectricAuxiliaryEnergy', :float)
2636
2786
  @shared_loop_watts = XMLHelper.get_value(heating_system, 'extension/SharedLoopWatts', :float)
2787
+ @shared_loop_motor_efficiency = XMLHelper.get_value(heating_system, 'extension/SharedLoopMotorEfficiency', :float)
2637
2788
  @fan_coil_watts = XMLHelper.get_value(heating_system, 'extension/FanCoilWatts', :float)
2638
- @wlhp_heating_efficiency_cop = XMLHelper.get_value(heating_system, "extension/WaterLoopHeatPump/AnnualHeatingEfficiency[Units='#{UnitsCOP}']/Value", :float)
2789
+ @fan_watts_per_cfm = XMLHelper.get_value(heating_system, 'extension/FanPowerWattsPerCFM', :float)
2790
+ @fan_watts = XMLHelper.get_value(heating_system, 'extension/FanPowerWatts', :float)
2791
+ @fan_power_not_tested = XMLHelper.get_value(heating_system, 'extension/FanPowerNotTested', :boolean)
2792
+ @airflow_defect_ratio = XMLHelper.get_value(heating_system, 'extension/AirflowDefectRatio', :float)
2793
+ @airflow_not_tested = XMLHelper.get_value(heating_system, 'extension/AirflowNotTested', :boolean)
2794
+ @heating_airflow_cfm = XMLHelper.get_value(heating_system, 'extension/HeatingAirflowCFM', :float)
2795
+ @seed_id = XMLHelper.get_value(heating_system, 'extension/SeedId', :string)
2639
2796
  end
2640
2797
  end
2641
2798
 
@@ -2661,9 +2818,10 @@ class HPXML < Object
2661
2818
  ATTRS = [:id, :distribution_system_idref, :year_installed, :cooling_system_type,
2662
2819
  :cooling_system_fuel, :cooling_capacity, :compressor_type, :fraction_cool_load_served,
2663
2820
  :cooling_efficiency_seer, :cooling_efficiency_eer, :cooling_efficiency_kw_per_ton,
2664
- :cooling_shr, :energy_star, :seed_id, :is_shared_system,
2665
- :number_of_units_served, :shared_loop_watts, :fan_coil_watts, :wlhp_cooling_capacity,
2666
- :wlhp_cooling_efficiency_eer, :fan_watts_per_cfm]
2821
+ :cooling_shr, :third_party_certification, :seed_id, :is_shared_system, :number_of_units_served,
2822
+ :shared_loop_watts, :shared_loop_motor_efficiency, :fan_coil_watts, :airflow_defect_ratio,
2823
+ :fan_watts_per_cfm, :fan_power_not_tested, :airflow_not_tested, :charge_defect_ratio,
2824
+ :charge_not_tested, :cooling_airflow_cfm, :location]
2667
2825
  attr_accessor(*ATTRS)
2668
2826
 
2669
2827
  def distribution_system
@@ -2710,6 +2868,9 @@ class HPXML < Object
2710
2868
  cooling_system = XMLHelper.add_element(hvac_plant, 'CoolingSystem')
2711
2869
  sys_id = XMLHelper.add_element(cooling_system, 'SystemIdentifier')
2712
2870
  XMLHelper.add_attribute(sys_id, 'id', @id)
2871
+ XMLHelper.add_element(cooling_system, 'UnitLocation', @location, :string) unless @location.nil?
2872
+ XMLHelper.add_element(cooling_system, 'YearInstalled', @year_installed, :integer) unless @year_installed.nil?
2873
+ XMLHelper.add_element(cooling_system, 'ThirdPartyCertification', @third_party_certification, :string) unless @third_party_certification.nil?
2713
2874
  if not @distribution_system_idref.nil?
2714
2875
  distribution_system = XMLHelper.add_element(cooling_system, 'DistributionSystem')
2715
2876
  XMLHelper.add_attribute(distribution_system, 'idref', @distribution_system_idref)
@@ -2718,9 +2879,9 @@ class HPXML < Object
2718
2879
  XMLHelper.add_element(cooling_system, 'NumberofUnitsServed', @number_of_units_served, :integer) unless @number_of_units_served.nil?
2719
2880
  XMLHelper.add_element(cooling_system, 'CoolingSystemType', @cooling_system_type, :string) unless @cooling_system_type.nil?
2720
2881
  XMLHelper.add_element(cooling_system, 'CoolingSystemFuel', @cooling_system_fuel, :string) unless @cooling_system_fuel.nil?
2721
- XMLHelper.add_element(cooling_system, 'CoolingCapacity', @cooling_capacity, :float) unless @cooling_capacity.nil?
2882
+ XMLHelper.add_element(cooling_system, 'CoolingCapacity', @cooling_capacity, :float, @cooling_capacity_isdefaulted) unless @cooling_capacity.nil?
2722
2883
  XMLHelper.add_element(cooling_system, 'CompressorType', @compressor_type, :string, @compressor_type_isdefaulted) unless @compressor_type.nil?
2723
- XMLHelper.add_element(cooling_system, 'FractionCoolLoadServed', @fraction_cool_load_served, :float) unless @fraction_cool_load_served.nil?
2884
+ XMLHelper.add_element(cooling_system, 'FractionCoolLoadServed', @fraction_cool_load_served, :float, @fraction_cool_load_served_isdefaulted) unless @fraction_cool_load_served.nil?
2724
2885
 
2725
2886
  efficiency_units = nil
2726
2887
  efficiency_value = nil
@@ -2740,33 +2901,33 @@ class HPXML < Object
2740
2901
  XMLHelper.add_element(annual_efficiency, 'Value', efficiency_value, :float)
2741
2902
  end
2742
2903
  XMLHelper.add_element(cooling_system, 'SensibleHeatFraction', @cooling_shr, :float, @cooling_shr_isdefaulted) unless @cooling_shr.nil?
2904
+ XMLHelper.add_extension(cooling_system, 'AirflowDefectRatio', @airflow_defect_ratio, :float, @airflow_defect_ratio_isdefaulted) unless @airflow_defect_ratio.nil?
2905
+ XMLHelper.add_extension(cooling_system, 'ChargeDefectRatio', @charge_defect_ratio, :float, @charge_defect_ratio_isdefaulted) unless @charge_defect_ratio.nil?
2906
+ XMLHelper.add_extension(cooling_system, 'ChargeNotTested', @charge_not_tested, :boolean) unless @charge_not_tested.nil?
2743
2907
  XMLHelper.add_extension(cooling_system, 'FanPowerWattsPerCFM', @fan_watts_per_cfm, :float, @fan_watts_per_cfm_isdefaulted) unless @fan_watts_per_cfm.nil?
2908
+ XMLHelper.add_extension(cooling_system, 'FanPowerNotTested', @fan_power_not_tested, :boolean) unless @fan_power_not_tested.nil?
2909
+ XMLHelper.add_extension(cooling_system, 'AirflowNotTested', @airflow_not_tested, :boolean) unless @airflow_not_tested.nil?
2910
+ XMLHelper.add_extension(cooling_system, 'CoolingAirflowCFM', @cooling_airflow_cfm, :float, @cooling_airflow_cfm_isdefaulted) unless @cooling_airflow_cfm.nil?
2744
2911
  XMLHelper.add_extension(cooling_system, 'SharedLoopWatts', @shared_loop_watts, :float) unless @shared_loop_watts.nil?
2912
+ XMLHelper.add_extension(cooling_system, 'SharedLoopMotorEfficiency', @shared_loop_motor_efficiency, :float) unless @shared_loop_motor_efficiency.nil?
2745
2913
  XMLHelper.add_extension(cooling_system, 'FanCoilWatts', @fan_coil_watts, :float) unless @fan_coil_watts.nil?
2746
2914
  XMLHelper.add_extension(cooling_system, 'SeedId', @seed_id, :string) unless @seed_id.nil?
2747
- if (not @wlhp_cooling_capacity.nil?) || (not @wlhp_cooling_efficiency_eer.nil?)
2748
- wlhp = XMLHelper.create_elements_as_needed(cooling_system, ['extension', 'WaterLoopHeatPump'])
2749
- XMLHelper.add_element(wlhp, 'CoolingCapacity', @wlhp_cooling_capacity, :float) unless @wlhp_cooling_capacity.nil?
2750
- if not @wlhp_cooling_efficiency_eer.nil?
2751
- annual_efficiency = XMLHelper.add_element(wlhp, 'AnnualCoolingEfficiency')
2752
- XMLHelper.add_element(annual_efficiency, 'Units', UnitsEER, :string)
2753
- XMLHelper.add_element(annual_efficiency, 'Value', @wlhp_cooling_efficiency_eer, :float)
2754
- end
2755
- end
2756
2915
  end
2757
2916
 
2758
2917
  def from_oga(cooling_system)
2759
2918
  return if cooling_system.nil?
2760
2919
 
2761
2920
  @id = HPXML::get_id(cooling_system)
2762
- @distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(cooling_system, 'DistributionSystem'))
2921
+ @location = XMLHelper.get_value(cooling_system, 'UnitLocation', :string)
2763
2922
  @year_installed = XMLHelper.get_value(cooling_system, 'YearInstalled', :integer)
2923
+ @third_party_certification = XMLHelper.get_value(cooling_system, 'ThirdPartyCertification', :string)
2924
+ @distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(cooling_system, 'DistributionSystem'))
2764
2925
  @is_shared_system = XMLHelper.get_value(cooling_system, 'IsSharedSystem', :boolean)
2765
2926
  @number_of_units_served = XMLHelper.get_value(cooling_system, 'NumberofUnitsServed', :integer)
2766
2927
  @cooling_system_type = XMLHelper.get_value(cooling_system, 'CoolingSystemType', :string)
2767
2928
  @cooling_system_fuel = XMLHelper.get_value(cooling_system, 'CoolingSystemFuel', :string)
2768
2929
  @cooling_capacity = XMLHelper.get_value(cooling_system, 'CoolingCapacity', :float)
2769
- @compressor_type, @compressor_type_isdefaulted = XMLHelper.get_value_and_defaulted(cooling_system, 'CompressorType', :string)
2930
+ @compressor_type = XMLHelper.get_value(cooling_system, 'CompressorType', :string)
2770
2931
  @fraction_cool_load_served = XMLHelper.get_value(cooling_system, 'FractionCoolLoadServed', :float)
2771
2932
  if [HVACTypeCentralAirConditioner, HVACTypeMiniSplitAirConditioner].include? @cooling_system_type
2772
2933
  @cooling_efficiency_seer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsSEER}']/Value", :float)
@@ -2775,14 +2936,18 @@ class HPXML < Object
2775
2936
  elsif [HVACTypeChiller].include? @cooling_system_type
2776
2937
  @cooling_efficiency_kw_per_ton = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsKwPerTon}']/Value", :float)
2777
2938
  end
2778
- @cooling_shr, @cooling_shr_isdefaulted = XMLHelper.get_value_and_defaulted(cooling_system, 'SensibleHeatFraction', :float)
2779
- @energy_star = XMLHelper.get_values(cooling_system, 'ThirdPartyCertification', :string).include?('Energy Star')
2780
- @seed_id = XMLHelper.get_value(cooling_system, 'extension/SeedId', :string)
2781
- @fan_watts_per_cfm, @fan_watts_per_cfm_isdefaulted = XMLHelper.get_value_and_defaulted(cooling_system, 'extension/FanPowerWattsPerCFM', :float)
2939
+ @cooling_shr = XMLHelper.get_value(cooling_system, 'SensibleHeatFraction', :float)
2940
+ @airflow_defect_ratio = XMLHelper.get_value(cooling_system, 'extension/AirflowDefectRatio', :float)
2941
+ @charge_defect_ratio = XMLHelper.get_value(cooling_system, 'extension/ChargeDefectRatio', :float)
2942
+ @charge_not_tested = XMLHelper.get_value(cooling_system, 'extension/ChargeNotTested', :boolean)
2943
+ @fan_watts_per_cfm = XMLHelper.get_value(cooling_system, 'extension/FanPowerWattsPerCFM', :float)
2944
+ @fan_power_not_tested = XMLHelper.get_value(cooling_system, 'extension/FanPowerNotTested', :boolean)
2945
+ @airflow_not_tested = XMLHelper.get_value(cooling_system, 'extension/AirflowNotTested', :boolean)
2946
+ @cooling_airflow_cfm = XMLHelper.get_value(cooling_system, 'extension/CoolingAirflowCFM', :float)
2782
2947
  @shared_loop_watts = XMLHelper.get_value(cooling_system, 'extension/SharedLoopWatts', :float)
2948
+ @shared_loop_motor_efficiency = XMLHelper.get_value(cooling_system, 'extension/SharedLoopMotorEfficiency', :float)
2783
2949
  @fan_coil_watts = XMLHelper.get_value(cooling_system, 'extension/FanCoilWatts', :float)
2784
- @wlhp_cooling_capacity = XMLHelper.get_value(cooling_system, 'extension/WaterLoopHeatPump/CoolingCapacity', :float)
2785
- @wlhp_cooling_efficiency_eer = XMLHelper.get_value(cooling_system, "extension/WaterLoopHeatPump/AnnualCoolingEfficiency[Units='#{UnitsEER}']/Value", :float)
2950
+ @seed_id = XMLHelper.get_value(cooling_system, 'extension/SeedId', :string)
2786
2951
  end
2787
2952
  end
2788
2953
 
@@ -2815,8 +2980,11 @@ class HPXML < Object
2815
2980
  :backup_heating_efficiency_percent, :backup_heating_efficiency_afue,
2816
2981
  :backup_heating_switchover_temp, :fraction_heat_load_served, :fraction_cool_load_served,
2817
2982
  :cooling_efficiency_seer, :cooling_efficiency_eer, :heating_efficiency_hspf,
2818
- :heating_efficiency_cop, :energy_star, :seed_id, :pump_watts_per_ton, :fan_watts_per_cfm,
2819
- :is_shared_system, :number_of_units_served, :shared_loop_watts]
2983
+ :heating_efficiency_cop, :third_party_certification, :seed_id, :pump_watts_per_ton,
2984
+ :fan_watts_per_cfm, :fan_power_not_tested, :is_shared_system, :number_of_units_served,
2985
+ :shared_loop_watts, :shared_loop_motor_efficiency, :airflow_defect_ratio, :airflow_not_tested,
2986
+ :charge_defect_ratio, :charge_not_tested, :heating_airflow_cfm, :cooling_airflow_cfm,
2987
+ :location]
2820
2988
  attr_accessor(*ATTRS)
2821
2989
 
2822
2990
  def distribution_system
@@ -2852,6 +3020,9 @@ class HPXML < Object
2852
3020
  heat_pump = XMLHelper.add_element(hvac_plant, 'HeatPump')
2853
3021
  sys_id = XMLHelper.add_element(heat_pump, 'SystemIdentifier')
2854
3022
  XMLHelper.add_attribute(sys_id, 'id', @id)
3023
+ XMLHelper.add_element(heat_pump, 'UnitLocation', @location, :string) unless @location.nil?
3024
+ XMLHelper.add_element(heat_pump, 'YearInstalled', @year_installed, :integer) unless @year_installed.nil?
3025
+ XMLHelper.add_element(heat_pump, 'ThirdPartyCertification', @third_party_certification, :string) unless @third_party_certification.nil?
2855
3026
  if not @distribution_system_idref.nil?
2856
3027
  distribution_system = XMLHelper.add_element(heat_pump, 'DistributionSystem')
2857
3028
  XMLHelper.add_attribute(distribution_system, 'idref', @distribution_system_idref)
@@ -2860,27 +3031,25 @@ class HPXML < Object
2860
3031
  XMLHelper.add_element(heat_pump, 'NumberofUnitsServed', @number_of_units_served, :integer) unless @number_of_units_served.nil?
2861
3032
  XMLHelper.add_element(heat_pump, 'HeatPumpType', @heat_pump_type, :string) unless @heat_pump_type.nil?
2862
3033
  XMLHelper.add_element(heat_pump, 'HeatPumpFuel', @heat_pump_fuel, :string) unless @heat_pump_fuel.nil?
2863
- XMLHelper.add_element(heat_pump, 'HeatingCapacity', @heating_capacity, :float) unless @heating_capacity.nil?
3034
+ XMLHelper.add_element(heat_pump, 'HeatingCapacity', @heating_capacity, :float, @heating_capacity_isdefaulted) unless @heating_capacity.nil?
2864
3035
  XMLHelper.add_element(heat_pump, 'HeatingCapacity17F', @heating_capacity_17F, :float) unless @heating_capacity_17F.nil?
2865
- XMLHelper.add_element(heat_pump, 'CoolingCapacity', @cooling_capacity, :float) unless @cooling_capacity.nil?
3036
+ XMLHelper.add_element(heat_pump, 'CoolingCapacity', @cooling_capacity, :float, @cooling_capacity_isdefaulted) unless @cooling_capacity.nil?
2866
3037
  XMLHelper.add_element(heat_pump, 'CompressorType', @compressor_type, :string, @compressor_type_isdefaulted) unless @compressor_type.nil?
2867
3038
  XMLHelper.add_element(heat_pump, 'CoolingSensibleHeatFraction', @cooling_shr, :float, @cooling_shr_isdefaulted) unless @cooling_shr.nil?
2868
- if not @backup_heating_fuel.nil?
2869
- XMLHelper.add_element(heat_pump, 'BackupSystemFuel', @backup_heating_fuel, :string)
2870
- efficiencies = { 'Percent' => @backup_heating_efficiency_percent,
2871
- UnitsAFUE => @backup_heating_efficiency_afue }
2872
- efficiencies.each do |units, value|
2873
- next if value.nil?
2874
-
2875
- backup_eff = XMLHelper.add_element(heat_pump, 'BackupAnnualHeatingEfficiency')
2876
- XMLHelper.add_element(backup_eff, 'Units', units, :string)
2877
- XMLHelper.add_element(backup_eff, 'Value', value, :float)
2878
- end
2879
- XMLHelper.add_element(heat_pump, 'BackupHeatingCapacity', @backup_heating_capacity, :float) unless @backup_heating_capacity.nil?
2880
- XMLHelper.add_element(heat_pump, 'BackupHeatingSwitchoverTemperature', @backup_heating_switchover_temp, :float) unless @backup_heating_switchover_temp.nil?
3039
+ XMLHelper.add_element(heat_pump, 'BackupSystemFuel', @backup_heating_fuel, :string) unless @backup_heating_fuel.nil?
3040
+ efficiencies = { 'Percent' => @backup_heating_efficiency_percent,
3041
+ UnitsAFUE => @backup_heating_efficiency_afue }
3042
+ efficiencies.each do |units, value|
3043
+ next if value.nil?
3044
+
3045
+ backup_eff = XMLHelper.add_element(heat_pump, 'BackupAnnualHeatingEfficiency')
3046
+ XMLHelper.add_element(backup_eff, 'Units', units, :string)
3047
+ XMLHelper.add_element(backup_eff, 'Value', value, :float)
2881
3048
  end
2882
- XMLHelper.add_element(heat_pump, 'FractionHeatLoadServed', @fraction_heat_load_served, :float) unless @fraction_heat_load_served.nil?
2883
- XMLHelper.add_element(heat_pump, 'FractionCoolLoadServed', @fraction_cool_load_served, :float) unless @fraction_cool_load_served.nil?
3049
+ XMLHelper.add_element(heat_pump, 'BackupHeatingCapacity', @backup_heating_capacity, :float, @backup_heating_capacity_isdefaulted) unless @backup_heating_capacity.nil?
3050
+ XMLHelper.add_element(heat_pump, 'BackupHeatingSwitchoverTemperature', @backup_heating_switchover_temp, :float) unless @backup_heating_switchover_temp.nil?
3051
+ XMLHelper.add_element(heat_pump, 'FractionHeatLoadServed', @fraction_heat_load_served, :float, @fraction_heat_load_served_isdefaulted) unless @fraction_heat_load_served.nil?
3052
+ XMLHelper.add_element(heat_pump, 'FractionCoolLoadServed', @fraction_cool_load_served, :float, @fraction_cool_load_served_isdefaulted) unless @fraction_cool_load_served.nil?
2884
3053
 
2885
3054
  clg_efficiency_units = nil
2886
3055
  clg_efficiency_value = nil
@@ -2891,7 +3060,7 @@ class HPXML < Object
2891
3060
  clg_efficiency_value = @cooling_efficiency_seer
2892
3061
  htg_efficiency_units = UnitsHSPF
2893
3062
  htg_efficiency_value = @heating_efficiency_hspf
2894
- elsif [HVACTypeHeatPumpGroundToAir].include? @heat_pump_type
3063
+ elsif [HVACTypeHeatPumpGroundToAir, HVACTypeHeatPumpWaterLoopToAir].include? @heat_pump_type
2895
3064
  clg_efficiency_units = UnitsEER
2896
3065
  clg_efficiency_value = @cooling_efficiency_eer
2897
3066
  htg_efficiency_units = UnitsCOP
@@ -2907,9 +3076,17 @@ class HPXML < Object
2907
3076
  XMLHelper.add_element(annual_efficiency, 'Units', htg_efficiency_units, :string)
2908
3077
  XMLHelper.add_element(annual_efficiency, 'Value', htg_efficiency_value, :float)
2909
3078
  end
3079
+ XMLHelper.add_extension(heat_pump, 'AirflowDefectRatio', @airflow_defect_ratio, :float, @airflow_defect_ratio_isdefaulted) unless @airflow_defect_ratio.nil?
3080
+ XMLHelper.add_extension(heat_pump, 'ChargeDefectRatio', @charge_defect_ratio, :float, @charge_defect_ratio_isdefaulted) unless @charge_defect_ratio.nil?
3081
+ XMLHelper.add_extension(heat_pump, 'ChargeNotTested', @charge_not_tested, :boolean) unless @charge_not_tested.nil?
2910
3082
  XMLHelper.add_extension(heat_pump, 'FanPowerWattsPerCFM', @fan_watts_per_cfm, :float, @fan_watts_per_cfm_isdefaulted) unless @fan_watts_per_cfm.nil?
3083
+ XMLHelper.add_extension(heat_pump, 'FanPowerNotTested', @fan_power_not_tested, :boolean) unless @fan_power_not_tested.nil?
3084
+ XMLHelper.add_extension(heat_pump, 'AirflowNotTested', @airflow_not_tested, :boolean) unless @airflow_not_tested.nil?
3085
+ XMLHelper.add_extension(heat_pump, 'HeatingAirflowCFM', @heating_airflow_cfm, :float, @heating_airflow_cfm_isdefaulted) unless @heating_airflow_cfm.nil?
3086
+ XMLHelper.add_extension(heat_pump, 'CoolingAirflowCFM', @cooling_airflow_cfm, :float, @cooling_airflow_cfm_isdefaulted) unless @cooling_airflow_cfm.nil?
2911
3087
  XMLHelper.add_extension(heat_pump, 'PumpPowerWattsPerTon', @pump_watts_per_ton, :float, @pump_watts_per_ton_isdefaulted) unless @pump_watts_per_ton.nil?
2912
3088
  XMLHelper.add_extension(heat_pump, 'SharedLoopWatts', @shared_loop_watts, :float) unless @shared_loop_watts.nil?
3089
+ XMLHelper.add_extension(heat_pump, 'SharedLoopMotorEfficiency', @shared_loop_motor_efficiency, :float) unless @shared_loop_motor_efficiency.nil?
2913
3090
  XMLHelper.add_extension(heat_pump, 'SeedId', @seed_id, :string) unless @seed_id.nil?
2914
3091
  end
2915
3092
 
@@ -2917,8 +3094,10 @@ class HPXML < Object
2917
3094
  return if heat_pump.nil?
2918
3095
 
2919
3096
  @id = HPXML::get_id(heat_pump)
2920
- @distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(heat_pump, 'DistributionSystem'))
3097
+ @location = XMLHelper.get_value(heat_pump, 'UnitLocation', :string)
2921
3098
  @year_installed = XMLHelper.get_value(heat_pump, 'YearInstalled', :integer)
3099
+ @third_party_certification = XMLHelper.get_value(heat_pump, 'ThirdPartyCertification', :string)
3100
+ @distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(heat_pump, 'DistributionSystem'))
2922
3101
  @is_shared_system = XMLHelper.get_value(heat_pump, 'IsSharedSystem', :boolean)
2923
3102
  @number_of_units_served = XMLHelper.get_value(heat_pump, 'NumberofUnitsServed', :integer)
2924
3103
  @heat_pump_type = XMLHelper.get_value(heat_pump, 'HeatPumpType', :string)
@@ -2926,30 +3105,113 @@ class HPXML < Object
2926
3105
  @heating_capacity = XMLHelper.get_value(heat_pump, 'HeatingCapacity', :float)
2927
3106
  @heating_capacity_17F = XMLHelper.get_value(heat_pump, 'HeatingCapacity17F', :float)
2928
3107
  @cooling_capacity = XMLHelper.get_value(heat_pump, 'CoolingCapacity', :float)
2929
- @compressor_type, @compressor_type_isdefaulted = XMLHelper.get_value_and_defaulted(heat_pump, 'CompressorType', :string)
2930
- @cooling_shr, @cooling_shr_isdefaulted = XMLHelper.get_value_and_defaulted(heat_pump, 'CoolingSensibleHeatFraction', :float)
3108
+ @compressor_type = XMLHelper.get_value(heat_pump, 'CompressorType', :string)
3109
+ @cooling_shr = XMLHelper.get_value(heat_pump, 'CoolingSensibleHeatFraction', :float)
2931
3110
  @backup_heating_fuel = XMLHelper.get_value(heat_pump, 'BackupSystemFuel', :string)
2932
- @backup_heating_capacity = XMLHelper.get_value(heat_pump, 'BackupHeatingCapacity', :float)
2933
3111
  @backup_heating_efficiency_percent = XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='Percent']/Value", :float)
2934
3112
  @backup_heating_efficiency_afue = XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='#{UnitsAFUE}']/Value", :float)
3113
+ @backup_heating_capacity = XMLHelper.get_value(heat_pump, 'BackupHeatingCapacity', :float)
2935
3114
  @backup_heating_switchover_temp = XMLHelper.get_value(heat_pump, 'BackupHeatingSwitchoverTemperature', :float)
2936
3115
  @fraction_heat_load_served = XMLHelper.get_value(heat_pump, 'FractionHeatLoadServed', :float)
2937
3116
  @fraction_cool_load_served = XMLHelper.get_value(heat_pump, 'FractionCoolLoadServed', :float)
2938
3117
  if [HVACTypeHeatPumpAirToAir, HVACTypeHeatPumpMiniSplit].include? @heat_pump_type
2939
3118
  @cooling_efficiency_seer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsSEER}']/Value", :float)
2940
- elsif [HVACTypeHeatPumpGroundToAir].include? @heat_pump_type
3119
+ elsif [HVACTypeHeatPumpGroundToAir, HVACTypeHeatPumpWaterLoopToAir].include? @heat_pump_type
2941
3120
  @cooling_efficiency_eer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsEER}']/Value", :float)
2942
3121
  end
2943
3122
  if [HVACTypeHeatPumpAirToAir, HVACTypeHeatPumpMiniSplit].include? @heat_pump_type
2944
3123
  @heating_efficiency_hspf = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsHSPF}']/Value", :float)
2945
- elsif [HVACTypeHeatPumpGroundToAir].include? @heat_pump_type
3124
+ elsif [HVACTypeHeatPumpGroundToAir, HVACTypeHeatPumpWaterLoopToAir].include? @heat_pump_type
2946
3125
  @heating_efficiency_cop = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsCOP}']/Value", :float)
2947
3126
  end
2948
- @energy_star = XMLHelper.get_values(heat_pump, 'ThirdPartyCertification', :string).include?('Energy Star')
2949
- @pump_watts_per_ton, @pump_watts_per_ton_isdefaulted = XMLHelper.get_value_and_defaulted(heat_pump, 'extension/PumpPowerWattsPerTon', :float)
2950
- @fan_watts_per_cfm, @fan_watts_per_cfm_isdefaulted = XMLHelper.get_value_and_defaulted(heat_pump, 'extension/FanPowerWattsPerCFM', :float)
2951
- @seed_id = XMLHelper.get_value(heat_pump, 'extension/SeedId', :string)
3127
+ @airflow_defect_ratio = XMLHelper.get_value(heat_pump, 'extension/AirflowDefectRatio', :float)
3128
+ @charge_defect_ratio = XMLHelper.get_value(heat_pump, 'extension/ChargeDefectRatio', :float)
3129
+ @charge_not_tested = XMLHelper.get_value(heat_pump, 'extension/ChargeNotTested', :boolean)
3130
+ @fan_watts_per_cfm = XMLHelper.get_value(heat_pump, 'extension/FanPowerWattsPerCFM', :float)
3131
+ @fan_power_not_tested = XMLHelper.get_value(heat_pump, 'extension/FanPowerNotTested', :boolean)
3132
+ @airflow_not_tested = XMLHelper.get_value(heat_pump, 'extension/AirflowNotTested', :boolean)
3133
+ @heating_airflow_cfm = XMLHelper.get_value(heat_pump, 'extension/HeatingAirflowCFM', :float)
3134
+ @cooling_airflow_cfm = XMLHelper.get_value(heat_pump, 'extension/CoolingAirflowCFM', :float)
3135
+ @pump_watts_per_ton = XMLHelper.get_value(heat_pump, 'extension/PumpPowerWattsPerTon', :float)
2952
3136
  @shared_loop_watts = XMLHelper.get_value(heat_pump, 'extension/SharedLoopWatts', :float)
3137
+ @shared_loop_motor_efficiency = XMLHelper.get_value(heat_pump, 'extension/SharedLoopMotorEfficiency', :float)
3138
+ @seed_id = XMLHelper.get_value(heat_pump, 'extension/SeedId', :string)
3139
+ end
3140
+ end
3141
+
3142
+ class HVACPlant < BaseElement
3143
+ HDL_ATTRS = { hdl_total: 'Total',
3144
+ hdl_ducts: 'Ducts',
3145
+ hdl_windows: 'Windows',
3146
+ hdl_skylights: 'Skylights',
3147
+ hdl_doors: 'Doors',
3148
+ hdl_walls: 'Walls',
3149
+ hdl_roofs: 'Roofs',
3150
+ hdl_floors: 'Floors',
3151
+ hdl_slabs: 'Slabs',
3152
+ hdl_ceilings: 'Ceilings',
3153
+ hdl_infilvent: 'InfilVent' }
3154
+ CDL_SENS_ATTRS = { cdl_sens_total: 'Total',
3155
+ cdl_sens_ducts: 'Ducts',
3156
+ cdl_sens_windows: 'Windows',
3157
+ cdl_sens_skylights: 'Skylights',
3158
+ cdl_sens_doors: 'Doors',
3159
+ cdl_sens_walls: 'Walls',
3160
+ cdl_sens_roofs: 'Roofs',
3161
+ cdl_sens_floors: 'Floors',
3162
+ cdl_sens_slabs: 'Slabs',
3163
+ cdl_sens_ceilings: 'Ceilings',
3164
+ cdl_sens_infilvent: 'InfilVent',
3165
+ cdl_sens_intgains: 'InternalGains' }
3166
+ CDL_LAT_ATTRS = { cdl_lat_total: 'Total',
3167
+ cdl_lat_ducts: 'Ducts',
3168
+ cdl_lat_infilvent: 'InfilVent',
3169
+ cdl_lat_intgains: 'InternalGains' }
3170
+ ATTRS = HDL_ATTRS.keys + CDL_SENS_ATTRS.keys + CDL_LAT_ATTRS.keys
3171
+ attr_accessor(*ATTRS)
3172
+
3173
+ def check_for_errors
3174
+ errors = []
3175
+ return errors
3176
+ end
3177
+
3178
+ def to_oga(doc)
3179
+ return if nil?
3180
+
3181
+ hvac_plant = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'HVAC', 'HVACPlant'])
3182
+ if not @hdl_total.nil?
3183
+ dl_extension = XMLHelper.create_elements_as_needed(hvac_plant, ['extension', 'DesignLoads'])
3184
+ XMLHelper.add_attribute(dl_extension, 'dataSource', 'software')
3185
+ hdl = XMLHelper.add_element(dl_extension, 'Heating')
3186
+ HDL_ATTRS.each do |attr, element_name|
3187
+ XMLHelper.add_element(hdl, element_name, send(attr), :float)
3188
+ end
3189
+ cdl_sens = XMLHelper.add_element(dl_extension, 'CoolingSensible')
3190
+ CDL_SENS_ATTRS.each do |attr, element_name|
3191
+ XMLHelper.add_element(cdl_sens, element_name, send(attr), :float)
3192
+ end
3193
+ cdl_lat = XMLHelper.add_element(dl_extension, 'CoolingLatent')
3194
+ CDL_LAT_ATTRS.each do |attr, element_name|
3195
+ XMLHelper.add_element(cdl_lat, element_name, send(attr), :float)
3196
+ end
3197
+ end
3198
+ end
3199
+
3200
+ def from_oga(hpxml)
3201
+ return if hpxml.nil?
3202
+
3203
+ hvac_plant = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Systems/HVAC/HVACPlant')
3204
+ return if hvac_plant.nil?
3205
+
3206
+ HDL_ATTRS.each do |attr, element_name|
3207
+ send("#{attr.to_s}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/Heating/#{element_name}", :float))
3208
+ end
3209
+ CDL_SENS_ATTRS.each do |attr, element_name|
3210
+ send("#{attr.to_s}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/CoolingSensible/#{element_name}", :float))
3211
+ end
3212
+ CDL_LAT_ATTRS.each do |attr, element_name|
3213
+ send("#{attr.to_s}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/CoolingLatent/#{element_name}", :float))
3214
+ end
2953
3215
  end
2954
3216
  end
2955
3217
 
@@ -3016,11 +3278,11 @@ class HPXML < Object
3016
3278
  @heating_setpoint_temp = XMLHelper.get_value(hvac_control, 'SetpointTempHeatingSeason', :float)
3017
3279
  @heating_setback_temp = XMLHelper.get_value(hvac_control, 'SetbackTempHeatingSeason', :float)
3018
3280
  @heating_setback_hours_per_week = XMLHelper.get_value(hvac_control, 'TotalSetbackHoursperWeekHeating', :integer)
3019
- @heating_setback_start_hour, @heating_setback_start_hour_isdefaulted = XMLHelper.get_value_and_defaulted(hvac_control, 'extension/SetbackStartHourHeating', :integer)
3020
- @cooling_setpoint_temp = XMLHelper.get_value(hvac_control, 'SetpointTempCoolingSeason', :float)
3021
3281
  @cooling_setup_temp = XMLHelper.get_value(hvac_control, 'SetupTempCoolingSeason', :float)
3282
+ @cooling_setpoint_temp = XMLHelper.get_value(hvac_control, 'SetpointTempCoolingSeason', :float)
3022
3283
  @cooling_setup_hours_per_week = XMLHelper.get_value(hvac_control, 'TotalSetupHoursperWeekCooling', :integer)
3023
- @cooling_setup_start_hour, @cooling_setup_start_hour_isdefaulted = XMLHelper.get_value_and_defaulted(hvac_control, 'extension/SetupStartHourCooling', :integer)
3284
+ @heating_setback_start_hour = XMLHelper.get_value(hvac_control, 'extension/SetbackStartHourHeating', :integer)
3285
+ @cooling_setup_start_hour = XMLHelper.get_value(hvac_control, 'extension/SetupStartHourCooling', :integer)
3024
3286
  @ceiling_fan_cooling_setpoint_temp_offset = XMLHelper.get_value(hvac_control, 'extension/CeilingFanSetpointTempCoolingSeasonOffset', :float)
3025
3287
  @weekday_heating_setpoints = XMLHelper.get_value(hvac_control, 'extension/WeekdaySetpointTempsHeatingSeason', :string)
3026
3288
  @weekend_heating_setpoints = XMLHelper.get_value(hvac_control, 'extension/WeekendSetpointTempsHeatingSeason', :string)
@@ -3051,13 +3313,13 @@ class HPXML < Object
3051
3313
  end
3052
3314
  ATTRS = [:id, :distribution_system_type, :annual_heating_dse, :annual_cooling_dse,
3053
3315
  :duct_system_sealed, :duct_leakage_to_outside_testing_exemption, :conditioned_floor_area_served,
3054
- :number_of_return_registers, :hydronic_type, :hydronic_and_air_type]
3316
+ :number_of_return_registers, :air_type, :hydronic_type]
3055
3317
  attr_accessor(*ATTRS)
3056
3318
  attr_reader(:duct_leakage_measurements, :ducts)
3057
3319
 
3058
3320
  def hvac_systems
3059
3321
  list = []
3060
- (@hpxml_object.heating_systems + @hpxml_object.cooling_systems + @hpxml_object.heat_pumps).each do |hvac_system|
3322
+ @hpxml_object.hvac_systems.each do |hvac_system|
3061
3323
  next if hvac_system.distribution_system_idref.nil?
3062
3324
  next unless hvac_system.distribution_system_idref == @id
3063
3325
 
@@ -3089,9 +3351,21 @@ class HPXML < Object
3089
3351
  return list
3090
3352
  end
3091
3353
 
3354
+ def total_unconditioned_duct_areas
3355
+ areas = { HPXML::DuctTypeSupply => 0,
3356
+ HPXML::DuctTypeReturn => 0 }
3357
+ @ducts.each do |duct|
3358
+ next if [HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include? duct.duct_location
3359
+ next if duct.duct_type.nil?
3360
+
3361
+ areas[duct.duct_type] += duct.duct_surface_area
3362
+ end
3363
+ return areas
3364
+ end
3365
+
3092
3366
  def delete
3093
3367
  @hpxml_object.hvac_distributions.delete(self)
3094
- (@hpxml_object.heating_systems + @hpxml_object.cooling_systems + @hpxml_object.heat_pumps).each do |hvac_system|
3368
+ @hpxml_object.hvac_systems.each do |hvac_system|
3095
3369
  next if hvac_system.distribution_system_idref.nil?
3096
3370
  next unless hvac_system.distribution_system_idref == @id
3097
3371
 
@@ -3119,12 +3393,12 @@ class HPXML < Object
3119
3393
  hvac_distribution = XMLHelper.add_element(hvac, 'HVACDistribution')
3120
3394
  sys_id = XMLHelper.add_element(hvac_distribution, 'SystemIdentifier')
3121
3395
  XMLHelper.add_attribute(sys_id, 'id', @id)
3122
- distribution_system_type_e = XMLHelper.add_element(hvac_distribution, 'DistributionSystemType')
3123
- if [HVACDistributionTypeAir, HVACDistributionTypeHydronic, HVACDistributionTypeHydronicAndAir].include? @distribution_system_type
3124
- XMLHelper.add_element(distribution_system_type_e, @distribution_system_type)
3396
+ distribution_system_type_el = XMLHelper.add_element(hvac_distribution, 'DistributionSystemType')
3397
+ if [HVACDistributionTypeAir, HVACDistributionTypeHydronic].include? @distribution_system_type
3398
+ XMLHelper.add_element(distribution_system_type_el, @distribution_system_type)
3125
3399
  XMLHelper.add_element(hvac_distribution, 'ConditionedFloorAreaServed', @conditioned_floor_area_served, :float) unless @conditioned_floor_area_served.nil?
3126
3400
  elsif [HVACDistributionTypeDSE].include? @distribution_system_type
3127
- XMLHelper.add_element(distribution_system_type_e, 'Other', @distribution_system_type, :string)
3401
+ XMLHelper.add_element(distribution_system_type_el, 'Other', @distribution_system_type, :string)
3128
3402
  XMLHelper.add_element(hvac_distribution, 'AnnualHeatingDistributionSystemEfficiency', @annual_heating_dse, :float) unless @annual_heating_dse.nil?
3129
3403
  XMLHelper.add_element(hvac_distribution, 'AnnualCoolingDistributionSystemEfficiency', @annual_cooling_dse, :float) unless @annual_cooling_dse.nil?
3130
3404
  else
@@ -3135,21 +3409,19 @@ class HPXML < Object
3135
3409
  distribution = XMLHelper.get_element(hvac_distribution, 'DistributionSystemType/HydronicDistribution')
3136
3410
  XMLHelper.add_element(distribution, 'HydronicDistributionType', @hydronic_type, :string) unless @hydronic_type.nil?
3137
3411
  end
3138
- if [HPXML::HVACDistributionTypeHydronicAndAir].include? @distribution_system_type
3139
- distribution = XMLHelper.get_element(hvac_distribution, 'DistributionSystemType/HydronicAndAirDistribution')
3140
- XMLHelper.add_element(distribution, 'HydronicAndAirDistributionType', @hydronic_and_air_type, :string) unless @hydronic_and_air_type.nil?
3141
- end
3142
- if [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeHydronicAndAir].include? @distribution_system_type
3143
- if @distribution_system_type == HPXML::HVACDistributionTypeAir
3144
- distribution = XMLHelper.get_element(hvac_distribution, 'DistributionSystemType/AirDistribution')
3145
- elsif @distribution_system_type == HPXML::HVACDistributionTypeHydronicAndAir
3146
- distribution = XMLHelper.get_element(hvac_distribution, 'DistributionSystemType/HydronicAndAirDistribution')
3147
- end
3412
+ if [HPXML::HVACDistributionTypeAir].include? @distribution_system_type
3413
+ distribution = XMLHelper.get_element(hvac_distribution, 'DistributionSystemType/AirDistribution')
3414
+ XMLHelper.add_element(distribution, 'AirDistributionType', @air_type, :string) unless @air_type.nil?
3148
3415
  @duct_leakage_measurements.to_oga(distribution)
3149
3416
  @ducts.to_oga(distribution)
3150
3417
  XMLHelper.add_element(distribution, 'NumberofReturnRegisters', @number_of_return_registers, :integer, @number_of_return_registers_isdefaulted) unless @number_of_return_registers.nil?
3151
3418
  XMLHelper.add_extension(distribution, 'DuctLeakageToOutsideTestingExemption', @duct_leakage_to_outside_testing_exemption, :boolean) unless @duct_leakage_to_outside_testing_exemption.nil?
3152
3419
  end
3420
+
3421
+ if not @duct_system_sealed.nil?
3422
+ dist_impr_el = XMLHelper.add_element(hvac_distribution, 'HVACDistributionImprovement')
3423
+ XMLHelper.add_element(dist_impr_el, 'DuctSystemSealed', @duct_system_sealed, :boolean)
3424
+ end
3153
3425
  end
3154
3426
 
3155
3427
  def from_oga(hvac_distribution)
@@ -3167,21 +3439,16 @@ class HPXML < Object
3167
3439
 
3168
3440
  air_distribution = XMLHelper.get_element(hvac_distribution, 'DistributionSystemType/AirDistribution')
3169
3441
  hydronic_distribution = XMLHelper.get_element(hvac_distribution, 'DistributionSystemType/HydronicDistribution')
3170
- hydronic_and_air_distribution = XMLHelper.get_element(hvac_distribution, 'DistributionSystemType/HydronicAndAirDistribution')
3171
3442
 
3172
3443
  if not hydronic_distribution.nil?
3173
3444
  @hydronic_type = XMLHelper.get_value(hydronic_distribution, 'HydronicDistributionType', :string)
3174
3445
  end
3175
- if not hydronic_and_air_distribution.nil?
3176
- @hydronic_and_air_type = XMLHelper.get_value(hydronic_and_air_distribution, 'HydronicAndAirDistributionType', :string)
3177
- end
3178
- if (not air_distribution.nil?) || (not hydronic_and_air_distribution.nil?)
3179
- distribution = air_distribution
3180
- distribution = hydronic_and_air_distribution if distribution.nil?
3181
- @number_of_return_registers, @number_of_return_registers_isdefaulted = XMLHelper.get_value_and_defaulted(distribution, 'NumberofReturnRegisters', :integer)
3182
- @duct_leakage_to_outside_testing_exemption = XMLHelper.get_value(distribution, 'extension/DuctLeakageToOutsideTestingExemption', :boolean)
3183
- @duct_leakage_measurements.from_oga(distribution)
3184
- @ducts.from_oga(distribution)
3446
+ if not air_distribution.nil?
3447
+ @air_type = XMLHelper.get_value(air_distribution, 'AirDistributionType', :string)
3448
+ @number_of_return_registers = XMLHelper.get_value(air_distribution, 'NumberofReturnRegisters', :integer)
3449
+ @duct_leakage_to_outside_testing_exemption = XMLHelper.get_value(air_distribution, 'extension/DuctLeakageToOutsideTestingExemption', :boolean)
3450
+ @duct_leakage_measurements.from_oga(air_distribution)
3451
+ @ducts.from_oga(air_distribution)
3185
3452
  end
3186
3453
  end
3187
3454
  end
@@ -3221,6 +3488,7 @@ class HPXML < Object
3221
3488
  def to_oga(air_distribution)
3222
3489
  duct_leakage_measurement_el = XMLHelper.add_element(air_distribution, 'DuctLeakageMeasurement')
3223
3490
  XMLHelper.add_element(duct_leakage_measurement_el, 'DuctType', @duct_type, :string) unless @duct_type.nil?
3491
+ XMLHelper.add_element(duct_leakage_measurement_el, 'DuctLeakageTestMethod', @duct_leakage_test_method, :string) unless @duct_leakage_test_method.nil?
3224
3492
  if not @duct_leakage_value.nil?
3225
3493
  duct_leakage_el = XMLHelper.add_element(duct_leakage_measurement_el, 'DuctLeakage')
3226
3494
  XMLHelper.add_element(duct_leakage_el, 'Units', @duct_leakage_units, :string) unless @duct_leakage_units.nil?
@@ -3275,8 +3543,13 @@ class HPXML < Object
3275
3543
  def to_oga(air_distribution)
3276
3544
  ducts_el = XMLHelper.add_element(air_distribution, 'Ducts')
3277
3545
  XMLHelper.add_element(ducts_el, 'DuctType', @duct_type, :string) unless @duct_type.nil?
3546
+ if not @duct_insulation_material.nil?
3547
+ ins_material_el = XMLHelper.add_element(ducts_el, 'DuctInsulationMaterial')
3548
+ XMLHelper.add_element(ins_material_el, @duct_insulation_material)
3549
+ end
3278
3550
  XMLHelper.add_element(ducts_el, 'DuctInsulationRValue', @duct_insulation_r_value, :float) unless @duct_insulation_r_value.nil?
3279
3551
  XMLHelper.add_element(ducts_el, 'DuctLocation', @duct_location, :string, @duct_location_isdefaulted) unless @duct_location.nil?
3552
+ XMLHelper.add_element(ducts_el, 'FractionDuctArea', @duct_fraction_area, :float) unless @duct_fraction_area.nil?
3280
3553
  XMLHelper.add_element(ducts_el, 'DuctSurfaceArea', @duct_surface_area, :float, @duct_surface_area_isdefaulted) unless @duct_surface_area.nil?
3281
3554
  end
3282
3555
 
@@ -3284,11 +3557,11 @@ class HPXML < Object
3284
3557
  return if duct.nil?
3285
3558
 
3286
3559
  @duct_type = XMLHelper.get_value(duct, 'DuctType', :string)
3287
- @duct_insulation_r_value = XMLHelper.get_value(duct, 'DuctInsulationRValue', :float)
3288
3560
  @duct_insulation_material = XMLHelper.get_child_name(duct, 'DuctInsulationMaterial')
3289
- @duct_location, @duct_location_isdefaulted = XMLHelper.get_value_and_defaulted(duct, 'DuctLocation', :string)
3561
+ @duct_insulation_r_value = XMLHelper.get_value(duct, 'DuctInsulationRValue', :float)
3562
+ @duct_location = XMLHelper.get_value(duct, 'DuctLocation', :string)
3290
3563
  @duct_fraction_area = XMLHelper.get_value(duct, 'FractionDuctArea', :float)
3291
- @duct_surface_area, @duct_surface_area_isdefaulted = XMLHelper.get_value_and_defaulted(duct, 'DuctSurfaceArea', :float)
3564
+ @duct_surface_area = XMLHelper.get_value(duct, 'DuctSurfaceArea', :float)
3292
3565
  end
3293
3566
  end
3294
3567
 
@@ -3384,9 +3657,6 @@ class HPXML < Object
3384
3657
  ratio = @in_unit_flow_rate / @rated_flow_rate
3385
3658
  end
3386
3659
  return if ratio.nil?
3387
- if ratio >= 1.0
3388
- fail "The in-unit flow rate of shared fan '#{@id}' must be less than the system flow rate."
3389
- end
3390
3660
 
3391
3661
  return ratio
3392
3662
  end
@@ -3463,9 +3733,7 @@ class HPXML < Object
3463
3733
  XMLHelper.add_element(ventilation_fan, 'UsedForWholeBuildingVentilation', @used_for_whole_building_ventilation, :boolean) unless @used_for_whole_building_ventilation.nil?
3464
3734
  XMLHelper.add_element(ventilation_fan, 'UsedForSeasonalCoolingLoadReduction', @used_for_seasonal_cooling_load_reduction, :boolean) unless @used_for_seasonal_cooling_load_reduction.nil?
3465
3735
  XMLHelper.add_element(ventilation_fan, 'IsSharedSystem', @is_shared_system, :boolean, @is_shared_system_isdefaulted) unless @is_shared_system.nil?
3466
- if @is_shared_system
3467
- XMLHelper.add_element(ventilation_fan, 'FractionRecirculation', @fraction_recirculation, :float) unless @fraction_recirculation.nil?
3468
- end
3736
+ XMLHelper.add_element(ventilation_fan, 'FractionRecirculation', @fraction_recirculation, :float) unless @fraction_recirculation.nil?
3469
3737
  XMLHelper.add_element(ventilation_fan, 'TotalRecoveryEfficiency', @total_recovery_efficiency, :float) unless @total_recovery_efficiency.nil?
3470
3738
  XMLHelper.add_element(ventilation_fan, 'SensibleRecoveryEfficiency', @sensible_recovery_efficiency, :float) unless @sensible_recovery_efficiency.nil?
3471
3739
  XMLHelper.add_element(ventilation_fan, 'AdjustedTotalRecoveryEfficiency', @total_recovery_efficiency_adjusted, :float) unless @total_recovery_efficiency_adjusted.nil?
@@ -3476,24 +3744,22 @@ class HPXML < Object
3476
3744
  XMLHelper.add_attribute(attached_to_hvac_distribution_system, 'idref', @distribution_system_idref)
3477
3745
  end
3478
3746
  XMLHelper.add_extension(ventilation_fan, 'StartHour', @start_hour, :integer, @start_hour_isdefaulted) unless @start_hour.nil?
3479
- if @is_shared_system
3480
- XMLHelper.add_extension(ventilation_fan, 'InUnitFlowRate', @in_unit_flow_rate, :float) unless @in_unit_flow_rate.nil?
3481
- if (not @preheating_fuel.nil?) && (not @preheating_efficiency_cop.nil?)
3482
- precond_htg = XMLHelper.create_elements_as_needed(ventilation_fan, ['extension', 'PreHeating'])
3483
- XMLHelper.add_element(precond_htg, 'Fuel', @preheating_fuel, :string) unless @preheating_fuel.nil?
3484
- eff = XMLHelper.add_element(precond_htg, 'AnnualHeatingEfficiency') unless @preheating_efficiency_cop.nil?
3485
- XMLHelper.add_element(eff, 'Value', @preheating_efficiency_cop, :float) unless eff.nil?
3486
- XMLHelper.add_element(eff, 'Units', UnitsCOP, :string) unless eff.nil?
3487
- XMLHelper.add_element(precond_htg, 'FractionVentilationHeatLoadServed', @preheating_fraction_load_served, :float) unless @preheating_fraction_load_served.nil?
3488
- end
3489
- if (not @precooling_fuel.nil?) && (not @precooling_efficiency_cop.nil?)
3490
- precond_clg = XMLHelper.create_elements_as_needed(ventilation_fan, ['extension', 'PreCooling'])
3491
- XMLHelper.add_element(precond_clg, 'Fuel', @precooling_fuel, :string) unless @precooling_fuel.nil?
3492
- eff = XMLHelper.add_element(precond_clg, 'AnnualCoolingEfficiency') unless @precooling_efficiency_cop.nil?
3493
- XMLHelper.add_element(eff, 'Value', @precooling_efficiency_cop, :float) unless eff.nil?
3494
- XMLHelper.add_element(eff, 'Units', UnitsCOP, :string) unless eff.nil?
3495
- XMLHelper.add_element(precond_clg, 'FractionVentilationCoolLoadServed', @precooling_fraction_load_served, :float) unless @precooling_fraction_load_served.nil?
3496
- end
3747
+ XMLHelper.add_extension(ventilation_fan, 'InUnitFlowRate', @in_unit_flow_rate, :float) unless @in_unit_flow_rate.nil?
3748
+ if (not @preheating_fuel.nil?) && (not @preheating_efficiency_cop.nil?)
3749
+ precond_htg = XMLHelper.create_elements_as_needed(ventilation_fan, ['extension', 'PreHeating'])
3750
+ XMLHelper.add_element(precond_htg, 'Fuel', @preheating_fuel, :string) unless @preheating_fuel.nil?
3751
+ eff = XMLHelper.add_element(precond_htg, 'AnnualHeatingEfficiency') unless @preheating_efficiency_cop.nil?
3752
+ XMLHelper.add_element(eff, 'Value', @preheating_efficiency_cop, :float) unless eff.nil?
3753
+ XMLHelper.add_element(eff, 'Units', UnitsCOP, :string) unless eff.nil?
3754
+ XMLHelper.add_element(precond_htg, 'FractionVentilationHeatLoadServed', @preheating_fraction_load_served, :float) unless @preheating_fraction_load_served.nil?
3755
+ end
3756
+ if (not @precooling_fuel.nil?) && (not @precooling_efficiency_cop.nil?)
3757
+ precond_clg = XMLHelper.create_elements_as_needed(ventilation_fan, ['extension', 'PreCooling'])
3758
+ XMLHelper.add_element(precond_clg, 'Fuel', @precooling_fuel, :string) unless @precooling_fuel.nil?
3759
+ eff = XMLHelper.add_element(precond_clg, 'AnnualCoolingEfficiency') unless @precooling_efficiency_cop.nil?
3760
+ XMLHelper.add_element(eff, 'Value', @precooling_efficiency_cop, :float) unless eff.nil?
3761
+ XMLHelper.add_element(eff, 'Units', UnitsCOP, :string) unless eff.nil?
3762
+ XMLHelper.add_element(precond_clg, 'FractionVentilationCoolLoadServed', @precooling_fraction_load_served, :float) unless @precooling_fraction_load_served.nil?
3497
3763
  end
3498
3764
  XMLHelper.add_extension(ventilation_fan, 'FlowRateNotTested', @flow_rate_not_tested, :boolean) unless @flow_rate_not_tested.nil?
3499
3765
  XMLHelper.add_extension(ventilation_fan, 'FanPowerDefaulted', @fan_power_defaulted, :boolean) unless @fan_power_defaulted.nil?
@@ -3503,35 +3769,33 @@ class HPXML < Object
3503
3769
  return if ventilation_fan.nil?
3504
3770
 
3505
3771
  @id = HPXML::get_id(ventilation_fan)
3506
- @quantity, @quantity_isdefaulted = XMLHelper.get_value_and_defaulted(ventilation_fan, 'Quantity', :integer)
3772
+ @quantity = XMLHelper.get_value(ventilation_fan, 'Quantity', :integer)
3507
3773
  @fan_type = XMLHelper.get_value(ventilation_fan, 'FanType', :string)
3508
- @is_shared_system, @is_shared_system_isdefaulted = XMLHelper.get_value_and_defaulted(ventilation_fan, 'IsSharedSystem', :boolean)
3509
- @rated_flow_rate, @rated_flow_rate_isdefaulted = XMLHelper.get_value_and_defaulted(ventilation_fan, 'RatedFlowRate', :float)
3774
+ @rated_flow_rate = XMLHelper.get_value(ventilation_fan, 'RatedFlowRate', :float)
3510
3775
  @tested_flow_rate = XMLHelper.get_value(ventilation_fan, 'TestedFlowRate', :float)
3511
- @flow_rate_not_tested = XMLHelper.get_value(ventilation_fan, 'extension/FlowRateNotTested', :boolean)
3512
- @fan_power, @fan_power_isdefaulted = XMLHelper.get_value_and_defaulted(ventilation_fan, 'FanPower', :float)
3513
- @fan_power_defaulted = XMLHelper.get_value(ventilation_fan, 'extension/FanPowerDefaulted', :boolean)
3514
- if @is_shared_system
3515
- @fraction_recirculation = XMLHelper.get_value(ventilation_fan, 'FractionRecirculation', :float)
3516
- @in_unit_flow_rate = XMLHelper.get_value(ventilation_fan, 'extension/InUnitFlowRate', :float)
3517
- @preheating_fuel = XMLHelper.get_value(ventilation_fan, 'extension/PreHeating/Fuel', :string)
3518
- @preheating_efficiency_cop = XMLHelper.get_value(ventilation_fan, "extension/PreHeating/AnnualHeatingEfficiency[Units='#{UnitsCOP}']/Value", :float)
3519
- @preheating_fraction_load_served = XMLHelper.get_value(ventilation_fan, 'extension/PreHeating/FractionVentilationHeatLoadServed', :float)
3520
- @precooling_fuel = XMLHelper.get_value(ventilation_fan, 'extension/PreCooling/Fuel', :string)
3521
- @precooling_efficiency_cop = XMLHelper.get_value(ventilation_fan, "extension/PreCooling/AnnualCoolingEfficiency[Units='#{UnitsCOP}']/Value", :float)
3522
- @precooling_fraction_load_served = XMLHelper.get_value(ventilation_fan, 'extension/PreCooling/FractionVentilationCoolLoadServed', :float)
3523
- end
3524
- @hours_in_operation, @hours_in_operation_isdefaulted = XMLHelper.get_value_and_defaulted(ventilation_fan, 'HoursInOperation', :float)
3776
+ @hours_in_operation = XMLHelper.get_value(ventilation_fan, 'HoursInOperation', :float)
3525
3777
  @fan_location = XMLHelper.get_value(ventilation_fan, 'FanLocation', :string)
3526
3778
  @used_for_local_ventilation = XMLHelper.get_value(ventilation_fan, 'UsedForLocalVentilation', :boolean)
3527
3779
  @used_for_whole_building_ventilation = XMLHelper.get_value(ventilation_fan, 'UsedForWholeBuildingVentilation', :boolean)
3528
3780
  @used_for_seasonal_cooling_load_reduction = XMLHelper.get_value(ventilation_fan, 'UsedForSeasonalCoolingLoadReduction', :boolean)
3781
+ @is_shared_system = XMLHelper.get_value(ventilation_fan, 'IsSharedSystem', :boolean)
3782
+ @fraction_recirculation = XMLHelper.get_value(ventilation_fan, 'FractionRecirculation', :float)
3529
3783
  @total_recovery_efficiency = XMLHelper.get_value(ventilation_fan, 'TotalRecoveryEfficiency', :float)
3530
- @total_recovery_efficiency_adjusted = XMLHelper.get_value(ventilation_fan, 'AdjustedTotalRecoveryEfficiency', :float)
3531
3784
  @sensible_recovery_efficiency = XMLHelper.get_value(ventilation_fan, 'SensibleRecoveryEfficiency', :float)
3785
+ @total_recovery_efficiency_adjusted = XMLHelper.get_value(ventilation_fan, 'AdjustedTotalRecoveryEfficiency', :float)
3532
3786
  @sensible_recovery_efficiency_adjusted = XMLHelper.get_value(ventilation_fan, 'AdjustedSensibleRecoveryEfficiency', :float)
3787
+ @fan_power = XMLHelper.get_value(ventilation_fan, 'FanPower', :float)
3533
3788
  @distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(ventilation_fan, 'AttachedToHVACDistributionSystem'))
3534
- @start_hour, @start_hour_isdefaulted = XMLHelper.get_value_and_defaulted(ventilation_fan, 'extension/StartHour', :integer)
3789
+ @start_hour = XMLHelper.get_value(ventilation_fan, 'extension/StartHour', :integer)
3790
+ @in_unit_flow_rate = XMLHelper.get_value(ventilation_fan, 'extension/InUnitFlowRate', :float)
3791
+ @preheating_fuel = XMLHelper.get_value(ventilation_fan, 'extension/PreHeating/Fuel', :string)
3792
+ @preheating_efficiency_cop = XMLHelper.get_value(ventilation_fan, "extension/PreHeating/AnnualHeatingEfficiency[Units='#{UnitsCOP}']/Value", :float)
3793
+ @preheating_fraction_load_served = XMLHelper.get_value(ventilation_fan, 'extension/PreHeating/FractionVentilationHeatLoadServed', :float)
3794
+ @precooling_fuel = XMLHelper.get_value(ventilation_fan, 'extension/PreCooling/Fuel', :string)
3795
+ @precooling_efficiency_cop = XMLHelper.get_value(ventilation_fan, "extension/PreCooling/AnnualCoolingEfficiency[Units='#{UnitsCOP}']/Value", :float)
3796
+ @precooling_fraction_load_served = XMLHelper.get_value(ventilation_fan, 'extension/PreCooling/FractionVentilationCoolLoadServed', :float)
3797
+ @flow_rate_not_tested = XMLHelper.get_value(ventilation_fan, 'extension/FlowRateNotTested', :boolean)
3798
+ @fan_power_defaulted = XMLHelper.get_value(ventilation_fan, 'extension/FanPowerDefaulted', :boolean)
3535
3799
  end
3536
3800
  end
3537
3801
 
@@ -3553,14 +3817,14 @@ class HPXML < Object
3553
3817
  ATTRS = [:id, :year_installed, :fuel_type, :water_heater_type, :location, :performance_adjustment,
3554
3818
  :tank_volume, :fraction_dhw_load_served, :heating_capacity, :energy_factor,
3555
3819
  :uniform_energy_factor, :first_hour_rating, :recovery_efficiency, :uses_desuperheater, :jacket_r_value,
3556
- :related_hvac_idref, :energy_star, :standby_loss, :temperature, :is_shared_system,
3820
+ :related_hvac_idref, :third_party_certification, :standby_loss, :temperature, :is_shared_system,
3557
3821
  :number_of_units_served]
3558
3822
  attr_accessor(*ATTRS)
3559
3823
 
3560
3824
  def related_hvac_system
3561
3825
  return if @related_hvac_idref.nil?
3562
3826
 
3563
- (@hpxml_object.heating_systems + @hpxml_object.cooling_systems + @hpxml_object.heat_pumps).each do |hvac_system|
3827
+ @hpxml_object.hvac_systems.each do |hvac_system|
3564
3828
  next unless hvac_system.id == @related_hvac_idref
3565
3829
 
3566
3830
  return hvac_system
@@ -3593,9 +3857,11 @@ class HPXML < Object
3593
3857
  XMLHelper.add_element(water_heating_system, 'FuelType', @fuel_type, :string) unless @fuel_type.nil?
3594
3858
  XMLHelper.add_element(water_heating_system, 'WaterHeaterType', @water_heater_type, :string) unless @water_heater_type.nil?
3595
3859
  XMLHelper.add_element(water_heating_system, 'Location', @location, :string, @location_isdefaulted) unless @location.nil?
3860
+ XMLHelper.add_element(water_heating_system, 'YearInstalled', @year_installed, :integer) unless @year_installed.nil?
3596
3861
  XMLHelper.add_element(water_heating_system, 'IsSharedSystem', @is_shared_system, :boolean, @is_shared_system_isdefaulted) unless @is_shared_system.nil?
3597
3862
  XMLHelper.add_element(water_heating_system, 'NumberofUnitsServed', @number_of_units_served, :integer) unless @number_of_units_served.nil?
3598
3863
  XMLHelper.add_element(water_heating_system, 'PerformanceAdjustment', @performance_adjustment, :float, @performance_adjustment_isdefaulted) unless @performance_adjustment.nil?
3864
+ XMLHelper.add_element(water_heating_system, 'ThirdPartyCertification', @third_party_certification, :string) unless @third_party_certification.nil?
3599
3865
  XMLHelper.add_element(water_heating_system, 'TankVolume', @tank_volume, :float, @tank_volume_isdefaulted) unless @tank_volume.nil?
3600
3866
  XMLHelper.add_element(water_heating_system, 'FractionDHWLoadServed', @fraction_dhw_load_served, :float) unless @fraction_dhw_load_served.nil?
3601
3867
  XMLHelper.add_element(water_heating_system, 'HeatingCapacity', @heating_capacity, :float, @heating_capacity_isdefaulted) unless @heating_capacity.nil?
@@ -3621,26 +3887,26 @@ class HPXML < Object
3621
3887
  return if water_heating_system.nil?
3622
3888
 
3623
3889
  @id = HPXML::get_id(water_heating_system)
3624
- @year_installed = XMLHelper.get_value(water_heating_system, 'YearInstalled', :integer)
3625
3890
  @fuel_type = XMLHelper.get_value(water_heating_system, 'FuelType', :string)
3626
3891
  @water_heater_type = XMLHelper.get_value(water_heating_system, 'WaterHeaterType', :string)
3627
- @location, @location_isdefaulted = XMLHelper.get_value_and_defaulted(water_heating_system, 'Location', :string)
3628
- @is_shared_system, @is_shared_system_isdefaulted = XMLHelper.get_value_and_defaulted(water_heating_system, 'IsSharedSystem', :boolean)
3892
+ @location = XMLHelper.get_value(water_heating_system, 'Location', :string)
3893
+ @year_installed = XMLHelper.get_value(water_heating_system, 'YearInstalled', :integer)
3894
+ @is_shared_system = XMLHelper.get_value(water_heating_system, 'IsSharedSystem', :boolean)
3629
3895
  @number_of_units_served = XMLHelper.get_value(water_heating_system, 'NumberofUnitsServed', :integer)
3630
- @performance_adjustment, @performance_adjustment_isdefaulted = XMLHelper.get_value_and_defaulted(water_heating_system, 'PerformanceAdjustment', :float)
3631
- @tank_volume, @tank_volume_isdefaulted = XMLHelper.get_value_and_defaulted(water_heating_system, 'TankVolume', :float)
3896
+ @performance_adjustment = XMLHelper.get_value(water_heating_system, 'PerformanceAdjustment', :float)
3897
+ @third_party_certification = XMLHelper.get_value(water_heating_system, 'ThirdPartyCertification', :string)
3898
+ @tank_volume = XMLHelper.get_value(water_heating_system, 'TankVolume', :float)
3632
3899
  @fraction_dhw_load_served = XMLHelper.get_value(water_heating_system, 'FractionDHWLoadServed', :float)
3633
- @heating_capacity, @heating_capacity_isdefaulted = XMLHelper.get_value_and_defaulted(water_heating_system, 'HeatingCapacity', :float)
3900
+ @heating_capacity = XMLHelper.get_value(water_heating_system, 'HeatingCapacity', :float)
3634
3901
  @energy_factor = XMLHelper.get_value(water_heating_system, 'EnergyFactor', :float)
3635
3902
  @uniform_energy_factor = XMLHelper.get_value(water_heating_system, 'UniformEnergyFactor', :float)
3636
3903
  @first_hour_rating = XMLHelper.get_value(water_heating_system, 'FirstHourRating', :float)
3637
- @recovery_efficiency, @recovery_efficiency_isdefaulted = XMLHelper.get_value_and_defaulted(water_heating_system, 'RecoveryEfficiency', :float)
3638
- @uses_desuperheater = XMLHelper.get_value(water_heating_system, 'UsesDesuperheater', :boolean)
3904
+ @recovery_efficiency = XMLHelper.get_value(water_heating_system, 'RecoveryEfficiency', :float)
3639
3905
  @jacket_r_value = XMLHelper.get_value(water_heating_system, 'WaterHeaterInsulation/Jacket/JacketRValue', :float)
3906
+ @standby_loss = XMLHelper.get_value(water_heating_system, 'StandbyLoss', :float)
3907
+ @temperature = XMLHelper.get_value(water_heating_system, 'HotWaterTemperature', :float)
3908
+ @uses_desuperheater = XMLHelper.get_value(water_heating_system, 'UsesDesuperheater', :boolean)
3640
3909
  @related_hvac_idref = HPXML::get_idref(XMLHelper.get_element(water_heating_system, 'RelatedHVACSystem'))
3641
- @energy_star = XMLHelper.get_values(water_heating_system, 'ThirdPartyCertification', :string).include?('Energy Star')
3642
- @standby_loss, @standby_loss_isdefaulted = XMLHelper.get_value_and_defaulted(water_heating_system, 'StandbyLoss', :float)
3643
- @temperature, @temperature_isdefaulted = XMLHelper.get_value_and_defaulted(water_heating_system, 'HotWaterTemperature', :float)
3644
3910
  end
3645
3911
  end
3646
3912
 
@@ -3663,7 +3929,8 @@ class HPXML < Object
3663
3929
  :recirculation_piping_length, :recirculation_branch_piping_length,
3664
3930
  :recirculation_pump_power, :dwhr_facilities_connected, :dwhr_equal_flow,
3665
3931
  :dwhr_efficiency, :has_shared_recirculation, :shared_recirculation_number_of_units_served,
3666
- :shared_recirculation_pump_power, :shared_recirculation_control_type]
3932
+ :shared_recirculation_pump_power, :shared_recirculation_control_type,
3933
+ :shared_recirculation_motor_efficiency]
3667
3934
  attr_accessor(*ATTRS)
3668
3935
 
3669
3936
  def delete
@@ -3683,12 +3950,12 @@ class HPXML < Object
3683
3950
  sys_id = XMLHelper.add_element(hot_water_distribution, 'SystemIdentifier')
3684
3951
  XMLHelper.add_attribute(sys_id, 'id', @id)
3685
3952
  if not @system_type.nil?
3686
- system_type_e = XMLHelper.add_element(hot_water_distribution, 'SystemType')
3953
+ system_type_el = XMLHelper.add_element(hot_water_distribution, 'SystemType')
3687
3954
  if @system_type == DHWDistTypeStandard
3688
- standard = XMLHelper.add_element(system_type_e, @system_type)
3955
+ standard = XMLHelper.add_element(system_type_el, @system_type)
3689
3956
  XMLHelper.add_element(standard, 'PipingLength', @standard_piping_length, :float, @standard_piping_length_isdefaulted) unless @standard_piping_length.nil?
3690
3957
  elsif system_type == DHWDistTypeRecirc
3691
- recirculation = XMLHelper.add_element(system_type_e, @system_type)
3958
+ recirculation = XMLHelper.add_element(system_type_el, @system_type)
3692
3959
  XMLHelper.add_element(recirculation, 'ControlType', @recirculation_control_type, :string) unless @recirculation_control_type.nil?
3693
3960
  XMLHelper.add_element(recirculation, 'RecirculationPipingLoopLength', @recirculation_piping_length, :float, @recirculation_piping_length_isdefaulted) unless @recirculation_piping_length.nil?
3694
3961
  XMLHelper.add_element(recirculation, 'BranchPipingLoopLength', @recirculation_branch_piping_length, :float, @recirculation_branch_piping_length_isdefaulted) unless @recirculation_branch_piping_length.nil?
@@ -3712,6 +3979,7 @@ class HPXML < Object
3712
3979
  shared_recirculation = XMLHelper.add_element(extension, 'SharedRecirculation')
3713
3980
  XMLHelper.add_element(shared_recirculation, 'NumberofUnitsServed', @shared_recirculation_number_of_units_served, :integer) unless @shared_recirculation_number_of_units_served.nil?
3714
3981
  XMLHelper.add_element(shared_recirculation, 'PumpPower', @shared_recirculation_pump_power, :float, @shared_recirculation_pump_power_isdefaulted) unless @shared_recirculation_pump_power.nil?
3982
+ XMLHelper.add_element(shared_recirculation, 'MotorEfficiency', @shared_recirculation_motor_efficiency, :float) unless @shared_recirculation_motor_efficiency.nil?
3715
3983
  XMLHelper.add_element(shared_recirculation, 'ControlType', @shared_recirculation_control_type, :string) unless @shared_recirculation_control_type.nil?
3716
3984
  end
3717
3985
  end
@@ -3721,22 +3989,23 @@ class HPXML < Object
3721
3989
 
3722
3990
  @id = HPXML::get_id(hot_water_distribution)
3723
3991
  @system_type = XMLHelper.get_child_name(hot_water_distribution, 'SystemType')
3724
- @pipe_r_value, @pipe_r_value_isdefaulted = XMLHelper.get_value_and_defaulted(hot_water_distribution, 'PipeInsulation/PipeRValue', :float)
3725
3992
  if @system_type == 'Standard'
3726
- @standard_piping_length, @standard_piping_length_isdefaulted = XMLHelper.get_value_and_defaulted(hot_water_distribution, 'SystemType/Standard/PipingLength', :float)
3993
+ @standard_piping_length = XMLHelper.get_value(hot_water_distribution, 'SystemType/Standard/PipingLength', :float)
3727
3994
  elsif @system_type == 'Recirculation'
3728
3995
  @recirculation_control_type = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/ControlType', :string)
3729
- @recirculation_piping_length, @recirculation_piping_length_isdefaulted = XMLHelper.get_value_and_defaulted(hot_water_distribution, 'SystemType/Recirculation/RecirculationPipingLoopLength', :float)
3730
- @recirculation_branch_piping_length, @recirculation_branch_piping_length_isdefaulted = XMLHelper.get_value_and_defaulted(hot_water_distribution, 'SystemType/Recirculation/BranchPipingLoopLength', :float)
3731
- @recirculation_pump_power, @recirculation_pump_power_isdefaulted = XMLHelper.get_value_and_defaulted(hot_water_distribution, 'SystemType/Recirculation/PumpPower', :float)
3996
+ @recirculation_piping_length = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/RecirculationPipingLoopLength', :float)
3997
+ @recirculation_branch_piping_length = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/BranchPipingLoopLength', :float)
3998
+ @recirculation_pump_power = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/PumpPower', :float)
3732
3999
  end
4000
+ @pipe_r_value = XMLHelper.get_value(hot_water_distribution, 'PipeInsulation/PipeRValue', :float)
3733
4001
  @dwhr_facilities_connected = XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/FacilitiesConnected', :string)
3734
4002
  @dwhr_equal_flow = XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/EqualFlow', :boolean)
3735
4003
  @dwhr_efficiency = XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/Efficiency', :float)
3736
4004
  @has_shared_recirculation = XMLHelper.has_element(hot_water_distribution, 'extension/SharedRecirculation')
3737
4005
  if @has_shared_recirculation
3738
4006
  @shared_recirculation_number_of_units_served = XMLHelper.get_value(hot_water_distribution, 'extension/SharedRecirculation/NumberofUnitsServed', :integer)
3739
- @shared_recirculation_pump_power, @shared_recirculation_pump_power_isdefaulted = XMLHelper.get_value_and_defaulted(hot_water_distribution, 'extension/SharedRecirculation/PumpPower', :float)
4007
+ @shared_recirculation_pump_power = XMLHelper.get_value(hot_water_distribution, 'extension/SharedRecirculation/PumpPower', :float)
4008
+ @shared_recirculation_motor_efficiency = XMLHelper.get_value(hot_water_distribution, 'extension/SharedRecirculation/MotorEfficiency', :float)
3740
4009
  @shared_recirculation_control_type = XMLHelper.get_value(hot_water_distribution, 'extension/SharedRecirculation/ControlType', :string)
3741
4010
  end
3742
4011
  end
@@ -3811,7 +4080,7 @@ class HPXML < Object
3811
4080
  water_heating = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Systems/WaterHeating')
3812
4081
  return if water_heating.nil?
3813
4082
 
3814
- @water_fixtures_usage_multiplier, @water_fixtures_usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(water_heating, 'extension/WaterFixturesUsageMultiplier', :float)
4083
+ @water_fixtures_usage_multiplier = XMLHelper.get_value(water_heating, 'extension/WaterFixturesUsageMultiplier', :float)
3815
4084
  end
3816
4085
  end
3817
4086
 
@@ -3886,12 +4155,12 @@ class HPXML < Object
3886
4155
  @system_type = XMLHelper.get_value(solar_thermal_system, 'SystemType', :string)
3887
4156
  @collector_area = XMLHelper.get_value(solar_thermal_system, 'CollectorArea', :float)
3888
4157
  @collector_loop_type = XMLHelper.get_value(solar_thermal_system, 'CollectorLoopType', :string)
3889
- @collector_azimuth = XMLHelper.get_value(solar_thermal_system, 'CollectorAzimuth', :integer)
3890
4158
  @collector_type = XMLHelper.get_value(solar_thermal_system, 'CollectorType', :string)
4159
+ @collector_azimuth = XMLHelper.get_value(solar_thermal_system, 'CollectorAzimuth', :integer)
3891
4160
  @collector_tilt = XMLHelper.get_value(solar_thermal_system, 'CollectorTilt', :float)
3892
4161
  @collector_frta = XMLHelper.get_value(solar_thermal_system, 'CollectorRatedOpticalEfficiency', :float)
3893
4162
  @collector_frul = XMLHelper.get_value(solar_thermal_system, 'CollectorRatedThermalLosses', :float)
3894
- @storage_volume, @storage_volume_isdefaulted = XMLHelper.get_value_and_defaulted(solar_thermal_system, 'StorageVolume', :float)
4163
+ @storage_volume = XMLHelper.get_value(solar_thermal_system, 'StorageVolume', :float)
3895
4164
  @water_heating_system_idref = HPXML::get_idref(XMLHelper.get_element(solar_thermal_system, 'ConnectedTo'))
3896
4165
  @solar_fraction = XMLHelper.get_value(solar_thermal_system, 'SolarFraction', :float)
3897
4166
  end
@@ -3937,9 +4206,11 @@ class HPXML < Object
3937
4206
  XMLHelper.add_element(pv_system, 'Location', @location, :string, @location_isdefaulted) unless @location.nil?
3938
4207
  XMLHelper.add_element(pv_system, 'ModuleType', @module_type, :string, @module_type_isdefaulted) unless @module_type.nil?
3939
4208
  XMLHelper.add_element(pv_system, 'Tracking', @tracking, :string, @tracking_isdefaulted) unless @tracking.nil?
4209
+ XMLHelper.add_element(pv_system, 'ArrayOrientation', @array_orientation, :string) unless @array_orientation.nil?
3940
4210
  XMLHelper.add_element(pv_system, 'ArrayAzimuth', @array_azimuth, :integer) unless @array_azimuth.nil?
3941
4211
  XMLHelper.add_element(pv_system, 'ArrayTilt', @array_tilt, :float) unless @array_tilt.nil?
3942
4212
  XMLHelper.add_element(pv_system, 'MaxPowerOutput', @max_power_output, :float) unless @max_power_output.nil?
4213
+ XMLHelper.add_element(pv_system, 'NumberOfPanels', @number_of_panels, :integer) unless @number_of_panels.nil?
3943
4214
  XMLHelper.add_element(pv_system, 'InverterEfficiency', @inverter_efficiency, :float, @inverter_efficiency_isdefaulted) unless @inverter_efficiency.nil?
3944
4215
  XMLHelper.add_element(pv_system, 'SystemLossesFraction', @system_losses_fraction, :float, @system_losses_fraction_isdefaulted) unless @system_losses_fraction.nil?
3945
4216
  XMLHelper.add_element(pv_system, 'YearModulesManufactured', @year_modules_manufactured, :integer) unless @year_modules_manufactured.nil?
@@ -3950,17 +4221,17 @@ class HPXML < Object
3950
4221
  return if pv_system.nil?
3951
4222
 
3952
4223
  @id = HPXML::get_id(pv_system)
3953
- @is_shared_system, @is_shared_system_isdefaulted = XMLHelper.get_value_and_defaulted(pv_system, 'IsSharedSystem', :boolean)
3954
- @location, @location_isdefaulted = XMLHelper.get_value_and_defaulted(pv_system, 'Location', :string)
3955
- @module_type, @module_type_isdefaulted = XMLHelper.get_value_and_defaulted(pv_system, 'ModuleType', :string)
3956
- @tracking, @tracking_isdefaulted = XMLHelper.get_value_and_defaulted(pv_system, 'Tracking', :string)
4224
+ @is_shared_system = XMLHelper.get_value(pv_system, 'IsSharedSystem', :boolean)
4225
+ @location = XMLHelper.get_value(pv_system, 'Location', :string)
4226
+ @module_type = XMLHelper.get_value(pv_system, 'ModuleType', :string)
4227
+ @tracking = XMLHelper.get_value(pv_system, 'Tracking', :string)
3957
4228
  @array_orientation = XMLHelper.get_value(pv_system, 'ArrayOrientation', :string)
3958
4229
  @array_azimuth = XMLHelper.get_value(pv_system, 'ArrayAzimuth', :integer)
3959
4230
  @array_tilt = XMLHelper.get_value(pv_system, 'ArrayTilt', :float)
3960
4231
  @max_power_output = XMLHelper.get_value(pv_system, 'MaxPowerOutput', :float)
3961
- @inverter_efficiency, @inverter_efficiency_isdefaulted = XMLHelper.get_value_and_defaulted(pv_system, 'InverterEfficiency', :float)
3962
- @system_losses_fraction, @system_losses_fraction_isdefaulted = XMLHelper.get_value_and_defaulted(pv_system, 'SystemLossesFraction', :float)
3963
4232
  @number_of_panels = XMLHelper.get_value(pv_system, 'NumberOfPanels', :integer)
4233
+ @inverter_efficiency = XMLHelper.get_value(pv_system, 'InverterEfficiency', :float)
4234
+ @system_losses_fraction = XMLHelper.get_value(pv_system, 'SystemLossesFraction', :float)
3964
4235
  @year_modules_manufactured = XMLHelper.get_value(pv_system, 'YearModulesManufactured', :integer)
3965
4236
  @number_of_bedrooms_served = XMLHelper.get_value(pv_system, 'extension/NumberofBedroomsServed', :integer)
3966
4237
  end
@@ -4011,7 +4282,7 @@ class HPXML < Object
4011
4282
  return if generator.nil?
4012
4283
 
4013
4284
  @id = HPXML::get_id(generator)
4014
- @is_shared_system, @is_shared_system_isdefaulted = XMLHelper.get_value_and_defaulted(generator, 'IsSharedSystem', :boolean)
4285
+ @is_shared_system = XMLHelper.get_value(generator, 'IsSharedSystem', :boolean)
4015
4286
  @fuel_type = XMLHelper.get_value(generator, 'FuelType', :string)
4016
4287
  @annual_consumption_kbtu = XMLHelper.get_value(generator, 'AnnualConsumptionkBtu', :float)
4017
4288
  @annual_output_kwh = XMLHelper.get_value(generator, 'AnnualOutputkWh', :float)
@@ -4092,19 +4363,19 @@ class HPXML < Object
4092
4363
 
4093
4364
  @id = HPXML::get_id(clothes_washer)
4094
4365
  @number_of_units = XMLHelper.get_value(clothes_washer, 'NumberofUnits', :integer)
4095
- @is_shared_appliance, @is_shared_appliance_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_washer, 'IsSharedAppliance', :boolean)
4366
+ @is_shared_appliance = XMLHelper.get_value(clothes_washer, 'IsSharedAppliance', :boolean)
4096
4367
  @number_of_units_served = XMLHelper.get_value(clothes_washer, 'NumberofUnitsServed', :integer)
4097
- @location, @location_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_washer, 'Location', :string)
4098
- @modified_energy_factor = XMLHelper.get_value(clothes_washer, 'ModifiedEnergyFactor', :float)
4099
- @integrated_modified_energy_factor, @integrated_modified_energy_factor_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_washer, 'IntegratedModifiedEnergyFactor', :float)
4100
- @rated_annual_kwh, @rated_annual_kwh_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_washer, 'RatedAnnualkWh', :float)
4101
- @label_electric_rate, @label_electric_rate_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_washer, 'LabelElectricRate', :float)
4102
- @label_gas_rate, @label_gas_rate_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_washer, 'LabelGasRate', :float)
4103
- @label_annual_gas_cost, @label_annual_gas_cost_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_washer, 'LabelAnnualGasCost', :float)
4104
- @label_usage, @label_usage_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_washer, 'LabelUsage', :float)
4105
- @capacity, @capacity_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_washer, 'Capacity', :float)
4106
- @usage_multiplier, @usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_washer, 'extension/UsageMultiplier', :float)
4107
4368
  @water_heating_system_idref = HPXML::get_idref(XMLHelper.get_element(clothes_washer, 'AttachedToWaterHeatingSystem'))
4369
+ @location = XMLHelper.get_value(clothes_washer, 'Location', :string)
4370
+ @modified_energy_factor = XMLHelper.get_value(clothes_washer, 'ModifiedEnergyFactor', :float)
4371
+ @integrated_modified_energy_factor = XMLHelper.get_value(clothes_washer, 'IntegratedModifiedEnergyFactor', :float)
4372
+ @rated_annual_kwh = XMLHelper.get_value(clothes_washer, 'RatedAnnualkWh', :float)
4373
+ @label_electric_rate = XMLHelper.get_value(clothes_washer, 'LabelElectricRate', :float)
4374
+ @label_gas_rate = XMLHelper.get_value(clothes_washer, 'LabelGasRate', :float)
4375
+ @label_annual_gas_cost = XMLHelper.get_value(clothes_washer, 'LabelAnnualGasCost', :float)
4376
+ @label_usage = XMLHelper.get_value(clothes_washer, 'LabelUsage', :float)
4377
+ @capacity = XMLHelper.get_value(clothes_washer, 'Capacity', :float)
4378
+ @usage_multiplier = XMLHelper.get_value(clothes_washer, 'extension/UsageMultiplier', :float)
4108
4379
  end
4109
4380
  end
4110
4381
 
@@ -4162,16 +4433,16 @@ class HPXML < Object
4162
4433
 
4163
4434
  @id = HPXML::get_id(clothes_dryer)
4164
4435
  @number_of_units = XMLHelper.get_value(clothes_dryer, 'NumberofUnits', :integer)
4165
- @is_shared_appliance, @is_shared_appliance_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_dryer, 'IsSharedAppliance', :boolean)
4436
+ @is_shared_appliance = XMLHelper.get_value(clothes_dryer, 'IsSharedAppliance', :boolean)
4166
4437
  @number_of_units_served = XMLHelper.get_value(clothes_dryer, 'NumberofUnitsServed', :integer)
4167
- @location, @location_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_dryer, 'Location', :string)
4438
+ @location = XMLHelper.get_value(clothes_dryer, 'Location', :string)
4168
4439
  @fuel_type = XMLHelper.get_value(clothes_dryer, 'FuelType', :string)
4169
4440
  @energy_factor = XMLHelper.get_value(clothes_dryer, 'EnergyFactor', :float)
4170
- @combined_energy_factor, @combined_energy_factor_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_dryer, 'CombinedEnergyFactor', :float)
4171
- @control_type, @control_type_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_dryer, 'ControlType', :string)
4172
- @usage_multiplier, @usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_dryer, 'extension/UsageMultiplier', :float)
4173
- @is_vented, @is_vented_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_dryer, 'extension/IsVented', :boolean)
4174
- @vented_flow_rate, @vented_flow_rate_isdefaulted = XMLHelper.get_value_and_defaulted(clothes_dryer, 'extension/VentedFlowRate', :float)
4441
+ @combined_energy_factor = XMLHelper.get_value(clothes_dryer, 'CombinedEnergyFactor', :float)
4442
+ @control_type = XMLHelper.get_value(clothes_dryer, 'ControlType', :string)
4443
+ @usage_multiplier = XMLHelper.get_value(clothes_dryer, 'extension/UsageMultiplier', :float)
4444
+ @is_vented = XMLHelper.get_value(clothes_dryer, 'extension/IsVented', :boolean)
4445
+ @vented_flow_rate = XMLHelper.get_value(clothes_dryer, 'extension/VentedFlowRate', :float)
4175
4446
  end
4176
4447
  end
4177
4448
 
@@ -4243,17 +4514,17 @@ class HPXML < Object
4243
4514
  return if dishwasher.nil?
4244
4515
 
4245
4516
  @id = HPXML::get_id(dishwasher)
4246
- @is_shared_appliance, @is_shared_appliance_isdefaulted = XMLHelper.get_value_and_defaulted(dishwasher, 'IsSharedAppliance', :boolean)
4247
- @location, @location_isdefaulted = XMLHelper.get_value_and_defaulted(dishwasher, 'Location', :string)
4248
- @rated_annual_kwh, @rated_annual_kwh_isdefaulted = XMLHelper.get_value_and_defaulted(dishwasher, 'RatedAnnualkWh', :float)
4249
- @energy_factor = XMLHelper.get_value(dishwasher, 'EnergyFactor', :float)
4250
- @place_setting_capacity, @place_setting_capacity_isdefaulted = XMLHelper.get_value_and_defaulted(dishwasher, 'PlaceSettingCapacity', :integer)
4251
- @label_electric_rate, @label_electric_rate_isdefaulted = XMLHelper.get_value_and_defaulted(dishwasher, 'LabelElectricRate', :float)
4252
- @label_gas_rate, @label_gas_rate_isdefaulted = XMLHelper.get_value_and_defaulted(dishwasher, 'LabelGasRate', :float)
4253
- @label_annual_gas_cost, @label_annual_gas_cost_isdefaulted = XMLHelper.get_value_and_defaulted(dishwasher, 'LabelAnnualGasCost', :float)
4254
- @label_usage, @label_usage_isdefaulted = XMLHelper.get_value_and_defaulted(dishwasher, 'LabelUsage', :float)
4255
- @usage_multiplier, @usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(dishwasher, 'extension/UsageMultiplier', :float)
4517
+ @is_shared_appliance = XMLHelper.get_value(dishwasher, 'IsSharedAppliance', :boolean)
4256
4518
  @water_heating_system_idref = HPXML::get_idref(XMLHelper.get_element(dishwasher, 'AttachedToWaterHeatingSystem'))
4519
+ @location = XMLHelper.get_value(dishwasher, 'Location', :string)
4520
+ @rated_annual_kwh = XMLHelper.get_value(dishwasher, 'RatedAnnualkWh', :float)
4521
+ @energy_factor = XMLHelper.get_value(dishwasher, 'EnergyFactor', :float)
4522
+ @place_setting_capacity = XMLHelper.get_value(dishwasher, 'PlaceSettingCapacity', :integer)
4523
+ @label_electric_rate = XMLHelper.get_value(dishwasher, 'LabelElectricRate', :float)
4524
+ @label_gas_rate = XMLHelper.get_value(dishwasher, 'LabelGasRate', :float)
4525
+ @label_annual_gas_cost = XMLHelper.get_value(dishwasher, 'LabelAnnualGasCost', :float)
4526
+ @label_usage = XMLHelper.get_value(dishwasher, 'LabelUsage', :float)
4527
+ @usage_multiplier = XMLHelper.get_value(dishwasher, 'extension/UsageMultiplier', :float)
4257
4528
  end
4258
4529
  end
4259
4530
 
@@ -4306,14 +4577,14 @@ class HPXML < Object
4306
4577
  return if refrigerator.nil?
4307
4578
 
4308
4579
  @id = HPXML::get_id(refrigerator)
4309
- @location, @location_isdefaulted = XMLHelper.get_value_and_defaulted(refrigerator, 'Location', :string)
4310
- @rated_annual_kwh, @rated_annual_kwh_isdefaulted = XMLHelper.get_value_and_defaulted(refrigerator, 'RatedAnnualkWh', :float)
4311
- @primary_indicator, @primary_indicator_isdefaulted = XMLHelper.get_value_and_defaulted(refrigerator, 'PrimaryIndicator', :boolean)
4580
+ @location = XMLHelper.get_value(refrigerator, 'Location', :string)
4581
+ @rated_annual_kwh = XMLHelper.get_value(refrigerator, 'RatedAnnualkWh', :float)
4582
+ @primary_indicator = XMLHelper.get_value(refrigerator, 'PrimaryIndicator', :boolean)
4312
4583
  @adjusted_annual_kwh = XMLHelper.get_value(refrigerator, 'extension/AdjustedAnnualkWh', :float)
4313
- @usage_multiplier, @usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(refrigerator, 'extension/UsageMultiplier', :float)
4314
- @weekday_fractions, @weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(refrigerator, 'extension/WeekdayScheduleFractions', :string)
4315
- @weekend_fractions, @weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(refrigerator, 'extension/WeekendScheduleFractions', :string)
4316
- @monthly_multipliers, @monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(refrigerator, 'extension/MonthlyScheduleMultipliers', :string)
4584
+ @usage_multiplier = XMLHelper.get_value(refrigerator, 'extension/UsageMultiplier', :float)
4585
+ @weekday_fractions = XMLHelper.get_value(refrigerator, 'extension/WeekdayScheduleFractions', :string)
4586
+ @weekend_fractions = XMLHelper.get_value(refrigerator, 'extension/WeekendScheduleFractions', :string)
4587
+ @monthly_multipliers = XMLHelper.get_value(refrigerator, 'extension/MonthlyScheduleMultipliers', :string)
4317
4588
  end
4318
4589
  end
4319
4590
 
@@ -4365,13 +4636,13 @@ class HPXML < Object
4365
4636
  return if freezer.nil?
4366
4637
 
4367
4638
  @id = HPXML::get_id(freezer)
4368
- @location, @location_isdefaulted = XMLHelper.get_value_and_defaulted(freezer, 'Location', :string)
4369
- @rated_annual_kwh, @rated_annual_kwh_isdefaulted = XMLHelper.get_value_and_defaulted(freezer, 'RatedAnnualkWh', :float)
4639
+ @location = XMLHelper.get_value(freezer, 'Location', :string)
4640
+ @rated_annual_kwh = XMLHelper.get_value(freezer, 'RatedAnnualkWh', :float)
4370
4641
  @adjusted_annual_kwh = XMLHelper.get_value(freezer, 'extension/AdjustedAnnualkWh', :float)
4371
- @usage_multiplier, @usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(freezer, 'extension/UsageMultiplier', :float)
4372
- @weekday_fractions, @weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(freezer, 'extension/WeekdayScheduleFractions', :string)
4373
- @weekend_fractions, @weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(freezer, 'extension/WeekendScheduleFractions', :string)
4374
- @monthly_multipliers, @monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(freezer, 'extension/MonthlyScheduleMultipliers', :string)
4642
+ @usage_multiplier = XMLHelper.get_value(freezer, 'extension/UsageMultiplier', :float)
4643
+ @weekday_fractions = XMLHelper.get_value(freezer, 'extension/WeekdayScheduleFractions', :string)
4644
+ @weekend_fractions = XMLHelper.get_value(freezer, 'extension/WeekendScheduleFractions', :string)
4645
+ @monthly_multipliers = XMLHelper.get_value(freezer, 'extension/MonthlyScheduleMultipliers', :string)
4375
4646
  end
4376
4647
  end
4377
4648
 
@@ -4390,7 +4661,8 @@ class HPXML < Object
4390
4661
  end
4391
4662
 
4392
4663
  class Dehumidifier < BaseElement
4393
- ATTRS = [:id, :type, :capacity, :energy_factor, :integrated_energy_factor, :rh_setpoint, :fraction_served]
4664
+ ATTRS = [:id, :type, :capacity, :energy_factor, :integrated_energy_factor, :rh_setpoint, :fraction_served,
4665
+ :location]
4394
4666
  attr_accessor(*ATTRS)
4395
4667
 
4396
4668
  def delete
@@ -4410,6 +4682,7 @@ class HPXML < Object
4410
4682
  sys_id = XMLHelper.add_element(dehumidifier, 'SystemIdentifier')
4411
4683
  XMLHelper.add_attribute(sys_id, 'id', @id)
4412
4684
  XMLHelper.add_element(dehumidifier, 'Type', @type, :string) unless @type.nil?
4685
+ XMLHelper.add_element(dehumidifier, 'Location', @location, :string) unless @location.nil?
4413
4686
  XMLHelper.add_element(dehumidifier, 'Capacity', @capacity, :float) unless @capacity.nil?
4414
4687
  XMLHelper.add_element(dehumidifier, 'EnergyFactor', @energy_factor, :float) unless @energy_factor.nil?
4415
4688
  XMLHelper.add_element(dehumidifier, 'IntegratedEnergyFactor', @integrated_energy_factor, :float) unless @integrated_energy_factor.nil?
@@ -4422,6 +4695,7 @@ class HPXML < Object
4422
4695
 
4423
4696
  @id = HPXML::get_id(dehumidifier)
4424
4697
  @type = XMLHelper.get_value(dehumidifier, 'Type', :string)
4698
+ @location = XMLHelper.get_value(dehumidifier, 'Location', :string)
4425
4699
  @capacity = XMLHelper.get_value(dehumidifier, 'Capacity', :float)
4426
4700
  @energy_factor = XMLHelper.get_value(dehumidifier, 'EnergyFactor', :float)
4427
4701
  @integrated_energy_factor = XMLHelper.get_value(dehumidifier, 'IntegratedEnergyFactor', :float)
@@ -4478,13 +4752,13 @@ class HPXML < Object
4478
4752
  return if cooking_range.nil?
4479
4753
 
4480
4754
  @id = HPXML::get_id(cooking_range)
4481
- @location, @location_isdefaulted = XMLHelper.get_value_and_defaulted(cooking_range, 'Location', :string)
4755
+ @location = XMLHelper.get_value(cooking_range, 'Location', :string)
4482
4756
  @fuel_type = XMLHelper.get_value(cooking_range, 'FuelType', :string)
4483
- @is_induction, @is_induction_isdefaulted = XMLHelper.get_value_and_defaulted(cooking_range, 'IsInduction', :boolean)
4484
- @usage_multiplier, @usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(cooking_range, 'extension/UsageMultiplier', :float)
4485
- @weekday_fractions, @weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(cooking_range, 'extension/WeekdayScheduleFractions', :string)
4486
- @weekend_fractions, @weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(cooking_range, 'extension/WeekendScheduleFractions', :string)
4487
- @monthly_multipliers, @monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(cooking_range, 'extension/MonthlyScheduleMultipliers', :string)
4757
+ @is_induction = XMLHelper.get_value(cooking_range, 'IsInduction', :boolean)
4758
+ @usage_multiplier = XMLHelper.get_value(cooking_range, 'extension/UsageMultiplier', :float)
4759
+ @weekday_fractions = XMLHelper.get_value(cooking_range, 'extension/WeekdayScheduleFractions', :string)
4760
+ @weekend_fractions = XMLHelper.get_value(cooking_range, 'extension/WeekendScheduleFractions', :string)
4761
+ @monthly_multipliers = XMLHelper.get_value(cooking_range, 'extension/MonthlyScheduleMultipliers', :string)
4488
4762
  end
4489
4763
  end
4490
4764
 
@@ -4529,7 +4803,7 @@ class HPXML < Object
4529
4803
  return if oven.nil?
4530
4804
 
4531
4805
  @id = HPXML::get_id(oven)
4532
- @is_convection, @is_convection_isdefaulted = XMLHelper.get_value_and_defaulted(oven, 'IsConvection', :boolean)
4806
+ @is_convection = XMLHelper.get_value(oven, 'IsConvection', :boolean)
4533
4807
  end
4534
4808
  end
4535
4809
 
@@ -4637,27 +4911,27 @@ class HPXML < Object
4637
4911
  lighting = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Lighting')
4638
4912
  return if lighting.nil?
4639
4913
 
4640
- @interior_usage_multiplier, @interior_usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/InteriorUsageMultiplier', :float)
4641
- @garage_usage_multiplier, @garage_usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/GarageUsageMultiplier', :float)
4642
- @exterior_usage_multiplier, @exterior_usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/ExteriorUsageMultiplier', :float)
4643
- @interior_weekday_fractions, @interior_weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/InteriorWeekdayScheduleFractions', :string)
4644
- @interior_weekend_fractions, @interior_weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/InteriorWeekendScheduleFractions', :string)
4645
- @interior_monthly_multipliers, @interior_monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/InteriorMonthlyScheduleMultipliers', :string)
4646
- @garage_weekday_fractions, @garage_weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/GarageWeekdayScheduleFractions', :string)
4647
- @garage_weekend_fractions, @garage_weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/GarageWeekendScheduleFractions', :string)
4648
- @garage_monthly_multipliers, @garage_monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/GarageMonthlyScheduleMultipliers', :string)
4649
- @exterior_weekday_fractions, @exterior_weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/ExteriorWeekdayScheduleFractions', :string)
4650
- @exterior_weekend_fractions, @exterior_weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/ExteriorWeekendScheduleFractions', :string)
4651
- @exterior_monthly_multipliers, @exterior_monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/ExteriorMonthlyScheduleMultipliers', :string)
4914
+ @interior_usage_multiplier = XMLHelper.get_value(lighting, 'extension/InteriorUsageMultiplier', :float)
4915
+ @garage_usage_multiplier = XMLHelper.get_value(lighting, 'extension/GarageUsageMultiplier', :float)
4916
+ @exterior_usage_multiplier = XMLHelper.get_value(lighting, 'extension/ExteriorUsageMultiplier', :float)
4917
+ @interior_weekday_fractions = XMLHelper.get_value(lighting, 'extension/InteriorWeekdayScheduleFractions', :string)
4918
+ @interior_weekend_fractions = XMLHelper.get_value(lighting, 'extension/InteriorWeekendScheduleFractions', :string)
4919
+ @interior_monthly_multipliers = XMLHelper.get_value(lighting, 'extension/InteriorMonthlyScheduleMultipliers', :string)
4920
+ @garage_weekday_fractions = XMLHelper.get_value(lighting, 'extension/GarageWeekdayScheduleFractions', :string)
4921
+ @garage_weekend_fractions = XMLHelper.get_value(lighting, 'extension/GarageWeekendScheduleFractions', :string)
4922
+ @garage_monthly_multipliers = XMLHelper.get_value(lighting, 'extension/GarageMonthlyScheduleMultipliers', :string)
4923
+ @exterior_weekday_fractions = XMLHelper.get_value(lighting, 'extension/ExteriorWeekdayScheduleFractions', :string)
4924
+ @exterior_weekend_fractions = XMLHelper.get_value(lighting, 'extension/ExteriorWeekendScheduleFractions', :string)
4925
+ @exterior_monthly_multipliers = XMLHelper.get_value(lighting, 'extension/ExteriorMonthlyScheduleMultipliers', :string)
4652
4926
  if not XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Lighting/extension/ExteriorHolidayLighting').nil?
4653
4927
  @holiday_exists = true
4654
- @holiday_kwh_per_day, @holiday_kwh_per_day_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/ExteriorHolidayLighting/Load[Units="kWh/day"]/Value', :float)
4655
- @holiday_period_begin_month, @holiday_period_begin_month_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/ExteriorHolidayLighting/PeriodBeginMonth', :integer)
4656
- @holiday_period_begin_day, @holiday_period_begin_day_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/ExteriorHolidayLighting/PeriodBeginDayOfMonth', :integer)
4657
- @holiday_period_end_month, @holiday_period_end_month_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/ExteriorHolidayLighting/PeriodEndMonth', :integer)
4658
- @holiday_period_end_day, @holiday_period_end_day_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/ExteriorHolidayLighting/PeriodEndDayOfMonth', :integer)
4659
- @holiday_weekday_fractions, @holiday_weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/ExteriorHolidayLighting/WeekdayScheduleFractions', :string)
4660
- @holiday_weekend_fractions, @holiday_weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(lighting, 'extension/ExteriorHolidayLighting/WeekendScheduleFractions', :string)
4928
+ @holiday_kwh_per_day = XMLHelper.get_value(lighting, 'extension/ExteriorHolidayLighting/Load[Units="kWh/day"]/Value', :float)
4929
+ @holiday_period_begin_month = XMLHelper.get_value(lighting, 'extension/ExteriorHolidayLighting/PeriodBeginMonth', :integer)
4930
+ @holiday_period_begin_day = XMLHelper.get_value(lighting, 'extension/ExteriorHolidayLighting/PeriodBeginDayOfMonth', :integer)
4931
+ @holiday_period_end_month = XMLHelper.get_value(lighting, 'extension/ExteriorHolidayLighting/PeriodEndMonth', :integer)
4932
+ @holiday_period_end_day = XMLHelper.get_value(lighting, 'extension/ExteriorHolidayLighting/PeriodEndDayOfMonth', :integer)
4933
+ @holiday_weekday_fractions = XMLHelper.get_value(lighting, 'extension/ExteriorHolidayLighting/WeekdayScheduleFractions', :string)
4934
+ @holiday_weekend_fractions = XMLHelper.get_value(lighting, 'extension/ExteriorHolidayLighting/WeekendScheduleFractions', :string)
4661
4935
  else
4662
4936
  @holiday_exists = false
4663
4937
  end
@@ -4708,8 +4982,8 @@ class HPXML < Object
4708
4982
 
4709
4983
  def from_oga(ceiling_fan)
4710
4984
  @id = HPXML::get_id(ceiling_fan)
4711
- @efficiency, @efficiency_isdefaulted = XMLHelper.get_value_and_defaulted(ceiling_fan, "Airflow[FanSpeed='medium']/Efficiency", :float)
4712
- @quantity, @quantity_isdefaulted = XMLHelper.get_value_and_defaulted(ceiling_fan, 'Quantity', :integer)
4985
+ @efficiency = XMLHelper.get_value(ceiling_fan, "Airflow[FanSpeed='medium']/Efficiency", :float)
4986
+ @quantity = XMLHelper.get_value(ceiling_fan, 'Quantity', :integer)
4713
4987
  end
4714
4988
  end
4715
4989
 
@@ -4728,8 +5002,8 @@ class HPXML < Object
4728
5002
  end
4729
5003
 
4730
5004
  class Pool < BaseElement
4731
- ATTRS = [:id, :heater_id, :heater_type, :heater_load_units, :heater_load_value, :heater_usage_multiplier,
4732
- :pump_id, :pump_kwh_per_year, :pump_usage_multiplier,
5005
+ ATTRS = [:id, :type, :heater_id, :heater_type, :heater_load_units, :heater_load_value, :heater_usage_multiplier,
5006
+ :pump_id, :pump_type, :pump_kwh_per_year, :pump_usage_multiplier,
4733
5007
  :heater_weekday_fractions, :heater_weekend_fractions, :heater_monthly_multipliers,
4734
5008
  :pump_weekday_fractions, :pump_weekend_fractions, :pump_monthly_multipliers]
4735
5009
  attr_accessor(*ATTRS)
@@ -4750,24 +5024,28 @@ class HPXML < Object
4750
5024
  pool = XMLHelper.add_element(pools, 'Pool')
4751
5025
  sys_id = XMLHelper.add_element(pool, 'SystemIdentifier')
4752
5026
  XMLHelper.add_attribute(sys_id, 'id', @id)
4753
- pumps = XMLHelper.add_element(pool, 'PoolPumps')
4754
- pool_pump = XMLHelper.add_element(pumps, 'PoolPump')
4755
- sys_id = XMLHelper.add_element(pool_pump, 'SystemIdentifier')
4756
- if not @pump_id.nil?
4757
- XMLHelper.add_attribute(sys_id, 'id', @pump_id)
4758
- else
4759
- XMLHelper.add_attribute(sys_id, 'id', @id + 'Pump')
4760
- end
4761
- if not @pump_kwh_per_year.nil?
4762
- load = XMLHelper.add_element(pool_pump, 'Load')
4763
- XMLHelper.add_element(load, 'Units', UnitsKwhPerYear, :string)
4764
- XMLHelper.add_element(load, 'Value', @pump_kwh_per_year, :float, @pump_kwh_per_year_isdefaulted)
4765
- XMLHelper.add_extension(pool_pump, 'UsageMultiplier', @pump_usage_multiplier, :float, @pump_usage_multiplier_isdefaulted) unless @pump_usage_multiplier.nil?
4766
- XMLHelper.add_extension(pool_pump, 'WeekdayScheduleFractions', @pump_weekday_fractions, :string, @pump_weekday_fractions_isdefaulted) unless @pump_weekday_fractions.nil?
4767
- XMLHelper.add_extension(pool_pump, 'WeekendScheduleFractions', @pump_weekend_fractions, :string, @pump_weekend_fractions_isdefaulted) unless @pump_weekend_fractions.nil?
4768
- XMLHelper.add_extension(pool_pump, 'MonthlyScheduleMultipliers', @pump_monthly_multipliers, :string, @pump_monthly_multipliers_isdefaulted) unless @pump_monthly_multipliers.nil?
4769
- end
4770
- if not @heater_type.nil?
5027
+ XMLHelper.add_element(pool, 'Type', @type, :string) unless @type.nil?
5028
+ if @type != HPXML::TypeNone
5029
+ pumps = XMLHelper.add_element(pool, 'PoolPumps')
5030
+ pool_pump = XMLHelper.add_element(pumps, 'PoolPump')
5031
+ sys_id = XMLHelper.add_element(pool_pump, 'SystemIdentifier')
5032
+ if not @pump_id.nil?
5033
+ XMLHelper.add_attribute(sys_id, 'id', @pump_id)
5034
+ else
5035
+ XMLHelper.add_attribute(sys_id, 'id', @id + 'Pump')
5036
+ end
5037
+ XMLHelper.add_element(pool_pump, 'Type', @pump_type, :string)
5038
+ if @pump_type != HPXML::TypeNone
5039
+ if not @pump_kwh_per_year.nil?
5040
+ load = XMLHelper.add_element(pool_pump, 'Load')
5041
+ XMLHelper.add_element(load, 'Units', UnitsKwhPerYear, :string)
5042
+ XMLHelper.add_element(load, 'Value', @pump_kwh_per_year, :float, @pump_kwh_per_year_isdefaulted)
5043
+ end
5044
+ XMLHelper.add_extension(pool_pump, 'UsageMultiplier', @pump_usage_multiplier, :float, @pump_usage_multiplier_isdefaulted) unless @pump_usage_multiplier.nil?
5045
+ XMLHelper.add_extension(pool_pump, 'WeekdayScheduleFractions', @pump_weekday_fractions, :string, @pump_weekday_fractions_isdefaulted) unless @pump_weekday_fractions.nil?
5046
+ XMLHelper.add_extension(pool_pump, 'WeekendScheduleFractions', @pump_weekend_fractions, :string, @pump_weekend_fractions_isdefaulted) unless @pump_weekend_fractions.nil?
5047
+ XMLHelper.add_extension(pool_pump, 'MonthlyScheduleMultipliers', @pump_monthly_multipliers, :string, @pump_monthly_multipliers_isdefaulted) unless @pump_monthly_multipliers.nil?
5048
+ end
4771
5049
  heater = XMLHelper.add_element(pool, 'Heater')
4772
5050
  sys_id = XMLHelper.add_element(heater, 'SystemIdentifier')
4773
5051
  if not @heater_id.nil?
@@ -4776,37 +5054,43 @@ class HPXML < Object
4776
5054
  XMLHelper.add_attribute(sys_id, 'id', @id + 'Heater')
4777
5055
  end
4778
5056
  XMLHelper.add_element(heater, 'Type', @heater_type, :string)
4779
- if (not @heater_load_units.nil?) && (not @heater_load_value.nil?)
4780
- load = XMLHelper.add_element(heater, 'Load')
4781
- XMLHelper.add_element(load, 'Units', @heater_load_units, :string)
4782
- XMLHelper.add_element(load, 'Value', @heater_load_value, :float, @heater_load_value_isdefaulted)
5057
+ if @heater_type != HPXML::TypeNone
5058
+ if (not @heater_load_units.nil?) && (not @heater_load_value.nil?)
5059
+ load = XMLHelper.add_element(heater, 'Load')
5060
+ XMLHelper.add_element(load, 'Units', @heater_load_units, :string)
5061
+ XMLHelper.add_element(load, 'Value', @heater_load_value, :float, @heater_load_value_isdefaulted)
5062
+ end
5063
+ XMLHelper.add_extension(heater, 'UsageMultiplier', @heater_usage_multiplier, :float, @heater_usage_multiplier_isdefaulted) unless @heater_usage_multiplier.nil?
5064
+ XMLHelper.add_extension(heater, 'WeekdayScheduleFractions', @heater_weekday_fractions, :string, @heater_weekday_fractions_isdefaulted) unless @heater_weekday_fractions.nil?
5065
+ XMLHelper.add_extension(heater, 'WeekendScheduleFractions', @heater_weekend_fractions, :string, @heater_weekend_fractions_isdefaulted) unless @heater_weekend_fractions.nil?
5066
+ XMLHelper.add_extension(heater, 'MonthlyScheduleMultipliers', @heater_monthly_multipliers, :string, @heater_monthly_multipliers_isdefaulted) unless @heater_monthly_multipliers.nil?
4783
5067
  end
4784
- XMLHelper.add_extension(heater, 'UsageMultiplier', @heater_usage_multiplier, :float, @heater_usage_multiplier_isdefaulted) unless @heater_usage_multiplier.nil?
4785
- XMLHelper.add_extension(heater, 'WeekdayScheduleFractions', @heater_weekday_fractions, :string, @heater_weekday_fractions_isdefaulted) unless @heater_weekday_fractions.nil?
4786
- XMLHelper.add_extension(heater, 'WeekendScheduleFractions', @heater_weekend_fractions, :string, @heater_weekend_fractions_isdefaulted) unless @heater_weekend_fractions.nil?
4787
- XMLHelper.add_extension(heater, 'MonthlyScheduleMultipliers', @heater_monthly_multipliers, :string, @heater_monthly_multipliers_isdefaulted) unless @heater_monthly_multipliers.nil?
4788
5068
  end
4789
5069
  end
4790
5070
 
4791
5071
  def from_oga(pool)
4792
5072
  @id = HPXML::get_id(pool)
5073
+ @type = XMLHelper.get_value(pool, 'Type', :string)
4793
5074
  pool_pump = XMLHelper.get_element(pool, 'PoolPumps/PoolPump')
4794
- @pump_id = HPXML::get_id(pool_pump)
4795
- @pump_kwh_per_year, @pump_kwh_per_year_isdefaulted = XMLHelper.get_value_and_defaulted(pool_pump, "Load[Units='#{UnitsKwhPerYear}']/Value", :float)
4796
- @pump_usage_multiplier, @pump_usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(pool_pump, 'extension/UsageMultiplier', :float)
4797
- @pump_weekday_fractions, @pump_weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(pool_pump, 'extension/WeekdayScheduleFractions', :string)
4798
- @pump_weekend_fractions, @pump_weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(pool_pump, 'extension/WeekendScheduleFractions', :string)
4799
- @pump_monthly_multipliers, @pump_monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(pool_pump, 'extension/MonthlyScheduleMultipliers', :string)
5075
+ if not pool_pump.nil?
5076
+ @pump_id = HPXML::get_id(pool_pump)
5077
+ @pump_type = XMLHelper.get_value(pool_pump, 'Type', :string)
5078
+ @pump_kwh_per_year = XMLHelper.get_value(pool_pump, "Load[Units='#{UnitsKwhPerYear}']/Value", :float)
5079
+ @pump_usage_multiplier = XMLHelper.get_value(pool_pump, 'extension/UsageMultiplier', :float)
5080
+ @pump_weekday_fractions = XMLHelper.get_value(pool_pump, 'extension/WeekdayScheduleFractions', :string)
5081
+ @pump_weekend_fractions = XMLHelper.get_value(pool_pump, 'extension/WeekendScheduleFractions', :string)
5082
+ @pump_monthly_multipliers = XMLHelper.get_value(pool_pump, 'extension/MonthlyScheduleMultipliers', :string)
5083
+ end
4800
5084
  heater = XMLHelper.get_element(pool, 'Heater')
4801
5085
  if not heater.nil?
4802
5086
  @heater_id = HPXML::get_id(heater)
4803
5087
  @heater_type = XMLHelper.get_value(heater, 'Type', :string)
4804
5088
  @heater_load_units = XMLHelper.get_value(heater, 'Load/Units', :string)
4805
- @heater_load_value, @heater_load_value_isdefaulted = XMLHelper.get_value_and_defaulted(heater, 'Load/Value', :float)
4806
- @heater_usage_multiplier, @heater_usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(heater, 'extension/UsageMultiplier', :float)
4807
- @heater_weekday_fractions, @heater_weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(heater, 'extension/WeekdayScheduleFractions', :string)
4808
- @heater_weekend_fractions, @heater_weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(heater, 'extension/WeekendScheduleFractions', :string)
4809
- @heater_monthly_multipliers, @heater_monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(heater, 'extension/MonthlyScheduleMultipliers', :string)
5089
+ @heater_load_value = XMLHelper.get_value(heater, 'Load/Value', :float)
5090
+ @heater_usage_multiplier = XMLHelper.get_value(heater, 'extension/UsageMultiplier', :float)
5091
+ @heater_weekday_fractions = XMLHelper.get_value(heater, 'extension/WeekdayScheduleFractions', :string)
5092
+ @heater_weekend_fractions = XMLHelper.get_value(heater, 'extension/WeekendScheduleFractions', :string)
5093
+ @heater_monthly_multipliers = XMLHelper.get_value(heater, 'extension/MonthlyScheduleMultipliers', :string)
4810
5094
  end
4811
5095
  end
4812
5096
  end
@@ -4826,8 +5110,8 @@ class HPXML < Object
4826
5110
  end
4827
5111
 
4828
5112
  class HotTub < BaseElement
4829
- ATTRS = [:id, :heater_id, :heater_type, :heater_load_units, :heater_load_value, :heater_usage_multiplier,
4830
- :pump_id, :pump_kwh_per_year, :pump_usage_multiplier,
5113
+ ATTRS = [:id, :type, :heater_id, :heater_type, :heater_load_units, :heater_load_value, :heater_usage_multiplier,
5114
+ :pump_id, :pump_type, :pump_kwh_per_year, :pump_usage_multiplier,
4831
5115
  :heater_weekday_fractions, :heater_weekend_fractions, :heater_monthly_multipliers,
4832
5116
  :pump_weekday_fractions, :pump_weekend_fractions, :pump_monthly_multipliers]
4833
5117
  attr_accessor(*ATTRS)
@@ -4848,24 +5132,28 @@ class HPXML < Object
4848
5132
  hot_tub = XMLHelper.add_element(hot_tubs, 'HotTub')
4849
5133
  sys_id = XMLHelper.add_element(hot_tub, 'SystemIdentifier')
4850
5134
  XMLHelper.add_attribute(sys_id, 'id', @id)
4851
- pumps = XMLHelper.add_element(hot_tub, 'HotTubPumps')
4852
- hot_tub_pump = XMLHelper.add_element(pumps, 'HotTubPump')
4853
- sys_id = XMLHelper.add_element(hot_tub_pump, 'SystemIdentifier')
4854
- if not @pump_id.nil?
4855
- XMLHelper.add_attribute(sys_id, 'id', @pump_id)
4856
- else
4857
- XMLHelper.add_attribute(sys_id, 'id', @id + 'Pump')
4858
- end
4859
- if not @pump_kwh_per_year.nil?
4860
- load = XMLHelper.add_element(hot_tub_pump, 'Load')
4861
- XMLHelper.add_element(load, 'Units', UnitsKwhPerYear, :string)
4862
- XMLHelper.add_element(load, 'Value', @pump_kwh_per_year, :float, @pump_kwh_per_year_isdefaulted)
4863
- XMLHelper.add_extension(hot_tub_pump, 'UsageMultiplier', @pump_usage_multiplier, :float, @pump_usage_multiplier_isdefaulted) unless @pump_usage_multiplier.nil?
4864
- XMLHelper.add_extension(hot_tub_pump, 'WeekdayScheduleFractions', @pump_weekday_fractions, :string, @pump_weekday_fractions_isdefaulted) unless @pump_weekday_fractions.nil?
4865
- XMLHelper.add_extension(hot_tub_pump, 'WeekendScheduleFractions', @pump_weekend_fractions, :string, @pump_weekend_fractions_isdefaulted) unless @pump_weekend_fractions.nil?
4866
- XMLHelper.add_extension(hot_tub_pump, 'MonthlyScheduleMultipliers', @pump_monthly_multipliers, :string, @pump_monthly_multipliers_isdefaulted) unless @pump_monthly_multipliers.nil?
4867
- end
4868
- if not @heater_type.nil?
5135
+ XMLHelper.add_element(hot_tub, 'Type', @type, :string) unless @type.nil?
5136
+ if @type != HPXML::TypeNone
5137
+ pumps = XMLHelper.add_element(hot_tub, 'HotTubPumps')
5138
+ hot_tub_pump = XMLHelper.add_element(pumps, 'HotTubPump')
5139
+ sys_id = XMLHelper.add_element(hot_tub_pump, 'SystemIdentifier')
5140
+ if not @pump_id.nil?
5141
+ XMLHelper.add_attribute(sys_id, 'id', @pump_id)
5142
+ else
5143
+ XMLHelper.add_attribute(sys_id, 'id', @id + 'Pump')
5144
+ end
5145
+ XMLHelper.add_element(hot_tub_pump, 'Type', @pump_type, :string)
5146
+ if @pump_type != HPXML::TypeNone
5147
+ if not @pump_kwh_per_year.nil?
5148
+ load = XMLHelper.add_element(hot_tub_pump, 'Load')
5149
+ XMLHelper.add_element(load, 'Units', UnitsKwhPerYear, :string)
5150
+ XMLHelper.add_element(load, 'Value', @pump_kwh_per_year, :float, @pump_kwh_per_year_isdefaulted)
5151
+ end
5152
+ XMLHelper.add_extension(hot_tub_pump, 'UsageMultiplier', @pump_usage_multiplier, :float, @pump_usage_multiplier_isdefaulted) unless @pump_usage_multiplier.nil?
5153
+ XMLHelper.add_extension(hot_tub_pump, 'WeekdayScheduleFractions', @pump_weekday_fractions, :string, @pump_weekday_fractions_isdefaulted) unless @pump_weekday_fractions.nil?
5154
+ XMLHelper.add_extension(hot_tub_pump, 'WeekendScheduleFractions', @pump_weekend_fractions, :string, @pump_weekend_fractions_isdefaulted) unless @pump_weekend_fractions.nil?
5155
+ XMLHelper.add_extension(hot_tub_pump, 'MonthlyScheduleMultipliers', @pump_monthly_multipliers, :string, @pump_monthly_multipliers_isdefaulted) unless @pump_monthly_multipliers.nil?
5156
+ end
4869
5157
  heater = XMLHelper.add_element(hot_tub, 'Heater')
4870
5158
  sys_id = XMLHelper.add_element(heater, 'SystemIdentifier')
4871
5159
  if not @heater_id.nil?
@@ -4874,37 +5162,43 @@ class HPXML < Object
4874
5162
  XMLHelper.add_attribute(sys_id, 'id', @id + 'Heater')
4875
5163
  end
4876
5164
  XMLHelper.add_element(heater, 'Type', @heater_type, :string)
4877
- if (not @heater_load_units.nil?) && (not @heater_load_value.nil?)
4878
- load = XMLHelper.add_element(heater, 'Load')
4879
- XMLHelper.add_element(load, 'Units', @heater_load_units, :string)
4880
- XMLHelper.add_element(load, 'Value', @heater_load_value, :float, @heater_load_value_isdefaulted)
5165
+ if @heater_type != HPXML::TypeNone
5166
+ if (not @heater_load_units.nil?) && (not @heater_load_value.nil?)
5167
+ load = XMLHelper.add_element(heater, 'Load')
5168
+ XMLHelper.add_element(load, 'Units', @heater_load_units, :string)
5169
+ XMLHelper.add_element(load, 'Value', @heater_load_value, :float, @heater_load_value_isdefaulted)
5170
+ end
5171
+ XMLHelper.add_extension(heater, 'UsageMultiplier', @heater_usage_multiplier, :float, @heater_usage_multiplier_isdefaulted) unless @heater_usage_multiplier.nil?
5172
+ XMLHelper.add_extension(heater, 'WeekdayScheduleFractions', @heater_weekday_fractions, :string, @heater_weekday_fractions_isdefaulted) unless @heater_weekday_fractions.nil?
5173
+ XMLHelper.add_extension(heater, 'WeekendScheduleFractions', @heater_weekend_fractions, :string, @heater_weekend_fractions_isdefaulted) unless @heater_weekend_fractions.nil?
5174
+ XMLHelper.add_extension(heater, 'MonthlyScheduleMultipliers', @heater_monthly_multipliers, :string, @heater_monthly_multipliers_isdefaulted) unless @heater_monthly_multipliers.nil?
4881
5175
  end
4882
- XMLHelper.add_extension(heater, 'UsageMultiplier', @heater_usage_multiplier, :float, @heater_usage_multiplier_isdefaulted) unless @heater_usage_multiplier.nil?
4883
- XMLHelper.add_extension(heater, 'WeekdayScheduleFractions', @heater_weekday_fractions, :string, @heater_weekday_fractions_isdefaulted) unless @heater_weekday_fractions.nil?
4884
- XMLHelper.add_extension(heater, 'WeekendScheduleFractions', @heater_weekend_fractions, :string, @heater_weekend_fractions_isdefaulted) unless @heater_weekend_fractions.nil?
4885
- XMLHelper.add_extension(heater, 'MonthlyScheduleMultipliers', @heater_monthly_multipliers, :string, @heater_monthly_multipliers_isdefaulted) unless @heater_monthly_multipliers.nil?
4886
5176
  end
4887
5177
  end
4888
5178
 
4889
5179
  def from_oga(hot_tub)
4890
5180
  @id = HPXML::get_id(hot_tub)
5181
+ @type = XMLHelper.get_value(hot_tub, 'Type', :string)
4891
5182
  hot_tub_pump = XMLHelper.get_element(hot_tub, 'HotTubPumps/HotTubPump')
4892
- @pump_id = HPXML::get_id(hot_tub_pump)
4893
- @pump_kwh_per_year, @pump_kwh_per_year_isdefaulted = XMLHelper.get_value_and_defaulted(hot_tub_pump, "Load[Units='#{UnitsKwhPerYear}']/Value", :float)
4894
- @pump_usage_multiplier, @pump_usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(hot_tub_pump, 'extension/UsageMultiplier', :float)
4895
- @pump_weekday_fractions, @pump_weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(hot_tub_pump, 'extension/WeekdayScheduleFractions', :string)
4896
- @pump_weekend_fractions, @pump_weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(hot_tub_pump, 'extension/WeekendScheduleFractions', :string)
4897
- @pump_monthly_multipliers, @pump_monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(hot_tub_pump, 'extension/MonthlyScheduleMultipliers', :string)
5183
+ if not hot_tub_pump.nil?
5184
+ @pump_id = HPXML::get_id(hot_tub_pump)
5185
+ @pump_type = XMLHelper.get_value(hot_tub_pump, 'Type', :string)
5186
+ @pump_kwh_per_year = XMLHelper.get_value(hot_tub_pump, "Load[Units='#{UnitsKwhPerYear}']/Value", :float)
5187
+ @pump_usage_multiplier = XMLHelper.get_value(hot_tub_pump, 'extension/UsageMultiplier', :float)
5188
+ @pump_weekday_fractions = XMLHelper.get_value(hot_tub_pump, 'extension/WeekdayScheduleFractions', :string)
5189
+ @pump_weekend_fractions = XMLHelper.get_value(hot_tub_pump, 'extension/WeekendScheduleFractions', :string)
5190
+ @pump_monthly_multipliers = XMLHelper.get_value(hot_tub_pump, 'extension/MonthlyScheduleMultipliers', :string)
5191
+ end
4898
5192
  heater = XMLHelper.get_element(hot_tub, 'Heater')
4899
5193
  if not heater.nil?
4900
5194
  @heater_id = HPXML::get_id(heater)
4901
5195
  @heater_type = XMLHelper.get_value(heater, 'Type', :string)
4902
5196
  @heater_load_units = XMLHelper.get_value(heater, 'Load/Units', :string)
4903
- @heater_load_value, @heater_load_value_isdefaulted = XMLHelper.get_value_and_defaulted(heater, 'Load/Value', :float)
4904
- @heater_usage_multiplier, @heater_usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(heater, 'extension/UsageMultiplier', :float)
4905
- @heater_weekday_fractions, @heater_weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(heater, 'extension/WeekdayScheduleFractions', :string)
4906
- @heater_weekend_fractions, @heater_weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(heater, 'extension/WeekendScheduleFractions', :string)
4907
- @heater_monthly_multipliers, @heater_monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(heater, 'extension/MonthlyScheduleMultipliers', :string)
5197
+ @heater_load_value = XMLHelper.get_value(heater, 'Load/Value', :float)
5198
+ @heater_usage_multiplier = XMLHelper.get_value(heater, 'extension/UsageMultiplier', :float)
5199
+ @heater_weekday_fractions = XMLHelper.get_value(heater, 'extension/WeekdayScheduleFractions', :string)
5200
+ @heater_weekend_fractions = XMLHelper.get_value(heater, 'extension/WeekendScheduleFractions', :string)
5201
+ @heater_monthly_multipliers = XMLHelper.get_value(heater, 'extension/MonthlyScheduleMultipliers', :string)
4908
5202
  end
4909
5203
  end
4910
5204
  end
@@ -4961,13 +5255,13 @@ class HPXML < Object
4961
5255
  def from_oga(plug_load)
4962
5256
  @id = HPXML::get_id(plug_load)
4963
5257
  @plug_load_type = XMLHelper.get_value(plug_load, 'PlugLoadType', :string)
4964
- @kWh_per_year, @kWh_per_year_isdefaulted = XMLHelper.get_value_and_defaulted(plug_load, "Load[Units='#{UnitsKwhPerYear}']/Value", :float)
4965
- @frac_sensible, @frac_sensible_isdefaulted = XMLHelper.get_value_and_defaulted(plug_load, 'extension/FracSensible', :float)
4966
- @frac_latent, @frac_latent_isdefaulted = XMLHelper.get_value_and_defaulted(plug_load, 'extension/FracLatent', :float)
4967
- @usage_multiplier, @usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(plug_load, 'extension/UsageMultiplier', :float)
4968
- @weekday_fractions, @weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(plug_load, 'extension/WeekdayScheduleFractions', :string)
4969
- @weekend_fractions, @weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(plug_load, 'extension/WeekendScheduleFractions', :string)
4970
- @monthly_multipliers, @monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(plug_load, 'extension/MonthlyScheduleMultipliers', :string)
5258
+ @kWh_per_year = XMLHelper.get_value(plug_load, "Load[Units='#{UnitsKwhPerYear}']/Value", :float)
5259
+ @frac_sensible = XMLHelper.get_value(plug_load, 'extension/FracSensible', :float)
5260
+ @frac_latent = XMLHelper.get_value(plug_load, 'extension/FracLatent', :float)
5261
+ @usage_multiplier = XMLHelper.get_value(plug_load, 'extension/UsageMultiplier', :float)
5262
+ @weekday_fractions = XMLHelper.get_value(plug_load, 'extension/WeekdayScheduleFractions', :string)
5263
+ @weekend_fractions = XMLHelper.get_value(plug_load, 'extension/WeekendScheduleFractions', :string)
5264
+ @monthly_multipliers = XMLHelper.get_value(plug_load, 'extension/MonthlyScheduleMultipliers', :string)
4971
5265
  end
4972
5266
  end
4973
5267
 
@@ -5024,14 +5318,14 @@ class HPXML < Object
5024
5318
  def from_oga(fuel_load)
5025
5319
  @id = HPXML::get_id(fuel_load)
5026
5320
  @fuel_load_type = XMLHelper.get_value(fuel_load, 'FuelLoadType', :string)
5027
- @therm_per_year, @therm_per_year_isdefaulted = XMLHelper.get_value_and_defaulted(fuel_load, "Load[Units='#{UnitsThermPerYear}']/Value", :float)
5321
+ @therm_per_year = XMLHelper.get_value(fuel_load, "Load[Units='#{UnitsThermPerYear}']/Value", :float)
5028
5322
  @fuel_type = XMLHelper.get_value(fuel_load, 'FuelType', :string)
5029
- @frac_sensible, @frac_sensible_isdefaulted = XMLHelper.get_value_and_defaulted(fuel_load, 'extension/FracSensible', :float)
5030
- @frac_latent, @frac_latent_isdefaulted = XMLHelper.get_value_and_defaulted(fuel_load, 'extension/FracLatent', :float)
5031
- @usage_multiplier, @usage_multiplier_isdefaulted = XMLHelper.get_value_and_defaulted(fuel_load, 'extension/UsageMultiplier', :float)
5032
- @weekday_fractions, @weekday_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(fuel_load, 'extension/WeekdayScheduleFractions', :string)
5033
- @weekend_fractions, @weekend_fractions_isdefaulted = XMLHelper.get_value_and_defaulted(fuel_load, 'extension/WeekendScheduleFractions', :string)
5034
- @monthly_multipliers, @monthly_multipliers_isdefaulted = XMLHelper.get_value_and_defaulted(fuel_load, 'extension/MonthlyScheduleMultipliers', :string)
5323
+ @frac_sensible = XMLHelper.get_value(fuel_load, 'extension/FracSensible', :float)
5324
+ @frac_latent = XMLHelper.get_value(fuel_load, 'extension/FracLatent', :float)
5325
+ @usage_multiplier = XMLHelper.get_value(fuel_load, 'extension/UsageMultiplier', :float)
5326
+ @weekday_fractions = XMLHelper.get_value(fuel_load, 'extension/WeekdayScheduleFractions', :string)
5327
+ @weekend_fractions = XMLHelper.get_value(fuel_load, 'extension/WeekendScheduleFractions', :string)
5328
+ @monthly_multipliers = XMLHelper.get_value(fuel_load, 'extension/MonthlyScheduleMultipliers', :string)
5035
5329
  end
5036
5330
  end
5037
5331
 
@@ -5178,7 +5472,7 @@ class HPXML < Object
5178
5472
  # Check for errors across objects #
5179
5473
  # ------------------------------- #
5180
5474
 
5181
- # Check for globally unique SystemIdentifier IDs
5475
+ # Check for globally unique SystemIdentifier IDs and empty IDs
5182
5476
  sys_ids = {}
5183
5477
  self.class::HPXML_ATTRS.each do |attribute|
5184
5478
  hpxml_obj = send(attribute)
@@ -5189,6 +5483,8 @@ class HPXML < Object
5189
5483
 
5190
5484
  sys_ids[obj.id] = 0 if sys_ids[obj.id].nil?
5191
5485
  sys_ids[obj.id] += 1
5486
+
5487
+ errors << "Empty SystemIdentifier ID ('#{obj.id}') detected for #{attribute}." if !obj.id || obj.id.size == 0
5192
5488
  end
5193
5489
  end
5194
5490
  sys_ids.each do |sys_id, cnt|
@@ -5205,6 +5501,12 @@ class HPXML < Object
5205
5501
  errors << "Expected FractionHeatLoadServed to sum to <= 1, but calculated sum is #{total_fraction_heat_load_served.round(2)}."
5206
5502
  end
5207
5503
 
5504
+ # Check sum of dehumidifier FractionDehumidificationLoadServed <= 1
5505
+ total_fraction_dehum_load_served = @dehumidifiers.map { |d| d.fraction_served }.sum(0.0)
5506
+ if total_fraction_dehum_load_served > 1.01 # Use 1.01 in case of rounding
5507
+ errors << "Expected FractionDehumidificationLoadServed to sum to <= 1, but calculated sum is #{total_fraction_dehum_load_served.round(2)}."
5508
+ end
5509
+
5208
5510
  # Check sum of HVAC FractionDHWLoadServed == 1
5209
5511
  frac_dhw_load = @water_heating_systems.map { |dhw| dhw.fraction_dhw_load_served.to_f }.sum(0.0)
5210
5512
  if (frac_dhw_load > 0) && ((frac_dhw_load < 0.99) || (frac_dhw_load > 1.01)) # Use 0.99/1.01 in case of rounding
@@ -5220,13 +5522,13 @@ class HPXML < Object
5220
5522
  ltg_fracs[lighting_group.location] += lighting_group.fraction_of_units_in_location
5221
5523
  end
5222
5524
  ltg_fracs.each do |location, sum|
5223
- next if sum <= 1
5525
+ next if sum <= 1.01 # Use 1.01 in case of rounding
5224
5526
 
5225
- fail "Sum of fractions of #{location} lighting (#{sum}) is greater than 1."
5527
+ errors << "Sum of fractions of #{location} lighting (#{sum}) is greater than 1."
5226
5528
  end
5227
5529
 
5228
5530
  # Check for HVAC systems referenced by multiple water heating systems
5229
- (@heating_systems + @cooling_systems + @heat_pumps).each do |hvac_system|
5531
+ hvac_systems.each do |hvac_system|
5230
5532
  num_attached = 0
5231
5533
  @water_heating_systems.each do |water_heating_system|
5232
5534
  next if water_heating_system.related_hvac_idref.nil?
@@ -5241,7 +5543,7 @@ class HPXML < Object
5241
5543
 
5242
5544
  # Check for the sum of CFA served by distribution systems <= CFA
5243
5545
  if not @building_construction.conditioned_floor_area.nil?
5244
- air_distributions = @hvac_distributions.select { |dist| dist if [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeHydronicAndAir].include? dist.distribution_system_type }
5546
+ air_distributions = @hvac_distributions.select { |dist| dist if HPXML::HVACDistributionTypeAir == dist.distribution_system_type }
5245
5547
  heating_dist = []
5246
5548
  cooling_dist = []
5247
5549
  air_distributions.each do |dist|
@@ -5256,10 +5558,10 @@ class HPXML < Object
5256
5558
  end
5257
5559
  heating_total_dist_cfa_served = heating_dist.map { |htg_dist| htg_dist.conditioned_floor_area_served.to_f }.sum(0.0)
5258
5560
  cooling_total_dist_cfa_served = cooling_dist.map { |clg_dist| clg_dist.conditioned_floor_area_served.to_f }.sum(0.0)
5259
- if (heating_total_dist_cfa_served > @building_construction.conditioned_floor_area)
5561
+ if (heating_total_dist_cfa_served > @building_construction.conditioned_floor_area + 1.0) # Allow 1 ft2 of tolerance
5260
5562
  errors << 'The total conditioned floor area served by the HVAC distribution system(s) for heating is larger than the conditioned floor area of the building.'
5261
5563
  end
5262
- if (cooling_total_dist_cfa_served > @building_construction.conditioned_floor_area)
5564
+ if (cooling_total_dist_cfa_served > @building_construction.conditioned_floor_area + 1.0) # Allow 1 ft2 of tolerance
5263
5565
  errors << 'The total conditioned floor area served by the HVAC distribution system(s) for cooling is larger than the conditioned floor area of the building.'
5264
5566
  end
5265
5567
  end
@@ -5299,6 +5601,26 @@ class HPXML < Object
5299
5601
  end
5300
5602
  end
5301
5603
 
5604
+ # Check for at most 1 shared heating system and 1 shared cooling system
5605
+ num_htg_shared = 0
5606
+ num_clg_shared = 0
5607
+ (@heating_systems + @heat_pumps).each do |hvac_system|
5608
+ next unless hvac_system.is_shared_system
5609
+
5610
+ num_htg_shared += 1
5611
+ end
5612
+ (@cooling_systems + @heat_pumps).each do |hvac_system|
5613
+ next unless hvac_system.is_shared_system
5614
+
5615
+ num_clg_shared += 1
5616
+ end
5617
+ if num_htg_shared > 1
5618
+ errors << 'More than one shared heating system found.'
5619
+ end
5620
+ if num_clg_shared > 1
5621
+ errors << 'More than one shared cooling system found.'
5622
+ end
5623
+
5302
5624
  errors.map! { |e| "#{@hpxml_path}: #{e}" }
5303
5625
 
5304
5626
  return errors