urbanopt-cli 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (732) hide show
  1. checksums.yaml +4 -4
  2. data/.github/pull_request_template.md +2 -2
  3. data/CHANGELOG.md +15 -0
  4. data/Gemfile +11 -11
  5. data/README.md +1 -1
  6. data/example_files/Gemfile +3 -3
  7. data/example_files/mappers/Baseline.rb +233 -204
  8. data/example_files/mappers/HighEfficiency.rb +41 -8
  9. data/example_files/measures/BuildResidentialModel/measure.rb +25 -5
  10. data/example_files/resources/hpxml-measures/.gitignore +1 -2
  11. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +364 -694
  12. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +1506 -889
  13. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +12 -0
  14. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/location.rb +1 -1
  15. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules.rb +1068 -0
  16. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_README.md +45 -0
  17. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_dryer_power_consumption_dist.csv +95 -0
  18. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_dryer_power_duration_dist.csv +95 -0
  19. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_washer_cluster_size_probability.csv +6 -0
  20. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_washer_event_duration_probability.csv +44 -0
  21. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_washer_power_consumption_dist.csv +93 -0
  22. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_washer_power_duration_dist.csv +93 -0
  23. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.yml +61 -0
  24. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_cooking_power_consumption_dist.csv +63 -0
  25. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_cooking_power_duration_dist.csv +63 -0
  26. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_dishwasher_cluster_size_probability.csv +8 -0
  27. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_dishwasher_event_duration_probability.csv +192 -0
  28. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_dishwasher_power_consumption_dist.csv +56 -0
  29. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_dishwasher_power_duration_dist.csv +56 -0
  30. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_shower_cluster_size_probability.csv +4 -0
  31. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_shower_event_duration_probability.csv +1531 -0
  32. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_cooking_evening_duration_probability.csv +10 -0
  33. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_cooking_midday_duration_probability.csv +20 -0
  34. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_cooking_morning_duration_probability.csv +19 -0
  35. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +7 -0
  36. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +11 -0
  37. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +11 -0
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_laundry_evening_duration_probability.csv +12 -0
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_laundry_midday_duration_probability.csv +19 -0
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_laundry_morning_duration_probability.csv +19 -0
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_shower_evening_duration_probability.csv +10 -0
  42. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_shower_midday_duration_probability.csv +12 -0
  43. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_shower_morning_duration_probability.csv +11 -0
  44. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_cooking_evening_duration_probability.csv +8 -0
  45. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_cooking_midday_duration_probability.csv +21 -0
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_cooking_morning_duration_probability.csv +26 -0
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +6 -0
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +14 -0
  49. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +15 -0
  50. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_laundry_evening_duration_probability.csv +7 -0
  51. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_laundry_midday_duration_probability.csv +19 -0
  52. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_laundry_morning_duration_probability.csv +25 -0
  53. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_shower_evening_duration_probability.csv +9 -0
  54. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_shower_midday_duration_probability.csv +11 -0
  55. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_shower_morning_duration_probability.csv +14 -0
  56. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_cooking_evening_duration_probability.csv +10 -0
  57. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_cooking_midday_duration_probability.csv +16 -0
  58. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_cooking_morning_duration_probability.csv +15 -0
  59. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +7 -0
  60. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +5 -0
  61. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +5 -0
  62. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_laundry_evening_duration_probability.csv +13 -0
  63. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_laundry_midday_duration_probability.csv +12 -0
  64. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_laundry_morning_duration_probability.csv +13 -0
  65. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_shower_evening_duration_probability.csv +10 -0
  66. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_shower_midday_duration_probability.csv +10 -0
  67. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_shower_morning_duration_probability.csv +14 -0
  68. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_cooking_evening_duration_probability.csv +9 -0
  69. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_cooking_midday_duration_probability.csv +18 -0
  70. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_cooking_morning_duration_probability.csv +10 -0
  71. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +8 -0
  72. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +10 -0
  73. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +8 -0
  74. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_laundry_evening_duration_probability.csv +10 -0
  75. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_laundry_midday_duration_probability.csv +17 -0
  76. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_laundry_morning_duration_probability.csv +14 -0
  77. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_shower_evening_duration_probability.csv +7 -0
  78. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_shower_midday_duration_probability.csv +12 -0
  79. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_shower_morning_duration_probability.csv +14 -0
  80. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_initial_prob_cluster_0.csv +7 -0
  81. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_initial_prob_cluster_1.csv +7 -0
  82. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_initial_prob_cluster_2.csv +7 -0
  83. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_initial_prob_cluster_3.csv +7 -0
  84. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_transition_prob_cluster_0.csv +665 -0
  85. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_transition_prob_cluster_1.csv +665 -0
  86. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_transition_prob_cluster_2.csv +665 -0
  87. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_transition_prob_cluster_3.csv +665 -0
  88. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_cooking_evening_duration_probability.csv +12 -0
  89. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_cooking_midday_duration_probability.csv +22 -0
  90. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_cooking_morning_duration_probability.csv +18 -0
  91. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +9 -0
  92. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +10 -0
  93. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +10 -0
  94. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_laundry_evening_duration_probability.csv +11 -0
  95. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_laundry_midday_duration_probability.csv +22 -0
  96. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_laundry_morning_duration_probability.csv +18 -0
  97. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_shower_evening_duration_probability.csv +8 -0
  98. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_shower_midday_duration_probability.csv +10 -0
  99. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_shower_morning_duration_probability.csv +15 -0
  100. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_cooking_evening_duration_probability.csv +14 -0
  101. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_cooking_midday_duration_probability.csv +23 -0
  102. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_cooking_morning_duration_probability.csv +24 -0
  103. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +12 -0
  104. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +14 -0
  105. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +15 -0
  106. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_laundry_evening_duration_probability.csv +12 -0
  107. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_laundry_midday_duration_probability.csv +21 -0
  108. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_laundry_morning_duration_probability.csv +22 -0
  109. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_shower_evening_duration_probability.csv +9 -0
  110. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_shower_midday_duration_probability.csv +15 -0
  111. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_shower_morning_duration_probability.csv +14 -0
  112. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_cooking_evening_duration_probability.csv +7 -0
  113. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_cooking_midday_duration_probability.csv +21 -0
  114. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_cooking_morning_duration_probability.csv +20 -0
  115. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +7 -0
  116. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +6 -0
  117. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +10 -0
  118. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_laundry_evening_duration_probability.csv +9 -0
  119. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_laundry_midday_duration_probability.csv +16 -0
  120. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_laundry_morning_duration_probability.csv +16 -0
  121. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_shower_evening_duration_probability.csv +9 -0
  122. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_shower_midday_duration_probability.csv +11 -0
  123. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_shower_morning_duration_probability.csv +14 -0
  124. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_cooking_evening_duration_probability.csv +8 -0
  125. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_cooking_midday_duration_probability.csv +24 -0
  126. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_cooking_morning_duration_probability.csv +34 -0
  127. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +6 -0
  128. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +12 -0
  129. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +13 -0
  130. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_laundry_evening_duration_probability.csv +10 -0
  131. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_laundry_midday_duration_probability.csv +24 -0
  132. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_laundry_morning_duration_probability.csv +29 -0
  133. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_shower_evening_duration_probability.csv +8 -0
  134. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_shower_midday_duration_probability.csv +14 -0
  135. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_shower_morning_duration_probability.csv +16 -0
  136. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_initial_prob_cluster_0.csv +7 -0
  137. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_initial_prob_cluster_1.csv +7 -0
  138. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_initial_prob_cluster_2.csv +7 -0
  139. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_initial_prob_cluster_3.csv +7 -0
  140. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_transition_prob_cluster_0.csv +665 -0
  141. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_transition_prob_cluster_1.csv +665 -0
  142. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_transition_prob_cluster_2.csv +665 -0
  143. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_transition_prob_cluster_3.csv +665 -0
  144. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +11 -57
  145. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-50percent.osw +11 -57
  146. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief.osw +11 -57
  147. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +11 -57
  148. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +11 -57
  149. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +11 -57
  150. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +11 -57
  151. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +11 -57
  152. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +11 -57
  153. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +11 -57
  154. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +11 -57
  155. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +11 -57
  156. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +11 -57
  157. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +11 -57
  158. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +11 -57
  159. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +11 -57
  160. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +11 -57
  161. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +11 -57
  162. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +11 -57
  163. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +11 -57
  164. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +11 -57
  165. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +11 -57
  166. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +11 -57
  167. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +11 -57
  168. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +11 -57
  169. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +11 -57
  170. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +11 -57
  171. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +11 -57
  172. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +11 -57
  173. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +11 -57
  174. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +11 -57
  175. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +11 -57
  176. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +11 -57
  177. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +11 -57
  178. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +11 -57
  179. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +11 -57
  180. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +11 -57
  181. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +11 -57
  182. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +11 -57
  183. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +11 -57
  184. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +11 -57
  185. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +11 -57
  186. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +11 -57
  187. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +11 -57
  188. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +11 -57
  189. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +11 -57
  190. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +11 -57
  191. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +11 -57
  192. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +11 -57
  193. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +11 -57
  194. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +11 -57
  195. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +11 -57
  196. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +11 -57
  197. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-uef.osw +11 -57
  198. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +11 -57
  199. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +11 -57
  200. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +11 -57
  201. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +11 -57
  202. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +11 -57
  203. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +11 -57
  204. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +11 -57
  205. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +11 -57
  206. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +11 -57
  207. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +11 -57
  208. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +11 -57
  209. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +11 -57
  210. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +11 -57
  211. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +11 -57
  212. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +11 -57
  213. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +11 -57
  214. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +11 -57
  215. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +11 -57
  216. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +11 -57
  217. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +11 -57
  218. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +11 -57
  219. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +11 -57
  220. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +11 -57
  221. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +11 -57
  222. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +11 -57
  223. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +11 -57
  224. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +11 -57
  225. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +11 -57
  226. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +11 -57
  227. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +11 -57
  228. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +11 -57
  229. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +11 -57
  230. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +11 -57
  231. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +11 -57
  232. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +11 -57
  233. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +11 -57
  234. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +11 -57
  235. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +11 -57
  236. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +11 -57
  237. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +11 -57
  238. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +11 -57
  239. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +11 -57
  240. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +11 -57
  241. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +11 -57
  242. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +11 -57
  243. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +11 -57
  244. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +11 -57
  245. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +11 -57
  246. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +11 -57
  247. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +11 -57
  248. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +11 -57
  249. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +11 -57
  250. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +11 -57
  251. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +11 -57
  252. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +11 -57
  253. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +11 -57
  254. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +11 -57
  255. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +11 -57
  256. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +11 -57
  257. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +11 -57
  258. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +11 -57
  259. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +11 -57
  260. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +11 -57
  261. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +11 -57
  262. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +11 -57
  263. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +11 -57
  264. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +11 -57
  265. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat.osw +11 -57
  266. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +11 -57
  267. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +11 -57
  268. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +11 -57
  269. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +11 -57
  270. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +11 -57
  271. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +11 -57
  272. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +11 -57
  273. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +11 -57
  274. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +11 -57
  275. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-location-epw-filepath-AMY-2012.osw → base-location-AMY-2012.osw} +12 -58
  276. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +11 -57
  277. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +11 -57
  278. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +11 -57
  279. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +11 -57
  280. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +11 -57
  281. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +11 -57
  282. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +11 -57
  283. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +11 -57
  284. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +11 -57
  285. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +11 -57
  286. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +11 -57
  287. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +11 -57
  288. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +11 -57
  289. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +11 -57
  290. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +11 -57
  291. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +11 -57
  292. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +11 -57
  293. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +11 -57
  294. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +11 -57
  295. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +11 -57
  296. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-multifamily.osw +11 -57
  297. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +11 -57
  298. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +363 -0
  299. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-location-epw-filepath.osw → base-schedules-user-specified.osw} +13 -58
  300. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +364 -0
  301. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +11 -57
  302. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +11 -57
  303. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +11 -57
  304. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +11 -57
  305. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-single-family-attached.osw +11 -57
  306. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +11 -57
  307. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +53 -2
  308. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +11 -57
  309. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-shared-water-heater.osw +11 -57
  310. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +11 -57
  311. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +11 -57
  312. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-mechvent-shared-preconditioning.osw +373 -0
  313. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-mechvent-shared.osw +367 -0
  314. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +11 -57
  315. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-shared.osw +11 -57
  316. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace.osw +11 -57
  317. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater.osw +11 -57
  318. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +11 -57
  319. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-vacancy-6-months.osw +367 -0
  320. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +11 -57
  321. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +11 -57
  322. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +11 -57
  323. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +11 -57
  324. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +11 -57
  325. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +11 -57
  326. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +11 -57
  327. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +11 -57
  328. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +11 -57
  329. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +11 -57
  330. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +11 -57
  331. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +11 -57
  332. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +11 -57
  333. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +11 -57
  334. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +11 -57
  335. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +11 -57
  336. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +11 -57
  337. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +11 -57
  338. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +11 -57
  339. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +11 -57
  340. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +11 -57
  341. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +11 -57
  342. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +11 -57
  343. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/stochastic.csv +8761 -0
  344. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/user-specified.csv +8761 -0
  345. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +65 -61
  346. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +104 -113
  347. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +9 -1
  348. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +62 -10
  349. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +4 -0
  350. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +8 -3
  351. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +127 -52
  352. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +21 -3
  353. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +67 -45
  354. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +17 -11
  355. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +54 -26
  356. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +3 -7
  357. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +85 -20
  358. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +500 -21
  359. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +5 -2
  360. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +14 -0
  361. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +44 -5
  362. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +2 -2
  363. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +15 -5
  364. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.xml +10 -10
  365. data/example_files/resources/hpxml-measures/SimulationOutputReport/resources/constants.rb +2 -0
  366. data/example_files/resources/hpxml-measures/SimulationOutputReport/tests/output_report_test.rb +29 -3
  367. data/example_files/resources/hpxml-measures/docs/source/build_residential_hpxml.rst +21 -7
  368. data/example_files/resources/hpxml-measures/docs/source/hpxml_to_openstudio.rst +36 -8
  369. data/example_files/resources/hpxml-measures/docs/source/simulation_output_report.rst +5 -4
  370. data/example_files/resources/hpxml-measures/tasks.rb +101 -175
  371. data/example_files/resources/hpxml-measures/weather/US_CO_Boulder_AMY_2012-cache.csv +1 -1
  372. data/example_files/resources/hpxml-measures/weather/US_CO_Boulder_AMY_2012.epw +1 -1
  373. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +0 -1
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +3 -1
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-50percent.xml +7 -1
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief.xml +7 -1
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +7 -1
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +3 -1
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +6 -1
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +3 -1
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +3 -1
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +3 -1
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +3 -1
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +7 -1
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +7 -1
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +7 -1
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +7 -1
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +7 -1
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +7 -1
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +7 -1
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +7 -1
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +7 -1
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +7 -1
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +7 -1
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +7 -1
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +7 -1
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +7 -1
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +7 -1
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +7 -1
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +7 -1
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +7 -1
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +7 -1
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +7 -1
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +7 -1
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +7 -1
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +7 -1
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +7 -1
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +7 -1
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +7 -1
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +3 -1
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +7 -1
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +7 -1
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +7 -1
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +7 -1
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +7 -1
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-laundry-room.xml +7 -1
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater-recirc.xml +7 -1
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater.xml +7 -1
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +7 -1
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +7 -1
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +7 -1
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +7 -1
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +7 -1
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +7 -1
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +7 -1
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +7 -1
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +7 -1
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +7 -1
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +7 -1
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +7 -1
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +7 -1
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +7 -1
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +7 -1
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +7 -1
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +7 -1
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +7 -1
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +7 -1
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +7 -1
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +7 -1
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-uef.xml +7 -1
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +7 -1
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +7 -1
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-attached-multifamily.xml +7 -1
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +7 -1
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +7 -1
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +7 -1
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +7 -1
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-common-surfaces.xml +7 -1
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +7 -1
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +7 -1
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +7 -1
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +7 -1
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +7 -1
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +7 -1
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-other-heated-space.xml +7 -1
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-other-housing-unit.xml +7 -1
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-other-multifamily-buffer-space.xml +7 -1
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-other-non-freezing-space.xml +7 -1
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +7 -1
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +7 -1
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +7 -1
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +7 -1
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +7 -1
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-interior-shading.xml +7 -1
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +7 -1
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +7 -1
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +7 -1
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +7 -1
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +7 -1
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +7 -1
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +7 -1
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +7 -1
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +7 -1
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +7 -1
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +7 -1
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +7 -1
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +7 -1
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +7 -1
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +7 -1
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +7 -1
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +7 -1
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +7 -1
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +7 -1
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +7 -1
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +7 -1
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +7 -1
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +7 -1
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +7 -1
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +7 -1
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +7 -1
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +7 -1
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +7 -1
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +7 -1
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +7 -1
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +7 -1
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +7 -1
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +7 -1
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +7 -1
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +7 -1
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +7 -1
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +7 -1
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +7 -1
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +7 -1
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +7 -1
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +7 -1
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +7 -1
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-flowrate.xml +7 -1
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +7 -1
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +7 -1
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +7 -1
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +7 -1
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +7 -1
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +7 -1
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +7 -1
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +7 -1
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +7 -1
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +7 -1
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +7 -1
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ideal-air.xml +7 -1
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +7 -1
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +7 -1
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +7 -1
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +7 -1
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +7 -1
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +7 -1
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +7 -1
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple2.xml +7 -1
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +7 -1
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +7 -1
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +7 -1
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +7 -1
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +7 -1
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +7 -1
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-baseboard.xml +7 -1
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil-ducted.xml +7 -1
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil.xml +7 -1
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-water-loop-heat-pump.xml +7 -1
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-cooling-tower-water-loop-heat-pump.xml +7 -1
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-baseboard.xml +7 -1
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-ducted.xml +7 -1
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-eae.xml +7 -1
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil.xml +7 -1
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-water-loop-heat-pump.xml +7 -1
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-baseboard.xml +7 -1
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil-ducted.xml +7 -1
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil.xml +7 -1
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-water-loop-heat-pump.xml +7 -1
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-cooling-tower-only-water-loop-heat-pump.xml +7 -1
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-ground-loop-ground-to-air-heat-pump.xml +7 -1
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +7 -1
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +7 -1
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +7 -1
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +7 -1
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +7 -1
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +7 -1
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-detailed.xml +7 -1
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +7 -1
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-location-epw-filepath-AMY-2012.xml → base-location-AMY-2012.xml} +8 -0
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +7 -1
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +7 -1
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +7 -1
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +7 -1
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +7 -1
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +7 -1
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +7 -1
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +7 -1
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +7 -1
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +7 -1
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +7 -1
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +7 -1
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +7 -1
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +7 -1
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +7 -1
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +7 -1
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared-multiple.xml +7 -1
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared-preconditioning.xml +7 -1
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared.xml +7 -1
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +7 -1
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +7 -1
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +3 -1
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +7 -1
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +7 -1
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +7 -1
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +7 -1
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shelter-coefficient.xml +7 -1
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +5 -1
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-shared.xml +7 -1
  588. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +7 -1
  589. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +565 -0
  590. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +565 -0
  591. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-location-epw-filepath.xml → base-simcontrol-calendar-year-custom.xml} +5 -0
  592. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +7 -1
  593. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +7 -1
  594. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +7 -1
  595. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +7 -1
  596. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +7 -1
  597. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-autosize.xml +7 -1
  598. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize-manual-s-oversize-allowances.xml +7 -1
  599. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize.xml +7 -1
  600. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize-manual-s-oversize-allowances.xml +7 -1
  601. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize.xml +7 -1
  602. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize-manual-s-oversize-allowances.xml +7 -1
  603. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize.xml +7 -1
  604. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-boiler-elec-only-autosize.xml +7 -1
  605. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-central-ac-1-speed-autosize.xml +7 -1
  606. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-only-autosize.xml +7 -1
  607. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-1-speed-autosize.xml +7 -1
  608. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-2-speed-autosize.xml +7 -1
  609. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-var-speed-autosize.xml +7 -1
  610. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-plus-air-to-air-heat-pump-heating-autosize.xml +7 -1
  611. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-autosize.xml +7 -1
  612. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-dual-fuel-mini-split-heat-pump-ducted-autosize.xml +7 -1
  613. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-elec-resistance-only-autosize.xml +7 -1
  614. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-evap-cooler-furnace-gas-autosize.xml +7 -1
  615. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-floor-furnace-propane-only-autosize.xml +7 -1
  616. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-furnace-elec-only-autosize.xml +7 -1
  617. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-2-speed-autosize.xml +7 -1
  618. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-var-speed-autosize.xml +7 -1
  619. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml +7 -1
  620. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-room-ac-autosize.xml +7 -1
  621. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize-manual-s-oversize-allowances.xml +7 -1
  622. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize.xml +7 -1
  623. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-air-conditioner-only-ducted-autosize.xml +7 -1
  624. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize-manual-s-oversize-allowances.xml +7 -1
  625. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml +7 -1
  626. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-cooling-only-autosize.xml +7 -1
  627. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-heating-only-autosize.xml +7 -1
  628. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-room-ac-only-autosize.xml +7 -1
  629. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-stove-oil-only-autosize.xml +7 -1
  630. data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-wall-furnace-elec-only-autosize.xml +7 -1
  631. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/appliances-location-unconditioned-space.xml +7 -1
  632. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml +7 -1
  633. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +7 -1
  634. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +7 -1
  635. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/coal-for-non-boiler-heating.xml +7 -1
  636. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +7 -1
  637. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +7 -1
  638. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +7 -1
  639. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +7 -1
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +7 -1
  641. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +7 -1
  642. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +7 -1
  643. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +7 -1
  644. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +7 -1
  645. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +7 -1
  646. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml +7 -1
  647. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +7 -1
  648. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +7 -1
  649. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +7 -1
  650. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +7 -1
  651. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +7 -1
  652. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml +7 -1
  653. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +7 -1
  654. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +7 -1
  655. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml +7 -1
  656. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +7 -1
  657. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +7 -1
  658. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +7 -1
  659. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml +7 -1
  660. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/{invalid-wmo.xml → invalid-calendar-year.xml} +8 -1
  661. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +7 -1
  662. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +7 -1
  663. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +4 -0
  664. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type.xml +7 -1
  665. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +7 -1
  666. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +7 -1
  667. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml +7 -1
  668. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +7 -1
  669. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +7 -1
  670. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +7 -1
  671. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-interior-shading.xml +7 -1
  672. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +7 -1
  673. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +7 -1
  674. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +7 -1
  675. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +7 -1
  676. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +7 -1
  677. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-surface.xml +7 -1
  678. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +7 -1
  679. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +7 -1
  680. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +7 -1
  681. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +7 -1
  682. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +7 -1
  683. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +7 -1
  684. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +7 -1
  685. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +7 -1
  686. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +7 -1
  687. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/slab-zero-exposed-perimeter.xml +7 -1
  688. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +7 -1
  689. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +7 -1
  690. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +7 -1
  691. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +7 -1
  692. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +7 -1
  693. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +7 -1
  694. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +7 -1
  695. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +7 -1
  696. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +7 -1
  697. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml +7 -1
  698. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +7 -1
  699. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +7 -1
  700. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +7 -1
  701. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +3 -1
  702. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +3 -1
  703. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +3 -1
  704. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +3 -1
  705. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +3 -1
  706. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +3 -1
  707. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +3 -1
  708. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +3 -1
  709. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +3 -1
  710. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +3 -1
  711. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +3 -1
  712. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +3 -1
  713. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +3 -1
  714. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +3 -1
  715. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +3 -1
  716. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +3 -1
  717. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +3 -1
  718. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +3 -1
  719. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +3 -1
  720. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +3 -1
  721. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +3 -1
  722. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +3 -1
  723. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +3 -1
  724. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +3 -1
  725. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +3 -1
  726. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +3 -1
  727. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +4 -2
  728. data/lib/uo_cli.rb +40 -22
  729. data/lib/uo_cli/version.rb +1 -1
  730. data/uo_cli.gemspec +3 -4
  731. metadata +149 -27
  732. data/example_files/resources/hpxml-measures/weather/data.csv +0 -1012
@@ -25,6 +25,10 @@ class Constants
25
25
  return 'right'
26
26
  end
27
27
 
28
+ def self.OptionTypeLightingScheduleCalculated
29
+ return 'Calculated Lighting Schedule'
30
+ end
31
+
28
32
  # Numbers --------------------
29
33
 
30
34
  def self.NumDaysInMonths(is_leap_year = false)
@@ -52,4 +56,12 @@ class Constants
52
56
  def self.NumApplyUpgradesCostsPerOption
53
57
  return 2
54
58
  end
59
+
60
+ def self.PeakFlowRate
61
+ return 500 # gal/min
62
+ end
63
+
64
+ def self.PeakPower
65
+ return 100 # kWh
66
+ end
55
67
  end
@@ -16,7 +16,7 @@ class Location
16
16
 
17
17
  require 'csv'
18
18
  CSV.foreach(zones_csv) do |row|
19
- return row[6].to_s if row[0].to_s == wmo.to_s
19
+ return row[6].to_s if row[0].to_s == wmo
20
20
  end
21
21
 
22
22
  return
@@ -0,0 +1,1068 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'csv'
4
+ require 'yaml'
5
+ require 'matrix'
6
+
7
+ class ScheduleGenerator
8
+ def initialize(runner:,
9
+ model:,
10
+ epw_file:,
11
+ building_id: nil)
12
+
13
+ @runner = runner
14
+ @model = model
15
+ @epw_file = epw_file
16
+ @building_id = building_id
17
+ end
18
+
19
+ def get_simulation_parameters
20
+ @minutes_per_step = 60
21
+ if @model.getSimulationControl.timestep.is_initialized
22
+ @minutes_per_step = 60 / @model.getSimulationControl.timestep.get.numberOfTimestepsPerHour
23
+ end
24
+ @steps_in_day = 24 * 60 / @minutes_per_step
25
+
26
+ @mkc_ts_per_day = 96
27
+ @mkc_ts_per_hour = @mkc_ts_per_day / 24
28
+
29
+ @model.getYearDescription.isLeapYear ? @total_days_in_year = 366 : @total_days_in_year = 365
30
+ end
31
+
32
+ def get_building_id
33
+ if @building_id.nil?
34
+ building_id = @model.getBuilding.additionalProperties.getFeatureAsInteger('Building ID') # this becomes the seed
35
+ if building_id.is_initialized
36
+ building_id = building_id.get
37
+ else
38
+ @runner.registerWarning('Unable to retrieve the Building ID (seed for schedule generator); setting it to 1.')
39
+ building_id = 1
40
+ end
41
+ else
42
+ building_id = @building_id
43
+ end
44
+
45
+ return building_id
46
+ end
47
+
48
+ def self.col_names
49
+ return [
50
+ 'occupants',
51
+ 'lighting_interior',
52
+ 'lighting_exterior',
53
+ 'lighting_garage',
54
+ 'lighting_exterior_holiday',
55
+ 'cooking_range',
56
+ 'refrigerator',
57
+ 'extra_refrigerator',
58
+ 'freezer',
59
+ 'dishwasher',
60
+ 'dishwasher_power',
61
+ 'clothes_washer',
62
+ 'clothes_washer_power',
63
+ 'clothes_dryer',
64
+ 'clothes_dryer_exhaust',
65
+ 'baths',
66
+ 'showers',
67
+ 'sinks',
68
+ 'fixtures',
69
+ 'ceiling_fan',
70
+ 'plug_loads_other',
71
+ 'plug_loads_tv',
72
+ 'plug_loads_vehicle',
73
+ 'plug_loads_well_pump',
74
+ 'fuel_loads_grill',
75
+ 'fuel_loads_lighting',
76
+ 'fuel_loads_fireplace',
77
+ 'pool_pump',
78
+ 'pool_heater',
79
+ 'hot_tub_pump',
80
+ 'hot_tub_heater',
81
+ 'sleep',
82
+ 'vacancy'
83
+ ]
84
+ end
85
+
86
+ def initialize_schedules(args:)
87
+ @schedules = {}
88
+
89
+ ScheduleGenerator.col_names.each do |col_name|
90
+ @schedules[col_name] = Array.new(@total_days_in_year * @steps_in_day, 0.0)
91
+ end
92
+
93
+ return @schedules
94
+ end
95
+
96
+ def schedules
97
+ return @schedules
98
+ end
99
+
100
+ def create(args:)
101
+ get_simulation_parameters
102
+ initialize_schedules(args: args)
103
+
104
+ success = create_average_schedules(args: args)
105
+ return false if not success
106
+
107
+ success = create_stochastic_schedules(args: args)
108
+ return false if not success
109
+
110
+ success = set_vacancy(args: args, sim_year: @model.getYearDescription.calendarYear.get)
111
+ return false if not success
112
+
113
+ return true
114
+ end
115
+
116
+ def create_average_schedules(args:)
117
+ create_average_occupants
118
+ create_average_cooking_range
119
+ create_average_plug_loads_other
120
+ create_average_plug_loads_tv
121
+ create_average_plug_loads_vehicle
122
+ create_average_plug_loads_well_pump
123
+ create_average_lighting_interior
124
+ create_average_lighting_exterior
125
+ create_average_lighting_garage
126
+ create_average_lighting_exterior_holiday
127
+ create_average_clothes_washer(args: args)
128
+ create_average_clothes_dryer(args: args)
129
+ create_average_dishwasher(args: args)
130
+ create_average_fixtures(args: args)
131
+ create_average_ceiling_fan
132
+ create_average_refrigerator
133
+ create_average_extra_refrigerator
134
+ create_average_freezer
135
+ create_average_fuel_loads_grill
136
+ create_average_fuel_loads_lighting
137
+ create_average_fuel_loads_fireplace
138
+ create_average_pool_pump
139
+ create_average_pool_heater
140
+ create_average_hot_tub_pump
141
+ create_average_hot_tub_heater
142
+ end
143
+
144
+ def create_average_occupants
145
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'occupants', weekday_sch: Schedule.OccupantsWeekdayFractions, weekend_sch: Schedule.OccupantsWeekendFractions, monthly_sch: Schedule.OccupantsMonthlyMultipliers)
146
+ end
147
+
148
+ def create_average_lighting_interior
149
+ lighting_sch = Lighting.get_schedule(@model, @epw_file)
150
+ create_timeseries_from_months(sch_name: 'lighting_interior', month_schs: lighting_sch)
151
+ end
152
+
153
+ def create_average_lighting_exterior
154
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'lighting_exterior', weekday_sch: Schedule.LightingExteriorWeekdayFractions, weekend_sch: Schedule.LightingExteriorWeekendFractions, monthly_sch: Schedule.LightingExteriorMonthlyMultipliers)
155
+ end
156
+
157
+ def create_average_lighting_garage
158
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'lighting_garage', weekday_sch: Schedule.LightingExteriorWeekdayFractions, weekend_sch: Schedule.LightingExteriorWeekendFractions, monthly_sch: Schedule.LightingExteriorMonthlyMultipliers)
159
+ end
160
+
161
+ def create_average_lighting_exterior_holiday
162
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'lighting_exterior_holiday', weekday_sch: Schedule.LightingExteriorHolidayWeekdayFractions, weekend_sch: Schedule.LightingExteriorHolidayWeekendFractions, monthly_sch: Schedule.LightingExteriorHolidayMonthlyMultipliers, begin_month: 11, begin_day_of_month: 24, end_month: 1, end_day_of_month: 6)
163
+ end
164
+
165
+ def create_average_cooking_range
166
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'cooking_range', weekday_sch: Schedule.CookingRangeWeekdayFractions, weekend_sch: Schedule.CookingRangeWeekendFractions, monthly_sch: Schedule.CookingRangeMonthlyMultipliers)
167
+ end
168
+
169
+ def create_average_refrigerator
170
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'refrigerator', weekday_sch: Schedule.RefrigeratorWeekdayFractions, weekend_sch: Schedule.RefrigeratorWeekendFractions, monthly_sch: Schedule.RefrigeratorMonthlyMultipliers)
171
+ end
172
+
173
+ def create_average_extra_refrigerator
174
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'extra_refrigerator', weekday_sch: Schedule.ExtraRefrigeratorWeekdayFractions, weekend_sch: Schedule.ExtraRefrigeratorWeekendFractions, monthly_sch: Schedule.ExtraRefrigeratorMonthlyMultipliers)
175
+ end
176
+
177
+ def create_average_freezer
178
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'freezer', weekday_sch: Schedule.FreezerWeekdayFractions, weekend_sch: Schedule.FreezerWeekendFractions, monthly_sch: Schedule.FreezerMonthlyMultipliers)
179
+ end
180
+
181
+ def create_average_dishwasher(args:)
182
+ create_timeseries_from_minutely(sch_name: 'dishwasher', obj_name: Constants.ObjectNameDishwasher, days_shift: 0, dryer_exhaust_min_runtime: 0, args: args)
183
+ create_timeseries_from_minutely(sch_name: 'dishwasher_power', obj_name: Constants.ObjectNameDishwasher, days_shift: 0, dryer_exhaust_min_runtime: 0, args: args)
184
+ end
185
+
186
+ def create_average_clothes_washer(args:)
187
+ create_timeseries_from_minutely(sch_name: 'clothes_washer', obj_name: Constants.ObjectNameClothesWasher, days_shift: 0, dryer_exhaust_min_runtime: 0, args: args)
188
+ create_timeseries_from_minutely(sch_name: 'clothes_washer_power', obj_name: Constants.ObjectNameClothesWasher, days_shift: 0, dryer_exhaust_min_runtime: 0, args: args)
189
+ end
190
+
191
+ def create_average_clothes_dryer(args:)
192
+ create_timeseries_from_minutely(sch_name: 'clothes_dryer', obj_name: Constants.ObjectNameClothesDryer, days_shift: -1.0 / 24.0, dryer_exhaust_min_runtime: 0, args: args)
193
+ create_timeseries_from_minutely(sch_name: 'clothes_dryer_exhaust', obj_name: Constants.ObjectNameClothesDryerExhaust, days_shift: -1.0 / 24.0, dryer_exhaust_min_runtime: 24, args: args)
194
+ end
195
+
196
+ def create_average_fixtures(args:)
197
+ create_timeseries_from_minutely(sch_name: 'fixtures', obj_name: Constants.ObjectNameFixtures, days_shift: 0, dryer_exhaust_min_runtime: 0, args: args)
198
+ end
199
+
200
+ def create_average_ceiling_fan
201
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'ceiling_fan', weekday_sch: Schedule.CeilingFanWeekdayFractions, weekend_sch: Schedule.CeilingFanWeekendFractions, monthly_sch: '1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0')
202
+ end
203
+
204
+ def create_average_plug_loads_other
205
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'plug_loads_other', weekday_sch: Schedule.PlugLoadsOtherWeekdayFractions, weekend_sch: Schedule.PlugLoadsOtherWeekendFractions, monthly_sch: Schedule.PlugLoadsOtherMonthlyMultipliers)
206
+ end
207
+
208
+ def create_average_plug_loads_tv
209
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'plug_loads_tv', weekday_sch: Schedule.PlugLoadsTVWeekdayFractions, weekend_sch: Schedule.PlugLoadsTVWeekendFractions, monthly_sch: Schedule.PlugLoadsTVMonthlyMultipliers)
210
+ end
211
+
212
+ def create_average_plug_loads_vehicle
213
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'plug_loads_vehicle', weekday_sch: Schedule.PlugLoadsVehicleWeekdayFractions, weekend_sch: Schedule.PlugLoadsVehicleWeekendFractions, monthly_sch: Schedule.PlugLoadsVehicleMonthlyMultipliers)
214
+ end
215
+
216
+ def create_average_plug_loads_well_pump
217
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'plug_loads_well_pump', weekday_sch: Schedule.PlugLoadsWellPumpWeekdayFractions, weekend_sch: Schedule.PlugLoadsWellPumpWeekendFractions, monthly_sch: Schedule.PlugLoadsWellPumpMonthlyMultipliers)
218
+ end
219
+
220
+ def create_average_fuel_loads_grill
221
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'fuel_loads_grill', weekday_sch: Schedule.FuelLoadsGrillWeekdayFractions, weekend_sch: Schedule.FuelLoadsGrillWeekendFractions, monthly_sch: Schedule.FuelLoadsGrillMonthlyMultipliers)
222
+ end
223
+
224
+ def create_average_fuel_loads_lighting
225
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'fuel_loads_lighting', weekday_sch: Schedule.FuelLoadsLightingWeekdayFractions, weekend_sch: Schedule.FuelLoadsLightingWeekendFractions, monthly_sch: Schedule.FuelLoadsLightingMonthlyMultipliers)
226
+ end
227
+
228
+ def create_average_fuel_loads_fireplace
229
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'fuel_loads_fireplace', weekday_sch: Schedule.FuelLoadsFireplaceWeekdayFractions, weekend_sch: Schedule.FuelLoadsFireplaceWeekendFractions, monthly_sch: Schedule.FuelLoadsFireplaceMonthlyMultipliers)
230
+ end
231
+
232
+ def create_average_pool_pump
233
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'pool_pump', weekday_sch: Schedule.PoolPumpWeekdayFractions, weekend_sch: Schedule.PoolPumpWeekendFractions, monthly_sch: Schedule.PoolPumpMonthlyMultipliers)
234
+ end
235
+
236
+ def create_average_pool_heater
237
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'pool_heater', weekday_sch: Schedule.PoolPumpWeekdayFractions, weekend_sch: Schedule.PoolPumpWeekendFractions, monthly_sch: Schedule.PoolHeaterMonthlyMultipliers)
238
+ end
239
+
240
+ def create_average_hot_tub_pump
241
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'hot_tub_pump', weekday_sch: Schedule.HotTubPumpWeekdayFractions, weekend_sch: Schedule.HotTubPumpWeekendFractions, monthly_sch: Schedule.HotTubPumpMonthlyMultipliers)
242
+ end
243
+
244
+ def create_average_hot_tub_heater
245
+ create_timeseries_from_weekday_weekend_monthly(sch_name: 'hot_tub_heater', weekday_sch: Schedule.HotTubHeaterWeekdayFractions, weekend_sch: Schedule.HotTubHeaterWeekendFractions, monthly_sch: Schedule.HotTubHeaterMonthlyMultipliers)
246
+ end
247
+
248
+ def create_timeseries_from_weekday_weekend_monthly(sch_name:,
249
+ weekday_sch:,
250
+ weekend_sch:,
251
+ monthly_sch:,
252
+ begin_month: nil,
253
+ begin_day_of_month: nil,
254
+ end_month: nil,
255
+ end_day_of_month: nil)
256
+
257
+ daily_sch = { 'weekday_sch' => weekday_sch.split(',').map { |i| i.to_f },
258
+ 'weekend_sch' => weekend_sch.split(',').map { |i| i.to_f },
259
+ 'monthly_multiplier' => monthly_sch.split(',').map { |i| i.to_f } }
260
+
261
+ sim_year = @model.getYearDescription.calendarYear.get
262
+
263
+ if begin_month.nil? && begin_day_of_month.nil? && end_month.nil? && end_day_of_month.nil?
264
+ begin_day = DateTime.new(sim_year, 1, 1)
265
+ end_day = DateTime.new(sim_year, 12, 31)
266
+ else
267
+ begin_day = DateTime.new(sim_year, begin_month, begin_day_of_month)
268
+ end_day = DateTime.new(sim_year, end_month, end_day_of_month)
269
+ end
270
+
271
+ start_day = DateTime.new(sim_year, 1, 1)
272
+ @total_days_in_year.times do |day|
273
+ today = start_day + day
274
+ if begin_day <= end_day
275
+ next if not (begin_day <= today && today <= end_day)
276
+ else
277
+ next if not (begin_day <= today || today <= end_day)
278
+ end
279
+ month = today.month
280
+ day_of_week = today.wday
281
+ [0, 6].include?(day_of_week) ? is_weekday = false : is_weekday = true
282
+ @steps_in_day.times do |step|
283
+ minute = day * 1440 + step * @minutes_per_step
284
+ @schedules[sch_name][day * @steps_in_day + step] = get_value_from_daily_sch(daily_sch, month, is_weekday, minute, 1)
285
+ end
286
+ end
287
+ @schedules[sch_name] = normalize(@schedules[sch_name])
288
+ end
289
+
290
+ def create_timeseries_from_months(sch_name:,
291
+ month_schs:)
292
+
293
+ num_days_in_months = Constants.NumDaysInMonths(@model.getYearDescription)
294
+ sch = []
295
+ for month in 0..11
296
+ sch << month_schs[month] * num_days_in_months[month]
297
+ end
298
+ sch = sch.flatten
299
+ m = sch.max
300
+ sch = sch.map { |s| s / m }
301
+
302
+ sim_year = @model.getYearDescription.calendarYear.get
303
+ start_day = DateTime.new(sim_year, 1, 1)
304
+ @total_days_in_year.times do |day|
305
+ @steps_in_day.times do |step|
306
+ minute = day * 1440 + step * @minutes_per_step
307
+ @schedules[sch_name][day * @steps_in_day + step] = scale_lighting_by_occupancy(sch, minute, 1)
308
+ end
309
+ end
310
+ @schedules[sch_name] = normalize(@schedules[sch_name])
311
+ end
312
+
313
+ def create_timeseries_from_minutely(sch_name:,
314
+ obj_name:,
315
+ days_shift:,
316
+ dryer_exhaust_min_runtime:,
317
+ args:)
318
+
319
+ nbeds = args[:geometry_num_bedrooms]
320
+ create_sch_object = false
321
+ sch = HotWaterSchedule.new(@model, obj_name, nbeds, days_shift, dryer_exhaust_min_runtime, create_sch_object)
322
+
323
+ weeks = 1 # use a single week that repeats
324
+
325
+ year_description = @model.getYearDescription
326
+ last_day_of_year = 365
327
+ last_day_of_year += 1 if year_description.isLeapYear
328
+
329
+ time = []
330
+ (@minutes_per_step..24 * 60).step(@minutes_per_step).to_a.each_with_index do |m, i|
331
+ time[i] = OpenStudio::Time.new(0, 0, m, 0)
332
+ end
333
+
334
+ data = sch.data
335
+
336
+ unique_day_schedule = []
337
+ for d in 1..7 * weeks # how many unique day schedules
338
+ next if d > last_day_of_year
339
+
340
+ time.each_with_index do |m, i|
341
+ previous_value = data[i + (d - 1) * 24 * 60 / @minutes_per_step]
342
+ unique_day_schedule << previous_value
343
+ end
344
+ end
345
+
346
+ repeated_schedule = []
347
+ for w in 0..52 # max num of weeks
348
+ repeated_schedule += unique_day_schedule
349
+ end
350
+
351
+ @schedules[sch_name] = repeated_schedule[0...@total_days_in_year * @steps_in_day]
352
+ end
353
+
354
+ def create_stochastic_schedules(args:)
355
+ # get building_id if this is called by, e.g., BuildExistingModel
356
+ building_id = get_building_id
357
+
358
+ # initialize a random number generator using building_id
359
+ prng = Random.new(building_id)
360
+
361
+ # load the schedule configuration file
362
+ schedule_config = YAML.load_file(args[:resources_path] + '/schedules_config.yml')
363
+
364
+ # pre-load the probability distribution csv files for speed
365
+ cluster_size_prob_map = read_activity_cluster_size_probs(resources_path: args[:resources_path])
366
+ event_duration_prob_map = read_event_duration_probs(resources_path: args[:resources_path])
367
+ activity_duration_prob_map = read_activity_duration_prob(resources_path: args[:resources_path])
368
+ appliance_power_dist_map = read_appliance_power_dist(resources_path: args[:resources_path])
369
+
370
+ all_simulated_values = [] # holds the markov-chain state for each of the seven simulated states for each occupant.
371
+ # States are: 'sleeping', 'shower', 'laundry', 'cooking', 'dishwashing', 'absent', 'nothingAtHome'
372
+ # if geometry_num_occupants = 2, period_in_a_year = 35040, num_of_states = 7, then
373
+ # shape of all_simulated_values is [2, 35040, 7]
374
+ (1..args[:geometry_num_occupants]).each do |i|
375
+ occ_type_id = weighted_random(prng, schedule_config['occupancy_types_probability'])
376
+ init_prob_file_weekday = args[:resources_path] + "/schedules_weekday_mkv_chain_initial_prob_cluster_#{occ_type_id}.csv"
377
+ initial_prob_weekday = CSV.read(init_prob_file_weekday)
378
+ initial_prob_weekday = initial_prob_weekday.map { |x| x[0].to_f }
379
+ init_prob_file_weekend = args[:resources_path] + "/schedules_weekend_mkv_chain_initial_prob_cluster_#{occ_type_id}.csv"
380
+ initial_prob_weekend = CSV.read(init_prob_file_weekend)
381
+ initial_prob_weekend = initial_prob_weekend.map { |x| x[0].to_f }
382
+
383
+ transition_matrix_file_weekday = args[:resources_path] + "/schedules_weekday_mkv_chain_transition_prob_cluster_#{occ_type_id}.csv"
384
+ transition_matrix_weekday = CSV.read(transition_matrix_file_weekday)
385
+ transition_matrix_weekday = transition_matrix_weekday.map { |x| x.map { |y| y.to_f } }
386
+ transition_matrix_file_weekend = args[:resources_path] + "/schedules_weekend_mkv_chain_transition_prob_cluster_#{occ_type_id}.csv"
387
+ transition_matrix_weekend = CSV.read(transition_matrix_file_weekend)
388
+ transition_matrix_weekend = transition_matrix_weekend.map { |x| x.map { |y| y.to_f } }
389
+
390
+ simulated_values = []
391
+ sim_year = @model.getYearDescription.calendarYear.get
392
+ start_day = DateTime.new(sim_year, 1, 1)
393
+ @total_days_in_year.times do |day|
394
+ today = start_day + day
395
+ day_of_week = today.wday
396
+ if [0, 6].include?(day_of_week)
397
+ # Weekend
398
+ day_type = 'weekend'
399
+ initial_prob = initial_prob_weekend
400
+ transition_matrix = transition_matrix_weekend
401
+ else
402
+ # weekday
403
+ day_type = 'weekday'
404
+ initial_prob = initial_prob_weekday
405
+ transition_matrix = transition_matrix_weekday
406
+ end
407
+ j = 0
408
+ state_prob = initial_prob # [] shape = 1x7. probability of transitioning to each of the 7 states
409
+ while j < @mkc_ts_per_day do
410
+ active_state = weighted_random(prng, state_prob) # Randomly pick the next state
411
+ state_vector = [0] * 7 # there are 7 states
412
+ state_vector[active_state] = 1 # Transition to the new state
413
+ # sample the duration of the state, and skip markov-chain based state transition until the end of the duration
414
+ activity_duration = sample_activity_duration(prng, activity_duration_prob_map, occ_type_id, active_state, day_type, j / 4)
415
+ activity_duration.times do |repeat_activity_count|
416
+ # repeat the same activity for the duration times
417
+ simulated_values << state_vector
418
+ j += 1
419
+ if j >= @mkc_ts_per_day then break end # break as soon as we have filled acitivities for the day
420
+ end
421
+ if j >= @mkc_ts_per_day then break end # break as soon as we have filled activities for the day
422
+
423
+ transition_probs = transition_matrix[(j - 1) * 7...j * 7] # obtain the transition matrix for current timestep
424
+ transition_probs_matrix = Matrix[*transition_probs]
425
+ current_state_vec = Matrix.row_vector(state_vector)
426
+ state_prob = current_state_vec * transition_probs_matrix # Get a new state_probability array
427
+ state_prob = state_prob.to_a[0]
428
+ end
429
+ end
430
+ # Markov-chain transition probabilities is based on ATUS data, and the starting time of day for the data is
431
+ # 4 am. We need to shift everything forward by 16 timesteps to make it midnight-based.
432
+ simulated_values = simulated_values.rotate(-4 * 4) # 4am shifting (4 hours = 4 * 4 steps of 15 min intervals)
433
+ all_simulated_values << Matrix[*simulated_values]
434
+ end
435
+ # shape of all_simulated_values is [2, 35040, 7] i.e. (geometry_num_occupants, period_in_a_year, number_of_states)
436
+ plugload_sch = schedule_config['plugload']
437
+ lighting_sch = schedule_config['lighting']
438
+ ceiling_fan_sch = schedule_config['ceiling_fan']
439
+
440
+ monthly_lighting_schedule = schedule_config['lighting']['monthly_multiplier']
441
+ holiday_lighting_schedule = schedule_config['lighting']['holiday_sch']
442
+
443
+ sch_option_type = Constants.OptionTypeLightingScheduleCalculated
444
+ sch = Lighting.get_schedule(@model, @epw_file)
445
+ interior_lighting_schedule = []
446
+ year_description = @model.getYearDescription
447
+ num_days_in_months = Constants.NumDaysInMonths(year_description.isLeapYear)
448
+ for month in 0..11
449
+ interior_lighting_schedule << sch[month] * num_days_in_months[month]
450
+ end
451
+ interior_lighting_schedule = interior_lighting_schedule.flatten
452
+ m = interior_lighting_schedule.max
453
+ interior_lighting_schedule = interior_lighting_schedule.map { |s| s / m }
454
+
455
+ holiday_lighting_schedule = get_holiday_lighting_sch(@model, @runner, holiday_lighting_schedule)
456
+
457
+ away_schedule = []
458
+ idle_schedule = []
459
+
460
+ # fill in the yearly time_step resolution schedule for plug/lighting and ceiling fan based on weekday/weekend sch
461
+ # States are: 0='sleeping', 1='shower', 2='laundry', 3='cooking', 4='dishwashing', 5='absent', 6='nothingAtHome'
462
+ sim_year = @model.getYearDescription.calendarYear.get
463
+ start_day = DateTime.new(sim_year, 1, 1)
464
+ @total_days_in_year.times do |day|
465
+ today = start_day + day
466
+ month = today.month
467
+ day_of_week = today.wday
468
+ [0, 6].include?(day_of_week) ? is_weekday = false : is_weekday = true
469
+ @steps_in_day.times do |step|
470
+ minute = day * 1440 + step * @minutes_per_step
471
+ index_15 = (minute / 15).to_i
472
+ sleep = sum_across_occupants(all_simulated_values, 0, index_15).to_f / args[:geometry_num_occupants]
473
+ @schedules['sleep'][day * @steps_in_day + step] = sleep
474
+ away_schedule << sum_across_occupants(all_simulated_values, 5, index_15).to_f / args[:geometry_num_occupants]
475
+ idle_schedule << sum_across_occupants(all_simulated_values, 6, index_15).to_f / args[:geometry_num_occupants]
476
+ active_occupancy_percentage = 1 - (away_schedule[-1] + sleep)
477
+ @schedules['plug_loads_other'][day * @steps_in_day + step] = get_value_from_daily_sch(plugload_sch, month, is_weekday, minute, active_occupancy_percentage)
478
+ @schedules['lighting_interior'][day * @steps_in_day + step] = scale_lighting_by_occupancy(interior_lighting_schedule, minute, active_occupancy_percentage)
479
+ @schedules['lighting_exterior'][day * @steps_in_day + step] = get_value_from_daily_sch(lighting_sch, month, is_weekday, minute, 1)
480
+ @schedules['lighting_garage'][day * @steps_in_day + step] = get_value_from_daily_sch(lighting_sch, month, is_weekday, minute, 1)
481
+ @schedules['lighting_exterior_holiday'][day * @steps_in_day + step] = scale_lighting_by_occupancy(holiday_lighting_schedule, minute, 1)
482
+ @schedules['ceiling_fan'][day * @steps_in_day + step] = get_value_from_daily_sch(ceiling_fan_sch, month, is_weekday, minute, active_occupancy_percentage)
483
+ end
484
+ end
485
+ @schedules['plug_loads_other'] = normalize(@schedules['plug_loads_other'])
486
+ @schedules['lighting_interior'] = normalize(@schedules['lighting_interior'])
487
+ @schedules['lighting_exterior'] = normalize(@schedules['lighting_exterior'])
488
+ @schedules['lighting_garage'] = normalize(@schedules['lighting_garage'])
489
+ @schedules['lighting_exterior_holiday'] = normalize(@schedules['lighting_exterior_holiday'])
490
+ @schedules['ceiling_fan'] = normalize(@schedules['ceiling_fan'])
491
+
492
+ # Generate the Sink Schedule
493
+ # 1. Find indexes (minutes) when at least one occupant can have sink event (they aren't sleeping or absent)
494
+ # 2. Determine number of cluster per day
495
+ # 3. Sample flow-rate for the sink
496
+ # 4. For each cluster
497
+ # a. sample for number_of_events
498
+ # b. Re-normalize onset probability by removing invalid indexes (invalid = where we already have sink events)
499
+ # b. Probabilistically determine the start of the first event based on onset probability.
500
+ # c. For each event in number_of_events
501
+ # i. Sample the duration
502
+ # ii. Add the time occupied by event to invalid_index
503
+ # ii. if more events, offset by fixed wait time and goto c
504
+ # d. if more cluster, go to 4.
505
+ mins_in_year = 1440 * @total_days_in_year
506
+ mkc_steps_in_a_year = @total_days_in_year * @mkc_ts_per_day
507
+ sink_activtiy_probable_mins = [0] * mkc_steps_in_a_year # 0 indicates sink activity cannot happen at that time
508
+ sink_activity_sch = [0] * 1440 * @total_days_in_year
509
+ # mark minutes when at least one occupant is doing nothing at home as possible sink activity time
510
+ # States are: 0='sleeping', 1='shower', 2='laundry', 3='cooking', 4='dishwashing', 5='absent', 6='nothingAtHome'
511
+ mkc_steps_in_a_year.times do |step|
512
+ all_simulated_values.size.times do |i| # across occupants
513
+ # if at least one occupant is not sleeping and not absent from home, then sink event can occur at that time
514
+ if not ((all_simulated_values[i][step, 0] == 1) || (all_simulated_values[i][step, 5] == 1))
515
+ sink_activtiy_probable_mins[step] = 1
516
+ end
517
+ end
518
+ end
519
+
520
+ sink_duration_probs = schedule_config['sink']['duration_probability']
521
+ events_per_cluster_probs = schedule_config['sink']['events_per_cluster_probs']
522
+ hourly_onset_prob = schedule_config['sink']['hourly_onset_prob']
523
+ total_clusters = schedule_config['sink']['total_annual_cluster']
524
+ sink_between_event_gap = schedule_config['sink']['between_event_gap']
525
+ cluster_per_day = total_clusters / @total_days_in_year
526
+ sink_flow_rate_mean = schedule_config['sink']['flow_rate_mean']
527
+ sink_flow_rate_std = schedule_config['sink']['flow_rate_std']
528
+ sink_flow_rate = gaussian_rand(prng, sink_flow_rate_mean, sink_flow_rate_std, 0.1)
529
+ @total_days_in_year.times do |day|
530
+ cluster_per_day.times do |cluster_count|
531
+ todays_probable_steps = sink_activtiy_probable_mins[day * @mkc_ts_per_day...((day + 1) * @mkc_ts_per_day)]
532
+ todays_probablities = todays_probable_steps.map.with_index { |p, i| p * hourly_onset_prob[i / @mkc_ts_per_hour] }
533
+ prob_sum = todays_probablities.reduce(0, :+)
534
+ normalized_probabilities = todays_probablities.map { |p| p * 1 / prob_sum }
535
+ cluster_start_index = weighted_random(prng, normalized_probabilities)
536
+ sink_activtiy_probable_mins[cluster_start_index] = 0 # mark the 15-min interval as unavailable for another sink event
537
+ num_events = weighted_random(prng, events_per_cluster_probs) + 1
538
+ start_min = cluster_start_index * 15
539
+ end_min = (cluster_start_index + 1) * 15
540
+ num_events.times do |event_count|
541
+ duration = weighted_random(prng, sink_duration_probs) + 1
542
+ if start_min + duration > end_min then duration = (end_min - start_min) end
543
+ sink_activity_sch.fill(sink_flow_rate, (day * 1440) + start_min, duration)
544
+ start_min += duration + sink_between_event_gap # Two minutes gap between sink activity
545
+ if start_min >= end_min then break end
546
+ end
547
+ end
548
+ end
549
+
550
+ # Generate minute level schedule for shower and bath
551
+ # 1. Identify the shower time slots from the mkc schedule. This corresponds to personal hygiene time
552
+ # For each slot:
553
+ # 2. Determine if the personal hygiene is to be bath/shower using bath_to_shower_ratio probability
554
+ # 3. Sample for the shower and bath flow rate. (These will remain same throughout the year for a given building)
555
+ # However, the duration of each shower/bath event can be different, so, in 15-minute aggregation, the shower/bath
556
+ # Water consumption might appear different between different events
557
+ # 4. If it is shower
558
+ # a. Determine the number of events in the shower cluster (there can be multiple showers)
559
+ # b. For each event, sample the shower duration
560
+ # c. Fill in the time period of personal hygiene using that many events of corresponding duration
561
+ # separated by shower_between_event_gap.
562
+ # TODO If there is room in the mkc personal hygiene slot, shift uniform randomly
563
+ # 5. If it is bath
564
+ # a. Sample the bath duration
565
+ # b. Fill in the mkc personal hygiene slot with the bath duration and flow rate.
566
+ # TODO If there is room in the mkc personal hygiene slot, shift uniform randomly
567
+ # 6. Repeat process 2-6 for each occupant
568
+ shower_between_event_gap = schedule_config['shower']['between_event_gap']
569
+ shower_flow_rate_mean = schedule_config['shower']['flow_rate_mean']
570
+ shower_flow_rate_std = schedule_config['shower']['flow_rate_std']
571
+ bath_ratio = schedule_config['bath']['bath_to_shower_ratio']
572
+ bath_duration_mean = schedule_config['bath']['duration_mean']
573
+ bath_duration_std = schedule_config['bath']['duration_std']
574
+ bath_flow_rate_mean = schedule_config['bath']['flow_rate_mean']
575
+ bath_flow_rate_std = schedule_config['bath']['flow_rate_std']
576
+ m = 0
577
+ shower_activity_sch = [0] * mins_in_year
578
+ bath_activity_sch = [0] * mins_in_year
579
+ bath_flow_rate = gaussian_rand(prng, bath_flow_rate_mean, bath_flow_rate_std, 0.1)
580
+ shower_flow_rate = gaussian_rand(prng, shower_flow_rate_mean, shower_flow_rate_std, 0.1)
581
+ # States are: 'sleeping','shower','laundry','cooking', 'dishwashing', 'absent', 'nothingAtHome'
582
+ step = 0
583
+ while step < mkc_steps_in_a_year
584
+ # shower_state will be equal to number of occupant taking shower/bath in the given 15-minute mkc interval
585
+ shower_state = sum_across_occupants(all_simulated_values, 1, step)
586
+ step_jump = 1
587
+ if shower_state > 0
588
+ shower_state.to_i.times do |occupant_number|
589
+ r = prng.rand
590
+ if r <= bath_ratio
591
+ # fill in bath for this time
592
+ duration = gaussian_rand(prng, bath_duration_mean, bath_duration_std, 0.1)
593
+ int_duration = duration.ceil
594
+ # since we are rounding duration to integer minute, we compensate by scaling flow rate
595
+ flow_rate = bath_flow_rate * duration / int_duration
596
+ start_min = step * 15
597
+ m = 0
598
+ int_duration.times do
599
+ bath_activity_sch[start_min + m] += flow_rate
600
+ m += 1
601
+ if (start_min + m) >= mins_in_year then break end
602
+ end
603
+ step_jump = [step_jump, 1 + (m / 15)].max # jump additional step if the bath occupies multiple 15-min slots
604
+ else
605
+ # fill in the shower
606
+ num_events = sample_activity_cluster_size(prng, cluster_size_prob_map, 'shower')
607
+ start_min = step * 15
608
+ m = 0
609
+ num_events.times do
610
+ duration = sample_event_duration(prng, event_duration_prob_map, 'shower')
611
+ int_duration = duration.ceil
612
+ flow_rate = shower_flow_rate * duration / int_duration
613
+ # since we are rounding duration to integer minute, we compensate by scaling flow rate
614
+ int_duration.times do
615
+ shower_activity_sch[start_min + m] += flow_rate
616
+ m += 1
617
+ if (start_min + m) >= mins_in_year then break end
618
+ end
619
+ shower_between_event_gap.times do
620
+ # skip the gap between events
621
+ m += 1
622
+ if (start_min + m) >= mins_in_year then break end
623
+ end
624
+ if start_min + m >= mins_in_year then break end
625
+ end
626
+ step_jump = [step_jump, 1 + (m / 15)].max
627
+ end
628
+ end
629
+ end
630
+ step += step_jump
631
+ end
632
+
633
+ # Generate minute level schedule for dishwasher and clothes washer
634
+ # 1. Identify the dishwasher/clothes washer time slots from the mkc schedule.
635
+ # 2. Sample for the flow_rate
636
+ # 3. Determine the number of events in the dishwasher/clothes washer cluster
637
+ # (it's typically composed of multiple water draw events)
638
+ # 4. For each event, sample the event duration
639
+ # 5. Fill in the dishwasher/clothes washer time slot using those water draw events
640
+
641
+ dw_flow_rate_mean = schedule_config['dishwasher']['flow_rate_mean']
642
+ dw_flow_rate_std = schedule_config['dishwasher']['flow_rate_std']
643
+ dw_between_event_gap = schedule_config['dishwasher']['between_event_gap']
644
+ dw_activity_sch = [0] * mins_in_year
645
+ m = 0
646
+ dw_flow_rate = gaussian_rand(prng, dw_flow_rate_mean, dw_flow_rate_std, 0)
647
+
648
+ # States are: 'sleeping','shower','laundry','cooking', 'dishwashing', 'absent', 'nothingAtHome'
649
+ # Fill in dw_water draw schedule
650
+ step = 0
651
+ while step < mkc_steps_in_a_year
652
+ dish_state = sum_across_occupants(all_simulated_values, 4, step, max_clip = 1)
653
+ step_jump = 1
654
+ if dish_state > 0
655
+ cluster_size = sample_activity_cluster_size(prng, cluster_size_prob_map, 'dishwasher')
656
+ start_minute = step * 15
657
+ m = 0
658
+ cluster_size.times do
659
+ duration = sample_event_duration(prng, event_duration_prob_map, 'dishwasher')
660
+ int_duration = duration.ceil
661
+ flow_rate = dw_flow_rate * duration / int_duration
662
+ int_duration.times do
663
+ dw_activity_sch[start_minute + m] = flow_rate
664
+ m += 1
665
+ if start_minute + m >= mins_in_year then break end
666
+ end
667
+ if start_minute + m >= mins_in_year then break end
668
+
669
+ dw_between_event_gap.times do
670
+ m += 1
671
+ if start_minute + m >= mins_in_year then break end
672
+ end
673
+ if start_minute + m >= mins_in_year then break end
674
+ end
675
+ step_jump = [step_jump, 1 + (m / 15)].max
676
+ end
677
+ step += step_jump
678
+ end
679
+
680
+ cw_flow_rate_mean = schedule_config['clothes_washer']['flow_rate_mean']
681
+ cw_flow_rate_std = schedule_config['clothes_washer']['flow_rate_std']
682
+ cw_between_event_gap = schedule_config['clothes_washer']['between_event_gap']
683
+ cw_activity_sch = [0] * mins_in_year # this is the clothes_washer water draw schedule
684
+ cw_load_size_probability = schedule_config['clothes_washer']['load_size_probability']
685
+ m = 0
686
+ cw_flow_rate = gaussian_rand(prng, cw_flow_rate_mean, cw_flow_rate_std, 0)
687
+ # States are: 'sleeping','shower','laundry','cooking', 'dishwashing', 'absent', 'nothingAtHome'
688
+ step = 0
689
+ # Fill in clothes washer water draw schedule based on markov-chain state 2 (laundry)
690
+ while step < mkc_steps_in_a_year
691
+ clothes_state = sum_across_occupants(all_simulated_values, 2, step, max_clip = 1)
692
+ step_jump = 1
693
+ if clothes_state > 0
694
+ num_loads = weighted_random(prng, cw_load_size_probability) + 1
695
+ start_minute = step * 15
696
+ m = 0
697
+ num_loads.times do
698
+ cluster_size = sample_activity_cluster_size(prng, cluster_size_prob_map, 'clothes_washer')
699
+ cluster_size.times do
700
+ duration = sample_event_duration(prng, event_duration_prob_map, 'clothes_washer')
701
+ int_duration = duration.ceil
702
+ flow_rate = cw_flow_rate * duration.to_f / int_duration
703
+ int_duration.times do
704
+ cw_activity_sch[start_minute + m] = flow_rate
705
+ m += 1
706
+ if start_minute + m >= mins_in_year then break end
707
+ end
708
+ if start_minute + m >= mins_in_year then break end
709
+
710
+ cw_between_event_gap.times do
711
+ # skip the gap between events
712
+ m += 1
713
+ if start_minute + m >= mins_in_year then break end
714
+ end
715
+ if start_minute + m >= mins_in_year then break end
716
+ end
717
+ end
718
+ if start_minute + m >= mins_in_year then break end
719
+
720
+ step_jump = [step_jump, 1 + (m / 15)].max
721
+ end
722
+ step += step_jump
723
+ end
724
+
725
+ # States are: 'sleeping', 'shower', 'laundry', 'cooking', 'dishwashing', 'absent', 'nothingAtHome'
726
+ # Fill in dishwasher and clothes_washer power draw schedule based on markov-chain
727
+ # This follows similar pattern as filling in water draw events, except we use different set of probability
728
+ # distribution csv files for power level and duration of each event. And there is only one event per mkc slot.
729
+ dw_power_sch = [0] * mins_in_year
730
+ step = 0
731
+ last_state = 0
732
+ while step < mkc_steps_in_a_year
733
+ dish_state = sum_across_occupants(all_simulated_values, 4, step, max_clip = 1)
734
+ step_jump = 1
735
+ if (dish_state > 0) && (last_state == 0) # last_state == 0 prevents consecutive dishwasher power without gap
736
+ duration_15min, avg_power = sample_appliance_duration_power(prng, appliance_power_dist_map, 'dishwasher')
737
+ duration = [duration_15min * 15, mins_in_year - step * 15].min
738
+ dw_power_sch.fill(avg_power, step * 15, duration)
739
+ step_jump = duration_15min
740
+ end
741
+ last_state = dish_state
742
+ step += step_jump
743
+ end
744
+
745
+ # Fill in cw and clothes dryer power schedule
746
+ # States are: 'sleeping', 'shower', 'laundry', 'cooking', 'dishwashing', 'absent', 'nothingAtHome'
747
+ cw_power_sch = [0] * mins_in_year
748
+ cd_power_sch = [0] * mins_in_year
749
+ step = 0
750
+ last_state = 0
751
+ while step < mkc_steps_in_a_year
752
+ clothes_state = sum_across_occupants(all_simulated_values, 2, step, max_clip = 1)
753
+ step_jump = 1
754
+ if (clothes_state > 0) && (last_state == 0) # last_state == 0 prevents consecutive washer power without gap
755
+ cw_duration_15min, cw_avg_power = sample_appliance_duration_power(prng, appliance_power_dist_map, 'clothes_washer')
756
+ cd_duration_15min, cd_avg_power = sample_appliance_duration_power(prng, appliance_power_dist_map, 'clothes_dryer')
757
+ cw_duration = [cw_duration_15min * 15, mins_in_year - step * 15].min
758
+ cw_power_sch.fill(cw_avg_power, step * 15, cw_duration)
759
+ cd_start_time = (step * 15 + cw_duration).to_i # clothes dryer starts immediately after washer ends\
760
+ cd_duration = [cd_duration_15min * 15, mins_in_year - cd_start_time].min # cd_duration would be negative if cd_start_time > mins_in_year, and no filling would occur
761
+ cd_power_sch = cd_power_sch.fill(cd_avg_power, cd_start_time, cd_duration)
762
+ step_jump = cw_duration_15min + cd_duration_15min
763
+ end
764
+ last_state = clothes_state
765
+ step += step_jump
766
+ end
767
+
768
+ # Fill in cooking power schedule
769
+ # States are: 'sleeping','shower','laundry','cooking', 'dishwashing', 'absent', 'nothingAtHome'
770
+ cooking_power_sch = [0] * mins_in_year
771
+ step = 0
772
+ last_state = 0
773
+ while step < mkc_steps_in_a_year
774
+ cooking_state = sum_across_occupants(all_simulated_values, 3, step, max_clip = 1)
775
+ step_jump = 1
776
+ if (cooking_state > 0) && (last_state == 0) # last_state == 0 prevents consecutive cooking power without gap
777
+ duration_15min, avg_power = sample_appliance_duration_power(prng, appliance_power_dist_map, 'cooking')
778
+ duration = [duration_15min * 15, mins_in_year - step * 15].min
779
+ cooking_power_sch.fill(avg_power, step * 15, duration)
780
+ step_jump = duration_15min
781
+ end
782
+ last_state = cooking_state
783
+ step += step_jump
784
+ end
785
+ offset_range = 30
786
+ random_offset = (prng.rand * 2 * offset_range).to_i - offset_range
787
+ sink_activity_sch = sink_activity_sch.rotate(-4 * 60 + random_offset) # 4 am shifting
788
+ sink_activity_sch = aggregate_array(sink_activity_sch, @minutes_per_step)
789
+ @schedules['sinks'] = sink_activity_sch.map { |flow| flow / Constants.PeakFlowRate }
790
+
791
+ random_offset = (prng.rand * 2 * offset_range).to_i - offset_range
792
+ dw_activity_sch = dw_activity_sch.rotate(random_offset)
793
+ dw_activity_sch = aggregate_array(dw_activity_sch, @minutes_per_step)
794
+ @schedules['dishwasher'] = dw_activity_sch.map { |flow| flow / Constants.PeakFlowRate }
795
+
796
+ random_offset = (prng.rand * 2 * offset_range).to_i - offset_range
797
+ cw_activity_sch = cw_activity_sch.rotate(random_offset)
798
+ cw_activity_sch = aggregate_array(cw_activity_sch, @minutes_per_step)
799
+ @schedules['clothes_washer'] = cw_activity_sch.map { |flow| flow / Constants.PeakFlowRate }
800
+
801
+ random_offset = (prng.rand * 2 * offset_range).to_i - offset_range
802
+ shower_activity_sch = shower_activity_sch.rotate(random_offset)
803
+ shower_activity_sch = aggregate_array(shower_activity_sch, @minutes_per_step)
804
+ @schedules['showers'] = shower_activity_sch.map { |flow| flow / Constants.PeakFlowRate }
805
+
806
+ random_offset = (prng.rand * 2 * offset_range).to_i - offset_range
807
+ bath_activity_sch = bath_activity_sch.rotate(random_offset)
808
+ bath_activity_sch = aggregate_array(bath_activity_sch, @minutes_per_step)
809
+ @schedules['baths'] = bath_activity_sch.map { |flow| flow / Constants.PeakFlowRate }
810
+
811
+ random_offset = (prng.rand * 2 * offset_range).to_i - offset_range
812
+ cooking_power_sch = cooking_power_sch.rotate(random_offset)
813
+ cooking_power_sch = aggregate_array(cooking_power_sch, @minutes_per_step)
814
+ @schedules['cooking_range'] = cooking_power_sch.map { |power| power / Constants.PeakPower }
815
+
816
+ random_offset = (prng.rand * 2 * offset_range).to_i - offset_range
817
+ cw_power_sch = cw_power_sch.rotate(random_offset)
818
+ cw_power_sch = aggregate_array(cw_power_sch, @minutes_per_step)
819
+ @schedules['clothes_washer_power'] = cw_power_sch.map { |power| power / Constants.PeakPower }
820
+
821
+ random_offset = (prng.rand * 2 * offset_range).to_i - offset_range
822
+ cd_power_sch = cd_power_sch.rotate(random_offset)
823
+ cd_power_sch = aggregate_array(cd_power_sch, @minutes_per_step)
824
+ @schedules['clothes_dryer'] = cd_power_sch.map { |power| power / Constants.PeakPower }
825
+ @schedules['clothes_dryer_exhaust'] = @schedules['clothes_dryer']
826
+
827
+ random_offset = (prng.rand * 2 * offset_range).to_i - offset_range
828
+ dw_power_sch = dw_power_sch.rotate(random_offset)
829
+ dw_power_sch = aggregate_array(dw_power_sch, @minutes_per_step)
830
+ @schedules['dishwasher_power'] = dw_power_sch.map { |power| power / Constants.PeakPower }
831
+
832
+ @schedules['occupants'] = away_schedule.map { |i| 1.0 - i }
833
+
834
+ @schedules['fixtures'] = [@schedules['showers'], @schedules['sinks'], @schedules['baths']].transpose.map { |flow| flow.reduce(:+) }
835
+
836
+ return true
837
+ end
838
+
839
+ def set_vacancy(args:,
840
+ sim_year:)
841
+ if args[:schedules_vacancy_begin_month].is_initialized && args[:schedules_vacancy_begin_day_of_month].is_initialized && args[:schedules_vacancy_end_month].is_initialized && args[:schedules_vacancy_end_day_of_month].is_initialized
842
+ begin
843
+ vacancy_start_date = Time.new(sim_year, args[:schedules_vacancy_begin_month].get, args[:schedules_vacancy_begin_day_of_month].get)
844
+ vacancy_end_date = Time.new(sim_year, args[:schedules_vacancy_end_month].get, args[:schedules_vacancy_end_day_of_month].get, 24)
845
+
846
+ sec_per_step = @minutes_per_step * 60.0
847
+ ts = Time.new(sim_year, 'Jan', 1)
848
+ @schedules['vacancy'].each_with_index do |step, i|
849
+ if vacancy_start_date <= ts && ts <= vacancy_end_date # in the vacancy period
850
+ @schedules['vacancy'][i] = 1.0
851
+ end
852
+ ts += sec_per_step
853
+ end
854
+
855
+ @runner.registerInfo("Set vacancy period from #{vacancy_start_date} to #{vacancy_end_date}.")
856
+ rescue
857
+ @runner.registerError('Invalid vacancy date(s) specified.')
858
+ end
859
+ else
860
+ @runner.registerInfo('No vacancy period set.')
861
+ end
862
+ return true
863
+ end
864
+
865
+ def aggregate_array(array, group_size)
866
+ new_array_size = array.size / group_size
867
+ new_array = [0] * new_array_size
868
+ new_array_size.times do |j|
869
+ new_array[j] = array[(j * group_size)...(j + 1) * group_size].reduce(0, :+)
870
+ end
871
+ return new_array
872
+ end
873
+
874
+ def read_appliance_power_dist(resources_path:)
875
+ activity_names = ['clothes_washer', 'dishwasher', 'clothes_dryer', 'cooking']
876
+ power_dist_map = {}
877
+ activity_names.each do |activity|
878
+ duration_file = resources_path + "/schedules_#{activity}_power_duration_dist.csv"
879
+ consumption_file = resources_path + "/schedules_#{activity}_power_consumption_dist.csv"
880
+ duration_vals = CSV.read(duration_file)
881
+ consumption_vals = CSV.read(consumption_file)
882
+ duration_vals = duration_vals.map { |a| a.map { |i| i.to_i } }
883
+ consumption_vals = consumption_vals.map { |a| a[0].to_f }
884
+ power_dist_map[activity] = [duration_vals, consumption_vals]
885
+ end
886
+ return power_dist_map
887
+ end
888
+
889
+ def sample_appliance_duration_power(prng, power_dist_map, appliance_name)
890
+ # returns number number of 15-min interval the appliance runs, and the average 15-min power
891
+ duration_vals, consumption_vals = power_dist_map[appliance_name]
892
+ if @consumption_row.nil?
893
+ # initialize and pick the consumption and duration row only the first time
894
+ # checking only consumption_row is sufficient because duration_row always go side by side with consumption row
895
+ @consumption_row = {}
896
+ @duration_row = {}
897
+ end
898
+ if !@consumption_row.has_key?(appliance_name)
899
+ @consumption_row[appliance_name] = (prng.rand * consumption_vals.size).to_i
900
+ @duration_row[appliance_name] = (prng.rand * duration_vals.size).to_i
901
+ end
902
+ power = consumption_vals[@consumption_row[appliance_name]]
903
+ duration = duration_vals[@duration_row[appliance_name]].sample
904
+ return [duration, power]
905
+ end
906
+
907
+ def read_activity_cluster_size_probs(resources_path:)
908
+ activity_names = ['clothes_washer', 'dishwasher', 'shower']
909
+ cluster_size_prob_map = {}
910
+ activity_names.each do |activity|
911
+ cluster_size_file = resources_path + "/schedules_#{activity}_cluster_size_probability.csv"
912
+ cluster_size_probabilities = CSV.read(cluster_size_file)
913
+ cluster_size_probabilities = cluster_size_probabilities.map { |entry| entry[0].to_f }
914
+ cluster_size_prob_map[activity] = cluster_size_probabilities
915
+ end
916
+ return cluster_size_prob_map
917
+ end
918
+
919
+ def read_event_duration_probs(resources_path:)
920
+ activity_names = ['clothes_washer', 'dishwasher', 'shower']
921
+ event_duration_probabilites_map = {}
922
+ activity_names.each do |activity|
923
+ duration_file = resources_path + "/schedules_#{activity}_event_duration_probability.csv"
924
+ duration_probabilities = CSV.read(duration_file)
925
+ durations = duration_probabilities.map { |entry| entry[0].to_f / 60 } # convert to minute
926
+ probabilities = duration_probabilities.map { |entry| entry[1].to_f }
927
+ event_duration_probabilites_map[activity] = [durations, probabilities]
928
+ end
929
+ return event_duration_probabilites_map
930
+ end
931
+
932
+ def read_activity_duration_prob(resources_path:)
933
+ cluster_types = ['0', '1', '2', '3']
934
+ day_types = ['weekday', 'weekend']
935
+ time_of_days = ['morning', 'midday', 'evening']
936
+ activity_names = ['shower', 'cooking', 'dishwashing', 'laundry']
937
+ activity_duration_prob_map = {}
938
+ cluster_types.each do |cluster_type|
939
+ day_types.each do |day_type|
940
+ time_of_days.each do |time_of_day|
941
+ activity_names.each do |activity_name|
942
+ duration_file = resources_path + "/schedules_#{day_type}_duration_probability_cluster_#{cluster_type}_#{activity_name}_#{time_of_day}_duration_probability.csv"
943
+ duration_probabilities = CSV.read(duration_file)
944
+ durations = duration_probabilities.map { |entry| entry[0].to_i }
945
+ probabilities = duration_probabilities.map { |entry| entry[1].to_f }
946
+ activity_duration_prob_map["#{cluster_type}_#{activity_name}_#{day_type}_#{time_of_day}"] = [durations, probabilities]
947
+ end
948
+ end
949
+ end
950
+ end
951
+ return activity_duration_prob_map
952
+ end
953
+
954
+ def sample_activity_cluster_size(prng, cluster_size_prob_map, activity_type_name)
955
+ cluster_size_probabilities = cluster_size_prob_map[activity_type_name]
956
+ return weighted_random(prng, cluster_size_probabilities) + 1
957
+ end
958
+
959
+ def sample_event_duration(prng, duration_probabilites_map, event_type)
960
+ durations = duration_probabilites_map[event_type][0]
961
+ probabilities = duration_probabilites_map[event_type][1]
962
+ return durations[weighted_random(prng, probabilities)]
963
+ end
964
+
965
+ def sample_activity_duration(prng, activity_duration_prob_map, occ_type_id, activity, day_type, hour)
966
+ # States are: 'sleeping', 'shower', 'laundry', 'cooking', 'dishwashing', 'absent', 'nothingAtHome'
967
+ if hour < 8
968
+ time_of_day = 'morning'
969
+ elsif hour < 16
970
+ time_of_day = 'midday'
971
+ else
972
+ time_of_day = 'evening'
973
+ end
974
+
975
+ if activity == 1
976
+ activity_name = 'shower'
977
+ elsif activity == 2
978
+ activity_name = 'laundry'
979
+ elsif activity == 3
980
+ activity_name = 'cooking'
981
+ elsif activity == 4
982
+ activity_name = 'dishwashing'
983
+ else
984
+ return 1 # all other activity will span only one mkc step
985
+ end
986
+ durations = activity_duration_prob_map["#{occ_type_id}_#{activity_name}_#{day_type}_#{time_of_day}"][0]
987
+ probabilities = activity_duration_prob_map["#{occ_type_id}_#{activity_name}_#{day_type}_#{time_of_day}"][1]
988
+ return durations[weighted_random(prng, probabilities)]
989
+ end
990
+
991
+ def export(schedules_path:)
992
+ CSV.open(schedules_path, 'w') do |csv|
993
+ csv << @schedules.keys
994
+ rows = @schedules.values.transpose
995
+ rows.each do |row|
996
+ csv << row.map { |x| '%.3g' % x }
997
+ end
998
+ end
999
+ return true
1000
+ end
1001
+
1002
+ def gaussian_rand(prng, mean, std, min = nil, max = nil)
1003
+ t = 2 * Math::PI * prng.rand
1004
+ r = Math.sqrt(-2 * Math.log(1 - prng.rand))
1005
+ scale = std * r
1006
+ x = mean + scale * Math.cos(t)
1007
+ if (not min.nil?) && (x < min) then x = min end
1008
+ if (not max.nil?) && (x > max) then x = max end
1009
+ # y = mean + scale * Math.sin(t)
1010
+ return x
1011
+ end
1012
+
1013
+ def sum_across_occupants(all_simulated_values, activity_index, time_index, max_clip = nil)
1014
+ sum = 0
1015
+ all_simulated_values.size.times do |i|
1016
+ sum += all_simulated_values[i][time_index, activity_index]
1017
+ end
1018
+ if (not max_clip.nil?) && (sum > max_clip)
1019
+ sum = max_clip
1020
+ end
1021
+ return sum
1022
+ end
1023
+
1024
+ def normalize(arr)
1025
+ m = arr.max
1026
+ arr = arr.map { |a| a / m }
1027
+ return arr
1028
+ end
1029
+
1030
+ def scale_lighting_by_occupancy(sch, minute, active_occupant_percentage)
1031
+ day_start = minute / 1440
1032
+ day_sch = sch[day_start * 24, 24]
1033
+ current_val = sch[minute / 60]
1034
+ return day_sch.min + (current_val - day_sch.min) * active_occupant_percentage
1035
+ end
1036
+
1037
+ def get_value_from_daily_sch(daily_sch, month, is_weekday, minute, active_occupant_percentage)
1038
+ is_weekday ? sch = daily_sch['weekday_sch'] : sch = daily_sch['weekend_sch']
1039
+ full_occupancy_current_val = sch[((minute % 1440) / 60).to_i].to_f * daily_sch['monthly_multiplier'][month - 1].to_f
1040
+ return sch.min + (full_occupancy_current_val - sch.min) * active_occupant_percentage
1041
+ end
1042
+
1043
+ def weighted_random(prng, weights)
1044
+ n = prng.rand
1045
+ cum_weights = 0
1046
+ weights.each_with_index do |w, index|
1047
+ cum_weights += w
1048
+ if n <= cum_weights
1049
+ return index
1050
+ end
1051
+ end
1052
+ return weights.size - 1 # If the prob weight don't sum to n, return last index
1053
+ end
1054
+
1055
+ def get_holiday_lighting_sch(model, runner, holiday_sch)
1056
+ holiday_start_day = 332 # November 27
1057
+ holiday_end_day = 6 # Jan 6
1058
+ @model.getYearDescription.isLeapYear ? total_days_in_year = 366 : total_days_in_year = 365
1059
+ sch = [0] * 24 * total_days_in_year
1060
+ final_days = total_days_in_year - holiday_start_day + 1
1061
+ beginning_days = holiday_end_day
1062
+ sch[0...holiday_end_day * 24] = holiday_sch * beginning_days
1063
+ sch[(holiday_start_day - 1) * 24..-1] = holiday_sch * final_days
1064
+ m = sch.max
1065
+ sch = sch.map { |s| s / m }
1066
+ return sch
1067
+ end
1068
+ end