1 //Create a class for SmartThing
5 import gov.nasa.jpf.vm.Verify
7 //Importing mutable integer class
8 import MutableInteger.MutableInteger
10 public class SmartThing {
11 List nonStoredDevices = ["aeonKeyFob", "appTouch", "button", "momentary", "nfcTouch"] // Devices with no stored value
12 List locationTimeFeatures = ["sunset", "sunrise", "sunriseTime", "sunsetTime"]
13 def sendEventSmartThings
15 StringBuilder idSmartThing = new StringBuilder()
16 StringBuilder labelSmartThing = new StringBuilder()
17 StringBuilder displayNameSmartThing = new StringBuilder()
18 HashMap<String, StringBuilder> deviceValueSmartThing = new HashMap<String, StringBuilder>()
19 HashMap<String, MutableInteger> deviceIntValueSmartThing = new HashMap<String, MutableInteger>()
20 List<StringBuilder> possibleValuesSmartThings = new ArrayList<StringBuilder>();
22 // Method for handling events
23 def setValue(LinkedHashMap eventDataMap) {
24 def name = eventDataMap["name"]
25 def tmpID = eventDataMap["deviceId"]
26 def value = eventDataMap["value"]
28 if (deviceValueSmartThing.containsKey(name)) {
29 StringBuilder tmpStr = deviceValueSmartThing.get(name)
30 if (!value.equals(tmpStr.toString())) {
31 tmpStr.replace(0, tmpStr.length(), value)
32 println("the $name with id:$tmpID is triggered to $value!")
33 sendEventSmartThings(eventDataMap)
35 } else if (deviceIntValueSmartThing.containsKey(name)) {
36 MutableInteger tmpInt = deviceIntValueSmartThing.get(name)
37 if (!value.equals(tmpInt.getValue())) {
38 tmpInt.setValue(value)
39 println("the $name with id:$tmpID is triggered to $value!")
40 sendEventSmartThings(eventDataMap)
42 } else if (nonStoredDevices.contains(name)) {
43 println("the $name with id:$tmpID is triggered to $value!")
44 sendEventSmartThings(eventDataMap)
45 } else if (locationTimeFeatures.contains(name)) {
46 return System.currentTimeMillis()
47 println("This is $name!")
48 sendEventSmartThings(eventDataMap)
57 if (labelSmartThing.toString().equals("humidity") || labelSmartThing.toString().equals("temperature")) {
64 def sendCurrentValue() {
65 def label = labelSmartThing.toString()
66 def evtTemp = [[name: label, value: deviceIntValueSmartThing.get(label).getValue(), deviceId: idSmartThing.toString(), descriptionText: "",
67 displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']]
68 def init = Verify.getInt(0,1)
70 if (init == 0) {// return empty set
72 } else if (init == 1) {// send one open event
80 def sendPossibleValues() {
81 def evtA = [[name: labelSmartThing.toString(), value: possibleValuesSmartThings[0].toString(), deviceId: idSmartThing.toString(), descriptionText: "",
82 displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']]
83 def evtB = [[name: labelSmartThing.toString(), value: possibleValuesSmartThings[1].toString(), deviceId: idSmartThing.toString(), descriptionText: "",
84 displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']]
85 def init = Verify.getInt(0,4)
87 if (init == 0) {// return empty set
89 } else if (init == 1) {// send one event A
94 } else if (init == 2) {// send two events A
102 } else if (init == 3) {// send one event B
107 } else if (init == 4) {// send two events B
118 // Methods to return values
119 def currentState(String deviceFeature) {
120 return [rawDateCreated: [time: System.currentTimeMillis()]]
123 def currentValue(String deviceFeature) {
124 if (deviceValueSmartThing.containsKey(deviceFeature)) {
125 return deviceValueSmartThing.get(deviceFeature).toString()
126 } else if (deviceIntValueSmartThing.containsKey(deviceFeature)) {
127 return deviceIntValueSmartThing.get(deviceFeature).getValue()
129 println("Wrong device feature is sent to this method!")
133 def latestValue(String deviceFeature) {
134 currentValue(deviceFeature)
138 return idSmartThing.toString()
142 return labelSmartThing.toString()
145 def getDisplayName() {
146 return displayNameSmartThing.toString()