sme minor changes
[smartthings-infrastructure.git] / Extractor / extractorFile.groovy
index 38d948a1076ecc2b0f2d8a4d35f4ee16c5c52935..3696113729e829467960355dc261713faa51bd31 100644 (file)
@@ -1,4 +1,5 @@
-////////////////////@Field App
+////////////////////
+@Field App
 App = "App2"
 ////////////////////////////////////////
 //import libraries
@@ -24,10 +25,66 @@ import Location.LocationVar
 import Location.Phrase
 import appTouch.Touched
 import NfcTouch.NfcTouch
+import AeonKeyFob.AeonKeyFob
+import AeonKeyFob.AeonKeyFobs
+import MusicPlayer.MusicPlayer
+import MusicPlayer.MusicPlayers
+import MotionSensor.MotionSensor
+import MotionSensor.MotionSensors
+import ImageCapture.ImageCapture
+import ImageCapture.ImageCaptures
+import SmokeDetector.SmokeDetector
+import SmokeDetector.SmokeDetectors
+import Alarm.Alarm
+import Alarm.Alarms
+import SpeechSynthesis.SpeechSynthesis
+import SpeechSynthesis.SpeechSynthesises
+import AccelerationSensor.AccelerationSensor
+import AccelerationSensor.AccelerationSensors
+import Battery.Battery
+import Battery.Batteries
+import BeaconSensor.BeaconSensor
+import BeaconSensor.BeaconSensors
+import CarbonMonoxideDetector.CarbonMonoxideDetector
+import CarbonMonoxideDetector.CarbonMonoxideDetectors
+import ColorControl.ColorControl
+import ColorControl.ColorControls
+import EnergyMeter.EnergyMeter
+import EnergyMeter.EnergyMeters
+import IlluminanceMeasurement.IlluminanceMeasurement
+import IlluminanceMeasurement.IlluminanceMeasurements
+import PowerMeter.PowerMeter
+import PowerMeter.PowerMeters
+import RelativeHumidityMeasurement.RelativeHumidityMeasurement
+import RelativeHumidityMeasurement.RelativeHumidityMeasurements
+import RelaySwitch.RelaySwitch
+import RelaySwitch.RelaySwitches
+import SleepSensor.SleepSensor
+import SleepSensor.SleepSensors
+import StepSensor.StepSensor
+import StepSensor.StepSensors
+import SwitchLevel.SwitchLevel
+import SwitchLevel.SwitchLevels
+import TemperatureMeasurement.TemperatureMeasurement
+import TemperatureMeasurement.TemperatureMeasurements
+import WaterSensor.WaterSensor
+import WaterSensor.WaterSensors
+import Valve.Valve
+import Valve.Valves
+import MobilePresence.MobilePresence
+import MobilePresence.MobilePresences
 import Timer.SimulatedTimer
 
-
-@Field App //Default
+//GlobalVariables
+@Field def location = new LocationVar()
+//Settings variable defined to settings on purpose
+@Field def settings = [app: "app"]
+//Global variable for state[mode]
+@Field def state = [home:[],away:[],night:[]]
+//Create a global logger object for methods
+@Field def log = new Logger()
+//Create a global variable for optional property
+@Field def optional = false //by default for now
 
 
 //Global variables for files
@@ -48,23 +105,175 @@ if (App == "App1") {
 
 
 
+//Some of methods-May be needed even in install
+/////////////////////////////////////////////////////////////////////
+def timeToday(String time, Object timeZone) {
+       def timeOfDay = new Date()
+       def _inputTime = time.split(':')
+       def inputTime = Integer.parseInt(_inputTime[0])*3600+Integer.parseInt(_inputTime[1])*60+1564191100415
+       timeOfDay.time = inputTime
+       return timeOfDay
+}
+
 
 
 //Global objects
 //Global Object for class Touch Sensor!
-@Field def touchSensorObject
+@Field touchSensorObjects = 0
+@Field def touchSensorObject0
+@Field def touchSensorObject1
+@Field def touchSensorObject2
 //Global Object for class switch!
-@Field def switchObject
+@Field switchObjects = 0
+@Field def switchObject0
+@Field def switchObject1
+@Field def switchObject2
 //Global Object for class lock!
-@Field def lockObject
+@Field lockObjects = 0
+@Field def lockObject0
+@Field def lockObject1
+@Field def lockObject2
 //Global Object for class door control!
-@Field def doorControlObject
+@Field doorControlObjects = 0
+@Field def doorControlObject0
+@Field def doorControlObject1
+@Field def doorControlObject2
 //Global Object for class contact sensor!
-@Field def contactObject
+@Field contactObjects = 0
+@Field def contactObject0
+@Field def contactObject1
+@Field def contactObject2
 //Global Object for class presence sensor!
-@Field def presenceSensorObject
+@Field presenceSensorObjects = 0
+@Field def presenceSensorObject0
+@Field def presenceSensorObject1
+@Field def presenceSensorObject2
 //Global Object for class thermostat!
-@Field def thermostatObject
+@Field thermostatObjects = 0
+@Field def thermostatObject0
+@Field def thermostatObject1
+@Field def thermostatObject2
+//Global Object for class music player!
+@Field musicPlayerObjects = 0
+@Field def musicPlayerObject0
+@Field def musicPlayerObject1
+@Field def musicPlayerObject2
+//Global Object for class aeon key fob!
+@Field aeonKeyFobObjects = 0
+@Field def aeonKeyFobObject0
+@Field def aeonKeyFobObject1
+@Field def aeonKeyFobObject2
+//Global Object for class motion sensor!
+@Field motionSensorObjects = 0
+@Field def motionSensorObject0
+@Field def motionSensorObject1
+@Field def motionSensorObject2
+//Global Object for class image capture!
+@Field imageCaptureObjects = 0
+@Field def imageCaptureObject0
+@Field def imageCaptureObject1
+@Field def imageCaptureObject2
+//Global Object for class smoke detector!
+@Field smokeDetectorObjects = 0
+@Field def smokeDetectorObject0
+@Field def smokeDetectorObject1
+@Field def smokeDetectorObject2
+//Global Object for class alarm!
+@Field alarmObjects = 0
+@Field def alarmObject0
+@Field def alarmObject1
+@Field def alarmObject2
+//Global Object for class speech synthesis!
+@Field speechSynthesisObjects = 0
+@Field def speechSynthesisObject0
+@Field def speechSynthesisObject1
+@Field def speechSynthesisObject2
+//Global Object for class acceleration sensor!
+@Field accelerationSensorObjects = 0
+@Field def accelerationSensorObject0
+@Field def accelerationSensorObject1
+@Field def accelerationSensorObject2
+//Global Object for class battery!
+@Field batteryObjects = 0
+@Field def batteryObject0
+@Field def batteryObject1
+@Field def batteryObject2
+//Global Object for class beacon sensor!
+@Field beaconSensorObjects = 0
+@Field def beaconSensorObject0
+@Field def beaconSensorObject1
+@Field def beaconSensorObject2
+//Global Object for class carbon monoxide detector!
+@Field carbonMonoxideDetectorObjects = 0
+@Field def carbonMonoxideDetectorObject0
+@Field def carbonMonoxideDetectorObject1
+@Field def carbonMonoxideDetectorObject2
+//Global Object for class color control!
+@Field colorControlObjects = 0
+@Field def colorControlObject0
+@Field def colorControlObject1
+@Field def colorControlObject2
+//Global Object for class energy meter!
+@Field energyMeterObjects = 0
+@Field def energyMeterObject0
+@Field def energyMeterObject1
+@Field def energyMeterObject2
+//Global Object for class energy meter!
+@Field illuminanceMeasurementObjects = 0
+@Field def illuminanceMeasurementObject0
+@Field def illuminanceMeasurementObject1
+@Field def illuminanceMeasurementObject2
+//Global Object for class power meter!
+@Field powerMeterObjects = 0
+@Field def powerMeterObject0
+@Field def powerMeterObject1
+@Field def powerMeterObject2
+//Global Object for class power meter!
+@Field humidityMeasurementObjects = 0
+@Field def humidityMeasurementObject0
+@Field def humidityMeasurementObject1
+@Field def humidityMeasurementObject2
+//Global Object for class relay switch!
+@Field relaySwitchObjects = 0
+@Field def relaySwitchObject0
+@Field def relaySwitchObject1
+@Field def relaySwitchObject2
+//Global Object for class sleep sensor!
+@Field sleepSensorObjects = 0
+@Field def sleepSensorObject0
+@Field def sleepSensorObject1
+@Field def sleepSensorObject2
+//Global Object for class sleep sensor!
+@Field stepSensorObjects = 0
+@Field def stepSensorObject0
+@Field def stepSensorObject1
+@Field def stepSensorObject2
+//Global Object for class switch level!
+@Field switchLevelObjects = 0
+@Field def switchLevelObject0
+@Field def switchLevelObject1
+@Field def switchLevelObject2
+//Global Object for class temperature measurement!
+@Field temperatureMeasurementObjects = 0
+@Field def temperatureMeasurementObject0
+@Field def temperatureMeasurementObject1
+@Field def temperatureMeasurementObject2
+//Global Object for class temperature measurement!
+@Field waterSensorObjects = 0
+@Field def waterSensorObject0
+@Field def waterSensorObject1
+@Field def waterSensorObject2
+//Global Object for class valve!
+@Field valveObjects = 0
+@Field def valveObject0
+@Field def valveObject1
+@Field def valveObject2
+//Global Object for class valve!
+@Field mobilePresenceObjects = 0
+@Field def mobilePresenceObject0
+@Field def mobilePresenceObject1
+@Field def mobilePresenceObject2
+
 
 
 //Global variables
@@ -84,6 +293,14 @@ if (App == "App1") {
 @Field number3
 @Field number4
 @Field number5
+//For decimal
+@Field decimalVariables = 0
+@Field decimal0
+@Field decimal1
+@Field decimal2
+@Field decimal3
+@Field decimal4
+@Field decimal5
 //For time
 @Field timeVariables = 0
 @Field time0
@@ -116,858 +333,437 @@ if (App == "App1") {
 @Field contact3
 @Field contact4
 @Field contact5
-
+//For text
+@Field textVariables = 0
+@Field textVariable0
+@Field textVariable1
+@Field textVariable2
+@Field textVariable3
+@Field textVariable4
+@Field textVariable5
+//For boolean
+@Field boolVariables = 0
+@Field boolVariable0
+@Field boolVariable1
+@Field boolVariable2
+@Field boolVariable3
+@Field boolVariable4
+@Field boolVariable5
 
 
 /////Input Methods/////
 //input "",""
 def input(String name, String type) {
-       switch(type) {
+       LinkedHashMap metaData = []
+       metaData.put('name',name)
+       metaData.put('type',type)
+       input(metaData)
+}
+
+//input "","",linkedHashMap
+def input(LinkedHashMap metaData, String name, String type) {
+       metaData.put('name',name)
+       metaData.put('type',type)
+       input(metaData)
+}
+
+//input "", "", linkedHashMap, Closure
+def input(LinkedHashMap metaData, String name, String type, Closure Input) {
+       metaData.put('name',name)
+       metaData.put('type',type)
+       input(metaData)
+       find(Input)
+}
+
+//input linkedHashMap
+def input(LinkedHashMap metaData) {
+       if (metaData.containsKey('title')) {
+               println metaData['title']
+       }
+       if (metaData.containsKey('options')) {
+               println "Options: "+metaData['options']
+       }
+       switch(metaData['type']) {
                case "capability.lock":
-                       lockObject = name
-                       this[lockObject] = new Locks({}, 1)
+                       if (lockObjects == 0) {
+                               lockObject0 = metaData['name']
+                               this[lockObject0] = new Locks({}, 1)
+                       } else if (lockObjects == 1) {
+                               lockObject1 = metaData['name']
+                               this[lockObject1] = new Locks({}, 1)
+                       } else if (lockObjects == 2) {
+                               lockObject2 = metaData['name']
+                               this[lockObject2] = new Locks({}, 1)
+                       }
+
+                       lockObjects=lockObjects+1
+
+                       settings.put(metaData['name'], metaData['name']) 
+
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class lock!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.lockObject\n")              
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.lockObject\n")          
                        } else {
                                extractedObjectsApp2.append("//Object for class lock!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.lockObject\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.lockObject\n")
                        }
                        break
                case "capability.alarm":
+                       if (alarmObjects == 0) {
+                               alarmObject0 = metaData['name']
+                               this[alarmObject0] = new Alarms({}, 1)
+                       } else if (alarmObjects == 1) {
+                               alarmObject1 = metaData['name']
+                               this[alarmObject1] = new Alarms({}, 1)
+                       } else if (alarmObjects == 2) {
+                               alarmObject2 = metaData['name']
+                               this[alarmObject2] = new Alarms({}, 1)
+                       }
+
+                       alarmObjects=alarmObjects+1
+
+                       settings.put(metaData['name'], metaData['name']) 
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class alarm!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.alarmObject\n")         
+                       } else {
+                               extractedObjectsApp2.append("//Object for class alarm!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.alarmObject\n")
+                       }
                        break
                case "capability.battery":
+                       if (batteryObjects == 0) {
+                               batteryObject0 = metaData['name']
+                               this[batteryObject0] = new Batteries({}, 1)
+                       } else if (batteryObjects == 1) {
+                               batteryObject1 = metaData['name']
+                               this[batteryObject1] = new Batteries({}, 1)
+                       } else if (batteryObjects == 2) {
+                               batteryObject2 = metaData['name']
+                               this[batteryObject2] = new Batteries({}, 1)
+                       }
+
+                       batteryObjects=batteryObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class Battery!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.batteryObject\n")               
+                       } else {
+                               extractedObjectsApp2.append("//Object for class Battery!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.batteryObject\n")
+                       }
                        break
                case "capability.beacon":
+                       if (beaconSensorObjects == 0) {
+                               beaconSensorObject0 = metaData['name']
+                               this[beaconSensorObject0] = new BeaconSensors({}, 1)
+                       } else if (beaconSensorObjects == 1) {
+                               beaconSensorObject1 = metaData['name']
+                               this[beaconSensorObject1] = new BeaconSensors({}, 1)
+                       } else if (beaconSensorObjects == 2) {
+                               beaconSensorObject2 = metaData['name']
+                               this[beaconSensorObject2] = new BeaconSensors({}, 1)
+                       }
+
+                       beaconSensorObjects=beaconSensorObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class beacon sensor!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.beaconSensorObject\n")          
+                       } else {
+                               extractedObjectsApp2.append("//Object for class beacon sensor!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.beaconSensorObject\n")
+                       }
                        break
                case "capability.carbonMonoxideDetector":
+                       if (carbonMonoxideDetectorObjects == 0) {
+                               carbonMonoxideDetectorObject0 = metaData['name']
+                               this[carbonMonoxideDetectorObject0] = new CarbonMonoxideDetectors({}, 1)
+                       } else if (carbonMonoxideDetectorObjects == 1) {
+                               carbonMonoxideDetectorObject1 = metaData['name']
+                               this[carbonMonoxideDetectorObject1] = new CarbonMonoxideDetectors({}, 1)
+                       } else if (carbonMonoxideDetectorObjects == 2) {
+                               carbonMonoxideDetectorObject2 = metaData['name']
+                               this[carbonMonoxideDetectorObject2] = new CarbonMonoxideDetectors({}, 1)
+                       }
+
+                       carbonMonoxideDetectorObjects=carbonMonoxideDetectorObjects+1
+                       
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class carbon monoxide detector!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.carbonMonoxideDetectorObject\n")                
+                       } else {
+                               extractedObjectsApp2.append("//Object for class carbon monoxide detector!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.carbonMonoxideDetectorObject\n")
+                       }
                        break
                case "capability.colorControl":
+                       if (colorControlObjects == 0) {
+                               colorControlObject0 = metaData['name']
+                               this[colorControlObject0] = new ColorControls({}, 1)
+                       } else if (colorControlObjects == 1) {
+                               colorControlObject1 = metaData['name']
+                               this[colorControlObject1] = new ColorControls({}, 1)
+                       } else if (colorControlObjects == 2) {
+                               colorControlObject2 = metaData['name']
+                               this[colorControlObject2] = new ColorControls({}, 1)
+                       }
+
+                       colorControlObjects=colorControlObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class color control!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.colorControlObject\n")          
+                       } else {
+                               extractedObjectsApp2.append("//Object for class color control!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.colorControlObject\n")
+                       }
                        break
                case "capability.contactSensor":
-                       contactObject = name
-                       this[contactObject] = new ContactSensors({}, 1)
+                       if (contactObjects == 0) {
+                               contactObject0 = metaData['name']
+                               this[contactObject0] = new ContactSensors({}, 1)
+                       } else if (contactObjects == 1) {
+                               contactObject1 = metaData['name']
+                               this[contactObject1] = new ContactSensors({}, 1)
+                       } else if (contactObjects == 2) {
+                               contactObject2 = metaData['name']
+                               this[contactObject2] = new ContactSensors({}, 1)
+                       }
+
+                       contactObjects=contactObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class contactSensor!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.contactObject\n")           
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.contactObject\n")               
                        } else {
                                extractedObjectsApp2.append("//Object for class contactSensor!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.contactObject\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.contactObject\n")
                        }
                        break
                case "capability.doorControl":
-                       doorControlObject = name
-                       this[doorControlObject] = new DoorControls({}, 1)
+                       if (doorControlObjects == 0) {
+                               doorControlObject0 = metaData['name']
+                               this[doorControlObject0] = new DoorControls({}, 1)
+                       } else if (doorControlObjects == 1) {
+                               doorControlObject1 = metaData['name']
+                               this[doorControlObject1] = new DoorControls({}, 1)
+                       } else if (doorControlObjects == 2) {
+                               doorControlObject2 = metaData['name']
+                               this[doorControlObject2] = new DoorControls({}, 1)
+                       }
+
+                       doorControlObjects=doorControlObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class door control!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.doorControlObject\n")               
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.doorControlObject\n")           
                        } else {
                                extractedObjectsApp2.append("//Object for class door control!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.doorControlObject\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.doorControlObject\n")
                        }
                        break
                case "capability.energyMeter":
-                       break
-               case "capability.illuminanceMeasurement":
-                       break
-               case "capability.accelerationSensor":
-                       break
-               case "capability.motionSensor":
-                       break
-               case "capability.musicPlayer":
-                       break
-               case "capability.powerMeter":
-                       break
-               case "capability.presenceSensor":
-                       presenceSensorObject = name
-                       this[presenceSensorObject] = new PresenceSensors({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class presence sensor!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.presenceSensorObject\n")            
-                       } else {
-                               extractedObjectsApp2.append("//Object for class presence sensor!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.presenceSensorObject\n")
-                       }
-                       break
-               case "capability.relativeHumidityMeasurement":
-                       break
-               case "capability.relaySwitch":
-                       break
-               case "capability.sleepSensor":
-                       break
-               case "capability.smokeDetector":
-                       break
-               case "capability.stepSensor":
-                       break
-               case "capability.switch":
-                       switchObject = name
-                       this[switchObject] = new Switches({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class switch!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.switchObject\n")            
-                       } else {
-                               extractedObjectsApp2.append("//Object for class switch!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.switchObject\n")
+                       if (energyMeterObjects == 0) {
+                               energyMeterObject0 = metaData['name']
+                               this[energyMeterObject0] = new EnergyMeters({}, 1)
+                       } else if (energyMeterObjects == 1) {
+                               energyMeterObject1 = metaData['name']
+                               this[energyMeterObject1] = new EnergyMeters({}, 1)
+                       } else if (energyMeterObjects == 2) {
+                               energyMeterObject2 = metaData['name']
+                               this[energyMeterObject2] = new EnergyMeters({}, 1)
                        }
-                       break
-               case "capability.switchLevel":
-                       break
-               case "capability.temperatureMeasurement":
-                       break
-               case "capability.thermostat":
-                       thermostatObject = name
-                       this[thermostatObject] = new Thermostats({}, 1)
+
+                       energyMeterObjects=energyMeterObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class thermostat!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.thermostatObject\n")                
+                               extractedObjectsApp1.append("//Object for class energy meter!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.energyMeterObject\n")           
                        } else {
-                               extractedObjectsApp2.append("//Object for class thermostat!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.thermostatObject\n")
+                               extractedObjectsApp2.append("//Object for class energy meter!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.energyMeterObject\n")
                        }
                        break
-               case "capability.valve":
-                       break
-               case "capability.waterSensor":
-                       break
-               case "capability.touchSensor":
-                       touchSensorObject = name
-                       this[touchSensorObject] = new NfcTouch({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class Touch Sensor!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.touchSensorObject\n")               
-                       } else {
-                               extractedObjectsApp2.append("//Object for class Touch Sensor!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.touchSensorObject\n")
+               case "capability.illuminanceMeasurement":
+                       if (illuminanceMeasurementObjects == 0) {
+                               illuminanceMeasurementObject0 = metaData['name']
+                               this[illuminanceMeasurementObject0] = new IlluminanceMeasurements({}, 1)
+                       } else if (illuminanceMeasurementObjects == 1) {
+                               illuminanceMeasurementObject1 = metaData['name']
+                               this[illuminanceMeasurementObject1] = new IlluminanceMeasurements({}, 1)
+                       } else if (illuminanceMeasurementObjects == 2) {
+                               illuminanceMeasurementObject2 = metaData['name']
+                               this[illuminanceMeasurementObject2] = new IlluminanceMeasurements({}, 1)
                        }
-                       break
-               case "capability.imageCapture":
-                       break
-               case "device.mobilePresence":
-                       break
-               case "device.aeonKeyFob":
-                       break
-               case "mode":
-                       def userInput = System.console().readLine 'Enter the mode:'
 
-                       if (modeVariables == 0) {
-                               mode0 = name
-                               this[mode0] = userInput
-                       } else if (modeVariables == 1) {
-                               mode1 = name
-                               this[mode1] = userInput
-                       } else if (modeVariables == 2) {
-                               mode2 = name
-                               this[mode2] = userInput
-                       } else if (modeVariables == 3) {
-                               mode3 = name
-                               this[mode3] = userInput
-                       } else if (modeVariables == 4) {
-                               mode4 = name
-                               this[mode4] = userInput
-                       } else if (modeVariables == 5) {
-                               mode5 = name
-                               this[mode5] = userInput
-                       }
+                       illuminanceMeasurementObjects=illuminanceMeasurementObjects+1
 
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for mode!\n")
-                               extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class illuminance measurement!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.illuminanceMeasurementObject\n")                
                        } else {
-                               extractedObjectsApp2.append("//Global variable for mode!\n")
-                               extractedObjectsApp2.append("def "+name+" = \""+userInput+"\"\n")
+                               extractedObjectsApp2.append("//Object for class illuminance measurement!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.illuminanceMeasurementObject\n")
                        }
                        break
-               case "decimal":
-                       break
-               case "text":
-                       break
-               case "number":
-                       def userInput = System.console().readLine 'Enter the number:'
-                       
-                       if (numberVariables == 0) {
-                               number0 = name
-                               this[number0] = userInput
-                       } else if (numberVariables == 1) {
-                               number1 = name
-                               this[number1] = userInput
-                       } else if (numberVariables == 2) {
-                               number2 = name
-                               this[number2] = userInput
-                       } else if (numberVariables == 3) {
-                               number3 = name
-                               this[number3] = userInput
-                       } else if (numberVariables == 4) {
-                               number4 = name
-                               this[number4] = userInput
-                       } else if (numberVariables == 5) {
-                               number5 = name
-                               this[number5] = userInput
+               case "capability.accelerationSensor":
+                       if (accelerationSensorObjects == 0) {
+                               accelerationSensorObject0 = metaData['name']
+                               this[accelerationSensorObject0] = new AccelerationSensors({}, 1)
+                       } else if (accelerationSensorObjects == 1) {
+                               accelerationSensorObject1 = metaData['name']
+                               this[accelerationSensorObject1] = new AccelerationSensors({}, 1)
+                       } else if (accelerationSensorObjects == 2) {
+                               accelerationSensorObject2 = metaData['name']
+                               this[accelerationSensorObject2] = new AccelerationSensors({}, 1)
                        }
 
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for number!\n")
-                               extractedObjectsApp1.append("def "+name+" = "+userInput+"\n")
+                       accelerationSensorObjects=accelerationSensorObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class Acceleration Sensor!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.accelerationSensorObject\n")            
                        } else {
-                               extractedObjectsApp2.append("//Global variable for number!\n")
-                               extractedObjectsApp2.append("def "+name+" = "+userInput+"\n")
+                               extractedObjectsApp2.append("//Object for class Acceleration Sensor!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.accelerationSensorObject\n")
                        }
                        break
-               case "time":
-                       def userInput = System.console().readLine 'Enter the time:'
-                       
-                       if (timeVariables == 0) {
-                               time0 = name
-                               this[time0] = userInput
-                       } else if (timeVariables == 1) {
-                               time1 = name
-                               this[time1] = userInput
-                       } else if (timeVariables == 2) {
-                               time2 = name
-                               this[time2] = userInput
-                       } else if (timeVariables == 3) {
-                               time3 = name
-                               this[time3] = userInput
-                       } else if (timeVariables == 4) {
-                               time4 = name
-                               this[time4] = userInput
-                       } else if (timeVariables == 5) {
-                               time5 = name
-                               this[time5] = userInput
+               case "capability.motionSensor":
+                       if (motionSensorObjects == 0) {
+                               motionSensorObject0 = metaData['name']
+                               this[motionSensorObject0] = new MotionSensors({}, 1)
+                       } else if (motionSensorObjects == 1) {
+                               motionSensorObject1 = metaData['name']
+                               this[motionSensorObject1] = new MotionSensors({}, 1)
+                       } else if (motionSensorObjects == 2) {
+                               motionSensorObject2 = metaData['name']
+                               this[motionSensorObject2] = new MotionSensors({}, 1)
                        }
 
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for time!\n")
-                               extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
+                       motionSensorObjects=motionSensorObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class Motion Sensor!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.motionSensorObject\n")          
                        } else {
-                               extractedObjectsApp2.append("//Global variable for time!\n")
-                               extractedObjectsApp2.append("def "+name+" = \""+userInput+"\"\n")
+                               extractedObjectsApp2.append("//Object for class Motion Sensor!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.motionSensorObject\n")
                        }
                        break
-               case "enum":
-                       def userInput = System.console().readLine 'Enter the enum:'
-       
-                       if (enumVariables == 0) {
-                               enum0 = name
-                               this[enum0] = userInput
-                       } else if (enumVariables == 1) {
-                               enum1 = name
-                               this[enum1] = userInput
-                       } else if (enumVariables == 2) {
-                               enum2 = name
-                               this[enum2] = userInput
-                       } else if (enumVariables == 3) {
-                               enum3 = name
-                               this[enum3] = userInput
-                       } else if (enumVariables == 4) {
-                               enum4 = name
-                               this[enum4] = userInput
-                       } else if (enumVariables == 5) {
-                               enum5 = name
-                               this[enum5] = userInput
+               case "capability.musicPlayer":
+                       if (musicPlayerObjects == 0) {
+                               musicPlayerObject0 = metaData['name']
+                               this[musicPlayerObject0] = new MusicPlayers({}, 1)
+                       } else if (musicPlayerObjects == 1) {
+                               musicPlayerObject1 = metaData['name']
+                               this[musicPlayerObject1] = new MusicPlayers({}, 1)
+                       } else if (musicPlayerObjects == 2) {
+                               musicPlayerObject2 = metaData['name']
+                               this[musicPlayerObject2] = new MusicPlayers({}, 1)
                        }
 
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for enum!\n")
-                               extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
+                       musicPlayerObjects=musicPlayerObjects+1
+
+                       settings.put(metaData['name'], metaData['name']) 
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class music player!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.musicPlayerObject\n")           
                        } else {
-                               extractedObjectsApp2.append("//Global variable for enum!\n")
-                               extractedObjectsApp2.append("def "+name+" = \""+userInput+"\"\n")
+                               extractedObjectsApp2.append("//Object for class music player!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.musicPlayerObject\n")
                        }
                        break
-               case "bool":
-                       break
-               case "phone":
-                       def userInput = System.console().readLine 'Enter the phone:'
-
-                       if (phoneVariables == 0) {
-                               phone0 = name
-                               this[phone0] = userInput
-                       } else if (phoneVariables == 1) {
-                               phone1 = name
-                               this[phone1] = userInput
-                       } else if (phoneVariables == 2) {
-                               phone2 = name
-                               this[phone2] = userInput
-                       } else if (phoneVariables == 3) {
-                               phone3 = name
-                               this[phone3] = userInput
-                       } else if (phoneVariables == 4) {
-                               phone4 = name
-                               this[phone4] = userInput
-                       } else if (phoneVariables == 5) {
-                               phone5 = name
-                               this[phone5] = userInput
-                       }
-
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for phone!\n")
-                               extractedObjectsApp1.append("def "+name+" = "+userInput+"\n")
-                       } else {
-                               extractedObjectsApp2.append("//Global variable for phone!\n")
-                               extractedObjectsApp2.append("def "+name+" = "+userInput+"\n")
-                       }
-                       break
-               case "contact":
-                       def userInput = System.console().readLine 'Enter the name of the contact:'
-       
-                       if (contactVariables == 0) {
-                               contact0 = name
-                               this[contact0] = userInput
-                       } else if (contactVariables == 1) {
-                               contact1 = name
-                               this[contact1] = userInput
-                       } else if (contactVariables == 2) {
-                               contact2 = name
-                               this[contact2] = userInput
-                       } else if (contactVariables == 3) {
-                               contact3 = name
-                               this[contact3] = userInput
-                       } else if (contactVariables == 4) {
-                               contact4 = name
-                               this[contact4] = userInput
-                       } else if (contactVariables == 5) {
-                               contact5 = name
-                               this[contact5] = userInput
-                       }
-
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for contact!\n")
-                               extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
-                       } else {
-                               extractedObjectsApp2.append("//Global variable for contact!\n")
-                               extractedObjectsApp2.append("def "+name+" = \""+userInput+"\"\n")
-                       }
-                       break
-               default:
-                       break
-       }
-}
-
-//input "","",linkedHashMap
-def input(LinkedHashMap metaData, String name, String type) {
-       switch(type) {
-               case "capability.lock":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       lockObject = name
-                       this[lockObject] = new Locks({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class lock!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.lockObject\n")              
-                       } else {
-                               extractedObjectsApp2.append("//Object for class lock!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.lockObject\n")
-                       }
-                       break
-               case "capability.alarm":
-                       break
-               case "capability.battery":
-                       break
-               case "capability.beacon":
-                       break
-               case "capability.carbonMonoxideDetector":
-                       break
-               case "capability.colorControl":
-                       break
-               case "capability.contactSensor":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       contactObject = name
-                       this[contactObject] = new ContactSensors({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class contactSensor!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.contactObject\n")           
-                       } else {
-                               extractedObjectsApp2.append("//Object for class contactSensor!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.contactObject\n")
-                       }
-                       break
-               case "capability.doorControl":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       doorControlObject = name
-                       this[doorControlObject] = new DoorControls({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class door control!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.doorControlObject\n")               
-                       } else {
-                               extractedObjectsApp2.append("//Object for class door control!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.doorControlObject\n")
-                       }
-                       break
-               case "capability.energyMeter":
-                       break
-               case "capability.illuminanceMeasurement":
-                       break
-               case "capability.accelerationSensor":
-                       break
-               case "capability.motionSensor":
-                       break
-               case "capability.musicPlayer":
-                       break
-               case "capability.powerMeter":
-                       break
-               case "capability.presenceSensor":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       presenceSensorObject = name
-                       this[presenceSensorObject] = new PresenceSensors({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class presence sensor!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.presenceSensorObject\n")            
-                       } else {
-                               extractedObjectsApp2.append("//Object for class presence sensor!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.presenceSensorObject\n")
-                       }
-                       break
-               case "capability.relativeHumidityMeasurement":
-                       break
-               case "capability.relaySwitch":
-                       break
-               case "capability.sleepSensor":
-                       break
-               case "capability.smokeDetector":
-                       break
-               case "capability.stepSensor":
-                       break
-               case "capability.switch":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       switchObject = name
-                       this[switchObject] = new Switches({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class switch!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.switchObject\n")            
-                       } else {
-                               extractedObjectsApp2.append("//Object for class switch!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.switchObject\n")
-                       }
-                       break
-               case "capability.switchLevel":
-                       break
-               case "capability.temperatureMeasurement":
-                       break
-               case "capability.thermostat":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       thermostatObject = name
-                       this[thermostatObject] = new Thermostats({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class thermostat!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.thermostatObject\n")                
-                       } else {
-                               extractedObjectsApp2.append("//Object for class thermostat!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.thermostatObject\n")
-                       }
-                       break
-               case "capability.valve":
-                       break
-               case "capability.waterSensor":
-                       break
-               case "capability.touchSensor":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       touchSensorObject = name
-                       this[touchSensorObject] = new NfcTouch({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class Touch Sensor!\n")
-                               extractedObjectsApp1.append("def "+name+"\n")
-                               extractedObjectsConstructorApp1.append(name+" = obj.touchSensorObject\n")               
-                       } else {
-                               extractedObjectsApp2.append("//Object for class Touch Sensor!\n")
-                               extractedObjectsApp2.append("def "+name+"\n")
-                               extractedObjectsConstructorApp2.append(name+" = obj.touchSensorObject\n")
-                       }
-                       break
-               case "capability.imageCapture":
-                       break
-               case "device.mobilePresence":
-                       break
-               case "device.aeonKeyFob":
-                       break
-               case "mode":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       def userInput = System.console().readLine 'Enter the mode:'
-
-                       if (modeVariables == 0) {
-                               mode0 = name
-                               this[mode0] = userInput
-                       } else if (modeVariables == 1) {
-                               mode1 = name
-                               this[mode1] = userInput
-                       } else if (modeVariables == 2) {
-                               mode2 = name
-                               this[mode2] = userInput
-                       } else if (modeVariables == 3) {
-                               mode3 = name
-                               this[mode3] = userInput
-                       } else if (modeVariables == 4) {
-                               mode4 = name
-                               this[mode4] = userInput
-                       } else if (modeVariables == 5) {
-                               mode5 = name
-                               this[mode5] = userInput
-                       }
-               
-                       modeVariables=modeVariables+1
-
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for mode!\n")
-                               extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
-                       } else {
-                               extractedObjectsApp2.append("//Global variable for mode!\n")
-                               extractedObjectsApp2.append("def "+name+" = \""+userInput+"\"\n")
-                       }
-                       break
-               case "decimal":
-                       break
-               case "text":
-                       break
-               case "number":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       def userInput = System.console().readLine 'Enter the number:'
-                       
-                       if (numberVariables == 0) {
-                               number0 = name
-                               this[number0] = userInput
-                       } else if (numberVariables == 1) {
-                               number1 = name
-                               this[number1] = userInput
-                       } else if (numberVariables == 2) {
-                               number2 = name
-                               this[number2] = userInput
-                       } else if (numberVariables == 3) {
-                               number3 = name
-                               this[number3] = userInput
-                       } else if (numberVariables == 4) {
-                               number4 = name
-                               this[number4] = userInput
-                       } else if (numberVariables == 5) {
-                               number5 = name
-                               this[number5] = userInput
-                       }
-
-                       numberVariables=numberVariables+1
-
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for number!\n")
-                               extractedObjectsApp1.append("def "+name+" = "+userInput+"\n")
-                       } else {
-                               extractedObjectsApp2.append("//Global variable for number!\n")
-                               extractedObjectsApp2.append("def "+name+" = "+userInput+"\n")
-                       }
-                       break
-               case "time":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       def userInput = System.console().readLine 'Enter the time:'
-                       
-                       if (timeVariables == 0) {
-                               time0 = name
-                               this[time0] = userInput
-                       } else if (timeVariables == 1) {
-                               time1 = name
-                               this[time1] = userInput
-                       } else if (timeVariables == 2) {
-                               time2 = name
-                               this[time2] = userInput
-                       } else if (timeVariables == 3) {
-                               time3 = name
-                               this[time3] = userInput
-                       } else if (timeVariables == 4) {
-                               time4 = name
-                               this[time4] = userInput
-                       } else if (timeVariables == 5) {
-                               time5 = name
-                               this[time5] = userInput
-                       }
-
-                       timeVariables=timeVariables+1
-
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for time!\n")
-                               extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
-                       } else {
-                               extractedObjectsApp2.append("//Global variable for time!\n")
-                               extractedObjectsApp2.append("def "+name+" = \""+userInput+"\"\n")
-                       }
-                       break
-               case "enum":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       def userInput = System.console().readLine 'Enter the enum:'
-       
-                       if (enumVariables == 0) {
-                               enum0 = name
-                               this[enum0] = userInput
-                       } else if (enumVariables == 1) {
-                               enum1 = name
-                               this[enum1] = userInput
-                       } else if (enumVariables == 2) {
-                               enum2 = name
-                               this[enum2] = userInput
-                       } else if (enumVariables == 3) {
-                               enum3 = name
-                               this[enum3] = userInput
-                       } else if (enumVariables == 4) {
-                               enum4 = name
-                               this[enum4] = userInput
-                       } else if (enumVariables == 5) {
-                               enum5 = name
-                               this[enum5] = userInput
-                       }
-
-                       enumVariables=enumVariables+1
-
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for enum!\n")
-                               extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
-                       } else {
-                               extractedObjectsApp2.append("//Global variable for enum!\n")
-                               extractedObjectsApp2.append("def "+name+" = \""+userInput+"\"\n")
-                       }
-                       break
-               case "bool":
-                       break
-               case "phone":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       def userInput = System.console().readLine 'Enter the phone:'
-
-                       if (phoneVariables == 0) {
-                               phone0 = name
-                               this[phone0] = userInput
-                       } else if (phoneVariables == 1) {
-                               phone1 = name
-                               this[phone1] = userInput
-                       } else if (phoneVariables == 2) {
-                               phone2 = name
-                               this[phone2] = userInput
-                       } else if (phoneVariables == 3) {
-                               phone3 = name
-                               this[phone3] = userInput
-                       } else if (phoneVariables == 4) {
-                               phone4 = name
-                               this[phone4] = userInput
-                       } else if (phoneVariables == 5) {
-                               phone5 = name
-                               this[phone5] = userInput
-                       }
-
-                       phoneVariables=phoneVariables+1
-
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for phone!\n")
-                               extractedObjectsApp1.append("def "+name+" = "+userInput+"\n")
-                       } else {
-                               extractedObjectsApp2.append("//Global variable for phone!\n")
-                               extractedObjectsApp2.append("def "+name+" = "+userInput+"\n")
-                       }
-                       break
-               case "contact":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       def userInput = System.console().readLine 'Enter the name of the contact:'
-       
-                       if (contactVariables == 0) {
-                               contact0 = name
-                               this[contact0] = userInput
-                       } else if (contactVariables == 1) {
-                               contact1 = name
-                               this[contact1] = userInput
-                       } else if (contactVariables == 2) {
-                               contact2 = name
-                               this[contact2] = userInput
-                       } else if (contactVariables == 3) {
-                               contact3 = name
-                               this[contact3] = userInput
-                       } else if (contactVariables == 4) {
-                               contact4 = name
-                               this[contact4] = userInput
-                       } else if (contactVariables == 5) {
-                               contact5 = name
-                               this[contact5] = userInput
-                       }
-
-                       contactVariables=contactVariables+1
-
-                       if (App == "App1") {                    
-                               extractedObjectsApp1.append("//Global variable for contact!\n")
-                               extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
-                       } else {
-                               extractedObjectsApp2.append("//Global variable for contact!\n")
-                               extractedObjectsApp2.append("def "+name+" = \""+userInput+"\"\n")
-                       }
-                       break
-               default:
-                       break
-       }
-}
-//input linkedHashMap
-def input(LinkedHashMap metaData) {
-       switch(metaData['type']) {
-               case "capability.lock":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       lockObject = metaData['name']
-                       this[lockObject] = new Locks({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class lock!\n")
-                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
-                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.lockObject\n")          
-                       } else {
-                               extractedObjectsApp2.append("//Object for class lock!\n")
-                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
-                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.lockObject\n")
-                       }
-                       break
-               case "capability.alarm":
-                       break
-               case "capability.battery":
-                       break
-               case "capability.beacon":
-                       break
-               case "capability.carbonMonoxideDetector":
-                       break
-               case "capability.colorControl":
-                       break
-               case "capability.contactSensor":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       contactObject = metaData['name']
-                       this[contactObject] = new ContactSensors({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class contactSensor!\n")
-                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
-                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.contactObject\n")               
-                       } else {
-                               extractedObjectsApp2.append("//Object for class contactSensor!\n")
-                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
-                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.contactObject\n")
-                       }
-                       break
-               case "capability.doorControl":
-                       doorControlObject = metaData['name']
-                       this[doorControlObject] = new DoorControls({}, 1)
-                       if (App == "App1") {
-                               extractedObjectsApp1.append("//Object for class door control!\n")
-                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
-                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.doorControlObject\n")           
-                       } else {
-                               extractedObjectsApp2.append("//Object for class door control!\n")
-                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
-                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.doorControlObject\n")
-                       }
-                       break
-               case "capability.energyMeter":
-                       break
-               case "capability.illuminanceMeasurement":
-                       break
-               case "capability.accelerationSensor":
-                       break
-               case "capability.motionSensor":
-                       break
-               case "capability.musicPlayer":
-                       break
                case "capability.powerMeter":
+                       if (powerMeterObjects == 0) {
+                               powerMeterObject0 = metaData['name']
+                               this[powerMeterObject0] = new PowerMeters({}, 1)
+                       } else if (powerMeterObjects == 1) {
+                               powerMeterObject1 = metaData['name']
+                               this[powerMeterObject1] = new PowerMeters({}, 1)
+                       } else if (powerMeterObjects == 2) {
+                               powerMeterObject2 = metaData['name']
+                               this[powerMeterObject2] = new PowerMeters({}, 1)
+                       }
+
+                       powerMeterObjects=powerMeterObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class power meter!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.powerMeterObject\n")            
+                       } else {
+                               extractedObjectsApp2.append("//Object for class power meter!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.powerMeterObject\n")
+                       }
                        break
                case "capability.presenceSensor":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
+                       if (presenceSensorObjects == 0) {
+                               presenceSensorObject0 = metaData['name']
+                               this[presenceSensorObject0] = new PresenceSensors({}, 1)
+                       } else if (presenceSensorObjects == 1) {
+                               presenceSensorObject1 = metaData['name']
+                               this[presenceSensorObject1] = new PresenceSensors({}, 1)
+                       } else if (presenceSensorObjects == 2) {
+                               presenceSensorObject2 = metaData['name']
+                               this[presenceSensorObject2] = new PresenceSensors({}, 1)
                        }
-                       presenceSensorObject = metaData['name']
-                       this[presenceSensorObject] = new PresenceSensors({}, 1)
+
+                       presenceSensorObjects=presenceSensorObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class presence sensor!\n")
                                extractedObjectsApp1.append("def "+metaData['name']+"\n")
@@ -979,24 +775,151 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.relativeHumidityMeasurement":
+                       if (humidityMeasurementObjects == 0) {
+                               humidityMeasurementObject0 = metaData['name']
+                               this[humidityMeasurementObject0] = new RelativeHumidityMeasurements({}, 1)
+                       } else if (humidityMeasurementObjects == 1) {
+                               humidityMeasurementObject1 = metaData['name']
+                               this[humidityMeasurementObject1] = new RelativeHumidityMeasurements({}, 1)
+                       } else if (humidityMeasurementObjects == 2) {
+                               humidityMeasurementObject2 = metaData['name']
+                               this[humidityMeasurementObject2] = new RelativeHumidityMeasurements({}, 1)
+                       }
+
+                       humidityMeasurementObjects=humidityMeasurementObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class humidity measurement!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.humidityMeasurementObject\n")           
+                       } else {
+                               extractedObjectsApp2.append("//Object for class humidity measurement!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.humidityMeasurementObject\n")
+                       }
                        break
                case "capability.relaySwitch":
+                       if (relaySwitchObjects == 0) {
+                               relaySwitchObject0 = metaData['name']
+                               this[relaySwitchObject0] = new RelaySwitches({}, 1)
+                       } else if (relaySwitchObjects == 1) {
+                               relaySwitchObject1 = metaData['name']
+                               this[relaySwitchObject1] = new RelaySwitches({}, 1)
+                       } else if (relaySwitchObjects == 2) {
+                               relaySwitchObject2 = metaData['name']
+                               this[relaySwitchObject2] = new RelaySwitches({}, 1)
+                       }
+
+                       relaySwitchObjects=relaySwitchObjects+1
+                       
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class relay switch!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.relaySwitchObject\n")           
+                       } else {
+                               extractedObjectsApp2.append("//Object for class relay switch!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.relaySwitchObject\n")
+                       }
                        break
                case "capability.sleepSensor":
+                       if (sleepSensorObjects == 0) {
+                               sleepSensorObject0 = metaData['name']
+                               this[sleepSensorObject0] = new SleepSensors({}, 1)
+                       } else if (sleepSensorObjects == 1) {
+                               sleepSensorObject1 = metaData['name']
+                               this[sleepSensorObject1] = new SleepSensors({}, 1)
+                       } else if (sleepSensorObjects == 2) {
+                               sleepSensorObject2 = metaData['name']
+                               this[sleepSensorObject2] = new SleepSensors({}, 1)
+                       }
+
+                       sleepSensorObjects=sleepSensorObjects+1
+                       
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class sleep sensor!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.sleepSensorObject\n")           
+                       } else {
+                               extractedObjectsApp2.append("//Object for class sleep sensor!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.sleepSensorObject\n")
+                       }
                        break
                case "capability.smokeDetector":
+                       if (smokeDetectorObjects == 0) {
+                               smokeDetectorObject0 = metaData['name']
+                               this[smokeDetectorObject0] = new SmokeDetectors({}, 1)
+                       } else if (smokeDetectorObjects == 1) {
+                               smokeDetectorObject1 = metaData['name']
+                               this[smokeDetectorObject1] = new SmokeDetectors({}, 1)
+                       } else if (smokeDetectorObjects == 2) {
+                               smokeDetectorObject2 = metaData['name']
+                               this[smokeDetectorObject2] = new SmokeDetectors({}, 1)
+                       }
+
+                       smokeDetectorObjects=smokeDetectorObjects+1
+                       
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class smoke detector!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.smokeDetectorObject\n")         
+                       } else {
+                               extractedObjectsApp2.append("//Object for class smoke detector!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.smokeDetectorObject\n")
+                       }
                        break
                case "capability.stepSensor":
+                       if (stepSensorObjects == 0) {
+                               stepSensorObject0 = metaData['name']
+                               this[stepSensorObject0] = new StepSensors({}, 1)
+                       } else if (stepSensorObjects == 1) {
+                               stepSensorObject1 = metaData['name']
+                               this[stepSensorObject1] = new StepSensors({}, 1)
+                       } else if (stepSensorObjects == 2) {
+                               stepSensorObject2 = metaData['name']
+                               this[stepSensorObject2] = new StepSensors({}, 1)
+                       }
+
+                       stepSensorObjects=stepSensorObjects+1
+                       
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class step sensor!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.stepSensorObject\n")            
+                       } else {
+                               extractedObjectsApp2.append("//Object for class step sensor!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.stepSensorObject\n")
+                       }
                        break
                case "capability.switch":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       switchObject = metaData['name']
-                       this[switchObject] = new Switches({}, 1)
+                       if (switchObjects == 0) {
+                               switchObject0 = metaData['name']
+                               this[switchObject0] = new Switches({}, 1)
+                       } else if (switchObjects == 1) {
+                               switchObject1 = metaData['name']
+                               this[switchObject1] = new Switches({}, 1)
+                       } else if (switchObjects == 2) {
+                               switchObject2 = metaData['name']
+                               this[switchObject2] = new Switches({}, 1)
+                       }
+
+                       switchObjects=switchObjects+1
+                       
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class switch!\n")
                                extractedObjectsApp1.append("def "+metaData['name']+"\n")
@@ -1008,18 +931,73 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.switchLevel":
+                       if (switchLevelObjects == 0) {
+                               switchLevelObject0 = metaData['name']
+                               this[switchLevelObject0] = new SwitchLevels({}, 1)
+                       } else if (switchLevelObjects == 1) {
+                               switchLevelObject1 = metaData['name']
+                               this[switchLevelObject1] = new SwitchLevels({}, 1)
+                       } else if (switchLevelObjects == 2) {
+                               switchLevelObject2 = metaData['name']
+                               this[switchLevelObject2] = new SwitchLevels({}, 1)
+                       }
+
+                       switchLevelObjects=switchLevelObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class switch level!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.switchLevelObject\n")           
+                       } else {
+                               extractedObjectsApp2.append("//Object for class switch level!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.switchLevelObject\n")
+                       }
                        break
                case "capability.temperatureMeasurement":
+                       if (temperatureMeasurementObjects == 0) {
+                               temperatureMeasurementObject0 = metaData['name']
+                               this[temperatureMeasurementObject0] = new TemperatureMeasurements({}, 1)
+                       } else if (temperatureMeasurementObjects == 1) {
+                               temperatureMeasurementObject1 = metaData['name']
+                               this[temperatureMeasurementObject1] = new TemperatureMeasurements({}, 1)
+                       } else if (temperatureMeasurementObjects == 2) {
+                               temperatureMeasurementObject2 = metaData['name']
+                               this[temperatureMeasurementObject2] = new TemperatureMeasurements({}, 1)
+                       }
+
+                       temperatureMeasurementObjects=temperatureMeasurementObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class temperature measurement!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.temperatureMeasurementObject\n")                
+                       } else {
+                               extractedObjectsApp2.append("//Object for class temperature measurement!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.temperatureMeasurementObject\n")
+                       }
                        break
                case "capability.thermostat":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
+                       if (thermostatObjects == 0) {
+                               thermostatObject0 = metaData['name']
+                               this[thermostatObject0] = new Thermostats({}, 1)
+                       } else if (thermostatObjects == 1) {
+                               thermostatObject1 = metaData['name']
+                               this[thermostatObject1] = new Thermostats({}, 1)
+                       } else if (thermostatObjects == 2) {
+                               thermostatObject2 = metaData['name']
+                               this[thermostatObject2] = new Thermostats({}, 1)
                        }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       thermostatObject = metaData['name']
-                       this[thermostatObject] = new Thermostats({}, 1)
+
+                       thermostatObjects=thermostatObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class thermostat!\n")
                                extractedObjectsApp1.append("def "+metaData['name']+"\n")
@@ -1031,18 +1009,99 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.valve":
+                       if (valveObjects == 0) {
+                               valveObject0 = metaData['name']
+                               this[valveObject0] = new Valves({}, 1)
+                       } else if (valveObjects == 1) {
+                               valveObject1 = metaData['name']
+                               this[valveObject1] = new Valves({}, 1)
+                       } else if (valveObjects == 2) {
+                               valveObject2 = metaData['name']
+                               this[valveObject2] = new Valves({}, 1)
+                       }
+
+                       valveObjects=valveObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class valve!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.valveObject\n")         
+                       } else {
+                               extractedObjectsApp2.append("//Object for class valve!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.valveObject\n")
+                       }
+                       break
+               case "capability.speechSynthesis":
+                       if (speechSynthesisObjects == 0) {
+                               speechSynthesisObject0 = metaData['name']
+                               this[speechSynthesisObject0] = new SpeechSynthesises({}, 1)
+                       } else if (speechSynthesisObjects == 1) {
+                               speechSynthesisObject1 = metaData['name']
+                               this[speechSynthesisObject1] = new SpeechSynthesises({}, 1)
+                       } else if (speechSynthesisObjects == 2) {
+                               speechSynthesisObject2 = metaData['name']
+                               this[speechSynthesisObject2] = new SpeechSynthesises({}, 1)
+                       }
+
+                       speechSynthesisObjects=speechSynthesisObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class speech synthesis!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.speechSynthesisObject\n")               
+                       } else {
+                               extractedObjectsApp2.append("//Object for class speech synthesis!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.speechSynthesisObject\n")
+                       }
                        break
                case "capability.waterSensor":
+                       if (waterSensorObjects == 0) {
+                               waterSensorObject0 = metaData['name']
+                               this[waterSensorObject0] = new WaterSensors({}, 1)
+                       } else if (waterSensorObjects == 1) {
+                               waterSensorObject1 = metaData['name']
+                               this[waterSensorObject1] = new WaterSensors({}, 1)
+                       } else if (waterSensorObjects == 2) {
+                               waterSensorObject2 = metaData['name']
+                               this[waterSensorObject2] = new WaterSensors({}, 1)
+                       }
+
+                       waterSensorObjects=waterSensorObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class water sensor!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.waterSensorObject\n")           
+                       } else {
+                               extractedObjectsApp2.append("//Object for class water sensor!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.waterSensorObject\n")
+                       }
                        break
                case "capability.touchSensor":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
+                       if (touchSensorObjects == 0) {
+                               touchSensorObject0 = metaData['name']
+                               this[touchSensorObject0] = new NfcTouch({}, 1)
+                       } else if (touchSensorObjects == 1) {
+                               touchSensorObject1 = metaData['name']
+                               this[touchSensorObject1] = new NfcTouch({}, 1)
+                       } else if (touchSensorObjects == 2) {
+                               touchSensorObject2 = metaData['name']
+                               this[touchSensorObject2] = new NfcTouch({}, 1)
                        }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       touchSensorObject = metaData['name']
-                       this[touchSensorObject] = new NfcTouch({}, 1)
+
+                       touchSensorObjects=touchSensorObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class Touch Sensor!\n")
                                extractedObjectsApp1.append("def "+metaData['name']+"\n")
@@ -1054,19 +1113,87 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.imageCapture":
+                       if (imageCaptureObjects == 0) {
+                               imageCaptureObject0 = metaData['name']
+                               this[imageCaptureObject0] = new ImageCaptures({}, 1)
+                       } else if (imageCaptureObjects == 1) {
+                               imageCaptureObject1 = metaData['name']
+                               this[imageCaptureObject1] = new ImageCaptures({}, 1)
+                       } else if (imageCaptureObjects == 2) {
+                               imageCaptureObject2 = metaData['name']
+                               this[imageCaptureObject2] = new ImageCaptures({}, 1)
+                       }
+
+                       imageCaptureObjects=imageCaptureObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class Image Capture!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.imageCaptureObject\n")          
+                       } else {
+                               extractedObjectsApp2.append("//Object for class Image Capture!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.imageCaptureObject\n")
+                       }
                        break
                case "device.mobilePresence":
+                       if (mobilePresenceObjects == 0) {
+                               mobilePresenceObject0 = metaData['name']
+                               this[mobilePresenceObject0] = new MobilePresences({}, 1)
+                       } else if (mobilePresenceObjects == 1) {
+                               mobilePresenceObject1 = metaData['name']
+                               this[mobilePresenceObject1] = new MobilePresences({}, 1)
+                       } else if (mobilePresenceObjects == 2) {
+                               mobilePresenceObject2 = metaData['name']
+                               this[mobilePresenceObject2] = new MobilePresences({}, 1)
+                       }
+
+                       mobilePresenceObjects=mobilePresenceObjects+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class mobile presence!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.mobilePresenceObject\n")                
+                       } else {
+                               extractedObjectsApp2.append("//Object for class mobile presence!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.mobilePresenceObject\n")
+                       }
                        break
                case "device.aeonKeyFob":
-                       break
-               case "mode":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
+                       if (aeonKeyFobObjects == 0) {
+                               aeonKeyFobObject0 = metaData['name']
+                               this[aeonKeyFobObject0] = new AeonKeyFobs({}, 1)
+                       } else if (aeonKeyFobObjects == 1) {
+                               aeonKeyFobObject1 = metaData['name']
+                               this[aeonKeyFobObject1] = new AeonKeyFobs({}, 1)
+                       } else if (aeonKeyFobObjects == 2) {
+                               aeonKeyFobObject2 = metaData['name']
+                               this[aeonKeyFobObject2] = new AeonKeyFobs({}, 1)
                        }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
+
+                       aeonKeyFobObjects=aeonKeyFobObjects+1
+
+                       settings.put(metaData['name'], metaData['name']) 
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class aeon key fob!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.aeonKeyFobObject\n")            
+                       } else {
+                               extractedObjectsApp2.append("//Object for class aeon key fob!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.aeonKeyFobObject\n")
                        }
-                       def userInput = System.console().readLine 'Enter the mode:'
+                       break
+               case "mode":
+                       def randomVariable = Math.abs(new Random().nextInt() % 3)
+                       def modes = ["away", "home", "night"]
+                       def userInput = modes[randomVariable]
 
                        if (modeVariables == 0) {
                                mode0 = metaData['name']
@@ -1088,6 +1215,10 @@ def input(LinkedHashMap metaData) {
                                this[mode5] = userInput
                        }
 
+                       modeVariables=modeVariables+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for mode!\n")
                                extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
@@ -1097,17 +1228,77 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "decimal":
+                       def userInput = Math.abs(new Random().nextInt() % 60) + 40
+                       
+                       if (decimalVariables == 0) {
+                               decimal0 = metaData['name']
+                               this[decimal0] = userInput
+                       } else if (decimalVariables == 1) {
+                               decimal1 = metaData['name']
+                               this[decimal1] = userInput
+                       } else if (decimalVariables == 2) {
+                               decimal2 = metaData['name']
+                               this[decimal2] = userInput
+                       } else if (decimalVariables == 3) {
+                               decimal3 = metaData['name']
+                               this[decimal3] = userInput
+                       } else if (decimalVariables == 4) {
+                               decimal4 = metaData['name']
+                               this[decimal4] = userInput
+                       } else if (decimalVariables == 5) {
+                               decimal5 = metaData['name']
+                               this[decimal5] = userInput
+                       }
+
+                       decimalVariables=decimalVariables+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {                    
+                               extractedObjectsApp1.append("//Global variable for decimal number!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
+                       } else {
+                               extractedObjectsApp2.append("//Global variable for decimal number!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
+                       }
                        break
                case "text":
+                       def userInput = "This is just a text!"
+       
+                       if (textVariables == 0) {
+                               text0 = metaData['name']
+                               this[text0] = userInput
+                       } else if (textVariables == 1) {
+                               text1 = metaData['name']
+                               this[text1] = userInput
+                       } else if (textVariables == 2) {
+                               text2 = metaData['name']
+                               this[text2] = userInput
+                       } else if (textVariables == 3) {
+                               text3 = metaData['name']
+                               this[text3] = userInput
+                       } else if (textVariables == 4) {
+                               text4 = metaData['name']
+                               this[text4] = userInput
+                       } else if (textVariables == 5) {
+                               text5 = metaData['name']
+                               this[text5] = userInput
+                       }
+
+                       textVariables=textVariables+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {                    
+                               extractedObjectsApp1.append("//Global variable for text!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
+                       } else {
+                               extractedObjectsApp2.append("//Global variable for text!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
+                       }
                        break
                case "number":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       def userInput = System.console().readLine 'Enter the number:'
+                       def userInput = Math.abs(new Random().nextInt() % 60) + 40
                        
                        if (numberVariables == 0) {
                                number0 = metaData['name']
@@ -1129,6 +1320,10 @@ def input(LinkedHashMap metaData) {
                                this[number5] = userInput
                        }
 
+                       numberVariables=numberVariables+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for number!\n")
                                extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
@@ -1138,13 +1333,7 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "time":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       def userInput = System.console().readLine 'Enter the time:'
+                       def userInput = "15:00"
                        
                        if (timeVariables == 0) {
                                time0 = metaData['name']
@@ -1166,6 +1355,10 @@ def input(LinkedHashMap metaData) {
                                this[time5] = userInput
                        }
 
+                       timeVariables=timeVariables+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for time!\n")
                                extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
@@ -1175,13 +1368,11 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "enum":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       def userInput = System.console().readLine 'Enter the enum:'
+                       if (metaData['options'] != null)
+                               modes = metaData['options']
+                       else // If it is not named 'options' then it is captured as 'metadata'
+                               modes = metaData['metadata']
+                       def userInput = modes[0]
        
                        if (enumVariables == 0) {
                                enum0 = metaData['name']
@@ -1203,6 +1394,10 @@ def input(LinkedHashMap metaData) {
                                this[enum5] = userInput
                        }
 
+                       enumVariables=enumVariables+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for enum!\n")
                                extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
@@ -1212,15 +1407,42 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "bool":
+                       def userInput = Math.abs(new Random().nextInt() % 2)
+       
+                       if (boolVariables == 0) {
+                               bool0 = metaData['name']
+                               this[bool0] = userInput
+                       } else if (boolVariables == 1) {
+                               bool1 = metaData['name']
+                               this[bool1] = userInput
+                       } else if (boolVariables == 2) {
+                               bool2 = metaData['name']
+                               this[bool2] = userInput
+                       } else if (boolVariables == 3) {
+                               bool3 = metaData['name']
+                               this[bool3] = userInput
+                       } else if (boolVariables == 4) {
+                               bool4 = metaData['name']
+                               this[bool4] = userInput
+                       } else if (boolVariables == 5) {
+                               bool5 = metaData['name']
+                               this[bool5] = userInput
+                       }
+
+                       boolVariables=boolVariables+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
+                       if (App == "App1") {                    
+                               extractedObjectsApp1.append("//Global variable for boolean!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
+                       } else {
+                               extractedObjectsApp2.append("//Global variable for boolean!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
+                       }
                        break
                case "phone":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       def userInput = System.console().readLine 'Enter the phone:'
+                       def userInput = 9495379373
 
                        if (phoneVariables == 0) {
                                phone0 = metaData['name']
@@ -1242,6 +1464,10 @@ def input(LinkedHashMap metaData) {
                                this[phone5] = userInput
                        }
 
+                       phoneVariables=phoneVariables+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for phone!\n")
                                extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
@@ -1251,13 +1477,7 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "contact":
-                       if (metaData.containsKey('title')) {
-                               println metaData['title']
-                       }
-                       if (metaData.containsKey('options')) {
-                               println "Options: "+metaData['options']
-                       }
-                       def userInput = System.console().readLine 'Enter the metaData['name'] of the contact:'
+                       def userInput = "AJ"
        
                        if (contactVariables == 0) {
                                contact0 = metaData['name']
@@ -1279,6 +1499,10 @@ def input(LinkedHashMap metaData) {
                                this[contact5] = userInput
                        }
 
+                       contactVariables=contactVariables+1
+
+                       settings.put(metaData['name'], metaData['name'])
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for contact!\n")
                                extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
@@ -1313,6 +1537,14 @@ def mode(LinkedHashMap metaData) {
 
        println("//IGNORE--ForMobileUse//")
 }
+
+def href(LinkedHashMap metaData) {
+       println("//IGNORE--some data//")
+}
+
+def href(LinkedHashMap metaData, String name) {
+       println("//IGNORE--some data//")
+}
 /////Input Methods/////
 
 
@@ -1323,6 +1555,13 @@ def definition(LinkedHashMap metaData) {
 
 def preferences(Closure inputData) {
        find(inputData) //Run the closure to extract pages/sections/inputMethods
+       if (App == "App1") {                    
+               extractedObjectsConstructorApp1.append("//Global variable for settings!\n")
+               extractedObjectsConstructorApp1.append("settings = $settings\n")
+       } else {
+               extractedObjectsConstructorApp2.append("//Global variable for settings!\n")
+               extractedObjectsConstructorApp2.append("settings = $settings\n")
+       }
 }
 
 def page(LinkedHashMap metaData, Closure inputData) {
@@ -1348,81 +1587,335 @@ def dynamicPage(LinkedHashMap metaData, Closure inputData) {
        find(inputData) //Run the closure to extract sections/inputMethods
 }
 
+def paragraph(String paragraphText) {
+       println(paragraphText)
+}
+
 def section(String title, Closure inputData) {
        println(title)
        find(inputData) //Run the closure to extract inputMethods
 }
 
+def section(Closure inputData) {
+       find(inputData) //Run the closure to extract inputMethods
+}
+
 def section(LinkedHashMap metaData, Closure inputData) {
        find(inputData) //Run the closure to extract inputMethods
 }
+
+def mappings(Closure inputData) {
+       println("//IGNORE--some data//")
+}
 /////MethodsForExtraction/////
 
 
 
-/////
-definition(
-    name: "Good Night House",
-    namespace: "charette.joseph@gmail.com",
-    author: "Joseph Charette",
-    description: "Some on, some off with delay for bedtime, Lock The Doors",
-    category: "Convenience",
-    iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
-    iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png"
 /**
-*  Borrowed code from
-*  Walk Gentle Into That Good Night
-*
-*  Author: oneaccttorulethehouse@gmail.com
-*  Date: 2014-02-01
+ *  Beacon Control
+ *
+ *  Copyright 2014 Physical Graph Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ *  in compliance with the License. You may obtain a copy of the License at:
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
+ *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
+ *  for the specific language governing permissions and limitations under the License.
+ *
  */
- )
+definition(
+       name: "Beacon Control",
+       category: "SmartThings Internal",
+       namespace: "smartthings",
+       author: "SmartThings",
+       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",
+       iconUrl: "https://s3.amazonaws.com/smartapp-icons/MiscHacking/mindcontrol.png",
+       iconX2Url: "https://s3.amazonaws.com/smartapp-icons/MiscHacking/mindcontrol@2x.png"
+)
+
 preferences {
-       section("When I touch the app turn these lights off…"){
-               input "switchesoff", "capability.switch", multiple: true, required:true
+       page(name: "timeIntervalInput", title: "Only during a certain time") {
+               section {
+                       input "starting", "time", title: "Starting", required: false
+                       input "ending", "time", title: "Ending", required: false
+               }
+       }
+       
+       page(name: "mainPage")
+}
+
+def mainPage() {
+       dynamicPage(name: "mainPage", install: true, uninstall: true) {
+
+               section("Where do you want to watch?") {
+                       input name: "beacons", type: "capability.beacon", title: "Select your beacon(s)", 
+                               multiple: true, required: true
+               }
+
+               section("Who do you want to watch for?") {
+                       input name: "phones", type: "device.mobilePresence", title: "Select your phone(s)", 
+                               multiple: true, required: true
+               }
+
+               section("What do you want to do on arrival?") {
+                       input name: "arrivalPhrase", type: "enum", title: "Execute a phrase", 
+                               options: listPhrases(), required: false
+                       input "arrivalOnSwitches", "capability.switch", title: "Turn on some switches", 
+                               multiple: true, required: false
+                       input "arrivalOffSwitches", "capability.switch", title: "Turn off some switches", 
+                               multiple: true, required: false
+                       input "arrivalLocks", "capability.lock", title: "Unlock the door",
+                               multiple: true, required: false
+               }
+
+               section("What do you want to do on departure?") {
+                       input name: "departPhrase", type: "enum", title: "Execute a phrase", 
+                               options: listPhrases(), required: false
+                       input "departOnSwitches", "capability.switch", title: "Turn on some switches", 
+                               multiple: true, required: false
+                       input "departOffSwitches", "capability.switch", title: "Turn off some switches", 
+                               multiple: true, required: false
+                       input "departLocks", "capability.lock", title: "Lock the door",
+                               multiple: true, required: false
+               }
+
+               section("Do you want to be notified?") {
+                       input "pushNotification", "bool", title: "Send a push notification"
+                       input "phone", "phone", title: "Send a text message", description: "Tap to enter phone number", 
+                               required: false
+               }
+
+               section {
+                       label title: "Give your automation a name", description: "e.g. Goodnight Home, Wake Up"
+               }
+
+               def timeLabel = timeIntervalLabel()
+               section(title: "More options", hidden: hideOptionsSection(), hideable: true) {
+                       href "timeIntervalInput", title: "Only during a certain time", 
+                               description: timeLabel ?: "Tap to set", state: timeLabel ? "complete" : "incomplete"
+
+                       input "days", "enum", title: "Only on certain days of the week", multiple: true, required: false,
+                               options: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
+
+                       input "modes", "mode", title: "Only when mode is", multiple: true, required: false
+               }
+       }
+}
+
+// Lifecycle management
+def installed() {
+       log.debug "<beacon-control> Installed with settings: ${settings}"
+       initialize()
+}
+
+def updated() {
+       log.debug "<beacon-control> Updated with settings: ${settings}"
+       unsubscribe()
+       initialize()
+}
+
+def initialize() {
+       subscribe(beacons, "presence", beaconHandler)
+}
+
+// Event handlers
+def beaconHandler(evt) {
+       log.debug "<beacon-control> beaconHandler: $evt"
+
+       if (allOk) {
+               def data = new groovy.json.JsonSlurper().parseText(evt.data)
+                // removed logging of device names. can be added back for debugging
+               //log.debug "<beacon-control> data: $data - phones: " + phones*.deviceNetworkId
+
+               def beaconName = getBeaconName(evt)
+                // removed logging of device names. can be added back for debugging
+               //log.debug "<beacon-control> beaconName: $beaconName"
+
+               def phoneName = getPhoneName(data)
+                // removed logging of device names. can be added back for debugging
+               //log.debug "<beacon-control> phoneName: $phoneName"
+               if (phoneName != null) {
+            def action = data.presence == "1" ? "arrived" : "left"
+            def msg = "$phoneName has $action ${action == 'arrived' ? 'at ' : ''}the $beaconName"
+
+            if (action == "arrived") {
+                msg = arriveActions(msg)
+            }
+            else if (action == "left") {
+                msg = departActions(msg)
+            }
+            log.debug "<beacon-control> msg: $msg"
+
+            if (pushNotification || phone) {
+                def options = [
+                    method: (pushNotification && phone) ? "both" : (pushNotification ? "push" : "sms"),
+                    phone: phone
+                ]
+                sendNotification(msg, options)
+            }
+        }
+       }
+}
+
+// Helpers
+private arriveActions(msg) {
+       if (arrivalPhrase || arrivalOnSwitches || arrivalOffSwitches || arrivalLocks) msg += ", so"
+       
+       if (arrivalPhrase) {
+               log.debug "<beacon-control> executing: $arrivalPhrase"
+               executePhrase(arrivalPhrase)
+               msg += " ${prefix('executed')} $arrivalPhrase."
+       }
+       if (arrivalOnSwitches) {
+               log.debug "<beacon-control> turning on: $arrivalOnSwitches"
+               arrivalOnSwitches.on()
+               msg += " ${prefix('turned')} ${list(arrivalOnSwitches)} on."
+       }
+       if (arrivalOffSwitches) {
+               log.debug "<beacon-control> turning off: $arrivalOffSwitches"
+               arrivalOffSwitches.off()
+               msg += " ${prefix('turned')} ${list(arrivalOffSwitches)} off."
+       }
+       if (arrivalLocks) {
+               log.debug "<beacon-control> unlocking: $arrivalLocks"
+               arrivalLocks.unlock()
+               msg += " ${prefix('unlocked')} ${list(arrivalLocks)}."
+       }
+       msg
+}
+
+private departActions(msg) {
+       if (departPhrase || departOnSwitches || departOffSwitches || departLocks) msg += ", so"
+       
+       if (departPhrase) {
+               log.debug "<beacon-control> executing: $departPhrase"
+               executePhrase(departPhrase)
+               msg += " ${prefix('executed')} $departPhrase."
        }
-    section("When I touch the app turn these lights on…"){
-               input "switcheson", "capability.switch", multiple: true, required:false
+       if (departOnSwitches) {
+               log.debug "<beacon-control> turning on: $departOnSwitches"
+               departOnSwitches.on()
+               msg += " ${prefix('turned')} ${list(departOnSwitches)} on."
        }
-    section("Lock theses locks...") {
-               input "lock1","capability.lock", multiple: true
-    }
-       section("And change to this mode...") {
-               input "newMode", "mode", title: "Mode?"
+       if (departOffSwitches) {
+               log.debug "<beacon-control> turning off: $departOffSwitches"
+               departOffSwitches.off()
+               msg += " ${prefix('turned')} ${list(departOffSwitches)} off."
        }
-   section("After so many seconds (optional)"){
-               input "waitfor", "number", title: "Off after (default 120)", required: true
+       if (departLocks) {
+               log.debug "<beacon-control> unlocking: $departLocks"
+               departLocks.lock()
+               msg += " ${prefix('locked')} ${list(departLocks)}."
+       }
+       msg
+}
+
+private prefix(word) {
+       def result
+       def index = settings.prefixIndex == null ? 0 : settings.prefixIndex + 1
+       switch (index) {
+               case 0:
+                       result = "I $word"
+                       break
+               case 1:
+                       result = "I also $word"
+                       break
+               case 2:
+                       result = "And I $word"
+                       break
+               default:
+                       result = "And $word"
+                       break
        }
+
+       settings.prefixIndex = index
+       log.trace "prefix($word'): $result"
+       result
 }
 
+private listPhrases() {
+       location.helloHome.getPhrases().label
+}
 
-def installed()
-{
-       log.debug "Installed with settings: ${settings}"
-       log.debug "Current mode = ${location.mode}"
-       subscribe(app, appTouch)
+private executePhrase(phraseName) {
+       if (phraseName) {
+               location.helloHome.execute(phraseName)
+               log.debug "<beacon-control> executed phrase: $phraseName"
+       }
 }
 
+private getBeaconName(evt) {
+       def beaconName = beacons.find { b -> b.id == evt.deviceId }
+       return beaconName
+}
 
-def updated()
-{
-       log.debug "Updated with settings: ${settings}"
-       log.debug "Current mode = ${location.mode}"
-       unsubscribe()
-       subscribe(app, appTouch)
+private getPhoneName(data) {    
+       def phoneName = phones.find { phone ->
+               // Work around DNI bug in data
+               def pParts = phone.deviceNetworkId.split('\\|')
+               def dParts = data.dni.split('\\|')
+        pParts[0] == dParts[0]
+       }
+       return phoneName
+}
+
+private hideOptionsSection() {
+       (starting || ending || days || modes) ? false : true
+}
+
+private getAllOk() {
+       modeOk && daysOk && timeOk
+}
+
+private getModeOk() {
+       def result = !modes || modes.contains(location.mode)
+       log.trace "<beacon-control> modeOk = $result"
+       result
+}
+
+private getDaysOk() {
+       def result = true
+       if (days) {
+               def df = new java.text.SimpleDateFormat("EEEE")
+               if (location.timeZone) {
+                       df.setTimeZone(location.timeZone)
+               }
+               else {
+                       df.setTimeZone(TimeZone.getTimeZone("America/New_York"))
+               }
+               def day = df.format(new Date())
+               result = days.contains(day)
+       }
+       log.trace "<beacon-control> daysOk = $result"
+       result
+}
+
+private getTimeOk() {
+       def result = true
+       if (starting && ending) {
+               def currTime = now()
+               def start = timeToday(starting, location?.timeZone).time
+               def stop = timeToday(ending, location?.timeZone).time
+               result = start < stop ? currTime >= start && currTime <= stop : currTime <= stop || currTime >= start
+       }
+       log.trace "<beacon-control> timeOk = $result"
+       result
+}
+
+private hhmm(time, fmt = "h:mm a") {
+       def t = timeToday(time, location.timeZone)
+       def f = new java.text.SimpleDateFormat(fmt)
+       f.setTimeZone(location.timeZone ?: timeZone(time))
+       f.format(t)
+}
+
+private timeIntervalLabel() {
+       (starting && ending) ? hhmm(starting) + "-" + hhmm(ending, "h:mm a z") : ""
 }
 
-def appTouch(evt) {
-       log.debug "changeMode, location.mode = $location.mode, newMode = $newMode, location.modes = $location.modes"
-    if (location.mode != newMode) {
-                       setLocationMode(newMode)
-                       log.debug "Changed the mode to '${newMode}'"
-    }  else {
-       log.debug "New mode is the same as the old mode, leaving it be"
-       }
-    log.debug "appTouch: $evt"
-    lock1.lock()
-    switcheson.on()
-    def delay = (waitfor != null && waitfor != "") ? waitfor * 1000 : 120000
-       switchesoff.off(delay: delay)
+private list(Object names) {
+       return names[0]
 }