urbanopt-cli 0.6.2 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1061) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +32 -0
  4. data/CMakeLists.txt +23 -23
  5. data/FindOpenStudioSDK.cmake +6 -6
  6. data/Gemfile +5 -5
  7. data/example_files/Gemfile +10 -7
  8. data/example_files/base_workflow_res.osw +10 -0
  9. data/example_files/example_project_combined.json +13 -3
  10. data/example_files/example_project_with_PV.json +751 -0
  11. data/example_files/mappers/Baseline.rb +51 -30
  12. data/example_files/mappers/CreateBar.rb +37 -0
  13. data/example_files/mappers/FlexibleHotWater.rb +69 -0
  14. data/example_files/mappers/Floorspace.rb +30 -0
  15. data/example_files/mappers/HighEfficiency.rb +5 -4
  16. data/example_files/mappers/base_workflow.osw +5 -0
  17. data/example_files/mappers/createbar_workflow.osw +3 -1
  18. data/example_files/mappers/floorspace_workflow.osw +2 -1
  19. data/example_files/measures/BuildResidentialModel/measure.rb +109 -76
  20. data/example_files/osm_building/7.osm +0 -307
  21. data/example_files/osm_building/8.osm +0 -419
  22. data/example_files/osm_building/9.osm +0 -664
  23. data/example_files/reopt/base_assumptions.json +3 -3
  24. data/example_files/reopt/multiPV_assumptions.json +2 -2
  25. data/example_files/residential/enclosure.tsv +102 -102
  26. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +22 -16
  27. data/example_files/resources/hpxml-measures/.gitignore +3 -7
  28. data/example_files/resources/hpxml-measures/.rubocop.yml +67 -8
  29. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1752 -1455
  30. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +3229 -5431
  31. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +386 -553
  32. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +1075 -363
  33. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +212 -0
  34. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +898 -0
  35. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules.rb +109 -188
  36. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_README.md +0 -0
  37. 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
  38. 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
  39. 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
  40. 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
  41. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_config.json +2 -2
  42. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_config.md +0 -0
  43. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_cooking_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_cooking_consumption_dist.csv} +0 -0
  44. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_cooking_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_cooking_duration_dist.csv} +0 -0
  45. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_dishwasher_consumption_dist.csv} +0 -0
  46. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_dishwasher_duration_dist.csv} +0 -0
  47. 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
  48. 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
  49. 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
  50. 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
  51. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_shower_cluster_size_probability.csv +0 -0
  52. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_shower_event_duration_probability.csv +0 -0
  53. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_evening_duration_probability.csv +0 -0
  54. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_midday_duration_probability.csv +0 -0
  55. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_morning_duration_probability.csv +0 -0
  56. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +0 -0
  57. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +0 -0
  58. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +0 -0
  59. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_evening_duration_probability.csv +0 -0
  60. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_midday_duration_probability.csv +0 -0
  61. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_morning_duration_probability.csv +0 -0
  62. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_evening_duration_probability.csv +0 -0
  63. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_midday_duration_probability.csv +0 -0
  64. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_morning_duration_probability.csv +0 -0
  65. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_evening_duration_probability.csv +0 -0
  66. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_midday_duration_probability.csv +0 -0
  67. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_morning_duration_probability.csv +0 -0
  68. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +0 -0
  69. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +0 -0
  70. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +0 -0
  71. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_evening_duration_probability.csv +0 -0
  72. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_midday_duration_probability.csv +0 -0
  73. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_morning_duration_probability.csv +0 -0
  74. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_evening_duration_probability.csv +0 -0
  75. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_midday_duration_probability.csv +0 -0
  76. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_morning_duration_probability.csv +0 -0
  77. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_evening_duration_probability.csv +0 -0
  78. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_midday_duration_probability.csv +0 -0
  79. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_morning_duration_probability.csv +0 -0
  80. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +0 -0
  81. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +0 -0
  82. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +0 -0
  83. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_evening_duration_probability.csv +0 -0
  84. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_midday_duration_probability.csv +0 -0
  85. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_morning_duration_probability.csv +0 -0
  86. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_evening_duration_probability.csv +0 -0
  87. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_midday_duration_probability.csv +0 -0
  88. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_morning_duration_probability.csv +0 -0
  89. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_evening_duration_probability.csv +0 -0
  90. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_midday_duration_probability.csv +0 -0
  91. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_morning_duration_probability.csv +0 -0
  92. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +0 -0
  93. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +0 -0
  94. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +0 -0
  95. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_evening_duration_probability.csv +0 -0
  96. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_midday_duration_probability.csv +0 -0
  97. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_morning_duration_probability.csv +0 -0
  98. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_evening_duration_probability.csv +0 -0
  99. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_midday_duration_probability.csv +0 -0
  100. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_morning_duration_probability.csv +0 -0
  101. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_0.csv +0 -0
  102. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_1.csv +0 -0
  103. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_2.csv +0 -0
  104. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_3.csv +0 -0
  105. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_0.csv +0 -0
  106. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_1.csv +0 -0
  107. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_2.csv +0 -0
  108. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_3.csv +0 -0
  109. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_state_and_monthly_schedule_shift.csv +0 -0
  110. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_evening_duration_probability.csv +0 -0
  111. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_midday_duration_probability.csv +0 -0
  112. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_morning_duration_probability.csv +0 -0
  113. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +0 -0
  114. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +0 -0
  115. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +0 -0
  116. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_evening_duration_probability.csv +0 -0
  117. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_midday_duration_probability.csv +0 -0
  118. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_morning_duration_probability.csv +0 -0
  119. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_evening_duration_probability.csv +0 -0
  120. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_midday_duration_probability.csv +0 -0
  121. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_morning_duration_probability.csv +0 -0
  122. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_evening_duration_probability.csv +0 -0
  123. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_midday_duration_probability.csv +0 -0
  124. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_morning_duration_probability.csv +0 -0
  125. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +0 -0
  126. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +0 -0
  127. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +0 -0
  128. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_evening_duration_probability.csv +0 -0
  129. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_midday_duration_probability.csv +0 -0
  130. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_morning_duration_probability.csv +0 -0
  131. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_evening_duration_probability.csv +0 -0
  132. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_midday_duration_probability.csv +0 -0
  133. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_morning_duration_probability.csv +0 -0
  134. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_evening_duration_probability.csv +0 -0
  135. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_midday_duration_probability.csv +0 -0
  136. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_morning_duration_probability.csv +0 -0
  137. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +0 -0
  138. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +0 -0
  139. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +0 -0
  140. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_evening_duration_probability.csv +0 -0
  141. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_midday_duration_probability.csv +0 -0
  142. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_morning_duration_probability.csv +0 -0
  143. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_evening_duration_probability.csv +0 -0
  144. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_midday_duration_probability.csv +0 -0
  145. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_morning_duration_probability.csv +0 -0
  146. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_evening_duration_probability.csv +0 -0
  147. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_midday_duration_probability.csv +0 -0
  148. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_morning_duration_probability.csv +0 -0
  149. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +0 -0
  150. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +0 -0
  151. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +0 -0
  152. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_evening_duration_probability.csv +0 -0
  153. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_midday_duration_probability.csv +0 -0
  154. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_morning_duration_probability.csv +0 -0
  155. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_evening_duration_probability.csv +0 -0
  156. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_midday_duration_probability.csv +0 -0
  157. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_morning_duration_probability.csv +0 -0
  158. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_0.csv +0 -0
  159. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_1.csv +0 -0
  160. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_2.csv +0 -0
  161. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_3.csv +0 -0
  162. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_0.csv +0 -0
  163. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_1.csv +0 -0
  164. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_2.csv +0 -0
  165. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_3.csv +0 -0
  166. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_state_and_monthly_schedule_shift.csv +0 -0
  167. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +526 -0
  168. data/example_files/resources/hpxml-measures/Changelog.md +84 -8
  169. data/example_files/resources/hpxml-measures/Gemfile +3 -0
  170. data/example_files/resources/hpxml-measures/Gemfile.lock +3 -11
  171. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +387 -387
  172. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +167 -251
  173. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +275 -59
  174. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +471 -247
  175. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXML.xsd +1 -1
  176. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +171 -79
  177. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +155 -78
  178. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +188 -141
  179. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +83 -0
  180. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +99 -11
  181. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +558 -342
  182. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +2 -0
  183. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +64 -72
  184. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +96 -93
  185. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +965 -350
  186. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +887 -216
  187. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +664 -760
  188. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +306 -287
  189. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +20 -29
  190. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +0 -20
  191. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lu_hvac_equipment_efficiency.csv +493 -0
  192. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lu_water_heater_efficiency.csv +157 -0
  193. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +156 -108
  194. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +41 -3
  195. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +14 -2
  196. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +18 -18
  197. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +14 -7
  198. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/smooth.csv +8761 -0
  199. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/stochastic-vacancy.csv +8761 -0
  200. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/stochastic.csv +8761 -0
  201. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +431 -428
  202. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +21 -12
  203. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +3 -3
  204. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +245 -234
  205. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +10 -5
  206. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +19 -8
  207. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +44 -23
  208. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +241 -0
  209. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +1374 -297
  210. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +702 -55
  211. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +0 -1
  212. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +1 -1
  213. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +238 -40
  214. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +2 -2
  215. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +0 -2
  216. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +186 -0
  217. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +955 -176
  218. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +47 -61
  219. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +1 -1
  220. data/example_files/resources/hpxml-measures/LICENSE.md +1 -1
  221. data/example_files/resources/hpxml-measures/README.md +12 -9
  222. data/example_files/resources/hpxml-measures/Rakefile +1 -1
  223. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +448 -0
  224. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +81 -0
  225. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +71 -0
  226. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +232 -0
  227. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +1977 -0
  228. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/measure.xml +682 -31
  229. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/resources/constants.rb +20 -2
  230. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/tests/output_report_test.rb +83 -218
  231. data/example_files/resources/hpxml-measures/docs/source/index.rst +1 -2
  232. data/example_files/resources/hpxml-measures/docs/source/intro.rst +6 -3
  233. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +73 -0
  234. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +915 -494
  235. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +263 -111
  236. data/example_files/resources/hpxml-measures/tasks.rb +3830 -6981
  237. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC-cache.csv +35 -0
  238. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC.epw +8768 -0
  239. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +25 -5
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +102 -91
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +93 -83
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +93 -83
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +93 -83
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +93 -83
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +102 -91
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +103 -97
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +96 -85
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +102 -91
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +102 -91
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +102 -91
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +96 -125
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +119 -104
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +94 -89
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +93 -83
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +104 -95
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +104 -95
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-outside.xml +584 -0
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +99 -68
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +119 -79
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +99 -68
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +99 -68
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +99 -68
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +97 -66
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +97 -66
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +97 -66
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +100 -69
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +100 -69
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +94 -65
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +94 -65
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +94 -65
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +94 -65
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +97 -68
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +94 -65
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +94 -65
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +94 -65
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +97 -68
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +97 -68
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +98 -67
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +96 -64
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +105 -84
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +108 -77
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +100 -69
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +100 -69
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +98 -67
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +97 -66
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +97 -66
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +97 -66
  288. 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
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +124 -114
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +102 -95
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +102 -95
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +102 -95
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +104 -94
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +105 -96
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +102 -95
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +102 -95
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +102 -95
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +104 -95
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +102 -95
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +102 -95
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +102 -95
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +104 -97
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +102 -95
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +104 -95
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +104 -95
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +104 -95
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +102 -95
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +104 -95
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +108 -101
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +96 -85
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +104 -95
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +104 -95
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +104 -95
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +104 -95
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +104 -95
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +106 -97
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +106 -97
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +106 -97
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +106 -97
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +106 -97
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +106 -97
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +104 -95
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +105 -96
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +104 -95
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +574 -0
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +105 -96
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +104 -95
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +104 -95
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +105 -97
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +106 -97
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +106 -97
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +104 -95
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +104 -95
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +104 -95
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +104 -95
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +104 -95
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +104 -95
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +104 -95
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +106 -97
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +106 -97
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +104 -95
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +104 -95
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +131 -119
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +120 -99
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +104 -95
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +104 -95
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +104 -95
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +104 -95
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +131 -118
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +104 -95
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +104 -95
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +104 -95
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +104 -95
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +104 -95
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +579 -0
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +110 -101
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +213 -95
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-id.xml → base-enclosure-skylights-physical-properties.xml} +123 -105
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +114 -105
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +112 -103
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +92 -82
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +533 -547
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +545 -559
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/generator-output-greater-than-consumption.xml → base-enclosure-thermal-mass.xml} +117 -111
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +239 -109
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +88 -79
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +584 -0
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +115 -106
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +89 -79
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +123 -110
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +119 -172
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +104 -95
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +107 -95
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +572 -0
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +119 -128
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +92 -82
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +117 -110
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +106 -91
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +107 -98
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +105 -97
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +108 -98
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +108 -98
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +115 -110
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +101 -94
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +103 -95
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +104 -94
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +104 -94
  388. 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
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +589 -0
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +104 -94
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +104 -94
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +105 -94
  393. 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
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed.xml +106 -93
  395. 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
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed.xml +106 -93
  397. 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
  398. 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
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed.xml +106 -93
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +102 -95
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +103 -94
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +101 -94
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +101 -94
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +101 -94
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +101 -94
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +108 -95
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml +106 -93
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +106 -93
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +99 -92
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +103 -94
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +99 -92
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +102 -95
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +104 -95
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +104 -95
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +101 -94
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +103 -94
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +104 -94
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +105 -94
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-manual-s-oversize-allowances.xml +103 -93
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump.xml +106 -93
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +101 -94
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +104 -94
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +105 -94
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml +103 -93
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted.xml +106 -93
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +541 -0
  427. 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
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/boiler-invalid-afue.xml → base-hvac-autosize-ptac.xml} +109 -113
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp.xml +531 -0
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +99 -92
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +99 -92
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +100 -93
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +104 -95
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +101 -94
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +102 -95
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +103 -94
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +101 -94
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +101 -94
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +101 -94
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +101 -94
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +101 -94
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +101 -94
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +101 -94
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +106 -96
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +104 -95
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +104 -94
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +104 -94
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +104 -94
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +104 -94
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +104 -94
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/unattached-solar-thermal-system.xml → base-hvac-ducts-area-fractions.xml} +596 -577
  452. 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
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +104 -95
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +99 -92
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +103 -94
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +101 -94
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +99 -92
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +99 -92
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +99 -92
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +99 -92
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +101 -94
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +104 -95
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +102 -95
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +104 -95
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +104 -95
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +101 -94
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +103 -94
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +101 -94
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +101 -94
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +101 -94
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +104 -95
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +101 -94
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +102 -94
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +103 -93
  475. 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
  476. 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
  477. 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
  478. 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
  479. 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
  480. 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
  481. 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
  482. 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
  483. 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
  484. 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
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +101 -94
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +99 -92
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +101 -94
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +103 -95
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +104 -94
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +542 -0
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +101 -92
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +124 -100
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +94 -89
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +99 -92
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +104 -95
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +104 -95
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/cfis-with-hydronic-distribution.xml → base-hvac-ptac-with-heating.xml} +530 -532
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/hvac-distribution-return-duct-leakage-missing.xml → base-hvac-ptac.xml} +515 -528
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +531 -0
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +99 -92
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +516 -0
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +99 -92
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +584 -0
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +104 -95
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +99 -92
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +99 -92
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +104 -95
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +104 -95
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +100 -93
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +110 -96
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +586 -0
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +95 -86
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +104 -95
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +108 -98
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-foundation-wall-properties.xml → base-location-capetown-zaf.xml} +134 -127
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +92 -82
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +105 -98
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +104 -95
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +92 -82
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +92 -82
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +92 -82
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +108 -98
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +106 -97
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +106 -97
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +107 -98
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +104 -97
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +107 -98
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +106 -97
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +106 -97
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +105 -96
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +106 -97
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +106 -97
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +106 -97
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +141 -114
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +106 -97
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +105 -96
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +101 -101
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +105 -96
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +157 -112
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +157 -112
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +96 -87
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +108 -99
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +104 -95
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +113 -102
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +318 -291
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +608 -0
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/enclosure-garage-missing-roof-ceiling.xml → base-pv-battery-garage.xml} +678 -626
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/multifamily-reference-surface.xml → base-pv-battery-outside-degrades.xml} +610 -575
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-outside.xml +608 -0
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +105 -96
  551. 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
  552. 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
  553. 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
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-lighting-detailed.xml → base-schedules-simple.xml} +625 -585
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +104 -95
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +104 -95
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +104 -95
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +104 -95
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +104 -95
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +104 -95
  561. data/example_files/resources/hpxml-measures/workflow/template-build-hpxml-and-stocastic-schedules.osw +129 -0
  562. data/example_files/resources/hpxml-measures/workflow/template-stochastic-schedules.osw +53 -0
  563. data/example_files/resources/hpxml-measures/workflow/template.osw +7 -2
  564. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +75 -44
  565. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +75 -44
  566. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +75 -44
  567. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +75 -44
  568. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +75 -44
  569. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +75 -44
  570. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +75 -44
  571. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +75 -44
  572. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +63 -32
  573. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +63 -32
  574. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +66 -35
  575. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +66 -35
  576. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +66 -35
  577. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +66 -35
  578. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +69 -38
  579. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +69 -38
  580. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +75 -44
  581. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +75 -44
  582. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +75 -44
  583. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +75 -44
  584. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +75 -44
  585. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +75 -44
  586. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +78 -47
  587. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +78 -47
  588. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +114 -103
  589. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +126 -103
  590. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +321 -294
  591. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +26 -26
  592. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +320 -293
  593. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +351 -0
  594. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +253 -260
  595. data/example_files/visualization/input_visualization_feature.html +14 -5
  596. data/example_files/visualization/input_visualization_scenario.html +12 -6
  597. data/example_files/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.ddy +17 -17
  598. data/lib/uo_cli/version.rb +1 -1
  599. data/lib/uo_cli.rb +66 -17
  600. data/uo_cli.gemspec +6 -6
  601. metadata +219 -639
  602. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -59
  603. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +0 -337
  604. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-portable.osw +0 -337
  605. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-whole-home.osw +0 -337
  606. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +0 -337
  607. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +0 -337
  608. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +0 -337
  609. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +0 -337
  610. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +0 -337
  611. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +0 -337
  612. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +0 -337
  613. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +0 -337
  614. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +0 -337
  615. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +0 -337
  616. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +0 -337
  617. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-baseboard.osw +0 -341
  618. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-fan-coil.osw +0 -341
  619. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent-preconditioning.osw +0 -348
  620. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent.osw +0 -342
  621. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +0 -341
  622. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +0 -341
  623. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +0 -341
  624. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-single-family-attached.osw +0 -339
  625. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +0 -337
  626. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +0 -337
  627. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +0 -337
  628. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +0 -337
  629. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +0 -337
  630. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +0 -337
  631. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +0 -337
  632. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +0 -337
  633. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +0 -337
  634. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +0 -337
  635. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +0 -337
  636. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +0 -337
  637. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +0 -337
  638. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +0 -337
  639. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +0 -337
  640. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +0 -337
  641. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +0 -337
  642. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +0 -337
  643. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +0 -337
  644. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +0 -337
  645. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +0 -337
  646. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +0 -337
  647. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +0 -337
  648. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +0 -337
  649. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +0 -337
  650. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +0 -338
  651. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +0 -337
  652. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +0 -338
  653. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +0 -337
  654. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +0 -337
  655. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +0 -338
  656. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +0 -337
  657. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +0 -337
  658. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +0 -337
  659. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +0 -337
  660. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +0 -337
  661. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +0 -337
  662. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +0 -337
  663. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +0 -337
  664. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +0 -337
  665. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +0 -337
  666. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +0 -337
  667. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +0 -337
  668. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +0 -337
  669. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +0 -337
  670. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +0 -337
  671. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +0 -337
  672. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +0 -337
  673. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +0 -337
  674. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +0 -337
  675. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +0 -337
  676. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +0 -337
  677. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +0 -337
  678. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +0 -337
  679. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +0 -337
  680. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +0 -337
  681. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +0 -337
  682. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +0 -337
  683. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +0 -337
  684. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +0 -337
  685. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +0 -337
  686. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +0 -338
  687. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +0 -337
  688. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +0 -337
  689. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +0 -337
  690. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +0 -337
  691. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +0 -337
  692. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +0 -337
  693. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +0 -337
  694. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +0 -337
  695. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +0 -337
  696. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +0 -337
  697. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +0 -337
  698. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +0 -337
  699. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +0 -337
  700. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +0 -337
  701. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +0 -337
  702. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +0 -337
  703. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +0 -337
  704. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +0 -337
  705. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +0 -337
  706. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +0 -337
  707. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +0 -338
  708. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +0 -338
  709. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +0 -338
  710. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +0 -338
  711. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +0 -338
  712. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +0 -337
  713. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +0 -337
  714. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +0 -335
  715. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +0 -335
  716. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +0 -335
  717. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +0 -337
  718. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +0 -337
  719. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +0 -337
  720. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +0 -337
  721. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +0 -337
  722. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +0 -337
  723. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +0 -337
  724. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +0 -337
  725. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +0 -337
  726. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +0 -336
  727. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +0 -337
  728. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +0 -337
  729. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +0 -337
  730. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +0 -336
  731. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +0 -336
  732. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +0 -336
  733. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw +0 -339
  734. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +0 -339
  735. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +0 -339
  736. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +0 -339
  737. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +0 -340
  738. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +0 -340
  739. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +0 -340
  740. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +0 -338
  741. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +0 -338
  742. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +0 -338
  743. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +0 -339
  744. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +0 -338
  745. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +0 -340
  746. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +0 -336
  747. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +0 -336
  748. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +0 -337
  749. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +0 -337
  750. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +0 -337
  751. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +0 -337
  752. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +0 -337
  753. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +0 -337
  754. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +0 -337
  755. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +0 -336
  756. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +0 -336
  757. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +0 -337
  758. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +0 -337
  759. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +0 -337
  760. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +0 -337
  761. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +0 -337
  762. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +0 -337
  763. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +0 -337
  764. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +0 -337
  765. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +0 -337
  766. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +0 -337
  767. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +0 -337
  768. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +0 -337
  769. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-honolulu-hi.osw +0 -337
  770. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +0 -337
  771. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +0 -337
  772. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +0 -337
  773. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +0 -337
  774. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +0 -345
  775. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +0 -335
  776. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +0 -337
  777. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +0 -337
  778. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +0 -337
  779. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +0 -337
  780. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +0 -337
  781. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +0 -337
  782. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +0 -337
  783. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +0 -337
  784. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +0 -337
  785. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +0 -324
  786. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +0 -337
  787. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +0 -337
  788. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +0 -337
  789. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +0 -337
  790. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +0 -337
  791. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +0 -337
  792. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic-vacant.osw +0 -341
  793. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +0 -337
  794. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +0 -338
  795. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +0 -338
  796. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +0 -342
  797. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +0 -338
  798. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +0 -341
  799. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +0 -337
  800. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +0 -337
  801. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +0 -337
  802. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +0 -341
  803. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +0 -341
  804. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +0 -341
  805. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +0 -341
  806. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +0 -341
  807. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +0 -341
  808. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +0 -341
  809. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +0 -341
  810. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +0 -341
  811. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +0 -341
  812. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +0 -341
  813. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +0 -341
  814. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +0 -341
  815. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +0 -341
  816. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +0 -341
  817. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +0 -341
  818. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +0 -341
  819. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +0 -341
  820. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +0 -341
  821. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +0 -341
  822. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +0 -341
  823. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +0 -341
  824. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +0 -341
  825. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +0 -341
  826. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +0 -341
  827. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +0 -341
  828. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +0 -341
  829. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +0 -341
  830. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +0 -341
  831. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +0 -341
  832. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +0 -341
  833. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +0 -341
  834. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +0 -341
  835. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +0 -341
  836. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +0 -341
  837. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +0 -341
  838. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +0 -341
  839. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +0 -341
  840. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +0 -341
  841. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +0 -341
  842. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +0 -341
  843. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +0 -341
  844. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +0 -341
  845. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +0 -341
  846. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +0 -341
  847. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +0 -341
  848. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +0 -341
  849. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +0 -341
  850. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +0 -341
  851. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +0 -341
  852. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +0 -341
  853. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +0 -341
  854. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +0 -341
  855. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +0 -341
  856. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +0 -341
  857. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +0 -341
  858. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +0 -341
  859. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +0 -341
  860. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +0 -341
  861. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +0 -341
  862. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +0 -341
  863. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +0 -341
  864. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +0 -341
  865. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +0 -341
  866. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +0 -339
  867. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +0 -339
  868. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-flat.osw +0 -339
  869. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-exterior.osw +0 -339
  870. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +0 -339
  871. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-single-exterior-front.osw +0 -339
  872. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +0 -339
  873. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +0 -339
  874. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +0 -339
  875. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +0 -339
  876. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +0 -339
  877. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement.osw +0 -339
  878. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +0 -339
  879. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +0 -339
  880. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +0 -339
  881. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +0 -339
  882. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +0 -339
  883. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +0 -339
  884. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +0 -337
  885. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +0 -337
  886. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +0 -337
  887. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +0 -337
  888. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +0 -337
  889. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +0 -339
  890. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-hot-tub-heater-with-zero-kwh.osw +0 -337
  891. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-pool-heater-with-zero-kwh.osw +0 -337
  892. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +0 -337
  893. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +0 -338
  894. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +0 -336
  895. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +0 -337
  896. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +0 -337
  897. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heating-system.osw +0 -337
  898. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +0 -337
  899. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heating-system.osw +0 -337
  900. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +0 -337
  901. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +0 -337
  902. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +0 -337
  903. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +0 -337
  904. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +0 -337
  905. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +0 -337
  906. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +0 -337
  907. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +0 -337
  908. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +0 -337
  909. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +0 -337
  910. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +0 -337
  911. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +0 -337
  912. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +0 -337
  913. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +0 -337
  914. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +0 -341
  915. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +0 -341
  916. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +0 -338
  917. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-fuel-loads.osw +0 -337
  918. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +0 -337
  919. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-tv-plug-loads.osw +0 -337
  920. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-vehicle-plug-loads.osw +0 -337
  921. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +0 -337
  922. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +0 -337
  923. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +0 -337
  924. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +0 -337
  925. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +0 -337
  926. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +0 -337
  927. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +0 -337
  928. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +0 -339
  929. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +0 -337
  930. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +0 -337
  931. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +0 -337
  932. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-with-shared-system.osw +0 -337
  933. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +0 -337
  934. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +0 -337
  935. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +0 -337
  936. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +0 -337
  937. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +0 -337
  938. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +0 -337
  939. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +0 -337
  940. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/stochastic.csv +0 -8761
  941. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/user-specified.csv +0 -8761
  942. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/vacant.csv +0 -8761
  943. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_1bed.csv +0 -369
  944. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_2bed.csv +0 -465
  945. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_3bed.csv +0 -611
  946. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_4bed.csv +0 -685
  947. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_5bed.csv +0 -767
  948. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_1bed.csv +0 -637
  949. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_2bed.csv +0 -744
  950. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_3bed.csv +0 -929
  951. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_4bed.csv +0 -1044
  952. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_5bed.csv +0 -1250
  953. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_1bed.csv +0 -754
  954. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_2bed.csv +0 -961
  955. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_3bed.csv +0 -1102
  956. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_4bed.csv +0 -1293
  957. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_5bed.csv +0 -1508
  958. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_1bed.csv +0 -13097
  959. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_2bed.csv +0 -15977
  960. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_3bed.csv +0 -18624
  961. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_4bed.csv +0 -22075
  962. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_5bed.csv +0 -25005
  963. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_max_flows.csv +0 -6
  964. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +0 -2444
  965. data/example_files/resources/hpxml-measures/docs/source/build_residential_hpxml.rst +0 -110
  966. data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +0 -57
  967. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +0 -564
  968. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +0 -564
  969. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +0 -564
  970. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +0 -563
  971. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +0 -563
  972. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +0 -563
  973. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +0 -535
  974. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +0 -535
  975. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +0 -576
  976. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-ef-tank.xml +0 -563
  977. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +0 -564
  978. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +0 -563
  979. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +0 -563
  980. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +0 -563
  981. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +0 -563
  982. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +0 -563
  983. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +0 -563
  984. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +0 -547
  985. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +0 -544
  986. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +0 -547
  987. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +0 -563
  988. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +0 -448
  989. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +0 -614
  990. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +0 -611
  991. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +0 -551
  992. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +0 -473
  993. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +0 -489
  994. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +0 -760
  995. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +0 -759
  996. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +0 -761
  997. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +0 -759
  998. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +0 -563
  999. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +0 -460
  1000. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +0 -560
  1001. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +0 -921
  1002. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +0 -921
  1003. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +0 -547
  1004. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +0 -547
  1005. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +0 -921
  1006. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +0 -569
  1007. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-shared-negative-seer-eq.xml +0 -407
  1008. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +0 -563
  1009. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +0 -563
  1010. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +0 -563
  1011. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +0 -563
  1012. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +0 -570
  1013. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +0 -563
  1014. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +0 -563
  1015. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +0 -466
  1016. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +0 -591
  1017. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +0 -563
  1018. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +0 -565
  1019. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +0 -576
  1020. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +0 -465
  1021. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-conditioned-floors.xml +0 -563
  1022. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +0 -451
  1023. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +0 -551
  1024. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +0 -565
  1025. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +0 -563
  1026. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +0 -473
  1027. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +0 -563
  1028. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +0 -583
  1029. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +0 -563
  1030. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +0 -917
  1031. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +0 -561
  1032. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +0 -563
  1033. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +0 -563
  1034. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +0 -563
  1035. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +0 -1657
  1036. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +0 -1657
  1037. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-cooling-systems.xml +0 -432
  1038. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-heating-systems.xml +0 -434
  1039. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +0 -591
  1040. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +0 -563
  1041. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +0 -563
  1042. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +0 -547
  1043. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +0 -563
  1044. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +0 -569
  1045. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +0 -569
  1046. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +0 -564
  1047. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +0 -527
  1048. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-fraction-one.xml +0 -571
  1049. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +0 -532
  1050. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +0 -566
  1051. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +0 -532
  1052. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +0 -576
  1053. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +0 -563
  1054. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +0 -563
  1055. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +0 -466
  1056. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +0 -466
  1057. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +0 -591
  1058. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +0 -563
  1059. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +0 -563
  1060. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +0 -563
  1061. data/example_files/resources/hpxml-measures/workflow/tests/compare.rb +0 -130
@@ -1,194 +1,160 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class HVAC
4
- def self.apply_central_air_conditioner_furnace(model, runner, cooling_system, heating_system,
5
- remaining_cool_load_frac, remaining_heat_load_frac,
6
- control_zone, hvac_map)
7
-
8
- hvac_map[cooling_system.id] = [] unless cooling_system.nil?
9
- hvac_map[heating_system.id] = [] unless heating_system.nil?
10
- if heating_system.nil?
11
- obj_name = Constants.ObjectNameCentralAirConditioner
12
- elsif cooling_system.nil?
13
- obj_name = Constants.ObjectNameFurnace
14
- else
15
- obj_name = Constants.ObjectNameCentralAirConditionerAndFurnace
16
- end
17
-
18
- if not heating_system.nil?
19
- htg_ap = heating_system.additional_properties
20
- end
4
+ def self.apply_air_source_hvac_systems(model, runner, cooling_system, heating_system,
5
+ sequential_cool_load_fracs, sequential_heat_load_fracs,
6
+ control_zone)
7
+ is_heatpump = false
21
8
  if not cooling_system.nil?
9
+ if cooling_system.is_a? HPXML::HeatPump
10
+ is_heatpump = true
11
+ if cooling_system.heat_pump_type == HPXML::HVACTypeHeatPumpAirToAir
12
+ obj_name = Constants.ObjectNameAirSourceHeatPump
13
+ elsif cooling_system.heat_pump_type == HPXML::HVACTypeHeatPumpMiniSplit
14
+ obj_name = Constants.ObjectNameMiniSplitHeatPump
15
+ elsif cooling_system.heat_pump_type == HPXML::HVACTypeHeatPumpPTHP
16
+ obj_name = Constants.ObjectNamePTHP
17
+ fan_watts_per_cfm = 0.0
18
+ else
19
+ fail "Unexpected heat pump type: #{cooling_system.heat_pump_type}."
20
+ end
21
+ elsif cooling_system.is_a? HPXML::CoolingSystem
22
+ if cooling_system.cooling_system_type == HPXML::HVACTypeCentralAirConditioner
23
+ if heating_system.nil?
24
+ obj_name = Constants.ObjectNameCentralAirConditioner
25
+ else
26
+ obj_name = Constants.ObjectNameCentralAirConditionerAndFurnace
27
+ # error checking for fan power
28
+ if (cooling_system.fan_watts_per_cfm.to_f != heating_system.fan_watts_per_cfm.to_f)
29
+ fail "Fan powers for heating system '#{heating_system.id}' and cooling system '#{cooling_system.id}' are attached to a single distribution system and therefore must be the same."
30
+ end
31
+ end
32
+ elsif cooling_system.cooling_system_type == HPXML::HVACTypeRoomAirConditioner
33
+ obj_name = Constants.ObjectNameRoomAirConditioner
34
+ fan_watts_per_cfm = 0.0
35
+ elsif cooling_system.cooling_system_type == HPXML::HVACTypeMiniSplitAirConditioner
36
+ obj_name = Constants.ObjectNameMiniSplitAirConditioner
37
+ elsif cooling_system.cooling_system_type == HPXML::HVACTypePTAC
38
+ obj_name = Constants.ObjectNamePTAC
39
+ fan_watts_per_cfm = 0.0
40
+ else
41
+ fail "Unexpected cooling system type: #{cooling_system.cooling_system_type}."
42
+ end
43
+ end
22
44
  clg_ap = cooling_system.additional_properties
23
- end
24
-
25
- if not heating_system.nil?
26
- sequential_heat_load_frac = calc_sequential_load_fraction(heating_system.fraction_heat_load_served, remaining_heat_load_frac)
27
- else
28
- sequential_heat_load_frac = 0.0
29
- end
30
- if not cooling_system.nil?
31
- sequential_cool_load_frac = calc_sequential_load_fraction(cooling_system.fraction_cool_load_served, remaining_cool_load_frac)
45
+ num_speeds = clg_ap.num_speeds
46
+ elsif (heating_system.is_a? HPXML::HeatingSystem) && (heating_system.heating_system_type == HPXML::HVACTypeFurnace)
47
+ obj_name = Constants.ObjectNameFurnace
48
+ num_speeds = 1
49
+ elsif (heating_system.is_a? HPXML::HeatingSystem) && (heating_system.heating_system_type == HPXML::HVACTypePTACHeating)
50
+ obj_name = Constants.ObjectNamePTACHeating
51
+ fan_watts_per_cfm = 0.0
52
+ num_speeds = 1
32
53
  else
33
- sequential_cool_load_frac = 0.0
54
+ fail "Unexpected heating system type: #{heating_system.heating_system_type}, expect central air source hvac systems."
34
55
  end
35
56
 
36
- # Cooling Coil
57
+ fan_cfms = []
37
58
  if not cooling_system.nil?
59
+ # Cooling Coil
38
60
  clg_coil = create_dx_cooling_coil(model, obj_name, cooling_system)
39
- hvac_map[cooling_system.id] << clg_coil
61
+
62
+ clg_cfm = cooling_system.cooling_airflow_cfm
63
+ clg_ap.cool_fan_speed_ratios.each do |r|
64
+ fan_cfms << clg_cfm * r
65
+ end
40
66
  end
41
67
 
42
- # Heating Coil
43
68
  if not heating_system.nil?
44
- if heating_system.heating_system_fuel == HPXML::FuelTypeElectricity
45
- htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model)
46
- htg_coil.setEfficiency(heating_system.heating_efficiency_afue)
69
+ htg_ap = heating_system.additional_properties
70
+ htg_cfm = heating_system.heating_airflow_cfm
71
+ if is_heatpump
72
+ supp_max_temp = htg_ap.supp_max_temp
73
+ # Heating Coil
74
+ htg_coil = create_dx_heating_coil(model, obj_name, heating_system)
75
+
76
+ # Supplemental Heating Coil
77
+ htg_supp_coil = create_supp_heating_coil(model, obj_name, heating_system)
78
+ htg_ap.heat_fan_speed_ratios.each do |r|
79
+ fan_cfms << htg_cfm * r
80
+ end
47
81
  else
48
- htg_coil = OpenStudio::Model::CoilHeatingGas.new(model)
49
- htg_coil.setGasBurnerEfficiency(heating_system.heating_efficiency_afue)
50
- htg_coil.setParasiticElectricLoad(0)
51
- htg_coil.setParasiticGasLoad(0)
52
- htg_coil.setFuelType(EPlus.fuel_type(heating_system.heating_system_fuel))
82
+ # Heating Coil
83
+ if heating_system.heating_system_fuel == HPXML::FuelTypeElectricity
84
+ htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model)
85
+ if heating_system.heating_system_type == HPXML::HVACTypePTACHeating
86
+ htg_coil.setEfficiency(heating_system.heating_efficiency_percent)
87
+ else
88
+ htg_coil.setEfficiency(heating_system.heating_efficiency_afue)
89
+ end
90
+ else
91
+ htg_coil = OpenStudio::Model::CoilHeatingGas.new(model)
92
+ htg_coil.setGasBurnerEfficiency(heating_system.heating_efficiency_afue)
93
+ htg_coil.setParasiticElectricLoad(0)
94
+ htg_coil.setParasiticGasLoad(0)
95
+ htg_coil.setFuelType(EPlus.fuel_type(heating_system.heating_system_fuel))
96
+ end
97
+ htg_coil.setNominalCapacity(UnitConversions.convert(heating_system.heating_capacity, 'Btu/hr', 'W'))
98
+ htg_coil.setName(obj_name + ' htg coil')
99
+ htg_coil.additionalProperties.setFeature('HPXML_ID', heating_system.id) # Used by reporting measure
100
+ fan_cfms << htg_cfm
53
101
  end
54
- htg_coil.setNominalCapacity(UnitConversions.convert(heating_system.heating_capacity, 'Btu/hr', 'W'))
55
- htg_coil.setName(obj_name + ' htg coil')
56
- hvac_map[heating_system.id] << htg_coil
57
102
  end
58
103
 
59
104
  # Fan
60
- if (not cooling_system.nil?) && (not heating_system.nil?) && (cooling_system.fan_watts_per_cfm.to_f != heating_system.fan_watts_per_cfm.to_f)
61
- fail "Fan powers for heating system '#{heating_system.id}' and cooling system '#{cooling_system.id}' are attached to a single distribution system and therefore must be the same."
105
+ if fan_watts_per_cfm.nil?
106
+ if (not cooling_system.nil?) && (not cooling_system.fan_watts_per_cfm.nil?)
107
+ fan_watts_per_cfm = cooling_system.fan_watts_per_cfm
108
+ else
109
+ fan_watts_per_cfm = heating_system.fan_watts_per_cfm
110
+ end
62
111
  end
63
-
64
- if (not cooling_system.nil?) && (not cooling_system.fan_watts_per_cfm.nil?)
65
- fan_watts_per_cfm = cooling_system.fan_watts_per_cfm
66
- else
67
- fan_watts_per_cfm = heating_system.fan_watts_per_cfm
112
+ fan = create_supply_fan(model, obj_name, fan_watts_per_cfm, fan_cfms)
113
+ if heating_system.is_a?(HPXML::HeatPump) && (not heating_system.backup_system.nil?) && (not heating_system.backup_heating_switchover_temp.nil?)
114
+ # Disable blower fan power below switchover temperature
115
+ set_fan_power_ems_program(model, fan, htg_ap.hp_min_temp)
68
116
  end
69
- if not cooling_system.nil?
70
- num_speeds = clg_ap.num_speeds
117
+ if (not cooling_system.nil?) && (not heating_system.nil?) && (cooling_system == heating_system)
118
+ disaggregate_fan_or_pump(model, fan, htg_coil, clg_coil, htg_supp_coil, cooling_system.id)
71
119
  else
72
- num_speeds = 1
73
- end
74
- if not heating_system.nil?
75
- htg_cfm = heating_system.heating_airflow_cfm
76
- end
77
- if not cooling_system.nil?
78
- clg_cfm = cooling_system.cooling_airflow_cfm
79
- end
80
- fan_cfm = [htg_cfm.to_f, clg_cfm.to_f].max
81
- if not cooling_system.nil?
82
- fan_cfm *= clg_ap.cool_fan_speed_ratios.max
83
- end
84
- fan = create_supply_fan(model, obj_name, num_speeds, fan_watts_per_cfm, fan_cfm)
85
- if not cooling_system.nil?
86
- hvac_map[cooling_system.id] += disaggregate_fan_or_pump(model, fan, nil, clg_coil, nil)
87
- end
88
- if not heating_system.nil?
89
- hvac_map[heating_system.id] += disaggregate_fan_or_pump(model, fan, htg_coil, nil, nil)
120
+ if not cooling_system.nil?
121
+ disaggregate_fan_or_pump(model, fan, nil, clg_coil, nil, cooling_system.id)
122
+ end
123
+ if not heating_system.nil?
124
+ disaggregate_fan_or_pump(model, fan, htg_coil, nil, htg_supp_coil, heating_system.id)
125
+ end
90
126
  end
91
127
 
92
128
  # Unitary System
93
- air_loop_unitary = create_air_loop_unitary_system(model, obj_name, fan, htg_coil, clg_coil, nil, htg_cfm, clg_cfm)
94
- if not cooling_system.nil?
95
- hvac_map[cooling_system.id] << air_loop_unitary
96
- end
97
- if not heating_system.nil?
98
- hvac_map[heating_system.id] << air_loop_unitary
99
- end
129
+ air_loop_unitary = create_air_loop_unitary_system(model, obj_name, fan, htg_coil, clg_coil, htg_supp_coil, htg_cfm, clg_cfm, supp_max_temp)
100
130
 
101
131
  # Unitary System Performance
102
- if (not cooling_system.nil?) && (num_speeds > 1)
132
+ if num_speeds > 1
103
133
  perf = OpenStudio::Model::UnitarySystemPerformanceMultispeed.new(model)
104
134
  perf.setSingleModeOperation(false)
105
135
  for speed in 1..num_speeds
106
- f = OpenStudio::Model::SupplyAirflowRatioField.fromCoolingRatio(clg_ap.cool_fan_speed_ratios[speed - 1])
136
+ if is_heatpump
137
+ f = OpenStudio::Model::SupplyAirflowRatioField.new(htg_ap.heat_fan_speed_ratios[speed - 1], clg_ap.cool_fan_speed_ratios[speed - 1])
138
+ else
139
+ f = OpenStudio::Model::SupplyAirflowRatioField.fromCoolingRatio(clg_ap.cool_fan_speed_ratios[speed - 1])
140
+ end
107
141
  perf.addSupplyAirflowRatioField(f)
108
142
  end
109
143
  air_loop_unitary.setDesignSpecificationMultispeedObject(perf)
110
144
  end
111
145
 
112
146
  # Air Loop
113
- air_loop = create_air_loop(model, obj_name, air_loop_unitary, control_zone, sequential_heat_load_frac, sequential_cool_load_frac, fan_cfm)
114
- if not cooling_system.nil?
115
- hvac_map[cooling_system.id] << air_loop
116
- end
117
- if not heating_system.nil?
118
- hvac_map[heating_system.id] << air_loop
119
- end
147
+ air_loop = create_air_loop(model, obj_name, air_loop_unitary, control_zone, sequential_heat_load_fracs, sequential_cool_load_fracs, [htg_cfm.to_f, clg_cfm.to_f].max)
120
148
 
121
- # HVAC Installation Quality
122
149
  apply_installation_quality(model, heating_system, cooling_system, air_loop_unitary, htg_coil, clg_coil, control_zone)
123
- end
124
-
125
- def self.apply_room_air_conditioner(model, runner, cooling_system,
126
- remaining_cool_load_frac, control_zone,
127
- hvac_map)
128
150
 
129
- hvac_map[cooling_system.id] = []
130
- obj_name = Constants.ObjectNameRoomAirConditioner
131
- sequential_cool_load_frac = calc_sequential_load_fraction(cooling_system.fraction_cool_load_served, remaining_cool_load_frac)
132
-
133
- clg_ap = cooling_system.additional_properties
134
-
135
- # Performance curves
136
- cool_cap_ft_spec_si = convert_curve_biquadratic(clg_ap.cool_cap_ft_spec[0])
137
- cool_eir_ft_spec_si = convert_curve_biquadratic(clg_ap.cool_eir_ft_spec[0])
138
-
139
- roomac_cap_ft_curve = create_curve_biquadratic(model, cool_cap_ft_spec_si, 'Cool-CAP-fT', 0, 100, 0, 100)
140
- roomac_cap_fff_curve = create_curve_quadratic(model, clg_ap.cool_cap_fflow_spec[0], 'Cool-CAP-fFF', 0, 2, 0, 2)
141
- roomac_eir_ft_curve = create_curve_biquadratic(model, cool_eir_ft_spec_si, 'Cool-EIR-fT', 0, 100, 0, 100)
142
- roomcac_eir_fff_curve = create_curve_quadratic(model, clg_ap.cool_eir_fflow_spec[0], 'Cool-EIR-fFF', 0, 2, 0, 2)
143
- roomac_plf_fplr_curve = create_curve_quadratic(model, clg_ap.cool_plf_fplr_spec[0], 'Cool-PLF-fPLR', 0, 1, 0, 1)
144
-
145
- # Cooling Coil
146
- clg_coil = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model, model.alwaysOnDiscreteSchedule, roomac_cap_ft_curve, roomac_cap_fff_curve, roomac_eir_ft_curve, roomcac_eir_fff_curve, roomac_plf_fplr_curve)
147
- clg_coil.setName(obj_name + ' clg coil')
148
- clg_coil.setRatedSensibleHeatRatio(cooling_system.cooling_shr)
149
- clg_coil.setRatedCOP(UnitConversions.convert(cooling_system.cooling_efficiency_eer, 'Btu/hr', 'W'))
150
- clg_coil.setRatedEvaporatorFanPowerPerVolumeFlowRate(773.3)
151
- clg_coil.setEvaporativeCondenserEffectiveness(0.9)
152
- clg_coil.setMaximumOutdoorDryBulbTemperatureForCrankcaseHeaterOperation(10)
153
- clg_coil.setBasinHeaterSetpointTemperature(2)
154
- clg_coil.setRatedTotalCoolingCapacity(UnitConversions.convert(cooling_system.cooling_capacity, 'Btu/hr', 'W'))
155
- clg_coil.setRatedAirFlowRate(calc_rated_airflow(cooling_system.cooling_capacity, clg_ap.cool_rated_cfm_per_ton[0], 1.0))
156
- hvac_map[cooling_system.id] << clg_coil
157
-
158
- # Fan
159
- clg_cfm = cooling_system.cooling_airflow_cfm
160
- fan = create_supply_fan(model, obj_name, 1, 0.0, clg_cfm) # Fan power included in EER (net COP) above
161
- hvac_map[cooling_system.id] += disaggregate_fan_or_pump(model, fan, nil, clg_coil, nil)
162
-
163
- # Heating Coil (none)
164
- htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, model.alwaysOffDiscreteSchedule())
165
- htg_coil.setNominalCapacity(0.0)
166
- htg_coil.setName(obj_name + ' htg coil')
167
-
168
- # PTAC
169
- ptac = OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner.new(model, model.alwaysOnDiscreteSchedule, fan, htg_coil, clg_coil)
170
- ptac.setName(obj_name)
171
- ptac.setSupplyAirFanOperatingModeSchedule(model.alwaysOffDiscreteSchedule)
172
- ptac.setSupplyAirFlowRateDuringCoolingOperation(UnitConversions.convert(clg_cfm, 'cfm', 'm^3/s'))
173
- ptac.setSupplyAirFlowRateDuringHeatingOperation(0.00001)
174
- ptac.setSupplyAirFlowRateWhenNoCoolingorHeatingisNeeded(0.0)
175
- ptac.setOutdoorAirFlowRateDuringCoolingOperation(0.0)
176
- ptac.setOutdoorAirFlowRateDuringHeatingOperation(0.0)
177
- ptac.setOutdoorAirFlowRateWhenNoCoolingorHeatingisNeeded(0.0)
178
- ptac.addToThermalZone(control_zone)
179
- hvac_map[cooling_system.id] << ptac
180
-
181
- control_zone.setSequentialCoolingFractionSchedule(ptac, get_sequential_load_schedule(model, sequential_cool_load_frac))
182
- control_zone.setSequentialHeatingFractionSchedule(ptac, get_sequential_load_schedule(model, 0))
151
+ return air_loop
183
152
  end
184
153
 
185
154
  def self.apply_evaporative_cooler(model, runner, cooling_system,
186
- remaining_cool_load_frac, control_zone,
187
- hvac_map)
155
+ sequential_cool_load_fracs, control_zone)
188
156
 
189
- hvac_map[cooling_system.id] = []
190
157
  obj_name = Constants.ObjectNameEvaporativeCooler
191
- sequential_cool_load_frac = calc_sequential_load_fraction(cooling_system.fraction_cool_load_served, remaining_cool_load_frac)
192
158
 
193
159
  clg_ap = cooling_system.additional_properties
194
160
  clg_cfm = cooling_system.cooling_airflow_cfm
@@ -201,29 +167,16 @@ class HVAC
201
167
  evap_cooler.setEvaporativeOperationMaximumLimitWetbulbTemperature(50) # relax limitation to open evap cooler for any potential cooling
202
168
  evap_cooler.setEvaporativeOperationMaximumLimitDrybulbTemperature(50) # relax limitation to open evap cooler for any potential cooling
203
169
  evap_cooler.setPrimaryAirDesignFlowRate(UnitConversions.convert(clg_cfm, 'cfm', 'm^3/s'))
204
- hvac_map[cooling_system.id] << evap_cooler
170
+ evap_cooler.additionalProperties.setFeature('HPXML_ID', cooling_system.id) # Used by reporting measure
205
171
 
206
172
  # Air Loop
207
- air_loop = create_air_loop(model, obj_name, evap_cooler, control_zone, 0, sequential_cool_load_frac, clg_cfm)
208
- hvac_map[cooling_system.id] << air_loop
173
+ air_loop = create_air_loop(model, obj_name, evap_cooler, control_zone, [0], sequential_cool_load_fracs, clg_cfm)
209
174
 
210
175
  # Fan
211
- # Use VariableVolume object
212
- fan = OpenStudio::Model::FanVariableVolume.new(model, model.alwaysOnDiscreteSchedule)
213
- fan.setName(obj_name + ' supply fan')
214
- fan.setEndUseSubcategory('supply fan')
215
- fan.setMotorEfficiency(1)
216
- fan.setMotorInAirstreamFraction(0)
217
- fan.setFanPowerCoefficient1(0)
218
- fan.setFanPowerCoefficient2(1)
219
- fan.setFanPowerCoefficient3(0)
220
- fan.setFanPowerCoefficient4(0)
221
- fan.setFanPowerCoefficient5(0)
222
- fan.setMaximumFlowRate(UnitConversions.convert(clg_cfm, 'cfm', 'm^3/s'))
223
176
  fan_watts_per_cfm = [2.79 * clg_cfm**-0.29, 0.6].min # W/cfm; fit of efficacy to air flow from the CEC listed equipment
224
- set_fan_power(fan, fan_watts_per_cfm)
177
+ fan = create_supply_fan(model, obj_name, fan_watts_per_cfm, [clg_cfm])
225
178
  fan.addToNode(air_loop.supplyInletNode)
226
- hvac_map[cooling_system.id] += disaggregate_fan_or_pump(model, fan, nil, evap_cooler, nil)
179
+ disaggregate_fan_or_pump(model, fan, nil, evap_cooler, nil, cooling_system.id)
227
180
 
228
181
  # Outdoor air intake system
229
182
  oa_intake_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
@@ -244,169 +197,21 @@ class HVAC
244
197
  evap_stpt_manager.setReferenceTemperatureType('OutdoorAirWetBulb')
245
198
  evap_stpt_manager.setOffsetTemperatureDifference(0.0)
246
199
  evap_stpt_manager.addToNode(air_loop.supplyOutletNode)
247
- end
248
-
249
- def self.apply_central_air_to_air_heat_pump(model, runner, heat_pump,
250
- remaining_heat_load_frac,
251
- remaining_cool_load_frac,
252
- control_zone, hvac_map)
253
-
254
- hvac_map[heat_pump.id] = []
255
- obj_name = Constants.ObjectNameAirSourceHeatPump
256
- sequential_heat_load_frac = calc_sequential_load_fraction(heat_pump.fraction_heat_load_served, remaining_heat_load_frac)
257
- sequential_cool_load_frac = calc_sequential_load_fraction(heat_pump.fraction_cool_load_served, remaining_cool_load_frac)
258
-
259
- hp_ap = heat_pump.additional_properties
260
-
261
- # Cooling Coil
262
- clg_coil = create_dx_cooling_coil(model, obj_name, heat_pump)
263
- hvac_map[heat_pump.id] << clg_coil
264
-
265
- # Heating Coil
266
- htg_coil = create_dx_heating_coil(model, obj_name, heat_pump)
267
- hvac_map[heat_pump.id] << htg_coil
268
-
269
- # Supplemental Heating Coil
270
- htg_supp_coil = create_supp_heating_coil(model, obj_name, heat_pump)
271
- hvac_map[heat_pump.id] << htg_supp_coil
272
-
273
- # Fan
274
- num_speeds = hp_ap.num_speeds
275
- htg_cfm = heat_pump.heating_airflow_cfm
276
- clg_cfm = heat_pump.cooling_airflow_cfm
277
- fan_cfm = hp_ap.cool_fan_speed_ratios.max * [htg_cfm, clg_cfm].max
278
- fan = create_supply_fan(model, obj_name, num_speeds, heat_pump.fan_watts_per_cfm, fan_cfm)
279
- hvac_map[heat_pump.id] += disaggregate_fan_or_pump(model, fan, htg_coil, clg_coil, htg_supp_coil)
280
-
281
- # Unitary System
282
- air_loop_unitary = create_air_loop_unitary_system(model, obj_name, fan, htg_coil, clg_coil, htg_supp_coil, htg_cfm, clg_cfm, hp_ap.supp_max_temp)
283
- hvac_map[heat_pump.id] << air_loop_unitary
284
-
285
- # Unitary System Performance
286
- if num_speeds > 1
287
- perf = OpenStudio::Model::UnitarySystemPerformanceMultispeed.new(model)
288
- perf.setSingleModeOperation(false)
289
- for speed in 1..num_speeds
290
- f = OpenStudio::Model::SupplyAirflowRatioField.new(hp_ap.heat_fan_speed_ratios[speed - 1], hp_ap.cool_fan_speed_ratios[speed - 1])
291
- perf.addSupplyAirflowRatioField(f)
292
- end
293
- air_loop_unitary.setDesignSpecificationMultispeedObject(perf)
294
- end
295
-
296
- # Air Loop
297
- air_loop = create_air_loop(model, obj_name, air_loop_unitary, control_zone, sequential_heat_load_frac, sequential_cool_load_frac, fan_cfm)
298
- hvac_map[heat_pump.id] << air_loop
299
-
300
- # HVAC Installation Quality
301
- apply_installation_quality(model, heat_pump, heat_pump, air_loop_unitary, htg_coil, clg_coil, control_zone)
302
- end
303
-
304
- def self.apply_mini_split_air_conditioner(model, runner, cooling_system,
305
- remaining_cool_load_frac,
306
- control_zone, hvac_map)
307
-
308
- hvac_map[cooling_system.id] = []
309
- obj_name = Constants.ObjectNameMiniSplitAirConditioner
310
- sequential_cool_load_frac = calc_sequential_load_fraction(cooling_system.fraction_cool_load_served, remaining_cool_load_frac)
311
-
312
- clg_ap = cooling_system.additional_properties
313
-
314
- # Cooling Coil
315
- clg_coil = create_dx_cooling_coil(model, obj_name, cooling_system)
316
- hvac_map[cooling_system.id] << clg_coil
317
-
318
- # Fan
319
- num_speeds = clg_ap.num_speeds
320
- clg_cfm = cooling_system.cooling_airflow_cfm
321
- fan = create_supply_fan(model, obj_name, num_speeds, cooling_system.fan_watts_per_cfm, clg_cfm)
322
- hvac_map[cooling_system.id] += disaggregate_fan_or_pump(model, fan, nil, clg_coil, nil)
323
-
324
- # Unitary System
325
- air_loop_unitary = create_air_loop_unitary_system(model, obj_name, fan, nil, clg_coil, nil, nil, clg_cfm)
326
- hvac_map[cooling_system.id] << air_loop_unitary
327
-
328
- # Unitary System Performance
329
- perf = OpenStudio::Model::UnitarySystemPerformanceMultispeed.new(model)
330
- perf.setSingleModeOperation(false)
331
- for i in 0..(num_speeds - 1)
332
- f = OpenStudio::Model::SupplyAirflowRatioField.new(1.0, clg_ap.cool_fan_speed_ratios[i])
333
- perf.addSupplyAirflowRatioField(f)
334
- end
335
- air_loop_unitary.setDesignSpecificationMultispeedObject(perf)
336
-
337
- # Air Loop
338
- air_loop = create_air_loop(model, obj_name, air_loop_unitary, control_zone, 0, sequential_cool_load_frac, clg_cfm)
339
- hvac_map[cooling_system.id] << air_loop
340
-
341
- # HVAC Installation Quality
342
- apply_installation_quality(model, nil, cooling_system, air_loop_unitary, nil, clg_coil, control_zone)
343
- end
344
-
345
- def self.apply_mini_split_heat_pump(model, runner, heat_pump,
346
- remaining_heat_load_frac,
347
- remaining_cool_load_frac,
348
- control_zone, hvac_map)
349
-
350
- hvac_map[heat_pump.id] = []
351
- obj_name = Constants.ObjectNameMiniSplitHeatPump
352
- sequential_heat_load_frac = calc_sequential_load_fraction(heat_pump.fraction_heat_load_served, remaining_heat_load_frac)
353
- sequential_cool_load_frac = calc_sequential_load_fraction(heat_pump.fraction_cool_load_served, remaining_cool_load_frac)
354
200
 
355
- hp_ap = heat_pump.additional_properties
356
-
357
- # Cooling Coil
358
- clg_coil = create_dx_cooling_coil(model, obj_name, heat_pump)
359
- hvac_map[heat_pump.id] << clg_coil
360
-
361
- # Heating Coil
362
- htg_coil = create_dx_heating_coil(model, obj_name, heat_pump)
363
- hvac_map[heat_pump.id] << htg_coil
364
-
365
- # Supplemental Heating Coil
366
- htg_supp_coil = create_supp_heating_coil(model, obj_name, heat_pump)
367
- hvac_map[heat_pump.id] << htg_supp_coil
368
-
369
- # Fan
370
- num_speeds = hp_ap.num_speeds
371
- htg_cfm = heat_pump.heating_airflow_cfm
372
- clg_cfm = heat_pump.cooling_airflow_cfm
373
- fan_cfm = hp_ap.cool_fan_speed_ratios.max * [htg_cfm, clg_cfm].max
374
- fan = create_supply_fan(model, obj_name, num_speeds, heat_pump.fan_watts_per_cfm, fan_cfm)
375
- hvac_map[heat_pump.id] += disaggregate_fan_or_pump(model, fan, htg_coil, clg_coil, htg_supp_coil)
376
-
377
- # Unitary System
378
- air_loop_unitary = create_air_loop_unitary_system(model, obj_name, fan, htg_coil, clg_coil, htg_supp_coil, htg_cfm, clg_cfm, hp_ap.supp_max_temp)
379
- hvac_map[heat_pump.id] << air_loop_unitary
380
-
381
- # Unitary System Performance
382
- perf = OpenStudio::Model::UnitarySystemPerformanceMultispeed.new(model)
383
- perf.setSingleModeOperation(false)
384
- for i in 0..(num_speeds - 1)
385
- f = OpenStudio::Model::SupplyAirflowRatioField.new(hp_ap.heat_fan_speed_ratios[i], hp_ap.cool_fan_speed_ratios[i])
386
- perf.addSupplyAirflowRatioField(f)
387
- end
388
- air_loop_unitary.setDesignSpecificationMultispeedObject(perf)
389
-
390
- # Air Loop
391
- air_loop = create_air_loop(model, obj_name, air_loop_unitary, control_zone, sequential_heat_load_frac, sequential_cool_load_frac, fan_cfm)
392
- hvac_map[heat_pump.id] << air_loop
393
-
394
- # HVAC Installation Quality
395
- apply_installation_quality(model, heat_pump, heat_pump, air_loop_unitary, htg_coil, clg_coil, control_zone)
201
+ return air_loop
396
202
  end
397
203
 
398
204
  def self.apply_ground_to_air_heat_pump(model, runner, weather, heat_pump,
399
- remaining_heat_load_frac, remaining_cool_load_frac,
400
- control_zone, hvac_map)
205
+ sequential_heat_load_fracs, sequential_cool_load_fracs,
206
+ control_zone)
401
207
 
402
- hvac_map[heat_pump.id] = []
403
208
  obj_name = Constants.ObjectNameGroundSourceHeatPump
404
- sequential_heat_load_frac = calc_sequential_load_fraction(heat_pump.fraction_heat_load_served, remaining_heat_load_frac)
405
- sequential_cool_load_frac = calc_sequential_load_fraction(heat_pump.fraction_cool_load_served, remaining_cool_load_frac)
406
209
 
407
210
  hp_ap = heat_pump.additional_properties
408
211
  htg_cfm = heat_pump.heating_airflow_cfm
409
212
  clg_cfm = heat_pump.cooling_airflow_cfm
213
+ htg_cfm_rated = heat_pump.airflow_defect_ratio.nil? ? htg_cfm : (htg_cfm / (1.0 + heat_pump.airflow_defect_ratio))
214
+ clg_cfm_rated = heat_pump.airflow_defect_ratio.nil? ? clg_cfm : (clg_cfm / (1.0 + heat_pump.airflow_defect_ratio))
410
215
 
411
216
  if hp_ap.frac_glycol == 0
412
217
  hp_ap.fluid_type = Constants.FluidWater
@@ -414,34 +219,33 @@ class HVAC
414
219
  end
415
220
 
416
221
  # Cooling Coil
417
- clg_total_cap_curve = create_curve_quad_linear(model, hp_ap.cool_cap_ft_spec[0], obj_name + ' clg total cap curve')
418
- clg_sens_cap_curve = create_curve_quint_linear(model, hp_ap.cool_sh_ft_spec[0], obj_name + ' clg sens cap curve')
419
- clg_power_curve = create_curve_quad_linear(model, hp_ap.cool_power_ft_spec[0], obj_name + ' clg power curve')
222
+ clg_total_cap_curve = create_curve_quad_linear(model, hp_ap.cool_cap_curve_spec[0], obj_name + ' clg total cap curve')
223
+ clg_sens_cap_curve = create_curve_quint_linear(model, hp_ap.cool_sh_curve_spec[0], obj_name + ' clg sens cap curve')
224
+ clg_power_curve = create_curve_quad_linear(model, hp_ap.cool_power_curve_spec[0], obj_name + ' clg power curve')
420
225
  clg_coil = OpenStudio::Model::CoilCoolingWaterToAirHeatPumpEquationFit.new(model, clg_total_cap_curve, clg_sens_cap_curve, clg_power_curve)
421
226
  clg_coil.setName(obj_name + ' clg coil')
422
227
  clg_coil.setRatedCoolingCoefficientofPerformance(1.0 / hp_ap.cool_rated_eirs[0])
423
228
  clg_coil.setNominalTimeforCondensateRemovaltoBegin(1000)
424
229
  clg_coil.setRatioofInitialMoistureEvaporationRateandSteadyStateLatentCapacity(1.5)
425
- clg_coil.setRatedAirFlowRate(UnitConversions.convert(clg_cfm, 'cfm', 'm^3/s'))
230
+ clg_coil.setRatedAirFlowRate(UnitConversions.convert(clg_cfm_rated, 'cfm', 'm^3/s'))
426
231
  clg_coil.setRatedWaterFlowRate(UnitConversions.convert(hp_ap.GSHP_Loop_flow, 'gal/min', 'm^3/s'))
427
232
  clg_coil.setRatedTotalCoolingCapacity(UnitConversions.convert(heat_pump.cooling_capacity, 'Btu/hr', 'W'))
428
233
  clg_coil.setRatedSensibleCoolingCapacity(UnitConversions.convert(hp_ap.cooling_capacity_sensible, 'Btu/hr', 'W'))
429
- hvac_map[heat_pump.id] << clg_coil
234
+ clg_coil.additionalProperties.setFeature('HPXML_ID', heat_pump.id) # Used by reporting measure
430
235
 
431
236
  # Heating Coil
432
- htg_cap_curve = create_curve_quad_linear(model, hp_ap.heat_cap_ft_spec[0], obj_name + ' htg cap curve')
433
- htg_power_curve = create_curve_quad_linear(model, hp_ap.heat_power_ft_spec[0], obj_name + ' htg power curve')
237
+ htg_cap_curve = create_curve_quad_linear(model, hp_ap.heat_cap_curve_spec[0], obj_name + ' htg cap curve')
238
+ htg_power_curve = create_curve_quad_linear(model, hp_ap.heat_power_curve_spec[0], obj_name + ' htg power curve')
434
239
  htg_coil = OpenStudio::Model::CoilHeatingWaterToAirHeatPumpEquationFit.new(model, htg_cap_curve, htg_power_curve)
435
240
  htg_coil.setName(obj_name + ' htg coil')
436
241
  htg_coil.setRatedHeatingCoefficientofPerformance(1.0 / hp_ap.heat_rated_eirs[0])
437
- htg_coil.setRatedAirFlowRate(UnitConversions.convert(htg_cfm, 'cfm', 'm^3/s'))
242
+ htg_coil.setRatedAirFlowRate(UnitConversions.convert(htg_cfm_rated, 'cfm', 'm^3/s'))
438
243
  htg_coil.setRatedWaterFlowRate(UnitConversions.convert(hp_ap.GSHP_Loop_flow, 'gal/min', 'm^3/s'))
439
244
  htg_coil.setRatedHeatingCapacity(UnitConversions.convert(heat_pump.heating_capacity, 'Btu/hr', 'W'))
440
- hvac_map[heat_pump.id] << htg_coil
245
+ htg_coil.additionalProperties.setFeature('HPXML_ID', heat_pump.id) # Used by reporting measure
441
246
 
442
247
  # Supplemental Heating Coil
443
248
  htg_supp_coil = create_supp_heating_coil(model, obj_name, heat_pump)
444
- hvac_map[heat_pump.id] << htg_supp_coil
445
249
 
446
250
  # Ground Heat Exchanger
447
251
  ground_heat_exch_vert = OpenStudio::Model::GroundHeatExchangerVertical.new(model)
@@ -482,7 +286,6 @@ class HVAC
482
286
  plant_loop.addDemandBranchForComponent(htg_coil)
483
287
  plant_loop.addDemandBranchForComponent(clg_coil)
484
288
  plant_loop.setMaximumLoopFlowRate(UnitConversions.convert(hp_ap.GSHP_Loop_flow, 'gal/min', 'm^3/s'))
485
- hvac_map[heat_pump.id] << plant_loop
486
289
 
487
290
  sizing_plant = plant_loop.sizingPlant
488
291
  sizing_plant.setLoopType('Condenser')
@@ -518,8 +321,7 @@ class HVAC
518
321
  pump_w = [pump_w, 1.0].max # prevent error if zero
519
322
  pump.setRatedPowerConsumption(pump_w)
520
323
  pump.setRatedFlowRate(calc_pump_rated_flow_rate(0.75, pump_w, pump.ratedPumpHead))
521
- hvac_map[heat_pump.id] << pump
522
- hvac_map[heat_pump.id] += disaggregate_fan_or_pump(model, pump, htg_coil, clg_coil, htg_supp_coil)
324
+ disaggregate_fan_or_pump(model, pump, htg_coil, clg_coil, htg_supp_coil, heat_pump.id)
523
325
 
524
326
  # Pipes
525
327
  chiller_bypass_pipe = OpenStudio::Model::PipeAdiabatic.new(model)
@@ -534,13 +336,11 @@ class HVAC
534
336
  demand_outlet_pipe.addToNode(plant_loop.demandOutletNode)
535
337
 
536
338
  # Fan
537
- fan_cfm = [htg_cfm, clg_cfm].max
538
- fan = create_supply_fan(model, obj_name, 1, heat_pump.fan_watts_per_cfm, fan_cfm)
539
- hvac_map[heat_pump.id] += disaggregate_fan_or_pump(model, fan, htg_coil, clg_coil, htg_supp_coil)
339
+ fan = create_supply_fan(model, obj_name, heat_pump.fan_watts_per_cfm, [htg_cfm, clg_cfm])
340
+ disaggregate_fan_or_pump(model, fan, htg_coil, clg_coil, htg_supp_coil, heat_pump.id)
540
341
 
541
342
  # Unitary System
542
343
  air_loop_unitary = create_air_loop_unitary_system(model, obj_name, fan, htg_coil, clg_coil, htg_supp_coil, htg_cfm, clg_cfm, 40.0)
543
- hvac_map[heat_pump.id] << air_loop_unitary
544
344
  set_pump_power_ems_program(model, pump_w, pump, air_loop_unitary)
545
345
 
546
346
  if heat_pump.is_shared_system
@@ -561,30 +361,28 @@ class HVAC
561
361
  equip_def.setFractionLost(1)
562
362
  equip.setSchedule(model.alwaysOnDiscreteSchedule)
563
363
  equip.setEndUseSubcategory(equip_def.name.to_s)
564
- hvac_map[heat_pump.id] += disaggregate_fan_or_pump(model, equip, htg_coil, clg_coil, htg_supp_coil)
364
+ disaggregate_fan_or_pump(model, equip, htg_coil, clg_coil, htg_supp_coil, heat_pump.id)
565
365
  end
566
366
 
567
367
  # Air Loop
568
- air_loop = create_air_loop(model, obj_name, air_loop_unitary, control_zone, sequential_heat_load_frac, sequential_cool_load_frac, fan_cfm)
569
- hvac_map[heat_pump.id] << air_loop
368
+ air_loop = create_air_loop(model, obj_name, air_loop_unitary, control_zone, sequential_heat_load_fracs, sequential_cool_load_fracs, [htg_cfm, clg_cfm].max)
570
369
 
571
370
  # HVAC Installation Quality
572
371
  apply_installation_quality(model, heat_pump, heat_pump, air_loop_unitary, htg_coil, clg_coil, control_zone)
372
+
373
+ return air_loop
573
374
  end
574
375
 
575
376
  def self.apply_water_loop_to_air_heat_pump(model, runner, heat_pump,
576
- remaining_heat_load_frac, remaining_cool_load_frac,
577
- control_zone, hvac_map)
377
+ sequential_heat_load_fracs, sequential_cool_load_fracs,
378
+ control_zone)
578
379
  if heat_pump.fraction_cool_load_served > 0
579
380
  # WLHPs connected to chillers or cooling towers should have already been converted to
580
381
  # central air conditioners
581
382
  fail 'WLHP model should only be called for central boilers.'
582
383
  end
583
384
 
584
- hvac_map[heat_pump.id] = []
585
385
  obj_name = Constants.ObjectNameWaterLoopHeatPump
586
- sequential_heat_load_frac = calc_sequential_load_fraction(heat_pump.fraction_heat_load_served, remaining_heat_load_frac)
587
- sequential_cool_load_frac = 0.0
588
386
 
589
387
  hp_ap = heat_pump.additional_properties
590
388
  htg_cfm = heat_pump.heating_airflow_cfm
@@ -602,33 +400,28 @@ class HVAC
602
400
  htg_coil.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(UnitConversions.convert(hp_ap.hp_min_temp, 'F', 'C'))
603
401
  htg_coil.setRatedTotalHeatingCapacity(UnitConversions.convert(heat_pump.heating_capacity, 'Btu/hr', 'W'))
604
402
  htg_coil.setRatedAirFlowRate(htg_cfm)
605
- hvac_map[heat_pump.id] << htg_coil
403
+ htg_coil.additionalProperties.setFeature('HPXML_ID', heat_pump.id) # Used by reporting measure
606
404
 
607
405
  # Supplemental Heating Coil
608
406
  htg_supp_coil = create_supp_heating_coil(model, obj_name, heat_pump)
609
- hvac_map[heat_pump.id] << htg_supp_coil
610
407
 
611
408
  # Fan
612
409
  fan_power_installed = 0.0 # Use provided net COP
613
- fan = create_supply_fan(model, obj_name, 1, fan_power_installed, htg_cfm)
614
- hvac_map[heat_pump.id] += disaggregate_fan_or_pump(model, fan, htg_coil, clg_coil, htg_supp_coil)
410
+ fan = create_supply_fan(model, obj_name, fan_power_installed, [htg_cfm])
411
+ disaggregate_fan_or_pump(model, fan, htg_coil, clg_coil, htg_supp_coil, heat_pump.id)
615
412
 
616
413
  # Unitary System
617
414
  air_loop_unitary = create_air_loop_unitary_system(model, obj_name, fan, htg_coil, clg_coil, htg_supp_coil, htg_cfm, nil, hp_ap.supp_max_temp)
618
- hvac_map[heat_pump.id] << air_loop_unitary
619
415
 
620
416
  # Air Loop
621
- air_loop = create_air_loop(model, obj_name, air_loop_unitary, control_zone, sequential_heat_load_frac, sequential_cool_load_frac, htg_cfm)
622
- hvac_map[heat_pump.id] << air_loop
417
+ air_loop = create_air_loop(model, obj_name, air_loop_unitary, control_zone, sequential_heat_load_fracs, sequential_cool_load_fracs, htg_cfm)
418
+
419
+ return air_loop
623
420
  end
624
421
 
625
422
  def self.apply_boiler(model, runner, heating_system,
626
- remaining_heat_load_frac, control_zone,
627
- hvac_map)
628
-
629
- hvac_map[heating_system.id] = []
423
+ sequential_heat_load_fracs, control_zone)
630
424
  obj_name = Constants.ObjectNameBoiler
631
- sequential_heat_load_frac = calc_sequential_load_fraction(heating_system.fraction_heat_load_served, remaining_heat_load_frac)
632
425
  is_condensing = false # FUTURE: Expose as input; default based on AFUE
633
426
  oat_reset_enabled = false
634
427
  oat_high = nil
@@ -652,7 +445,6 @@ class HVAC
652
445
  plant_loop.setMinimumLoopTemperature(0)
653
446
  plant_loop.setMinimumLoopFlowRate(0)
654
447
  plant_loop.autocalculatePlantLoopVolume()
655
- hvac_map[heating_system.id] << plant_loop
656
448
 
657
449
  loop_sizing = plant_loop.sizingPlant
658
450
  loop_sizing.setLoopType('Heating')
@@ -675,7 +467,6 @@ class HVAC
675
467
  pump.setCoefficient4ofthePartLoadPerformanceCurve(0)
676
468
  pump.setPumpControlType('Intermittent')
677
469
  pump.addToNode(plant_loop.supplyInletNode)
678
- hvac_map[heating_system.id] << pump
679
470
 
680
471
  # Boiler
681
472
  boiler = OpenStudio::Model::BoilerHotWater.new(model)
@@ -708,7 +499,7 @@ class HVAC
708
499
  boiler.setParasiticElectricLoad(0)
709
500
  boiler.setNominalCapacity(UnitConversions.convert(heating_system.heating_capacity, 'Btu/hr', 'W'))
710
501
  plant_loop.addSupplyBranchForComponent(boiler)
711
- hvac_map[heating_system.id] << boiler
502
+ boiler.additionalProperties.setFeature('HPXML_ID', heating_system.id) # Used by reporting measure
712
503
  set_pump_power_ems_program(model, pump_w, pump, boiler)
713
504
 
714
505
  if is_condensing && oat_reset_enabled
@@ -748,7 +539,7 @@ class HVAC
748
539
 
749
540
  if heating_system.distribution_system.air_type.to_s == HPXML::AirTypeFanCoil
750
541
  # Fan
751
- fan = create_supply_fan(model, obj_name, 1, 0.0, fan_cfm) # fan energy included in above pump via Electric Auxiliary Energy (EAE)
542
+ fan = create_supply_fan(model, obj_name, 0.0, [fan_cfm]) # fan energy included in above pump via Electric Auxiliary Energy (EAE)
752
543
 
753
544
  # Heating Coil
754
545
  htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, model.alwaysOnDiscreteSchedule)
@@ -773,6 +564,7 @@ class HVAC
773
564
 
774
565
  # Fan Coil
775
566
  zone_hvac = OpenStudio::Model::ZoneHVACFourPipeFanCoil.new(model, model.alwaysOnDiscreteSchedule, fan, clg_coil, htg_coil)
567
+ zone_hvac.setCapacityControlMethod('CyclingFan')
776
568
  zone_hvac.setName(obj_name + ' fan coil')
777
569
  zone_hvac.setMaximumSupplyAirTemperatureInHeatingMode(UnitConversions.convert(120.0, 'F', 'C'))
778
570
  zone_hvac.setHeatingConvergenceTolerance(0.001)
@@ -783,8 +575,7 @@ class HVAC
783
575
  zone_hvac.setMaximumSupplyAirFlowRate(UnitConversions.convert(fan_cfm, 'cfm', 'm^3/s'))
784
576
  zone_hvac.setMaximumHotWaterFlowRate(max_water_flow)
785
577
  zone_hvac.addToThermalZone(control_zone)
786
- hvac_map[heating_system.id] << zone_hvac
787
- hvac_map[heating_system.id] += disaggregate_fan_or_pump(model, pump, zone_hvac, nil, nil)
578
+ disaggregate_fan_or_pump(model, pump, zone_hvac, nil, nil, heating_system.id)
788
579
  else
789
580
  # Heating Coil
790
581
  htg_coil = OpenStudio::Model::CoilHeatingWaterBaseboard.new(model)
@@ -795,27 +586,24 @@ class HVAC
795
586
  htg_coil.setMaximumWaterFlowRate(max_water_flow)
796
587
  htg_coil.setHeatingDesignCapacityMethod('HeatingDesignCapacity')
797
588
  plant_loop.addDemandBranchForComponent(htg_coil)
798
- hvac_map[heating_system.id] << htg_coil
799
589
 
800
590
  # Baseboard
801
591
  zone_hvac = OpenStudio::Model::ZoneHVACBaseboardConvectiveWater.new(model, model.alwaysOnDiscreteSchedule, htg_coil)
802
592
  zone_hvac.setName(obj_name + ' baseboard')
803
593
  zone_hvac.addToThermalZone(control_zone)
804
- hvac_map[heating_system.id] << zone_hvac
805
- hvac_map[heating_system.id] += disaggregate_fan_or_pump(model, pump, zone_hvac, nil, nil)
594
+ disaggregate_fan_or_pump(model, pump, zone_hvac, nil, nil, heating_system.id)
806
595
  end
807
596
 
808
- control_zone.setSequentialHeatingFractionSchedule(zone_hvac, get_sequential_load_schedule(model, sequential_heat_load_frac))
809
- control_zone.setSequentialCoolingFractionSchedule(zone_hvac, get_sequential_load_schedule(model, 0))
597
+ control_zone.setSequentialHeatingFractionSchedule(zone_hvac, get_sequential_load_schedule(model, sequential_heat_load_fracs))
598
+ control_zone.setSequentialCoolingFractionSchedule(zone_hvac, get_sequential_load_schedule(model, [0]))
599
+
600
+ return zone_hvac
810
601
  end
811
602
 
812
603
  def self.apply_electric_baseboard(model, runner, heating_system,
813
- remaining_heat_load_frac, control_zone,
814
- hvac_map)
604
+ sequential_heat_load_fracs, control_zone)
815
605
 
816
- hvac_map[heating_system.id] = []
817
606
  obj_name = Constants.ObjectNameElectricBaseboard
818
- sequential_heat_load_frac = calc_sequential_load_fraction(heating_system.fraction_heat_load_served, remaining_heat_load_frac)
819
607
 
820
608
  # Baseboard
821
609
  zone_hvac = OpenStudio::Model::ZoneHVACBaseboardConvectiveElectric.new(model)
@@ -823,19 +611,16 @@ class HVAC
823
611
  zone_hvac.setEfficiency(heating_system.heating_efficiency_percent)
824
612
  zone_hvac.setNominalCapacity(UnitConversions.convert(heating_system.heating_capacity, 'Btu/hr', 'W'))
825
613
  zone_hvac.addToThermalZone(control_zone)
826
- hvac_map[heating_system.id] << zone_hvac
614
+ zone_hvac.additionalProperties.setFeature('HPXML_ID', heating_system.id) # Used by reporting measure
827
615
 
828
- control_zone.setSequentialHeatingFractionSchedule(zone_hvac, get_sequential_load_schedule(model, sequential_heat_load_frac))
829
- control_zone.setSequentialCoolingFractionSchedule(zone_hvac, get_sequential_load_schedule(model, 0))
616
+ control_zone.setSequentialHeatingFractionSchedule(zone_hvac, get_sequential_load_schedule(model, sequential_heat_load_fracs))
617
+ control_zone.setSequentialCoolingFractionSchedule(zone_hvac, get_sequential_load_schedule(model, [0]))
830
618
  end
831
619
 
832
620
  def self.apply_unit_heater(model, runner, heating_system,
833
- remaining_heat_load_frac, control_zone,
834
- hvac_map)
621
+ sequential_heat_load_fracs, control_zone)
835
622
 
836
- hvac_map[heating_system.id] = []
837
623
  obj_name = Constants.ObjectNameUnitHeater
838
- sequential_heat_load_frac = calc_sequential_load_fraction(heating_system.fraction_heat_load_served, remaining_heat_load_frac)
839
624
 
840
625
  htg_ap = heating_system.additional_properties
841
626
 
@@ -854,26 +639,25 @@ class HVAC
854
639
  end
855
640
  htg_coil.setNominalCapacity(UnitConversions.convert(heating_system.heating_capacity, 'Btu/hr', 'W'))
856
641
  htg_coil.setName(obj_name + ' htg coil')
857
- hvac_map[heating_system.id] << htg_coil
642
+ htg_coil.additionalProperties.setFeature('HPXML_ID', heating_system.id) # Used by reporting measure
858
643
 
859
644
  # Fan
860
645
  htg_cfm = heating_system.heating_airflow_cfm
861
646
  fan_watts_per_cfm = heating_system.fan_watts / htg_cfm
862
- fan = create_supply_fan(model, obj_name, 1, fan_watts_per_cfm, htg_cfm)
863
- hvac_map[heating_system.id] += disaggregate_fan_or_pump(model, fan, htg_coil, nil, nil)
647
+ fan = create_supply_fan(model, obj_name, fan_watts_per_cfm, [htg_cfm])
648
+ disaggregate_fan_or_pump(model, fan, htg_coil, nil, nil, heating_system.id)
864
649
 
865
650
  # Unitary System
866
651
  unitary_system = create_air_loop_unitary_system(model, obj_name, fan, htg_coil, nil, nil, htg_cfm, nil)
867
652
  unitary_system.setControllingZoneorThermostatLocation(control_zone)
868
653
  unitary_system.addToThermalZone(control_zone)
869
- hvac_map[heating_system.id] << unitary_system
870
654
 
871
- control_zone.setSequentialHeatingFractionSchedule(unitary_system, get_sequential_load_schedule(model, sequential_heat_load_frac))
872
- control_zone.setSequentialCoolingFractionSchedule(unitary_system, get_sequential_load_schedule(model, 0))
655
+ control_zone.setSequentialHeatingFractionSchedule(unitary_system, get_sequential_load_schedule(model, sequential_heat_load_fracs))
656
+ control_zone.setSequentialCoolingFractionSchedule(unitary_system, get_sequential_load_schedule(model, [0]))
873
657
  end
874
658
 
875
- def self.apply_ideal_air_loads(model, runner, obj_name, sequential_cool_load_frac,
876
- sequential_heat_load_frac, control_zone)
659
+ def self.apply_ideal_air_loads(model, runner, obj_name, sequential_cool_load_fracs,
660
+ sequential_heat_load_fracs, control_zone)
877
661
 
878
662
  # Ideal Air System
879
663
  ideal_air = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(model)
@@ -882,13 +666,13 @@ class HVAC
882
666
  ideal_air.setMinimumCoolingSupplyAirTemperature(10)
883
667
  ideal_air.setMaximumHeatingSupplyAirHumidityRatio(0.015)
884
668
  ideal_air.setMinimumCoolingSupplyAirHumidityRatio(0.01)
885
- if sequential_heat_load_frac > 0
669
+ if sequential_heat_load_fracs.sum > 0
886
670
  ideal_air.setHeatingLimit('NoLimit')
887
671
  else
888
672
  ideal_air.setHeatingLimit('LimitCapacity')
889
673
  ideal_air.setMaximumSensibleHeatingCapacity(0)
890
674
  end
891
- if sequential_cool_load_frac > 0
675
+ if sequential_cool_load_fracs.sum > 0
892
676
  ideal_air.setCoolingLimit('NoLimit')
893
677
  else
894
678
  ideal_air.setCoolingLimit('LimitCapacity')
@@ -898,13 +682,12 @@ class HVAC
898
682
  ideal_air.setHumidificationControlType('None')
899
683
  ideal_air.addToThermalZone(control_zone)
900
684
 
901
- control_zone.setSequentialCoolingFractionSchedule(ideal_air, get_sequential_load_schedule(model, sequential_cool_load_frac))
902
- control_zone.setSequentialHeatingFractionSchedule(ideal_air, get_sequential_load_schedule(model, sequential_heat_load_frac))
685
+ control_zone.setSequentialCoolingFractionSchedule(ideal_air, get_sequential_load_schedule(model, sequential_cool_load_fracs))
686
+ control_zone.setSequentialHeatingFractionSchedule(ideal_air, get_sequential_load_schedule(model, sequential_heat_load_fracs))
903
687
  end
904
688
 
905
- def self.apply_dehumidifiers(model, runner, dehumidifiers, living_space, hvac_map)
906
- dehumidifier_id = dehumidifiers[0].id # Syncs with SimulationOutputReport, which only looks at first dehumidifier ID
907
- hvac_map[dehumidifier_id] = []
689
+ def self.apply_dehumidifiers(model, runner, dehumidifiers, living_space)
690
+ dehumidifier_id = dehumidifiers[0].id # Syncs with the ReportSimulationOutput measure, which only looks at first dehumidifier ID
908
691
 
909
692
  if dehumidifiers.map { |d| d.rh_setpoint }.uniq.size > 1
910
693
  fail 'All dehumidifiers must have the same setpoint but multiple setpoints were specified.'
@@ -958,10 +741,9 @@ class HVAC
958
741
  zone_hvac.setRatedAirFlowRate(UnitConversions.convert(air_flow_rate, 'cfm', 'm^3/s'))
959
742
  zone_hvac.setMinimumDryBulbTemperatureforDehumidifierOperation(10)
960
743
  zone_hvac.setMaximumDryBulbTemperatureforDehumidifierOperation(40)
961
-
962
744
  zone_hvac.addToThermalZone(control_zone)
745
+ zone_hvac.additionalProperties.setFeature('HPXML_ID', dehumidifier_id) # Used by reporting measure
963
746
 
964
- hvac_map[dehumidifier_id] << zone_hvac
965
747
  if total_fraction_served < 1.0
966
748
  adjust_dehumidifier_load_EMS(total_fraction_served, zone_hvac, model, living_space)
967
749
  end
@@ -969,24 +751,24 @@ class HVAC
969
751
 
970
752
  def self.apply_ceiling_fans(model, runner, weather, ceiling_fan, living_space, schedules_file)
971
753
  obj_name = Constants.ObjectNameCeilingFan
972
- monthly_sch = Schedule.CeilingFanMonthlyMultipliers(weather: weather).split(',').map { |i| i.to_f }
973
- medium_cfm = 3000.0
974
- weekday_sch = Schedule.CeilingFanWeekdayFractions.split(',').map { |i| i.to_f }
975
- weekend_sch = Schedule.CeilingFanWeekendFractions.split(',').map { |i| i.to_f }
976
- hrs_per_day = weekday_sch.sum(0.0)
754
+ medium_cfm = 3000.0 # From ANSI 301-2019
755
+ hrs_per_day = 10.5 # From ANSI 301-2019
977
756
  cfm_per_w = ceiling_fan.efficiency
978
757
  quantity = ceiling_fan.quantity
979
758
  annual_kwh = UnitConversions.convert(quantity * medium_cfm / cfm_per_w * hrs_per_day * 365.0, 'Wh', 'kWh')
980
- annual_kwh *= monthly_sch.sum(0.0) / 12.0
981
-
982
- ceiling_fan_sch = MonthWeekdayWeekendSchedule.new(model, obj_name + ' schedule', weekday_sch, weekend_sch, monthly_sch, Constants.ScheduleTypeLimitsFraction)
983
759
 
984
760
  if not schedules_file.nil?
985
- space_design_level = schedules_file.calc_design_level_from_annual_kwh(col_name: 'ceiling_fan', annual_kwh: annual_kwh)
761
+ annual_kwh *= Schedule.CeilingFanMonthlyMultipliers(weather: weather).split(',').map(&:to_f).sum(0.0) / 12.0
762
+ ceiling_fan_design_level = schedules_file.calc_design_level_from_annual_kwh(col_name: 'ceiling_fan', annual_kwh: annual_kwh)
986
763
  ceiling_fan_sch = schedules_file.create_schedule_file(col_name: 'ceiling_fan')
987
764
  else
988
- space_design_level = ceiling_fan_sch.calcDesignLevelFromDailykWh(annual_kwh / 365.0)
989
- ceiling_fan_sch = ceiling_fan_sch.schedule
765
+ annual_kwh *= ceiling_fan.monthly_multipliers.split(',').map(&:to_f).sum(0.0) / 12.0
766
+ weekday_sch = ceiling_fan.weekday_fractions
767
+ weekend_sch = ceiling_fan.weekend_fractions
768
+ monthly_sch = ceiling_fan.monthly_multipliers
769
+ ceiling_fan_sch_obj = MonthWeekdayWeekendSchedule.new(model, obj_name + ' schedule', weekday_sch, weekend_sch, monthly_sch, Constants.ScheduleTypeLimitsFraction)
770
+ ceiling_fan_design_level = ceiling_fan_sch_obj.calcDesignLevelFromDailykWh(annual_kwh / 365.0)
771
+ ceiling_fan_sch = ceiling_fan_sch_obj.schedule
990
772
  end
991
773
 
992
774
  equip_def = OpenStudio::Model::ElectricEquipmentDefinition.new(model)
@@ -994,7 +776,7 @@ class HVAC
994
776
  equip = OpenStudio::Model::ElectricEquipment.new(equip_def)
995
777
  equip.setName(equip_def.name.to_s)
996
778
  equip.setSpace(living_space)
997
- equip_def.setDesignLevel(space_design_level)
779
+ equip_def.setDesignLevel(ceiling_fan_design_level)
998
780
  equip_def.setFractionRadiant(0.558)
999
781
  equip_def.setFractionLatent(0)
1000
782
  equip_def.setFractionLost(0)
@@ -1002,26 +784,22 @@ class HVAC
1002
784
  equip.setSchedule(ceiling_fan_sch)
1003
785
  end
1004
786
 
1005
- def self.apply_setpoints(model, runner, weather, hvac_control, living_zone, has_ceiling_fan)
1006
- # Assume heating/cooling seasons are year-round
1007
- htg_start_month = 1
1008
- htg_end_month = 12
1009
- clg_start_month = 1
1010
- clg_end_month = 12
787
+ def self.apply_setpoints(model, runner, weather, hvac_control, living_zone, has_ceiling_fan, heating_days, cooling_days, year)
788
+ num_days = Constants.NumDaysInYear(year)
1011
789
 
1012
790
  if hvac_control.weekday_heating_setpoints.nil? || hvac_control.weekend_heating_setpoints.nil?
1013
791
  # Base heating setpoint
1014
792
  htg_setpoint = hvac_control.heating_setpoint_temp
1015
- htg_weekday_setpoints = [[htg_setpoint] * 24] * 12
793
+ htg_weekday_setpoints = [[htg_setpoint] * 24] * num_days
1016
794
 
1017
795
  # Apply heating setback?
1018
796
  htg_setback = hvac_control.heating_setback_temp
1019
797
  if not htg_setback.nil?
1020
798
  htg_setback_hrs_per_week = hvac_control.heating_setback_hours_per_week
1021
799
  htg_setback_start_hr = hvac_control.heating_setback_start_hour
1022
- for m in 1..12
800
+ for d in 1..num_days
1023
801
  for hr in htg_setback_start_hr..htg_setback_start_hr + Integer(htg_setback_hrs_per_week / 7.0) - 1
1024
- htg_weekday_setpoints[m - 1][hr % 24] = htg_setback
802
+ htg_weekday_setpoints[d - 1][hr % 24] = htg_setback
1025
803
  end
1026
804
  end
1027
805
  end
@@ -1029,25 +807,25 @@ class HVAC
1029
807
  else
1030
808
  # 24-hr weekday/weekend heating setpoint schedules
1031
809
  htg_weekday_setpoints = hvac_control.weekday_heating_setpoints.split(',').map { |i| Float(i) }
1032
- htg_weekday_setpoints = [htg_weekday_setpoints] * 12
810
+ htg_weekday_setpoints = [htg_weekday_setpoints] * num_days
1033
811
 
1034
812
  htg_weekend_setpoints = hvac_control.weekend_heating_setpoints.split(',').map { |i| Float(i) }
1035
- htg_weekend_setpoints = [htg_weekend_setpoints] * 12
813
+ htg_weekend_setpoints = [htg_weekend_setpoints] * num_days
1036
814
  end
1037
815
 
1038
816
  if hvac_control.weekday_cooling_setpoints.nil? || hvac_control.weekend_cooling_setpoints.nil?
1039
817
  # Base cooling setpoint
1040
818
  clg_setpoint = hvac_control.cooling_setpoint_temp
1041
- clg_weekday_setpoints = [[clg_setpoint] * 24] * 12
819
+ clg_weekday_setpoints = [[clg_setpoint] * 24] * num_days
1042
820
 
1043
821
  # Apply cooling setup?
1044
822
  clg_setup = hvac_control.cooling_setup_temp
1045
823
  if not clg_setup.nil?
1046
824
  clg_setup_hrs_per_week = hvac_control.cooling_setup_hours_per_week
1047
825
  clg_setup_start_hr = hvac_control.cooling_setup_start_hour
1048
- for m in 1..12
826
+ for d in 1..num_days
1049
827
  for hr in clg_setup_start_hr..clg_setup_start_hr + Integer(clg_setup_hrs_per_week / 7.0) - 1
1050
- clg_weekday_setpoints[m - 1][hr % 24] = clg_setup
828
+ clg_weekday_setpoints[d - 1][hr % 24] = clg_setup
1051
829
  end
1052
830
  end
1053
831
  end
@@ -1055,60 +833,45 @@ class HVAC
1055
833
  else
1056
834
  # 24-hr weekday/weekend cooling setpoint schedules
1057
835
  clg_weekday_setpoints = hvac_control.weekday_cooling_setpoints.split(',').map { |i| Float(i) }
1058
- clg_weekday_setpoints = [clg_weekday_setpoints] * 12
836
+ clg_weekday_setpoints = [clg_weekday_setpoints] * num_days
1059
837
 
1060
838
  clg_weekend_setpoints = hvac_control.weekend_cooling_setpoints.split(',').map { |i| Float(i) }
1061
- clg_weekend_setpoints = [clg_weekend_setpoints] * 12
839
+ clg_weekend_setpoints = [clg_weekend_setpoints] * num_days
1062
840
  end
1063
841
 
1064
842
  # Apply cooling setpoint offset due to ceiling fan?
1065
843
  if has_ceiling_fan
1066
844
  clg_ceiling_fan_offset = hvac_control.ceiling_fan_cooling_setpoint_temp_offset
1067
845
  if not clg_ceiling_fan_offset.nil?
1068
- get_default_ceiling_fan_months(weather).each_with_index do |operation, m|
1069
- next unless operation == 1
846
+ months = get_default_ceiling_fan_months(weather)
847
+ Schedule.months_to_days(year, months).each_with_index do |operation, d|
848
+ next if operation != 1
1070
849
 
1071
- clg_weekday_setpoints[m] = [clg_weekday_setpoints[m], Array.new(24, clg_ceiling_fan_offset)].transpose.map { |i| i.reduce(:+) }
1072
- clg_weekend_setpoints[m] = [clg_weekend_setpoints[m], Array.new(24, clg_ceiling_fan_offset)].transpose.map { |i| i.reduce(:+) }
850
+ clg_weekday_setpoints[d] = [clg_weekday_setpoints[d], Array.new(24, clg_ceiling_fan_offset)].transpose.map { |i| i.reduce(:+) }
851
+ clg_weekend_setpoints[d] = [clg_weekend_setpoints[d], Array.new(24, clg_ceiling_fan_offset)].transpose.map { |i| i.reduce(:+) }
1073
852
  end
1074
853
  end
1075
854
  end
1076
855
 
1077
- # Create heating season schedule
1078
- if htg_start_month <= htg_end_month
1079
- heating_season = Array.new(htg_start_month - 1, 0) + Array.new(htg_end_month - htg_start_month + 1, 1) + Array.new(12 - htg_end_month, 0)
1080
- else
1081
- heating_season = Array.new(htg_end_month, 1) + Array.new(htg_start_month - htg_end_month - 1, 0) + Array.new(12 - htg_start_month + 1, 1)
1082
- end
1083
- heating_season_sch = MonthWeekdayWeekendSchedule.new(model, Constants.ObjectNameHeatingSeason, Array.new(24, 1), Array.new(24, 1), heating_season, Constants.ScheduleTypeLimitsOnOff, false)
1084
-
1085
- # Create cooling season schedule
1086
- if clg_start_month <= clg_end_month
1087
- cooling_season = Array.new(clg_start_month - 1, 0) + Array.new(clg_end_month - clg_start_month + 1, 1) + Array.new(12 - clg_end_month, 0)
1088
- else
1089
- cooling_season = Array.new(clg_end_month, 1) + Array.new(clg_start_month - clg_end_month - 1, 0) + Array.new(12 - clg_start_month + 1, 1)
1090
- end
1091
- cooling_season_sch = MonthWeekdayWeekendSchedule.new(model, Constants.ObjectNameCoolingSeason, Array.new(24, 1), Array.new(24, 1), cooling_season, Constants.ScheduleTypeLimitsOnOff, false)
1092
-
1093
856
  # Create setpoint schedules
1094
- (0..11).to_a.each do |i|
1095
- if (heating_season[i] == 1) && (cooling_season[i] == 1) # overlap seasons
857
+ (0..(num_days - 1)).to_a.each do |i|
858
+ if (heating_days[i] == 1) && (cooling_days[i] == 1) # overlap seasons
1096
859
  htg_wkdy = htg_weekday_setpoints[i].zip(clg_weekday_setpoints[i]).map { |h, c| c < h ? (h + c) / 2.0 : h }
1097
860
  htg_wked = htg_weekend_setpoints[i].zip(clg_weekend_setpoints[i]).map { |h, c| c < h ? (h + c) / 2.0 : h }
1098
861
  clg_wkdy = htg_weekday_setpoints[i].zip(clg_weekday_setpoints[i]).map { |h, c| c < h ? (h + c) / 2.0 : c }
1099
862
  clg_wked = htg_weekend_setpoints[i].zip(clg_weekend_setpoints[i]).map { |h, c| c < h ? (h + c) / 2.0 : c }
1100
- elsif heating_season[i] == 1 # heating only seasons; cooling has minimum of heating
863
+ elsif heating_days[i] == 1 # heating only seasons; cooling has minimum of heating
1101
864
  htg_wkdy = htg_weekday_setpoints[i].zip(clg_weekday_setpoints[i]).map { |h, c| c < h ? h : h }
1102
865
  htg_wked = htg_weekend_setpoints[i].zip(clg_weekend_setpoints[i]).map { |h, c| c < h ? h : h }
1103
866
  clg_wkdy = htg_weekday_setpoints[i].zip(clg_weekday_setpoints[i]).map { |h, c| c < h ? h : c }
1104
867
  clg_wked = htg_weekend_setpoints[i].zip(clg_weekend_setpoints[i]).map { |h, c| c < h ? h : c }
1105
- elsif cooling_season[i] == 1 # cooling only seasons; heating has maximum of cooling
868
+ elsif cooling_days[i] == 1 # cooling only seasons; heating has maximum of cooling
1106
869
  htg_wkdy = htg_weekday_setpoints[i].zip(clg_weekday_setpoints[i]).map { |h, c| c < h ? c : h }
1107
870
  htg_wked = htg_weekend_setpoints[i].zip(clg_weekend_setpoints[i]).map { |h, c| c < h ? c : h }
1108
871
  clg_wkdy = htg_weekday_setpoints[i].zip(clg_weekday_setpoints[i]).map { |h, c| c < h ? c : c }
1109
872
  clg_wked = htg_weekend_setpoints[i].zip(clg_weekend_setpoints[i]).map { |h, c| c < h ? c : c }
1110
873
  else
1111
- fail 'Unhandled case.'
874
+ fail 'HeatingSeason and CoolingSeason, when combined, must span the entire year.'
1112
875
  end
1113
876
  htg_weekday_setpoints[i] = htg_wkdy
1114
877
  htg_weekend_setpoints[i] = htg_wked
@@ -1119,11 +882,10 @@ class HVAC
1119
882
  htg_weekend_setpoints = htg_weekend_setpoints.map { |i| i.map { |j| UnitConversions.convert(j, 'F', 'C') } }
1120
883
  clg_weekday_setpoints = clg_weekday_setpoints.map { |i| i.map { |j| UnitConversions.convert(j, 'F', 'C') } }
1121
884
  clg_weekend_setpoints = clg_weekend_setpoints.map { |i| i.map { |j| UnitConversions.convert(j, 'F', 'C') } }
1122
- heating_setpoint = HourlyByMonthSchedule.new(model, Constants.ObjectNameHeatingSetpoint, htg_weekday_setpoints, htg_weekend_setpoints, nil, false)
1123
- cooling_setpoint = HourlyByMonthSchedule.new(model, Constants.ObjectNameCoolingSetpoint, clg_weekday_setpoints, clg_weekend_setpoints, nil, false)
885
+ heating_setpoint = HourlyByDaySchedule.new(model, Constants.ObjectNameHeatingSetpoint, htg_weekday_setpoints, htg_weekend_setpoints, nil, false)
886
+ cooling_setpoint = HourlyByDaySchedule.new(model, Constants.ObjectNameCoolingSetpoint, clg_weekday_setpoints, clg_weekend_setpoints, nil, false)
1124
887
 
1125
888
  # Set the setpoint schedules
1126
- thermostat_setpoint = living_zone.thermostatSetpointDualSetpoint
1127
889
  thermostat_setpoint = OpenStudio::Model::ThermostatSetpointDualSetpoint.new(model)
1128
890
  thermostat_setpoint.setName("#{living_zone.name} temperature setpoint")
1129
891
  thermostat_setpoint.setHeatingSetpointTemperatureSchedule(heating_setpoint.schedule)
@@ -1133,12 +895,12 @@ class HVAC
1133
895
 
1134
896
  def self.get_default_heating_setpoint(control_type)
1135
897
  # Per ANSI/RESNET/ICC 301
1136
- htg_sp = 68 # F
898
+ htg_sp = 68.0 # F
1137
899
  htg_setback_sp = nil
1138
900
  htg_setback_hrs_per_week = nil
1139
901
  htg_setback_start_hr = nil
1140
902
  if control_type == HPXML::HVACControlTypeProgrammable
1141
- htg_setback_sp = 66 # F
903
+ htg_setback_sp = 66.0 # F
1142
904
  htg_setback_hrs_per_week = 7 * 7 # 11 p.m. to 5:59 a.m., 7 days a week
1143
905
  htg_setback_start_hr = 23 # 11 p.m.
1144
906
  elsif control_type != HPXML::HVACControlTypeManual
@@ -1149,12 +911,12 @@ class HVAC
1149
911
 
1150
912
  def self.get_default_cooling_setpoint(control_type)
1151
913
  # Per ANSI/RESNET/ICC 301
1152
- clg_sp = 78 # F
914
+ clg_sp = 78.0 # F
1153
915
  clg_setup_sp = nil
1154
916
  clg_setup_hrs_per_week = nil
1155
917
  clg_setup_start_hr = nil
1156
918
  if control_type == HPXML::HVACControlTypeProgrammable
1157
- clg_setup_sp = 80 # F
919
+ clg_setup_sp = 80.0 # F
1158
920
  clg_setup_hrs_per_week = 6 * 7 # 9 a.m. to 2:59 p.m., 7 days a week
1159
921
  clg_setup_start_hr = 9 # 9 a.m.
1160
922
  elsif control_type != HPXML::HVACControlTypeManual
@@ -1163,28 +925,34 @@ class HVAC
1163
925
  return clg_sp, clg_setup_sp, clg_setup_hrs_per_week, clg_setup_start_hr
1164
926
  end
1165
927
 
1166
- def self.set_cool_curves_ashp(heat_pump)
928
+ def self.set_cool_curves_central_air_source(heat_pump, use_eer = false)
1167
929
  hp_ap = heat_pump.additional_properties
1168
930
  if hp_ap.num_speeds == 1
1169
931
  # From "Improved Modeling of Residential Air Conditioners and Heat Pumps for Energy Calculations", Cutler at al
1170
932
  # https://www.nrel.gov/docs/fy13osti/56354.pdf
1171
- hp_ap.cool_rated_airflow_rate = 394.2 # cfm/ton of rated capacity
1172
- hp_ap.cool_capacity_ratios = [1.0]
1173
- hp_ap.cool_fan_speed_ratios = [1.0]
1174
- hp_ap.cool_rated_shrs_net = [heat_pump.cooling_shr]
1175
933
  hp_ap.cool_cap_ft_spec = [[3.68637657, -0.098352478, 0.000956357, 0.005838141, -0.0000127, -0.000131702]]
1176
934
  hp_ap.cool_eir_ft_spec = [[-3.437356399, 0.136656369, -0.001049231, -0.0079378, 0.000185435, -0.0001441]]
1177
- # Single stage systems have PSC or constant torque ECM blowers, so the airflow rate is affected by the static pressure losses.
1178
- hp_ap.cool_cap_fflow_spec = [[0.718664047, 0.41797409, -0.136638137]]
1179
- hp_ap.cool_eir_fflow_spec = [[1.143487507, -0.13943972, -0.004047787]]
1180
- hp_ap.cool_eers = [calc_eer_cooling_1speed(heat_pump.cooling_efficiency_seer, hp_ap.cool_c_d, hp_ap.fan_power_rated, hp_ap.cool_eir_ft_spec)]
935
+ hp_ap.cool_capacity_ratios = [1.0]
936
+ hp_ap.cool_fan_speed_ratios = [1.0]
937
+ if not use_eer
938
+ hp_ap.cool_rated_shrs_net = [heat_pump.cooling_shr]
939
+ hp_ap.cool_rated_airflow_rate = 394.2 # cfm/ton of rated capacity
940
+ # Single stage systems have PSC or constant torque ECM blowers, so the airflow rate is affected by the static pressure losses.
941
+ cap_fflow_spec, eir_fflow_spec = get_airflow_fault_cooling_coeff()
942
+ hp_ap.cool_cap_fflow_spec = [cap_fflow_spec]
943
+ hp_ap.cool_eir_fflow_spec = [eir_fflow_spec]
944
+ hp_ap.cool_eers = [calc_eer_cooling_1speed(heat_pump.cooling_efficiency_seer, hp_ap.cool_c_d, hp_ap.fan_power_rated, hp_ap.cool_eir_ft_spec)]
945
+ else
946
+ hp_ap.cool_cap_fflow_spec = [[1.0, 0.0, 0.0]]
947
+ hp_ap.cool_eir_fflow_spec = [[1.0, 0.0, 0.0]]
948
+ end
1181
949
  elsif hp_ap.num_speeds == 2
1182
950
  # From "Improved Modeling of Residential Air Conditioners and Heat Pumps for Energy Calculations", Cutler at al
1183
951
  # https://www.nrel.gov/docs/fy13osti/56354.pdf
1184
952
  hp_ap.cool_rated_airflow_rate = 344.1 # cfm/ton
1185
953
  hp_ap.cool_capacity_ratios = [0.72, 1.0]
1186
954
  hp_ap.cool_fan_speed_ratios = [0.86, 1.0]
1187
- hp_ap.cool_rated_shrs_net = [heat_pump.cooling_shr - 0.014, heat_pump.cooling_shr] # TODO: is the following assumption correct (revisit Dylan's data?)? OR should value from HPXML be used for both stages?
955
+ hp_ap.cool_rated_shrs_net = [heat_pump.cooling_shr - 0.014, heat_pump.cooling_shr]
1188
956
  hp_ap.cool_cap_ft_spec = [[3.998418659, -0.108728222, 0.001056818, 0.007512314, -0.0000139, -0.000164716],
1189
957
  [3.466810106, -0.091476056, 0.000901205, 0.004163355, -0.00000919, -0.000110829]]
1190
958
  hp_ap.cool_eir_ft_spec = [[-4.282911381, 0.181023691, -0.001357391, -0.026310378, 0.000333282, -0.000197405],
@@ -1225,7 +993,7 @@ class HVAC
1225
993
  end
1226
994
  end
1227
995
 
1228
- def self.set_ashp_htg_curves(heat_pump)
996
+ def self.set_heat_curves_central_air_source(heat_pump, use_cop = false)
1229
997
  hp_ap = heat_pump.additional_properties
1230
998
  if hp_ap.num_speeds == 1
1231
999
  # From "Improved Modeling of Residential Air Conditioners and Heat Pumps for Energy Calculations", Cutler at al
@@ -1234,14 +1002,17 @@ class HVAC
1234
1002
  hp_ap.heat_capacity_ratios = [1.0]
1235
1003
  hp_ap.heat_fan_speed_ratios = [1.0]
1236
1004
  hp_ap.heat_eir_ft_spec = [[0.718398423, 0.003498178, 0.000142202, -0.005724331, 0.00014085, -0.000215321]]
1237
- hp_ap.heat_cap_fflow_spec = [[0.694045465, 0.474207981, -0.168253446]]
1238
- hp_ap.heat_eir_fflow_spec = [[2.185418751, -1.942827919, 0.757409168]]
1005
+ cap_fflow_spec, eir_fflow_spec = get_airflow_fault_heating_coeff()
1006
+ hp_ap.heat_cap_fflow_spec = [cap_fflow_spec]
1007
+ hp_ap.heat_eir_fflow_spec = [eir_fflow_spec]
1239
1008
  if heat_pump.heating_capacity_17F.nil?
1240
1009
  hp_ap.heat_cap_ft_spec = [[0.566333415, -0.000744164, -0.0000103, 0.009414634, 0.0000506, -0.00000675]]
1241
1010
  else
1242
1011
  hp_ap.heat_cap_ft_spec = calc_heat_cap_ft_spec_using_capacity_17F(heat_pump)
1243
1012
  end
1244
- hp_ap.heat_cops = [calc_cop_heating_1speed(heat_pump.heating_efficiency_hspf, hp_ap.heat_c_d, hp_ap.fan_power_rated, hp_ap.heat_eir_ft_spec, hp_ap.heat_cap_ft_spec)]
1013
+ if not use_cop
1014
+ hp_ap.heat_cops = [calc_cop_heating_1speed(heat_pump.heating_efficiency_hspf, hp_ap.heat_c_d, hp_ap.fan_power_rated, hp_ap.heat_eir_ft_spec, hp_ap.heat_cap_ft_spec)]
1015
+ end
1245
1016
  elsif hp_ap.num_speeds == 2
1246
1017
  # From "Improved Modeling of Residential Air Conditioners and Heat Pumps for Energy Calculations", Cutler at al
1247
1018
  # https://www.nrel.gov/docs/fy13osti/56354.pdf
@@ -1284,17 +1055,6 @@ class HVAC
1284
1055
  end
1285
1056
  end
1286
1057
 
1287
- def self.set_cool_curves_room_ac(cooling_system)
1288
- clg_ap = cooling_system.additional_properties
1289
-
1290
- # From "Improved Modeling of Residential Air Conditioners and Heat Pumps for Energy Calculations", Cutler at al
1291
- # https://www.nrel.gov/docs/fy13osti/56354.pdf
1292
- clg_ap.cool_cap_ft_spec = [[3.68637657, -0.098352478, 0.000956357, 0.005838141, -0.0000127, -0.000131702]]
1293
- clg_ap.cool_eir_ft_spec = [[-3.437356399, 0.136656369, -0.001049231, -0.0079378, 0.000185435, -0.0001441]]
1294
- clg_ap.cool_cap_fflow_spec = [[1, 0, 0]]
1295
- clg_ap.cool_eir_fflow_spec = [[1, 0, 0]]
1296
- end
1297
-
1298
1058
  def self.set_cool_curves_mshp(heat_pump, num_speeds)
1299
1059
  hp_ap = heat_pump.additional_properties
1300
1060
 
@@ -1360,9 +1120,9 @@ class HVAC
1360
1120
  # Coefficients generated by catalog data: https://files.climatemaster.com/Genesis-GS-Series-Product-Catalog.pdf, p180
1361
1121
  # Data point taken as rated condition:
1362
1122
  # EWT: 80F EAT:80/67F, AFR: 1200cfm, WFR: 4.5gpm
1363
- hp_ap.cool_cap_ft_spec = [[-1.57177156131221, 4.60343712716819, -2.15976622898044, 0.0590964827802021, 0.0194696644460315]]
1364
- hp_ap.cool_power_ft_spec = [[-4.42471086639888, 0.658017281046304, 4.37331801294626, 0.174096187531254, -0.0526514790164159]]
1365
- hp_ap.cool_sh_ft_spec = [[4.54172823345154, 14.7653304889134, -18.3541272090485, -0.74401391092935, 0.545560799548833, 0.0182620032235494]]
1123
+ hp_ap.cool_cap_curve_spec = [[-1.57177156131221, 4.60343712716819, -2.15976622898044, 0.0590964827802021, 0.0194696644460315]]
1124
+ hp_ap.cool_power_curve_spec = [[-4.42471086639888, 0.658017281046304, 4.37331801294626, 0.174096187531254, -0.0526514790164159]]
1125
+ hp_ap.cool_sh_curve_spec = [[4.54172823345154, 14.7653304889134, -18.3541272090485, -0.74401391092935, 0.545560799548833, 0.0182620032235494]]
1366
1126
  hp_ap.cool_rated_shrs_gross = [heat_pump.cooling_shr]
1367
1127
  # FUTURE: Reconcile these fan/pump adjustments with ANSI/RESNET/ICC 301-2019 Section 4.4.5
1368
1128
  fan_adjust_kw = UnitConversions.convert(400.0, 'Btu/hr', 'ton') * UnitConversions.convert(1.0, 'cfm', 'm^3/s') * 1000.0 * 0.35 * 249.0 / 300.0 # Adjustment per ISO 13256-1 Internal pressure drop across heat pump assumed to be 0.5 in. w.g.
@@ -1373,8 +1133,8 @@ class HVAC
1373
1133
  # E+ equation fit coil coefficients from Tang's thesis:
1374
1134
  # See Appendix B Figure B.3 of https://hvac.okstate.edu/sites/default/files/pubs/theses/MS/27-Tang_Thesis_05.pdf
1375
1135
  # Coefficients generated by catalog data
1376
- hp_ap.heat_cap_ft_spec = [[-5.12650150, -0.93997630, 7.21443206, 0.121065721, 0.051809805]]
1377
- hp_ap.heat_power_ft_spec = [[-7.73235249, 6.43390775, 2.29152262, -0.175598629, 0.005888871]]
1136
+ hp_ap.heat_cap_curve_spec = [[-5.12650150, -0.93997630, 7.21443206, 0.121065721, 0.051809805]]
1137
+ hp_ap.heat_power_curve_spec = [[-7.73235249, 6.43390775, 2.29152262, -0.175598629, 0.005888871]]
1378
1138
  heat_eir = (1.0 - heat_pump.heating_efficiency_cop * (fan_adjust_kw + pump_adjust_kw)) / (heat_pump.heating_efficiency_cop * (1.0 - fan_adjust_kw))
1379
1139
  hp_ap.heat_rated_eirs = [heat_eir]
1380
1140
  end
@@ -1389,6 +1149,8 @@ class HVAC
1389
1149
  elsif seer > 21
1390
1150
  return HPXML::HVACCompressorTypeVariableSpeed
1391
1151
  end
1152
+ elsif [HPXML::HVACTypePTAC, HPXML::HVACTypeHeatPumpPTHP].include? hvac_type
1153
+ return HPXML::HVACCompressorTypeSingleStage
1392
1154
  end
1393
1155
  return
1394
1156
  end
@@ -1419,11 +1181,20 @@ class HVAC
1419
1181
 
1420
1182
  monthly_temps = weather.data.MonthlyAvgDrybulbs
1421
1183
  heat_design_db = weather.design.HeatingDrybulb
1184
+ is_southern_hemisphere = (weather.header.Latitude < 0)
1422
1185
 
1423
1186
  # create basis lists with zero for every month
1424
1187
  cooling_season_temp_basis = Array.new(monthly_temps.length, 0.0)
1425
1188
  heating_season_temp_basis = Array.new(monthly_temps.length, 0.0)
1426
1189
 
1190
+ if is_southern_hemisphere
1191
+ override_heating_months = [6, 7] # July, August
1192
+ override_cooling_months = [0, 11] # December, January
1193
+ else
1194
+ override_heating_months = [0, 11] # December, January
1195
+ override_cooling_months = [6, 7] # July, August
1196
+ end
1197
+
1427
1198
  monthly_temps.each_with_index do |temp, i|
1428
1199
  if temp < 66.0
1429
1200
  heating_season_temp_basis[i] = 1.0
@@ -1431,9 +1202,9 @@ class HVAC
1431
1202
  cooling_season_temp_basis[i] = 1.0
1432
1203
  end
1433
1204
 
1434
- if ((i == 0) || (i == 11)) && (heat_design_db < 59.0)
1205
+ if (override_heating_months.include? i) && (heat_design_db < 59.0)
1435
1206
  heating_season_temp_basis[i] = 1.0
1436
- elsif (i == 6) || (i == 7)
1207
+ elsif override_cooling_months.include? i
1437
1208
  cooling_season_temp_basis[i] = 1.0
1438
1209
  end
1439
1210
  end
@@ -1441,13 +1212,9 @@ class HVAC
1441
1212
  cooling_season = Array.new(monthly_temps.length, 0.0)
1442
1213
  heating_season = Array.new(monthly_temps.length, 0.0)
1443
1214
 
1444
- monthly_temps.each_with_index do |temp, i|
1215
+ for i in 0..11
1445
1216
  # Heating overlaps with cooling at beginning of summer
1446
- if i == 0 # January
1447
- prevmonth = 11 # December
1448
- else
1449
- prevmonth = i - 1
1450
- end
1217
+ prevmonth = i - 1
1451
1218
 
1452
1219
  if ((heating_season_temp_basis[i] == 1.0) || ((cooling_season_temp_basis[prevmonth] == 0.0) && (cooling_season_temp_basis[i] == 1.0)))
1453
1220
  heating_season[i] = 1.0
@@ -1463,7 +1230,7 @@ class HVAC
1463
1230
  end
1464
1231
 
1465
1232
  # Find the first month of cooling and add one month
1466
- (1...12).to_a.each do |i|
1233
+ for i in 0..11
1467
1234
  if cooling_season[i] == 1.0
1468
1235
  cooling_season[i - 1] = 1.0
1469
1236
  break
@@ -1475,6 +1242,39 @@ class HVAC
1475
1242
 
1476
1243
  private
1477
1244
 
1245
+ def self.set_fan_power_ems_program(model, fan, hp_min_temp)
1246
+ # EMS is used to disable the fan power below the hp_min_temp; the backup heating
1247
+ # system will be operating instead.
1248
+
1249
+ # Sensors
1250
+ tout_db_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Drybulb Temperature')
1251
+ tout_db_sensor.setKeyName('Environment')
1252
+
1253
+ # Actuators
1254
+ fan_pressure_rise_act = OpenStudio::Model::EnergyManagementSystemActuator.new(fan, *EPlus::EMSActuatorFanPressureRise)
1255
+ fan_pressure_rise_act.setName("#{fan.name} pressure rise act")
1256
+
1257
+ fan_total_efficiency_act = OpenStudio::Model::EnergyManagementSystemActuator.new(fan, *EPlus::EMSActuatorFanTotalEfficiency)
1258
+ fan_total_efficiency_act.setName("#{fan.name} total efficiency act")
1259
+
1260
+ # Program
1261
+ fan_program = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
1262
+ fan_program.setName("#{fan.name} power program")
1263
+ fan_program.addLine("If #{tout_db_sensor.name} < #{UnitConversions.convert(hp_min_temp, 'F', 'C').round(2)}")
1264
+ fan_program.addLine(" Set #{fan_pressure_rise_act.name} = 0")
1265
+ fan_program.addLine(" Set #{fan_total_efficiency_act.name} = 1")
1266
+ fan_program.addLine('Else')
1267
+ fan_program.addLine(" Set #{fan_pressure_rise_act.name} = NULL")
1268
+ fan_program.addLine(" Set #{fan_total_efficiency_act.name} = NULL")
1269
+ fan_program.addLine('EndIf')
1270
+
1271
+ # Calling Point
1272
+ fan_program_calling_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
1273
+ fan_program_calling_manager.setName("#{fan.name} power program calling manager")
1274
+ fan_program_calling_manager.setCallingPoint('AfterPredictorBeforeHVACManagers')
1275
+ fan_program_calling_manager.addProgram(fan_program)
1276
+ end
1277
+
1478
1278
  def self.set_pump_power_ems_program(model, pump_w, pump, heating_object)
1479
1279
  # EMS is used to set the pump power.
1480
1280
  # Without EMS, the pump power will vary according to the plant loop part load ratio
@@ -1524,12 +1324,10 @@ class HVAC
1524
1324
  pump_program_calling_manager.addProgram(pump_program)
1525
1325
  end
1526
1326
 
1527
- def self.disaggregate_fan_or_pump(model, fan_or_pump, htg_object, clg_object, backup_htg_object)
1327
+ def self.disaggregate_fan_or_pump(model, fan_or_pump, htg_object, clg_object, backup_htg_object, sys_id)
1528
1328
  # Disaggregate into heating/cooling output energy use.
1529
1329
 
1530
- hvac_objects = []
1531
-
1532
- if fan_or_pump.is_a?(OpenStudio::Model::FanOnOff) || fan_or_pump.is_a?(OpenStudio::Model::FanVariableVolume)
1330
+ if fan_or_pump.is_a? OpenStudio::Model::FanSystemModel
1533
1331
  fan_or_pump_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, "Fan #{EPlus::FuelTypeElectricity} Energy")
1534
1332
  elsif fan_or_pump.is_a? OpenStudio::Model::PumpVariableSpeed
1535
1333
  fan_or_pump_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, "Pump #{EPlus::FuelTypeElectricity} Energy")
@@ -1540,7 +1338,6 @@ class HVAC
1540
1338
  end
1541
1339
  fan_or_pump_sensor.setName("#{fan_or_pump.name} s")
1542
1340
  fan_or_pump_sensor.setKeyName(fan_or_pump.name.to_s)
1543
- hvac_objects << fan_or_pump_sensor
1544
1341
 
1545
1342
  if clg_object.nil?
1546
1343
  clg_object_sensor = nil
@@ -1553,15 +1350,17 @@ class HVAC
1553
1350
  clg_object_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, var)
1554
1351
  clg_object_sensor.setName("#{clg_object.name} s")
1555
1352
  clg_object_sensor.setKeyName(clg_object.name.to_s)
1556
- hvac_objects << clg_object_sensor
1557
1353
  end
1558
1354
 
1559
1355
  if htg_object.nil?
1356
+ htg_fuel = nil
1560
1357
  htg_object_sensor = nil
1561
1358
  else
1562
- var = "Heating Coil #{EPlus::FuelTypeElectricity} Energy"
1359
+ htg_fuel = EPlus::FuelTypeElectricity
1360
+ var = "Heating Coil #{htg_fuel} Energy"
1563
1361
  if htg_object.is_a? OpenStudio::Model::CoilHeatingGas
1564
- var = "Heating Coil #{htg_object.fuelType} Energy"
1362
+ htg_fuel = htg_object.fuelType
1363
+ var = "Heating Coil #{htg_fuel} Energy"
1565
1364
  elsif htg_object.is_a? OpenStudio::Model::ZoneHVACBaseboardConvectiveWater
1566
1365
  var = 'Baseboard Total Heating Energy'
1567
1366
  elsif htg_object.is_a? OpenStudio::Model::ZoneHVACFourPipeFanCoil
@@ -1571,21 +1370,22 @@ class HVAC
1571
1370
  htg_object_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, var)
1572
1371
  htg_object_sensor.setName("#{htg_object.name} s")
1573
1372
  htg_object_sensor.setKeyName(htg_object.name.to_s)
1574
- hvac_objects << htg_object_sensor
1575
1373
  end
1576
1374
 
1577
1375
  if backup_htg_object.nil?
1376
+ backup_htg_fuel = nil
1578
1377
  backup_htg_object_sensor = nil
1579
1378
  else
1580
- var = "Heating Coil #{EPlus::FuelTypeElectricity} Energy"
1379
+ backup_htg_fuel = EPlus::FuelTypeElectricity
1380
+ var = "Heating Coil #{backup_htg_fuel} Energy"
1581
1381
  if backup_htg_object.is_a? OpenStudio::Model::CoilHeatingGas
1582
- var = "Heating Coil #{backup_htg_object.fuelType} Energy"
1382
+ backup_htg_fuel = backup_htg_object.fuelType
1383
+ var = "Heating Coil #{backup_htg_fuel} Energy"
1583
1384
  end
1584
1385
 
1585
1386
  backup_htg_object_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, var)
1586
1387
  backup_htg_object_sensor.setName("#{backup_htg_object.name} s")
1587
1388
  backup_htg_object_sensor.setKeyName(backup_htg_object.name.to_s)
1588
- hvac_objects << backup_htg_object_sensor
1589
1389
  end
1590
1390
 
1591
1391
  sensors = { 'clg' => clg_object_sensor,
@@ -1599,11 +1399,12 @@ class HVAC
1599
1399
  fan_or_pump_program = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
1600
1400
  fan_or_pump_program.setName("#{fan_or_pump_var} disaggregate program")
1601
1401
  if htg_object.is_a?(OpenStudio::Model::ZoneHVACBaseboardConvectiveWater) || htg_object.is_a?(OpenStudio::Model::ZoneHVACFourPipeFanCoil)
1602
- # Pump may occassionally run when baseboard isn't, so just assign all pump energy here
1402
+ # Pump may occasionally run when baseboard isn't, so just assign all pump energy here
1603
1403
  mode, sensor = sensors.first
1604
1404
  if (sensors.size != 1) || (mode != 'primary_htg')
1605
1405
  fail 'Unexpected situation.'
1606
1406
  end
1407
+
1607
1408
  fan_or_pump_program.addLine(" Set #{fan_or_pump_var}_#{mode} = #{fan_or_pump_sensor.name}")
1608
1409
  else
1609
1410
  sensors.each do |mode, sensor|
@@ -1621,13 +1422,11 @@ class HVAC
1621
1422
  end
1622
1423
  fan_or_pump_program.addLine('EndIf')
1623
1424
  end
1624
- hvac_objects << fan_or_pump_program
1625
1425
 
1626
1426
  fan_or_pump_program_calling_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
1627
1427
  fan_or_pump_program_calling_manager.setName("#{fan_or_pump.name} disaggregate program calling manager")
1628
1428
  fan_or_pump_program_calling_manager.setCallingPoint('EndOfSystemTimestepBeforeHVACReporting')
1629
1429
  fan_or_pump_program_calling_manager.addProgram(fan_or_pump_program)
1630
- hvac_objects << fan_or_pump_program_calling_manager
1631
1430
 
1632
1431
  sensors.each do |mode, sensor|
1633
1432
  next if sensor.nil?
@@ -1641,10 +1440,12 @@ class HVAC
1641
1440
  fan_or_pump_ems_output_var.setUpdateFrequency('SystemTimestep')
1642
1441
  fan_or_pump_ems_output_var.setEMSProgramOrSubroutineName(fan_or_pump_program)
1643
1442
  fan_or_pump_ems_output_var.setUnits('J')
1644
- hvac_objects << fan_or_pump_ems_output_var
1443
+ if mode == 'backup_htg' && (not htg_fuel.nil?) && (not backup_htg_fuel.nil?) && (htg_fuel != backup_htg_fuel)
1444
+ fan_or_pump_ems_output_var.additionalProperties.setFeature('HPXML_ID', sys_id + '_DFHPBackup') # Used by reporting measure
1445
+ else
1446
+ fan_or_pump_ems_output_var.additionalProperties.setFeature('HPXML_ID', sys_id) # Used by reporting measure
1447
+ end
1645
1448
  end
1646
-
1647
- return hvac_objects
1648
1449
  end
1649
1450
 
1650
1451
  def self.adjust_dehumidifier_load_EMS(fraction_served, zone_hvac, model, living_space)
@@ -1712,23 +1513,41 @@ class HVAC
1712
1513
  end
1713
1514
  htg_supp_coil.setNominalCapacity(UnitConversions.convert(capacity, 'Btu/hr', 'W'))
1714
1515
  htg_supp_coil.setName(obj_name + ' ' + Constants.ObjectNameBackupHeatingCoil)
1516
+ if heat_pump.is_dual_fuel
1517
+ htg_supp_coil.additionalProperties.setFeature('HPXML_ID', heat_pump.id + '_DFHPBackup') # Used by reporting measure
1518
+ else
1519
+ htg_supp_coil.additionalProperties.setFeature('HPXML_ID', heat_pump.id) # Used by reporting measure
1520
+ end
1521
+
1715
1522
  return htg_supp_coil
1716
1523
  end
1717
1524
 
1718
- def self.create_supply_fan(model, obj_name, num_speeds, fan_watts_per_cfm, fan_cfm)
1719
- if num_speeds == 1
1720
- fan = OpenStudio::Model::FanOnOff.new(model, model.alwaysOnDiscreteSchedule)
1721
- else
1722
- fan_power_curve = create_curve_exponent(model, [0, 1, 3], obj_name + ' fan power curve', -100, 100)
1723
- fan_eff_curve = create_curve_cubic(model, [0, 1, 0, 0], obj_name + ' fan eff curve', 0, 1, 0.01, 1)
1724
- fan = OpenStudio::Model::FanOnOff.new(model, model.alwaysOnDiscreteSchedule, fan_power_curve, fan_eff_curve)
1725
- end
1726
- set_fan_power(fan, fan_watts_per_cfm)
1525
+ def self.create_supply_fan(model, obj_name, fan_watts_per_cfm, fan_cfms)
1526
+ # Note: fan_cfms should include all unique airflow rates (both heating and cooling, at all speeds)
1527
+ fan = OpenStudio::Model::FanSystemModel.new(model)
1528
+ fan.setSpeedControlMethod('Discrete')
1529
+ fan.setDesignPowerSizingMethod('PowerPerFlow')
1530
+ fan.setElectricPowerPerUnitFlowRate([fan_watts_per_cfm / UnitConversions.convert(1.0, 'cfm', 'm^3/s'), 0.00001].max)
1531
+ fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
1727
1532
  fan.setName(obj_name + ' supply fan')
1728
1533
  fan.setEndUseSubcategory('supply fan')
1729
1534
  fan.setMotorEfficiency(1.0)
1730
- fan.setMotorInAirstreamFraction(1.0)
1731
- fan.setMaximumFlowRate(UnitConversions.convert(fan_cfm, 'cfm', 'm^3/s'))
1535
+ fan.setMotorInAirStreamFraction(1.0)
1536
+ max_fan_cfm = Float(fan_cfms.max) # Convert to float to prevent integer division below
1537
+ fan.setDesignMaximumAirFlowRate(UnitConversions.convert(max_fan_cfm, 'cfm', 'm^3/s'))
1538
+
1539
+ # For each fan speed, we preserve the W/cfm instead of using the fan power law. This
1540
+ # ensures that, e.g., a standalone furnace has the same fan power as a furnace attached
1541
+ # to a central air conditioner. For multi-speed systems or systems with different
1542
+ # heating and cooling airflow rates, this essentially means that the W/cfm is treated
1543
+ # as an average value over the range of airflow rates, as opposed to the value at maximum
1544
+ # airflow rate.
1545
+ fan_cfms.sort.each do |fan_cfm|
1546
+ fan_ratio = fan_cfm / max_fan_cfm
1547
+ power_fraction = fan_ratio
1548
+ fan.addSpeed(fan_ratio.round(5), power_fraction.round(5))
1549
+ end
1550
+
1732
1551
  return fan
1733
1552
  end
1734
1553
 
@@ -1764,7 +1583,7 @@ class HVAC
1764
1583
  return air_loop_unitary
1765
1584
  end
1766
1585
 
1767
- def self.create_air_loop(model, obj_name, system, control_zone, sequential_heat_load_frac, sequential_cool_load_frac, airflow_cfm)
1586
+ def self.create_air_loop(model, obj_name, system, control_zone, sequential_heat_load_fracs, sequential_cool_load_fracs, airflow_cfm)
1768
1587
  air_loop = OpenStudio::Model::AirLoopHVAC.new(model)
1769
1588
  air_loop.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
1770
1589
  air_loop.setName(obj_name + ' airloop')
@@ -1785,8 +1604,8 @@ class HVAC
1785
1604
  air_terminal.setName(obj_name + ' terminal')
1786
1605
  air_loop.multiAddBranchForZone(control_zone, air_terminal)
1787
1606
 
1788
- control_zone.setSequentialHeatingFractionSchedule(air_terminal, get_sequential_load_schedule(model, sequential_heat_load_frac))
1789
- control_zone.setSequentialCoolingFractionSchedule(air_terminal, get_sequential_load_schedule(model, sequential_cool_load_frac))
1607
+ control_zone.setSequentialHeatingFractionSchedule(air_terminal, get_sequential_load_schedule(model, sequential_heat_load_fracs))
1608
+ control_zone.setSequentialCoolingFractionSchedule(air_terminal, get_sequential_load_schedule(model, sequential_cool_load_fracs))
1790
1609
 
1791
1610
  return air_loop
1792
1611
  end
@@ -2709,7 +2528,8 @@ class HVAC
2709
2528
  def self.set_cool_rated_cfm_per_ton(cooling_system)
2710
2529
  clg_ap = cooling_system.additional_properties
2711
2530
 
2712
- if cooling_system.is_a?(HPXML::CoolingSystem) && (cooling_system.cooling_system_type == HPXML::HVACTypeRoomAirConditioner)
2531
+ if ((cooling_system.is_a? HPXML::CoolingSystem) && ([HPXML::HVACTypeRoomAirConditioner, HPXML::HVACTypePTAC].include? cooling_system.cooling_system_type)) ||
2532
+ ((cooling_system.is_a? HPXML::HeatPump) && (cooling_system.heat_pump_type == HPXML::HVACTypeHeatPumpPTHP))
2713
2533
  clg_ap.cool_rated_cfm_per_ton = [312.0] # medium speed
2714
2534
  else
2715
2535
  clg_ap.cool_rated_cfm_per_ton = []
@@ -2722,7 +2542,8 @@ class HVAC
2722
2542
  def self.set_heat_rated_cfm_per_ton(heating_system)
2723
2543
  htg_ap = heating_system.additional_properties
2724
2544
 
2725
- if heating_system.is_a? HPXML::HeatingSystem
2545
+ if (heating_system.is_a? HPXML::HeatingSystem) ||
2546
+ ((heating_system.is_a? HPXML::HeatPump) && (heating_system.heat_pump_type == HPXML::HVACTypeHeatPumpPTHP))
2726
2547
  htg_ap.heat_rated_cfm_per_ton = [350.0]
2727
2548
  else
2728
2549
  htg_ap.heat_rated_cfm_per_ton = []
@@ -2920,19 +2741,26 @@ class HVAC
2920
2741
  for i in 0..(clg_ap.num_speeds - 1)
2921
2742
  cap_ft_spec_si = convert_curve_biquadratic(clg_ap.cool_cap_ft_spec[i])
2922
2743
  eir_ft_spec_si = convert_curve_biquadratic(clg_ap.cool_eir_ft_spec[i])
2923
- cap_ft_curve = create_curve_biquadratic(model, cap_ft_spec_si, "Cool-CAP-fT#{i + 1}", 13.88, 23.88, 18.33, 51.66)
2924
- eir_ft_curve = create_curve_biquadratic(model, eir_ft_spec_si, "Cool-EIR-fT#{i + 1}", 13.88, 23.88, 18.33, 51.66)
2744
+ cap_ft_curve = create_curve_biquadratic(model, cap_ft_spec_si, "Cool-CAP-fT#{i + 1}", -100, 100, -100, 100)
2745
+ eir_ft_curve = create_curve_biquadratic(model, eir_ft_spec_si, "Cool-EIR-fT#{i + 1}", -100, 100, -100, 100)
2925
2746
  plf_fplr_curve = create_curve_quadratic(model, clg_ap.cool_plf_fplr_spec[i], "Cool-PLF-fPLR#{i + 1}", 0, 1, 0.7, 1)
2926
2747
  cap_fff_curve = create_curve_quadratic(model, clg_ap.cool_cap_fflow_spec[i], "Cool-CAP-fFF#{i + 1}", 0, 2, 0, 2)
2927
2748
  eir_fff_curve = create_curve_quadratic(model, clg_ap.cool_eir_fflow_spec[i], "Cool-EIR-fFF#{i + 1}", 0, 2, 0, 2)
2928
2749
 
2929
2750
  if clg_ap.num_speeds == 1
2930
2751
  clg_coil = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model, model.alwaysOnDiscreteSchedule, cap_ft_curve, cap_fff_curve, eir_ft_curve, eir_fff_curve, plf_fplr_curve)
2931
- clg_coil.setRatedEvaporatorFanPowerPerVolumeFlowRate(clg_ap.fan_power_rated / UnitConversions.convert(1.0, 'cfm', 'm^3/s'))
2932
- if not clg_ap.crankcase_temp.nil?
2933
- clg_coil.setMaximumOutdoorDryBulbTemperatureForCrankcaseHeaterOperation(UnitConversions.convert(clg_ap.crankcase_temp, 'F', 'C'))
2752
+ # Coil COP calculation based on system type
2753
+ if [HPXML::HVACTypeRoomAirConditioner, HPXML::HVACTypePTAC, HPXML::HVACTypeHeatPumpPTHP].include? clg_type
2754
+ if cooling_system.cooling_efficiency_ceer.nil?
2755
+ ceer = calc_ceer_from_eer(cooling_system)
2756
+ else
2757
+ ceer = cooling_system.cooling_efficiency_ceer
2758
+ end
2759
+ clg_coil.setRatedCOP(UnitConversions.convert(ceer, 'Btu/hr', 'W'))
2760
+ else
2761
+ clg_coil.setRatedCOP(1.0 / clg_ap.cool_rated_eirs[i])
2934
2762
  end
2935
- clg_coil.setRatedCOP(1.0 / clg_ap.cool_rated_eirs[i])
2763
+ clg_coil.setMaximumOutdoorDryBulbTemperatureForCrankcaseHeaterOperation(UnitConversions.convert(clg_ap.crankcase_temp, 'F', 'C')) unless clg_ap.crankcase_temp.nil?
2936
2764
  clg_coil.setRatedSensibleHeatRatio(clg_ap.cool_rated_shrs_gross[i])
2937
2765
  clg_coil.setNominalTimeForCondensateRemovalToBegin(1000.0)
2938
2766
  clg_coil.setRatioOfInitialMoistureEvaporationRateAndSteadyStateLatentCapacity(1.5)
@@ -2947,9 +2775,7 @@ class HVAC
2947
2775
  clg_coil.setApplyLatentDegradationtoSpeedsGreaterthan1(false)
2948
2776
  clg_coil.setFuelType(EPlus::FuelTypeElectricity)
2949
2777
  clg_coil.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
2950
- if not clg_ap.crankcase_temp.nil?
2951
- clg_coil.setMaximumOutdoorDryBulbTemperatureforCrankcaseHeaterOperation(UnitConversions.convert(clg_ap.crankcase_temp, 'F', 'C'))
2952
- end
2778
+ clg_coil.setMaximumOutdoorDryBulbTemperatureforCrankcaseHeaterOperation(UnitConversions.convert(clg_ap.crankcase_temp, 'F', 'C')) unless clg_ap.crankcase_temp.nil?
2953
2779
  end
2954
2780
  stage = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model, cap_ft_curve, cap_fff_curve, eir_ft_curve, eir_fff_curve, plf_fplr_curve, constant_biquadratic)
2955
2781
  stage.setGrossRatedCoolingCOP(1.0 / clg_ap.cool_rated_eirs[i])
@@ -2968,6 +2794,7 @@ class HVAC
2968
2794
  clg_coil.setName(obj_name + ' clg coil')
2969
2795
  clg_coil.setCondenserType('AirCooled')
2970
2796
  clg_coil.setCrankcaseHeaterCapacity(UnitConversions.convert(clg_ap.crankcase_kw, 'kW', 'W'))
2797
+ clg_coil.additionalProperties.setFeature('HPXML_ID', cooling_system.id) # Used by reporting measure
2971
2798
 
2972
2799
  return clg_coil
2973
2800
  end
@@ -2998,10 +2825,10 @@ class HVAC
2998
2825
 
2999
2826
  if htg_ap.num_speeds == 1
3000
2827
  htg_coil = OpenStudio::Model::CoilHeatingDXSingleSpeed.new(model, model.alwaysOnDiscreteSchedule, cap_ft_curve, cap_fff_curve, eir_ft_curve, eir_fff_curve, plf_fplr_curve)
3001
- htg_coil.setRatedSupplyFanPowerPerVolumeFlowRate(htg_ap.fan_power_rated / UnitConversions.convert(1.0, 'cfm', 'm^3/s'))
3002
- htg_coil.setRatedCOP(1.0 / htg_ap.heat_rated_eirs[i])
3003
- if not htg_ap.crankcase_temp.nil?
3004
- htg_coil.setMaximumOutdoorDryBulbTemperatureforCrankcaseHeaterOperation(UnitConversions.convert(htg_ap.crankcase_temp, 'F', 'C'))
2828
+ if heating_system.heating_efficiency_cop.nil?
2829
+ htg_coil.setRatedCOP(1.0 / htg_ap.heat_rated_eirs[i])
2830
+ else # PTHP
2831
+ htg_coil.setRatedCOP(heating_system.heating_efficiency_cop)
3005
2832
  end
3006
2833
  htg_coil.setRatedTotalHeatingCapacity(UnitConversions.convert(heating_system.heating_capacity, 'Btu/hr', 'W'))
3007
2834
  htg_coil.setRatedAirFlowRate(calc_rated_airflow(heating_system.heating_capacity, htg_ap.heat_rated_cfm_per_ton[0], 1.0))
@@ -3011,9 +2838,6 @@ class HVAC
3011
2838
  htg_coil.setFuelType(EPlus::FuelTypeElectricity)
3012
2839
  htg_coil.setApplyPartLoadFractiontoSpeedsGreaterthan1(false)
3013
2840
  htg_coil.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
3014
- if not htg_ap.crankcase_temp.nil?
3015
- htg_coil.setMaximumOutdoorDryBulbTemperatureforCrankcaseHeaterOperation(UnitConversions.convert(htg_ap.crankcase_temp, 'F', 'C'))
3016
- end
3017
2841
  end
3018
2842
  stage = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model, cap_ft_curve, cap_fff_curve, eir_ft_curve, eir_fff_curve, plf_fplr_curve, constant_biquadratic)
3019
2843
  stage.setGrossRatedHeatingCOP(1.0 / htg_ap.heat_rated_eirs[i])
@@ -3034,7 +2858,9 @@ class HVAC
3034
2858
  if heating_system.fraction_heat_load_served == 0
3035
2859
  htg_coil.setResistiveDefrostHeaterCapacity(0)
3036
2860
  end
2861
+ htg_coil.setMaximumOutdoorDryBulbTemperatureforCrankcaseHeaterOperation(UnitConversions.convert(htg_ap.crankcase_temp, 'F', 'C')) unless htg_ap.crankcase_temp.nil?
3037
2862
  htg_coil.setCrankcaseHeaterCapacity(UnitConversions.convert(htg_ap.crankcase_kw, 'kW', 'W'))
2863
+ htg_coil.additionalProperties.setFeature('HPXML_ID', heating_system.id) # Used by reporting measure
3038
2864
 
3039
2865
  return htg_coil
3040
2866
  end
@@ -3061,7 +2887,8 @@ class HVAC
3061
2887
  clg_ap = cooling_system.additional_properties
3062
2888
 
3063
2889
  # Convert SHRs from net to gross.
3064
- if cooling_system.is_a?(HPXML::CoolingSystem) && (cooling_system.cooling_system_type == HPXML::HVACTypeRoomAirConditioner)
2890
+ if ((cooling_system.is_a? HPXML::CoolingSystem) && ([HPXML::HVACTypeRoomAirConditioner, HPXML::HVACTypePTAC].include? cooling_system.cooling_system_type)) ||
2891
+ ((cooling_system.is_a? HPXML::HeatPump) && ([HPXML::HVACTypeHeatPumpPTHP].include? cooling_system.heat_pump_type))
3065
2892
  clg_ap.cool_rated_shrs_gross = [cooling_system.cooling_shr] # We don't model the fan separately, so set gross == net
3066
2893
  else
3067
2894
  clg_ap.cool_rated_shrs_gross = []
@@ -3090,7 +2917,8 @@ class HVAC
3090
2917
  clg_ap = cooling_system.additional_properties
3091
2918
 
3092
2919
  # Degradation coefficient for cooling
3093
- if cooling_system.is_a?(HPXML::CoolingSystem) && (cooling_system.cooling_system_type == HPXML::HVACTypeRoomAirConditioner)
2920
+ if ((cooling_system.is_a? HPXML::CoolingSystem) && ([HPXML::HVACTypeRoomAirConditioner, HPXML::HVACTypePTAC].include? cooling_system.cooling_system_type)) ||
2921
+ ((cooling_system.is_a? HPXML::HeatPump) && (cooling_system.heat_pump_type == HPXML::HVACTypeHeatPumpPTHP))
3094
2922
  clg_ap.cool_c_d = 0.22
3095
2923
  elsif num_speeds == 1
3096
2924
  if cooling_system.cooling_efficiency_seer < 13.0
@@ -3112,7 +2940,9 @@ class HVAC
3112
2940
  htg_ap = heating_system.additional_properties
3113
2941
 
3114
2942
  # Degradation coefficient for heating
3115
- if num_speeds == 1
2943
+ if (heating_system.is_a? HPXML::HeatPump) && (heating_system.heat_pump_type == HPXML::HVACTypeHeatPumpPTHP)
2944
+ htg_ap.heat_c_d = 0.22
2945
+ elsif num_speeds == 1
3116
2946
  if heating_system.heating_efficiency_hspf < 7.0
3117
2947
  htg_ap.heat_c_d = 0.20
3118
2948
  else
@@ -3129,19 +2959,20 @@ class HVAC
3129
2959
  htg_ap.heat_plf_fplr_spec = [calc_plr_coefficients(htg_ap.heat_c_d)] * num_speeds
3130
2960
  end
3131
2961
 
2962
+ def self.calc_ceer_from_eer(cooling_system)
2963
+ # Reference: http://documents.dps.ny.gov/public/Common/ViewDoc.aspx?DocRefId=%7BB6A57FC0-6376-4401-92BD-D66EC1930DCF%7D
2964
+ return cooling_system.cooling_efficiency_eer / 1.01
2965
+ end
2966
+
3132
2967
  def self.set_fan_power_rated(hvac_system)
3133
2968
  hvac_ap = hvac_system.additional_properties
3134
2969
 
3135
- if (hvac_system.is_a?(HPXML::CoolingSystem) && (hvac_system.cooling_system_type == HPXML::HVACTypeMiniSplitAirConditioner)) ||
3136
- (hvac_system.is_a?(HPXML::HeatPump) && (hvac_system.heat_pump_type == HPXML::HVACTypeHeatPumpMiniSplit))
3137
- if not hvac_system.distribution_system.nil?
3138
- # Ducted, installed fan power may differ from rated fan power
3139
- hvac_ap.fan_power_rated = 0.18 # W/cfm, ducted
3140
- else
3141
- # Ductless, installed and rated value should be equal
3142
- hvac_ap.fan_power_rated = 0.07 # W/cfm
3143
- hvac_system.fan_watts_per_cfm = hvac_ap.fan_power_rated # W/cfm
3144
- end
2970
+ if hvac_system.distribution_system.nil?
2971
+ # Ductless, installed and rated value should be equal
2972
+ hvac_ap.fan_power_rated = hvac_system.fan_watts_per_cfm # W/cfm
2973
+ elsif (hvac_system.is_a?(HPXML::CoolingSystem) && (hvac_system.cooling_system_type == HPXML::HVACTypeMiniSplitAirConditioner)) ||
2974
+ (hvac_system.is_a?(HPXML::HeatPump) && (hvac_system.heat_pump_type == HPXML::HVACTypeHeatPumpMiniSplit))
2975
+ hvac_ap.fan_power_rated = 0.18 # W/cfm
3145
2976
  elsif hvac_system.cooling_efficiency_seer <= 15
3146
2977
  hvac_ap.fan_power_rated = 0.365 # W/cfm
3147
2978
  else
@@ -3149,17 +2980,6 @@ class HVAC
3149
2980
  end
3150
2981
  end
3151
2982
 
3152
- def self.set_fan_power(fan, fan_watts_per_cfm)
3153
- if fan_watts_per_cfm > 0
3154
- fan_eff = 0.75 # Overall Efficiency of the Fan, Motor and Drive
3155
- fan.setFanEfficiency(fan_eff)
3156
- fan.setPressureRise(fan_eff * fan_watts_per_cfm / UnitConversions.convert(1.0, 'cfm', 'm^3/s')) # Pa
3157
- else
3158
- fan.setFanEfficiency(1)
3159
- fan.setPressureRise(0)
3160
- end
3161
- end
3162
-
3163
2983
  def self.calc_pump_rated_flow_rate(pump_eff, pump_w, pump_head_pa)
3164
2984
  # Calculate needed pump rated flow rate to achieve a given pump power with an assumed
3165
2985
  # efficiency and pump head.
@@ -3635,42 +3455,56 @@ class HVAC
3635
3455
  return hspf
3636
3456
  end
3637
3457
 
3638
- def self.calc_sequential_load_fraction(load_fraction, remaining_fraction)
3458
+ def self.calc_sequential_load_fractions(load_fraction, remaining_fraction, availability_days)
3459
+ # Returns the EnergyPlus sequential load fractions for every day of the year
3639
3460
  if remaining_fraction > 0
3640
3461
  sequential_load_frac = load_fraction / remaining_fraction # Fraction of remaining load served by this system
3641
3462
  else
3642
3463
  sequential_load_frac = 0.0
3643
3464
  end
3465
+ sequential_load_fracs = availability_days.map { |d| d * sequential_load_frac }
3644
3466
 
3645
- return sequential_load_frac
3467
+ return sequential_load_fracs
3646
3468
  end
3647
3469
 
3648
- def self.get_sequential_load_schedule(model, value)
3649
- s = OpenStudio::Model::ScheduleConstant.new(model)
3650
- s.setName('Sequential Fraction Schedule')
3651
- if value > 1
3652
- s.setValue(1.0)
3470
+ def self.get_sequential_load_schedule(model, fractions)
3471
+ values = fractions.map { |f| f > 1 ? 1.0 : f.round(5) }
3472
+
3473
+ if values.uniq.length == 1
3474
+ s = OpenStudio::Model::ScheduleConstant.new(model)
3475
+ s.setValue(values[0])
3653
3476
  else
3654
- s.setValue(value.round(5))
3477
+ s = Schedule.create_ruleset_from_daily_season(model, values)
3655
3478
  end
3479
+
3480
+ s.setName('Sequential Fraction Schedule')
3656
3481
  Schedule.set_schedule_type_limits(model, s, Constants.ScheduleTypeLimitsFraction)
3657
3482
  return s
3658
3483
  end
3659
3484
 
3660
3485
  def self.set_crankcase_assumptions(hvac_system)
3661
3486
  hvac_ap = hvac_system.additional_properties
3487
+ if hvac_system.is_a?(HPXML::HeatPump)
3488
+ clg_sys_type = hvac_system.heat_pump_type
3489
+ elsif hvac_system.is_a?(HPXML::CoolingSystem)
3490
+ clg_sys_type = hvac_system.cooling_system_type
3491
+ end
3662
3492
 
3663
3493
  if hvac_system.is_a?(HPXML::HeatPump) && (hvac_system.fraction_heat_load_served <= 0)
3664
3494
  hvac_ap.crankcase_kw = 0.0
3665
3495
  hvac_ap.crankcase_temp = nil
3666
- elsif hvac_system.is_a?(HPXML::HeatPump) && (hvac_system.heat_pump_type == HPXML::HVACTypeHeatPumpMiniSplit)
3496
+ elsif clg_sys_type == HPXML::HVACTypeHeatPumpMiniSplit
3667
3497
  hvac_ap.crankcase_kw = 0.0
3668
3498
  hvac_ap.crankcase_temp = nil
3669
- elsif hvac_system.is_a?(HPXML::CoolingSystem) && (hvac_system.cooling_system_type == HPXML::HVACTypeMiniSplitAirConditioner)
3499
+ elsif clg_sys_type == HPXML::HVACTypeMiniSplitAirConditioner
3670
3500
  hvac_ap.crankcase_kw = 0.0
3671
3501
  hvac_ap.crankcase_temp = nil
3672
3502
  else
3673
- hvac_ap.crankcase_kw = 0.05 * hvac_system.fraction_cool_load_served # From RESNET Publication No. 002-2017
3503
+ if [HPXML::HVACTypeHeatPumpPTHP, HPXML::HVACTypePTAC, HPXML::HVACTypeRoomAirConditioner].include? clg_sys_type
3504
+ hvac_ap.crankcase_kw = 0.0
3505
+ else
3506
+ hvac_ap.crankcase_kw = 0.05 * hvac_system.fraction_cool_load_served # From RESNET Publication No. 002-2017
3507
+ end
3674
3508
  hvac_ap.crankcase_temp = 50.0 # From RESNET Publication No. 002-2017
3675
3509
  end
3676
3510
  end
@@ -3709,6 +3543,7 @@ class HVAC
3709
3543
  def self.get_default_duct_locations(hpxml)
3710
3544
  primary_duct_location_hierarchy = [HPXML::LocationBasementConditioned,
3711
3545
  HPXML::LocationBasementUnconditioned,
3546
+ HPXML::LocationCrawlspaceConditioned,
3712
3547
  HPXML::LocationCrawlspaceVented,
3713
3548
  HPXML::LocationCrawlspaceUnvented,
3714
3549
  HPXML::LocationAtticVented,
@@ -3716,9 +3551,9 @@ class HVAC
3716
3551
  HPXML::LocationGarage]
3717
3552
 
3718
3553
  primary_duct_location = nil
3719
- primary_duct_location_hierarchy.each do |space_type|
3720
- if hpxml.has_space_type(space_type)
3721
- primary_duct_location = space_type
3554
+ primary_duct_location_hierarchy.each do |location|
3555
+ if hpxml.has_location(location)
3556
+ primary_duct_location = location
3722
3557
  break
3723
3558
  end
3724
3559
  end
@@ -3727,7 +3562,7 @@ class HVAC
3727
3562
  return primary_duct_location, secondary_duct_location
3728
3563
  end
3729
3564
 
3730
- def self.get_installation_quality_cooling_coeff(f_chg)
3565
+ def self.get_charge_fault_cooling_coeff(f_chg)
3731
3566
  if f_chg <= 0
3732
3567
  qgr_values = [-9.46E-01, 4.93E-02, -1.18E-03, -1.15E+00]
3733
3568
  p_values = [-3.13E-01, 1.15E-02, 2.66E-03, -1.16E-01]
@@ -3739,18 +3574,192 @@ class HVAC
3739
3574
  return qgr_values, p_values, ff_chg_values
3740
3575
  end
3741
3576
 
3742
- def self.get_installation_quality_heating_coeff(f_chg)
3577
+ def self.get_charge_fault_heating_coeff(f_chg)
3743
3578
  if f_chg <= 0
3744
- qgr_values = [-0.0338595, 0.0202827, -2.6226343]
3745
- p_values = [0.0615649, 0.0044554, -0.2598507]
3579
+ qgr_values = [-0.0338595, 0.0, 0.0202827, -2.6226343] # Add a zero term to combine cooling and heating claculation
3580
+ p_values = [0.0615649, 0.0, 0.0044554, -0.2598507] # Add a zero term to combine cooling and heating claculation
3746
3581
  else
3747
- qgr_values = [-0.0029514, 0.0007379, -0.0064112]
3748
- p_values = [-0.0594134, 0.0159205, 1.8872153]
3582
+ qgr_values = [-0.0029514, 0.0, 0.0007379, -0.0064112] # Add a zero term to combine cooling and heating claculation
3583
+ p_values = [-0.0594134, 0.0, 0.0159205, 1.8872153] # Add a zero term to combine cooling and heating claculation
3749
3584
  end
3750
- ff_chg_values = [8.33]
3585
+ ff_chg_values = [0.0, 8.33] # Add a zero term to combine cooling and heating claculation
3751
3586
  return qgr_values, p_values, ff_chg_values
3752
3587
  end
3753
3588
 
3589
+ def self.get_airflow_fault_cooling_coeff()
3590
+ # Cutler curve coefficients for single speed
3591
+ cool_cap_fflow_spec = [0.718664047, 0.41797409, -0.136638137]
3592
+ cool_eir_fflow_spec = [1.143487507, -0.13943972, -0.004047787]
3593
+ return cool_cap_fflow_spec, cool_eir_fflow_spec
3594
+ end
3595
+
3596
+ def self.get_airflow_fault_heating_coeff()
3597
+ # Cutler curve coefficients for single speed
3598
+ heat_cap_fflow_spec = [0.694045465, 0.474207981, -0.168253446]
3599
+ heat_eir_fflow_spec = [2.185418751, -1.942827919, 0.757409168]
3600
+ return heat_cap_fflow_spec, heat_eir_fflow_spec
3601
+ end
3602
+
3603
+ def self.add_install_quality_calculations(fault_program, tin_sensor, tout_sensor, airflow_rated_defect_ratio, clg_or_htg_coil, model, f_chg, obj_name, mode, defect_ratio)
3604
+ if mode == :clg
3605
+ if clg_or_htg_coil.is_a? OpenStudio::Model::CoilCoolingDXSingleSpeed
3606
+ num_speeds = 1
3607
+ cap_fff_curves = [clg_or_htg_coil.totalCoolingCapacityFunctionOfFlowFractionCurve.to_CurveQuadratic.get]
3608
+ eir_pow_fff_curves = [clg_or_htg_coil.energyInputRatioFunctionOfFlowFractionCurve.to_CurveQuadratic.get]
3609
+ elsif clg_or_htg_coil.is_a? OpenStudio::Model::CoilCoolingDXMultiSpeed
3610
+ num_speeds = clg_or_htg_coil.stages.size
3611
+ cap_fff_curves = clg_or_htg_coil.stages.map { |stage| stage.totalCoolingCapacityFunctionofFlowFractionCurve.to_CurveQuadratic.get }
3612
+ eir_pow_fff_curves = clg_or_htg_coil.stages.map { |stage| stage.energyInputRatioFunctionofFlowFractionCurve.to_CurveQuadratic.get }
3613
+ elsif clg_or_htg_coil.is_a? OpenStudio::Model::CoilCoolingWaterToAirHeatPumpEquationFit
3614
+ num_speeds = 1
3615
+ cap_fff_curves = [clg_or_htg_coil.totalCoolingCapacityCurve.to_CurveQuadLinear.get] # quadlinear curve, only forth term is for airflow
3616
+ eir_pow_fff_curves = [clg_or_htg_coil.coolingPowerConsumptionCurve.to_CurveQuadLinear.get] # quadlinear curve, only forth term is for airflow
3617
+ # variables are the same for eir and cap curve
3618
+ var1_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Performance Curve Input Variable 1 Value')
3619
+ var1_sensor.setName('Cool Cap Curve Var 1')
3620
+ var1_sensor.setKeyName(cap_fff_curves[0].name.to_s)
3621
+ var2_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Performance Curve Input Variable 2 Value')
3622
+ var2_sensor.setName('Cool Cap Curve Var 2')
3623
+ var2_sensor.setKeyName(cap_fff_curves[0].name.to_s)
3624
+ var4_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Performance Curve Input Variable 4 Value')
3625
+ var4_sensor.setName('Cool Cap Curve Var 4')
3626
+ var4_sensor.setKeyName(cap_fff_curves[0].name.to_s)
3627
+ else
3628
+ fail 'cooling coil not supported'
3629
+ end
3630
+ elsif mode == :htg
3631
+ if clg_or_htg_coil.is_a? OpenStudio::Model::CoilHeatingDXSingleSpeed
3632
+ num_speeds = 1
3633
+ cap_fff_curves = [clg_or_htg_coil.totalHeatingCapacityFunctionofFlowFractionCurve.to_CurveQuadratic.get]
3634
+ eir_pow_fff_curves = [clg_or_htg_coil.energyInputRatioFunctionofFlowFractionCurve.to_CurveQuadratic.get]
3635
+ elsif clg_or_htg_coil.is_a? OpenStudio::Model::CoilHeatingDXMultiSpeed
3636
+ num_speeds = clg_or_htg_coil.stages.size
3637
+ cap_fff_curves = clg_or_htg_coil.stages.map { |stage| stage.heatingCapacityFunctionofFlowFractionCurve.to_CurveQuadratic.get }
3638
+ eir_pow_fff_curves = clg_or_htg_coil.stages.map { |stage| stage.energyInputRatioFunctionofFlowFractionCurve.to_CurveQuadratic.get }
3639
+ elsif clg_or_htg_coil.is_a? OpenStudio::Model::CoilHeatingWaterToAirHeatPumpEquationFit
3640
+ num_speeds = 1
3641
+ cap_fff_curves = [clg_or_htg_coil.heatingCapacityCurve.to_CurveQuadLinear.get] # quadlinear curve, only forth term is for airflow
3642
+ eir_pow_fff_curves = [clg_or_htg_coil.heatingPowerConsumptionCurve.to_CurveQuadLinear.get] # quadlinear curve, only forth term is for airflow
3643
+ # variables are the same for eir and cap curve
3644
+ var1_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Performance Curve Input Variable 1 Value')
3645
+ var1_sensor.setName('Heat Cap Curve Var 1')
3646
+ var1_sensor.setKeyName(cap_fff_curves[0].name.to_s)
3647
+ var2_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Performance Curve Input Variable 2 Value')
3648
+ var2_sensor.setName('Heat Cap Curve Var 2')
3649
+ var2_sensor.setKeyName(cap_fff_curves[0].name.to_s)
3650
+ var4_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Performance Curve Input Variable 4 Value')
3651
+ var4_sensor.setName('Heat Cap Curve Var 4')
3652
+ var4_sensor.setKeyName(cap_fff_curves[0].name.to_s)
3653
+ else
3654
+ fail 'heating coil not supported'
3655
+ end
3656
+ end
3657
+
3658
+ # Apply Cutler curve airflow coefficients to later equations
3659
+ if mode == :clg
3660
+ cap_fflow_spec, eir_fflow_spec = get_airflow_fault_cooling_coeff()
3661
+ qgr_values, p_values, ff_chg_values = get_charge_fault_cooling_coeff(f_chg)
3662
+ suffix = 'clg'
3663
+ elsif mode == :htg
3664
+ cap_fflow_spec, eir_fflow_spec = get_airflow_fault_heating_coeff()
3665
+ qgr_values, p_values, ff_chg_values = get_charge_fault_heating_coeff(f_chg)
3666
+ suffix = 'htg'
3667
+ end
3668
+ fault_program.addLine("Set a1_AF_Qgr_#{suffix} = #{cap_fflow_spec[0]}")
3669
+ fault_program.addLine("Set a2_AF_Qgr_#{suffix} = #{cap_fflow_spec[1]}")
3670
+ fault_program.addLine("Set a3_AF_Qgr_#{suffix} = #{cap_fflow_spec[2]}")
3671
+ fault_program.addLine("Set a1_AF_EIR_#{suffix} = #{eir_fflow_spec[0]}")
3672
+ fault_program.addLine("Set a2_AF_EIR_#{suffix} = #{eir_fflow_spec[1]}")
3673
+ fault_program.addLine("Set a3_AF_EIR_#{suffix} = #{eir_fflow_spec[2]}")
3674
+
3675
+ # charge fault coefficients
3676
+ fault_program.addLine("Set a1_CH_Qgr_#{suffix} = #{qgr_values[0]}")
3677
+ fault_program.addLine("Set a2_CH_Qgr_#{suffix} = #{qgr_values[1]}")
3678
+ fault_program.addLine("Set a3_CH_Qgr_#{suffix} = #{qgr_values[2]}")
3679
+ fault_program.addLine("Set a4_CH_Qgr_#{suffix} = #{qgr_values[3]}")
3680
+
3681
+ fault_program.addLine("Set a1_CH_P_#{suffix} = #{p_values[0]}")
3682
+ fault_program.addLine("Set a2_CH_P_#{suffix} = #{p_values[1]}")
3683
+ fault_program.addLine("Set a3_CH_P_#{suffix} = #{p_values[2]}")
3684
+ fault_program.addLine("Set a4_CH_P_#{suffix} = #{p_values[3]}")
3685
+
3686
+ fault_program.addLine("Set q0_CH_#{suffix} = a1_CH_Qgr_#{suffix}")
3687
+ fault_program.addLine("Set q1_CH_#{suffix} = a2_CH_Qgr_#{suffix}*#{tin_sensor.name}")
3688
+ fault_program.addLine("Set q2_CH_#{suffix} = a3_CH_Qgr_#{suffix}*#{tout_sensor.name}")
3689
+ fault_program.addLine("Set q3_CH_#{suffix} = a4_CH_Qgr_#{suffix}*F_CH")
3690
+ fault_program.addLine("Set Y_CH_Q_#{suffix} = 1 + ((q0_CH_#{suffix}+(q1_CH_#{suffix})+(q2_CH_#{suffix})+(q3_CH_#{suffix}))*F_CH)")
3691
+
3692
+ fault_program.addLine("Set p1_CH_#{suffix} = a1_CH_P_#{suffix}")
3693
+ fault_program.addLine("Set p2_CH_#{suffix} = a2_CH_P_#{suffix}*#{tin_sensor.name}")
3694
+ fault_program.addLine("Set p3_CH_#{suffix} = a3_CH_P_#{suffix}*#{tout_sensor.name}")
3695
+ fault_program.addLine("Set p4_CH_#{suffix} = a4_CH_P_#{suffix}*F_CH")
3696
+ fault_program.addLine("Set Y_CH_COP_#{suffix} = Y_CH_Q_#{suffix}/(1 + (p1_CH_#{suffix}+(p2_CH_#{suffix})+(p3_CH_#{suffix})+(p4_CH_#{suffix}))*F_CH)")
3697
+
3698
+ # air flow defect and charge defect combined to modify airflow curve output
3699
+ ff_ch = 1.0 / (1.0 + (qgr_values[0] + (qgr_values[1] * ff_chg_values[0]) + (qgr_values[2] * ff_chg_values[1]) + (qgr_values[3] * f_chg)) * f_chg)
3700
+ fault_program.addLine("Set FF_CH = #{ff_ch.round(3)}")
3701
+
3702
+ for speed in 0..(num_speeds - 1)
3703
+ cap_fff_curve = cap_fff_curves[speed]
3704
+ cap_fff_act = OpenStudio::Model::EnergyManagementSystemActuator.new(cap_fff_curve, 'Curve', 'Curve Result')
3705
+ cap_fff_act.setName("#{obj_name} cap act #{suffix}")
3706
+
3707
+ eir_pow_fff_curve = eir_pow_fff_curves[speed]
3708
+ eir_pow_act = OpenStudio::Model::EnergyManagementSystemActuator.new(eir_pow_fff_curve, 'Curve', 'Curve Result')
3709
+ eir_pow_act.setName("#{obj_name} eir pow act #{suffix}")
3710
+
3711
+ fault_program.addLine("Set FF_AF_#{suffix} = 1.0 + (#{airflow_rated_defect_ratio[speed].round(3)})")
3712
+ fault_program.addLine("Set q_AF_CH_#{suffix} = (a1_AF_Qgr_#{suffix}) + ((a2_AF_Qgr_#{suffix})*FF_CH) + ((a3_AF_Qgr_#{suffix})*FF_CH*FF_CH)")
3713
+ fault_program.addLine("Set eir_AF_CH_#{suffix} = (a1_AF_EIR_#{suffix}) + ((a2_AF_EIR_#{suffix})*FF_CH) + ((a3_AF_EIR_#{suffix})*FF_CH*FF_CH)")
3714
+ fault_program.addLine("Set p_CH_Q_#{suffix} = Y_CH_Q_#{suffix}/q_AF_CH_#{suffix}")
3715
+ fault_program.addLine("Set p_CH_COP_#{suffix} = Y_CH_COP_#{suffix}*eir_AF_CH_#{suffix}")
3716
+ fault_program.addLine("Set FF_AF_comb_#{suffix} = FF_CH * FF_AF_#{suffix}")
3717
+ fault_program.addLine("Set p_AF_Q_#{suffix} = (a1_AF_Qgr_#{suffix}) + ((a2_AF_Qgr_#{suffix})*FF_AF_comb_#{suffix}) + ((a3_AF_Qgr_#{suffix})*FF_AF_comb_#{suffix}*FF_AF_comb_#{suffix})")
3718
+ fault_program.addLine("Set p_AF_COP_#{suffix} = 1.0 / ((a1_AF_EIR_#{suffix}) + ((a2_AF_EIR_#{suffix})*FF_AF_comb_#{suffix}) + ((a3_AF_EIR_#{suffix})*FF_AF_comb_#{suffix}*FF_AF_comb_#{suffix}))")
3719
+ fault_program.addLine("Set FF_AF_nodef_#{suffix} = FF_AF_#{suffix} / (1 + (#{defect_ratio.round(3)}))")
3720
+ fault_program.addLine("Set CAP_Cutler_Curve_Pre_#{suffix} = (a1_AF_Qgr_#{suffix}) + ((a2_AF_Qgr_#{suffix})*FF_AF_nodef_#{suffix}) + ((a3_AF_Qgr_#{suffix})*FF_AF_nodef_#{suffix}*FF_AF_nodef_#{suffix})")
3721
+ fault_program.addLine("Set EIR_Cutler_Curve_Pre_#{suffix} = (a1_AF_EIR_#{suffix}) + ((a2_AF_EIR_#{suffix})*FF_AF_nodef_#{suffix}) + ((a3_AF_EIR_#{suffix})*FF_AF_nodef_#{suffix}*FF_AF_nodef_#{suffix})")
3722
+ fault_program.addLine("Set CAP_Cutler_Curve_After_#{suffix} = p_CH_Q_#{suffix} * p_AF_Q_#{suffix}")
3723
+ fault_program.addLine("Set EIR_Cutler_Curve_After_#{suffix} = (1.0 / (p_CH_COP_#{suffix} * p_AF_COP_#{suffix}))")
3724
+ fault_program.addLine("Set CAP_IQ_adj_#{suffix} = CAP_Cutler_Curve_After_#{suffix} / CAP_Cutler_Curve_Pre_#{suffix}")
3725
+ fault_program.addLine("Set EIR_IQ_adj_#{suffix} = EIR_Cutler_Curve_After_#{suffix} / EIR_Cutler_Curve_Pre_#{suffix}")
3726
+ # NOTE: heat pump (cooling) curves don't exhibit expected trends at extreme faults;
3727
+ if (not clg_or_htg_coil.is_a? OpenStudio::Model::CoilCoolingWaterToAirHeatPumpEquationFit) && (not clg_or_htg_coil.is_a? OpenStudio::Model::CoilHeatingWaterToAirHeatPumpEquationFit)
3728
+ fault_program.addLine("Set CAP_c1_#{suffix} = #{cap_fff_curve.coefficient1Constant}")
3729
+ fault_program.addLine("Set CAP_c2_#{suffix} = #{cap_fff_curve.coefficient2x}")
3730
+ fault_program.addLine("Set CAP_c3_#{suffix} = #{cap_fff_curve.coefficient3xPOW2}")
3731
+ fault_program.addLine("Set EIR_c1_#{suffix} = #{eir_pow_fff_curve.coefficient1Constant}")
3732
+ fault_program.addLine("Set EIR_c2_#{suffix} = #{eir_pow_fff_curve.coefficient2x}")
3733
+ fault_program.addLine("Set EIR_c3_#{suffix} = #{eir_pow_fff_curve.coefficient3xPOW2}")
3734
+ fault_program.addLine("Set cap_curve_v_pre_#{suffix} = (CAP_c1_#{suffix}) + ((CAP_c2_#{suffix})*FF_AF_nodef_#{suffix}) + ((CAP_c3_#{suffix})*FF_AF_nodef_#{suffix}*FF_AF_nodef_#{suffix})")
3735
+ fault_program.addLine("Set eir_curve_v_pre_#{suffix} = (EIR_c1_#{suffix}) + ((EIR_c2_#{suffix})*FF_AF_nodef_#{suffix}) + ((EIR_c3_#{suffix})*FF_AF_nodef_#{suffix}*FF_AF_nodef_#{suffix})")
3736
+ fault_program.addLine("Set #{cap_fff_act.name} = cap_curve_v_pre_#{suffix} * CAP_IQ_adj_#{suffix}")
3737
+ fault_program.addLine("Set #{eir_pow_act.name} = eir_curve_v_pre_#{suffix} * EIR_IQ_adj_#{suffix}")
3738
+ else
3739
+ fault_program.addLine("Set CAP_c1_#{suffix} = #{cap_fff_curve.coefficient1Constant}")
3740
+ fault_program.addLine("Set CAP_c2_#{suffix} = #{cap_fff_curve.coefficient2w}")
3741
+ fault_program.addLine("Set CAP_c3_#{suffix} = #{cap_fff_curve.coefficient3x}")
3742
+ fault_program.addLine("Set CAP_c4_#{suffix} = #{cap_fff_curve.coefficient4y}")
3743
+ fault_program.addLine("Set CAP_c5_#{suffix} = #{cap_fff_curve.coefficient5z}")
3744
+ fault_program.addLine("Set Pow_c1_#{suffix} = #{eir_pow_fff_curve.coefficient1Constant}")
3745
+ fault_program.addLine("Set Pow_c2_#{suffix} = #{eir_pow_fff_curve.coefficient2w}")
3746
+ fault_program.addLine("Set Pow_c3_#{suffix} = #{eir_pow_fff_curve.coefficient3x}")
3747
+ fault_program.addLine("Set Pow_c4_#{suffix} = #{eir_pow_fff_curve.coefficient4y}")
3748
+ fault_program.addLine("Set Pow_c5_#{suffix} = #{eir_pow_fff_curve.coefficient5z}")
3749
+ fault_program.addLine("Set cap_curve_v_pre_#{suffix} = CAP_c1_#{suffix} + ((CAP_c2_#{suffix})*#{var1_sensor.name}) + (CAP_c3_#{suffix}*#{var2_sensor.name}) + (CAP_c4_#{suffix}*FF_AF_nodef_#{suffix}) + (CAP_c5_#{suffix}*#{var4_sensor.name})")
3750
+ fault_program.addLine("Set pow_curve_v_pre_#{suffix} = Pow_c1_#{suffix} + ((Pow_c2_#{suffix})*#{var1_sensor.name}) + (Pow_c3_#{suffix}*#{var2_sensor.name}) + (Pow_c4_#{suffix}*FF_AF_nodef_#{suffix})+ (Pow_c5_#{suffix}*#{var4_sensor.name})")
3751
+ fault_program.addLine("Set #{cap_fff_act.name} = cap_curve_v_pre_#{suffix} * CAP_IQ_adj_#{suffix}")
3752
+ fault_program.addLine("Set #{eir_pow_act.name} = pow_curve_v_pre_#{suffix} * EIR_IQ_adj_#{suffix} * CAP_IQ_adj_#{suffix}") # equationfit power curve modifies power instead of cop/eir, should also multiply capacity adjustment
3753
+ end
3754
+ fault_program.addLine("If #{cap_fff_act.name} < 0.0")
3755
+ fault_program.addLine(" Set #{cap_fff_act.name} = 1.0")
3756
+ fault_program.addLine('EndIf')
3757
+ fault_program.addLine("If #{eir_pow_act.name} < 0.0")
3758
+ fault_program.addLine(" Set #{eir_pow_act.name} = 1.0")
3759
+ fault_program.addLine('EndIf')
3760
+ end
3761
+ end
3762
+
3754
3763
  def self.apply_installation_quality(model, heating_system, cooling_system, unitary_system, htg_coil, clg_coil, control_zone)
3755
3764
  if not cooling_system.nil?
3756
3765
  charge_defect_ratio = cooling_system.charge_defect_ratio
@@ -3765,7 +3774,7 @@ class HVAC
3765
3774
  if (not clg_coil.nil?) && (cooling_system.fraction_cool_load_served > 0)
3766
3775
  clg_ap = cooling_system.additional_properties
3767
3776
  clg_cfm = cooling_system.cooling_airflow_cfm
3768
- if clg_coil.to_CoilCoolingDXSingleSpeed.is_initialized
3777
+ if clg_coil.to_CoilCoolingDXSingleSpeed.is_initialized || clg_coil.to_CoilCoolingWaterToAirHeatPumpEquationFit.is_initialized
3769
3778
  cool_airflow_rated_defect_ratio = [UnitConversions.convert(clg_cfm, 'cfm', 'm^3/s') / clg_coil.ratedAirFlowRate.get - 1.0]
3770
3779
  elsif clg_coil.to_CoilCoolingDXMultiSpeed.is_initialized
3771
3780
  cool_airflow_rated_defect_ratio = clg_coil.stages.zip(clg_ap.cool_fan_speed_ratios).map { |stage, speed_ratio| UnitConversions.convert(clg_cfm * speed_ratio, 'cfm', 'm^3/s') / stage.ratedAirFlowRate.get - 1.0 }
@@ -3776,7 +3785,7 @@ class HVAC
3776
3785
  if (not htg_coil.nil?) && (heating_system.fraction_heat_load_served > 0)
3777
3786
  htg_ap = heating_system.additional_properties
3778
3787
  htg_cfm = heating_system.heating_airflow_cfm
3779
- if htg_coil.to_CoilHeatingDXSingleSpeed.is_initialized
3788
+ if htg_coil.to_CoilHeatingDXSingleSpeed.is_initialized || htg_coil.to_CoilHeatingWaterToAirHeatPumpEquationFit.is_initialized
3780
3789
  heat_airflow_rated_defect_ratio = [UnitConversions.convert(htg_cfm, 'cfm', 'm^3/s') / htg_coil.ratedAirFlowRate.get - 1.0]
3781
3790
  elsif htg_coil.to_CoilHeatingDXMultiSpeed.is_initialized
3782
3791
  heat_airflow_rated_defect_ratio = htg_coil.stages.zip(htg_ap.heat_fan_speed_ratios).map { |stage, speed_ratio| UnitConversions.convert(htg_cfm * speed_ratio, 'cfm', 'm^3/s') / stage.ratedAirFlowRate.get - 1.0 }
@@ -3785,7 +3794,7 @@ class HVAC
3785
3794
 
3786
3795
  return if cool_airflow_rated_defect_ratio.empty? && heat_airflow_rated_defect_ratio.empty?
3787
3796
 
3788
- obj_name = "#{unitary_system.name} install quality"
3797
+ obj_name = "#{unitary_system.name} IQ"
3789
3798
 
3790
3799
  tin_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Mean Air Temperature')
3791
3800
  tin_sensor.setName("#{obj_name} tin s")
@@ -3802,167 +3811,11 @@ class HVAC
3802
3811
  fault_program.addLine("Set F_CH = #{f_chg.round(3)}")
3803
3812
 
3804
3813
  if not cool_airflow_rated_defect_ratio.empty?
3805
- if clg_coil.is_a? OpenStudio::Model::CoilCoolingDXSingleSpeed
3806
- num_speeds = 1
3807
- cool_cap_fff_curves = [clg_coil.totalCoolingCapacityFunctionOfFlowFractionCurve.to_CurveQuadratic.get]
3808
- cool_eir_fff_curves = [clg_coil.energyInputRatioFunctionOfFlowFractionCurve.to_CurveQuadratic.get]
3809
- elsif clg_coil.is_a? OpenStudio::Model::CoilCoolingDXMultiSpeed
3810
- num_speeds = clg_coil.stages.size
3811
- cool_cap_fff_curves = clg_coil.stages.map { |stage| stage.totalCoolingCapacityFunctionofFlowFractionCurve.to_CurveQuadratic.get }
3812
- cool_eir_fff_curves = clg_coil.stages.map { |stage| stage.energyInputRatioFunctionofFlowFractionCurve.to_CurveQuadratic.get }
3813
- else
3814
- fail 'cooling coil not supported'
3815
- end
3816
- for speed in 0..(num_speeds - 1)
3817
- cool_cap_fff_curve = cool_cap_fff_curves[speed]
3818
- cool_cap_fff_act = OpenStudio::Model::EnergyManagementSystemActuator.new(cool_cap_fff_curve, 'Curve', 'Curve Result')
3819
- cool_cap_fff_act.setName("#{obj_name} cap clg act")
3820
-
3821
- cool_eir_fff_curve = cool_eir_fff_curves[speed]
3822
- cool_eir_fff_act = OpenStudio::Model::EnergyManagementSystemActuator.new(cool_eir_fff_curve, 'Curve', 'Curve Result')
3823
- cool_eir_fff_act.setName("#{obj_name} eir clg act")
3824
-
3825
- # NOTE: heat pump (cooling) curves don't exhibit expected trends at extreme faults;
3826
- fault_program.addLine("Set a1_AF_Qgr_c = #{cool_cap_fff_curve.coefficient1Constant}")
3827
- fault_program.addLine("Set a2_AF_Qgr_c = #{cool_cap_fff_curve.coefficient2x}")
3828
- fault_program.addLine("Set a3_AF_Qgr_c = #{cool_cap_fff_curve.coefficient3xPOW2}")
3829
- fault_program.addLine("Set a1_AF_EIR_c = #{cool_eir_fff_curve.coefficient1Constant}")
3830
- fault_program.addLine("Set a2_AF_EIR_c = #{cool_eir_fff_curve.coefficient2x}")
3831
- fault_program.addLine("Set a3_AF_EIR_c = #{cool_eir_fff_curve.coefficient3xPOW2}")
3832
-
3833
- qgr_values, p_values, ff_chg_values = get_installation_quality_cooling_coeff(f_chg)
3834
-
3835
- fault_program.addLine("Set a1_CH_Qgr_c = #{qgr_values[0]}")
3836
- fault_program.addLine("Set a2_CH_Qgr_c = #{qgr_values[1]}")
3837
- fault_program.addLine("Set a3_CH_Qgr_c = #{qgr_values[2]}")
3838
- fault_program.addLine("Set a4_CH_Qgr_c = #{qgr_values[3]}")
3839
-
3840
- fault_program.addLine("Set a1_CH_P_c = #{p_values[0]}")
3841
- fault_program.addLine("Set a2_CH_P_c = #{p_values[1]}")
3842
- fault_program.addLine("Set a3_CH_P_c = #{p_values[2]}")
3843
- fault_program.addLine("Set a4_CH_P_c = #{p_values[3]}")
3844
-
3845
- ff_ch_c = 1.0 / (1.0 + (qgr_values[0] + (qgr_values[1] * ff_chg_values[0]) + (qgr_values[2] * ff_chg_values[1]) + (qgr_values[3] * f_chg)) * f_chg)
3846
- fault_program.addLine("Set FF_CH_c = #{ff_ch_c.round(3)}")
3847
-
3848
- fault_program.addLine('Set q0_CH = a1_CH_Qgr_c')
3849
- fault_program.addLine("Set q1_CH = a2_CH_Qgr_c*#{tin_sensor.name}")
3850
- fault_program.addLine("Set q2_CH = a3_CH_Qgr_c*#{tout_sensor.name}")
3851
- fault_program.addLine('Set q3_CH = a4_CH_Qgr_c*F_CH')
3852
- fault_program.addLine('Set Y_CH_Q_c = 1 + ((q0_CH+(q1_CH)+(q2_CH)+(q3_CH))*F_CH)')
3853
-
3854
- fault_program.addLine('Set q0_AF_CH = a1_AF_Qgr_c')
3855
- fault_program.addLine('Set q1_AF_CH = a2_AF_Qgr_c*FF_CH_c')
3856
- fault_program.addLine('Set q2_AF_CH = a3_AF_Qgr_c*FF_CH_c*FF_CH_c')
3857
- fault_program.addLine('Set p_CH_Q_c = Y_CH_Q_c/(q0_AF_CH+(q1_AF_CH)+(q2_AF_CH))')
3858
-
3859
- fault_program.addLine('Set p1_CH = a1_CH_P_c')
3860
- fault_program.addLine("Set p2_CH = a2_CH_P_c*#{tin_sensor.name}")
3861
- fault_program.addLine("Set p3_CH = a3_CH_P_c*#{tout_sensor.name}")
3862
- fault_program.addLine('Set p4_CH = a4_CH_P_c*F_CH')
3863
- fault_program.addLine('Set Y_CH_COP_c = Y_CH_Q_c/(1 + (p1_CH+(p2_CH)+(p3_CH)+(p4_CH))*F_CH)')
3864
-
3865
- fault_program.addLine('Set eir0_AF_CH = a1_AF_EIR_c')
3866
- fault_program.addLine('Set eir1_AF_CH = a2_AF_EIR_c*FF_CH_c')
3867
- fault_program.addLine('Set eir2_AF_CH = a3_AF_EIR_c*FF_CH_c*FF_CH_c')
3868
- fault_program.addLine('Set p_CH_COP_c = Y_CH_COP_c*(eir0_AF_CH+(eir1_AF_CH)+(eir2_AF_CH))')
3869
-
3870
- fault_program.addLine("Set FF_AF_c = 1.0 + #{cool_airflow_rated_defect_ratio[speed].round(3)}")
3871
- fault_program.addLine('Set FF_AF_comb_c = FF_CH_c * FF_AF_c')
3872
-
3873
- fault_program.addLine('Set q0_AF_comb = a1_AF_Qgr_c')
3874
- fault_program.addLine('Set q1_AF_comb = a2_AF_Qgr_c*FF_AF_comb_c')
3875
- fault_program.addLine('Set q2_AF_comb = a3_AF_Qgr_c*FF_AF_comb_c*FF_AF_comb_c')
3876
- fault_program.addLine('Set p_AF_Q_c = q0_AF_comb+(q1_AF_comb)+(q2_AF_comb)')
3877
-
3878
- fault_program.addLine('Set eir0_AF_comb = a1_AF_EIR_c')
3879
- fault_program.addLine('Set eir1_AF_comb = a2_AF_EIR_c*FF_AF_comb_c')
3880
- fault_program.addLine('Set eir2_AF_comb = a3_AF_EIR_c*FF_AF_comb_c*FF_AF_comb_c')
3881
- fault_program.addLine('Set p_AF_COP_c = 1.0/(eir0_AF_comb+(eir1_AF_comb)+(eir2_AF_comb))')
3882
-
3883
- fault_program.addLine("Set #{cool_cap_fff_act.name} = (p_CH_Q_c * p_AF_Q_c)")
3884
- fault_program.addLine("Set #{cool_eir_fff_act.name} = (1.0 / (p_CH_COP_c * p_AF_COP_c))")
3885
- end
3814
+ add_install_quality_calculations(fault_program, tin_sensor, tout_sensor, cool_airflow_rated_defect_ratio, clg_coil, model, f_chg, obj_name, :clg, cool_airflow_defect_ratio)
3886
3815
  end
3887
3816
 
3888
3817
  if not heat_airflow_rated_defect_ratio.empty?
3889
-
3890
- if htg_coil.is_a? OpenStudio::Model::CoilHeatingDXSingleSpeed
3891
- num_speeds = 1
3892
- heat_cap_fff_curves = [htg_coil.totalHeatingCapacityFunctionofFlowFractionCurve.to_CurveQuadratic.get]
3893
- heat_eir_fff_curves = [htg_coil.energyInputRatioFunctionofFlowFractionCurve.to_CurveQuadratic.get]
3894
- elsif htg_coil.is_a? OpenStudio::Model::CoilHeatingDXMultiSpeed
3895
- num_speeds = htg_coil.stages.size
3896
- heat_cap_fff_curves = htg_coil.stages.map { |stage| stage.heatingCapacityFunctionofFlowFractionCurve.to_CurveQuadratic.get }
3897
- heat_eir_fff_curves = htg_coil.stages.map { |stage| stage.energyInputRatioFunctionofFlowFractionCurve.to_CurveQuadratic.get }
3898
- else
3899
- fail 'heating coil not supported'
3900
- end
3901
- for speed in 0..(num_speeds - 1)
3902
- heat_cap_fff_curve = heat_cap_fff_curves[speed]
3903
- heat_cap_fff_act = OpenStudio::Model::EnergyManagementSystemActuator.new(heat_cap_fff_curve, 'Curve', 'Curve Result')
3904
- heat_cap_fff_act.setName("#{obj_name} cap htg act")
3905
-
3906
- heat_eir_fff_curve = heat_eir_fff_curves[speed]
3907
- heat_eir_fff_act = OpenStudio::Model::EnergyManagementSystemActuator.new(heat_eir_fff_curve, 'Curve', 'Curve Result')
3908
- heat_eir_fff_act.setName("#{obj_name} eir htg act")
3909
-
3910
- fault_program.addLine("Set a1_AF_Qgr_h = #{heat_cap_fff_curve.coefficient1Constant}")
3911
- fault_program.addLine("Set a2_AF_Qgr_h = #{heat_cap_fff_curve.coefficient2x}")
3912
- fault_program.addLine("Set a3_AF_Qgr_h = #{heat_cap_fff_curve.coefficient3xPOW2}")
3913
- fault_program.addLine("Set a1_AF_EIR_h = #{heat_eir_fff_curve.coefficient1Constant}")
3914
- fault_program.addLine("Set a2_AF_EIR_h = #{heat_eir_fff_curve.coefficient2x}")
3915
- fault_program.addLine("Set a3_AF_EIR_h = #{heat_eir_fff_curve.coefficient3xPOW2}")
3916
-
3917
- qgr_values, p_values, ff_chg_values = get_installation_quality_heating_coeff(f_chg)
3918
-
3919
- fault_program.addLine("Set a1_CH_Qgr_h = #{qgr_values[0]}")
3920
- fault_program.addLine("Set a2_CH_Qgr_h = #{qgr_values[1]}")
3921
- fault_program.addLine("Set a3_CH_Qgr_h = #{qgr_values[2]}")
3922
-
3923
- fault_program.addLine("Set a1_CH_P_h = #{p_values[0]}")
3924
- fault_program.addLine("Set a2_CH_P_h = #{p_values[1]}")
3925
- fault_program.addLine("Set a3_CH_P_h = #{p_values[2]}")
3926
-
3927
- ff_ch_h = 1 / (1 + (qgr_values[0] + qgr_values[1] * ff_chg_values[0] + qgr_values[2] * f_chg) * f_chg)
3928
- fault_program.addLine("Set FF_CH_h = #{ff_ch_h.round(3)}")
3929
-
3930
- fault_program.addLine('Set qh1_CH = a1_CH_Qgr_h')
3931
- fault_program.addLine("Set qh2_CH = a2_CH_Qgr_h*#{tout_sensor.name}")
3932
- fault_program.addLine('Set qh3_CH = a3_CH_Qgr_h*F_CH')
3933
- fault_program.addLine('Set Y_CH_Q_h = 1 + ((qh1_CH+(qh2_CH)+(qh3_CH))*F_CH)')
3934
-
3935
- fault_program.addLine('Set qh0_AF_CH = a1_AF_Qgr_h')
3936
- fault_program.addLine('Set qh1_AF_CH = a2_AF_Qgr_h*FF_CH_h')
3937
- fault_program.addLine('Set qh2_AF_CH = a3_AF_Qgr_h*FF_CH_h*FF_CH_h')
3938
- fault_program.addLine('Set p_CH_Q_h = Y_CH_Q_h/(qh0_AF_CH + (qh1_AF_CH) +(qh2_AF_CH))')
3939
-
3940
- fault_program.addLine('Set ph1_CH = a1_CH_P_h')
3941
- fault_program.addLine("Set ph2_CH = a2_CH_P_h*#{tout_sensor.name}")
3942
- fault_program.addLine('Set ph3_CH = a3_CH_P_h*F_CH')
3943
- fault_program.addLine('Set Y_CH_COP_h = Y_CH_Q_h/(1 + ((ph1_CH+(ph2_CH)+(ph3_CH))*F_CH))')
3944
-
3945
- fault_program.addLine('Set eirh0_AF_CH = a1_AF_EIR_h')
3946
- fault_program.addLine('Set eirh1_AF_CH = a2_AF_EIR_h*FF_CH_h')
3947
- fault_program.addLine('Set eirh2_AF_CH = a3_AF_EIR_h*FF_CH_h*FF_CH_h')
3948
- fault_program.addLine('Set p_CH_COP_h = Y_CH_COP_h*(eirh0_AF_CH + (eirh1_AF_CH) + (eirh2_AF_CH))')
3949
-
3950
- fault_program.addLine("Set FF_AF_h = 1.0 + #{heat_airflow_rated_defect_ratio[speed].round(3)}")
3951
- fault_program.addLine('Set FF_AF_comb_h = FF_CH_h * FF_AF_h')
3952
-
3953
- fault_program.addLine('Set qh0_AF_comb = a1_AF_Qgr_h')
3954
- fault_program.addLine('Set qh1_AF_comb = a2_AF_Qgr_h*FF_AF_comb_h')
3955
- fault_program.addLine('Set qh2_AF_comb = a3_AF_Qgr_h*FF_AF_comb_h*FF_AF_comb_h')
3956
- fault_program.addLine('Set p_AF_Q_h = qh0_AF_comb+(qh1_AF_comb)+(qh2_AF_comb)')
3957
-
3958
- fault_program.addLine('Set eirh0_AF_comb = a1_AF_EIR_h')
3959
- fault_program.addLine('Set eirh1_AF_comb = a2_AF_EIR_h*FF_AF_comb_h')
3960
- fault_program.addLine('Set eirh2_AF_comb = a3_AF_EIR_h*FF_AF_comb_h*FF_AF_comb_h')
3961
- fault_program.addLine('Set p_AF_COP_h = 1.0/(eirh0_AF_comb+(eirh1_AF_comb)+(eirh2_AF_comb))')
3962
-
3963
- fault_program.addLine("Set #{heat_cap_fff_act.name} = (p_CH_Q_h * p_AF_Q_h)")
3964
- fault_program.addLine("Set #{heat_eir_fff_act.name} = 1.0 / (p_CH_COP_h * p_AF_COP_h)")
3965
- end
3818
+ add_install_quality_calculations(fault_program, tin_sensor, tout_sensor, heat_airflow_rated_defect_ratio, htg_coil, model, f_chg, obj_name, :htg, heat_airflow_defect_ratio)
3966
3819
  end
3967
3820
  program_calling_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
3968
3821
  program_calling_manager.setName("#{obj_name} program manager")
@@ -3974,7 +3827,7 @@ class HVAC
3974
3827
  return 30.0 # W/ton, per ANSI/RESNET/ICC 301-2019 Section 4.4.5 (closed loop)
3975
3828
  end
3976
3829
 
3977
- def self.apply_shared_systems(hpxml = true)
3830
+ def self.apply_shared_systems(hpxml)
3978
3831
  applied_clg = apply_shared_cooling_systems(hpxml)
3979
3832
  applied_htg = apply_shared_heating_systems(hpxml)
3980
3833
  return unless (applied_clg || applied_htg)
@@ -4149,7 +4002,7 @@ class HVAC
4149
4002
  def self.set_num_speeds(hvac_system)
4150
4003
  hvac_ap = hvac_system.additional_properties
4151
4004
 
4152
- if hvac_system.is_a?(HPXML::CoolingSystem) && (hvac_system.cooling_system_type == HPXML::HVACTypeRoomAirConditioner)
4005
+ if hvac_system.is_a?(HPXML::CoolingSystem) && ([HPXML::HVACTypeRoomAirConditioner, HPXML::HVACTypePTAC].include? hvac_system.cooling_system_type)
4153
4006
  hvac_ap.num_speeds = 1
4154
4007
  elsif (hvac_system.is_a?(HPXML::CoolingSystem) && (hvac_system.cooling_system_type == HPXML::HVACTypeMiniSplitAirConditioner)) ||
4155
4008
  (hvac_system.is_a?(HPXML::HeatPump) && (hvac_system.heat_pump_type == HPXML::HVACTypeHeatPumpMiniSplit))
@@ -4168,18 +4021,19 @@ class HVAC
4168
4021
  return UnitConversions.convert(capacity, 'Btu/hr', 'ton') * UnitConversions.convert(rated_cfm_per_ton, 'cfm', 'm^3/s') * capacity_ratio
4169
4022
  end
4170
4023
 
4171
- def self.is_central_air_conditioner_and_furnace(hpxml, heating_system, cooling_system)
4172
- if not (hpxml.heating_systems.include?(heating_system) && (heating_system.heating_system_type == HPXML::HVACTypeFurnace))
4024
+ def self.is_attached_heating_and_cooling_systems(hpxml, heating_system, cooling_system)
4025
+ # Now only allows furnace+AC and PTAC
4026
+ if not (hpxml.heating_systems.include?(heating_system) && ([HPXML::HVACTypeFurnace, HPXML::HVACTypePTACHeating].include? heating_system.heating_system_type))
4173
4027
  return false
4174
4028
  end
4175
- if not (hpxml.cooling_systems.include?(cooling_system) && (cooling_system.cooling_system_type == HPXML::HVACTypeCentralAirConditioner))
4029
+ if not (hpxml.cooling_systems.include?(cooling_system) && ([HPXML::HVACTypeCentralAirConditioner, HPXML::HVACTypePTAC].include? cooling_system.cooling_system_type))
4176
4030
  return false
4177
4031
  end
4178
4032
 
4179
4033
  return true
4180
4034
  end
4181
4035
 
4182
- def self.get_hpxml_hvac_systems(hpxml)
4036
+ def self.get_hpxml_hvac_systems(hpxml, exclude_hp_backup_systems: false)
4183
4037
  # Returns a list of heating/cooling systems, incorporating whether
4184
4038
  # multiple systems are connected to the same distribution system
4185
4039
  # (e.g., a furnace + central air conditioner w/ the same ducts).
@@ -4187,7 +4041,7 @@ class HVAC
4187
4041
 
4188
4042
  hpxml.cooling_systems.each do |cooling_system|
4189
4043
  heating_system = nil
4190
- if is_central_air_conditioner_and_furnace(hpxml, cooling_system.attached_heating_system, cooling_system)
4044
+ if is_attached_heating_and_cooling_systems(hpxml, cooling_system.attached_heating_system, cooling_system)
4191
4045
  heating_system = cooling_system.attached_heating_system
4192
4046
  end
4193
4047
  hvac_systems << { cooling: cooling_system,
@@ -4195,14 +4049,21 @@ class HVAC
4195
4049
  end
4196
4050
 
4197
4051
  hpxml.heating_systems.each do |heating_system|
4198
- if is_central_air_conditioner_and_furnace(hpxml, heating_system, heating_system.attached_cooling_system)
4199
- next # Already processed combined AC+furnace
4052
+ if is_attached_heating_and_cooling_systems(hpxml, heating_system, heating_system.attached_cooling_system)
4053
+ next # Already processed with cooling
4200
4054
  end
4055
+ if exclude_hp_backup_systems && heating_system.is_heat_pump_backup_system
4056
+ next
4057
+ end
4058
+
4201
4059
  hvac_systems << { cooling: nil,
4202
4060
  heating: heating_system }
4203
4061
  end
4204
4062
 
4205
- hpxml.heat_pumps.each do |heat_pump|
4063
+ # Heat pump with backup system must be sorted last so that the last two
4064
+ # HVAC systems in the EnergyPlus EquipmentList are 1) the heat pump and
4065
+ # 2) the heat pump backup system.
4066
+ hpxml.heat_pumps.sort_by { |hp| hp.backup_system_idref.to_s }.each do |heat_pump|
4206
4067
  hvac_systems << { cooling: heat_pump,
4207
4068
  heating: heat_pump }
4208
4069
  end
@@ -4215,7 +4076,9 @@ class HVAC
4215
4076
  min_airflow = 3.0 # cfm; E+ min airflow is 0.001 m3/s
4216
4077
  hpxml.heating_systems.each do |htg_sys|
4217
4078
  htg_sys.heating_capacity = [htg_sys.heating_capacity, min_capacity].max
4218
- htg_sys.heating_airflow_cfm = [htg_sys.heating_airflow_cfm, min_airflow].max
4079
+ if not htg_sys.heating_airflow_cfm.nil?
4080
+ htg_sys.heating_airflow_cfm = [htg_sys.heating_airflow_cfm, min_airflow].max
4081
+ end
4219
4082
  end
4220
4083
  hpxml.cooling_systems.each do |clg_sys|
4221
4084
  clg_sys.cooling_capacity = [clg_sys.cooling_capacity, min_capacity].max
@@ -4252,4 +4115,45 @@ class HVAC
4252
4115
 
4253
4116
  return { rh_setpoint: rh_setpoint, ief: ief }
4254
4117
  end
4118
+
4119
+ def self.get_default_hvac_efficiency_by_year_installed(year, hvac_type, fuel_type, units)
4120
+ if [HPXML::HVACTypeWallFurnace, HPXML::HVACTypeFloorFurnace].include? hvac_type
4121
+ # For wall/floor furnaces, map other fuel types to natural gas because the lookup table only provides efficiencies for natural gas.
4122
+ fuel_type = HPXML::FuelTypeNaturalGas
4123
+ end
4124
+
4125
+ type_id = { HPXML::HVACTypeCentralAirConditioner => 'split_dx',
4126
+ HPXML::HVACTypeRoomAirConditioner => 'packaged_dx',
4127
+ HPXML::HVACTypePTAC => 'packaged_dx',
4128
+ HPXML::HVACTypeHeatPumpAirToAir => 'heat_pump',
4129
+ HPXML::HVACTypeFurnace => 'central_furnace',
4130
+ HPXML::HVACTypeWallFurnace => 'wall_furnace',
4131
+ HPXML::HVACTypeFloorFurnace => 'wall_furnace', # floor furnaces mapped to wall furnaces
4132
+ HPXML::HVACTypeBoiler => 'boiler' }[hvac_type]
4133
+
4134
+ fuel_primary_id = { EPlus::FuelTypeElectricity => 'electric',
4135
+ EPlus::FuelTypeNaturalGas => 'natural_gas',
4136
+ EPlus::FuelTypeOil => 'fuel_oil',
4137
+ EPlus::FuelTypeCoal => 'fuel_oil', # assumption
4138
+ EPlus::FuelTypeWoodCord => 'fuel_oil', # assumption
4139
+ EPlus::FuelTypeWoodPellets => 'fuel_oil', # assumption
4140
+ EPlus::FuelTypePropane => 'lpg' }[EPlus.fuel_type(fuel_type)]
4141
+
4142
+ metric_id = units.downcase
4143
+ value = nil
4144
+ lookup_year = 0
4145
+ CSV.foreach(File.join(File.dirname(__FILE__), 'lu_hvac_equipment_efficiency.csv'), headers: true) do |row|
4146
+ next unless row['type_id'] == type_id
4147
+ next unless row['fuel_primary_id'] == fuel_primary_id
4148
+ next unless row['metric_id'] == metric_id
4149
+
4150
+ row_year = Integer(row['year'])
4151
+ if (row_year - year).abs <= (lookup_year - year).abs
4152
+ lookup_year = row_year
4153
+ value = Float(row['value'])
4154
+ end
4155
+ end
4156
+
4157
+ return value
4158
+ end
4255
4159
  end