openstudio-standards 0.8.2 → 0.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
- data/data/standards/openstudio_standards_duplicates_log.csv +7962 -0
- data/lib/openstudio-standards/btap/costing/README.md +502 -0
- data/lib/openstudio-standards/btap/costing/btap_costing.rb +473 -0
- data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
- data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
- data/lib/openstudio-standards/btap/costing/common_paths.rb +78 -0
- data/lib/openstudio-standards/btap/costing/common_resources/ConstructionProperties.csv +52 -0
- data/lib/openstudio-standards/btap/costing/common_resources/Constructions.csv +37 -0
- data/lib/openstudio-standards/btap/costing/common_resources/construction_sets.csv +1270 -0
- data/lib/openstudio-standards/btap/costing/common_resources/constructions_glazing.csv +61 -0
- data/lib/openstudio-standards/btap/costing/common_resources/constructions_opaque.csv +2256 -0
- data/lib/openstudio-standards/btap/costing/common_resources/costs.csv +1904 -0
- data/lib/openstudio-standards/btap/costing/common_resources/costs_local_factors.csv +2315 -0
- data/lib/openstudio-standards/btap/costing/common_resources/hvac_vent_ahu.csv +925 -0
- data/lib/openstudio-standards/btap/costing/common_resources/lighting.csv +364 -0
- data/lib/openstudio-standards/btap/costing/common_resources/lighting_sets.csv +2667 -0
- data/lib/openstudio-standards/btap/costing/common_resources/locations.csv +75 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_glazing.csv +35 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_hvac.csv +1699 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_lighting.csv +267 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_opaque.csv +164 -0
- data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
- data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
- data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +177 -0
- data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +353 -0
- data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
- data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
- data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
- data/lib/openstudio-standards/btap/costing/envelope_costing.rb +284 -0
- data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
- data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +155 -0
- data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
- data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
- data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
- data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
- data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
- data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
- data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
- data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
- data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
- data/lib/openstudio-standards/btap/costing/test_list.txt +17 -0
- data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +26 -0
- data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
- data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
- data/lib/openstudio-standards/constructions/modify.rb +2 -1
- data/lib/openstudio-standards/refrigeration/create_case.rb +58 -21
- data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +4 -2
- data/lib/openstudio-standards/refrigeration/create_walkin.rb +57 -22
- data/lib/openstudio-standards/refrigeration/data/refrigerated_cases.csv +31 -31
- data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +76 -76
- data/lib/openstudio-standards/service_water_heating/create_typical.rb +10 -10
- data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +10 -0
- data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +16 -3
- data/lib/openstudio-standards/service_water_heating/data/convert_data.rb +9 -9
- data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.csv +49 -49
- data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.json +159 -159
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +7 -18
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +10 -20
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +6 -15
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +5 -6
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +93 -43
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +5 -5
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +135 -37
- data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.Model.rb +48 -13
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.computer_room_acs.json +302 -140
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +648 -326
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +371 -90
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +66 -22
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.computer_room_acs.json +302 -140
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +1012 -296
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +443 -79
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +66 -22
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.computer_room_acs.json +302 -140
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +672 -306
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +354 -74
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +72 -24
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +302 -140
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +8 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +930 -604
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +415 -111
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +72 -24
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.computer_room_acs.json +602 -140
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps.json +1005 -333
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +642 -88
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_heaters.json +78 -26
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.computer_room_acs.json +722 -140
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps.json +1741 -426
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +1108 -111
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_heaters.json +186 -62
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +62 -232
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -3
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +7 -18
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +9 -7
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +154 -69
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps_heating.json +72 -72
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +382 -295
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +6 -1
- data/lib/openstudio-standards/standards/deer/data/deer.schedules.json +62 -232
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +2 -27
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps.json +16 -0
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps_heating.json +6 -0
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +46 -20
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +635 -248
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +43 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps.json +16 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +6 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
- data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +16 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +43 -14
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +214 -25
- data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps.json +16 -0
- data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +8 -0
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
- data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +15 -6
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
- data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
- data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +20 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +10 -0
- data/lib/openstudio-standards/standards/necb/README.md +343 -0
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +190 -28
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +14 -5
- data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
- data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
- data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
- data/lib/openstudio-standards/utilities/logging.rb +18 -14
- data/lib/openstudio-standards/utilities/simulation.rb +3 -2
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/modify.rb +2 -2
- data/lib/openstudio-standards.rb +12 -0
- metadata +56 -3
data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb
CHANGED
@@ -52,7 +52,10 @@ class BTAPPRE1980
|
|
52
52
|
air_loop = add_system_3_and_8_airloop(heating_coil_type,
|
53
53
|
model,
|
54
54
|
system_data,
|
55
|
-
determine_control_zone(zones)
|
55
|
+
determine_control_zone(zones),
|
56
|
+
necb_reference_hp: necb_reference_hp,
|
57
|
+
necb_reference_hp_supp_fuel: necb_reference_hp_supp_fuel,
|
58
|
+
hw_loop: hw_loop)
|
56
59
|
# Add Zone equipment
|
57
60
|
zones.each do |zone| # Zone sizing temperature
|
58
61
|
sizing_zone = zone.sizingZone
|
@@ -60,8 +63,13 @@ class BTAPPRE1980
|
|
60
63
|
sizing_zone.setZoneCoolingDesignSupplyAirTemperatureDifference(system_data[:ZoneCoolingDesignSupplyAirTemperatureDifference])
|
61
64
|
sizing_zone.setZoneHeatingDesignSupplyAirTemperatureInputMethod(system_data[:ZoneHeatingDesignSupplyAirTemperatureInputMethod])
|
62
65
|
sizing_zone.setZoneHeatingDesignSupplyAirTemperatureDifference(system_data[:ZoneHeatingDesignSupplyAirTemperatureDifference])
|
63
|
-
|
64
|
-
|
66
|
+
if necb_reference_hp
|
67
|
+
sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneDXCoolingSizingFactor])
|
68
|
+
sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneDXHeatingSizingFactor])
|
69
|
+
else
|
70
|
+
sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
|
71
|
+
sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
|
72
|
+
end
|
65
73
|
add_sys3_and_8_zone_equip(air_loop,
|
66
74
|
baseboard_type,
|
67
75
|
hw_loop,
|
@@ -70,7 +78,7 @@ class BTAPPRE1980
|
|
70
78
|
end
|
71
79
|
else
|
72
80
|
zones.each do |zone|
|
73
|
-
air_loop = add_system_3_and_8_airloop(heating_coil_type, model, system_data, zone)
|
81
|
+
air_loop = add_system_3_and_8_airloop(heating_coil_type, model, system_data, zone, necb_reference_hp: necb_reference_hp, necb_reference_hp_supp_fuel: necb_reference_hp_supp_fuel, hw_loop: hw_loop)
|
74
82
|
add_sys3_and_8_zone_equip(air_loop,
|
75
83
|
baseboard_type,
|
76
84
|
hw_loop,
|
@@ -83,19 +91,22 @@ class BTAPPRE1980
|
|
83
91
|
sys_name_pars = {}
|
84
92
|
sys_name_pars['sys_hr'] = 'none'
|
85
93
|
sys_name_pars['sys_clg'] = 'dx'
|
94
|
+
sys_name_pars['sys_clg'] = 'ashp' if necb_reference_hp
|
86
95
|
sys_name_pars['sys_htg'] = heating_coil_type
|
96
|
+
sys_name_pars['sys_htg'] = 'ashp>c-g' if necb_reference_hp && (necb_reference_hp_supp_fuel == "NaturalGas" || necb_reference_hp_supp_fuel == "Gas")
|
97
|
+
sys_name_pars['sys_htg'] = 'ashp>c-e' if necb_reference_hp && (necb_reference_hp_supp_fuel == "Electricity" || necb_reference_hp_supp_fuel == "Electric" || necb_reference_hp_supp_fuel == "FuelOilNo2")
|
98
|
+
sys_name_pars['sys_htg'] = 'ashp>c-hw' if necb_reference_hp && (necb_reference_hp_supp_fuel == "Hot Water" || necb_reference_hp_supp_fuel == "HotWater")
|
87
99
|
sys_name_pars['sys_sf'] = 'cv'
|
88
100
|
sys_name_pars['zone_htg'] = baseboard_type
|
89
101
|
sys_name_pars['zone_clg'] = 'none'
|
90
102
|
sys_name_pars['sys_rf'] = 'none'
|
91
|
-
assign_base_sys_name(air_loop,
|
103
|
+
return assign_base_sys_name(air_loop: air_loop,
|
92
104
|
sys_abbr: 'sys_3',
|
93
105
|
sys_oa: 'mixed',
|
94
106
|
sys_name_pars: sys_name_pars)
|
95
|
-
return true
|
96
107
|
end
|
97
108
|
|
98
|
-
def add_system_3_and_8_airloop(heating_coil_type, model, system_data, control_zone)
|
109
|
+
def add_system_3_and_8_airloop(heating_coil_type, model, system_data, control_zone, necb_reference_hp:false, necb_reference_hp_supp_fuel:'DefaultFuel', necb_reference_hp_fancoil: false, hw_loop: nil)
|
99
110
|
# System Type 3: PSZ-AC
|
100
111
|
# This measure creates:
|
101
112
|
# -a constant volume packaged single-zone A/C unit
|
@@ -118,25 +129,43 @@ class BTAPPRE1980
|
|
118
129
|
sizing_zone.setZoneCoolingDesignSupplyAirTemperatureDifference(system_data[:ZoneCoolingDesignSupplyAirTemperatureDifference])
|
119
130
|
sizing_zone.setZoneHeatingDesignSupplyAirTemperatureInputMethod(system_data[:ZoneHeatingDesignSupplyAirTemperatureInputMethod])
|
120
131
|
sizing_zone.setZoneHeatingDesignSupplyAirTemperatureDifference(system_data[:ZoneHeatingDesignSupplyAirTemperatureDifference])
|
121
|
-
|
122
|
-
|
132
|
+
if necb_reference_hp
|
133
|
+
sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneDXCoolingSizingFactor])
|
134
|
+
sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneDXHeatingSizingFactor])
|
135
|
+
else
|
136
|
+
sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
|
137
|
+
sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
|
138
|
+
end
|
123
139
|
|
124
140
|
fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
|
125
141
|
|
142
|
+
# Set up DX coil
|
143
|
+
if necb_reference_hp #NECB curve characteristics
|
144
|
+
clg_coil = add_onespeed_DX_coil(model, always_on)
|
145
|
+
clg_coil.setName('CoilCoolingDXSingleSpeed_ashp')
|
146
|
+
else
|
147
|
+
clg_coil = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model) #sets default OS curve (but will be replaced with NECB curves later)
|
148
|
+
clg_coil.setName('CoilCoolingDXSingleSpeed_dx')
|
149
|
+
end
|
126
150
|
# Create a return fan for BTAPPRE1980 system 3 systems
|
127
151
|
return_fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
|
128
152
|
return_fan.setName('Sys3 Return Fan')
|
129
153
|
return_fan.setEndUseSubcategory('Return_Fan')
|
130
154
|
|
155
|
+
raise("Flag 'necb_reference_hp' is set to true while parameter 'heating_coil_type' is not set to DX") if (necb_reference_hp && (heating_coil_type != 'DX'))
|
131
156
|
case heating_coil_type
|
132
|
-
when 'Electric' # electric coil
|
157
|
+
when 'Electric', 'Electricity', "FuelOilNo2" # electric coil
|
133
158
|
htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
134
|
-
when 'Gas'
|
159
|
+
when 'Gas', 'NaturalGas'
|
135
160
|
htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
|
161
|
+
when 'Hot Water', 'HotWater'
|
162
|
+
htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
|
163
|
+
hw_loop.addDemandBranchForComponent(htg_coil)
|
136
164
|
when 'DX'
|
137
|
-
|
138
|
-
|
165
|
+
#create main DX heating coil
|
166
|
+
htg_coil = add_onespeed_htg_DX_coil(model, always_on)
|
139
167
|
htg_coil.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(system_data[:MinimumOutdoorDryBulbTemperatureforCompressorOperation])
|
168
|
+
htg_coil.setName('CoilHeatingDXSingleSpeed_ashp')
|
140
169
|
sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneDXHeatingSizingFactor])
|
141
170
|
sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneDXCoolingSizingFactor])
|
142
171
|
else
|
@@ -145,9 +174,7 @@ class BTAPPRE1980
|
|
145
174
|
|
146
175
|
# TO DO: other fuel-fired heating coil types? (not available in OpenStudio/E+ - may need to play with efficiency to mimic other fuel types)
|
147
176
|
|
148
|
-
|
149
|
-
clg_coil = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model)
|
150
|
-
clg_coil.setName('CoilCoolingDXSingleSpeed_dx')
|
177
|
+
|
151
178
|
|
152
179
|
# oa_controller
|
153
180
|
oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
|
@@ -163,17 +190,31 @@ class BTAPPRE1980
|
|
163
190
|
# Add the components to the air loop
|
164
191
|
# in order from closest to zone to furthest from zone
|
165
192
|
supply_inlet_node = air_loop.supplyInletNode
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
193
|
+
fan.addToNode(supply_inlet_node)
|
194
|
+
if necb_reference_hp
|
195
|
+
#create supplemental heating coil based on default regional fuel type
|
196
|
+
if necb_reference_hp_supp_fuel == 'DefaultFuel'
|
197
|
+
epw = OpenStudio::EpwFile.new(model.weatherFile.get.path.get)
|
198
|
+
necb_reference_hp_supp_fuel = @standards_data['regional_fuel_use'].detect { |fuel_sources| fuel_sources['state_province_regions'].include?(epw.stateProvinceRegion) }['fueltype_set']
|
199
|
+
end
|
200
|
+
if necb_reference_hp_supp_fuel == 'NaturalGas' || necb_reference_hp_supp_fuel == 'Gas'
|
201
|
+
supplemental_htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
|
202
|
+
elsif necb_reference_hp_supp_fuel == 'Electricity' || necb_reference_hp_supp_fuel == 'Electric' || necb_reference_hp_supp_fuel == 'FuelOilNo2'
|
203
|
+
supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
204
|
+
elsif necb_reference_hp_supp_fuel == 'Hot Water' || necb_reference_hp_supp_fuel == "HotWater"
|
205
|
+
supplemental_htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
|
206
|
+
hw_loop.addDemandBranchForComponent(supplemental_htg_coil)
|
207
|
+
else
|
208
|
+
raise('Invalid fuel type selected for heat pump supplemental coil')
|
209
|
+
end
|
210
|
+
#air_to_air_heatpump.setName("#{control_zone.name} ASHP")
|
211
|
+
#air_to_air_heatpump.setControllingZone(control_zone)
|
212
|
+
#air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
|
213
|
+
#air_to_air_heatpump.addToNode(supply_inlet_node)
|
214
|
+
supplemental_htg_coil.addToNode(supply_inlet_node)
|
176
215
|
end
|
216
|
+
htg_coil.addToNode(supply_inlet_node)
|
217
|
+
clg_coil.addToNode(supply_inlet_node)
|
177
218
|
oa_system.addToNode(supply_inlet_node)
|
178
219
|
|
179
220
|
# Find return air node and add a return air fan to it for BTAPPRE1980 system 3 airloops.
|
@@ -195,8 +236,8 @@ class BTAPPRE1980
|
|
195
236
|
hw_loop, model,
|
196
237
|
zone)
|
197
238
|
always_on = model.alwaysOnDiscreteSchedule
|
239
|
+
add_zone_baseboards(baseboard_type: baseboard_type, hw_loop: hw_loop, model: model, zone: zone)
|
198
240
|
diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
|
199
241
|
air_loop.addBranchForZone(zone, diffuser.to_StraightComponent)
|
200
|
-
add_zone_baseboards(baseboard_type: baseboard_type, hw_loop: hw_loop, model: model, zone: zone)
|
201
242
|
end
|
202
243
|
end
|
@@ -37,6 +37,9 @@ class BTAPPRE1980
|
|
37
37
|
system_data[:ZoneCoolingDesignSupplyAirTemperatureDifference] = 11.0
|
38
38
|
system_data[:ZoneHeatingDesignSupplyAirTemperatureInputMethod] = 'TemperatureDifference'
|
39
39
|
system_data[:ZoneHeatingDesignSupplyAirTemperatureDifference] = 21.0
|
40
|
+
system_data[:ZoneHeatingDesignSupplyAirTemperature] = 43.0
|
41
|
+
system_data[:ZoneDXCoolingSizingFactor] = 1.0
|
42
|
+
system_data[:ZoneDXHeatingSizingFactor] = 1.3
|
40
43
|
system_data[:ZoneCoolingSizingFactor] = 1.1
|
41
44
|
system_data[:ZoneHeatingSizingFactor] = 1.3
|
42
45
|
|
@@ -53,9 +56,7 @@ class BTAPPRE1980
|
|
53
56
|
# NOTE: This is the same as system type 3 (single zone make-up air unit and single zone rooftop unit are both PSZ systems)
|
54
57
|
# SHOULD WE COMBINE sys3 and sys4 into one script?
|
55
58
|
#
|
56
|
-
|
57
|
-
# Todo change this when control zone method is working.
|
58
|
-
control_zone = zones.first
|
59
|
+
control_zone = determine_control_zone(zones)
|
59
60
|
|
60
61
|
always_on = model.alwaysOnDiscreteSchedule
|
61
62
|
|
@@ -73,27 +74,37 @@ class BTAPPRE1980
|
|
73
74
|
sizing_zone.setZoneCoolingDesignSupplyAirTemperatureInputMethod(system_data[:ZoneCoolingDesignSupplyAirTemperatureInputMethod])
|
74
75
|
sizing_zone.setZoneCoolingDesignSupplyAirTemperatureDifference(system_data[:ZoneCoolingDesignSupplyAirTemperatureDifference])
|
75
76
|
sizing_zone.setZoneHeatingDesignSupplyAirTemperatureInputMethod(system_data[:ZoneHeatingDesignSupplyAirTemperatureInputMethod])
|
76
|
-
sizing_zone.
|
77
|
-
|
78
|
-
|
77
|
+
sizing_zone.setZoneCoolingDesignSupplyAirTemperatureDifference(system_data[:ZoneHeatingDesignSupplyAirTemperatureDifference])
|
78
|
+
if necb_reference_hp
|
79
|
+
sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneDXCoolingSizingFactor])
|
80
|
+
sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneDXHeatingSizingFactor])
|
81
|
+
else
|
82
|
+
sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
|
83
|
+
sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
|
84
|
+
end
|
79
85
|
|
80
86
|
fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
|
81
87
|
|
82
|
-
|
83
|
-
|
84
|
-
|
88
|
+
# Set up DX coil with NECB performance curve characteristics;
|
89
|
+
clg_coil = add_onespeed_DX_coil(model, always_on)
|
90
|
+
clg_coil.setName('CoilCoolingDXSingleSpeed_dx')
|
91
|
+
clg_coil.setName('CoilCoolingDXSingleSpeed_ashp') if necb_reference_hp
|
85
92
|
|
86
|
-
if heating_coil_type
|
93
|
+
raise("Flag 'necb_reference_hp' is set to true while parameter 'heating_coil_type' is not set to DX") if (necb_reference_hp && (heating_coil_type != 'DX'))
|
94
|
+
if heating_coil_type == 'Electric' || heating_coil_type == 'FuelOilNo2' # electric coil
|
95
|
+
htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
96
|
+
elsif heating_coil_type == 'Gas'
|
87
97
|
htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
|
98
|
+
elsif heating_coil_type == 'DX'
|
99
|
+
htg_coil = add_onespeed_htg_DX_coil(model, always_on)
|
100
|
+
htg_coil.setName('CoilHeatingDXSingleSpeed_ashp')
|
101
|
+
elsif heating_coil_type == 'Hot Water'
|
102
|
+
htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
|
103
|
+
hw_loop.addDemandBranchForComponent(htg_coil)
|
88
104
|
end
|
89
105
|
|
90
106
|
# TO DO: other fuel-fired heating coil types? (not available in OpenStudio/E+ - may need to play with efficiency to mimic other fuel types)
|
91
107
|
|
92
|
-
# Set up DX coil with NECB performance curve characteristics;
|
93
|
-
|
94
|
-
clg_coil = add_onespeed_DX_coil(model, always_on)
|
95
|
-
clg_coil.setName('CoilCoolingDXSingleSpeed_dx')
|
96
|
-
|
97
108
|
# oa_controller
|
98
109
|
oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
|
99
110
|
oa_controller.autosizeMinimumOutdoorAirFlowRate
|
@@ -109,10 +120,33 @@ class BTAPPRE1980
|
|
109
120
|
# in order from closest to zone to furthest from zone
|
110
121
|
supply_inlet_node = air_loop.supplyInletNode
|
111
122
|
fan.addToNode(supply_inlet_node)
|
123
|
+
if necb_reference_hp
|
124
|
+
#create supplemental heating coil based on default regional fuel type
|
125
|
+
if necb_reference_hp_supp_fuel == 'DefaultFuel'
|
126
|
+
epw = OpenStudio::EpwFile.new(model.weatherFile.get.path.get)
|
127
|
+
necb_reference_hp_supp_fuel = @standards_data['regional_fuel_use'].detect { |fuel_sources| fuel_sources['state_province_regions'].include?(epw.stateProvinceRegion) }['fueltype_set']
|
128
|
+
end
|
129
|
+
if necb_reference_hp_supp_fuel == 'NaturalGas'
|
130
|
+
supplemental_htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
|
131
|
+
elsif necb_reference_hp_supp_fuel == 'Electricity' or necb_reference_hp_supp_fuel == 'FuelOilNo2'
|
132
|
+
supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
133
|
+
elsif necb_reference_hp_supp_fuel == 'Hot Water'
|
134
|
+
supplemental_htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
|
135
|
+
hw_loop.addDemandBranchForComponent(supplemental_htg_coil)
|
136
|
+
else
|
137
|
+
raise('Invalid fuel type selected for heat pump supplemental coil')
|
138
|
+
end
|
139
|
+
supplemental_htg_coil.addToNode(supply_inlet_node)
|
140
|
+
# This method will seem like an error in number of args..but this is due to swig voodoo.
|
141
|
+
#air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAir.new(model, always_on, fan, htg_coil, clg_coil, supplemental_htg_coil)
|
142
|
+
#air_to_air_heatpump.setName("#{control_zone.name} ASHP")
|
143
|
+
#air_to_air_heatpump.setControllingZone(control_zone)
|
144
|
+
#air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
|
145
|
+
#air_to_air_heatpump.addToNode(supply_inlet_node)
|
146
|
+
end
|
112
147
|
htg_coil.addToNode(supply_inlet_node)
|
113
148
|
clg_coil.addToNode(supply_inlet_node)
|
114
149
|
oa_system.addToNode(supply_inlet_node)
|
115
|
-
|
116
150
|
# Add a setpoint manager single zone reheat to control the
|
117
151
|
# supply air temperature based on the needs of this zone
|
118
152
|
setpoint_mgr_single_zone_reheat = OpenStudio::Model::SetpointManagerSingleZoneReheat.new(model)
|
@@ -144,34 +178,39 @@ class BTAPPRE1980
|
|
144
178
|
sizing_zone.setZoneCoolingDesignSupplyAirTemperatureDifference(system_data[:ZoneCoolingDesignSupplyAirTemperatureDifference])
|
145
179
|
sizing_zone.setZoneHeatingDesignSupplyAirTemperatureInputMethod(system_data[:ZoneHeatingDesignSupplyAirTemperatureInputMethod])
|
146
180
|
sizing_zone.setZoneHeatingDesignSupplyAirTemperatureDifference(system_data[:ZoneHeatingDesignSupplyAirTemperatureDifference])
|
147
|
-
|
148
|
-
|
181
|
+
if necb_reference_hp
|
182
|
+
sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneDXCoolingSizingFactor])
|
183
|
+
sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneDXHeatingSizingFactor])
|
184
|
+
else
|
185
|
+
sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
|
186
|
+
sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
|
187
|
+
end
|
149
188
|
# Create a diffuser and attach the zone/diffuser pair to the air loop
|
150
189
|
# diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model,always_on)
|
151
|
-
diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
|
152
|
-
air_loop.addBranchForZone(zone, diffuser.to_StraightComponent)
|
153
190
|
add_zone_baseboards(baseboard_type: baseboard_type,
|
154
191
|
hw_loop: hw_loop,
|
155
192
|
model: model,
|
156
193
|
zone: zone)
|
157
194
|
add_exhaust_fan(zone: zone, model: model, name: exhaust_fan_name)
|
195
|
+
diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
|
196
|
+
air_loop.addBranchForZone(zone, diffuser.to_StraightComponent)
|
158
197
|
end
|
159
|
-
# zone loop
|
160
|
-
|
161
|
-
# Modifying airloop name
|
162
198
|
sys_name_pars = {}
|
163
199
|
sys_name_pars['sys_hr'] = 'none'
|
164
200
|
sys_name_pars['sys_clg'] = 'dx'
|
201
|
+
sys_name_pars['sys_clg'] = 'ashp' if necb_reference_hp
|
165
202
|
sys_name_pars['sys_htg'] = heating_coil_type
|
203
|
+
sys_name_pars['sys_htg'] = 'ashp>c-g' if necb_reference_hp and necb_reference_hp_supp_fuel == "NaturalGas"
|
204
|
+
sys_name_pars['sys_htg'] = 'ashp>c-e' if necb_reference_hp and necb_reference_hp_supp_fuel == "Electricity"
|
205
|
+
sys_name_pars['sys_htg'] = 'ashp>c-hw' if necb_reference_hp and necb_reference_hp_supp_fuel == "Hot Water"
|
166
206
|
sys_name_pars['sys_sf'] = 'cv'
|
167
207
|
sys_name_pars['zone_htg'] = baseboard_type
|
168
208
|
sys_name_pars['zone_clg'] = 'none'
|
169
209
|
sys_name_pars['sys_rf'] = 'none'
|
170
|
-
assign_base_sys_name(air_loop,
|
210
|
+
return assign_base_sys_name(air_loop: air_loop,
|
171
211
|
sys_abbr: 'sys_4',
|
172
212
|
sys_oa: 'mixed',
|
173
213
|
sys_name_pars: sys_name_pars)
|
174
214
|
|
175
|
-
return true
|
176
215
|
end
|
177
216
|
end
|
@@ -131,18 +131,18 @@ class BTAPPRE1980
|
|
131
131
|
reheat_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
132
132
|
end
|
133
133
|
|
134
|
+
# Set zone baseboards
|
135
|
+
add_zone_baseboards(model: model,
|
136
|
+
zone: zone,
|
137
|
+
baseboard_type: baseboard_type,
|
138
|
+
hw_loop: hw_loop)
|
139
|
+
|
134
140
|
vav_terminal = OpenStudio::Model::AirTerminalSingleDuctVAVReheat.new(model, always_on, reheat_coil)
|
135
141
|
air_loop.addBranchForZone(zone, vav_terminal.to_StraightComponent)
|
136
142
|
# NECB2011 minimum zone airflow setting
|
137
143
|
vav_terminal.setFixedMinimumAirFlowRate(system_data[:ZoneVAVMinFlowFactorPerFloorArea] * zone.floorArea)
|
138
144
|
vav_terminal.setMaximumReheatAirTemperature(system_data[:ZoneVAVMaxReheatTemp])
|
139
145
|
vav_terminal.setDamperHeatingAction(system_data[:ZoneVAVDamperAction])
|
140
|
-
|
141
|
-
# Set zone baseboards
|
142
|
-
add_zone_baseboards(model: model,
|
143
|
-
zone: zone,
|
144
|
-
baseboard_type: baseboard_type,
|
145
|
-
hw_loop: hw_loop)
|
146
146
|
end
|
147
147
|
|
148
148
|
# Modifying airloop name.
|
@@ -154,17 +154,15 @@ class BTAPPRE1980
|
|
154
154
|
sys_name_pars['zone_htg'] = baseboard_type
|
155
155
|
sys_name_pars['zone_clg'] = 'none'
|
156
156
|
sys_name_pars['sys_rf'] = 'vv'
|
157
|
-
assign_base_sys_name(air_loop,
|
157
|
+
assign_base_sys_name(air_loop: air_loop,
|
158
158
|
sys_abbr: 'sys_6',
|
159
159
|
sys_oa: 'mixed',
|
160
160
|
sys_name_pars: sys_name_pars)
|
161
161
|
end
|
162
|
+
# next story
|
162
163
|
end
|
163
|
-
# next story
|
164
|
-
|
165
164
|
# for debugging
|
166
165
|
# puts "end add_sys6_multi_zone_built_up_with_baseboard_heating"
|
167
|
-
|
168
166
|
return true
|
169
167
|
end
|
170
168
|
|
@@ -227,7 +225,6 @@ class BTAPPRE1980
|
|
227
225
|
# Make a Packaged VAV w/ PFP Boxes for each story of the building
|
228
226
|
model.getBuildingStorys.sort.each do |story|
|
229
227
|
unless (OpenstudioStandards::Geometry.building_story_get_thermal_zones(story) & zones).empty?
|
230
|
-
|
231
228
|
air_loop = common_air_loop(model: model, system_data: system_data)
|
232
229
|
air_loop.setName(system_data[:name])
|
233
230
|
air_loop_sizing = air_loop.sizingSystem
|
@@ -323,12 +320,10 @@ class BTAPPRE1980
|
|
323
320
|
hw_loop: hw_loop)
|
324
321
|
end
|
325
322
|
end
|
323
|
+
# next story
|
326
324
|
end
|
327
|
-
# next story
|
328
|
-
|
329
325
|
# for debugging
|
330
326
|
# puts "end add_sys6_multi_zone_built_up_with_baseboard_heating"
|
331
|
-
|
332
327
|
return true
|
333
328
|
end
|
334
329
|
end
|
@@ -296,6 +296,7 @@ class ECMS
|
|
296
296
|
outdoor_vrf_unit.setMinimumHeatPumpPartLoadRatio(0.5)
|
297
297
|
outdoor_vrf_unit.setCondenserType(condenser_type)
|
298
298
|
outdoor_vrf_unit.setCrankcaseHeaterPowerperCompressor(1.0e-6)
|
299
|
+
outdoor_vrf_unit.setMinimumOutdoorTemperatureinCoolingMode(-10)
|
299
300
|
heat_defrost_eir_ft = nil
|
300
301
|
if ecm_name
|
301
302
|
search_criteria = {}
|
@@ -516,7 +517,7 @@ class ECMS
|
|
516
517
|
|
517
518
|
# Create one hot-water loop for hot-water baseboards if required
|
518
519
|
hw_loop = nil
|
519
|
-
hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water'
|
520
|
+
hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water' || standard.fuel_type_set.force_airloop_hot_water
|
520
521
|
|
521
522
|
# Update system zones map if needed
|
522
523
|
system_zones_map = update_system_zones_map_keys(system_zones_map,'sys_1')
|
@@ -537,6 +538,7 @@ class ECMS
|
|
537
538
|
system_doas_flags: system_doas_flags)
|
538
539
|
sys_supp_htg_eqpt_type = 'coil_electric'
|
539
540
|
sys_supp_htg_eqpt_type = 'coil_gas' if heating_fuel == 'NaturalGas'
|
541
|
+
sys_supp_htg_eqpt_type = 'coil_hw' if standard.fuel_type_set.force_airloop_hot_water
|
540
542
|
airloop,clg_dx_coil,htg_dx_coil,return_fan = add_air_system(model: model,
|
541
543
|
zones: zones,
|
542
544
|
sys_abbr: sys_info['sys_abbr'],
|
@@ -547,7 +549,8 @@ class ECMS
|
|
547
549
|
sys_clg_eqpt_type: air_sys_eqpt_type,
|
548
550
|
sys_supp_fan_type: sys_info['sys_supp_fan_type'],
|
549
551
|
sys_ret_fan_type: sys_info['sys_ret_fan_type'],
|
550
|
-
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type']
|
552
|
+
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'],
|
553
|
+
hw_loop: hw_loop)
|
551
554
|
# Appy performance curves
|
552
555
|
if air_sys_eqpt_type == 'ccashp'
|
553
556
|
eqpt_name = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit RTU'
|
@@ -740,7 +743,7 @@ class ECMS
|
|
740
743
|
|
741
744
|
# =============================================================================================================================
|
742
745
|
# create air system heating equipment
|
743
|
-
def create_air_sys_htg_eqpt(model, htg_eqpt_type)
|
746
|
+
def create_air_sys_htg_eqpt(model, htg_eqpt_type, hw_loop = nil)
|
744
747
|
always_on = model.alwaysOnDiscreteSchedule
|
745
748
|
htg_eqpt = nil
|
746
749
|
case htg_eqpt_type.downcase
|
@@ -769,6 +772,7 @@ class ECMS
|
|
769
772
|
when 'coil_hw'
|
770
773
|
htg_eqpt = OpenStudio::Model::CoilHeatingWater.new(model)
|
771
774
|
htg_eqpt.setName('CoilHeatingWater')
|
775
|
+
hw_loop.addDemandBranchForComponent(htg_eqpt) unless hw_loop.nil?
|
772
776
|
end
|
773
777
|
|
774
778
|
return htg_eqpt
|
@@ -786,7 +790,8 @@ class ECMS
|
|
786
790
|
sys_clg_eqpt_type:,
|
787
791
|
sys_supp_fan_type:,
|
788
792
|
sys_ret_fan_type:,
|
789
|
-
sys_setpoint_mgr_type
|
793
|
+
sys_setpoint_mgr_type:,
|
794
|
+
hw_loop: nil)
|
790
795
|
|
791
796
|
# create all the needed components and the air loop
|
792
797
|
airloop = create_airloop(model, sys_vent_type)
|
@@ -796,7 +801,7 @@ class ECMS
|
|
796
801
|
return_fan = create_air_sys_fan(model, sys_ret_fan_type)
|
797
802
|
return_fan.setName('Return Fan') if return_fan
|
798
803
|
htg_eqpt = create_air_sys_htg_eqpt(model, sys_htg_eqpt_type)
|
799
|
-
supp_htg_eqpt = create_air_sys_htg_eqpt(model, sys_supp_htg_eqpt_type)
|
804
|
+
supp_htg_eqpt = create_air_sys_htg_eqpt(model, sys_supp_htg_eqpt_type, hw_loop)
|
800
805
|
clg_eqpt = create_air_sys_clg_eqpt(model, sys_clg_eqpt_type)
|
801
806
|
# add components to the air loop
|
802
807
|
clg_eqpt.addToNode(airloop.supplyOutletNode) if clg_eqpt
|
@@ -823,7 +828,10 @@ class ECMS
|
|
823
828
|
sys_name_pars['sys_rf'] = 'none'
|
824
829
|
sys_name_pars['sys_rf'] = 'cv' if sys_ret_fan_type == 'constant_volume'
|
825
830
|
sys_name_pars['sys_rf'] = 'vv' if sys_ret_fan_type == 'variable_volume'
|
826
|
-
assign_base_sys_name(
|
831
|
+
assign_base_sys_name( air_loop: airloop,
|
832
|
+
sys_abbr: sys_abbr,
|
833
|
+
sys_oa: sys_vent_type,
|
834
|
+
sys_name_pars: sys_name_pars)
|
827
835
|
return airloop, clg_eqpt, htg_eqpt, return_fan
|
828
836
|
end
|
829
837
|
|
@@ -1236,11 +1244,12 @@ class ECMS
|
|
1236
1244
|
|
1237
1245
|
# Create one hot-water loop for hot-water baseboards if required
|
1238
1246
|
hw_loop = nil
|
1239
|
-
hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water'
|
1247
|
+
hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water' || standard.fuel_type_set.force_airloop_hot_water
|
1240
1248
|
|
1241
1249
|
# Set supplemental heating for air loop
|
1242
1250
|
sys_supp_htg_eqpt_type = 'coil_electric'
|
1243
1251
|
sys_supp_htg_eqpt_type = 'coil_gas' if heating_fuel == 'NaturalGas'
|
1252
|
+
sys_supp_htg_eqpt_type = 'coil_hw' if standard.fuel_type_set.force_airloop_hot_water
|
1244
1253
|
systems = []
|
1245
1254
|
system_zones_map.sort.each do |sys_name, zones|
|
1246
1255
|
sys_info = air_sys_comps_assumptions(sys_name: sys_name,
|
@@ -1258,7 +1267,8 @@ class ECMS
|
|
1258
1267
|
sys_clg_eqpt_type: 'ccashp',
|
1259
1268
|
sys_supp_fan_type: sys_info['sys_supp_fan_type'],
|
1260
1269
|
sys_ret_fan_type: sys_info['sys_ret_fan_type'],
|
1261
|
-
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type']
|
1270
|
+
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'],
|
1271
|
+
hw_loop: hw_loop
|
1262
1272
|
)
|
1263
1273
|
# Apply performance curves
|
1264
1274
|
eqpt_name = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit RTU'
|
@@ -1417,12 +1427,16 @@ class ECMS
|
|
1417
1427
|
ecm_system_zones_map_option:,
|
1418
1428
|
standard:)
|
1419
1429
|
hw_loop = nil
|
1430
|
+
if standard.fuel_type_set.force_airloop_hot_water || standard.fuel_type_set.necb_reference_hp_supp_fuel.to_s.downcase == "hot water"
|
1431
|
+
hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set)
|
1432
|
+
end
|
1420
1433
|
|
1421
1434
|
# Get the heating fuel type from the system fuels object defined by the standards object
|
1422
1435
|
heating_fuel = standard.fuel_type_set.ecm_fueltype
|
1423
1436
|
# Set supplemental heaing for airloop
|
1424
1437
|
sys_supp_htg_eqpt_type = 'coil_electric'
|
1425
1438
|
sys_supp_htg_eqpt_type = 'coil_gas' if heating_fuel == 'NaturalGas'
|
1439
|
+
sys_supp_htg_eqpt_type = 'coil_hw' if standard.fuel_type_set.force_airloop_hot_water || standard.fuel_type_set.necb_reference_hp_supp_fuel.to_s.downcase == "hot water"
|
1426
1440
|
# Update system zones map if needed
|
1427
1441
|
system_zones_map = update_system_zones_map_keys(system_zones_map,'sys_1')
|
1428
1442
|
system_zones_map = update_system_zones_map(model,system_zones_map,ecm_system_zones_map_option,'sys_1') if ecm_system_zones_map_option != 'NECB_Default'
|
@@ -1445,7 +1459,8 @@ class ECMS
|
|
1445
1459
|
sys_clg_eqpt_type: 'ashp',
|
1446
1460
|
sys_supp_fan_type: sys_info['sys_supp_fan_type'],
|
1447
1461
|
sys_ret_fan_type: sys_info['sys_ret_fan_type'],
|
1448
|
-
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type']
|
1462
|
+
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'],
|
1463
|
+
hw_loop: hw_loop)
|
1449
1464
|
eqpt_name = 'HS11_PTHP'
|
1450
1465
|
coil_cooling_dx_single_speed_apply_curves(clg_dx_coil,eqpt_name)
|
1451
1466
|
coil_heating_dx_single_speed_apply_curves(htg_dx_coil,eqpt_name)
|
@@ -1488,7 +1503,7 @@ class ECMS
|
|
1488
1503
|
# =============================================================================================================================
|
1489
1504
|
# Apply efficiencies and performance curves for ECM "hs11_ashp_pthp"
|
1490
1505
|
def apply_efficiency_ecm_hs11_ashp_pthp(model,standard)
|
1491
|
-
fr_backup_coil_cap_as_dx_coil_cap = 0.5 # fraction of electric backup heating coil capacity assigned to dx heating coil
|
1506
|
+
fr_backup_coil_cap_as_dx_coil_cap = 0.5 # fraction of electric or hot-water backup heating coil capacity assigned to dx heating coil
|
1492
1507
|
apply_efficiency_ecm_hs12_ashp_baseboard(model,standard)
|
1493
1508
|
pthp_eqpt_name = 'HS11_PTHP'
|
1494
1509
|
model.getAirLoopHVACs.sort.each do |isys|
|
@@ -1568,11 +1583,12 @@ class ECMS
|
|
1568
1583
|
|
1569
1584
|
# Create one hot-water loop for hot-water baseboards if required
|
1570
1585
|
hw_loop = nil
|
1571
|
-
hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water'
|
1586
|
+
hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water' || standard.fuel_type_set.force_airloop_hot_water
|
1572
1587
|
|
1573
1588
|
# Set supplemental heating fuel for airloop
|
1574
1589
|
sys_supp_htg_eqpt_type = 'coil_electric'
|
1575
1590
|
sys_supp_htg_eqpt_type = 'coil_gas' if heating_fuel == 'NaturalGas'
|
1591
|
+
sys_supp_htg_eqpt_type = 'coil_hw' if standard.fuel_type_set.force_airloop_hot_water
|
1576
1592
|
systems = []
|
1577
1593
|
system_zones_map.sort.each do |sys_name, zones|
|
1578
1594
|
sys_info = air_sys_comps_assumptions(sys_name: sys_name,
|
@@ -1589,7 +1605,8 @@ class ECMS
|
|
1589
1605
|
sys_clg_eqpt_type: 'ashp',
|
1590
1606
|
sys_supp_fan_type: sys_info['sys_supp_fan_type'],
|
1591
1607
|
sys_ret_fan_type: sys_info['sys_ret_fan_type'],
|
1592
|
-
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type']
|
1608
|
+
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'],
|
1609
|
+
hw_loop: hw_loop)
|
1593
1610
|
eqpt_name = 'NECB2015_ASHP'
|
1594
1611
|
coil_cooling_dx_single_speed_apply_curves(clg_dx_coil,eqpt_name)
|
1595
1612
|
coil_heating_dx_single_speed_apply_curves(htg_dx_coil,eqpt_name)
|
@@ -1814,7 +1831,7 @@ class ECMS
|
|
1814
1831
|
loop_heat_rej_eqpt_type: 'none',
|
1815
1832
|
loop_pump_type: 'variable_speed',
|
1816
1833
|
loop_spm_type: 'Scheduled',
|
1817
|
-
loop_setpoint:
|
1834
|
+
loop_setpoint: 60.0,
|
1818
1835
|
loop_temp_diff: 5.0)
|
1819
1836
|
model.getCoilHeatingWaters.sort.each {|coil| hw_loop.addDemandBranchForComponent(coil)}
|
1820
1837
|
hcapf_curve_name = "HEATPUMP_WATERTOWATER_HCAPF"
|
@@ -2124,7 +2141,7 @@ class ECMS
|
|
2124
2141
|
loop_heat_rej_eqpt_type: 'none',
|
2125
2142
|
loop_pump_type: 'variable_speed',
|
2126
2143
|
loop_spm_type: 'Scheduled',
|
2127
|
-
loop_setpoint:
|
2144
|
+
loop_setpoint: 60.0,
|
2128
2145
|
loop_temp_diff: 5.0)
|
2129
2146
|
# set additional parameters for heating heat pump
|
2130
2147
|
hw_loop_htg_eqpt.setCondenserType('AirSoure')
|
@@ -2152,7 +2169,7 @@ class ECMS
|
|
2152
2169
|
hw_boilers.reverse().each {|boiler| boiler.addToNode(hw_loop_htg_eqpt_outlet_node)}
|
2153
2170
|
# add setpoint manager at the exit of the heat pump heating comp
|
2154
2171
|
sch = OpenStudio::Model::ScheduleConstant.new(model)
|
2155
|
-
sch.setValue(
|
2172
|
+
sch.setValue(60.0)
|
2156
2173
|
spm = OpenStudio::Model::SetpointManagerScheduled.new(model,sch)
|
2157
2174
|
spm.setName("HeatPumpHtgSetpointManager")
|
2158
2175
|
spm.addToNode(hw_loop_htg_eqpt_outlet_node)
|
@@ -2333,6 +2350,7 @@ class ECMS
|
|
2333
2350
|
# Set supplemental heaing for airloop
|
2334
2351
|
sys_supp_htg_eqpt_type = 'coil_electric'
|
2335
2352
|
sys_supp_htg_eqpt_type = 'coil_gas' if heating_fuel == 'NaturalGas'
|
2353
|
+
sys_supp_htg_eqpt_type = 'coil_hw' if standard.fuel_type_set.force_airloop_hot_water
|
2336
2354
|
# call ecm HS15 to add the air loop
|
2337
2355
|
add_ecm_hs15_cawhp_fancoils(model: model,
|
2338
2356
|
system_zones_map: system_zones_map,
|
@@ -3864,15 +3882,23 @@ class ECMS
|
|
3864
3882
|
boiler_fueltype = standard.fuel_type_set.boiler_fueltype
|
3865
3883
|
backup_boiler_fueltype = standard.fuel_type_set.backup_boiler_fueltype
|
3866
3884
|
baseboard_type = standard.fuel_type_set.baseboard_type
|
3885
|
+
heating_coil_type_sys2 = standard.fuel_type_set.heating_coil_type_sys2
|
3886
|
+
heating_coil_type_sys3 = standard.fuel_type_set.heating_coil_type_sys3
|
3887
|
+
heating_coil_type_sys4 = standard.fuel_type_set.heating_coil_type_sys4
|
3888
|
+
heating_coil_type_sys6 = standard.fuel_type_set.heating_coil_type_sys6
|
3867
3889
|
mau_heating_coil_type = 'none'
|
3868
3890
|
|
3869
3891
|
# Create the hot water loop if necessary.
|
3870
3892
|
hw_loop = standard.create_hw_loop_if_required(
|
3871
|
-
baseboard_type,
|
3872
|
-
boiler_fueltype,
|
3873
|
-
backup_boiler_fueltype,
|
3874
|
-
mau_heating_coil_type,
|
3875
|
-
model
|
3893
|
+
baseboard_type: baseboard_type,
|
3894
|
+
boiler_fueltype: boiler_fueltype,
|
3895
|
+
backup_boiler_fueltype: backup_boiler_fueltype,
|
3896
|
+
mau_heating_coil_type: mau_heating_coil_type,
|
3897
|
+
model: model,
|
3898
|
+
heating_coil_type_sys2: heating_coil_type_sys2,
|
3899
|
+
heating_coil_type_sys3: heating_coil_type_sys3,
|
3900
|
+
heating_coil_type_sys4: heating_coil_type_sys4,
|
3901
|
+
heating_coil_type_sys6: heating_coil_type_sys6
|
3876
3902
|
)
|
3877
3903
|
|
3878
3904
|
# Add baseboard heaters to each heated zone.
|