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

index 8aca5e2a66c50bee42ff20a8ce466299101a855b,6e40e12f672508a254a0cb22fc0b90ebcc9162ce..4664fb9f62b761553c05fb4bd7ea736781a8b77c
@@@ -22,10 -22,10 +22,13 @@@ public class Batteries 
                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))
        }
  
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"
index a3f2b8dff1409b68958ad937d738dc69e3099585,59670840b327d7dfd8d8a9f8e993d3d6abbe64e5..85544953c2c05aa20996d6e0aee4bf89fef1ec48
@@@ -22,10 -18,10 +22,17 @@@ public class EnergyMeters 
                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))
        }
  
index 309223d3547eaa7cb8ba1412763e7777a3301ae3,00b993d04ff9e2fb76d881995980be5bc37e351c..e8ccbdae45c7ca71197afafc92cdbf395b6cfee4
@@@ -1365,6 -1013,10 +1365,13 @@@ def input(LinkedHashMap metaData) 
                        }
                        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'
index 5bd867aa2ad37cce06b06b4f020de1428144f8ad,97b6bff9e9d51414459e73b54eb546612c4589db..27abbc1044d509823a7ce91f2316f8aa99ae41f6
@@@ -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!
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 --cc ModelCheck.py
index d00c6991a2c2c7a710d2f2f5a6106a99bf647b02,661018e1749353637721c704a8f2fdaea189c586..e3c6ff910e710a9975f5a8065d51ce8042728aee
@@@ -117,3 -117,8 +117,11 @@@ writeLogList.close(
  
  
  
++<<<<<<< HEAD
++=======
++>>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
index 63a213b9852f6b263e997b76446b6cfa86520158,847dd1cd86cc65666177668766bdeddef05ae32d..3e5f4f31ecedf28be72c0fffe6604ca2ab23c459
@@@ -27,22 -27,36 +27,51 @@@ public class MusicPlayers 
                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))
        }
  
diff --cc Runner.py
index d72844dbe2d2be08adace65a80fcfab232280238,e82d1c2f1534f7a60e4da261a0ac9404d7968fa8..5d3e101a08b25ee5537ad8ab89c4a9a387ac5c9d
+++ b/Runner.py
@@@ -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)
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) {
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