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 def sendEventSmartThings
14 StringBuilder idSmartThing = new StringBuilder()
15 StringBuilder labelSmartThing = new StringBuilder()
16 StringBuilder displayNameSmartThing = new StringBuilder()
17 HashMap<String, StringBuilder> deviceValueSmartThing = new HashMap<String, StringBuilder>()
18 HashMap<String, MutableInteger> deviceIntValueSmartThing = new HashMap<String, MutableInteger>()
19 List<StringBuilder> possibleValuesSmartThings = new ArrayList<StringBuilder>();
21 // Method for handling events
22 def setValue(LinkedHashMap eventDataMap) {
23 def name = eventDataMap["name"]
24 def tmpID = eventDataMap["deviceId"]
25 def value = eventDataMap["value"]
27 if (deviceValueSmartThing.containsKey(name)) {
28 StringBuilder tmpStr = deviceValueSmartThing.get(name)
29 if (!value.equals(tmpStr.toString())) {
30 tmpStr.replace(0, tmpStr.length(), value)
31 println("the $name with id:$tmpID is triggered to $value!")
32 sendEventSmartThings(eventDataMap)
34 } else if (deviceIntValueSmartThing.containsKey(name)) {
35 MutableInteger tmpInt = deviceIntValueSmartThing.get(name)
36 if (!value.equals(tmpInt.getValue())) {
37 tmpInt.setValue(value)
38 println("the $name with id:$tmpID is triggered to $value!")
39 sendEventSmartThings(eventDataMap)
41 } else if (nonStoredDevices.contains(name)) {
42 println("the $name with id:$tmpID is triggered to $value!")
43 sendEventSmartThings(eventDataMap)
52 if (labelSmartThing.toString().equals("humidity") || labelSmartThing.toString().equals("temperature")) {
59 def sendCurrentValue() {
60 def label = labelSmartThing.toString()
61 def evtTemp = [[name: label, value: deviceIntValueSmartThing.get(label).getValue(), deviceId: idSmartThing.toString(), descriptionText: "",
62 displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']]
63 def init = Verify.getInt(0,1)
65 if (init == 0) {// return empty set
67 } else if (init == 1) {// send one open event
75 def sendPossibleValues() {
76 def evtA = [[name: labelSmartThing.toString(), value: possibleValuesSmartThings[0].toString(), deviceId: idSmartThing.toString(), descriptionText: "",
77 displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']]
78 def evtB = [[name: labelSmartThing.toString(), value: possibleValuesSmartThings[1].toString(), deviceId: idSmartThing.toString(), descriptionText: "",
79 displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']]
80 def init = Verify.getInt(0,4)
82 if (init == 0) {// return empty set
84 } else if (init == 1) {// send one event A
89 } else if (init == 2) {// send two events A
97 } else if (init == 3) {// send one event B
102 } else if (init == 4) {// send two events B
113 // Methods to return values
114 def currentState(String deviceFeature) {
115 return [rawDateCreated: [time: System.currentTimeMillis()]]
118 def currentValue(String deviceFeature) {
119 if (deviceValueSmartThing.containsKey(deviceFeature)) {
120 return deviceValueSmartThing.get(deviceFeature).toString()
121 } else if (deviceIntValueSmartThing.containsKey(deviceFeature)) {
122 return deviceIntValueSmartThing.get(deviceFeature).getValue()
124 println("Wrong device feature is sent to this method!")
128 def latestValue(String deviceFeature) {
129 currentValue(deviceFeature)
133 return idSmartThing.toString()
137 return labelSmartThing.toString()
140 def getDisplayName() {
141 return displayNameSmartThing.toString()