//Create a class for SmartThing package SmartThing //JPF's Verify API import gov.nasa.jpf.vm.Verify //Importing mutable integer class import MutableInteger.MutableInteger public class SmartThing { List nonStoredDevices = ["aeonKeyFob", "appTouch", "button", "momentary", "nfcTouch"] // Devices with no stored value def sendEventSmartThings StringBuilder idSmartThing = new StringBuilder() StringBuilder labelSmartThing = new StringBuilder() StringBuilder displayNameSmartThing = new StringBuilder() HashMap deviceValueSmartThing = new HashMap() HashMap deviceIntValueSmartThing = new HashMap() List possibleValuesSmartThings = new ArrayList(); // Method for handling events def setValue(LinkedHashMap eventDataMap) { def name = eventDataMap["name"] def tmpID = eventDataMap["deviceId"] def value = eventDataMap["value"] if (deviceValueSmartThing.containsKey(name)) { StringBuilder tmpStr = deviceValueSmartThing.get(name) if (!value.equals(tmpStr.toString())) { tmpStr.replace(0, tmpStr.length(), value) println("the $name with id:$tmpID is triggered to $value!") sendEventSmartThings(eventDataMap) } } else if (deviceIntValueSmartThing.containsKey(name)) { MutableInteger tmpInt = deviceIntValueSmartThing.get(name) if (!value.equals(tmpInt.getValue())) { tmpInt.setValue(value) println("the $name with id:$tmpID is triggered to $value!") sendEventSmartThings(eventDataMap) } } else if (nonStoredDevices.contains(name)) { println("the $name with id:$tmpID is triggered to $value!") sendEventSmartThings(eventDataMap) } } def statesSince() { eventsSince() } def eventsSince() { if (labelSmartThing.toString().equals("humidity") || labelSmartThing.toString().equals("temperature")) { sendCurrentValue() } else { sendPossibleValues() } } def sendCurrentValue() { def label = labelSmartThing.toString() def evtTemp = [[name: label, value: deviceIntValueSmartThing.get(label).getValue(), deviceId: idSmartThing.toString(), descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']] def init = Verify.getInt(0,1) def evtToSend = [] if (init == 0) {// return empty set return evtToSend } else if (init == 1) {// send one open event evtTemp.each{ evtToSend.add(it) } return evtToSend } } def sendPossibleValues() { def evtA = [[name: labelSmartThing.toString(), value: possibleValuesSmartThings[0].toString(), deviceId: idSmartThing.toString(), descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']] def evtB = [[name: labelSmartThing.toString(), value: possibleValuesSmartThings[1].toString(), deviceId: idSmartThing.toString(), descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']] def init = Verify.getInt(0,4) def evtToSend = [] if (init == 0) {// return empty set return evtToSend } else if (init == 1) {// send one event A evtA.each{ evtToSend.add(it) } return evtToSend } else if (init == 2) {// send two events A evtA.each{ evtToSend.add(it) } evtA.each{ evtToSend.add(it) } return evtToSend } else if (init == 3) {// send one event B evtB.each{ evtToSend.add(it) } return evtToSend } else if (init == 4) {// send two events B evtB.each{ evtToSend.add(it) } evtB.each{ evtToSend.add(it) } return evtToSend } } // Methods to return values def currentState(String deviceFeature) { return [rawDateCreated: [time: System.currentTimeMillis()]] } def currentValue(String deviceFeature) { if (deviceValueSmartThing.containsKey(deviceFeature)) { return deviceValueSmartThing.get(deviceFeature).toString() } else if (deviceIntValueSmartThing.containsKey(deviceFeature)) { return deviceIntValueSmartThing.get(deviceFeature).getValue() } else { println("Wrong device feature is sent to this method!") } } def latestValue(String deviceFeature) { currentValue(deviceFeature) } def getId() { return idSmartThing.toString() } def getLabel() { return labelSmartThing.toString() } def getDisplayName() { return displayNameSmartThing.toString() } }