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
@@ -0,0 +1,1977 @@
1
+ # frozen_string_literal: true
2
+
3
+ # see the URL below for information on how to write OpenStudio measures
4
+ # http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/
5
+
6
+ require_relative 'resources/constants.rb'
7
+ require_relative '../HPXMLtoOpenStudio/resources/constants.rb'
8
+ require_relative '../HPXMLtoOpenStudio/resources/energyplus.rb'
9
+ require_relative '../HPXMLtoOpenStudio/resources/hpxml.rb'
10
+ require_relative '../HPXMLtoOpenStudio/resources/unit_conversions.rb'
11
+
12
+ # start the measure
13
+ class ReportSimulationOutput < OpenStudio::Measure::ReportingMeasure
14
+ # human readable name
15
+ def name
16
+ # Measure name should be the title case of the class name.
17
+ return 'HPXML Simulation Output Report'
18
+ end
19
+
20
+ # human readable description
21
+ def description
22
+ return 'Reports simulation outputs for residential HPXML-based models.'
23
+ end
24
+
25
+ # human readable description of modeling approach
26
+ def modeler_description
27
+ return 'Processes EnergyPlus simulation outputs in order to generate an annual output file and an optional timeseries output file.'
28
+ end
29
+
30
+ # define the arguments that the user will input
31
+ def arguments(model)
32
+ args = OpenStudio::Measure::OSArgumentVector.new
33
+
34
+ format_chs = OpenStudio::StringVector.new
35
+ format_chs << 'csv'
36
+ format_chs << 'json'
37
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('output_format', format_chs, false)
38
+ arg.setDisplayName('Output Format')
39
+ arg.setDescription('The file format of the annual (and timeseries, if requested) outputs.')
40
+ arg.setDefaultValue('csv')
41
+ args << arg
42
+
43
+ timeseries_frequency_chs = OpenStudio::StringVector.new
44
+ timeseries_frequency_chs << 'none'
45
+ reporting_frequency_map.keys.each do |freq|
46
+ timeseries_frequency_chs << freq
47
+ end
48
+ arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('timeseries_frequency', timeseries_frequency_chs, true)
49
+ arg.setDisplayName('Timeseries Reporting Frequency')
50
+ arg.setDescription("The frequency at which to report timeseries output data. Using 'none' will disable timeseries outputs.")
51
+ arg.setDefaultValue('none')
52
+ args << arg
53
+
54
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('include_timeseries_fuel_consumptions', true)
55
+ arg.setDisplayName('Generate Timeseries Output: Fuel Consumptions')
56
+ arg.setDescription('Generates timeseries energy consumptions for each fuel type.')
57
+ arg.setDefaultValue(false)
58
+ args << arg
59
+
60
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('include_timeseries_end_use_consumptions', true)
61
+ arg.setDisplayName('Generate Timeseries Output: End Use Consumptions')
62
+ arg.setDescription('Generates timeseries energy consumptions for each end use.')
63
+ arg.setDefaultValue(false)
64
+ args << arg
65
+
66
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('include_timeseries_hot_water_uses', true)
67
+ arg.setDisplayName('Generate Timeseries Output: Hot Water Uses')
68
+ arg.setDescription('Generates timeseries hot water usages for each end use.')
69
+ arg.setDefaultValue(false)
70
+ args << arg
71
+
72
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('include_timeseries_total_loads', true)
73
+ arg.setDisplayName('Generate Timeseries Output: Total Loads')
74
+ arg.setDescription('Generates timeseries total heating, cooling, and hot water loads.')
75
+ arg.setDefaultValue(false)
76
+ args << arg
77
+
78
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('include_timeseries_component_loads', true)
79
+ arg.setDisplayName('Generate Timeseries Output: Component Loads')
80
+ arg.setDescription('Generates timeseries heating and cooling loads disaggregated by component type.')
81
+ arg.setDefaultValue(false)
82
+ args << arg
83
+
84
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('include_timeseries_zone_temperatures', true)
85
+ arg.setDisplayName('Generate Timeseries Output: Zone Temperatures')
86
+ arg.setDescription('Generates timeseries temperatures for each thermal zone.')
87
+ arg.setDefaultValue(false)
88
+ args << arg
89
+
90
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('include_timeseries_airflows', true)
91
+ arg.setDisplayName('Generate Timeseries Output: Airflows')
92
+ arg.setDescription('Generates timeseries airflows.')
93
+ arg.setDefaultValue(false)
94
+ args << arg
95
+
96
+ arg = OpenStudio::Measure::OSArgument::makeBoolArgument('include_timeseries_weather', true)
97
+ arg.setDisplayName('Generate Timeseries Output: Weather')
98
+ arg.setDescription('Generates timeseries weather data.')
99
+ arg.setDefaultValue(false)
100
+ args << arg
101
+
102
+ return args
103
+ end
104
+
105
+ # define the outputs that the measure will create
106
+ def outputs
107
+ outs = OpenStudio::Measure::OSOutputVector.new
108
+
109
+ setup_outputs()
110
+
111
+ all_outputs = []
112
+ all_outputs << @fuels
113
+ all_outputs << @end_uses
114
+ all_outputs << @loads
115
+ all_outputs << @unmet_hours
116
+ all_outputs << @peak_fuels
117
+ all_outputs << @peak_loads
118
+ all_outputs << @component_loads
119
+ all_outputs << @hot_water_uses
120
+
121
+ output_names = []
122
+ all_outputs.each do |outputs|
123
+ outputs.each do |key, obj|
124
+ output_names << get_runner_output_name(obj)
125
+ end
126
+ end
127
+
128
+ output_names.each do |output_name|
129
+ outs << OpenStudio::Measure::OSOutput.makeDoubleOutput(output_name)
130
+ end
131
+
132
+ return outs
133
+ end
134
+
135
+ # return a vector of IdfObject's to request EnergyPlus objects needed by the run method
136
+ def energyPlusOutputRequests(runner, user_arguments)
137
+ super(runner, user_arguments)
138
+
139
+ result = OpenStudio::IdfObjectVector.new
140
+
141
+ model = runner.lastOpenStudioModel
142
+ if model.empty?
143
+ runner.registerError('Cannot find last model.')
144
+ return false
145
+ end
146
+ model = model.get
147
+
148
+ # use the built-in error checking
149
+ if !runner.validateUserArguments(arguments(model), user_arguments)
150
+ return result
151
+ end
152
+
153
+ # get the last model and sql file
154
+ @model = runner.lastOpenStudioModel.get
155
+
156
+ setup_outputs()
157
+
158
+ total_loads_program = @model.getModelObjectByName(Constants.ObjectNameTotalLoadsProgram.gsub(' ', '_')).get.to_EnergyManagementSystemProgram.get
159
+ comp_loads_program = @model.getModelObjectByName(Constants.ObjectNameComponentLoadsProgram.gsub(' ', '_'))
160
+ if comp_loads_program.is_initialized
161
+ comp_loads_program = comp_loads_program.get.to_EnergyManagementSystemProgram.get
162
+ else
163
+ comp_loads_program = nil
164
+ end
165
+
166
+ timeseries_frequency = runner.getStringArgumentValue('timeseries_frequency', user_arguments)
167
+ if timeseries_frequency != 'none'
168
+ include_timeseries_fuel_consumptions = runner.getBoolArgumentValue('include_timeseries_fuel_consumptions', user_arguments)
169
+ include_timeseries_end_use_consumptions = runner.getBoolArgumentValue('include_timeseries_end_use_consumptions', user_arguments)
170
+ include_timeseries_hot_water_uses = runner.getBoolArgumentValue('include_timeseries_hot_water_uses', user_arguments)
171
+ include_timeseries_total_loads = runner.getBoolArgumentValue('include_timeseries_total_loads', user_arguments)
172
+ include_timeseries_component_loads = runner.getBoolArgumentValue('include_timeseries_component_loads', user_arguments)
173
+ include_timeseries_zone_temperatures = runner.getBoolArgumentValue('include_timeseries_zone_temperatures', user_arguments)
174
+ include_timeseries_airflows = runner.getBoolArgumentValue('include_timeseries_airflows', user_arguments)
175
+ include_timeseries_weather = runner.getBoolArgumentValue('include_timeseries_weather', user_arguments)
176
+ end
177
+
178
+ # Fuel outputs
179
+ @fuels.each do |fuel_type, fuel|
180
+ fuel.meters.each do |meter|
181
+ result << OpenStudio::IdfObject.load("Output:Meter,#{meter},runperiod;").get
182
+ if include_timeseries_fuel_consumptions
183
+ result << OpenStudio::IdfObject.load("Output:Meter,#{meter},#{timeseries_frequency};").get
184
+ end
185
+ end
186
+ end
187
+ if @end_uses.select { |key, end_use| end_use.is_negative && end_use.variables.size > 0 }.size > 0
188
+ result << OpenStudio::IdfObject.load('Output:Meter,ElectricityProduced:Facility,runperiod;').get # Used for error checking
189
+ end
190
+ if include_timeseries_fuel_consumptions
191
+ # If fuel uses are selected, we also need to select end uses because fuels may be adjusted by DSE.
192
+ # TODO: This could be removed if we could account for DSE in E+ or used EMS.
193
+ include_timeseries_end_use_consumptions = true
194
+ end
195
+
196
+ # End Use/Hot Water Use/Ideal Load outputs
197
+ { @end_uses.values => include_timeseries_end_use_consumptions,
198
+ @hot_water_uses.values => include_timeseries_hot_water_uses,
199
+ @ideal_system_loads.values => false }.each do |uses, include_timeries|
200
+ uses.each do |use|
201
+ use.variables.each do |sys_id, varkey, var|
202
+ result << OpenStudio::IdfObject.load("Output:Variable,#{varkey},#{var},runperiod;").get
203
+ if include_timeries
204
+ result << OpenStudio::IdfObject.load("Output:Variable,#{varkey},#{var},#{timeseries_frequency};").get
205
+ end
206
+ end
207
+ end
208
+ end
209
+
210
+ # Peak Fuel outputs (annual only)
211
+ @peak_fuels.values.each do |peak_fuel|
212
+ peak_fuel.meters.each do |meter|
213
+ result << OpenStudio::IdfObject.load("Output:Table:Monthly,#{peak_fuel.report},2,#{meter},HoursPositive,Electricity:Facility,MaximumDuringHoursShown;").get
214
+ end
215
+ end
216
+
217
+ # Peak Load outputs (annual only)
218
+ @peak_loads.values.each do |peak_load|
219
+ result << OpenStudio::IdfObject.load("EnergyManagementSystem:OutputVariable,#{peak_load.ems_variable}_peakload_outvar,#{peak_load.ems_variable},Summed,ZoneTimestep,#{total_loads_program.name},J;").get
220
+ result << OpenStudio::IdfObject.load("Output:Table:Monthly,#{peak_load.report},2,#{peak_load.ems_variable}_peakload_outvar,Maximum;").get
221
+ end
222
+
223
+ # Component Load outputs
224
+ @component_loads.values.each do |comp_load|
225
+ next if comp_loads_program.nil?
226
+
227
+ result << OpenStudio::IdfObject.load("EnergyManagementSystem:OutputVariable,#{comp_load.ems_variable}_annual_outvar,#{comp_load.ems_variable},Summed,ZoneTimestep,#{comp_loads_program.name},J;").get
228
+ result << OpenStudio::IdfObject.load("Output:Variable,*,#{comp_load.ems_variable}_annual_outvar,runperiod;").get
229
+ if include_timeseries_component_loads
230
+ result << OpenStudio::IdfObject.load("EnergyManagementSystem:OutputVariable,#{comp_load.ems_variable}_timeseries_outvar,#{comp_load.ems_variable},Summed,ZoneTimestep,#{comp_loads_program.name},J;").get
231
+ result << OpenStudio::IdfObject.load("Output:Variable,*,#{comp_load.ems_variable}_timeseries_outvar,#{timeseries_frequency};").get
232
+ end
233
+ end
234
+
235
+ # Total Load outputs
236
+ @loads.values.each do |load|
237
+ if not load.ems_variable.nil?
238
+ result << OpenStudio::IdfObject.load("EnergyManagementSystem:OutputVariable,#{load.ems_variable}_annual_outvar,#{load.ems_variable},Summed,ZoneTimestep,#{total_loads_program.name},J;").get
239
+ result << OpenStudio::IdfObject.load("Output:Variable,*,#{load.ems_variable}_annual_outvar,runperiod;").get
240
+ if include_timeseries_total_loads
241
+ result << OpenStudio::IdfObject.load("EnergyManagementSystem:OutputVariable,#{load.ems_variable}_timeseries_outvar,#{load.ems_variable},Summed,ZoneTimestep,#{total_loads_program.name},J;").get
242
+ result << OpenStudio::IdfObject.load("Output:Variable,*,#{load.ems_variable}_timeseries_outvar,#{timeseries_frequency};").get
243
+ end
244
+ end
245
+ load.variables.each do |sys_id, varkey, var|
246
+ result << OpenStudio::IdfObject.load("Output:Variable,#{varkey},#{var},runperiod;").get
247
+ if include_timeseries_total_loads
248
+ result << OpenStudio::IdfObject.load("Output:Variable,#{varkey},#{var},#{timeseries_frequency};").get
249
+ end
250
+ end
251
+ end
252
+
253
+ # Temperature outputs (timeseries only)
254
+ if include_timeseries_zone_temperatures
255
+ result << OpenStudio::IdfObject.load("Output:Variable,*,Zone Mean Air Temperature,#{timeseries_frequency};").get
256
+ # For reporting temperature-scheduled spaces timeseries temperatures.
257
+ keys = [HPXML::LocationOtherHeatedSpace,
258
+ HPXML::LocationOtherMultifamilyBufferSpace,
259
+ HPXML::LocationOtherNonFreezingSpace,
260
+ HPXML::LocationOtherHousingUnit,
261
+ HPXML::LocationExteriorWall,
262
+ HPXML::LocationUnderSlab]
263
+ keys.each do |key|
264
+ next if @model.getScheduleConstants.select { |o| o.name.to_s == key }.size == 0
265
+
266
+ result << OpenStudio::IdfObject.load("Output:Variable,#{key},Schedule Value,#{timeseries_frequency};").get
267
+ end
268
+ end
269
+
270
+ # Airflow outputs (timeseries only)
271
+ if include_timeseries_airflows
272
+ @airflows.values.each do |airflow|
273
+ ems_program = @model.getModelObjectByName(airflow.ems_program.gsub(' ', '_')).get.to_EnergyManagementSystemProgram.get
274
+ airflow.ems_variables.each do |ems_variable|
275
+ result << OpenStudio::IdfObject.load("EnergyManagementSystem:OutputVariable,#{ems_variable}_timeseries_outvar,#{ems_variable},Averaged,ZoneTimestep,#{ems_program.name},m^3/s;").get
276
+ result << OpenStudio::IdfObject.load("Output:Variable,*,#{ems_variable}_timeseries_outvar,#{timeseries_frequency};").get
277
+ end
278
+ end
279
+ end
280
+
281
+ # Weather outputs (timeseries only)
282
+ if include_timeseries_weather
283
+ @weather.values.each do |weather_data|
284
+ result << OpenStudio::IdfObject.load("Output:Variable,*,#{weather_data.variable},#{timeseries_frequency};").get
285
+ end
286
+ end
287
+
288
+ # Dual-fuel heat pump loads
289
+ if not @object_variables_by_key[[LT, LT::Heating]].nil?
290
+ @object_variables_by_key[[LT, LT::Heating]].each do |vals|
291
+ sys_id, key, var = vals
292
+ result << OpenStudio::IdfObject.load("Output:Variable,#{key},#{var},runperiod;").get
293
+ end
294
+ end
295
+
296
+ return result
297
+ end
298
+
299
+ # define what happens when the measure is run
300
+ def run(runner, user_arguments)
301
+ super(runner, user_arguments)
302
+
303
+ model = runner.lastOpenStudioModel
304
+ if model.empty?
305
+ runner.registerError('Cannot find OpenStudio model.')
306
+ return false
307
+ end
308
+ @model = model.get
309
+
310
+ # use the built-in error checking
311
+ if !runner.validateUserArguments(arguments(@model), user_arguments)
312
+ return false
313
+ end
314
+
315
+ output_format = runner.getStringArgumentValue('output_format', user_arguments)
316
+ timeseries_frequency = runner.getStringArgumentValue('timeseries_frequency', user_arguments)
317
+ if timeseries_frequency != 'none'
318
+ include_timeseries_fuel_consumptions = runner.getBoolArgumentValue('include_timeseries_fuel_consumptions', user_arguments)
319
+ include_timeseries_end_use_consumptions = runner.getBoolArgumentValue('include_timeseries_end_use_consumptions', user_arguments)
320
+ include_timeseries_hot_water_uses = runner.getBoolArgumentValue('include_timeseries_hot_water_uses', user_arguments)
321
+ include_timeseries_total_loads = runner.getBoolArgumentValue('include_timeseries_total_loads', user_arguments)
322
+ include_timeseries_component_loads = runner.getBoolArgumentValue('include_timeseries_component_loads', user_arguments)
323
+ include_timeseries_zone_temperatures = runner.getBoolArgumentValue('include_timeseries_zone_temperatures', user_arguments)
324
+ include_timeseries_airflows = runner.getBoolArgumentValue('include_timeseries_airflows', user_arguments)
325
+ include_timeseries_weather = runner.getBoolArgumentValue('include_timeseries_weather', user_arguments)
326
+ end
327
+
328
+ sqlFile = runner.lastEnergyPlusSqlFile
329
+ if sqlFile.empty?
330
+ runner.registerError('Cannot find EnergyPlus sql file.')
331
+ return false
332
+ end
333
+ @sqlFile = sqlFile.get
334
+ if not @sqlFile.connectionOpen
335
+ runner.registerError('EnergyPlus simulation failed.')
336
+ return false
337
+ end
338
+ @model.setSqlFile(@sqlFile)
339
+
340
+ hpxml_path = @model.getBuilding.additionalProperties.getFeatureAsString('hpxml_path').get
341
+ building_id = @model.getBuilding.additionalProperties.getFeatureAsString('building_id').get
342
+ @hpxml = HPXML.new(hpxml_path: hpxml_path, building_id: building_id)
343
+ HVAC.apply_shared_systems(@hpxml) # Needed for ERI shared HVAC systems
344
+ @eri_design = @hpxml.header.eri_design
345
+
346
+ setup_outputs()
347
+
348
+ # Set paths
349
+ if not @eri_design.nil?
350
+ # ERI run, store files in a particular location
351
+ output_dir = File.dirname(hpxml_path)
352
+ hpxml_name = File.basename(hpxml_path).gsub('.xml', '')
353
+ annual_output_path = File.join(output_dir, "#{hpxml_name}.#{output_format}")
354
+ eri_output_path = File.join(output_dir, "#{hpxml_name}_ERI.csv")
355
+ timeseries_output_path = File.join(output_dir, "#{hpxml_name}_#{timeseries_frequency.capitalize}.#{output_format}")
356
+ else
357
+ output_dir = File.dirname(@sqlFile.path.to_s)
358
+ annual_output_path = File.join(output_dir, "results_annual.#{output_format}")
359
+ eri_output_path = nil
360
+ timeseries_output_path = File.join(output_dir, "results_timeseries.#{output_format}")
361
+ end
362
+
363
+ @timestamps = get_timestamps(timeseries_frequency)
364
+
365
+ # Retrieve outputs
366
+ outputs = get_outputs(timeseries_frequency,
367
+ include_timeseries_fuel_consumptions,
368
+ include_timeseries_end_use_consumptions,
369
+ include_timeseries_hot_water_uses,
370
+ include_timeseries_total_loads,
371
+ include_timeseries_component_loads,
372
+ include_timeseries_zone_temperatures,
373
+ include_timeseries_airflows,
374
+ include_timeseries_weather)
375
+
376
+ if not check_for_errors(runner, outputs)
377
+ teardown()
378
+ return false
379
+ end
380
+
381
+ # Write/report results
382
+ write_annual_output_results(runner, outputs, output_format, annual_output_path)
383
+ report_sim_outputs(runner)
384
+ write_eri_output_results(outputs, eri_output_path)
385
+ write_timeseries_output_results(runner, output_format,
386
+ timeseries_output_path,
387
+ timeseries_frequency,
388
+ include_timeseries_fuel_consumptions,
389
+ include_timeseries_end_use_consumptions,
390
+ include_timeseries_hot_water_uses,
391
+ include_timeseries_total_loads,
392
+ include_timeseries_component_loads,
393
+ include_timeseries_zone_temperatures,
394
+ include_timeseries_airflows,
395
+ include_timeseries_weather)
396
+
397
+ teardown()
398
+ return true
399
+ end
400
+
401
+ def teardown
402
+ @sqlFile.close()
403
+
404
+ # Ensure sql file is immediately freed; otherwise we can get
405
+ # errors on Windows when trying to delete this file.
406
+ GC.start()
407
+ end
408
+
409
+ def get_timestamps(timeseries_frequency)
410
+ if timeseries_frequency == 'hourly'
411
+ interval_type = 1
412
+ elsif timeseries_frequency == 'daily'
413
+ interval_type = 2
414
+ elsif timeseries_frequency == 'monthly'
415
+ interval_type = 3
416
+ elsif timeseries_frequency == 'timestep'
417
+ interval_type = -1
418
+ end
419
+
420
+ query = "SELECT Year || ' ' || Month || ' ' || Day || ' ' || Hour || ' ' || Minute As Timestamp FROM Time WHERE IntervalType='#{interval_type}'"
421
+ values = @sqlFile.execAndReturnVectorOfString(query)
422
+ fail "Query error: #{query}" unless values.is_initialized
423
+
424
+ timestamps = []
425
+ values.get.each do |value|
426
+ year, month, day, hour, minute = value.split(' ')
427
+ ts = Time.new(year, month, day, hour, minute)
428
+ timestamps << ts.strftime('%Y/%m/%d %H:%M:00')
429
+ end
430
+
431
+ return timestamps
432
+ end
433
+
434
+ def get_outputs(timeseries_frequency,
435
+ include_timeseries_fuel_consumptions,
436
+ include_timeseries_end_use_consumptions,
437
+ include_timeseries_hot_water_uses,
438
+ include_timeseries_total_loads,
439
+ include_timeseries_component_loads,
440
+ include_timeseries_zone_temperatures,
441
+ include_timeseries_airflows,
442
+ include_timeseries_weather)
443
+ outputs = {}
444
+
445
+ if include_timeseries_fuel_consumptions
446
+ # If fuel uses are selected, we also need to select end uses because
447
+ # fuels may be adjusted by DSE.
448
+ # TODO: This could be removed if we could account for DSE in E+ or used EMS.
449
+ include_timeseries_end_use_consumptions = true
450
+ end
451
+
452
+ # Fuel Uses
453
+ @fuels.each do |fuel_type, fuel|
454
+ fuel.annual_output = get_report_meter_data_annual(fuel.meters)
455
+ if include_timeseries_fuel_consumptions
456
+ fuel.timeseries_output = get_report_meter_data_timeseries(fuel.meters, UnitConversions.convert(1.0, 'J', fuel.timeseries_units), 0, timeseries_frequency)
457
+ end
458
+ end
459
+
460
+ # Electricity Produced (used for error checking)
461
+ outputs[:total_elec_produced] = get_report_meter_data_annual(['ElectricityProduced:Facility'])
462
+
463
+ # Peak Electricity Consumption
464
+ @peak_fuels.each do |key, peak_fuel|
465
+ peak_fuel.annual_output = get_tabular_data_value(peak_fuel.report.upcase, 'Meter', 'Custom Monthly Report', ['Maximum of Months'], 'ELECTRICITY:FACILITY {MAX FOR HOURS SHOWN}', peak_fuel.annual_units)
466
+ end
467
+
468
+ # Total loads
469
+ @loads.each do |load_type, load|
470
+ if not load.ems_variable.nil?
471
+ # Obtain from EMS output variable
472
+ load.annual_output = get_report_variable_data_annual(['EMS'], ["#{load.ems_variable}_annual_outvar"])
473
+ if include_timeseries_total_loads
474
+ load.timeseries_output = get_report_variable_data_timeseries(['EMS'], ["#{load.ems_variable}_timeseries_outvar"], UnitConversions.convert(1.0, 'J', load.timeseries_units), 0, timeseries_frequency)
475
+ end
476
+ elsif load.variables.size > 0
477
+ # Obtain from output variable
478
+ load.variables.map { |v| v[0] }.each do |sys_id|
479
+ keys = load.variables.select { |v| v[0] == sys_id }.map { |v| v[1] }
480
+ vars = load.variables.select { |v| v[0] == sys_id }.map { |v| v[2] }
481
+
482
+ load.annual_output_by_system[sys_id] = get_report_variable_data_annual(keys, vars, is_negative: load.is_negative)
483
+ if include_timeseries_total_loads && (load_type == LT::HotWaterDelivered)
484
+ load.timeseries_output_by_system[sys_id] = get_report_variable_data_timeseries(keys, vars, UnitConversions.convert(1.0, 'J', load.timeseries_units), 0, timeseries_frequency, is_negative: load.is_negative)
485
+ end
486
+ end
487
+ end
488
+ end
489
+
490
+ # Component Loads
491
+ @component_loads.each do |key, comp_load|
492
+ comp_load.annual_output = get_report_variable_data_annual(['EMS'], ["#{comp_load.ems_variable}_annual_outvar"])
493
+ if include_timeseries_component_loads
494
+ comp_load.timeseries_output = get_report_variable_data_timeseries(['EMS'], ["#{comp_load.ems_variable}_timeseries_outvar"], UnitConversions.convert(1.0, 'J', comp_load.timeseries_units), 0, timeseries_frequency)
495
+ end
496
+ end
497
+
498
+ # Unmet Hours
499
+ @unmet_hours.each do |key, unmet_hour|
500
+ if (key == UHT::Heating && @hpxml.total_fraction_heat_load_served <= 0) ||
501
+ (key == UHT::Cooling && @hpxml.total_fraction_cool_load_served <= 0)
502
+ next # Don't report unmet hours if there is no heating/cooling system
503
+ end
504
+
505
+ unmet_hour.annual_output = get_tabular_data_value('SystemSummary', 'Entire Facility', 'Time Setpoint Not Met', [HPXML::LocationLivingSpace.upcase], unmet_hour.col_name, unmet_hour.annual_units)
506
+ end
507
+
508
+ # Ideal system loads (expected fraction of loads that are not met by partial HVAC (e.g., room AC that meets 30% of load))
509
+ @ideal_system_loads.each do |load_type, ideal_load|
510
+ ideal_load.variables.map { |v| v[0] }.each do |sys_id|
511
+ keys = ideal_load.variables.select { |v| v[0] == sys_id }.map { |v| v[1] }
512
+ vars = ideal_load.variables.select { |v| v[0] == sys_id }.map { |v| v[2] }
513
+
514
+ ideal_load.annual_output = get_report_variable_data_annual(keys, vars)
515
+ end
516
+ end
517
+
518
+ # Peak Building Space Heating/Cooling Loads (total heating/cooling energy delivered including backup ideal air system)
519
+ @peak_loads.each do |load_type, peak_load|
520
+ peak_load.annual_output = UnitConversions.convert(get_tabular_data_value(peak_load.report.upcase, 'EMS', 'Custom Monthly Report', ['Maximum of Months'], "#{peak_load.ems_variable.upcase}_PEAKLOAD_OUTVAR {Maximum}", 'W'), 'Wh', peak_load.annual_units)
521
+ end
522
+
523
+ # End Uses
524
+ @end_uses.each do |key, end_use|
525
+ fuel_type, end_use_type = key
526
+
527
+ end_use.variables.map { |v| v[0] }.each do |sys_id|
528
+ keys = end_use.variables.select { |v| v[0] == sys_id }.map { |v| v[1] }
529
+ vars = end_use.variables.select { |v| v[0] == sys_id }.map { |v| v[2] }
530
+
531
+ end_use.annual_output_by_system[sys_id] = get_report_variable_data_annual(keys, vars, is_negative: end_use.is_negative)
532
+ if include_timeseries_end_use_consumptions
533
+ end_use.timeseries_output_by_system[sys_id] = get_report_variable_data_timeseries(keys, vars, UnitConversions.convert(1.0, 'J', end_use.timeseries_units), 0, timeseries_frequency, is_negative: end_use.is_negative)
534
+ end
535
+ end
536
+ end
537
+
538
+ # Hot Water Uses
539
+ @hot_water_uses.each do |hot_water_type, hot_water|
540
+ hot_water.variables.map { |v| v[0] }.each do |sys_id|
541
+ keys = hot_water.variables.select { |v| v[0] == sys_id }.map { |v| v[1] }
542
+ vars = hot_water.variables.select { |v| v[0] == sys_id }.map { |v| v[2] }
543
+
544
+ hot_water.annual_output_by_system[sys_id] = get_report_variable_data_annual(keys, vars, UnitConversions.convert(1.0, 'm^3', hot_water.annual_units))
545
+ if include_timeseries_hot_water_uses
546
+ hot_water.timeseries_output_by_system[sys_id] = get_report_variable_data_timeseries(keys, vars, UnitConversions.convert(1.0, 'm^3', hot_water.timeseries_units), 0, timeseries_frequency)
547
+ end
548
+ end
549
+ end
550
+
551
+ # Apply Heating/Cooling DSEs
552
+ (@hpxml.heating_systems + @hpxml.heat_pumps).each do |htg_system|
553
+ next unless (htg_system.is_a?(HPXML::HeatingSystem) && htg_system.is_heat_pump_backup_system) || htg_system.fraction_heat_load_served > 0
554
+ next if htg_system.distribution_system_idref.nil?
555
+ next unless htg_system.distribution_system.distribution_system_type == HPXML::HVACDistributionTypeDSE
556
+ next if htg_system.distribution_system.annual_heating_dse.nil?
557
+
558
+ dse = htg_system.distribution_system.annual_heating_dse
559
+ @fuels.each do |fuel_type, fuel|
560
+ [EUT::Heating, EUT::HeatingFanPump].each do |end_use_type|
561
+ end_use = @end_uses[[fuel_type, end_use_type]]
562
+ next if end_use.nil?
563
+
564
+ if not end_use.annual_output_by_system[htg_system.id].nil?
565
+ apply_multiplier_to_output(end_use, fuel, htg_system.id, 1.0 / dse)
566
+ end
567
+ if not end_use.annual_output_by_system[htg_system.id + '_DFHPBackup'].nil?
568
+ apply_multiplier_to_output(end_use, fuel, htg_system.id + '_DFHPBackup', 1.0 / dse)
569
+ end
570
+ end
571
+ end
572
+ end
573
+ (@hpxml.cooling_systems + @hpxml.heat_pumps).each do |clg_system|
574
+ next unless clg_system.fraction_cool_load_served > 0
575
+ next if clg_system.distribution_system_idref.nil?
576
+ next unless clg_system.distribution_system.distribution_system_type == HPXML::HVACDistributionTypeDSE
577
+ next if clg_system.distribution_system.annual_cooling_dse.nil?
578
+
579
+ dse = clg_system.distribution_system.annual_cooling_dse
580
+ @fuels.each do |fuel_type, fuel|
581
+ [EUT::Cooling, EUT::CoolingFanPump].each do |end_use_type|
582
+ end_use = @end_uses[[fuel_type, end_use_type]]
583
+ next if end_use.nil?
584
+ next if end_use.annual_output_by_system[clg_system.id].nil?
585
+
586
+ apply_multiplier_to_output(end_use, fuel, clg_system.id, 1.0 / dse)
587
+ end
588
+ end
589
+ end
590
+
591
+ # Apply solar fraction to load for simple solar water heating systems
592
+ @hpxml.solar_thermal_systems.each do |solar_system|
593
+ next if solar_system.solar_fraction.nil?
594
+
595
+ @loads[LT::HotWaterSolarThermal].annual_output = 0.0 if @loads[LT::HotWaterSolarThermal].annual_output.nil?
596
+ @loads[LT::HotWaterSolarThermal].timeseries_output = [0.0] * @timestamps.size if @loads[LT::HotWaterSolarThermal].timeseries_output.nil?
597
+
598
+ if not solar_system.water_heating_system.nil?
599
+ dhw_ids = [solar_system.water_heating_system.id]
600
+ else # Apply to all water heating systems
601
+ dhw_ids = @hpxml.water_heating_systems.map { |dhw| dhw.id }
602
+ end
603
+ dhw_ids.each do |dhw_id|
604
+ apply_multiplier_to_output(@loads[LT::HotWaterDelivered], @loads[LT::HotWaterSolarThermal], dhw_id, 1.0 / (1.0 - solar_system.solar_fraction))
605
+ end
606
+ end
607
+
608
+ # Calculate aggregated values from per-system values as needed
609
+ (@end_uses.values + @loads.values + @hot_water_uses.values).each do |obj|
610
+ if obj.annual_output.nil?
611
+ if not obj.annual_output_by_system.empty?
612
+ obj.annual_output = obj.annual_output_by_system.values.sum(0.0)
613
+ else
614
+ obj.annual_output = 0.0
615
+ end
616
+ end
617
+ next unless obj.timeseries_output.empty? && (not obj.timeseries_output_by_system.empty?)
618
+
619
+ obj.timeseries_output = obj.timeseries_output_by_system.values[0]
620
+ obj.timeseries_output_by_system.values[1..-1].each do |values|
621
+ obj.timeseries_output = obj.timeseries_output.zip(values).map { |x, y| x + y }
622
+ end
623
+ end
624
+
625
+ # Get zone temperatures
626
+ if include_timeseries_zone_temperatures
627
+ zone_names = []
628
+ scheduled_temperature_names = []
629
+ @model.getThermalZones.each do |zone|
630
+ if zone.floorArea > 1
631
+ zone_names << zone.name.to_s.upcase
632
+ end
633
+ end
634
+ @model.getScheduleConstants.each do |schedule|
635
+ next unless [HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace,
636
+ HPXML::LocationOtherHousingUnit, HPXML::LocationExteriorWall, HPXML::LocationUnderSlab].include? schedule.name.to_s
637
+
638
+ scheduled_temperature_names << schedule.name.to_s.upcase
639
+ end
640
+ zone_names.sort.each do |zone_name|
641
+ @zone_temps[zone_name] = ZoneTemp.new
642
+ @zone_temps[zone_name].name = "Temperature: #{zone_name.split.map(&:capitalize).join(' ')}"
643
+ @zone_temps[zone_name].timeseries_units = 'F'
644
+ @zone_temps[zone_name].timeseries_output = get_report_variable_data_timeseries([zone_name], ['Zone Mean Air Temperature'], 9.0 / 5.0, 32.0, timeseries_frequency)
645
+ end
646
+ scheduled_temperature_names.sort.each do |scheduled_temperature_name|
647
+ @zone_temps[scheduled_temperature_name] = ZoneTemp.new
648
+ @zone_temps[scheduled_temperature_name].name = "Temperature: #{scheduled_temperature_name.split.map(&:capitalize).join(' ')}"
649
+ @zone_temps[scheduled_temperature_name].timeseries_units = 'F'
650
+ @zone_temps[scheduled_temperature_name].timeseries_output = get_report_variable_data_timeseries([scheduled_temperature_name], ['Schedule Value'], 9.0 / 5.0, 32.0, timeseries_frequency)
651
+ end
652
+ end
653
+
654
+ if include_timeseries_airflows
655
+ @airflows.each do |airflow_type, airflow|
656
+ airflow.timeseries_output = get_report_variable_data_timeseries(['EMS'], airflow.ems_variables.map { |var| "#{var}_timeseries_outvar" }, UnitConversions.convert(1.0, 'm^3/s', 'cfm'), 0, timeseries_frequency, true)
657
+ end
658
+ end
659
+
660
+ if include_timeseries_weather
661
+ @weather.each do |weather_type, weather_data|
662
+ if weather_data.timeseries_units == 'F'
663
+ unit_conv = 9.0 / 5.0
664
+ unit_adder = 32.0
665
+ else
666
+ unit_conv = UnitConversions.convert(1.0, weather_data.variable_units, weather_data.timeseries_units)
667
+ unit_adder = 0
668
+ end
669
+ weather_data.timeseries_output = get_report_variable_data_timeseries(['Environment'], [weather_data.variable], unit_conv, unit_adder, timeseries_frequency)
670
+ end
671
+ end
672
+
673
+ return outputs
674
+ end
675
+
676
+ def check_for_errors(runner, outputs)
677
+ all_total = @fuels.values.map { |x| x.annual_output.to_f }.sum(0.0)
678
+ all_total += @ideal_system_loads.values.map { |x| x.annual_output.to_f }.sum(0.0)
679
+ if all_total == 0
680
+ runner.registerError('Simulation unsuccessful.')
681
+ return false
682
+ end
683
+
684
+ # Check sum of electricity produced end use outputs match total
685
+ sum_elec_produced = -1 * @end_uses.select { |k, eu| eu.is_negative }.map { |k, eu| eu.annual_output.to_f }.sum(0.0)
686
+ total_elec_produced = outputs[:total_elec_produced]
687
+ if (sum_elec_produced - total_elec_produced).abs > 0.1
688
+ runner.registerError("#{FT::Elec} produced category end uses (#{sum_elec_produced}) do not sum to total (#{total_elec_produced}).")
689
+ return false
690
+ end
691
+
692
+ # Check sum of end use outputs match fuel outputs
693
+ @fuels.keys.each do |fuel_type|
694
+ sum_categories = @end_uses.select { |k, eu| k[0] == fuel_type }.map { |k, eu| eu.annual_output.to_f }.sum(0.0)
695
+ fuel_total = @fuels[fuel_type].annual_output.to_f
696
+ if fuel_type == FT::Elec
697
+ fuel_total -= sum_elec_produced
698
+ end
699
+ if (fuel_total - sum_categories).abs > 0.1
700
+ runner.registerError("#{fuel_type} category end uses (#{sum_categories}) do not sum to total (#{fuel_total}).")
701
+ return false
702
+ end
703
+ end
704
+
705
+ # Check sum of timeseries outputs match annual outputs
706
+ { @end_uses => 'End Use',
707
+ @fuels => 'Fuel',
708
+ @loads => 'Load',
709
+ @component_loads => 'Component Load' }.each do |outputs, output_type|
710
+ outputs.each do |key, obj|
711
+ next if obj.timeseries_output.empty?
712
+
713
+ sum_timeseries = UnitConversions.convert(obj.timeseries_output.sum(0.0), obj.timeseries_units, obj.annual_units)
714
+ annual_total = obj.annual_output.to_f
715
+ if (annual_total - sum_timeseries).abs > 0.1
716
+ runner.registerError("Timeseries outputs (#{sum_timeseries}) do not sum to annual output (#{annual_total}) for #{output_type}: #{key}.")
717
+ return false
718
+ end
719
+ end
720
+ end
721
+
722
+ return true
723
+ end
724
+
725
+ def write_annual_output_results(runner, outputs, output_format, annual_output_path)
726
+ line_break = nil
727
+ elec_produced = @end_uses.select { |k, eu| eu.is_negative }.map { |k, eu| eu.annual_output.to_f }.sum(0.0)
728
+
729
+ results_out = []
730
+ @fuels.each do |fuel_type, fuel|
731
+ results_out << ["#{fuel.name} (#{fuel.annual_units})", fuel.annual_output.to_f.round(2)]
732
+ if fuel_type == FT::Elec
733
+ results_out << ['Fuel Use: Electricity: Net (MBtu)', (fuel.annual_output.to_f + elec_produced).round(2)]
734
+ end
735
+ end
736
+ results_out << [line_break]
737
+ @end_uses.each do |key, end_use|
738
+ results_out << ["#{end_use.name} (#{end_use.annual_units})", end_use.annual_output.to_f.round(2)]
739
+ end
740
+ results_out << [line_break]
741
+ @loads.each do |load_type, load|
742
+ results_out << ["#{load.name} (#{load.annual_units})", load.annual_output.to_f.round(2)]
743
+ end
744
+ results_out << [line_break]
745
+ @unmet_hours.each do |load_type, unmet_hour|
746
+ results_out << ["#{unmet_hour.name} (#{unmet_hour.annual_units})", unmet_hour.annual_output.to_f.round(2)]
747
+ end
748
+ results_out << [line_break]
749
+ @peak_fuels.each do |key, peak_fuel|
750
+ results_out << ["#{peak_fuel.name} (#{peak_fuel.annual_units})", peak_fuel.annual_output.to_f.round(0)]
751
+ end
752
+ results_out << [line_break]
753
+ @peak_loads.each do |load_type, peak_load|
754
+ results_out << ["#{peak_load.name} (#{peak_load.annual_units})", peak_load.annual_output.to_f.round(2)]
755
+ end
756
+ if @component_loads.values.map { |load| load.annual_output.to_f }.sum != 0 # Skip if component loads not calculated
757
+ results_out << [line_break]
758
+ @component_loads.each do |load_type, load|
759
+ results_out << ["#{load.name} (#{load.annual_units})", load.annual_output.to_f.round(2)]
760
+ end
761
+ end
762
+ results_out << [line_break]
763
+ @hot_water_uses.each do |hot_water_type, hot_water|
764
+ results_out << ["#{hot_water.name} (#{hot_water.annual_units})", hot_water.annual_output.to_f.round(0)]
765
+ end
766
+
767
+ if output_format == 'csv'
768
+ CSV.open(annual_output_path, 'wb') { |csv| results_out.to_a.each { |elem| csv << elem } }
769
+ elsif output_format == 'json'
770
+ h = {}
771
+ results_out.each do |out|
772
+ next if out == [line_break]
773
+
774
+ grp, name = out[0].split(':', 2)
775
+ h[grp] = {} if h[grp].nil?
776
+ h[grp][name.strip] = out[1]
777
+ end
778
+
779
+ require 'json'
780
+ File.open(annual_output_path, 'w') { |json| json.write(JSON.pretty_generate(h)) }
781
+ end
782
+ runner.registerInfo("Wrote annual output results to #{annual_output_path}.")
783
+ end
784
+
785
+ def report_sim_outputs(runner)
786
+ all_outputs = []
787
+ all_outputs << @fuels
788
+ all_outputs << @end_uses
789
+ all_outputs << @loads
790
+ all_outputs << @unmet_hours
791
+ all_outputs << @peak_fuels
792
+ all_outputs << @peak_loads
793
+ if @component_loads.values.map { |load| load.annual_output.to_f }.sum != 0 # Skip if component loads not calculated
794
+ all_outputs << @component_loads
795
+ end
796
+ all_outputs << @hot_water_uses
797
+
798
+ all_outputs.each do |outputs|
799
+ outputs.each do |key, obj|
800
+ output_name = get_runner_output_name(obj)
801
+ output_val = obj.annual_output.to_f.round(2)
802
+ runner.registerValue(output_name, output_val)
803
+ runner.registerInfo("Registering #{output_val} for #{output_name}.")
804
+ next unless key == FT::Elec && obj.is_a?(Fuel)
805
+
806
+ # Also add Net Electricity
807
+ elec_total = @fuels[FT::Elec].annual_output.to_f
808
+ elec_produced = @end_uses.select { |k, eu| eu.is_negative }.map { |k, eu| eu.annual_output.to_f }.sum(0.0)
809
+ output_name = 'Fuel Use: Electricity: Net (MBtu)'
810
+ output_val = (elec_total + elec_produced).round(2)
811
+ runner.registerValue(output_name, output_val)
812
+ runner.registerInfo("Registering #{output_val} for #{output_name}.")
813
+ end
814
+ end
815
+ end
816
+
817
+ def get_runner_output_name(obj)
818
+ return "#{obj.name} #{obj.annual_units}"
819
+ end
820
+
821
+ def write_eri_output_results(outputs, csv_path)
822
+ return true if csv_path.nil?
823
+
824
+ line_break = nil
825
+
826
+ def sanitize_string(s)
827
+ [' ', ':', '/'].each do |c|
828
+ next unless s.include? c
829
+
830
+ s = s.gsub(c, '')
831
+ end
832
+ return s
833
+ end
834
+
835
+ def ordered_values(hash, sys_ids)
836
+ vals = []
837
+ sys_ids.each do |sys_id|
838
+ if not hash[sys_id].nil?
839
+ vals << hash[sys_id]
840
+ else
841
+ vals << 0.0
842
+ end
843
+ end
844
+ return vals
845
+ end
846
+
847
+ def get_sys_ids_of_interest(type, htg_ids, clg_ids, dhw_ids, vent_prehtg_ids, vent_preclg_ids)
848
+ if type.downcase.include? 'hot water'
849
+ return dhw_ids
850
+ elsif type.downcase.include? 'mech vent preheating'
851
+ return vent_prehtg_ids
852
+ elsif type.downcase.include? 'mech vent precooling'
853
+ return vent_preclg_ids
854
+ elsif type.downcase.include? 'heating'
855
+ return htg_ids
856
+ elsif type.downcase.include? 'cooling'
857
+ return clg_ids
858
+ end
859
+
860
+ return
861
+ end
862
+
863
+ def get_eec_value_numerator(unit)
864
+ if ['HSPF', 'SEER', 'EER', 'CEER'].include? unit
865
+ return 3.413
866
+ elsif ['AFUE', 'COP', 'Percent', 'EF'].include? unit
867
+ return 1.0
868
+ end
869
+ end
870
+
871
+ def get_ids(ids, seed_id_map)
872
+ return ids.map { |id| seed_id_map[id].nil? ? id : seed_id_map[id] }
873
+ end
874
+
875
+ results_out = []
876
+
877
+ # Retrieve info from HPXML object
878
+ # FUTURE: Move this code to the ERI workflow
879
+ htg_ids, clg_ids, dhw_ids, vent_prehtg_ids, vent_preclg_ids = [], [], [], [], []
880
+ htg_eecs, clg_eecs, dhw_eecs, vent_prehtg_eecs, vent_preclg_eecs = {}, {}, {}, {}, {}
881
+ htg_fuels, dhw_fuels, vent_prehtg_fuels = {}, {}, {}
882
+ seed_id_map = {}
883
+ @hpxml.heating_systems.each do |htg_system|
884
+ next unless htg_system.fraction_heat_load_served > 0
885
+
886
+ htg_ids << htg_system.id
887
+ seed_id_map[htg_system.id] = htg_system.seed_id
888
+ htg_fuels[htg_system.id] = htg_system.heating_system_fuel
889
+ if not htg_system.heating_efficiency_afue.nil?
890
+ htg_eecs[htg_system.id] = get_eec_value_numerator('AFUE') / htg_system.heating_efficiency_afue
891
+ elsif not htg_system.heating_efficiency_percent.nil?
892
+ htg_eecs[htg_system.id] = get_eec_value_numerator('Percent') / htg_system.heating_efficiency_percent
893
+ end
894
+ end
895
+ @hpxml.cooling_systems.each do |clg_system|
896
+ next unless clg_system.fraction_cool_load_served > 0
897
+
898
+ clg_ids << clg_system.id
899
+ seed_id_map[clg_system.id] = clg_system.seed_id
900
+ if not clg_system.cooling_efficiency_seer.nil?
901
+ clg_eecs[clg_system.id] = get_eec_value_numerator('SEER') / clg_system.cooling_efficiency_seer
902
+ elsif not clg_system.cooling_efficiency_eer.nil?
903
+ clg_eecs[clg_system.id] = get_eec_value_numerator('EER') / clg_system.cooling_efficiency_eer
904
+ elsif not clg_system.cooling_efficiency_ceer.nil?
905
+ clg_eecs[clg_system.id] = get_eec_value_numerator('CEER') / clg_system.cooling_efficiency_ceer
906
+ end
907
+ if clg_system.cooling_system_type == HPXML::HVACTypeEvaporativeCooler
908
+ clg_eecs[clg_system.id] = get_eec_value_numerator('SEER') / 15.0 # Arbitrary
909
+ end
910
+ end
911
+ @hpxml.heat_pumps.each do |heat_pump|
912
+ if heat_pump.fraction_heat_load_served > 0
913
+ htg_ids << heat_pump.id
914
+ seed_id_map[heat_pump.id] = heat_pump.seed_id
915
+ htg_fuels[heat_pump.id] = heat_pump.heat_pump_fuel
916
+ if not heat_pump.heating_efficiency_hspf.nil?
917
+ htg_eecs[heat_pump.id] = get_eec_value_numerator('HSPF') / heat_pump.heating_efficiency_hspf
918
+ elsif not heat_pump.heating_efficiency_cop.nil?
919
+ htg_eecs[heat_pump.id] = get_eec_value_numerator('COP') / heat_pump.heating_efficiency_cop
920
+ end
921
+ end
922
+ next unless heat_pump.fraction_cool_load_served > 0
923
+
924
+ clg_ids << heat_pump.id
925
+ seed_id_map[heat_pump.id] = heat_pump.seed_id
926
+ if not heat_pump.cooling_efficiency_seer.nil?
927
+ clg_eecs[heat_pump.id] = get_eec_value_numerator('SEER') / heat_pump.cooling_efficiency_seer
928
+ elsif not heat_pump.cooling_efficiency_eer.nil?
929
+ clg_eecs[heat_pump.id] = get_eec_value_numerator('EER') / heat_pump.cooling_efficiency_eer
930
+ end
931
+ end
932
+ @hpxml.water_heating_systems.each do |dhw_system|
933
+ dhw_ids << dhw_system.id
934
+ ef_or_uef = nil
935
+ ef_or_uef = dhw_system.energy_factor unless dhw_system.energy_factor.nil?
936
+ ef_or_uef = dhw_system.uniform_energy_factor unless dhw_system.uniform_energy_factor.nil?
937
+ if ef_or_uef.nil?
938
+ # Get assumed EF for combi system
939
+ @model.getWaterHeaterMixeds.each do |wh|
940
+ dhw_id = wh.additionalProperties.getFeatureAsString('HPXML_ID')
941
+ next unless (dhw_id.is_initialized && dhw_id.get == dhw_system.id)
942
+
943
+ ef_or_uef = wh.additionalProperties.getFeatureAsDouble('EnergyFactor').get
944
+ end
945
+ end
946
+ value_adj = 1.0
947
+ value_adj = dhw_system.performance_adjustment if dhw_system.water_heater_type == HPXML::WaterHeaterTypeTankless
948
+ if (not ef_or_uef.nil?) && (not value_adj.nil?)
949
+ dhw_eecs[dhw_system.id] = get_eec_value_numerator('EF') / (Float(ef_or_uef) * Float(value_adj))
950
+ end
951
+ if [HPXML::WaterHeaterTypeCombiTankless, HPXML::WaterHeaterTypeCombiStorage].include? dhw_system.water_heater_type
952
+ dhw_fuels[dhw_system.id] = dhw_system.related_hvac_system.heating_system_fuel
953
+ else
954
+ dhw_fuels[dhw_system.id] = dhw_system.fuel_type
955
+ end
956
+ end
957
+ @hpxml.ventilation_fans.each do |vent_fan|
958
+ next unless vent_fan.used_for_whole_building_ventilation
959
+
960
+ if not vent_fan.preheating_fuel.nil?
961
+ vent_prehtg_ids << vent_fan.id
962
+ vent_prehtg_fuels[vent_fan.id] = vent_fan.preheating_fuel
963
+ vent_prehtg_eecs[vent_fan.id] = get_eec_value_numerator('COP') / vent_fan.preheating_efficiency_cop
964
+ end
965
+ next unless not vent_fan.precooling_fuel.nil?
966
+
967
+ vent_preclg_ids << vent_fan.id
968
+ vent_preclg_eecs[vent_fan.id] = get_eec_value_numerator('COP') / vent_fan.precooling_efficiency_cop
969
+ end
970
+
971
+ # Calculate ERI Reference Loads
972
+ (@hpxml.heating_systems + @hpxml.heat_pumps).each do |htg_system|
973
+ next unless htg_ids.include? htg_system.id
974
+
975
+ @loads[LT::Heating].annual_output_by_system[htg_system.id] = htg_system.fraction_heat_load_served * @loads[LT::Heating].annual_output
976
+ end
977
+ (@hpxml.cooling_systems + @hpxml.heat_pumps).each do |clg_system|
978
+ next unless clg_ids.include? clg_system.id
979
+
980
+ @loads[LT::Cooling].annual_output_by_system[clg_system.id] = clg_system.fraction_cool_load_served * @loads[LT::Cooling].annual_output
981
+ end
982
+
983
+ # Handle dual-fuel heat pumps
984
+ @hpxml.heat_pumps.each do |heat_pump|
985
+ next unless heat_pump.is_dual_fuel
986
+
987
+ # Create separate dual fuel heat pump backup system
988
+ dfhp_backup_id = heat_pump.id + '_DFHPBackup'
989
+ htg_ids << dfhp_backup_id
990
+ seed_id_map[dfhp_backup_id] = heat_pump.seed_id + '_DFHPBackup'
991
+ htg_fuels[dfhp_backup_id] = heat_pump.backup_heating_fuel
992
+ if not heat_pump.backup_heating_efficiency_afue.nil?
993
+ htg_eecs[dfhp_backup_id] = get_eec_value_numerator('AFUE') / heat_pump.backup_heating_efficiency_afue
994
+ elsif not heat_pump.backup_heating_efficiency_percent.nil?
995
+ htg_eecs[dfhp_backup_id] = get_eec_value_numerator('Percent') / heat_pump.backup_heating_efficiency_percent
996
+ end
997
+
998
+ next unless [Constants.CalcTypeERIReferenceHome, Constants.CalcTypeERIIndexAdjustmentReferenceHome].include? @eri_design
999
+
1000
+ # Apportion heating load for the two systems
1001
+ primary_load, backup_load = nil
1002
+ @object_variables_by_key[[LT, LT::Heating]].each do |vals|
1003
+ sys_id, key_name, var_name = vals
1004
+ if sys_id == heat_pump.id
1005
+ primary_load = get_report_variable_data_annual([key_name], [var_name])
1006
+ elsif sys_id == dfhp_backup_id
1007
+ backup_load = get_report_variable_data_annual([key_name], [var_name])
1008
+ end
1009
+ end
1010
+ fail 'Could not obtain DFHP loads.' if primary_load.nil? || backup_load.nil?
1011
+
1012
+ total_load = @loads[LT::Heating].annual_output_by_system[heat_pump.id]
1013
+ backup_ratio = backup_load / (primary_load + backup_load)
1014
+ @loads[LT::Heating].annual_output_by_system[dfhp_backup_id] = total_load * backup_ratio
1015
+ @loads[LT::Heating].annual_output_by_system[heat_pump.id] = total_load * (1.0 - backup_ratio)
1016
+ end
1017
+
1018
+ # Sys IDS
1019
+ results_out << ['hpxml_heat_sys_ids', get_ids(htg_ids, seed_id_map).to_s]
1020
+ results_out << ['hpxml_cool_sys_ids', get_ids(clg_ids, seed_id_map).to_s]
1021
+ results_out << ['hpxml_dhw_sys_ids', get_ids(dhw_ids, seed_id_map).to_s]
1022
+ results_out << ['hpxml_vent_preheat_sys_ids', vent_prehtg_ids.to_s]
1023
+ results_out << ['hpxml_vent_precool_sys_ids', vent_preclg_ids.to_s]
1024
+ results_out << [line_break]
1025
+
1026
+ # EECs
1027
+ results_out << ['hpxml_eec_heats', ordered_values(htg_eecs, htg_ids).to_s]
1028
+ results_out << ['hpxml_eec_cools', ordered_values(clg_eecs, clg_ids).to_s]
1029
+ results_out << ['hpxml_eec_dhws', ordered_values(dhw_eecs, dhw_ids).to_s]
1030
+ results_out << ['hpxml_eec_vent_preheats', ordered_values(vent_prehtg_eecs, vent_prehtg_ids).to_s]
1031
+ results_out << ['hpxml_eec_vent_precools', ordered_values(vent_preclg_eecs, vent_preclg_ids).to_s]
1032
+ results_out << [line_break]
1033
+
1034
+ # Fuel types
1035
+ results_out << ['hpxml_heat_fuels', ordered_values(htg_fuels, htg_ids).to_s]
1036
+ results_out << ['hpxml_dwh_fuels', ordered_values(dhw_fuels, dhw_ids).to_s]
1037
+ results_out << ['hpxml_vent_preheat_fuels', ordered_values(vent_prehtg_fuels, vent_prehtg_ids).to_s]
1038
+ results_out << [line_break]
1039
+
1040
+ # Fuel uses
1041
+ @fuels.each do |fuel_type, fuel|
1042
+ key_name = sanitize_string("fuel#{fuel_type}")
1043
+ results_out << [key_name, fuel.annual_output.to_s]
1044
+ end
1045
+ results_out << [line_break]
1046
+
1047
+ # End Uses
1048
+ @end_uses.each do |key, end_use|
1049
+ fuel_type, end_use_type = key
1050
+ key_name = sanitize_string("enduse#{fuel_type}#{end_use_type}")
1051
+ sys_ids = get_sys_ids_of_interest(end_use_type, htg_ids, clg_ids, dhw_ids, vent_prehtg_ids, vent_preclg_ids)
1052
+ if sys_ids.nil?
1053
+ results_out << [key_name, end_use.annual_output.to_s]
1054
+ else
1055
+ results_out << [key_name, ordered_values(end_use.annual_output_by_system, sys_ids).to_s]
1056
+ end
1057
+ end
1058
+ results_out << [line_break]
1059
+
1060
+ # Loads by System
1061
+ @loads.each do |load_type, load|
1062
+ next unless [LT::Heating, LT::Cooling, LT::HotWaterDelivered].include? load_type
1063
+ next if ([LT::Heating, LT::Cooling].include? load_type) &&
1064
+ (not [Constants.CalcTypeERIReferenceHome, Constants.CalcTypeERIIndexAdjustmentReferenceHome].include? @eri_design)
1065
+
1066
+ key_name = sanitize_string("load#{load_type}")
1067
+ sys_ids = get_sys_ids_of_interest(load_type, htg_ids, clg_ids, dhw_ids, vent_prehtg_ids, vent_preclg_ids)
1068
+ results_out << [key_name, ordered_values(load.annual_output_by_system, sys_ids).to_s]
1069
+ end
1070
+ results_out << [line_break]
1071
+
1072
+ # Misc
1073
+ results_out << ['hpxml_cfa', @hpxml.building_construction.conditioned_floor_area.to_s]
1074
+ results_out << ['hpxml_nbr', @hpxml.building_construction.number_of_bedrooms.to_s]
1075
+ results_out << ['hpxml_nst', @hpxml.building_construction.number_of_conditioned_floors_above_grade.to_s]
1076
+ results_out << ['hpxml_residential_facility_type', '"' + @hpxml.building_construction.residential_facility_type + '"']
1077
+
1078
+ CSV.open(csv_path, 'wb') { |csv| results_out.to_a.each { |elem| csv << elem } }
1079
+ end
1080
+
1081
+ def write_timeseries_output_results(runner, output_format,
1082
+ timeseries_output_path,
1083
+ timeseries_frequency,
1084
+ include_timeseries_fuel_consumptions,
1085
+ include_timeseries_end_use_consumptions,
1086
+ include_timeseries_hot_water_uses,
1087
+ include_timeseries_total_loads,
1088
+ include_timeseries_component_loads,
1089
+ include_timeseries_zone_temperatures,
1090
+ include_timeseries_airflows,
1091
+ include_timeseries_weather)
1092
+ return if timeseries_frequency == 'none'
1093
+
1094
+ # Time column
1095
+ if ['timestep', 'hourly', 'daily', 'monthly'].include? timeseries_frequency
1096
+ data = ['Time', nil]
1097
+ else
1098
+ fail "Unexpected timeseries_frequency: #{timeseries_frequency}."
1099
+ end
1100
+ @timestamps.each do |timestamp|
1101
+ data << timestamp
1102
+ end
1103
+
1104
+ if include_timeseries_fuel_consumptions
1105
+ fuel_data = @fuels.values.select { |x| x.timeseries_output.sum(0.0) != 0 }.map { |x| [x.name, x.timeseries_units] + x.timeseries_output.map { |v| v.round(2) } }
1106
+ else
1107
+ fuel_data = []
1108
+ end
1109
+ if include_timeseries_end_use_consumptions
1110
+ end_use_data = @end_uses.values.select { |x| x.timeseries_output.sum(0.0) != 0 }.map { |x| [x.name, x.timeseries_units] + x.timeseries_output.map { |v| v.round(2) } }
1111
+ else
1112
+ end_use_data = []
1113
+ end
1114
+ if include_timeseries_hot_water_uses
1115
+ hot_water_use_data = @hot_water_uses.values.select { |x| x.timeseries_output.sum(0.0) != 0 }.map { |x| [x.name, x.timeseries_units] + x.timeseries_output.map { |v| v.round(2) } }
1116
+ else
1117
+ hot_water_use_data = []
1118
+ end
1119
+ if include_timeseries_total_loads
1120
+ total_loads_data = @loads.values.select { |x| x.timeseries_output.sum(0.0) != 0 }.map { |x| [x.name, x.timeseries_units] + x.timeseries_output.map { |v| v.round(2) } }
1121
+ else
1122
+ total_loads_data = {}
1123
+ end
1124
+ if include_timeseries_component_loads
1125
+ comp_loads_data = @component_loads.values.select { |x| x.timeseries_output.sum(0.0) != 0 }.map { |x| [x.name, x.timeseries_units] + x.timeseries_output.map { |v| v.round(2) } }
1126
+ else
1127
+ comp_loads_data = []
1128
+ end
1129
+ if include_timeseries_zone_temperatures
1130
+ zone_temps_data = @zone_temps.values.select { |x| x.timeseries_output.sum(0.0) != 0 }.map { |x| [x.name, x.timeseries_units] + x.timeseries_output.map { |v| v.round(2) } }
1131
+ else
1132
+ zone_temps_data = []
1133
+ end
1134
+ if include_timeseries_airflows
1135
+ airflows_data = @airflows.values.select { |x| x.timeseries_output.sum(0.0) != 0 }.map { |x| [x.name, x.timeseries_units] + x.timeseries_output.map { |v| v.round(2) } }
1136
+ else
1137
+ airflows_data = []
1138
+ end
1139
+ if include_timeseries_weather
1140
+ weather_data = @weather.values.select { |x| x.timeseries_output.sum(0.0) != 0 }.map { |x| [x.name, x.timeseries_units] + x.timeseries_output.map { |v| v.round(2) } }
1141
+ else
1142
+ weather_data = []
1143
+ end
1144
+
1145
+ return if fuel_data.size + end_use_data.size + hot_water_use_data.size + total_loads_data.size + comp_loads_data.size + zone_temps_data.size + airflows_data.size + weather_data.size == 0
1146
+
1147
+ fail 'Unable to obtain timestamps.' if @timestamps.empty?
1148
+
1149
+ if output_format == 'csv'
1150
+ # Assemble data
1151
+ data = data.zip(*fuel_data, *end_use_data, *hot_water_use_data, *total_loads_data, *comp_loads_data, *zone_temps_data, *airflows_data, *weather_data)
1152
+
1153
+ # Error-check
1154
+ n_elements = []
1155
+ data.each do |data_array|
1156
+ n_elements << data_array.size
1157
+ end
1158
+ if n_elements.uniq.size > 1
1159
+ fail "Inconsistent number of array elements: #{n_elements.uniq}."
1160
+ end
1161
+
1162
+ # Write file
1163
+ CSV.open(timeseries_output_path, 'wb') { |csv| data.to_a.each { |elem| csv << elem } }
1164
+ elsif output_format == 'json'
1165
+ # Assemble data
1166
+ h = {}
1167
+ h['Time'] = data[2..-1]
1168
+ [fuel_data, end_use_data, hot_water_use_data, total_loads_data, comp_loads_data, zone_temps_data, airflows_data, weather_data].each do |d|
1169
+ d.each do |o|
1170
+ grp, name = o[0].split(':', 2)
1171
+ h[grp] = {} if h[grp].nil?
1172
+ h[grp]["#{name.strip} (#{o[1]})"] = o[2..-1]
1173
+ end
1174
+ end
1175
+
1176
+ # Write file
1177
+ require 'json'
1178
+ File.open(timeseries_output_path, 'w') { |json| json.write(JSON.pretty_generate(h)) }
1179
+ end
1180
+ runner.registerInfo("Wrote timeseries output results to #{timeseries_output_path}.")
1181
+ end
1182
+
1183
+ def get_report_meter_data_annual(meter_names, unit_conv = UnitConversions.convert(1.0, 'J', 'MBtu'))
1184
+ return 0.0 if meter_names.empty?
1185
+
1186
+ vars = "'" + meter_names.uniq.join("','") + "'"
1187
+ query = "SELECT SUM(VariableValue*#{unit_conv}) FROM ReportMeterData WHERE ReportMeterDataDictionaryIndex IN (SELECT ReportMeterDataDictionaryIndex FROM ReportMeterDataDictionary WHERE VariableName IN (#{vars}) AND ReportingFrequency='Run Period' AND VariableUnits='J')"
1188
+ value = @sqlFile.execAndReturnFirstDouble(query)
1189
+ fail "Query error: #{query}" unless value.is_initialized
1190
+
1191
+ return value.get
1192
+ end
1193
+
1194
+ def get_report_variable_data_annual(key_values, variables, unit_conv = UnitConversions.convert(1.0, 'J', 'MBtu'), is_negative: false)
1195
+ return 0.0 if variables.empty?
1196
+
1197
+ keys = "'" + key_values.uniq.join("','") + "'"
1198
+ vars = "'" + variables.uniq.join("','") + "'"
1199
+ neg = is_negative ? ' * -1' : ''
1200
+ query = "SELECT SUM(VariableValue*#{unit_conv})#{neg} FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE KeyValue IN (#{keys}) AND VariableName IN (#{vars}) AND ReportingFrequency='Run Period')"
1201
+ value = @sqlFile.execAndReturnFirstDouble(query)
1202
+ fail "Query error: #{query}" unless value.is_initialized
1203
+
1204
+ return value.get
1205
+ end
1206
+
1207
+ def get_report_meter_data_timeseries(meter_names, unit_conv, unit_adder, timeseries_frequency)
1208
+ return [0.0] * @timestamps.size if meter_names.empty?
1209
+
1210
+ vars = "'" + meter_names.uniq.join("','") + "'"
1211
+ query = "SELECT SUM(VariableValue*#{unit_conv}+#{unit_adder}) FROM ReportMeterData WHERE ReportMeterDataDictionaryIndex IN (SELECT ReportMeterDataDictionaryIndex FROM ReportMeterDataDictionary WHERE VariableName IN (#{vars}) AND ReportingFrequency='#{reporting_frequency_map[timeseries_frequency]}' AND VariableUnits='J') GROUP BY TimeIndex ORDER BY TimeIndex"
1212
+ values = @sqlFile.execAndReturnVectorOfDouble(query)
1213
+ fail "Query error: #{query}" unless values.is_initialized
1214
+
1215
+ values = values.get
1216
+ values += [0.0] * @timestamps.size if values.size == 0
1217
+ return values
1218
+ end
1219
+
1220
+ def get_report_variable_data_timeseries(key_values, variables, unit_conv, unit_adder, timeseries_frequency, disable_ems_shift = false, is_negative: false)
1221
+ return [0.0] * @timestamps.size if variables.empty?
1222
+
1223
+ if key_values.uniq.size > 1 && key_values.include?('EMS') && !disable_ems_shift
1224
+ # Split into EMS and non-EMS queries so that the EMS values shift occurs for just the EMS query
1225
+ # Remove this code if we ever figure out a better way to handle when EMS output should shift
1226
+ values = get_report_variable_data_timeseries(['EMS'], variables, unit_conv, unit_adder, timeseries_frequency, disable_ems_shift, is_negative: is_negative)
1227
+ sum_values = values.zip(get_report_variable_data_timeseries(key_values.select { |k| k != 'EMS' }, variables, unit_conv, unit_adder, timeseries_frequency, disable_ems_shift, is_negative: is_negative)).map { |x, y| x + y }
1228
+ return sum_values
1229
+ end
1230
+
1231
+ keys = "'" + key_values.uniq.join("','") + "'"
1232
+ vars = "'" + variables.uniq.join("','") + "'"
1233
+ neg = is_negative ? ' * -1' : ''
1234
+ query = "SELECT SUM(VariableValue*#{unit_conv}+#{unit_adder})#{neg} FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE KeyValue IN (#{keys}) AND VariableName IN (#{vars}) AND ReportingFrequency='#{reporting_frequency_map[timeseries_frequency]}') GROUP BY TimeIndex ORDER BY TimeIndex"
1235
+ values = @sqlFile.execAndReturnVectorOfDouble(query)
1236
+ fail "Query error: #{query}" unless values.is_initialized
1237
+
1238
+ values = values.get
1239
+ values += [0.0] * @timestamps.size if values.size == 0
1240
+
1241
+ return values if disable_ems_shift
1242
+
1243
+ # Remove this code if we ever figure out a better way to handle when EMS output should shift
1244
+ if (key_values.size == 1) && (key_values[0] == 'EMS') && (@timestamps.size > 0)
1245
+ if (timeseries_frequency.downcase == 'timestep' || (timeseries_frequency.downcase == 'hourly' && @model.getTimestep.numberOfTimestepsPerHour == 1))
1246
+ # Shift all values by 1 timestep due to EMS reporting lag
1247
+ return values[1..-1] + [values[0]]
1248
+ end
1249
+ end
1250
+
1251
+ return values
1252
+ end
1253
+
1254
+ def get_tabular_data_value(report_name, report_for_string, table_name, row_names, col_name, units)
1255
+ rows = "'" + row_names.uniq.join("','") + "'"
1256
+ query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='#{report_name}' AND ReportForString='#{report_for_string}' AND TableName='#{table_name}' AND RowName IN (#{rows}) AND ColumnName='#{col_name}' AND Units='#{units}'"
1257
+ result = @sqlFile.execAndReturnFirstDouble(query)
1258
+ return result.get
1259
+ end
1260
+
1261
+ def apply_multiplier_to_output(obj, sync_obj, sys_id, mult)
1262
+ # Annual
1263
+ orig_value = obj.annual_output_by_system[sys_id]
1264
+ obj.annual_output_by_system[sys_id] = orig_value * mult
1265
+ sync_obj.annual_output += (orig_value * mult - orig_value)
1266
+
1267
+ # Timeseries
1268
+ if not obj.timeseries_output_by_system.empty?
1269
+ orig_values = obj.timeseries_output_by_system[sys_id]
1270
+ obj.timeseries_output_by_system[sys_id] = obj.timeseries_output_by_system[sys_id].map { |x| x * mult }
1271
+ diffs = obj.timeseries_output_by_system[sys_id].zip(orig_values).map { |x, y| x - y }
1272
+ sync_obj.timeseries_output = sync_obj.timeseries_output.zip(diffs).map { |x, y| x + y }
1273
+ end
1274
+ end
1275
+
1276
+ def create_all_object_variables_by_key
1277
+ @object_variables_by_key = {}
1278
+
1279
+ @model.getModelObjects.each do |object|
1280
+ next if object.to_AdditionalProperties.is_initialized
1281
+
1282
+ [EUT, HWT, LT, ILT].each do |class_name|
1283
+ vars_by_key = get_object_output_variables_by_key(@model, object, class_name)
1284
+ next if vars_by_key.size == 0
1285
+
1286
+ sys_id = object.additionalProperties.getFeatureAsString('HPXML_ID')
1287
+ if sys_id.is_initialized
1288
+ sys_id = sys_id.get
1289
+ else
1290
+ sys_id = nil
1291
+ end
1292
+
1293
+ vars_by_key.each do |key, output_vars|
1294
+ output_vars.each do |output_var|
1295
+ if object.to_EnergyManagementSystemOutputVariable.is_initialized
1296
+ varkey = 'EMS'
1297
+ else
1298
+ varkey = object.name.to_s.upcase
1299
+ end
1300
+ hash_key = [class_name, key]
1301
+ @object_variables_by_key[hash_key] = [] if @object_variables_by_key[hash_key].nil?
1302
+ next if @object_variables_by_key[hash_key].include? [sys_id, varkey, output_var]
1303
+
1304
+ @object_variables_by_key[hash_key] << [sys_id, varkey, output_var]
1305
+ end
1306
+ end
1307
+ end
1308
+ end
1309
+ end
1310
+
1311
+ def get_object_variables(class_name, key)
1312
+ hash_key = [class_name, key]
1313
+ vars = @object_variables_by_key[hash_key]
1314
+ vars = [] if vars.nil?
1315
+ return vars
1316
+ end
1317
+
1318
+ class BaseOutput
1319
+ def initialize()
1320
+ @timeseries_output = []
1321
+ end
1322
+ attr_accessor(:name, :annual_output, :timeseries_output, :annual_units, :timeseries_units)
1323
+ end
1324
+
1325
+ class Fuel < BaseOutput
1326
+ def initialize(meters: [])
1327
+ super()
1328
+ @meters = meters
1329
+ @timeseries_output_by_system = {}
1330
+ end
1331
+ attr_accessor(:meters, :timeseries_output_by_system)
1332
+ end
1333
+
1334
+ class EndUse < BaseOutput
1335
+ def initialize(variables: [], is_negative: false)
1336
+ super()
1337
+ @variables = variables
1338
+ @is_negative = is_negative
1339
+ @timeseries_output_by_system = {}
1340
+ @annual_output_by_system = {}
1341
+ end
1342
+ attr_accessor(:variables, :is_negative, :annual_output_by_system, :timeseries_output_by_system)
1343
+ end
1344
+
1345
+ class HotWater < BaseOutput
1346
+ def initialize(variables: [])
1347
+ super()
1348
+ @variables = variables
1349
+ @timeseries_output_by_system = {}
1350
+ @annual_output_by_system = {}
1351
+ end
1352
+ attr_accessor(:variables, :annual_output_by_system, :timeseries_output_by_system)
1353
+ end
1354
+
1355
+ class PeakFuel < BaseOutput
1356
+ def initialize(meters:, report:)
1357
+ super()
1358
+ @meters = meters
1359
+ @report = report
1360
+ end
1361
+ attr_accessor(:meters, :report)
1362
+ end
1363
+
1364
+ class Load < BaseOutput
1365
+ def initialize(variables: [], ems_variable: nil, is_negative: false)
1366
+ super()
1367
+ @variables = variables
1368
+ @ems_variable = ems_variable
1369
+ @is_negative = is_negative
1370
+ @timeseries_output_by_system = {}
1371
+ @annual_output_by_system = {}
1372
+ end
1373
+ attr_accessor(:variables, :ems_variable, :is_negative, :annual_output_by_system, :timeseries_output_by_system)
1374
+ end
1375
+
1376
+ class ComponentLoad < BaseOutput
1377
+ def initialize(ems_variable:)
1378
+ super()
1379
+ @ems_variable = ems_variable
1380
+ end
1381
+ attr_accessor(:ems_variable)
1382
+ end
1383
+
1384
+ class UnmetHours < BaseOutput
1385
+ def initialize(col_name:)
1386
+ super()
1387
+ @col_name = col_name
1388
+ end
1389
+ attr_accessor(:col_name)
1390
+ end
1391
+
1392
+ class IdealLoad < BaseOutput
1393
+ def initialize(variables: [])
1394
+ super()
1395
+ @variables = variables
1396
+ end
1397
+ attr_accessor(:variables)
1398
+ end
1399
+
1400
+ class PeakLoad < BaseOutput
1401
+ def initialize(ems_variable:, report:)
1402
+ super()
1403
+ @ems_variable = ems_variable
1404
+ @report = report
1405
+ end
1406
+ attr_accessor(:ems_variable, :report)
1407
+ end
1408
+
1409
+ class ZoneTemp < BaseOutput
1410
+ def initialize
1411
+ super()
1412
+ end
1413
+ attr_accessor()
1414
+ end
1415
+
1416
+ class Airflow < BaseOutput
1417
+ def initialize(ems_program:, ems_variables:)
1418
+ super()
1419
+ @ems_program = ems_program
1420
+ @ems_variables = ems_variables
1421
+ end
1422
+ attr_accessor(:ems_program, :ems_variables)
1423
+ end
1424
+
1425
+ class Weather < BaseOutput
1426
+ def initialize(variable:, variable_units:, timeseries_units:)
1427
+ super()
1428
+ @variable = variable
1429
+ @variable_units = variable_units
1430
+ @timeseries_units = timeseries_units
1431
+ end
1432
+ attr_accessor(:variable, :variable_units)
1433
+ end
1434
+
1435
+ def setup_outputs()
1436
+ def get_timeseries_units_from_fuel_type(fuel_type)
1437
+ if fuel_type == FT::Elec
1438
+ return 'kWh'
1439
+ end
1440
+
1441
+ return 'kBtu'
1442
+ end
1443
+
1444
+ # End Uses
1445
+
1446
+ # NOTE: Some end uses are obtained from meters, others are rolled up from
1447
+ # output variables so that we can have more control.
1448
+
1449
+ create_all_object_variables_by_key()
1450
+
1451
+ @end_uses = {}
1452
+ @end_uses[[FT::Elec, EUT::Heating]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::Heating]))
1453
+ @end_uses[[FT::Elec, EUT::HeatingFanPump]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::HeatingFanPump]))
1454
+ @end_uses[[FT::Elec, EUT::Cooling]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::Cooling]))
1455
+ @end_uses[[FT::Elec, EUT::CoolingFanPump]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::CoolingFanPump]))
1456
+ @end_uses[[FT::Elec, EUT::HotWater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::HotWater]))
1457
+ @end_uses[[FT::Elec, EUT::HotWaterRecircPump]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::HotWaterRecircPump]))
1458
+ @end_uses[[FT::Elec, EUT::HotWaterSolarThermalPump]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::HotWaterSolarThermalPump]))
1459
+ @end_uses[[FT::Elec, EUT::LightsInterior]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::LightsInterior]))
1460
+ @end_uses[[FT::Elec, EUT::LightsGarage]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::LightsGarage]))
1461
+ @end_uses[[FT::Elec, EUT::LightsExterior]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::LightsExterior]))
1462
+ @end_uses[[FT::Elec, EUT::MechVent]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::MechVent]))
1463
+ @end_uses[[FT::Elec, EUT::MechVentPreheat]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::MechVentPreheat]))
1464
+ @end_uses[[FT::Elec, EUT::MechVentPrecool]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::MechVentPrecool]))
1465
+ @end_uses[[FT::Elec, EUT::WholeHouseFan]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::WholeHouseFan]))
1466
+ @end_uses[[FT::Elec, EUT::Refrigerator]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::Refrigerator]))
1467
+ if @eri_design.nil? # Skip end uses not used by ERI
1468
+ @end_uses[[FT::Elec, EUT::Freezer]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::Freezer]))
1469
+ end
1470
+ @end_uses[[FT::Elec, EUT::Dehumidifier]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::Dehumidifier]))
1471
+ @end_uses[[FT::Elec, EUT::Dishwasher]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::Dishwasher]))
1472
+ @end_uses[[FT::Elec, EUT::ClothesWasher]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::ClothesWasher]))
1473
+ @end_uses[[FT::Elec, EUT::ClothesDryer]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::ClothesDryer]))
1474
+ @end_uses[[FT::Elec, EUT::RangeOven]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::RangeOven]))
1475
+ @end_uses[[FT::Elec, EUT::CeilingFan]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::CeilingFan]))
1476
+ @end_uses[[FT::Elec, EUT::Television]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::Television]))
1477
+ @end_uses[[FT::Elec, EUT::PlugLoads]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::PlugLoads]))
1478
+ if @eri_design.nil? # Skip end uses not used by ERI
1479
+ @end_uses[[FT::Elec, EUT::Vehicle]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::Vehicle]))
1480
+ @end_uses[[FT::Elec, EUT::WellPump]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::WellPump]))
1481
+ @end_uses[[FT::Elec, EUT::PoolHeater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::PoolHeater]))
1482
+ @end_uses[[FT::Elec, EUT::PoolPump]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::PoolPump]))
1483
+ @end_uses[[FT::Elec, EUT::HotTubHeater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::HotTubHeater]))
1484
+ @end_uses[[FT::Elec, EUT::HotTubPump]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::HotTubPump]))
1485
+ end
1486
+ @end_uses[[FT::Elec, EUT::PV]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::PV]),
1487
+ is_negative: true)
1488
+ @end_uses[[FT::Elec, EUT::Generator]] = EndUse.new(variables: get_object_variables(EUT, [FT::Elec, EUT::Generator]),
1489
+ is_negative: true)
1490
+ @end_uses[[FT::Gas, EUT::Heating]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::Heating]))
1491
+ @end_uses[[FT::Gas, EUT::HotWater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::HotWater]))
1492
+ @end_uses[[FT::Gas, EUT::ClothesDryer]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::ClothesDryer]))
1493
+ @end_uses[[FT::Gas, EUT::RangeOven]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::RangeOven]))
1494
+ @end_uses[[FT::Gas, EUT::MechVentPreheat]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::MechVentPreheat]))
1495
+ if @eri_design.nil? # Skip end uses not used by ERI
1496
+ @end_uses[[FT::Gas, EUT::PoolHeater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::PoolHeater]))
1497
+ @end_uses[[FT::Gas, EUT::HotTubHeater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::HotTubHeater]))
1498
+ @end_uses[[FT::Gas, EUT::Grill]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::Grill]))
1499
+ @end_uses[[FT::Gas, EUT::Lighting]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::Lighting]))
1500
+ @end_uses[[FT::Gas, EUT::Fireplace]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::Fireplace]))
1501
+ end
1502
+ @end_uses[[FT::Gas, EUT::Generator]] = EndUse.new(variables: get_object_variables(EUT, [FT::Gas, EUT::Generator]))
1503
+ @end_uses[[FT::Oil, EUT::Heating]] = EndUse.new(variables: get_object_variables(EUT, [FT::Oil, EUT::Heating]))
1504
+ @end_uses[[FT::Oil, EUT::HotWater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Oil, EUT::HotWater]))
1505
+ @end_uses[[FT::Oil, EUT::ClothesDryer]] = EndUse.new(variables: get_object_variables(EUT, [FT::Oil, EUT::ClothesDryer]))
1506
+ @end_uses[[FT::Oil, EUT::RangeOven]] = EndUse.new(variables: get_object_variables(EUT, [FT::Oil, EUT::RangeOven]))
1507
+ @end_uses[[FT::Oil, EUT::MechVentPreheat]] = EndUse.new(variables: get_object_variables(EUT, [FT::Oil, EUT::MechVentPreheat]))
1508
+ if @eri_design.nil? # Skip end uses not used by ERI
1509
+ @end_uses[[FT::Oil, EUT::Grill]] = EndUse.new(variables: get_object_variables(EUT, [FT::Oil, EUT::Grill]))
1510
+ @end_uses[[FT::Oil, EUT::Lighting]] = EndUse.new(variables: get_object_variables(EUT, [FT::Oil, EUT::Lighting]))
1511
+ @end_uses[[FT::Oil, EUT::Fireplace]] = EndUse.new(variables: get_object_variables(EUT, [FT::Oil, EUT::Fireplace]))
1512
+ end
1513
+ @end_uses[[FT::Oil, EUT::Generator]] = EndUse.new(variables: get_object_variables(EUT, [FT::Oil, EUT::Generator]))
1514
+ @end_uses[[FT::Propane, EUT::Heating]] = EndUse.new(variables: get_object_variables(EUT, [FT::Propane, EUT::Heating]))
1515
+ @end_uses[[FT::Propane, EUT::HotWater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Propane, EUT::HotWater]))
1516
+ @end_uses[[FT::Propane, EUT::ClothesDryer]] = EndUse.new(variables: get_object_variables(EUT, [FT::Propane, EUT::ClothesDryer]))
1517
+ @end_uses[[FT::Propane, EUT::RangeOven]] = EndUse.new(variables: get_object_variables(EUT, [FT::Propane, EUT::RangeOven]))
1518
+ @end_uses[[FT::Propane, EUT::MechVentPreheat]] = EndUse.new(variables: get_object_variables(EUT, [FT::Propane, EUT::MechVentPreheat]))
1519
+ if @eri_design.nil? # Skip end uses not used by ERI
1520
+ @end_uses[[FT::Propane, EUT::Grill]] = EndUse.new(variables: get_object_variables(EUT, [FT::Propane, EUT::Grill]))
1521
+ @end_uses[[FT::Propane, EUT::Lighting]] = EndUse.new(variables: get_object_variables(EUT, [FT::Propane, EUT::Lighting]))
1522
+ @end_uses[[FT::Propane, EUT::Fireplace]] = EndUse.new(variables: get_object_variables(EUT, [FT::Propane, EUT::Fireplace]))
1523
+ end
1524
+ @end_uses[[FT::Propane, EUT::Generator]] = EndUse.new(variables: get_object_variables(EUT, [FT::Propane, EUT::Generator]))
1525
+ @end_uses[[FT::WoodCord, EUT::Heating]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodCord, EUT::Heating]))
1526
+ @end_uses[[FT::WoodCord, EUT::HotWater]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodCord, EUT::HotWater]))
1527
+ @end_uses[[FT::WoodCord, EUT::ClothesDryer]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodCord, EUT::ClothesDryer]))
1528
+ @end_uses[[FT::WoodCord, EUT::RangeOven]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodCord, EUT::RangeOven]))
1529
+ @end_uses[[FT::WoodCord, EUT::MechVentPreheat]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodCord, EUT::MechVentPreheat]))
1530
+ if @eri_design.nil? # Skip end uses not used by ERI
1531
+ @end_uses[[FT::WoodCord, EUT::Grill]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodCord, EUT::Grill]))
1532
+ @end_uses[[FT::WoodCord, EUT::Lighting]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodCord, EUT::Lighting]))
1533
+ @end_uses[[FT::WoodCord, EUT::Fireplace]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodCord, EUT::Fireplace]))
1534
+ end
1535
+ @end_uses[[FT::WoodCord, EUT::Generator]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodCord, EUT::Generator]))
1536
+ @end_uses[[FT::WoodPellets, EUT::Heating]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodPellets, EUT::Heating]))
1537
+ @end_uses[[FT::WoodPellets, EUT::HotWater]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodPellets, EUT::HotWater]))
1538
+ @end_uses[[FT::WoodPellets, EUT::ClothesDryer]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodPellets, EUT::ClothesDryer]))
1539
+ @end_uses[[FT::WoodPellets, EUT::RangeOven]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodPellets, EUT::RangeOven]))
1540
+ @end_uses[[FT::WoodPellets, EUT::MechVentPreheat]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodPellets, EUT::MechVentPreheat]))
1541
+ if @eri_design.nil? # Skip end uses not used by ERI
1542
+ @end_uses[[FT::WoodPellets, EUT::Grill]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodPellets, EUT::Grill]))
1543
+ @end_uses[[FT::WoodPellets, EUT::Lighting]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodPellets, EUT::Lighting]))
1544
+ @end_uses[[FT::WoodPellets, EUT::Fireplace]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodPellets, EUT::Fireplace]))
1545
+ end
1546
+ @end_uses[[FT::WoodPellets, EUT::Generator]] = EndUse.new(variables: get_object_variables(EUT, [FT::WoodPellets, EUT::Generator]))
1547
+ @end_uses[[FT::Coal, EUT::Heating]] = EndUse.new(variables: get_object_variables(EUT, [FT::Coal, EUT::Heating]))
1548
+ @end_uses[[FT::Coal, EUT::HotWater]] = EndUse.new(variables: get_object_variables(EUT, [FT::Coal, EUT::HotWater]))
1549
+ @end_uses[[FT::Coal, EUT::ClothesDryer]] = EndUse.new(variables: get_object_variables(EUT, [FT::Coal, EUT::ClothesDryer]))
1550
+ @end_uses[[FT::Coal, EUT::RangeOven]] = EndUse.new(variables: get_object_variables(EUT, [FT::Coal, EUT::RangeOven]))
1551
+ @end_uses[[FT::Coal, EUT::MechVentPreheat]] = EndUse.new(variables: get_object_variables(EUT, [FT::Coal, EUT::MechVentPreheat]))
1552
+ if @eri_design.nil? # Skip end uses not used by ERI
1553
+ @end_uses[[FT::Coal, EUT::Grill]] = EndUse.new(variables: get_object_variables(EUT, [FT::Coal, EUT::Grill]))
1554
+ @end_uses[[FT::Coal, EUT::Lighting]] = EndUse.new(variables: get_object_variables(EUT, [FT::Coal, EUT::Lighting]))
1555
+ @end_uses[[FT::Coal, EUT::Fireplace]] = EndUse.new(variables: get_object_variables(EUT, [FT::Coal, EUT::Fireplace]))
1556
+ end
1557
+ @end_uses[[FT::Coal, EUT::Generator]] = EndUse.new(variables: get_object_variables(EUT, [FT::Coal, EUT::Generator]))
1558
+
1559
+ @end_uses.each do |key, end_use|
1560
+ fuel_type, end_use_type = key
1561
+ end_use.name = "End Use: #{fuel_type}: #{end_use_type}"
1562
+ end_use.annual_units = 'MBtu'
1563
+ end_use.timeseries_units = get_timeseries_units_from_fuel_type(fuel_type)
1564
+ end
1565
+
1566
+ # Fuels
1567
+
1568
+ @fuels = {}
1569
+ @fuels[FT::Elec] = Fuel.new(meters: ["#{EPlus::FuelTypeElectricity}:Facility"])
1570
+ @fuels[FT::Gas] = Fuel.new(meters: ["#{EPlus::FuelTypeNaturalGas}:Facility"])
1571
+ @fuels[FT::Oil] = Fuel.new(meters: ["#{EPlus::FuelTypeOil}:Facility"])
1572
+ @fuels[FT::Propane] = Fuel.new(meters: ["#{EPlus::FuelTypePropane}:Facility"])
1573
+ @fuels[FT::WoodCord] = Fuel.new(meters: ["#{EPlus::FuelTypeWoodCord}:Facility"])
1574
+ @fuels[FT::WoodPellets] = Fuel.new(meters: ["#{EPlus::FuelTypeWoodPellets}:Facility"])
1575
+ @fuels[FT::Coal] = Fuel.new(meters: ["#{EPlus::FuelTypeCoal}:Facility"])
1576
+
1577
+ @fuels.each do |fuel_type, fuel|
1578
+ fuel.name = "Fuel Use: #{fuel_type}: Total"
1579
+ fuel.annual_units = 'MBtu'
1580
+ fuel.timeseries_units = get_timeseries_units_from_fuel_type(fuel_type)
1581
+ if @end_uses.select { |key, end_use| key[0] == fuel_type && end_use.variables.size > 0 }.size == 0
1582
+ fuel.meters = []
1583
+ end
1584
+ end
1585
+
1586
+ # Hot Water Uses
1587
+ @hot_water_uses = {}
1588
+ @hot_water_uses[HWT::ClothesWasher] = HotWater.new(variables: get_object_variables(HWT, HWT::ClothesWasher))
1589
+ @hot_water_uses[HWT::Dishwasher] = HotWater.new(variables: get_object_variables(HWT, HWT::Dishwasher))
1590
+ @hot_water_uses[HWT::Fixtures] = HotWater.new(variables: get_object_variables(HWT, HWT::Fixtures))
1591
+ @hot_water_uses[HWT::DistributionWaste] = HotWater.new(variables: get_object_variables(HWT, HWT::DistributionWaste))
1592
+
1593
+ @hot_water_uses.each do |hot_water_type, hot_water|
1594
+ hot_water.name = "Hot Water: #{hot_water_type}"
1595
+ hot_water.annual_units = 'gal'
1596
+ hot_water.timeseries_units = 'gal'
1597
+ end
1598
+
1599
+ # Peak Fuels
1600
+ # Using meters for energy transferred in conditioned space only (i.e., excluding ducts) to determine winter vs summer.
1601
+ @peak_fuels = {}
1602
+ @peak_fuels[[FT::Elec, PFT::Winter]] = PeakFuel.new(meters: ["Heating:EnergyTransfer:Zone:#{HPXML::LocationLivingSpace.upcase}"], report: 'Peak Electricity Winter Total')
1603
+ @peak_fuels[[FT::Elec, PFT::Summer]] = PeakFuel.new(meters: ["Cooling:EnergyTransfer:Zone:#{HPXML::LocationLivingSpace.upcase}"], report: 'Peak Electricity Summer Total')
1604
+
1605
+ @peak_fuels.each do |key, peak_fuel|
1606
+ fuel_type, peak_fuel_type = key
1607
+ peak_fuel.name = "Peak #{fuel_type}: #{peak_fuel_type} Total"
1608
+ peak_fuel.annual_units = 'W'
1609
+ end
1610
+
1611
+ # Loads
1612
+
1613
+ @loads = {}
1614
+ @loads[LT::Heating] = Load.new(ems_variable: 'loads_htg_tot')
1615
+ @loads[LT::Cooling] = Load.new(ems_variable: 'loads_clg_tot')
1616
+ @loads[LT::HotWaterDelivered] = Load.new(variables: get_object_variables(LT, LT::HotWaterDelivered))
1617
+ @loads[LT::HotWaterTankLosses] = Load.new(variables: get_object_variables(LT, LT::HotWaterTankLosses),
1618
+ is_negative: true)
1619
+ @loads[LT::HotWaterDesuperheater] = Load.new(variables: get_object_variables(LT, LT::HotWaterDesuperheater))
1620
+ @loads[LT::HotWaterSolarThermal] = Load.new(variables: get_object_variables(LT, LT::HotWaterSolarThermal),
1621
+ is_negative: true)
1622
+
1623
+ @loads.each do |load_type, load|
1624
+ load.name = "Load: #{load_type}"
1625
+ load.annual_units = 'MBtu'
1626
+ load.timeseries_units = 'kBtu'
1627
+ end
1628
+
1629
+ # Component Loads
1630
+
1631
+ @component_loads = {}
1632
+ @component_loads[[LT::Heating, CLT::Roofs]] = ComponentLoad.new(ems_variable: 'loads_htg_roofs')
1633
+ @component_loads[[LT::Heating, CLT::Ceilings]] = ComponentLoad.new(ems_variable: 'loads_htg_ceilings')
1634
+ @component_loads[[LT::Heating, CLT::Walls]] = ComponentLoad.new(ems_variable: 'loads_htg_walls')
1635
+ @component_loads[[LT::Heating, CLT::RimJoists]] = ComponentLoad.new(ems_variable: 'loads_htg_rim_joists')
1636
+ @component_loads[[LT::Heating, CLT::FoundationWalls]] = ComponentLoad.new(ems_variable: 'loads_htg_foundation_walls')
1637
+ @component_loads[[LT::Heating, CLT::Doors]] = ComponentLoad.new(ems_variable: 'loads_htg_doors')
1638
+ @component_loads[[LT::Heating, CLT::Windows]] = ComponentLoad.new(ems_variable: 'loads_htg_windows')
1639
+ @component_loads[[LT::Heating, CLT::Skylights]] = ComponentLoad.new(ems_variable: 'loads_htg_skylights')
1640
+ @component_loads[[LT::Heating, CLT::Floors]] = ComponentLoad.new(ems_variable: 'loads_htg_floors')
1641
+ @component_loads[[LT::Heating, CLT::Slabs]] = ComponentLoad.new(ems_variable: 'loads_htg_slabs')
1642
+ @component_loads[[LT::Heating, CLT::InternalMass]] = ComponentLoad.new(ems_variable: 'loads_htg_internal_mass')
1643
+ @component_loads[[LT::Heating, CLT::Infiltration]] = ComponentLoad.new(ems_variable: 'loads_htg_infil')
1644
+ @component_loads[[LT::Heating, CLT::NaturalVentilation]] = ComponentLoad.new(ems_variable: 'loads_htg_natvent')
1645
+ @component_loads[[LT::Heating, CLT::MechanicalVentilation]] = ComponentLoad.new(ems_variable: 'loads_htg_mechvent')
1646
+ @component_loads[[LT::Heating, CLT::WholeHouseFan]] = ComponentLoad.new(ems_variable: 'loads_htg_whf')
1647
+ @component_loads[[LT::Heating, CLT::Ducts]] = ComponentLoad.new(ems_variable: 'loads_htg_ducts')
1648
+ @component_loads[[LT::Heating, CLT::InternalGains]] = ComponentLoad.new(ems_variable: 'loads_htg_intgains')
1649
+ @component_loads[[LT::Cooling, CLT::Roofs]] = ComponentLoad.new(ems_variable: 'loads_clg_roofs')
1650
+ @component_loads[[LT::Cooling, CLT::Ceilings]] = ComponentLoad.new(ems_variable: 'loads_clg_ceilings')
1651
+ @component_loads[[LT::Cooling, CLT::Walls]] = ComponentLoad.new(ems_variable: 'loads_clg_walls')
1652
+ @component_loads[[LT::Cooling, CLT::RimJoists]] = ComponentLoad.new(ems_variable: 'loads_clg_rim_joists')
1653
+ @component_loads[[LT::Cooling, CLT::FoundationWalls]] = ComponentLoad.new(ems_variable: 'loads_clg_foundation_walls')
1654
+ @component_loads[[LT::Cooling, CLT::Doors]] = ComponentLoad.new(ems_variable: 'loads_clg_doors')
1655
+ @component_loads[[LT::Cooling, CLT::Windows]] = ComponentLoad.new(ems_variable: 'loads_clg_windows')
1656
+ @component_loads[[LT::Cooling, CLT::Skylights]] = ComponentLoad.new(ems_variable: 'loads_clg_skylights')
1657
+ @component_loads[[LT::Cooling, CLT::Floors]] = ComponentLoad.new(ems_variable: 'loads_clg_floors')
1658
+ @component_loads[[LT::Cooling, CLT::Slabs]] = ComponentLoad.new(ems_variable: 'loads_clg_slabs')
1659
+ @component_loads[[LT::Cooling, CLT::InternalMass]] = ComponentLoad.new(ems_variable: 'loads_clg_internal_mass')
1660
+ @component_loads[[LT::Cooling, CLT::Infiltration]] = ComponentLoad.new(ems_variable: 'loads_clg_infil')
1661
+ @component_loads[[LT::Cooling, CLT::NaturalVentilation]] = ComponentLoad.new(ems_variable: 'loads_clg_natvent')
1662
+ @component_loads[[LT::Cooling, CLT::MechanicalVentilation]] = ComponentLoad.new(ems_variable: 'loads_clg_mechvent')
1663
+ @component_loads[[LT::Cooling, CLT::WholeHouseFan]] = ComponentLoad.new(ems_variable: 'loads_clg_whf')
1664
+ @component_loads[[LT::Cooling, CLT::Ducts]] = ComponentLoad.new(ems_variable: 'loads_clg_ducts')
1665
+ @component_loads[[LT::Cooling, CLT::InternalGains]] = ComponentLoad.new(ems_variable: 'loads_clg_intgains')
1666
+
1667
+ @component_loads.each do |key, comp_load|
1668
+ load_type, comp_load_type = key
1669
+ comp_load.name = "Component Load: #{load_type.gsub(': Delivered', '')}: #{comp_load_type}"
1670
+ comp_load.annual_units = 'MBtu'
1671
+ comp_load.timeseries_units = 'kBtu'
1672
+ end
1673
+
1674
+ # Unmet Hours
1675
+ @unmet_hours = {}
1676
+ @unmet_hours[UHT::Heating] = UnmetHours.new(col_name: 'During Heating')
1677
+ @unmet_hours[UHT::Cooling] = UnmetHours.new(col_name: 'During Cooling')
1678
+
1679
+ @unmet_hours.each do |load_type, unmet_hour|
1680
+ unmet_hour.name = "Unmet Hours: #{load_type}"
1681
+ unmet_hour.annual_units = 'hr'
1682
+ end
1683
+
1684
+ # Ideal System Loads (expected load that is not met by the HVAC systems)
1685
+ @ideal_system_loads = {}
1686
+ @ideal_system_loads[ILT::Heating] = IdealLoad.new(variables: get_object_variables(ILT, ILT::Heating))
1687
+ @ideal_system_loads[ILT::Cooling] = IdealLoad.new(variables: get_object_variables(ILT, ILT::Cooling))
1688
+
1689
+ @ideal_system_loads.each do |load_type, ideal_load|
1690
+ ideal_load.name = "Ideal System Load: #{load_type}"
1691
+ ideal_load.annual_units = 'MBtu'
1692
+ end
1693
+
1694
+ # Peak Loads
1695
+ @peak_loads = {}
1696
+ @peak_loads[PLT::Heating] = PeakLoad.new(ems_variable: 'loads_htg_tot', report: 'Peak Heating Load')
1697
+ @peak_loads[PLT::Cooling] = PeakLoad.new(ems_variable: 'loads_clg_tot', report: 'Peak Cooling Load')
1698
+
1699
+ @peak_loads.each do |load_type, peak_load|
1700
+ peak_load.name = "Peak Load: #{load_type}"
1701
+ peak_load.annual_units = 'kBtu'
1702
+ end
1703
+
1704
+ # Zone Temperatures
1705
+
1706
+ @zone_temps = {}
1707
+
1708
+ # Airflows
1709
+ @airflows = {}
1710
+ @airflows[AFT::Infiltration] = Airflow.new(ems_program: Constants.ObjectNameInfiltration + ' program', ems_variables: [(Constants.ObjectNameInfiltration + ' flow act').gsub(' ', '_')])
1711
+ @airflows[AFT::MechanicalVentilation] = Airflow.new(ems_program: Constants.ObjectNameInfiltration + ' program', ems_variables: ['Qfan'])
1712
+ @airflows[AFT::NaturalVentilation] = Airflow.new(ems_program: Constants.ObjectNameNaturalVentilation + ' program', ems_variables: [(Constants.ObjectNameNaturalVentilation + ' flow act').gsub(' ', '_')])
1713
+ @airflows[AFT::WholeHouseFan] = Airflow.new(ems_program: Constants.ObjectNameNaturalVentilation + ' program', ems_variables: [(Constants.ObjectNameWholeHouseFan + ' flow act').gsub(' ', '_')])
1714
+
1715
+ @airflows.each do |airflow_type, airflow|
1716
+ airflow.name = "Airflow: #{airflow_type}"
1717
+ airflow.timeseries_units = 'cfm'
1718
+ end
1719
+
1720
+ # Weather
1721
+ @weather = {}
1722
+ @weather[WT::DrybulbTemp] = Weather.new(variable: 'Site Outdoor Air Drybulb Temperature', variable_units: 'C', timeseries_units: 'F')
1723
+ @weather[WT::WetbulbTemp] = Weather.new(variable: 'Site Outdoor Air Wetbulb Temperature', variable_units: 'C', timeseries_units: 'F')
1724
+ @weather[WT::RelativeHumidity] = Weather.new(variable: 'Site Outdoor Air Relative Humidity', variable_units: '%', timeseries_units: '%')
1725
+ @weather[WT::WindSpeed] = Weather.new(variable: 'Site Wind Speed', variable_units: 'm/s', timeseries_units: 'mph')
1726
+ @weather[WT::DiffuseSolar] = Weather.new(variable: 'Site Diffuse Solar Radiation Rate per Area', variable_units: 'W/m^2', timeseries_units: 'Btu/(hr*ft^2)')
1727
+ @weather[WT::DirectSolar] = Weather.new(variable: 'Site Direct Solar Radiation Rate per Area', variable_units: 'W/m^2', timeseries_units: 'Btu/(hr*ft^2)')
1728
+
1729
+ @weather.each do |weather_type, weather_data|
1730
+ weather_data.name = "Weather: #{weather_type}"
1731
+ end
1732
+ end
1733
+
1734
+ def reporting_frequency_map
1735
+ return {
1736
+ 'timestep' => 'Zone Timestep',
1737
+ 'hourly' => 'Hourly',
1738
+ 'daily' => 'Daily',
1739
+ 'monthly' => 'Monthly',
1740
+ }
1741
+ end
1742
+
1743
+ def get_object_output_variables_by_key(model, object, class_name)
1744
+ to_ft = { EPlus::FuelTypeElectricity => FT::Elec,
1745
+ EPlus::FuelTypeNaturalGas => FT::Gas,
1746
+ EPlus::FuelTypeOil => FT::Oil,
1747
+ EPlus::FuelTypePropane => FT::Propane,
1748
+ EPlus::FuelTypeWoodCord => FT::WoodCord,
1749
+ EPlus::FuelTypeWoodPellets => FT::WoodPellets,
1750
+ EPlus::FuelTypeCoal => FT::Coal }
1751
+
1752
+ # For a given object, returns the output variables to be requested and associates
1753
+ # them with the appropriate keys (e.g., [FT::Elec, EUT::Heating]).
1754
+
1755
+ if class_name == EUT
1756
+
1757
+ # End uses
1758
+
1759
+ if object.to_CoilHeatingDXSingleSpeed.is_initialized || object.to_CoilHeatingDXMultiSpeed.is_initialized
1760
+ return { [FT::Elec, EUT::Heating] => ["Heating Coil #{EPlus::FuelTypeElectricity} Energy", "Heating Coil Crankcase Heater #{EPlus::FuelTypeElectricity} Energy", "Heating Coil Defrost #{EPlus::FuelTypeElectricity} Energy"] }
1761
+
1762
+ elsif object.to_CoilHeatingElectric.is_initialized
1763
+ return { [FT::Elec, EUT::Heating] => ["Heating Coil #{EPlus::FuelTypeElectricity} Energy"] }
1764
+
1765
+ elsif object.to_CoilHeatingGas.is_initialized
1766
+ fuel = object.to_CoilHeatingGas.get.fuelType
1767
+ return { [to_ft[fuel], EUT::Heating] => ["Heating Coil #{fuel} Energy"] }
1768
+
1769
+ elsif object.to_CoilHeatingWaterToAirHeatPumpEquationFit.is_initialized
1770
+ return { [FT::Elec, EUT::Heating] => ["Heating Coil #{EPlus::FuelTypeElectricity} Energy"] }
1771
+
1772
+ elsif object.to_ZoneHVACBaseboardConvectiveElectric.is_initialized
1773
+ return { [FT::Elec, EUT::Heating] => ["Baseboard #{EPlus::FuelTypeElectricity} Energy"] }
1774
+
1775
+ elsif object.to_BoilerHotWater.is_initialized
1776
+ is_combi_boiler = false
1777
+ if object.additionalProperties.getFeatureAsBoolean('IsCombiBoiler').is_initialized
1778
+ is_combi_boiler = object.additionalProperties.getFeatureAsBoolean('IsCombiBoiler').get
1779
+ end
1780
+ if not is_combi_boiler # Exclude combi boiler, whose heating & dhw energy is handled separately via EMS
1781
+ fuel = object.to_BoilerHotWater.get.fuelType
1782
+ return { [to_ft[fuel], EUT::Heating] => ["Boiler #{fuel} Energy"] }
1783
+ end
1784
+
1785
+ elsif object.to_CoilCoolingDXSingleSpeed.is_initialized || object.to_CoilCoolingDXMultiSpeed.is_initialized
1786
+ vars = { [FT::Elec, EUT::Cooling] => ["Cooling Coil #{EPlus::FuelTypeElectricity} Energy"] }
1787
+ parent = model.getAirLoopHVACUnitarySystems.select { |u| u.coolingCoil.is_initialized && u.coolingCoil.get.handle.to_s == object.handle.to_s }
1788
+ if (not parent.empty?) && parent[0].heatingCoil.is_initialized
1789
+ htg_coil = parent[0].heatingCoil.get
1790
+ end
1791
+ if parent.empty?
1792
+ parent = model.getZoneHVACPackagedTerminalAirConditioners.select { |u| u.coolingCoil.handle.to_s == object.handle.to_s }
1793
+ if not parent.empty?
1794
+ htg_coil = parent[0].heatingCoil
1795
+ end
1796
+ end
1797
+ if parent.empty?
1798
+ fail 'Could not find parent object.'
1799
+ end
1800
+
1801
+ if htg_coil.nil? || (not (htg_coil.to_CoilHeatingDXSingleSpeed.is_initialized || htg_coil.to_CoilHeatingDXMultiSpeed.is_initialized))
1802
+ # Crankcase variable only available if no DX heating coil on parent
1803
+ vars[[FT::Elec, EUT::Cooling]] << "Cooling Coil Crankcase Heater #{EPlus::FuelTypeElectricity} Energy"
1804
+ end
1805
+ return vars
1806
+
1807
+ elsif object.to_CoilCoolingWaterToAirHeatPumpEquationFit.is_initialized
1808
+ return { [FT::Elec, EUT::Cooling] => ["Cooling Coil #{EPlus::FuelTypeElectricity} Energy"] }
1809
+
1810
+ elsif object.to_EvaporativeCoolerDirectResearchSpecial.is_initialized
1811
+ return { [FT::Elec, EUT::Cooling] => ["Evaporative Cooler #{EPlus::FuelTypeElectricity} Energy"] }
1812
+
1813
+ elsif object.to_CoilWaterHeatingAirToWaterHeatPumpWrapped.is_initialized
1814
+ return { [FT::Elec, EUT::HotWater] => ["Cooling Coil Water Heating #{EPlus::FuelTypeElectricity} Energy"] }
1815
+
1816
+ elsif object.to_FanSystemModel.is_initialized
1817
+ if object.name.to_s.start_with? Constants.ObjectNameWaterHeater
1818
+ return { [FT::Elec, EUT::HotWater] => ["Fan #{EPlus::FuelTypeElectricity} Energy"] }
1819
+ end
1820
+
1821
+ elsif object.to_PumpConstantSpeed.is_initialized
1822
+ if object.name.to_s.start_with? Constants.ObjectNameSolarHotWater
1823
+ return { [FT::Elec, EUT::HotWaterSolarThermalPump] => ["Pump #{EPlus::FuelTypeElectricity} Energy"] }
1824
+ end
1825
+
1826
+ elsif object.to_WaterHeaterMixed.is_initialized
1827
+ fuel = object.to_WaterHeaterMixed.get.heaterFuelType
1828
+ return { [to_ft[fuel], EUT::HotWater] => ["Water Heater #{fuel} Energy", "Water Heater Off Cycle Parasitic #{EPlus::FuelTypeElectricity} Energy", "Water Heater On Cycle Parasitic #{EPlus::FuelTypeElectricity} Energy"] }
1829
+
1830
+ elsif object.to_WaterHeaterStratified.is_initialized
1831
+ fuel = object.to_WaterHeaterStratified.get.heaterFuelType
1832
+ return { [to_ft[fuel], EUT::HotWater] => ["Water Heater #{fuel} Energy", "Water Heater Off Cycle Parasitic #{EPlus::FuelTypeElectricity} Energy", "Water Heater On Cycle Parasitic #{EPlus::FuelTypeElectricity} Energy"] }
1833
+
1834
+ elsif object.to_ExteriorLights.is_initialized
1835
+ return { [FT::Elec, EUT::LightsExterior] => ["Exterior Lights #{EPlus::FuelTypeElectricity} Energy"] }
1836
+
1837
+ elsif object.to_Lights.is_initialized
1838
+ end_use = { Constants.ObjectNameInteriorLighting => EUT::LightsInterior,
1839
+ Constants.ObjectNameGarageLighting => EUT::LightsGarage }[object.to_Lights.get.endUseSubcategory]
1840
+ return { [FT::Elec, end_use] => ["Lights #{EPlus::FuelTypeElectricity} Energy"] }
1841
+
1842
+ elsif object.to_ElectricLoadCenterInverterPVWatts.is_initialized
1843
+ return { [FT::Elec, EUT::PV] => ["Inverter AC Output #{EPlus::FuelTypeElectricity} Energy"] }
1844
+
1845
+ elsif object.to_GeneratorMicroTurbine.is_initialized
1846
+ fuel = object.to_GeneratorMicroTurbine.get.fuelType
1847
+ return { [FT::Elec, EUT::Generator] => ["Generator Produced AC #{EPlus::FuelTypeElectricity} Energy"],
1848
+ [to_ft[fuel], EUT::Generator] => ["Generator #{fuel} HHV Basis Energy"] }
1849
+
1850
+ elsif object.to_ElectricEquipment.is_initialized
1851
+ end_use = { Constants.ObjectNameHotWaterRecircPump => EUT::HotWaterRecircPump,
1852
+ Constants.ObjectNameClothesWasher => EUT::ClothesWasher,
1853
+ Constants.ObjectNameClothesDryer => EUT::ClothesDryer,
1854
+ Constants.ObjectNameDishwasher => EUT::Dishwasher,
1855
+ Constants.ObjectNameRefrigerator => EUT::Refrigerator,
1856
+ Constants.ObjectNameFreezer => EUT::Freezer,
1857
+ Constants.ObjectNameCookingRange => EUT::RangeOven,
1858
+ Constants.ObjectNameCeilingFan => EUT::CeilingFan,
1859
+ Constants.ObjectNameWholeHouseFan => EUT::WholeHouseFan,
1860
+ Constants.ObjectNameMechanicalVentilation => EUT::MechVent,
1861
+ Constants.ObjectNameMiscPlugLoads => EUT::PlugLoads,
1862
+ Constants.ObjectNameMiscTelevision => EUT::Television,
1863
+ Constants.ObjectNameMiscPoolHeater => EUT::PoolHeater,
1864
+ Constants.ObjectNameMiscPoolPump => EUT::PoolPump,
1865
+ Constants.ObjectNameMiscHotTubHeater => EUT::HotTubHeater,
1866
+ Constants.ObjectNameMiscHotTubPump => EUT::HotTubPump,
1867
+ Constants.ObjectNameMiscElectricVehicleCharging => EUT::Vehicle,
1868
+ Constants.ObjectNameMiscWellPump => EUT::WellPump }[object.to_ElectricEquipment.get.endUseSubcategory]
1869
+ if not end_use.nil?
1870
+ return { [FT::Elec, end_use] => ["Electric Equipment #{EPlus::FuelTypeElectricity} Energy"] }
1871
+ end
1872
+
1873
+ elsif object.to_OtherEquipment.is_initialized
1874
+ fuel = object.to_OtherEquipment.get.fuelType
1875
+ end_use = { Constants.ObjectNameClothesDryer => EUT::ClothesDryer,
1876
+ Constants.ObjectNameCookingRange => EUT::RangeOven,
1877
+ Constants.ObjectNameMiscGrill => EUT::Grill,
1878
+ Constants.ObjectNameMiscLighting => EUT::Lighting,
1879
+ Constants.ObjectNameMiscFireplace => EUT::Fireplace,
1880
+ Constants.ObjectNameMiscPoolHeater => EUT::PoolHeater,
1881
+ Constants.ObjectNameMiscHotTubHeater => EUT::HotTubHeater,
1882
+ Constants.ObjectNameMechanicalVentilationPreheating => EUT::MechVentPreheat,
1883
+ Constants.ObjectNameMechanicalVentilationPrecooling => EUT::MechVentPrecool }[object.to_OtherEquipment.get.endUseSubcategory]
1884
+ if not end_use.nil?
1885
+ return { [to_ft[fuel], end_use] => ["Other Equipment #{fuel} Energy"] }
1886
+ end
1887
+
1888
+ elsif object.to_ZoneHVACDehumidifierDX.is_initialized
1889
+ return { [FT::Elec, EUT::Dehumidifier] => ["Zone Dehumidifier #{EPlus::FuelTypeElectricity} Energy"] }
1890
+
1891
+ elsif object.to_EnergyManagementSystemOutputVariable.is_initialized
1892
+ if object.name.to_s.end_with? Constants.ObjectNameFanPumpDisaggregatePrimaryHeat
1893
+ return { [FT::Elec, EUT::HeatingFanPump] => [object.name.to_s] }
1894
+ elsif object.name.to_s.end_with? Constants.ObjectNameFanPumpDisaggregateBackupHeat
1895
+ return { [FT::Elec, EUT::HeatingFanPump] => [object.name.to_s] }
1896
+ elsif object.name.to_s.end_with? Constants.ObjectNameFanPumpDisaggregateCool
1897
+ return { [FT::Elec, EUT::CoolingFanPump] => [object.name.to_s] }
1898
+ elsif object.name.to_s.include? Constants.ObjectNameWaterHeaterAdjustment(nil)
1899
+ fuel = object.additionalProperties.getFeatureAsString('FuelType').get
1900
+ return { [to_ft[fuel], EUT::HotWater] => [object.name.to_s] }
1901
+ elsif object.name.to_s.include? Constants.ObjectNameCombiWaterHeatingEnergy(nil)
1902
+ fuel = object.additionalProperties.getFeatureAsString('FuelType').get
1903
+ return { [to_ft[fuel], EUT::HotWater] => [object.name.to_s] }
1904
+ elsif object.name.to_s.include? Constants.ObjectNameCombiSpaceHeatingEnergy(nil)
1905
+ fuel = object.additionalProperties.getFeatureAsString('FuelType').get
1906
+ return { [to_ft[fuel], EUT::Heating] => [object.name.to_s] }
1907
+ else
1908
+ return { ems: [object.name.to_s] }
1909
+ end
1910
+
1911
+ end
1912
+
1913
+ elsif class_name == HWT
1914
+
1915
+ # Hot Water Use
1916
+
1917
+ if object.to_WaterUseEquipment.is_initialized
1918
+ hot_water_use = { Constants.ObjectNameFixtures => HWT::Fixtures,
1919
+ Constants.ObjectNameDistributionWaste => HWT::DistributionWaste,
1920
+ Constants.ObjectNameClothesWasher => HWT::ClothesWasher,
1921
+ Constants.ObjectNameDishwasher => HWT::Dishwasher }[object.to_WaterUseEquipment.get.waterUseEquipmentDefinition.endUseSubcategory]
1922
+ return { hot_water_use => ['Water Use Equipment Hot Water Volume'] }
1923
+
1924
+ end
1925
+
1926
+ elsif class_name == LT
1927
+
1928
+ # Load
1929
+
1930
+ if object.to_WaterHeaterMixed.is_initialized || object.to_WaterHeaterStratified.is_initialized
1931
+ if object.to_WaterHeaterMixed.is_initialized
1932
+ capacity = object.to_WaterHeaterMixed.get.heaterMaximumCapacity.get
1933
+ else
1934
+ capacity = object.to_WaterHeaterStratified.get.heater1Capacity.get
1935
+ end
1936
+ is_combi_boiler = false
1937
+ if object.additionalProperties.getFeatureAsBoolean('IsCombiBoiler').is_initialized
1938
+ is_combi_boiler = object.additionalProperties.getFeatureAsBoolean('IsCombiBoiler').get
1939
+ end
1940
+ if capacity == 0 && object.name.to_s.include?(Constants.ObjectNameSolarHotWater)
1941
+ return { LT::HotWaterSolarThermal => ['Water Heater Use Side Heat Transfer Energy'] }
1942
+ elsif capacity > 0 || is_combi_boiler # Active water heater only (e.g., exclude desuperheater and solar thermal storage tanks)
1943
+ return { LT::HotWaterTankLosses => ['Water Heater Heat Loss Energy'] }
1944
+ end
1945
+
1946
+ elsif object.to_WaterUseConnections.is_initialized
1947
+ return { LT::HotWaterDelivered => ['Water Use Connections Plant Hot Water Energy'] }
1948
+
1949
+ elsif object.to_CoilWaterHeatingDesuperheater.is_initialized
1950
+ return { LT::HotWaterDesuperheater => ['Water Heater Heating Energy'] }
1951
+
1952
+ elsif object.to_CoilHeatingDXSingleSpeed.is_initialized || object.to_CoilHeatingDXMultiSpeed.is_initialized || object.to_CoilHeatingGas.is_initialized
1953
+ # Needed to apportion heating loads for dual-fuel heat pumps
1954
+ return { LT::Heating => ['Heating Coil Heating Energy'] }
1955
+
1956
+ end
1957
+
1958
+ elsif class_name == ILT
1959
+
1960
+ # Ideal Load
1961
+
1962
+ if object.to_ZoneHVACIdealLoadsAirSystem.is_initialized
1963
+ if object.name.to_s == Constants.ObjectNameIdealAirSystem
1964
+ return { ILT::Heating => ['Zone Ideal Loads Zone Sensible Heating Energy'],
1965
+ ILT::Cooling => ['Zone Ideal Loads Zone Sensible Cooling Energy'] }
1966
+ end
1967
+
1968
+ end
1969
+
1970
+ end
1971
+
1972
+ return {}
1973
+ end
1974
+ end
1975
+
1976
+ # register the measure to be used by the application
1977
+ ReportSimulationOutput.new.registerWithApplication