diff --git a/devicetypes/smartthings/springs-window-fashions-shade.src/springs-window-fashions-shade.groovy b/devicetypes/smartthings/springs-window-fashions-shade.src/springs-window-fashions-shade.groovy index f60918cd15f..7af556576ba 100644 --- a/devicetypes/smartthings/springs-window-fashions-shade.src/springs-window-fashions-shade.groovy +++ b/devicetypes/smartthings/springs-window-fashions-shade.src/springs-window-fashions-shade.groovy @@ -164,6 +164,7 @@ private handleLevelReport(physicalgraph.zwave.Command cmd) { shadeValue = "partially open" descriptionText = "${device.displayName} shade is ${level}% open" } + checkLevelReport(level) def levelEvent = createEvent(name: "level", value: level, unit: "%", displayed: false) def stateEvent = createEvent(name: "windowShade", value: shadeValue, descriptionText: descriptionText, isStateChange: levelEvent.isStateChange) @@ -181,15 +182,6 @@ def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv3.SwitchMultilevelS response(zwave.switchMultilevelV1.switchMultilevelGet().format()) ] } -def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) { - def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId) - updateDataValue("MSR", msr) - if (cmd.manufacturerName) { - updateDataValue("manufacturer", cmd.manufacturerName) - } - createEvent([descriptionText: "$device.displayName MSR: $msr", isStateChange: false]) -} - def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) { def map = [ name: "battery", unit: "%" ] if (cmd.batteryLevel == 0xFF || cmd.batteryLevel == 0) { @@ -222,6 +214,7 @@ def zwaveEvent(physicalgraph.zwave.Command cmd) { def open() { log.debug "open()" def level = switchDirection ? 0 : 99 + levelChangeFollowUp(level) zwave.basicV1.basicSet(value: level).format() // zwave.basicV1.basicSet(value: 0xFF).format() } @@ -229,6 +222,7 @@ def open() { def close() { log.debug "close()" def level = switchDirection ? 99 : 0 + levelChangeFollowUp(level) zwave.basicV1.basicSet(value: level).format() //zwave.basicV1.basicSet(value: 0).format() } @@ -239,6 +233,7 @@ def setLevel(value, duration = null) { level = switchDirection ? 99-level : level if (level < 0) level = 0 if (level > 99) level = 99 + levelChangeFollowUp(level) zwave.basicV1.basicSet(value: level).format() } @@ -266,4 +261,29 @@ def refresh() { zwave.switchMultilevelV1.switchMultilevelGet().format(), zwave.batteryV1.batteryGet().format() ], 1500) +} + +def levelChangeFollowUp(expectedLevel) { + state.expectedValue = expectedLevel + state.levelChecks = 0 + runIn(5, "checkLevel", [overwrite: true]) +} + +def checkLevelReport(value) { + if (state.expectedValue != null) { + if ((state.expectedValue == 99 && value >= 99) || + (value >= state.expectedValue - 2 && value <= state.expectedValue + 2)) { + unschedule("checkLevel") + } + } +} + +def checkLevel() { + if (state.levelChecks != null && state.levelChecks < 5) { + state.levelChecks = state.levelChecks + 1 + runIn(5, "checkLevel", [overwrite: true]) + sendHubCommand(zwave.switchMultilevelV1.switchMultilevelGet()) + } else { + unschedule("checkLevel") + } } \ No newline at end of file diff --git a/devicetypes/smartthings/zwave-window-shade.src/zwave-window-shade.groovy b/devicetypes/smartthings/zwave-window-shade.src/zwave-window-shade.groovy index 044695d0492..c43694d37e9 100644 --- a/devicetypes/smartthings/zwave-window-shade.src/zwave-window-shade.groovy +++ b/devicetypes/smartthings/zwave-window-shade.src/zwave-window-shade.groovy @@ -149,6 +149,7 @@ private handleLevelReport(physicalgraph.zwave.Command cmd) { shadeValue = "partially open" descriptionText = "${device.displayName} shade is ${level}% open" } + checkLevelReport(level) def levelEvent = createEvent(name: "level", value: level, unit: "%", displayed: false) def stateEvent = createEvent(name: "windowShade", value: shadeValue, descriptionText: descriptionText, isStateChange: levelEvent.isStateChange) @@ -166,15 +167,6 @@ def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv3.SwitchMultilevelS response(zwave.switchMultilevelV1.switchMultilevelGet().format()) ] } -def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) { - def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId) - updateDataValue("MSR", msr) - if (cmd.manufacturerName) { - updateDataValue("manufacturer", cmd.manufacturerName) - } - createEvent([descriptionText: "$device.displayName MSR: $msr", isStateChange: false]) -} - def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) { def map = [ name: "battery", unit: "%" ] if (cmd.batteryLevel == 0xFF) { @@ -194,6 +186,7 @@ def zwaveEvent(physicalgraph.zwave.Command cmd) { } def open() { + levelChangeFollowUp(99) log.debug "open()" /*delayBetween([ zwave.basicV1.basicSet(value: 0xFF).format(), @@ -203,6 +196,7 @@ def open() { } def close() { + levelChangeFollowUp(0) log.debug "close()" /*delayBetween([ zwave.basicV1.basicSet(value: 0x00).format(), @@ -216,10 +210,8 @@ def setLevel(value, duration = null) { Integer level = value as Integer if (level < 0) level = 0 if (level > 99) level = 99 - delayBetween([ - zwave.basicV1.basicSet(value: level).format(), - zwave.switchMultilevelV1.switchMultilevelGet().format() - ]) + levelChangeFollowUp(level) + zwave.basicV1.basicSet(value: level).format() } def presetPosition() { @@ -247,3 +239,28 @@ def refresh() { zwave.batteryV1.batteryGet().format() ], 1500) } + +def levelChangeFollowUp(expectedLevel) { + state.expectedValue = expectedLevel + state.levelChecks = 0 + runIn(5, "checkLevel", [overwrite: true]) +} + +def checkLevelReport(value) { + if (state.expectedValue != null) { + if ((state.expectedValue == 99 && value >= 99) || + (value >= state.expectedValue - 2 && value <= state.expectedValue + 2)) { + unschedule("checkLevel") + } + } +} + +def checkLevel() { + if (state.levelChecks != null && state.levelChecks < 5) { + state.levelChecks = state.levelChecks + 1 + runIn(5, "checkLevel", [overwrite: true]) + sendHubCommand(zwave.switchMultilevelV1.switchMultilevelGet()) + } else { + unschedule("checkLevel") + } +}