openstudio-standards 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,81 +1,12 @@
1
1
 
2
2
  # Reopen the OpenStudio class to add methods to apply standards to this object
3
3
  class OpenStudio::Model::CoilCoolingDXSingleSpeed
4
- # Finds the search criteria
5
- #
6
- # @param template [String] valid choices: 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
7
- # @return [hash] has for search criteria to be used for find object
8
- def find_search_criteria(template)
9
- # Define the criteria to find the chiller properties
10
- # in the hvac standards data set.
11
- search_criteria = {}
12
- search_criteria['template'] = template
13
- cooling_type = condenserType
14
- search_criteria['cooling_type'] = cooling_type
15
-
16
- # Determine the heating type if unitary or zone hvac
17
- heat_pump = false
18
- heating_type = nil
19
- if airLoopHVAC.empty?
20
- if containingHVACComponent.is_initialized
21
- containing_comp = containingHVACComponent.get
22
- if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.is_initialized
23
- heat_pump = true
24
- heating_type = 'Electric Resistance or None'
25
- end # TODO: Add other unitary systems
26
- elsif containingZoneHVACComponent.is_initialized
27
- containing_comp = containingZoneHVACComponent.get
28
- if containing_comp.to_ZoneHVACPackagedTerminalAirConditioner.is_initialized
29
- htg_coil = containing_comp.to_ZoneHVACPackagedTerminalAirConditioner.get.heatingCoil
30
- if htg_coil.to_CoilHeatingElectric.is_initialized
31
- heating_type = 'Electric Resistance or None'
32
- elsif htg_coil.to_CoilHeatingWater.is_initialized || htg_coil.to_CoilHeatingGas.is_initialized
33
- heating_type = 'All Other'
34
- end
35
- end # TODO: Add other zone hvac systems
36
- end
37
- end
38
-
39
- # Determine the heating type if on an airloop
40
- if airLoopHVAC.is_initialized
41
- air_loop = airLoopHVAC.get
42
- heating_type = if !air_loop.supplyComponents('OS:Coil:Heating:Electric'.to_IddObjectType).empty?
43
- 'Electric Resistance or None'
44
- elsif !air_loop.supplyComponents('OS:Coil:Heating:Gas'.to_IddObjectType).empty?
45
- 'All Other'
46
- elsif !air_loop.supplyComponents('OS:Coil:Heating:Water'.to_IddObjectType).empty?
47
- 'All Other'
48
- elsif !air_loop.supplyComponents('OS:Coil:Heating:DX:SingleSpeed'.to_IddObjectType).empty?
49
- 'All Other'
50
- elsif !air_loop.supplyComponents('OS:Coil:Heating:Gas:MultiStage'.to_IddObjectType).empty?
51
- 'All Other'
52
- elsif !air_loop.supplyComponents('OS:Coil:Heating:Desuperheater'.to_IddObjectType).empty?
53
- 'All Other'
54
- elsif !air_loop.supplyComponents('OS:Coil:Heating:WaterToAirHeatPump:EquationFit'.to_IddObjectType).empty?
55
- 'All Other'
56
- else
57
- 'Electric Resistance or None'
58
- end
59
- end
60
-
61
- # Add the heating type to the search criteria
62
- unless heating_type.nil?
63
- search_criteria['heating_type'] = heating_type
64
- end
65
-
66
- # TODO: Standards - add split system vs single package to model
67
- # For now, assume single package
68
- subcategory = 'Single Package'
69
- search_criteria['subcategory'] = subcategory
70
-
71
- return search_criteria
72
- end
4
+ include CoilDX
73
5
 
74
- # Finds capacity in Btu/hr
6
+ # Finds capacity in W
75
7
  #
76
- # @return [Double] capacity in Btu/hr to be used for find object
8
+ # @return [Double] capacity in W to be used for find object
77
9
  def find_capacity
78
- # Get the coil capacity
79
10
  capacity_w = nil
80
11
  if ratedTotalCoolingCapacity.is_initialized
81
12
  capacity_w = ratedTotalCoolingCapacity.get
@@ -83,66 +14,133 @@ class OpenStudio::Model::CoilCoolingDXSingleSpeed
83
14
  capacity_w = autosizedRatedTotalCoolingCapacity.get
84
15
  else
85
16
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{name} capacity is not available, cannot apply efficiency standard.")
86
- return false
17
+ return 0.0
87
18
  end
88
19
 
89
- # Convert capacity to Btu/hr
90
- capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
20
+ # If it's a PTAC or PTHP System, we need to divide the capacity by the potential zone multiplier
21
+ # because the COP is dependent on capacity, and the capacity should be the capacity of a single zone, not all the zones
22
+ if ['PTAC', 'PTHP'].include?(subcategory)
23
+ mult = 1
24
+ comp = containingZoneHVACComponent
25
+ if comp.is_initialized
26
+ if comp.get.thermalZone.is_initialized
27
+ mult = comp.get.thermalZone.get.multiplier
28
+ if mult > 1
29
+ total_cap = capacity_w
30
+ capacity_w /= mult
31
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{name}, total capacity of #{OpenStudio.convert(total_cap, 'W', 'kBtu/hr').get.round(2)}kBTU/hr was divided by the zone multiplier of #{mult} to give #{capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get.round(2)}kBTU/hr.")
32
+ end
33
+ end
34
+ end
35
+ end
91
36
 
92
- return capacity_btu_per_hr
37
+ return capacity_w
93
38
  end
94
39
 
95
40
  # Finds lookup object in standards and return efficiency
96
41
  #
97
42
  # @param template [String] valid choices: 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
98
- # @param standards [Hash] the OpenStudio_Standards spreadsheet in hash format
43
+ # @param rename [Bool] if true, object will be renamed to include capacity and efficiency level
99
44
  # @return [Double] full load efficiency (COP)
100
- def standard_minimum_cop(template, standards)
101
- # find ac properties
45
+ def standard_minimum_cop(template, rename=false)
102
46
  search_criteria = find_search_criteria(template)
103
47
  cooling_type = search_criteria['cooling_type']
104
48
  heating_type = search_criteria['heating_type']
105
- subcategory = search_criteria['subcategory']
106
- capacity_btu_per_hr = find_capacity
107
- capacity_kbtu_per_hr = OpenStudio.convert(capacity_btu_per_hr, 'Btu/hr', 'kBtu/hr').get
108
-
109
- ac_props = model.find_object(standards['unitary_acs'], search_criteria, capacity_btu_per_hr, Date.today)
49
+ sub_category = search_criteria['subcategory']
50
+ capacity_w = find_capacity
51
+ capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
52
+ capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
110
53
 
111
- # Get the minimum efficiency standards
112
- cop = nil
54
+ # Look up the efficiency characteristics
55
+ # Lookup efficiencies depending on whether it is a unitary AC or a heat pump
56
+ ac_props = nil
57
+ ac_props = if heat_pump?
58
+ model.find_object($os_standards['heat_pumps'], search_criteria, capacity_btu_per_hr, Date.today)
59
+ else
60
+ model.find_object($os_standards['unitary_acs'], search_criteria, capacity_btu_per_hr, Date.today)
61
+ end
113
62
 
114
63
  # Check to make sure properties were found
115
64
  if ac_props.nil?
116
65
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{name}, cannot find efficiency info, cannot apply efficiency standard.")
117
- return cop # value of nil
66
+ successfully_set_all_properties = false
67
+ return successfully_set_all_properties
68
+ end
69
+
70
+ # Get the minimum efficiency standards
71
+ cop = nil
72
+
73
+ # If PTHP, use equations
74
+ if sub_category == 'PTHP'
75
+ pthp_eer_coeff_1 = ac_props['pthp_eer_coefficient_1']
76
+ pthp_eer_coeff_2 = ac_props['pthp_eer_coefficient_2']
77
+ # TABLE 6.8.1D
78
+ # EER = pthp_eer_coeff_1 - (pthp_eer_coeff_2 * Cap / 1000)
79
+ # Note c: Cap means the rated cooling capacity of the product in Btu/h.
80
+ # If the unit's capacity is less than 7000 Btu/h, use 7000 Btu/h in the calculation.
81
+ # If the unit's capacity is greater than 15,000 Btu/h, use 15,000 Btu/h in the calculation.
82
+ eer_calc_cap_btu_per_hr = capacity_btu_per_hr
83
+ eer_calc_cap_btu_per_hr = 7000 if capacity_btu_per_hr < 7000
84
+ eer_calc_cap_btu_per_hr = 15_000 if capacity_btu_per_hr > 15_000
85
+ pthp_eer = pthp_eer_coeff_1 - (pthp_eer_coeff_2 * eer_calc_cap_btu_per_hr / 1000.0)
86
+ cop = eer_to_cop(pthp_eer, OpenStudio.convert(capacity_btu_per_hr, 'Btu/hr', 'W').get)
87
+ new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{pthp_eer.round(1)}EER"
88
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{pthp_eer.round(2)}")
89
+ end
90
+
91
+ # If PTAC, use equations
92
+ if sub_category == 'PTAC'
93
+ ptac_eer_coeff_1 = ac_props['ptac_eer_coefficient_1']
94
+ ptac_eer_coeff_2 = ac_props['ptac_eer_coefficient_2']
95
+ # TABLE 6.8.1D
96
+ # EER = ptac_eer_coeff_1 - (ptac_eer_coeff_2 * Cap / 1000)
97
+ # Note c: Cap means the rated cooling capacity of the product in Btu/h.
98
+ # If the unit's capacity is less than 7000 Btu/h, use 7000 Btu/h in the calculation.
99
+ # If the unit's capacity is greater than 15,000 Btu/h, use 15,000 Btu/h in the calculation.
100
+ eer_calc_cap_btu_per_hr = capacity_btu_per_hr
101
+ eer_calc_cap_btu_per_hr = 7000 if capacity_btu_per_hr < 7000
102
+ eer_calc_cap_btu_per_hr = 15_000 if capacity_btu_per_hr > 15_000
103
+ ptac_eer = ptac_eer_coeff_1 - (ptac_eer_coeff_2 * eer_calc_cap_btu_per_hr / 1000.0)
104
+ cop = eer_to_cop(ptac_eer, OpenStudio.convert(capacity_btu_per_hr, 'Btu/hr', 'W').get)
105
+ new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{ptac_eer.round(1)}EER"
106
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{ptac_eer}")
118
107
  end
119
108
 
120
109
  # If specified as SEER
121
110
  unless ac_props['minimum_seasonal_energy_efficiency_ratio'].nil?
122
111
  min_seer = ac_props['minimum_seasonal_energy_efficiency_ratio']
123
112
  cop = seer_to_cop_cooling_no_fan(min_seer)
124
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
113
+ new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
114
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
125
115
  end
126
116
 
127
117
  # If specified as EER
128
118
  unless ac_props['minimum_energy_efficiency_ratio'].nil?
129
119
  min_eer = ac_props['minimum_energy_efficiency_ratio']
130
120
  cop = eer_to_cop(min_eer, OpenStudio.convert(capacity_kbtu_per_hr, 'kBtu/hr', 'W').get)
131
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
121
+ new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
122
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
132
123
  end
133
124
 
134
125
  # if specified as SEER (heat pump)
135
126
  unless ac_props['minimum_seasonal_efficiency'].nil?
136
127
  min_seer = ac_props['minimum_seasonal_efficiency']
137
128
  cop = seer_to_cop_cooling_no_fan(min_seer)
138
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
129
+ new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
130
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
139
131
  end
140
132
 
141
133
  # If specified as EER (heat pump)
142
134
  unless ac_props['minimum_full_load_efficiency'].nil?
143
135
  min_eer = ac_props['minimum_full_load_efficiency']
144
136
  cop = eer_to_cop(min_eer, OpenStudio.convert(capacity_kbtu_per_hr, 'kBtu/hr', 'W').get)
145
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
137
+ new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
138
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
139
+ end
140
+
141
+ # Rename
142
+ if rename
143
+ setName(new_comp_name)
146
144
  end
147
145
 
148
146
  return cop
@@ -156,126 +154,27 @@ class OpenStudio::Model::CoilCoolingDXSingleSpeed
156
154
  def apply_efficiency_and_curves(template, sql_db_vars_map)
157
155
  successfully_set_all_properties = true
158
156
 
159
- unitary_acs = $os_standards['unitary_acs']
160
- heat_pumps = $os_standards['heat_pumps']
161
-
162
- # Define the criteria to find the chiller properties
163
- # in the hvac standards data set.
164
- search_criteria = {}
165
- search_criteria['template'] = template
166
- cooling_type = condenserType
167
- search_criteria['cooling_type'] = cooling_type
168
-
169
- # TODO: Standards - add split system vs single package to model
170
- # For now, assume single package as default
171
- subcategory = 'Single Package'
172
-
173
- # Determine the heating type if unitary or zone hvac
174
- heat_pump = false
175
- heating_type = nil
176
- if airLoopHVAC.empty?
177
- if containingHVACComponent.is_initialized
178
- containing_comp = containingHVACComponent.get
179
- if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.is_initialized
180
- heat_pump = true
181
- heating_type = 'Electric Resistance or None'
182
- end # TODO: Add other unitary systems
183
- elsif containingZoneHVACComponent.is_initialized
184
- containing_comp = containingZoneHVACComponent.get
185
- # PTAC
186
- if containing_comp.to_ZoneHVACPackagedTerminalAirConditioner.is_initialized
187
- subcategory = 'PTAC'
188
- htg_coil = containing_comp.to_ZoneHVACPackagedTerminalAirConditioner.get.heatingCoil
189
- if htg_coil.to_CoilHeatingElectric.is_initialized
190
- heating_type = 'Electric Resistance or None'
191
- elsif htg_coil.to_CoilHeatingWater.is_initialized || htg_coil.to_CoilHeatingGas.is_initialized
192
- heating_type = 'All Other'
193
- end
194
- # PTHP
195
- elsif containing_comp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
196
- subcategory = 'PTHP'
197
- heating_type = 'Electric Resistance or None'
198
- heat_pump = true
199
- end # TODO: Add other zone hvac systems
200
-
201
- end
202
- end
203
-
204
- # Determine the heating type if on an airloop
205
- if airLoopHVAC.is_initialized
206
- air_loop = airLoopHVAC.get
207
- heating_type = if !air_loop.supplyComponents('OS:Coil:Heating:Electric'.to_IddObjectType).empty?
208
- 'Electric Resistance or None'
209
- elsif !air_loop.supplyComponents('OS:Coil:Heating:Gas'.to_IddObjectType).empty?
210
- 'All Other'
211
- elsif !air_loop.supplyComponents('OS:Coil:Heating:Water'.to_IddObjectType).empty?
212
- 'All Other'
213
- elsif !air_loop.supplyComponents('OS:Coil:Heating:DX:SingleSpeed'.to_IddObjectType).empty?
214
- 'All Other'
215
- elsif !air_loop.supplyComponents('OS:Coil:Heating:Gas:MultiStage'.to_IddObjectType).empty?
216
- 'All Other'
217
- elsif !air_loop.supplyComponents('OS:Coil:Heating:Desuperheater'.to_IddObjectType).empty?
218
- 'All Other'
219
- elsif !air_loop.supplyComponents('OS:Coil:Heating:WaterToAirHeatPump:EquationFit'.to_IddObjectType).empty?
220
- 'All Other'
221
- else
222
- 'Electric Resistance or None'
223
- end
224
- end
225
-
226
- # Add the heating type to the search criteria
227
- unless heating_type.nil?
228
- search_criteria['heating_type'] = heating_type
229
- end
230
-
231
- search_criteria['subcategory'] = subcategory
232
-
233
- # Get the coil capacity
234
- capacity_w = nil
235
- if ratedTotalCoolingCapacity.is_initialized
236
- capacity_w = ratedTotalCoolingCapacity.get
237
- elsif autosizedRatedTotalCoolingCapacity.is_initialized
238
- capacity_w = autosizedRatedTotalCoolingCapacity.get
239
- else
240
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{name} capacity is not available, cannot apply efficiency standard.")
241
- successfully_set_all_properties = false
242
- return successfully_set_all_properties
243
- end
244
-
245
- # If it's a PTAC or PTHP System, we need to divide the capacity by the potential zone multiplier
246
- # because the COP is dependent on capacity, and the capacity should be the capacity of a single zone, not all the zones
247
- if ['PTAC', 'PTHP'].include?(subcategory)
248
- mult = 1
249
- comp = containingZoneHVACComponent
250
- if comp.is_initialized
251
- if comp.get.thermalZone.is_initialized
252
- mult = comp.get.thermalZone.get.multiplier
253
- if mult > 1
254
- total_cap = capacity_w
255
- capacity_w /= mult
256
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{name}, total capacity of #{OpenStudio.convert(total_cap, 'W', 'kBtu/hr').get.round(2)}kBTU/hr was divided by the zone multiplier of #{mult} to give #{capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get.round(2)}kBTU/hr.")
257
- end
258
- end
259
- end
260
- end
157
+ # Get the search criteria
158
+ search_criteria = find_search_criteria(template)
261
159
 
262
- # Convert capacity to Btu/hr
160
+ # Get the capacity
161
+ capacity_w = find_capacity
263
162
  capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
264
163
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
265
164
 
266
165
  # Lookup efficiencies depending on whether it is a unitary AC or a heat pump
267
166
  ac_props = nil
268
- ac_props = if heat_pump == true
269
- model.find_object(heat_pumps, search_criteria, capacity_btu_per_hr, Date.today)
167
+ ac_props = if heat_pump?
168
+ model.find_object($os_standards['heat_pumps'], search_criteria, capacity_btu_per_hr, Date.today)
270
169
  else
271
- model.find_object(unitary_acs, search_criteria, capacity_btu_per_hr, Date.today)
170
+ model.find_object($os_standards['unitary_acs'], search_criteria, capacity_btu_per_hr, Date.today)
272
171
  end
273
172
 
274
173
  # Check to make sure properties were found
275
174
  if ac_props.nil?
276
175
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{name}, cannot find efficiency info, cannot apply efficiency standard.")
277
176
  successfully_set_all_properties = false
278
- return successfully_set_all_properties
177
+ return sql_db_vars_map
279
178
  end
280
179
 
281
180
  # Make the COOL-CAP-FT curve
@@ -323,81 +222,14 @@ class OpenStudio::Model::CoilCoolingDXSingleSpeed
323
222
  successfully_set_all_properties = false
324
223
  end
325
224
 
326
- # Get the minimum efficiency standards
327
- cop = nil
328
-
329
- # If PTHP, use equations
330
- if subcategory == 'PTHP'
331
- pthp_eer_coeff_1 = ac_props['pthp_eer_coefficient_1']
332
- pthp_eer_coeff_2 = ac_props['pthp_eer_coefficient_2']
333
- # TABLE 6.8.1D
334
- # EER = pthp_eer_coeff_1 - (pthp_eer_coeff_2 * Cap / 1000)
335
- # Note c: Cap means the rated cooling capacity of the product in Btu/h.
336
- # If the unit's capacity is less than 7000 Btu/h, use 7000 Btu/h in the calculation.
337
- # If the unit's capacity is greater than 15,000 Btu/h, use 15,000 Btu/h in the calculation.
338
- eer_calc_cap_btu_per_hr = capacity_btu_per_hr
339
- eer_calc_cap_btu_per_hr = 7000 if capacity_btu_per_hr < 7000
340
- eer_calc_cap_btu_per_hr = 15_000 if capacity_btu_per_hr > 15_000
341
- pthp_eer = pthp_eer_coeff_1 - (pthp_eer_coeff_2 * eer_calc_cap_btu_per_hr / 1000.0)
342
- cop = eer_to_cop(pthp_eer, OpenStudio.convert(capacity_btu_per_hr, 'Btu/hr', 'W').get)
343
- new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{pthp_eer.round(1)}EER"
344
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{pthp_eer.round(2)}")
345
- end
346
-
347
- # If PTAC, use equations
348
- if subcategory == 'PTAC'
349
- ptac_eer_coeff_1 = ac_props['ptac_eer_coefficient_1']
350
- ptac_eer_coeff_2 = ac_props['ptac_eer_coefficient_2']
351
- # TABLE 6.8.1D
352
- # EER = ptac_eer_coeff_1 - (ptac_eer_coeff_2 * Cap / 1000)
353
- # Note c: Cap means the rated cooling capacity of the product in Btu/h.
354
- # If the unit's capacity is less than 7000 Btu/h, use 7000 Btu/h in the calculation.
355
- # If the unit's capacity is greater than 15,000 Btu/h, use 15,000 Btu/h in the calculation.
356
- eer_calc_cap_btu_per_hr = capacity_btu_per_hr
357
- eer_calc_cap_btu_per_hr = 7000 if capacity_btu_per_hr < 7000
358
- eer_calc_cap_btu_per_hr = 15_000 if capacity_btu_per_hr > 15_000
359
- ptac_eer = ptac_eer_coeff_1 - (ptac_eer_coeff_2 * eer_calc_cap_btu_per_hr / 1000.0)
360
- cop = eer_to_cop(ptac_eer, OpenStudio.convert(capacity_btu_per_hr, 'Btu/hr', 'W').get)
361
- new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{ptac_eer.round(1)}EER"
362
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{ptac_eer}")
363
- end
364
-
365
- # If specified as SEER
366
- unless ac_props['minimum_seasonal_energy_efficiency_ratio'].nil?
367
- min_seer = ac_props['minimum_seasonal_energy_efficiency_ratio']
368
- cop = seer_to_cop_cooling_no_fan(min_seer)
369
- new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
370
- # self.setName("#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER")
371
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
372
- end
373
-
374
- # If specified as EER
375
- unless ac_props['minimum_energy_efficiency_ratio'].nil?
376
- min_eer = ac_props['minimum_energy_efficiency_ratio']
377
- cop = eer_to_cop(min_eer, OpenStudio.convert(capacity_kbtu_per_hr, 'kBtu/hr', 'W').get)
378
- new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
379
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
380
- end
225
+ # Preserve the original name
226
+ orig_name = name.to_s
381
227
 
382
- # if specified as SEER (heat pump)
383
- unless ac_props['minimum_seasonal_efficiency'].nil?
384
- min_seer = ac_props['minimum_seasonal_efficiency']
385
- cop = seer_to_cop_cooling_no_fan(min_seer)
386
- new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
387
- # self.setName("#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER")
388
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
389
- end
390
-
391
- # If specified as EER (heat pump)
392
- unless ac_props['minimum_full_load_efficiency'].nil?
393
- min_eer = ac_props['minimum_full_load_efficiency']
394
- cop = eer_to_cop(min_eer, OpenStudio.convert(capacity_kbtu_per_hr, 'kBtu/hr', 'W').get)
395
- new_comp_name = "#{name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
396
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
397
- end
228
+ # Find the minimum COP and rename with efficiency rating
229
+ cop = standard_minimum_cop(template, true)
398
230
 
399
- sql_db_vars_map[new_comp_name] = name.to_s
400
- setName(new_comp_name)
231
+ # Map the original name to the new name
232
+ sql_db_vars_map[name.to_s] = orig_name
401
233
 
402
234
  # Set the efficiency values
403
235
  unless cop.nil?