urbanopt-cli 0.6.4 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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