From bd61feb0385f9875c2892422bd0ee7cdc03cf53f Mon Sep 17 00:00:00 2001 From: Harrison Carter Date: Thu, 23 Jul 2026 09:24:01 -0500 Subject: [PATCH] Ignore unchanged handling, stop motion on inverted scroll --- .../matter-window-covering/src/init.lua | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/drivers/SmartThings/matter-window-covering/src/init.lua b/drivers/SmartThings/matter-window-covering/src/init.lua index 99ea5eb9b2..b5de8558fb 100644 --- a/drivers/SmartThings/matter-window-covering/src/init.lua +++ b/drivers/SmartThings/matter-window-covering/src/init.lua @@ -284,22 +284,35 @@ local function handle_shade_level(driver, device, cmd) end local function handle_step_shade_level(driver, device, cmd) - local step = cmd.args.stepSize - local latest_lift_percentage = device:get_latest_state( + local step = cmd.args.stepSize or 0 + local latest_lift = device:get_latest_state( "main", capabilities.windowShadeLevel.ID, capabilities.windowShadeLevel.shadeLevel.NAME, 0 ) - local target_lift_percent = device:get_field(TARGET_LIFT_PERCENT.STATE) or latest_lift_percentage - local updated_target_lift = utils.clamp_value(target_lift_percent + step, 0, 100) - cache_data_with_timeout(device, updated_target_lift, TARGET_LIFT_PERCENT) - driver:inject_capability_command(device, { - capability = capabilities.windowShadeLevel.ID, - component = cmd.component, - command = capabilities.windowShadeLevel.commands.setShadeLevel.NAME, - named_args = { shadeLevel = updated_target_lift } - }) + local target_lift = device:get_field(TARGET_LIFT_PERCENT.STATE) or latest_lift + local updated_target_lift = utils.clamp_value(target_lift + step, 0, 100) + if step == 0 or target_lift == updated_target_lift then + -- no change in targeting, exit handler + return + elseif (target_lift > latest_lift and step < 0) or (target_lift < latest_lift and step > 0) then + -- target direction altered, pause motion to reset cached state and targeting. + driver:inject_capability_command(device, { + capability = capabilities.windowShade.ID, + component = cmd.component, + command = capabilities.windowShade.commands.pause.NAME, + args = {} + }) + else + -- standard motion adjustment + driver:inject_capability_command(device, { + capability = capabilities.windowShadeLevel.ID, + component = cmd.component, + command = capabilities.windowShadeLevel.commands.setShadeLevel.NAME, + named_args = { shadeLevel = updated_target_lift } + }) + end end -- move to shade tilt level between 0-100