mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-03-08 05:31:56 +00:00
ICP-1148 Support Thermostat Dynamic data
Adding support for dynamic thermostat and fan modes to TCC DTH.
Also replaced capability "Polling" with "Refresh" and runEvery5Minutes("refresh") as polling capability is unreliable.
Also removed capability "Relative Humidity Measurement" as Honeywell Z-Wave Thermostat (YTH8320ZW1007/U) doesn't support humidity.
This commit is contained in:
@@ -15,10 +15,9 @@ metadata {
|
|||||||
definition (name: "Z-Wave Thermostat", namespace: "smartthings", author: "SmartThings") {
|
definition (name: "Z-Wave Thermostat", namespace: "smartthings", author: "SmartThings") {
|
||||||
capability "Actuator"
|
capability "Actuator"
|
||||||
capability "Temperature Measurement"
|
capability "Temperature Measurement"
|
||||||
capability "Relative Humidity Measurement"
|
|
||||||
capability "Thermostat"
|
capability "Thermostat"
|
||||||
capability "Configuration"
|
capability "Configuration"
|
||||||
capability "Polling"
|
capability "Refresh"
|
||||||
capability "Sensor"
|
capability "Sensor"
|
||||||
capability "Health Check"
|
capability "Health Check"
|
||||||
|
|
||||||
@@ -117,7 +116,7 @@ metadata {
|
|||||||
state "cool", label:'${currentValue}° cool', backgroundColor:"#ffffff"
|
state "cool", label:'${currentValue}° cool', backgroundColor:"#ffffff"
|
||||||
}
|
}
|
||||||
standardTile("refresh", "device.thermostatMode", inactiveLabel: false, decoration: "flat") {
|
standardTile("refresh", "device.thermostatMode", inactiveLabel: false, decoration: "flat") {
|
||||||
state "default", action:"polling.poll", icon:"st.secondary.refresh"
|
state "default", action:"refresh.refresh", icon:"st.secondary.refresh"
|
||||||
}
|
}
|
||||||
main "temperature"
|
main "temperature"
|
||||||
details(["temperature", "mode", "fanMode", "heatSliderControl", "heatingSetpoint", "coolSliderControl", "coolingSetpoint", "refresh"])
|
details(["temperature", "mode", "fanMode", "heatSliderControl", "heatingSetpoint", "coolSliderControl", "coolingSetpoint", "refresh"])
|
||||||
@@ -125,13 +124,20 @@ metadata {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def installed(){
|
def installed(){
|
||||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
sendHubCommand(new physicalgraph.device.HubAction(zwave.thermostatModeV2.thermostatModeSupportedGet().format()))
|
||||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
initialize()
|
||||||
}
|
}
|
||||||
|
|
||||||
def updated(){
|
def updated(){
|
||||||
|
initialize()
|
||||||
|
}
|
||||||
|
|
||||||
|
def initialize() {
|
||||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||||
|
unschedule()
|
||||||
|
runEvery5Minutes("refresh")
|
||||||
|
refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
def parse(String description)
|
def parse(String description)
|
||||||
@@ -149,6 +155,7 @@ def parse(String description)
|
|||||||
]
|
]
|
||||||
if (map.name == "thermostatMode") {
|
if (map.name == "thermostatMode") {
|
||||||
state.lastTriedMode = map.value
|
state.lastTriedMode = map.value
|
||||||
|
map.data = [supportedThermostatModes:state.supportedThermostatModes]
|
||||||
if (map.value == "cool") {
|
if (map.value == "cool") {
|
||||||
map2.value = device.latestValue("coolingSetpoint")
|
map2.value = device.latestValue("coolingSetpoint")
|
||||||
log.info "THERMOSTAT, latest cooling setpoint = ${map2.value}"
|
log.info "THERMOSTAT, latest cooling setpoint = ${map2.value}"
|
||||||
@@ -172,6 +179,7 @@ def parse(String description)
|
|||||||
}
|
}
|
||||||
} else if (map.name == "thermostatFanMode" && map.isStateChange) {
|
} else if (map.name == "thermostatFanMode" && map.isStateChange) {
|
||||||
state.lastTriedFanMode = map.value
|
state.lastTriedFanMode = map.value
|
||||||
|
map.data = [supportedThermostatFanModes: state.supportedThermostatFanModes]
|
||||||
}
|
}
|
||||||
log.debug "Parse returned $result"
|
log.debug "Parse returned $result"
|
||||||
result
|
result
|
||||||
@@ -305,26 +313,26 @@ def zwaveEvent(physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanMod
|
|||||||
}
|
}
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeSupportedReport cmd) {
|
def zwaveEvent(physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeSupportedReport cmd) {
|
||||||
def supportedModes = ""
|
def supportedModes = []
|
||||||
if(cmd.off) { supportedModes += "off " }
|
if(cmd.off) { supportedModes << "off" }
|
||||||
if(cmd.heat) { supportedModes += "heat " }
|
if(cmd.heat) { supportedModes << "heat" }
|
||||||
if(cmd.auxiliaryemergencyHeat) { supportedModes += "emergency heat " }
|
if(cmd.cool) { supportedModes << "cool" }
|
||||||
if(cmd.cool) { supportedModes += "cool " }
|
if(cmd.auto) { supportedModes << "auto" }
|
||||||
if(cmd.auto) { supportedModes += "auto " }
|
if(cmd.auxiliaryemergencyHeat) { supportedModes << "emergency heat" }
|
||||||
|
|
||||||
state.supportedModes = supportedModes
|
state.supportedThermostatModes = supportedModes
|
||||||
// No events to be generated, return empty map
|
sendEvent(name: "supportedThermostatModes", value: supportedModes, displayed: false)
|
||||||
return [:]
|
return [:]
|
||||||
}
|
}
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeSupportedReport cmd) {
|
def zwaveEvent(physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeSupportedReport cmd) {
|
||||||
def supportedFanModes = ""
|
def supportedFanModes = []
|
||||||
if(cmd.auto) { supportedFanModes += "auto " } // "fanAuto "
|
if(cmd.auto) { supportedFanModes << "auto" } // "fanAuto "
|
||||||
if(cmd.low) { supportedFanModes += "on " } // "fanOn"
|
if(cmd.circulation) { supportedFanModes << "circulate" } // "fanCirculate"
|
||||||
if(cmd.circulation) { supportedFanModes += "circulate " } // "fanCirculate"
|
if(cmd.low) { supportedFanModes << "on" } // "fanOn"
|
||||||
|
|
||||||
state.supportedFanModes = supportedFanModes
|
state.supportedThermostatFanModes = supportedFanModes
|
||||||
// No events to be generated, return empty map
|
sendEvent(name: "supportedThermostatFanModes", value: supportedFanModes, displayed: false)
|
||||||
return [:]
|
return [:]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,15 +345,17 @@ def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Command Implementations
|
// Command Implementations
|
||||||
def poll() {
|
def refresh() {
|
||||||
delayBetween([
|
def cmds = []
|
||||||
zwave.sensorMultilevelV3.sensorMultilevelGet().format(), // current temperature
|
cmds << new physicalgraph.device.HubAction(zwave.thermostatModeV2.thermostatModeSupportedGet().format())
|
||||||
zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format(),
|
cmds << new physicalgraph.device.HubAction(zwave.thermostatFanModeV3.thermostatFanModeSupportedGet().format())
|
||||||
zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format(),
|
cmds << new physicalgraph.device.HubAction(zwave.thermostatModeV2.thermostatModeGet().format())
|
||||||
zwave.thermostatModeV2.thermostatModeGet().format(),
|
cmds << new physicalgraph.device.HubAction(zwave.thermostatFanModeV3.thermostatFanModeGet().format())
|
||||||
zwave.thermostatFanModeV3.thermostatFanModeGet().format(),
|
cmds << new physicalgraph.device.HubAction(zwave.sensorMultilevelV2.sensorMultilevelGet().format()) // current temperature
|
||||||
zwave.thermostatOperatingStateV1.thermostatOperatingStateGet().format()
|
cmds << new physicalgraph.device.HubAction(zwave.thermostatOperatingStateV1.thermostatOperatingStateGet().format())
|
||||||
], 2300)
|
cmds << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format())
|
||||||
|
cmds << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format())
|
||||||
|
sendHubCommand(cmds)
|
||||||
}
|
}
|
||||||
|
|
||||||
def quickSetHeat(degrees) {
|
def quickSetHeat(degrees) {
|
||||||
@@ -416,28 +426,14 @@ def ping() {
|
|||||||
poll()
|
poll()
|
||||||
}
|
}
|
||||||
|
|
||||||
def configure() {
|
|
||||||
delayBetween([
|
|
||||||
zwave.thermostatModeV2.thermostatModeSupportedGet().format(),
|
|
||||||
zwave.thermostatFanModeV3.thermostatFanModeSupportedGet().format(),
|
|
||||||
zwave.associationV1.associationSet(groupingIdentifier:1, nodeId:[zwaveHubNodeId]).format(),
|
|
||||||
zwave.sensorMultilevelV3.sensorMultilevelGet().format(), // current temperature
|
|
||||||
zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format(),
|
|
||||||
zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format(),
|
|
||||||
zwave.thermostatModeV2.thermostatModeGet().format(),
|
|
||||||
zwave.thermostatFanModeV3.thermostatFanModeGet().format(),
|
|
||||||
zwave.thermostatOperatingStateV1.thermostatOperatingStateGet().format()
|
|
||||||
], 2300)
|
|
||||||
}
|
|
||||||
|
|
||||||
def modes() {
|
def modes() {
|
||||||
["off", "heat", "cool", "auto", "emergency heat"]
|
return state.supportedThermostatModes
|
||||||
}
|
}
|
||||||
|
|
||||||
def switchMode() {
|
def switchMode() {
|
||||||
def currentMode = device.currentState("thermostatMode")?.value
|
def currentMode = device.currentState("thermostatMode")?.value
|
||||||
def lastTriedMode = state.lastTriedMode ?: currentMode ?: "off"
|
def lastTriedMode = state.lastTriedMode ?: currentMode ?: ["off"]
|
||||||
def supportedModes = getDataByName("supportedModes")
|
def supportedModes = getDataByName("supportedThermostatModes")
|
||||||
def modeOrder = modes()
|
def modeOrder = modes()
|
||||||
def next = { modeOrder[modeOrder.indexOf(it) + 1] ?: modeOrder[0] }
|
def next = { modeOrder[modeOrder.indexOf(it) + 1] ?: modeOrder[0] }
|
||||||
def nextMode = next(lastTriedMode)
|
def nextMode = next(lastTriedMode)
|
||||||
@@ -454,7 +450,7 @@ def switchMode() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def switchToMode(nextMode) {
|
def switchToMode(nextMode) {
|
||||||
def supportedModes = getDataByName("supportedModes")
|
def supportedModes = getDataByName("supportedThermostatModes")
|
||||||
if(supportedModes && !supportedModes.contains(nextMode)) log.warn "thermostat mode '$nextMode' is not supported"
|
if(supportedModes && !supportedModes.contains(nextMode)) log.warn "thermostat mode '$nextMode' is not supported"
|
||||||
if (nextMode in modes()) {
|
if (nextMode in modes()) {
|
||||||
state.lastTriedMode = nextMode
|
state.lastTriedMode = nextMode
|
||||||
@@ -466,9 +462,9 @@ def switchToMode(nextMode) {
|
|||||||
|
|
||||||
def switchFanMode() {
|
def switchFanMode() {
|
||||||
def currentMode = device.currentState("thermostatFanMode")?.value
|
def currentMode = device.currentState("thermostatFanMode")?.value
|
||||||
def lastTriedMode = state.lastTriedFanMode ?: currentMode ?: "off"
|
def lastTriedMode = state.lastTriedFanMode ?: currentMode ?: ["off"]
|
||||||
def supportedModes = getDataByName("supportedFanModes") ?: "auto on" // "fanAuto fanOn"
|
def supportedModes = getDataByName("supportedThermostatFanModes") ?: ["auto", "on"]
|
||||||
def modeOrder = ["auto", "circulate", "on"] // "fanAuto", "fanCirculate", "fanOn"
|
def modeOrder = state.supportedThermostatFanModes
|
||||||
def next = { modeOrder[modeOrder.indexOf(it) + 1] ?: modeOrder[0] }
|
def next = { modeOrder[modeOrder.indexOf(it) + 1] ?: modeOrder[0] }
|
||||||
def nextMode = next(lastTriedMode)
|
def nextMode = next(lastTriedMode)
|
||||||
while (!supportedModes?.contains(nextMode) && nextMode != "auto") { // "fanAuto"
|
while (!supportedModes?.contains(nextMode) && nextMode != "auto") { // "fanAuto"
|
||||||
@@ -478,7 +474,7 @@ def switchFanMode() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def switchToFanMode(nextMode) {
|
def switchToFanMode(nextMode) {
|
||||||
def supportedFanModes = getDataByName("supportedFanModes")
|
def supportedFanModes = getDataByName("supportedThermostatFanModes")
|
||||||
if(supportedFanModes && !supportedFanModes.contains(nextMode)) log.warn "thermostat mode '$nextMode' is not supported"
|
if(supportedFanModes && !supportedFanModes.contains(nextMode)) log.warn "thermostat mode '$nextMode' is not supported"
|
||||||
|
|
||||||
def returnCommand
|
def returnCommand
|
||||||
|
|||||||
Reference in New Issue
Block a user