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))
}
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
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) {
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()
+ }
}
}
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))
}
if (eventDataMap["value"] != energyMeters[0].energy) {
energyMeters[0].setValue(eventDataMap["value"])
this.energy = energyMeters[0].energy
+ this.currentEnergy = energyMeters[0].currentEnergy
sendEvent(eventDataMap)
}
}
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
+//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
}
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'
def href(LinkedHashMap metaData) {
println("//IGNORE--some data//")
}
+
+def href(LinkedHashMap metaData, String name) {
+ println("//IGNORE--some data//")
+}
/////Input Methods/////
def section(LinkedHashMap metaData, Closure inputData) {
find(inputData) //Run the closure to extract inputMethods
}
+
+def mappings(Closure inputData) {
+ println("//IGNORE--some data//")
+}
/////MethodsForExtraction/////
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)
AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities)
AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities)
-
def AnalyzeCapabilities(Temp, appName, F):
#Illuminance related
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+")
Extractor.close()
F2.close()
os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy")
++<<<<<<< HEAD
++=======
+
+
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
@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)
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)
}
}
++<<<<<<< HEAD
++=======
+
+
+
+
+
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
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) {
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")
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")
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")
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:
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")
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:
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")
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:
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")
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:
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)
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))
}
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
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
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
++<<<<<<< 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
++<<<<<<< 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
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
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
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
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
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
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
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
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
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