From 5d912f655d3c107f1aebb3ed8e70e9300285b250 Mon Sep 17 00:00:00 2001 From: mh-zwave Date: Wed, 14 Jan 2026 14:58:20 +0100 Subject: [PATCH 1/4] feat(tamper): add multi-device exclusion via id_match loop --- .../src/timed-tamper-clear/init.lua | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua b/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua index 2007bedb0d..a7307bba94 100644 --- a/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua +++ b/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua @@ -20,11 +20,25 @@ local capabilities = require "st.capabilities" local TAMPER_TIMER = "_tamper_timer" local TAMPER_CLEAR = 10 -local FIBARO_DOOR_WINDOW_MFR_ID = 0x010F -local function can_handle_tamper_event(opts, driver, device, cmd, ...) - if device.zwave_manufacturer_id ~= FIBARO_DOOR_WINDOW_MFR_ID and - opts.dispatcher_class == "ZwaveDispatcher" and +local devices = { + FIBARO_DOOR_WINDOW = { + mfrs = 0x010F + } +} + +local function can_handle_tamper_event(opts, driver, zw_device, cmd, ...) + for _, device in pairs(devices) do + if zw_device:id_match( + device.mfrs, + device.product_types, + device.product_ids + ) then + return false + end + end + + if opts.dispatcher_class == "ZwaveDispatcher" and cmd ~= nil and cmd.cmd_class ~= nil and cmd.cmd_class == cc.NOTIFICATION and @@ -32,10 +46,10 @@ local function can_handle_tamper_event(opts, driver, device, cmd, ...) cmd.args.notification_type == Notification.notification_type.HOME_SECURITY and (cmd.args.event == Notification.event.home_security.TAMPERING_PRODUCT_COVER_REMOVED or cmd.args.event == Notification.event.home_security.TAMPERING_PRODUCT_MOVED) then - local subdriver = require("timed-tamper-clear") - return true, subdriver - else return false - end + local subdriver = require("timed-tamper-clear") + return true, subdriver + end + return false end -- This behavior is from zwave-door-window-sensor.groovy. We've seen this behavior From fb02cf6ad3fd411f1f1a5460620490a1ce7134ee Mon Sep 17 00:00:00 2001 From: mh-zwave Date: Thu, 15 Jan 2026 09:18:18 +0100 Subject: [PATCH 2/4] fix(tamper-handler): correct exclusion logic and refactor for multi-vendor support --- .../src/timed-tamper-clear/init.lua | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua b/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua index a7307bba94..e58d08025e 100644 --- a/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua +++ b/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua @@ -21,35 +21,38 @@ local capabilities = require "st.capabilities" local TAMPER_TIMER = "_tamper_timer" local TAMPER_CLEAR = 10 -local devices = { +local excluded_devices = { FIBARO_DOOR_WINDOW = { mfrs = 0x010F } } local function can_handle_tamper_event(opts, driver, zw_device, cmd, ...) - for _, device in pairs(devices) do - if zw_device:id_match( - device.mfrs, - device.product_types, - device.product_ids - ) then - return false - end - end - - if opts.dispatcher_class == "ZwaveDispatcher" and + -- check only for relevant tamper event first + if not(opts.dispatcher_class == "ZwaveDispatcher" and cmd ~= nil and cmd.cmd_class ~= nil and cmd.cmd_class == cc.NOTIFICATION and cmd.cmd_id == Notification.REPORT and cmd.args.notification_type == Notification.notification_type.HOME_SECURITY and (cmd.args.event == Notification.event.home_security.TAMPERING_PRODUCT_COVER_REMOVED or - cmd.args.event == Notification.event.home_security.TAMPERING_PRODUCT_MOVED) then - local subdriver = require("timed-tamper-clear") - return true, subdriver + cmd.args.event == Notification.event.home_security.TAMPERING_PRODUCT_MOVED)) then + return false end - return false + + -- check exclusion list: if device matches any entry, skip auto-clear + for _, excluded_device in pairs(excluded_devices) do + if zw_device:id_match( + excluded_device.mfrs, + excluded_device.product_types, + excluded_device.product_ids + ) then + return false + end + end + + local subdriver = require("timed-tamper-clear") + return true, subdriver end -- This behavior is from zwave-door-window-sensor.groovy. We've seen this behavior From 04166e574d933edf18ccf1e7a74f150169887f7a Mon Sep 17 00:00:00 2001 From: mh-zwave Date: Thu, 15 Jan 2026 09:23:10 +0100 Subject: [PATCH 3/4] remove trailing whitespace --- .../zwave-sensor/src/timed-tamper-clear/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua b/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua index e58d08025e..37353991e1 100644 --- a/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua +++ b/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua @@ -29,7 +29,7 @@ local excluded_devices = { local function can_handle_tamper_event(opts, driver, zw_device, cmd, ...) -- check only for relevant tamper event first - if not(opts.dispatcher_class == "ZwaveDispatcher" and + if not(opts.dispatcher_class == "ZwaveDispatcher" and cmd ~= nil and cmd.cmd_class ~= nil and cmd.cmd_class == cc.NOTIFICATION and @@ -47,12 +47,12 @@ local function can_handle_tamper_event(opts, driver, zw_device, cmd, ...) excluded_device.product_types, excluded_device.product_ids ) then - return false + return false end end local subdriver = require("timed-tamper-clear") - return true, subdriver + return true, subdriver end -- This behavior is from zwave-door-window-sensor.groovy. We've seen this behavior From 5e7333ac3917ebfc4ceeb23aebed32be58874777 Mon Sep 17 00:00:00 2001 From: mh-zwave Date: Thu, 15 Jan 2026 09:24:57 +0100 Subject: [PATCH 4/4] Update init.lua --- .../SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua b/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua index 37353991e1..df92191ab3 100644 --- a/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua +++ b/drivers/SmartThings/zwave-sensor/src/timed-tamper-clear/init.lua @@ -27,7 +27,7 @@ local excluded_devices = { } } -local function can_handle_tamper_event(opts, driver, zw_device, cmd, ...) +local function can_handle_tamper_event(opts, driver, zw_device, cmd, ...) -- check only for relevant tamper event first if not(opts.dispatcher_class == "ZwaveDispatcher" and cmd ~= nil and