openstudio-standards 0.8.0 → 0.8.1

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.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openstudio-standards/exterior_lighting/create.rb +2 -2
  3. data/lib/openstudio-standards/exterior_lighting/data/convert_entryway_data.rb +94 -0
  4. data/lib/openstudio-standards/exterior_lighting/data/convert_parking_data.rb +82 -0
  5. data/lib/openstudio-standards/exterior_lighting/data/entryways.json +565 -0
  6. data/lib/openstudio-standards/exterior_lighting/data/parking.json +428 -0
  7. data/lib/openstudio-standards/exterior_lighting/information.rb +14 -14
  8. data/lib/openstudio-standards/hvac/components/create.rb +4 -4
  9. data/lib/openstudio-standards/hvac/components/modify.rb +2 -2
  10. data/lib/openstudio-standards/hvac/exhaust/create_exhaust_fan.rb +2 -2
  11. data/lib/openstudio-standards/hvac/exhaust/data/convert_typical_exhaust_data.rb +67 -0
  12. data/lib/openstudio-standards/infiltration/data/NISTInfiltrationCorrelations.json +3172 -0
  13. data/lib/openstudio-standards/infiltration/data/convert_infiltration_data.rb +87 -0
  14. data/lib/openstudio-standards/infiltration/infiltration.rb +3 -3
  15. data/lib/openstudio-standards/infiltration/nist_infiltration.rb +42 -42
  16. data/lib/openstudio-standards/refrigeration/create_case.rb +2 -2
  17. data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +22 -21
  18. data/lib/openstudio-standards/service_water_heating/create_typical.rb +1 -1
  19. data/lib/openstudio-standards/standards/Standards.Space.rb +3 -0
  20. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +10 -2
  21. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +131 -107
  22. data/lib/openstudio-standards/standards/deer/data/deer.schedules.json +24 -24
  23. data/lib/openstudio-standards/utilities/ruleset_check.rb +1 -2
  24. data/lib/openstudio-standards/version.rb +1 -1
  25. data/lib/openstudio-standards/weather/stat_file.rb +13 -4
  26. metadata +9 -3
  27. data/lib/openstudio-standards/hvac/exhaust/data/convert_data.rb +0 -86
@@ -0,0 +1,428 @@
1
+ {
2
+ "parking": [
3
+ {
4
+ "building_type": "SmallOffice",
5
+ "building_area_per_spot": 250.0,
6
+ "units_per_spot": null,
7
+ "students_per_spot": null,
8
+ "beds_per_spot": null,
9
+ "parking_area_per_spot": 405.0
10
+ },
11
+ {
12
+ "building_type": "MediumOffice",
13
+ "building_area_per_spot": 250.0,
14
+ "units_per_spot": null,
15
+ "students_per_spot": null,
16
+ "beds_per_spot": null,
17
+ "parking_area_per_spot": 405.0
18
+ },
19
+ {
20
+ "building_type": "LargeOffice",
21
+ "building_area_per_spot": 620.0,
22
+ "units_per_spot": null,
23
+ "students_per_spot": null,
24
+ "beds_per_spot": null,
25
+ "parking_area_per_spot": 405.0
26
+ },
27
+ {
28
+ "building_type": "Retail",
29
+ "building_area_per_spot": 285.7,
30
+ "units_per_spot": null,
31
+ "students_per_spot": null,
32
+ "beds_per_spot": null,
33
+ "parking_area_per_spot": 405.0
34
+ },
35
+ {
36
+ "building_type": "StripMall",
37
+ "building_area_per_spot": 215.0,
38
+ "units_per_spot": null,
39
+ "students_per_spot": null,
40
+ "beds_per_spot": null,
41
+ "parking_area_per_spot": 405.0
42
+ },
43
+ {
44
+ "building_type": "PrimarySchool",
45
+ "building_area_per_spot": null,
46
+ "units_per_spot": null,
47
+ "students_per_spot": 17.0,
48
+ "beds_per_spot": null,
49
+ "parking_area_per_spot": 405.0
50
+ },
51
+ {
52
+ "building_type": "SecondarySchool",
53
+ "building_area_per_spot": null,
54
+ "units_per_spot": null,
55
+ "students_per_spot": 8.0,
56
+ "beds_per_spot": null,
57
+ "parking_area_per_spot": 405.0
58
+ },
59
+ {
60
+ "building_type": "Outpatient",
61
+ "building_area_per_spot": 200.0,
62
+ "units_per_spot": null,
63
+ "students_per_spot": null,
64
+ "beds_per_spot": null,
65
+ "parking_area_per_spot": 405.0
66
+ },
67
+ {
68
+ "building_type": "Hospital",
69
+ "building_area_per_spot": null,
70
+ "units_per_spot": null,
71
+ "students_per_spot": null,
72
+ "beds_per_spot": 0.83,
73
+ "parking_area_per_spot": 405.0
74
+ },
75
+ {
76
+ "building_type": "SmallHotel",
77
+ "building_area_per_spot": null,
78
+ "units_per_spot": 1.0,
79
+ "students_per_spot": null,
80
+ "beds_per_spot": null,
81
+ "parking_area_per_spot": 405.0
82
+ },
83
+ {
84
+ "building_type": "LargeHotel",
85
+ "building_area_per_spot": null,
86
+ "units_per_spot": 1.0,
87
+ "students_per_spot": null,
88
+ "beds_per_spot": null,
89
+ "parking_area_per_spot": 405.0
90
+ },
91
+ {
92
+ "building_type": "Warehouse",
93
+ "building_area_per_spot": 1000.0,
94
+ "units_per_spot": null,
95
+ "students_per_spot": null,
96
+ "beds_per_spot": null,
97
+ "parking_area_per_spot": 405.0
98
+ },
99
+ {
100
+ "building_type": "QuickServiceRestaurant",
101
+ "building_area_per_spot": 100.0,
102
+ "units_per_spot": null,
103
+ "students_per_spot": null,
104
+ "beds_per_spot": null,
105
+ "parking_area_per_spot": 405.0
106
+ },
107
+ {
108
+ "building_type": "FullServiceRestaurant",
109
+ "building_area_per_spot": 100.0,
110
+ "units_per_spot": null,
111
+ "students_per_spot": null,
112
+ "beds_per_spot": null,
113
+ "parking_area_per_spot": 405.0
114
+ },
115
+ {
116
+ "building_type": "MidriseApartment",
117
+ "building_area_per_spot": null,
118
+ "units_per_spot": 0.45,
119
+ "students_per_spot": null,
120
+ "beds_per_spot": null,
121
+ "parking_area_per_spot": 405.0
122
+ },
123
+ {
124
+ "building_type": "HighriseApartment",
125
+ "building_area_per_spot": null,
126
+ "units_per_spot": 0.45,
127
+ "students_per_spot": null,
128
+ "beds_per_spot": null,
129
+ "parking_area_per_spot": 405.0
130
+ },
131
+ {
132
+ "building_type": "SuperMarket",
133
+ "building_area_per_spot": 285.7,
134
+ "units_per_spot": null,
135
+ "students_per_spot": null,
136
+ "beds_per_spot": null,
137
+ "parking_area_per_spot": 405.0
138
+ },
139
+ {
140
+ "building_type": "Parking surface",
141
+ "building_area_per_spot": null,
142
+ "units_per_spot": null,
143
+ "students_per_spot": null,
144
+ "beds_per_spot": null,
145
+ "parking_area_per_spot": 405.0
146
+ },
147
+ {
148
+ "building_type": "Parking garage",
149
+ "building_area_per_spot": null,
150
+ "units_per_spot": null,
151
+ "students_per_spot": null,
152
+ "beds_per_spot": null,
153
+ "parking_area_per_spot": 486.0
154
+ },
155
+ {
156
+ "building_type": "SmallDataCenterLowITE",
157
+ "building_area_per_spot": 0.0,
158
+ "units_per_spot": null,
159
+ "students_per_spot": null,
160
+ "beds_per_spot": null,
161
+ "parking_area_per_spot": 405.0
162
+ },
163
+ {
164
+ "building_type": "SmallDataCenterHighITE",
165
+ "building_area_per_spot": 0.0,
166
+ "units_per_spot": null,
167
+ "students_per_spot": null,
168
+ "beds_per_spot": null,
169
+ "parking_area_per_spot": 405.0
170
+ },
171
+ {
172
+ "building_type": "LargeDataCenterLowITE",
173
+ "building_area_per_spot": 0.0,
174
+ "units_per_spot": null,
175
+ "students_per_spot": null,
176
+ "beds_per_spot": null,
177
+ "parking_area_per_spot": 405.0
178
+ },
179
+ {
180
+ "building_type": "LargeDataCenterHighITE",
181
+ "building_area_per_spot": 0.0,
182
+ "units_per_spot": null,
183
+ "students_per_spot": null,
184
+ "beds_per_spot": null,
185
+ "parking_area_per_spot": 405.0
186
+ },
187
+ {
188
+ "building_type": "SmallOfficeDetailed",
189
+ "building_area_per_spot": 250.0,
190
+ "units_per_spot": null,
191
+ "students_per_spot": null,
192
+ "beds_per_spot": null,
193
+ "parking_area_per_spot": 405.0
194
+ },
195
+ {
196
+ "building_type": "MediumOfficeDetailed",
197
+ "building_area_per_spot": 250.0,
198
+ "units_per_spot": null,
199
+ "students_per_spot": null,
200
+ "beds_per_spot": null,
201
+ "parking_area_per_spot": 405.0
202
+ },
203
+ {
204
+ "building_type": "LargeOfficeDetailed",
205
+ "building_area_per_spot": 620.0,
206
+ "units_per_spot": null,
207
+ "students_per_spot": null,
208
+ "beds_per_spot": null,
209
+ "parking_area_per_spot": 405.0
210
+ },
211
+ {
212
+ "building_type": "Courthouse",
213
+ "building_area_per_spot": 250.0,
214
+ "units_per_spot": null,
215
+ "students_per_spot": null,
216
+ "beds_per_spot": null,
217
+ "parking_area_per_spot": 405.0
218
+ },
219
+ {
220
+ "building_type": "College",
221
+ "building_area_per_spot": 250.0,
222
+ "units_per_spot": null,
223
+ "students_per_spot": null,
224
+ "beds_per_spot": null,
225
+ "parking_area_per_spot": 405.0
226
+ },
227
+ {
228
+ "building_type": "Laboratory",
229
+ "building_area_per_spot": 250.0,
230
+ "units_per_spot": null,
231
+ "students_per_spot": null,
232
+ "beds_per_spot": null,
233
+ "parking_area_per_spot": 405.0
234
+ },
235
+ {
236
+ "building_type": "Asm",
237
+ "building_area_per_spot": 285.7,
238
+ "units_per_spot": null,
239
+ "students_per_spot": null,
240
+ "beds_per_spot": null,
241
+ "parking_area_per_spot": 405.0
242
+ },
243
+ {
244
+ "building_type": "ECC",
245
+ "building_area_per_spot": null,
246
+ "units_per_spot": null,
247
+ "students_per_spot": 8.0,
248
+ "beds_per_spot": null,
249
+ "parking_area_per_spot": 405.0
250
+ },
251
+ {
252
+ "building_type": "EPr",
253
+ "building_area_per_spot": null,
254
+ "units_per_spot": null,
255
+ "students_per_spot": 17.0,
256
+ "beds_per_spot": null,
257
+ "parking_area_per_spot": 405.0
258
+ },
259
+ {
260
+ "building_type": "ERC",
261
+ "building_area_per_spot": null,
262
+ "units_per_spot": null,
263
+ "students_per_spot": 8.0,
264
+ "beds_per_spot": null,
265
+ "parking_area_per_spot": 405.0
266
+ },
267
+ {
268
+ "building_type": "ESe",
269
+ "building_area_per_spot": null,
270
+ "units_per_spot": null,
271
+ "students_per_spot": 8.0,
272
+ "beds_per_spot": null,
273
+ "parking_area_per_spot": 405.0
274
+ },
275
+ {
276
+ "building_type": "EUn",
277
+ "building_area_per_spot": null,
278
+ "units_per_spot": null,
279
+ "students_per_spot": 30.0,
280
+ "beds_per_spot": null,
281
+ "parking_area_per_spot": 405.0
282
+ },
283
+ {
284
+ "building_type": "Gro",
285
+ "building_area_per_spot": 285.7,
286
+ "units_per_spot": null,
287
+ "students_per_spot": null,
288
+ "beds_per_spot": null,
289
+ "parking_area_per_spot": 405.0
290
+ },
291
+ {
292
+ "building_type": "Hsp",
293
+ "building_area_per_spot": null,
294
+ "units_per_spot": null,
295
+ "students_per_spot": null,
296
+ "beds_per_spot": 0.83,
297
+ "parking_area_per_spot": 405.0
298
+ },
299
+ {
300
+ "building_type": "Htl",
301
+ "building_area_per_spot": null,
302
+ "units_per_spot": 1.0,
303
+ "students_per_spot": null,
304
+ "beds_per_spot": null,
305
+ "parking_area_per_spot": 405.0
306
+ },
307
+ {
308
+ "building_type": "MBT",
309
+ "building_area_per_spot": 1000.0,
310
+ "units_per_spot": null,
311
+ "students_per_spot": null,
312
+ "beds_per_spot": null,
313
+ "parking_area_per_spot": 405.0
314
+ },
315
+ {
316
+ "building_type": "MFm",
317
+ "building_area_per_spot": null,
318
+ "units_per_spot": 0.45,
319
+ "students_per_spot": null,
320
+ "beds_per_spot": null,
321
+ "parking_area_per_spot": 405.0
322
+ },
323
+ {
324
+ "building_type": "MLI",
325
+ "building_area_per_spot": 1000.0,
326
+ "units_per_spot": null,
327
+ "students_per_spot": null,
328
+ "beds_per_spot": null,
329
+ "parking_area_per_spot": 405.0
330
+ },
331
+ {
332
+ "building_type": "Mtl",
333
+ "building_area_per_spot": null,
334
+ "units_per_spot": 1.0,
335
+ "students_per_spot": null,
336
+ "beds_per_spot": null,
337
+ "parking_area_per_spot": 405.0
338
+ },
339
+ {
340
+ "building_type": "Nrs",
341
+ "building_area_per_spot": null,
342
+ "units_per_spot": 1.0,
343
+ "students_per_spot": null,
344
+ "beds_per_spot": null,
345
+ "parking_area_per_spot": 405.0
346
+ },
347
+ {
348
+ "building_type": "OfL",
349
+ "building_area_per_spot": 250.0,
350
+ "units_per_spot": null,
351
+ "students_per_spot": null,
352
+ "beds_per_spot": null,
353
+ "parking_area_per_spot": 405.0
354
+ },
355
+ {
356
+ "building_type": "OfS",
357
+ "building_area_per_spot": 250.0,
358
+ "units_per_spot": null,
359
+ "students_per_spot": null,
360
+ "beds_per_spot": null,
361
+ "parking_area_per_spot": 405.0
362
+ },
363
+ {
364
+ "building_type": "RFF",
365
+ "building_area_per_spot": 100.0,
366
+ "units_per_spot": null,
367
+ "students_per_spot": null,
368
+ "beds_per_spot": null,
369
+ "parking_area_per_spot": 405.0
370
+ },
371
+ {
372
+ "building_type": "RSD",
373
+ "building_area_per_spot": 100.0,
374
+ "units_per_spot": null,
375
+ "students_per_spot": null,
376
+ "beds_per_spot": null,
377
+ "parking_area_per_spot": 405.0
378
+ },
379
+ {
380
+ "building_type": "Rt3",
381
+ "building_area_per_spot": 285.7,
382
+ "units_per_spot": null,
383
+ "students_per_spot": null,
384
+ "beds_per_spot": null,
385
+ "parking_area_per_spot": 405.0
386
+ },
387
+ {
388
+ "building_type": "RtL",
389
+ "building_area_per_spot": 285.7,
390
+ "units_per_spot": null,
391
+ "students_per_spot": null,
392
+ "beds_per_spot": null,
393
+ "parking_area_per_spot": 405.0
394
+ },
395
+ {
396
+ "building_type": "RtS",
397
+ "building_area_per_spot": 285.7,
398
+ "units_per_spot": null,
399
+ "students_per_spot": null,
400
+ "beds_per_spot": null,
401
+ "parking_area_per_spot": 405.0
402
+ },
403
+ {
404
+ "building_type": "SCn",
405
+ "building_area_per_spot": 1000.0,
406
+ "units_per_spot": null,
407
+ "students_per_spot": null,
408
+ "beds_per_spot": null,
409
+ "parking_area_per_spot": 405.0
410
+ },
411
+ {
412
+ "building_type": "SUn",
413
+ "building_area_per_spot": 1000.0,
414
+ "units_per_spot": null,
415
+ "students_per_spot": null,
416
+ "beds_per_spot": null,
417
+ "parking_area_per_spot": 405.0
418
+ },
419
+ {
420
+ "building_type": "WRf",
421
+ "building_area_per_spot": 1000.0,
422
+ "units_per_spot": null,
423
+ "students_per_spot": null,
424
+ "beds_per_spot": null,
425
+ "parking_area_per_spot": 405.0
426
+ }
427
+ ]
428
+ }
@@ -9,22 +9,22 @@ module OpenstudioStandards
9
9
  # @return [Hash] hash of exterior lighting value types and building type and model specific values
10
10
  def self.model_get_exterior_lighting_sizes(model)
11
11
  # load parking file and convert to hash table
12
- parking_csv = "#{__dir__}/data/parking.csv"
13
- unless File.exist?(parking_csv)
14
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.ExteriorLighting', "Unable to find file: #{parking_csv}")
12
+ parking_json = "#{__dir__}/data/parking.json"
13
+ unless File.exist?(parking_json)
14
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.ExteriorLighting', "Unable to find file: #{parking_json}")
15
15
  return false
16
16
  end
17
- parking_tbl = CSV.table(parking_csv, encoding: 'ISO8859-1:utf-8')
18
- parking_hsh = parking_tbl.map(&:to_hash)
17
+ parking_hsh = JSON.parse(File.read("#{__dir__}/data/parking.json"), symbolize_names: true)
18
+ parking_hsh = parking_hsh[:parking]
19
19
 
20
20
  # load entryways file and convert to hash table
21
- entryways_csv = "#{__dir__}/data/entryways.csv"
22
- unless File.exist?(entryways_csv)
23
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.ExteriorLighting', "Unable to find file: #{entryways_csv}")
21
+ entryways_json = "#{__dir__}/data/entryways.json"
22
+ unless File.exist?(entryways_json)
23
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.ExteriorLighting', "Unable to find file: #{entryways_json}")
24
24
  return false
25
25
  end
26
- entryways_tbl = CSV.table(entryways_csv, encoding: 'ISO8859-1:utf-8')
27
- entryways_hsh = entryways_tbl.map(&:to_hash)
26
+ entryways_hsh = JSON.parse(File.read("#{__dir__}/data/entryways.json"), symbolize_names: true)
27
+ entryways_hsh = entryways_hsh[:entryways]
28
28
 
29
29
  # get space properties from the model
30
30
  space_type_hash = OpenstudioStandards::CreateTypical.model_get_space_type_information(model)
@@ -123,12 +123,12 @@ module OpenstudioStandards
123
123
  # calculate door, window, and canopy length properties for exterior lighting
124
124
  # main entries
125
125
  unless entryways_properties[:entrance_doors_per_10000_ft2].nil?
126
- main_entries += (ground_floor_area_ft2 / 10_000.0) * entryways_properties[:entrance_doors_per_10000_ft2]
126
+ main_entries += (ground_floor_area_ft2 / 10_000.0) * entryways_properties[:entrance_doors_per_10000_ft2].to_f
127
127
  end
128
128
 
129
129
  # other doors
130
130
  unless entryways_properties[:other_doors_per_10000_ft2].nil?
131
- other_doors += (ground_floor_area_ft2 / 10_000.0) * entryways_properties[:other_doors_per_10000_ft2]
131
+ other_doors += (ground_floor_area_ft2 / 10_000.0) * entryways_properties[:other_doors_per_10000_ft2].to_f
132
132
  end
133
133
 
134
134
  # rollup doors
@@ -143,12 +143,12 @@ module OpenstudioStandards
143
143
 
144
144
  # entrance canopies
145
145
  if !entryways_properties[:entrance_canopies].nil? && !entryways_properties[:canopy_size].nil?
146
- canopy_entry_area += entryways_properties[:entrance_canopies] * entryways_properties[:canopy_size]
146
+ canopy_entry_area += entryways_properties[:entrance_canopies] * entryways_properties[:canopy_size].to_f
147
147
  end
148
148
 
149
149
  # emergency canopies
150
150
  if !entryways_properties[:emergency_canopies].nil? && !entryways_properties[:canopy_size].nil?
151
- canopy_emergency_area += entryways_properties[:emergency_canopies] * entryways_properties[:canopy_size]
151
+ canopy_emergency_area += entryways_properties[:emergency_canopies] * entryways_properties[:canopy_size].to_f
152
152
  end
153
153
 
154
154
  # building_facades
@@ -6,7 +6,7 @@ module OpenstudioStandards
6
6
 
7
7
  # creates HeatExchangerAirToAirSensibleAndLatent object with user-input effectiveness values
8
8
  #
9
- # @param model [<OpenStudio::Model::Model>] OpenStudio model
9
+ # @param model [OpenStudio::Model::Model] OpenStudio model
10
10
  # @param name [String]
11
11
  # @param type [String] Heat Exchanger Type. One of 'Plate', 'Rotary'
12
12
  # @param economizer_lockout [Boolean] whether hx is locked out during economizing
@@ -96,10 +96,10 @@ module OpenstudioStandards
96
96
 
97
97
  # creates LookupTable objects to define effectiveness of HeatExchangerAirToAirSensibleAndLatent objects
98
98
  #
99
- # @param hx [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio HX object to update
99
+ # @param hx [OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent] OpenStudio HX object to update
100
100
  # @param type [String] type of curve to create. one of 'Sensible Heating', 'Latent Heating, 'Sensible Cooling', 'Latent Cooling'
101
- # @param values_hash [Hash{Float=>Float}] user_input flow decimal fraction => effectiveness decimal fraction pairs, e.g. {0.75 => 0.81, 1.0 => 0.76}
102
- # @return [<OpenStudio::Model::TableLookup>] lookup table object
101
+ # @param values_hash [Hash{Float=>Float}] user_input { flow decimal fraction => effectiveness } decimal fraction pairs, e.g. { 0.75 => 0.81, 1.0 => 0.76 }
102
+ # @return [OpenStudio::Model::TableLookup] lookup table object
103
103
  def self.create_hx_effectiveness_table(hx, type, values_hash)
104
104
  # validate inputs
105
105
  types = ['Sensible Heating', 'Latent Heating', 'Sensible Cooling', 'Latent Cooling']
@@ -4,13 +4,13 @@ module OpenstudioStandards
4
4
  # @!group Component:Modify
5
5
  # Methods to modify HVAC Component objects
6
6
 
7
- # Applies historical default or user-input effectiveness values to a HeatExchanger:AirToAir:SensibleAndLatent object
7
+ # Applies historical default or user-input effectiveness values to a HeatExchangerAirToAirSensibleAndLatent object
8
8
  #
9
9
  # @param hx [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio HX object to update
10
10
  # @param defaults [Boolean] flag to apply historical default curves
11
11
  # @param values [Hash{String=>Hash{Float=>Float}}] user-input effectiveness values, where keys are one of
12
12
  # 'Sensible Heating', 'Latent Heating, 'Sensible Cooling', 'Latent Cooling'
13
- # and value is a hash of {flow decimal fraction => effectivess decimal fraction}, e.g. {0.75 => 0.81, 1.0 => 0.76}
13
+ # and value is a hash of { flow decimal fraction => effectivess decimal fraction }, e.g. { 0.75 => 0.81, 1.0 => 0.76 }
14
14
  # @return [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] modified OpenStudio HX object
15
15
  def self.heat_exchanger_air_to_air_set_effectiveness_values(hx, defaults: false, values: nil)
16
16
  if defaults
@@ -14,7 +14,7 @@ module OpenstudioStandards
14
14
  make_up_air_source_zone: nil,
15
15
  make_up_air_fraction: 0.5)
16
16
  # load exhaust fan data
17
- data = JSON.parse(File.read("#{__dir__}/data/typical_exhaust.json"), symbolize_names: true)
17
+ data = JSON.parse(File.read("#{File.dirname(__FILE__)}/data/typical_exhaust.json"), symbolize_names: true)
18
18
 
19
19
  # loop through spaces to get standards space information
20
20
  space_type_hash = {}
@@ -55,7 +55,7 @@ module OpenstudioStandards
55
55
  end
56
56
 
57
57
  if exhaust_m3_per_s.zero?
58
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC.create_exhaust_fan', "Calculated zero flow rate for thermal zone #{exhaust_zone.name}. No exhaust fan added.")
58
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.HVAC.create_exhaust_fan', "Calculated zero flow rate for thermal zone #{exhaust_zone.name}. No exhaust fan added.")
59
59
  return nil
60
60
  end
61
61
 
@@ -0,0 +1,67 @@
1
+ # These methods convert exhuast fan data to and from .csv for editing.
2
+ private
3
+
4
+ require 'csv'
5
+ require 'json'
6
+
7
+ def typical_exhaust_csv_to_json(input_csv = 'typical_exhaust.csv',
8
+ output_json = 'typical_exhaust.json')
9
+ # Initialize the structure
10
+ result = {
11
+ space_types: []
12
+ }
13
+
14
+ # Read the CSV file
15
+ CSV.foreach(input_csv, headers: true, header_converters: :symbol) do |row|
16
+ space_type = row[:space_type]
17
+ building_type = row[:building_type]
18
+ exhaust_per_area = row[:exhaust_per_area]
19
+
20
+ space_type_hash = {
21
+ space_type: space_type,
22
+ building_type: building_type,
23
+ exhaust_per_area: exhaust_per_area
24
+ }
25
+
26
+ # Add the space_type_hash to the result array
27
+ result[:space_types] << space_type_hash
28
+ end
29
+
30
+ # Write to the output JSON file
31
+ File.write(output_json, JSON.pretty_generate(result))
32
+
33
+ puts "Data has been converted to JSON and saved to #{output_json}"
34
+ end
35
+
36
+ # convert to json
37
+ typical_exhaust_csv_to_json
38
+
39
+ def typical_exhaust_json_to_csv(input_json = 'typical_exhaust.json',
40
+ output_csv = 'typical_exhaust.csv')
41
+ # Read the JSON file
42
+ data = JSON.parse(File.read(input_json), symbolize_names: true)
43
+
44
+ # Prepare the CSV headers
45
+ headers = [
46
+ :space_type,
47
+ :building_type,
48
+ :exhaust_per_area
49
+ ]
50
+
51
+ # Write the CSV file
52
+ CSV.open(output_csv, 'w', write_headers: true, headers: headers) do |csv|
53
+ data[:space_types].each do |space_type_entry|
54
+ space_type = space_type_entry[:space_type]
55
+ building_type = space_type_entry[:building_type]
56
+ exhaust_per_area = space_type_entry[:exhaust_per_area]
57
+
58
+ csv << [
59
+ space_type,
60
+ building_type,
61
+ exhaust_per_area
62
+ ]
63
+ end
64
+ end
65
+
66
+ puts "Data has been converted to CSV and saved to #{output_csv}"
67
+ end