Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/smartthings-infrastructure
[smartthings-infrastructure.git] / Extractor / extractorFile.groovy
1 ////////////////////
2 @Field App
3 App = "App2"
4 ////////////////////////////////////////
5 //import libraries
6 import groovy.transform.Field
7
8
9 //import classes
10 //Importing Classes
11 import ContactSensor.ContactSensor
12 import ContactSensor.ContactSensors
13 import DoorControl.DoorControl
14 import DoorControl.DoorControls
15 import Lock.Lock
16 import Lock.Locks
17 import Thermostat.Thermostat
18 import Thermostat.Thermostats
19 import Switch.Switch
20 import Switch.Switches
21 import PresenceSensor.PresenceSensor
22 import PresenceSensor.PresenceSensors
23 import Logger.Logger
24 import Location.LocationVar
25 import Location.Phrase
26 import appTouch.Touched
27 import NfcTouch.NfcTouch
28 import AeonKeyFob.AeonKeyFob
29 import AeonKeyFob.AeonKeyFobs
30 import MusicPlayer.MusicPlayer
31 import MusicPlayer.MusicPlayers
32 import MotionSensor.MotionSensor
33 import MotionSensor.MotionSensors
34 import ImageCapture.ImageCapture
35 import ImageCapture.ImageCaptures
36 import SmokeDetector.SmokeDetector
37 import SmokeDetector.SmokeDetectors
38 import Alarm.Alarm
39 import Alarm.Alarms
40 import SpeechSynthesis.SpeechSynthesis
41 import SpeechSynthesis.SpeechSynthesises
42 import Timer.SimulatedTimer
43
44 //GlobalVariables
45 @Field def location = new LocationVar()
46 //Settings variable defined to settings on purpose
47 @Field def settings = [app: "app"]
48 //Global variable for state[mode]
49 @Field def state = [home:[],away:[],night:[]]
50 //Create a global logger object for methods
51 @Field def log = new Logger()
52 //Create a global variable for optional property
53 @Field def optional = false //by default for now
54
55
56 //Global variables for files
57 @Field File extractedObjectsApp1 = new File("Extractor/App1/extractedObjectsApp1.groovy")
58 @Field File extractedObjectsApp2 = new File("Extractor/App2/extractedObjectsApp2.groovy")
59 @Field File extractedObjectsConstructorApp1 = new File("Extractor/App1/extractedObjectsConstructorApp1.groovy")
60 @Field File extractedObjectsConstructorApp2 = new File("Extractor/App2/extractedObjectsConstructorApp2.groovy")
61
62
63 //Empty the files
64 if (App == "App1") {
65         extractedObjectsApp1.write("")
66         extractedObjectsConstructorApp1.write("")
67 } else if (App == "App2") {
68         extractedObjectsApp2.write("")
69         extractedObjectsConstructorApp2.write("")
70 }
71
72
73
74
75
76 //Global objects
77 //Global Object for class Touch Sensor!
78 @Field touchSensorObjects = 0
79 @Field def touchSensorObject0
80 @Field def touchSensorObject1
81 @Field def touchSensorObject2
82 //Global Object for class switch!
83 @Field switchObjects = 0
84 @Field def switchObject0
85 @Field def switchObject1
86 @Field def switchObject2
87 //Global Object for class lock!
88 @Field lockObjects = 0
89 @Field def lockObject0
90 @Field def lockObject1
91 @Field def lockObject2
92 //Global Object for class door control!
93 @Field doorControlObjects = 0
94 @Field def doorControlObject0
95 @Field def doorControlObject1
96 @Field def doorControlObject2
97 //Global Object for class contact sensor!
98 @Field contactObjects = 0
99 @Field def contactObject0
100 @Field def contactObject1
101 @Field def contactObject2
102 //Global Object for class presence sensor!
103 @Field presenceSensorObjects = 0
104 @Field def presenceSensorObject0
105 @Field def presenceSensorObject1
106 @Field def presenceSensorObject2
107 //Global Object for class thermostat!
108 @Field thermostatObjects = 0
109 @Field def thermostatObject0
110 @Field def thermostatObject1
111 @Field def thermostatObject2
112 //Global Object for class music player!
113 @Field musicPlayerObjects = 0
114 @Field def musicPlayerObject0
115 @Field def musicPlayerObject1
116 @Field def musicPlayerObject2
117 //Global Object for class music player!
118 @Field aeonKeyFobObjects = 0
119 @Field def aeonKeyFobObject0
120 @Field def aeonKeyFobObject1
121 @Field def aeonKeyFobObject2
122 //Global Object for class motion sensor!
123 @Field motionSensorObjects = 0
124 @Field def motionSensorObject0
125 @Field def motionSensorObject1
126 @Field def motionSensorObject2
127 //Global Object for class image capture!
128 @Field imageCaptureObjects = 0
129 @Field def imageCaptureObject0
130 @Field def imageCaptureObject1
131 @Field def imageCaptureObject2
132 //Global Object for class smoke detector!
133 @Field smokeDetectorObjects = 0
134 @Field def smokeDetectorObject0
135 @Field def smokeDetectorObject1
136 @Field def smokeDetectorObject2
137 //Global Object for class alarm!
138 @Field alarmObjects = 0
139 @Field def alarmObject0
140 @Field def alarmObject1
141 @Field def alarmObject2
142 //Global Object for class alarm!
143 @Field speechSynthesisObjects = 0
144 @Field def speechSynthesisObject0
145 @Field def speechSynthesisObject1
146 @Field def speechSynthesisObject2
147
148
149 //Global variables
150 //For mode
151 @Field modeVariables = 0
152 @Field mode0
153 @Field mode1
154 @Field mode2
155 @Field mode3
156 @Field mode4
157 @Field mode5
158 //For number
159 @Field numberVariables = 0
160 @Field number0
161 @Field number1
162 @Field number2
163 @Field number3
164 @Field number4
165 @Field number5
166 //For decimal
167 @Field decimalVariables = 0
168 @Field decimal0
169 @Field decimal1
170 @Field decimal2
171 @Field decimal3
172 @Field decimal4
173 @Field decimal5
174 //For time
175 @Field timeVariables = 0
176 @Field time0
177 @Field time1
178 @Field time2
179 @Field time3
180 @Field time4
181 @Field time5
182 //For enum
183 @Field enumVariables = 0
184 @Field enum0
185 @Field enum1
186 @Field enum2
187 @Field enum3
188 @Field enum4
189 @Field enum5
190 //For phone
191 @Field phoneVariables = 0
192 @Field phone0
193 @Field phone1
194 @Field phone2
195 @Field phone3
196 @Field phone4
197 @Field phone5
198 //For contact
199 @Field contactVariables = 0
200 @Field contact0
201 @Field contact1
202 @Field contact2
203 @Field contact3
204 @Field contact4
205 @Field contact5
206 //For text
207 @Field textVariables = 0
208 @Field textVariable0
209 @Field textVariable1
210 @Field textVariable2
211 @Field textVariable3
212 @Field textVariable4
213 @Field textVariable5
214 //For boolean
215 @Field boolVariables = 0
216 @Field boolVariable0
217 @Field boolVariable1
218 @Field boolVariable2
219 @Field boolVariable3
220 @Field boolVariable4
221 @Field boolVariable5
222
223
224 /////Input Methods/////
225 //input "",""
226 def input(String name, String type) {
227         LinkedHashMap metaData = []
228         metaData.put('name',name)
229         metaData.put('type',type)
230         input(metaData)
231 }
232
233 //input "","",linkedHashMap
234 def input(LinkedHashMap metaData, String name, String type) {
235         metaData.put('name',name)
236         metaData.put('type',type)
237         input(metaData)
238 }
239
240 //input "", "", linkedHashMap, Closure
241 def input(LinkedHashMap metaData, String name, String type, Closure Input) {
242         metaData.put('name',name)
243         metaData.put('type',type)
244         input(metaData)
245         find(Input)
246 }
247
248 //input linkedHashMap
249 def input(LinkedHashMap metaData) {
250         if (metaData.containsKey('title')) {
251                 println metaData['title']
252         }
253         if (metaData.containsKey('options')) {
254                 println "Options: "+metaData['options']
255         }
256         switch(metaData['type']) {
257                 case "capability.lock":
258                         if (lockObjects == 0) {
259                                 lockObject0 = metaData['name']
260                                 this[lockObject0] = new Locks({}, 1)
261                         } else if (lockObjects == 1) {
262                                 lockObject1 = metaData['name']
263                                 this[lockObject1] = new Locks({}, 1)
264                         } else if (lockObjects == 2) {
265                                 lockObject2 = metaData['name']
266                                 this[lockObject2] = new Locks({}, 1)
267                         }
268
269                         lockObjects=lockObjects+1
270
271                         settings.put(metaData['name'], metaData['name']) 
272
273                         if (App == "App1") {
274                                 extractedObjectsApp1.append("//Object for class lock!\n")
275                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
276                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.lockObject\n")          
277                         } else {
278                                 extractedObjectsApp2.append("//Object for class lock!\n")
279                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
280                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.lockObject\n")
281                         }
282                         break
283                 case "capability.alarm":
284                         if (alarmObjects == 0) {
285                                 alarmObject0 = metaData['name']
286                                 this[alarmObject0] = new Alarms({}, 1)
287                         } else if (alarmObjects == 1) {
288                                 alarmObject1 = metaData['name']
289                                 this[alarmObject1] = new Alarms({}, 1)
290                         } else if (alarmObjects == 2) {
291                                 alarmObject2 = metaData['name']
292                                 this[alarmObject2] = new Alarms({}, 1)
293                         }
294
295                         alarmObjects=alarmObjects+1
296
297                         settings.put(metaData['name'], metaData['name']) 
298
299                         if (App == "App1") {
300                                 extractedObjectsApp1.append("//Object for class alarm!\n")
301                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
302                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.alarmObject\n")         
303                         } else {
304                                 extractedObjectsApp2.append("//Object for class alarm!\n")
305                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
306                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.alarmObject\n")
307                         }
308                         break
309                 case "capability.battery":
310                         break
311                 case "capability.beacon":
312                         break
313                 case "capability.carbonMonoxideDetector":
314                         break
315                 case "capability.colorControl":
316                         break
317                 case "capability.contactSensor":
318                         if (contactObjects == 0) {
319                                 contactObject0 = metaData['name']
320                                 this[contactObject0] = new ContactSensors({}, 1)
321                         } else if (contactObjects == 1) {
322                                 contactObject1 = metaData['name']
323                                 this[contactObject1] = new ContactSensors({}, 1)
324                         } else if (contactObjects == 2) {
325                                 contactObject2 = metaData['name']
326                                 this[contactObject2] = new ContactSensors({}, 1)
327                         }
328
329                         contactObjects=contactObjects+1
330
331                         settings.put(metaData['name'], metaData['name'])
332
333                         if (App == "App1") {
334                                 extractedObjectsApp1.append("//Object for class contactSensor!\n")
335                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
336                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.contactObject\n")               
337                         } else {
338                                 extractedObjectsApp2.append("//Object for class contactSensor!\n")
339                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
340                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.contactObject\n")
341                         }
342                         break
343                 case "capability.doorControl":
344                         if (doorControlObjects == 0) {
345                                 doorControlObject0 = metaData['name']
346                                 this[doorControlObject0] = new DoorControls({}, 1)
347                         } else if (doorControlObjects == 1) {
348                                 doorControlObject1 = metaData['name']
349                                 this[doorControlObject1] = new DoorControls({}, 1)
350                         } else if (doorControlObjects == 2) {
351                                 doorControlObject2 = metaData['name']
352                                 this[doorControlObject2] = new DoorControls({}, 1)
353                         }
354
355                         doorControlObjects=doorControlObjects+1
356
357                         settings.put(metaData['name'], metaData['name'])
358
359                         if (App == "App1") {
360                                 extractedObjectsApp1.append("//Object for class door control!\n")
361                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
362                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.doorControlObject\n")           
363                         } else {
364                                 extractedObjectsApp2.append("//Object for class door control!\n")
365                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
366                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.doorControlObject\n")
367                         }
368                         break
369                 case "capability.energyMeter":
370                         break
371                 case "capability.illuminanceMeasurement":
372                         break
373                 case "capability.accelerationSensor":
374                         break
375                 case "capability.motionSensor":
376                         if (motionSensorObjects == 0) {
377                                 motionSensorObject0 = metaData['name']
378                                 this[motionSensorObject0] = new MotionSensors({}, 1)
379                         } else if (motionSensorObjects == 1) {
380                                 motionSensorObject1 = metaData['name']
381                                 this[motionSensorObject1] = new MotionSensors({}, 1)
382                         } else if (motionSensorObjects == 2) {
383                                 motionSensorObject2 = metaData['name']
384                                 this[motionSensorObject2] = new MotionSensors({}, 1)
385                         }
386
387                         motionSensorObjects=motionSensorObjects+1
388
389                         settings.put(metaData['name'], metaData['name'])
390
391                         if (App == "App1") {
392                                 extractedObjectsApp1.append("//Object for class Motion Sensor!\n")
393                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
394                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.motionSensorObject\n")          
395                         } else {
396                                 extractedObjectsApp2.append("//Object for class Motion Sensor!\n")
397                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
398                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.motionSensorObject\n")
399                         }
400                         break
401                 case "capability.musicPlayer":
402                         if (musicPlayerObjects == 0) {
403                                 musicPlayerObject0 = metaData['name']
404                                 this[musicPlayerObject0] = new MusicPlayers({}, 1)
405                         } else if (musicPlayerObjects == 1) {
406                                 musicPlayerObject1 = metaData['name']
407                                 this[musicPlayerObject1] = new MusicPlayers({}, 1)
408                         } else if (musicPlayerObjects == 2) {
409                                 musicPlayerObject2 = metaData['name']
410                                 this[musicPlayerObject2] = new MusicPlayers({}, 1)
411                         }
412
413                         musicPlayerObjects=musicPlayerObjects+1
414
415                         settings.put(metaData['name'], metaData['name']) 
416
417                         if (App == "App1") {
418                                 extractedObjectsApp1.append("//Object for class music player!\n")
419                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
420                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.musicPlayerObject\n")           
421                         } else {
422                                 extractedObjectsApp2.append("//Object for class music player!\n")
423                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
424                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.musicPlayerObject\n")
425                         }
426                         break
427                 case "capability.powerMeter":
428                         break
429                 case "capability.presenceSensor":
430                         if (presenceSensorObjects == 0) {
431                                 presenceSensorObject0 = metaData['name']
432                                 this[presenceSensorObject0] = new PresenceSensors({}, 1)
433                         } else if (presenceSensorObjects == 1) {
434                                 presenceSensorObject1 = metaData['name']
435                                 this[presenceSensorObject1] = new PresenceSensors({}, 1)
436                         } else if (presenceSensorObjects == 2) {
437                                 presenceSensorObject2 = metaData['name']
438                                 this[presenceSensorObject2] = new PresenceSensors({}, 1)
439                         }
440
441                         presenceSensorObjects=presenceSensorObjects+1
442
443                         settings.put(metaData['name'], metaData['name'])
444
445                         if (App == "App1") {
446                                 extractedObjectsApp1.append("//Object for class presence sensor!\n")
447                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
448                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.presenceSensorObject\n")                
449                         } else {
450                                 extractedObjectsApp2.append("//Object for class presence sensor!\n")
451                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
452                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.presenceSensorObject\n")
453                         }
454                         break
455                 case "capability.relativeHumidityMeasurement":
456                         break
457                 case "capability.relaySwitch":
458                         break
459                 case "capability.sleepSensor":
460                         break
461                 case "capability.smokeDetector":
462                         if (smokeDetectorObjects == 0) {
463                                 smokeDetectorObject0 = metaData['name']
464                                 this[smokeDetectorObject0] = new SmokeDetectors({}, 1)
465                         } else if (smokeDetectorObjects == 1) {
466                                 smokeDetectorObject1 = metaData['name']
467                                 this[smokeDetectorObject1] = new SmokeDetectors({}, 1)
468                         } else if (smokeDetectorObjects == 2) {
469                                 smokeDetectorObject2 = metaData['name']
470                                 this[smokeDetectorObject2] = new SmokeDetectors({}, 1)
471                         }
472
473                         smokeDetectorObjects=smokeDetectorObjects+1
474                         
475                         settings.put(metaData['name'], metaData['name'])
476
477                         if (App == "App1") {
478                                 extractedObjectsApp1.append("//Object for class smoke detector!\n")
479                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
480                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.smokeDetectorObject\n")         
481                         } else {
482                                 extractedObjectsApp2.append("//Object for class smoke detector!\n")
483                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
484                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.smokeDetectorObject\n")
485                         }
486                         break
487                 case "capability.stepSensor":
488                         break
489                 case "capability.switch":
490                         if (switchObjects == 0) {
491                                 switchObject0 = metaData['name']
492                                 this[switchObject0] = new Switches({}, 1)
493                         } else if (switchObjects == 1) {
494                                 switchObject1 = metaData['name']
495                                 this[switchObject1] = new Switches({}, 1)
496                         } else if (switchObjects == 2) {
497                                 switchObject2 = metaData['name']
498                                 this[switchObject2] = new Switches({}, 1)
499                         }
500
501                         switchObjects=switchObjects+1
502                         
503                         settings.put(metaData['name'], metaData['name'])
504
505                         if (App == "App1") {
506                                 extractedObjectsApp1.append("//Object for class switch!\n")
507                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
508                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.switchObject\n")                
509                         } else {
510                                 extractedObjectsApp2.append("//Object for class switch!\n")
511                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
512                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.switchObject\n")
513                         }
514                         break
515                 case "capability.switchLevel":
516                         break
517                 case "capability.temperatureMeasurement":
518                         break
519                 case "capability.thermostat":
520                         if (thermostatObjects == 0) {
521                                 thermostatObject0 = metaData['name']
522                                 this[thermostatObject0] = new Thermostats({}, 1)
523                         } else if (thermostatObjects == 1) {
524                                 thermostatObject1 = metaData['name']
525                                 this[thermostatObject1] = new Thermostats({}, 1)
526                         } else if (thermostatObjects == 2) {
527                                 thermostatObject2 = metaData['name']
528                                 this[thermostatObject2] = new Thermostats({}, 1)
529                         }
530
531                         thermostatObjects=thermostatObjects+1
532
533                         settings.put(metaData['name'], metaData['name'])
534
535                         if (App == "App1") {
536                                 extractedObjectsApp1.append("//Object for class thermostat!\n")
537                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
538                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.thermostatObject\n")            
539                         } else {
540                                 extractedObjectsApp2.append("//Object for class thermostat!\n")
541                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
542                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.thermostatObject\n")
543                         }
544                         break
545                 case "capability.valve":
546                         break
547                 case "capability.speechSynthesis":
548                         if (speechSynthesisObjects == 0) {
549                                 speechSynthesisObject0 = metaData['name']
550                                 this[speechSynthesisObject0] = new SpeechSynthesises({}, 1)
551                         } else if (speechSynthesisObjects == 1) {
552                                 speechSynthesisObject1 = metaData['name']
553                                 this[speechSynthesisObject1] = new SpeechSynthesises({}, 1)
554                         } else if (speechSynthesisObjects == 2) {
555                                 speechSynthesisObject2 = metaData['name']
556                                 this[speechSynthesisObject2] = new SpeechSynthesises({}, 1)
557                         }
558
559                         speechSynthesisObjects=speechSynthesisObjects+1
560
561                         settings.put(metaData['name'], metaData['name'])
562
563                         if (App == "App1") {
564                                 extractedObjectsApp1.append("//Object for class speech synthesis!\n")
565                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
566                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.speechSynthesisObject\n")               
567                         } else {
568                                 extractedObjectsApp2.append("//Object for class speech synthesis!\n")
569                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
570                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.speechSynthesisObject\n")
571                         }
572                         break
573                 case "capability.waterSensor":
574                         break
575                 case "capability.touchSensor":
576                         if (touchSensorObjects == 0) {
577                                 touchSensorObject0 = metaData['name']
578                                 this[touchSensorObject0] = new NfcTouch({}, 1)
579                         } else if (touchSensorObjects == 1) {
580                                 touchSensorObject1 = metaData['name']
581                                 this[touchSensorObject1] = new NfcTouch({}, 1)
582                         } else if (touchSensorObjects == 2) {
583                                 touchSensorObject2 = metaData['name']
584                                 this[touchSensorObject2] = new NfcTouch({}, 1)
585                         }
586
587                         touchSensorObjects=touchSensorObjects+1
588
589                         settings.put(metaData['name'], metaData['name'])
590
591                         if (App == "App1") {
592                                 extractedObjectsApp1.append("//Object for class Touch Sensor!\n")
593                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
594                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.touchSensorObject\n")           
595                         } else {
596                                 extractedObjectsApp2.append("//Object for class Touch Sensor!\n")
597                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
598                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.touchSensorObject\n")
599                         }
600                         break
601                 case "capability.imageCapture":
602                         if (imageCaptureObjects == 0) {
603                                 imageCaptureObject0 = metaData['name']
604                                 this[imageCaptureObject0] = new ImageCaptures({}, 1)
605                         } else if (imageCaptureObjects == 1) {
606                                 imageCaptureObject1 = metaData['name']
607                                 this[imageCaptureObject1] = new ImageCaptures({}, 1)
608                         } else if (imageCaptureObjects == 2) {
609                                 imageCaptureObject2 = metaData['name']
610                                 this[imageCaptureObject2] = new ImageCaptures({}, 1)
611                         }
612
613                         imageCaptureObjects=imageCaptureObjects+1
614
615                         settings.put(metaData['name'], metaData['name'])
616
617                         if (App == "App1") {
618                                 extractedObjectsApp1.append("//Object for class Image Capture!\n")
619                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
620                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.imageCaptureObject\n")          
621                         } else {
622                                 extractedObjectsApp2.append("//Object for class Image Capture!\n")
623                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
624                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.imageCaptureObject\n")
625                         }
626                         break
627                 case "device.mobilePresence":
628                         break
629                 case "device.aeonKeyFob":
630                         if (aeonKeyFobObjects == 0) {
631                                 aeonKeyFobObject0 = metaData['name']
632                                 this[aeonKeyFobObject0] = new AeonKeyFobs({}, 1)
633                         } else if (aeonKeyFobObjects == 1) {
634                                 aeonKeyFobObject1 = metaData['name']
635                                 this[aeonKeyFobObject1] = new AeonKeyFobs({}, 1)
636                         } else if (aeonKeyFobObjects == 2) {
637                                 aeonKeyFobObject2 = metaData['name']
638                                 this[aeonKeyFobObject2] = new AeonKeyFobs({}, 1)
639                         }
640
641                         aeonKeyFobObjects=aeonKeyFobObjects+1
642
643                         settings.put(metaData['name'], metaData['name']) 
644
645                         if (App == "App1") {
646                                 extractedObjectsApp1.append("//Object for class aeon key fob!\n")
647                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
648                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.aeonKeyFobObject\n")            
649                         } else {
650                                 extractedObjectsApp2.append("//Object for class aeon key fob!\n")
651                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
652                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.aeonKeyFobObject\n")
653                         }
654                         break
655                 case "mode":
656                         def randomVariable = Math.abs(new Random().nextInt() % 3)
657                         def modes = ["away", "home", "night"]
658                         def userInput = modes[randomVariable]
659
660                         if (modeVariables == 0) {
661                                 mode0 = metaData['name']
662                                 this[mode0] = userInput
663                         } else if (modeVariables == 1) {
664                                 mode1 = metaData['name']
665                                 this[mode1] = userInput
666                         } else if (modeVariables == 2) {
667                                 mode2 = metaData['name']
668                                 this[mode2] = userInput
669                         } else if (modeVariables == 3) {
670                                 mode3 = metaData['name']
671                                 this[mode3] = userInput
672                         } else if (modeVariables == 4) {
673                                 mode4 = metaData['name']
674                                 this[mode4] = userInput
675                         } else if (modeVariables == 5) {
676                                 mode5 = metaData['name']
677                                 this[mode5] = userInput
678                         }
679
680                         modeVariables=modeVariables+1
681
682                         settings.put(metaData['name'], metaData['name'])
683
684                         if (App == "App1") {                    
685                                 extractedObjectsApp1.append("//Global variable for mode!\n")
686                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
687                         } else {
688                                 extractedObjectsApp2.append("//Global variable for mode!\n")
689                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
690                         }
691                         break
692                 case "decimal":
693                         def userInput = Math.abs(new Random().nextInt() % 60) + 40
694                         
695                         if (decimalVariables == 0) {
696                                 decimal0 = metaData['name']
697                                 this[decimal0] = userInput
698                         } else if (decimalVariables == 1) {
699                                 decimal1 = metaData['name']
700                                 this[decimal1] = userInput
701                         } else if (decimalVariables == 2) {
702                                 decimal2 = metaData['name']
703                                 this[decimal2] = userInput
704                         } else if (decimalVariables == 3) {
705                                 decimal3 = metaData['name']
706                                 this[decimal3] = userInput
707                         } else if (decimalVariables == 4) {
708                                 decimal4 = metaData['name']
709                                 this[decimal4] = userInput
710                         } else if (decimalVariables == 5) {
711                                 decimal5 = metaData['name']
712                                 this[decimal5] = userInput
713                         }
714
715                         decimalVariables=decimalVariables+1
716
717                         settings.put(metaData['name'], metaData['name'])
718
719                         if (App == "App1") {                    
720                                 extractedObjectsApp1.append("//Global variable for decimal number!\n")
721                                 extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
722                         } else {
723                                 extractedObjectsApp2.append("//Global variable for decimal number!\n")
724                                 extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
725                         }
726                         break
727                 case "text":
728                         def userInput = "This is just a text!"
729         
730                         if (textVariables == 0) {
731                                 text0 = metaData['name']
732                                 this[text0] = userInput
733                         } else if (textVariables == 1) {
734                                 text1 = metaData['name']
735                                 this[text1] = userInput
736                         } else if (textVariables == 2) {
737                                 text2 = metaData['name']
738                                 this[text2] = userInput
739                         } else if (textVariables == 3) {
740                                 text3 = metaData['name']
741                                 this[text3] = userInput
742                         } else if (textVariables == 4) {
743                                 text4 = metaData['name']
744                                 this[text4] = userInput
745                         } else if (textVariables == 5) {
746                                 text5 = metaData['name']
747                                 this[text5] = userInput
748                         }
749
750                         textVariables=textVariables+1
751
752                         settings.put(metaData['name'], metaData['name'])
753
754                         if (App == "App1") {                    
755                                 extractedObjectsApp1.append("//Global variable for text!\n")
756                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
757                         } else {
758                                 extractedObjectsApp2.append("//Global variable for text!\n")
759                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
760                         }
761                         break
762                 case "number":
763                         def userInput = Math.abs(new Random().nextInt() % 60) + 40
764                         
765                         if (numberVariables == 0) {
766                                 number0 = metaData['name']
767                                 this[number0] = userInput
768                         } else if (numberVariables == 1) {
769                                 number1 = metaData['name']
770                                 this[number1] = userInput
771                         } else if (numberVariables == 2) {
772                                 number2 = metaData['name']
773                                 this[number2] = userInput
774                         } else if (numberVariables == 3) {
775                                 number3 = metaData['name']
776                                 this[number3] = userInput
777                         } else if (numberVariables == 4) {
778                                 number4 = metaData['name']
779                                 this[number4] = userInput
780                         } else if (numberVariables == 5) {
781                                 number5 = metaData['name']
782                                 this[number5] = userInput
783                         }
784
785                         numberVariables=numberVariables+1
786
787                         settings.put(metaData['name'], metaData['name'])
788
789                         if (App == "App1") {                    
790                                 extractedObjectsApp1.append("//Global variable for number!\n")
791                                 extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
792                         } else {
793                                 extractedObjectsApp2.append("//Global variable for number!\n")
794                                 extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
795                         }
796                         break
797                 case "time":
798                         def userInput = "15:00"
799                         
800                         if (timeVariables == 0) {
801                                 time0 = metaData['name']
802                                 this[time0] = userInput
803                         } else if (timeVariables == 1) {
804                                 time1 = metaData['name']
805                                 this[time1] = userInput
806                         } else if (timeVariables == 2) {
807                                 time2 = metaData['name']
808                                 this[time2] = userInput
809                         } else if (timeVariables == 3) {
810                                 time3 = metaData['name']
811                                 this[time3] = userInput
812                         } else if (timeVariables == 4) {
813                                 time4 = metaData['name']
814                                 this[time4] = userInput
815                         } else if (timeVariables == 5) {
816                                 time5 = metaData['name']
817                                 this[time5] = userInput
818                         }
819
820                         timeVariables=timeVariables+1
821
822                         settings.put(metaData['name'], metaData['name'])
823
824                         if (App == "App1") {                    
825                                 extractedObjectsApp1.append("//Global variable for time!\n")
826                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
827                         } else {
828                                 extractedObjectsApp2.append("//Global variable for time!\n")
829                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
830                         }
831                         break
832                 case "enum":
833                         def randomVariable = Math.abs(new Random().nextInt() % 2)
834                         def modes = ["Yes", "No"]
835                         def userInput = modes[randomVariable]
836         
837                         if (enumVariables == 0) {
838                                 enum0 = metaData['name']
839                                 this[enum0] = userInput
840                         } else if (enumVariables == 1) {
841                                 enum1 = metaData['name']
842                                 this[enum1] = userInput
843                         } else if (enumVariables == 2) {
844                                 enum2 = metaData['name']
845                                 this[enum2] = userInput
846                         } else if (enumVariables == 3) {
847                                 enum3 = metaData['name']
848                                 this[enum3] = userInput
849                         } else if (enumVariables == 4) {
850                                 enum4 = metaData['name']
851                                 this[enum4] = userInput
852                         } else if (enumVariables == 5) {
853                                 enum5 = metaData['name']
854                                 this[enum5] = userInput
855                         }
856
857                         enumVariables=enumVariables+1
858
859                         settings.put(metaData['name'], metaData['name'])
860
861                         if (App == "App1") {                    
862                                 extractedObjectsApp1.append("//Global variable for enum!\n")
863                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
864                         } else {
865                                 extractedObjectsApp2.append("//Global variable for enum!\n")
866                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
867                         }
868                         break
869                 case "bool":
870                         def userInput = Math.abs(new Random().nextInt() % 2)
871         
872                         if (boolVariables == 0) {
873                                 bool0 = metaData['name']
874                                 this[bool0] = userInput
875                         } else if (boolVariables == 1) {
876                                 bool1 = metaData['name']
877                                 this[bool1] = userInput
878                         } else if (boolVariables == 2) {
879                                 bool2 = metaData['name']
880                                 this[bool2] = userInput
881                         } else if (boolVariables == 3) {
882                                 bool3 = metaData['name']
883                                 this[bool3] = userInput
884                         } else if (boolVariables == 4) {
885                                 bool4 = metaData['name']
886                                 this[bool4] = userInput
887                         } else if (boolVariables == 5) {
888                                 bool5 = metaData['name']
889                                 this[bool5] = userInput
890                         }
891
892                         boolVariables=boolVariables+1
893
894                         settings.put(metaData['name'], metaData['name'])
895
896                         if (App == "App1") {                    
897                                 extractedObjectsApp1.append("//Global variable for boolean!\n")
898                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
899                         } else {
900                                 extractedObjectsApp2.append("//Global variable for boolean!\n")
901                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
902                         }
903                         break
904                 case "phone":
905                         def userInput = 9495379373
906
907                         if (phoneVariables == 0) {
908                                 phone0 = metaData['name']
909                                 this[phone0] = userInput
910                         } else if (phoneVariables == 1) {
911                                 phone1 = metaData['name']
912                                 this[phone1] = userInput
913                         } else if (phoneVariables == 2) {
914                                 phone2 = metaData['name']
915                                 this[phone2] = userInput
916                         } else if (phoneVariables == 3) {
917                                 phone3 = metaData['name']
918                                 this[phone3] = userInput
919                         } else if (phoneVariables == 4) {
920                                 phone4 = metaData['name']
921                                 this[phone4] = userInput
922                         } else if (phoneVariables == 5) {
923                                 phone5 = metaData['name']
924                                 this[phone5] = userInput
925                         }
926
927                         phoneVariables=phoneVariables+1
928
929                         settings.put(metaData['name'], metaData['name'])
930
931                         if (App == "App1") {                    
932                                 extractedObjectsApp1.append("//Global variable for phone!\n")
933                                 extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
934                         } else {
935                                 extractedObjectsApp2.append("//Global variable for phone!\n")
936                                 extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
937                         }
938                         break
939                 case "contact":
940                         def userInput = "AJ"
941         
942                         if (contactVariables == 0) {
943                                 contact0 = metaData['name']
944                                 this[contact0] = userInput
945                         } else if (contactVariables == 1) {
946                                 contact1 = metaData['name']
947                                 this[contact1] = userInput
948                         } else if (contactVariables == 2) {
949                                 contact2 = metaData['name']
950                                 this[contact2] = userInput
951                         } else if (contactVariables == 3) {
952                                 contact3 = metaData['name']
953                                 this[contact3] = userInput
954                         } else if (contactVariables == 4) {
955                                 contact4 = metaData['name']
956                                 this[contact4] = userInput
957                         } else if (contactVariables == 5) {
958                                 contact5 = metaData['name']
959                                 this[contact5] = userInput
960                         }
961
962                         contactVariables=contactVariables+1
963
964                         settings.put(metaData['name'], metaData['name'])
965
966                         if (App == "App1") {                    
967                                 extractedObjectsApp1.append("//Global variable for contact!\n")
968                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
969                         } else {
970                                 extractedObjectsApp2.append("//Global variable for contact!\n")
971                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
972                         }
973                         break
974                 default:
975                         break
976         }
977 }
978
979 def label(LinkedHashMap metaData) {
980         if (metaData.containsKey('title')) {
981                 println metaData['title']
982         }
983         if (metaData.containsKey('options')) {
984                 println "Options: "+metaData['options']
985         }
986
987         println("//IGNORE--ForMobileUse//")
988 }
989
990 def mode(LinkedHashMap metaData) {
991         if (metaData.containsKey('title')) {
992                 println metaData['title']
993         }
994         if (metaData.containsKey('options')) {
995                 println "Options: "+metaData['options']
996         }
997
998         println("//IGNORE--ForMobileUse//")
999 }
1000
1001 def href(LinkedHashMap metaData) {
1002         println("//IGNORE--some data//")
1003 }
1004 /////Input Methods/////
1005
1006
1007 /////MethodsForExtraction/////
1008 def definition(LinkedHashMap metaData) {
1009         println("///Just some information///")
1010 }
1011
1012 def preferences(Closure inputData) {
1013         find(inputData) //Run the closure to extract pages/sections/inputMethods
1014         if (App == "App1") {                    
1015                 extractedObjectsConstructorApp1.append("//Global variable for settings!\n")
1016                 extractedObjectsConstructorApp1.append("settings = $settings\n")
1017         } else {
1018                 extractedObjectsConstructorApp2.append("//Global variable for settings!\n")
1019                 extractedObjectsConstructorApp2.append("settings = $settings\n")
1020         }
1021 }
1022
1023 def page(LinkedHashMap metaData, Closure inputData) {
1024         if (metaData.containsKey('name'))
1025                 println(metaData['name'])
1026         if (metaData.containsKey('title'))
1027                 println(metaData['title'])
1028
1029         find(inputData) //Run the closure to extract sections/inputMethods
1030 }
1031
1032 def page(LinkedHashMap metaData) {
1033         def nameOfFunction = metaData['name']
1034         "$nameOfFunction"() //Call the page     
1035 }
1036
1037 def dynamicPage(LinkedHashMap metaData, Closure inputData) {
1038         if (metaData.containsKey('name'))
1039                 println(metaData['name'])
1040         if (metaData.containsKey('title'))
1041                 println(metaData['title'])
1042
1043         find(inputData) //Run the closure to extract sections/inputMethods
1044 }
1045
1046 def paragraph(String paragraphText) {
1047         println(paragraphText)
1048 }
1049
1050 def section(String title, Closure inputData) {
1051         println(title)
1052         find(inputData) //Run the closure to extract inputMethods
1053 }
1054
1055 def section(Closure inputData) {
1056         find(inputData) //Run the closure to extract inputMethods
1057 }
1058
1059 def section(LinkedHashMap metaData, Closure inputData) {
1060         find(inputData) //Run the closure to extract inputMethods
1061 }
1062 /////MethodsForExtraction/////
1063
1064
1065
1066 /**
1067  *  NFC Tag Toggle
1068  *
1069  *  Copyright 2014 SmartThings
1070  *
1071  *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
1072  *  in compliance with the License. You may obtain a copy of the License at:
1073  *
1074  *      http://www.apache.org/licenses/LICENSE-2.0
1075  *
1076  *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
1077  *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
1078  *  for the specific language governing permissions and limitations under the License.
1079  *
1080  */
1081  
1082 definition(
1083     name: "NFC Tag Toggle",
1084     namespace: "smartthings",
1085     author: "SmartThings",
1086     description: "Allows toggling of a switch, lock, or garage door based on an NFC Tag touch event",
1087     category: "SmartThings Internal",
1088     iconUrl: "https://s3.amazonaws.com/smartapp-icons/Developers/nfc-tag-executor.png",
1089     iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Developers/nfc-tag-executor@2x.png",
1090     iconX3Url: "https://s3.amazonaws.com/smartapp-icons/Developers/nfc-tag-executor@2x.png")
1091
1092
1093 preferences {
1094     page(name: "pageOne", title: "Device selection", uninstall: true, nextPage: "pageTwo") {
1095         section("Select an NFC tag") {
1096             input "tag", "capability.touchSensor", title: "NFC Tag"
1097         }
1098         section("Select devices to control") {
1099             input "switch1", "capability.switch", title: "Light or switch", required: false, multiple: true
1100             input "lock", "capability.lock", title: "Lock", required: false, multiple: true
1101             input "garageDoor", "capability.doorControl", title: "Garage door controller", required: false, multiple: true
1102         }
1103     }
1104     
1105     page(name: "pageTwo", title: "Master devices", install: true, uninstall: true)
1106 }
1107
1108 def pageTwo() {
1109         dynamicPage(name: "pageTwo") {
1110         section("If set, the state of these devices will be toggled each time the tag is touched, " + 
1111                 "e.g. a light that's on will be turned off and one that's off will be turned on, " +
1112                 "other devices of the same type will be set to the same state as their master device. " +
1113                 "If no master is designated then the majority of devices of the same type will be used " +
1114                 "to determine whether to turn on or off the devices.") {
1115             
1116             if (switch1 || masterSwitch) {
1117                 input "masterSwitch", "enum", title: "Master switch", options: switch1.collect{[(it.id): it.displayName]}, required: false
1118             }
1119             if (lock || masterLock) {
1120                 input "masterLock", "enum", title: "Master lock", options: lock.collect{[(it.id): it.displayName]}, required: false
1121             }
1122             if (garageDoor || masterDoor) {
1123                 input "masterDoor", "enum", title: "Master door", options: garageDoor.collect{[(it.id): it.displayName]}, required: false
1124             }            
1125                 }
1126                 section([mobileOnly:true]) {
1127                         label title: "Assign a name", required: false
1128                         mode title: "Set for specific mode(s)", required: false
1129                 }        
1130     }
1131 }
1132
1133 def installed() {
1134         log.debug "Installed with settings: ${settings}"
1135
1136         initialize()
1137 }
1138
1139 def updated() {
1140         log.debug "Updated with settings: ${settings}"
1141
1142         unsubscribe()
1143         initialize()
1144 }
1145
1146 def initialize() {
1147         subscribe tag, "nfcTouch", touchHandler
1148     subscribe app, touchHandler
1149 }
1150
1151 private currentStatus(devices, master, attribute) {
1152         log.trace "currentStatus($devices, $master, $attribute)"
1153         def result = null
1154         if (master) {
1155         result = devices.find{it.id == master}?.currentValue(attribute)
1156     }
1157     else {
1158         def map = [:]
1159         devices.each {
1160                 def value = it.currentValue(attribute)
1161             map[value] = (map[value] ?: 0) + 1
1162             log.trace "$it.displayName: $value"
1163         }
1164         log.trace map
1165         result = map.collect{it}.sort{it.value}[-1].key
1166     }
1167     log.debug "$attribute = $result"
1168     result
1169 }
1170
1171 def touchHandler(evt) {
1172         log.trace "touchHandler($evt.descriptionText)"
1173     if (switch1) {
1174         def status = currentStatus(switch1, masterSwitch, "switch")
1175         switch1.each {
1176             if (status == "on") {
1177                 it.off()
1178             }
1179             else {
1180                 it.on()
1181             }
1182         }
1183     }
1184     
1185     if (lock) {
1186         def status = currentStatus(lock, masterLock, "lock")
1187         lock.each {
1188             if (status == "locked") {
1189                 lock.unlock()
1190             }
1191             else {
1192                 lock.lock()
1193             }
1194         }
1195     }
1196     
1197     if (garageDoor) {
1198         def status = currentStatus(garageDoor, masterDoor, "status")
1199         garageDoor.each {
1200                 if (status == "open") {
1201                 it.close()
1202             }
1203             else {
1204                 it.open()
1205             }
1206         }
1207     }
1208 }