tbd 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +3 -0
  3. data/.github/workflows/pull_request.yml +72 -0
  4. data/.gitignore +23 -0
  5. data/.rspec +3 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE.md +21 -0
  8. data/README.md +154 -0
  9. data/Rakefile +60 -0
  10. data/json/midrise.json +64 -0
  11. data/json/tbd_5ZoneNoHVAC.json +19 -0
  12. data/json/tbd_5ZoneNoHVAC_btap.json +91 -0
  13. data/json/tbd_seb_n2.json +41 -0
  14. data/json/tbd_seb_n4.json +57 -0
  15. data/json/tbd_warehouse10.json +24 -0
  16. data/json/tbd_warehouse5.json +37 -0
  17. data/lib/measures/tbd/LICENSE.md +21 -0
  18. data/lib/measures/tbd/README.md +136 -0
  19. data/lib/measures/tbd/README.md.erb +42 -0
  20. data/lib/measures/tbd/docs/.gitkeep +1 -0
  21. data/lib/measures/tbd/measure.rb +327 -0
  22. data/lib/measures/tbd/measure.xml +460 -0
  23. data/lib/measures/tbd/resources/geo.rb +714 -0
  24. data/lib/measures/tbd/resources/geometry.rb +351 -0
  25. data/lib/measures/tbd/resources/model.rb +1431 -0
  26. data/lib/measures/tbd/resources/oslog.rb +381 -0
  27. data/lib/measures/tbd/resources/psi.rb +2229 -0
  28. data/lib/measures/tbd/resources/tbd.rb +55 -0
  29. data/lib/measures/tbd/resources/transformation.rb +121 -0
  30. data/lib/measures/tbd/resources/ua.rb +986 -0
  31. data/lib/measures/tbd/resources/utils.rb +1636 -0
  32. data/lib/measures/tbd/resources/version.rb +3 -0
  33. data/lib/measures/tbd/tests/tbd_full_PSI.json +17 -0
  34. data/lib/measures/tbd/tests/tbd_tests.rb +222 -0
  35. data/lib/tbd/geo.rb +714 -0
  36. data/lib/tbd/psi.rb +2229 -0
  37. data/lib/tbd/ua.rb +986 -0
  38. data/lib/tbd/version.rb +25 -0
  39. data/lib/tbd.rb +93 -0
  40. data/sponsors/canada.png +0 -0
  41. data/sponsors/quebec.png +0 -0
  42. data/tbd.gemspec +43 -0
  43. data/tbd.schema.json +571 -0
  44. data/v291_MacOS.md +110 -0
  45. metadata +191 -0
data/tbd.schema.json ADDED
@@ -0,0 +1,571 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema#",
3
+ "id": "https://github.com/rd2/tbd/blob/master/tbd.schema.json",
4
+ "title": "TBD Schema",
5
+ "description": "Schema for Thermal Bridging and Derating",
6
+ "type": "object",
7
+ "properties": {
8
+ "description": {
9
+ "type": "string"
10
+ },
11
+ "schema": {
12
+ "type": "string"
13
+ },
14
+ "psis": {
15
+ "type": "array",
16
+ "items": {
17
+ "$ref": "#/definitions/PSI"
18
+ },
19
+ "uniqueItems": true
20
+ },
21
+ "khis": {
22
+ "type": "array",
23
+ "items": {
24
+ "$ref": "#/definitions/KHI"
25
+ },
26
+ "uniqueItems": true
27
+ },
28
+ "edges": {
29
+ "type": "array",
30
+ "items": {
31
+ "$ref": "#/definitions/Edge"
32
+ },
33
+ "uniqueItems": true
34
+ },
35
+ "subsurfaces": {
36
+ "type": "array",
37
+ "items": {
38
+ "$ref": "#/definitions/SubSurface"
39
+ },
40
+ "uniqueItems": true
41
+ },
42
+ "surfaces": {
43
+ "type": "array",
44
+ "items": {
45
+ "$ref": "#/definitions/Surface"
46
+ },
47
+ "uniqueItems": true
48
+ },
49
+ "spaces": {
50
+ "type": "array",
51
+ "items": {
52
+ "$ref": "#/definitions/Space"
53
+ },
54
+ "uniqueItems": true
55
+ },
56
+ "spacetypes": {
57
+ "type": "array",
58
+ "items": {
59
+ "$ref": "#/definitions/SpaceType"
60
+ },
61
+ "uniqueItems": true
62
+ },
63
+ "stories": {
64
+ "type": "array",
65
+ "items": {
66
+ "$ref": "#/definitions/Story"
67
+ },
68
+ "uniqueItems": true
69
+ },
70
+ "building": {
71
+ "type": "object",
72
+ "$ref": "#/definitions/Building"
73
+ },
74
+ "log": {
75
+ "type": "object",
76
+ "$ref": "#/definitions/Log"
77
+ }
78
+ },
79
+ "additionalProperties": false,
80
+ "definitions": {
81
+ "PSI": {
82
+ "description": "Set of PSI-values (in W/K per m) for thermal bridges",
83
+ "type": "object",
84
+ "properties": {
85
+ "id": {
86
+ "title": "Unique PSI set identifier",
87
+ "type": "string"
88
+ },
89
+ "rimjoist": {
90
+ "title": "Floor/wall edge PSI",
91
+ "type": "number"
92
+ },
93
+ "rimjoistconcave": {
94
+ "title": "Concave floor/wall edge PSI",
95
+ "type": "number"
96
+ },
97
+ "rimjoistconvex": {
98
+ "title": "Convex floor/wall edge PSI",
99
+ "type": "number"
100
+ },
101
+ "parapet": {
102
+ "title": "Roof/wall edge PSI",
103
+ "type": "number"
104
+ },
105
+ "parapetconcave": {
106
+ "title": "Concave roof/wall edge PSI",
107
+ "type": "number"
108
+ },
109
+ "parapetconvex": {
110
+ "title": "Convex roof/wall edge PSI",
111
+ "type": "number"
112
+ },
113
+ "fenestration": {
114
+ "title": "Window, door, skylight perimeter PSI",
115
+ "type": "number"
116
+ },
117
+ "head": {
118
+ "title": "Aperture head/lintel PSI",
119
+ "type": "number"
120
+ },
121
+ "headconcave": {
122
+ "title": "Concave aperture head/lintel PSI",
123
+ "type": "number"
124
+ },
125
+ "headconvex": {
126
+ "title": "Convex aperture head/lintel PSI",
127
+ "type": "number"
128
+ },
129
+ "sill": {
130
+ "title": "Aperture sill/base PSI",
131
+ "type": "number"
132
+ },
133
+ "sillconcave": {
134
+ "title": "Concave aperture sill/base PSI",
135
+ "type": "number"
136
+ },
137
+ "sillconvex": {
138
+ "title": "Convex aperture sill/base PSI",
139
+ "type": "number"
140
+ },
141
+ "jamb": {
142
+ "title": "Aperture jamb/side PSI",
143
+ "type": "number"
144
+ },
145
+ "jambconcave": {
146
+ "title": "Concave aperture jamb/side PSI",
147
+ "type": "number"
148
+ },
149
+ "jambconvex": {
150
+ "title": "Convex aperture jamb/side PSI",
151
+ "type": "number"
152
+ },
153
+ "corner": {
154
+ "title": "Any wall corner [0°,135°) or (225°,360°] PSI",
155
+ "type": "number"
156
+ },
157
+ "cornerconcave": {
158
+ "title": "Concave wall corner [0°,135°) PSI",
159
+ "type": "number"
160
+ },
161
+ "cornerconvex": {
162
+ "title": "Convex wall corner (225°,360°] PSI",
163
+ "type": "number"
164
+ },
165
+ "balcony": {
166
+ "title": "Floor/balcony edge PSI ",
167
+ "type": "number"
168
+ },
169
+ "balconyconcave": {
170
+ "title": "Concave floor/balcony edge PSI ",
171
+ "type": "number"
172
+ },
173
+ "balconyconvex": {
174
+ "title": "Convex floor/balcony edge PSI ",
175
+ "type": "number"
176
+ },
177
+ "party": {
178
+ "title": "Party wall edge PSI",
179
+ "type": "number"
180
+ },
181
+ "partyconcave": {
182
+ "title": "Concave party wall edge PSI",
183
+ "type": "number"
184
+ },
185
+ "partyconvex": {
186
+ "title": "Convex party wall edge PSI",
187
+ "type": "number"
188
+ },
189
+ "grade": {
190
+ "title": "Floor/foundation edge PSI",
191
+ "type": "number"
192
+ },
193
+ "gradeconcave": {
194
+ "title": "Concave floor/foundation edge PSI",
195
+ "type": "number"
196
+ },
197
+ "gradecovex": {
198
+ "title": "Convex floor/foundation edge PSI",
199
+ "type": "number"
200
+ },
201
+ "joint": {
202
+ "title": "Joints PSI",
203
+ "type": "number"
204
+ },
205
+ "transition": {
206
+ "title": "(Mild) transition PSI",
207
+ "type": "number"
208
+ }
209
+ },
210
+ "additionalProperties": false,
211
+ "minProperties": 2,
212
+ "required": [
213
+ "id"
214
+ ]
215
+ },
216
+ "KHI": {
217
+ "description": "KHI-value (in W/K) for a point thermal bridge",
218
+ "type": "object",
219
+ "properties": {
220
+ "id": {
221
+ "title": "Unique KHI identifier",
222
+ "type": "string"
223
+ },
224
+ "point": {
225
+ "title": "Point KHI-value",
226
+ "type": "number"
227
+ }
228
+ },
229
+ "additionalProperties": false,
230
+ "required": [
231
+ "id",
232
+ "point"
233
+ ]
234
+ },
235
+ "Edge": {
236
+ "description": "Surface(s) edge as thermal bridge",
237
+ "type": "object",
238
+ "properties": {
239
+ "psi": {
240
+ "title": "PSI-set identifier",
241
+ "type": "string"
242
+ },
243
+ "type": {
244
+ "title": "PSI-set type e.g., 'parapet'",
245
+ "type": "string",
246
+ "enum": [
247
+ "rimjoist",
248
+ "rimjoistconcave",
249
+ "rimjoisconvext",
250
+ "parapet",
251
+ "parapetconcave",
252
+ "parapetconvex",
253
+ "fenestration",
254
+ "head",
255
+ "headconcave",
256
+ "headconvex",
257
+ "sill",
258
+ "sillconcave",
259
+ "sillconvex",
260
+ "jamb",
261
+ "jambconcave",
262
+ "jambconvex",
263
+ "corner",
264
+ "cornerconcave",
265
+ "cornerconvex",
266
+ "balcony",
267
+ "balconyconcave",
268
+ "balconyconvex",
269
+ "party",
270
+ "partyconcave",
271
+ "partyconvex",
272
+ "grade",
273
+ "gradeconcave",
274
+ "gradeconvex",
275
+ "joint",
276
+ "transition"
277
+ ]
278
+ },
279
+ "length": {
280
+ "title": "Edge length (m), > 0 m",
281
+ "type": "number",
282
+ "minimum": 0,
283
+ "exclusiveMinimum": true
284
+ },
285
+ "v0x": {
286
+ "title": "Edge origin X vertex (m)",
287
+ "type": "number"
288
+ },
289
+ "v0y": {
290
+ "title": "Edge origin Y vertex (m)",
291
+ "type": "number"
292
+ },
293
+ "v0z": {
294
+ "title": "Edge origin Z vertex (m)",
295
+ "type": "number"
296
+ },
297
+ "v1x": {
298
+ "title": "Edge terminal X vertex (m)",
299
+ "type": "number"
300
+ },
301
+ "v1y": {
302
+ "title": "Edge terminal Y vertex (m)",
303
+ "type": "number"
304
+ },
305
+ "v1z": {
306
+ "title": "Edge terminal Z vertex (m)",
307
+ "type": "number"
308
+ },
309
+ "surfaces": {
310
+ "title": "Surface(s) connected to edge",
311
+ "type": "array",
312
+ "items": {
313
+ "type": "string"
314
+ },
315
+ "minItems": 1,
316
+ "uniqueItems": true
317
+ }
318
+ },
319
+ "additionalProperties": false,
320
+ "required": [
321
+ "type",
322
+ "surfaces"
323
+ ]
324
+ },
325
+ "SubSurface": {
326
+ "description": "Suburface(s) U-factors (optional)",
327
+ "type": "object",
328
+ "properties": {
329
+ "id": {
330
+ "title": "e.g. OS or E+ surface identifier",
331
+ "type": "string"
332
+ },
333
+ "usi": {
334
+ "title": "Overall U-factor",
335
+ "type": "number",
336
+ "minimum": 0.01,
337
+ "maximum": 10.0
338
+ }
339
+ },
340
+ "additionalProperties": false,
341
+ "required": [
342
+ "id",
343
+ "usi"
344
+ ]
345
+ },
346
+ "Surface": {
347
+ "description": "Surface default PSI-set (optional)",
348
+ "type": "object",
349
+ "properties": {
350
+ "id": {
351
+ "title": "e.g. OS or E+ surface identifier",
352
+ "type": "string"
353
+ },
354
+ "psi": {
355
+ "title": "PSI-set identifier",
356
+ "type": "string"
357
+ },
358
+ "khis": {
359
+ "title": "Surface-hosted point thermal bridges",
360
+ "type": "array",
361
+ "items": {
362
+ "type": "object",
363
+ "properties": {
364
+ "id": {
365
+ "title": "Unique KHI-value identifier",
366
+ "type": "string"
367
+ },
368
+ "count": {
369
+ "title": "Number of KHI-matching point thermal bridges",
370
+ "type": "number",
371
+ "minimum": 1
372
+ }
373
+ },
374
+ "additionalProperties": false,
375
+ "required": [
376
+ "id",
377
+ "count"
378
+ ]
379
+ },
380
+ "uniqueItems": true
381
+ }
382
+ },
383
+ "additionalProperties": false,
384
+ "minProperties": 2,
385
+ "required": [
386
+ "id"
387
+ ]
388
+ },
389
+ "Space": {
390
+ "description": "Space default PSI-set (optional for OS)",
391
+ "type": "object",
392
+ "properties": {
393
+ "id": {
394
+ "title": "e.g. OS space or E+ zone identifier",
395
+ "type": "string"
396
+ },
397
+ "psi": {
398
+ "title": "PSI-set identifier",
399
+ "type": "string"
400
+ }
401
+ },
402
+ "additionalProperties": false,
403
+ "required": [
404
+ "id",
405
+ "psi"
406
+ ]
407
+ },
408
+ "SpaceType": {
409
+ "description": "SpaceType default PSI-set (optional for OS)",
410
+ "type": "object",
411
+ "properties": {
412
+ "id": {
413
+ "title": "e.g. OS spacetype identifier",
414
+ "type": "string"
415
+ },
416
+ "psi": {
417
+ "title": "PSI-set identifier",
418
+ "type": "string"
419
+ }
420
+ },
421
+ "additionalProperties": false,
422
+ "required": [
423
+ "id",
424
+ "psi"
425
+ ]
426
+ },
427
+ "Story": {
428
+ "description": "Story default PSI-set (optional for OS)",
429
+ "type": "object",
430
+ "properties": {
431
+ "id": {
432
+ "title": "e.g. OS story identifier",
433
+ "type": "string"
434
+ },
435
+ "psi": {
436
+ "title": "PSI-set identifier",
437
+ "type": "string"
438
+ }
439
+ },
440
+ "additionalProperties": false,
441
+ "required": [
442
+ "id",
443
+ "psi"
444
+ ]
445
+ },
446
+ "Building": {
447
+ "description": "Building default PSI-set (optional for OS)",
448
+ "type": "object",
449
+ "properties": {
450
+ "psi": {
451
+ "title": "PSI-set identifier",
452
+ "type": "string"
453
+ }
454
+ },
455
+ "additionalProperties": false,
456
+ "required": [
457
+ "psi"
458
+ ]
459
+ },
460
+ "Log": {
461
+ "description": "TBD log",
462
+ "type": "object",
463
+ "properties": {
464
+ "date": {
465
+ "title": "Timestamp",
466
+ "type": "string"
467
+ },
468
+ "status": {
469
+ "title": "Global state",
470
+ "type": "string"
471
+ },
472
+ "ua": {
473
+ "title": "UA' assessment",
474
+ "type": "object",
475
+ "properties": {
476
+ "bloc1": {
477
+ "title": "heating setpoints >= 18°C",
478
+ "type": "object",
479
+ "$ref": "#/definitions/UaBlock"
480
+ },
481
+ "bloc2": {
482
+ "title": "heating setpoints < 18°C",
483
+ "type": "object",
484
+ "$ref": "#/definitions/UaBlock"
485
+ }
486
+ },
487
+ "additionalProperties": false,
488
+ "minProperties": 1
489
+ },
490
+ "results": {
491
+ "title": "Thermal derating results",
492
+ "type": "array",
493
+ "items": {
494
+ "type": "string"
495
+ }
496
+ },
497
+ "messages": {
498
+ "title": "Logged messages",
499
+ "type": "array",
500
+ "items": {
501
+ "$ref": "#/definitions/LogMessage"
502
+ }
503
+ }
504
+ },
505
+ "additionalProperties": false
506
+ },
507
+ "LogMessage": {
508
+ "description": "TBD log messages",
509
+ "type": "object",
510
+ "properties": {
511
+ "level": {
512
+ "title": "Severity of logged message (e.g. WARN)",
513
+ "type": "string"
514
+ },
515
+ "message": {
516
+ "title": "Logged message",
517
+ "type": "string"
518
+ }
519
+ },
520
+ "additionalProperties": false
521
+ },
522
+ "UaBlock": {
523
+ "description": "UA summary",
524
+ "type": "object",
525
+ "properties": {
526
+ "summary": {
527
+ "type": "string"
528
+ },
529
+ "walls": {
530
+ "type": "string"
531
+ },
532
+ "roofs": {
533
+ "type": "string"
534
+ },
535
+ "floors": {
536
+ "type": "string"
537
+ },
538
+ "doors": {
539
+ "type": "string"
540
+ },
541
+ "windows": {
542
+ "type": "string"
543
+ },
544
+ "skylights": {
545
+ "type": "string"
546
+ },
547
+ "rimjoists": {
548
+ "type": "string"
549
+ },
550
+ "parapets": {
551
+ "type": "string"
552
+ },
553
+ "trim": {
554
+ "type": "string"
555
+ },
556
+ "corners": {
557
+ "type": "string"
558
+ },
559
+ "grade": {
560
+ "type": "string"
561
+ },
562
+ "other": {
563
+ "type": "string"
564
+ }
565
+ },
566
+ "additionalProperties": false,
567
+ "minProperties": 2,
568
+ "required": ["summary"]
569
+ }
570
+ }
571
+ }
data/v291_MacOS.md ADDED
@@ -0,0 +1,110 @@
1
+ _We reiterate that building professionals and energy modellers can download the latest TBD version directly from the Guide itself, or under [releases](https://github.com/rd2/tbd/releases), or via NREL's [BCL](https://bcl.nrel.gov) (search for "bridging" or "rd2")._
2
+
3
+ _Those instead interested in exploring/tweaking the source code (cloned or forked versions of TBD) can follow the Windows or MacOS Ruby setup described in TBD's [README](https://github.com/rd2/tbd#readme)._
4
+
5
+ _The MacOS instructions below specifically target (older) Ruby v2.2.5 environments, needed for developing OpenStudio [v2.9.1](https://github.com/NREL/OpenStudio/releases/tag/v2.9.1) measures - the most up-to-date version that remains [compatible](https://github.com/NREL/OpenStudio/wiki/OpenStudio-SDK-Version-Compatibility-Matrix) with [SketchUp Make 2017](https://help.sketchup.com/en/downloading-older-versions). More recent OpenStudio versions (e.g. v3.4.0) can - to a large degree - safely translate older .osm files. Although TBD (and Topolys) are systematically tested against updated OpenStudio versions (v2.9.1 onwards), the following Ruby v2.2.5 setup is no longer tested or maintained. Nonetheless, it may be of some help for the more adventurous of you._
6
+
7
+
8
+ ## v2.9.1 MacOS Instructions
9
+ _tested Catalina 10.15.4 up to Big Sur 11.4_
10
+
11
+ OpenStudio v2.9.1 measures require Ruby v2.2.5, which is several iterations behind the default Ruby v2.6 version available on any recently-purchased Mac. Although it is common to develop/test using more than one Ruby version, some effort is nonetheless required for older vintages: v2.2.5 is no longer officially supported, it requires the deprecated OpenSSL-1.0 (not 1.1), etc. To help Mac users (and potentially Linux users as well), the following steps are recommended (although architecture-specific tweaks may be required).
12
+
13
+ From a Terminal, install [Homebrew](https://brew.sh/index) - nice for package distribution and management. With a few tweaks, it will handle most package downloads, dependencies, etc. Using Homebrew, install OpenSSL-1.0, and then _rbenv_ (which allows users to manage multiple Ruby versions). One way of doing it:
14
+
15
+ ```
16
+ brew install rbenv/tap/openssl@1.0
17
+ ```
18
+
19
+ By _tapping_, Homebrew provides a way to access third-party repositories that are no longer officially supported by Homebrew, like Ruby v2.2.5 and OpenSSL-1.0. The above instruction tells Homebrew to install compatible versions of OpenSSL-1.0 with _rbenv_ (e.g. 1.0.2t, 1.0.2u).
20
+
21
+ Next, ensure that Homebrew and _rbenv_ use OpenSSL-1.0 for future, local Ruby development. Edit (or create) a user’s local _~/.zshrc_ file (instructions here are provided for _zsh_, the default macOS Terminal shell interface - _bash_ users: adapt!), by pasting-in the following:
22
+
23
+ ```
24
+ eval "$(rbenv init - zsh)"
25
+ export PATH="/usr/local/opt/openssl@1.0/bin:$PATH"
26
+ export LDFLAGS="-L/usr/local/opt/openssl@1.0/lib"
27
+ export CPPFLAGS="-I/usr/local/opt/openssl@1.0/include"
28
+ export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.0/lib/pkgconfig"
29
+ export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.0)"
30
+ ```
31
+
32
+ There’s probably more there than necessary, but it should do the trick for the next few steps, and/or for future work. Quit the Terminal and start a new one, or simply _source_ the zshrc file:
33
+
34
+ ```
35
+ source ~/.zshrc
36
+ ```
37
+
38
+ Make sure the right OpenSSL version is recognized, and then instruct Homebrew to switch over to it:
39
+
40
+ ```
41
+ openssl version
42
+ brew switch openssl 1.0.2t
43
+ ```
44
+
45
+ … or whatever Openssl 1.0 version was installed, e.g. 1.0.2u. Then install _ruby-build_, _rbenv_ and finally Ruby v2.2.5:
46
+
47
+ ```
48
+ brew install ruby-build
49
+ brew install rbenv
50
+ rbenv install 2.2.5
51
+ ```
52
+
53
+ Install a compatible version of [bundler](https://bundler.io), great for managing Ruby gems and dependencies:
54
+
55
+ ```
56
+ gem install bundler -v 1.17.3
57
+ ```
58
+ In some cases, (temporarily) switching over to an insecure ```http``` connection to rubygems.org (instead of the default ```https```) may be required:
59
+ ```
60
+ gem source -r https://rubygems.org/
61
+ gem source -a http://rubygems.org/
62
+ gem install bundler -v 1.17.3
63
+ gem source -r http://rubygems.org/
64
+ gem source -a https://rubygems.org/
65
+ ```
66
+
67
+ In the Terminal, check the Ruby version:
68
+
69
+ ```
70
+ ruby -v
71
+ ```
72
+
73
+ ... should still report the current Ruby version used by macOS (e.g. ```system``` or ```2.6```). To ensure Ruby v2.2.5 is used for developing OpenStudio v2.9.1-compatible measures, instruct _rbenv_ to use Ruby v2.2.5 _locally_ within a user’s chosen directory (e.g. "sandbox291"):
74
+
75
+ ```
76
+ mkdir ~/Documents/sandbox291
77
+ cd ~/Documents/sandbox291
78
+ rbenv local 2.2.5
79
+ ruby -v
80
+ ```
81
+
82
+ … should now report ```2.2.5``` as the local Ruby version, to be used by default for anything under the "sandbox291" directory tree. To ensure both Ruby versions are operational and safe, run the following checkup twice - once from a user’s _home_ (or ~/), then from within e.g., "sandbox291":
83
+
84
+ ```
85
+ cd ~/
86
+ ruby -ropen-uri -e 'eval open("https://git.io/vQhWq").read'
87
+ cd ~/Documents/sandbox291
88
+ ruby -ropen-uri -e 'eval open("https://git.io/vQhWq").read'
89
+ ```
90
+
91
+ If successful, one should get a ```Hooray!``` from both Ruby versions confirming valid communication with [Rubygems](https://rubygems.org/), yet with their specific RubyGems and OpenSSL versions, as well as their own SSL certificates.
92
+
93
+ Install OpenStudio [v2.9.1](https://github.com/NREL/OpenStudio/releases/tag/v2.9.1).
94
+
95
+ Then create the file _~/.rbenv/versions/2.2.5/lib/ruby/site_ruby/openstudio.rb_, and edit it so it _points_ to your new OpenStudio installation:
96
+
97
+ ```
98
+ require '/Applications/OpenStudio-2.9.1/Ruby/openstudio.rb'
99
+ ```
100
+
101
+ Verify your local OpenStudio and Ruby configuration:
102
+
103
+ ```
104
+ cd ~/Documents/sandbox291
105
+ ruby -e "require 'openstudio'" -e "puts OpenStudio::Model::Model.new"
106
+ ```
107
+
108
+ Install the latest version of _git_ (e.g. through Homebrew), and ```git clone``` the TBD measure under e.g., "sandbox291".
109
+
110
+ Run the basic [tests](https://github.com/rd2/tbd#complete-list-of-test-commands) to ensure the measure operates as expected.