sme minor changes
[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 AccelerationSensor.AccelerationSensor
43 import AccelerationSensor.AccelerationSensors
44 import Battery.Battery
45 import Battery.Batteries
46 import BeaconSensor.BeaconSensor
47 import BeaconSensor.BeaconSensors
48 import CarbonMonoxideDetector.CarbonMonoxideDetector
49 import CarbonMonoxideDetector.CarbonMonoxideDetectors
50 import ColorControl.ColorControl
51 import ColorControl.ColorControls
52 import EnergyMeter.EnergyMeter
53 import EnergyMeter.EnergyMeters
54 import IlluminanceMeasurement.IlluminanceMeasurement
55 import IlluminanceMeasurement.IlluminanceMeasurements
56 import PowerMeter.PowerMeter
57 import PowerMeter.PowerMeters
58 import RelativeHumidityMeasurement.RelativeHumidityMeasurement
59 import RelativeHumidityMeasurement.RelativeHumidityMeasurements
60 import RelaySwitch.RelaySwitch
61 import RelaySwitch.RelaySwitches
62 import SleepSensor.SleepSensor
63 import SleepSensor.SleepSensors
64 import StepSensor.StepSensor
65 import StepSensor.StepSensors
66 import SwitchLevel.SwitchLevel
67 import SwitchLevel.SwitchLevels
68 import TemperatureMeasurement.TemperatureMeasurement
69 import TemperatureMeasurement.TemperatureMeasurements
70 import WaterSensor.WaterSensor
71 import WaterSensor.WaterSensors
72 import Valve.Valve
73 import Valve.Valves
74 import MobilePresence.MobilePresence
75 import MobilePresence.MobilePresences
76 import Timer.SimulatedTimer
77
78 //GlobalVariables
79 @Field def location = new LocationVar()
80 //Settings variable defined to settings on purpose
81 @Field def settings = [app: "app"]
82 //Global variable for state[mode]
83 @Field def state = [home:[],away:[],night:[]]
84 //Create a global logger object for methods
85 @Field def log = new Logger()
86 //Create a global variable for optional property
87 @Field def optional = false //by default for now
88
89
90 //Global variables for files
91 @Field File extractedObjectsApp1 = new File("Extractor/App1/extractedObjectsApp1.groovy")
92 @Field File extractedObjectsApp2 = new File("Extractor/App2/extractedObjectsApp2.groovy")
93 @Field File extractedObjectsConstructorApp1 = new File("Extractor/App1/extractedObjectsConstructorApp1.groovy")
94 @Field File extractedObjectsConstructorApp2 = new File("Extractor/App2/extractedObjectsConstructorApp2.groovy")
95
96
97 //Empty the files
98 if (App == "App1") {
99         extractedObjectsApp1.write("")
100         extractedObjectsConstructorApp1.write("")
101 } else if (App == "App2") {
102         extractedObjectsApp2.write("")
103         extractedObjectsConstructorApp2.write("")
104 }
105
106
107
108 //Some of methods-May be needed even in install
109 /////////////////////////////////////////////////////////////////////
110 def timeToday(String time, Object timeZone) {
111         def timeOfDay = new Date()
112         def _inputTime = time.split(':')
113         def inputTime = Integer.parseInt(_inputTime[0])*3600+Integer.parseInt(_inputTime[1])*60+1564191100415
114         timeOfDay.time = inputTime
115         return timeOfDay
116 }
117
118
119
120 //Global objects
121 //Global Object for class Touch Sensor!
122 @Field touchSensorObjects = 0
123 @Field def touchSensorObject0
124 @Field def touchSensorObject1
125 @Field def touchSensorObject2
126 //Global Object for class switch!
127 @Field switchObjects = 0
128 @Field def switchObject0
129 @Field def switchObject1
130 @Field def switchObject2
131 //Global Object for class lock!
132 @Field lockObjects = 0
133 @Field def lockObject0
134 @Field def lockObject1
135 @Field def lockObject2
136 //Global Object for class door control!
137 @Field doorControlObjects = 0
138 @Field def doorControlObject0
139 @Field def doorControlObject1
140 @Field def doorControlObject2
141 //Global Object for class contact sensor!
142 @Field contactObjects = 0
143 @Field def contactObject0
144 @Field def contactObject1
145 @Field def contactObject2
146 //Global Object for class presence sensor!
147 @Field presenceSensorObjects = 0
148 @Field def presenceSensorObject0
149 @Field def presenceSensorObject1
150 @Field def presenceSensorObject2
151 //Global Object for class thermostat!
152 @Field thermostatObjects = 0
153 @Field def thermostatObject0
154 @Field def thermostatObject1
155 @Field def thermostatObject2
156 //Global Object for class music player!
157 @Field musicPlayerObjects = 0
158 @Field def musicPlayerObject0
159 @Field def musicPlayerObject1
160 @Field def musicPlayerObject2
161 //Global Object for class aeon key fob!
162 @Field aeonKeyFobObjects = 0
163 @Field def aeonKeyFobObject0
164 @Field def aeonKeyFobObject1
165 @Field def aeonKeyFobObject2
166 //Global Object for class motion sensor!
167 @Field motionSensorObjects = 0
168 @Field def motionSensorObject0
169 @Field def motionSensorObject1
170 @Field def motionSensorObject2
171 //Global Object for class image capture!
172 @Field imageCaptureObjects = 0
173 @Field def imageCaptureObject0
174 @Field def imageCaptureObject1
175 @Field def imageCaptureObject2
176 //Global Object for class smoke detector!
177 @Field smokeDetectorObjects = 0
178 @Field def smokeDetectorObject0
179 @Field def smokeDetectorObject1
180 @Field def smokeDetectorObject2
181 //Global Object for class alarm!
182 @Field alarmObjects = 0
183 @Field def alarmObject0
184 @Field def alarmObject1
185 @Field def alarmObject2
186 //Global Object for class speech synthesis!
187 @Field speechSynthesisObjects = 0
188 @Field def speechSynthesisObject0
189 @Field def speechSynthesisObject1
190 @Field def speechSynthesisObject2
191 //Global Object for class acceleration sensor!
192 @Field accelerationSensorObjects = 0
193 @Field def accelerationSensorObject0
194 @Field def accelerationSensorObject1
195 @Field def accelerationSensorObject2
196 //Global Object for class battery!
197 @Field batteryObjects = 0
198 @Field def batteryObject0
199 @Field def batteryObject1
200 @Field def batteryObject2
201 //Global Object for class beacon sensor!
202 @Field beaconSensorObjects = 0
203 @Field def beaconSensorObject0
204 @Field def beaconSensorObject1
205 @Field def beaconSensorObject2
206 //Global Object for class carbon monoxide detector!
207 @Field carbonMonoxideDetectorObjects = 0
208 @Field def carbonMonoxideDetectorObject0
209 @Field def carbonMonoxideDetectorObject1
210 @Field def carbonMonoxideDetectorObject2
211 //Global Object for class color control!
212 @Field colorControlObjects = 0
213 @Field def colorControlObject0
214 @Field def colorControlObject1
215 @Field def colorControlObject2
216 //Global Object for class energy meter!
217 @Field energyMeterObjects = 0
218 @Field def energyMeterObject0
219 @Field def energyMeterObject1
220 @Field def energyMeterObject2
221 //Global Object for class energy meter!
222 @Field illuminanceMeasurementObjects = 0
223 @Field def illuminanceMeasurementObject0
224 @Field def illuminanceMeasurementObject1
225 @Field def illuminanceMeasurementObject2
226 //Global Object for class power meter!
227 @Field powerMeterObjects = 0
228 @Field def powerMeterObject0
229 @Field def powerMeterObject1
230 @Field def powerMeterObject2
231 //Global Object for class power meter!
232 @Field humidityMeasurementObjects = 0
233 @Field def humidityMeasurementObject0
234 @Field def humidityMeasurementObject1
235 @Field def humidityMeasurementObject2
236 //Global Object for class relay switch!
237 @Field relaySwitchObjects = 0
238 @Field def relaySwitchObject0
239 @Field def relaySwitchObject1
240 @Field def relaySwitchObject2
241 //Global Object for class sleep sensor!
242 @Field sleepSensorObjects = 0
243 @Field def sleepSensorObject0
244 @Field def sleepSensorObject1
245 @Field def sleepSensorObject2
246 //Global Object for class sleep sensor!
247 @Field stepSensorObjects = 0
248 @Field def stepSensorObject0
249 @Field def stepSensorObject1
250 @Field def stepSensorObject2
251 //Global Object for class switch level!
252 @Field switchLevelObjects = 0
253 @Field def switchLevelObject0
254 @Field def switchLevelObject1
255 @Field def switchLevelObject2
256 //Global Object for class temperature measurement!
257 @Field temperatureMeasurementObjects = 0
258 @Field def temperatureMeasurementObject0
259 @Field def temperatureMeasurementObject1
260 @Field def temperatureMeasurementObject2
261 //Global Object for class temperature measurement!
262 @Field waterSensorObjects = 0
263 @Field def waterSensorObject0
264 @Field def waterSensorObject1
265 @Field def waterSensorObject2
266 //Global Object for class valve!
267 @Field valveObjects = 0
268 @Field def valveObject0
269 @Field def valveObject1
270 @Field def valveObject2
271 //Global Object for class valve!
272 @Field mobilePresenceObjects = 0
273 @Field def mobilePresenceObject0
274 @Field def mobilePresenceObject1
275 @Field def mobilePresenceObject2
276
277
278
279 //Global variables
280 //For mode
281 @Field modeVariables = 0
282 @Field mode0
283 @Field mode1
284 @Field mode2
285 @Field mode3
286 @Field mode4
287 @Field mode5
288 //For number
289 @Field numberVariables = 0
290 @Field number0
291 @Field number1
292 @Field number2
293 @Field number3
294 @Field number4
295 @Field number5
296 //For decimal
297 @Field decimalVariables = 0
298 @Field decimal0
299 @Field decimal1
300 @Field decimal2
301 @Field decimal3
302 @Field decimal4
303 @Field decimal5
304 //For time
305 @Field timeVariables = 0
306 @Field time0
307 @Field time1
308 @Field time2
309 @Field time3
310 @Field time4
311 @Field time5
312 //For enum
313 @Field enumVariables = 0
314 @Field enum0
315 @Field enum1
316 @Field enum2
317 @Field enum3
318 @Field enum4
319 @Field enum5
320 //For phone
321 @Field phoneVariables = 0
322 @Field phone0
323 @Field phone1
324 @Field phone2
325 @Field phone3
326 @Field phone4
327 @Field phone5
328 //For contact
329 @Field contactVariables = 0
330 @Field contact0
331 @Field contact1
332 @Field contact2
333 @Field contact3
334 @Field contact4
335 @Field contact5
336 //For text
337 @Field textVariables = 0
338 @Field textVariable0
339 @Field textVariable1
340 @Field textVariable2
341 @Field textVariable3
342 @Field textVariable4
343 @Field textVariable5
344 //For boolean
345 @Field boolVariables = 0
346 @Field boolVariable0
347 @Field boolVariable1
348 @Field boolVariable2
349 @Field boolVariable3
350 @Field boolVariable4
351 @Field boolVariable5
352
353
354 /////Input Methods/////
355 //input "",""
356 def input(String name, String type) {
357         LinkedHashMap metaData = []
358         metaData.put('name',name)
359         metaData.put('type',type)
360         input(metaData)
361 }
362
363 //input "","",linkedHashMap
364 def input(LinkedHashMap metaData, String name, String type) {
365         metaData.put('name',name)
366         metaData.put('type',type)
367         input(metaData)
368 }
369
370 //input "", "", linkedHashMap, Closure
371 def input(LinkedHashMap metaData, String name, String type, Closure Input) {
372         metaData.put('name',name)
373         metaData.put('type',type)
374         input(metaData)
375         find(Input)
376 }
377
378 //input linkedHashMap
379 def input(LinkedHashMap metaData) {
380         if (metaData.containsKey('title')) {
381                 println metaData['title']
382         }
383         if (metaData.containsKey('options')) {
384                 println "Options: "+metaData['options']
385         }
386         switch(metaData['type']) {
387                 case "capability.lock":
388                         if (lockObjects == 0) {
389                                 lockObject0 = metaData['name']
390                                 this[lockObject0] = new Locks({}, 1)
391                         } else if (lockObjects == 1) {
392                                 lockObject1 = metaData['name']
393                                 this[lockObject1] = new Locks({}, 1)
394                         } else if (lockObjects == 2) {
395                                 lockObject2 = metaData['name']
396                                 this[lockObject2] = new Locks({}, 1)
397                         }
398
399                         lockObjects=lockObjects+1
400
401                         settings.put(metaData['name'], metaData['name']) 
402
403                         if (App == "App1") {
404                                 extractedObjectsApp1.append("//Object for class lock!\n")
405                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
406                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.lockObject\n")          
407                         } else {
408                                 extractedObjectsApp2.append("//Object for class lock!\n")
409                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
410                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.lockObject\n")
411                         }
412                         break
413                 case "capability.alarm":
414                         if (alarmObjects == 0) {
415                                 alarmObject0 = metaData['name']
416                                 this[alarmObject0] = new Alarms({}, 1)
417                         } else if (alarmObjects == 1) {
418                                 alarmObject1 = metaData['name']
419                                 this[alarmObject1] = new Alarms({}, 1)
420                         } else if (alarmObjects == 2) {
421                                 alarmObject2 = metaData['name']
422                                 this[alarmObject2] = new Alarms({}, 1)
423                         }
424
425                         alarmObjects=alarmObjects+1
426
427                         settings.put(metaData['name'], metaData['name']) 
428
429                         if (App == "App1") {
430                                 extractedObjectsApp1.append("//Object for class alarm!\n")
431                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
432                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.alarmObject\n")         
433                         } else {
434                                 extractedObjectsApp2.append("//Object for class alarm!\n")
435                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
436                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.alarmObject\n")
437                         }
438                         break
439                 case "capability.battery":
440                         if (batteryObjects == 0) {
441                                 batteryObject0 = metaData['name']
442                                 this[batteryObject0] = new Batteries({}, 1)
443                         } else if (batteryObjects == 1) {
444                                 batteryObject1 = metaData['name']
445                                 this[batteryObject1] = new Batteries({}, 1)
446                         } else if (batteryObjects == 2) {
447                                 batteryObject2 = metaData['name']
448                                 this[batteryObject2] = new Batteries({}, 1)
449                         }
450
451                         batteryObjects=batteryObjects+1
452
453                         settings.put(metaData['name'], metaData['name'])
454
455                         if (App == "App1") {
456                                 extractedObjectsApp1.append("//Object for class Battery!\n")
457                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
458                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.batteryObject\n")               
459                         } else {
460                                 extractedObjectsApp2.append("//Object for class Battery!\n")
461                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
462                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.batteryObject\n")
463                         }
464                         break
465                 case "capability.beacon":
466                         if (beaconSensorObjects == 0) {
467                                 beaconSensorObject0 = metaData['name']
468                                 this[beaconSensorObject0] = new BeaconSensors({}, 1)
469                         } else if (beaconSensorObjects == 1) {
470                                 beaconSensorObject1 = metaData['name']
471                                 this[beaconSensorObject1] = new BeaconSensors({}, 1)
472                         } else if (beaconSensorObjects == 2) {
473                                 beaconSensorObject2 = metaData['name']
474                                 this[beaconSensorObject2] = new BeaconSensors({}, 1)
475                         }
476
477                         beaconSensorObjects=beaconSensorObjects+1
478
479                         settings.put(metaData['name'], metaData['name'])
480
481                         if (App == "App1") {
482                                 extractedObjectsApp1.append("//Object for class beacon sensor!\n")
483                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
484                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.beaconSensorObject\n")          
485                         } else {
486                                 extractedObjectsApp2.append("//Object for class beacon sensor!\n")
487                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
488                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.beaconSensorObject\n")
489                         }
490                         break
491                 case "capability.carbonMonoxideDetector":
492                         if (carbonMonoxideDetectorObjects == 0) {
493                                 carbonMonoxideDetectorObject0 = metaData['name']
494                                 this[carbonMonoxideDetectorObject0] = new CarbonMonoxideDetectors({}, 1)
495                         } else if (carbonMonoxideDetectorObjects == 1) {
496                                 carbonMonoxideDetectorObject1 = metaData['name']
497                                 this[carbonMonoxideDetectorObject1] = new CarbonMonoxideDetectors({}, 1)
498                         } else if (carbonMonoxideDetectorObjects == 2) {
499                                 carbonMonoxideDetectorObject2 = metaData['name']
500                                 this[carbonMonoxideDetectorObject2] = new CarbonMonoxideDetectors({}, 1)
501                         }
502
503                         carbonMonoxideDetectorObjects=carbonMonoxideDetectorObjects+1
504                         
505                         settings.put(metaData['name'], metaData['name'])
506
507                         if (App == "App1") {
508                                 extractedObjectsApp1.append("//Object for class carbon monoxide detector!\n")
509                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
510                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.carbonMonoxideDetectorObject\n")                
511                         } else {
512                                 extractedObjectsApp2.append("//Object for class carbon monoxide detector!\n")
513                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
514                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.carbonMonoxideDetectorObject\n")
515                         }
516                         break
517                 case "capability.colorControl":
518                         if (colorControlObjects == 0) {
519                                 colorControlObject0 = metaData['name']
520                                 this[colorControlObject0] = new ColorControls({}, 1)
521                         } else if (colorControlObjects == 1) {
522                                 colorControlObject1 = metaData['name']
523                                 this[colorControlObject1] = new ColorControls({}, 1)
524                         } else if (colorControlObjects == 2) {
525                                 colorControlObject2 = metaData['name']
526                                 this[colorControlObject2] = new ColorControls({}, 1)
527                         }
528
529                         colorControlObjects=colorControlObjects+1
530
531                         settings.put(metaData['name'], metaData['name'])
532
533                         if (App == "App1") {
534                                 extractedObjectsApp1.append("//Object for class color control!\n")
535                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
536                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.colorControlObject\n")          
537                         } else {
538                                 extractedObjectsApp2.append("//Object for class color control!\n")
539                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
540                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.colorControlObject\n")
541                         }
542                         break
543                 case "capability.contactSensor":
544                         if (contactObjects == 0) {
545                                 contactObject0 = metaData['name']
546                                 this[contactObject0] = new ContactSensors({}, 1)
547                         } else if (contactObjects == 1) {
548                                 contactObject1 = metaData['name']
549                                 this[contactObject1] = new ContactSensors({}, 1)
550                         } else if (contactObjects == 2) {
551                                 contactObject2 = metaData['name']
552                                 this[contactObject2] = new ContactSensors({}, 1)
553                         }
554
555                         contactObjects=contactObjects+1
556
557                         settings.put(metaData['name'], metaData['name'])
558
559                         if (App == "App1") {
560                                 extractedObjectsApp1.append("//Object for class contactSensor!\n")
561                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
562                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.contactObject\n")               
563                         } else {
564                                 extractedObjectsApp2.append("//Object for class contactSensor!\n")
565                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
566                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.contactObject\n")
567                         }
568                         break
569                 case "capability.doorControl":
570                         if (doorControlObjects == 0) {
571                                 doorControlObject0 = metaData['name']
572                                 this[doorControlObject0] = new DoorControls({}, 1)
573                         } else if (doorControlObjects == 1) {
574                                 doorControlObject1 = metaData['name']
575                                 this[doorControlObject1] = new DoorControls({}, 1)
576                         } else if (doorControlObjects == 2) {
577                                 doorControlObject2 = metaData['name']
578                                 this[doorControlObject2] = new DoorControls({}, 1)
579                         }
580
581                         doorControlObjects=doorControlObjects+1
582
583                         settings.put(metaData['name'], metaData['name'])
584
585                         if (App == "App1") {
586                                 extractedObjectsApp1.append("//Object for class door control!\n")
587                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
588                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.doorControlObject\n")           
589                         } else {
590                                 extractedObjectsApp2.append("//Object for class door control!\n")
591                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
592                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.doorControlObject\n")
593                         }
594                         break
595                 case "capability.energyMeter":
596                         if (energyMeterObjects == 0) {
597                                 energyMeterObject0 = metaData['name']
598                                 this[energyMeterObject0] = new EnergyMeters({}, 1)
599                         } else if (energyMeterObjects == 1) {
600                                 energyMeterObject1 = metaData['name']
601                                 this[energyMeterObject1] = new EnergyMeters({}, 1)
602                         } else if (energyMeterObjects == 2) {
603                                 energyMeterObject2 = metaData['name']
604                                 this[energyMeterObject2] = new EnergyMeters({}, 1)
605                         }
606
607                         energyMeterObjects=energyMeterObjects+1
608
609                         settings.put(metaData['name'], metaData['name'])
610
611                         if (App == "App1") {
612                                 extractedObjectsApp1.append("//Object for class energy meter!\n")
613                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
614                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.energyMeterObject\n")           
615                         } else {
616                                 extractedObjectsApp2.append("//Object for class energy meter!\n")
617                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
618                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.energyMeterObject\n")
619                         }
620                         break
621                 case "capability.illuminanceMeasurement":
622                         if (illuminanceMeasurementObjects == 0) {
623                                 illuminanceMeasurementObject0 = metaData['name']
624                                 this[illuminanceMeasurementObject0] = new IlluminanceMeasurements({}, 1)
625                         } else if (illuminanceMeasurementObjects == 1) {
626                                 illuminanceMeasurementObject1 = metaData['name']
627                                 this[illuminanceMeasurementObject1] = new IlluminanceMeasurements({}, 1)
628                         } else if (illuminanceMeasurementObjects == 2) {
629                                 illuminanceMeasurementObject2 = metaData['name']
630                                 this[illuminanceMeasurementObject2] = new IlluminanceMeasurements({}, 1)
631                         }
632
633                         illuminanceMeasurementObjects=illuminanceMeasurementObjects+1
634
635                         settings.put(metaData['name'], metaData['name'])
636
637                         if (App == "App1") {
638                                 extractedObjectsApp1.append("//Object for class illuminance measurement!\n")
639                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
640                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.illuminanceMeasurementObject\n")                
641                         } else {
642                                 extractedObjectsApp2.append("//Object for class illuminance measurement!\n")
643                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
644                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.illuminanceMeasurementObject\n")
645                         }
646                         break
647                 case "capability.accelerationSensor":
648                         if (accelerationSensorObjects == 0) {
649                                 accelerationSensorObject0 = metaData['name']
650                                 this[accelerationSensorObject0] = new AccelerationSensors({}, 1)
651                         } else if (accelerationSensorObjects == 1) {
652                                 accelerationSensorObject1 = metaData['name']
653                                 this[accelerationSensorObject1] = new AccelerationSensors({}, 1)
654                         } else if (accelerationSensorObjects == 2) {
655                                 accelerationSensorObject2 = metaData['name']
656                                 this[accelerationSensorObject2] = new AccelerationSensors({}, 1)
657                         }
658
659                         accelerationSensorObjects=accelerationSensorObjects+1
660
661                         settings.put(metaData['name'], metaData['name'])
662
663                         if (App == "App1") {
664                                 extractedObjectsApp1.append("//Object for class Acceleration Sensor!\n")
665                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
666                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.accelerationSensorObject\n")            
667                         } else {
668                                 extractedObjectsApp2.append("//Object for class Acceleration Sensor!\n")
669                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
670                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.accelerationSensorObject\n")
671                         }
672                         break
673                 case "capability.motionSensor":
674                         if (motionSensorObjects == 0) {
675                                 motionSensorObject0 = metaData['name']
676                                 this[motionSensorObject0] = new MotionSensors({}, 1)
677                         } else if (motionSensorObjects == 1) {
678                                 motionSensorObject1 = metaData['name']
679                                 this[motionSensorObject1] = new MotionSensors({}, 1)
680                         } else if (motionSensorObjects == 2) {
681                                 motionSensorObject2 = metaData['name']
682                                 this[motionSensorObject2] = new MotionSensors({}, 1)
683                         }
684
685                         motionSensorObjects=motionSensorObjects+1
686
687                         settings.put(metaData['name'], metaData['name'])
688
689                         if (App == "App1") {
690                                 extractedObjectsApp1.append("//Object for class Motion Sensor!\n")
691                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
692                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.motionSensorObject\n")          
693                         } else {
694                                 extractedObjectsApp2.append("//Object for class Motion Sensor!\n")
695                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
696                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.motionSensorObject\n")
697                         }
698                         break
699                 case "capability.musicPlayer":
700                         if (musicPlayerObjects == 0) {
701                                 musicPlayerObject0 = metaData['name']
702                                 this[musicPlayerObject0] = new MusicPlayers({}, 1)
703                         } else if (musicPlayerObjects == 1) {
704                                 musicPlayerObject1 = metaData['name']
705                                 this[musicPlayerObject1] = new MusicPlayers({}, 1)
706                         } else if (musicPlayerObjects == 2) {
707                                 musicPlayerObject2 = metaData['name']
708                                 this[musicPlayerObject2] = new MusicPlayers({}, 1)
709                         }
710
711                         musicPlayerObjects=musicPlayerObjects+1
712
713                         settings.put(metaData['name'], metaData['name']) 
714
715                         if (App == "App1") {
716                                 extractedObjectsApp1.append("//Object for class music player!\n")
717                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
718                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.musicPlayerObject\n")           
719                         } else {
720                                 extractedObjectsApp2.append("//Object for class music player!\n")
721                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
722                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.musicPlayerObject\n")
723                         }
724                         break
725                 case "capability.powerMeter":
726                         if (powerMeterObjects == 0) {
727                                 powerMeterObject0 = metaData['name']
728                                 this[powerMeterObject0] = new PowerMeters({}, 1)
729                         } else if (powerMeterObjects == 1) {
730                                 powerMeterObject1 = metaData['name']
731                                 this[powerMeterObject1] = new PowerMeters({}, 1)
732                         } else if (powerMeterObjects == 2) {
733                                 powerMeterObject2 = metaData['name']
734                                 this[powerMeterObject2] = new PowerMeters({}, 1)
735                         }
736
737                         powerMeterObjects=powerMeterObjects+1
738
739                         settings.put(metaData['name'], metaData['name'])
740
741                         if (App == "App1") {
742                                 extractedObjectsApp1.append("//Object for class power meter!\n")
743                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
744                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.powerMeterObject\n")            
745                         } else {
746                                 extractedObjectsApp2.append("//Object for class power meter!\n")
747                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
748                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.powerMeterObject\n")
749                         }
750                         break
751                 case "capability.presenceSensor":
752                         if (presenceSensorObjects == 0) {
753                                 presenceSensorObject0 = metaData['name']
754                                 this[presenceSensorObject0] = new PresenceSensors({}, 1)
755                         } else if (presenceSensorObjects == 1) {
756                                 presenceSensorObject1 = metaData['name']
757                                 this[presenceSensorObject1] = new PresenceSensors({}, 1)
758                         } else if (presenceSensorObjects == 2) {
759                                 presenceSensorObject2 = metaData['name']
760                                 this[presenceSensorObject2] = new PresenceSensors({}, 1)
761                         }
762
763                         presenceSensorObjects=presenceSensorObjects+1
764
765                         settings.put(metaData['name'], metaData['name'])
766
767                         if (App == "App1") {
768                                 extractedObjectsApp1.append("//Object for class presence sensor!\n")
769                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
770                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.presenceSensorObject\n")                
771                         } else {
772                                 extractedObjectsApp2.append("//Object for class presence sensor!\n")
773                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
774                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.presenceSensorObject\n")
775                         }
776                         break
777                 case "capability.relativeHumidityMeasurement":
778                         if (humidityMeasurementObjects == 0) {
779                                 humidityMeasurementObject0 = metaData['name']
780                                 this[humidityMeasurementObject0] = new RelativeHumidityMeasurements({}, 1)
781                         } else if (humidityMeasurementObjects == 1) {
782                                 humidityMeasurementObject1 = metaData['name']
783                                 this[humidityMeasurementObject1] = new RelativeHumidityMeasurements({}, 1)
784                         } else if (humidityMeasurementObjects == 2) {
785                                 humidityMeasurementObject2 = metaData['name']
786                                 this[humidityMeasurementObject2] = new RelativeHumidityMeasurements({}, 1)
787                         }
788
789                         humidityMeasurementObjects=humidityMeasurementObjects+1
790
791                         settings.put(metaData['name'], metaData['name'])
792
793                         if (App == "App1") {
794                                 extractedObjectsApp1.append("//Object for class humidity measurement!\n")
795                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
796                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.humidityMeasurementObject\n")           
797                         } else {
798                                 extractedObjectsApp2.append("//Object for class humidity measurement!\n")
799                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
800                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.humidityMeasurementObject\n")
801                         }
802                         break
803                 case "capability.relaySwitch":
804                         if (relaySwitchObjects == 0) {
805                                 relaySwitchObject0 = metaData['name']
806                                 this[relaySwitchObject0] = new RelaySwitches({}, 1)
807                         } else if (relaySwitchObjects == 1) {
808                                 relaySwitchObject1 = metaData['name']
809                                 this[relaySwitchObject1] = new RelaySwitches({}, 1)
810                         } else if (relaySwitchObjects == 2) {
811                                 relaySwitchObject2 = metaData['name']
812                                 this[relaySwitchObject2] = new RelaySwitches({}, 1)
813                         }
814
815                         relaySwitchObjects=relaySwitchObjects+1
816                         
817                         settings.put(metaData['name'], metaData['name'])
818
819                         if (App == "App1") {
820                                 extractedObjectsApp1.append("//Object for class relay switch!\n")
821                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
822                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.relaySwitchObject\n")           
823                         } else {
824                                 extractedObjectsApp2.append("//Object for class relay switch!\n")
825                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
826                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.relaySwitchObject\n")
827                         }
828                         break
829                 case "capability.sleepSensor":
830                         if (sleepSensorObjects == 0) {
831                                 sleepSensorObject0 = metaData['name']
832                                 this[sleepSensorObject0] = new SleepSensors({}, 1)
833                         } else if (sleepSensorObjects == 1) {
834                                 sleepSensorObject1 = metaData['name']
835                                 this[sleepSensorObject1] = new SleepSensors({}, 1)
836                         } else if (sleepSensorObjects == 2) {
837                                 sleepSensorObject2 = metaData['name']
838                                 this[sleepSensorObject2] = new SleepSensors({}, 1)
839                         }
840
841                         sleepSensorObjects=sleepSensorObjects+1
842                         
843                         settings.put(metaData['name'], metaData['name'])
844
845                         if (App == "App1") {
846                                 extractedObjectsApp1.append("//Object for class sleep sensor!\n")
847                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
848                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.sleepSensorObject\n")           
849                         } else {
850                                 extractedObjectsApp2.append("//Object for class sleep sensor!\n")
851                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
852                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.sleepSensorObject\n")
853                         }
854                         break
855                 case "capability.smokeDetector":
856                         if (smokeDetectorObjects == 0) {
857                                 smokeDetectorObject0 = metaData['name']
858                                 this[smokeDetectorObject0] = new SmokeDetectors({}, 1)
859                         } else if (smokeDetectorObjects == 1) {
860                                 smokeDetectorObject1 = metaData['name']
861                                 this[smokeDetectorObject1] = new SmokeDetectors({}, 1)
862                         } else if (smokeDetectorObjects == 2) {
863                                 smokeDetectorObject2 = metaData['name']
864                                 this[smokeDetectorObject2] = new SmokeDetectors({}, 1)
865                         }
866
867                         smokeDetectorObjects=smokeDetectorObjects+1
868                         
869                         settings.put(metaData['name'], metaData['name'])
870
871                         if (App == "App1") {
872                                 extractedObjectsApp1.append("//Object for class smoke detector!\n")
873                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
874                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.smokeDetectorObject\n")         
875                         } else {
876                                 extractedObjectsApp2.append("//Object for class smoke detector!\n")
877                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
878                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.smokeDetectorObject\n")
879                         }
880                         break
881                 case "capability.stepSensor":
882                         if (stepSensorObjects == 0) {
883                                 stepSensorObject0 = metaData['name']
884                                 this[stepSensorObject0] = new StepSensors({}, 1)
885                         } else if (stepSensorObjects == 1) {
886                                 stepSensorObject1 = metaData['name']
887                                 this[stepSensorObject1] = new StepSensors({}, 1)
888                         } else if (stepSensorObjects == 2) {
889                                 stepSensorObject2 = metaData['name']
890                                 this[stepSensorObject2] = new StepSensors({}, 1)
891                         }
892
893                         stepSensorObjects=stepSensorObjects+1
894                         
895                         settings.put(metaData['name'], metaData['name'])
896
897                         if (App == "App1") {
898                                 extractedObjectsApp1.append("//Object for class step sensor!\n")
899                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
900                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.stepSensorObject\n")            
901                         } else {
902                                 extractedObjectsApp2.append("//Object for class step sensor!\n")
903                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
904                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.stepSensorObject\n")
905                         }
906                         break
907                 case "capability.switch":
908                         if (switchObjects == 0) {
909                                 switchObject0 = metaData['name']
910                                 this[switchObject0] = new Switches({}, 1)
911                         } else if (switchObjects == 1) {
912                                 switchObject1 = metaData['name']
913                                 this[switchObject1] = new Switches({}, 1)
914                         } else if (switchObjects == 2) {
915                                 switchObject2 = metaData['name']
916                                 this[switchObject2] = new Switches({}, 1)
917                         }
918
919                         switchObjects=switchObjects+1
920                         
921                         settings.put(metaData['name'], metaData['name'])
922
923                         if (App == "App1") {
924                                 extractedObjectsApp1.append("//Object for class switch!\n")
925                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
926                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.switchObject\n")                
927                         } else {
928                                 extractedObjectsApp2.append("//Object for class switch!\n")
929                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
930                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.switchObject\n")
931                         }
932                         break
933                 case "capability.switchLevel":
934                         if (switchLevelObjects == 0) {
935                                 switchLevelObject0 = metaData['name']
936                                 this[switchLevelObject0] = new SwitchLevels({}, 1)
937                         } else if (switchLevelObjects == 1) {
938                                 switchLevelObject1 = metaData['name']
939                                 this[switchLevelObject1] = new SwitchLevels({}, 1)
940                         } else if (switchLevelObjects == 2) {
941                                 switchLevelObject2 = metaData['name']
942                                 this[switchLevelObject2] = new SwitchLevels({}, 1)
943                         }
944
945                         switchLevelObjects=switchLevelObjects+1
946
947                         settings.put(metaData['name'], metaData['name'])
948
949                         if (App == "App1") {
950                                 extractedObjectsApp1.append("//Object for class switch level!\n")
951                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
952                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.switchLevelObject\n")           
953                         } else {
954                                 extractedObjectsApp2.append("//Object for class switch level!\n")
955                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
956                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.switchLevelObject\n")
957                         }
958                         break
959                 case "capability.temperatureMeasurement":
960                         if (temperatureMeasurementObjects == 0) {
961                                 temperatureMeasurementObject0 = metaData['name']
962                                 this[temperatureMeasurementObject0] = new TemperatureMeasurements({}, 1)
963                         } else if (temperatureMeasurementObjects == 1) {
964                                 temperatureMeasurementObject1 = metaData['name']
965                                 this[temperatureMeasurementObject1] = new TemperatureMeasurements({}, 1)
966                         } else if (temperatureMeasurementObjects == 2) {
967                                 temperatureMeasurementObject2 = metaData['name']
968                                 this[temperatureMeasurementObject2] = new TemperatureMeasurements({}, 1)
969                         }
970
971                         temperatureMeasurementObjects=temperatureMeasurementObjects+1
972
973                         settings.put(metaData['name'], metaData['name'])
974
975                         if (App == "App1") {
976                                 extractedObjectsApp1.append("//Object for class temperature measurement!\n")
977                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
978                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.temperatureMeasurementObject\n")                
979                         } else {
980                                 extractedObjectsApp2.append("//Object for class temperature measurement!\n")
981                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
982                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.temperatureMeasurementObject\n")
983                         }
984                         break
985                 case "capability.thermostat":
986                         if (thermostatObjects == 0) {
987                                 thermostatObject0 = metaData['name']
988                                 this[thermostatObject0] = new Thermostats({}, 1)
989                         } else if (thermostatObjects == 1) {
990                                 thermostatObject1 = metaData['name']
991                                 this[thermostatObject1] = new Thermostats({}, 1)
992                         } else if (thermostatObjects == 2) {
993                                 thermostatObject2 = metaData['name']
994                                 this[thermostatObject2] = new Thermostats({}, 1)
995                         }
996
997                         thermostatObjects=thermostatObjects+1
998
999                         settings.put(metaData['name'], metaData['name'])
1000
1001                         if (App == "App1") {
1002                                 extractedObjectsApp1.append("//Object for class thermostat!\n")
1003                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
1004                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.thermostatObject\n")            
1005                         } else {
1006                                 extractedObjectsApp2.append("//Object for class thermostat!\n")
1007                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
1008                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.thermostatObject\n")
1009                         }
1010                         break
1011                 case "capability.valve":
1012                         if (valveObjects == 0) {
1013                                 valveObject0 = metaData['name']
1014                                 this[valveObject0] = new Valves({}, 1)
1015                         } else if (valveObjects == 1) {
1016                                 valveObject1 = metaData['name']
1017                                 this[valveObject1] = new Valves({}, 1)
1018                         } else if (valveObjects == 2) {
1019                                 valveObject2 = metaData['name']
1020                                 this[valveObject2] = new Valves({}, 1)
1021                         }
1022
1023                         valveObjects=valveObjects+1
1024
1025                         settings.put(metaData['name'], metaData['name'])
1026
1027                         if (App == "App1") {
1028                                 extractedObjectsApp1.append("//Object for class valve!\n")
1029                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
1030                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.valveObject\n")         
1031                         } else {
1032                                 extractedObjectsApp2.append("//Object for class valve!\n")
1033                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
1034                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.valveObject\n")
1035                         }
1036                         break
1037                 case "capability.speechSynthesis":
1038                         if (speechSynthesisObjects == 0) {
1039                                 speechSynthesisObject0 = metaData['name']
1040                                 this[speechSynthesisObject0] = new SpeechSynthesises({}, 1)
1041                         } else if (speechSynthesisObjects == 1) {
1042                                 speechSynthesisObject1 = metaData['name']
1043                                 this[speechSynthesisObject1] = new SpeechSynthesises({}, 1)
1044                         } else if (speechSynthesisObjects == 2) {
1045                                 speechSynthesisObject2 = metaData['name']
1046                                 this[speechSynthesisObject2] = new SpeechSynthesises({}, 1)
1047                         }
1048
1049                         speechSynthesisObjects=speechSynthesisObjects+1
1050
1051                         settings.put(metaData['name'], metaData['name'])
1052
1053                         if (App == "App1") {
1054                                 extractedObjectsApp1.append("//Object for class speech synthesis!\n")
1055                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
1056                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.speechSynthesisObject\n")               
1057                         } else {
1058                                 extractedObjectsApp2.append("//Object for class speech synthesis!\n")
1059                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
1060                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.speechSynthesisObject\n")
1061                         }
1062                         break
1063                 case "capability.waterSensor":
1064                         if (waterSensorObjects == 0) {
1065                                 waterSensorObject0 = metaData['name']
1066                                 this[waterSensorObject0] = new WaterSensors({}, 1)
1067                         } else if (waterSensorObjects == 1) {
1068                                 waterSensorObject1 = metaData['name']
1069                                 this[waterSensorObject1] = new WaterSensors({}, 1)
1070                         } else if (waterSensorObjects == 2) {
1071                                 waterSensorObject2 = metaData['name']
1072                                 this[waterSensorObject2] = new WaterSensors({}, 1)
1073                         }
1074
1075                         waterSensorObjects=waterSensorObjects+1
1076
1077                         settings.put(metaData['name'], metaData['name'])
1078
1079                         if (App == "App1") {
1080                                 extractedObjectsApp1.append("//Object for class water sensor!\n")
1081                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
1082                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.waterSensorObject\n")           
1083                         } else {
1084                                 extractedObjectsApp2.append("//Object for class water sensor!\n")
1085                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
1086                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.waterSensorObject\n")
1087                         }
1088                         break
1089                 case "capability.touchSensor":
1090                         if (touchSensorObjects == 0) {
1091                                 touchSensorObject0 = metaData['name']
1092                                 this[touchSensorObject0] = new NfcTouch({}, 1)
1093                         } else if (touchSensorObjects == 1) {
1094                                 touchSensorObject1 = metaData['name']
1095                                 this[touchSensorObject1] = new NfcTouch({}, 1)
1096                         } else if (touchSensorObjects == 2) {
1097                                 touchSensorObject2 = metaData['name']
1098                                 this[touchSensorObject2] = new NfcTouch({}, 1)
1099                         }
1100
1101                         touchSensorObjects=touchSensorObjects+1
1102
1103                         settings.put(metaData['name'], metaData['name'])
1104
1105                         if (App == "App1") {
1106                                 extractedObjectsApp1.append("//Object for class Touch Sensor!\n")
1107                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
1108                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.touchSensorObject\n")           
1109                         } else {
1110                                 extractedObjectsApp2.append("//Object for class Touch Sensor!\n")
1111                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
1112                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.touchSensorObject\n")
1113                         }
1114                         break
1115                 case "capability.imageCapture":
1116                         if (imageCaptureObjects == 0) {
1117                                 imageCaptureObject0 = metaData['name']
1118                                 this[imageCaptureObject0] = new ImageCaptures({}, 1)
1119                         } else if (imageCaptureObjects == 1) {
1120                                 imageCaptureObject1 = metaData['name']
1121                                 this[imageCaptureObject1] = new ImageCaptures({}, 1)
1122                         } else if (imageCaptureObjects == 2) {
1123                                 imageCaptureObject2 = metaData['name']
1124                                 this[imageCaptureObject2] = new ImageCaptures({}, 1)
1125                         }
1126
1127                         imageCaptureObjects=imageCaptureObjects+1
1128
1129                         settings.put(metaData['name'], metaData['name'])
1130
1131                         if (App == "App1") {
1132                                 extractedObjectsApp1.append("//Object for class Image Capture!\n")
1133                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
1134                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.imageCaptureObject\n")          
1135                         } else {
1136                                 extractedObjectsApp2.append("//Object for class Image Capture!\n")
1137                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
1138                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.imageCaptureObject\n")
1139                         }
1140                         break
1141                 case "device.mobilePresence":
1142                         if (mobilePresenceObjects == 0) {
1143                                 mobilePresenceObject0 = metaData['name']
1144                                 this[mobilePresenceObject0] = new MobilePresences({}, 1)
1145                         } else if (mobilePresenceObjects == 1) {
1146                                 mobilePresenceObject1 = metaData['name']
1147                                 this[mobilePresenceObject1] = new MobilePresences({}, 1)
1148                         } else if (mobilePresenceObjects == 2) {
1149                                 mobilePresenceObject2 = metaData['name']
1150                                 this[mobilePresenceObject2] = new MobilePresences({}, 1)
1151                         }
1152
1153                         mobilePresenceObjects=mobilePresenceObjects+1
1154
1155                         settings.put(metaData['name'], metaData['name'])
1156
1157                         if (App == "App1") {
1158                                 extractedObjectsApp1.append("//Object for class mobile presence!\n")
1159                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
1160                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.mobilePresenceObject\n")                
1161                         } else {
1162                                 extractedObjectsApp2.append("//Object for class mobile presence!\n")
1163                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
1164                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.mobilePresenceObject\n")
1165                         }
1166                         break
1167                 case "device.aeonKeyFob":
1168                         if (aeonKeyFobObjects == 0) {
1169                                 aeonKeyFobObject0 = metaData['name']
1170                                 this[aeonKeyFobObject0] = new AeonKeyFobs({}, 1)
1171                         } else if (aeonKeyFobObjects == 1) {
1172                                 aeonKeyFobObject1 = metaData['name']
1173                                 this[aeonKeyFobObject1] = new AeonKeyFobs({}, 1)
1174                         } else if (aeonKeyFobObjects == 2) {
1175                                 aeonKeyFobObject2 = metaData['name']
1176                                 this[aeonKeyFobObject2] = new AeonKeyFobs({}, 1)
1177                         }
1178
1179                         aeonKeyFobObjects=aeonKeyFobObjects+1
1180
1181                         settings.put(metaData['name'], metaData['name']) 
1182
1183                         if (App == "App1") {
1184                                 extractedObjectsApp1.append("//Object for class aeon key fob!\n")
1185                                 extractedObjectsApp1.append("def "+metaData['name']+"\n")
1186                                 extractedObjectsConstructorApp1.append(metaData['name']+" = obj.aeonKeyFobObject\n")            
1187                         } else {
1188                                 extractedObjectsApp2.append("//Object for class aeon key fob!\n")
1189                                 extractedObjectsApp2.append("def "+metaData['name']+"\n")
1190                                 extractedObjectsConstructorApp2.append(metaData['name']+" = obj.aeonKeyFobObject\n")
1191                         }
1192                         break
1193                 case "mode":
1194                         def randomVariable = Math.abs(new Random().nextInt() % 3)
1195                         def modes = ["away", "home", "night"]
1196                         def userInput = modes[randomVariable]
1197
1198                         if (modeVariables == 0) {
1199                                 mode0 = metaData['name']
1200                                 this[mode0] = userInput
1201                         } else if (modeVariables == 1) {
1202                                 mode1 = metaData['name']
1203                                 this[mode1] = userInput
1204                         } else if (modeVariables == 2) {
1205                                 mode2 = metaData['name']
1206                                 this[mode2] = userInput
1207                         } else if (modeVariables == 3) {
1208                                 mode3 = metaData['name']
1209                                 this[mode3] = userInput
1210                         } else if (modeVariables == 4) {
1211                                 mode4 = metaData['name']
1212                                 this[mode4] = userInput
1213                         } else if (modeVariables == 5) {
1214                                 mode5 = metaData['name']
1215                                 this[mode5] = userInput
1216                         }
1217
1218                         modeVariables=modeVariables+1
1219
1220                         settings.put(metaData['name'], metaData['name'])
1221
1222                         if (App == "App1") {                    
1223                                 extractedObjectsApp1.append("//Global variable for mode!\n")
1224                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1225                         } else {
1226                                 extractedObjectsApp2.append("//Global variable for mode!\n")
1227                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1228                         }
1229                         break
1230                 case "decimal":
1231                         def userInput = Math.abs(new Random().nextInt() % 60) + 40
1232                         
1233                         if (decimalVariables == 0) {
1234                                 decimal0 = metaData['name']
1235                                 this[decimal0] = userInput
1236                         } else if (decimalVariables == 1) {
1237                                 decimal1 = metaData['name']
1238                                 this[decimal1] = userInput
1239                         } else if (decimalVariables == 2) {
1240                                 decimal2 = metaData['name']
1241                                 this[decimal2] = userInput
1242                         } else if (decimalVariables == 3) {
1243                                 decimal3 = metaData['name']
1244                                 this[decimal3] = userInput
1245                         } else if (decimalVariables == 4) {
1246                                 decimal4 = metaData['name']
1247                                 this[decimal4] = userInput
1248                         } else if (decimalVariables == 5) {
1249                                 decimal5 = metaData['name']
1250                                 this[decimal5] = userInput
1251                         }
1252
1253                         decimalVariables=decimalVariables+1
1254
1255                         settings.put(metaData['name'], metaData['name'])
1256
1257                         if (App == "App1") {                    
1258                                 extractedObjectsApp1.append("//Global variable for decimal number!\n")
1259                                 extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
1260                         } else {
1261                                 extractedObjectsApp2.append("//Global variable for decimal number!\n")
1262                                 extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
1263                         }
1264                         break
1265                 case "text":
1266                         def userInput = "This is just a text!"
1267         
1268                         if (textVariables == 0) {
1269                                 text0 = metaData['name']
1270                                 this[text0] = userInput
1271                         } else if (textVariables == 1) {
1272                                 text1 = metaData['name']
1273                                 this[text1] = userInput
1274                         } else if (textVariables == 2) {
1275                                 text2 = metaData['name']
1276                                 this[text2] = userInput
1277                         } else if (textVariables == 3) {
1278                                 text3 = metaData['name']
1279                                 this[text3] = userInput
1280                         } else if (textVariables == 4) {
1281                                 text4 = metaData['name']
1282                                 this[text4] = userInput
1283                         } else if (textVariables == 5) {
1284                                 text5 = metaData['name']
1285                                 this[text5] = userInput
1286                         }
1287
1288                         textVariables=textVariables+1
1289
1290                         settings.put(metaData['name'], metaData['name'])
1291
1292                         if (App == "App1") {                    
1293                                 extractedObjectsApp1.append("//Global variable for text!\n")
1294                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1295                         } else {
1296                                 extractedObjectsApp2.append("//Global variable for text!\n")
1297                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1298                         }
1299                         break
1300                 case "number":
1301                         def userInput = Math.abs(new Random().nextInt() % 60) + 40
1302                         
1303                         if (numberVariables == 0) {
1304                                 number0 = metaData['name']
1305                                 this[number0] = userInput
1306                         } else if (numberVariables == 1) {
1307                                 number1 = metaData['name']
1308                                 this[number1] = userInput
1309                         } else if (numberVariables == 2) {
1310                                 number2 = metaData['name']
1311                                 this[number2] = userInput
1312                         } else if (numberVariables == 3) {
1313                                 number3 = metaData['name']
1314                                 this[number3] = userInput
1315                         } else if (numberVariables == 4) {
1316                                 number4 = metaData['name']
1317                                 this[number4] = userInput
1318                         } else if (numberVariables == 5) {
1319                                 number5 = metaData['name']
1320                                 this[number5] = userInput
1321                         }
1322
1323                         numberVariables=numberVariables+1
1324
1325                         settings.put(metaData['name'], metaData['name'])
1326
1327                         if (App == "App1") {                    
1328                                 extractedObjectsApp1.append("//Global variable for number!\n")
1329                                 extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
1330                         } else {
1331                                 extractedObjectsApp2.append("//Global variable for number!\n")
1332                                 extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
1333                         }
1334                         break
1335                 case "time":
1336                         def userInput = "15:00"
1337                         
1338                         if (timeVariables == 0) {
1339                                 time0 = metaData['name']
1340                                 this[time0] = userInput
1341                         } else if (timeVariables == 1) {
1342                                 time1 = metaData['name']
1343                                 this[time1] = userInput
1344                         } else if (timeVariables == 2) {
1345                                 time2 = metaData['name']
1346                                 this[time2] = userInput
1347                         } else if (timeVariables == 3) {
1348                                 time3 = metaData['name']
1349                                 this[time3] = userInput
1350                         } else if (timeVariables == 4) {
1351                                 time4 = metaData['name']
1352                                 this[time4] = userInput
1353                         } else if (timeVariables == 5) {
1354                                 time5 = metaData['name']
1355                                 this[time5] = userInput
1356                         }
1357
1358                         timeVariables=timeVariables+1
1359
1360                         settings.put(metaData['name'], metaData['name'])
1361
1362                         if (App == "App1") {                    
1363                                 extractedObjectsApp1.append("//Global variable for time!\n")
1364                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1365                         } else {
1366                                 extractedObjectsApp2.append("//Global variable for time!\n")
1367                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1368                         }
1369                         break
1370                 case "enum":
1371                         if (metaData['options'] != null)
1372                                 modes = metaData['options']
1373                         else // If it is not named 'options' then it is captured as 'metadata'
1374                                 modes = metaData['metadata']
1375                         def userInput = modes[0]
1376         
1377                         if (enumVariables == 0) {
1378                                 enum0 = metaData['name']
1379                                 this[enum0] = userInput
1380                         } else if (enumVariables == 1) {
1381                                 enum1 = metaData['name']
1382                                 this[enum1] = userInput
1383                         } else if (enumVariables == 2) {
1384                                 enum2 = metaData['name']
1385                                 this[enum2] = userInput
1386                         } else if (enumVariables == 3) {
1387                                 enum3 = metaData['name']
1388                                 this[enum3] = userInput
1389                         } else if (enumVariables == 4) {
1390                                 enum4 = metaData['name']
1391                                 this[enum4] = userInput
1392                         } else if (enumVariables == 5) {
1393                                 enum5 = metaData['name']
1394                                 this[enum5] = userInput
1395                         }
1396
1397                         enumVariables=enumVariables+1
1398
1399                         settings.put(metaData['name'], metaData['name'])
1400
1401                         if (App == "App1") {                    
1402                                 extractedObjectsApp1.append("//Global variable for enum!\n")
1403                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1404                         } else {
1405                                 extractedObjectsApp2.append("//Global variable for enum!\n")
1406                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1407                         }
1408                         break
1409                 case "bool":
1410                         def userInput = Math.abs(new Random().nextInt() % 2)
1411         
1412                         if (boolVariables == 0) {
1413                                 bool0 = metaData['name']
1414                                 this[bool0] = userInput
1415                         } else if (boolVariables == 1) {
1416                                 bool1 = metaData['name']
1417                                 this[bool1] = userInput
1418                         } else if (boolVariables == 2) {
1419                                 bool2 = metaData['name']
1420                                 this[bool2] = userInput
1421                         } else if (boolVariables == 3) {
1422                                 bool3 = metaData['name']
1423                                 this[bool3] = userInput
1424                         } else if (boolVariables == 4) {
1425                                 bool4 = metaData['name']
1426                                 this[bool4] = userInput
1427                         } else if (boolVariables == 5) {
1428                                 bool5 = metaData['name']
1429                                 this[bool5] = userInput
1430                         }
1431
1432                         boolVariables=boolVariables+1
1433
1434                         settings.put(metaData['name'], metaData['name'])
1435
1436                         if (App == "App1") {                    
1437                                 extractedObjectsApp1.append("//Global variable for boolean!\n")
1438                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1439                         } else {
1440                                 extractedObjectsApp2.append("//Global variable for boolean!\n")
1441                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1442                         }
1443                         break
1444                 case "phone":
1445                         def userInput = 9495379373
1446
1447                         if (phoneVariables == 0) {
1448                                 phone0 = metaData['name']
1449                                 this[phone0] = userInput
1450                         } else if (phoneVariables == 1) {
1451                                 phone1 = metaData['name']
1452                                 this[phone1] = userInput
1453                         } else if (phoneVariables == 2) {
1454                                 phone2 = metaData['name']
1455                                 this[phone2] = userInput
1456                         } else if (phoneVariables == 3) {
1457                                 phone3 = metaData['name']
1458                                 this[phone3] = userInput
1459                         } else if (phoneVariables == 4) {
1460                                 phone4 = metaData['name']
1461                                 this[phone4] = userInput
1462                         } else if (phoneVariables == 5) {
1463                                 phone5 = metaData['name']
1464                                 this[phone5] = userInput
1465                         }
1466
1467                         phoneVariables=phoneVariables+1
1468
1469                         settings.put(metaData['name'], metaData['name'])
1470
1471                         if (App == "App1") {                    
1472                                 extractedObjectsApp1.append("//Global variable for phone!\n")
1473                                 extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
1474                         } else {
1475                                 extractedObjectsApp2.append("//Global variable for phone!\n")
1476                                 extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
1477                         }
1478                         break
1479                 case "contact":
1480                         def userInput = "AJ"
1481         
1482                         if (contactVariables == 0) {
1483                                 contact0 = metaData['name']
1484                                 this[contact0] = userInput
1485                         } else if (contactVariables == 1) {
1486                                 contact1 = metaData['name']
1487                                 this[contact1] = userInput
1488                         } else if (contactVariables == 2) {
1489                                 contact2 = metaData['name']
1490                                 this[contact2] = userInput
1491                         } else if (contactVariables == 3) {
1492                                 contact3 = metaData['name']
1493                                 this[contact3] = userInput
1494                         } else if (contactVariables == 4) {
1495                                 contact4 = metaData['name']
1496                                 this[contact4] = userInput
1497                         } else if (contactVariables == 5) {
1498                                 contact5 = metaData['name']
1499                                 this[contact5] = userInput
1500                         }
1501
1502                         contactVariables=contactVariables+1
1503
1504                         settings.put(metaData['name'], metaData['name'])
1505
1506                         if (App == "App1") {                    
1507                                 extractedObjectsApp1.append("//Global variable for contact!\n")
1508                                 extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1509                         } else {
1510                                 extractedObjectsApp2.append("//Global variable for contact!\n")
1511                                 extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
1512                         }
1513                         break
1514                 default:
1515                         break
1516         }
1517 }
1518
1519 def label(LinkedHashMap metaData) {
1520         if (metaData.containsKey('title')) {
1521                 println metaData['title']
1522         }
1523         if (metaData.containsKey('options')) {
1524                 println "Options: "+metaData['options']
1525         }
1526
1527         println("//IGNORE--ForMobileUse//")
1528 }
1529
1530 def mode(LinkedHashMap metaData) {
1531         if (metaData.containsKey('title')) {
1532                 println metaData['title']
1533         }
1534         if (metaData.containsKey('options')) {
1535                 println "Options: "+metaData['options']
1536         }
1537
1538         println("//IGNORE--ForMobileUse//")
1539 }
1540
1541 def href(LinkedHashMap metaData) {
1542         println("//IGNORE--some data//")
1543 }
1544
1545 def href(LinkedHashMap metaData, String name) {
1546         println("//IGNORE--some data//")
1547 }
1548 /////Input Methods/////
1549
1550
1551 /////MethodsForExtraction/////
1552 def definition(LinkedHashMap metaData) {
1553         println("///Just some information///")
1554 }
1555
1556 def preferences(Closure inputData) {
1557         find(inputData) //Run the closure to extract pages/sections/inputMethods
1558         if (App == "App1") {                    
1559                 extractedObjectsConstructorApp1.append("//Global variable for settings!\n")
1560                 extractedObjectsConstructorApp1.append("settings = $settings\n")
1561         } else {
1562                 extractedObjectsConstructorApp2.append("//Global variable for settings!\n")
1563                 extractedObjectsConstructorApp2.append("settings = $settings\n")
1564         }
1565 }
1566
1567 def page(LinkedHashMap metaData, Closure inputData) {
1568         if (metaData.containsKey('name'))
1569                 println(metaData['name'])
1570         if (metaData.containsKey('title'))
1571                 println(metaData['title'])
1572
1573         find(inputData) //Run the closure to extract sections/inputMethods
1574 }
1575
1576 def page(LinkedHashMap metaData) {
1577         def nameOfFunction = metaData['name']
1578         "$nameOfFunction"() //Call the page     
1579 }
1580
1581 def dynamicPage(LinkedHashMap metaData, Closure inputData) {
1582         if (metaData.containsKey('name'))
1583                 println(metaData['name'])
1584         if (metaData.containsKey('title'))
1585                 println(metaData['title'])
1586
1587         find(inputData) //Run the closure to extract sections/inputMethods
1588 }
1589
1590 def paragraph(String paragraphText) {
1591         println(paragraphText)
1592 }
1593
1594 def section(String title, Closure inputData) {
1595         println(title)
1596         find(inputData) //Run the closure to extract inputMethods
1597 }
1598
1599 def section(Closure inputData) {
1600         find(inputData) //Run the closure to extract inputMethods
1601 }
1602
1603 def section(LinkedHashMap metaData, Closure inputData) {
1604         find(inputData) //Run the closure to extract inputMethods
1605 }
1606
1607 def mappings(Closure inputData) {
1608         println("//IGNORE--some data//")
1609 }
1610 /////MethodsForExtraction/////
1611
1612
1613
1614 /**
1615  *  Beacon Control
1616  *
1617  *  Copyright 2014 Physical Graph Corporation
1618  *
1619  *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
1620  *  in compliance with the License. You may obtain a copy of the License at:
1621  *
1622  *      http://www.apache.org/licenses/LICENSE-2.0
1623  *
1624  *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
1625  *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
1626  *  for the specific language governing permissions and limitations under the License.
1627  *
1628  */
1629 definition(
1630         name: "Beacon Control",
1631         category: "SmartThings Internal",
1632         namespace: "smartthings",
1633         author: "SmartThings",
1634         description: "Execute a Hello, Home phrase, turn on or off some lights, and/or lock or unlock your door when you enter or leave a monitored region",
1635         iconUrl: "https://s3.amazonaws.com/smartapp-icons/MiscHacking/mindcontrol.png",
1636         iconX2Url: "https://s3.amazonaws.com/smartapp-icons/MiscHacking/mindcontrol@2x.png"
1637 )
1638
1639 preferences {
1640         page(name: "timeIntervalInput", title: "Only during a certain time") {
1641                 section {
1642                         input "starting", "time", title: "Starting", required: false
1643                         input "ending", "time", title: "Ending", required: false
1644                 }
1645         }
1646         
1647         page(name: "mainPage")
1648 }
1649
1650 def mainPage() {
1651         dynamicPage(name: "mainPage", install: true, uninstall: true) {
1652
1653                 section("Where do you want to watch?") {
1654                         input name: "beacons", type: "capability.beacon", title: "Select your beacon(s)", 
1655                                 multiple: true, required: true
1656                 }
1657
1658                 section("Who do you want to watch for?") {
1659                         input name: "phones", type: "device.mobilePresence", title: "Select your phone(s)", 
1660                                 multiple: true, required: true
1661                 }
1662
1663                 section("What do you want to do on arrival?") {
1664                         input name: "arrivalPhrase", type: "enum", title: "Execute a phrase", 
1665                                 options: listPhrases(), required: false
1666                         input "arrivalOnSwitches", "capability.switch", title: "Turn on some switches", 
1667                                 multiple: true, required: false
1668                         input "arrivalOffSwitches", "capability.switch", title: "Turn off some switches", 
1669                                 multiple: true, required: false
1670                         input "arrivalLocks", "capability.lock", title: "Unlock the door",
1671                                 multiple: true, required: false
1672                 }
1673
1674                 section("What do you want to do on departure?") {
1675                         input name: "departPhrase", type: "enum", title: "Execute a phrase", 
1676                                 options: listPhrases(), required: false
1677                         input "departOnSwitches", "capability.switch", title: "Turn on some switches", 
1678                                 multiple: true, required: false
1679                         input "departOffSwitches", "capability.switch", title: "Turn off some switches", 
1680                                 multiple: true, required: false
1681                         input "departLocks", "capability.lock", title: "Lock the door",
1682                                 multiple: true, required: false
1683                 }
1684
1685                 section("Do you want to be notified?") {
1686                         input "pushNotification", "bool", title: "Send a push notification"
1687                         input "phone", "phone", title: "Send a text message", description: "Tap to enter phone number", 
1688                                 required: false
1689                 }
1690
1691                 section {
1692                         label title: "Give your automation a name", description: "e.g. Goodnight Home, Wake Up"
1693                 }
1694
1695                 def timeLabel = timeIntervalLabel()
1696                 section(title: "More options", hidden: hideOptionsSection(), hideable: true) {
1697                         href "timeIntervalInput", title: "Only during a certain time", 
1698                                 description: timeLabel ?: "Tap to set", state: timeLabel ? "complete" : "incomplete"
1699
1700                         input "days", "enum", title: "Only on certain days of the week", multiple: true, required: false,
1701                                 options: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
1702
1703                         input "modes", "mode", title: "Only when mode is", multiple: true, required: false
1704                 }
1705         }
1706 }
1707
1708 // Lifecycle management
1709 def installed() {
1710         log.debug "<beacon-control> Installed with settings: ${settings}"
1711         initialize()
1712 }
1713
1714 def updated() {
1715         log.debug "<beacon-control> Updated with settings: ${settings}"
1716         unsubscribe()
1717         initialize()
1718 }
1719
1720 def initialize() {
1721         subscribe(beacons, "presence", beaconHandler)
1722 }
1723
1724 // Event handlers
1725 def beaconHandler(evt) {
1726         log.debug "<beacon-control> beaconHandler: $evt"
1727
1728         if (allOk) {
1729                 def data = new groovy.json.JsonSlurper().parseText(evt.data)
1730                 // removed logging of device names. can be added back for debugging
1731                 //log.debug "<beacon-control> data: $data - phones: " + phones*.deviceNetworkId
1732
1733                 def beaconName = getBeaconName(evt)
1734                 // removed logging of device names. can be added back for debugging
1735                 //log.debug "<beacon-control> beaconName: $beaconName"
1736
1737                 def phoneName = getPhoneName(data)
1738                 // removed logging of device names. can be added back for debugging
1739                 //log.debug "<beacon-control> phoneName: $phoneName"
1740                 if (phoneName != null) {
1741             def action = data.presence == "1" ? "arrived" : "left"
1742             def msg = "$phoneName has $action ${action == 'arrived' ? 'at ' : ''}the $beaconName"
1743
1744             if (action == "arrived") {
1745                 msg = arriveActions(msg)
1746             }
1747             else if (action == "left") {
1748                 msg = departActions(msg)
1749             }
1750             log.debug "<beacon-control> msg: $msg"
1751
1752             if (pushNotification || phone) {
1753                 def options = [
1754                     method: (pushNotification && phone) ? "both" : (pushNotification ? "push" : "sms"),
1755                     phone: phone
1756                 ]
1757                 sendNotification(msg, options)
1758             }
1759         }
1760         }
1761 }
1762
1763 // Helpers
1764 private arriveActions(msg) {
1765         if (arrivalPhrase || arrivalOnSwitches || arrivalOffSwitches || arrivalLocks) msg += ", so"
1766         
1767         if (arrivalPhrase) {
1768                 log.debug "<beacon-control> executing: $arrivalPhrase"
1769                 executePhrase(arrivalPhrase)
1770                 msg += " ${prefix('executed')} $arrivalPhrase."
1771         }
1772         if (arrivalOnSwitches) {
1773                 log.debug "<beacon-control> turning on: $arrivalOnSwitches"
1774                 arrivalOnSwitches.on()
1775                 msg += " ${prefix('turned')} ${list(arrivalOnSwitches)} on."
1776         }
1777         if (arrivalOffSwitches) {
1778                 log.debug "<beacon-control> turning off: $arrivalOffSwitches"
1779                 arrivalOffSwitches.off()
1780                 msg += " ${prefix('turned')} ${list(arrivalOffSwitches)} off."
1781         }
1782         if (arrivalLocks) {
1783                 log.debug "<beacon-control> unlocking: $arrivalLocks"
1784                 arrivalLocks.unlock()
1785                 msg += " ${prefix('unlocked')} ${list(arrivalLocks)}."
1786         }
1787         msg
1788 }
1789
1790 private departActions(msg) {
1791         if (departPhrase || departOnSwitches || departOffSwitches || departLocks) msg += ", so"
1792         
1793         if (departPhrase) {
1794                 log.debug "<beacon-control> executing: $departPhrase"
1795                 executePhrase(departPhrase)
1796                 msg += " ${prefix('executed')} $departPhrase."
1797         }
1798         if (departOnSwitches) {
1799                 log.debug "<beacon-control> turning on: $departOnSwitches"
1800                 departOnSwitches.on()
1801                 msg += " ${prefix('turned')} ${list(departOnSwitches)} on."
1802         }
1803         if (departOffSwitches) {
1804                 log.debug "<beacon-control> turning off: $departOffSwitches"
1805                 departOffSwitches.off()
1806                 msg += " ${prefix('turned')} ${list(departOffSwitches)} off."
1807         }
1808         if (departLocks) {
1809                 log.debug "<beacon-control> unlocking: $departLocks"
1810                 departLocks.lock()
1811                 msg += " ${prefix('locked')} ${list(departLocks)}."
1812         }
1813         msg
1814 }
1815
1816 private prefix(word) {
1817         def result
1818         def index = settings.prefixIndex == null ? 0 : settings.prefixIndex + 1
1819         switch (index) {
1820                 case 0:
1821                         result = "I $word"
1822                         break
1823                 case 1:
1824                         result = "I also $word"
1825                         break
1826                 case 2:
1827                         result = "And I $word"
1828                         break
1829                 default:
1830                         result = "And $word"
1831                         break
1832         }
1833
1834         settings.prefixIndex = index
1835         log.trace "prefix($word'): $result"
1836         result
1837 }
1838
1839 private listPhrases() {
1840         location.helloHome.getPhrases().label
1841 }
1842
1843 private executePhrase(phraseName) {
1844         if (phraseName) {
1845                 location.helloHome.execute(phraseName)
1846                 log.debug "<beacon-control> executed phrase: $phraseName"
1847         }
1848 }
1849
1850 private getBeaconName(evt) {
1851         def beaconName = beacons.find { b -> b.id == evt.deviceId }
1852         return beaconName
1853 }
1854
1855 private getPhoneName(data) {    
1856         def phoneName = phones.find { phone ->
1857                 // Work around DNI bug in data
1858                 def pParts = phone.deviceNetworkId.split('\\|')
1859                 def dParts = data.dni.split('\\|')
1860         pParts[0] == dParts[0]
1861         }
1862         return phoneName
1863 }
1864
1865 private hideOptionsSection() {
1866         (starting || ending || days || modes) ? false : true
1867 }
1868
1869 private getAllOk() {
1870         modeOk && daysOk && timeOk
1871 }
1872
1873 private getModeOk() {
1874         def result = !modes || modes.contains(location.mode)
1875         log.trace "<beacon-control> modeOk = $result"
1876         result
1877 }
1878
1879 private getDaysOk() {
1880         def result = true
1881         if (days) {
1882                 def df = new java.text.SimpleDateFormat("EEEE")
1883                 if (location.timeZone) {
1884                         df.setTimeZone(location.timeZone)
1885                 }
1886                 else {
1887                         df.setTimeZone(TimeZone.getTimeZone("America/New_York"))
1888                 }
1889                 def day = df.format(new Date())
1890                 result = days.contains(day)
1891         }
1892         log.trace "<beacon-control> daysOk = $result"
1893         result
1894 }
1895
1896 private getTimeOk() {
1897         def result = true
1898         if (starting && ending) {
1899                 def currTime = now()
1900                 def start = timeToday(starting, location?.timeZone).time
1901                 def stop = timeToday(ending, location?.timeZone).time
1902                 result = start < stop ? currTime >= start && currTime <= stop : currTime <= stop || currTime >= start
1903         }
1904         log.trace "<beacon-control> timeOk = $result"
1905         result
1906 }
1907
1908 private hhmm(time, fmt = "h:mm a") {
1909         def t = timeToday(time, location.timeZone)
1910         def f = new java.text.SimpleDateFormat(fmt)
1911         f.setTimeZone(location.timeZone ?: timeZone(time))
1912         f.format(t)
1913 }
1914
1915 private timeIntervalLabel() {
1916         (starting && ending) ? hhmm(starting) + "-" + hhmm(ending, "h:mm a z") : ""
1917 }
1918
1919 private list(Object names) {
1920         return names[0]
1921 }