From 00ce236788fc9dd1b79c99ad1df337388e9c02f7 Mon Sep 17 00:00:00 2001 From: Stuart Pearson <1926002+stuartp44@users.noreply.github.com> Date: Tue, 9 Sep 2025 22:27:10 +0200 Subject: [PATCH 1/7] Add custom quirk for TS0003 3-USB switch without power metering --- zhaquirks/tuya/ts0003_usb.py | 114 +++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 zhaquirks/tuya/ts0003_usb.py diff --git a/zhaquirks/tuya/ts0003_usb.py b/zhaquirks/tuya/ts0003_usb.py new file mode 100644 index 0000000000..44e451584e --- /dev/null +++ b/zhaquirks/tuya/ts0003_usb.py @@ -0,0 +1,114 @@ +from zigpy.profiles import zha, zgp +from zigpy.quirks import CustomDevice +from zigpy.zcl.clusters.general import ( + Basic, + Identify, + Groups, + Scenes, + OnOff, + Ota, + Time, + GreenPowerProxy, +) + +from zhaquirks.const import ( + MODELS_INFO, + ENDPOINTS, + PROFILE_ID, + DEVICE_TYPE, + INPUT_CLUSTERS, + OUTPUT_CLUSTERS, +) + + +class TS0003USB3Switch(CustomDevice): + """Custom quirk for TS0003 (_TZ3000_mw1pqqqt) 3-USB switch — without power metering.""" + + signature = { + MODELS_INFO: [("_TZ3000_mw1pqqqt", "TS0003")], + ENDPOINTS: { + 1: { + PROFILE_ID: 0x0104, + DEVICE_TYPE: 0x0100, + INPUT_CLUSTERS: [ + 0x0000, # Basic + 0x0003, # Identify + 0x0004, # Groups + 0x0005, # Scenes + 0x0006, # OnOff + 0x0702, # Metering — ignored + 0x0B04, # Electrical Measurement — ignored + 0xE000, # Tuya proprietary + 0xE001, # Tuya proprietary + ], + OUTPUT_CLUSTERS: [ + 0x000A, # Time + 0x0019, # OTA + ], + }, + 2: { + PROFILE_ID: 0x0104, + DEVICE_TYPE: 0x0100, + INPUT_CLUSTERS: [0x0004, 0x0005, 0x0006], + OUTPUT_CLUSTERS: [], + }, + 3: { + PROFILE_ID: 0x0104, + DEVICE_TYPE: 0x0100, + INPUT_CLUSTERS: [0x0004, 0x0005, 0x0006], + OUTPUT_CLUSTERS: [], + }, + 242: { + PROFILE_ID: 0xA1E0, + DEVICE_TYPE: 0x0061, + INPUT_CLUSTERS: [], + OUTPUT_CLUSTERS: [0x0021], # Green Power Proxy + }, + }, + } + + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, + INPUT_CLUSTERS: [ + Basic, + Identify, + Groups, + Scenes, + OnOff, + ], + OUTPUT_CLUSTERS: [ + Time, + Ota, + ], + }, + 2: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, + INPUT_CLUSTERS: [ + Groups, + Scenes, + OnOff, + ], + OUTPUT_CLUSTERS: [], + }, + 3: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, + INPUT_CLUSTERS: [ + Groups, + Scenes, + OnOff, + ], + OUTPUT_CLUSTERS: [], + }, + 242: { + PROFILE_ID: zgp.PROFILE_ID, + DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, + INPUT_CLUSTERS: [], + OUTPUT_CLUSTERS: [GreenPowerProxy], + }, + } + } \ No newline at end of file From 8f3bd27cc4a81285e15dd0dd66e14978fc5f1d07 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 20:36:41 +0000 Subject: [PATCH 2/7] Apply pre-commit auto fixes --- zhaquirks/tuya/ts0003_usb.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/zhaquirks/tuya/ts0003_usb.py b/zhaquirks/tuya/ts0003_usb.py index 44e451584e..f0001e2e58 100644 --- a/zhaquirks/tuya/ts0003_usb.py +++ b/zhaquirks/tuya/ts0003_usb.py @@ -1,23 +1,23 @@ -from zigpy.profiles import zha, zgp +from zigpy.profiles import zgp, zha from zigpy.quirks import CustomDevice from zigpy.zcl.clusters.general import ( Basic, - Identify, + GreenPowerProxy, Groups, - Scenes, + Identify, OnOff, Ota, + Scenes, Time, - GreenPowerProxy, ) from zhaquirks.const import ( - MODELS_INFO, - ENDPOINTS, - PROFILE_ID, DEVICE_TYPE, + ENDPOINTS, INPUT_CLUSTERS, + MODELS_INFO, OUTPUT_CLUSTERS, + PROFILE_ID, ) @@ -111,4 +111,4 @@ class TS0003USB3Switch(CustomDevice): OUTPUT_CLUSTERS: [GreenPowerProxy], }, } - } \ No newline at end of file + } From 38035ef2398bf6a9cd980899d3f723a3a8a63608 Mon Sep 17 00:00:00 2001 From: Stuart Pearson <1926002+stuartp44@users.noreply.github.com> Date: Tue, 9 Sep 2025 22:39:39 +0200 Subject: [PATCH 3/7] Add custom quirk for TS0003 3-USB switch without power metering --- zhaquirks/tuya/ts0003_3_usb_switch.py | 114 ++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 zhaquirks/tuya/ts0003_3_usb_switch.py diff --git a/zhaquirks/tuya/ts0003_3_usb_switch.py b/zhaquirks/tuya/ts0003_3_usb_switch.py new file mode 100644 index 0000000000..44e451584e --- /dev/null +++ b/zhaquirks/tuya/ts0003_3_usb_switch.py @@ -0,0 +1,114 @@ +from zigpy.profiles import zha, zgp +from zigpy.quirks import CustomDevice +from zigpy.zcl.clusters.general import ( + Basic, + Identify, + Groups, + Scenes, + OnOff, + Ota, + Time, + GreenPowerProxy, +) + +from zhaquirks.const import ( + MODELS_INFO, + ENDPOINTS, + PROFILE_ID, + DEVICE_TYPE, + INPUT_CLUSTERS, + OUTPUT_CLUSTERS, +) + + +class TS0003USB3Switch(CustomDevice): + """Custom quirk for TS0003 (_TZ3000_mw1pqqqt) 3-USB switch — without power metering.""" + + signature = { + MODELS_INFO: [("_TZ3000_mw1pqqqt", "TS0003")], + ENDPOINTS: { + 1: { + PROFILE_ID: 0x0104, + DEVICE_TYPE: 0x0100, + INPUT_CLUSTERS: [ + 0x0000, # Basic + 0x0003, # Identify + 0x0004, # Groups + 0x0005, # Scenes + 0x0006, # OnOff + 0x0702, # Metering — ignored + 0x0B04, # Electrical Measurement — ignored + 0xE000, # Tuya proprietary + 0xE001, # Tuya proprietary + ], + OUTPUT_CLUSTERS: [ + 0x000A, # Time + 0x0019, # OTA + ], + }, + 2: { + PROFILE_ID: 0x0104, + DEVICE_TYPE: 0x0100, + INPUT_CLUSTERS: [0x0004, 0x0005, 0x0006], + OUTPUT_CLUSTERS: [], + }, + 3: { + PROFILE_ID: 0x0104, + DEVICE_TYPE: 0x0100, + INPUT_CLUSTERS: [0x0004, 0x0005, 0x0006], + OUTPUT_CLUSTERS: [], + }, + 242: { + PROFILE_ID: 0xA1E0, + DEVICE_TYPE: 0x0061, + INPUT_CLUSTERS: [], + OUTPUT_CLUSTERS: [0x0021], # Green Power Proxy + }, + }, + } + + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, + INPUT_CLUSTERS: [ + Basic, + Identify, + Groups, + Scenes, + OnOff, + ], + OUTPUT_CLUSTERS: [ + Time, + Ota, + ], + }, + 2: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, + INPUT_CLUSTERS: [ + Groups, + Scenes, + OnOff, + ], + OUTPUT_CLUSTERS: [], + }, + 3: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, + INPUT_CLUSTERS: [ + Groups, + Scenes, + OnOff, + ], + OUTPUT_CLUSTERS: [], + }, + 242: { + PROFILE_ID: zgp.PROFILE_ID, + DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, + INPUT_CLUSTERS: [], + OUTPUT_CLUSTERS: [GreenPowerProxy], + }, + } + } \ No newline at end of file From 1b31bd617f5a55469b160f549fd9d7a47405b82a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 20:39:48 +0000 Subject: [PATCH 4/7] Apply pre-commit auto fixes --- zhaquirks/tuya/ts0003_3_usb_switch.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/zhaquirks/tuya/ts0003_3_usb_switch.py b/zhaquirks/tuya/ts0003_3_usb_switch.py index 44e451584e..f0001e2e58 100644 --- a/zhaquirks/tuya/ts0003_3_usb_switch.py +++ b/zhaquirks/tuya/ts0003_3_usb_switch.py @@ -1,23 +1,23 @@ -from zigpy.profiles import zha, zgp +from zigpy.profiles import zgp, zha from zigpy.quirks import CustomDevice from zigpy.zcl.clusters.general import ( Basic, - Identify, + GreenPowerProxy, Groups, - Scenes, + Identify, OnOff, Ota, + Scenes, Time, - GreenPowerProxy, ) from zhaquirks.const import ( - MODELS_INFO, - ENDPOINTS, - PROFILE_ID, DEVICE_TYPE, + ENDPOINTS, INPUT_CLUSTERS, + MODELS_INFO, OUTPUT_CLUSTERS, + PROFILE_ID, ) @@ -111,4 +111,4 @@ class TS0003USB3Switch(CustomDevice): OUTPUT_CLUSTERS: [GreenPowerProxy], }, } - } \ No newline at end of file + } From 5473ca6e44020dc900823a129bdf4d2291576e6f Mon Sep 17 00:00:00 2001 From: Stuart Pearson <1926002+stuartp44@users.noreply.github.com> Date: Tue, 9 Sep 2025 22:53:53 +0200 Subject: [PATCH 5/7] Delete zhaquirks/tuya/ts0003_usb.py --- zhaquirks/tuya/ts0003_usb.py | 114 ----------------------------------- 1 file changed, 114 deletions(-) delete mode 100644 zhaquirks/tuya/ts0003_usb.py diff --git a/zhaquirks/tuya/ts0003_usb.py b/zhaquirks/tuya/ts0003_usb.py deleted file mode 100644 index f0001e2e58..0000000000 --- a/zhaquirks/tuya/ts0003_usb.py +++ /dev/null @@ -1,114 +0,0 @@ -from zigpy.profiles import zgp, zha -from zigpy.quirks import CustomDevice -from zigpy.zcl.clusters.general import ( - Basic, - GreenPowerProxy, - Groups, - Identify, - OnOff, - Ota, - Scenes, - Time, -) - -from zhaquirks.const import ( - DEVICE_TYPE, - ENDPOINTS, - INPUT_CLUSTERS, - MODELS_INFO, - OUTPUT_CLUSTERS, - PROFILE_ID, -) - - -class TS0003USB3Switch(CustomDevice): - """Custom quirk for TS0003 (_TZ3000_mw1pqqqt) 3-USB switch — without power metering.""" - - signature = { - MODELS_INFO: [("_TZ3000_mw1pqqqt", "TS0003")], - ENDPOINTS: { - 1: { - PROFILE_ID: 0x0104, - DEVICE_TYPE: 0x0100, - INPUT_CLUSTERS: [ - 0x0000, # Basic - 0x0003, # Identify - 0x0004, # Groups - 0x0005, # Scenes - 0x0006, # OnOff - 0x0702, # Metering — ignored - 0x0B04, # Electrical Measurement — ignored - 0xE000, # Tuya proprietary - 0xE001, # Tuya proprietary - ], - OUTPUT_CLUSTERS: [ - 0x000A, # Time - 0x0019, # OTA - ], - }, - 2: { - PROFILE_ID: 0x0104, - DEVICE_TYPE: 0x0100, - INPUT_CLUSTERS: [0x0004, 0x0005, 0x0006], - OUTPUT_CLUSTERS: [], - }, - 3: { - PROFILE_ID: 0x0104, - DEVICE_TYPE: 0x0100, - INPUT_CLUSTERS: [0x0004, 0x0005, 0x0006], - OUTPUT_CLUSTERS: [], - }, - 242: { - PROFILE_ID: 0xA1E0, - DEVICE_TYPE: 0x0061, - INPUT_CLUSTERS: [], - OUTPUT_CLUSTERS: [0x0021], # Green Power Proxy - }, - }, - } - - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, - INPUT_CLUSTERS: [ - Basic, - Identify, - Groups, - Scenes, - OnOff, - ], - OUTPUT_CLUSTERS: [ - Time, - Ota, - ], - }, - 2: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, - INPUT_CLUSTERS: [ - Groups, - Scenes, - OnOff, - ], - OUTPUT_CLUSTERS: [], - }, - 3: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, - INPUT_CLUSTERS: [ - Groups, - Scenes, - OnOff, - ], - OUTPUT_CLUSTERS: [], - }, - 242: { - PROFILE_ID: zgp.PROFILE_ID, - DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, - INPUT_CLUSTERS: [], - OUTPUT_CLUSTERS: [GreenPowerProxy], - }, - } - } From 0a76a17b66ed1f95156ee262c31acf4c1f93f6ba Mon Sep 17 00:00:00 2001 From: Stuart Pearson <1926002+stuartp44@users.noreply.github.com> Date: Tue, 9 Sep 2025 22:57:30 +0200 Subject: [PATCH 6/7] Update docstring for TS0003 3-USB switch quirk --- zhaquirks/tuya/ts0003_3_usb_switch.py | 1 + 1 file changed, 1 insertion(+) diff --git a/zhaquirks/tuya/ts0003_3_usb_switch.py b/zhaquirks/tuya/ts0003_3_usb_switch.py index f0001e2e58..f99beac739 100644 --- a/zhaquirks/tuya/ts0003_3_usb_switch.py +++ b/zhaquirks/tuya/ts0003_3_usb_switch.py @@ -1,3 +1,4 @@ +"""Custom quirk for TS0003 (_TZ3000_mw1pqqqt) 3-USB switch — without power metering.""" from zigpy.profiles import zgp, zha from zigpy.quirks import CustomDevice from zigpy.zcl.clusters.general import ( From 02008587750af04e48e7d8ce562179ff0856e5fb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 20:57:41 +0000 Subject: [PATCH 7/7] Apply pre-commit auto fixes --- zhaquirks/tuya/ts0003_3_usb_switch.py | 1 + 1 file changed, 1 insertion(+) diff --git a/zhaquirks/tuya/ts0003_3_usb_switch.py b/zhaquirks/tuya/ts0003_3_usb_switch.py index f99beac739..8a93ece262 100644 --- a/zhaquirks/tuya/ts0003_3_usb_switch.py +++ b/zhaquirks/tuya/ts0003_3_usb_switch.py @@ -1,4 +1,5 @@ """Custom quirk for TS0003 (_TZ3000_mw1pqqqt) 3-USB switch — without power metering.""" + from zigpy.profiles import zgp, zha from zigpy.quirks import CustomDevice from zigpy.zcl.clusters.general import (