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/2] 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/2] 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()