From a56425b3427139a917ebf94a04900ecb24376b4b Mon Sep 17 00:00:00 2001 From: Przemyslaw Kacprowicz Date: Wed, 20 Nov 2019 14:17:39 +0100 Subject: [PATCH 1/4] A first approach, to make device to go 'offline' properly --- .../zwave-radiator-thermostat.groovy | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy b/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy index 8f22e275b12..f09309d2b04 100644 --- a/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy +++ b/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy @@ -176,7 +176,9 @@ def zwaveEvent(physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeRepor def zwaveEvent(physicalgraph.zwave.commands.thermostatsetpointv2.ThermostatSetpointReport cmd) { def deviceTemperatureScale = cmd.scale ? 'F' : 'C' - createEvent(name: "heatingSetpoint", value: convertTemperatureIfNeeded(cmd.scaledValue, deviceTemperatureScale, cmd.precision), unit: temperatureScale) + def setpoint = Float.parseFloat(convertTemperatureIfNeeded(cmd.scaledValue, deviceTemperatureScale, cmd.precision)) + state.cachedSetpoint = setpoint + createEvent(name: "heatingSetpoint", value: setpoint, unit: temperatureScale) } def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv5.SensorMultilevelReport cmd) { @@ -227,7 +229,7 @@ def off() { } def setHeatingSetpoint(setpoint) { - if (isPoppRadiatorThermostat()) { + if (isPoppRadiatorThermostat() && device.status == "ONLINE") { sendEvent(name: "heatingSetpoint", value: setpoint, unit: temperatureScale) } setpoint = temperatureScale == 'C' ? setpoint : fahrenheitToCelsius(setpoint) From c6e6bcf45ba3bf5cd39c9ac743cecbebf4eddb74 Mon Sep 17 00:00:00 2001 From: Przemyslaw Kacprowicz Date: Tue, 26 Nov 2019 13:27:32 +0100 Subject: [PATCH 2/4] Changes to enable setpoint manual and wireless change in same setup --- .../zwave-radiator-thermostat.groovy | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy b/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy index f09309d2b04..357d4797d10 100644 --- a/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy +++ b/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy @@ -93,6 +93,7 @@ def initialize() { } def installed() { + state.isSetpointChangeRequestedByController = false initialize() } @@ -135,8 +136,8 @@ def zwaveEvent(physicalgraph.zwave.commands.securityv1.SecurityMessageEncapsulat def zwaveEvent(physicalgraph.zwave.commands.multicmdv1.MultiCmdEncap cmd) { cmd.encapsulatedCommands().collect { encapsulatedCommand -> - zwaveEvent(encapsulatedCommand) - }.flatten() + isPoppRadiatorThermostat() ? zwaveEvent(encapsulatedCommand, true) : zwaveEvent(encapsulatedCommand) //in case any future device would support MultiCmdEncap + }.flatten() //and won't need any special handler, like POPP does } def zwaveEvent(physicalgraph.zwave.commands.wakeupv2.WakeUpNotification cmd) { @@ -174,13 +175,30 @@ def zwaveEvent(physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeRepor createEvent(map) } -def zwaveEvent(physicalgraph.zwave.commands.thermostatsetpointv2.ThermostatSetpointReport cmd) { +def updateSetpoint(cmd) { def deviceTemperatureScale = cmd.scale ? 'F' : 'C' def setpoint = Float.parseFloat(convertTemperatureIfNeeded(cmd.scaledValue, deviceTemperatureScale, cmd.precision)) state.cachedSetpoint = setpoint createEvent(name: "heatingSetpoint", value: setpoint, unit: temperatureScale) } +def zwaveEvent(physicalgraph.zwave.commands.thermostatsetpointv2.ThermostatSetpointReport cmd) { + if (!state.isSetpointChangeRequestedByController) { + updateSetpoint(cmd) + } else { + [:] + } +} + +def zwaveEvent(physicalgraph.zwave.commands.thermostatsetpointv2.ThermostatSetpointReport cmd, isResponseOfWakeUp) { + if (state.isSetpointChangeRequestedByController) { + state.isSetpointChangeRequestedByController = false + updateSetpoint(cmd) + } else { + [:] + } +} + def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv5.SensorMultilevelReport cmd) { def deviceTemperatureScale = cmd.scale ? 'F' : 'C' createEvent(name: "temperature", value: convertTemperatureIfNeeded(cmd.scaledSensorValue, deviceTemperatureScale, cmd.precision), unit: temperatureScale) @@ -230,6 +248,7 @@ def off() { def setHeatingSetpoint(setpoint) { if (isPoppRadiatorThermostat() && device.status == "ONLINE") { + state.isSetpointChangeRequestedByController = true sendEvent(name: "heatingSetpoint", value: setpoint, unit: temperatureScale) } setpoint = temperatureScale == 'C' ? setpoint : fahrenheitToCelsius(setpoint) From dbc1a7f27824e88cb49a61e79efae0e92a5603cc Mon Sep 17 00:00:00 2001 From: Przemyslaw Kacprowicz Date: Tue, 26 Nov 2019 13:31:37 +0100 Subject: [PATCH 3/4] Comment position adjustment --- .../zwave-radiator-thermostat.groovy | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy b/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy index 357d4797d10..72ff94916ad 100644 --- a/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy +++ b/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy @@ -136,8 +136,10 @@ def zwaveEvent(physicalgraph.zwave.commands.securityv1.SecurityMessageEncapsulat def zwaveEvent(physicalgraph.zwave.commands.multicmdv1.MultiCmdEncap cmd) { cmd.encapsulatedCommands().collect { encapsulatedCommand -> - isPoppRadiatorThermostat() ? zwaveEvent(encapsulatedCommand, true) : zwaveEvent(encapsulatedCommand) //in case any future device would support MultiCmdEncap - }.flatten() //and won't need any special handler, like POPP does + isPoppRadiatorThermostat() ? zwaveEvent(encapsulatedCommand, true) : zwaveEvent(encapsulatedCommand) + //in case any future device would support MultiCmdEncap + //and won't need any special handler, like POPP does + }.flatten() } def zwaveEvent(physicalgraph.zwave.commands.wakeupv2.WakeUpNotification cmd) { From 178ce0cd02af6d40c212395a5d3c43041a60915b Mon Sep 17 00:00:00 2001 From: Przemyslaw Kacprowicz Date: Wed, 27 Nov 2019 09:25:51 +0100 Subject: [PATCH 4/4] Combining both ThermostatSetpointReport handlers --- .../zwave-radiator-thermostat.groovy | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy b/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy index 72ff94916ad..5b6c56db81f 100644 --- a/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy +++ b/devicetypes/smartthings/zwave-radiator-thermostat.src/zwave-radiator-thermostat.groovy @@ -184,16 +184,10 @@ def updateSetpoint(cmd) { createEvent(name: "heatingSetpoint", value: setpoint, unit: temperatureScale) } -def zwaveEvent(physicalgraph.zwave.commands.thermostatsetpointv2.ThermostatSetpointReport cmd) { +def zwaveEvent(physicalgraph.zwave.commands.thermostatsetpointv2.ThermostatSetpointReport cmd, isResponseOfWakeUp = false) { if (!state.isSetpointChangeRequestedByController) { updateSetpoint(cmd) - } else { - [:] - } -} - -def zwaveEvent(physicalgraph.zwave.commands.thermostatsetpointv2.ThermostatSetpointReport cmd, isResponseOfWakeUp) { - if (state.isSetpointChangeRequestedByController) { + } else if (isResponseOfWakeUp) { state.isSetpointChangeRequestedByController = false updateSetpoint(cmd) } else {