From 08e8d7342bad56d1f91f5eaba06c85146a33d41e Mon Sep 17 00:00:00 2001 From: JerryYang01 <40193349+JerryYang01@users.noreply.github.com> Date: Fri, 6 Feb 2026 14:04:35 +0800 Subject: [PATCH 1/5] Add files via upload A profile of PAD19 (dimmer switch). --- .../zwave-switch/profiles/pad19-dimmer-switch.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 drivers/SmartThings/zwave-switch/profiles/pad19-dimmer-switch.yml diff --git a/drivers/SmartThings/zwave-switch/profiles/pad19-dimmer-switch.yml b/drivers/SmartThings/zwave-switch/profiles/pad19-dimmer-switch.yml new file mode 100644 index 0000000000..cc71fe2423 --- /dev/null +++ b/drivers/SmartThings/zwave-switch/profiles/pad19-dimmer-switch.yml @@ -0,0 +1,12 @@ +name: pad19-dimmer-switch +components: +- id: main + capabilities: + - id: switch + version: 1 + - id: switchLevel + version: 1 + - id: refresh + version: 1 + categories: + - name: Switch From bd176cea8000faed03196da540b257aa42630904 Mon Sep 17 00:00:00 2001 From: JerryYang01 <40193349+JerryYang01@users.noreply.github.com> Date: Fri, 6 Feb 2026 14:35:59 +0800 Subject: [PATCH 2/5] Add files via upload The edge driver of PAD19 for WWST certification. --- .../zwave-switch/pad19-dimmer/config.yaml | 7 + .../pad19-dimmer/fingerprints.yml | 7 + .../zwave-switch/pad19-dimmer/init.lua | 138 ++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 drivers/SmartThings/zwave-switch/pad19-dimmer/config.yaml create mode 100644 drivers/SmartThings/zwave-switch/pad19-dimmer/fingerprints.yml create mode 100644 drivers/SmartThings/zwave-switch/pad19-dimmer/init.lua diff --git a/drivers/SmartThings/zwave-switch/pad19-dimmer/config.yaml b/drivers/SmartThings/zwave-switch/pad19-dimmer/config.yaml new file mode 100644 index 0000000000..22851b8032 --- /dev/null +++ b/drivers/SmartThings/zwave-switch/pad19-dimmer/config.yaml @@ -0,0 +1,7 @@ +name: 'Philio Zwave PAD19' +packageKey: 'Philio-Zwave-PAD19' +author: "Philio" +permissions: + zwave: {} +description: "Philio Z-Wave dimmer switch driver" +vendorSupportInformation: "https://www.zwavetaiwan.com.tw/" \ No newline at end of file diff --git a/drivers/SmartThings/zwave-switch/pad19-dimmer/fingerprints.yml b/drivers/SmartThings/zwave-switch/pad19-dimmer/fingerprints.yml new file mode 100644 index 0000000000..3691632597 --- /dev/null +++ b/drivers/SmartThings/zwave-switch/pad19-dimmer/fingerprints.yml @@ -0,0 +1,7 @@ +zwaveManufacturer: + - id: "Philio/PAD19" + manufacturerId: 0x013C + productType: 0x0005 + productId: 0x008A + deviceLabel: PAD19 + deviceProfileName: pad19-dimmer-switch \ No newline at end of file diff --git a/drivers/SmartThings/zwave-switch/pad19-dimmer/init.lua b/drivers/SmartThings/zwave-switch/pad19-dimmer/init.lua new file mode 100644 index 0000000000..4c1b91036e --- /dev/null +++ b/drivers/SmartThings/zwave-switch/pad19-dimmer/init.lua @@ -0,0 +1,138 @@ +local capabilities = require "st.capabilities" +--- @type st.zwave.Driver +local ZwaveDriver = require "st.zwave.driver" +--- @type st.zwave.CommandClass +local cc = require "st.zwave.CommandClass" +--- @type st.utils +local utils = require "st.utils" +--- @type st.zwave.constants +local constants = require "st.zwave.constants" +--- @type st.zwave.CommandClass.Basic +local Basic = (require "st.zwave.CommandClass.Basic")({ version = 1 }) +--- @type st.zwave.CommandClass.SwitchMultilevel +local SwitchMultilevel = (require "st.zwave.CommandClass.SwitchMultilevel")({ version = 4 }) + + +print("DEBUG: PAD19/init.lua loaded") + +local function dimmer_event(driver, device, cmd) + local value = cmd.args.value or cmd.args.target_value or 0 + local level = utils.clamp_value(value, 0, 100) + + device:emit_event(level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) + device:emit_event(capabilities.switchLevel.level(level)) +end + +local function basic_report_handler(driver, device, cmd) + local basic_level = cmd.args.value or 0 + local level = utils.clamp_value(basic_level, 0, 100) + + device:emit_event(basic_level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) + device:emit_event(capabilities.switchLevel.level(level)) +end + +local function switch_on_handler(driver, device) + device:send(Basic:Set({value = 0xff})) + device.thread:call_with_delay(4, function(d) + device:send(SwitchMultilevel:Get({})) + end) +end + +local function switch_off_handler(driver, device) + device:send(Basic:Set({value = 0x00})) + device.thread:call_with_delay(4, function(d) + device:send(SwitchMultilevel:Get({})) + end) +end + +local function switch_level_set(driver, device, cmd) + local level = utils.round(cmd.args.level) + level = utils.clamp_value(level, 0, 99) + + device:emit_event(level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) + device:emit_event(capabilities.switchLevel.level(level)) + + ------------------------------------------------------------------ + -- 修正:SmartThings 可能送出 rate="default",不是數字 → 會造成崩潰 + ------------------------------------------------------------------ + local raw_rate = cmd.args.rate + local dimmingDuration = tonumber(raw_rate) -- dimming duration in seconds + if dimmingDuration == nil then + dimmingDuration = 0 -- Z-Wave duration=0 = 快速/立即 + end + + device:send(SwitchMultilevel:Set({ value=level, duration=dimmingDuration })) + local function query_level() + device:send(SwitchMultilevel:Get({})) + end + -- delay shall be at least 5 sec. + local delay = math.max(dimmingDuration + constants.DEFAULT_POST_DIMMING_DELAY , constants.MIN_DIMMING_GET_STATUS_DELAY) --delay in seconds + device.thread:call_with_delay(delay, query_level) +end + +---- Refresh 指令函式(SmartThings Test Suite 必要) +local function refresh_cmd(driver, device, command) + print("DEBUG: PAD19 refresh_cmd called") + + -- 取得目前開關狀態 + local switch_get = Basic:Get({}) + device:send(switch_get) + + -- 取得目前dimmer的level + local switchlevel_get = SwitchMultilevel:Get({}) + device:send(switchlevel_get) +end + +------------------------------------------------------------------- +-- Lifecycle +------------------------------------------------------------------- +local function device_init(driver, device) + print("DEBUG: PAD19 device_init called") +end + +local function device_added(driver, device) + print("DEBUG: PAD19 device_added - init state off") + device:emit_event(capabilities.switch.switch.off()) + device:emit_event(capabilities.switchLevel.level(0)) + print("DEBUG: PAD19 Initial switchlevel = 0") +end + +-- NEW: 修正 driverSwitched 崩潰 +local function device_driver_switched(driver, device, event, args) + print("DEBUG: PAD19 driverSwitched - ignored") +end + +local pad19_driver_template = { + NAME = "Philio PAD19 Dimmer Switch", + zwave_handlers = { + [cc.BASIC] = { + [Basic.SET] = dimmer_event, + [Basic.REPORT] = basic_report_handler + }, + [cc.SWITCH_MULTILEVEL] = { + [SwitchMultilevel.SET] = dimmer_event, + [SwitchMultilevel.REPORT] = dimmer_event + } + }, + capability_handlers = { + [capabilities.switch.ID] = { + [capabilities.switch.commands.on.NAME] = switch_on_handler, + [capabilities.switch.commands.off.NAME] = switch_off_handler + }, + [capabilities.switchLevel.ID] = { + [capabilities.switchLevel.commands.setLevel.NAME] = switch_level_set + }, + [capabilities.refresh.ID] = { + [capabilities.refresh.commands.refresh.NAME] = refresh_cmd + } + }, + + lifecycle_handlers = { + init = device_init, + added = device_added, + driverSwitched = device_driver_switched + } +} + +local dimmer_switch = ZwaveDriver("Philio-Zwave-PAD19", pad19_driver_template) +dimmer_switch:run() From b3390ef566464d364e614ffb8842dda8e941a767 Mon Sep 17 00:00:00 2001 From: JerryYang01 <40193349+JerryYang01@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:03:14 +0800 Subject: [PATCH 3/5] add Philio PAD19 into zwave-switch --- .../SmartThings/zwave-switch/fingerprints.yml | 6 + .../zwave-switch/pad19-dimmer/config.yaml | 7 - .../pad19-dimmer/fingerprints.yml | 7 - ...er-switch.yml => philio-dimmer-switch.yml} | 24 +- drivers/SmartThings/zwave-switch/src/init.lua | 25 +- .../src/philio-dimmer-switch/can_handle.lua | 20 ++ .../philio-dimmer-switch}/init.lua | 283 +++++++++--------- .../zwave-switch/src/preferences.lua | 15 + .../zwave-switch/src/sub_drivers.lua | 29 ++ 9 files changed, 228 insertions(+), 188 deletions(-) delete mode 100644 drivers/SmartThings/zwave-switch/pad19-dimmer/config.yaml delete mode 100644 drivers/SmartThings/zwave-switch/pad19-dimmer/fingerprints.yml rename drivers/SmartThings/zwave-switch/profiles/{pad19-dimmer-switch.yml => philio-dimmer-switch.yml} (82%) create mode 100644 drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/can_handle.lua rename drivers/SmartThings/zwave-switch/{pad19-dimmer => src/philio-dimmer-switch}/init.lua (92%) create mode 100644 drivers/SmartThings/zwave-switch/src/sub_drivers.lua diff --git a/drivers/SmartThings/zwave-switch/fingerprints.yml b/drivers/SmartThings/zwave-switch/fingerprints.yml index d90a0c6b76..8320d8901f 100644 --- a/drivers/SmartThings/zwave-switch/fingerprints.yml +++ b/drivers/SmartThings/zwave-switch/fingerprints.yml @@ -916,6 +916,12 @@ zwaveManufacturer: manufacturerId: 0x010F productType: 0x0102 deviceProfileName: fibaro-dimmer-2 + - id: Philio/PAD19 + deviceLabel: PAD19 + manufacturerId: 0x013C + productType: 0x0005 + productId: 0x008A + deviceProfileName: philio-dimmer-switch #Shelly/Qubino - id: 1120/2/137 deviceLabel: Wave Plug UK diff --git a/drivers/SmartThings/zwave-switch/pad19-dimmer/config.yaml b/drivers/SmartThings/zwave-switch/pad19-dimmer/config.yaml deleted file mode 100644 index 22851b8032..0000000000 --- a/drivers/SmartThings/zwave-switch/pad19-dimmer/config.yaml +++ /dev/null @@ -1,7 +0,0 @@ -name: 'Philio Zwave PAD19' -packageKey: 'Philio-Zwave-PAD19' -author: "Philio" -permissions: - zwave: {} -description: "Philio Z-Wave dimmer switch driver" -vendorSupportInformation: "https://www.zwavetaiwan.com.tw/" \ No newline at end of file diff --git a/drivers/SmartThings/zwave-switch/pad19-dimmer/fingerprints.yml b/drivers/SmartThings/zwave-switch/pad19-dimmer/fingerprints.yml deleted file mode 100644 index 3691632597..0000000000 --- a/drivers/SmartThings/zwave-switch/pad19-dimmer/fingerprints.yml +++ /dev/null @@ -1,7 +0,0 @@ -zwaveManufacturer: - - id: "Philio/PAD19" - manufacturerId: 0x013C - productType: 0x0005 - productId: 0x008A - deviceLabel: PAD19 - deviceProfileName: pad19-dimmer-switch \ No newline at end of file diff --git a/drivers/SmartThings/zwave-switch/profiles/pad19-dimmer-switch.yml b/drivers/SmartThings/zwave-switch/profiles/philio-dimmer-switch.yml similarity index 82% rename from drivers/SmartThings/zwave-switch/profiles/pad19-dimmer-switch.yml rename to drivers/SmartThings/zwave-switch/profiles/philio-dimmer-switch.yml index cc71fe2423..74f19525bf 100644 --- a/drivers/SmartThings/zwave-switch/profiles/pad19-dimmer-switch.yml +++ b/drivers/SmartThings/zwave-switch/profiles/philio-dimmer-switch.yml @@ -1,12 +1,12 @@ -name: pad19-dimmer-switch -components: -- id: main - capabilities: - - id: switch - version: 1 - - id: switchLevel - version: 1 - - id: refresh - version: 1 - categories: - - name: Switch +name: philio-dimmer-switch +components: +- id: main + capabilities: + - id: switch + version: 1 + - id: switchLevel + version: 1 + - id: refresh + version: 1 + categories: + - name: Switch diff --git a/drivers/SmartThings/zwave-switch/src/init.lua b/drivers/SmartThings/zwave-switch/src/init.lua index 405600e962..26cca570a7 100644 --- a/drivers/SmartThings/zwave-switch/src/init.lua +++ b/drivers/SmartThings/zwave-switch/src/init.lua @@ -17,8 +17,6 @@ local SwitchMultilevel = (require "st.zwave.CommandClass.SwitchMultilevel")({ ve local preferencesMap = require "preferences" local configurationsMap = require "configurations" -local lazy_load_if_possible = require "lazy_load_subdriver" - --- Map component to end_points(channels) --- --- @param device st.zwave.Device @@ -120,28 +118,7 @@ local driver_template = { [SwitchMultilevel.STOP_LEVEL_CHANGE] = switch_multilevel_stop_level_change_handler } }, - sub_drivers = { - lazy_load_if_possible("eaton-accessory-dimmer"), - lazy_load_if_possible("inovelli"), - lazy_load_if_possible("dawon-smart-plug"), - lazy_load_if_possible("inovelli-2-channel-smart-plug"), - lazy_load_if_possible("zwave-dual-switch"), - lazy_load_if_possible("eaton-anyplace-switch"), - lazy_load_if_possible("fibaro-wall-plug-us"), - lazy_load_if_possible("dawon-wall-smart-switch"), - lazy_load_if_possible("zooz-power-strip"), - lazy_load_if_possible("aeon-smart-strip"), - lazy_load_if_possible("qubino-switches"), - lazy_load_if_possible("fibaro-double-switch"), - lazy_load_if_possible("fibaro-single-switch"), - lazy_load_if_possible("eaton-5-scene-keypad"), - lazy_load_if_possible("ecolink-switch"), - lazy_load_if_possible("multi-metering-switch"), - lazy_load_if_possible("zooz-zen-30-dimmer-relay"), - lazy_load_if_possible("multichannel-device"), - lazy_load_if_possible("aeotec-smart-switch"), - lazy_load_if_possible("aeotec-heavy-duty") - }, + sub_drivers = require("sub_drivers"), lifecycle_handlers = { init = device_init, infoChanged = info_changed, diff --git a/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/can_handle.lua b/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/can_handle.lua new file mode 100644 index 0000000000..0fd1886f52 --- /dev/null +++ b/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/can_handle.lua @@ -0,0 +1,20 @@ +-- can_handle.lua +-- 判斷是否為 Philio PAD19 裝置 + +local subdriver = require("philio-dimmer-switch") + +local function can_handle_pad19(opts, driver, device, ...) + local fingerprint_list = { + {mfr = 0x013C, prod_type = 0x0005, prod_id = 0x008A}, -- Philio PAD19 + } + + for _, fingerprint in ipairs(fingerprint_list) do + if device:id_match(fingerprint.mfr, fingerprint.prod_type, fingerprint.prod_id) then + return true, subdriver + end + end + + return false +end + +return can_handle_pad19 diff --git a/drivers/SmartThings/zwave-switch/pad19-dimmer/init.lua b/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/init.lua similarity index 92% rename from drivers/SmartThings/zwave-switch/pad19-dimmer/init.lua rename to drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/init.lua index 4c1b91036e..01afe802ad 100644 --- a/drivers/SmartThings/zwave-switch/pad19-dimmer/init.lua +++ b/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/init.lua @@ -1,138 +1,145 @@ -local capabilities = require "st.capabilities" ---- @type st.zwave.Driver -local ZwaveDriver = require "st.zwave.driver" ---- @type st.zwave.CommandClass -local cc = require "st.zwave.CommandClass" ---- @type st.utils -local utils = require "st.utils" ---- @type st.zwave.constants -local constants = require "st.zwave.constants" ---- @type st.zwave.CommandClass.Basic -local Basic = (require "st.zwave.CommandClass.Basic")({ version = 1 }) ---- @type st.zwave.CommandClass.SwitchMultilevel -local SwitchMultilevel = (require "st.zwave.CommandClass.SwitchMultilevel")({ version = 4 }) - - -print("DEBUG: PAD19/init.lua loaded") - -local function dimmer_event(driver, device, cmd) - local value = cmd.args.value or cmd.args.target_value or 0 - local level = utils.clamp_value(value, 0, 100) - - device:emit_event(level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) - device:emit_event(capabilities.switchLevel.level(level)) -end - -local function basic_report_handler(driver, device, cmd) - local basic_level = cmd.args.value or 0 - local level = utils.clamp_value(basic_level, 0, 100) - - device:emit_event(basic_level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) - device:emit_event(capabilities.switchLevel.level(level)) -end - -local function switch_on_handler(driver, device) - device:send(Basic:Set({value = 0xff})) - device.thread:call_with_delay(4, function(d) - device:send(SwitchMultilevel:Get({})) - end) -end - -local function switch_off_handler(driver, device) - device:send(Basic:Set({value = 0x00})) - device.thread:call_with_delay(4, function(d) - device:send(SwitchMultilevel:Get({})) - end) -end - -local function switch_level_set(driver, device, cmd) - local level = utils.round(cmd.args.level) - level = utils.clamp_value(level, 0, 99) - - device:emit_event(level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) - device:emit_event(capabilities.switchLevel.level(level)) - - ------------------------------------------------------------------ - -- 修正:SmartThings 可能送出 rate="default",不是數字 → 會造成崩潰 - ------------------------------------------------------------------ - local raw_rate = cmd.args.rate - local dimmingDuration = tonumber(raw_rate) -- dimming duration in seconds - if dimmingDuration == nil then - dimmingDuration = 0 -- Z-Wave duration=0 = 快速/立即 - end - - device:send(SwitchMultilevel:Set({ value=level, duration=dimmingDuration })) - local function query_level() - device:send(SwitchMultilevel:Get({})) - end - -- delay shall be at least 5 sec. - local delay = math.max(dimmingDuration + constants.DEFAULT_POST_DIMMING_DELAY , constants.MIN_DIMMING_GET_STATUS_DELAY) --delay in seconds - device.thread:call_with_delay(delay, query_level) -end - ----- Refresh 指令函式(SmartThings Test Suite 必要) -local function refresh_cmd(driver, device, command) - print("DEBUG: PAD19 refresh_cmd called") - - -- 取得目前開關狀態 - local switch_get = Basic:Get({}) - device:send(switch_get) - - -- 取得目前dimmer的level - local switchlevel_get = SwitchMultilevel:Get({}) - device:send(switchlevel_get) -end - -------------------------------------------------------------------- --- Lifecycle -------------------------------------------------------------------- -local function device_init(driver, device) - print("DEBUG: PAD19 device_init called") -end - -local function device_added(driver, device) - print("DEBUG: PAD19 device_added - init state off") - device:emit_event(capabilities.switch.switch.off()) - device:emit_event(capabilities.switchLevel.level(0)) - print("DEBUG: PAD19 Initial switchlevel = 0") -end - --- NEW: 修正 driverSwitched 崩潰 -local function device_driver_switched(driver, device, event, args) - print("DEBUG: PAD19 driverSwitched - ignored") -end - -local pad19_driver_template = { - NAME = "Philio PAD19 Dimmer Switch", - zwave_handlers = { - [cc.BASIC] = { - [Basic.SET] = dimmer_event, - [Basic.REPORT] = basic_report_handler - }, - [cc.SWITCH_MULTILEVEL] = { - [SwitchMultilevel.SET] = dimmer_event, - [SwitchMultilevel.REPORT] = dimmer_event - } - }, - capability_handlers = { - [capabilities.switch.ID] = { - [capabilities.switch.commands.on.NAME] = switch_on_handler, - [capabilities.switch.commands.off.NAME] = switch_off_handler - }, - [capabilities.switchLevel.ID] = { - [capabilities.switchLevel.commands.setLevel.NAME] = switch_level_set - }, - [capabilities.refresh.ID] = { - [capabilities.refresh.commands.refresh.NAME] = refresh_cmd - } - }, - - lifecycle_handlers = { - init = device_init, - added = device_added, - driverSwitched = device_driver_switched - } -} - -local dimmer_switch = ZwaveDriver("Philio-Zwave-PAD19", pad19_driver_template) -dimmer_switch:run() +local capabilities = require "st.capabilities" +--- @type st.zwave.Driver +local ZwaveDriver = require "st.zwave.driver" +--- @type st.zwave.CommandClass +local cc = require "st.zwave.CommandClass" +--- @type st.utils +local utils = require "st.utils" +--- @type st.zwave.constants +local constants = require "st.zwave.constants" +--- @type st.zwave.CommandClass.Basic +local Basic = (require "st.zwave.CommandClass.Basic")({ version = 1 }) +--- @type st.zwave.CommandClass.SwitchMultilevel +local SwitchMultilevel = (require "st.zwave.CommandClass.SwitchMultilevel")({ version = 4 }) + + +print("DEBUG: philio-dimmer-switch/init.lua loaded") + +local function dimmer_event(driver, device, cmd) + local value = cmd.args.value or cmd.args.target_value or 0 + local level = utils.clamp_value(value, 0, 100) + + device:emit_event(level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) + device:emit_event(capabilities.switchLevel.level(level)) +end + +local function basic_report_handler(driver, device, cmd) + local basic_level = cmd.args.value or 0 + local level = utils.clamp_value(basic_level, 0, 100) + + device:emit_event(basic_level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) + device:emit_event(capabilities.switchLevel.level(level)) +end + +local function switch_on_handler(driver, device) + device:send(Basic:Set({value = 0xff})) + device.thread:call_with_delay(4, function(d) + device:send(SwitchMultilevel:Get({})) + end) +end + +local function switch_off_handler(driver, device) + device:send(Basic:Set({value = 0x00})) + device.thread:call_with_delay(4, function(d) + device:send(SwitchMultilevel:Get({})) + end) +end + +local function switch_level_set(driver, device, cmd) + local level = utils.round(cmd.args.level) + level = utils.clamp_value(level, 0, 99) + + device:emit_event(level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) + device:emit_event(capabilities.switchLevel.level(level)) + + ------------------------------------------------------------------ + -- 修正:SmartThings 可能送出 rate="default",不是數字 → 會造成崩潰 + ------------------------------------------------------------------ + local raw_rate = cmd.args.rate + local dimmingDuration = tonumber(raw_rate) -- dimming duration in seconds + if dimmingDuration == nil then + dimmingDuration = 0 -- Z-Wave duration=0 = 快速/立即 + end + + device:send(SwitchMultilevel:Set({ value=level, duration=dimmingDuration })) + local function query_level() + device:send(SwitchMultilevel:Get({})) + end + -- delay shall be at least 5 sec. + local delay = math.max(dimmingDuration + constants.DEFAULT_POST_DIMMING_DELAY , constants.MIN_DIMMING_GET_STATUS_DELAY) --delay in seconds + device.thread:call_with_delay(delay, query_level) +end + +---- Refresh 指令函式(SmartThings Test Suite 必要) +local function refresh_cmd(driver, device, command) + print("DEBUG: PAD19 refresh_cmd called") + + -- 取得目前開關狀態 + local switch_get = Basic:Get({}) + device:send(switch_get) + + -- 取得目前dimmer的level + local switchlevel_get = SwitchMultilevel:Get({}) + device:send(switchlevel_get) +end + +------------------------------------------------------------------- +-- Lifecycle +------------------------------------------------------------------- +local function device_init(driver, device) + print("DEBUG: PAD19 device_init called") +end + +local function device_added(driver, device) + print("DEBUG: PAD19 device_added - init state off") + device:emit_event(capabilities.switch.switch.off()) + device:emit_event(capabilities.switchLevel.level(0)) + print("DEBUG: PAD19 Initial switchlevel = 0") +end + +-- NEW: 修正 driverSwitched 崩潰 +local function device_driver_switched(driver, device, event, args) + print("DEBUG: PAD19 driverSwitched - ignored") +end + +local pad19_driver_template = { + NAME = "Philio PAD19 Dimmer Switch", + zwave_handlers = { + [cc.BASIC] = { + [Basic.SET] = dimmer_event, + [Basic.REPORT] = basic_report_handler + }, + [cc.SWITCH_MULTILEVEL] = { + [SwitchMultilevel.SET] = dimmer_event, + [SwitchMultilevel.REPORT] = dimmer_event + } + }, + capability_handlers = { + [capabilities.switch.ID] = { + [capabilities.switch.commands.on.NAME] = switch_on_handler, + [capabilities.switch.commands.off.NAME] = switch_off_handler + }, + [capabilities.switchLevel.ID] = { + [capabilities.switchLevel.commands.setLevel.NAME] = switch_level_set + }, + [capabilities.refresh.ID] = { + [capabilities.refresh.commands.refresh.NAME] = refresh_cmd + } + }, + + lifecycle_handlers = { + init = device_init, + added = device_added, + driverSwitched = device_driver_switched + }, + + -- 設置 Z-Wave 設備配置 + zwave_config = {} +-- zwave_config = {}, + + -- 指定can_handle腳本, 讓上層可以先檢查這台Device是否能用這個子驅動控制,可以才載入 +-- can_handle = require("philio-dimmer-switch.can_handle") +} + +-- 回傳驅動範本 +return pad19_driver_template diff --git a/drivers/SmartThings/zwave-switch/src/preferences.lua b/drivers/SmartThings/zwave-switch/src/preferences.lua index 824e570070..1f5d58670e 100644 --- a/drivers/SmartThings/zwave-switch/src/preferences.lua +++ b/drivers/SmartThings/zwave-switch/src/preferences.lua @@ -430,6 +430,21 @@ local devices = { PARAMETERS = { statusLEDmode = {parameter_number = 7, size = 4} } + }, + PHILIO_PAD19 = { + MATCHING_MATRIX = { + mfrs = 0x013C, + product_types = 0x0005, + product_ids = 0x008A + }, + PARAMETERS = { + parameter1 = {parameter_number = 1, size = 1}, + parameter2 = {parameter_number = 2, size = 1}, + parameter3 = {parameter_number = 3, size = 1}, + parameter4 = {parameter_number = 4, size = 1}, + parameter5 = {parameter_number = 5, size = 1}, + parameter6 = {parameter_number = 6, size = 1} + } } } diff --git a/drivers/SmartThings/zwave-switch/src/sub_drivers.lua b/drivers/SmartThings/zwave-switch/src/sub_drivers.lua new file mode 100644 index 0000000000..9df5ebfb51 --- /dev/null +++ b/drivers/SmartThings/zwave-switch/src/sub_drivers.lua @@ -0,0 +1,29 @@ + +-- Copyright 2026 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + +local lazy_load_if_possible = require "lazy_load_subdriver" + +return { + lazy_load_if_possible("eaton-accessory-dimmer"), + lazy_load_if_possible("inovelli"), + lazy_load_if_possible("dawon-smart-plug"), + lazy_load_if_possible("inovelli-2-channel-smart-plug"), + lazy_load_if_possible("zwave-dual-switch"), + lazy_load_if_possible("eaton-anyplace-switch"), + lazy_load_if_possible("fibaro-wall-plug-us"), + lazy_load_if_possible("dawon-wall-smart-switch"), + lazy_load_if_possible("zooz-power-strip"), + lazy_load_if_possible("aeon-smart-strip"), + lazy_load_if_possible("qubino-switches"), + lazy_load_if_possible("fibaro-double-switch"), + lazy_load_if_possible("fibaro-single-switch"), + lazy_load_if_possible("eaton-5-scene-keypad"), + lazy_load_if_possible("ecolink-switch"), + lazy_load_if_possible("multi-metering-switch"), + lazy_load_if_possible("zooz-zen-30-dimmer-relay"), + lazy_load_if_possible("multichannel-device"), + lazy_load_if_possible("aeotec-smart-switch"), + lazy_load_if_possible("aeotec-heavy-duty"), + lazy_load_if_possible("philio-dimmer-switch") +} From e0f1f7e684ce4b7ad096c6b11d2bb8701675287d Mon Sep 17 00:00:00 2001 From: JerryYang01 <40193349+JerryYang01@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:59:00 +0800 Subject: [PATCH 4/5] I remark the print command --- .../zwave-switch/src/philio-dimmer-switch/init.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/init.lua b/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/init.lua index 01afe802ad..362575e45f 100644 --- a/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/init.lua +++ b/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/init.lua @@ -13,7 +13,7 @@ local Basic = (require "st.zwave.CommandClass.Basic")({ version = 1 }) local SwitchMultilevel = (require "st.zwave.CommandClass.SwitchMultilevel")({ version = 4 }) -print("DEBUG: philio-dimmer-switch/init.lua loaded") +-- print("DEBUG: philio-dimmer-switch/init.lua loaded") local function dimmer_event(driver, device, cmd) local value = cmd.args.value or cmd.args.target_value or 0 @@ -72,7 +72,7 @@ end ---- Refresh 指令函式(SmartThings Test Suite 必要) local function refresh_cmd(driver, device, command) - print("DEBUG: PAD19 refresh_cmd called") + -- print("DEBUG: PAD19 refresh_cmd called") -- 取得目前開關狀態 local switch_get = Basic:Get({}) @@ -87,19 +87,19 @@ end -- Lifecycle ------------------------------------------------------------------- local function device_init(driver, device) - print("DEBUG: PAD19 device_init called") + -- print("DEBUG: PAD19 device_init called") end local function device_added(driver, device) - print("DEBUG: PAD19 device_added - init state off") + -- print("DEBUG: PAD19 device_added - init state off") device:emit_event(capabilities.switch.switch.off()) device:emit_event(capabilities.switchLevel.level(0)) - print("DEBUG: PAD19 Initial switchlevel = 0") + -- print("DEBUG: PAD19 Initial switchlevel = 0") end -- NEW: 修正 driverSwitched 崩潰 local function device_driver_switched(driver, device, event, args) - print("DEBUG: PAD19 driverSwitched - ignored") + -- print("DEBUG: PAD19 driverSwitched - ignored") end local pad19_driver_template = { From efb35d97fcbd6b3f77f1328b79358540e2ec395a Mon Sep 17 00:00:00 2001 From: JerryYang01 <40193349+JerryYang01@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:20:32 +0800 Subject: [PATCH 5/5] The range of my switchLevel is between 0~99 --- .../profiles/philio-dimmer-switch.yml | 4 ++++ .../src/philio-dimmer-switch/init.lua | 17 +++++++++++++---- .../zwave-switch/src/preferences.lua | 15 --------------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/drivers/SmartThings/zwave-switch/profiles/philio-dimmer-switch.yml b/drivers/SmartThings/zwave-switch/profiles/philio-dimmer-switch.yml index 74f19525bf..ccf2d69111 100644 --- a/drivers/SmartThings/zwave-switch/profiles/philio-dimmer-switch.yml +++ b/drivers/SmartThings/zwave-switch/profiles/philio-dimmer-switch.yml @@ -6,6 +6,10 @@ components: version: 1 - id: switchLevel version: 1 + config: + values: + - key: "level.value" + range: [0, 99] - id: refresh version: 1 categories: diff --git a/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/init.lua b/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/init.lua index 362575e45f..e0599b7c0c 100644 --- a/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/init.lua +++ b/drivers/SmartThings/zwave-switch/src/philio-dimmer-switch/init.lua @@ -16,8 +16,17 @@ local SwitchMultilevel = (require "st.zwave.CommandClass.SwitchMultilevel")({ ve -- print("DEBUG: philio-dimmer-switch/init.lua loaded") local function dimmer_event(driver, device, cmd) - local value = cmd.args.value or cmd.args.target_value or 0 - local level = utils.clamp_value(value, 0, 100) + local raw = cmd.args.value or cmd.args.target_value or 0 + + if raw == "OFF_DISABLE" then + raw = 0 + end + + if type(raw) ~= "number" then + raw = 0 + end + + local level = utils.clamp_value(raw, 0, 99) device:emit_event(level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) device:emit_event(capabilities.switchLevel.level(level)) @@ -25,9 +34,9 @@ end local function basic_report_handler(driver, device, cmd) local basic_level = cmd.args.value or 0 - local level = utils.clamp_value(basic_level, 0, 100) + local level = utils.clamp_value(basic_level, 0, 99) - device:emit_event(basic_level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) + device:emit_event(level > 0 and capabilities.switch.switch.on() or capabilities.switch.switch.off()) device:emit_event(capabilities.switchLevel.level(level)) end diff --git a/drivers/SmartThings/zwave-switch/src/preferences.lua b/drivers/SmartThings/zwave-switch/src/preferences.lua index 1f5d58670e..824e570070 100644 --- a/drivers/SmartThings/zwave-switch/src/preferences.lua +++ b/drivers/SmartThings/zwave-switch/src/preferences.lua @@ -430,21 +430,6 @@ local devices = { PARAMETERS = { statusLEDmode = {parameter_number = 7, size = 4} } - }, - PHILIO_PAD19 = { - MATCHING_MATRIX = { - mfrs = 0x013C, - product_types = 0x0005, - product_ids = 0x008A - }, - PARAMETERS = { - parameter1 = {parameter_number = 1, size = 1}, - parameter2 = {parameter_number = 2, size = 1}, - parameter3 = {parameter_number = 3, size = 1}, - parameter4 = {parameter_number = 4, size = 1}, - parameter5 = {parameter_number = 5, size = 1}, - parameter6 = {parameter_number = 6, size = 1} - } } }