urbanopt-cli 0.6.4 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1045) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/CMakeLists.txt +7 -7
  4. data/FindOpenStudioSDK.cmake +6 -6
  5. data/example_files/mappers/Baseline.rb +27 -27
  6. data/example_files/mappers/CreateBar.rb +7 -0
  7. data/example_files/mappers/HighEfficiency.rb +5 -4
  8. data/example_files/measures/BuildResidentialModel/measure.rb +109 -76
  9. data/example_files/residential/enclosure.tsv +102 -102
  10. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +22 -16
  11. data/example_files/resources/hpxml-measures/.gitignore +3 -7
  12. data/example_files/resources/hpxml-measures/.rubocop.yml +67 -8
  13. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1752 -1455
  14. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +3229 -5431
  15. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +386 -553
  16. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +1075 -363
  17. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +212 -0
  18. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +898 -0
  19. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules.rb +109 -188
  20. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_README.md +0 -0
  21. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_dryer_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_clothes_dryer_consumption_dist.csv} +0 -0
  22. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_dryer_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_clothes_dryer_duration_dist.csv} +0 -0
  23. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_washer_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_clothes_washer_consumption_dist.csv} +0 -0
  24. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_washer_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_clothes_washer_duration_dist.csv} +0 -0
  25. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_config.json +2 -2
  26. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_config.md +0 -0
  27. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_cooking_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_cooking_consumption_dist.csv} +0 -0
  28. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_cooking_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_cooking_duration_dist.csv} +0 -0
  29. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_dishwasher_consumption_dist.csv} +0 -0
  30. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_dishwasher_duration_dist.csv} +0 -0
  31. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_washer_cluster_size_probability.csv → BuildResidentialScheduleFile/resources/schedules_hot_water_clothes_washer_cluster_size_probability.csv} +0 -0
  32. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_washer_event_duration_probability.csv → BuildResidentialScheduleFile/resources/schedules_hot_water_clothes_washer_event_duration_probability.csv} +0 -0
  33. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_cluster_size_probability.csv → BuildResidentialScheduleFile/resources/schedules_hot_water_dishwasher_cluster_size_probability.csv} +0 -0
  34. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_event_duration_probability.csv → BuildResidentialScheduleFile/resources/schedules_hot_water_dishwasher_event_duration_probability.csv} +0 -0
  35. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_shower_cluster_size_probability.csv +0 -0
  36. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_shower_event_duration_probability.csv +0 -0
  37. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_evening_duration_probability.csv +0 -0
  38. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_midday_duration_probability.csv +0 -0
  39. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_morning_duration_probability.csv +0 -0
  40. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +0 -0
  41. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +0 -0
  42. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +0 -0
  43. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_evening_duration_probability.csv +0 -0
  44. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_midday_duration_probability.csv +0 -0
  45. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_morning_duration_probability.csv +0 -0
  46. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_evening_duration_probability.csv +0 -0
  47. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_midday_duration_probability.csv +0 -0
  48. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_morning_duration_probability.csv +0 -0
  49. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_evening_duration_probability.csv +0 -0
  50. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_midday_duration_probability.csv +0 -0
  51. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_morning_duration_probability.csv +0 -0
  52. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +0 -0
  53. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +0 -0
  54. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +0 -0
  55. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_evening_duration_probability.csv +0 -0
  56. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_midday_duration_probability.csv +0 -0
  57. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_morning_duration_probability.csv +0 -0
  58. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_evening_duration_probability.csv +0 -0
  59. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_midday_duration_probability.csv +0 -0
  60. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_morning_duration_probability.csv +0 -0
  61. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_evening_duration_probability.csv +0 -0
  62. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_midday_duration_probability.csv +0 -0
  63. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_morning_duration_probability.csv +0 -0
  64. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +0 -0
  65. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +0 -0
  66. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +0 -0
  67. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_evening_duration_probability.csv +0 -0
  68. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_midday_duration_probability.csv +0 -0
  69. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_morning_duration_probability.csv +0 -0
  70. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_evening_duration_probability.csv +0 -0
  71. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_midday_duration_probability.csv +0 -0
  72. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_morning_duration_probability.csv +0 -0
  73. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_evening_duration_probability.csv +0 -0
  74. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_midday_duration_probability.csv +0 -0
  75. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_morning_duration_probability.csv +0 -0
  76. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +0 -0
  77. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +0 -0
  78. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +0 -0
  79. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_evening_duration_probability.csv +0 -0
  80. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_midday_duration_probability.csv +0 -0
  81. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_morning_duration_probability.csv +0 -0
  82. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_evening_duration_probability.csv +0 -0
  83. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_midday_duration_probability.csv +0 -0
  84. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_morning_duration_probability.csv +0 -0
  85. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_0.csv +0 -0
  86. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_1.csv +0 -0
  87. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_2.csv +0 -0
  88. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_3.csv +0 -0
  89. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_0.csv +0 -0
  90. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_1.csv +0 -0
  91. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_2.csv +0 -0
  92. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_3.csv +0 -0
  93. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_state_and_monthly_schedule_shift.csv +0 -0
  94. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_evening_duration_probability.csv +0 -0
  95. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_midday_duration_probability.csv +0 -0
  96. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_morning_duration_probability.csv +0 -0
  97. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +0 -0
  98. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +0 -0
  99. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +0 -0
  100. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_evening_duration_probability.csv +0 -0
  101. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_midday_duration_probability.csv +0 -0
  102. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_morning_duration_probability.csv +0 -0
  103. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_evening_duration_probability.csv +0 -0
  104. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_midday_duration_probability.csv +0 -0
  105. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_morning_duration_probability.csv +0 -0
  106. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_evening_duration_probability.csv +0 -0
  107. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_midday_duration_probability.csv +0 -0
  108. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_morning_duration_probability.csv +0 -0
  109. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +0 -0
  110. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +0 -0
  111. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +0 -0
  112. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_evening_duration_probability.csv +0 -0
  113. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_midday_duration_probability.csv +0 -0
  114. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_morning_duration_probability.csv +0 -0
  115. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_evening_duration_probability.csv +0 -0
  116. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_midday_duration_probability.csv +0 -0
  117. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_morning_duration_probability.csv +0 -0
  118. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_evening_duration_probability.csv +0 -0
  119. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_midday_duration_probability.csv +0 -0
  120. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_morning_duration_probability.csv +0 -0
  121. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +0 -0
  122. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +0 -0
  123. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +0 -0
  124. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_evening_duration_probability.csv +0 -0
  125. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_midday_duration_probability.csv +0 -0
  126. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_morning_duration_probability.csv +0 -0
  127. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_evening_duration_probability.csv +0 -0
  128. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_midday_duration_probability.csv +0 -0
  129. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_morning_duration_probability.csv +0 -0
  130. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_evening_duration_probability.csv +0 -0
  131. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_midday_duration_probability.csv +0 -0
  132. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_morning_duration_probability.csv +0 -0
  133. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +0 -0
  134. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +0 -0
  135. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +0 -0
  136. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_evening_duration_probability.csv +0 -0
  137. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_midday_duration_probability.csv +0 -0
  138. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_morning_duration_probability.csv +0 -0
  139. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_evening_duration_probability.csv +0 -0
  140. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_midday_duration_probability.csv +0 -0
  141. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_morning_duration_probability.csv +0 -0
  142. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_0.csv +0 -0
  143. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_1.csv +0 -0
  144. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_2.csv +0 -0
  145. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_3.csv +0 -0
  146. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_0.csv +0 -0
  147. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_1.csv +0 -0
  148. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_2.csv +0 -0
  149. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_3.csv +0 -0
  150. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_state_and_monthly_schedule_shift.csv +0 -0
  151. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +526 -0
  152. data/example_files/resources/hpxml-measures/Changelog.md +84 -8
  153. data/example_files/resources/hpxml-measures/Gemfile +4 -1
  154. data/example_files/resources/hpxml-measures/Gemfile.lock +17 -6
  155. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +387 -387
  156. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +167 -251
  157. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +275 -59
  158. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +471 -247
  159. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXML.xsd +1 -1
  160. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +171 -79
  161. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +155 -78
  162. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +188 -141
  163. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +83 -0
  164. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +99 -11
  165. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +558 -342
  166. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +2 -0
  167. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +64 -72
  168. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +96 -93
  169. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +965 -350
  170. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +887 -216
  171. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +664 -760
  172. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +306 -287
  173. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +20 -29
  174. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +0 -20
  175. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lu_hvac_equipment_efficiency.csv +493 -0
  176. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lu_water_heater_efficiency.csv +157 -0
  177. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +156 -108
  178. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +41 -3
  179. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +14 -2
  180. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +18 -18
  181. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +14 -7
  182. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/smooth.csv +8761 -0
  183. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/stochastic-vacancy.csv +8761 -0
  184. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/stochastic.csv +8761 -0
  185. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +431 -428
  186. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +21 -12
  187. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +3 -3
  188. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +245 -234
  189. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +10 -5
  190. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +19 -8
  191. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +44 -23
  192. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +241 -0
  193. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +1374 -297
  194. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +702 -55
  195. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +0 -1
  196. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +1 -1
  197. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +238 -40
  198. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +2 -2
  199. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +0 -2
  200. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +186 -0
  201. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +955 -176
  202. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +47 -61
  203. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +1 -1
  204. data/example_files/resources/hpxml-measures/LICENSE.md +1 -1
  205. data/example_files/resources/hpxml-measures/README.md +12 -9
  206. data/example_files/resources/hpxml-measures/Rakefile +1 -1
  207. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +448 -0
  208. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +81 -0
  209. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +71 -0
  210. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +232 -0
  211. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +1977 -0
  212. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/measure.xml +682 -31
  213. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/resources/constants.rb +20 -2
  214. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/tests/output_report_test.rb +83 -218
  215. data/example_files/resources/hpxml-measures/docs/source/index.rst +1 -2
  216. data/example_files/resources/hpxml-measures/docs/source/intro.rst +6 -3
  217. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +73 -0
  218. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +915 -494
  219. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +263 -111
  220. data/example_files/resources/hpxml-measures/tasks.rb +3830 -6981
  221. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC-cache.csv +35 -0
  222. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC.epw +8768 -0
  223. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +25 -5
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +102 -91
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +93 -83
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +93 -83
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +93 -83
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +93 -83
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +102 -91
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +103 -97
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +96 -85
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +102 -91
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +102 -91
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +102 -91
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +96 -125
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +119 -104
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +94 -89
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +93 -83
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +104 -95
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +104 -95
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-outside.xml +584 -0
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +99 -68
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +119 -79
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +99 -68
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +99 -68
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +99 -68
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +97 -66
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +97 -66
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +97 -66
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +100 -69
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +100 -69
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +94 -65
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +94 -65
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +94 -65
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +94 -65
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +97 -68
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +94 -65
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +94 -65
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +94 -65
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +97 -68
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +97 -68
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +98 -67
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +96 -64
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +105 -84
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +108 -77
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +100 -69
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +100 -69
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +98 -67
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +97 -66
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +97 -66
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +97 -66
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-facility-type-surfaces.xml → base-bldgtype-single-family-attached-2stories.xml} +152 -167
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +124 -114
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +102 -95
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +102 -95
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +102 -95
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +104 -94
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +105 -96
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +102 -95
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +102 -95
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +102 -95
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +104 -95
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +102 -95
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +102 -95
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +102 -95
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +104 -97
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +102 -95
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +104 -95
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +104 -95
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +104 -95
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +102 -95
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +104 -95
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +108 -101
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +96 -85
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +104 -95
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +104 -95
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +104 -95
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +104 -95
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +104 -95
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +106 -97
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +106 -97
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +106 -97
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +106 -97
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +106 -97
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +106 -97
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +104 -95
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +105 -96
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +104 -95
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +574 -0
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +105 -96
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +104 -95
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +104 -95
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +105 -97
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +106 -97
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +106 -97
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +104 -95
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +104 -95
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +104 -95
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +104 -95
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +104 -95
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +104 -95
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +104 -95
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +106 -97
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +106 -97
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +104 -95
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +104 -95
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +131 -119
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +120 -99
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +104 -95
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +104 -95
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +104 -95
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +104 -95
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +131 -118
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +104 -95
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +104 -95
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +104 -95
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +104 -95
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +104 -95
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +579 -0
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +110 -101
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +213 -95
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-id.xml → base-enclosure-skylights-physical-properties.xml} +123 -105
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +114 -105
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +112 -103
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +92 -82
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +533 -547
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +545 -559
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/generator-output-greater-than-consumption.xml → base-enclosure-thermal-mass.xml} +117 -111
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +239 -109
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +88 -79
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +584 -0
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +115 -106
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +89 -79
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +123 -110
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +119 -172
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +104 -95
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +107 -95
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +572 -0
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +119 -128
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +92 -82
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +117 -110
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +106 -91
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +107 -98
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +105 -97
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +108 -98
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +108 -98
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +115 -110
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +101 -94
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +103 -95
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +104 -94
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +104 -94
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +590 -0
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +589 -0
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +104 -94
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +104 -94
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +105 -94
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-manual-s-oversize-allowances.xml +103 -93
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed.xml +106 -93
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-manual-s-oversize-allowances.xml +103 -93
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed.xml +106 -93
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/hvac-invalid-distribution-system-type.xml → base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml} +587 -570
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-manual-s-oversize-allowances.xml +103 -93
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed.xml +106 -93
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +102 -95
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +103 -94
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +101 -94
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +101 -94
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +101 -94
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +101 -94
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +108 -95
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml +106 -93
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +106 -93
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +99 -92
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +103 -94
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +99 -92
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +102 -95
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +104 -95
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +104 -95
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +101 -94
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +103 -94
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +104 -94
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +105 -94
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-manual-s-oversize-allowances.xml +103 -93
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump.xml +106 -93
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +101 -94
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +104 -94
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +105 -94
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml +103 -93
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted.xml +106 -93
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +541 -0
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-relatedhvac-dhw-indirect.xml → base-hvac-autosize-ptac-with-heating.xml} +528 -517
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/boiler-invalid-afue.xml → base-hvac-autosize-ptac.xml} +109 -113
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp.xml +531 -0
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +99 -92
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +99 -92
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +100 -93
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +104 -95
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +101 -94
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +102 -95
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +103 -94
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +101 -94
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +101 -94
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +101 -94
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +101 -94
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +101 -94
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +101 -94
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +101 -94
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +106 -96
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +104 -95
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +104 -94
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +104 -94
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +104 -94
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +104 -94
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +104 -94
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/unattached-solar-thermal-system.xml → base-hvac-ducts-area-fractions.xml} +596 -577
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.xml → base-hvac-ducts-leakage-cfm50.xml} +108 -106
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +104 -95
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +99 -92
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +103 -94
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +101 -94
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +99 -92
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +99 -92
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +99 -92
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +99 -92
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +101 -94
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +104 -95
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +102 -95
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +104 -95
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +104 -95
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +101 -94
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +103 -94
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +101 -94
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +101 -94
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +101 -94
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +104 -95
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +101 -94
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +102 -94
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +103 -93
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.xml → base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml} +104 -94
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.xml → base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml} +104 -94
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.xml → base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml} +104 -94
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.xml → base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml} +104 -95
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.xml → base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml} +104 -95
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.xml → base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml} +104 -95
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-furnace-gas-only.xml → base-hvac-install-quality-furnace-gas-only.xml} +101 -94
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-ground-to-air-heat-pump.xml → base-hvac-install-quality-ground-to-air-heat-pump.xml} +104 -94
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.xml → base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml} +101 -94
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-mini-split-heat-pump-ducted.xml → base-hvac-install-quality-mini-split-heat-pump-ducted.xml} +104 -94
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +101 -94
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +99 -92
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +101 -94
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +103 -95
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +104 -94
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +542 -0
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +101 -92
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +124 -100
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +94 -89
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +99 -92
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +104 -95
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +104 -95
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/cfis-with-hydronic-distribution.xml → base-hvac-ptac-with-heating.xml} +530 -532
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/hvac-distribution-return-duct-leakage-missing.xml → base-hvac-ptac.xml} +515 -528
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +531 -0
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +99 -92
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +516 -0
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +99 -92
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +584 -0
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +104 -95
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +99 -92
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +99 -92
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +104 -95
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +104 -95
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +100 -93
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +110 -96
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +586 -0
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +95 -86
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +104 -95
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +108 -98
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-foundation-wall-properties.xml → base-location-capetown-zaf.xml} +134 -127
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +92 -82
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +105 -98
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +104 -95
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +92 -82
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +92 -82
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +92 -82
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +108 -98
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +106 -97
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +106 -97
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +107 -98
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +104 -97
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +107 -98
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +106 -97
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +106 -97
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +105 -96
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +106 -97
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +106 -97
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +106 -97
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +141 -114
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +106 -97
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +105 -96
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +101 -101
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +105 -96
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +157 -112
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +157 -112
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +96 -87
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +108 -99
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +104 -95
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +113 -102
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +318 -291
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +608 -0
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/enclosure-garage-missing-roof-ceiling.xml → base-pv-battery-garage.xml} +678 -626
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/multifamily-reference-surface.xml → base-pv-battery-outside-degrades.xml} +610 -575
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-outside.xml +608 -0
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +105 -96
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.xml → base-schedules-detailed-smooth.xml} +105 -101
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.xml → base-schedules-detailed-stochastic-vacancy.xml} +105 -98
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-blower-efficiency-furnace-gas-central-ac-1-speed.xml → base-schedules-detailed-stochastic.xml} +105 -101
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-lighting-detailed.xml → base-schedules-simple.xml} +625 -585
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +104 -95
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +104 -95
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +104 -95
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +104 -95
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +104 -95
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +104 -95
  545. data/example_files/resources/hpxml-measures/workflow/template-build-hpxml-and-stocastic-schedules.osw +129 -0
  546. data/example_files/resources/hpxml-measures/workflow/template-stochastic-schedules.osw +53 -0
  547. data/example_files/resources/hpxml-measures/workflow/template.osw +7 -2
  548. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +75 -44
  549. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +75 -44
  550. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +75 -44
  551. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +75 -44
  552. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +75 -44
  553. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +75 -44
  554. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +75 -44
  555. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +75 -44
  556. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +63 -32
  557. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +63 -32
  558. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +66 -35
  559. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +66 -35
  560. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +66 -35
  561. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +66 -35
  562. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +69 -38
  563. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +69 -38
  564. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +75 -44
  565. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +75 -44
  566. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +75 -44
  567. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +75 -44
  568. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +75 -44
  569. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +75 -44
  570. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +78 -47
  571. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +78 -47
  572. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +114 -103
  573. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +126 -103
  574. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +321 -294
  575. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +26 -26
  576. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +320 -293
  577. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +351 -0
  578. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +253 -260
  579. data/example_files/visualization/input_visualization_feature.html +12 -3
  580. data/example_files/visualization/input_visualization_scenario.html +10 -4
  581. data/example_files/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.ddy +17 -17
  582. data/lib/uo_cli/version.rb +1 -1
  583. data/lib/uo_cli.rb +10 -3
  584. data/uo_cli.gemspec +6 -6
  585. metadata +217 -639
  586. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -59
  587. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +0 -337
  588. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-portable.osw +0 -337
  589. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-whole-home.osw +0 -337
  590. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +0 -337
  591. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +0 -337
  592. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +0 -337
  593. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +0 -337
  594. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +0 -337
  595. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +0 -337
  596. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +0 -337
  597. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +0 -337
  598. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +0 -337
  599. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +0 -337
  600. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +0 -337
  601. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-baseboard.osw +0 -341
  602. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-fan-coil.osw +0 -341
  603. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent-preconditioning.osw +0 -348
  604. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent.osw +0 -342
  605. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +0 -341
  606. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +0 -341
  607. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +0 -341
  608. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-single-family-attached.osw +0 -339
  609. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +0 -337
  610. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +0 -337
  611. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +0 -337
  612. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +0 -337
  613. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +0 -337
  614. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +0 -337
  615. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +0 -337
  616. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +0 -337
  617. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +0 -337
  618. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +0 -337
  619. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +0 -337
  620. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +0 -337
  621. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +0 -337
  622. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +0 -337
  623. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +0 -337
  624. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +0 -337
  625. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +0 -337
  626. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +0 -337
  627. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +0 -337
  628. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +0 -337
  629. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +0 -337
  630. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +0 -337
  631. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +0 -337
  632. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +0 -337
  633. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +0 -337
  634. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +0 -338
  635. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +0 -337
  636. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +0 -338
  637. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +0 -337
  638. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +0 -337
  639. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +0 -338
  640. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +0 -337
  641. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +0 -337
  642. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +0 -337
  643. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +0 -337
  644. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +0 -337
  645. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +0 -337
  646. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +0 -337
  647. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +0 -337
  648. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +0 -337
  649. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +0 -337
  650. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +0 -337
  651. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +0 -337
  652. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +0 -337
  653. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +0 -337
  654. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +0 -337
  655. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +0 -337
  656. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +0 -337
  657. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +0 -337
  658. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +0 -337
  659. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +0 -337
  660. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +0 -337
  661. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +0 -337
  662. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +0 -337
  663. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +0 -337
  664. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +0 -337
  665. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +0 -337
  666. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +0 -337
  667. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +0 -337
  668. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +0 -337
  669. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +0 -337
  670. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +0 -338
  671. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +0 -337
  672. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +0 -337
  673. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +0 -337
  674. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +0 -337
  675. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +0 -337
  676. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +0 -337
  677. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +0 -337
  678. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +0 -337
  679. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +0 -337
  680. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +0 -337
  681. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +0 -337
  682. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +0 -337
  683. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +0 -337
  684. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +0 -337
  685. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +0 -337
  686. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +0 -337
  687. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +0 -337
  688. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +0 -337
  689. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +0 -337
  690. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +0 -337
  691. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +0 -338
  692. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +0 -338
  693. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +0 -338
  694. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +0 -338
  695. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +0 -338
  696. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +0 -337
  697. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +0 -337
  698. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +0 -335
  699. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +0 -335
  700. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +0 -335
  701. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +0 -337
  702. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +0 -337
  703. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +0 -337
  704. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +0 -337
  705. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +0 -337
  706. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +0 -337
  707. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +0 -337
  708. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +0 -337
  709. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +0 -337
  710. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +0 -336
  711. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +0 -337
  712. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +0 -337
  713. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +0 -337
  714. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +0 -336
  715. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +0 -336
  716. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +0 -336
  717. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw +0 -339
  718. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +0 -339
  719. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +0 -339
  720. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +0 -339
  721. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +0 -340
  722. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +0 -340
  723. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +0 -340
  724. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +0 -338
  725. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +0 -338
  726. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +0 -338
  727. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +0 -339
  728. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +0 -338
  729. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +0 -340
  730. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +0 -336
  731. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +0 -336
  732. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +0 -337
  733. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +0 -337
  734. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +0 -337
  735. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +0 -337
  736. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +0 -337
  737. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +0 -337
  738. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +0 -337
  739. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +0 -336
  740. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +0 -336
  741. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +0 -337
  742. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +0 -337
  743. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +0 -337
  744. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +0 -337
  745. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +0 -337
  746. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +0 -337
  747. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +0 -337
  748. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +0 -337
  749. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +0 -337
  750. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +0 -337
  751. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +0 -337
  752. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +0 -337
  753. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-honolulu-hi.osw +0 -337
  754. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +0 -337
  755. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +0 -337
  756. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +0 -337
  757. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +0 -337
  758. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +0 -345
  759. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +0 -335
  760. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +0 -337
  761. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +0 -337
  762. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +0 -337
  763. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +0 -337
  764. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +0 -337
  765. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +0 -337
  766. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +0 -337
  767. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +0 -337
  768. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +0 -337
  769. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +0 -324
  770. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +0 -337
  771. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +0 -337
  772. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +0 -337
  773. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +0 -337
  774. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +0 -337
  775. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +0 -337
  776. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic-vacant.osw +0 -341
  777. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +0 -337
  778. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +0 -338
  779. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +0 -338
  780. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +0 -342
  781. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +0 -338
  782. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +0 -341
  783. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +0 -337
  784. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +0 -337
  785. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +0 -337
  786. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +0 -341
  787. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +0 -341
  788. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +0 -341
  789. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +0 -341
  790. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +0 -341
  791. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +0 -341
  792. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +0 -341
  793. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +0 -341
  794. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +0 -341
  795. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +0 -341
  796. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +0 -341
  797. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +0 -341
  798. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +0 -341
  799. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +0 -341
  800. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +0 -341
  801. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +0 -341
  802. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +0 -341
  803. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +0 -341
  804. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +0 -341
  805. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +0 -341
  806. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +0 -341
  807. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +0 -341
  808. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +0 -341
  809. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +0 -341
  810. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +0 -341
  811. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +0 -341
  812. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +0 -341
  813. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +0 -341
  814. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +0 -341
  815. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +0 -341
  816. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +0 -341
  817. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +0 -341
  818. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +0 -341
  819. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +0 -341
  820. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +0 -341
  821. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +0 -341
  822. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +0 -341
  823. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +0 -341
  824. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +0 -341
  825. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +0 -341
  826. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +0 -341
  827. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +0 -341
  828. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +0 -341
  829. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +0 -341
  830. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +0 -341
  831. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +0 -341
  832. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +0 -341
  833. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +0 -341
  834. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +0 -341
  835. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +0 -341
  836. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +0 -341
  837. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +0 -341
  838. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +0 -341
  839. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +0 -341
  840. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +0 -341
  841. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +0 -341
  842. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +0 -341
  843. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +0 -341
  844. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +0 -341
  845. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +0 -341
  846. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +0 -341
  847. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +0 -341
  848. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +0 -341
  849. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +0 -341
  850. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +0 -339
  851. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +0 -339
  852. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-flat.osw +0 -339
  853. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-exterior.osw +0 -339
  854. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +0 -339
  855. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-single-exterior-front.osw +0 -339
  856. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +0 -339
  857. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +0 -339
  858. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +0 -339
  859. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +0 -339
  860. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +0 -339
  861. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement.osw +0 -339
  862. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +0 -339
  863. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +0 -339
  864. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +0 -339
  865. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +0 -339
  866. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +0 -339
  867. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +0 -339
  868. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +0 -337
  869. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +0 -337
  870. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +0 -337
  871. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +0 -337
  872. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +0 -337
  873. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +0 -339
  874. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-hot-tub-heater-with-zero-kwh.osw +0 -337
  875. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-pool-heater-with-zero-kwh.osw +0 -337
  876. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +0 -337
  877. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +0 -338
  878. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +0 -336
  879. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +0 -337
  880. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +0 -337
  881. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heating-system.osw +0 -337
  882. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +0 -337
  883. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heating-system.osw +0 -337
  884. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +0 -337
  885. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +0 -337
  886. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +0 -337
  887. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +0 -337
  888. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +0 -337
  889. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +0 -337
  890. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +0 -337
  891. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +0 -337
  892. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +0 -337
  893. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +0 -337
  894. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +0 -337
  895. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +0 -337
  896. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +0 -337
  897. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +0 -337
  898. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +0 -341
  899. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +0 -341
  900. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +0 -338
  901. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-fuel-loads.osw +0 -337
  902. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +0 -337
  903. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-tv-plug-loads.osw +0 -337
  904. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-vehicle-plug-loads.osw +0 -337
  905. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +0 -337
  906. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +0 -337
  907. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +0 -337
  908. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +0 -337
  909. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +0 -337
  910. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +0 -337
  911. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +0 -337
  912. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +0 -339
  913. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +0 -337
  914. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +0 -337
  915. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +0 -337
  916. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-with-shared-system.osw +0 -337
  917. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +0 -337
  918. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +0 -337
  919. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +0 -337
  920. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +0 -337
  921. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +0 -337
  922. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +0 -337
  923. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +0 -337
  924. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/stochastic.csv +0 -8761
  925. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/user-specified.csv +0 -8761
  926. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/vacant.csv +0 -8761
  927. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_1bed.csv +0 -369
  928. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_2bed.csv +0 -465
  929. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_3bed.csv +0 -611
  930. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_4bed.csv +0 -685
  931. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_5bed.csv +0 -767
  932. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_1bed.csv +0 -637
  933. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_2bed.csv +0 -744
  934. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_3bed.csv +0 -929
  935. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_4bed.csv +0 -1044
  936. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_5bed.csv +0 -1250
  937. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_1bed.csv +0 -754
  938. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_2bed.csv +0 -961
  939. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_3bed.csv +0 -1102
  940. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_4bed.csv +0 -1293
  941. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_5bed.csv +0 -1508
  942. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_1bed.csv +0 -13097
  943. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_2bed.csv +0 -15977
  944. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_3bed.csv +0 -18624
  945. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_4bed.csv +0 -22075
  946. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_5bed.csv +0 -25005
  947. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_max_flows.csv +0 -6
  948. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +0 -2444
  949. data/example_files/resources/hpxml-measures/docs/source/build_residential_hpxml.rst +0 -110
  950. data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +0 -57
  951. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +0 -564
  952. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +0 -564
  953. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +0 -564
  954. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +0 -563
  955. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +0 -563
  956. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +0 -563
  957. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +0 -535
  958. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +0 -535
  959. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +0 -576
  960. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-ef-tank.xml +0 -563
  961. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +0 -564
  962. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +0 -563
  963. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +0 -563
  964. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +0 -563
  965. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +0 -563
  966. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +0 -563
  967. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +0 -563
  968. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +0 -547
  969. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +0 -544
  970. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +0 -547
  971. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +0 -563
  972. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +0 -448
  973. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +0 -614
  974. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +0 -611
  975. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +0 -551
  976. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +0 -473
  977. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +0 -489
  978. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +0 -760
  979. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +0 -759
  980. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +0 -761
  981. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +0 -759
  982. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +0 -563
  983. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +0 -460
  984. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +0 -560
  985. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +0 -921
  986. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +0 -921
  987. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +0 -547
  988. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +0 -547
  989. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +0 -921
  990. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +0 -569
  991. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-shared-negative-seer-eq.xml +0 -407
  992. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +0 -563
  993. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +0 -563
  994. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +0 -563
  995. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +0 -563
  996. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +0 -570
  997. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +0 -563
  998. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +0 -563
  999. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +0 -466
  1000. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +0 -591
  1001. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +0 -563
  1002. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +0 -565
  1003. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +0 -576
  1004. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +0 -465
  1005. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-conditioned-floors.xml +0 -563
  1006. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +0 -451
  1007. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +0 -551
  1008. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +0 -565
  1009. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +0 -563
  1010. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +0 -473
  1011. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +0 -563
  1012. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +0 -583
  1013. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +0 -563
  1014. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +0 -917
  1015. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +0 -561
  1016. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +0 -563
  1017. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +0 -563
  1018. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +0 -563
  1019. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +0 -1657
  1020. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +0 -1657
  1021. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-cooling-systems.xml +0 -432
  1022. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-heating-systems.xml +0 -434
  1023. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +0 -591
  1024. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +0 -563
  1025. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +0 -563
  1026. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +0 -547
  1027. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +0 -563
  1028. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +0 -569
  1029. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +0 -569
  1030. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +0 -564
  1031. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +0 -527
  1032. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-fraction-one.xml +0 -571
  1033. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +0 -532
  1034. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +0 -566
  1035. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +0 -532
  1036. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +0 -576
  1037. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +0 -563
  1038. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +0 -563
  1039. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +0 -466
  1040. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +0 -466
  1041. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +0 -591
  1042. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +0 -563
  1043. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +0 -563
  1044. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +0 -563
  1045. data/example_files/resources/hpxml-measures/workflow/tests/compare.rb +0 -130
@@ -52,10 +52,11 @@ class HPXML < Object
52
52
  HPXML_ATTRS = [:header, :site, :neighbor_buildings, :building_occupancy, :building_construction,
53
53
  :climate_and_risk_zones, :air_infiltration_measurements, :attics, :foundations,
54
54
  :roofs, :rim_joists, :walls, :foundation_walls, :frame_floors, :slabs, :windows,
55
- :skylights, :doors, :heating_systems, :cooling_systems, :heat_pumps, :hvac_plant,
56
- :hvac_controls, :hvac_distributions, :ventilation_fans, :water_heating_systems,
55
+ :skylights, :doors, :partition_wall_mass, :furniture_mass, :heating_systems,
56
+ :cooling_systems, :heat_pumps, :hvac_plant, :hvac_controls, :hvac_distributions,
57
+ :ventilation_fans, :water_heating_systems,
57
58
  :hot_water_distributions, :water_fixtures, :water_heating, :solar_thermal_systems,
58
- :pv_systems, :generators, :clothes_washers, :clothes_dryers, :dishwashers, :refrigerators,
59
+ :pv_systems, :generators, :batteries, :clothes_washers, :clothes_dryers, :dishwashers, :refrigerators,
59
60
  :freezers, :dehumidifiers, :cooking_ranges, :ovens, :lighting_groups, :lighting,
60
61
  :ceiling_fans, :pools, :hot_tubs, :plug_loads, :fuel_loads]
61
62
  attr_reader(*HPXML_ATTRS, :doc, :errors, :warnings)
@@ -66,11 +67,16 @@ class HPXML < Object
66
67
  AirTypeGravity = 'gravity'
67
68
  AirTypeHighVelocity = 'high velocity'
68
69
  AirTypeRegularVelocity = 'regular velocity'
70
+ AtticTypeBelowApartment = 'BelowApartment'
69
71
  AtticTypeCathedral = 'CathedralCeiling'
70
72
  AtticTypeConditioned = 'ConditionedAttic'
71
73
  AtticTypeFlatRoof = 'FlatRoof'
72
74
  AtticTypeUnvented = 'UnventedAttic'
73
75
  AtticTypeVented = 'VentedAttic'
76
+ AtticWallTypeGable = 'gable'
77
+ BatteryTypeLithiumIon = 'Li-ion'
78
+ BatteryLifetimeModelNone = 'None'
79
+ BatteryLifetimeModelKandlerSmith = 'KandlerSmith'
74
80
  CertificationEnergyStar = 'Energy Star'
75
81
  ClothesDryerControlTypeMoisture = 'moisture'
76
82
  ClothesDryerControlTypeTimer = 'timer'
@@ -97,12 +103,22 @@ class HPXML < Object
97
103
  DWHRFacilitiesConnectedAll = 'all'
98
104
  DWHRFacilitiesConnectedOne = 'one'
99
105
  ExteriorShadingTypeSolarScreens = 'solar screens'
106
+ FoundationTypeAboveApartment = 'AboveApartment'
100
107
  FoundationTypeAmbient = 'Ambient'
101
108
  FoundationTypeBasementConditioned = 'ConditionedBasement'
102
109
  FoundationTypeBasementUnconditioned = 'UnconditionedBasement'
110
+ FoundationTypeCrawlspaceConditioned = 'ConditionedCrawlspace'
103
111
  FoundationTypeCrawlspaceUnvented = 'UnventedCrawlspace'
104
112
  FoundationTypeCrawlspaceVented = 'VentedCrawlspace'
105
113
  FoundationTypeSlab = 'SlabOnGrade'
114
+ FoundationWallTypeConcreteBlock = 'concrete block'
115
+ FoundationWallTypeConcreteBlockFoamCore = 'concrete block foam core'
116
+ FoundationWallTypeConcreteBlockPerliteCore = 'concrete block perlite core'
117
+ FoundationWallTypeConcreteBlockSolidCore = 'concrete block solid core'
118
+ FoundationWallTypeConcreteBlockVermiculiteCore = 'concrete block vermiculite core'
119
+ FoundationWallTypeDoubleBrick = 'double brick'
120
+ FoundationWallTypeSolidConcrete = 'solid concrete'
121
+ FoundationWallTypeWood = 'wood'
106
122
  FrameFloorOtherSpaceAbove = 'above'
107
123
  FrameFloorOtherSpaceBelow = 'below'
108
124
  FuelLoadTypeGrill = 'grill'
@@ -124,9 +140,13 @@ class HPXML < Object
124
140
  FuelTypePropane = 'propane'
125
141
  FuelTypeWoodCord = 'wood'
126
142
  FuelTypeWoodPellets = 'wood pellets'
143
+ FurnitureMassTypeLightWeight = 'light-weight'
144
+ FurnitureMassTypeHeavyWeight = 'heavy-weight'
127
145
  HeaterTypeElectricResistance = 'electric resistance'
128
146
  HeaterTypeGas = 'gas fired'
129
147
  HeaterTypeHeatPump = 'heat pump'
148
+ HeatPumpBackupTypeIntegrated = 'integrated'
149
+ HeatPumpBackupTypeSeparate = 'separate'
130
150
  HVACCompressorTypeSingleStage = 'single stage'
131
151
  HVACCompressorTypeTwoStage = 'two stage'
132
152
  HVACCompressorTypeVariableSpeed = 'variable speed'
@@ -145,13 +165,16 @@ class HPXML < Object
145
165
  HVACTypeFixedHeater = 'FixedHeater'
146
166
  HVACTypeFloorFurnace = 'FloorFurnace'
147
167
  HVACTypeFurnace = 'Furnace'
168
+ HVACTypePTACHeating = 'PackagedTerminalAirConditionerHeating'
148
169
  HVACTypeHeatPumpAirToAir = 'air-to-air'
149
170
  HVACTypeHeatPumpGroundToAir = 'ground-to-air'
150
171
  HVACTypeHeatPumpMiniSplit = 'mini-split'
151
172
  HVACTypeHeatPumpWaterLoopToAir = 'water-loop-to-air'
173
+ HVACTypeHeatPumpPTHP = 'packaged terminal heat pump'
152
174
  HVACTypeMiniSplitAirConditioner = 'mini-split'
153
175
  HVACTypePortableHeater = 'PortableHeater'
154
176
  HVACTypeRoomAirConditioner = 'room air conditioner'
177
+ HVACTypePTAC = 'packaged terminal air conditioner'
155
178
  HVACTypeStove = 'Stove'
156
179
  HVACTypeWallFurnace = 'WallFurnace'
157
180
  HydronicTypeBaseboard = 'baseboard'
@@ -159,6 +182,11 @@ class HPXML < Object
159
182
  HydronicTypeRadiantFloor = 'radiant floor'
160
183
  HydronicTypeRadiator = 'radiator'
161
184
  HydronicTypeWaterLoop = 'water loop'
185
+ InteriorFinishGypsumBoard = 'gypsum board'
186
+ InteriorFinishGypsumCompositeBoard = 'gypsum composite board'
187
+ InteriorFinishNone = 'none'
188
+ InteriorFinishPlaster = 'plaster'
189
+ InteriorFinishWood = 'wood'
162
190
  LeakinessTight = 'tight'
163
191
  LeakinessAverage = 'average'
164
192
  LightingTypeCFL = 'CompactFluorescent'
@@ -170,6 +198,7 @@ class HPXML < Object
170
198
  LocationBasementConditioned = 'basement - conditioned'
171
199
  LocationBasementUnconditioned = 'basement - unconditioned'
172
200
  LocationBath = 'bath'
201
+ LocationCrawlspaceConditioned = 'crawlspace - conditioned'
173
202
  LocationCrawlspaceUnvented = 'crawlspace - unvented'
174
203
  LocationCrawlspaceVented = 'crawlspace - vented'
175
204
  LocationExterior = 'exterior'
@@ -220,17 +249,25 @@ class HPXML < Object
220
249
  ResidentialTypeSFD = 'single-family detached'
221
250
  RoofTypeAsphaltShingles = 'asphalt or fiberglass shingles'
222
251
  RoofTypeConcrete = 'concrete'
252
+ RoofTypeCool = 'cool roof'
223
253
  RoofTypeClayTile = 'slate or tile shingles'
254
+ RoofTypeEPS = 'expanded polystyrene sheathing'
224
255
  RoofTypeMetal = 'metal surfacing'
225
256
  RoofTypePlasticRubber = 'plastic/rubber/synthetic sheeting'
257
+ RoofTypeShingles = 'shingles'
226
258
  RoofTypeWoodShingles = 'wood shingles or shakes'
227
259
  ShieldingExposed = 'exposed'
228
260
  ShieldingNormal = 'normal'
229
261
  ShieldingWellShielded = 'well-shielded'
230
262
  SidingTypeAluminum = 'aluminum siding'
263
+ SidingTypeAsbestos = 'asbestos siding'
231
264
  SidingTypeBrick = 'brick veneer'
265
+ SidingTypeCompositeShingle = 'composite shingle siding'
232
266
  SidingTypeFiberCement = 'fiber cement siding'
267
+ SidingTypeMasonite = 'masonite siding'
268
+ SidingTypeNone = 'none'
233
269
  SidingTypeStucco = 'stucco'
270
+ SidingTypeSyntheticStucco = 'synthetic stucco'
234
271
  SidingTypeVinyl = 'vinyl siding'
235
272
  SidingTypeWood = 'wood siding'
236
273
  SiteTypeUrban = 'urban'
@@ -239,26 +276,40 @@ class HPXML < Object
239
276
  SolarThermalLoopTypeDirect = 'liquid direct'
240
277
  SolarThermalLoopTypeIndirect = 'liquid indirect'
241
278
  SolarThermalLoopTypeThermosyphon = 'passive thermosyphon'
279
+ SolarThermalSystemType = 'hot water'
242
280
  SolarThermalTypeDoubleGlazing = 'double glazing black'
243
281
  SolarThermalTypeEvacuatedTube = 'evacuated tube'
244
282
  SolarThermalTypeICS = 'integrated collector storage'
245
283
  SolarThermalTypeSingleGlazing = 'single glazing black'
284
+ SurroundingsOneSide = 'attached on one side'
285
+ SurroundingsTwoSides = 'attached on two sides'
286
+ SurroundingsThreeSides = 'attached on three sides'
287
+ SurroundingsStandAlone = 'stand-alone'
246
288
  TypeNone = 'none'
247
289
  TypeUnknown = 'unknown'
248
290
  UnitsACH = 'ACH'
249
291
  UnitsACHNatural = 'ACHnatural'
250
292
  UnitsAFUE = 'AFUE'
293
+ UnitsAh = 'Ah'
251
294
  UnitsCFM = 'CFM'
252
295
  UnitsCFM25 = 'CFM25'
296
+ UnitsCFM50 = 'CFM50'
253
297
  UnitsCOP = 'COP'
254
298
  UnitsEER = 'EER'
299
+ UnitsCEER = 'CEER'
255
300
  UnitsHSPF = 'HSPF'
301
+ UnitsKwh = 'kWh'
256
302
  UnitsKwhPerYear = 'kWh/year'
303
+ UnitsKwhPerDay = 'kWh/day'
257
304
  UnitsKwPerTon = 'kW/ton'
258
305
  UnitsPercent = 'Percent'
259
306
  UnitsSEER = 'SEER'
260
307
  UnitsSLA = 'SLA'
261
308
  UnitsThermPerYear = 'therm/year'
309
+ VerticalSurroundingsNoAboveOrBelow = 'no units above or below'
310
+ VerticalSurroundingsAboveAndBelow = 'unit above and below'
311
+ VerticalSurroundingsBelow = 'unit below'
312
+ VerticalSurroundingsAbove = 'unit above'
262
313
  WallTypeAdobe = 'Adobe'
263
314
  WallTypeBrick = 'StructuralBrick'
264
315
  WallTypeCMU = 'ConcreteMasonryUnit'
@@ -278,6 +329,10 @@ class HPXML < Object
278
329
  WaterHeaterTypeHeatPump = 'heat pump water heater'
279
330
  WaterHeaterTypeTankless = 'instantaneous water heater'
280
331
  WaterHeaterTypeStorage = 'storage water heater'
332
+ WaterHeaterUsageBinVerySmall = 'very small'
333
+ WaterHeaterUsageBinLow = 'low'
334
+ WaterHeaterUsageBinMedium = 'medium'
335
+ WaterHeaterUsageBinHigh = 'high'
281
336
  WindowFrameTypeAluminum = 'Aluminum'
282
337
  WindowFrameTypeComposite = 'Composite'
283
338
  WindowFrameTypeFiberglass = 'Fiberglass'
@@ -286,10 +341,17 @@ class HPXML < Object
286
341
  WindowFrameTypeWood = 'Wood'
287
342
  WindowGasAir = 'air'
288
343
  WindowGasArgon = 'argon'
289
- WindowGlazingLowE = 'low-e'
290
- WindowGlazingReflective = 'reflective'
291
- WindowGlazingTintedReflective = 'tinted/reflective'
344
+ WindowGasKrypton = 'krypton'
345
+ WindowGasNitrogen = 'nitrogen'
346
+ WindowGasOther = 'other'
347
+ WindowGasXenon = 'xenon'
348
+ WindowGlassTypeClear = 'clear'
349
+ WindowGlassTypeLowE = 'low-e'
350
+ WindowGlassTypeReflective = 'reflective'
351
+ WindowGlassTypeTinted = 'tinted'
352
+ WindowGlassTypeTintedReflective = 'tinted/reflective'
292
353
  WindowLayersDoublePane = 'double-pane'
354
+ WindowLayersGlassBlock = 'glass block'
293
355
  WindowLayersSinglePane = 'single-pane'
294
356
  WindowLayersTriplePane = 'triple-pane'
295
357
  WindowClassArchitectural = 'architectural'
@@ -355,11 +417,11 @@ class HPXML < Object
355
417
  return (@heating_systems + @cooling_systems + @heat_pumps)
356
418
  end
357
419
 
358
- def has_space_type(space_type)
359
- # Look for surfaces attached to this space type
420
+ def has_location(location)
421
+ # Search for surfaces attached to this location
360
422
  (@roofs + @rim_joists + @walls + @foundation_walls + @frame_floors + @slabs).each do |surface|
361
- return true if surface.interior_adjacent_to == space_type
362
- return true if surface.exterior_adjacent_to == space_type
423
+ return true if surface.interior_adjacent_to == location
424
+ return true if surface.exterior_adjacent_to == location
363
425
  end
364
426
  return false
365
427
  end
@@ -386,7 +448,10 @@ class HPXML < Object
386
448
  fuel_fracs[fuel] += heat_pump.fraction_heat_load_served.to_f
387
449
  end
388
450
  return FuelTypeElectricity if fuel_fracs.empty?
451
+ return FuelTypeElectricity if fuel_fracs[FuelTypeElectricity].to_f > 0.5
389
452
 
453
+ # Choose fossil fuel
454
+ fuel_fracs.delete FuelTypeElectricity
390
455
  return fuel_fracs.key(fuel_fracs.values.max)
391
456
  end
392
457
 
@@ -394,11 +459,17 @@ class HPXML < Object
394
459
  fuel_fracs = {}
395
460
  @water_heating_systems.each do |water_heating_system|
396
461
  fuel = water_heating_system.fuel_type
462
+ if fuel.nil? # Combi boiler
463
+ fuel = water_heating_system.related_hvac_system.heating_system_fuel
464
+ end
397
465
  fuel_fracs[fuel] = 0.0 if fuel_fracs[fuel].nil?
398
466
  fuel_fracs[fuel] += water_heating_system.fraction_dhw_load_served
399
467
  end
400
468
  return FuelTypeElectricity if fuel_fracs.empty?
469
+ return FuelTypeElectricity if fuel_fracs[FuelTypeElectricity].to_f > 0.5
401
470
 
471
+ # Choose fossil fuel
472
+ fuel_fracs.delete FuelTypeElectricity
402
473
  return fuel_fracs.key(fuel_fracs.values.max)
403
474
  end
404
475
 
@@ -414,6 +485,10 @@ class HPXML < Object
414
485
  return window_area_operable / window_area_total
415
486
  end
416
487
 
488
+ def primary_hvac_systems()
489
+ return hvac_systems.select { |h| h.primary_system }
490
+ end
491
+
417
492
  def total_fraction_cool_load_served()
418
493
  return @cooling_systems.total_fraction_cool_load_served + @heat_pumps.total_fraction_cool_load_served
419
494
  end
@@ -423,7 +498,7 @@ class HPXML < Object
423
498
  end
424
499
 
425
500
  def has_walkout_basement()
426
- has_conditioned_basement = has_space_type(LocationBasementConditioned)
501
+ has_conditioned_basement = has_location(LocationBasementConditioned)
427
502
  ncfl = @building_construction.number_of_conditioned_floors
428
503
  ncfl_ag = @building_construction.number_of_conditioned_floors_above_grade
429
504
  return (has_conditioned_basement && (ncfl == ncfl_ag))
@@ -471,7 +546,7 @@ class HPXML < Object
471
546
  exterior_area = 0.0 # Same as above excluding surfaces attached to garage or other housing units
472
547
 
473
548
  # Determine which spaces are within infiltration volume
474
- spaces_within_infil_volume = [LocationLivingSpace, LocationBasementConditioned]
549
+ spaces_within_infil_volume = HPXML::conditioned_locations_this_unit
475
550
  @attics.each do |attic|
476
551
  next unless [AtticTypeUnvented].include? attic.attic_type
477
552
  next unless attic.within_infiltration_volume
@@ -479,26 +554,35 @@ class HPXML < Object
479
554
  spaces_within_infil_volume << attic.to_location
480
555
  end
481
556
  @foundations.each do |foundation|
482
- next unless [FoundationTypeBasementUnconditioned, FoundationTypeCrawlspaceUnvented].include? foundation.foundation_type
557
+ next unless [FoundationTypeBasementUnconditioned,
558
+ FoundationTypeCrawlspaceUnvented].include? foundation.foundation_type
483
559
  next unless foundation.within_infiltration_volume
484
560
 
485
561
  spaces_within_infil_volume << foundation.to_location
486
562
  end
487
563
 
488
564
  # Get surfaces bounding infiltration volume
489
- spaces_within_infil_volume.each do |space_type|
565
+ spaces_within_infil_volume.each do |location|
490
566
  (@roofs + @rim_joists + @walls + @foundation_walls + @frame_floors + @slabs).each do |surface|
491
- next unless [surface.interior_adjacent_to, surface.exterior_adjacent_to].include? space_type
567
+ is_adiabatic_surface = (surface.interior_adjacent_to == surface.exterior_adjacent_to)
568
+ next unless [surface.interior_adjacent_to,
569
+ surface.exterior_adjacent_to].include? location
492
570
 
493
- # Exclude surfaces between two spaces that are both within infiltration volume
494
- next if spaces_within_infil_volume.include?(surface.interior_adjacent_to) && spaces_within_infil_volume.include?(surface.exterior_adjacent_to)
571
+ if not is_adiabatic_surface
572
+ # Exclude surfaces between two different spaces that are both within infiltration volume
573
+ next if spaces_within_infil_volume.include?(surface.interior_adjacent_to) && spaces_within_infil_volume.include?(surface.exterior_adjacent_to)
574
+ end
495
575
 
496
576
  # Update Compartmentalization Boundary areas
497
577
  total_area += surface.area
498
- if not [LocationGarage, LocationOtherHousingUnit, LocationOtherHeatedSpace,
499
- LocationOtherMultifamilyBufferSpace, LocationOtherNonFreezingSpace].include? surface.exterior_adjacent_to
500
- exterior_area += surface.area
501
- end
578
+ next unless (not [LocationGarage,
579
+ LocationOtherHousingUnit,
580
+ LocationOtherHeatedSpace,
581
+ LocationOtherMultifamilyBufferSpace,
582
+ LocationOtherNonFreezingSpace].include? surface.exterior_adjacent_to) &&
583
+ (not is_adiabatic_surface)
584
+
585
+ exterior_area += surface.area
502
586
  end
503
587
  end
504
588
 
@@ -509,34 +593,47 @@ class HPXML < Object
509
593
  # Infiltration height: vertical distance between lowest and highest above-grade points within the pressure boundary.
510
594
  # Height is inferred from available HPXML properties.
511
595
  # The WithinInfiltrationVolume properties are intentionally ignored for now.
512
- # FUTURE: Move into AirInfiltrationMeasurement class?
513
596
  cfa = @building_construction.conditioned_floor_area
597
+
514
598
  ncfl_ag = @building_construction.number_of_conditioned_floors_above_grade
515
599
  if has_walkout_basement()
516
600
  infil_height = ncfl_ag * infil_volume / cfa
517
601
  else
518
- # Calculate maximum above-grade height of conditioned basement walls
519
- max_cond_bsmt_wall_height_ag = 0.0
602
+ infil_volume -= inferred_conditioned_crawlspace_volume()
603
+
604
+ # Calculate maximum above-grade height of conditioned foundation walls
605
+ max_cond_fnd_wall_height_ag = 0.0
520
606
  @foundation_walls.each do |foundation_wall|
521
- next unless foundation_wall.is_exterior && (foundation_wall.interior_adjacent_to == LocationBasementConditioned)
607
+ next unless foundation_wall.is_exterior && HPXML::conditioned_below_grade_locations.include?(foundation_wall.interior_adjacent_to)
522
608
 
523
609
  height_ag = foundation_wall.height - foundation_wall.depth_below_grade
524
- next unless height_ag > max_cond_bsmt_wall_height_ag
610
+ next unless height_ag > max_cond_fnd_wall_height_ag
525
611
 
526
- max_cond_bsmt_wall_height_ag = height_ag
612
+ max_cond_fnd_wall_height_ag = height_ag
527
613
  end
614
+
528
615
  # Add assumed rim joist height
529
- cond_bsmt_rim_joist_height = 0
616
+ cond_fnd_rim_joist_height = 0
530
617
  @rim_joists.each do |rim_joist|
531
- next unless rim_joist.is_exterior && (rim_joist.interior_adjacent_to == LocationBasementConditioned)
618
+ next unless rim_joist.is_exterior && HPXML::conditioned_below_grade_locations.include?(rim_joist.interior_adjacent_to)
532
619
 
533
- cond_bsmt_rim_joist_height = UnitConversions.convert(9, 'in', 'ft')
620
+ cond_fnd_rim_joist_height = UnitConversions.convert(9, 'in', 'ft')
534
621
  end
535
- infil_height = ncfl_ag * infil_volume / cfa + max_cond_bsmt_wall_height_ag + cond_bsmt_rim_joist_height
622
+
623
+ infil_height = ncfl_ag * infil_volume / cfa + max_cond_fnd_wall_height_ag + cond_fnd_rim_joist_height
536
624
  end
537
625
  return infil_height
538
626
  end
539
627
 
628
+ def inferred_conditioned_crawlspace_volume
629
+ if has_location(HPXML::LocationCrawlspaceConditioned)
630
+ conditioned_crawl_area = @slabs.select { |s| s.interior_adjacent_to == HPXML::LocationCrawlspaceConditioned }.map { |s| s.area }.sum
631
+ conditioned_crawl_height = @foundation_walls.select { |w| w.interior_adjacent_to == HPXML::LocationCrawlspaceConditioned }.map { |w| w.height }.max
632
+ return conditioned_crawl_area * conditioned_crawl_height
633
+ end
634
+ return 0.0
635
+ end
636
+
540
637
  def to_oga()
541
638
  @doc = _create_oga_document()
542
639
  @header.to_oga(@doc)
@@ -557,6 +654,8 @@ class HPXML < Object
557
654
  @windows.to_oga(@doc)
558
655
  @skylights.to_oga(@doc)
559
656
  @doors.to_oga(@doc)
657
+ @partition_wall_mass.to_oga(@doc)
658
+ @furniture_mass.to_oga(@doc)
560
659
  @heating_systems.to_oga(@doc)
561
660
  @cooling_systems.to_oga(@doc)
562
661
  @heat_pumps.to_oga(@doc)
@@ -570,6 +669,7 @@ class HPXML < Object
570
669
  @water_heating.to_oga(@doc)
571
670
  @solar_thermal_systems.to_oga(@doc)
572
671
  @pv_systems.to_oga(@doc)
672
+ @batteries.to_oga(@doc)
573
673
  @generators.to_oga(@doc)
574
674
  @clothes_washers.to_oga(@doc)
575
675
  @clothes_dryers.to_oga(@doc)
@@ -608,6 +708,8 @@ class HPXML < Object
608
708
  @windows = Windows.new(self, hpxml)
609
709
  @skylights = Skylights.new(self, hpxml)
610
710
  @doors = Doors.new(self, hpxml)
711
+ @partition_wall_mass = PartitionWallMass.new(self, hpxml)
712
+ @furniture_mass = FurnitureMass.new(self, hpxml)
611
713
  @heating_systems = HeatingSystems.new(self, hpxml)
612
714
  @cooling_systems = CoolingSystems.new(self, hpxml)
613
715
  @heat_pumps = HeatPumps.new(self, hpxml)
@@ -621,6 +723,7 @@ class HPXML < Object
621
723
  @water_heating = WaterHeating.new(self, hpxml)
622
724
  @solar_thermal_systems = SolarThermalSystems.new(self, hpxml)
623
725
  @pv_systems = PVSystems.new(self, hpxml)
726
+ @batteries = Batteries.new(self, hpxml)
624
727
  @generators = Generators.new(self, hpxml)
625
728
  @clothes_washers = ClothesWashers.new(self, hpxml)
626
729
  @clothes_dryers = ClothesDryers.new(self, hpxml)
@@ -753,11 +856,11 @@ class HPXML < Object
753
856
  class Header < BaseElement
754
857
  ATTRS = [:xml_type, :xml_generated_by, :created_date_and_time, :transaction,
755
858
  :software_program_used, :software_program_version, :eri_calculation_version,
756
- :eri_design, :timestep, :building_id, :event_type, :state_code,
859
+ :eri_design, :timestep, :building_id, :event_type, :state_code, :zip_code,
757
860
  :sim_begin_month, :sim_begin_day, :sim_end_month, :sim_end_day, :sim_calendar_year,
758
861
  :dst_enabled, :dst_begin_month, :dst_begin_day, :dst_end_month, :dst_end_day,
759
862
  :use_max_load_for_heat_pumps, :allow_increased_fixed_capacities,
760
- :apply_ashrae140_assumptions, :energystar_calculation_version, :schedules_path]
863
+ :apply_ashrae140_assumptions, :energystar_calculation_version, :schedules_filepath]
761
864
  attr_accessor(*ATTRS)
762
865
 
763
866
  def check_for_errors
@@ -770,54 +873,25 @@ class HPXML < Object
770
873
  end
771
874
  end
772
875
 
773
- { 'Run Period' => @sim_begin_month, 'Daylight Saving' => @dst_begin_month }.each do |sim_ctl, begin_month|
774
- next unless not begin_month.nil?
775
-
776
- valid_months = (1..12).to_a
777
- if not valid_months.include? begin_month
778
- errors << "#{sim_ctl} Begin Month (#{begin_month}) must be one of: #{valid_months.join(', ')}."
779
- end
780
- end
781
-
782
- { 'Run Period' => @sim_end_month, 'Daylight Saving' => @dst_end_month }.each do |sim_ctl, end_month|
783
- next unless not end_month.nil?
876
+ errors += HPXML::check_dates('Run Period', @sim_begin_month, @sim_begin_day, @sim_end_month, @sim_end_day)
784
877
 
785
- valid_months = (1..12).to_a
786
- if not valid_months.include? end_month
787
- errors << "#{sim_ctl} End Month (#{end_month}) must be one of: #{valid_months.join(', ')}."
878
+ if (not @sim_begin_month.nil?) && (not @sim_end_month.nil?)
879
+ if @sim_begin_month > @sim_end_month
880
+ errors << "Run Period Begin Month (#{@sim_begin_month}) cannot come after Run Period End Month (#{@sim_end_month})."
788
881
  end
789
- end
790
-
791
- months_days = { [1, 3, 5, 7, 8, 10, 12] => (1..31).to_a, [4, 6, 9, 11] => (1..30).to_a, [2] => (1..28).to_a }
792
- months_days.each do |months, valid_days|
793
- { 'Run Period' => [@sim_begin_month, @sim_begin_day, @sim_end_month, @sim_end_day], 'Daylight Saving' => [@dst_begin_month, @dst_begin_day, @dst_end_month, @dst_end_day] }.each do |sim_ctl, months_and_days|
794
- begin_month, begin_day, end_month, end_day = months_and_days
795
- if (not begin_day.nil?) && (months.include? begin_month)
796
- if not valid_days.include? begin_day
797
- errors << "#{sim_ctl} Begin Day of Month (#{begin_day}) must be one of: #{valid_days.join(', ')}."
798
- end
799
- end
800
- next unless (not end_day.nil?) && (months.include? end_month)
801
882
 
802
- if not valid_days.include? end_day
803
- errors << "#{sim_ctl} End Day of Month (#{end_day}) must be one of: #{valid_days.join(', ')}."
883
+ if (not @sim_begin_day.nil?) && (not @sim_end_day.nil?)
884
+ if @sim_begin_month == @sim_end_month && @sim_begin_day > @sim_end_day
885
+ errors << "Run Period Begin Day of Month (#{@sim_begin_day}) cannot come after Run Period End Day of Month (#{@sim_end_day}) for the same month (#{begin_month})."
804
886
  end
805
887
  end
806
888
  end
807
889
 
808
- { 'Run Period' => [@sim_begin_month, @sim_begin_day, @sim_end_month, @sim_end_day] }.each do |sim_ctl, months_and_days|
809
- begin_month, begin_day, end_month, end_day = months_and_days
810
- next unless (not begin_month.nil?) && (not end_month.nil?)
890
+ errors += HPXML::check_dates('Daylight Saving', @dst_begin_month, @dst_begin_day, @dst_end_month, @dst_end_day)
811
891
 
812
- if begin_month > end_month
813
- errors << "#{sim_ctl} Begin Month (#{begin_month}) cannot come after #{sim_ctl} End Month (#{end_month})."
814
- end
815
-
816
- next unless (not begin_day.nil?) && (not end_day.nil?)
817
- next unless begin_month == end_month
818
-
819
- if begin_day > end_day
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})."
892
+ if not @schedules_filepath.nil?
893
+ unless File.exist? @schedules_filepath
894
+ errors << "Schedules file path '#{@schedules_filepath}' does not exist."
821
895
  end
822
896
  end
823
897
 
@@ -880,9 +954,9 @@ class HPXML < Object
880
954
  XMLHelper.add_element(hvac_sizing_control, 'UseMaxLoadForHeatPumps', @use_max_load_for_heat_pumps, :boolean, @use_max_load_for_heat_pumps_isdefaulted) unless @use_max_load_for_heat_pumps.nil?
881
955
  XMLHelper.add_element(hvac_sizing_control, 'AllowIncreasedFixedCapacities', @allow_increased_fixed_capacities, :boolean, @allow_increased_fixed_capacities_isdefaulted) unless @allow_increased_fixed_capacities.nil?
882
956
  end
883
- if not @schedules_path.nil?
957
+ if not @schedules_filepath.nil?
884
958
  extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
885
- XMLHelper.add_element(extension, 'OccupancySchedulesCSVPath', @schedules_path, :string) unless @schedules_path.nil?
959
+ XMLHelper.add_element(extension, 'SchedulesFilePath', @schedules_filepath, :string) unless @schedules_filepath.nil?
886
960
  end
887
961
 
888
962
  building = XMLHelper.add_element(hpxml, 'Building')
@@ -894,6 +968,7 @@ class HPXML < Object
894
968
  XMLHelper.add_attribute(site_id, 'id', 'SiteID')
895
969
  address = XMLHelper.add_element(site, 'Address')
896
970
  XMLHelper.add_element(address, 'StateCode', @state_code, :string)
971
+ XMLHelper.add_element(address, 'ZipCode', @zip_code, :string) unless @zip_code.nil?
897
972
  end
898
973
  project_status = XMLHelper.add_element(building, 'ProjectStatus')
899
974
  XMLHelper.add_element(project_status, 'EventType', @event_type, :string)
@@ -925,15 +1000,16 @@ class HPXML < Object
925
1000
  @apply_ashrae140_assumptions = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ApplyASHRAE140Assumptions', :boolean)
926
1001
  @use_max_load_for_heat_pumps = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/UseMaxLoadForHeatPumps', :boolean)
927
1002
  @allow_increased_fixed_capacities = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/AllowIncreasedFixedCapacities', :boolean)
928
- @schedules_path = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/OccupancySchedulesCSVPath', :string)
1003
+ @schedules_filepath = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SchedulesFilePath', :string)
929
1004
  @building_id = HPXML::get_id(hpxml, 'Building/BuildingID')
930
1005
  @event_type = XMLHelper.get_value(hpxml, 'Building/ProjectStatus/EventType', :string)
931
1006
  @state_code = XMLHelper.get_value(hpxml, 'Building/Site/Address/StateCode', :string)
1007
+ @zip_code = XMLHelper.get_value(hpxml, 'Building/Site/Address/ZipCode', :string)
932
1008
  end
933
1009
  end
934
1010
 
935
1011
  class Site < BaseElement
936
- ATTRS = [:site_type, :surroundings, :shielding_of_home, :orientation_of_front_of_home, :fuels]
1012
+ ATTRS = [:site_type, :surroundings, :vertical_surroundings, :shielding_of_home, :orientation_of_front_of_home, :azimuth_of_front_of_home, :fuels]
937
1013
  attr_accessor(*ATTRS)
938
1014
 
939
1015
  def check_for_errors
@@ -947,14 +1023,21 @@ class HPXML < Object
947
1023
  site = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'BuildingSummary', 'Site'])
948
1024
  XMLHelper.add_element(site, 'SiteType', @site_type, :string, @site_type_isdefaulted) unless @site_type.nil?
949
1025
  XMLHelper.add_element(site, 'Surroundings', @surroundings, :string) unless @surroundings.nil?
1026
+ XMLHelper.add_element(site, 'VerticalSurroundings', @vertical_surroundings, :string) unless @vertical_surroundings.nil?
950
1027
  XMLHelper.add_element(site, 'ShieldingofHome', @shielding_of_home, :string, @shielding_of_home_isdefaulted) unless @shielding_of_home.nil?
951
1028
  XMLHelper.add_element(site, 'OrientationOfFrontOfHome', @orientation_of_front_of_home, :string) unless @orientation_of_front_of_home.nil?
1029
+ XMLHelper.add_element(site, 'AzimuthOfFrontOfHome', @azimuth_of_front_of_home, :integer) unless @azimuth_of_front_of_home.nil?
952
1030
  if (not @fuels.nil?) && (not @fuels.empty?)
953
1031
  fuel_types_available = XMLHelper.add_element(site, 'FuelTypesAvailable')
954
1032
  @fuels.each do |fuel|
955
1033
  XMLHelper.add_element(fuel_types_available, 'Fuel', fuel, :string)
956
1034
  end
957
1035
  end
1036
+
1037
+ if site.children.size == 0
1038
+ bldg_summary = XMLHelper.get_element(doc, '/HPXML/Building/BuildingDetails/BuildingSummary')
1039
+ XMLHelper.delete_element(bldg_summary, 'Site')
1040
+ end
958
1041
  end
959
1042
 
960
1043
  def from_oga(hpxml)
@@ -965,8 +1048,10 @@ class HPXML < Object
965
1048
 
966
1049
  @site_type = XMLHelper.get_value(site, 'SiteType', :string)
967
1050
  @surroundings = XMLHelper.get_value(site, 'Surroundings', :string)
1051
+ @vertical_surroundings = XMLHelper.get_value(site, 'VerticalSurroundings', :string)
968
1052
  @shielding_of_home = XMLHelper.get_value(site, 'ShieldingofHome', :string)
969
1053
  @orientation_of_front_of_home = XMLHelper.get_value(site, 'OrientationOfFrontOfHome', :string)
1054
+ @azimuth_of_front_of_home = XMLHelper.get_value(site, 'AzimuthOfFrontOfHome', :integer)
970
1055
  @fuels = XMLHelper.get_values(site, 'FuelTypesAvailable/Fuel', :string)
971
1056
  end
972
1057
  end
@@ -986,7 +1071,7 @@ class HPXML < Object
986
1071
  end
987
1072
 
988
1073
  class NeighborBuilding < BaseElement
989
- ATTRS = [:azimuth, :distance, :height]
1074
+ ATTRS = [:azimuth, :orientation, :distance, :height]
990
1075
  attr_accessor(*ATTRS)
991
1076
 
992
1077
  def check_for_errors
@@ -999,7 +1084,8 @@ class HPXML < Object
999
1084
 
1000
1085
  neighbors = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'BuildingSummary', 'Site', 'extension', 'Neighbors'])
1001
1086
  neighbor_building = XMLHelper.add_element(neighbors, 'NeighborBuilding')
1002
- XMLHelper.add_element(neighbor_building, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
1087
+ XMLHelper.add_element(neighbor_building, 'Orientation', @orientation, :string, @orientation_isdefaulted) unless @orientation.nil?
1088
+ XMLHelper.add_element(neighbor_building, 'Azimuth', @azimuth, :integer, @azimuth_isdefaulted) unless @azimuth.nil?
1003
1089
  XMLHelper.add_element(neighbor_building, 'Distance', @distance, :float) unless @distance.nil?
1004
1090
  XMLHelper.add_element(neighbor_building, 'Height', @height, :float) unless @height.nil?
1005
1091
  end
@@ -1007,6 +1093,7 @@ class HPXML < Object
1007
1093
  def from_oga(neighbor_building)
1008
1094
  return if neighbor_building.nil?
1009
1095
 
1096
+ @orientation = XMLHelper.get_value(neighbor_building, 'Orientation', :string)
1010
1097
  @azimuth = XMLHelper.get_value(neighbor_building, 'Azimuth', :integer)
1011
1098
  @distance = XMLHelper.get_value(neighbor_building, 'Distance', :float)
1012
1099
  @height = XMLHelper.get_value(neighbor_building, 'Height', :float)
@@ -1014,7 +1101,7 @@ class HPXML < Object
1014
1101
  end
1015
1102
 
1016
1103
  class BuildingOccupancy < BaseElement
1017
- ATTRS = [:number_of_residents]
1104
+ ATTRS = [:number_of_residents, :weekday_fractions, :weekend_fractions, :monthly_multipliers]
1018
1105
  attr_accessor(*ATTRS)
1019
1106
 
1020
1107
  def check_for_errors
@@ -1027,6 +1114,9 @@ class HPXML < Object
1027
1114
 
1028
1115
  building_occupancy = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'BuildingSummary', 'BuildingOccupancy'])
1029
1116
  XMLHelper.add_element(building_occupancy, 'NumberofResidents', @number_of_residents, :float, @number_of_residents_isdefaulted) unless @number_of_residents.nil?
1117
+ XMLHelper.add_extension(building_occupancy, 'WeekdayScheduleFractions', @weekday_fractions, :string, @weekday_fractions_isdefaulted) unless @weekday_fractions.nil?
1118
+ XMLHelper.add_extension(building_occupancy, 'WeekendScheduleFractions', @weekend_fractions, :string, @weekend_fractions_isdefaulted) unless @weekend_fractions.nil?
1119
+ XMLHelper.add_extension(building_occupancy, 'MonthlyScheduleMultipliers', @monthly_multipliers, :string, @monthly_multipliers_isdefaulted) unless @monthly_multipliers.nil?
1030
1120
  end
1031
1121
 
1032
1122
  def from_oga(hpxml)
@@ -1036,6 +1126,9 @@ class HPXML < Object
1036
1126
  return if building_occupancy.nil?
1037
1127
 
1038
1128
  @number_of_residents = XMLHelper.get_value(building_occupancy, 'NumberofResidents', :float)
1129
+ @weekday_fractions = XMLHelper.get_value(building_occupancy, 'extension/WeekdayScheduleFractions', :string)
1130
+ @weekend_fractions = XMLHelper.get_value(building_occupancy, 'extension/WeekendScheduleFractions', :string)
1131
+ @monthly_multipliers = XMLHelper.get_value(building_occupancy, 'extension/MonthlyScheduleMultipliers', :string)
1039
1132
  end
1040
1133
  end
1041
1134
 
@@ -1212,7 +1305,7 @@ class HPXML < Object
1212
1305
 
1213
1306
  class Attic < BaseElement
1214
1307
  ATTRS = [:id, :attic_type, :vented_attic_sla, :vented_attic_ach, :within_infiltration_volume,
1215
- :attached_to_roof_idrefs, :attached_to_frame_floor_idrefs]
1308
+ :attached_to_roof_idrefs, :attached_to_wall_idrefs, :attached_to_frame_floor_idrefs]
1216
1309
  attr_accessor(*ATTRS)
1217
1310
 
1218
1311
  def attached_roofs
@@ -1226,6 +1319,17 @@ class HPXML < Object
1226
1319
  return list
1227
1320
  end
1228
1321
 
1322
+ def attached_walls
1323
+ return [] if @attached_to_wall_idrefs.nil?
1324
+
1325
+ list = @hpxml_object.walls.select { |wall| @attached_to_wall_idrefs.include? wall.id }
1326
+ if @attached_to_wall_idrefs.size > list.size
1327
+ fail "Attached wall not found for attic '#{@id}'."
1328
+ end
1329
+
1330
+ return list
1331
+ end
1332
+
1229
1333
  def attached_frame_floors
1230
1334
  return [] if @attached_to_frame_floor_idrefs.nil?
1231
1335
 
@@ -1240,24 +1344,25 @@ class HPXML < Object
1240
1344
  def to_location
1241
1345
  return if @attic_type.nil?
1242
1346
 
1243
- if @attic_type == AtticTypeCathedral
1244
- return LocationLivingSpace
1245
- elsif @attic_type == AtticTypeConditioned
1246
- return LocationLivingSpace
1247
- elsif @attic_type == AtticTypeFlatRoof
1347
+ if [AtticTypeCathedral, AtticTypeConditioned, AtticTypeFlatRoof, AtticTypeBelowApartment].include? @attic_type
1248
1348
  return LocationLivingSpace
1249
- elsif @attic_type == AtticTypeUnvented
1349
+ elsif [AtticTypeUnvented].include? @attic_type
1250
1350
  return LocationAtticUnvented
1251
- elsif @attic_type == AtticTypeVented
1351
+ elsif [AtticTypeVented].include? @attic_type
1252
1352
  return LocationAtticVented
1253
1353
  else
1254
1354
  fail "Unexpected attic type: '#{@attic_type}'."
1255
1355
  end
1256
1356
  end
1257
1357
 
1358
+ def delete
1359
+ @hpxml_object.attics.delete(self)
1360
+ end
1361
+
1258
1362
  def check_for_errors
1259
1363
  errors = []
1260
1364
  begin; attached_roofs; rescue StandardError => e; errors << e.message; end
1365
+ begin; attached_walls; rescue StandardError => e; errors << e.message; end
1261
1366
  begin; attached_frame_floors; rescue StandardError => e; errors << e.message; end
1262
1367
  begin; to_location; rescue StandardError => e; errors << e.message; end
1263
1368
  return errors
@@ -1272,10 +1377,12 @@ class HPXML < Object
1272
1377
  XMLHelper.add_attribute(sys_id, 'id', @id)
1273
1378
  if not @attic_type.nil?
1274
1379
  attic_type_el = XMLHelper.add_element(attic, 'AtticType')
1275
- if @attic_type == AtticTypeUnvented
1380
+ if [AtticTypeFlatRoof, AtticTypeCathedral, AtticTypeBelowApartment].include? @attic_type
1381
+ XMLHelper.add_element(attic_type_el, @attic_type)
1382
+ elsif [AtticTypeUnvented].include? @attic_type
1276
1383
  attic_type_attic = XMLHelper.add_element(attic_type_el, 'Attic')
1277
1384
  XMLHelper.add_element(attic_type_attic, 'Vented', false, :boolean)
1278
- elsif @attic_type == AtticTypeVented
1385
+ elsif [AtticTypeVented].include? @attic_type
1279
1386
  attic_type_attic = XMLHelper.add_element(attic_type_el, 'Attic')
1280
1387
  XMLHelper.add_element(attic_type_attic, 'Vented', true, :boolean)
1281
1388
  if not @vented_attic_sla.nil?
@@ -1287,16 +1394,32 @@ class HPXML < Object
1287
1394
  XMLHelper.add_element(ventilation_rate, 'UnitofMeasure', UnitsACHNatural, :string)
1288
1395
  XMLHelper.add_element(ventilation_rate, 'Value', @vented_attic_ach, :float)
1289
1396
  end
1290
- elsif @attic_type == AtticTypeConditioned
1397
+ elsif [AtticTypeConditioned].include? @attic_type
1291
1398
  attic_type_attic = XMLHelper.add_element(attic_type_el, 'Attic')
1292
1399
  XMLHelper.add_element(attic_type_attic, 'Conditioned', true, :boolean)
1293
- elsif (@attic_type == AtticTypeFlatRoof) || (@attic_type == AtticTypeCathedral)
1294
- XMLHelper.add_element(attic_type_el, @attic_type)
1295
1400
  else
1296
1401
  fail "Unhandled attic type '#{@attic_type}'."
1297
1402
  end
1298
1403
  end
1299
1404
  XMLHelper.add_element(attic, 'WithinInfiltrationVolume', within_infiltration_volume, :boolean) unless @within_infiltration_volume.nil?
1405
+ if not @attached_to_roof_idrefs.nil?
1406
+ @attached_to_roof_idrefs.each do |roof|
1407
+ roof_attached = XMLHelper.add_element(attic, 'AttachedToRoof')
1408
+ XMLHelper.add_attribute(roof_attached, 'idref', roof)
1409
+ end
1410
+ end
1411
+ if not @attached_to_wall_idrefs.nil?
1412
+ @attached_to_wall_idrefs.each do |wall|
1413
+ wall_attached = XMLHelper.add_element(attic, 'AttachedToWall')
1414
+ XMLHelper.add_attribute(wall_attached, 'idref', wall)
1415
+ end
1416
+ end
1417
+ if not @attached_to_frame_floor_idrefs.nil?
1418
+ @attached_to_frame_floor_idrefs.each do |floor|
1419
+ floor_attached = XMLHelper.add_element(attic, 'AttachedToFrameFloor')
1420
+ XMLHelper.add_attribute(floor_attached, 'idref', floor)
1421
+ end
1422
+ end
1300
1423
  end
1301
1424
 
1302
1425
  def from_oga(attic)
@@ -1313,6 +1436,8 @@ class HPXML < Object
1313
1436
  @attic_type = AtticTypeFlatRoof
1314
1437
  elsif XMLHelper.has_element(attic, 'AtticType/CathedralCeiling')
1315
1438
  @attic_type = AtticTypeCathedral
1439
+ elsif XMLHelper.has_element(attic, 'AtticType/BelowApartment')
1440
+ @attic_type = AtticTypeBelowApartment
1316
1441
  end
1317
1442
  if @attic_type == AtticTypeVented
1318
1443
  @vented_attic_sla = XMLHelper.get_value(attic, "VentilationRate[UnitofMeasure='#{UnitsSLA}']/Value", :float)
@@ -1323,6 +1448,10 @@ class HPXML < Object
1323
1448
  XMLHelper.get_elements(attic, 'AttachedToRoof').each do |roof|
1324
1449
  @attached_to_roof_idrefs << HPXML::get_idref(roof)
1325
1450
  end
1451
+ @attached_to_wall_idrefs = []
1452
+ XMLHelper.get_elements(attic, 'AttachedToWall').each do |wall|
1453
+ @attached_to_wall_idrefs << HPXML::get_idref(wall)
1454
+ end
1326
1455
  @attached_to_frame_floor_idrefs = []
1327
1456
  XMLHelper.get_elements(attic, 'AttachedToFrameFloor').each do |frame_floor|
1328
1457
  @attached_to_frame_floor_idrefs << HPXML::get_idref(frame_floor)
@@ -1346,7 +1475,8 @@ class HPXML < Object
1346
1475
 
1347
1476
  class Foundation < BaseElement
1348
1477
  ATTRS = [:id, :foundation_type, :vented_crawlspace_sla, :within_infiltration_volume,
1349
- :attached_to_slab_idrefs, :attached_to_frame_floor_idrefs, :attached_to_foundation_wall_idrefs]
1478
+ :attached_to_slab_idrefs, :attached_to_frame_floor_idrefs, :attached_to_foundation_wall_idrefs,
1479
+ :attached_to_wall_idrefs, :attached_to_rim_joist_idrefs]
1350
1480
  attr_accessor(*ATTRS)
1351
1481
 
1352
1482
  def attached_slabs
@@ -1382,19 +1512,45 @@ class HPXML < Object
1382
1512
  return list
1383
1513
  end
1384
1514
 
1515
+ def attached_walls
1516
+ return [] if @attached_to_wall_idrefs.nil?
1517
+
1518
+ list = @hpxml_object.walls.select { |wall| @attached_to_wall_idrefs.include? wall.id }
1519
+ if @attached_to_wall_idrefs.size > list.size
1520
+ fail "Attached wall not found for foundation '#{@id}'."
1521
+ end
1522
+
1523
+ return list
1524
+ end
1525
+
1526
+ def attached_rim_joists
1527
+ return [] if @attached_to_rim_joist_idrefs.nil?
1528
+
1529
+ list = @hpxml_object.rim_joists.select { |rim_joist| @attached_to_rim_joist_idrefs.include? rim_joist.id }
1530
+ if @attached_to_rim_joist_idrefs.size > list.size
1531
+ fail "Attached rim joist not found for foundation '#{@id}'."
1532
+ end
1533
+
1534
+ return list
1535
+ end
1536
+
1385
1537
  def to_location
1386
1538
  return if @foundation_type.nil?
1387
1539
 
1388
- if @foundation_type == FoundationTypeAmbient
1540
+ if [FoundationTypeSlab, FoundationTypeAboveApartment].include? @foundation_type
1541
+ return LocationLivingSpace
1542
+ elsif [FoundationTypeAmbient].include? @foundation_type
1389
1543
  return LocationOutside
1390
- elsif @foundation_type == FoundationTypeBasementConditioned
1544
+ elsif [FoundationTypeBasementConditioned].include? @foundation_type
1391
1545
  return LocationBasementConditioned
1392
- elsif @foundation_type == FoundationTypeBasementUnconditioned
1546
+ elsif [FoundationTypeBasementUnconditioned].include? @foundation_type
1393
1547
  return LocationBasementUnconditioned
1394
- elsif @foundation_type == FoundationTypeCrawlspaceUnvented
1548
+ elsif [FoundationTypeCrawlspaceUnvented].include? @foundation_type
1395
1549
  return LocationCrawlspaceUnvented
1396
- elsif @foundation_type == FoundationTypeCrawlspaceVented
1550
+ elsif [FoundationTypeCrawlspaceVented].include? @foundation_type
1397
1551
  return LocationCrawlspaceVented
1552
+ elsif @foundation_type == FoundationTypeCrawlspaceConditioned
1553
+ return LocationCrawlspaceConditioned
1398
1554
  elsif @foundation_type == FoundationTypeSlab
1399
1555
  return LocationLivingSpace
1400
1556
  else
@@ -1417,11 +1573,17 @@ class HPXML < Object
1417
1573
  return sum_area
1418
1574
  end
1419
1575
 
1576
+ def delete
1577
+ @hpxml_object.foundations.delete(self)
1578
+ end
1579
+
1420
1580
  def check_for_errors
1421
1581
  errors = []
1422
1582
  begin; attached_slabs; rescue StandardError => e; errors << e.message; end
1423
1583
  begin; attached_frame_floors; rescue StandardError => e; errors << e.message; end
1424
1584
  begin; attached_foundation_walls; rescue StandardError => e; errors << e.message; end
1585
+ begin; attached_walls; rescue StandardError => e; errors << e.message; end
1586
+ begin; attached_rim_joists; rescue StandardError => e; errors << e.message; end
1425
1587
  begin; to_location; rescue StandardError => e; errors << e.message; end
1426
1588
  return errors
1427
1589
  end
@@ -1435,15 +1597,15 @@ class HPXML < Object
1435
1597
  XMLHelper.add_attribute(sys_id, 'id', @id)
1436
1598
  if not @foundation_type.nil?
1437
1599
  foundation_type_el = XMLHelper.add_element(foundation, 'FoundationType')
1438
- if [FoundationTypeSlab, FoundationTypeAmbient].include? @foundation_type
1600
+ if [FoundationTypeSlab, FoundationTypeAmbient, FoundationTypeAboveApartment].include? @foundation_type
1439
1601
  XMLHelper.add_element(foundation_type_el, @foundation_type)
1440
- elsif @foundation_type == FoundationTypeBasementConditioned
1602
+ elsif [FoundationTypeBasementConditioned].include? @foundation_type
1441
1603
  basement = XMLHelper.add_element(foundation_type_el, 'Basement')
1442
1604
  XMLHelper.add_element(basement, 'Conditioned', true, :boolean)
1443
- elsif @foundation_type == FoundationTypeBasementUnconditioned
1605
+ elsif [FoundationTypeBasementUnconditioned].include? @foundation_type
1444
1606
  basement = XMLHelper.add_element(foundation_type_el, 'Basement')
1445
1607
  XMLHelper.add_element(basement, 'Conditioned', false, :boolean)
1446
- elsif @foundation_type == FoundationTypeCrawlspaceVented
1608
+ elsif [FoundationTypeCrawlspaceVented].include? @foundation_type
1447
1609
  crawlspace = XMLHelper.add_element(foundation_type_el, 'Crawlspace')
1448
1610
  XMLHelper.add_element(crawlspace, 'Vented', true, :boolean)
1449
1611
  if not @vented_crawlspace_sla.nil?
@@ -1451,14 +1613,47 @@ class HPXML < Object
1451
1613
  XMLHelper.add_element(ventilation_rate, 'UnitofMeasure', UnitsSLA, :string)
1452
1614
  XMLHelper.add_element(ventilation_rate, 'Value', @vented_crawlspace_sla, :float, @vented_crawlspace_sla_isdefaulted)
1453
1615
  end
1454
- elsif @foundation_type == FoundationTypeCrawlspaceUnvented
1616
+ elsif [FoundationTypeCrawlspaceUnvented].include? @foundation_type
1455
1617
  crawlspace = XMLHelper.add_element(foundation_type_el, 'Crawlspace')
1456
1618
  XMLHelper.add_element(crawlspace, 'Vented', false, :boolean)
1619
+ elsif @foundation_type == FoundationTypeCrawlspaceConditioned
1620
+ crawlspace = XMLHelper.add_element(foundation_type_el, 'Crawlspace')
1621
+ XMLHelper.add_element(crawlspace, 'Conditioned', true, :boolean)
1457
1622
  else
1458
1623
  fail "Unhandled foundation type '#{@foundation_type}'."
1459
1624
  end
1460
1625
  end
1461
1626
  XMLHelper.add_element(foundation, 'WithinInfiltrationVolume', @within_infiltration_volume, :boolean) unless @within_infiltration_volume.nil?
1627
+ if not @attached_to_rim_joist_idrefs.nil?
1628
+ @attached_to_rim_joist_idrefs.each do |rim_joist|
1629
+ rim_joist_attached = XMLHelper.add_element(foundation, 'AttachedToRimJoist')
1630
+ XMLHelper.add_attribute(rim_joist_attached, 'idref', rim_joist)
1631
+ end
1632
+ end
1633
+ if not @attached_to_wall_idrefs.nil?
1634
+ @attached_to_wall_idrefs.each do |wall|
1635
+ wall_attached = XMLHelper.add_element(foundation, 'AttachedToWall')
1636
+ XMLHelper.add_attribute(wall_attached, 'idref', wall)
1637
+ end
1638
+ end
1639
+ if not @attached_to_foundation_wall_idrefs.nil?
1640
+ @attached_to_foundation_wall_idrefs.each do |foundation_wall|
1641
+ foundation_wall_attached = XMLHelper.add_element(foundation, 'AttachedToFoundationWall')
1642
+ XMLHelper.add_attribute(foundation_wall_attached, 'idref', foundation_wall)
1643
+ end
1644
+ end
1645
+ if not @attached_to_frame_floor_idrefs.nil?
1646
+ @attached_to_frame_floor_idrefs.each do |frame_floor|
1647
+ floor_frame_attached = XMLHelper.add_element(foundation, 'AttachedToFrameFloor')
1648
+ XMLHelper.add_attribute(floor_frame_attached, 'idref', frame_floor)
1649
+ end
1650
+ end
1651
+ if not @attached_to_slab_idrefs.nil?
1652
+ @attached_to_slab_idrefs.each do |slab|
1653
+ slab_attached = XMLHelper.add_element(foundation, 'AttachedToSlab')
1654
+ XMLHelper.add_attribute(slab_attached, 'idref', slab)
1655
+ end
1656
+ end
1462
1657
  end
1463
1658
 
1464
1659
  def from_oga(foundation)
@@ -1475,13 +1670,25 @@ class HPXML < Object
1475
1670
  @foundation_type = FoundationTypeCrawlspaceUnvented
1476
1671
  elsif XMLHelper.has_element(foundation, "FoundationType/Crawlspace[Vented='true']")
1477
1672
  @foundation_type = FoundationTypeCrawlspaceVented
1673
+ elsif XMLHelper.has_element(foundation, "FoundationType/Crawlspace[Conditioned='true']")
1674
+ @foundation_type = FoundationTypeCrawlspaceConditioned
1478
1675
  elsif XMLHelper.has_element(foundation, 'FoundationType/Ambient')
1479
1676
  @foundation_type = FoundationTypeAmbient
1677
+ elsif XMLHelper.has_element(foundation, 'FoundationType/AboveApartment')
1678
+ @foundation_type = FoundationTypeAboveApartment
1480
1679
  end
1481
1680
  if @foundation_type == FoundationTypeCrawlspaceVented
1482
1681
  @vented_crawlspace_sla = XMLHelper.get_value(foundation, "VentilationRate[UnitofMeasure='#{UnitsSLA}']/Value", :float)
1483
1682
  end
1484
1683
  @within_infiltration_volume = XMLHelper.get_value(foundation, 'WithinInfiltrationVolume', :boolean)
1684
+ @attached_to_rim_joist_idrefs = []
1685
+ XMLHelper.get_elements(foundation, 'AttachedToRimJoist').each do |rim_joist|
1686
+ @attached_to_rim_joist_idrefs << HPXML::get_idref(rim_joist)
1687
+ end
1688
+ @attached_to_wall_idrefs = []
1689
+ XMLHelper.get_elements(foundation, 'AttachedToWall').each do |wall|
1690
+ @attached_to_wall_idrefs << HPXML::get_idref(wall)
1691
+ end
1485
1692
  @attached_to_slab_idrefs = []
1486
1693
  XMLHelper.get_elements(foundation, 'AttachedToSlab').each do |slab|
1487
1694
  @attached_to_slab_idrefs << HPXML::get_idref(slab)
@@ -1515,7 +1722,8 @@ class HPXML < Object
1515
1722
  ATTRS = [:id, :interior_adjacent_to, :area, :azimuth, :orientation, :roof_type,
1516
1723
  :roof_color, :solar_absorptance, :emittance, :pitch, :radiant_barrier,
1517
1724
  :insulation_id, :insulation_assembly_r_value, :insulation_cavity_r_value,
1518
- :insulation_continuous_r_value, :radiant_barrier_grade]
1725
+ :insulation_continuous_r_value, :radiant_barrier_grade,
1726
+ :interior_finish_type, :interior_finish_thickness]
1519
1727
  attr_accessor(*ATTRS)
1520
1728
 
1521
1729
  def skylights
@@ -1555,6 +1763,10 @@ class HPXML < Object
1555
1763
  return (is_exterior && is_thermal_boundary)
1556
1764
  end
1557
1765
 
1766
+ def is_conditioned
1767
+ return HPXML::is_conditioned(self)
1768
+ end
1769
+
1558
1770
  def delete
1559
1771
  @hpxml_object.roofs.delete(self)
1560
1772
  skylights.reverse_each do |skylight|
@@ -1580,15 +1792,20 @@ class HPXML < Object
1580
1792
  XMLHelper.add_attribute(sys_id, 'id', @id)
1581
1793
  XMLHelper.add_element(roof, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
1582
1794
  XMLHelper.add_element(roof, 'Area', @area, :float) unless @area.nil?
1583
- XMLHelper.add_element(roof, 'Orientation', @orientation, :string) unless @orientation.nil?
1584
- XMLHelper.add_element(roof, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
1795
+ XMLHelper.add_element(roof, 'Orientation', @orientation, :string, @orientation_isdefaulted) unless @orientation.nil?
1796
+ XMLHelper.add_element(roof, 'Azimuth', @azimuth, :integer, @azimuth_isdefaulted) unless @azimuth.nil?
1585
1797
  XMLHelper.add_element(roof, 'RoofType', @roof_type, :string, @roof_type_isdefaulted) unless @roof_type.nil?
1586
1798
  XMLHelper.add_element(roof, 'RoofColor', @roof_color, :string, @roof_color_isdefaulted) unless @roof_color.nil?
1587
1799
  XMLHelper.add_element(roof, 'SolarAbsorptance', @solar_absorptance, :float, @solar_absorptance_isdefaulted) unless @solar_absorptance.nil?
1588
1800
  XMLHelper.add_element(roof, 'Emittance', @emittance, :float, @emittance_isdefaulted) unless @emittance.nil?
1801
+ if (not @interior_finish_type.nil?) || (not @interior_finish_thickness.nil?)
1802
+ interior_finish = XMLHelper.add_element(roof, 'InteriorFinish')
1803
+ XMLHelper.add_element(interior_finish, 'Type', @interior_finish_type, :string, @interior_finish_type_isdefaulted) unless @interior_finish_type.nil?
1804
+ XMLHelper.add_element(interior_finish, 'Thickness', @interior_finish_thickness, :float, @interior_finish_thickness_isdefaulted) unless @interior_finish_thickness.nil?
1805
+ end
1589
1806
  XMLHelper.add_element(roof, 'Pitch', @pitch, :float) unless @pitch.nil?
1590
1807
  XMLHelper.add_element(roof, 'RadiantBarrier', @radiant_barrier, :boolean, @radiant_barrier_isdefaulted) unless @radiant_barrier.nil?
1591
- XMLHelper.add_element(roof, 'RadiantBarrierGrade', @radiant_barrier_grade, :integer) unless @radiant_barrier_grade.nil?
1808
+ XMLHelper.add_element(roof, 'RadiantBarrierGrade', @radiant_barrier_grade, :integer, @radiant_barrier_grade_isdefaulted) unless @radiant_barrier_grade.nil?
1592
1809
  insulation = XMLHelper.add_element(roof, 'Insulation')
1593
1810
  sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
1594
1811
  if not @insulation_id.nil?
@@ -1621,6 +1838,11 @@ class HPXML < Object
1621
1838
  @roof_color = XMLHelper.get_value(roof, 'RoofColor', :string)
1622
1839
  @solar_absorptance = XMLHelper.get_value(roof, 'SolarAbsorptance', :float)
1623
1840
  @emittance = XMLHelper.get_value(roof, 'Emittance', :float)
1841
+ interior_finish = XMLHelper.get_element(roof, 'InteriorFinish')
1842
+ if not interior_finish.nil?
1843
+ @interior_finish_type = XMLHelper.get_value(interior_finish, 'Type', :string)
1844
+ @interior_finish_thickness = XMLHelper.get_value(interior_finish, 'Thickness', :float)
1845
+ end
1624
1846
  @pitch = XMLHelper.get_value(roof, 'Pitch', :float)
1625
1847
  @radiant_barrier = XMLHelper.get_value(roof, 'RadiantBarrier', :boolean)
1626
1848
  @radiant_barrier_grade = XMLHelper.get_value(roof, 'RadiantBarrierGrade', :integer)
@@ -1678,8 +1900,15 @@ class HPXML < Object
1678
1900
  return (is_exterior && is_thermal_boundary)
1679
1901
  end
1680
1902
 
1903
+ def is_conditioned
1904
+ return HPXML::is_conditioned(self)
1905
+ end
1906
+
1681
1907
  def delete
1682
1908
  @hpxml_object.rim_joists.delete(self)
1909
+ @hpxml_object.foundations.each do |foundation|
1910
+ foundation.attached_to_rim_joist_idrefs.delete(@id) unless foundation.attached_to_rim_joist_idrefs.nil?
1911
+ end
1683
1912
  end
1684
1913
 
1685
1914
  def check_for_errors
@@ -1697,8 +1926,8 @@ class HPXML < Object
1697
1926
  XMLHelper.add_element(rim_joist, 'ExteriorAdjacentTo', @exterior_adjacent_to, :string) unless @exterior_adjacent_to.nil?
1698
1927
  XMLHelper.add_element(rim_joist, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
1699
1928
  XMLHelper.add_element(rim_joist, 'Area', @area, :float) unless @area.nil?
1700
- XMLHelper.add_element(rim_joist, 'Orientation', @orientation, :string) unless @orientation.nil?
1701
- XMLHelper.add_element(rim_joist, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
1929
+ XMLHelper.add_element(rim_joist, 'Orientation', @orientation, :string, @orientation_isdefaulted) unless @orientation.nil?
1930
+ XMLHelper.add_element(rim_joist, 'Azimuth', @azimuth, :integer, @azimuth_isdefaulted) unless @azimuth.nil?
1702
1931
  XMLHelper.add_element(rim_joist, 'Siding', @siding, :string, @siding_isdefaulted) unless @siding.nil?
1703
1932
  XMLHelper.add_element(rim_joist, 'Color', @color, :string, @color_isdefaulted) unless @color.nil?
1704
1933
  XMLHelper.add_element(rim_joist, 'SolarAbsorptance', @solar_absorptance, :float, @solar_absorptance_isdefaulted) unless @solar_absorptance.nil?
@@ -1763,7 +1992,8 @@ class HPXML < Object
1763
1992
  class Wall < BaseElement
1764
1993
  ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :wall_type, :optimum_value_engineering,
1765
1994
  :area, :orientation, :azimuth, :siding, :color, :solar_absorptance, :emittance, :insulation_id,
1766
- :insulation_assembly_r_value, :insulation_cavity_r_value, :insulation_continuous_r_value]
1995
+ :insulation_assembly_r_value, :insulation_cavity_r_value, :insulation_continuous_r_value,
1996
+ :interior_finish_type, :interior_finish_thickness, :attic_wall_type]
1767
1997
  attr_accessor(*ATTRS)
1768
1998
 
1769
1999
  def windows
@@ -1811,6 +2041,10 @@ class HPXML < Object
1811
2041
  return (is_exterior && is_thermal_boundary)
1812
2042
  end
1813
2043
 
2044
+ def is_conditioned
2045
+ return HPXML::is_conditioned(self)
2046
+ end
2047
+
1814
2048
  def delete
1815
2049
  @hpxml_object.walls.delete(self)
1816
2050
  windows.reverse_each do |window|
@@ -1819,6 +2053,12 @@ class HPXML < Object
1819
2053
  doors.reverse_each do |door|
1820
2054
  door.delete
1821
2055
  end
2056
+ @hpxml_object.attics.each do |attic|
2057
+ attic.attached_to_wall_idrefs.delete(@id) unless attic.attached_to_wall_idrefs.nil?
2058
+ end
2059
+ @hpxml_object.foundations.each do |foundation|
2060
+ foundation.attached_to_wall_idrefs.delete(@id) unless foundation.attached_to_wall_idrefs.nil?
2061
+ end
1822
2062
  end
1823
2063
 
1824
2064
  def check_for_errors
@@ -1836,6 +2076,7 @@ class HPXML < Object
1836
2076
  XMLHelper.add_attribute(sys_id, 'id', @id)
1837
2077
  XMLHelper.add_element(wall, 'ExteriorAdjacentTo', @exterior_adjacent_to, :string) unless @exterior_adjacent_to.nil?
1838
2078
  XMLHelper.add_element(wall, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
2079
+ XMLHelper.add_element(wall, 'AtticWallType', @attic_wall_type, :string) unless @attic_wall_type.nil?
1839
2080
  if not @wall_type.nil?
1840
2081
  wall_type_el = XMLHelper.add_element(wall, 'WallType')
1841
2082
  wall_type = XMLHelper.add_element(wall_type_el, @wall_type)
@@ -1844,12 +2085,17 @@ class HPXML < Object
1844
2085
  end
1845
2086
  end
1846
2087
  XMLHelper.add_element(wall, 'Area', @area, :float) unless @area.nil?
1847
- XMLHelper.add_element(wall, 'Orientation', @orientation, :string) unless @orientation.nil?
1848
- XMLHelper.add_element(wall, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
2088
+ XMLHelper.add_element(wall, 'Orientation', @orientation, :string, @orientation_isdefaulted) unless @orientation.nil?
2089
+ XMLHelper.add_element(wall, 'Azimuth', @azimuth, :integer, @azimuth_isdefaulted) unless @azimuth.nil?
1849
2090
  XMLHelper.add_element(wall, 'Siding', @siding, :string, @siding_isdefaulted) unless @siding.nil?
1850
2091
  XMLHelper.add_element(wall, 'Color', @color, :string, @color_isdefaulted) unless @color.nil?
1851
2092
  XMLHelper.add_element(wall, 'SolarAbsorptance', @solar_absorptance, :float, @solar_absorptance_isdefaulted) unless @solar_absorptance.nil?
1852
2093
  XMLHelper.add_element(wall, 'Emittance', @emittance, :float, @emittance_isdefaulted) unless @emittance.nil?
2094
+ if (not @interior_finish_type.nil?) || (not @interior_finish_thickness.nil?)
2095
+ interior_finish = XMLHelper.add_element(wall, 'InteriorFinish')
2096
+ XMLHelper.add_element(interior_finish, 'Type', @interior_finish_type, :string, @interior_finish_type_isdefaulted) unless @interior_finish_type.nil?
2097
+ XMLHelper.add_element(interior_finish, 'Thickness', @interior_finish_thickness, :float, @interior_finish_thickness_isdefaulted) unless @interior_finish_thickness.nil?
2098
+ end
1853
2099
  insulation = XMLHelper.add_element(wall, 'Insulation')
1854
2100
  sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
1855
2101
  if not @insulation_id.nil?
@@ -1876,6 +2122,7 @@ class HPXML < Object
1876
2122
  @id = HPXML::get_id(wall)
1877
2123
  @exterior_adjacent_to = XMLHelper.get_value(wall, 'ExteriorAdjacentTo', :string)
1878
2124
  @interior_adjacent_to = XMLHelper.get_value(wall, 'InteriorAdjacentTo', :string)
2125
+ @attic_wall_type = XMLHelper.get_value(wall, 'AtticWallType', :string)
1879
2126
  @wall_type = XMLHelper.get_child_name(wall, 'WallType')
1880
2127
  if @wall_type == HPXML::WallTypeWoodStud
1881
2128
  @optimum_value_engineering = XMLHelper.get_value(wall, 'WallType/WoodStud/OptimumValueEngineering', :boolean)
@@ -1887,6 +2134,11 @@ class HPXML < Object
1887
2134
  @color = XMLHelper.get_value(wall, 'Color', :string)
1888
2135
  @solar_absorptance = XMLHelper.get_value(wall, 'SolarAbsorptance', :float)
1889
2136
  @emittance = XMLHelper.get_value(wall, 'Emittance', :float)
2137
+ interior_finish = XMLHelper.get_element(wall, 'InteriorFinish')
2138
+ if not interior_finish.nil?
2139
+ @interior_finish_type = XMLHelper.get_value(interior_finish, 'Type', :string)
2140
+ @interior_finish_thickness = XMLHelper.get_value(interior_finish, 'Thickness', :float)
2141
+ end
1890
2142
  insulation = XMLHelper.get_element(wall, 'Insulation')
1891
2143
  if not insulation.nil?
1892
2144
  @insulation_id = HPXML::get_id(insulation)
@@ -1912,12 +2164,12 @@ class HPXML < Object
1912
2164
  end
1913
2165
 
1914
2166
  class FoundationWall < BaseElement
1915
- ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :height, :area, :orientation, :azimuth,
1916
- :thickness, :depth_below_grade, :insulation_id, :insulation_interior_r_value,
2167
+ ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :length, :height, :area, :orientation,
2168
+ :type, :azimuth, :thickness, :depth_below_grade, :insulation_id, :insulation_interior_r_value,
1917
2169
  :insulation_interior_distance_to_top, :insulation_interior_distance_to_bottom,
1918
2170
  :insulation_exterior_r_value, :insulation_exterior_distance_to_top,
1919
2171
  :insulation_exterior_distance_to_bottom, :insulation_assembly_r_value,
1920
- :insulation_continuous_r_value]
2172
+ :insulation_continuous_r_value, :interior_finish_type, :interior_finish_thickness]
1921
2173
  attr_accessor(*ATTRS)
1922
2174
 
1923
2175
  def windows
@@ -1967,6 +2219,10 @@ class HPXML < Object
1967
2219
  return (is_exterior && is_thermal_boundary)
1968
2220
  end
1969
2221
 
2222
+ def is_conditioned
2223
+ return HPXML::is_conditioned(self)
2224
+ end
2225
+
1970
2226
  def delete
1971
2227
  @hpxml_object.foundation_walls.delete(self)
1972
2228
  windows.reverse_each do |window|
@@ -1995,12 +2251,19 @@ class HPXML < Object
1995
2251
  XMLHelper.add_attribute(sys_id, 'id', @id)
1996
2252
  XMLHelper.add_element(foundation_wall, 'ExteriorAdjacentTo', @exterior_adjacent_to, :string) unless @exterior_adjacent_to.nil?
1997
2253
  XMLHelper.add_element(foundation_wall, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
2254
+ XMLHelper.add_element(foundation_wall, 'Type', @type, :string, @type_isdefaulted) unless @type.nil?
2255
+ XMLHelper.add_element(foundation_wall, 'Length', @length, :float) unless @length.nil?
1998
2256
  XMLHelper.add_element(foundation_wall, 'Height', @height, :float) unless @height.nil?
1999
- XMLHelper.add_element(foundation_wall, 'Area', @area, :float) unless @area.nil?
2000
- XMLHelper.add_element(foundation_wall, 'Orientation', @orientation, :string) unless @orientation.nil?
2001
- XMLHelper.add_element(foundation_wall, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
2257
+ XMLHelper.add_element(foundation_wall, 'Area', @area, :float, @area_isdefaulted) unless @area.nil?
2258
+ XMLHelper.add_element(foundation_wall, 'Orientation', @orientation, :string, @orientation_isdefaulted) unless @orientation.nil?
2259
+ XMLHelper.add_element(foundation_wall, 'Azimuth', @azimuth, :integer, @azimuth_isdefaulted) unless @azimuth.nil?
2002
2260
  XMLHelper.add_element(foundation_wall, 'Thickness', @thickness, :float, @thickness_isdefaulted) unless @thickness.nil?
2003
2261
  XMLHelper.add_element(foundation_wall, 'DepthBelowGrade', @depth_below_grade, :float) unless @depth_below_grade.nil?
2262
+ if (not @interior_finish_type.nil?) || (not @interior_finish_thickness.nil?)
2263
+ interior_finish = XMLHelper.add_element(foundation_wall, 'InteriorFinish')
2264
+ XMLHelper.add_element(interior_finish, 'Type', @interior_finish_type, :string, @interior_finish_type_isdefaulted) unless @interior_finish_type.nil?
2265
+ XMLHelper.add_element(interior_finish, 'Thickness', @interior_finish_thickness, :float, @interior_finish_thickness_isdefaulted) unless @interior_finish_thickness.nil?
2266
+ end
2004
2267
  insulation = XMLHelper.add_element(foundation_wall, 'Insulation')
2005
2268
  sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
2006
2269
  if not @insulation_id.nil?
@@ -2013,15 +2276,15 @@ class HPXML < Object
2013
2276
  layer = XMLHelper.add_element(insulation, 'Layer')
2014
2277
  XMLHelper.add_element(layer, 'InstallationType', 'continuous - exterior', :string)
2015
2278
  XMLHelper.add_element(layer, 'NominalRValue', @insulation_exterior_r_value, :float)
2016
- XMLHelper.add_extension(layer, 'DistanceToTopOfInsulation', @insulation_exterior_distance_to_top, :float) unless @insulation_exterior_distance_to_top.nil?
2017
- XMLHelper.add_extension(layer, 'DistanceToBottomOfInsulation', @insulation_exterior_distance_to_bottom, :float) unless @insulation_exterior_distance_to_bottom.nil?
2279
+ XMLHelper.add_element(layer, 'DistanceToTopOfInsulation', @insulation_exterior_distance_to_top, :float, @insulation_exterior_distance_to_top_isdefaulted) unless @insulation_exterior_distance_to_top.nil?
2280
+ XMLHelper.add_element(layer, 'DistanceToBottomOfInsulation', @insulation_exterior_distance_to_bottom, :float, @insulation_exterior_distance_to_bottom_isdefaulted) unless @insulation_exterior_distance_to_bottom.nil?
2018
2281
  end
2019
2282
  if not @insulation_interior_r_value.nil?
2020
2283
  layer = XMLHelper.add_element(insulation, 'Layer')
2021
2284
  XMLHelper.add_element(layer, 'InstallationType', 'continuous - interior', :string)
2022
2285
  XMLHelper.add_element(layer, 'NominalRValue', @insulation_interior_r_value, :float)
2023
- XMLHelper.add_extension(layer, 'DistanceToTopOfInsulation', @insulation_interior_distance_to_top, :float) unless @insulation_interior_distance_to_top.nil?
2024
- XMLHelper.add_extension(layer, 'DistanceToBottomOfInsulation', @insulation_interior_distance_to_bottom, :float) unless @insulation_interior_distance_to_bottom.nil?
2286
+ XMLHelper.add_element(layer, 'DistanceToTopOfInsulation', @insulation_interior_distance_to_top, :float, @insulation_interior_distance_to_top_isdefaulted) unless @insulation_interior_distance_to_top.nil?
2287
+ XMLHelper.add_element(layer, 'DistanceToBottomOfInsulation', @insulation_interior_distance_to_bottom, :float, @insulation_interior_distance_to_bottom_isdefaulted) unless @insulation_interior_distance_to_bottom.nil?
2025
2288
  end
2026
2289
  end
2027
2290
 
@@ -2031,23 +2294,30 @@ class HPXML < Object
2031
2294
  @id = HPXML::get_id(foundation_wall)
2032
2295
  @exterior_adjacent_to = XMLHelper.get_value(foundation_wall, 'ExteriorAdjacentTo', :string)
2033
2296
  @interior_adjacent_to = XMLHelper.get_value(foundation_wall, 'InteriorAdjacentTo', :string)
2297
+ @type = XMLHelper.get_value(foundation_wall, 'Type', :string)
2298
+ @length = XMLHelper.get_value(foundation_wall, 'Length', :float)
2034
2299
  @height = XMLHelper.get_value(foundation_wall, 'Height', :float)
2035
2300
  @area = XMLHelper.get_value(foundation_wall, 'Area', :float)
2036
2301
  @orientation = XMLHelper.get_value(foundation_wall, 'Orientation', :string)
2037
2302
  @azimuth = XMLHelper.get_value(foundation_wall, 'Azimuth', :integer)
2038
2303
  @thickness = XMLHelper.get_value(foundation_wall, 'Thickness', :float)
2039
2304
  @depth_below_grade = XMLHelper.get_value(foundation_wall, 'DepthBelowGrade', :float)
2305
+ interior_finish = XMLHelper.get_element(foundation_wall, 'InteriorFinish')
2306
+ if not interior_finish.nil?
2307
+ @interior_finish_type = XMLHelper.get_value(interior_finish, 'Type', :string)
2308
+ @interior_finish_thickness = XMLHelper.get_value(interior_finish, 'Thickness', :float)
2309
+ end
2040
2310
  insulation = XMLHelper.get_element(foundation_wall, 'Insulation')
2041
2311
  if not insulation.nil?
2042
2312
  @insulation_id = HPXML::get_id(insulation)
2043
2313
  @insulation_assembly_r_value = XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue', :float)
2044
2314
  @insulation_continuous_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue", :float)
2045
2315
  @insulation_interior_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/NominalRValue", :float)
2046
- @insulation_interior_distance_to_top = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToTopOfInsulation", :float)
2047
- @insulation_interior_distance_to_bottom = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToBottomOfInsulation", :float)
2316
+ @insulation_interior_distance_to_top = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/DistanceToTopOfInsulation", :float)
2317
+ @insulation_interior_distance_to_bottom = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/DistanceToBottomOfInsulation", :float)
2048
2318
  @insulation_exterior_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/NominalRValue", :float)
2049
- @insulation_exterior_distance_to_top = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToTopOfInsulation", :float)
2050
- @insulation_exterior_distance_to_bottom = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToBottomOfInsulation", :float)
2319
+ @insulation_exterior_distance_to_top = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/DistanceToTopOfInsulation", :float)
2320
+ @insulation_exterior_distance_to_bottom = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/DistanceToBottomOfInsulation", :float)
2051
2321
  end
2052
2322
  end
2053
2323
  end
@@ -2069,7 +2339,7 @@ class HPXML < Object
2069
2339
  class FrameFloor < BaseElement
2070
2340
  ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :area, :insulation_id,
2071
2341
  :insulation_assembly_r_value, :insulation_cavity_r_value, :insulation_continuous_r_value,
2072
- :other_space_above_or_below]
2342
+ :other_space_above_or_below, :interior_finish_type, :interior_finish_thickness]
2073
2343
  attr_accessor(*ATTRS)
2074
2344
 
2075
2345
  def is_ceiling
@@ -2112,6 +2382,10 @@ class HPXML < Object
2112
2382
  return (is_exterior && is_thermal_boundary)
2113
2383
  end
2114
2384
 
2385
+ def is_conditioned
2386
+ return HPXML::is_conditioned(self)
2387
+ end
2388
+
2115
2389
  def delete
2116
2390
  @hpxml_object.frame_floors.delete(self)
2117
2391
  @hpxml_object.attics.each do |attic|
@@ -2120,6 +2394,9 @@ class HPXML < Object
2120
2394
  @hpxml_object.foundations.each do |foundation|
2121
2395
  foundation.attached_to_frame_floor_idrefs.delete(@id) unless foundation.attached_to_frame_floor_idrefs.nil?
2122
2396
  end
2397
+ @hpxml_object.attics.each do |attic|
2398
+ attic.attached_to_frame_floor_idrefs.delete(@id) unless attic.attached_to_frame_floor_idrefs.nil?
2399
+ end
2123
2400
  end
2124
2401
 
2125
2402
  def check_for_errors
@@ -2137,6 +2414,11 @@ class HPXML < Object
2137
2414
  XMLHelper.add_element(frame_floor, 'ExteriorAdjacentTo', @exterior_adjacent_to, :string) unless @exterior_adjacent_to.nil?
2138
2415
  XMLHelper.add_element(frame_floor, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
2139
2416
  XMLHelper.add_element(frame_floor, 'Area', @area, :float) unless @area.nil?
2417
+ if (not @interior_finish_type.nil?) || (not @interior_finish_thickness.nil?)
2418
+ interior_finish = XMLHelper.add_element(frame_floor, 'InteriorFinish')
2419
+ XMLHelper.add_element(interior_finish, 'Type', @interior_finish_type, :string, @interior_finish_type_isdefaulted) unless @interior_finish_type.nil?
2420
+ XMLHelper.add_element(interior_finish, 'Thickness', @interior_finish_thickness, :float, @interior_finish_thickness_isdefaulted) unless @interior_finish_thickness.nil?
2421
+ end
2140
2422
  insulation = XMLHelper.add_element(frame_floor, 'Insulation')
2141
2423
  sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
2142
2424
  if not @insulation_id.nil?
@@ -2165,6 +2447,11 @@ class HPXML < Object
2165
2447
  @exterior_adjacent_to = XMLHelper.get_value(frame_floor, 'ExteriorAdjacentTo', :string)
2166
2448
  @interior_adjacent_to = XMLHelper.get_value(frame_floor, 'InteriorAdjacentTo', :string)
2167
2449
  @area = XMLHelper.get_value(frame_floor, 'Area', :float)
2450
+ interior_finish = XMLHelper.get_element(frame_floor, 'InteriorFinish')
2451
+ if not interior_finish.nil?
2452
+ @interior_finish_type = XMLHelper.get_value(interior_finish, 'Type', :string)
2453
+ @interior_finish_thickness = XMLHelper.get_value(interior_finish, 'Thickness', :float)
2454
+ end
2168
2455
  insulation = XMLHelper.get_element(frame_floor, 'Insulation')
2169
2456
  if not insulation.nil?
2170
2457
  @insulation_id = HPXML::get_id(insulation)
@@ -2218,6 +2505,10 @@ class HPXML < Object
2218
2505
  return (is_exterior && is_thermal_boundary)
2219
2506
  end
2220
2507
 
2508
+ def is_conditioned
2509
+ return HPXML::is_conditioned(self)
2510
+ end
2511
+
2221
2512
  def delete
2222
2513
  @hpxml_object.slabs.delete(self)
2223
2514
  @hpxml_object.foundations.each do |foundation|
@@ -2241,9 +2532,6 @@ class HPXML < Object
2241
2532
  XMLHelper.add_element(slab, 'Area', @area, :float) unless @area.nil?
2242
2533
  XMLHelper.add_element(slab, 'Thickness', @thickness, :float, @thickness_isdefaulted) unless @thickness.nil?
2243
2534
  XMLHelper.add_element(slab, 'ExposedPerimeter', @exposed_perimeter, :float) unless @exposed_perimeter.nil?
2244
- XMLHelper.add_element(slab, 'PerimeterInsulationDepth', @perimeter_insulation_depth, :float) unless @perimeter_insulation_depth.nil?
2245
- XMLHelper.add_element(slab, 'UnderSlabInsulationWidth', @under_slab_insulation_width, :float) unless @under_slab_insulation_width.nil?
2246
- XMLHelper.add_element(slab, 'UnderSlabInsulationSpansEntireSlab', @under_slab_insulation_spans_entire_slab, :boolean) unless @under_slab_insulation_spans_entire_slab.nil?
2247
2535
  XMLHelper.add_element(slab, 'DepthBelowGrade', @depth_below_grade, :float) unless @depth_below_grade.nil?
2248
2536
  insulation = XMLHelper.add_element(slab, 'PerimeterInsulation')
2249
2537
  sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
@@ -2254,6 +2542,7 @@ class HPXML < Object
2254
2542
  end
2255
2543
  layer = XMLHelper.add_element(insulation, 'Layer')
2256
2544
  XMLHelper.add_element(layer, 'NominalRValue', @perimeter_insulation_r_value, :float) unless @perimeter_insulation_r_value.nil?
2545
+ XMLHelper.add_element(layer, 'InsulationDepth', @perimeter_insulation_depth, :float) unless @perimeter_insulation_depth.nil?
2257
2546
  insulation = XMLHelper.add_element(slab, 'UnderSlabInsulation')
2258
2547
  sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
2259
2548
  if not @under_slab_insulation_id.nil?
@@ -2263,6 +2552,8 @@ class HPXML < Object
2263
2552
  end
2264
2553
  layer = XMLHelper.add_element(insulation, 'Layer')
2265
2554
  XMLHelper.add_element(layer, 'NominalRValue', @under_slab_insulation_r_value, :float) unless @under_slab_insulation_r_value.nil?
2555
+ XMLHelper.add_element(layer, 'InsulationWidth', @under_slab_insulation_width, :float) unless @under_slab_insulation_width.nil?
2556
+ XMLHelper.add_element(layer, 'InsulationSpansEntireSlab', @under_slab_insulation_spans_entire_slab, :boolean) unless @under_slab_insulation_spans_entire_slab.nil?
2266
2557
  XMLHelper.add_extension(slab, 'CarpetFraction', @carpet_fraction, :float, @carpet_fraction_isdefaulted) unless @carpet_fraction.nil?
2267
2558
  XMLHelper.add_extension(slab, 'CarpetRValue', @carpet_r_value, :float, @carpet_r_value_isdefaulted) unless @carpet_r_value.nil?
2268
2559
  end
@@ -2275,19 +2566,19 @@ class HPXML < Object
2275
2566
  @area = XMLHelper.get_value(slab, 'Area', :float)
2276
2567
  @thickness = XMLHelper.get_value(slab, 'Thickness', :float)
2277
2568
  @exposed_perimeter = XMLHelper.get_value(slab, 'ExposedPerimeter', :float)
2278
- @perimeter_insulation_depth = XMLHelper.get_value(slab, 'PerimeterInsulationDepth', :float)
2279
- @under_slab_insulation_width = XMLHelper.get_value(slab, 'UnderSlabInsulationWidth', :float)
2280
- @under_slab_insulation_spans_entire_slab = XMLHelper.get_value(slab, 'UnderSlabInsulationSpansEntireSlab', :boolean)
2281
2569
  @depth_below_grade = XMLHelper.get_value(slab, 'DepthBelowGrade', :float)
2282
2570
  perimeter_insulation = XMLHelper.get_element(slab, 'PerimeterInsulation')
2283
2571
  if not perimeter_insulation.nil?
2284
2572
  @perimeter_insulation_id = HPXML::get_id(perimeter_insulation)
2285
2573
  @perimeter_insulation_r_value = XMLHelper.get_value(perimeter_insulation, 'Layer/NominalRValue', :float)
2574
+ @perimeter_insulation_depth = XMLHelper.get_value(perimeter_insulation, 'Layer/InsulationDepth', :float)
2286
2575
  end
2287
2576
  under_slab_insulation = XMLHelper.get_element(slab, 'UnderSlabInsulation')
2288
2577
  if not under_slab_insulation.nil?
2289
2578
  @under_slab_insulation_id = HPXML::get_id(under_slab_insulation)
2290
2579
  @under_slab_insulation_r_value = XMLHelper.get_value(under_slab_insulation, 'Layer/NominalRValue', :float)
2580
+ @under_slab_insulation_width = XMLHelper.get_value(under_slab_insulation, 'Layer/InsulationWidth', :float)
2581
+ @under_slab_insulation_spans_entire_slab = XMLHelper.get_value(under_slab_insulation, 'Layer/InsulationSpansEntireSlab', :boolean)
2291
2582
  end
2292
2583
  @carpet_fraction = XMLHelper.get_value(slab, 'extension/CarpetFraction', :float)
2293
2584
  @carpet_r_value = XMLHelper.get_value(slab, 'extension/CarpetRValue', :float)
@@ -2309,7 +2600,7 @@ class HPXML < Object
2309
2600
  end
2310
2601
 
2311
2602
  class Window < BaseElement
2312
- ATTRS = [:id, :area, :azimuth, :orientation, :frame_type, :aluminum_thermal_break, :glass_layers,
2603
+ ATTRS = [:id, :area, :azimuth, :orientation, :frame_type, :thermal_break, :glass_layers,
2313
2604
  :glass_type, :gas_fill, :ufactor, :shgc, :interior_shading_factor_summer,
2314
2605
  :interior_shading_factor_winter, :interior_shading_type, :exterior_shading_factor_summer,
2315
2606
  :exterior_shading_factor_winter, :exterior_shading_type, :overhangs_depth,
@@ -2344,6 +2635,10 @@ class HPXML < Object
2344
2635
  return (is_exterior && is_thermal_boundary)
2345
2636
  end
2346
2637
 
2638
+ def is_conditioned
2639
+ return HPXML::is_conditioned(self)
2640
+ end
2641
+
2347
2642
  def delete
2348
2643
  @hpxml_object.windows.delete(self)
2349
2644
  end
@@ -2362,20 +2657,20 @@ class HPXML < Object
2362
2657
  sys_id = XMLHelper.add_element(window, 'SystemIdentifier')
2363
2658
  XMLHelper.add_attribute(sys_id, 'id', @id)
2364
2659
  XMLHelper.add_element(window, 'Area', @area, :float) unless @area.nil?
2365
- XMLHelper.add_element(window, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
2366
- XMLHelper.add_element(window, 'Orientation', @orientation, :string) unless @orientation.nil?
2660
+ XMLHelper.add_element(window, 'Azimuth', @azimuth, :integer, @azimuth_isdefaulted) unless @azimuth.nil?
2661
+ XMLHelper.add_element(window, 'Orientation', @orientation, :string, @orientation_isdefaulted) unless @orientation.nil?
2367
2662
  if not @frame_type.nil?
2368
2663
  frame_type_el = XMLHelper.add_element(window, 'FrameType')
2369
2664
  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?
2665
+ if [HPXML::WindowFrameTypeAluminum, HPXML::WindowFrameTypeMetal].include? @frame_type
2666
+ XMLHelper.add_element(frame_type, 'ThermalBreak', @thermal_break, :boolean, @thermal_break_isdefaulted) unless @thermal_break.nil?
2372
2667
  end
2373
2668
  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?
2377
- XMLHelper.add_element(window, 'UFactor', @ufactor, :float) unless @ufactor.nil?
2378
- XMLHelper.add_element(window, 'SHGC', @shgc, :float) unless @shgc.nil?
2669
+ XMLHelper.add_element(window, 'GlassLayers', @glass_layers, :string, @glass_layers_isdefaulted) unless @glass_layers.nil?
2670
+ XMLHelper.add_element(window, 'GlassType', @glass_type, :string, @glass_type_isdefaulted) unless @glass_type.nil?
2671
+ XMLHelper.add_element(window, 'GasFill', @gas_fill, :string, @gas_fill_isdefaulted) unless @gas_fill.nil?
2672
+ XMLHelper.add_element(window, 'UFactor', @ufactor, :float, @ufactor_isdefaulted) unless @ufactor.nil?
2673
+ XMLHelper.add_element(window, 'SHGC', @shgc, :float, @shgc_isdefaulted) unless @shgc.nil?
2379
2674
  if (not @exterior_shading_type.nil?) || (not @exterior_shading_factor_summer.nil?) || (not @exterior_shading_factor_winter.nil?)
2380
2675
  exterior_shading = XMLHelper.add_element(window, 'ExteriorShading')
2381
2676
  sys_id = XMLHelper.add_element(exterior_shading, 'SystemIdentifier')
@@ -2414,8 +2709,10 @@ class HPXML < Object
2414
2709
  @azimuth = XMLHelper.get_value(window, 'Azimuth', :integer)
2415
2710
  @orientation = XMLHelper.get_value(window, 'Orientation', :string)
2416
2711
  @frame_type = XMLHelper.get_child_name(window, 'FrameType')
2417
- if not @frame_type.nil?
2418
- @aluminum_thermal_break = XMLHelper.get_value(window, 'FrameType/Aluminum/ThermalBreak', :boolean)
2712
+ if @frame_type == HPXML::WindowFrameTypeAluminum
2713
+ @thermal_break = XMLHelper.get_value(window, 'FrameType/Aluminum/ThermalBreak', :boolean)
2714
+ elsif @frame_type == HPXML::WindowFrameTypeMetal
2715
+ @thermal_break = XMLHelper.get_value(window, 'FrameType/Metal/ThermalBreak', :boolean)
2419
2716
  end
2420
2717
  @glass_layers = XMLHelper.get_value(window, 'GlassLayers', :string)
2421
2718
  @glass_type = XMLHelper.get_value(window, 'GlassType', :string)
@@ -2452,7 +2749,7 @@ class HPXML < Object
2452
2749
  end
2453
2750
 
2454
2751
  class Skylight < BaseElement
2455
- ATTRS = [:id, :area, :azimuth, :orientation, :frame_type, :aluminum_thermal_break, :glass_layers,
2752
+ ATTRS = [:id, :area, :azimuth, :orientation, :frame_type, :thermal_break, :glass_layers,
2456
2753
  :glass_type, :gas_fill, :ufactor, :shgc, :interior_shading_factor_summer,
2457
2754
  :interior_shading_factor_winter, :interior_shading_type, :exterior_shading_factor_summer,
2458
2755
  :exterior_shading_factor_winter, :exterior_shading_type, :roof_idref]
@@ -2485,6 +2782,10 @@ class HPXML < Object
2485
2782
  return (is_exterior && is_thermal_boundary)
2486
2783
  end
2487
2784
 
2785
+ def is_conditioned
2786
+ return HPXML::is_conditioned(self)
2787
+ end
2788
+
2488
2789
  def delete
2489
2790
  @hpxml_object.skylights.delete(self)
2490
2791
  end
@@ -2503,20 +2804,20 @@ class HPXML < Object
2503
2804
  sys_id = XMLHelper.add_element(skylight, 'SystemIdentifier')
2504
2805
  XMLHelper.add_attribute(sys_id, 'id', @id)
2505
2806
  XMLHelper.add_element(skylight, 'Area', @area, :float) unless @area.nil?
2506
- XMLHelper.add_element(skylight, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
2507
- XMLHelper.add_element(skylight, 'Orientation', @orientation, :string) unless @orientation.nil?
2807
+ XMLHelper.add_element(skylight, 'Azimuth', @azimuth, :integer, @azimuth_isdefaulted) unless @azimuth.nil?
2808
+ XMLHelper.add_element(skylight, 'Orientation', @orientation, :string, @orientation_isdefaulted) unless @orientation.nil?
2508
2809
  if not @frame_type.nil?
2509
2810
  frame_type_el = XMLHelper.add_element(skylight, 'FrameType')
2510
2811
  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?
2812
+ if [HPXML::WindowFrameTypeAluminum, HPXML::WindowFrameTypeMetal].include? @frame_type
2813
+ XMLHelper.add_element(frame_type, 'ThermalBreak', @thermal_break, :boolean, @thermal_break_isdefaulted) unless @thermal_break.nil?
2513
2814
  end
2514
2815
  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?
2518
- XMLHelper.add_element(skylight, 'UFactor', @ufactor, :float) unless @ufactor.nil?
2519
- XMLHelper.add_element(skylight, 'SHGC', @shgc, :float) unless @shgc.nil?
2816
+ XMLHelper.add_element(skylight, 'GlassLayers', @glass_layers, :string, @glass_layers_isdefaulted) unless @glass_layers.nil?
2817
+ XMLHelper.add_element(skylight, 'GlassType', @glass_type, :string, @glass_type_isdefaulted) unless @glass_type.nil?
2818
+ XMLHelper.add_element(skylight, 'GasFill', @gas_fill, :string, @gas_fill_isdefaulted) unless @gas_fill.nil?
2819
+ XMLHelper.add_element(skylight, 'UFactor', @ufactor, :float, @ufactor_isdefaulted) unless @ufactor.nil?
2820
+ XMLHelper.add_element(skylight, 'SHGC', @shgc, :float, @shgc_isdefaulted) unless @shgc.nil?
2520
2821
  if (not @exterior_shading_type.nil?) || (not @exterior_shading_factor_summer.nil?) || (not @exterior_shading_factor_winter.nil?)
2521
2822
  exterior_shading = XMLHelper.add_element(skylight, 'ExteriorShading')
2522
2823
  sys_id = XMLHelper.add_element(exterior_shading, 'SystemIdentifier')
@@ -2547,7 +2848,11 @@ class HPXML < Object
2547
2848
  @azimuth = XMLHelper.get_value(skylight, 'Azimuth', :integer)
2548
2849
  @orientation = XMLHelper.get_value(skylight, 'Orientation', :string)
2549
2850
  @frame_type = XMLHelper.get_child_name(skylight, 'FrameType')
2550
- @aluminum_thermal_break = XMLHelper.get_value(skylight, 'FrameType/Aluminum/ThermalBreak', :boolean)
2851
+ if @frame_type == HPXML::WindowFrameTypeAluminum
2852
+ @thermal_break = XMLHelper.get_value(skylight, 'FrameType/Aluminum/ThermalBreak', :boolean)
2853
+ elsif @frame_type == HPXML::WindowFrameTypeMetal
2854
+ @thermal_break = XMLHelper.get_value(skylight, 'FrameType/Metal/ThermalBreak', :boolean)
2855
+ end
2551
2856
  @glass_layers = XMLHelper.get_value(skylight, 'GlassLayers', :string)
2552
2857
  @glass_type = XMLHelper.get_value(skylight, 'GlassType', :string)
2553
2858
  @gas_fill = XMLHelper.get_value(skylight, 'GasFill', :string)
@@ -2608,6 +2913,10 @@ class HPXML < Object
2608
2913
  return (is_exterior && is_thermal_boundary)
2609
2914
  end
2610
2915
 
2916
+ def is_conditioned
2917
+ return HPXML::is_conditioned(self)
2918
+ end
2919
+
2611
2920
  def delete
2612
2921
  @hpxml_object.doors.delete(self)
2613
2922
  end
@@ -2630,8 +2939,8 @@ class HPXML < Object
2630
2939
  XMLHelper.add_attribute(attached_to_wall, 'idref', @wall_idref)
2631
2940
  end
2632
2941
  XMLHelper.add_element(door, 'Area', @area, :float) unless @area.nil?
2633
- XMLHelper.add_element(door, 'Azimuth', @azimuth, :integer) unless @azimuth.nil?
2634
- XMLHelper.add_element(door, 'Orientation', @orientation, :string) unless @orientation.nil?
2942
+ XMLHelper.add_element(door, 'Azimuth', @azimuth, :integer, @azimuth_isdefaulted) unless @azimuth.nil?
2943
+ XMLHelper.add_element(door, 'Orientation', @orientation, :string, @orientation_isdefaulted) unless @orientation.nil?
2635
2944
  XMLHelper.add_element(door, 'RValue', @r_value, :float) unless @r_value.nil?
2636
2945
  end
2637
2946
 
@@ -2647,6 +2956,70 @@ class HPXML < Object
2647
2956
  end
2648
2957
  end
2649
2958
 
2959
+ class PartitionWallMass < BaseElement
2960
+ ATTRS = [:area_fraction, :interior_finish_type, :interior_finish_thickness]
2961
+ attr_accessor(*ATTRS)
2962
+
2963
+ def check_for_errors
2964
+ errors = []
2965
+ return errors
2966
+ end
2967
+
2968
+ def to_oga(doc)
2969
+ return if nil?
2970
+
2971
+ partition_wall_mass = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Enclosure', 'extension', 'PartitionWallMass'])
2972
+ XMLHelper.add_element(partition_wall_mass, 'AreaFraction', @area_fraction, :float, @area_fraction_isdefaulted) unless @area_fraction.nil?
2973
+ if (not @interior_finish_type.nil?) || (not @interior_finish_thickness.nil?)
2974
+ interior_finish = XMLHelper.add_element(partition_wall_mass, 'InteriorFinish')
2975
+ XMLHelper.add_element(interior_finish, 'Type', @interior_finish_type, :string, @interior_finish_type_isdefaulted) unless @interior_finish_type.nil?
2976
+ XMLHelper.add_element(interior_finish, 'Thickness', @interior_finish_thickness, :float, @interior_finish_thickness_isdefaulted) unless @interior_finish_thickness.nil?
2977
+ end
2978
+ end
2979
+
2980
+ def from_oga(hpxml)
2981
+ return if hpxml.nil?
2982
+
2983
+ partition_wall_mass = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Enclosure/extension/PartitionWallMass')
2984
+ return if partition_wall_mass.nil?
2985
+
2986
+ @area_fraction = XMLHelper.get_value(partition_wall_mass, 'AreaFraction', :float)
2987
+ interior_finish = XMLHelper.get_element(partition_wall_mass, 'InteriorFinish')
2988
+ if not interior_finish.nil?
2989
+ @interior_finish_type = XMLHelper.get_value(interior_finish, 'Type', :string)
2990
+ @interior_finish_thickness = XMLHelper.get_value(interior_finish, 'Thickness', :float)
2991
+ end
2992
+ end
2993
+ end
2994
+
2995
+ class FurnitureMass < BaseElement
2996
+ ATTRS = [:area_fraction, :type]
2997
+ attr_accessor(*ATTRS)
2998
+
2999
+ def check_for_errors
3000
+ errors = []
3001
+ return errors
3002
+ end
3003
+
3004
+ def to_oga(doc)
3005
+ return if nil?
3006
+
3007
+ furniture_mass = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Enclosure', 'extension', 'FurnitureMass'])
3008
+ XMLHelper.add_element(furniture_mass, 'AreaFraction', @area_fraction, :float, @area_fraction_isdefaulted) unless @area_fraction.nil?
3009
+ XMLHelper.add_element(furniture_mass, 'Type', @type, :string, @type_isdefaulted) unless @type.nil?
3010
+ end
3011
+
3012
+ def from_oga(hpxml)
3013
+ return if hpxml.nil?
3014
+
3015
+ furniture_mass = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Enclosure/extension/FurnitureMass')
3016
+ return if furniture_mass.nil?
3017
+
3018
+ @area_fraction = XMLHelper.get_value(furniture_mass, 'AreaFraction', :float)
3019
+ @type = XMLHelper.get_value(furniture_mass, 'Type', :string)
3020
+ end
3021
+ end
3022
+
2650
3023
  class HeatingSystems < BaseArrayElement
2651
3024
  def add(**kwargs)
2652
3025
  self << HeatingSystem.new(@hpxml_object, **kwargs)
@@ -2671,8 +3044,7 @@ class HPXML < Object
2671
3044
  :heating_efficiency_percent, :fraction_heat_load_served, :electric_auxiliary_energy,
2672
3045
  :third_party_certification, :seed_id, :is_shared_system, :number_of_units_served,
2673
3046
  :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]
3047
+ :airflow_defect_ratio, :fan_watts, :heating_airflow_cfm, :location, :primary_system]
2676
3048
  attr_accessor(*ATTRS)
2677
3049
 
2678
3050
  def distribution_system
@@ -2689,14 +3061,35 @@ class HPXML < Object
2689
3061
  def attached_cooling_system
2690
3062
  return if distribution_system.nil?
2691
3063
 
3064
+ # by distribution system
2692
3065
  distribution_system.hvac_systems.each do |hvac_system|
2693
3066
  next if hvac_system.id == @id
2694
3067
 
2695
3068
  return hvac_system
2696
3069
  end
3070
+
3071
+ return
3072
+ end
3073
+
3074
+ def related_water_heating_system
3075
+ @hpxml_object.water_heating_systems.each do |water_heating_system|
3076
+ next unless water_heating_system.related_hvac_idref == @id
3077
+
3078
+ return water_heating_system
3079
+ end
2697
3080
  return
2698
3081
  end
2699
3082
 
3083
+ def is_heat_pump_backup_system
3084
+ @hpxml_object.heat_pumps.each do |heat_pump|
3085
+ next if heat_pump.backup_system_idref.nil?
3086
+ next if heat_pump.backup_system_idref != @id
3087
+
3088
+ return true
3089
+ end
3090
+ return false
3091
+ end
3092
+
2700
3093
  def delete
2701
3094
  @hpxml_object.heating_systems.delete(self)
2702
3095
  @hpxml_object.water_heating_systems.each do |water_heating_system|
@@ -2716,6 +3109,7 @@ class HPXML < Object
2716
3109
  return if nil?
2717
3110
 
2718
3111
  hvac_plant = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'HVAC', 'HVACPlant'])
3112
+ primary_systems = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'HVAC', 'HVACPlant', 'PrimarySystems']) unless @hpxml_object.primary_hvac_systems.empty?
2719
3113
  heating_system = XMLHelper.add_element(hvac_plant, 'HeatingSystem')
2720
3114
  sys_id = XMLHelper.add_element(heating_system, 'SystemIdentifier')
2721
3115
  XMLHelper.add_attribute(sys_id, 'id', @id)
@@ -2734,20 +3128,15 @@ class HPXML < Object
2734
3128
  end
2735
3129
  XMLHelper.add_element(heating_system, 'HeatingSystemFuel', @heating_system_fuel, :string) unless @heating_system_fuel.nil?
2736
3130
  XMLHelper.add_element(heating_system, 'HeatingCapacity', @heating_capacity, :float, @heating_capacity_isdefaulted) unless @heating_capacity.nil?
2737
-
2738
- efficiency_units = nil
2739
- efficiency_value = nil
2740
- if [HVACTypeFurnace, HVACTypeWallFurnace, HVACTypeFloorFurnace, HVACTypeBoiler].include? @heating_system_type
2741
- efficiency_units = UnitsAFUE
2742
- efficiency_value = @heating_efficiency_afue
2743
- elsif [HVACTypeElectricResistance, HVACTypeStove, HVACTypePortableHeater, HVACTypeFixedHeater, HVACTypeFireplace].include? @heating_system_type
2744
- efficiency_units = UnitsPercent
2745
- efficiency_value = @heating_efficiency_percent
3131
+ if not @heating_efficiency_afue.nil?
3132
+ annual_efficiency = XMLHelper.add_element(heating_system, 'AnnualHeatingEfficiency')
3133
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsAFUE, :string)
3134
+ XMLHelper.add_element(annual_efficiency, 'Value', @heating_efficiency_afue, :float, @heating_efficiency_afue_isdefaulted)
2746
3135
  end
2747
- if not efficiency_value.nil?
3136
+ if not @heating_efficiency_percent.nil?
2748
3137
  annual_efficiency = XMLHelper.add_element(heating_system, 'AnnualHeatingEfficiency')
2749
- XMLHelper.add_element(annual_efficiency, 'Units', efficiency_units, :string)
2750
- XMLHelper.add_element(annual_efficiency, 'Value', efficiency_value, :float)
3138
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsPercent, :string)
3139
+ XMLHelper.add_element(annual_efficiency, 'Value', @heating_efficiency_percent, :float, @heating_efficiency_percent_isdefaulted)
2751
3140
  end
2752
3141
  XMLHelper.add_element(heating_system, 'FractionHeatLoadServed', @fraction_heat_load_served, :float, @fraction_heat_load_served_isdefaulted) unless @fraction_heat_load_served.nil?
2753
3142
  XMLHelper.add_element(heating_system, 'ElectricAuxiliaryEnergy', @electric_auxiliary_energy, :float, @electric_auxiliary_energy_isdefaulted) unless @electric_auxiliary_energy.nil?
@@ -2756,11 +3145,13 @@ class HPXML < Object
2756
3145
  XMLHelper.add_extension(heating_system, 'FanCoilWatts', @fan_coil_watts, :float) unless @fan_coil_watts.nil?
2757
3146
  XMLHelper.add_extension(heating_system, 'FanPowerWattsPerCFM', @fan_watts_per_cfm, :float, @fan_watts_per_cfm_isdefaulted) unless @fan_watts_per_cfm.nil?
2758
3147
  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
3148
  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
3149
  XMLHelper.add_extension(heating_system, 'HeatingAirflowCFM', @heating_airflow_cfm, :float, @heating_airflow_cfm_isdefaulted) unless @heating_airflow_cfm.nil?
2763
3150
  XMLHelper.add_extension(heating_system, 'SeedId', @seed_id, :string) unless @seed_id.nil?
3151
+ if @primary_system
3152
+ primary_heating_system = XMLHelper.insert_element(primary_systems, 'PrimaryHeatingSystem')
3153
+ XMLHelper.add_attribute(primary_heating_system, 'idref', @id)
3154
+ end
2764
3155
  end
2765
3156
 
2766
3157
  def from_oga(heating_system)
@@ -2776,11 +3167,8 @@ class HPXML < Object
2776
3167
  @heating_system_type = XMLHelper.get_child_name(heating_system, 'HeatingSystemType')
2777
3168
  @heating_system_fuel = XMLHelper.get_value(heating_system, 'HeatingSystemFuel', :string)
2778
3169
  @heating_capacity = XMLHelper.get_value(heating_system, 'HeatingCapacity', :float)
2779
- if [HVACTypeFurnace, HVACTypeWallFurnace, HVACTypeFloorFurnace, HVACTypeBoiler].include? @heating_system_type
2780
- @heating_efficiency_afue = XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='#{UnitsAFUE}']/Value", :float)
2781
- elsif [HVACTypeElectricResistance, HVACTypeStove, HVACTypePortableHeater, HVACTypeFixedHeater, HVACTypeFireplace].include? @heating_system_type
2782
- @heating_efficiency_percent = XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='Percent']/Value", :float)
2783
- end
3170
+ @heating_efficiency_afue = XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='#{UnitsAFUE}']/Value", :float)
3171
+ @heating_efficiency_percent = XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='Percent']/Value", :float)
2784
3172
  @fraction_heat_load_served = XMLHelper.get_value(heating_system, 'FractionHeatLoadServed', :float)
2785
3173
  @electric_auxiliary_energy = XMLHelper.get_value(heating_system, 'ElectricAuxiliaryEnergy', :float)
2786
3174
  @shared_loop_watts = XMLHelper.get_value(heating_system, 'extension/SharedLoopWatts', :float)
@@ -2788,11 +3176,15 @@ class HPXML < Object
2788
3176
  @fan_coil_watts = XMLHelper.get_value(heating_system, 'extension/FanCoilWatts', :float)
2789
3177
  @fan_watts_per_cfm = XMLHelper.get_value(heating_system, 'extension/FanPowerWattsPerCFM', :float)
2790
3178
  @fan_watts = XMLHelper.get_value(heating_system, 'extension/FanPowerWatts', :float)
2791
- @fan_power_not_tested = XMLHelper.get_value(heating_system, 'extension/FanPowerNotTested', :boolean)
2792
3179
  @airflow_defect_ratio = XMLHelper.get_value(heating_system, 'extension/AirflowDefectRatio', :float)
2793
- @airflow_not_tested = XMLHelper.get_value(heating_system, 'extension/AirflowNotTested', :boolean)
2794
3180
  @heating_airflow_cfm = XMLHelper.get_value(heating_system, 'extension/HeatingAirflowCFM', :float)
2795
3181
  @seed_id = XMLHelper.get_value(heating_system, 'extension/SeedId', :string)
3182
+ primary_heating_system = HPXML::get_idref(XMLHelper.get_element(heating_system, '../PrimarySystems/PrimaryHeatingSystem'))
3183
+ if primary_heating_system == @id
3184
+ @primary_system = true
3185
+ else
3186
+ @primary_system = false
3187
+ end
2796
3188
  end
2797
3189
  end
2798
3190
 
@@ -2817,11 +3209,10 @@ class HPXML < Object
2817
3209
  class CoolingSystem < BaseElement
2818
3210
  ATTRS = [:id, :distribution_system_idref, :year_installed, :cooling_system_type,
2819
3211
  :cooling_system_fuel, :cooling_capacity, :compressor_type, :fraction_cool_load_served,
2820
- :cooling_efficiency_seer, :cooling_efficiency_eer, :cooling_efficiency_kw_per_ton,
3212
+ :cooling_efficiency_seer, :cooling_efficiency_eer, :cooling_efficiency_ceer, :cooling_efficiency_kw_per_ton,
2821
3213
  :cooling_shr, :third_party_certification, :seed_id, :is_shared_system, :number_of_units_served,
2822
3214
  :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]
3215
+ :fan_watts_per_cfm, :charge_defect_ratio, :cooling_airflow_cfm, :location, :primary_system]
2825
3216
  attr_accessor(*ATTRS)
2826
3217
 
2827
3218
  def distribution_system
@@ -2836,6 +3227,7 @@ class HPXML < Object
2836
3227
  end
2837
3228
 
2838
3229
  def attached_heating_system
3230
+ # by distribution system
2839
3231
  return if distribution_system.nil?
2840
3232
 
2841
3233
  distribution_system.hvac_systems.each do |hvac_system|
@@ -2865,6 +3257,7 @@ class HPXML < Object
2865
3257
  return if nil?
2866
3258
 
2867
3259
  hvac_plant = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'HVAC', 'HVACPlant'])
3260
+ primary_systems = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'HVAC', 'HVACPlant', 'PrimarySystems']) unless @hpxml_object.primary_hvac_systems.empty?
2868
3261
  cooling_system = XMLHelper.add_element(hvac_plant, 'CoolingSystem')
2869
3262
  sys_id = XMLHelper.add_element(cooling_system, 'SystemIdentifier')
2870
3263
  XMLHelper.add_attribute(sys_id, 'id', @id)
@@ -2882,36 +3275,39 @@ class HPXML < Object
2882
3275
  XMLHelper.add_element(cooling_system, 'CoolingCapacity', @cooling_capacity, :float, @cooling_capacity_isdefaulted) unless @cooling_capacity.nil?
2883
3276
  XMLHelper.add_element(cooling_system, 'CompressorType', @compressor_type, :string, @compressor_type_isdefaulted) unless @compressor_type.nil?
2884
3277
  XMLHelper.add_element(cooling_system, 'FractionCoolLoadServed', @fraction_cool_load_served, :float, @fraction_cool_load_served_isdefaulted) unless @fraction_cool_load_served.nil?
2885
-
2886
- efficiency_units = nil
2887
- efficiency_value = nil
2888
- if [HVACTypeCentralAirConditioner, HVACTypeMiniSplitAirConditioner].include? @cooling_system_type
2889
- efficiency_units = UnitsSEER
2890
- efficiency_value = @cooling_efficiency_seer
2891
- elsif [HVACTypeRoomAirConditioner].include? @cooling_system_type
2892
- efficiency_units = UnitsEER
2893
- efficiency_value = @cooling_efficiency_eer
2894
- elsif [HVACTypeChiller].include? @cooling_system_type
2895
- efficiency_units = UnitsKwPerTon
2896
- efficiency_value = @cooling_efficiency_kw_per_ton
2897
- end
2898
- if not efficiency_value.nil?
3278
+ if not @cooling_efficiency_seer.nil?
2899
3279
  annual_efficiency = XMLHelper.add_element(cooling_system, 'AnnualCoolingEfficiency')
2900
- XMLHelper.add_element(annual_efficiency, 'Units', efficiency_units, :string)
2901
- XMLHelper.add_element(annual_efficiency, 'Value', efficiency_value, :float)
3280
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsSEER, :string)
3281
+ XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_seer, :float, @cooling_efficiency_seer_isdefaulted)
3282
+ end
3283
+ if not @cooling_efficiency_eer.nil?
3284
+ annual_efficiency = XMLHelper.add_element(cooling_system, 'AnnualCoolingEfficiency')
3285
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsEER, :string)
3286
+ XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_eer, :float, @cooling_efficiency_eer_isdefaulted)
3287
+ end
3288
+ if not @cooling_efficiency_ceer.nil?
3289
+ annual_efficiency = XMLHelper.add_element(cooling_system, 'AnnualCoolingEfficiency')
3290
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsCEER, :string)
3291
+ XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_ceer, :float, @cooling_efficiency_ceer_isdefaulted)
3292
+ end
3293
+ if not @cooling_efficiency_kw_per_ton.nil?
3294
+ annual_efficiency = XMLHelper.add_element(cooling_system, 'AnnualCoolingEfficiency')
3295
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsKwPerTon, :string)
3296
+ XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_kw_per_ton, :float, @cooling_efficiency_kw_per_ton_isdefaulted)
2902
3297
  end
2903
3298
  XMLHelper.add_element(cooling_system, 'SensibleHeatFraction', @cooling_shr, :float, @cooling_shr_isdefaulted) unless @cooling_shr.nil?
2904
3299
  XMLHelper.add_extension(cooling_system, 'AirflowDefectRatio', @airflow_defect_ratio, :float, @airflow_defect_ratio_isdefaulted) unless @airflow_defect_ratio.nil?
2905
3300
  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?
2907
3301
  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
3302
  XMLHelper.add_extension(cooling_system, 'CoolingAirflowCFM', @cooling_airflow_cfm, :float, @cooling_airflow_cfm_isdefaulted) unless @cooling_airflow_cfm.nil?
2911
3303
  XMLHelper.add_extension(cooling_system, 'SharedLoopWatts', @shared_loop_watts, :float) unless @shared_loop_watts.nil?
2912
3304
  XMLHelper.add_extension(cooling_system, 'SharedLoopMotorEfficiency', @shared_loop_motor_efficiency, :float) unless @shared_loop_motor_efficiency.nil?
2913
3305
  XMLHelper.add_extension(cooling_system, 'FanCoilWatts', @fan_coil_watts, :float) unless @fan_coil_watts.nil?
2914
3306
  XMLHelper.add_extension(cooling_system, 'SeedId', @seed_id, :string) unless @seed_id.nil?
3307
+ if @primary_system
3308
+ primary_cooling_system = XMLHelper.add_element(primary_systems, 'PrimaryCoolingSystem')
3309
+ XMLHelper.add_attribute(primary_cooling_system, 'idref', @id)
3310
+ end
2915
3311
  end
2916
3312
 
2917
3313
  def from_oga(cooling_system)
@@ -2929,25 +3325,25 @@ class HPXML < Object
2929
3325
  @cooling_capacity = XMLHelper.get_value(cooling_system, 'CoolingCapacity', :float)
2930
3326
  @compressor_type = XMLHelper.get_value(cooling_system, 'CompressorType', :string)
2931
3327
  @fraction_cool_load_served = XMLHelper.get_value(cooling_system, 'FractionCoolLoadServed', :float)
2932
- if [HVACTypeCentralAirConditioner, HVACTypeMiniSplitAirConditioner].include? @cooling_system_type
2933
- @cooling_efficiency_seer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsSEER}']/Value", :float)
2934
- elsif [HVACTypeRoomAirConditioner].include? @cooling_system_type
2935
- @cooling_efficiency_eer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsEER}']/Value", :float)
2936
- elsif [HVACTypeChiller].include? @cooling_system_type
2937
- @cooling_efficiency_kw_per_ton = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsKwPerTon}']/Value", :float)
2938
- end
3328
+ @cooling_efficiency_seer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsSEER}']/Value", :float)
3329
+ @cooling_efficiency_eer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsEER}']/Value", :float)
3330
+ @cooling_efficiency_ceer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsCEER}']/Value", :float)
3331
+ @cooling_efficiency_kw_per_ton = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsKwPerTon}']/Value", :float)
2939
3332
  @cooling_shr = XMLHelper.get_value(cooling_system, 'SensibleHeatFraction', :float)
2940
3333
  @airflow_defect_ratio = XMLHelper.get_value(cooling_system, 'extension/AirflowDefectRatio', :float)
2941
3334
  @charge_defect_ratio = XMLHelper.get_value(cooling_system, 'extension/ChargeDefectRatio', :float)
2942
- @charge_not_tested = XMLHelper.get_value(cooling_system, 'extension/ChargeNotTested', :boolean)
2943
3335
  @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
3336
  @cooling_airflow_cfm = XMLHelper.get_value(cooling_system, 'extension/CoolingAirflowCFM', :float)
2947
3337
  @shared_loop_watts = XMLHelper.get_value(cooling_system, 'extension/SharedLoopWatts', :float)
2948
3338
  @shared_loop_motor_efficiency = XMLHelper.get_value(cooling_system, 'extension/SharedLoopMotorEfficiency', :float)
2949
3339
  @fan_coil_watts = XMLHelper.get_value(cooling_system, 'extension/FanCoilWatts', :float)
2950
3340
  @seed_id = XMLHelper.get_value(cooling_system, 'extension/SeedId', :string)
3341
+ primary_cooling_system = HPXML::get_idref(XMLHelper.get_element(cooling_system, '../PrimarySystems/PrimaryCoolingSystem'))
3342
+ if primary_cooling_system == @id
3343
+ @primary_system = true
3344
+ else
3345
+ @primary_system = false
3346
+ end
2951
3347
  end
2952
3348
  end
2953
3349
 
@@ -2976,15 +3372,14 @@ class HPXML < Object
2976
3372
  class HeatPump < BaseElement
2977
3373
  ATTRS = [:id, :distribution_system_idref, :year_installed, :heat_pump_type, :heat_pump_fuel,
2978
3374
  :heating_capacity, :heating_capacity_17F, :cooling_capacity, :compressor_type,
2979
- :cooling_shr, :backup_heating_fuel, :backup_heating_capacity,
3375
+ :cooling_shr, :backup_type, :backup_system_idref, :backup_heating_fuel, :backup_heating_capacity,
2980
3376
  :backup_heating_efficiency_percent, :backup_heating_efficiency_afue,
2981
3377
  :backup_heating_switchover_temp, :fraction_heat_load_served, :fraction_cool_load_served,
2982
- :cooling_efficiency_seer, :cooling_efficiency_eer, :heating_efficiency_hspf,
3378
+ :cooling_efficiency_seer, :cooling_efficiency_eer, :cooling_efficiency_ceer, :heating_efficiency_hspf,
2983
3379
  :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]
3380
+ :fan_watts_per_cfm, :is_shared_system, :number_of_units_served, :shared_loop_watts,
3381
+ :shared_loop_motor_efficiency, :airflow_defect_ratio, :charge_defect_ratio,
3382
+ :heating_airflow_cfm, :cooling_airflow_cfm, :location, :primary_heating_system, :primary_cooling_system]
2988
3383
  attr_accessor(*ATTRS)
2989
3384
 
2990
3385
  def distribution_system
@@ -2998,6 +3393,33 @@ class HPXML < Object
2998
3393
  fail "Attached HVAC distribution system '#{@distribution_system_idref}' not found for HVAC system '#{@id}'."
2999
3394
  end
3000
3395
 
3396
+ def is_dual_fuel
3397
+ if @backup_heating_fuel.nil?
3398
+ return false
3399
+ end
3400
+ if @backup_heating_fuel.to_s == @heat_pump_fuel.to_s
3401
+ return false
3402
+ end
3403
+
3404
+ return true
3405
+ end
3406
+
3407
+ def primary_system
3408
+ return true if @primary_heating_system || @primary_cooling_system
3409
+
3410
+ return false
3411
+ end
3412
+
3413
+ def backup_system
3414
+ return if @backup_system_idref.nil?
3415
+
3416
+ @hpxml_object.heating_systems.each do |heating_system|
3417
+ next unless heating_system.id == @backup_system_idref
3418
+
3419
+ return heating_system
3420
+ end
3421
+ end
3422
+
3001
3423
  def delete
3002
3424
  @hpxml_object.heat_pumps.delete(self)
3003
3425
  @hpxml_object.water_heating_systems.each do |water_heating_system|
@@ -3017,6 +3439,7 @@ class HPXML < Object
3017
3439
  return if nil?
3018
3440
 
3019
3441
  hvac_plant = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'HVAC', 'HVACPlant'])
3442
+ primary_systems = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'HVAC', 'HVACPlant', 'PrimarySystems']) unless @hpxml_object.primary_hvac_systems.empty?
3020
3443
  heat_pump = XMLHelper.add_element(hvac_plant, 'HeatPump')
3021
3444
  sys_id = XMLHelper.add_element(heat_pump, 'SystemIdentifier')
3022
3445
  XMLHelper.add_attribute(sys_id, 'id', @id)
@@ -3036,58 +3459,68 @@ class HPXML < Object
3036
3459
  XMLHelper.add_element(heat_pump, 'CoolingCapacity', @cooling_capacity, :float, @cooling_capacity_isdefaulted) unless @cooling_capacity.nil?
3037
3460
  XMLHelper.add_element(heat_pump, 'CompressorType', @compressor_type, :string, @compressor_type_isdefaulted) unless @compressor_type.nil?
3038
3461
  XMLHelper.add_element(heat_pump, 'CoolingSensibleHeatFraction', @cooling_shr, :float, @cooling_shr_isdefaulted) unless @cooling_shr.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
-
3462
+ XMLHelper.add_element(heat_pump, 'BackupType', @backup_type, :string, @backup_type_isdefaulted) unless @backup_type.nil?
3463
+ if not @backup_system_idref.nil?
3464
+ backup_system = XMLHelper.add_element(heat_pump, 'BackupSystem')
3465
+ XMLHelper.add_attribute(backup_system, 'idref', @backup_system_idref)
3466
+ end
3467
+ XMLHelper.add_element(heat_pump, 'BackupSystemFuel', @backup_heating_fuel, :string, @backup_heating_fuel_isdefaulted) unless @backup_heating_fuel.nil?
3468
+ if not @backup_heating_efficiency_percent.nil?
3045
3469
  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)
3470
+ XMLHelper.add_element(backup_eff, 'Units', UnitsPercent, :string)
3471
+ XMLHelper.add_element(backup_eff, 'Value', @backup_heating_efficiency_percent, :float)
3472
+ end
3473
+ if not @backup_heating_efficiency_afue.nil?
3474
+ backup_eff = XMLHelper.add_element(heat_pump, 'BackupAnnualHeatingEfficiency')
3475
+ XMLHelper.add_element(backup_eff, 'Units', UnitsAFUE, :string)
3476
+ XMLHelper.add_element(backup_eff, 'Value', @backup_heating_efficiency_afue, :float)
3048
3477
  end
3049
3478
  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?
3479
+ XMLHelper.add_element(heat_pump, 'BackupHeatingSwitchoverTemperature', @backup_heating_switchover_temp, :float, @backup_heating_switchover_temp_isdefaulted) unless @backup_heating_switchover_temp.nil?
3051
3480
  XMLHelper.add_element(heat_pump, 'FractionHeatLoadServed', @fraction_heat_load_served, :float, @fraction_heat_load_served_isdefaulted) unless @fraction_heat_load_served.nil?
3052
3481
  XMLHelper.add_element(heat_pump, 'FractionCoolLoadServed', @fraction_cool_load_served, :float, @fraction_cool_load_served_isdefaulted) unless @fraction_cool_load_served.nil?
3053
-
3054
- clg_efficiency_units = nil
3055
- clg_efficiency_value = nil
3056
- htg_efficiency_units = nil
3057
- htg_efficiency_value = nil
3058
- if [HVACTypeHeatPumpAirToAir, HVACTypeHeatPumpMiniSplit].include? @heat_pump_type
3059
- clg_efficiency_units = UnitsSEER
3060
- clg_efficiency_value = @cooling_efficiency_seer
3061
- htg_efficiency_units = UnitsHSPF
3062
- htg_efficiency_value = @heating_efficiency_hspf
3063
- elsif [HVACTypeHeatPumpGroundToAir, HVACTypeHeatPumpWaterLoopToAir].include? @heat_pump_type
3064
- clg_efficiency_units = UnitsEER
3065
- clg_efficiency_value = @cooling_efficiency_eer
3066
- htg_efficiency_units = UnitsCOP
3067
- htg_efficiency_value = @heating_efficiency_cop
3068
- end
3069
- if not clg_efficiency_value.nil?
3482
+ if not @cooling_efficiency_seer.nil?
3070
3483
  annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualCoolingEfficiency')
3071
- XMLHelper.add_element(annual_efficiency, 'Units', clg_efficiency_units, :string)
3072
- XMLHelper.add_element(annual_efficiency, 'Value', clg_efficiency_value, :float)
3484
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsSEER, :string)
3485
+ XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_seer, :float, @cooling_efficiency_seer_isdefaulted)
3073
3486
  end
3074
- if not htg_efficiency_value.nil?
3487
+ if not @cooling_efficiency_ceer.nil?
3488
+ annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualCoolingEfficiency')
3489
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsCEER, :string)
3490
+ XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_ceer, :float, @cooling_efficiency_ceer_isdefaulted)
3491
+ end
3492
+ if not @cooling_efficiency_eer.nil?
3493
+ annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualCoolingEfficiency')
3494
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsEER, :string)
3495
+ XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_eer, :float, @cooling_efficiency_eer_isdefaulted)
3496
+ end
3497
+ if not @heating_efficiency_hspf.nil?
3498
+ annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualHeatingEfficiency')
3499
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsHSPF, :string)
3500
+ XMLHelper.add_element(annual_efficiency, 'Value', @heating_efficiency_hspf, :float, @heating_efficiency_hspf_isdefaulted)
3501
+ end
3502
+ if not @heating_efficiency_cop.nil?
3075
3503
  annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualHeatingEfficiency')
3076
- XMLHelper.add_element(annual_efficiency, 'Units', htg_efficiency_units, :string)
3077
- XMLHelper.add_element(annual_efficiency, 'Value', htg_efficiency_value, :float)
3504
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsCOP, :string)
3505
+ XMLHelper.add_element(annual_efficiency, 'Value', @heating_efficiency_cop, :float, @heating_efficiency_cop_isdefaulted)
3078
3506
  end
3079
3507
  XMLHelper.add_extension(heat_pump, 'AirflowDefectRatio', @airflow_defect_ratio, :float, @airflow_defect_ratio_isdefaulted) unless @airflow_defect_ratio.nil?
3080
3508
  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?
3082
3509
  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
3510
  XMLHelper.add_extension(heat_pump, 'HeatingAirflowCFM', @heating_airflow_cfm, :float, @heating_airflow_cfm_isdefaulted) unless @heating_airflow_cfm.nil?
3086
3511
  XMLHelper.add_extension(heat_pump, 'CoolingAirflowCFM', @cooling_airflow_cfm, :float, @cooling_airflow_cfm_isdefaulted) unless @cooling_airflow_cfm.nil?
3087
3512
  XMLHelper.add_extension(heat_pump, 'PumpPowerWattsPerTon', @pump_watts_per_ton, :float, @pump_watts_per_ton_isdefaulted) unless @pump_watts_per_ton.nil?
3088
3513
  XMLHelper.add_extension(heat_pump, 'SharedLoopWatts', @shared_loop_watts, :float) unless @shared_loop_watts.nil?
3089
3514
  XMLHelper.add_extension(heat_pump, 'SharedLoopMotorEfficiency', @shared_loop_motor_efficiency, :float) unless @shared_loop_motor_efficiency.nil?
3090
3515
  XMLHelper.add_extension(heat_pump, 'SeedId', @seed_id, :string) unless @seed_id.nil?
3516
+ if @primary_heating_system
3517
+ primary_heating_system = XMLHelper.insert_element(primary_systems, 'PrimaryHeatingSystem')
3518
+ XMLHelper.add_attribute(primary_heating_system, 'idref', @id)
3519
+ end
3520
+ if @primary_cooling_system
3521
+ primary_cooling_system = XMLHelper.add_element(primary_systems, 'PrimaryCoolingSystem')
3522
+ XMLHelper.add_attribute(primary_cooling_system, 'idref', @id)
3523
+ end
3091
3524
  end
3092
3525
 
3093
3526
  def from_oga(heat_pump)
@@ -3107,6 +3540,8 @@ class HPXML < Object
3107
3540
  @cooling_capacity = XMLHelper.get_value(heat_pump, 'CoolingCapacity', :float)
3108
3541
  @compressor_type = XMLHelper.get_value(heat_pump, 'CompressorType', :string)
3109
3542
  @cooling_shr = XMLHelper.get_value(heat_pump, 'CoolingSensibleHeatFraction', :float)
3543
+ @backup_type = XMLHelper.get_value(heat_pump, 'BackupType', :string)
3544
+ @backup_system_idref = HPXML::get_idref(XMLHelper.get_element(heat_pump, 'BackupSystem'))
3110
3545
  @backup_heating_fuel = XMLHelper.get_value(heat_pump, 'BackupSystemFuel', :string)
3111
3546
  @backup_heating_efficiency_percent = XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='Percent']/Value", :float)
3112
3547
  @backup_heating_efficiency_afue = XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='#{UnitsAFUE}']/Value", :float)
@@ -3114,28 +3549,32 @@ class HPXML < Object
3114
3549
  @backup_heating_switchover_temp = XMLHelper.get_value(heat_pump, 'BackupHeatingSwitchoverTemperature', :float)
3115
3550
  @fraction_heat_load_served = XMLHelper.get_value(heat_pump, 'FractionHeatLoadServed', :float)
3116
3551
  @fraction_cool_load_served = XMLHelper.get_value(heat_pump, 'FractionCoolLoadServed', :float)
3117
- if [HVACTypeHeatPumpAirToAir, HVACTypeHeatPumpMiniSplit].include? @heat_pump_type
3118
- @cooling_efficiency_seer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsSEER}']/Value", :float)
3119
- elsif [HVACTypeHeatPumpGroundToAir, HVACTypeHeatPumpWaterLoopToAir].include? @heat_pump_type
3120
- @cooling_efficiency_eer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsEER}']/Value", :float)
3121
- end
3122
- if [HVACTypeHeatPumpAirToAir, HVACTypeHeatPumpMiniSplit].include? @heat_pump_type
3123
- @heating_efficiency_hspf = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsHSPF}']/Value", :float)
3124
- elsif [HVACTypeHeatPumpGroundToAir, HVACTypeHeatPumpWaterLoopToAir].include? @heat_pump_type
3125
- @heating_efficiency_cop = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsCOP}']/Value", :float)
3126
- end
3552
+ @cooling_efficiency_seer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsSEER}']/Value", :float)
3553
+ @cooling_efficiency_ceer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsCEER}']/Value", :float)
3554
+ @cooling_efficiency_eer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsEER}']/Value", :float)
3555
+ @heating_efficiency_hspf = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsHSPF}']/Value", :float)
3556
+ @heating_efficiency_cop = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsCOP}']/Value", :float)
3127
3557
  @airflow_defect_ratio = XMLHelper.get_value(heat_pump, 'extension/AirflowDefectRatio', :float)
3128
3558
  @charge_defect_ratio = XMLHelper.get_value(heat_pump, 'extension/ChargeDefectRatio', :float)
3129
- @charge_not_tested = XMLHelper.get_value(heat_pump, 'extension/ChargeNotTested', :boolean)
3130
3559
  @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
3560
  @heating_airflow_cfm = XMLHelper.get_value(heat_pump, 'extension/HeatingAirflowCFM', :float)
3134
3561
  @cooling_airflow_cfm = XMLHelper.get_value(heat_pump, 'extension/CoolingAirflowCFM', :float)
3135
3562
  @pump_watts_per_ton = XMLHelper.get_value(heat_pump, 'extension/PumpPowerWattsPerTon', :float)
3136
3563
  @shared_loop_watts = XMLHelper.get_value(heat_pump, 'extension/SharedLoopWatts', :float)
3137
3564
  @shared_loop_motor_efficiency = XMLHelper.get_value(heat_pump, 'extension/SharedLoopMotorEfficiency', :float)
3138
3565
  @seed_id = XMLHelper.get_value(heat_pump, 'extension/SeedId', :string)
3566
+ primary_heating_system = HPXML::get_idref(XMLHelper.get_element(heat_pump, '../PrimarySystems/PrimaryHeatingSystem'))
3567
+ if primary_heating_system == @id
3568
+ @primary_heating_system = true
3569
+ else
3570
+ @primary_heating_system = false
3571
+ end
3572
+ primary_cooling_system = HPXML::get_idref(XMLHelper.get_element(heat_pump, '../PrimarySystems/PrimaryCoolingSystem'))
3573
+ if primary_cooling_system == @id
3574
+ @primary_cooling_system = true
3575
+ else
3576
+ @primary_cooling_system = false
3577
+ end
3139
3578
  end
3140
3579
  end
3141
3580
 
@@ -3204,13 +3643,13 @@ class HPXML < Object
3204
3643
  return if hvac_plant.nil?
3205
3644
 
3206
3645
  HDL_ATTRS.each do |attr, element_name|
3207
- send("#{attr.to_s}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/Heating/#{element_name}", :float))
3646
+ send("#{attr}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/Heating/#{element_name}", :float))
3208
3647
  end
3209
3648
  CDL_SENS_ATTRS.each do |attr, element_name|
3210
- send("#{attr.to_s}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/CoolingSensible/#{element_name}", :float))
3649
+ send("#{attr}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/CoolingSensible/#{element_name}", :float))
3211
3650
  end
3212
3651
  CDL_LAT_ATTRS.each do |attr, element_name|
3213
- send("#{attr.to_s}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/CoolingLatent/#{element_name}", :float))
3652
+ send("#{attr}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/CoolingLatent/#{element_name}", :float))
3214
3653
  end
3215
3654
  end
3216
3655
  end
@@ -3235,7 +3674,9 @@ class HPXML < Object
3235
3674
  :cooling_setup_temp, :cooling_setup_hours_per_week, :cooling_setup_start_hour,
3236
3675
  :ceiling_fan_cooling_setpoint_temp_offset,
3237
3676
  :weekday_heating_setpoints, :weekend_heating_setpoints,
3238
- :weekday_cooling_setpoints, :weekend_cooling_setpoints]
3677
+ :weekday_cooling_setpoints, :weekend_cooling_setpoints,
3678
+ :seasons_heating_begin_month, :seasons_heating_begin_day, :seasons_heating_end_month, :seasons_heating_end_day,
3679
+ :seasons_cooling_begin_month, :seasons_cooling_begin_day, :seasons_cooling_end_month, :seasons_cooling_end_day]
3239
3680
  attr_accessor(*ATTRS)
3240
3681
 
3241
3682
  def delete
@@ -3244,6 +3685,10 @@ class HPXML < Object
3244
3685
 
3245
3686
  def check_for_errors
3246
3687
  errors = []
3688
+
3689
+ errors += HPXML::check_dates('Heating Season', @seasons_heating_begin_month, @seasons_heating_begin_day, @seasons_heating_end_month, @seasons_heating_end_day)
3690
+ errors += HPXML::check_dates('Cooling Season', @seasons_cooling_begin_month, @seasons_cooling_begin_day, @seasons_cooling_end_month, @seasons_cooling_end_day)
3691
+
3247
3692
  return errors
3248
3693
  end
3249
3694
 
@@ -3255,12 +3700,26 @@ class HPXML < Object
3255
3700
  sys_id = XMLHelper.add_element(hvac_control, 'SystemIdentifier')
3256
3701
  XMLHelper.add_attribute(sys_id, 'id', @id)
3257
3702
  XMLHelper.add_element(hvac_control, 'ControlType', @control_type, :string) unless @control_type.nil?
3258
- XMLHelper.add_element(hvac_control, 'SetpointTempHeatingSeason', @heating_setpoint_temp, :float) unless @heating_setpoint_temp.nil?
3703
+ XMLHelper.add_element(hvac_control, 'SetpointTempHeatingSeason', @heating_setpoint_temp, :float, @heating_setpoint_temp_isdefaulted) unless @heating_setpoint_temp.nil?
3259
3704
  XMLHelper.add_element(hvac_control, 'SetbackTempHeatingSeason', @heating_setback_temp, :float) unless @heating_setback_temp.nil?
3260
3705
  XMLHelper.add_element(hvac_control, 'TotalSetbackHoursperWeekHeating', @heating_setback_hours_per_week, :integer) unless @heating_setback_hours_per_week.nil?
3261
3706
  XMLHelper.add_element(hvac_control, 'SetupTempCoolingSeason', @cooling_setup_temp, :float) unless @cooling_setup_temp.nil?
3262
- XMLHelper.add_element(hvac_control, 'SetpointTempCoolingSeason', @cooling_setpoint_temp, :float) unless @cooling_setpoint_temp.nil?
3707
+ XMLHelper.add_element(hvac_control, 'SetpointTempCoolingSeason', @cooling_setpoint_temp, :float, @cooling_setpoint_temp_isdefaulted) unless @cooling_setpoint_temp.nil?
3263
3708
  XMLHelper.add_element(hvac_control, 'TotalSetupHoursperWeekCooling', @cooling_setup_hours_per_week, :integer) unless @cooling_setup_hours_per_week.nil?
3709
+ if (not @seasons_heating_begin_month.nil?) || (not @seasons_heating_begin_day.nil?) || (not @seasons_heating_end_month.nil?) || (not @seasons_heating_end_day.nil?)
3710
+ heating_season = XMLHelper.add_element(hvac_control, 'HeatingSeason')
3711
+ XMLHelper.add_element(heating_season, 'BeginMonth', @seasons_heating_begin_month, :integer, @seasons_heating_begin_month_isdefaulted) unless @seasons_heating_begin_month.nil?
3712
+ XMLHelper.add_element(heating_season, 'BeginDayOfMonth', @seasons_heating_begin_day, :integer, @seasons_heating_begin_day_isdefaulted) unless @seasons_heating_begin_day.nil?
3713
+ XMLHelper.add_element(heating_season, 'EndMonth', @seasons_heating_end_month, :integer, @seasons_heating_end_month_isdefaulted) unless @seasons_heating_end_month.nil?
3714
+ XMLHelper.add_element(heating_season, 'EndDayOfMonth', @seasons_heating_end_day, :integer, @seasons_heating_end_day_isdefaulted) unless @seasons_heating_end_day.nil?
3715
+ end
3716
+ if (not @seasons_cooling_begin_month.nil?) || (not @seasons_cooling_begin_day.nil?) || (not @seasons_cooling_end_month.nil?) || (not @seasons_cooling_end_day.nil?)
3717
+ cooling_season = XMLHelper.add_element(hvac_control, 'CoolingSeason')
3718
+ XMLHelper.add_element(cooling_season, 'BeginMonth', @seasons_cooling_begin_month, :integer, @seasons_cooling_begin_month_isdefaulted) unless @seasons_cooling_begin_month.nil?
3719
+ XMLHelper.add_element(cooling_season, 'BeginDayOfMonth', @seasons_cooling_begin_day, :integer, @seasons_cooling_begin_day_isdefaulted) unless @seasons_cooling_begin_day.nil?
3720
+ XMLHelper.add_element(cooling_season, 'EndMonth', @seasons_cooling_end_month, :integer, @seasons_cooling_end_month_isdefaulted) unless @seasons_cooling_end_month.nil?
3721
+ XMLHelper.add_element(cooling_season, 'EndDayOfMonth', @seasons_cooling_end_day, :integer, @seasons_cooling_end_day_isdefaulted) unless @seasons_cooling_end_day.nil?
3722
+ end
3264
3723
  XMLHelper.add_extension(hvac_control, 'SetbackStartHourHeating', @heating_setback_start_hour, :integer, @heating_setback_start_hour_isdefaulted) unless @heating_setback_start_hour.nil?
3265
3724
  XMLHelper.add_extension(hvac_control, 'SetupStartHourCooling', @cooling_setup_start_hour, :integer, @cooling_setup_start_hour_isdefaulted) unless @cooling_setup_start_hour.nil?
3266
3725
  XMLHelper.add_extension(hvac_control, 'CeilingFanSetpointTempCoolingSeasonOffset', @ceiling_fan_cooling_setpoint_temp_offset, :float) unless @ceiling_fan_cooling_setpoint_temp_offset.nil?
@@ -3281,6 +3740,14 @@ class HPXML < Object
3281
3740
  @cooling_setup_temp = XMLHelper.get_value(hvac_control, 'SetupTempCoolingSeason', :float)
3282
3741
  @cooling_setpoint_temp = XMLHelper.get_value(hvac_control, 'SetpointTempCoolingSeason', :float)
3283
3742
  @cooling_setup_hours_per_week = XMLHelper.get_value(hvac_control, 'TotalSetupHoursperWeekCooling', :integer)
3743
+ @seasons_heating_begin_month = XMLHelper.get_value(hvac_control, 'HeatingSeason/BeginMonth', :integer)
3744
+ @seasons_heating_begin_day = XMLHelper.get_value(hvac_control, 'HeatingSeason/BeginDayOfMonth', :integer)
3745
+ @seasons_heating_end_month = XMLHelper.get_value(hvac_control, 'HeatingSeason/EndMonth', :integer)
3746
+ @seasons_heating_end_day = XMLHelper.get_value(hvac_control, 'HeatingSeason/EndDayOfMonth', :integer)
3747
+ @seasons_cooling_begin_month = XMLHelper.get_value(hvac_control, 'CoolingSeason/BeginMonth', :integer)
3748
+ @seasons_cooling_begin_day = XMLHelper.get_value(hvac_control, 'CoolingSeason/BeginDayOfMonth', :integer)
3749
+ @seasons_cooling_end_month = XMLHelper.get_value(hvac_control, 'CoolingSeason/EndMonth', :integer)
3750
+ @seasons_cooling_end_day = XMLHelper.get_value(hvac_control, 'CoolingSeason/EndDayOfMonth', :integer)
3284
3751
  @heating_setback_start_hour = XMLHelper.get_value(hvac_control, 'extension/SetbackStartHourHeating', :integer)
3285
3752
  @cooling_setup_start_hour = XMLHelper.get_value(hvac_control, 'extension/SetupStartHourCooling', :integer)
3286
3753
  @ceiling_fan_cooling_setpoint_temp_offset = XMLHelper.get_value(hvac_control, 'extension/CeilingFanSetpointTempCoolingSeasonOffset', :float)
@@ -3355,7 +3822,7 @@ class HPXML < Object
3355
3822
  areas = { HPXML::DuctTypeSupply => 0,
3356
3823
  HPXML::DuctTypeReturn => 0 }
3357
3824
  @ducts.each do |duct|
3358
- next if [HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include? duct.duct_location
3825
+ next if HPXML::conditioned_locations.include? duct.duct_location
3359
3826
  next if duct.duct_type.nil?
3360
3827
 
3361
3828
  areas[duct.duct_type] += duct.duct_surface_area
@@ -3549,7 +4016,7 @@ class HPXML < Object
3549
4016
  end
3550
4017
  XMLHelper.add_element(ducts_el, 'DuctInsulationRValue', @duct_insulation_r_value, :float) unless @duct_insulation_r_value.nil?
3551
4018
  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?
4019
+ XMLHelper.add_element(ducts_el, 'FractionDuctArea', @duct_fraction_area, :float, @duct_fraction_area_isdefaulted) unless @duct_fraction_area.nil?
3553
4020
  XMLHelper.add_element(ducts_el, 'DuctSurfaceArea', @duct_surface_area, :float, @duct_surface_area_isdefaulted) unless @duct_surface_area.nil?
3554
4021
  end
3555
4022
 
@@ -3587,7 +4054,8 @@ class HPXML < Object
3587
4054
  :fan_power, :fan_power_defaulted, :quantity, :fan_location, :distribution_system_idref, :start_hour,
3588
4055
  :is_shared_system, :in_unit_flow_rate, :fraction_recirculation,
3589
4056
  :preheating_fuel, :preheating_efficiency_cop, :preheating_fraction_load_served, :precooling_fuel,
3590
- :precooling_efficiency_cop, :precooling_fraction_load_served]
4057
+ :precooling_efficiency_cop, :precooling_fraction_load_served, :calculated_flow_rate,
4058
+ :delivered_ventilation]
3591
4059
  attr_accessor(*ATTRS)
3592
4060
 
3593
4061
  def distribution_system
@@ -3606,13 +4074,16 @@ class HPXML < Object
3606
4074
  fail "Attached HVAC distribution system '#{@distribution_system_idref}' not found for ventilation fan '#{@id}'."
3607
4075
  end
3608
4076
 
4077
+ def flow_rate
4078
+ [@tested_flow_rate, @delivered_ventilation, @calculated_flow_rate, @rated_flow_rate].each do |fr|
4079
+ return fr unless fr.nil?
4080
+ end
4081
+ return
4082
+ end
4083
+
3609
4084
  def total_unit_flow_rate
3610
4085
  if not @is_shared_system
3611
- if not @tested_flow_rate.nil?
3612
- return @tested_flow_rate
3613
- else
3614
- return @rated_flow_rate
3615
- end
4086
+ return flow_rate
3616
4087
  else
3617
4088
  return @in_unit_flow_rate
3618
4089
  end
@@ -3651,13 +4122,9 @@ class HPXML < Object
3651
4122
  return 1.0 unless @is_shared_system
3652
4123
  return if @in_unit_flow_rate.nil?
3653
4124
 
3654
- if not @tested_flow_rate.nil?
3655
- ratio = @in_unit_flow_rate / @tested_flow_rate
3656
- elsif not @rated_flow_rate.nil?
3657
- ratio = @in_unit_flow_rate / @rated_flow_rate
4125
+ if not flow_rate.nil?
4126
+ ratio = @in_unit_flow_rate / flow_rate
3658
4127
  end
3659
- return if ratio.nil?
3660
-
3661
4128
  return ratio
3662
4129
  end
3663
4130
 
@@ -3726,8 +4193,10 @@ class HPXML < Object
3726
4193
  XMLHelper.add_element(ventilation_fan, 'Quantity', @quantity, :integer, @quantity_isdefaulted) unless @quantity.nil?
3727
4194
  XMLHelper.add_element(ventilation_fan, 'FanType', @fan_type, :string) unless @fan_type.nil?
3728
4195
  XMLHelper.add_element(ventilation_fan, 'RatedFlowRate', @rated_flow_rate, :float, @rated_flow_rate_isdefaulted) unless @rated_flow_rate.nil?
3729
- XMLHelper.add_element(ventilation_fan, 'TestedFlowRate', @tested_flow_rate, :float) unless @tested_flow_rate.nil?
4196
+ XMLHelper.add_element(ventilation_fan, 'CalculatedFlowRate', @calculated_flow_rate, :float, @calculated_flow_rate_isdefaulted) unless @calculated_flow_rate.nil?
4197
+ XMLHelper.add_element(ventilation_fan, 'TestedFlowRate', @tested_flow_rate, :float, @tested_flow_rate_isdefaulted) unless @tested_flow_rate.nil?
3730
4198
  XMLHelper.add_element(ventilation_fan, 'HoursInOperation', @hours_in_operation, :float, @hours_in_operation_isdefaulted) unless @hours_in_operation.nil?
4199
+ XMLHelper.add_element(ventilation_fan, 'DeliveredVentilation', @delivered_ventilation, :float, @delivered_ventilation_isdefaulted) unless @delivered_ventilation.nil?
3731
4200
  XMLHelper.add_element(ventilation_fan, 'FanLocation', @fan_location, :string) unless @fan_location.nil?
3732
4201
  XMLHelper.add_element(ventilation_fan, 'UsedForLocalVentilation', @used_for_local_ventilation, :boolean) unless @used_for_local_ventilation.nil?
3733
4202
  XMLHelper.add_element(ventilation_fan, 'UsedForWholeBuildingVentilation', @used_for_whole_building_ventilation, :boolean) unless @used_for_whole_building_ventilation.nil?
@@ -3772,8 +4241,10 @@ class HPXML < Object
3772
4241
  @quantity = XMLHelper.get_value(ventilation_fan, 'Quantity', :integer)
3773
4242
  @fan_type = XMLHelper.get_value(ventilation_fan, 'FanType', :string)
3774
4243
  @rated_flow_rate = XMLHelper.get_value(ventilation_fan, 'RatedFlowRate', :float)
4244
+ @calculated_flow_rate = XMLHelper.get_value(ventilation_fan, 'CalculatedFlowRate', :float)
3775
4245
  @tested_flow_rate = XMLHelper.get_value(ventilation_fan, 'TestedFlowRate', :float)
3776
4246
  @hours_in_operation = XMLHelper.get_value(ventilation_fan, 'HoursInOperation', :float)
4247
+ @delivered_ventilation = XMLHelper.get_value(ventilation_fan, 'DeliveredVentilation', :float)
3777
4248
  @fan_location = XMLHelper.get_value(ventilation_fan, 'FanLocation', :string)
3778
4249
  @used_for_local_ventilation = XMLHelper.get_value(ventilation_fan, 'UsedForLocalVentilation', :boolean)
3779
4250
  @used_for_whole_building_ventilation = XMLHelper.get_value(ventilation_fan, 'UsedForWholeBuildingVentilation', :boolean)
@@ -3815,7 +4286,7 @@ class HPXML < Object
3815
4286
 
3816
4287
  class WaterHeatingSystem < BaseElement
3817
4288
  ATTRS = [:id, :year_installed, :fuel_type, :water_heater_type, :location, :performance_adjustment,
3818
- :tank_volume, :fraction_dhw_load_served, :heating_capacity, :energy_factor,
4289
+ :tank_volume, :fraction_dhw_load_served, :heating_capacity, :energy_factor, :usage_bin,
3819
4290
  :uniform_energy_factor, :first_hour_rating, :recovery_efficiency, :uses_desuperheater, :jacket_r_value,
3820
4291
  :related_hvac_idref, :third_party_certification, :standby_loss, :temperature, :is_shared_system,
3821
4292
  :number_of_units_served]
@@ -3865,9 +4336,10 @@ class HPXML < Object
3865
4336
  XMLHelper.add_element(water_heating_system, 'TankVolume', @tank_volume, :float, @tank_volume_isdefaulted) unless @tank_volume.nil?
3866
4337
  XMLHelper.add_element(water_heating_system, 'FractionDHWLoadServed', @fraction_dhw_load_served, :float) unless @fraction_dhw_load_served.nil?
3867
4338
  XMLHelper.add_element(water_heating_system, 'HeatingCapacity', @heating_capacity, :float, @heating_capacity_isdefaulted) unless @heating_capacity.nil?
3868
- XMLHelper.add_element(water_heating_system, 'EnergyFactor', @energy_factor, :float) unless @energy_factor.nil?
4339
+ XMLHelper.add_element(water_heating_system, 'EnergyFactor', @energy_factor, :float, @energy_factor_isdefaulted) unless @energy_factor.nil?
3869
4340
  XMLHelper.add_element(water_heating_system, 'UniformEnergyFactor', @uniform_energy_factor, :float) unless @uniform_energy_factor.nil?
3870
4341
  XMLHelper.add_element(water_heating_system, 'FirstHourRating', @first_hour_rating, :float) unless @first_hour_rating.nil?
4342
+ XMLHelper.add_element(water_heating_system, 'UsageBin', @usage_bin, :string, @usage_bin_isdefaulted) unless @usage_bin.nil?
3871
4343
  XMLHelper.add_element(water_heating_system, 'RecoveryEfficiency', @recovery_efficiency, :float, @recovery_efficiency_isdefaulted) unless @recovery_efficiency.nil?
3872
4344
  if not @jacket_r_value.nil?
3873
4345
  water_heater_insulation = XMLHelper.add_element(water_heating_system, 'WaterHeaterInsulation')
@@ -3901,6 +4373,7 @@ class HPXML < Object
3901
4373
  @energy_factor = XMLHelper.get_value(water_heating_system, 'EnergyFactor', :float)
3902
4374
  @uniform_energy_factor = XMLHelper.get_value(water_heating_system, 'UniformEnergyFactor', :float)
3903
4375
  @first_hour_rating = XMLHelper.get_value(water_heating_system, 'FirstHourRating', :float)
4376
+ @usage_bin = XMLHelper.get_value(water_heating_system, 'UsageBin', :string)
3904
4377
  @recovery_efficiency = XMLHelper.get_value(water_heating_system, 'RecoveryEfficiency', :float)
3905
4378
  @jacket_r_value = XMLHelper.get_value(water_heating_system, 'WaterHeaterInsulation/Jacket/JacketRValue', :float)
3906
4379
  @standby_loss = XMLHelper.get_value(water_heating_system, 'StandbyLoss', :float)
@@ -4059,7 +4532,8 @@ class HPXML < Object
4059
4532
  end
4060
4533
 
4061
4534
  class WaterHeating < BaseElement
4062
- ATTRS = [:water_fixtures_usage_multiplier]
4535
+ ATTRS = [:water_fixtures_usage_multiplier, :water_fixtures_weekday_fractions, :water_fixtures_weekend_fractions,
4536
+ :water_fixtures_monthly_multipliers]
4063
4537
  attr_accessor(*ATTRS)
4064
4538
 
4065
4539
  def check_for_errors
@@ -4072,6 +4546,9 @@ class HPXML < Object
4072
4546
 
4073
4547
  water_heating = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'WaterHeating'])
4074
4548
  XMLHelper.add_extension(water_heating, 'WaterFixturesUsageMultiplier', @water_fixtures_usage_multiplier, :float, @water_fixtures_usage_multiplier_isdefaulted) unless @water_fixtures_usage_multiplier.nil?
4549
+ XMLHelper.add_extension(water_heating, 'WaterFixturesWeekdayScheduleFractions', @water_fixtures_weekday_fractions, :string, @water_fixtures_weekday_fractions_isdefaulted) unless @water_fixtures_weekday_fractions.nil?
4550
+ XMLHelper.add_extension(water_heating, 'WaterFixturesWeekendScheduleFractions', @water_fixtures_weekend_fractions, :string, @water_fixtures_weekend_fractions_isdefaulted) unless @water_fixtures_weekend_fractions.nil?
4551
+ XMLHelper.add_extension(water_heating, 'WaterFixturesMonthlyScheduleMultipliers', @water_fixtures_monthly_multipliers, :string, @water_fixtures_monthly_multipliers_isdefaulted) unless @water_fixtures_monthly_multipliers.nil?
4075
4552
  end
4076
4553
 
4077
4554
  def from_oga(hpxml)
@@ -4081,6 +4558,9 @@ class HPXML < Object
4081
4558
  return if water_heating.nil?
4082
4559
 
4083
4560
  @water_fixtures_usage_multiplier = XMLHelper.get_value(water_heating, 'extension/WaterFixturesUsageMultiplier', :float)
4561
+ @water_fixtures_weekday_fractions = XMLHelper.get_value(water_heating, 'extension/WaterFixturesWeekdayScheduleFractions', :string)
4562
+ @water_fixtures_weekend_fractions = XMLHelper.get_value(water_heating, 'extension/WaterFixturesWeekendScheduleFractions', :string)
4563
+ @water_fixtures_monthly_multipliers = XMLHelper.get_value(water_heating, 'extension/WaterFixturesMonthlyScheduleMultipliers', :string)
4084
4564
  end
4085
4565
  end
4086
4566
 
@@ -4099,7 +4579,7 @@ class HPXML < Object
4099
4579
  end
4100
4580
 
4101
4581
  class SolarThermalSystem < BaseElement
4102
- ATTRS = [:id, :system_type, :collector_area, :collector_loop_type, :collector_azimuth,
4582
+ ATTRS = [:id, :system_type, :collector_area, :collector_loop_type, :collector_orientation, :collector_azimuth,
4103
4583
  :collector_type, :collector_tilt, :collector_frta, :collector_frul, :storage_volume,
4104
4584
  :water_heating_system_idref, :solar_fraction]
4105
4585
  attr_accessor(*ATTRS)
@@ -4136,7 +4616,8 @@ class HPXML < Object
4136
4616
  XMLHelper.add_element(solar_thermal_system, 'CollectorArea', @collector_area, :float) unless @collector_area.nil?
4137
4617
  XMLHelper.add_element(solar_thermal_system, 'CollectorLoopType', @collector_loop_type, :string) unless @collector_loop_type.nil?
4138
4618
  XMLHelper.add_element(solar_thermal_system, 'CollectorType', @collector_type, :string) unless @collector_type.nil?
4139
- XMLHelper.add_element(solar_thermal_system, 'CollectorAzimuth', @collector_azimuth, :integer) unless @collector_azimuth.nil?
4619
+ XMLHelper.add_element(solar_thermal_system, 'CollectorOrientation', @collector_orientation, :string, @collector_orientation_isdefaulted) unless @collector_orientation.nil?
4620
+ XMLHelper.add_element(solar_thermal_system, 'CollectorAzimuth', @collector_azimuth, :integer, @collector_azimuth_isdefaulted) unless @collector_azimuth.nil?
4140
4621
  XMLHelper.add_element(solar_thermal_system, 'CollectorTilt', @collector_tilt, :float) unless @collector_tilt.nil?
4141
4622
  XMLHelper.add_element(solar_thermal_system, 'CollectorRatedOpticalEfficiency', @collector_frta, :float) unless @collector_frta.nil?
4142
4623
  XMLHelper.add_element(solar_thermal_system, 'CollectorRatedThermalLosses', @collector_frul, :float) unless @collector_frul.nil?
@@ -4156,6 +4637,7 @@ class HPXML < Object
4156
4637
  @collector_area = XMLHelper.get_value(solar_thermal_system, 'CollectorArea', :float)
4157
4638
  @collector_loop_type = XMLHelper.get_value(solar_thermal_system, 'CollectorLoopType', :string)
4158
4639
  @collector_type = XMLHelper.get_value(solar_thermal_system, 'CollectorType', :string)
4640
+ @collector_orientation = XMLHelper.get_value(solar_thermal_system, 'CollectorOrientation', :string)
4159
4641
  @collector_azimuth = XMLHelper.get_value(solar_thermal_system, 'CollectorAzimuth', :integer)
4160
4642
  @collector_tilt = XMLHelper.get_value(solar_thermal_system, 'CollectorTilt', :float)
4161
4643
  @collector_frta = XMLHelper.get_value(solar_thermal_system, 'CollectorRatedOpticalEfficiency', :float)
@@ -4206,8 +4688,8 @@ class HPXML < Object
4206
4688
  XMLHelper.add_element(pv_system, 'Location', @location, :string, @location_isdefaulted) unless @location.nil?
4207
4689
  XMLHelper.add_element(pv_system, 'ModuleType', @module_type, :string, @module_type_isdefaulted) unless @module_type.nil?
4208
4690
  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?
4210
- XMLHelper.add_element(pv_system, 'ArrayAzimuth', @array_azimuth, :integer) unless @array_azimuth.nil?
4691
+ XMLHelper.add_element(pv_system, 'ArrayOrientation', @array_orientation, :string, @array_orientation_isdefaulted) unless @array_orientation.nil?
4692
+ XMLHelper.add_element(pv_system, 'ArrayAzimuth', @array_azimuth, :integer, @array_azimuth_isdefaulted) unless @array_azimuth.nil?
4211
4693
  XMLHelper.add_element(pv_system, 'ArrayTilt', @array_tilt, :float) unless @array_tilt.nil?
4212
4694
  XMLHelper.add_element(pv_system, 'MaxPowerOutput', @max_power_output, :float) unless @max_power_output.nil?
4213
4695
  XMLHelper.add_element(pv_system, 'NumberOfPanels', @number_of_panels, :integer) unless @number_of_panels.nil?
@@ -4290,6 +4772,72 @@ class HPXML < Object
4290
4772
  end
4291
4773
  end
4292
4774
 
4775
+ class Batteries < BaseArrayElement
4776
+ def add(**kwargs)
4777
+ self << Battery.new(@hpxml_object, **kwargs)
4778
+ end
4779
+
4780
+ def from_oga(hpxml)
4781
+ return if hpxml.nil?
4782
+
4783
+ XMLHelper.get_elements(hpxml, 'Building/BuildingDetails/Systems/Batteries/Battery').each do |battery|
4784
+ self << Battery.new(@hpxml_object, battery)
4785
+ end
4786
+ end
4787
+ end
4788
+
4789
+ class Battery < BaseElement
4790
+ ATTRS = [:id, :type, :location, :lifetime_model, :rated_power_output,
4791
+ :nominal_capacity_kwh, :nominal_capacity_ah, :nominal_voltage]
4792
+ attr_accessor(*ATTRS)
4793
+
4794
+ def delete
4795
+ @hpxml_object.batteries.delete(self)
4796
+ end
4797
+
4798
+ def check_for_errors
4799
+ errors = []
4800
+ return errors
4801
+ end
4802
+
4803
+ def to_oga(doc)
4804
+ return if nil?
4805
+
4806
+ batteries = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'Batteries'])
4807
+ battery = XMLHelper.add_element(batteries, 'Battery')
4808
+ sys_id = XMLHelper.add_element(battery, 'SystemIdentifier')
4809
+ XMLHelper.add_attribute(sys_id, 'id', @id)
4810
+ XMLHelper.add_element(battery, 'Location', @location, :string, @location_isdefaulted) unless @location.nil?
4811
+ XMLHelper.add_element(battery, 'BatteryType', @type, :string) unless @type.nil?
4812
+ if not @nominal_capacity_kwh.nil?
4813
+ nominal_capacity = XMLHelper.add_element(battery, 'NominalCapacity')
4814
+ XMLHelper.add_element(nominal_capacity, 'Units', UnitsKwh, :string)
4815
+ XMLHelper.add_element(nominal_capacity, 'Value', @nominal_capacity_kwh, :float, @nominal_capacity_kwh_isdefaulted)
4816
+ end
4817
+ if not @nominal_capacity_ah.nil?
4818
+ nominal_capacity = XMLHelper.add_element(battery, 'NominalCapacity')
4819
+ XMLHelper.add_element(nominal_capacity, 'Units', UnitsAh, :string)
4820
+ XMLHelper.add_element(nominal_capacity, 'Value', @nominal_capacity_ah, :float, @nominal_capacity_ah_isdefaulted)
4821
+ end
4822
+ XMLHelper.add_element(battery, 'RatedPowerOutput', @rated_power_output, :float, @rated_power_output_isdefaulted) unless @rated_power_output.nil?
4823
+ XMLHelper.add_element(battery, 'NominalVoltage', @nominal_voltage, :float, @nominal_voltage_isdefaulted) unless @nominal_voltage.nil?
4824
+ XMLHelper.add_extension(battery, 'LifetimeModel', @lifetime_model, :string, @lifetime_model_isdefaulted) unless @lifetime_model.nil?
4825
+ end
4826
+
4827
+ def from_oga(battery)
4828
+ return if battery.nil?
4829
+
4830
+ @id = HPXML::get_id(battery)
4831
+ @location = XMLHelper.get_value(battery, 'Location', :string)
4832
+ @type = XMLHelper.get_value(battery, 'BatteryType', :string)
4833
+ @nominal_capacity_kwh = XMLHelper.get_value(battery, "NominalCapacity[Units='#{UnitsKwh}']/Value", :float)
4834
+ @nominal_capacity_ah = XMLHelper.get_value(battery, "NominalCapacity[Units='#{UnitsAh}']/Value", :float)
4835
+ @rated_power_output = XMLHelper.get_value(battery, 'RatedPowerOutput', :float)
4836
+ @nominal_voltage = XMLHelper.get_value(battery, 'NominalVoltage', :float)
4837
+ @lifetime_model = XMLHelper.get_value(battery, 'extension/LifetimeModel', :string)
4838
+ end
4839
+ end
4840
+
4293
4841
  class ClothesWashers < BaseArrayElement
4294
4842
  def add(**kwargs)
4295
4843
  self << ClothesWasher.new(@hpxml_object, **kwargs)
@@ -4307,8 +4855,10 @@ class HPXML < Object
4307
4855
  class ClothesWasher < BaseElement
4308
4856
  ATTRS = [:id, :location, :modified_energy_factor, :integrated_modified_energy_factor,
4309
4857
  :rated_annual_kwh, :label_electric_rate, :label_gas_rate, :label_annual_gas_cost,
4310
- :capacity, :label_usage, :usage_multiplier, :is_shared_appliance,
4311
- :number_of_units, :number_of_units_served, :water_heating_system_idref]
4858
+ :capacity, :label_usage, :usage_multiplier, :is_shared_appliance, :number_of_units,
4859
+ :number_of_units_served, :water_heating_system_idref, :weekday_fractions,
4860
+ :weekend_fractions, :monthly_multipliers]
4861
+
4312
4862
  attr_accessor(*ATTRS)
4313
4863
 
4314
4864
  def water_heating_system
@@ -4356,6 +4906,9 @@ class HPXML < Object
4356
4906
  XMLHelper.add_element(clothes_washer, 'LabelUsage', @label_usage, :float, @label_usage_isdefaulted) unless @label_usage.nil?
4357
4907
  XMLHelper.add_element(clothes_washer, 'Capacity', @capacity, :float, @capacity_isdefaulted) unless @capacity.nil?
4358
4908
  XMLHelper.add_extension(clothes_washer, 'UsageMultiplier', @usage_multiplier, :float, @usage_multiplier_isdefaulted) unless @usage_multiplier.nil?
4909
+ XMLHelper.add_extension(clothes_washer, 'WeekdayScheduleFractions', @weekday_fractions, :string, @weekday_fractions_isdefaulted) unless @weekday_fractions.nil?
4910
+ XMLHelper.add_extension(clothes_washer, 'WeekendScheduleFractions', @weekend_fractions, :string, @weekend_fractions_isdefaulted) unless @weekend_fractions.nil?
4911
+ XMLHelper.add_extension(clothes_washer, 'MonthlyScheduleMultipliers', @monthly_multipliers, :string, @monthly_multipliers_isdefaulted) unless @monthly_multipliers.nil?
4359
4912
  end
4360
4913
 
4361
4914
  def from_oga(clothes_washer)
@@ -4376,6 +4929,9 @@ class HPXML < Object
4376
4929
  @label_usage = XMLHelper.get_value(clothes_washer, 'LabelUsage', :float)
4377
4930
  @capacity = XMLHelper.get_value(clothes_washer, 'Capacity', :float)
4378
4931
  @usage_multiplier = XMLHelper.get_value(clothes_washer, 'extension/UsageMultiplier', :float)
4932
+ @weekday_fractions = XMLHelper.get_value(clothes_washer, 'extension/WeekdayScheduleFractions', :string)
4933
+ @weekend_fractions = XMLHelper.get_value(clothes_washer, 'extension/WeekendScheduleFractions', :string)
4934
+ @monthly_multipliers = XMLHelper.get_value(clothes_washer, 'extension/MonthlyScheduleMultipliers', :string)
4379
4935
  end
4380
4936
  end
4381
4937
 
@@ -4396,7 +4952,8 @@ class HPXML < Object
4396
4952
  class ClothesDryer < BaseElement
4397
4953
  ATTRS = [:id, :location, :fuel_type, :energy_factor, :combined_energy_factor, :control_type,
4398
4954
  :usage_multiplier, :is_shared_appliance, :number_of_units, :number_of_units_served,
4399
- :is_vented, :vented_flow_rate]
4955
+ :is_vented, :vented_flow_rate, :weekday_fractions, :weekend_fractions,
4956
+ :monthly_multipliers]
4400
4957
  attr_accessor(*ATTRS)
4401
4958
 
4402
4959
  def delete
@@ -4423,9 +4980,12 @@ class HPXML < Object
4423
4980
  XMLHelper.add_element(clothes_dryer, 'EnergyFactor', @energy_factor, :float) unless @energy_factor.nil?
4424
4981
  XMLHelper.add_element(clothes_dryer, 'CombinedEnergyFactor', @combined_energy_factor, :float, @combined_energy_factor_isdefaulted) unless @combined_energy_factor.nil?
4425
4982
  XMLHelper.add_element(clothes_dryer, 'ControlType', @control_type, :string, @control_type_isdefaulted) unless @control_type.nil?
4983
+ XMLHelper.add_element(clothes_dryer, 'Vented', @is_vented, :boolean, @is_vented_isdefaulted) unless @is_vented.nil?
4984
+ XMLHelper.add_element(clothes_dryer, 'VentedFlowRate', @vented_flow_rate, :float, @vented_flow_rate_isdefaulted) unless @vented_flow_rate.nil?
4426
4985
  XMLHelper.add_extension(clothes_dryer, 'UsageMultiplier', @usage_multiplier, :float, @usage_multiplier_isdefaulted) unless @usage_multiplier.nil?
4427
- XMLHelper.add_extension(clothes_dryer, 'IsVented', @is_vented, :boolean, @is_vented_isdefaulted) unless @is_vented.nil?
4428
- XMLHelper.add_extension(clothes_dryer, 'VentedFlowRate', @vented_flow_rate, :float, @vented_flow_rate_isdefaulted) unless @vented_flow_rate.nil?
4986
+ XMLHelper.add_extension(clothes_dryer, 'WeekdayScheduleFractions', @weekday_fractions, :string, @weekday_fractions_isdefaulted) unless @weekday_fractions.nil?
4987
+ XMLHelper.add_extension(clothes_dryer, 'WeekendScheduleFractions', @weekend_fractions, :string, @weekend_fractions_isdefaulted) unless @weekend_fractions.nil?
4988
+ XMLHelper.add_extension(clothes_dryer, 'MonthlyScheduleMultipliers', @monthly_multipliers, :string, @monthly_multipliers_isdefaulted) unless @monthly_multipliers.nil?
4429
4989
  end
4430
4990
 
4431
4991
  def from_oga(clothes_dryer)
@@ -4440,9 +5000,12 @@ class HPXML < Object
4440
5000
  @energy_factor = XMLHelper.get_value(clothes_dryer, 'EnergyFactor', :float)
4441
5001
  @combined_energy_factor = XMLHelper.get_value(clothes_dryer, 'CombinedEnergyFactor', :float)
4442
5002
  @control_type = XMLHelper.get_value(clothes_dryer, 'ControlType', :string)
5003
+ @is_vented = XMLHelper.get_value(clothes_dryer, 'Vented', :boolean)
5004
+ @vented_flow_rate = XMLHelper.get_value(clothes_dryer, 'VentedFlowRate', :float)
4443
5005
  @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)
5006
+ @weekday_fractions = XMLHelper.get_value(clothes_dryer, 'extension/WeekdayScheduleFractions', :string)
5007
+ @weekend_fractions = XMLHelper.get_value(clothes_dryer, 'extension/WeekendScheduleFractions', :string)
5008
+ @monthly_multipliers = XMLHelper.get_value(clothes_dryer, 'extension/MonthlyScheduleMultipliers', :string)
4446
5009
  end
4447
5010
  end
4448
5011
 
@@ -4463,7 +5026,8 @@ class HPXML < Object
4463
5026
  class Dishwasher < BaseElement
4464
5027
  ATTRS = [:id, :location, :energy_factor, :rated_annual_kwh, :place_setting_capacity,
4465
5028
  :label_electric_rate, :label_gas_rate, :label_annual_gas_cost,
4466
- :label_usage, :usage_multiplier, :is_shared_appliance, :water_heating_system_idref]
5029
+ :label_usage, :usage_multiplier, :is_shared_appliance, :water_heating_system_idref,
5030
+ :weekday_fractions, :weekend_fractions, :monthly_multipliers]
4467
5031
  attr_accessor(*ATTRS)
4468
5032
 
4469
5033
  def water_heating_system
@@ -4508,6 +5072,9 @@ class HPXML < Object
4508
5072
  XMLHelper.add_element(dishwasher, 'LabelAnnualGasCost', @label_annual_gas_cost, :float, @label_annual_gas_cost_isdefaulted) unless @label_annual_gas_cost.nil?
4509
5073
  XMLHelper.add_element(dishwasher, 'LabelUsage', @label_usage, :float, @label_usage_isdefaulted) unless @label_usage.nil?
4510
5074
  XMLHelper.add_extension(dishwasher, 'UsageMultiplier', @usage_multiplier, :float, @usage_multiplier_isdefaulted) unless @usage_multiplier.nil?
5075
+ XMLHelper.add_extension(dishwasher, 'WeekdayScheduleFractions', @weekday_fractions, :string, @weekday_fractions_isdefaulted) unless @weekday_fractions.nil?
5076
+ XMLHelper.add_extension(dishwasher, 'WeekendScheduleFractions', @weekend_fractions, :string, @weekend_fractions_isdefaulted) unless @weekend_fractions.nil?
5077
+ XMLHelper.add_extension(dishwasher, 'MonthlyScheduleMultipliers', @monthly_multipliers, :string, @monthly_multipliers_isdefaulted) unless @monthly_multipliers.nil?
4511
5078
  end
4512
5079
 
4513
5080
  def from_oga(dishwasher)
@@ -4525,6 +5092,9 @@ class HPXML < Object
4525
5092
  @label_annual_gas_cost = XMLHelper.get_value(dishwasher, 'LabelAnnualGasCost', :float)
4526
5093
  @label_usage = XMLHelper.get_value(dishwasher, 'LabelUsage', :float)
4527
5094
  @usage_multiplier = XMLHelper.get_value(dishwasher, 'extension/UsageMultiplier', :float)
5095
+ @weekday_fractions = XMLHelper.get_value(dishwasher, 'extension/WeekdayScheduleFractions', :string)
5096
+ @weekend_fractions = XMLHelper.get_value(dishwasher, 'extension/WeekendScheduleFractions', :string)
5097
+ @monthly_multipliers = XMLHelper.get_value(dishwasher, 'extension/MonthlyScheduleMultipliers', :string)
4528
5098
  end
4529
5099
  end
4530
5100
 
@@ -4543,7 +5113,7 @@ class HPXML < Object
4543
5113
  end
4544
5114
 
4545
5115
  class Refrigerator < BaseElement
4546
- ATTRS = [:id, :location, :rated_annual_kwh, :adjusted_annual_kwh, :usage_multiplier, :primary_indicator,
5116
+ ATTRS = [:id, :location, :rated_annual_kwh, :usage_multiplier, :primary_indicator,
4547
5117
  :weekday_fractions, :weekend_fractions, :monthly_multipliers]
4548
5118
  attr_accessor(*ATTRS)
4549
5119
 
@@ -4566,7 +5136,6 @@ class HPXML < Object
4566
5136
  XMLHelper.add_element(refrigerator, 'Location', @location, :string, @location_isdefaulted) unless @location.nil?
4567
5137
  XMLHelper.add_element(refrigerator, 'RatedAnnualkWh', @rated_annual_kwh, :float, @rated_annual_kwh_isdefaulted) unless @rated_annual_kwh.nil?
4568
5138
  XMLHelper.add_element(refrigerator, 'PrimaryIndicator', @primary_indicator, :boolean, @primary_indicator_isdefaulted) unless @primary_indicator.nil?
4569
- XMLHelper.add_extension(refrigerator, 'AdjustedAnnualkWh', @adjusted_annual_kwh, :float) unless @adjusted_annual_kwh.nil?
4570
5139
  XMLHelper.add_extension(refrigerator, 'UsageMultiplier', @usage_multiplier, :float, @usage_multiplier_isdefaulted) unless @usage_multiplier.nil?
4571
5140
  XMLHelper.add_extension(refrigerator, 'WeekdayScheduleFractions', @weekday_fractions, :string, @weekday_fractions_isdefaulted) unless @weekday_fractions.nil?
4572
5141
  XMLHelper.add_extension(refrigerator, 'WeekendScheduleFractions', @weekend_fractions, :string, @weekend_fractions_isdefaulted) unless @weekend_fractions.nil?
@@ -4580,7 +5149,6 @@ class HPXML < Object
4580
5149
  @location = XMLHelper.get_value(refrigerator, 'Location', :string)
4581
5150
  @rated_annual_kwh = XMLHelper.get_value(refrigerator, 'RatedAnnualkWh', :float)
4582
5151
  @primary_indicator = XMLHelper.get_value(refrigerator, 'PrimaryIndicator', :boolean)
4583
- @adjusted_annual_kwh = XMLHelper.get_value(refrigerator, 'extension/AdjustedAnnualkWh', :float)
4584
5152
  @usage_multiplier = XMLHelper.get_value(refrigerator, 'extension/UsageMultiplier', :float)
4585
5153
  @weekday_fractions = XMLHelper.get_value(refrigerator, 'extension/WeekdayScheduleFractions', :string)
4586
5154
  @weekend_fractions = XMLHelper.get_value(refrigerator, 'extension/WeekendScheduleFractions', :string)
@@ -4603,7 +5171,7 @@ class HPXML < Object
4603
5171
  end
4604
5172
 
4605
5173
  class Freezer < BaseElement
4606
- ATTRS = [:id, :location, :rated_annual_kwh, :adjusted_annual_kwh, :usage_multiplier,
5174
+ ATTRS = [:id, :location, :rated_annual_kwh, :usage_multiplier,
4607
5175
  :weekday_fractions, :weekend_fractions, :monthly_multipliers]
4608
5176
  attr_accessor(*ATTRS)
4609
5177
 
@@ -4625,7 +5193,6 @@ class HPXML < Object
4625
5193
  XMLHelper.add_attribute(sys_id, 'id', @id)
4626
5194
  XMLHelper.add_element(freezer, 'Location', @location, :string, @location_isdefaulted) unless @location.nil?
4627
5195
  XMLHelper.add_element(freezer, 'RatedAnnualkWh', @rated_annual_kwh, :float, @rated_annual_kwh_isdefaulted) unless @rated_annual_kwh.nil?
4628
- XMLHelper.add_extension(freezer, 'AdjustedAnnualkWh', @adjusted_annual_kwh, :float) unless @adjusted_annual_kwh.nil?
4629
5196
  XMLHelper.add_extension(freezer, 'UsageMultiplier', @usage_multiplier, :float, @usage_multiplier_isdefaulted) unless @usage_multiplier.nil?
4630
5197
  XMLHelper.add_extension(freezer, 'WeekdayScheduleFractions', @weekday_fractions, :string, @weekday_fractions_isdefaulted) unless @weekday_fractions.nil?
4631
5198
  XMLHelper.add_extension(freezer, 'WeekendScheduleFractions', @weekend_fractions, :string, @weekend_fractions_isdefaulted) unless @weekend_fractions.nil?
@@ -4638,7 +5205,6 @@ class HPXML < Object
4638
5205
  @id = HPXML::get_id(freezer)
4639
5206
  @location = XMLHelper.get_value(freezer, 'Location', :string)
4640
5207
  @rated_annual_kwh = XMLHelper.get_value(freezer, 'RatedAnnualkWh', :float)
4641
- @adjusted_annual_kwh = XMLHelper.get_value(freezer, 'extension/AdjustedAnnualkWh', :float)
4642
5208
  @usage_multiplier = XMLHelper.get_value(freezer, 'extension/UsageMultiplier', :float)
4643
5209
  @weekday_fractions = XMLHelper.get_value(freezer, 'extension/WeekdayScheduleFractions', :string)
4644
5210
  @weekend_fractions = XMLHelper.get_value(freezer, 'extension/WeekendScheduleFractions', :string)
@@ -4893,7 +5459,7 @@ class HPXML < Object
4893
5459
  exterior_holiday_lighting = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Lighting', 'extension', 'ExteriorHolidayLighting'])
4894
5460
  if not @holiday_kwh_per_day.nil?
4895
5461
  holiday_lighting_load = XMLHelper.add_element(exterior_holiday_lighting, 'Load')
4896
- XMLHelper.add_element(holiday_lighting_load, 'Units', 'kWh/day', :string)
5462
+ XMLHelper.add_element(holiday_lighting_load, 'Units', UnitsKwhPerDay, :string)
4897
5463
  XMLHelper.add_element(holiday_lighting_load, 'Value', @holiday_kwh_per_day, :float, @holiday_kwh_per_day_isdefaulted)
4898
5464
  end
4899
5465
  XMLHelper.add_element(exterior_holiday_lighting, 'PeriodBeginMonth', @holiday_period_begin_month, :integer, @holiday_period_begin_month_isdefaulted) unless @holiday_period_begin_month.nil?
@@ -4925,7 +5491,7 @@ class HPXML < Object
4925
5491
  @exterior_monthly_multipliers = XMLHelper.get_value(lighting, 'extension/ExteriorMonthlyScheduleMultipliers', :string)
4926
5492
  if not XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Lighting/extension/ExteriorHolidayLighting').nil?
4927
5493
  @holiday_exists = true
4928
- @holiday_kwh_per_day = XMLHelper.get_value(lighting, 'extension/ExteriorHolidayLighting/Load[Units="kWh/day"]/Value', :float)
5494
+ @holiday_kwh_per_day = XMLHelper.get_value(lighting, "extension/ExteriorHolidayLighting/Load[Units='#{UnitsKwhPerDay}']/Value", :float)
4929
5495
  @holiday_period_begin_month = XMLHelper.get_value(lighting, 'extension/ExteriorHolidayLighting/PeriodBeginMonth', :integer)
4930
5496
  @holiday_period_begin_day = XMLHelper.get_value(lighting, 'extension/ExteriorHolidayLighting/PeriodBeginDayOfMonth', :integer)
4931
5497
  @holiday_period_end_month = XMLHelper.get_value(lighting, 'extension/ExteriorHolidayLighting/PeriodEndMonth', :integer)
@@ -4953,7 +5519,7 @@ class HPXML < Object
4953
5519
  end
4954
5520
 
4955
5521
  class CeilingFan < BaseElement
4956
- ATTRS = [:id, :efficiency, :quantity]
5522
+ ATTRS = [:id, :efficiency, :quantity, :weekday_fractions, :weekend_fractions, :monthly_multipliers]
4957
5523
  attr_accessor(*ATTRS)
4958
5524
 
4959
5525
  def delete
@@ -4978,12 +5544,18 @@ class HPXML < Object
4978
5544
  XMLHelper.add_element(airflow, 'Efficiency', @efficiency, :float, @efficiency_isdefaulted)
4979
5545
  end
4980
5546
  XMLHelper.add_element(ceiling_fan, 'Quantity', @quantity, :integer, @quantity_isdefaulted) unless @quantity.nil?
5547
+ XMLHelper.add_extension(ceiling_fan, 'WeekdayScheduleFractions', @weekday_fractions, :string, @weekday_fractions_isdefaulted) unless @weekday_fractions.nil?
5548
+ XMLHelper.add_extension(ceiling_fan, 'WeekendScheduleFractions', @weekend_fractions, :string, @weekend_fractions_isdefaulted) unless @weekend_fractions.nil?
5549
+ XMLHelper.add_extension(ceiling_fan, 'MonthlyScheduleMultipliers', @monthly_multipliers, :string, @monthly_multipliers_isdefaulted) unless @monthly_multipliers.nil?
4981
5550
  end
4982
5551
 
4983
5552
  def from_oga(ceiling_fan)
4984
5553
  @id = HPXML::get_id(ceiling_fan)
4985
5554
  @efficiency = XMLHelper.get_value(ceiling_fan, "Airflow[FanSpeed='medium']/Efficiency", :float)
4986
5555
  @quantity = XMLHelper.get_value(ceiling_fan, 'Quantity', :integer)
5556
+ @weekday_fractions = XMLHelper.get_value(ceiling_fan, 'extension/WeekdayScheduleFractions', :string)
5557
+ @weekend_fractions = XMLHelper.get_value(ceiling_fan, 'extension/WeekendScheduleFractions', :string)
5558
+ @monthly_multipliers = XMLHelper.get_value(ceiling_fan, 'extension/MonthlyScheduleMultipliers', :string)
4987
5559
  end
4988
5560
  end
4989
5561
 
@@ -5335,11 +5907,11 @@ class HPXML < Object
5335
5907
  XMLHelper.add_attribute(hpxml, 'xmlns', 'http://hpxmlonline.com/2019/10')
5336
5908
  XMLHelper.add_attribute(hpxml, 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')
5337
5909
  XMLHelper.add_attribute(hpxml, 'xsi:schemaLocation', 'http://hpxmlonline.com/2019/10')
5338
- XMLHelper.add_attribute(hpxml, 'schemaVersion', '3.0')
5910
+ XMLHelper.add_attribute(hpxml, 'schemaVersion', Version::HPXML_Version)
5339
5911
  return doc
5340
5912
  end
5341
5913
 
5342
- def collapse_enclosure_surfaces()
5914
+ def collapse_enclosure_surfaces(surf_types_of_interest = nil)
5343
5915
  # Collapses like surfaces into a single surface with, e.g., aggregate surface area.
5344
5916
  # This can significantly speed up performance for HPXML files with lots of individual
5345
5917
  # surfaces (e.g., windows).
@@ -5359,10 +5931,13 @@ class HPXML < Object
5359
5931
  :perimeter_insulation_id,
5360
5932
  :under_slab_insulation_id,
5361
5933
  :area,
5934
+ :length,
5362
5935
  :exposed_perimeter]
5363
5936
 
5364
5937
  # Look for pairs of surfaces that can be collapsed
5365
5938
  surf_types.each do |surf_type, surfaces|
5939
+ next unless surf_types_of_interest.nil? || surf_types_of_interest.include?(surf_type)
5940
+
5366
5941
  for i in 0..surfaces.size - 1
5367
5942
  surf = surfaces[i]
5368
5943
  next if surf.nil?
@@ -5390,6 +5965,9 @@ class HPXML < Object
5390
5965
  if (surf_type == :slabs) && (not surf.exposed_perimeter.nil?) && (not surf2.exposed_perimeter.nil?)
5391
5966
  surf.exposed_perimeter += surf2.exposed_perimeter
5392
5967
  end
5968
+ if (surf_type == :foundation_walls) && (not surf.length.nil?) && (not surf2.length.nil?)
5969
+ surf.length += surf2.length
5970
+ end
5393
5971
 
5394
5972
  # Update subsurface idrefs as appropriate
5395
5973
  (@windows + @doors).each do |subsurf|
@@ -5472,6 +6050,8 @@ class HPXML < Object
5472
6050
  # Check for errors across objects #
5473
6051
  # ------------------------------- #
5474
6052
 
6053
+ # FUTURE: Move these to EPvalidator.xml where possible
6054
+
5475
6055
  # Check for globally unique SystemIdentifier IDs and empty IDs
5476
6056
  sys_ids = {}
5477
6057
  self.class::HPXML_ATTRS.each do |attribute|
@@ -5491,42 +6071,6 @@ class HPXML < Object
5491
6071
  errors << "Duplicate SystemIdentifier IDs detected for '#{sys_id}'." if cnt > 1
5492
6072
  end
5493
6073
 
5494
- # Check sum of HVAC FractionCoolLoadServeds <= 1
5495
- if total_fraction_cool_load_served > 1.01 # Use 1.01 in case of rounding
5496
- errors << "Expected FractionCoolLoadServed to sum to <= 1, but calculated sum is #{total_fraction_cool_load_served.round(2)}."
5497
- end
5498
-
5499
- # Check sum of HVAC FractionHeatLoadServeds <= 1
5500
- if total_fraction_heat_load_served > 1.01 # Use 1.01 in case of rounding
5501
- errors << "Expected FractionHeatLoadServed to sum to <= 1, but calculated sum is #{total_fraction_heat_load_served.round(2)}."
5502
- end
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
-
5510
- # Check sum of HVAC FractionDHWLoadServed == 1
5511
- frac_dhw_load = @water_heating_systems.map { |dhw| dhw.fraction_dhw_load_served.to_f }.sum(0.0)
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
5513
- errors << "Expected FractionDHWLoadServed to sum to 1, but calculated sum is #{frac_dhw_load.round(2)}."
5514
- end
5515
-
5516
- # Check sum of lighting fractions in a location <= 1
5517
- ltg_fracs = {}
5518
- @lighting_groups.each do |lighting_group|
5519
- next if lighting_group.location.nil? || lighting_group.fraction_of_units_in_location.nil?
5520
-
5521
- ltg_fracs[lighting_group.location] = 0 if ltg_fracs[lighting_group.location].nil?
5522
- ltg_fracs[lighting_group.location] += lighting_group.fraction_of_units_in_location
5523
- end
5524
- ltg_fracs.each do |location, sum|
5525
- next if sum <= 1.01 # Use 1.01 in case of rounding
5526
-
5527
- errors << "Sum of fractions of #{location} lighting (#{sum}) is greater than 1."
5528
- end
5529
-
5530
6074
  # Check for HVAC systems referenced by multiple water heating systems
5531
6075
  hvac_systems.each do |hvac_system|
5532
6076
  num_attached = 0
@@ -5601,6 +6145,20 @@ class HPXML < Object
5601
6145
  end
5602
6146
  end
5603
6147
 
6148
+ # Check for correct PrimaryHeatingSystem values across all HVAC systems
6149
+ n_primary_heating = @heating_systems.select { |h| h.primary_system }.size +
6150
+ @heat_pumps.select { |h| h.primary_heating_system }.size
6151
+ if n_primary_heating > 1
6152
+ errors << 'More than one heating system designated as the primary.'
6153
+ end
6154
+
6155
+ # Check for correct PrimaryCoolingSystem values across all HVAC systems
6156
+ n_primary_cooling = @cooling_systems.select { |c| c.primary_system }.size +
6157
+ @heat_pumps.select { |c| c.primary_cooling_system }.size
6158
+ if n_primary_cooling > 1
6159
+ errors << 'More than one cooling system designated as the primary.'
6160
+ end
6161
+
5604
6162
  # Check for at most 1 shared heating system and 1 shared cooling system
5605
6163
  num_htg_shared = 0
5606
6164
  num_clg_shared = 0
@@ -5629,9 +6187,30 @@ class HPXML < Object
5629
6187
  def self.conditioned_locations
5630
6188
  return [HPXML::LocationLivingSpace,
5631
6189
  HPXML::LocationBasementConditioned,
6190
+ HPXML::LocationCrawlspaceConditioned,
5632
6191
  HPXML::LocationOtherHousingUnit]
5633
6192
  end
5634
6193
 
6194
+ def self.conditioned_locations_this_unit
6195
+ return [HPXML::LocationLivingSpace,
6196
+ HPXML::LocationBasementConditioned,
6197
+ HPXML::LocationCrawlspaceConditioned]
6198
+ end
6199
+
6200
+ def self.conditioned_finished_locations
6201
+ return [HPXML::LocationLivingSpace,
6202
+ HPXML::LocationBasementConditioned]
6203
+ end
6204
+
6205
+ def self.conditioned_below_grade_locations
6206
+ return [HPXML::LocationBasementConditioned,
6207
+ HPXML::LocationCrawlspaceConditioned]
6208
+ end
6209
+
6210
+ def self.is_conditioned(surface)
6211
+ return conditioned_locations.include?(surface.interior_adjacent_to)
6212
+ end
6213
+
5635
6214
  def self.is_adiabatic(surface)
5636
6215
  if surface.exterior_adjacent_to == surface.interior_adjacent_to
5637
6216
  # E.g., wall between unit crawlspace and neighboring unit crawlspace
@@ -5662,4 +6241,40 @@ class HPXML < Object
5662
6241
  def self.get_idref(element)
5663
6242
  return XMLHelper.get_attribute_value(element, 'idref')
5664
6243
  end
6244
+
6245
+ def self.check_dates(str, begin_month, begin_day, end_month, end_day)
6246
+ errors = []
6247
+
6248
+ # Check for valid months
6249
+ valid_months = (1..12).to_a
6250
+
6251
+ if not begin_month.nil?
6252
+ if not valid_months.include? begin_month
6253
+ errors << "#{str} Begin Month (#{begin_month}) must be one of: #{valid_months.join(', ')}."
6254
+ end
6255
+ end
6256
+
6257
+ if not end_month.nil?
6258
+ if not valid_months.include? end_month
6259
+ errors << "#{str} End Month (#{end_month}) must be one of: #{valid_months.join(', ')}."
6260
+ end
6261
+ end
6262
+
6263
+ # Check for valid days
6264
+ months_days = { [1, 3, 5, 7, 8, 10, 12] => (1..31).to_a, [4, 6, 9, 11] => (1..30).to_a, [2] => (1..28).to_a }
6265
+ months_days.each do |months, valid_days|
6266
+ if (not begin_day.nil?) && (months.include? begin_month)
6267
+ if not valid_days.include? begin_day
6268
+ errors << "#{str} Begin Day of Month (#{begin_day}) must be one of: #{valid_days.join(', ')}."
6269
+ end
6270
+ end
6271
+ next unless (not end_day.nil?) && (months.include? end_month)
6272
+
6273
+ if not valid_days.include? end_day
6274
+ errors << "#{str} End Day of Month (#{end_day}) must be one of: #{valid_days.join(', ')}."
6275
+ end
6276
+ end
6277
+
6278
+ return errors
6279
+ end
5665
6280
  end