Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/smartthings-infrastructure
[smartthings-infrastructure.git] / Extractor / Extractor.groovy
index e3cb88a13cfac87f2040e72f5ad3c053e0ac9a6e..96fb55ff3e61b8d38ccb49ee89a7a11374dbad16 100644 (file)
@@ -36,6 +36,44 @@ 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 ColorTemperature.ColorTemperature
+import ColorTemperature.ColorTemperatures
+import Button.Button
+import Button.Buttons
 import Timer.SimulatedTimer
 
 //GlobalVariables
@@ -48,9 +86,12 @@ import Timer.SimulatedTimer
 @Field def log = new Logger()
 //Create a global variable for optional property
 @Field def optional = false //by default for now
+//Global Object for class AtomicState!
+@Field def atomicState = [history: "15:00"]
 
 
 //Global variables for files
+@Field File globalObjects = new File("Extractor/globalObjects.groovy")
 @Field File extractedObjectsApp1 = new File("Extractor/App1/extractedObjectsApp1.groovy")
 @Field File extractedObjectsApp2 = new File("Extractor/App2/extractedObjectsApp2.groovy")
 @Field File extractedObjectsConstructorApp1 = new File("Extractor/App1/extractedObjectsConstructorApp1.groovy")
@@ -59,6 +100,7 @@ import Timer.SimulatedTimer
 
 //Empty the files
 if (App == "App1") {
+       globalObjects.write("")
        extractedObjectsApp1.write("")
        extractedObjectsConstructorApp1.write("")
 } else if (App == "App2") {
@@ -68,6 +110,16 @@ 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
@@ -111,7 +163,7 @@ if (App == "App1") {
 @Field def musicPlayerObject0
 @Field def musicPlayerObject1
 @Field def musicPlayerObject2
-//Global Object for class music player!
+//Global Object for class aeon key fob!
 @Field aeonKeyFobObjects = 0
 @Field def aeonKeyFobObject0
 @Field def aeonKeyFobObject1
@@ -136,11 +188,106 @@ if (App == "App1") {
 @Field def alarmObject0
 @Field def alarmObject1
 @Field def alarmObject2
-//Global Object for class alarm!
+//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 step 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 water sensor!
+@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 mobile presence!
+@Field mobilePresenceObjects = 0
+@Field def mobilePresenceObject0
+@Field def mobilePresenceObject1
+@Field def mobilePresenceObject2
+//Global Object for class color temperature!
+@Field colorTemperatureObjects = 0
+@Field def colorTemperatureObject0
+@Field def colorTemperatureObject1
+@Field def colorTemperatureObject2
+//Global Object for class button!
+@Field buttonObjects = 0
+@Field def buttonObject0
+@Field def buttonObject1
+@Field def buttonObject2
 
 
 //Global variables
@@ -217,7 +364,6 @@ if (App == "App1") {
 @Field boolVariable4
 @Field boolVariable5
 
-
 /////Input Methods/////
 //input "",""
 def input(String name, String type) {
@@ -250,8 +396,18 @@ def input(LinkedHashMap metaData) {
        if (metaData.containsKey('options')) {
                println "Options: "+metaData['options']
        }
+       def contains = 0
        switch(metaData['type']) {
                case "capability.lock":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("lockObject")){
+                                       contains = 1
+                           }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def lockObject = new Locks(sendEvent, 1)\n")
+
                        if (lockObjects == 0) {
                                lockObject0 = metaData['name']
                                this[lockObject0] = new Locks({}, 1)
@@ -265,7 +421,7 @@ def input(LinkedHashMap metaData) {
 
                        lockObjects=lockObjects+1
 
-                       settings.put(metaData['name'], metaData['name']
+                       settings.put(metaData['name'], new Locks({}, 1)
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class lock!\n")
@@ -278,6 +434,15 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.alarm":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("alarmObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def alarmObject = new Alarms(sendEvent, 1)\n")
+
                        if (alarmObjects == 0) {
                                alarmObject0 = metaData['name']
                                this[alarmObject0] = new Alarms({}, 1)
@@ -291,7 +456,7 @@ def input(LinkedHashMap metaData) {
 
                        alarmObjects=alarmObjects+1
 
-                       settings.put(metaData['name'], metaData['name']
+                       settings.put(metaData['name'], new Alarms({}, 1)
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class alarm!\n")
@@ -303,15 +468,226 @@ def input(LinkedHashMap metaData) {
                                extractedObjectsConstructorApp2.append(metaData['name']+" = obj.alarmObject\n")
                        }
                        break
+               case "capability.button":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("buttonObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def buttonObject = new Buttons(sendEvent, 1)\n")
+
+                       if (buttonObjects == 0) {
+                               buttonObject0 = metaData['name']
+                               this[buttonObject0] = new Buttons({}, 1)
+                       } else if (buttonObjects == 1) {
+                               buttonObject1 = metaData['name']
+                               this[buttonObject1] = new Buttons({}, 1)
+                       } else if (buttonObjects == 2) {
+                               buttonObject2 = metaData['name']
+                               this[buttonObject2] = new Buttons({}, 1)
+                       }
+
+                       buttonObjects=buttonObjects+1
+
+                       settings.put(metaData['name'], new Buttons({}, 1))
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class Button!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.buttonObject\n")                
+                       } else {
+                               extractedObjectsApp2.append("//Object for class Button!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.buttonObject\n")
+                       }
+                       break
                case "capability.battery":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("batteryObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def batteryObject = new Batteries(sendEvent, 1)\n")
+
+                       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'], new Batteries({}, 1))
+
+                       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":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("beaconSensorObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def beaconSensorObject = new BeaconSensors(sendEvent, 1)\n")
+
+                       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'], new BeaconSensors({}, 1))
+
+                       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":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("carbonMonoxideDetectorObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def carbonMonoxideDetectorObject = new CarbonMonoxideDetectors(sendEvent, 1)\n")
+
+                       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'], new CarbonMonoxideDetectors({}, 1))
+
+                       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.colorTemperature":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("colorTemperatureObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def colorTemperatureObject = new ColorTemperatures(sendEvent, 1)\n")
+
+                       if (colorTemperatureObjects == 0) {
+                               colorTemperatureObject0 = metaData['name']
+                               this[colorTemperatureObject0] = new ColorTemperatures({}, 1)
+                       } else if (colorTemperatureObjects == 1) {
+                               colorTemperatureObject1 = metaData['name']
+                               this[colorTemperatureObject1] = new ColorTemperatures({}, 1)
+                       } else if (colorTemperatureObjects == 2) {
+                               colorTemperatureObject2 = metaData['name']
+                               this[colorTemperatureObject2] = new ColorTemperatures({}, 1)
+                       }
+
+                       colorTemperatureObjects=colorTemperatureObjects+1
+
+                       settings.put(metaData['name'], new ColorTemperatures({}, 1))
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class color temperature!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.colorTemperatureObject\n")              
+                       } else {
+                               extractedObjectsApp2.append("//Object for class color control!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.colorTemperatureObject\n")
+                       }
                        break
                case "capability.colorControl":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("colorControlObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def colorControlObject = new ColorControls(sendEvent, 1)\n")
+
+                       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'], new ColorControls({}, 1))
+
+                       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":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("contactObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def contactObject = new ContactSensors(sendEvent, 1)\n")
+
                        if (contactObjects == 0) {
                                contactObject0 = metaData['name']
                                this[contactObject0] = new ContactSensors({}, 1)
@@ -325,7 +701,7 @@ def input(LinkedHashMap metaData) {
 
                        contactObjects=contactObjects+1
 
-                       settings.put(metaData['name'], metaData['name'])
+                       settings.put(metaData['name'], new ContactSensors({}, 1))
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class contactSensor!\n")
@@ -338,6 +714,15 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.doorControl":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("doorControlObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def doorControlObject = new DoorControls(sendEvent, 1)\n")
+
                        if (doorControlObjects == 0) {
                                doorControlObject0 = metaData['name']
                                this[doorControlObject0] = new DoorControls({}, 1)
@@ -351,7 +736,7 @@ def input(LinkedHashMap metaData) {
 
                        doorControlObjects=doorControlObjects+1
 
-                       settings.put(metaData['name'], metaData['name'])
+                       settings.put(metaData['name'], new DoorControls({}, 1))
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class door control!\n")
@@ -364,12 +749,120 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.energyMeter":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("energyMeterObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def energyMeterObject = new EnergyMeters(sendEvent, 1)\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)
+                       }
+
+                       energyMeterObjects=energyMeterObjects+1
+
+                       settings.put(metaData['name'], new EnergyMeters({}, 1))
+
+                       if (App == "App1") {
+                               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 energy meter!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.energyMeterObject\n")
+                       }
                        break
                case "capability.illuminanceMeasurement":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("illuminanceMeasurementObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def illuminanceMeasurementObject = new IlluminanceMeasurements(sendEvent, 1)\n")
+
+                       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)
+                       }
+
+                       illuminanceMeasurementObjects=illuminanceMeasurementObjects+1
+
+                       settings.put(metaData['name'], new IlluminanceMeasurements({}, 1))
+
+                       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("//Object for class illuminance measurement!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.illuminanceMeasurementObject\n")
+                       }
                        break
                case "capability.accelerationSensor":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("accelerationSensorObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def accelerationSensorObject = new AccelerationSensors(sendEvent, 1)\n")
+
+                       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)
+                       }
+
+                       accelerationSensorObjects=accelerationSensorObjects+1
+
+                       settings.put(metaData['name'], new AccelerationSensors({}, 1))
+
+                       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("//Object for class Acceleration Sensor!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.accelerationSensorObject\n")
+                       }
                        break
                case "capability.motionSensor":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("motionSensorObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def motionSensorObject = new MotionSensors(sendEvent, 1)\n")
+
                        if (motionSensorObjects == 0) {
                                motionSensorObject0 = metaData['name']
                                this[motionSensorObject0] = new MotionSensors({}, 1)
@@ -383,7 +876,7 @@ def input(LinkedHashMap metaData) {
 
                        motionSensorObjects=motionSensorObjects+1
 
-                       settings.put(metaData['name'], metaData['name'])
+                       settings.put(metaData['name'], new MotionSensors({}, 1))
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class Motion Sensor!\n")
@@ -396,6 +889,15 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.musicPlayer":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("musicPlayerObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def musicPlayerObject = new MusicPlayers(sendEvent, 1)\n")
+
                        if (musicPlayerObjects == 0) {
                                musicPlayerObject0 = metaData['name']
                                this[musicPlayerObject0] = new MusicPlayers({}, 1)
@@ -409,7 +911,7 @@ def input(LinkedHashMap metaData) {
 
                        musicPlayerObjects=musicPlayerObjects+1
 
-                       settings.put(metaData['name'], metaData['name']
+                       settings.put(metaData['name'], new MusicPlayers({}, 1)
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class music player!\n")
@@ -422,8 +924,50 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.powerMeter":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("powerMeterObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def powerMeterObject = new PowerMeters(sendEvent, 1)\n")
+
+                       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'], new PowerMeters({}, 1))
+
+                       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":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("presenceSensorObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def presenceSensorObject = new PresenceSensors(sendEvent, 1)\n")
+
                        if (presenceSensorObjects == 0) {
                                presenceSensorObject0 = metaData['name']
                                this[presenceSensorObject0] = new PresenceSensors({}, 1)
@@ -437,7 +981,7 @@ def input(LinkedHashMap metaData) {
 
                        presenceSensorObjects=presenceSensorObjects+1
 
-                       settings.put(metaData['name'], metaData['name'])
+                       settings.put(metaData['name'], new PresenceSensors({}, 1))
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class presence sensor!\n")
@@ -450,12 +994,120 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.relativeHumidityMeasurement":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("humidityMeasurementObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def humidityMeasurementObject = new RelativeHumidityMeasurements(sendEvent, 1)\n")
+
+                       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'], new RelativeHumidityMeasurements({}, 1))
+
+                       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":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("relaySwitchObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def relaySwitchObject = new RelaySwitches(sendEvent, 1)\n")
+
+                       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'], new RelaySwitches({}, 1))
+
+                       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":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("sleepSensorObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def sleepSensorObject = new SleepSensors(sendEvent, 1)\n")
+
+                       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'], new SleepSensors({}, 1))
+
+                       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":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("smokeDetectorObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def smokeDetectorObject = new SmokeDetectors(sendEvent, 1)\n")
+
                        if (smokeDetectorObjects == 0) {
                                smokeDetectorObject0 = metaData['name']
                                this[smokeDetectorObject0] = new SmokeDetectors({}, 1)
@@ -469,7 +1121,7 @@ def input(LinkedHashMap metaData) {
 
                        smokeDetectorObjects=smokeDetectorObjects+1
                        
-                       settings.put(metaData['name'], metaData['name'])
+                       settings.put(metaData['name'], new SmokeDetectors({}, 1))
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class smoke detector!\n")
@@ -482,8 +1134,50 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.stepSensor":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("stepSensorObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def stepSensorObject = new StepSensors(sendEvent, 1)\n")
+
+                       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'], new StepSensors({}, 1))
+
+                       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":
+               case "capability.switch":               
+                       globalObjects.eachLine { line ->
+                               if(line.contains("switchObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def switchObject = new Switches(sendEvent, 1)\n")
+
                        if (switchObjects == 0) {
                                switchObject0 = metaData['name']
                                this[switchObject0] = new Switches({}, 1)
@@ -497,7 +1191,7 @@ def input(LinkedHashMap metaData) {
 
                        switchObjects=switchObjects+1
                        
-                       settings.put(metaData['name'], metaData['name'])
+                       settings.put(metaData['name'], new Switches({}, 1))
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class switch!\n")
@@ -510,10 +1204,85 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.switchLevel":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("switchLevelObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def switchLevelObject = new SwitchLevels(sendEvent, 1)\n")
+
+                       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'], new SwitchLevels({}, 1))
+
+                       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":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("temperatureMeasurementObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def temperatureMeasurementObject = new TemperatureMeasurements(sendEvent, 1)\n")
+
+                       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'], new TemperatureMeasurements({}, 1))
+
+                       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":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("thermostatObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def thermostatObject = new Thermostats(sendEvent, 1)\n")
+                               
                        if (thermostatObjects == 0) {
                                thermostatObject0 = metaData['name']
                                this[thermostatObject0] = new Thermostats({}, 1)
@@ -527,7 +1296,7 @@ def input(LinkedHashMap metaData) {
 
                        thermostatObjects=thermostatObjects+1
 
-                       settings.put(metaData['name'], metaData['name'])
+                       settings.put(metaData['name'], new Thermostats({}, 1))
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class thermostat!\n")
@@ -540,8 +1309,50 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.valve":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("valveObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def valveObject = new Valves(sendEvent, 1)\n")
+
+                       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'], new Valves({}, 1))
+
+                       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":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("speechSynthesisObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def speechSynthesisObject = new SpeechSynthesises(sendEvent, 1)\n")
+
                        if (speechSynthesisObjects == 0) {
                                speechSynthesisObject0 = metaData['name']
                                this[speechSynthesisObject0] = new SpeechSynthesises({}, 1)
@@ -555,7 +1366,7 @@ def input(LinkedHashMap metaData) {
 
                        speechSynthesisObjects=speechSynthesisObjects+1
 
-                       settings.put(metaData['name'], metaData['name'])
+                       settings.put(metaData['name'], new SpeechSynthesises({}, 1))
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class speech synthesis!\n")
@@ -568,8 +1379,50 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.waterSensor":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("waterSensorObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def waterSensorObject = new WaterSensors(sendEvent, 1)\n")
+
+                       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'], new WaterSensors({}, 1))
+
+                       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":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("touchSensorObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def touchSensorObject = new NfcTouch(sendEvent, 1)\n")
+
                        if (touchSensorObjects == 0) {
                                touchSensorObject0 = metaData['name']
                                this[touchSensorObject0] = new NfcTouch({}, 1)
@@ -583,7 +1436,7 @@ def input(LinkedHashMap metaData) {
 
                        touchSensorObjects=touchSensorObjects+1
 
-                       settings.put(metaData['name'], metaData['name'])
+                       settings.put(metaData['name'], new NfcTouch({}, 1))
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class Touch Sensor!\n")
@@ -596,6 +1449,15 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "capability.imageCapture":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("imageCaptureObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def imageCaptureObject = new ImageCaptures(sendEvent, 1)\n")
+
                        if (imageCaptureObjects == 0) {
                                imageCaptureObject0 = metaData['name']
                                this[imageCaptureObject0] = new ImageCaptures({}, 1)
@@ -609,7 +1471,7 @@ def input(LinkedHashMap metaData) {
 
                        imageCaptureObjects=imageCaptureObjects+1
 
-                       settings.put(metaData['name'], metaData['name'])
+                       settings.put(metaData['name'], new ImageCaptures({}, 1))
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class Image Capture!\n")
@@ -622,8 +1484,50 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "device.mobilePresence":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("mobilePresenceObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def mobilePresenceObject = new MobilePresences(sendEvent, 1)\n")
+
+                       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'], new MobilePresences({}, 1))
+
+                       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 "capability.button":
                case "device.aeonKeyFob":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("aeonKeyFobObject")){
+                                       contains = 1
+                               }
+                       }
+                       if (contains == 0)
+                               globalObjects.append("@Field def aeonKeyFobObject = new AeonKeyFobs(sendEvent, 1)\n")
+
                        if (aeonKeyFobObjects == 0) {
                                aeonKeyFobObject0 = metaData['name']
                                this[aeonKeyFobObject0] = new AeonKeyFobs({}, 1)
@@ -637,7 +1541,7 @@ def input(LinkedHashMap metaData) {
 
                        aeonKeyFobObjects=aeonKeyFobObjects+1
 
-                       settings.put(metaData['name'], metaData['name']
+                       settings.put(metaData['name'], new AeonKeyFobs({}, 1)
 
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class aeon key fob!\n")
@@ -650,9 +1554,9 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "mode":
-                       def randomVariable = Math.abs(new Random().nextInt() % 3)
+                       //def randomVariable = Math.abs(new Random().nextInt() % 3)
                        def modes = ["away", "home", "night"]
-                       def userInput = modes[randomVariable]
+                       def userInput = modes[0]
 
                        if (modeVariables == 0) {
                                mode0 = metaData['name']
@@ -674,7 +1578,11 @@ def input(LinkedHashMap metaData) {
                                this[mode5] = userInput
                        }
 
-                       modeVariables=modeVariables+1
+                       if (modeVariables != 5)
+                               modeVariables=modeVariables+1
+                       else
+                               modeVariables=0
+
 
                        settings.put(metaData['name'], metaData['name'])
 
@@ -687,8 +1595,9 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "decimal":
-                       def userInput = Math.abs(new Random().nextInt() % 60) + 40
-                       
+                       //def userInput = Math.abs(new Random().nextInt() % 60) + 40
+                       def userInput = 50
+
                        if (decimalVariables == 0) {
                                decimal0 = metaData['name']
                                this[decimal0] = userInput
@@ -709,7 +1618,10 @@ def input(LinkedHashMap metaData) {
                                this[decimal5] = userInput
                        }
 
-                       decimalVariables=decimalVariables+1
+                       if (decimalVariables != 5)
+                               decimalVariables=decimalVariables+1
+                       else
+                               decimalVariables=0
 
                        settings.put(metaData['name'], metaData['name'])
 
@@ -723,7 +1635,7 @@ def input(LinkedHashMap metaData) {
                        break
                case "text":
                        def userInput = "This is just a text!"
-       
+                       
                        if (textVariables == 0) {
                                text0 = metaData['name']
                                this[text0] = userInput
@@ -744,7 +1656,11 @@ def input(LinkedHashMap metaData) {
                                this[text5] = userInput
                        }
 
-                       textVariables=textVariables+1
+                       if (textVariables != 5)
+                               textVariables=textVariables+1
+                       else
+                               textVariables=0
+
 
                        settings.put(metaData['name'], metaData['name'])
 
@@ -757,8 +1673,9 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "number":
-                       def userInput = Math.abs(new Random().nextInt() % 60) + 40
-                       
+                       //def userInput = Math.abs(new Random().nextInt() % 60) + 40
+                       def userInput = 50
+
                        if (numberVariables == 0) {
                                number0 = metaData['name']
                                this[number0] = userInput
@@ -779,7 +1696,12 @@ def input(LinkedHashMap metaData) {
                                this[number5] = userInput
                        }
 
-                       numberVariables=numberVariables+1
+
+                       if (numberVariables != 5)
+                               numberVariables=numberVariables+1
+                       else
+                               numberVariables=0
+                       
 
                        settings.put(metaData['name'], metaData['name'])
 
@@ -814,7 +1736,10 @@ def input(LinkedHashMap metaData) {
                                this[time5] = userInput
                        }
 
-                       timeVariables=timeVariables+1
+                       if (timeVariables != 5)
+                               timeVariables=timeVariables+1
+                       else
+                               timeVariables=0
 
                        settings.put(metaData['name'], metaData['name'])
 
@@ -827,11 +1752,12 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "enum":
-                       def randomVariable = Math.abs(new Random().nextInt() % 2)
-                       //def modes = ["Yes", "No"]
-                       //def userInput = modes[randomVariable]
-                       // TODO: We 
-                       def modes = metaData['options']
+                       if (metaData['options'] != null)
+                               modes = metaData['options']
+                       else if (metaData['metadata'] != null) { // If it is not named 'options' then it is captured as 'metadata'
+                               modes = metaData['metadata']
+                               modes = modes['values']
+                       }
                        def userInput = modes[0]
        
                        if (enumVariables == 0) {
@@ -854,7 +1780,11 @@ def input(LinkedHashMap metaData) {
                                this[enum5] = userInput
                        }
 
-                       enumVariables=enumVariables+1
+                       if (enumVariables != 5)
+                               enumVariables=enumVariables+1
+                       else
+                               enumVariables=0                 
+
 
                        settings.put(metaData['name'], metaData['name'])
 
@@ -867,8 +1797,9 @@ def input(LinkedHashMap metaData) {
                        }
                        break
                case "bool":
-                       def userInput = Math.abs(new Random().nextInt() % 2)
-       
+                       //def userInput = Math.abs(new Random().nextInt() % 2)
+                       def userInput = true
+
                        if (boolVariables == 0) {
                                bool0 = metaData['name']
                                this[bool0] = userInput
@@ -889,7 +1820,11 @@ def input(LinkedHashMap metaData) {
                                this[bool5] = userInput
                        }
 
-                       boolVariables=boolVariables+1
+                       if (boolVariables != 5)
+                               boolVariables=boolVariables+1
+                       else
+                               boolVariables=0
+
 
                        settings.put(metaData['name'], metaData['name'])
 
@@ -924,7 +1859,10 @@ def input(LinkedHashMap metaData) {
                                this[phone5] = userInput
                        }
 
-                       phoneVariables=phoneVariables+1
+                       if (phoneVariables != 5)
+                               phoneVariables=phoneVariables+1
+                       else
+                               phoneVariables=0
 
                        settings.put(metaData['name'], metaData['name'])
 
@@ -959,7 +1897,10 @@ def input(LinkedHashMap metaData) {
                                this[contact5] = userInput
                        }
 
-                       contactVariables=contactVariables+1
+                       if (contactVariables != 5)
+                               contactVariables=contactVariables+1
+                       else
+                               contactVariables=0
 
                        settings.put(metaData['name'], metaData['name'])
 
@@ -1001,6 +1942,10 @@ def mode(LinkedHashMap metaData) {
 def href(LinkedHashMap metaData) {
        println("//IGNORE--some data//")
 }
+
+def href(LinkedHashMap metaData, String name) {
+       println("//IGNORE--some data//")
+}
 /////Input Methods/////
 
 
@@ -1011,12 +1956,41 @@ def definition(LinkedHashMap metaData) {
 
 def preferences(Closure inputData) {
        find(inputData) //Run the closure to extract pages/sections/inputMethods
-       if (App == "App1") {                    
+       settings.put("END", "END")
+       if (App == "App1") {            
                extractedObjectsConstructorApp1.append("//Global variable for settings!\n")
-               extractedObjectsConstructorApp1.append("settings = $settings\n")
+               extractedObjectsConstructorApp1.append("settings = [")
+               settings.each{
+                       key, value ->
+                       if (value != "END")
+                               extractedObjectsConstructorApp1.append("$key: $key, ")
+                       else
+                               extractedObjectsConstructorApp1.append("END: \"END\"]\n")
+               }
        } else {
                extractedObjectsConstructorApp2.append("//Global variable for settings!\n")
-               extractedObjectsConstructorApp2.append("settings = $settings\n")
+               extractedObjectsConstructorApp2.append("settings = [")
+               settings.each{
+                       key, value ->
+                       if (value != "END")
+                               extractedObjectsConstructorApp2.append("$key: $key, ")
+                       else
+                               extractedObjectsConstructorApp2.append("END: \"END\"]\n")
+               }
+               def line
+               File GlobalVariablesBothApps = new File("GlobalVariables/GlobalVariablesBothApps.groovy")
+               GlobalVariablesBothApps.write("")
+               GlobalVariablesBothApps.append("//Creating Global variables for both apps\n")
+               GlobalVariablesBothApps.append("@Field def sendEvent = {eventDataMap -> eventHandler(eventDataMap)}\n")
+               GlobalVariablesBothApps.append("@Field def locationObject = new LocationVar(sendEvent)\n")
+               GlobalVariablesBothApps.append("@Field def appObject = new Touched(sendEvent, 0)\n")
+               
+               globalObjects.withReader { reader ->
+                       while ((line = reader.readLine()) != null) {
+                               GlobalVariablesBothApps.append(line)
+                               GlobalVariablesBothApps.append("\n")
+                       }
+                }
        }
 }
 
@@ -1059,5 +2033,13 @@ def section(Closure inputData) {
 def section(LinkedHashMap metaData, Closure inputData) {
        find(inputData) //Run the closure to extract inputMethods
 }
+
+def section(LinkedHashMap metaData, String data, Closure inputData) {
+       find(inputData)
+}
+
+def mappings(Closure inputData) {
+       println("//IGNORE--some data//")
+}
 /////MethodsForExtraction/////