4 ////////////////////////////////////////
6 import groovy.transform.Field
11 import ContactSensor.ContactSensor
12 import ContactSensor.ContactSensors
13 import DoorControl.DoorControl
14 import DoorControl.DoorControls
17 import Thermostat.Thermostat
18 import Thermostat.Thermostats
20 import Switch.Switches
21 import PresenceSensor.PresenceSensor
22 import PresenceSensor.PresenceSensors
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
40 import SpeechSynthesis.SpeechSynthesis
41 import SpeechSynthesis.SpeechSynthesises
42 import Timer.SimulatedTimer
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
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")
65 extractedObjectsApp1.write("")
66 extractedObjectsConstructorApp1.write("")
67 } else if (App == "App2") {
68 extractedObjectsApp2.write("")
69 extractedObjectsConstructorApp2.write("")
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
151 @Field modeVariables = 0
159 @Field numberVariables = 0
167 @Field decimalVariables = 0
175 @Field timeVariables = 0
183 @Field enumVariables = 0
191 @Field phoneVariables = 0
199 @Field contactVariables = 0
207 @Field textVariables = 0
215 @Field boolVariables = 0
224 /////Input Methods/////
226 def input(String name, String type) {
227 LinkedHashMap metaData = []
228 metaData.put('name',name)
229 metaData.put('type',type)
233 //input "","",linkedHashMap
234 def input(LinkedHashMap metaData, String name, String type) {
235 metaData.put('name',name)
236 metaData.put('type',type)
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)
248 //input linkedHashMap
249 def input(LinkedHashMap metaData) {
250 if (metaData.containsKey('title')) {
251 println metaData['title']
253 if (metaData.containsKey('options')) {
254 println "Options: "+metaData['options']
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)
269 lockObjects=lockObjects+1
271 settings.put(metaData['name'], metaData['name'])
274 extractedObjectsApp1.append("//Object for class lock!\n")
275 extractedObjectsApp1.append("def "+metaData['name']+"\n")
276 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.lockObject\n")
278 extractedObjectsApp2.append("//Object for class lock!\n")
279 extractedObjectsApp2.append("def "+metaData['name']+"\n")
280 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.lockObject\n")
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)
295 alarmObjects=alarmObjects+1
297 settings.put(metaData['name'], metaData['name'])
300 extractedObjectsApp1.append("//Object for class alarm!\n")
301 extractedObjectsApp1.append("def "+metaData['name']+"\n")
302 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.alarmObject\n")
304 extractedObjectsApp2.append("//Object for class alarm!\n")
305 extractedObjectsApp2.append("def "+metaData['name']+"\n")
306 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.alarmObject\n")
309 case "capability.battery":
311 case "capability.beacon":
313 case "capability.carbonMonoxideDetector":
315 case "capability.colorControl":
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)
329 contactObjects=contactObjects+1
331 settings.put(metaData['name'], metaData['name'])
334 extractedObjectsApp1.append("//Object for class contactSensor!\n")
335 extractedObjectsApp1.append("def "+metaData['name']+"\n")
336 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.contactObject\n")
338 extractedObjectsApp2.append("//Object for class contactSensor!\n")
339 extractedObjectsApp2.append("def "+metaData['name']+"\n")
340 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.contactObject\n")
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)
355 doorControlObjects=doorControlObjects+1
357 settings.put(metaData['name'], metaData['name'])
360 extractedObjectsApp1.append("//Object for class door control!\n")
361 extractedObjectsApp1.append("def "+metaData['name']+"\n")
362 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.doorControlObject\n")
364 extractedObjectsApp2.append("//Object for class door control!\n")
365 extractedObjectsApp2.append("def "+metaData['name']+"\n")
366 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.doorControlObject\n")
369 case "capability.energyMeter":
371 case "capability.illuminanceMeasurement":
373 case "capability.accelerationSensor":
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)
387 motionSensorObjects=motionSensorObjects+1
389 settings.put(metaData['name'], metaData['name'])
392 extractedObjectsApp1.append("//Object for class Motion Sensor!\n")
393 extractedObjectsApp1.append("def "+metaData['name']+"\n")
394 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.motionSensorObject\n")
396 extractedObjectsApp2.append("//Object for class Motion Sensor!\n")
397 extractedObjectsApp2.append("def "+metaData['name']+"\n")
398 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.motionSensorObject\n")
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)
413 musicPlayerObjects=musicPlayerObjects+1
415 settings.put(metaData['name'], metaData['name'])
418 extractedObjectsApp1.append("//Object for class music player!\n")
419 extractedObjectsApp1.append("def "+metaData['name']+"\n")
420 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.musicPlayerObject\n")
422 extractedObjectsApp2.append("//Object for class music player!\n")
423 extractedObjectsApp2.append("def "+metaData['name']+"\n")
424 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.musicPlayerObject\n")
427 case "capability.powerMeter":
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)
441 presenceSensorObjects=presenceSensorObjects+1
443 settings.put(metaData['name'], metaData['name'])
446 extractedObjectsApp1.append("//Object for class presence sensor!\n")
447 extractedObjectsApp1.append("def "+metaData['name']+"\n")
448 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.presenceSensorObject\n")
450 extractedObjectsApp2.append("//Object for class presence sensor!\n")
451 extractedObjectsApp2.append("def "+metaData['name']+"\n")
452 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.presenceSensorObject\n")
455 case "capability.relativeHumidityMeasurement":
457 case "capability.relaySwitch":
459 case "capability.sleepSensor":
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)
473 smokeDetectorObjects=smokeDetectorObjects+1
475 settings.put(metaData['name'], metaData['name'])
478 extractedObjectsApp1.append("//Object for class smoke detector!\n")
479 extractedObjectsApp1.append("def "+metaData['name']+"\n")
480 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.smokeDetectorObject\n")
482 extractedObjectsApp2.append("//Object for class smoke detector!\n")
483 extractedObjectsApp2.append("def "+metaData['name']+"\n")
484 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.smokeDetectorObject\n")
487 case "capability.stepSensor":
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)
501 switchObjects=switchObjects+1
503 settings.put(metaData['name'], metaData['name'])
506 extractedObjectsApp1.append("//Object for class switch!\n")
507 extractedObjectsApp1.append("def "+metaData['name']+"\n")
508 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.switchObject\n")
510 extractedObjectsApp2.append("//Object for class switch!\n")
511 extractedObjectsApp2.append("def "+metaData['name']+"\n")
512 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.switchObject\n")
515 case "capability.switchLevel":
517 case "capability.temperatureMeasurement":
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)
531 thermostatObjects=thermostatObjects+1
533 settings.put(metaData['name'], metaData['name'])
536 extractedObjectsApp1.append("//Object for class thermostat!\n")
537 extractedObjectsApp1.append("def "+metaData['name']+"\n")
538 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.thermostatObject\n")
540 extractedObjectsApp2.append("//Object for class thermostat!\n")
541 extractedObjectsApp2.append("def "+metaData['name']+"\n")
542 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.thermostatObject\n")
545 case "capability.valve":
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)
559 speechSynthesisObjects=speechSynthesisObjects+1
561 settings.put(metaData['name'], metaData['name'])
564 extractedObjectsApp1.append("//Object for class speech synthesis!\n")
565 extractedObjectsApp1.append("def "+metaData['name']+"\n")
566 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.speechSynthesisObject\n")
568 extractedObjectsApp2.append("//Object for class speech synthesis!\n")
569 extractedObjectsApp2.append("def "+metaData['name']+"\n")
570 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.speechSynthesisObject\n")
573 case "capability.waterSensor":
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)
587 touchSensorObjects=touchSensorObjects+1
589 settings.put(metaData['name'], metaData['name'])
592 extractedObjectsApp1.append("//Object for class Touch Sensor!\n")
593 extractedObjectsApp1.append("def "+metaData['name']+"\n")
594 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.touchSensorObject\n")
596 extractedObjectsApp2.append("//Object for class Touch Sensor!\n")
597 extractedObjectsApp2.append("def "+metaData['name']+"\n")
598 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.touchSensorObject\n")
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)
613 imageCaptureObjects=imageCaptureObjects+1
615 settings.put(metaData['name'], metaData['name'])
618 extractedObjectsApp1.append("//Object for class Image Capture!\n")
619 extractedObjectsApp1.append("def "+metaData['name']+"\n")
620 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.imageCaptureObject\n")
622 extractedObjectsApp2.append("//Object for class Image Capture!\n")
623 extractedObjectsApp2.append("def "+metaData['name']+"\n")
624 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.imageCaptureObject\n")
627 case "device.mobilePresence":
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)
641 aeonKeyFobObjects=aeonKeyFobObjects+1
643 settings.put(metaData['name'], metaData['name'])
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")
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")
656 def randomVariable = Math.abs(new Random().nextInt() % 3)
657 def modes = ["away", "home", "night"]
658 def userInput = modes[randomVariable]
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
680 modeVariables=modeVariables+1
682 settings.put(metaData['name'], metaData['name'])
685 extractedObjectsApp1.append("//Global variable for mode!\n")
686 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
688 extractedObjectsApp2.append("//Global variable for mode!\n")
689 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
693 def userInput = Math.abs(new Random().nextInt() % 60) + 40
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
715 decimalVariables=decimalVariables+1
717 settings.put(metaData['name'], metaData['name'])
720 extractedObjectsApp1.append("//Global variable for decimal number!\n")
721 extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
723 extractedObjectsApp2.append("//Global variable for decimal number!\n")
724 extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
728 def userInput = "This is just a text!"
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
750 textVariables=textVariables+1
752 settings.put(metaData['name'], metaData['name'])
755 extractedObjectsApp1.append("//Global variable for text!\n")
756 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
758 extractedObjectsApp2.append("//Global variable for text!\n")
759 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
763 def userInput = Math.abs(new Random().nextInt() % 60) + 40
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
785 numberVariables=numberVariables+1
787 settings.put(metaData['name'], metaData['name'])
790 extractedObjectsApp1.append("//Global variable for number!\n")
791 extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
793 extractedObjectsApp2.append("//Global variable for number!\n")
794 extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
798 def userInput = "15:00"
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
820 timeVariables=timeVariables+1
822 settings.put(metaData['name'], metaData['name'])
825 extractedObjectsApp1.append("//Global variable for time!\n")
826 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
828 extractedObjectsApp2.append("//Global variable for time!\n")
829 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
833 def randomVariable = Math.abs(new Random().nextInt() % 2)
834 def modes = ["Yes", "No"]
835 //def userInput = modes[randomVariable]
837 //def modes = metaData['options']
838 def userInput = modes[0]
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
860 enumVariables=enumVariables+1
862 settings.put(metaData['name'], metaData['name'])
865 extractedObjectsApp1.append("//Global variable for enum!\n")
866 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
868 extractedObjectsApp2.append("//Global variable for enum!\n")
869 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
873 def userInput = Math.abs(new Random().nextInt() % 2)
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
895 boolVariables=boolVariables+1
897 settings.put(metaData['name'], metaData['name'])
900 extractedObjectsApp1.append("//Global variable for boolean!\n")
901 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
903 extractedObjectsApp2.append("//Global variable for boolean!\n")
904 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
908 def userInput = 9495379373
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
930 phoneVariables=phoneVariables+1
932 settings.put(metaData['name'], metaData['name'])
935 extractedObjectsApp1.append("//Global variable for phone!\n")
936 extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
938 extractedObjectsApp2.append("//Global variable for phone!\n")
939 extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
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
965 contactVariables=contactVariables+1
967 settings.put(metaData['name'], metaData['name'])
970 extractedObjectsApp1.append("//Global variable for contact!\n")
971 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
973 extractedObjectsApp2.append("//Global variable for contact!\n")
974 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
982 def label(LinkedHashMap metaData) {
983 if (metaData.containsKey('title')) {
984 println metaData['title']
986 if (metaData.containsKey('options')) {
987 println "Options: "+metaData['options']
990 println("//IGNORE--ForMobileUse//")
993 def mode(LinkedHashMap metaData) {
994 if (metaData.containsKey('title')) {
995 println metaData['title']
997 if (metaData.containsKey('options')) {
998 println "Options: "+metaData['options']
1001 println("//IGNORE--ForMobileUse//")
1004 def href(LinkedHashMap metaData) {
1005 println("//IGNORE--some data//")
1007 /////Input Methods/////
1010 /////MethodsForExtraction/////
1011 def definition(LinkedHashMap metaData) {
1012 println("///Just some information///")
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")
1021 extractedObjectsConstructorApp2.append("//Global variable for settings!\n")
1022 extractedObjectsConstructorApp2.append("settings = $settings\n")
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'])
1032 find(inputData) //Run the closure to extract sections/inputMethods
1035 def page(LinkedHashMap metaData) {
1036 def nameOfFunction = metaData['name']
1037 "$nameOfFunction"() //Call the page
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'])
1046 find(inputData) //Run the closure to extract sections/inputMethods
1049 def paragraph(String paragraphText) {
1050 println(paragraphText)
1053 def section(String title, Closure inputData) {
1055 find(inputData) //Run the closure to extract inputMethods
1058 def section(Closure inputData) {
1059 find(inputData) //Run the closure to extract inputMethods
1062 def section(LinkedHashMap metaData, Closure inputData) {
1063 find(inputData) //Run the closure to extract inputMethods
1065 /////MethodsForExtraction/////
1070 * Copyright 2015 SmartThings
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:
1075 * http://www.apache.org/licenses/LICENSE-2.0
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.
1083 * Author: SmartThings
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"
1097 section("Switches") {
1098 input "switches", "capability.switch", multiple: true, required: false
1100 section("Thermostats") {
1101 input "thermostats", "capability.thermostat", multiple: true, required: false
1104 input "locks", "capability.lock", multiple: true, required: false
1109 subscribe(location, changedLocationMode)
1110 subscribe(app, appTouch)
1116 subscribe(location, changedLocationMode)
1117 subscribe(app, appTouch)
1123 restoreState(currentMode)
1126 def changedLocationMode(evt)
1128 restoreState(evt.value)
1131 private restoreState(mode)
1133 log.info "restoring state for mode '$mode'"
1134 def map = state[mode] ?: [:]
1136 def value = map[it.id]
1137 if (value?.switch == "on") {
1138 def level = value.level
1140 log.debug "setting $it.label level to $level"
1144 log.debug "turning $it.label on"
1148 else if (value?.switch == "off") {
1149 log.debug "turning $it.label off"
1155 def value = map[it.id]
1156 if (value?.coolingSetpoint) {
1157 log.debug "coolingSetpoint = $value.coolingSetpoint"
1158 it.setCoolingSetpoint(value.coolingSetpoint)
1160 if (value?.heatingSetpoint) {
1161 log.debug "heatingSetpoint = $value.heatingSetpoint"
1162 it.setHeatingSetpoint(value.heatingSetpoint)
1167 def value = map[it.id]
1169 if (value?.locked) {
1182 def mode = currentMode
1183 def map = state[mode] ?: [:]
1186 map[it.id] = [switch: it.currentSwitch, level: it.currentLevel]
1190 map[it.id] = [coolingSetpoint: it.currentCoolingSetpoint, heatingSetpoint: it.currentHeatingSetpoint]
1194 map[it.id] = [locked: it.currentLock == "locked"]
1198 log.debug "saved state for mode ${mode}: ${state[mode]}"
1199 log.debug "state: $state"
1202 private getCurrentMode()
1204 location.mode ?: "_none_"