Adding SmartThing class and MutableInteger
[smartthings-infrastructure.git] / SmartThing / SmartThing.groovy
1 //Create a class for SmartThing
2 package SmartThing
3
4 //JPF's Verify API
5 import gov.nasa.jpf.vm.Verify
6
7 //Importing mutable integer class
8 import MutableInteger.MutableInteger
9
10 public class SmartThing {       
11         List nonStoredDevices = ["aeonKeyFob", "appTouch", "button", "momentary", "nfcTouch"] // Devices with no stored value
12         def sendEventSmartThings
13
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>();
20
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"]
26
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)
33                         }
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)
40                         }
41                 } else if (nonStoredDevices.contains(name)) {
42                         println("the $name with id:$tmpID is triggered to $value!")
43                         sendEventSmartThings(eventDataMap)
44                 }
45         }
46
47         def statesSince() {
48                 eventsSince()
49         }
50
51         def eventsSince() {
52                 if (labelSmartThing.toString().equals("humidity") || labelSmartThing.toString().equals("temperature")) {
53                         sendCurrentValue()
54                 } else {
55                         sendPossibleValues()
56                 }
57         }
58
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)
64                 def evtToSend = []
65                 if (init == 0) {// return empty set
66                         return evtToSend
67                 } else if (init == 1) {// send one open event
68                         evtTemp.each{
69                                 evtToSend.add(it)
70                         }
71                         return evtToSend
72                 }
73         }
74
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)
81                 def evtToSend = []
82                 if (init == 0) {// return empty set
83                         return evtToSend
84                 } else if (init == 1) {// send one event A
85                         evtA.each{
86                                 evtToSend.add(it)
87                         }
88                         return evtToSend
89                 } else if (init == 2) {// send two events A
90                         evtA.each{
91                                 evtToSend.add(it)
92                         }
93                         evtA.each{
94                                 evtToSend.add(it)
95                         }
96                         return evtToSend
97                 } else if (init == 3) {// send one event B
98                         evtB.each{
99                                 evtToSend.add(it)
100                         }
101                         return evtToSend
102                 } else if (init == 4) {// send two events B
103                         evtB.each{
104                                 evtToSend.add(it)
105                         }
106                         evtB.each{
107                                 evtToSend.add(it)
108                         }
109                         return evtToSend
110                 }
111         }
112
113         // Methods to return values
114         def currentState(String deviceFeature) {
115                 return [rawDateCreated: [time: System.currentTimeMillis()]]
116         }
117         
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()   
123                 } else {
124                         println("Wrong device feature is sent to this method!")
125                 }
126         }
127
128         def latestValue(String deviceFeature) {
129                 currentValue(deviceFeature)
130         }
131
132         def getId() {
133                 return idSmartThing.toString()
134         }
135
136         def getLabel() {
137                 return labelSmartThing.toString()
138         }
139         
140         def getDisplayName() {
141                 return displayNameSmartThing.toString()
142         }
143 }