//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()
+ }
}