Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/smartthings-infrastructure
authoramiraj <amiraj.95@uci.edu>
Mon, 29 Jul 2019 21:11:59 +0000 (14:11 -0700)
committeramiraj <amiraj.95@uci.edu>
Mon, 29 Jul 2019 21:11:59 +0000 (14:11 -0700)
27 files changed:
1  2 
Battery/Batteries.groovy
CarbonMonoxideDetector/CarbonMonoxideDetectors.groovy
ColorControl/ColorControls.groovy
DoorControl/DoorControls.groovy
EnergyMeter/EnergyMeters.groovy
Extractor/Extractor.groovy
Extractor/ExtractorScript.py
GlobalVariables/GlobalVariablesBothApps.groovy
Methods/eventHandler.groovy
ModelCheck.py
MusicPlayer/MusicPlayers.groovy
Runner.py
Switch/Switches.groovy
Thermostat/Thermostats.groovy
eventSimulator/accelerationActiveEvent.groovy
eventSimulator/accelerationInactiveEvent.groovy
eventSimulator/beaconLeftEvent.groovy
eventSimulator/beaconPresentEvent.groovy
eventSimulator/carbonMonoxideClearEvent.groovy
eventSimulator/carbonMonoxideDetectedEvent.groovy
eventSimulator/carbonMonoxideTestedEvent.groovy
eventSimulator/colorChangedEvent.groovy
eventSimulator/hueChangedEvent.groovy
eventSimulator/saturationChangedEvent.groovy
eventSimulator/smokeCarbonMonoxideClearEvent.groovy
eventSimulator/smokeCarbonMonoxideDetectedEvent.groovy
eventSimulator/smokeCarbonMonoxideTestedEvent.groovy

diff --combined Battery/Batteries.groovy
index 8aca5e2a66c50bee42ff20a8ce466299101a855b,6e40e12f672508a254a0cb22fc0b90ebcc9162ce..4664fb9f62b761553c05fb4bd7ea736781a8b77c
@@@ -15,17 -15,17 +15,20 @@@ public class Batteries 
        private String label = "battery0"
        private String displayName = "battery0"
        private int battery = 50
 -      private String currentBattery = 50
 +      private int currentBattery = 50
  
                
        Batteries(Closure sendEvent, int deviceNumbers) {
                this.sendEvent = sendEvent              
                this.deviceNumbers = deviceNumbers
                this.batteries = []
+               
+               def init = Verify.getIntFromList(30, 50, 70)
+               this.battery = init
  
 +              def init = Verify.getIntFromList(30, 50, 70)
 +              this.battery = init
 +
                batteries.add(new Battery(id, label, displayName, this.battery))
        }
  
index 2eb9d745bb74b47379d8dc3fc5016d2607991320,511d0312f542c998b03753a4afdbbd0aed153476..d61bc59b8a34ee110c35d31a36d390b08f1085ce
@@@ -35,7 -35,7 +35,11 @@@ public class CarbonMonoxideDetectors 
                        this.carbonMonoxide = "tested"
                        this.carbonMonoxideLatestValue = "tested"               
                }
++<<<<<<< HEAD
 +              carbonMonoxideDetectors.add(new CarbonMonoxideDetector(id, label, displayName, this.currentCarbonMonoxideValue, this.carbonMonoxideLatestValue))
++=======
+               carbonMonoxideDetectors.add(new CarbonMonoxideDetector(id, label, displayName, this.carbonMonoxide, this.carbonMonoxideLatestValue))
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
        }
  
        //By Model Checker
index d96b978d774579c4f7efcb2519d86d8b4adb9985,6eb5ac65f9f26a3e597cc07c72c7e9d86c9b86d1..3538447ce14bad689fd59d4e68a8e752d8d49219
@@@ -23,20 -23,20 +23,33 @@@ public class ColorControls 
                this.sendEvent = sendEvent
                this.deviceNumbers = deviceNumbers
                this.colorControls = []
+               
+               def initHue = Verify.getIntFromList(30, 50, 70)
+               this.hue = initHue
+               def initSat = Verify.getIntFromList(40, 50, 60)
+               this.saturation = initSat
+               def init = Verify.getInt(0,2)
+               if (init == 0) {
+                       this.color = "red"
+               } else if (init == 1) {
+                       this.color = "green"
+               } else {
+                       this.color = "blue"
+               }
  
 +              def initHue = Verify.getIntFromList(30, 50, 70)
 +              this.hue = initHue
 +              def initSat = Verify.getIntFromList(40, 50, 60)
 +              this.saturation = initSat
 +              def init = Verify.getInt(0,2)
 +              if (init == 0) {
 +                      this.color = "red"
 +              } else if (init == 1) {
 +                      this.color = "green"
 +              } else {
 +                      this.color = "blue"
 +              }
 +
                colorControls.add(new ColorControl(id, label, displayName, this.color, this.hue, this.saturation))
        }
  
  
        //methods
        def setColor(String color) {
 -              colorControls[0].setColor(color)
 -              this.color = color      
 +              if (color != this.color) {
 +                      colorControls[0].setColor(color)
 +                      this.color = color
 +              }
        }
  
        def setHue(int hue) {
 -              colorControls[0].setHue(hue)
 -              this.hue = hue  
 +              if (hue != this.hue) {          
 +                      colorControls[0].setHue(hue)
 +                      this.hue = hue
 +              }
        }
  
        def setSaturation(int saturation) {
 -              colorControls[0].setSaturation(saturation)
 -              this.saturation = saturation    
 +              if (saturation != this.saturation) {
 +                      colorControls[0].setSaturation(saturation)
 +                      this.saturation = saturation
 +              }       
        }
  
        def currentValue(String deviceFeature) {
index 25818009adfd0ba480940322ed19e9fc60713c61,444154da8319bd8a20615aaf75e59e02c4d15137..e8e067a5e7966060e586e2b6a65f07374fc2f72b
@@@ -23,7 -23,7 +23,11 @@@ public class DoorControls 
                this.timers = new SimulatedTimer()
                this.deviceNumbers = deviceNumbers
                this.doorControls = []
++<<<<<<< HEAD
 +              
++=======
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
                def init = Verify.getBoolean()
                if (init) {
                        this.doorState = "closed"
  
        //By Apps
        def open() {
 -              doorControls[0].on()
 +              if (doorState != "open")
 +                      doorControls[0].open()
        }
  
        def open(LinkedHashMap metaData) {
 -              def task = timers.runAfter(metaData["delay"]) {
 -                      doorControls[0].on()
 +              if (doorState != "open") {
 +                      def task = timers.runAfter(metaData["delay"]) {
 +                              doorControls[0].open()
 +                      }
                }
        }
  
        def close() {
 -              doorControls[0].off()
 +              if (doorState != "closed")
 +                      doorControls[0].close()
        }
  
        def close(LinkedHashMap metaData) {
 -              def task = timers.runAfter(metaData["delay"]) {
 -                      doorControls[0].off()
 +              if (doorState != "closed") {
 +                      def task = timers.runAfter(metaData["delay"]) {
 +                              doorControls[0].close()
 +                      }
                }
        }
  
index a3f2b8dff1409b68958ad937d738dc69e3099585,59670840b327d7dfd8d8a9f8e993d3d6abbe64e5..85544953c2c05aa20996d6e0aee4bf89fef1ec48
@@@ -2,9 -2,6 +2,9 @@@
  package EnergyMeter
  import Timer.SimulatedTimer
  
 +//JPF's Verify API
 +import gov.nasa.jpf.vm.Verify
 +
  public class EnergyMeters {
        private int deviceNumbers
        private List energyMeters
        private String label = "energyMeter0"
        private String displayName = "energyMeter0"
        private int energy = 50
 +      private int currentEnergy = 50
  
                
        EnergyMeters(Closure sendEvent, int deviceNumbers) {
                this.sendEvent = sendEvent              
                this.deviceNumbers = deviceNumbers
                this.energyMeters = []
++<<<<<<< HEAD
 +
 +              def init = Verify.getIntFromList(30, 50, 70)
 +              this.energy = init
 +
++=======
+               
+               def init = Verify.getIntFromList(30, 50, 70)
+               this.energy = init
+               
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
                energyMeters.add(new EnergyMeter(id, label, displayName, this.energy))
        }
  
@@@ -34,7 -30,6 +41,7 @@@
                if (eventDataMap["value"] != energyMeters[0].energy) {
                        energyMeters[0].setValue(eventDataMap["value"])
                        this.energy = energyMeters[0].energy
 +                      this.currentEnergy = energyMeters[0].currentEnergy              
                        sendEvent(eventDataMap)
                }
        }
index 309223d3547eaa7cb8ba1412763e7777a3301ae3,00b993d04ff9e2fb76d881995980be5bc37e351c..e8ccbdae45c7ca71197afafc92cdbf395b6cfee4
@@@ -48,28 -48,6 +48,28 @@@ import ColorControl.ColorContro
  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
  
  //GlobalVariables
@@@ -102,17 -80,6 +102,17 @@@ 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 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
  
  
  
@@@ -616,30 -528,6 +616,30 @@@ def input(LinkedHashMap metaData) 
                        }
                        break
                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)
 +                      }
 +
 +                      illuminanceMeasurementObjects=illuminanceMeasurementObjects+1
 +
 +                      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("//Object for class illuminance measurement!\n")
 +                              extractedObjectsApp2.append("def "+metaData['name']+"\n")
 +                              extractedObjectsConstructorApp2.append(metaData['name']+" = obj.illuminanceMeasurementObject\n")
 +                      }
                        break
                case "capability.accelerationSensor":
                        if (accelerationSensorObjects == 0) {
                        }
                        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 (presenceSensorObjects == 0) {
                        }
                        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) {
                        }
                        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 (switchObjects == 0) {
                        }
                        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 (thermostatObjects == 0) {
                        }
                        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) {
                        }
                        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 (touchSensorObjects == 0) {
                        }
                        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":
                        if (aeonKeyFobObjects == 0) {
                        }
                        break
                case "enum":
++<<<<<<< HEAD
++=======
+                       def randomVariable = Math.abs(new Random().nextInt() % 2)
+                       def modes = ["Yes", "No"]
+                       //def userInput = modes[randomVariable]
+                       //def modes = metaData['options']
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
                        if (metaData['options'] != null)
                                modes = metaData['options']
                        else // If it is not named 'options' then it is captured as 'metadata'
@@@ -1538,10 -1190,6 +1545,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/////
  
  
@@@ -1600,9 -1248,5 +1607,9 @@@ def section(Closure inputData) 
  def section(LinkedHashMap metaData, Closure inputData) {
        find(inputData) //Run the closure to extract inputMethods
  }
 +
 +def mappings(Closure inputData) {
 +      println("//IGNORE--some data//")
 +}
  /////MethodsForExtraction/////
  
index 5bd867aa2ad37cce06b06b4f020de1428144f8ad,97b6bff9e9d51414459e73b54eb546612c4589db..27abbc1044d509823a7ce91f2316f8aa99ae41f6
@@@ -47,10 -47,8 +47,10 @@@ def ExtractFunctions(F, appName)
        while (Temp != "EOF"):
                if (Temp == "def" or Temp == "private"):
                        Temp = GetToken(F)
 +                      if (Temp == "def" or Temp == "private"):
 +                              Temp = GetToken(F)
                        NameofFunc = Temp
 -                      if (GetToken(F) != "="): #We have a function to create object for
 +                      if (GetToken(F) == "("): #We have a function to create object for
                                if (appName == "App1"):
                                        extractedFunctionsApp1.write("//Global Object for functions in subscribe method!\n")    
                                        extractedFunctionsApp1.write("def %s = this.&" % NameofFunc)
@@@ -98,6 -96,7 +98,6 @@@
        AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities)
        AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities)
  
 -              
  
  def AnalyzeCapabilities(Temp, appName, F):
                        #Illuminance related
@@@ -419,8 -418,7 +419,12 @@@ def CheckIfOnlyTouchEvents()
                        onlyTouchEvents = False
        if onlyTouchEvents is True and app1Subscribe is True and app2Subscribe is True:
                raise Exception("\n\nDirect-Direct Interaction detected: we are skipping this pair...\n\n")
++<<<<<<< HEAD
 +
 +
++=======
+               
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
  #Extract objects to call functions from App1
  F1 = open("Extractor/App1/App1.groovy", "r")
  extractedFunctionsApp1 = open("Extractor/App1/extractedFunctionsApp1.groovy", "w+")
@@@ -479,5 -477,7 +483,10 @@@ extractorFile.close(
  Extractor.close()
  F2.close()
  os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy")
++<<<<<<< HEAD
++=======
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
  
  
index 998778b9380bb5611888df21ca3941a744de4056,f3f944a4276bda5a8be610a018e2de54a8bc38c0..bb45ddf6d395e20a1b966029c646e66376c102ea
@@@ -8,8 -8,6 +8,11 @@@
  @Field def appObject = new Touched(sendEvent, 0)
  //Create a global list for events
  //@Field def evt = []
++<<<<<<< HEAD
 +//Global Object for class AtomicState!
 +@Field def atomicState = new AtomicState()
++=======
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
  //Global Object for class Touch Sensor!
  @Field def touchSensorObject = new NfcTouch(sendEvent, 1)
  //Global Object for class switch!
  @Field def colorControlObject = new ColorControls(sendEvent, 1)
  //Global Object for class energy meter!
  @Field def energyMeterObject = new EnergyMeters(sendEvent, 1)
 +//Global Object for class illuminance measurement!
 +@Field def illuminanceMeasurementObject = new IlluminanceMeasurements(sendEvent, 1)
 +//Global Object for class power meter!
 +@Field def powerMeterObject = new PowerMeters(sendEvent, 1)
 +//Global Object for class humidity measurement!
 +@Field def humidityMeasurementObject = new RelativeHumidityMeasurements(sendEvent, 1)
 +//Global Object for class relay switch!
 +@Field def relaySwitchObject = new RelaySwitches(sendEvent, 1)
 +//Global Object for class sleep sensor!
 +@Field def sleepSensorObject = new SleepSensors(sendEvent, 1)
 +//Global Object for class step sensor!
 +@Field def stepSensorObject = new StepSensors(sendEvent, 1)
 +//Global Object for class switch level!
 +@Field def switchLevelObject = new SwitchLevels(sendEvent, 1)
 +//Global Object for class temperature measurement!
 +@Field def temperatureMeasurementObject = new TemperatureMeasurements(sendEvent, 1)
 +//Global Object for class water sensor!
 +@Field def waterSensorObject = new WaterSensors(sendEvent, 1)
 +//Global Object for class valves!
 +@Field def valveObject = new Valves(sendEvent, 1)
 +//Global Object for class mobile presence!
 +@Field def mobilePresenceObject = new MobilePresences(sendEvent, 1)
index b838418bf64c12cbba30b99e4b4804d8fa919686,4475bc24d9abdec1d4ae0478369200258ae137be..1a3dd011584ff87fad2646a502291f22ea1908d2
@@@ -13,6 -13,7 +13,10 @@@ def eventHandler(LinkedHashMap eventDat
        for (int i = 0;i < app2.eventList.size();i++) {
                if (app2.eventList[i] == name) {
                        def event = new Event(value, name, deviceId, descriptionText, displayed, linkText, linkText, isStateChange, unit, data)
++<<<<<<< HEAD
++=======
+                       //evt.add(event)
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
                        app2.functionList[i](event)
                }
        }
        for (int i = 0;i < app1.eventList.size();i++) {
                if (app1.eventList[i] == name) {
                        def event = new Event(value, name, deviceId, descriptionText, displayed, linkText, linkText, isStateChange, unit, data)
++<<<<<<< HEAD
++=======
+                       //evt.add(event)
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
                        app1.functionList[i](event)
                }
        }
diff --combined ModelCheck.py
index d00c6991a2c2c7a710d2f2f5a6106a99bf647b02,661018e1749353637721c704a8f2fdaea189c586..e3c6ff910e710a9975f5a8065d51ce8042728aee
@@@ -117,3 -117,8 +117,11 @@@ writeLogList.close(
  
  
  
++<<<<<<< HEAD
++=======
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index 63a213b9852f6b263e997b76446b6cfa86520158,847dd1cd86cc65666177668766bdeddef05ae32d..3e5f4f31ecedf28be72c0fffe6604ca2ab23c459
@@@ -16,7 -16,7 +16,7 @@@ public class MusicPlayers 
        private String displayName = "musicPlayer0"
        private int level = 20
        private String mute = "unmuted"
 -      private String status = "pause"
 +      private String status = "paused"
        private int trackNumber = 1
        private String trackData = "someTrack"
        private String trackDescription = "someDescriptions"
                this.sendEvent = sendEvent
                this.deviceNumbers = deviceNumbers
                this.musicPlayers = []
+               
+               def initLevel = Verify.getIntFromList(10, 20, 30)
+               this.level = initLevel
+               def initTrack = Verify.getIntFromList(1, 2, 3)
+               this.trackNumber = initTrack
+               def initMute = Verify.getBoolean()
+               if (initMute) {
+                       this.mute = "unmuted"
+               } else {
+                       this.mute = "mute"
+               }
+               def initStatus = Verify.getBoolean()
+               if (initStatus) {
+                       this.status = "pause"
+               } else {
+                       this.status = "play"
+               }
+               def initTrackData = Verify.getBoolean()
+               if (initTrackData) {
+                       this.trackData = "someTrack"
+               } else {
+                       this.trackData = "someOtherTrack"
+               }
+               def initTrackDesc = Verify.getBoolean()
+               if (initTrackDesc) {
+                       this.trackDescription = "someDescriptions"
+               } else {
+                       this.trackDescription = "someOtherDescriptions"
+               }
  
 +              def initLevel = Verify.getIntFromList(10, 20, 30)
 +              this.level = initLevel
 +              def initMute = Verify.getBoolean()
 +              if (initMute) {
 +                      this.mute = "unmuted"
 +              } else {
 +                      this.mute = "mute"
 +              }
 +              def initStatus = Verify.getBoolean()
 +              if (initStatus) {
 +                      this.status = "paused"
 +              } else {
 +                      this.status = "playing"
 +              }
 +
                musicPlayers.add(new MusicPlayer(id, label, displayName, this.level, this.mute, this.status, this.trackNumber, this.trackData, this.trackDescription))
        }
  
  
        //methods
        def mute() {
 -              musicPlayers[0].mute()
 -              this.mute = "muted"
 +              if (mute != "muted") {
 +                      musicPlayers[0].mute()
 +                      this.mute = "muted"
 +              }
        }
        def nextTrack() {
                musicPlayers[0].nextTrack()
 -              this.status = "playing"
 +              if (status != "playing") {
 +                      this.status = "playing"
 +              }
                this.trackNumber = musicPlayers[0].trackNumber
        }
        def pause() {
 -              musicPlayers[0].pause()
 -              this.status = "paused"
 +              if (status != "paused") {
 +                      musicPlayers[0].pause()
 +                      this.status = "paused"
 +              }
        }
        def play() {
 -              musicPlayers[0].play()
 -              this.status = "playing"
 +              if (status != "playing") {
 +                      musicPlayers[0].play()
 +                      this.status = "playing"
 +              }
        }
        def playTrack(String trackToPlay) {
                musicPlayers[0].playTrack(trackToPlay)
 -              this.status = "playing"
 +              if (status != "playing") {
 +                      this.status = "playing"
 +              }
                this.trackNumber = musicPlayers[0].trackNumber
        }
        def previousTrack() {
                musicPlayers[0].previousTrack()
 -              this.status = "playing"
 +              if (status != "playing") {
 +                      this.status = "playing"
 +              }
                this.trackNumber = musicPlayers[0].trackNumber
        }
        def restoreTrack(String trackToRestore) {
        }
        def resumeTrack(String trackToResume) {
                musicPlayers[0].resumeTrack(trackToResume)
 -              this.status = "playing"
 +              if (status != "playing") {
 +                      this.status = "playing"
 +              }
        }
        def setLevel(int level) {
 -              musicPlayers[0].setLevel(level)
 -              this.level = level
 +              if (level != this.level) {              
 +                      musicPlayers[0].setLevel(level)
 +                      this.level = level
 +              }
        }
        def setTrack(String trackToSet) {
                musicPlayers[0].setTrack(trackToSet)
 -              this.status = "playing"
 +              if (status != "playing") {
 +                      this.status = "playing"
 +              }
                this.trackNumber = musicPlayers[0].trackNumber
        }
        def stop() {
 -              musicPlayers[0].stop()
 -              this.status = "stopped"
 +              if (status != "stopped") {
 +                      musicPlayers[0].stop()
 +                      this.status = "stopped"
 +              }
        }
  
        def currentValue(String deviceFeature) {
diff --combined Runner.py
index d72844dbe2d2be08adace65a80fcfab232280238,e82d1c2f1534f7a60e4da261a0ac9404d7968fa8..5d3e101a08b25ee5537ad8ab89c4a9a387ac5c9d
+++ b/Runner.py
@@@ -21,14 -21,9 +21,14 @@@ sendSms = open("Methods/"+"sendSms.groo
  sendPush = open("Methods/"+"sendPush.groovy", "r")
  eventHandler = open("Methods/"+"eventHandler.groovy", "r")
  schedule = open("Methods/"+"schedule.groovy", "r")
 +httpPostJson = open("Methods/"+"httpPostJson.groovy", "r")
  now = open("Methods/"+"now.groovy", "r")
  getTemperatureScale = open("Methods/"+"getTemperatureScale.groovy", "r")
  getSunriseAndSunset = open("Methods/"+"getSunriseAndSunset.groovy", "r")
 +runEvery15Minutes = open("Methods/"+"runEvery15Minutes.groovy", "r")
 +timeToday = open("Methods/"+"timeToday.groovy", "r")
 +sendNotification = open("Methods/"+"sendNotification.groovy", "r")
 +canSchedule = open("Methods/"+"canSchedule.groovy", "r")
  App1 = open("Extractor/"+"App1/App1.groovy", "r")
  extractedObjectsApp1 = open("Extractor/"+"App1/extractedObjectsApp1.groovy", "r")
  extractedObjectsConstructorApp1 = open("Extractor/"+"App1/extractedObjectsConstructorApp1.groovy", "r")
@@@ -40,7 -35,6 +40,7 @@@ extractedFunctionsApp1 = open("Extracto
  Out.write("//Infrastructure for SmartThings Application\n")
  Out.write("//Importing Libraries\n")
  Out.write("import groovy.transform.Field\n")
 +Out.write("import groovy.json.JsonSlurper\n")
  Out.write("\n")
  Out.write("//Importing Classes\n")
  Out.write("import ContactSensor.ContactSensor\n")
@@@ -86,30 -80,7 +86,30 @@@ Out.write("import ColorControl.ColorCon
  Out.write("import ColorControl.ColorControls\n")
  Out.write("import EnergyMeter.EnergyMeter\n")
  Out.write("import EnergyMeter.EnergyMeters\n")
 +Out.write("import IlluminanceMeasurement.IlluminanceMeasurement\n")
 +Out.write("import IlluminanceMeasurement.IlluminanceMeasurements\n")
 +Out.write("import PowerMeter.PowerMeter\n")
 +Out.write("import PowerMeter.PowerMeters\n")
 +Out.write("import RelativeHumidityMeasurement.RelativeHumidityMeasurement\n")
 +Out.write("import RelativeHumidityMeasurement.RelativeHumidityMeasurements\n")
 +Out.write("import RelaySwitch.RelaySwitch\n")
 +Out.write("import RelaySwitch.RelaySwitches\n")
 +Out.write("import SleepSensor.SleepSensor\n")
 +Out.write("import SleepSensor.SleepSensors\n")
 +Out.write("import StepSensor.StepSensor\n")
 +Out.write("import StepSensor.StepSensors\n")
 +Out.write("import SwitchLevel.SwitchLevel\n")
 +Out.write("import SwitchLevel.SwitchLevels\n")
 +Out.write("import TemperatureMeasurement.TemperatureMeasurement\n")
 +Out.write("import TemperatureMeasurement.TemperatureMeasurements\n")
 +Out.write("import WaterSensor.WaterSensor\n")
 +Out.write("import WaterSensor.WaterSensors\n")
 +Out.write("import Valve.Valve\n")
 +Out.write("import Valve.Valves\n")
 +Out.write("import MobilePresence.MobilePresence\n")
 +Out.write("import MobilePresence.MobilePresences\n")
  Out.write("import Event.Event\n")
 +Out.write("import AtomicState.AtomicState\n")
  Out.write("import Timer.SimulatedTimer\n")
  Out.write("\n")
  Out.write("//JPF's Verify API\n")
@@@ -128,7 -99,6 +128,7 @@@ Out.write("class App1 {\n"
  Out.write("\tdef reference\n")
  Out.write("\tdef location\n")
  Out.write("\tdef app\n")
 +Out.write("\tdef atomicState\n")
  Out.write("\n")
  Out.write("\t//Extracted objects for App1\n")
  for line in extractedObjectsApp1:
@@@ -142,7 -112,6 +142,7 @@@ Out.write("\tApp1(Object obj) {\n"
  Out.write("\t\treference = obj\n")
  Out.write("\t\tlocation = obj.locationObject\n")
  Out.write("\t\tapp = obj.appObject\n")
 +Out.write("\t\tatomicState = obj.atomicState\n")
  for line in extractedObjectsConstructorApp1:
        Out.write("\t\t"+line)
  Out.write("\t}\n")
@@@ -173,16 -142,6 +173,16 @@@ for line in getTemperatureScale
        Out.write("\t"+line)
  for line in getSunriseAndSunset:
        Out.write("\t"+line)
 +for line in httpPostJson:
 +      Out.write("\t"+line)
 +for line in runEvery15Minutes:
 +      Out.write("\t"+line)
 +for line in timeToday:
 +      Out.write("\t"+line)
 +for line in sendNotification:
 +      Out.write("\t"+line)
 +for line in canSchedule:
 +      Out.write("\t"+line)
  Out.write("\n")
  Start = 0
  for line in App1:
@@@ -203,17 -162,11 +203,17 @@@ runIn = open("Methods/"+"runIn.groovy"
  unschedule = open("Methods/"+"unschedule.groovy", "r")
  sendNotificationToContacts = open("Methods/"+"sendNotificationToContacts.groovy", "r")
  sendSms = open("Methods/"+"sendSms.groovy", "r")
 +sendPush = open("Methods/"+"sendPush.groovy", "r")
  eventHandler = open("Methods/"+"eventHandler.groovy", "r")
  schedule = open("Methods/"+"schedule.groovy", "r")
  now = open("Methods/"+"now.groovy", "r")
  getTemperatureScale = open("Methods/"+"getTemperatureScale.groovy", "r")
  getSunriseAndSunset = open("Methods/"+"getSunriseAndSunset.groovy", "r")
 +httpPostJson = open("Methods/"+"httpPostJson.groovy", "r")
 +runEvery15Minutes = open("Methods/"+"runEvery15Minutes.groovy", "r")
 +timeToday = open("Methods/"+"timeToday.groovy", "r")
 +sendNotification = open("Methods/"+"sendNotification.groovy", "r")
 +canSchedule = open("Methods/"+"canSchedule.groovy", "r")
  App2 = open("Extractor/"+"App2/App2.groovy", "r")
  extractedObjectsApp2 = open("Extractor/"+"App2/extractedObjectsApp2.groovy", "r")
  extractedObjectsConstructorApp2 = open("Extractor/"+"App2/extractedObjectsConstructorApp2.groovy", "r")
@@@ -224,7 -177,6 +224,7 @@@ Out.write("class App2 {\n"
  Out.write("\tdef reference\n")
  Out.write("\tdef location\n")
  Out.write("\tdef app\n")
 +Out.write("\tdef atomicState\n")
  Out.write("\n")
  Out.write("\t//Extracted objects for App2\n")
  for line in extractedObjectsApp2:
@@@ -238,7 -190,6 +238,7 @@@ Out.write("\tApp2(Object obj) {\n"
  Out.write("\t\treference = obj\n")
  Out.write("\t\tlocation = obj.locationObject\n")
  Out.write("\t\tapp = obj.appObject\n")
 +Out.write("\t\tatomicState = obj.atomicState\n")
  for line in extractedObjectsConstructorApp2:
        Out.write("\t\t"+line)
  Out.write("\t}\n")
@@@ -269,16 -220,6 +269,16 @@@ for line in getTemperatureScale
        Out.write("\t"+line)
  for line in getSunriseAndSunset:
        Out.write("\t"+line)
 +for line in httpPostJson:
 +      Out.write("\t"+line)
 +for line in runEvery15Minutes:
 +      Out.write("\t"+line)
 +for line in timeToday:
 +      Out.write("\t"+line)
 +for line in sendNotification:
 +      Out.write("\t"+line)
 +for line in canSchedule:
 +      Out.write("\t"+line)
  Out.write("\n")
  Start = 0
  for line in App2:
@@@ -303,8 -244,8 +303,13 @@@ Out.write("if (installOrder) {\n"
  Out.write("\tapp1.installed()\n")
  Out.write("\tapp2.installed()\n")
  Out.write("} else {\n")
++<<<<<<< HEAD
 +Out.write("\tapp2.installed()\n")
 +Out.write("\tapp1.installed()\n")
++=======
+ Out.write("\tapp1.installed()\n")
+ Out.write("\tapp2.installed()\n")
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
  Out.write("}\n\n")
  for line in eventSimulator:
        Out.write(line)
diff --combined Switch/Switches.groovy
index 5a4ef48e77bd6bc5b51d0de6b2bbf27e0c082d38,36ba2de02918205039019e374806ad975c3f98ee..d396b900d05ca2020462c3ec5b1ccdb9b1b171b4
@@@ -25,20 -25,20 +25,33 @@@ public class Switches 
                this.timers = new SimulatedTimer()
                this.deviceNumbers = deviceNumbers
                this.switches = []
+               
+               def initLevel = Verify.getIntFromList(30, 50, 70)
+               this.currentLevel = initLevel
+               def init = Verify.getBoolean()
+               if (init) {
+                       this.switchState = "off"
+                       this.currentSwitch = "off"
+                       this.switchLatestValue = "off"
+               } else {
+                       this.switchState = "on"
+                       this.currentSwitch = "on"
+                       this.switchLatestValue = "on"
+               }
  
 +              def initLevel = Verify.getIntFromList(30, 50, 70)
 +              this.currentLevel = initLevel
 +              def init = Verify.getBoolean()
 +              if (init) {
 +                      this.switchState = "off"
 +                      this.currentSwitch = "off"
 +                      this.switchLatestValue = "off"
 +              } else {
 +                      this.switchState = "on"
 +                      this.currentSwitch = "on"
 +                      this.switchLatestValue = "on"
 +              }
 +
                switches.add(new Switch(sendEvent, id, label, displayName, this.switchState, this.currentSwitch, this.currentLevel, this.switchLatestValue))
        }
  
index 19f5d6f696ef3f2c486412a8e9c97be7c3430045,66957ddff3d8de686730634a06b58ce967ee6f94..d77af21e2a2d2cfe8095c53092df97abd594e7cb
@@@ -50,7 -50,7 +50,11 @@@ public class Thermostats
                this.heatingSetpoint = initHeatingSetpoint
                
                def initThermostatSetpoint = Verify.getIntFromList(50, 60, 70)
++<<<<<<< HEAD
 +              this.thermostatSetpoint = initThermostatSetpoint
++=======
+               this.currentHeatingSetpoint = initThermostatSetpoint
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
                
                def initFanMode = Verify.getInt(0,4)
                if (initFanMode == 0) {
  
        //By Apps
        def setCoolingSetpoint(int coolingSetpoint) {
 -              thermostats[0].setCoolingSetpoint(coolingSetpoint)
 -              this.currentCoolingSetpoint = coolingSetpoint
 -              this.coolingSetpoint = coolingSetpoint
 +              if (coolingSetpoint != this.coolingSetpoint) {
 +                      thermostats[0].setCoolingSetpoint(coolingSetpoint)
 +                      this.currentCoolingSetpoint = coolingSetpoint
 +                      this.coolingSetpoint = coolingSetpoint
 +              }
        }
  
        def setHeatingSetpoint(int heatingSetpoint) {
 -              thermostats[0].setHeatingSetpoint(heatingSetpoint)
 -              this.currentHeatingSetpoint = heatingSetpoint
 -              this.heatingSetpoint = heatingSetpoint
 +              if (heatingSetpoint != this.heatingSetpoint) {
 +                      thermostats[0].setHeatingSetpoint(heatingSetpoint)
 +                      this.currentHeatingSetpoint = heatingSetpoint
 +                      this.heatingSetpoint = heatingSetpoint
 +              }
        }
  
        def setSchedule() {
        }
  
        def setThermostatFanMode(String thermostatFanMode) {
 -              thermostats[0].setThermostatFanMode(thermostatFanMode)
 -              this.thermostatFanMode = thermostatFanMode
 +              if (thermostatFanMode != this.thermostatFanMode) {
 +                      thermostats[0].setThermostatFanMode(thermostatFanMode)
 +                      this.thermostatFanMode = thermostatFanMode
 +              }
        }
  
        def setThermostatMode(String thermostatMode) {
 -              thermostats[0].setThermostatMode(thermostatMode)
 -              this.thermostatMode = thermostatMode
 -              this.currentThermostatMode = currentThermostatMode
 +              if (thermostatMode != this.thermostatMode) {
 +                      thermostats[0].setThermostatMode(thermostatMode)
 +                      this.thermostatMode = thermostatMode
 +                      this.currentThermostatMode = currentThermostatMode
 +              }
        }
  
        def cool() {
 -              thermostats[0].cool()
 -              this.thermostatMode = "cool"
 -              this.currentThermostatMode = "cool"
 +              if (thermostatMode != "cool") {
 +                      thermostats[0].cool()
 +                      this.thermostatMode = "cool"
 +                      this.currentThermostatMode = "cool"
 +              }
        }
  
        def heat() {
 -              thermostats[0].heat()
 -              this.thermostatMode = "heat"
 -              this.currentThermostatMode = "heat"
 +              if (thermostatMode != "heat") {
 +                      thermostats[0].heat()
 +                      this.thermostatMode = "heat"
 +                      this.currentThermostatMode = "heat"
 +              }
        }
  
        def auto() {
 -              thermostats[0].auto()
 -              this.thermostatMode = "auto"
 -              this.currentThermostatMode = "auto"
 +              if (thermostatMode != "auto") {
 +                      thermostats[0].auto()
 +                      this.thermostatMode = "auto"
 +                      this.currentThermostatMode = "auto"
 +              }
        }
  
        def off() {
 -              thermostats[0].off()
 -              this.thermostatMode = "off"
 -              this.currentThermostatMode = "off"
 +              if (thermostatMode != "off") {
 +                      thermostats[0].off()
 +                      this.thermostatMode = "off"
 +                      this.currentThermostatMode = "off"
 +              }
        }
  
        def setClimate(String info, String givenClimateName) {
 -              thermostats[0].setClimate(info, givenClimateName)
 -              this.climateName = givenClimateName
 +              if (givenClimateName != climateName) {
 +                      thermostats[0].setClimate(info, givenClimateName)
 +                      this.climateName = givenClimateName
 +              }
        }
  
        def setHold(String info1, int coolingSetpoint, int heatingSetpoint, String info2, String info3) {
 -              thermostats[0].setHold(info1, coolingSetpoint, heatingSetpoint, info2, info3)
 -              this.currentCoolingSetpoint = coolingSetpoint
 -              this.coolingSetpoint = coolingSetpoint
 -              this.currentHeatingSetpoint = heatingSetpoint
 -              this.heatingSetpoint = heatingSetpoint
 +              if ((coolingSetpoint != this.coolingSetpoint) || (heatingSetpoint != this.heatingSetpoint)) {
 +                      thermostats[0].setHold(info1, coolingSetpoint, heatingSetpoint, info2, info3)
 +                      this.currentCoolingSetpoint = coolingSetpoint
 +                      this.coolingSetpoint = coolingSetpoint
 +                      this.currentHeatingSetpoint = heatingSetpoint
 +                      this.heatingSetpoint = heatingSetpoint
 +              }
        }
  
        //By Model Checker
index 6991b5621a26bc6bf9d148aa799c737ce149e564,b7fa4d91002da46afefe900b27c3449cf84a9d40..06ec00bb3c909a38f3ea9840bb3c9dde7349677e
@@@ -1,2 -1,2 +1,6 @@@
                        accelerationSensorObject.setValue([name: "acceleration", value: "active", deviceId: "accelerationSensorID0", descriptionText: "",
++<<<<<<< HEAD
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
++=======
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index eaa876fcd42b80cb555fda18d915f4a32f94c804,60c9021c62cf8759ecca85cc15403e1a4fce4d41..2e5b6728f36a24fd9d90f494fc3d24030d4886b0
@@@ -1,2 -1,2 +1,6 @@@
                        accelerationSensorObject.setValue([name: "acceleration", value: "inactive", deviceId: "accelerationSensorID0", descriptionText: "",
++<<<<<<< HEAD
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
++=======
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index 445e51f7281b4f6b2add8e67125fbd5cf1677672,699c4e7c7880039d197f660334b2f744b5fd7b1b..36f8bd8cb53f68cba7fbcd3b759b44ccf93528a9
@@@ -1,2 -1,2 +1,7 @@@
++<<<<<<< HEAD
 +                      beaconSensorObject.setValue([name: "presence", value: "not present", deviceId: "beaconSensorID0", descriptionText: "",
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"presence":"0","dni":"mobile0"}'])
++=======
+                       beaconSensorObject.setValue([name: "beacon", value: "not present", deviceId: "beaconSensorID0", descriptionText: "",
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index 816a1299cf4f958417ae768ea40804bf626a1dfb,0c20e73a2f35512e734574ff68daccb7e37ac61f..7ce002b05a14aab64e6f17aee81b53d854c0f8c1
@@@ -1,2 -1,2 +1,7 @@@
++<<<<<<< HEAD
 +                      beaconSensorObject.setValue([name: "presence", value: "present", deviceId: "beaconeSensorID0", descriptionText: "",
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"presence":"1","dni":"mobile0"}'])
++=======
+                       beaconSensorObject.setValue([name: "beacon", value: "present", deviceId: "beaconeSensorID0", descriptionText: "",
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index fb3520d33b456682534c7d7651855403f6a59883,eca4d6cb2856230cddb5cc67af94629746572776..0101c3fb6b0bdbcf1b8b3157e7a3aea18e51bb68
@@@ -1,2 -1,2 +1,6 @@@
                        carbonMonoxideDetectorObject.setValue([name: "carbonMonoxide", value: "clear", deviceId: "carbonMonoxideDetectorID0", descriptionText: "",
++<<<<<<< HEAD
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
++=======
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index 6686f9112272f23c0babafb30ca70990e10cc9b7,98f57a6d1cd3cb93f69a3f47572dcb703470e4fb..5a3464ccac67eb4b385aad0442edaeb69f6a8345
@@@ -1,2 -1,2 +1,6 @@@
                        carbonMonoxideDetectorObject.setValue([name: "carbonMonoxide", value: "tested", deviceId: "carbonMonoxideDetectorID0", descriptionText: "",
++<<<<<<< HEAD
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
++=======
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index 6686f9112272f23c0babafb30ca70990e10cc9b7,98f57a6d1cd3cb93f69a3f47572dcb703470e4fb..5a3464ccac67eb4b385aad0442edaeb69f6a8345
@@@ -1,2 -1,2 +1,6 @@@
                        carbonMonoxideDetectorObject.setValue([name: "carbonMonoxide", value: "tested", deviceId: "carbonMonoxideDetectorID0", descriptionText: "",
++<<<<<<< HEAD
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
++=======
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index 5ed3b4f34a12a520223b3bef7b1f5f642fbb5e7e,a90b2bc711d5ad080584d568939f4f2542e21ac0..598e011d40cc2b40847d9049620f72d1e02870d9
@@@ -1,2 -1,2 +1,6 @@@
                        colorControlObject.setValue([name: "color", value: "red", deviceId: "colorControlID0", descriptionText: "",
++<<<<<<< HEAD
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
++=======
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index b5d20d2fd9650c4a772ab10eff1e25e1794f6962,1f9307b27a0cf8bb793e2938cab2d06ede337446..de7e537e8185dc8c5d9267b9a1ad5d9961addf82
@@@ -1,2 -1,2 +1,6 @@@
                        colorControlObject.setValue([name: "hue", value: "50", deviceId: "colorControlID0", descriptionText: "",
++<<<<<<< HEAD
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
++=======
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index 5327de2e3c42ac2c3b764af2c0a5de8ab7aea9da,09d013b4917af5e518dc1e78b3250c530213d4b6..842d28bb1ee50d4a6f9361856c8f364af4061d49
@@@ -1,2 -1,2 +1,6 @@@
                        colorControlObject.setValue([name: "saturation", value: "50", deviceId: "colorControlID0", descriptionText: "",
++<<<<<<< HEAD
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
++=======
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index 7c1df43930826420abf0b3d7e2060d8286c910fc,09db47cfd357272cc9fcadb44829bd806655c116..06728c7f6d5bcaffea37bb9d731a39e95ab3b5d3
@@@ -1,2 -1,2 +1,6 @@@
                        smokeDetectorObject.setValue([name: "carbonMonoxide", value: "clear", deviceId: "smokeDetectorID0", descriptionText: "",
++<<<<<<< HEAD
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
++=======
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index b889098ffc0e865cfdd4bd77cc03440bcc2fd320,5aa27d1978a6b1fdc76ea26211575cfd0f607ece..2f2fa4e03978ae99555220031423555dc58ecd49
@@@ -1,2 -1,2 +1,6 @@@
                        smokeDetectorObject.setValue([name: "carbonMonoxide", value: "detected", deviceId: "smokeDetectorID0", descriptionText: "",
++<<<<<<< HEAD
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
++=======
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index 2ce58bc98cadbcfa3ac1fab0881d739710530e43,0c6e18e5dd3371283eea9c2c06660b34e7111130..04b1805ec7e63a9cb17e7a2a6c43e325166bea3f
@@@ -1,2 -1,2 +1,6 @@@
                        smokeDetectorObject.setValue([name: "carbonMonoxide", value: "tested", deviceId: "smokeDetectorID0", descriptionText: "",
++<<<<<<< HEAD
 +                                      displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
++=======
+                                       displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c