mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-03-08 05:31:56 +00:00
Merge pull request #2146 from marstorp/icp1148HoneywellZwave
ICP-1148 Support Thermostat Dynamic data
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