Limiting iteration for now (DFSearch strategy would just go deep unceasingly); Comple...
[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                         // TODO: We 
837                         //def modes = metaData['options']
838                         def userInput = modes[0]
839         
840                         if (enumVariables == 0) {
841                                 enum0 = metaData['name']
842                                 this[enum0] = userInput
843                         } else if (enumVariables == 1) {
844                                 enum1 = metaData['name']
845                                 this[enum1] = userInput
846                         } else if (enumVariables == 2) {
847                                 enum2 = metaData['name']
848                                 this[enum2] = userInput
849                         } else if (enumVariables == 3) {
850                                 enum3 = metaData['name']
851                                 this[enum3] = userInput
852                         } else if (enumVariables == 4) {
853                                 enum4 = metaData['name']
854                                 this[enum4] = userInput
855                         } else if (enumVariables == 5) {
856                                 enum5 = metaData['name']
857                                 this[enum5] = userInput
858                         }
859
860                         enumVariables=enumVariables+1
861
862                         settings.put(metaData['name'], metaData['name'])
863
864                         if (App == "App1") {                    
865                                 extractedObjectsApp1.append("//Global variable for enum!\n")
866                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
867                         } else {
868                                 extractedObjectsApp2.append("//Global variable for enum!\n")
869                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
870                         }
871                         break
872                 case "bool":
873                         def userInput = Math.abs(new Random().nextInt() % 2)
874         
875                         if (boolVariables == 0) {
876                                 bool0 = metaData['name']
877                                 this[bool0] = userInput
878                         } else if (boolVariables == 1) {
879                                 bool1 = metaData['name']
880                                 this[bool1] = userInput
881                         } else if (boolVariables == 2) {
882                                 bool2 = metaData['name']
883                                 this[bool2] = userInput
884                         } else if (boolVariables == 3) {
885                                 bool3 = metaData['name']
886                                 this[bool3] = userInput
887                         } else if (boolVariables == 4) {
888                                 bool4 = metaData['name']
889                                 this[bool4] = userInput
890                         } else if (boolVariables == 5) {
891                                 bool5 = metaData['name']
892                                 this[bool5] = userInput
893                         }
894
895                         boolVariables=boolVariables+1
896
897                         settings.put(metaData['name'], metaData['name'])
898
899                         if (App == "App1") {                    
900                                 extractedObjectsApp1.append("//Global variable for boolean!\n")
901                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
902                         } else {
903                                 extractedObjectsApp2.append("//Global variable for boolean!\n")
904                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
905                         }
906                         break
907                 case "phone":
908                         def userInput = 9495379373
909
910                         if (phoneVariables == 0) {
911                                 phone0 = metaData['name']
912                                 this[phone0] = userInput
913                         } else if (phoneVariables == 1) {
914                                 phone1 = metaData['name']
915                                 this[phone1] = userInput
916                         } else if (phoneVariables == 2) {
917                                 phone2 = metaData['name']
918                                 this[phone2] = userInput
919                         } else if (phoneVariables == 3) {
920                                 phone3 = metaData['name']
921                                 this[phone3] = userInput
922                         } else if (phoneVariables == 4) {
923                                 phone4 = metaData['name']
924                                 this[phone4] = userInput
925                         } else if (phoneVariables == 5) {
926                                 phone5 = metaData['name']
927                                 this[phone5] = userInput
928                         }
929
930                         phoneVariables=phoneVariables+1
931
932                         settings.put(metaData['name'], metaData['name'])
933
934                         if (App == "App1") {                    
935                                 extractedObjectsApp1.append("//Global variable for phone!\n")
936                                 extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
937                         } else {
938                                 extractedObjectsApp2.append("//Global variable for phone!\n")
939                                 extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
940                         }
941                         break
942                 case "contact":
943                         def userInput = "AJ"
944         
945                         if (contactVariables == 0) {
946                                 contact0 = metaData['name']
947                                 this[contact0] = userInput
948                         } else if (contactVariables == 1) {
949                                 contact1 = metaData['name']
950                                 this[contact1] = userInput
951                         } else if (contactVariables == 2) {
952                                 contact2 = metaData['name']
953                                 this[contact2] = userInput
954                         } else if (contactVariables == 3) {
955                                 contact3 = metaData['name']
956                                 this[contact3] = userInput
957                         } else if (contactVariables == 4) {
958                                 contact4 = metaData['name']
959                                 this[contact4] = userInput
960                         } else if (contactVariables == 5) {
961                                 contact5 = metaData['name']
962                                 this[contact5] = userInput
963                         }
964
965                         contactVariables=contactVariables+1
966
967                         settings.put(metaData['name'], metaData['name'])
968
969                         if (App == "App1") {                    
970                                 extractedObjectsApp1.append("//Global variable for contact!\n")
971                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
972                         } else {
973                                 extractedObjectsApp2.append("//Global variable for contact!\n")
974                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
975                         }
976                         break
977                 default:
978                         break
979         }
980 }
981
982 def label(LinkedHashMap metaData) {
983         if (metaData.containsKey('title')) {
984                 println metaData['title']
985         }
986         if (metaData.containsKey('options')) {
987                 println "Options: "+metaData['options']
988         }
989
990         println("//IGNORE--ForMobileUse//")
991 }
992
993 def mode(LinkedHashMap metaData) {
994         if (metaData.containsKey('title')) {
995                 println metaData['title']
996         }
997         if (metaData.containsKey('options')) {
998                 println "Options: "+metaData['options']
999         }
1000
1001         println("//IGNORE--ForMobileUse//")
1002 }
1003
1004 def href(LinkedHashMap metaData) {
1005         println("//IGNORE--some data//")
1006 }
1007 /////Input Methods/////
1008
1009
1010 /////MethodsForExtraction/////
1011 def definition(LinkedHashMap metaData) {
1012         println("///Just some information///")
1013 }
1014
1015 def preferences(Closure inputData) {
1016         find(inputData) //Run the closure to extract pages/sections/inputMethods
1017         if (App == "App1") {                    
1018                 extractedObjectsConstructorApp1.append("//Global variable for settings!\n")
1019                 extractedObjectsConstructorApp1.append("settings = $settings\n")
1020         } else {
1021                 extractedObjectsConstructorApp2.append("//Global variable for settings!\n")
1022                 extractedObjectsConstructorApp2.append("settings = $settings\n")
1023         }
1024 }
1025
1026 def page(LinkedHashMap metaData, Closure inputData) {
1027         if (metaData.containsKey('name'))
1028                 println(metaData['name'])
1029         if (metaData.containsKey('title'))
1030                 println(metaData['title'])
1031
1032         find(inputData) //Run the closure to extract sections/inputMethods
1033 }
1034
1035 def page(LinkedHashMap metaData) {
1036         def nameOfFunction = metaData['name']
1037         "$nameOfFunction"() //Call the page     
1038 }
1039
1040 def dynamicPage(LinkedHashMap metaData, Closure inputData) {
1041         if (metaData.containsKey('name'))
1042                 println(metaData['name'])
1043         if (metaData.containsKey('title'))
1044                 println(metaData['title'])
1045
1046         find(inputData) //Run the closure to extract sections/inputMethods
1047 }
1048
1049 def paragraph(String paragraphText) {
1050         println(paragraphText)
1051 }
1052
1053 def section(String title, Closure inputData) {
1054         println(title)
1055         find(inputData) //Run the closure to extract inputMethods
1056 }
1057
1058 def section(Closure inputData) {
1059         find(inputData) //Run the closure to extract inputMethods
1060 }
1061
1062 def section(LinkedHashMap metaData, Closure inputData) {
1063         find(inputData) //Run the closure to extract inputMethods
1064 }
1065 /////MethodsForExtraction/////
1066
1067
1068
1069 /**
1070  *  Copyright 2015 SmartThings
1071  *
1072  *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
1073  *  in compliance with the License. You may obtain a copy of the License at:
1074  *
1075  *      http://www.apache.org/licenses/LICENSE-2.0
1076  *
1077  *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
1078  *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
1079  *  for the specific language governing permissions and limitations under the License.
1080  *
1081  *  Make it So
1082  *
1083  *  Author: SmartThings
1084  *  Date: 2013-03-06
1085  */
1086 definition(
1087     name: "Make It So",
1088     namespace: "smartthings",
1089     author: "SmartThings",
1090     description: "Saves the states of a specified set switches and thermostat setpoints and restores them at each mode change. To use 1) Set the mode, 2) Change switches and setpoint to where you want them for that mode, and 3) Install or update the app. Changing to that mode or touching the app will set the devices to the saved state.",
1091     category: "Convenience",
1092     iconUrl: "https://s3.amazonaws.com/smartapp-icons/Meta/light_thermo-switch.png",
1093     iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Meta/light_thermo-switch@2x.png"
1094 )
1095
1096 preferences {
1097         section("Switches") {
1098                 input "switches", "capability.switch", multiple: true, required: false
1099         }
1100         section("Thermostats") {
1101                 input "thermostats", "capability.thermostat", multiple: true, required: false
1102         }
1103         section("Locks") {
1104                 input "locks", "capability.lock", multiple: true, required: false
1105         }
1106 }
1107
1108 def installed() {
1109         subscribe(location, changedLocationMode)
1110         subscribe(app, appTouch)
1111         saveState()
1112 }
1113
1114 def updated() {
1115         unsubscribe()
1116         subscribe(location, changedLocationMode)
1117         subscribe(app, appTouch)
1118         saveState()
1119 }
1120
1121 def appTouch(evt)
1122 {
1123         restoreState(currentMode)
1124 }
1125
1126 def changedLocationMode(evt)
1127 {
1128         restoreState(evt.value)
1129 }
1130
1131 private restoreState(mode)
1132 {
1133         log.info "restoring state for mode '$mode'"
1134         def map = state[mode] ?: [:]
1135         switches?.each {
1136                 def value = map[it.id]
1137                 if (value?.switch == "on") {
1138                         def level = value.level
1139                         if (level) {
1140                                 log.debug "setting $it.label level to $level"
1141                                 it.setLevel(level)
1142                         }
1143                         else {
1144                                 log.debug "turning $it.label on"
1145                                 it.on()
1146                         }
1147                 }
1148                 else if (value?.switch == "off") {
1149                         log.debug "turning $it.label off"
1150                         it.off()
1151                 }
1152         }
1153
1154         thermostats?.each {
1155                 def value = map[it.id]
1156                 if (value?.coolingSetpoint) {
1157                         log.debug "coolingSetpoint = $value.coolingSetpoint"
1158                         it.setCoolingSetpoint(value.coolingSetpoint)
1159                 }
1160                 if (value?.heatingSetpoint) {
1161                         log.debug "heatingSetpoint = $value.heatingSetpoint"
1162                         it.setHeatingSetpoint(value.heatingSetpoint)
1163                 }
1164         }
1165
1166         locks?.each {
1167                 def value = map[it.id]
1168                 if (value) {
1169                         if (value?.locked) {
1170                                 it.lock()
1171                         }
1172                         else {
1173                                 it.unlock()
1174                         }
1175                 }
1176         }
1177 }
1178
1179
1180 private saveState()
1181 {
1182         def mode = currentMode
1183         def map = state[mode] ?: [:]
1184
1185         switches?.each {
1186                 map[it.id] = [switch: it.currentSwitch, level: it.currentLevel]
1187         }
1188
1189         thermostats?.each {
1190                 map[it.id] = [coolingSetpoint: it.currentCoolingSetpoint, heatingSetpoint: it.currentHeatingSetpoint]
1191         }
1192
1193         locks?.each {
1194                 map[it.id] = [locked: it.currentLock == "locked"]
1195         }
1196
1197         state[mode] = map
1198         log.debug "saved state for mode ${mode}: ${state[mode]}"
1199         log.debug "state: $state"
1200 }
1201
1202 private getCurrentMode()
1203 {
1204         location.mode ?: "_none_"
1205 }