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