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.
- checksums.yaml +4 -4
- data/.github/pull_request_template.md +2 -2
- data/CHANGELOG.md +15 -0
- data/Gemfile +11 -11
- data/README.md +1 -1
- data/example_files/Gemfile +3 -3
- data/example_files/mappers/Baseline.rb +233 -204
- data/example_files/mappers/HighEfficiency.rb +41 -8
- data/example_files/measures/BuildResidentialModel/measure.rb +25 -5
- data/example_files/resources/hpxml-measures/.gitignore +1 -2
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +364 -694
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +1506 -889
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +12 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/location.rb +1 -1
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules.rb +1068 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_README.md +45 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_dryer_power_consumption_dist.csv +95 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_dryer_power_duration_dist.csv +95 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_washer_cluster_size_probability.csv +6 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_washer_event_duration_probability.csv +44 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_washer_power_consumption_dist.csv +93 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_clothes_washer_power_duration_dist.csv +93 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.yml +61 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_cooking_power_consumption_dist.csv +63 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_cooking_power_duration_dist.csv +63 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_dishwasher_cluster_size_probability.csv +8 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_dishwasher_event_duration_probability.csv +192 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_dishwasher_power_consumption_dist.csv +56 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_dishwasher_power_duration_dist.csv +56 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_shower_cluster_size_probability.csv +4 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_shower_event_duration_probability.csv +1531 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_cooking_evening_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_cooking_midday_duration_probability.csv +20 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_cooking_morning_duration_probability.csv +19 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +11 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +11 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_laundry_evening_duration_probability.csv +12 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_laundry_midday_duration_probability.csv +19 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_laundry_morning_duration_probability.csv +19 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_shower_evening_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_shower_midday_duration_probability.csv +12 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_0_shower_morning_duration_probability.csv +11 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_cooking_evening_duration_probability.csv +8 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_cooking_midday_duration_probability.csv +21 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_cooking_morning_duration_probability.csv +26 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +6 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +14 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +15 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_laundry_evening_duration_probability.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_laundry_midday_duration_probability.csv +19 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_laundry_morning_duration_probability.csv +25 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_shower_evening_duration_probability.csv +9 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_shower_midday_duration_probability.csv +11 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_1_shower_morning_duration_probability.csv +14 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_cooking_evening_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_cooking_midday_duration_probability.csv +16 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_cooking_morning_duration_probability.csv +15 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +5 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +5 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_laundry_evening_duration_probability.csv +13 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_laundry_midday_duration_probability.csv +12 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_laundry_morning_duration_probability.csv +13 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_shower_evening_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_shower_midday_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_2_shower_morning_duration_probability.csv +14 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_cooking_evening_duration_probability.csv +9 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_cooking_midday_duration_probability.csv +18 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_cooking_morning_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +8 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +8 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_laundry_evening_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_laundry_midday_duration_probability.csv +17 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_laundry_morning_duration_probability.csv +14 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_shower_evening_duration_probability.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_shower_midday_duration_probability.csv +12 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_duration_probability_cluster_3_shower_morning_duration_probability.csv +14 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_initial_prob_cluster_0.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_initial_prob_cluster_1.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_initial_prob_cluster_2.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_initial_prob_cluster_3.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_transition_prob_cluster_0.csv +665 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_transition_prob_cluster_1.csv +665 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_transition_prob_cluster_2.csv +665 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_mkv_chain_transition_prob_cluster_3.csv +665 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_cooking_evening_duration_probability.csv +12 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_cooking_midday_duration_probability.csv +22 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_cooking_morning_duration_probability.csv +18 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +9 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_laundry_evening_duration_probability.csv +11 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_laundry_midday_duration_probability.csv +22 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_laundry_morning_duration_probability.csv +18 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_shower_evening_duration_probability.csv +8 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_shower_midday_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_0_shower_morning_duration_probability.csv +15 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_cooking_evening_duration_probability.csv +14 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_cooking_midday_duration_probability.csv +23 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_cooking_morning_duration_probability.csv +24 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +12 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +14 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +15 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_laundry_evening_duration_probability.csv +12 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_laundry_midday_duration_probability.csv +21 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_laundry_morning_duration_probability.csv +22 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_shower_evening_duration_probability.csv +9 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_shower_midday_duration_probability.csv +15 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_1_shower_morning_duration_probability.csv +14 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_cooking_evening_duration_probability.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_cooking_midday_duration_probability.csv +21 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_cooking_morning_duration_probability.csv +20 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +6 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_laundry_evening_duration_probability.csv +9 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_laundry_midday_duration_probability.csv +16 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_laundry_morning_duration_probability.csv +16 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_shower_evening_duration_probability.csv +9 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_shower_midday_duration_probability.csv +11 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_2_shower_morning_duration_probability.csv +14 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_cooking_evening_duration_probability.csv +8 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_cooking_midday_duration_probability.csv +24 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_cooking_morning_duration_probability.csv +34 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +6 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +12 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +13 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_laundry_evening_duration_probability.csv +10 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_laundry_midday_duration_probability.csv +24 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_laundry_morning_duration_probability.csv +29 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_shower_evening_duration_probability.csv +8 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_shower_midday_duration_probability.csv +14 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_duration_probability_cluster_3_shower_morning_duration_probability.csv +16 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_initial_prob_cluster_0.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_initial_prob_cluster_1.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_initial_prob_cluster_2.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_initial_prob_cluster_3.csv +7 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_transition_prob_cluster_0.csv +665 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_transition_prob_cluster_1.csv +665 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_transition_prob_cluster_2.csv +665 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_mkv_chain_transition_prob_cluster_3.csv +665 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-50percent.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-uef.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-location-epw-filepath-AMY-2012.osw → base-location-AMY-2012.osw} +12 -58
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-multifamily.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +363 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-location-epw-filepath.osw → base-schedules-user-specified.osw} +13 -58
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +364 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-single-family-attached.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +53 -2
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-shared-water-heater.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-mechvent-shared-preconditioning.osw +373 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-mechvent-shared.osw +367 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-shared.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-vacancy-6-months.osw +367 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +11 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/stochastic.csv +8761 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/user-specified.csv +8761 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +65 -61
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +104 -113
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +9 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +62 -10
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +4 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +8 -3
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +127 -52
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +21 -3
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +67 -45
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +17 -11
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +54 -26
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +3 -7
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +85 -20
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +500 -21
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +5 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +14 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +44 -5
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +2 -2
- data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +15 -5
- data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.xml +10 -10
- data/example_files/resources/hpxml-measures/SimulationOutputReport/resources/constants.rb +2 -0
- data/example_files/resources/hpxml-measures/SimulationOutputReport/tests/output_report_test.rb +29 -3
- data/example_files/resources/hpxml-measures/docs/source/build_residential_hpxml.rst +21 -7
- data/example_files/resources/hpxml-measures/docs/source/hpxml_to_openstudio.rst +36 -8
- data/example_files/resources/hpxml-measures/docs/source/simulation_output_report.rst +5 -4
- data/example_files/resources/hpxml-measures/tasks.rb +101 -175
- data/example_files/resources/hpxml-measures/weather/US_CO_Boulder_AMY_2012-cache.csv +1 -1
- data/example_files/resources/hpxml-measures/weather/US_CO_Boulder_AMY_2012.epw +1 -1
- data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-50percent.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +6 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-laundry-room.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater-recirc.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-uef.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-attached-multifamily.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-common-surfaces.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-other-heated-space.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-other-housing-unit.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-other-multifamily-buffer-space.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-other-non-freezing-space.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-interior-shading.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-flowrate.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ideal-air.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple2.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-baseboard.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil-ducted.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-water-loop-heat-pump.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-cooling-tower-water-loop-heat-pump.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-baseboard.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-ducted.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-eae.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-water-loop-heat-pump.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-baseboard.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil-ducted.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-water-loop-heat-pump.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-cooling-tower-only-water-loop-heat-pump.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-ground-loop-ground-to-air-heat-pump.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-detailed.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-location-epw-filepath-AMY-2012.xml → base-location-AMY-2012.xml} +8 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared-multiple.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared-preconditioning.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shelter-coefficient.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +5 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-shared.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +565 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +565 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-location-epw-filepath.xml → base-simcontrol-calendar-year-custom.xml} +5 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-autosize.xml +7 -1
- 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
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize.xml +7 -1
- 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
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize.xml +7 -1
- 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
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-boiler-elec-only-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-central-ac-1-speed-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-only-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-1-speed-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-2-speed-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-var-speed-autosize.xml +7 -1
- 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
- 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
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-dual-fuel-mini-split-heat-pump-ducted-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-elec-resistance-only-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-evap-cooler-furnace-gas-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-floor-furnace-propane-only-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-furnace-elec-only-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-2-speed-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-var-speed-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-room-ac-autosize.xml +7 -1
- 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
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-air-conditioner-only-ducted-autosize.xml +7 -1
- 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
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-cooling-only-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-heating-only-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-room-ac-only-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-stove-oil-only-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/hvac_autosizing/base-hvac-wall-furnace-elec-only-autosize.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/appliances-location-unconditioned-space.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/coal-for-non-boiler-heating.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/{invalid-wmo.xml → invalid-calendar-year.xml} +8 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +4 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-interior-shading.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-surface.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/slab-zero-exposed-perimeter.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +7 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +3 -1
- data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +4 -2
- data/lib/uo_cli.rb +40 -22
- data/lib/uo_cli/version.rb +1 -1
- data/uo_cli.gemspec +3 -4
- metadata +149 -27
- 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
|
@@ -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
|