Add changes in events
[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         List locationTimeFeatures = ["sunset", "sunrise", "sunriseTime", "sunsetTime"]
13         def sendEventSmartThings
14
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>();
21
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"]
27
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)
34                         }
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)
41                         }
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)
49                 }
50         }
51
52         def statesSince() {
53                 eventsSince()
54         }
55
56         def eventsSince() {
57                 if (labelSmartThing.toString().equals("humidity") || labelSmartThing.toString().equals("temperature")) {
58                         sendCurrentValue()
59                 } else {
60                         sendPossibleValues()
61                 }
62         }
63
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)
69                 def evtToSend = []
70                 if (init == 0) {// return empty set
71                         return evtToSend
72                 } else if (init == 1) {// send one open event
73                         evtTemp.each{
74                                 evtToSend.add(it)
75                         }
76                         return evtToSend
77                 }
78         }
79
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)
86                 def evtToSend = []
87                 if (init == 0) {// return empty set
88                         return evtToSend
89                 } else if (init == 1) {// send one event A
90                         evtA.each{
91                                 evtToSend.add(it)
92                         }
93                         return evtToSend
94                 } else if (init == 2) {// send two events A
95                         evtA.each{
96                                 evtToSend.add(it)
97                         }
98                         evtA.each{
99                                 evtToSend.add(it)
100                         }
101                         return evtToSend
102                 } else if (init == 3) {// send one event B
103                         evtB.each{
104                                 evtToSend.add(it)
105                         }
106                         return evtToSend
107                 } else if (init == 4) {// send two events B
108                         evtB.each{
109                                 evtToSend.add(it)
110                         }
111                         evtB.each{
112                                 evtToSend.add(it)
113                         }
114                         return evtToSend
115                 }
116         }
117
118         // Methods to return values
119         def currentState(String deviceFeature) {
120                 return [rawDateCreated: [time: System.currentTimeMillis()]]
121         }
122         
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()   
128                 } else {
129                         println("Wrong device feature is sent to this method!")
130                 }
131         }
132
133         def latestValue(String deviceFeature) {
134                 currentValue(deviceFeature)
135         }
136
137         def getId() {
138                 return idSmartThing.toString()
139         }
140
141         def getLabel() {
142                 return labelSmartThing.toString()
143         }
144         
145         def getDisplayName() {
146                 return displayNameSmartThing.toString()
147         }
148 }