Infrastruction modification
[smartthings-infrastructure.git] / Thermostat / Thermostat.groovy
index 41a351cd2470043f10445ba3d10787c18649b8f4..40eea8d19b59bba0bdcf96ffadc8e32a1c4796f2 100644 (file)
 //Create a class for thermostat device
 package Thermostat
-import Timer.SimulatedTimer
-
-public class Thermostat {
-       private String id
-       private String label
-       private String displayName
-       private int temperature
-       private int currentTemperature
-       private int currentCoolingSetpoint
-       private int currentHeatingSetpoint
-       private int coolingSetpoint
-       private int latestCoolingSetPoint
-       private int thermostatSetpoint
-       private int latestThermostatSetPoint
-       private int heatingSetpoint
-       private int latestHeatingSetPoint
-       private List coolingSetpointRange
-       private List thermostatSetpointRange
-       private List heatingSetpointRange
-       private List supportedThermostatFanModes
-       private List supportedThermostatModes
-       private String thermostatOperatingState
-       private String thermostatFanMode
-       private String thermostatMode
-       private String currentThermostatMode
-       private String climateName
-       private String thermostatLatestMode
-       private String thermostatLatestOperatingState
-       private String thermostatLatestFanMode
-       def sendEvent
-       def timers
-
-
-       Thermostat(Closure sendEvent, String id, String label, String displayName, int temperature, int currentCoolingSetpoint, int currentHeatingSetpoint, int coolingSetpoint, 
-                   int thermostatSetpoint, int heatingSetpoint, List coolingSetpointRange, List thermostatSetpointRange, List heatingSetpointRange, 
-                   List supportedThermostatFanModes, List supportedThermostatModes, String thermostatOperatingState, String thermostatFanMode, String thermostatMode,
-                  String climateName, String thermostatLatestMode, String thermostatLatestOperatingState, String thermostatLatestFanMode, int latestCoolingSetPoint,
-                  int latestThermostatSetPoint, int latestHeatingSetPoint) {
+import SmartThing.SmartThing
+
+class Thermostat extends SmartThing {
+       // id, label, and display name of the device
+       StringBuilder id = new StringBuilder()
+       StringBuilder label = new StringBuilder()
+       StringBuilder displayName = new StringBuilder()
+       // Features with numberical values
+       MutableInteger currentTemperature = new MutableInteger()
+       MutableInteger currentCoolingSetpoint = new MutableInteger()
+       MutableInteger currentHeatingSetpoint = new MutableInteger()
+       MutableInteger currentThermostatSetPoint = new MutableInteger()
+       // Features with string values
+       StringBuilder currentThermostatOperatingState = new StringBuilder()
+       StringBuilder currentThermostatFanMode = new StringBuilder()
+       StringBuilder currentThermostatMode = new StringBuilder()
+       StringBuilder currentClimateName = new StringBuilder()
+       // Maps from features to values
+       HashMap<String, StringBuilder> deviceValuesMap = new HashMap<String, StringBuilder>()
+       HashMap<String, MutableInteger> deviceIntValuesMap = new HashMap<String, MutableInteger>()
+
+       Thermostat(Closure sendEvent, StringBuilder id, StringBuilder label, StringBuilder displayName, MutableInteger currentTemperature, MutableInteger currentCoolingSetpoint, 
+                   MutableInteger currentHeatingSetpoint, MutableInteger currentThermostatSetPoint, StringBuilder currentThermostatOperatingState, StringBuilder currentThermostatFanMode, 
+                  StringBuilder currentThermostatMode, StringBuilder currentClimateName) {
+               deviceValuesMap = deviceValueSmartThing
+               deviceIntValuesMap = deviceIntValueSmartThing
+               idSmartThing = id
+               labelSmartThing = label
+               displayNameSmartThing = displayName
+               sendEventSmartThings = sendEvent
+
+               // Initialization
                this.id = id
                this.label = label
-               this.sendEvent = sendEvent
-               this.temperature = temperature
+               this.displayName = displayName
                this.currentTemperature = currentTemperature
                this.currentCoolingSetpoint = currentCoolingSetpoint
                this.currentHeatingSetpoint = currentHeatingSetpoint
-               this.coolingSetpoint = coolingSetpoint
-               this.thermostatSetpoint = thermostatSetpoint
-               this.heatingSetpoint = heatingSetpoint
-               this.coolingSetpointRange = coolingSetpointRange
-               this.thermostatSetpointRange = thermostatSetpointRange
-               this.heatingSetpointRange = heatingSetpointRange
-               this.supportedThermostatFanModes = supportedThermostatFanModes
-               this.supportedThermostatModes = supportedThermostatModes
-               this.thermostatOperatingState = thermostatOperatingState
-               this.thermostatFanMode = thermostatFanMode
-               this.thermostatMode = thermostatMode
-               this.currentThermostatMode = thermostatMode
-               this.climateName = climateName
-               this.thermostatLatestMode = thermostatLatestMode
-               this.thermostatLatestOperatingState = thermostatLatestOperatingState
-               this.thermostatLatestFanMode = thermostatLatestFanMode
-               this.latestHeatingSetPoint = latestHeatingSetPoint
-               this.latestThermostatSetPoint = latestThermostatSetPoint
-               this.latestCoolingSetPoint = latestCoolingSetPoint
-       }
-
+               this.currentThermostatSetPoint = currentThermostatSetPoint
+               this.currentThermostatOperatingState = currentThermostatOperatingState
+               this.currentThermostatFanMode = currentThermostatFanMode
+               this.currentThermostatMode = currentThermostatMode
+               this.currentClimateName = currentClimateName
 
-       //By Apps
-       def setCoolingSetpoint(int coolingSetpoint) {
-               if (this.coolingSetpoint != coolingSetpoint) {
-                       this.latestCoolingSetPoint = coolingSetpoint
-                       this.coolingSetpoint = coolingSetpoint
-                       this.currentCoolingSetpoint = coolingSetpoint
-                       println("Cooling set point for the thermostat with id:$id is changed to $coolingSetpoint!")
-                       sendEvent([name: "coolingSetpoint", value: "$coolingSetpoint", deviceId: this.id, descriptionText: "",
-                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
-               }
+               deviceValuesMap.put("temperature", currentTemperature)
+               deviceValuesMap.put("thermostatOperatingState", currentThermostatOperatingState)
+               deviceValuesMap.put("thermostatFanMode", currentThermostatFanMode)
+               deviceValuesMap.put("thermostatMode", currentThermostatMode)
+               deviceIntValuesMap.put("coolingSetpoint", currentCoolingSetpoint)
+               deviceIntValuesMap.put("heatingSetpoint", currentHeatingSetpoint)
+               deviceIntValuesMap.put("thermostatSetpoint", currentThermostatSetPoint)
        }
 
-       def setCoolingSetpoint(String coolingSetpoint) {
-               setCoolingSetpoint(coolingSetpoint.toInteger())
+       // Methods to set values
+       def setCoolingSetpoint(int newValue) {
+               action(this.currentCoolingSetpoint, newValue, "coolingSetpoint")
        }
 
-       def setHeatingSetpoint(int heatingSetpoint) {
-               if (this.heatingSetpoint != heatingSetpoint) {
-                       this.latestHeatingSetPoint = heatingSetpoint
-                       this.heatingSetpoint = heatingSetpoint
-                       this.currentHeatingSetpoint = heatingSetpoint
-                       println("Heating set point for the thermostat with id:$id is changed to $heatingSetpoint!")
-                       sendEvent([name: "heatingSetpoint", value: "$heatingSetpoint", deviceId: this.id, descriptionText: "",
-                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
-               }
+       def setCoolingSetpoint(String newValue) {
+               setCoolingSetpoint(newValue.toInteger())
        }
 
-       def setHeatingSetpoint(String heatingSetpoint) {
-               setHeatingSetpoint(heatingSetpoint.toInteger())
+       def setHeatingSetpoint(int newValue) {
+               action(this.currentHeatingSetpoint, newValue, "heatingSetpoint")
        }
 
-       def setSchedule() {
-               //Not implemented yet
+       def setHeatingSetpoint(String newValue) {
+               setHeatingSetpoint(newValue.toInteger())
        }
 
-       def setThermostatFanMode(String thermostatFanMode) {
-               if (this.thermostatFanMode != thermostatFanMode) {
-                       this.thermostatLatestFanMode = thermostatFanMode
-                       this.thermostatFanMode = thermostatFanMode
-                       println("Fan mode of the thermostat with id:$id is changed to $thermostatFanMode!")
-                       sendEvent([name: "thermostatFanMode", value: "$thermostatFanMode", deviceId: this.id, descriptionText: "",
-                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
-               }
+       def setThermostatFanMode(String newValue) {
+               action(this.currentThermostatFanMode, newValue, "thermostatFanMode")
        }
 
-       def setThermostatMode(String thermostatMode) {
-               if (this.thermostatMode != thermostatMode) {
-                       this.thermostatLatestMode =thermostatMode
-                       this.thermostatMode = thermostatMode
-                       this.currentThermostatMode = thermostatMode
-                       println("Mode of the thermostat with id:$id is changed to $thermostatMode!")
-                       sendEvent([name: "thermostatMode", value: "$thermostatMode", deviceId: this.id, descriptionText: "",
-                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
-               }
+       def setThermostatMode(String newValue) {
+               action(this.currentThermostatMode, newValue, "thermostatMode")
        }
 
        def cool() {
-               if (this.thermostatMode != "cool") {
-                       this.thermostatLatestMode = "cool"
-                       this.thermostatMode = "cool"
-                       this.currentThermostatMode = "cool"
-                       println("Mode of the thermostat with id:$id is changed to cool!")
-                       sendEvent([name: "thermostatMode", value: "cool", deviceId: this.id, descriptionText: "",
-                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
-               }
+               action(this.currentThermostatMode, "cool", "thermostatMode")
        }
 
        def heat() {
-               if (this.thermostatMode != "heat") {
-                       this.thermostatLatestMode = "heat"
-                       this.thermostatMode = "heat"
-                       this.currentThermostatMode = "heat"
-                       println("Mode of the thermostat with id:$id is changed to heat!")
-                       sendEvent([name: "thermostatMode", value: "heat", deviceId: this.id, descriptionText: "",
-                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
-               }
+               action(this.currentThermostatMode, "heat", "thermostatMode")
        }
 
        def auto() {
-               if (this.thermostatMode != "auto") {
-                       this.thermostatLatestMode = "auto"
-                       this.thermostatMode = "auto"
-                       this.currentThermostatMode = "auto"
-                       println("Mode of the thermostat with id:$id is changed to auto!")
-                       sendEvent([name: "thermostatMode", value: "auto", deviceId: this.id, descriptionText: "",
-                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
-               }
+               action(this.currentThermostatMode, "auto", "thermostatMode")
        }
        
        def emergencyHeat() {
-               if (this.thermostatMode != "emergencyHeat") {
-                       this.thermostatLatestMode = "emergencyHeat"
-                       this.thermostatMode = "emergencyHeat"
-                       this.currentThermostatMode = "emergencyHeat"
-                       println("Mode of the thermostat with id:$id is changed to emergencyHeat!")
-                       sendEvent([name: "thermostatMode", value: "emergencyHeat", deviceId: this.id, descriptionText: "",
-                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
-               }
+               action(this.currentThermostatMode, "emergencyHeat", "thermostatMode")
        }
 
        def off() {
-               if (this.thermostatMode != "off") {
-                       this.thermostatLatestMode = "off"
-                       this.thermostatMode = "off"
-                       this.currentThermostatMode = "off"
-                       println("Mode of the thermostat with id:$id is changed to off!")
-                       sendEvent([name: "thermostatMode", value: "off", deviceId: this.id, descriptionText: "",
-                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
-               }
+               action(this.currentThermostatMode, "off", "thermostatMode")
        }
 
-       def setClimate(String info, String givenClimateName) {
-               if (this.climateName != givenClimateName) {
-                       this.climateName = givenClimateName
-                       println("Climate name of the thermostat with id:$id is changed to $givenClimateName!")
-               }
+       def setClimate(String info, String newValue) {
+               action(currentClimateName, newValue, "climateName")
        }
 
        def setHold(String info1, int coolingSetpoint, int heatingSetpoint, String info2, String info3) {
-               if ((this.heatingSetpoint != heatingSetpoint) || (this.coolingSetpoint != coolingSetpoint)) {
-                       this.coolingSetpoint = coolingSetpoint
-                       this.currentCoolingSetpoint = currentCoolingSetpoint
-                       println("Cooling set point for the thermostat with id:$id is changed to $coolingSetpoint!")
-                       this.heatingSetpoint = heatingSetpoint
-                       this.currentHeatingSetpoint = currentHeatingSetpoint
-                       println("Heating set point for the thermostat with id:$id is changed to $heatingSetpoint!")
-                       sendEvent([name: "heatingSetpoint", value: "$heatingSetpoint", deviceId: this.id, descriptionText: "",
-                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
-                       sendEvent([name: "coolingSetpoint", value: "$coolingSetpoint", deviceId: this.id, descriptionText: "",
+               setHeatingSetpoint(heatingSetpoint)
+               setCoolingSetpoint(coolingSetpoint)
+       }
+
+       def action(StringBuilder variable, String newValue, String feature) {
+               if (!variable.toString().equals(newValue)) {
+                       String tmpID = id.toString()
+                       variable.replace(0, variable.length(), newValue)
+                       println("$feature of the thermostat with id:$tmpID is changed to $newValue!")
+                       sendEvent([name: feature, value: newValue, deviceId: tmpID, descriptionText: "",
                                   displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
                }
        }
 
-       //By Model Checker
-       def setValue(String value, String name) {
-               if ((name == "temperature") && (value.toInteger() != this.temperature)) {
-                       println("the temperature is $value!")
-                       this.temperature = value.toInteger()
-                       this.currentTemperature = value.toInteger()
-               } else if ((name == "heatingSetpoint") && (value.toInteger() != this.heatingSetpoint)) {
-                       println("the heating set point of the thermostat with id:$id is $value!")
-                       this.latestHeatingSetPoint = value.toInteger()
-                       this.heatingSetpoint = value.toInteger()
-               } else if ((name == "coolingSetpoint") && (value.toInteger() != this.coolingSetpoint)) {
-                       println("the cooling set point of the thermostat with id:$id is $value!")
-                       this.latestCoolingSetPoint = value.toInteger()
-                       this.coolingSetpoint = value.toInteger()
-               } else if ((name == "thermostatSetpoint") && (value.toInteger() != this.thermostatSetpoint)) {
-                       println("the set point of the thermostat with id:$id is $value!")
-                       this.latestThermostatSetPoint = value.toInteger()
-                       this.thermostatSetpoint = value.toInteger()
-               } else if ((name == "thermostatMode") && (value != this.thermostatMode)) {
-                       println("the mode of the thermostat with id:$id is $value!")
-                       this.thermostatLatestMode = value
-                       this.thermostatMode = value
-               } else if ((name == "thermostatFanMode") && (value != this.thermostatFanMode)) {
-                       println("the fan mode of the thermostat with id:$id is $value!")
-                       this.thermostatLatestFanMode = value
-                       this.thermostatFanMode = value
-               } else if ((name == "thermostatOperatingState") && (value != this.thermostatOperatingState)) {
-                       println("the operating state of the thermostat with id:$id is $value!")
-                       this.thermostatLatestOperatingState = value
-                       this.thermostatOperatingState = value
+       def action(MutableInteger variable, int newValue, String feature) {
+               if (!variable.getValue().equals(newValue)) {
+                       String tmpID = id.toString()
+                       variable.setValue(newValue)
+                       println("$feature for the thermostat with id:$tmpID is changed to $newValue!")
+                       sendEvent([name: feature, value: newValue, deviceId: tmpID, descriptionText: "",
+                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
                }
        }
 
-       def currentValue(String deviceFeature) {
-               if (deviceFeature == "thermostatMode")
-                       return thermostatMode
-               else if (deviceFeature == "thermostatOperatingState")
-                       return thermostatOperatingState
-               else if (deviceFeature == "thermostatFanMode")
-                       return thermostatFanMode
-               else if (deviceFeature == "heatingSetpoint")
-                       return heatingSetpoint
-               else if (deviceFeature == "coolingSetpoint")
-                       return coolingSetpoint
-               else if (deviceFeature == "thermostatSetpoint")
-                       return thermostatSetpoint
+       // Methods to return values
+       def getCurrentTemperature() {
+               return currentTemperature.getValue()
        }
 
-       def latestValue(String deviceFeature) {
-               if (deviceFeature == "thermostatMode")
-                       return thermostatLatestMode
-               else if (deviceFeature == "thermostatOperatingState")
-                       return thermostatLatestOperatingState
-               else if (deviceFeature == "thermostatFanMode")
-                       return thermostatLatestFanMode
-               else if (deviceFeature == "heatingSetpoint")
-                       return latestHeatingSetPoint
-               else if (deviceFeature == "coolingSetpoint")
-                       return latestCoolingSetPoint
-               else if (deviceFeature == "thermostatSetpoint")
-                       return latestThermostatSetPoint
+       def getCurrentCoolingSetpoint() {
+               return currentCoolingSetpoint.getValue()
+       }
+       
+       def getCurrentHeatingSetpoint() {
+               return currentHeatingSetpoint.getValue()
        }
 
+       def getCurrentThermostatSetPoint() {
+               return currentThermostatSetPoint.getValue()
+       }
+
+       def getCurrentThermostatOperatingState() {
+               return currentThermostatOperatingState.toString()
+       }
+
+       def getCurrentThermostatFanMode() {
+               return currentThermostatFanMode.toString()
+       }
+
+       def getCurrentThermostatMode() {
+               return currentThermostatMode.toString()
+       }
+
+       def getCurrentClimateName() {
+               return currentClimateName.toString()
+       }
 }