From f04cc8cd42ab5953ae254c4abd9dd2fcbc99ad9e Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 30 Aug 2024 10:05:55 +0800 Subject: [PATCH 01/51] add 3r waterleak py --- zhaquirks/thirdreality/waterleak.py | 118 ++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 zhaquirks/thirdreality/waterleak.py diff --git a/zhaquirks/thirdreality/waterleak.py b/zhaquirks/thirdreality/waterleak.py new file mode 100644 index 0000000000..0f2fa7e955 --- /dev/null +++ b/zhaquirks/thirdreality/waterleak.py @@ -0,0 +1,118 @@ +"""Third Reality WaterLeak devices.""" + +from typing import Final # noqa: I001 + +from zigpy.profiles import zha # type: ignore +from zigpy.quirks import CustomDevice # type: ignore +import zigpy.types as t # type: ignore +from zigpy.zcl.clusters.general import Basic, OnOff, Ota, PowerConfiguration # type: ignore +from zigpy.zcl.clusters.security import IasZone # type: ignore +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef # type: ignore + +from zhaquirks import CustomCluster # type: ignore +from zhaquirks.const import ( # type: ignore + DEVICE_TYPE, + ENDPOINTS, + INPUT_CLUSTERS, + MODELS_INFO, + OUTPUT_CLUSTERS, + PROFILE_ID, +) +from zhaquirks.thirdreality import THIRD_REALITY # type: ignore + +THIRD_REALITY_WATERLEAK_CLUSTER_ID = 0xFF01 +THIRD_REALITY_WATERLEAK_BRIGHTNESS_CLUSTER_ID = 0xFF00 +DELAY_OPEN_ATTR_ID = 0x0000 + +class ControlMode(t.uint8_t): # noqa: D101 + + pass + +class ThirdRealityWaterLeakCluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" + + cluster_id = THIRD_REALITY_WATERLEAK_CLUSTER_ID + + + class AttributeDefs(BaseAttributeDefs): + """Attribute definitions.""" + + siren_on_off: Final = ZCLAttributeDef( + id=0x0010, + type=ControlMode, + is_manufacturer_specific=True, + ) + + siren_mintues: Final = ZCLAttributeDef( + id=0x0011, + type=ControlMode, + is_manufacturer_specific=True, + ) + + +class ThirdRealityWaterLeakBrightnessCluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" + + cluster_id = THIRD_REALITY_WATERLEAK_BRIGHTNESS_CLUSTER_ID + + class AttributeDefs(BaseAttributeDefs): + """Attribute definitions.""" + + redlight: Final = ZCLAttributeDef( + id=0x0000, + type=ControlMode, + is_manufacturer_specific=True, + ) + + bluelight: Final = ZCLAttributeDef( + id=0x0002, + type=ControlMode, + is_manufacturer_specific=True, + ) + + + +class WaterLeak(CustomDevice): + """ThirdReality WaterLeak device.""" + + signature = { + MODELS_INFO: [ + (THIRD_REALITY, "3RWS18BZ"), + ], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.IAS_ZONE, + INPUT_CLUSTERS: [ + Basic.cluster_id, # 0x0000 + PowerConfiguration.cluster_id, # 0x0001 + IasZone.cluster_id, # 0x0500 + ThirdRealityWaterLeakCluster.cluster_id, # 0xFF01 + ThirdRealityWaterLeakBrightnessCluster.cluster_id, #0xFF00 + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, # 0x0019 + OnOff.cluster_id, + ], + }, + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.IAS_ZONE, + INPUT_CLUSTERS: [ + Basic.cluster_id, # 0x0000 + PowerConfiguration.cluster_id, # 0x0001 + IasZone.cluster_id, # 0x0500 + ThirdRealityWaterLeakCluster, # 0xFF01 + ThirdRealityWaterLeakBrightnessCluster, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, # 0x0019 + OnOff.cluster_id, + ], + }, + }, + } From ede63c152eadc17865b5f45de7fe650ca60788e7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 02:07:03 +0000 Subject: [PATCH 02/51] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- zhaquirks/thirdreality/waterleak.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/zhaquirks/thirdreality/waterleak.py b/zhaquirks/thirdreality/waterleak.py index 0f2fa7e955..4fbfeeaa49 100644 --- a/zhaquirks/thirdreality/waterleak.py +++ b/zhaquirks/thirdreality/waterleak.py @@ -2,15 +2,15 @@ from typing import Final # noqa: I001 -from zigpy.profiles import zha # type: ignore -from zigpy.quirks import CustomDevice # type: ignore -import zigpy.types as t # type: ignore -from zigpy.zcl.clusters.general import Basic, OnOff, Ota, PowerConfiguration # type: ignore -from zigpy.zcl.clusters.security import IasZone # type: ignore -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef # type: ignore +from zigpy.profiles import zha # type: ignore +from zigpy.quirks import CustomDevice # type: ignore +import zigpy.types as t # type: ignore +from zigpy.zcl.clusters.general import Basic, OnOff, Ota, PowerConfiguration # type: ignore +from zigpy.zcl.clusters.security import IasZone # type: ignore +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef # type: ignore from zhaquirks import CustomCluster # type: ignore -from zhaquirks.const import ( # type: ignore +from zhaquirks.const import ( # type: ignore DEVICE_TYPE, ENDPOINTS, INPUT_CLUSTERS, @@ -18,22 +18,22 @@ OUTPUT_CLUSTERS, PROFILE_ID, ) -from zhaquirks.thirdreality import THIRD_REALITY # type: ignore +from zhaquirks.thirdreality import THIRD_REALITY # type: ignore THIRD_REALITY_WATERLEAK_CLUSTER_ID = 0xFF01 THIRD_REALITY_WATERLEAK_BRIGHTNESS_CLUSTER_ID = 0xFF00 DELAY_OPEN_ATTR_ID = 0x0000 -class ControlMode(t.uint8_t): # noqa: D101 +class ControlMode(t.uint8_t): # noqa: D101 pass + class ThirdRealityWaterLeakCluster(CustomCluster): """ThirdReality Acceleration Cluster.""" cluster_id = THIRD_REALITY_WATERLEAK_CLUSTER_ID - class AttributeDefs(BaseAttributeDefs): """Attribute definitions.""" @@ -71,7 +71,6 @@ class AttributeDefs(BaseAttributeDefs): ) - class WaterLeak(CustomDevice): """ThirdReality WaterLeak device.""" @@ -88,7 +87,7 @@ class WaterLeak(CustomDevice): PowerConfiguration.cluster_id, # 0x0001 IasZone.cluster_id, # 0x0500 ThirdRealityWaterLeakCluster.cluster_id, # 0xFF01 - ThirdRealityWaterLeakBrightnessCluster.cluster_id, #0xFF00 + ThirdRealityWaterLeakBrightnessCluster.cluster_id, # 0xFF00 ], OUTPUT_CLUSTERS: [ Ota.cluster_id, # 0x0019 From ce0a7fb608c98b13e601638d0fe5401ecc0a38f3 Mon Sep 17 00:00:00 2001 From: support <117250319+3reality-support@users.noreply.github.com> Date: Fri, 30 Aug 2024 10:17:15 +0800 Subject: [PATCH 03/51] Update waterleak.py --- zhaquirks/thirdreality/waterleak.py | 44 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/zhaquirks/thirdreality/waterleak.py b/zhaquirks/thirdreality/waterleak.py index 4fbfeeaa49..1116bf1a56 100644 --- a/zhaquirks/thirdreality/waterleak.py +++ b/zhaquirks/thirdreality/waterleak.py @@ -1,16 +1,14 @@ """Third Reality WaterLeak devices.""" - -from typing import Final # noqa: I001 - -from zigpy.profiles import zha # type: ignore -from zigpy.quirks import CustomDevice # type: ignore +from typing import Final +from zigpy.profiles import zha +from zigpy.quirks import CustomDevice import zigpy.types as t # type: ignore -from zigpy.zcl.clusters.general import Basic, OnOff, Ota, PowerConfiguration # type: ignore -from zigpy.zcl.clusters.security import IasZone # type: ignore -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef # type: ignore +from zigpy.zcl.clusters.general import Basic, OnOff, Ota, PowerConfiguration +from zigpy.zcl.clusters.security import IasZone +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef -from zhaquirks import CustomCluster # type: ignore -from zhaquirks.const import ( # type: ignore +from zhaquirks import CustomCluster +from zhaquirks.const import ( DEVICE_TYPE, ENDPOINTS, INPUT_CLUSTERS, @@ -18,14 +16,14 @@ OUTPUT_CLUSTERS, PROFILE_ID, ) -from zhaquirks.thirdreality import THIRD_REALITY # type: ignore +from zhaquirks.thirdreality import THIRD_REALITY THIRD_REALITY_WATERLEAK_CLUSTER_ID = 0xFF01 THIRD_REALITY_WATERLEAK_BRIGHTNESS_CLUSTER_ID = 0xFF00 DELAY_OPEN_ATTR_ID = 0x0000 -class ControlMode(t.uint8_t): # noqa: D101 +class ControlMode(t.uint8_t): pass @@ -83,14 +81,14 @@ class WaterLeak(CustomDevice): PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.IAS_ZONE, INPUT_CLUSTERS: [ - Basic.cluster_id, # 0x0000 - PowerConfiguration.cluster_id, # 0x0001 - IasZone.cluster_id, # 0x0500 - ThirdRealityWaterLeakCluster.cluster_id, # 0xFF01 - ThirdRealityWaterLeakBrightnessCluster.cluster_id, # 0xFF00 + Basic.cluster_id, + PowerConfiguration.cluster_id, + IasZone.cluster_id, + ThirdRealityWaterLeakCluster.cluster_id, + ThirdRealityWaterLeakBrightnessCluster.cluster_id, ], OUTPUT_CLUSTERS: [ - Ota.cluster_id, # 0x0019 + Ota.cluster_id, OnOff.cluster_id, ], }, @@ -102,14 +100,14 @@ class WaterLeak(CustomDevice): PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.IAS_ZONE, INPUT_CLUSTERS: [ - Basic.cluster_id, # 0x0000 - PowerConfiguration.cluster_id, # 0x0001 - IasZone.cluster_id, # 0x0500 - ThirdRealityWaterLeakCluster, # 0xFF01 + Basic.cluster_id, + PowerConfiguration.cluster_id, + IasZone.cluster_id, + ThirdRealityWaterLeakCluster, ThirdRealityWaterLeakBrightnessCluster, ], OUTPUT_CLUSTERS: [ - Ota.cluster_id, # 0x0019 + Ota.cluster_id, OnOff.cluster_id, ], }, From 5fa93b26cd3dab4c282bfba2bf2ed3d46b661de8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 02:17:30 +0000 Subject: [PATCH 04/51] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- zhaquirks/thirdreality/waterleak.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/zhaquirks/thirdreality/waterleak.py b/zhaquirks/thirdreality/waterleak.py index 1116bf1a56..3811b98bbb 100644 --- a/zhaquirks/thirdreality/waterleak.py +++ b/zhaquirks/thirdreality/waterleak.py @@ -1,5 +1,7 @@ """Third Reality WaterLeak devices.""" + from typing import Final + from zigpy.profiles import zha from zigpy.quirks import CustomDevice import zigpy.types as t # type: ignore @@ -7,7 +9,7 @@ from zigpy.zcl.clusters.security import IasZone from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef -from zhaquirks import CustomCluster +from zhaquirks import CustomCluster from zhaquirks.const import ( DEVICE_TYPE, ENDPOINTS, @@ -23,7 +25,7 @@ DELAY_OPEN_ATTR_ID = 0x0000 -class ControlMode(t.uint8_t): +class ControlMode(t.uint8_t): pass From bb80eeaa89030d639df96e33e1c32f185f6e2cf6 Mon Sep 17 00:00:00 2001 From: support <117250319+3reality-support@users.noreply.github.com> Date: Fri, 30 Aug 2024 10:20:35 +0800 Subject: [PATCH 05/51] Update waterleak.py --- zhaquirks/thirdreality/waterleak.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/zhaquirks/thirdreality/waterleak.py b/zhaquirks/thirdreality/waterleak.py index 3811b98bbb..f255e625fa 100644 --- a/zhaquirks/thirdreality/waterleak.py +++ b/zhaquirks/thirdreality/waterleak.py @@ -1,10 +1,8 @@ """Third Reality WaterLeak devices.""" - from typing import Final - from zigpy.profiles import zha from zigpy.quirks import CustomDevice -import zigpy.types as t # type: ignore +import zigpy.types as t from zigpy.zcl.clusters.general import Basic, OnOff, Ota, PowerConfiguration from zigpy.zcl.clusters.security import IasZone from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef From 50e524f337b30329cd321fa45dba1540b7029550 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 02:20:49 +0000 Subject: [PATCH 06/51] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- zhaquirks/thirdreality/waterleak.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/zhaquirks/thirdreality/waterleak.py b/zhaquirks/thirdreality/waterleak.py index f255e625fa..6235ad29c5 100644 --- a/zhaquirks/thirdreality/waterleak.py +++ b/zhaquirks/thirdreality/waterleak.py @@ -1,5 +1,7 @@ """Third Reality WaterLeak devices.""" + from typing import Final + from zigpy.profiles import zha from zigpy.quirks import CustomDevice import zigpy.types as t From 59c77017d3804647584673b57ab18f70a22c7dba Mon Sep 17 00:00:00 2001 From: support <117250319+3reality-support@users.noreply.github.com> Date: Fri, 30 Aug 2024 10:24:27 +0800 Subject: [PATCH 07/51] Update waterleak.py From 207156b238372498f40b1e3506333c636b6b28a3 Mon Sep 17 00:00:00 2001 From: support <117250319+3reality-support@users.noreply.github.com> Date: Fri, 30 Aug 2024 10:28:45 +0800 Subject: [PATCH 08/51] Update waterleak.py --- zhaquirks/thirdreality/waterleak.py | 1 + 1 file changed, 1 insertion(+) diff --git a/zhaquirks/thirdreality/waterleak.py b/zhaquirks/thirdreality/waterleak.py index 6235ad29c5..bd5c9141f4 100644 --- a/zhaquirks/thirdreality/waterleak.py +++ b/zhaquirks/thirdreality/waterleak.py @@ -26,6 +26,7 @@ class ControlMode(t.uint8_t): + """ThirdReality Acceleration Cluster.""" pass From 4ac23eef56d4018ff4d1e7b0b3e7e3e9e1530833 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 02:29:00 +0000 Subject: [PATCH 09/51] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- zhaquirks/thirdreality/waterleak.py | 1 + 1 file changed, 1 insertion(+) diff --git a/zhaquirks/thirdreality/waterleak.py b/zhaquirks/thirdreality/waterleak.py index bd5c9141f4..065064c5fb 100644 --- a/zhaquirks/thirdreality/waterleak.py +++ b/zhaquirks/thirdreality/waterleak.py @@ -27,6 +27,7 @@ class ControlMode(t.uint8_t): """ThirdReality Acceleration Cluster.""" + pass From 463ad2f8b671b9f3712479f627ef007d0c962f41 Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 30 Aug 2024 11:27:31 +0800 Subject: [PATCH 10/51] add 3r project py --- zhaquirks/thirdreality/blind.py | 91 ++++++++++++++ zhaquirks/thirdreality/door.py | 114 ++++++++++++++++++ zhaquirks/thirdreality/motion.py | 108 +++++++++++++++++ zhaquirks/thirdreality/plug.py | 194 ++++++++++++++++++++++++++++++ zhaquirks/thirdreality/switch.py | 107 ++++++++++------ zhaquirks/thirdreality/vibrate.py | 2 +- 6 files changed, 580 insertions(+), 36 deletions(-) create mode 100644 zhaquirks/thirdreality/blind.py create mode 100644 zhaquirks/thirdreality/door.py create mode 100644 zhaquirks/thirdreality/motion.py create mode 100644 zhaquirks/thirdreality/plug.py diff --git a/zhaquirks/thirdreality/blind.py b/zhaquirks/thirdreality/blind.py new file mode 100644 index 0000000000..6518a1aab6 --- /dev/null +++ b/zhaquirks/thirdreality/blind.py @@ -0,0 +1,91 @@ +"""Third Reality blind devices.""" + +from typing import Final +from zigpy.profiles import zha +from zigpy.quirks import CustomDevice +import zigpy.types as t +from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration, OnOff +from zigpy.zcl.clusters.closures import WindowCovering +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + +from zhaquirks import CustomCluster +from zhaquirks.const import ( + DEVICE_TYPE, + ENDPOINTS, + INPUT_CLUSTERS, + MODELS_INFO, + OUTPUT_CLUSTERS, + PROFILE_ID, +) +from zhaquirks.thirdreality import THIRD_REALITY + +MANUFACTURER_SPECIFIC_CLUSTER_ID = 0xFFF1 + + +class ControlMode(t.uint8_t): + """Reset mode for not clear and clear.""" + + NOT = 0 + CLEAR = 1 + + +class ThirdRealityBlindCluster(CustomCluster): + """ThirdReality Blind Cluster.""" + + cluster_id = MANUFACTURER_SPECIFIC_CLUSTER_ID + + + class AttributeDefs(BaseAttributeDefs): + """Attribute definitions.""" + + infrared_off: Final = ZCLAttributeDef( + id=0x0000, + type=ControlMode, + is_manufacturer_specific=True, + ) + + +class blind(CustomDevice): + """ThirdReality blind device.""" + + signature = { + MODELS_INFO: [(THIRD_REALITY, "3RSB015BZ")], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.WINDOW_COVERING_DEVICE, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + WindowCovering.cluster_id, + OnOff.cluster_id, + ThirdRealityBlindCluster.cluster_id, + ], + OUTPUT_CLUSTERS: [ + OnOff.cluster_id, + Ota.cluster_id, + WindowCovering.cluster_id, + ], + } + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.WINDOW_COVERING_DEVICE, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + WindowCovering.cluster_id, + OnOff.cluster_id, + ThirdRealityBlindCluster, + ], + OUTPUT_CLUSTERS: [ + OnOff.cluster_id, + Ota.cluster_id, + WindowCovering.cluster_id, + ], + } + }, + } diff --git a/zhaquirks/thirdreality/door.py b/zhaquirks/thirdreality/door.py new file mode 100644 index 0000000000..75e017a1cb --- /dev/null +++ b/zhaquirks/thirdreality/door.py @@ -0,0 +1,114 @@ +"""Third Reality Door devices.""" + +from typing import Final + +from zigpy.profiles import zha +from zigpy.quirks import CustomDevice +import zigpy.types as t +from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration +from zigpy.zcl.clusters.security import IasZone +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + +from zhaquirks import CustomCluster +from zhaquirks.const import ( + DEVICE_TYPE, + ENDPOINTS, + INPUT_CLUSTERS, + MODELS_INFO, + OUTPUT_CLUSTERS, + PROFILE_ID, +) +from zhaquirks.thirdreality import THIRD_REALITY + +THIRD_REALITY_DOOR_CLUSTER_ID = 0xFF01 +DELAY_OPEN_ATTR_ID = 0x0000 + +THIRD_REALITY_DOOR_BRIGHTNESS_CLUSTER_ID = 0xFF00 +BRIGHTNESS_RED_LIGHT_ATTR_ID = 0x0000 +BRIGHTNESS_BLUE_LIGHT_ATTR_ID = 0x0002 + + +class ControlMode(t.uint16_t): + """Reset mode for not clear and clear.""" + + DELAY: int = 10 + +class BrightnessControlMode(t.uint16_t): + """ThirdReality Acceleration Cluster.""" + pass + + +class ThirdRealityDoorCluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" + + cluster_id = THIRD_REALITY_DOOR_CLUSTER_ID + + class AttributeDefs(BaseAttributeDefs): + """Attribute definitions.""" + + delay_open: Final = ZCLAttributeDef( + id=DELAY_OPEN_ATTR_ID, + type=ControlMode, + is_manufacturer_specific=True, + ) + +class ThirdRealityDoorBrightnessCluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" + + cluster_id = THIRD_REALITY_DOOR_BRIGHTNESS_CLUSTER_ID + + class AttributeDefs(BaseAttributeDefs): + red_light: Final = ZCLAttributeDef( + id=BRIGHTNESS_RED_LIGHT_ATTR_ID, + type=BrightnessControlMode, + is_manufacturer_specific=True, + ) + + blue_light: Final = ZCLAttributeDef( + id=BRIGHTNESS_BLUE_LIGHT_ATTR_ID, + type=BrightnessControlMode, + is_manufacturer_specific=True, + ) + +class Door(CustomDevice): + """ThirdReality Door device.""" + + signature = { + MODELS_INFO: [ + (THIRD_REALITY, "3RDS17BZ"), + ], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.IAS_ZONE, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + IasZone.cluster_id, + ThirdRealityDoorCluster.cluster_id, + ThirdRealityDoorBrightnessCluster.cluster_id + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + }, + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.OCCUPANCY_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + IasZone.cluster_id, + ThirdRealityDoorCluster, + ThirdRealityDoorBrightnessCluster + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + }, + }, + } diff --git a/zhaquirks/thirdreality/motion.py b/zhaquirks/thirdreality/motion.py new file mode 100644 index 0000000000..5af553905a --- /dev/null +++ b/zhaquirks/thirdreality/motion.py @@ -0,0 +1,108 @@ +"""Third Reality Motion devices.""" + +from typing import Final + +from zigpy.profiles import zha +from zigpy.quirks import CustomDevice +import zigpy.types as t +from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration +from zigpy.zcl.clusters.security import IasZone +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + +from zhaquirks import CustomCluster +from zhaquirks.const import ( + DEVICE_TYPE, + ENDPOINTS, + INPUT_CLUSTERS, + MODELS_INFO, + OUTPUT_CLUSTERS, + PROFILE_ID, +) +from zhaquirks.thirdreality import THIRD_REALITY + +THIRD_REALITY_MOTION_BRIGHTNESS_CLUSTER_ID = 0xFF00 +THIRD_REALITY_MOTION_DELAY_CLUSTER_ID = 0xFF01 + +class ControlMode(t.uint16_t): + """ThirdReality Acceleration Cluster.""" + pass + + +class ThirdRealityMotionCluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" + + cluster_id = THIRD_REALITY_MOTION_DELAY_CLUSTER_ID + + class AttributeDefs(BaseAttributeDefs): + """Attribute definitions.""" + + detected_to_undetected_delay: Final = ZCLAttributeDef( + id=0x0001, + type=ControlMode, + is_manufacturer_specific=True, + ) + + + +class ThirdRealityMotionBrightnessCluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" + + cluster_id = THIRD_REALITY_MOTION_BRIGHTNESS_CLUSTER_ID + class AttributeDefs(BaseAttributeDefs): + """Attribute definitions.""" + + red_light: Final = ZCLAttributeDef( + id=0x0000, + type=ControlMode, + is_manufacturer_specific=True, + ) + + blue_light: Final = ZCLAttributeDef( + id=0x0002, + type=ControlMode, + is_manufacturer_specific=True, + ) + + +class Motion(CustomDevice): + """ThirdReality Motion device.""" + + signature = { + MODELS_INFO: [ + (THIRD_REALITY, "3RMS16BZ"), + ], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.IAS_ZONE, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + IasZone.cluster_id, + ThirdRealityMotionCluster.cluster_id, + ThirdRealityMotionBrightnessCluster.cluster_id, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + }, + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.IAS_ZONE, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + IasZone.cluster_id, + ThirdRealityMotionCluster, + ThirdRealityMotionBrightnessCluster, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + }, + }, + } diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py new file mode 100644 index 0000000000..5acf25d5ef --- /dev/null +++ b/zhaquirks/thirdreality/plug.py @@ -0,0 +1,194 @@ +"""Third Reality Plug devices.""" + +from typing import Final + +from zigpy.profiles import zgp, zha +from zigpy.quirks import CustomDevice +from zigpy.quirks.registry import DeviceRegistry +from zigpy.quirks.v2 import CustomDeviceV2, EntityMetadata +import zigpy.types as t +from zigpy.zcl import ClusterType +from zigpy.zcl.clusters.general import ( + Basic, + GreenPowerProxy, + Groups, + Identify, + OnOff, + Ota, + Scenes, +) +from zigpy.zcl.clusters.homeautomation import ElectricalMeasurement +from zigpy.zcl.clusters.smartenergy import Metering +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + +from zhaquirks import CustomCluster +from zhaquirks.const import ( + DEVICE_TYPE, + ENDPOINTS, + INPUT_CLUSTERS, + MODELS_INFO, + OUTPUT_CLUSTERS, + PROFILE_ID, +) +from zhaquirks.thirdreality import THIRD_REALITY + +THIRD_REALITY_PLUG_CLUSTER_ID = 0xFF03 +RESET_SUMMATION_DELIVERED_ATTR_ID = 0x0000 +ON_TO_OFF_DELAY_ATTR_ID = 0X0001 +OFF_TO_ON_DELAY_ATTR_ID = 0X0002 + +class ControlMode(t.uint8_t): + """Reset mode for not clear and clear.""" + + CLEAR = 1 + +class ThirdRealityPlug1Cluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" + + cluster_id = THIRD_REALITY_PLUG_CLUSTER_ID + + attributes = { + 0x0001: ("on_to_off_delay", t.uint16_t, True), + 0x0002: ("off_to_on_delay", t.uint16_t, True), + } + +class ThirdRealityPlug2Cluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" + + cluster_id = THIRD_REALITY_PLUG_CLUSTER_ID + + attributes = { + 0x0000: ("reset_summation_delivered", t.uint8_t, True), + 0x0001: ("on_to_off_delay", t.uint16_t, True), + 0x0002: ("off_to_on_delay", t.uint16_t, True), + } + +class Plug1(CustomDevice): + """ThirdReality Plug device.""" + + signature = { + MODELS_INFO: [ + (THIRD_REALITY, "3RSP019BZ"), + ], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.SMART_PLUG, + INPUT_CLUSTERS: [ + Basic.cluster_id, + Identify.cluster_id, + Groups.cluster_id, + Scenes.cluster_id, + OnOff.cluster_id, + ThirdRealityPlug1Cluster.cluster_id, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + }, + 242: { + PROFILE_ID: zgp.PROFILE_ID, + DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, + INPUT_CLUSTERS: [], + OUTPUT_CLUSTERS: [ + GreenPowerProxy.cluster_id, + ], + }, + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.SMART_PLUG, + INPUT_CLUSTERS: [ + Basic.cluster_id, + Identify.cluster_id, + Groups.cluster_id, + Scenes.cluster_id, + OnOff.cluster_id, + Metering.cluster_id, + ElectricalMeasurement.cluster_id, + ThirdRealityPlug1Cluster, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + }, + 242: { + PROFILE_ID: zgp.PROFILE_ID, + DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, + INPUT_CLUSTERS: [], + OUTPUT_CLUSTERS: [ + GreenPowerProxy.cluster_id, + ], + }, + }, + } + + +class Plug2(CustomDevice): + """ThirdReality Plug device.""" + + signature = { + MODELS_INFO: [ + (THIRD_REALITY, "3RSP02028BZ"), + (THIRD_REALITY, "3RSPE01044BZ"), + ], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.SMART_PLUG, + INPUT_CLUSTERS: [ + Basic.cluster_id, + Identify.cluster_id, + Groups.cluster_id, + Scenes.cluster_id, + OnOff.cluster_id, + Metering.cluster_id, + ElectricalMeasurement.cluster_id, + ThirdRealityPlug2Cluster.cluster_id, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + }, + 242: { + PROFILE_ID: zgp.PROFILE_ID, + DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, + INPUT_CLUSTERS: [], + OUTPUT_CLUSTERS: [ + GreenPowerProxy.cluster_id, + ], + }, + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.SMART_PLUG, + INPUT_CLUSTERS: [ + Basic.cluster_id, + Identify.cluster_id, + Groups.cluster_id, + Scenes.cluster_id, + OnOff.cluster_id, + Metering.cluster_id, + ElectricalMeasurement.cluster_id, + ThirdRealityPlug2Cluster, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + }, + 242: { + PROFILE_ID: zgp.PROFILE_ID, + DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, + INPUT_CLUSTERS: [], + OUTPUT_CLUSTERS: [ + GreenPowerProxy.cluster_id, + ], + }, + }, + } diff --git a/zhaquirks/thirdreality/switch.py b/zhaquirks/thirdreality/switch.py index a56a1c9e91..7a6eeca665 100755 --- a/zhaquirks/thirdreality/switch.py +++ b/zhaquirks/thirdreality/switch.py @@ -1,10 +1,18 @@ """Third Reality switch devices.""" - from zigpy.profiles import zha from zigpy.quirks import CustomDevice -from zigpy.zcl.clusters.general import Basic, Groups, Identify, OnOff, Ota, Scenes +from zigpy.zcl.clusters.general import Basic, Groups, Identify, OnOff, Ota, Scenes, PowerConfiguration from zigpy.zcl.clusters.homeautomation import Diagnostic +from zigpy.zcl.clusters.general import ( + Basic, + GreenPowerProxy, + Groups, + Identify, + OnOff, + Ota, + Scenes, +) from zhaquirks import PowerConfigurationCluster from zhaquirks.const import ( DEVICE_TYPE, @@ -15,14 +23,38 @@ PROFILE_ID, ) from zhaquirks.thirdreality import THIRD_REALITY - +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef +from zhaquirks import CustomCluster +import zigpy.types as t class CustomPowerConfigurationCluster(PowerConfigurationCluster): """Custom PowerConfigurationCluster.""" - MIN_VOLTS = 2.1 MAX_VOLTS = 3.0 + + +THIRD_REALITY_SWITCH_CLUSTER_ID = 0xFF02 +THIRD_REALITY_SWITCH_BRIGHTNESS_CLUSTER_ID = 0xFF00 + +class ThirdRealitySwitchCluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" + + cluster_id = THIRD_REALITY_SWITCH_CLUSTER_ID + + attributes = { + 0x0002: ("back_off", t.uint16_t, True), + 0x0001: ("back_on", t.uint16_t, True), + } + +class ThirdRealitySwitchBrightnessCluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" + + cluster_id = THIRD_REALITY_SWITCH_BRIGHTNESS_CLUSTER_ID + attributes = { + 0x0000: ("red_light", t.uint8_t, True), + 0x0002: ("blue_light", t.uint8_t, True), + } class Switch(CustomDevice): """3RSS008Z device.""" @@ -39,14 +71,15 @@ class Switch(CustomDevice): DEVICE_TYPE: zha.DeviceType.ON_OFF_OUTPUT, INPUT_CLUSTERS: [ Basic.cluster_id, - Identify.cluster_id, - Groups.cluster_id, - Scenes.cluster_id, + ThirdRealitySwitchCluster.cluster_id, + ThirdRealitySwitchBrightnessCluster.cluster_id, + PowerConfiguration.cluster_id, OnOff.cluster_id, + ], + OUTPUT_CLUSTERS: [ Ota.cluster_id, - CustomPowerConfigurationCluster.cluster_id, + OnOff.cluster_id, ], - OUTPUT_CLUSTERS: [CustomPowerConfigurationCluster.cluster_id], } }, } @@ -58,61 +91,65 @@ class Switch(CustomDevice): DEVICE_TYPE: zha.DeviceType.ON_OFF_OUTPUT, INPUT_CLUSTERS: [ Basic.cluster_id, - Identify.cluster_id, - Groups.cluster_id, - Scenes.cluster_id, - OnOff.cluster_id, + ThirdRealitySwitchCluster, + ThirdRealitySwitchBrightnessCluster, + PowerConfiguration.cluster_id, + OnOff.cluster_id, + ], + OUTPUT_CLUSTERS: [ Ota.cluster_id, - CustomPowerConfigurationCluster, + OnOff.cluster_id, ], - OUTPUT_CLUSTERS: [CustomPowerConfigurationCluster.cluster_id], } } } -class SwitchPlus(Switch): - """RealitySwitch Plus (3RSS008Z) device.""" +class Switch_Plus(CustomDevice): + """RealitySwitch Plus (3RSS009Z) device.""" signature = { # - MODELS_INFO: [(THIRD_REALITY, "3RSS008Z")], + MODELS_INFO: [ + (THIRD_REALITY, "3RSS009Z") + ], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.ON_OFF_OUTPUT, + DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, INPUT_CLUSTERS: [ Basic.cluster_id, - Identify.cluster_id, - Groups.cluster_id, - Scenes.cluster_id, + ThirdRealitySwitchCluster.cluster_id, + ThirdRealitySwitchBrightnessCluster.cluster_id, + PowerConfiguration.cluster_id, OnOff.cluster_id, - Diagnostic.cluster_id, - CustomPowerConfigurationCluster.cluster_id, ], - OUTPUT_CLUSTERS: [Ota.cluster_id], - } + OUTPUT_CLUSTERS: [ + OnOff.cluster_id, + Ota.cluster_id, + ], + }, }, } - replacement = { ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.ON_OFF_OUTPUT, + DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, INPUT_CLUSTERS: [ Basic.cluster_id, - Identify.cluster_id, - Groups.cluster_id, - Scenes.cluster_id, + ThirdRealitySwitchCluster, + ThirdRealitySwitchBrightnessCluster, + PowerConfiguration.cluster_id, + OnOff.cluster_id, + ], + OUTPUT_CLUSTERS: [ OnOff.cluster_id, - Diagnostic.cluster_id, - CustomPowerConfigurationCluster, + Ota.cluster_id, ], - OUTPUT_CLUSTERS: [Ota.cluster_id], - } + }, } } diff --git a/zhaquirks/thirdreality/vibrate.py b/zhaquirks/thirdreality/vibrate.py index 5931b1135f..4e01d7c40a 100644 --- a/zhaquirks/thirdreality/vibrate.py +++ b/zhaquirks/thirdreality/vibrate.py @@ -1,5 +1,4 @@ """Third Reality vibrate devices.""" - from zigpy.profiles import zha from zigpy.quirks import CustomDevice import zigpy.types as t @@ -28,6 +27,7 @@ class ThirdRealityAccelCluster(CustomCluster): 0x0001: ("x_axis", t.int16s, True), 0x0002: ("y_axis", t.int16s, True), 0x0003: ("z_axis", t.int16s, True), + 0x0004: ("cooldown_period", t.uint16_t, True), } From 7156188214830ac327174f2bb249da917ac7decd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 03:28:01 +0000 Subject: [PATCH 11/51] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- zhaquirks/thirdreality/blind.py | 12 +++--- zhaquirks/thirdreality/door.py | 10 +++-- zhaquirks/thirdreality/motion.py | 4 +- zhaquirks/thirdreality/plug.py | 24 ++++++------ zhaquirks/thirdreality/switch.py | 61 +++++++++++++------------------ zhaquirks/thirdreality/vibrate.py | 1 + 6 files changed, 54 insertions(+), 58 deletions(-) diff --git a/zhaquirks/thirdreality/blind.py b/zhaquirks/thirdreality/blind.py index 6518a1aab6..7bb1d2dfdf 100644 --- a/zhaquirks/thirdreality/blind.py +++ b/zhaquirks/thirdreality/blind.py @@ -1,11 +1,12 @@ """Third Reality blind devices.""" from typing import Final + from zigpy.profiles import zha from zigpy.quirks import CustomDevice import zigpy.types as t -from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration, OnOff from zigpy.zcl.clusters.closures import WindowCovering +from zigpy.zcl.clusters.general import Basic, OnOff, Ota, PowerConfiguration from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef from zhaquirks import CustomCluster @@ -34,7 +35,6 @@ class ThirdRealityBlindCluster(CustomCluster): cluster_id = MANUFACTURER_SPECIFIC_CLUSTER_ID - class AttributeDefs(BaseAttributeDefs): """Attribute definitions.""" @@ -58,11 +58,11 @@ class blind(CustomDevice): Basic.cluster_id, PowerConfiguration.cluster_id, WindowCovering.cluster_id, - OnOff.cluster_id, + OnOff.cluster_id, ThirdRealityBlindCluster.cluster_id, ], OUTPUT_CLUSTERS: [ - OnOff.cluster_id, + OnOff.cluster_id, Ota.cluster_id, WindowCovering.cluster_id, ], @@ -78,11 +78,11 @@ class blind(CustomDevice): Basic.cluster_id, PowerConfiguration.cluster_id, WindowCovering.cluster_id, - OnOff.cluster_id, + OnOff.cluster_id, ThirdRealityBlindCluster, ], OUTPUT_CLUSTERS: [ - OnOff.cluster_id, + OnOff.cluster_id, Ota.cluster_id, WindowCovering.cluster_id, ], diff --git a/zhaquirks/thirdreality/door.py b/zhaquirks/thirdreality/door.py index 75e017a1cb..9073e3e31d 100644 --- a/zhaquirks/thirdreality/door.py +++ b/zhaquirks/thirdreality/door.py @@ -33,8 +33,10 @@ class ControlMode(t.uint16_t): DELAY: int = 10 + class BrightnessControlMode(t.uint16_t): """ThirdReality Acceleration Cluster.""" + pass @@ -52,6 +54,7 @@ class AttributeDefs(BaseAttributeDefs): is_manufacturer_specific=True, ) + class ThirdRealityDoorBrightnessCluster(CustomCluster): """ThirdReality Acceleration Cluster.""" @@ -70,6 +73,7 @@ class AttributeDefs(BaseAttributeDefs): is_manufacturer_specific=True, ) + class Door(CustomDevice): """ThirdReality Door device.""" @@ -86,7 +90,7 @@ class Door(CustomDevice): PowerConfiguration.cluster_id, IasZone.cluster_id, ThirdRealityDoorCluster.cluster_id, - ThirdRealityDoorBrightnessCluster.cluster_id + ThirdRealityDoorBrightnessCluster.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, @@ -102,9 +106,9 @@ class Door(CustomDevice): INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, - IasZone.cluster_id, + IasZone.cluster_id, ThirdRealityDoorCluster, - ThirdRealityDoorBrightnessCluster + ThirdRealityDoorBrightnessCluster, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, diff --git a/zhaquirks/thirdreality/motion.py b/zhaquirks/thirdreality/motion.py index 5af553905a..b51ed2d968 100644 --- a/zhaquirks/thirdreality/motion.py +++ b/zhaquirks/thirdreality/motion.py @@ -23,8 +23,10 @@ THIRD_REALITY_MOTION_BRIGHTNESS_CLUSTER_ID = 0xFF00 THIRD_REALITY_MOTION_DELAY_CLUSTER_ID = 0xFF01 + class ControlMode(t.uint16_t): """ThirdReality Acceleration Cluster.""" + pass @@ -43,11 +45,11 @@ class AttributeDefs(BaseAttributeDefs): ) - class ThirdRealityMotionBrightnessCluster(CustomCluster): """ThirdReality Acceleration Cluster.""" cluster_id = THIRD_REALITY_MOTION_BRIGHTNESS_CLUSTER_ID + class AttributeDefs(BaseAttributeDefs): """Attribute definitions.""" diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py index 5acf25d5ef..fab33b1443 100644 --- a/zhaquirks/thirdreality/plug.py +++ b/zhaquirks/thirdreality/plug.py @@ -1,13 +1,8 @@ """Third Reality Plug devices.""" -from typing import Final - from zigpy.profiles import zgp, zha from zigpy.quirks import CustomDevice -from zigpy.quirks.registry import DeviceRegistry -from zigpy.quirks.v2 import CustomDeviceV2, EntityMetadata import zigpy.types as t -from zigpy.zcl import ClusterType from zigpy.zcl.clusters.general import ( Basic, GreenPowerProxy, @@ -19,7 +14,6 @@ ) from zigpy.zcl.clusters.homeautomation import ElectricalMeasurement from zigpy.zcl.clusters.smartenergy import Metering -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef from zhaquirks import CustomCluster from zhaquirks.const import ( @@ -34,35 +28,39 @@ THIRD_REALITY_PLUG_CLUSTER_ID = 0xFF03 RESET_SUMMATION_DELIVERED_ATTR_ID = 0x0000 -ON_TO_OFF_DELAY_ATTR_ID = 0X0001 -OFF_TO_ON_DELAY_ATTR_ID = 0X0002 +ON_TO_OFF_DELAY_ATTR_ID = 0x0001 +OFF_TO_ON_DELAY_ATTR_ID = 0x0002 + class ControlMode(t.uint8_t): """Reset mode for not clear and clear.""" CLEAR = 1 + class ThirdRealityPlug1Cluster(CustomCluster): """ThirdReality Acceleration Cluster.""" cluster_id = THIRD_REALITY_PLUG_CLUSTER_ID - + attributes = { - 0x0001: ("on_to_off_delay", t.uint16_t, True), + 0x0001: ("on_to_off_delay", t.uint16_t, True), 0x0002: ("off_to_on_delay", t.uint16_t, True), } + class ThirdRealityPlug2Cluster(CustomCluster): """ThirdReality Acceleration Cluster.""" cluster_id = THIRD_REALITY_PLUG_CLUSTER_ID - + attributes = { 0x0000: ("reset_summation_delivered", t.uint8_t, True), - 0x0001: ("on_to_off_delay", t.uint16_t, True), + 0x0001: ("on_to_off_delay", t.uint16_t, True), 0x0002: ("off_to_on_delay", t.uint16_t, True), } - + + class Plug1(CustomDevice): """ThirdReality Plug device.""" diff --git a/zhaquirks/thirdreality/switch.py b/zhaquirks/thirdreality/switch.py index 7a6eeca665..1daea4ab93 100755 --- a/zhaquirks/thirdreality/switch.py +++ b/zhaquirks/thirdreality/switch.py @@ -1,19 +1,11 @@ """Third Reality switch devices.""" + from zigpy.profiles import zha from zigpy.quirks import CustomDevice -from zigpy.zcl.clusters.general import Basic, Groups, Identify, OnOff, Ota, Scenes, PowerConfiguration -from zigpy.zcl.clusters.homeautomation import Diagnostic - -from zigpy.zcl.clusters.general import ( - Basic, - GreenPowerProxy, - Groups, - Identify, - OnOff, - Ota, - Scenes, -) -from zhaquirks import PowerConfigurationCluster +import zigpy.types as t +from zigpy.zcl.clusters.general import Basic, OnOff, Ota, PowerConfiguration + +from zhaquirks import CustomCluster, PowerConfigurationCluster from zhaquirks.const import ( DEVICE_TYPE, ENDPOINTS, @@ -23,39 +15,40 @@ PROFILE_ID, ) from zhaquirks.thirdreality import THIRD_REALITY -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef -from zhaquirks import CustomCluster -import zigpy.types as t + class CustomPowerConfigurationCluster(PowerConfigurationCluster): """Custom PowerConfigurationCluster.""" + MIN_VOLTS = 2.1 MAX_VOLTS = 3.0 - - + THIRD_REALITY_SWITCH_CLUSTER_ID = 0xFF02 THIRD_REALITY_SWITCH_BRIGHTNESS_CLUSTER_ID = 0xFF00 - + + class ThirdRealitySwitchCluster(CustomCluster): """ThirdReality Acceleration Cluster.""" cluster_id = THIRD_REALITY_SWITCH_CLUSTER_ID attributes = { - 0x0002: ("back_off", t.uint16_t, True), - 0x0001: ("back_on", t.uint16_t, True), + 0x0002: ("back_off", t.uint16_t, True), + 0x0001: ("back_on", t.uint16_t, True), } + class ThirdRealitySwitchBrightnessCluster(CustomCluster): """ThirdReality Acceleration Cluster.""" cluster_id = THIRD_REALITY_SWITCH_BRIGHTNESS_CLUSTER_ID attributes = { - 0x0000: ("red_light", t.uint8_t, True), - 0x0002: ("blue_light", t.uint8_t, True), + 0x0000: ("red_light", t.uint8_t, True), + 0x0002: ("blue_light", t.uint8_t, True), } + class Switch(CustomDevice): """3RSS008Z device.""" @@ -71,12 +64,12 @@ class Switch(CustomDevice): DEVICE_TYPE: zha.DeviceType.ON_OFF_OUTPUT, INPUT_CLUSTERS: [ Basic.cluster_id, - ThirdRealitySwitchCluster.cluster_id, + ThirdRealitySwitchCluster.cluster_id, ThirdRealitySwitchBrightnessCluster.cluster_id, - PowerConfiguration.cluster_id, + PowerConfiguration.cluster_id, OnOff.cluster_id, ], - OUTPUT_CLUSTERS: [ + OUTPUT_CLUSTERS: [ Ota.cluster_id, OnOff.cluster_id, ], @@ -91,10 +84,10 @@ class Switch(CustomDevice): DEVICE_TYPE: zha.DeviceType.ON_OFF_OUTPUT, INPUT_CLUSTERS: [ Basic.cluster_id, - ThirdRealitySwitchCluster, + ThirdRealitySwitchCluster, ThirdRealitySwitchBrightnessCluster, PowerConfiguration.cluster_id, - OnOff.cluster_id, + OnOff.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, @@ -113,18 +106,16 @@ class Switch_Plus(CustomDevice): # device_type=2 device_version=1 # input_clusters=[0, 4, 3, 6, 5, 1, 2821] # output_clusters=[25]> - MODELS_INFO: [ - (THIRD_REALITY, "3RSS009Z") - ], + MODELS_INFO: [(THIRD_REALITY, "3RSS009Z")], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, INPUT_CLUSTERS: [ Basic.cluster_id, - ThirdRealitySwitchCluster.cluster_id, + ThirdRealitySwitchCluster.cluster_id, ThirdRealitySwitchBrightnessCluster.cluster_id, - PowerConfiguration.cluster_id, + PowerConfiguration.cluster_id, OnOff.cluster_id, ], OUTPUT_CLUSTERS: [ @@ -141,10 +132,10 @@ class Switch_Plus(CustomDevice): DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, INPUT_CLUSTERS: [ Basic.cluster_id, - ThirdRealitySwitchCluster, + ThirdRealitySwitchCluster, ThirdRealitySwitchBrightnessCluster, PowerConfiguration.cluster_id, - OnOff.cluster_id, + OnOff.cluster_id, ], OUTPUT_CLUSTERS: [ OnOff.cluster_id, diff --git a/zhaquirks/thirdreality/vibrate.py b/zhaquirks/thirdreality/vibrate.py index 4e01d7c40a..b0c7d7ccce 100644 --- a/zhaquirks/thirdreality/vibrate.py +++ b/zhaquirks/thirdreality/vibrate.py @@ -1,4 +1,5 @@ """Third Reality vibrate devices.""" + from zigpy.profiles import zha from zigpy.quirks import CustomDevice import zigpy.types as t From 45d3744ccdc7437f069060af4b38d09dfa8eeaec Mon Sep 17 00:00:00 2001 From: support <117250319+3reality-support@users.noreply.github.com> Date: Fri, 30 Aug 2024 11:39:15 +0800 Subject: [PATCH 12/51] Update door.py --- zhaquirks/thirdreality/door.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/zhaquirks/thirdreality/door.py b/zhaquirks/thirdreality/door.py index 9073e3e31d..b90ee48e36 100644 --- a/zhaquirks/thirdreality/door.py +++ b/zhaquirks/thirdreality/door.py @@ -61,6 +61,8 @@ class ThirdRealityDoorBrightnessCluster(CustomCluster): cluster_id = THIRD_REALITY_DOOR_BRIGHTNESS_CLUSTER_ID class AttributeDefs(BaseAttributeDefs): + """ThirdReality Acceleration Cluster.""" + red_light: Final = ZCLAttributeDef( id=BRIGHTNESS_RED_LIGHT_ATTR_ID, type=BrightnessControlMode, From 87a52180ea8ff8161943604f262ba913bc9712ad Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 03:39:28 +0000 Subject: [PATCH 13/51] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- zhaquirks/thirdreality/door.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zhaquirks/thirdreality/door.py b/zhaquirks/thirdreality/door.py index b90ee48e36..b885aae555 100644 --- a/zhaquirks/thirdreality/door.py +++ b/zhaquirks/thirdreality/door.py @@ -62,7 +62,7 @@ class ThirdRealityDoorBrightnessCluster(CustomCluster): class AttributeDefs(BaseAttributeDefs): """ThirdReality Acceleration Cluster.""" - + red_light: Final = ZCLAttributeDef( id=BRIGHTNESS_RED_LIGHT_ATTR_ID, type=BrightnessControlMode, From 503169add640e03d675f9c430f67a7e223a24580 Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 30 Aug 2024 14:04:13 +0800 Subject: [PATCH 14/51] add 3r project py --- zhaquirks/thirdreality/garage.py | 89 +++++++++ .../temperature_humidity and soil.py | 186 ++++++++++++++++++ 2 files changed, 275 insertions(+) create mode 100644 zhaquirks/thirdreality/garage.py create mode 100644 zhaquirks/thirdreality/temperature_humidity and soil.py diff --git a/zhaquirks/thirdreality/garage.py b/zhaquirks/thirdreality/garage.py new file mode 100644 index 0000000000..5ba5f50b63 --- /dev/null +++ b/zhaquirks/thirdreality/garage.py @@ -0,0 +1,89 @@ +"""Third Reality garage sensor devices.""" +from zigpy.profiles import zha +from typing import Final +from zigpy.quirks import CustomDevice +import zigpy.types as t +from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration +from zigpy.zcl.clusters.security import IasZone + +from zhaquirks import CustomCluster +from zhaquirks.const import ( + DEVICE_TYPE, + ENDPOINTS, + INPUT_CLUSTERS, + MODELS_INFO, + OUTPUT_CLUSTERS, + PROFILE_ID, +) +from zhaquirks.thirdreality import THIRD_REALITY +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + +THIRD_REALITY_GARAGE_CLUSTER_ID = 0xFF01 +DELAY_OPEN_ATTR_ID = 0x0000 +ZCL_CABRATION_ATTR_ID = 0x0003 + +class ControlMode(t.uint16_t): + """Reset mode for not clear and clear.""" + pass + + +class ThirdRealityGarageCluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" + + cluster_id = THIRD_REALITY_GARAGE_CLUSTER_ID + + class AttributeDefs(BaseAttributeDefs): + """ThirdReality Acceleration Cluster.""" + + delay_open: Final = ZCLAttributeDef( + id=DELAY_OPEN_ATTR_ID, + type=ControlMode, + is_manufacturer_specific=True + ) + + zcl_cabration: Final = ZCLAttributeDef( + id=ZCL_CABRATION_ATTR_ID, + type=ControlMode, + is_manufacturer_specific=True + ) + + + +class Garage(CustomDevice): + """ThirdReality garage device.""" + + signature = { + MODELS_INFO: [(THIRD_REALITY, "3RDTS01056Z")], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.IAS_ZONE, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + IasZone.cluster_id, + ThirdRealityGarageCluster.cluster_id, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.IAS_ZONE, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + IasZone.cluster_id, + ThirdRealityGarageCluster, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } diff --git a/zhaquirks/thirdreality/temperature_humidity and soil.py b/zhaquirks/thirdreality/temperature_humidity and soil.py new file mode 100644 index 0000000000..31b4ce2ca2 --- /dev/null +++ b/zhaquirks/thirdreality/temperature_humidity and soil.py @@ -0,0 +1,186 @@ +"""Third Reality Temperature humidity devices.""" +from typing import Final +from zigpy.profiles import zha +from zigpy.quirks import CustomDevice +import zigpy.types as t +from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration +from zigpy.zcl.clusters.measurement import TemperatureMeasurement ,RelativeHumidity +from zhaquirks import CustomCluster +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef +from zigpy.zcl.clusters.general import ( + Basic, + Identify, + Ota, +) + +from zhaquirks.const import ( + DEVICE_TYPE, + ENDPOINTS, + INPUT_CLUSTERS, + MODELS_INFO, + OUTPUT_CLUSTERS, + PROFILE_ID, +) +from zhaquirks.thirdreality import THIRD_REALITY + +THIRDREALITY_CLUSTER_ID = 0xFF01 + + +class ControlMode(t.int16s): + """ThirdReality Temperature humidity Cluster.""" + pass + +class ThirdRealityCluster(CustomCluster): + """ThirdReality Temperature humidity Cluster.""" + + cluster_id = THIRDREALITY_CLUSTER_ID + + class AttributeDefs(BaseAttributeDefs): + """Attribute definitions.""" + + Celsius_degree_calibration: Final = ZCLAttributeDef( + id=0x0031, + type=ControlMode, + is_manufacturer_specific=True, + ) + + humidity_calibration: Final = ZCLAttributeDef( + id=0x0032, + type=ControlMode, + is_manufacturer_specific=True, + ) + + Fahrenheit_degree_calibration: Final = ZCLAttributeDef( + id=0x0033, + type=ControlMode, + is_manufacturer_specific=True, + ) + + + +class Temperature_humidity(CustomDevice): + """ThirdReality Temperature humidity device.""" + + signature = { + MODELS_INFO: [(THIRD_REALITY, "3RTHS24BZ")], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + TemperatureMeasurement.cluster_id, + RelativeHumidity.cluster_id, + ThirdRealityCluster.cluster_id, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + TemperatureMeasurement.cluster_id, + RelativeHumidity.cluster_id, + ThirdRealityCluster, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } + + +class Temperature_humidity_lite(CustomDevice): + """ThirdReality Temperature humidity lite device.""" + + signature = { + MODELS_INFO: [(THIRD_REALITY, "3RTHS0224Z")], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + Identify.cluster_id, + TemperatureMeasurement.cluster_id, + RelativeHumidity.cluster_id, + ThirdRealityCluster.cluster_id, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + Identify.cluster_id, + TemperatureMeasurement.cluster_id, + RelativeHumidity.cluster_id, + ThirdRealityCluster, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } + + +class Soil_Moisture_Sensor(CustomDevice): + """ThirdReality Soil Moisture Sensor device.""" + + signature = { + MODELS_INFO: [(THIRD_REALITY, "3RSM0147Z")], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + TemperatureMeasurement.cluster_id, + RelativeHumidity.cluster_id, + ThirdRealityCluster.cluster_id, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + TemperatureMeasurement.cluster_id, + RelativeHumidity.cluster_id, + ThirdRealityCluster, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } From bded2c73c2ddbc5e468f4d4633b53a4e3a986e80 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 06:05:54 +0000 Subject: [PATCH 15/51] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- zhaquirks/thirdreality/garage.py | 6 ++-- .../temperature_humidity and soil.py | 28 +++++++++---------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/zhaquirks/thirdreality/garage.py b/zhaquirks/thirdreality/garage.py index 5ba5f50b63..d8541cd3c6 100644 --- a/zhaquirks/thirdreality/garage.py +++ b/zhaquirks/thirdreality/garage.py @@ -29,9 +29,9 @@ class ControlMode(t.uint16_t): class ThirdRealityGarageCluster(CustomCluster): """ThirdReality Acceleration Cluster.""" - + cluster_id = THIRD_REALITY_GARAGE_CLUSTER_ID - + class AttributeDefs(BaseAttributeDefs): """ThirdReality Acceleration Cluster.""" @@ -40,7 +40,7 @@ class AttributeDefs(BaseAttributeDefs): type=ControlMode, is_manufacturer_specific=True ) - + zcl_cabration: Final = ZCLAttributeDef( id=ZCL_CABRATION_ATTR_ID, type=ControlMode, diff --git a/zhaquirks/thirdreality/temperature_humidity and soil.py b/zhaquirks/thirdreality/temperature_humidity and soil.py index 31b4ce2ca2..538fe87848 100644 --- a/zhaquirks/thirdreality/temperature_humidity and soil.py +++ b/zhaquirks/thirdreality/temperature_humidity and soil.py @@ -1,19 +1,16 @@ """Third Reality Temperature humidity devices.""" + from typing import Final -from zigpy.profiles import zha -from zigpy.quirks import CustomDevice -import zigpy.types as t -from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration -from zigpy.zcl.clusters.measurement import TemperatureMeasurement ,RelativeHumidity -from zhaquirks import CustomCluster -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef -from zigpy.zcl.clusters.general import ( - Basic, - Identify, - Ota, -) -from zhaquirks.const import ( +from zigpy.profiles import zha +from zigpy.quirks import CustomDevice +import zigpy.types as t +from zigpy.zcl.clusters.general import Basic, Identify, Ota, PowerConfiguration +from zigpy.zcl.clusters.measurement import RelativeHumidity, TemperatureMeasurement +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + +from zhaquirks import CustomCluster +from zhaquirks.const import ( DEVICE_TYPE, ENDPOINTS, INPUT_CLUSTERS, @@ -21,15 +18,17 @@ OUTPUT_CLUSTERS, PROFILE_ID, ) -from zhaquirks.thirdreality import THIRD_REALITY +from zhaquirks.thirdreality import THIRD_REALITY THIRDREALITY_CLUSTER_ID = 0xFF01 class ControlMode(t.int16s): """ThirdReality Temperature humidity Cluster.""" + pass + class ThirdRealityCluster(CustomCluster): """ThirdReality Temperature humidity Cluster.""" @@ -57,7 +56,6 @@ class AttributeDefs(BaseAttributeDefs): ) - class Temperature_humidity(CustomDevice): """ThirdReality Temperature humidity device.""" From 2e84798cc3f35cdf1ac1ae5de3a829a33c807e99 Mon Sep 17 00:00:00 2001 From: support <117250319+3reality-support@users.noreply.github.com> Date: Fri, 30 Aug 2024 14:14:08 +0800 Subject: [PATCH 16/51] Update garage.py --- zhaquirks/thirdreality/garage.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/zhaquirks/thirdreality/garage.py b/zhaquirks/thirdreality/garage.py index d8541cd3c6..4d21a1e8e3 100644 --- a/zhaquirks/thirdreality/garage.py +++ b/zhaquirks/thirdreality/garage.py @@ -26,25 +26,24 @@ class ControlMode(t.uint16_t): """Reset mode for not clear and clear.""" pass - class ThirdRealityGarageCluster(CustomCluster): """ThirdReality Acceleration Cluster.""" cluster_id = THIRD_REALITY_GARAGE_CLUSTER_ID class AttributeDefs(BaseAttributeDefs): - """ThirdReality Acceleration Cluster.""" + """ThirdReality Acceleration Cluster.""" delay_open: Final = ZCLAttributeDef( - id=DELAY_OPEN_ATTR_ID, - type=ControlMode, - is_manufacturer_specific=True + id=DELAY_OPEN_ATTR_ID, + type=ControlMode, + is_manufacturer_specific=True ) zcl_cabration: Final = ZCLAttributeDef( - id=ZCL_CABRATION_ATTR_ID, - type=ControlMode, - is_manufacturer_specific=True + id=ZCL_CABRATION_ATTR_ID, + type=ControlMode, + is_manufacturer_specific=True ) From 62dcafde283cb78875024237ec8492a7e40a056d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 06:14:23 +0000 Subject: [PATCH 17/51] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- zhaquirks/thirdreality/garage.py | 34 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/zhaquirks/thirdreality/garage.py b/zhaquirks/thirdreality/garage.py index 4d21a1e8e3..7fcf89dd99 100644 --- a/zhaquirks/thirdreality/garage.py +++ b/zhaquirks/thirdreality/garage.py @@ -1,10 +1,13 @@ """Third Reality garage sensor devices.""" -from zigpy.profiles import zha + from typing import Final + +from zigpy.profiles import zha from zigpy.quirks import CustomDevice import zigpy.types as t from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration from zigpy.zcl.clusters.security import IasZone +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef from zhaquirks import CustomCluster from zhaquirks.const import ( @@ -16,36 +19,33 @@ PROFILE_ID, ) from zhaquirks.thirdreality import THIRD_REALITY -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef THIRD_REALITY_GARAGE_CLUSTER_ID = 0xFF01 DELAY_OPEN_ATTR_ID = 0x0000 ZCL_CABRATION_ATTR_ID = 0x0003 + class ControlMode(t.uint16_t): """Reset mode for not clear and clear.""" + pass -class ThirdRealityGarageCluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - cluster_id = THIRD_REALITY_GARAGE_CLUSTER_ID +class ThirdRealityGarageCluster(CustomCluster): + """ThirdReality Acceleration Cluster.""" - class AttributeDefs(BaseAttributeDefs): - """ThirdReality Acceleration Cluster.""" + cluster_id = THIRD_REALITY_GARAGE_CLUSTER_ID - delay_open: Final = ZCLAttributeDef( - id=DELAY_OPEN_ATTR_ID, - type=ControlMode, - is_manufacturer_specific=True - ) + class AttributeDefs(BaseAttributeDefs): + """ThirdReality Acceleration Cluster.""" - zcl_cabration: Final = ZCLAttributeDef( - id=ZCL_CABRATION_ATTR_ID, - type=ControlMode, - is_manufacturer_specific=True - ) + delay_open: Final = ZCLAttributeDef( + id=DELAY_OPEN_ATTR_ID, type=ControlMode, is_manufacturer_specific=True + ) + zcl_cabration: Final = ZCLAttributeDef( + id=ZCL_CABRATION_ATTR_ID, type=ControlMode, is_manufacturer_specific=True + ) class Garage(CustomDevice): From a22f4e9809605968a8adf70e044a7718db08f763 Mon Sep 17 00:00:00 2001 From: support <117250319+3reality-support@users.noreply.github.com> Date: Fri, 30 Aug 2024 14:22:30 +0800 Subject: [PATCH 18/51] Rename temperature_humidity and soil.py to temperature_humidity_and_soil.py --- ...ture_humidity and soil.py => temperature_humidity_and_soil.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename zhaquirks/thirdreality/{temperature_humidity and soil.py => temperature_humidity_and_soil.py} (100%) diff --git a/zhaquirks/thirdreality/temperature_humidity and soil.py b/zhaquirks/thirdreality/temperature_humidity_and_soil.py similarity index 100% rename from zhaquirks/thirdreality/temperature_humidity and soil.py rename to zhaquirks/thirdreality/temperature_humidity_and_soil.py From ed10c06ae78d8e4e7840bddaaa6979af35022c2b Mon Sep 17 00:00:00 2001 From: jintj Date: Wed, 27 Nov 2024 14:59:56 +0800 Subject: [PATCH 19/51] merge --- zhaquirks/thirdreality/garage.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/zhaquirks/thirdreality/garage.py b/zhaquirks/thirdreality/garage.py index 7fcf89dd99..61305a6dec 100644 --- a/zhaquirks/thirdreality/garage.py +++ b/zhaquirks/thirdreality/garage.py @@ -30,18 +30,25 @@ class ControlMode(t.uint16_t): pass - class ThirdRealityGarageCluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" + """ThirdReality Acceleration Cluster.""" - cluster_id = THIRD_REALITY_GARAGE_CLUSTER_ID + cluster_id = THIRD_REALITY_GARAGE_CLUSTER_ID - class AttributeDefs(BaseAttributeDefs): + class AttributeDefs(BaseAttributeDefs): """ThirdReality Acceleration Cluster.""" - delay_open: Final = ZCLAttributeDef( - id=DELAY_OPEN_ATTR_ID, type=ControlMode, is_manufacturer_specific=True - ) + delay_open: Final = ZCLAttributeDef( + id=DELAY_OPEN_ATTR_ID, + type=ControlMode, + is_manufacturer_specific=True + ) + + zcl_cabration: Final = ZCLAttributeDef( + id=ZCL_CABRATION_ATTR_ID, + type=ControlMode, + is_manufacturer_specific=True + ) zcl_cabration: Final = ZCLAttributeDef( id=ZCL_CABRATION_ATTR_ID, type=ControlMode, is_manufacturer_specific=True From 316640ad7e68e5d0e6511a56d060aa60d82eb01d Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 10 Jan 2025 14:17:17 +0800 Subject: [PATCH 20/51] update --- zhaquirks/thirdreality/blind.py | 91 --------- zhaquirks/thirdreality/door.py | 120 ------------ zhaquirks/thirdreality/garage.py | 95 --------- zhaquirks/thirdreality/motion.py | 110 ----------- .../temperature_humidity_and_soil.py | 184 ------------------ zhaquirks/thirdreality/waterleak.py | 119 ----------- 6 files changed, 719 deletions(-) delete mode 100644 zhaquirks/thirdreality/blind.py delete mode 100644 zhaquirks/thirdreality/door.py delete mode 100644 zhaquirks/thirdreality/garage.py delete mode 100644 zhaquirks/thirdreality/motion.py delete mode 100644 zhaquirks/thirdreality/temperature_humidity_and_soil.py delete mode 100644 zhaquirks/thirdreality/waterleak.py diff --git a/zhaquirks/thirdreality/blind.py b/zhaquirks/thirdreality/blind.py deleted file mode 100644 index 7bb1d2dfdf..0000000000 --- a/zhaquirks/thirdreality/blind.py +++ /dev/null @@ -1,91 +0,0 @@ -"""Third Reality blind devices.""" - -from typing import Final - -from zigpy.profiles import zha -from zigpy.quirks import CustomDevice -import zigpy.types as t -from zigpy.zcl.clusters.closures import WindowCovering -from zigpy.zcl.clusters.general import Basic, OnOff, Ota, PowerConfiguration -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef - -from zhaquirks import CustomCluster -from zhaquirks.const import ( - DEVICE_TYPE, - ENDPOINTS, - INPUT_CLUSTERS, - MODELS_INFO, - OUTPUT_CLUSTERS, - PROFILE_ID, -) -from zhaquirks.thirdreality import THIRD_REALITY - -MANUFACTURER_SPECIFIC_CLUSTER_ID = 0xFFF1 - - -class ControlMode(t.uint8_t): - """Reset mode for not clear and clear.""" - - NOT = 0 - CLEAR = 1 - - -class ThirdRealityBlindCluster(CustomCluster): - """ThirdReality Blind Cluster.""" - - cluster_id = MANUFACTURER_SPECIFIC_CLUSTER_ID - - class AttributeDefs(BaseAttributeDefs): - """Attribute definitions.""" - - infrared_off: Final = ZCLAttributeDef( - id=0x0000, - type=ControlMode, - is_manufacturer_specific=True, - ) - - -class blind(CustomDevice): - """ThirdReality blind device.""" - - signature = { - MODELS_INFO: [(THIRD_REALITY, "3RSB015BZ")], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.WINDOW_COVERING_DEVICE, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - WindowCovering.cluster_id, - OnOff.cluster_id, - ThirdRealityBlindCluster.cluster_id, - ], - OUTPUT_CLUSTERS: [ - OnOff.cluster_id, - Ota.cluster_id, - WindowCovering.cluster_id, - ], - } - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.WINDOW_COVERING_DEVICE, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - WindowCovering.cluster_id, - OnOff.cluster_id, - ThirdRealityBlindCluster, - ], - OUTPUT_CLUSTERS: [ - OnOff.cluster_id, - Ota.cluster_id, - WindowCovering.cluster_id, - ], - } - }, - } diff --git a/zhaquirks/thirdreality/door.py b/zhaquirks/thirdreality/door.py deleted file mode 100644 index b885aae555..0000000000 --- a/zhaquirks/thirdreality/door.py +++ /dev/null @@ -1,120 +0,0 @@ -"""Third Reality Door devices.""" - -from typing import Final - -from zigpy.profiles import zha -from zigpy.quirks import CustomDevice -import zigpy.types as t -from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration -from zigpy.zcl.clusters.security import IasZone -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef - -from zhaquirks import CustomCluster -from zhaquirks.const import ( - DEVICE_TYPE, - ENDPOINTS, - INPUT_CLUSTERS, - MODELS_INFO, - OUTPUT_CLUSTERS, - PROFILE_ID, -) -from zhaquirks.thirdreality import THIRD_REALITY - -THIRD_REALITY_DOOR_CLUSTER_ID = 0xFF01 -DELAY_OPEN_ATTR_ID = 0x0000 - -THIRD_REALITY_DOOR_BRIGHTNESS_CLUSTER_ID = 0xFF00 -BRIGHTNESS_RED_LIGHT_ATTR_ID = 0x0000 -BRIGHTNESS_BLUE_LIGHT_ATTR_ID = 0x0002 - - -class ControlMode(t.uint16_t): - """Reset mode for not clear and clear.""" - - DELAY: int = 10 - - -class BrightnessControlMode(t.uint16_t): - """ThirdReality Acceleration Cluster.""" - - pass - - -class ThirdRealityDoorCluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - - cluster_id = THIRD_REALITY_DOOR_CLUSTER_ID - - class AttributeDefs(BaseAttributeDefs): - """Attribute definitions.""" - - delay_open: Final = ZCLAttributeDef( - id=DELAY_OPEN_ATTR_ID, - type=ControlMode, - is_manufacturer_specific=True, - ) - - -class ThirdRealityDoorBrightnessCluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - - cluster_id = THIRD_REALITY_DOOR_BRIGHTNESS_CLUSTER_ID - - class AttributeDefs(BaseAttributeDefs): - """ThirdReality Acceleration Cluster.""" - - red_light: Final = ZCLAttributeDef( - id=BRIGHTNESS_RED_LIGHT_ATTR_ID, - type=BrightnessControlMode, - is_manufacturer_specific=True, - ) - - blue_light: Final = ZCLAttributeDef( - id=BRIGHTNESS_BLUE_LIGHT_ATTR_ID, - type=BrightnessControlMode, - is_manufacturer_specific=True, - ) - - -class Door(CustomDevice): - """ThirdReality Door device.""" - - signature = { - MODELS_INFO: [ - (THIRD_REALITY, "3RDS17BZ"), - ], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.IAS_ZONE, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - IasZone.cluster_id, - ThirdRealityDoorCluster.cluster_id, - ThirdRealityDoorBrightnessCluster.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - }, - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.OCCUPANCY_SENSOR, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - IasZone.cluster_id, - ThirdRealityDoorCluster, - ThirdRealityDoorBrightnessCluster, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - }, - }, - } diff --git a/zhaquirks/thirdreality/garage.py b/zhaquirks/thirdreality/garage.py deleted file mode 100644 index 61305a6dec..0000000000 --- a/zhaquirks/thirdreality/garage.py +++ /dev/null @@ -1,95 +0,0 @@ -"""Third Reality garage sensor devices.""" - -from typing import Final - -from zigpy.profiles import zha -from zigpy.quirks import CustomDevice -import zigpy.types as t -from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration -from zigpy.zcl.clusters.security import IasZone -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef - -from zhaquirks import CustomCluster -from zhaquirks.const import ( - DEVICE_TYPE, - ENDPOINTS, - INPUT_CLUSTERS, - MODELS_INFO, - OUTPUT_CLUSTERS, - PROFILE_ID, -) -from zhaquirks.thirdreality import THIRD_REALITY - -THIRD_REALITY_GARAGE_CLUSTER_ID = 0xFF01 -DELAY_OPEN_ATTR_ID = 0x0000 -ZCL_CABRATION_ATTR_ID = 0x0003 - - -class ControlMode(t.uint16_t): - """Reset mode for not clear and clear.""" - - pass - -class ThirdRealityGarageCluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - - cluster_id = THIRD_REALITY_GARAGE_CLUSTER_ID - - class AttributeDefs(BaseAttributeDefs): - """ThirdReality Acceleration Cluster.""" - - delay_open: Final = ZCLAttributeDef( - id=DELAY_OPEN_ATTR_ID, - type=ControlMode, - is_manufacturer_specific=True - ) - - zcl_cabration: Final = ZCLAttributeDef( - id=ZCL_CABRATION_ATTR_ID, - type=ControlMode, - is_manufacturer_specific=True - ) - - zcl_cabration: Final = ZCLAttributeDef( - id=ZCL_CABRATION_ATTR_ID, type=ControlMode, is_manufacturer_specific=True - ) - - -class Garage(CustomDevice): - """ThirdReality garage device.""" - - signature = { - MODELS_INFO: [(THIRD_REALITY, "3RDTS01056Z")], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.IAS_ZONE, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - IasZone.cluster_id, - ThirdRealityGarageCluster.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.IAS_ZONE, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - IasZone.cluster_id, - ThirdRealityGarageCluster, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } diff --git a/zhaquirks/thirdreality/motion.py b/zhaquirks/thirdreality/motion.py deleted file mode 100644 index b51ed2d968..0000000000 --- a/zhaquirks/thirdreality/motion.py +++ /dev/null @@ -1,110 +0,0 @@ -"""Third Reality Motion devices.""" - -from typing import Final - -from zigpy.profiles import zha -from zigpy.quirks import CustomDevice -import zigpy.types as t -from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration -from zigpy.zcl.clusters.security import IasZone -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef - -from zhaquirks import CustomCluster -from zhaquirks.const import ( - DEVICE_TYPE, - ENDPOINTS, - INPUT_CLUSTERS, - MODELS_INFO, - OUTPUT_CLUSTERS, - PROFILE_ID, -) -from zhaquirks.thirdreality import THIRD_REALITY - -THIRD_REALITY_MOTION_BRIGHTNESS_CLUSTER_ID = 0xFF00 -THIRD_REALITY_MOTION_DELAY_CLUSTER_ID = 0xFF01 - - -class ControlMode(t.uint16_t): - """ThirdReality Acceleration Cluster.""" - - pass - - -class ThirdRealityMotionCluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - - cluster_id = THIRD_REALITY_MOTION_DELAY_CLUSTER_ID - - class AttributeDefs(BaseAttributeDefs): - """Attribute definitions.""" - - detected_to_undetected_delay: Final = ZCLAttributeDef( - id=0x0001, - type=ControlMode, - is_manufacturer_specific=True, - ) - - -class ThirdRealityMotionBrightnessCluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - - cluster_id = THIRD_REALITY_MOTION_BRIGHTNESS_CLUSTER_ID - - class AttributeDefs(BaseAttributeDefs): - """Attribute definitions.""" - - red_light: Final = ZCLAttributeDef( - id=0x0000, - type=ControlMode, - is_manufacturer_specific=True, - ) - - blue_light: Final = ZCLAttributeDef( - id=0x0002, - type=ControlMode, - is_manufacturer_specific=True, - ) - - -class Motion(CustomDevice): - """ThirdReality Motion device.""" - - signature = { - MODELS_INFO: [ - (THIRD_REALITY, "3RMS16BZ"), - ], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.IAS_ZONE, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - IasZone.cluster_id, - ThirdRealityMotionCluster.cluster_id, - ThirdRealityMotionBrightnessCluster.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - }, - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.IAS_ZONE, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - IasZone.cluster_id, - ThirdRealityMotionCluster, - ThirdRealityMotionBrightnessCluster, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - }, - }, - } diff --git a/zhaquirks/thirdreality/temperature_humidity_and_soil.py b/zhaquirks/thirdreality/temperature_humidity_and_soil.py deleted file mode 100644 index 538fe87848..0000000000 --- a/zhaquirks/thirdreality/temperature_humidity_and_soil.py +++ /dev/null @@ -1,184 +0,0 @@ -"""Third Reality Temperature humidity devices.""" - -from typing import Final - -from zigpy.profiles import zha -from zigpy.quirks import CustomDevice -import zigpy.types as t -from zigpy.zcl.clusters.general import Basic, Identify, Ota, PowerConfiguration -from zigpy.zcl.clusters.measurement import RelativeHumidity, TemperatureMeasurement -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef - -from zhaquirks import CustomCluster -from zhaquirks.const import ( - DEVICE_TYPE, - ENDPOINTS, - INPUT_CLUSTERS, - MODELS_INFO, - OUTPUT_CLUSTERS, - PROFILE_ID, -) -from zhaquirks.thirdreality import THIRD_REALITY - -THIRDREALITY_CLUSTER_ID = 0xFF01 - - -class ControlMode(t.int16s): - """ThirdReality Temperature humidity Cluster.""" - - pass - - -class ThirdRealityCluster(CustomCluster): - """ThirdReality Temperature humidity Cluster.""" - - cluster_id = THIRDREALITY_CLUSTER_ID - - class AttributeDefs(BaseAttributeDefs): - """Attribute definitions.""" - - Celsius_degree_calibration: Final = ZCLAttributeDef( - id=0x0031, - type=ControlMode, - is_manufacturer_specific=True, - ) - - humidity_calibration: Final = ZCLAttributeDef( - id=0x0032, - type=ControlMode, - is_manufacturer_specific=True, - ) - - Fahrenheit_degree_calibration: Final = ZCLAttributeDef( - id=0x0033, - type=ControlMode, - is_manufacturer_specific=True, - ) - - -class Temperature_humidity(CustomDevice): - """ThirdReality Temperature humidity device.""" - - signature = { - MODELS_INFO: [(THIRD_REALITY, "3RTHS24BZ")], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - TemperatureMeasurement.cluster_id, - RelativeHumidity.cluster_id, - ThirdRealityCluster.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - TemperatureMeasurement.cluster_id, - RelativeHumidity.cluster_id, - ThirdRealityCluster, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } - - -class Temperature_humidity_lite(CustomDevice): - """ThirdReality Temperature humidity lite device.""" - - signature = { - MODELS_INFO: [(THIRD_REALITY, "3RTHS0224Z")], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - Identify.cluster_id, - TemperatureMeasurement.cluster_id, - RelativeHumidity.cluster_id, - ThirdRealityCluster.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - Identify.cluster_id, - TemperatureMeasurement.cluster_id, - RelativeHumidity.cluster_id, - ThirdRealityCluster, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } - - -class Soil_Moisture_Sensor(CustomDevice): - """ThirdReality Soil Moisture Sensor device.""" - - signature = { - MODELS_INFO: [(THIRD_REALITY, "3RSM0147Z")], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - TemperatureMeasurement.cluster_id, - RelativeHumidity.cluster_id, - ThirdRealityCluster.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - TemperatureMeasurement.cluster_id, - RelativeHumidity.cluster_id, - ThirdRealityCluster, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } diff --git a/zhaquirks/thirdreality/waterleak.py b/zhaquirks/thirdreality/waterleak.py deleted file mode 100644 index 065064c5fb..0000000000 --- a/zhaquirks/thirdreality/waterleak.py +++ /dev/null @@ -1,119 +0,0 @@ -"""Third Reality WaterLeak devices.""" - -from typing import Final - -from zigpy.profiles import zha -from zigpy.quirks import CustomDevice -import zigpy.types as t -from zigpy.zcl.clusters.general import Basic, OnOff, Ota, PowerConfiguration -from zigpy.zcl.clusters.security import IasZone -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef - -from zhaquirks import CustomCluster -from zhaquirks.const import ( - DEVICE_TYPE, - ENDPOINTS, - INPUT_CLUSTERS, - MODELS_INFO, - OUTPUT_CLUSTERS, - PROFILE_ID, -) -from zhaquirks.thirdreality import THIRD_REALITY - -THIRD_REALITY_WATERLEAK_CLUSTER_ID = 0xFF01 -THIRD_REALITY_WATERLEAK_BRIGHTNESS_CLUSTER_ID = 0xFF00 -DELAY_OPEN_ATTR_ID = 0x0000 - - -class ControlMode(t.uint8_t): - """ThirdReality Acceleration Cluster.""" - - pass - - -class ThirdRealityWaterLeakCluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - - cluster_id = THIRD_REALITY_WATERLEAK_CLUSTER_ID - - class AttributeDefs(BaseAttributeDefs): - """Attribute definitions.""" - - siren_on_off: Final = ZCLAttributeDef( - id=0x0010, - type=ControlMode, - is_manufacturer_specific=True, - ) - - siren_mintues: Final = ZCLAttributeDef( - id=0x0011, - type=ControlMode, - is_manufacturer_specific=True, - ) - - -class ThirdRealityWaterLeakBrightnessCluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - - cluster_id = THIRD_REALITY_WATERLEAK_BRIGHTNESS_CLUSTER_ID - - class AttributeDefs(BaseAttributeDefs): - """Attribute definitions.""" - - redlight: Final = ZCLAttributeDef( - id=0x0000, - type=ControlMode, - is_manufacturer_specific=True, - ) - - bluelight: Final = ZCLAttributeDef( - id=0x0002, - type=ControlMode, - is_manufacturer_specific=True, - ) - - -class WaterLeak(CustomDevice): - """ThirdReality WaterLeak device.""" - - signature = { - MODELS_INFO: [ - (THIRD_REALITY, "3RWS18BZ"), - ], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.IAS_ZONE, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - IasZone.cluster_id, - ThirdRealityWaterLeakCluster.cluster_id, - ThirdRealityWaterLeakBrightnessCluster.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - OnOff.cluster_id, - ], - }, - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.IAS_ZONE, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - IasZone.cluster_id, - ThirdRealityWaterLeakCluster, - ThirdRealityWaterLeakBrightnessCluster, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - OnOff.cluster_id, - ], - }, - }, - } From 1d3de26396549f25089b87b01c0a5fb8affd67dc Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 10 Jan 2025 14:24:09 +0800 Subject: [PATCH 21/51] update --- zhaquirks/thirdreality/plug.py | 212 ++++-------------------------- zhaquirks/thirdreality/switch.py | 94 +++++-------- zhaquirks/thirdreality/vibrate.py | 1 - 3 files changed, 62 insertions(+), 245 deletions(-) diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py index fab33b1443..ea27f0f2fe 100644 --- a/zhaquirks/thirdreality/plug.py +++ b/zhaquirks/thirdreality/plug.py @@ -1,192 +1,38 @@ -"""Third Reality Plug devices.""" +"""Third Reality plug devices.""" -from zigpy.profiles import zgp, zha -from zigpy.quirks import CustomDevice -import zigpy.types as t -from zigpy.zcl.clusters.general import ( - Basic, - GreenPowerProxy, - Groups, - Identify, - OnOff, - Ota, - Scenes, -) -from zigpy.zcl.clusters.homeautomation import ElectricalMeasurement -from zigpy.zcl.clusters.smartenergy import Metering - -from zhaquirks import CustomCluster -from zhaquirks.const import ( - DEVICE_TYPE, - ENDPOINTS, - INPUT_CLUSTERS, - MODELS_INFO, - OUTPUT_CLUSTERS, - PROFILE_ID, -) -from zhaquirks.thirdreality import THIRD_REALITY - -THIRD_REALITY_PLUG_CLUSTER_ID = 0xFF03 -RESET_SUMMATION_DELIVERED_ATTR_ID = 0x0000 -ON_TO_OFF_DELAY_ATTR_ID = 0x0001 -OFF_TO_ON_DELAY_ATTR_ID = 0x0002 - - -class ControlMode(t.uint8_t): - """Reset mode for not clear and clear.""" - - CLEAR = 1 +from typing import Final +from zigpy.quirks import CustomCluster +from zigpy.quirks.v2 import QuirkBuilder +import zigpy.types as t +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef -class ThirdRealityPlug1Cluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - - cluster_id = THIRD_REALITY_PLUG_CLUSTER_ID - - attributes = { - 0x0001: ("on_to_off_delay", t.uint16_t, True), - 0x0002: ("off_to_on_delay", t.uint16_t, True), - } - - -class ThirdRealityPlug2Cluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - - cluster_id = THIRD_REALITY_PLUG_CLUSTER_ID - - attributes = { - 0x0000: ("reset_summation_delivered", t.uint8_t, True), - 0x0001: ("on_to_off_delay", t.uint16_t, True), - 0x0002: ("off_to_on_delay", t.uint16_t, True), - } +class ThirdRealityPlugCluster(CustomCluster): + """Third Reality's plug private cluster.""" -class Plug1(CustomDevice): - """ThirdReality Plug device.""" + cluster_id = 0xFF03 - signature = { - MODELS_INFO: [ - (THIRD_REALITY, "3RSP019BZ"), - ], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.SMART_PLUG, - INPUT_CLUSTERS: [ - Basic.cluster_id, - Identify.cluster_id, - Groups.cluster_id, - Scenes.cluster_id, - OnOff.cluster_id, - ThirdRealityPlug1Cluster.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - }, - 242: { - PROFILE_ID: zgp.PROFILE_ID, - DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, - INPUT_CLUSTERS: [], - OUTPUT_CLUSTERS: [ - GreenPowerProxy.cluster_id, - ], - }, - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.SMART_PLUG, - INPUT_CLUSTERS: [ - Basic.cluster_id, - Identify.cluster_id, - Groups.cluster_id, - Scenes.cluster_id, - OnOff.cluster_id, - Metering.cluster_id, - ElectricalMeasurement.cluster_id, - ThirdRealityPlug1Cluster, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - }, - 242: { - PROFILE_ID: zgp.PROFILE_ID, - DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, - INPUT_CLUSTERS: [], - OUTPUT_CLUSTERS: [ - GreenPowerProxy.cluster_id, - ], - }, - }, - } + class AttributeDefs(BaseAttributeDefs): + """Define the attributes of a private cluster.""" + reset_summation_delivered: Final = ZCLAttributeDef( + id=0x0000, + type=t.uint8_t, + is_manufacturer_specific=True, + ) -class Plug2(CustomDevice): - """ThirdReality Plug device.""" - signature = { - MODELS_INFO: [ - (THIRD_REALITY, "3RSP02028BZ"), - (THIRD_REALITY, "3RSPE01044BZ"), - ], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.SMART_PLUG, - INPUT_CLUSTERS: [ - Basic.cluster_id, - Identify.cluster_id, - Groups.cluster_id, - Scenes.cluster_id, - OnOff.cluster_id, - Metering.cluster_id, - ElectricalMeasurement.cluster_id, - ThirdRealityPlug2Cluster.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - }, - 242: { - PROFILE_ID: zgp.PROFILE_ID, - DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, - INPUT_CLUSTERS: [], - OUTPUT_CLUSTERS: [ - GreenPowerProxy.cluster_id, - ], - }, - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.SMART_PLUG, - INPUT_CLUSTERS: [ - Basic.cluster_id, - Identify.cluster_id, - Groups.cluster_id, - Scenes.cluster_id, - OnOff.cluster_id, - Metering.cluster_id, - ElectricalMeasurement.cluster_id, - ThirdRealityPlug2Cluster, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - }, - 242: { - PROFILE_ID: zgp.PROFILE_ID, - DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, - INPUT_CLUSTERS: [], - OUTPUT_CLUSTERS: [ - GreenPowerProxy.cluster_id, - ], - }, - }, - } +( + QuirkBuilder("Third Reality, Inc", "3RSP02028BZ") + .also_applies_to("Third Reality, Inc", "3RSPE01044BZ") + .replaces(ThirdRealityPlugCluster) + .write_attr_button( + attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, + attribute_value=0x01, + cluster_id=ThirdRealityPlugCluster.cluster_id, + translation_key="reset_summation_delivered", + fallback_name="Reset summation delivered", + ) + .add_to_registry() +) diff --git a/zhaquirks/thirdreality/switch.py b/zhaquirks/thirdreality/switch.py index 1daea4ab93..a56a1c9e91 100755 --- a/zhaquirks/thirdreality/switch.py +++ b/zhaquirks/thirdreality/switch.py @@ -2,10 +2,10 @@ from zigpy.profiles import zha from zigpy.quirks import CustomDevice -import zigpy.types as t -from zigpy.zcl.clusters.general import Basic, OnOff, Ota, PowerConfiguration +from zigpy.zcl.clusters.general import Basic, Groups, Identify, OnOff, Ota, Scenes +from zigpy.zcl.clusters.homeautomation import Diagnostic -from zhaquirks import CustomCluster, PowerConfigurationCluster +from zhaquirks import PowerConfigurationCluster from zhaquirks.const import ( DEVICE_TYPE, ENDPOINTS, @@ -24,31 +24,6 @@ class CustomPowerConfigurationCluster(PowerConfigurationCluster): MAX_VOLTS = 3.0 -THIRD_REALITY_SWITCH_CLUSTER_ID = 0xFF02 -THIRD_REALITY_SWITCH_BRIGHTNESS_CLUSTER_ID = 0xFF00 - - -class ThirdRealitySwitchCluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - - cluster_id = THIRD_REALITY_SWITCH_CLUSTER_ID - - attributes = { - 0x0002: ("back_off", t.uint16_t, True), - 0x0001: ("back_on", t.uint16_t, True), - } - - -class ThirdRealitySwitchBrightnessCluster(CustomCluster): - """ThirdReality Acceleration Cluster.""" - - cluster_id = THIRD_REALITY_SWITCH_BRIGHTNESS_CLUSTER_ID - attributes = { - 0x0000: ("red_light", t.uint8_t, True), - 0x0002: ("blue_light", t.uint8_t, True), - } - - class Switch(CustomDevice): """3RSS008Z device.""" @@ -64,15 +39,14 @@ class Switch(CustomDevice): DEVICE_TYPE: zha.DeviceType.ON_OFF_OUTPUT, INPUT_CLUSTERS: [ Basic.cluster_id, - ThirdRealitySwitchCluster.cluster_id, - ThirdRealitySwitchBrightnessCluster.cluster_id, - PowerConfiguration.cluster_id, + Identify.cluster_id, + Groups.cluster_id, + Scenes.cluster_id, OnOff.cluster_id, - ], - OUTPUT_CLUSTERS: [ Ota.cluster_id, - OnOff.cluster_id, + CustomPowerConfigurationCluster.cluster_id, ], + OUTPUT_CLUSTERS: [CustomPowerConfigurationCluster.cluster_id], } }, } @@ -84,63 +58,61 @@ class Switch(CustomDevice): DEVICE_TYPE: zha.DeviceType.ON_OFF_OUTPUT, INPUT_CLUSTERS: [ Basic.cluster_id, - ThirdRealitySwitchCluster, - ThirdRealitySwitchBrightnessCluster, - PowerConfiguration.cluster_id, + Identify.cluster_id, + Groups.cluster_id, + Scenes.cluster_id, OnOff.cluster_id, - ], - OUTPUT_CLUSTERS: [ Ota.cluster_id, - OnOff.cluster_id, + CustomPowerConfigurationCluster, ], + OUTPUT_CLUSTERS: [CustomPowerConfigurationCluster.cluster_id], } } } -class Switch_Plus(CustomDevice): - """RealitySwitch Plus (3RSS009Z) device.""" +class SwitchPlus(Switch): + """RealitySwitch Plus (3RSS008Z) device.""" signature = { # - MODELS_INFO: [(THIRD_REALITY, "3RSS009Z")], + MODELS_INFO: [(THIRD_REALITY, "3RSS008Z")], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, + DEVICE_TYPE: zha.DeviceType.ON_OFF_OUTPUT, INPUT_CLUSTERS: [ Basic.cluster_id, - ThirdRealitySwitchCluster.cluster_id, - ThirdRealitySwitchBrightnessCluster.cluster_id, - PowerConfiguration.cluster_id, + Identify.cluster_id, + Groups.cluster_id, + Scenes.cluster_id, OnOff.cluster_id, + Diagnostic.cluster_id, + CustomPowerConfigurationCluster.cluster_id, ], - OUTPUT_CLUSTERS: [ - OnOff.cluster_id, - Ota.cluster_id, - ], - }, + OUTPUT_CLUSTERS: [Ota.cluster_id], + } }, } + replacement = { ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, + DEVICE_TYPE: zha.DeviceType.ON_OFF_OUTPUT, INPUT_CLUSTERS: [ Basic.cluster_id, - ThirdRealitySwitchCluster, - ThirdRealitySwitchBrightnessCluster, - PowerConfiguration.cluster_id, - OnOff.cluster_id, - ], - OUTPUT_CLUSTERS: [ + Identify.cluster_id, + Groups.cluster_id, + Scenes.cluster_id, OnOff.cluster_id, - Ota.cluster_id, + Diagnostic.cluster_id, + CustomPowerConfigurationCluster, ], - }, + OUTPUT_CLUSTERS: [Ota.cluster_id], + } } } diff --git a/zhaquirks/thirdreality/vibrate.py b/zhaquirks/thirdreality/vibrate.py index b0c7d7ccce..5931b1135f 100644 --- a/zhaquirks/thirdreality/vibrate.py +++ b/zhaquirks/thirdreality/vibrate.py @@ -28,7 +28,6 @@ class ThirdRealityAccelCluster(CustomCluster): 0x0001: ("x_axis", t.int16s, True), 0x0002: ("y_axis", t.int16s, True), 0x0003: ("z_axis", t.int16s, True), - 0x0004: ("cooldown_period", t.uint16_t, True), } From 31ca101c0801a46fd397dc2f407d2ed95350cdee Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 10 Jan 2025 14:26:26 +0800 Subject: [PATCH 22/51] update --- zhaquirks/thirdreality/plug.py | 38 ---------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 zhaquirks/thirdreality/plug.py diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py deleted file mode 100644 index ea27f0f2fe..0000000000 --- a/zhaquirks/thirdreality/plug.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Third Reality plug devices.""" - -from typing import Final - -from zigpy.quirks import CustomCluster -from zigpy.quirks.v2 import QuirkBuilder -import zigpy.types as t -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef - - -class ThirdRealityPlugCluster(CustomCluster): - """Third Reality's plug private cluster.""" - - cluster_id = 0xFF03 - - class AttributeDefs(BaseAttributeDefs): - """Define the attributes of a private cluster.""" - - reset_summation_delivered: Final = ZCLAttributeDef( - id=0x0000, - type=t.uint8_t, - is_manufacturer_specific=True, - ) - - -( - QuirkBuilder("Third Reality, Inc", "3RSP02028BZ") - .also_applies_to("Third Reality, Inc", "3RSPE01044BZ") - .replaces(ThirdRealityPlugCluster) - .write_attr_button( - attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, - cluster_id=ThirdRealityPlugCluster.cluster_id, - translation_key="reset_summation_delivered", - fallback_name="Reset summation delivered", - ) - .add_to_registry() -) From 0d83b67979e57fbb9386de281992cc136dbeb44f Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 10 Jan 2025 14:27:23 +0800 Subject: [PATCH 23/51] update --- zhaquirks/thirdreality/plug.py | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 zhaquirks/thirdreality/plug.py diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py new file mode 100644 index 0000000000..ea27f0f2fe --- /dev/null +++ b/zhaquirks/thirdreality/plug.py @@ -0,0 +1,38 @@ +"""Third Reality plug devices.""" + +from typing import Final + +from zigpy.quirks import CustomCluster +from zigpy.quirks.v2 import QuirkBuilder +import zigpy.types as t +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + + +class ThirdRealityPlugCluster(CustomCluster): + """Third Reality's plug private cluster.""" + + cluster_id = 0xFF03 + + class AttributeDefs(BaseAttributeDefs): + """Define the attributes of a private cluster.""" + + reset_summation_delivered: Final = ZCLAttributeDef( + id=0x0000, + type=t.uint8_t, + is_manufacturer_specific=True, + ) + + +( + QuirkBuilder("Third Reality, Inc", "3RSP02028BZ") + .also_applies_to("Third Reality, Inc", "3RSPE01044BZ") + .replaces(ThirdRealityPlugCluster) + .write_attr_button( + attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, + attribute_value=0x01, + cluster_id=ThirdRealityPlugCluster.cluster_id, + translation_key="reset_summation_delivered", + fallback_name="Reset summation delivered", + ) + .add_to_registry() +) From cff8d6cf26b18cca86b78da4ad00a4279e8bd5aa Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 10 Jan 2025 14:48:09 +0800 Subject: [PATCH 24/51] update --- ...perature_humidity_gen2(no poll cluster).py | 67 +++++++++++++++++++ .../thirdreality/temperature_humidity_gen2.py | 67 +++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 zhaquirks/thirdreality/temperature_humidity_gen2(no poll cluster).py create mode 100644 zhaquirks/thirdreality/temperature_humidity_gen2.py diff --git a/zhaquirks/thirdreality/temperature_humidity_gen2(no poll cluster).py b/zhaquirks/thirdreality/temperature_humidity_gen2(no poll cluster).py new file mode 100644 index 0000000000..ff446a5290 --- /dev/null +++ b/zhaquirks/thirdreality/temperature_humidity_gen2(no poll cluster).py @@ -0,0 +1,67 @@ +"""Third Reality Temperature humidity devices.""" + +from zigpy.profiles import zha +from zigpy.quirks import CustomDevice +from zigpy.zcl.clusters.general import ( + Basic, + Identify, + Ota, + PollControl, + PowerConfiguration, +) +from zigpy.zcl.clusters.measurement import RelativeHumidity, TemperatureMeasurement + +from zhaquirks.const import ( + DEVICE_TYPE, + ENDPOINTS, + INPUT_CLUSTERS, + MODELS_INFO, + OUTPUT_CLUSTERS, + PROFILE_ID, +) + + +class Temperature_humidity_lite(CustomDevice): + """ThirdReality Temperature humidity lite device.""" + + signature = { + MODELS_INFO: [("Third Reality", "3RTHS0224Z")], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + Identify.cluster_id, + PollControl.cluster_id, + TemperatureMeasurement.cluster_id, + RelativeHumidity.cluster_id, + # ThirdRealityCluster.cluster_id, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + Identify.cluster_id, + TemperatureMeasurement.cluster_id, + RelativeHumidity.cluster_id, + # ThirdRealityCluster, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } + diff --git a/zhaquirks/thirdreality/temperature_humidity_gen2.py b/zhaquirks/thirdreality/temperature_humidity_gen2.py new file mode 100644 index 0000000000..c7503018ef --- /dev/null +++ b/zhaquirks/thirdreality/temperature_humidity_gen2.py @@ -0,0 +1,67 @@ +"""Third Reality Temperature humidity devices.""" + +from zigpy.profiles import zha +from zigpy.quirks import CustomDevice +from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration +from zigpy.zcl.clusters.measurement import TemperatureMeasurement ,RelativeHumidity +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef +from zigpy.zcl.clusters.general import ( + Identify, + PollControl, +) + +from zhaquirks.const import ( + DEVICE_TYPE, + ENDPOINTS, + INPUT_CLUSTERS, + MODELS_INFO, + OUTPUT_CLUSTERS, + PROFILE_ID, +) +from zhaquirks.thirdreality import THIRD_REALITY + + +class Temperature_humidity_lite(CustomDevice): + """ThirdReality Temperature humidity lite device.""" + + signature = { + MODELS_INFO: [("Third Reality", "3RTHS0224Z")], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + Identify.cluster_id, + PollControl.cluster_id, + TemperatureMeasurement.cluster_id, + RelativeHumidity.cluster_id, + # ThirdRealityCluster.cluster_id, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } + replacement = { + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + PowerConfiguration.cluster_id, + Identify.cluster_id, + TemperatureMeasurement.cluster_id, + RelativeHumidity.cluster_id, + # ThirdRealityCluster, + ], + OUTPUT_CLUSTERS: [ + Ota.cluster_id, + ], + } + }, + } + From 1146892d096314d76cf3222f4005b772d604aa26 Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 10 Jan 2025 14:48:36 +0800 Subject: [PATCH 25/51] update --- ...perature_humidity_gen2(no poll cluster).py | 67 ------------------- 1 file changed, 67 deletions(-) delete mode 100644 zhaquirks/thirdreality/temperature_humidity_gen2(no poll cluster).py diff --git a/zhaquirks/thirdreality/temperature_humidity_gen2(no poll cluster).py b/zhaquirks/thirdreality/temperature_humidity_gen2(no poll cluster).py deleted file mode 100644 index ff446a5290..0000000000 --- a/zhaquirks/thirdreality/temperature_humidity_gen2(no poll cluster).py +++ /dev/null @@ -1,67 +0,0 @@ -"""Third Reality Temperature humidity devices.""" - -from zigpy.profiles import zha -from zigpy.quirks import CustomDevice -from zigpy.zcl.clusters.general import ( - Basic, - Identify, - Ota, - PollControl, - PowerConfiguration, -) -from zigpy.zcl.clusters.measurement import RelativeHumidity, TemperatureMeasurement - -from zhaquirks.const import ( - DEVICE_TYPE, - ENDPOINTS, - INPUT_CLUSTERS, - MODELS_INFO, - OUTPUT_CLUSTERS, - PROFILE_ID, -) - - -class Temperature_humidity_lite(CustomDevice): - """ThirdReality Temperature humidity lite device.""" - - signature = { - MODELS_INFO: [("Third Reality", "3RTHS0224Z")], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - Identify.cluster_id, - PollControl.cluster_id, - TemperatureMeasurement.cluster_id, - RelativeHumidity.cluster_id, - # ThirdRealityCluster.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - Identify.cluster_id, - TemperatureMeasurement.cluster_id, - RelativeHumidity.cluster_id, - # ThirdRealityCluster, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } - From 76351ca2f7a5fc7a1989f2843711262edcfbafa0 Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 10 Jan 2025 14:49:49 +0800 Subject: [PATCH 26/51] update --- zhaquirks/thirdreality/temperature_humidity_gen2.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zhaquirks/thirdreality/temperature_humidity_gen2.py b/zhaquirks/thirdreality/temperature_humidity_gen2.py index c7503018ef..ff446a5290 100644 --- a/zhaquirks/thirdreality/temperature_humidity_gen2.py +++ b/zhaquirks/thirdreality/temperature_humidity_gen2.py @@ -2,13 +2,14 @@ from zigpy.profiles import zha from zigpy.quirks import CustomDevice -from zigpy.zcl.clusters.general import Basic, Ota, PowerConfiguration -from zigpy.zcl.clusters.measurement import TemperatureMeasurement ,RelativeHumidity -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef from zigpy.zcl.clusters.general import ( + Basic, Identify, + Ota, PollControl, + PowerConfiguration, ) +from zigpy.zcl.clusters.measurement import RelativeHumidity, TemperatureMeasurement from zhaquirks.const import ( DEVICE_TYPE, @@ -18,7 +19,6 @@ OUTPUT_CLUSTERS, PROFILE_ID, ) -from zhaquirks.thirdreality import THIRD_REALITY class Temperature_humidity_lite(CustomDevice): From 1c7fab5b34ea8f65f2a8b84544761c52d1fa8233 Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 10 Jan 2025 15:01:27 +0800 Subject: [PATCH 27/51] update --- zhaquirks/thirdreality/temperature_humidity_gen2.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/zhaquirks/thirdreality/temperature_humidity_gen2.py b/zhaquirks/thirdreality/temperature_humidity_gen2.py index ff446a5290..3e9a066471 100644 --- a/zhaquirks/thirdreality/temperature_humidity_gen2.py +++ b/zhaquirks/thirdreality/temperature_humidity_gen2.py @@ -37,7 +37,6 @@ class Temperature_humidity_lite(CustomDevice): PollControl.cluster_id, TemperatureMeasurement.cluster_id, RelativeHumidity.cluster_id, - # ThirdRealityCluster.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, @@ -56,7 +55,6 @@ class Temperature_humidity_lite(CustomDevice): Identify.cluster_id, TemperatureMeasurement.cluster_id, RelativeHumidity.cluster_id, - # ThirdRealityCluster, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, From 2e6479839158ffc2bef9890ad93e7463484a4b86 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 10 Jan 2025 07:11:38 +0000 Subject: [PATCH 28/51] Apply pre-commit auto fixes --- zhaquirks/thirdreality/temperature_humidity_gen2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/zhaquirks/thirdreality/temperature_humidity_gen2.py b/zhaquirks/thirdreality/temperature_humidity_gen2.py index 3e9a066471..5df8bbd28b 100644 --- a/zhaquirks/thirdreality/temperature_humidity_gen2.py +++ b/zhaquirks/thirdreality/temperature_humidity_gen2.py @@ -62,4 +62,3 @@ class Temperature_humidity_lite(CustomDevice): } }, } - From a7dda09c85dd7c587c68efece253f030d699abff Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 10 Jan 2025 15:15:41 +0800 Subject: [PATCH 29/51] update --- zhaquirks/thirdreality/temperature_humidity_gen2.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/zhaquirks/thirdreality/temperature_humidity_gen2.py b/zhaquirks/thirdreality/temperature_humidity_gen2.py index 3e9a066471..dbe6eac217 100644 --- a/zhaquirks/thirdreality/temperature_humidity_gen2.py +++ b/zhaquirks/thirdreality/temperature_humidity_gen2.py @@ -61,5 +61,4 @@ class Temperature_humidity_lite(CustomDevice): ], } }, - } - + } \ No newline at end of file From e776debadfeaa86ee3b25c935fc2ade18aa81c30 Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 6 Jun 2025 14:57:26 +0800 Subject: [PATCH 30/51] updatye --- zhaquirks/thirdreality/plug_dual.py | 104 ++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 zhaquirks/thirdreality/plug_dual.py diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py new file mode 100644 index 0000000000..a538413c7a --- /dev/null +++ b/zhaquirks/thirdreality/plug_dual.py @@ -0,0 +1,104 @@ +"""Third Reality plug devices.""" + +from typing import Final + +from zigpy.quirks import CustomCluster +from zigpy.quirks.v2 import QuirkBuilder +import zigpy.types as t +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + + +class ThirdRealityPlugCluster(CustomCluster): + """Third Reality's plug private cluster.""" + + cluster_id = 0xFF03 + + class AttributeDefs(BaseAttributeDefs): + """Define the attributes of a private cluster.""" + + reset_summation_delivered: Final = ZCLAttributeDef( + id=0x0000, + type=t.uint8_t, + is_manufacturer_specific=True, + ) + + on_to_off_delay: Final = ZCLAttributeDef( + id=0x0001, + type=t.uint16_t, + is_manufacturer_specific=True, + ) + + off_to_on_delay: Final = ZCLAttributeDef( + id=0x0002, + type=t.uint16_t, + is_manufacturer_specific=True, + ) + + +( + QuirkBuilder("Third Reality, Inc", "3RDP01072Z") + .also_applies_to("Third Reality, Inc", "3RSPE01044BZ") + .replaces(ThirdRealityPlugCluster, endpoint_id=1) + .replaces(ThirdRealityPlugCluster, endpoint_id=2) + .write_attr_button( + attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, + attribute_value=0x01, + cluster_id=ThirdRealityPlugCluster.cluster_id, + translation_key="reset_summation_delivered", + fallback_name="Reset summation delivered1", + endpoint_id=1, + ) + .write_attr_button( + attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, + attribute_value=0x01, + cluster_id=ThirdRealityPlugCluster.cluster_id, + translation_key="reset_summation_delivered", + fallback_name="Reset summation delivered1", + endpoint_id=2, + ) + .number( + attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, + cluster_id=ThirdRealityPlugCluster.cluster_id, + endpoint_id=1, + min_value=0, + max_value=65535, + step=1, + mode="box", + translation_key="on_to_off_delay", + fallback_name="On to off delay", + ) + .number( + attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, + cluster_id=ThirdRealityPlugCluster.cluster_id, + endpoint_id=2, + min_value=0, + max_value=65535, + step=1, + mode="box", + translation_key="on_to_off_delay", + fallback_name="On to off delay", + ) + .number( + attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, + cluster_id=ThirdRealityPlugCluster.cluster_id, + endpoint_id=1, + min_value=0, + max_value=65535, + step=1, + mode="box", + translation_key="off_to_on_delay", + fallback_name="Off to on delay", + ) + .number( + attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, + cluster_id=ThirdRealityPlugCluster.cluster_id, + endpoint_id=2, + min_value=0, + max_value=65535, + step=1, + mode="box", + translation_key="off_to_on_delay", + fallback_name="Off to on delay", + ) + .add_to_registry() +) From a224af7769c1464e4b57e91bfe31a5742b9ea264 Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 6 Jun 2025 14:58:45 +0800 Subject: [PATCH 31/51] update --- .../thirdreality/temperature_humidity_gen2.py | 64 ------------------- 1 file changed, 64 deletions(-) delete mode 100644 zhaquirks/thirdreality/temperature_humidity_gen2.py diff --git a/zhaquirks/thirdreality/temperature_humidity_gen2.py b/zhaquirks/thirdreality/temperature_humidity_gen2.py deleted file mode 100644 index 5df8bbd28b..0000000000 --- a/zhaquirks/thirdreality/temperature_humidity_gen2.py +++ /dev/null @@ -1,64 +0,0 @@ -"""Third Reality Temperature humidity devices.""" - -from zigpy.profiles import zha -from zigpy.quirks import CustomDevice -from zigpy.zcl.clusters.general import ( - Basic, - Identify, - Ota, - PollControl, - PowerConfiguration, -) -from zigpy.zcl.clusters.measurement import RelativeHumidity, TemperatureMeasurement - -from zhaquirks.const import ( - DEVICE_TYPE, - ENDPOINTS, - INPUT_CLUSTERS, - MODELS_INFO, - OUTPUT_CLUSTERS, - PROFILE_ID, -) - - -class Temperature_humidity_lite(CustomDevice): - """ThirdReality Temperature humidity lite device.""" - - signature = { - MODELS_INFO: [("Third Reality", "3RTHS0224Z")], - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - Identify.cluster_id, - PollControl.cluster_id, - TemperatureMeasurement.cluster_id, - RelativeHumidity.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } - replacement = { - ENDPOINTS: { - 1: { - PROFILE_ID: zha.PROFILE_ID, - DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, - INPUT_CLUSTERS: [ - Basic.cluster_id, - PowerConfiguration.cluster_id, - Identify.cluster_id, - TemperatureMeasurement.cluster_id, - RelativeHumidity.cluster_id, - ], - OUTPUT_CLUSTERS: [ - Ota.cluster_id, - ], - } - }, - } From 976e0717ae5d2635f376a00a64e88bbcf02c105d Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 6 Jun 2025 15:01:41 +0800 Subject: [PATCH 32/51] update --- zhaquirks/thirdreality/plug.py | 38 ---------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 zhaquirks/thirdreality/plug.py diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py deleted file mode 100644 index ea27f0f2fe..0000000000 --- a/zhaquirks/thirdreality/plug.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Third Reality plug devices.""" - -from typing import Final - -from zigpy.quirks import CustomCluster -from zigpy.quirks.v2 import QuirkBuilder -import zigpy.types as t -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef - - -class ThirdRealityPlugCluster(CustomCluster): - """Third Reality's plug private cluster.""" - - cluster_id = 0xFF03 - - class AttributeDefs(BaseAttributeDefs): - """Define the attributes of a private cluster.""" - - reset_summation_delivered: Final = ZCLAttributeDef( - id=0x0000, - type=t.uint8_t, - is_manufacturer_specific=True, - ) - - -( - QuirkBuilder("Third Reality, Inc", "3RSP02028BZ") - .also_applies_to("Third Reality, Inc", "3RSPE01044BZ") - .replaces(ThirdRealityPlugCluster) - .write_attr_button( - attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, - cluster_id=ThirdRealityPlugCluster.cluster_id, - translation_key="reset_summation_delivered", - fallback_name="Reset summation delivered", - ) - .add_to_registry() -) From e386bf9e7b401cc070c3dc5dfe21a5eed116561c Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 6 Jun 2025 15:03:11 +0800 Subject: [PATCH 33/51] updaye --- zhaquirks/thirdreality/plug.py | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 zhaquirks/thirdreality/plug.py diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py new file mode 100644 index 0000000000..ea27f0f2fe --- /dev/null +++ b/zhaquirks/thirdreality/plug.py @@ -0,0 +1,38 @@ +"""Third Reality plug devices.""" + +from typing import Final + +from zigpy.quirks import CustomCluster +from zigpy.quirks.v2 import QuirkBuilder +import zigpy.types as t +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + + +class ThirdRealityPlugCluster(CustomCluster): + """Third Reality's plug private cluster.""" + + cluster_id = 0xFF03 + + class AttributeDefs(BaseAttributeDefs): + """Define the attributes of a private cluster.""" + + reset_summation_delivered: Final = ZCLAttributeDef( + id=0x0000, + type=t.uint8_t, + is_manufacturer_specific=True, + ) + + +( + QuirkBuilder("Third Reality, Inc", "3RSP02028BZ") + .also_applies_to("Third Reality, Inc", "3RSPE01044BZ") + .replaces(ThirdRealityPlugCluster) + .write_attr_button( + attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, + attribute_value=0x01, + cluster_id=ThirdRealityPlugCluster.cluster_id, + translation_key="reset_summation_delivered", + fallback_name="Reset summation delivered", + ) + .add_to_registry() +) From 889e38aceaff942ffa7a3154cc58eca11dd54c09 Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 6 Jun 2025 15:15:00 +0800 Subject: [PATCH 34/51] update --- zhaquirks/thirdreality/plug.py | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py index ea27f0f2fe..6be7de77f5 100644 --- a/zhaquirks/thirdreality/plug.py +++ b/zhaquirks/thirdreality/plug.py @@ -21,11 +21,26 @@ class AttributeDefs(BaseAttributeDefs): type=t.uint8_t, is_manufacturer_specific=True, ) + + on_to_off_delay: Final = ZCLAttributeDef( + id=0x0001, + type=t.uint16_t, + is_manufacturer_specific=True, + ) + + off_to_on_delay: Final = ZCLAttributeDef( + id=0x0002, + type=t.uint16_t, + is_manufacturer_specific=True, + ) ( QuirkBuilder("Third Reality, Inc", "3RSP02028BZ") .also_applies_to("Third Reality, Inc", "3RSPE01044BZ") + .also_applies_to("Third Reality, Inc", "3RSPU01080Z") + .also_applies_to("Third Reality, Inc", "3RSP02064Z") + .also_applies_to("Third Reality, Inc", "3RSPE02065Z") .replaces(ThirdRealityPlugCluster) .write_attr_button( attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, @@ -34,5 +49,27 @@ class AttributeDefs(BaseAttributeDefs): translation_key="reset_summation_delivered", fallback_name="Reset summation delivered", ) + .number( + attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, + cluster_id=ThirdRealityPlugCluster.cluster_id, + endpoint_id=1, + min_value=0, + max_value=65535, + step=1, + mode="box", + translation_key="on_to_off_delay", + fallback_name="On to off delay", + ) + .number( + attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, + cluster_id=ThirdRealityPlugCluster.cluster_id, + endpoint_id=1, + min_value=0, + max_value=65535, + step=1, + mode="box", + translation_key="off_to_on_delay", + fallback_name="Off to on delay", + ) .add_to_registry() ) From c08859b952ea97d5c75f14e3af535eba4fd13d67 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Jun 2025 07:17:29 +0000 Subject: [PATCH 35/51] Apply pre-commit auto fixes --- zhaquirks/thirdreality/plug.py | 4 ++-- zhaquirks/thirdreality/plug_dual.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py index 6be7de77f5..0ffc6cd1f0 100644 --- a/zhaquirks/thirdreality/plug.py +++ b/zhaquirks/thirdreality/plug.py @@ -21,13 +21,13 @@ class AttributeDefs(BaseAttributeDefs): type=t.uint8_t, is_manufacturer_specific=True, ) - + on_to_off_delay: Final = ZCLAttributeDef( id=0x0001, type=t.uint16_t, is_manufacturer_specific=True, ) - + off_to_on_delay: Final = ZCLAttributeDef( id=0x0002, type=t.uint16_t, diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index a538413c7a..4d24ecf361 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -21,13 +21,13 @@ class AttributeDefs(BaseAttributeDefs): type=t.uint8_t, is_manufacturer_specific=True, ) - + on_to_off_delay: Final = ZCLAttributeDef( id=0x0001, type=t.uint16_t, is_manufacturer_specific=True, ) - + off_to_on_delay: Final = ZCLAttributeDef( id=0x0002, type=t.uint16_t, @@ -39,7 +39,7 @@ class AttributeDefs(BaseAttributeDefs): QuirkBuilder("Third Reality, Inc", "3RDP01072Z") .also_applies_to("Third Reality, Inc", "3RSPE01044BZ") .replaces(ThirdRealityPlugCluster, endpoint_id=1) - .replaces(ThirdRealityPlugCluster, endpoint_id=2) + .replaces(ThirdRealityPlugCluster, endpoint_id=2) .write_attr_button( attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, attribute_value=0x01, @@ -48,7 +48,7 @@ class AttributeDefs(BaseAttributeDefs): fallback_name="Reset summation delivered1", endpoint_id=1, ) - .write_attr_button( + .write_attr_button( attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, attribute_value=0x01, cluster_id=ThirdRealityPlugCluster.cluster_id, From 40e03229d3a3e55db5a04cf63b22cadb48c7e8de Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 6 Jun 2025 15:20:35 +0800 Subject: [PATCH 36/51] update --- zhaquirks/thirdreality/plug_dual.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index a538413c7a..fb0a773f6e 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -37,7 +37,7 @@ class AttributeDefs(BaseAttributeDefs): ( QuirkBuilder("Third Reality, Inc", "3RDP01072Z") - .also_applies_to("Third Reality, Inc", "3RSPE01044BZ") + .also_applies_to("Third Reality, Inc", "3RWP01073Z") .replaces(ThirdRealityPlugCluster, endpoint_id=1) .replaces(ThirdRealityPlugCluster, endpoint_id=2) .write_attr_button( From 083c36b9427a39d5f2e62132c0b7da160d3fdc1a Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 6 Jun 2025 15:29:12 +0800 Subject: [PATCH 37/51] update --- zhaquirks/thirdreality/plug_dual.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index c5b32a40b8..8be0551d41 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -44,16 +44,16 @@ class AttributeDefs(BaseAttributeDefs): attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, attribute_value=0x01, cluster_id=ThirdRealityPlugCluster.cluster_id, - translation_key="reset_summation_delivered", - fallback_name="Reset summation delivered1", + translation_key="reset_summation_delivered_ep1", + fallback_name="Reset summation delivered", endpoint_id=1, ) .write_attr_button( attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, attribute_value=0x01, cluster_id=ThirdRealityPlugCluster.cluster_id, - translation_key="reset_summation_delivered", - fallback_name="Reset summation delivered1", + translation_key="reset_summation_delivered_ep2", + fallback_name="Reset summation delivered", endpoint_id=2, ) .number( @@ -64,7 +64,7 @@ class AttributeDefs(BaseAttributeDefs): max_value=65535, step=1, mode="box", - translation_key="on_to_off_delay", + translation_key="on_to_off_delay_ep1", fallback_name="On to off delay", ) .number( @@ -75,7 +75,7 @@ class AttributeDefs(BaseAttributeDefs): max_value=65535, step=1, mode="box", - translation_key="on_to_off_delay", + translation_key="on_to_off_delay_ep2", fallback_name="On to off delay", ) .number( @@ -86,7 +86,7 @@ class AttributeDefs(BaseAttributeDefs): max_value=65535, step=1, mode="box", - translation_key="off_to_on_delay", + translation_key="off_to_on_delay_ep1", fallback_name="Off to on delay", ) .number( @@ -97,7 +97,7 @@ class AttributeDefs(BaseAttributeDefs): max_value=65535, step=1, mode="box", - translation_key="off_to_on_delay", + translation_key="off_to_on_delay_ep2", fallback_name="Off to on delay", ) .add_to_registry() From 517e1fe9864734937158a6587b66c5b6a16b44cd Mon Sep 17 00:00:00 2001 From: jintj Date: Fri, 6 Jun 2025 16:15:34 +0800 Subject: [PATCH 38/51] update --- zhaquirks/thirdreality/plug_dual.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index 8be0551d41..e0c929035b 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -45,7 +45,7 @@ class AttributeDefs(BaseAttributeDefs): attribute_value=0x01, cluster_id=ThirdRealityPlugCluster.cluster_id, translation_key="reset_summation_delivered_ep1", - fallback_name="Reset summation delivered", + fallback_name="Reset summation delivered1", endpoint_id=1, ) .write_attr_button( @@ -53,7 +53,7 @@ class AttributeDefs(BaseAttributeDefs): attribute_value=0x01, cluster_id=ThirdRealityPlugCluster.cluster_id, translation_key="reset_summation_delivered_ep2", - fallback_name="Reset summation delivered", + fallback_name="Reset summation delivered2", endpoint_id=2, ) .number( @@ -65,7 +65,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, mode="box", translation_key="on_to_off_delay_ep1", - fallback_name="On to off delay", + fallback_name="On to off delay1", ) .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, @@ -76,7 +76,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, mode="box", translation_key="on_to_off_delay_ep2", - fallback_name="On to off delay", + fallback_name="On to off delay2", ) .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, @@ -87,7 +87,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, mode="box", translation_key="off_to_on_delay_ep1", - fallback_name="Off to on delay", + fallback_name="Off to on delay1", ) .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, @@ -98,7 +98,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, mode="box", translation_key="off_to_on_delay_ep2", - fallback_name="Off to on delay", + fallback_name="Off to on delay2", ) .add_to_registry() ) From dcc326a9e60505496f53a334cd5fcb59b4dc38fe Mon Sep 17 00:00:00 2001 From: jintj Date: Tue, 24 Jun 2025 11:27:58 +0800 Subject: [PATCH 39/51] update --- zhaquirks/thirdreality/plug.py | 14 +++++++------- zhaquirks/thirdreality/plug_dual.py | 30 ++++++++++++++--------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py index 0ffc6cd1f0..dfc218e9b3 100644 --- a/zhaquirks/thirdreality/plug.py +++ b/zhaquirks/thirdreality/plug.py @@ -42,15 +42,15 @@ class AttributeDefs(BaseAttributeDefs): .also_applies_to("Third Reality, Inc", "3RSP02064Z") .also_applies_to("Third Reality, Inc", "3RSPE02065Z") .replaces(ThirdRealityPlugCluster) - .write_attr_button( + .write_attr_button( #reset the accumulated power of the plug attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, + attribute_value=0x01, #Setting the attribute to 1 represents resetting the accumulated battery level, while other values represent invalidity cluster_id=ThirdRealityPlugCluster.cluster_id, translation_key="reset_summation_delivered", fallback_name="Reset summation delivered", ) - .number( - attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, + .number( #off delay + attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, min_value=0, @@ -58,9 +58,9 @@ class AttributeDefs(BaseAttributeDefs): step=1, mode="box", translation_key="on_to_off_delay", - fallback_name="On to off delay", + fallback_name="Turn off delay", ) - .number( + .number( #on delay attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, @@ -69,7 +69,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, mode="box", translation_key="off_to_on_delay", - fallback_name="Off to on delay", + fallback_name="Turn on delay", ) .add_to_registry() ) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index e0c929035b..32bf35253b 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -39,24 +39,24 @@ class AttributeDefs(BaseAttributeDefs): QuirkBuilder("Third Reality, Inc", "3RDP01072Z") .also_applies_to("Third Reality, Inc", "3RWP01073Z") .replaces(ThirdRealityPlugCluster, endpoint_id=1) - .replaces(ThirdRealityPlugCluster, endpoint_id=2) - .write_attr_button( + .replaces(ThirdRealityPlugCluster, endpoint_id=2) #have two endpiont + .write_attr_button( #reset the accumulated power of the plug attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, + attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, translation_key="reset_summation_delivered_ep1", - fallback_name="Reset summation delivered1", + fallback_name="Reset left summation delivered", #ep1 is left endpoint_id=1, ) - .write_attr_button( + .write_attr_button( #reset the accumulated power of the plug attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, + attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, translation_key="reset_summation_delivered_ep2", - fallback_name="Reset summation delivered2", + fallback_name="Reset right summation delivered ep2", #ep2 is right endpoint_id=2, ) - .number( + .number( #off delay attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, @@ -65,9 +65,9 @@ class AttributeDefs(BaseAttributeDefs): step=1, mode="box", translation_key="on_to_off_delay_ep1", - fallback_name="On to off delay1", + fallback_name="Turn off delay", ) - .number( + .number( #off delay attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=2, @@ -76,9 +76,9 @@ class AttributeDefs(BaseAttributeDefs): step=1, mode="box", translation_key="on_to_off_delay_ep2", - fallback_name="On to off delay2", + fallback_name="Turn off delay", ) - .number( + .number( #on delay attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, @@ -87,9 +87,9 @@ class AttributeDefs(BaseAttributeDefs): step=1, mode="box", translation_key="off_to_on_delay_ep1", - fallback_name="Off to on delay1", + fallback_name="Turn on delay", ) - .number( + .number( #on delay attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=2, @@ -98,7 +98,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, mode="box", translation_key="off_to_on_delay_ep2", - fallback_name="Off to on delay2", + fallback_name="Turn on delay", ) .add_to_registry() ) From 4c01e11a6cc09a6437979eb08f17216be85559b8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 24 Jun 2025 03:29:45 +0000 Subject: [PATCH 40/51] Apply pre-commit auto fixes --- zhaquirks/thirdreality/plug.py | 10 +++++----- zhaquirks/thirdreality/plug_dual.py | 22 +++++++++++----------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py index dfc218e9b3..188697c124 100644 --- a/zhaquirks/thirdreality/plug.py +++ b/zhaquirks/thirdreality/plug.py @@ -42,15 +42,15 @@ class AttributeDefs(BaseAttributeDefs): .also_applies_to("Third Reality, Inc", "3RSP02064Z") .also_applies_to("Third Reality, Inc", "3RSPE02065Z") .replaces(ThirdRealityPlugCluster) - .write_attr_button( #reset the accumulated power of the plug + .write_attr_button( # reset the accumulated power of the plug attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, #Setting the attribute to 1 represents resetting the accumulated battery level, while other values represent invalidity + attribute_value=0x01, # Setting the attribute to 1 represents resetting the accumulated battery level, while other values represent invalidity cluster_id=ThirdRealityPlugCluster.cluster_id, translation_key="reset_summation_delivered", fallback_name="Reset summation delivered", ) - .number( #off delay - attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, + .number( # off delay + attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, min_value=0, @@ -60,7 +60,7 @@ class AttributeDefs(BaseAttributeDefs): translation_key="on_to_off_delay", fallback_name="Turn off delay", ) - .number( #on delay + .number( # on delay attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index 32bf35253b..6b7e8bccb3 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -39,24 +39,24 @@ class AttributeDefs(BaseAttributeDefs): QuirkBuilder("Third Reality, Inc", "3RDP01072Z") .also_applies_to("Third Reality, Inc", "3RWP01073Z") .replaces(ThirdRealityPlugCluster, endpoint_id=1) - .replaces(ThirdRealityPlugCluster, endpoint_id=2) #have two endpiont - .write_attr_button( #reset the accumulated power of the plug + .replaces(ThirdRealityPlugCluster, endpoint_id=2) # have two endpiont + .write_attr_button( # reset the accumulated power of the plug attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, # 1 reset summation delivered + attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, translation_key="reset_summation_delivered_ep1", - fallback_name="Reset left summation delivered", #ep1 is left + fallback_name="Reset left summation delivered", # ep1 is left endpoint_id=1, ) - .write_attr_button( #reset the accumulated power of the plug + .write_attr_button( # reset the accumulated power of the plug attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, # 1 reset summation delivered + attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, translation_key="reset_summation_delivered_ep2", - fallback_name="Reset right summation delivered ep2", #ep2 is right + fallback_name="Reset right summation delivered ep2", # ep2 is right endpoint_id=2, ) - .number( #off delay + .number( # off delay attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, @@ -67,7 +67,7 @@ class AttributeDefs(BaseAttributeDefs): translation_key="on_to_off_delay_ep1", fallback_name="Turn off delay", ) - .number( #off delay + .number( # off delay attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=2, @@ -78,7 +78,7 @@ class AttributeDefs(BaseAttributeDefs): translation_key="on_to_off_delay_ep2", fallback_name="Turn off delay", ) - .number( #on delay + .number( # on delay attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, @@ -89,7 +89,7 @@ class AttributeDefs(BaseAttributeDefs): translation_key="off_to_on_delay_ep1", fallback_name="Turn on delay", ) - .number( #on delay + .number( # on delay attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=2, From e2dee3ea5352fd223403b5769cd610e0a2afc539 Mon Sep 17 00:00:00 2001 From: jintj Date: Tue, 24 Jun 2025 11:32:21 +0800 Subject: [PATCH 41/51] update --- zhaquirks/thirdreality/plug_dual.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index 32bf35253b..71b826422e 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -39,7 +39,7 @@ class AttributeDefs(BaseAttributeDefs): QuirkBuilder("Third Reality, Inc", "3RDP01072Z") .also_applies_to("Third Reality, Inc", "3RWP01073Z") .replaces(ThirdRealityPlugCluster, endpoint_id=1) - .replaces(ThirdRealityPlugCluster, endpoint_id=2) #have two endpiont + .replaces(ThirdRealityPlugCluster, endpoint_id=2) #have two endpoint .write_attr_button( #reset the accumulated power of the plug attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, attribute_value=0x01, # 1 reset summation delivered From 6fe164a76a8a61ed4e64ee71a7a5f0ba830daa82 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 24 Jun 2025 03:33:43 +0000 Subject: [PATCH 42/51] Apply pre-commit auto fixes --- zhaquirks/thirdreality/plug_dual.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index 5375ce2326..7fc6ef4e19 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -39,8 +39,8 @@ class AttributeDefs(BaseAttributeDefs): QuirkBuilder("Third Reality, Inc", "3RDP01072Z") .also_applies_to("Third Reality, Inc", "3RWP01073Z") .replaces(ThirdRealityPlugCluster, endpoint_id=1) - .replaces(ThirdRealityPlugCluster, endpoint_id=2) #have two endpoint - .write_attr_button( #reset the accumulated power of the plug + .replaces(ThirdRealityPlugCluster, endpoint_id=2) # have two endpoint + .write_attr_button( # reset the accumulated power of the plug attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, From 935bbc108e3b0b1b783d99fbcb165541c40296de Mon Sep 17 00:00:00 2001 From: jintj Date: Thu, 26 Jun 2025 16:00:50 +0800 Subject: [PATCH 43/51] update --- zhaquirks/thirdreality/plug.py | 17 ++++++++++------- zhaquirks/thirdreality/plug_dual.py | 23 +++++++++++++---------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py index 188697c124..606296eac6 100644 --- a/zhaquirks/thirdreality/plug.py +++ b/zhaquirks/thirdreality/plug.py @@ -16,18 +16,21 @@ class ThirdRealityPlugCluster(CustomCluster): class AttributeDefs(BaseAttributeDefs): """Define the attributes of a private cluster.""" - reset_summation_delivered: Final = ZCLAttributeDef( + # reset the accumulated power of the plug + reset_summation_delivered: Final = ZCLAttributeDef( id=0x0000, type=t.uint8_t, is_manufacturer_specific=True, ) - + + # turn off delay on_to_off_delay: Final = ZCLAttributeDef( id=0x0001, type=t.uint16_t, is_manufacturer_specific=True, ) - + + # turn on delay off_to_on_delay: Final = ZCLAttributeDef( id=0x0002, type=t.uint16_t, @@ -42,14 +45,14 @@ class AttributeDefs(BaseAttributeDefs): .also_applies_to("Third Reality, Inc", "3RSP02064Z") .also_applies_to("Third Reality, Inc", "3RSPE02065Z") .replaces(ThirdRealityPlugCluster) - .write_attr_button( # reset the accumulated power of the plug + .write_attr_button( attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, # Setting the attribute to 1 represents resetting the accumulated battery level, while other values represent invalidity + attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, translation_key="reset_summation_delivered", fallback_name="Reset summation delivered", ) - .number( # off delay + .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, @@ -60,7 +63,7 @@ class AttributeDefs(BaseAttributeDefs): translation_key="on_to_off_delay", fallback_name="Turn off delay", ) - .number( # on delay + .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index 7fc6ef4e19..62a8aa610f 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -1,4 +1,4 @@ -"""Third Reality plug devices.""" +"""Third Reality dual plug devices.""" from typing import Final @@ -9,25 +9,28 @@ class ThirdRealityPlugCluster(CustomCluster): - """Third Reality's plug private cluster.""" + """Third Reality's dual plug private cluster.""" cluster_id = 0xFF03 class AttributeDefs(BaseAttributeDefs): """Define the attributes of a private cluster.""" + # reset the accumulated power of the plug reset_summation_delivered: Final = ZCLAttributeDef( id=0x0000, type=t.uint8_t, is_manufacturer_specific=True, ) + # turn off delay on_to_off_delay: Final = ZCLAttributeDef( id=0x0001, type=t.uint16_t, is_manufacturer_specific=True, ) + # turn on delay off_to_on_delay: Final = ZCLAttributeDef( id=0x0002, type=t.uint16_t, @@ -40,23 +43,23 @@ class AttributeDefs(BaseAttributeDefs): .also_applies_to("Third Reality, Inc", "3RWP01073Z") .replaces(ThirdRealityPlugCluster, endpoint_id=1) .replaces(ThirdRealityPlugCluster, endpoint_id=2) # have two endpoint - .write_attr_button( # reset the accumulated power of the plug + .write_attr_button( attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, # 1 reset summation delivered + attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, + endpoint_id=1, translation_key="reset_summation_delivered_ep1", fallback_name="Reset left summation delivered", # ep1 is left - endpoint_id=1, ) .write_attr_button( # reset the accumulated power of the plug attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, + endpoint_id=2, translation_key="reset_summation_delivered_ep2", fallback_name="Reset right summation delivered ep2", # ep2 is right - endpoint_id=2, ) - .number( # off delay + .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, @@ -67,7 +70,7 @@ class AttributeDefs(BaseAttributeDefs): translation_key="on_to_off_delay_ep1", fallback_name="Turn off delay", ) - .number( # off delay + .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=2, @@ -78,7 +81,7 @@ class AttributeDefs(BaseAttributeDefs): translation_key="on_to_off_delay_ep2", fallback_name="Turn off delay", ) - .number( # on delay + .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, @@ -89,7 +92,7 @@ class AttributeDefs(BaseAttributeDefs): translation_key="off_to_on_delay_ep1", fallback_name="Turn on delay", ) - .number( # on delay + .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=2, From 5986e93b1043d7ccd5e0657933e3eae7b7945a35 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 26 Jun 2025 08:02:15 +0000 Subject: [PATCH 44/51] Apply pre-commit auto fixes --- zhaquirks/thirdreality/plug.py | 8 ++++---- zhaquirks/thirdreality/plug_dual.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py index 606296eac6..c7a3fc3f49 100644 --- a/zhaquirks/thirdreality/plug.py +++ b/zhaquirks/thirdreality/plug.py @@ -17,19 +17,19 @@ class AttributeDefs(BaseAttributeDefs): """Define the attributes of a private cluster.""" # reset the accumulated power of the plug - reset_summation_delivered: Final = ZCLAttributeDef( + reset_summation_delivered: Final = ZCLAttributeDef( id=0x0000, type=t.uint8_t, is_manufacturer_specific=True, ) - + # turn off delay on_to_off_delay: Final = ZCLAttributeDef( id=0x0001, type=t.uint16_t, is_manufacturer_specific=True, ) - + # turn on delay off_to_on_delay: Final = ZCLAttributeDef( id=0x0002, @@ -47,7 +47,7 @@ class AttributeDefs(BaseAttributeDefs): .replaces(ThirdRealityPlugCluster) .write_attr_button( attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, # 1 reset summation delivered + attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, translation_key="reset_summation_delivered", fallback_name="Reset summation delivered", diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index 62a8aa610f..998c7df94c 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -45,7 +45,7 @@ class AttributeDefs(BaseAttributeDefs): .replaces(ThirdRealityPlugCluster, endpoint_id=2) # have two endpoint .write_attr_button( attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, # 1 reset summation delivered + attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, translation_key="reset_summation_delivered_ep1", From ffd8660e2275ce5122657feed5fb59f4b168470d Mon Sep 17 00:00:00 2001 From: jintj Date: Thu, 26 Jun 2025 16:34:56 +0800 Subject: [PATCH 45/51] update --- zhaquirks/thirdreality/plug_dual.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index 62a8aa610f..7b2dbf4f89 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -42,7 +42,7 @@ class AttributeDefs(BaseAttributeDefs): QuirkBuilder("Third Reality, Inc", "3RDP01072Z") .also_applies_to("Third Reality, Inc", "3RWP01073Z") .replaces(ThirdRealityPlugCluster, endpoint_id=1) - .replaces(ThirdRealityPlugCluster, endpoint_id=2) # have two endpoint + .replaces(ThirdRealityPlugCluster, endpoint_id=2) .write_attr_button( attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, attribute_value=0x01, # 1 reset summation delivered @@ -51,9 +51,9 @@ class AttributeDefs(BaseAttributeDefs): translation_key="reset_summation_delivered_ep1", fallback_name="Reset left summation delivered", # ep1 is left ) - .write_attr_button( # reset the accumulated power of the plug + .write_attr_button( attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, - attribute_value=0x01, # 1 reset summation delivered + attribute_value=0x01, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=2, translation_key="reset_summation_delivered_ep2", From 534e1ffbde5bc5bdb9b78b826b0a71258a56c388 Mon Sep 17 00:00:00 2001 From: jintj Date: Thu, 26 Jun 2025 16:50:41 +0800 Subject: [PATCH 46/51] update --- zhaquirks/thirdreality/plug.py | 6 ++++++ zhaquirks/thirdreality/plug_dual.py | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py index c7a3fc3f49..7fa3540836 100644 --- a/zhaquirks/thirdreality/plug.py +++ b/zhaquirks/thirdreality/plug.py @@ -4,6 +4,8 @@ from zigpy.quirks import CustomCluster from zigpy.quirks.v2 import QuirkBuilder +from zigpy.quirks.v2.homeassistant import UnitOfTime +from zigpy.quirks.v2.homeassistant.number import NumberDeviceClass import zigpy.types as t from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef @@ -60,6 +62,8 @@ class AttributeDefs(BaseAttributeDefs): max_value=65535, step=1, mode="box", + unit=UnitOfTime.SECONDS, + device_class=NumberDeviceClass.DURATION, translation_key="on_to_off_delay", fallback_name="Turn off delay", ) @@ -71,6 +75,8 @@ class AttributeDefs(BaseAttributeDefs): max_value=65535, step=1, mode="box", + unit=UnitOfTime.SECONDS, + device_class=NumberDeviceClass.DURATION, translation_key="off_to_on_delay", fallback_name="Turn on delay", ) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index e9d4fa7d90..c89b64d3a6 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -4,6 +4,8 @@ from zigpy.quirks import CustomCluster from zigpy.quirks.v2 import QuirkBuilder +from zigpy.quirks.v2.homeassistant import UnitOfTime +from zigpy.quirks.v2.homeassistant.number import NumberDeviceClass import zigpy.types as t from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef @@ -67,6 +69,8 @@ class AttributeDefs(BaseAttributeDefs): max_value=65535, step=1, mode="box", + unit=UnitOfTime.SECONDS, + device_class=NumberDeviceClass.DURATION, translation_key="on_to_off_delay_ep1", fallback_name="Turn off delay", ) @@ -78,6 +82,8 @@ class AttributeDefs(BaseAttributeDefs): max_value=65535, step=1, mode="box", + unit=UnitOfTime.SECONDS, + device_class=NumberDeviceClass.DURATION, translation_key="on_to_off_delay_ep2", fallback_name="Turn off delay", ) @@ -89,6 +95,8 @@ class AttributeDefs(BaseAttributeDefs): max_value=65535, step=1, mode="box", + unit=UnitOfTime.SECONDS, + device_class=NumberDeviceClass.DURATION, translation_key="off_to_on_delay_ep1", fallback_name="Turn on delay", ) @@ -100,6 +108,8 @@ class AttributeDefs(BaseAttributeDefs): max_value=65535, step=1, mode="box", + unit=UnitOfTime.SECONDS, + device_class=NumberDeviceClass.DURATION, translation_key="off_to_on_delay_ep2", fallback_name="Turn on delay", ) From 377c1c7c7eec138f37af48e0cf3922a8abdd2609 Mon Sep 17 00:00:00 2001 From: jintj Date: Mon, 14 Jul 2025 14:37:47 +0800 Subject: [PATCH 47/51] update --- zhaquirks/thirdreality/plug.py | 10 ++++------ zhaquirks/thirdreality/plug_dual.py | 28 ++++++++++++---------------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/zhaquirks/thirdreality/plug.py b/zhaquirks/thirdreality/plug.py index 7fa3540836..8eafc81516 100644 --- a/zhaquirks/thirdreality/plug.py +++ b/zhaquirks/thirdreality/plug.py @@ -42,10 +42,10 @@ class AttributeDefs(BaseAttributeDefs): ( QuirkBuilder("Third Reality, Inc", "3RSP02028BZ") - .also_applies_to("Third Reality, Inc", "3RSPE01044BZ") - .also_applies_to("Third Reality, Inc", "3RSPU01080Z") - .also_applies_to("Third Reality, Inc", "3RSP02064Z") - .also_applies_to("Third Reality, Inc", "3RSPE02065Z") + .applies_to("Third Reality, Inc", "3RSPE01044BZ") + .applies_to("Third Reality, Inc", "3RSPU01080Z") + .applies_to("Third Reality, Inc", "3RSP02064Z") + .applies_to("Third Reality, Inc", "3RSPE02065Z") .replaces(ThirdRealityPlugCluster) .write_attr_button( attribute_name=ThirdRealityPlugCluster.AttributeDefs.reset_summation_delivered.name, @@ -61,7 +61,6 @@ class AttributeDefs(BaseAttributeDefs): min_value=0, max_value=65535, step=1, - mode="box", unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, translation_key="on_to_off_delay", @@ -74,7 +73,6 @@ class AttributeDefs(BaseAttributeDefs): min_value=0, max_value=65535, step=1, - mode="box", unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, translation_key="off_to_on_delay", diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index c89b64d3a6..febfb5665e 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -42,7 +42,7 @@ class AttributeDefs(BaseAttributeDefs): ( QuirkBuilder("Third Reality, Inc", "3RDP01072Z") - .also_applies_to("Third Reality, Inc", "3RWP01073Z") + .applies_to("Third Reality, Inc", "3RSP02028BZ") .replaces(ThirdRealityPlugCluster, endpoint_id=1) .replaces(ThirdRealityPlugCluster, endpoint_id=2) .write_attr_button( @@ -50,7 +50,7 @@ class AttributeDefs(BaseAttributeDefs): attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, - translation_key="reset_summation_delivered_ep1", + translation_key="reset_summation_delivered", fallback_name="Reset left summation delivered", # ep1 is left ) .write_attr_button( @@ -58,8 +58,8 @@ class AttributeDefs(BaseAttributeDefs): attribute_value=0x01, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=2, - translation_key="reset_summation_delivered_ep2", - fallback_name="Reset right summation delivered ep2", # ep2 is right + translation_key="reset_summation_delivered", + fallback_name="Reset right summation delivered", # ep2 is right ) .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, @@ -68,11 +68,10 @@ class AttributeDefs(BaseAttributeDefs): min_value=0, max_value=65535, step=1, - mode="box", unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="on_to_off_delay_ep1", - fallback_name="Turn off delay", + translation_key="on_to_off_delay", + fallback_name="Turn off delay left", ) .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.on_to_off_delay.name, @@ -81,11 +80,10 @@ class AttributeDefs(BaseAttributeDefs): min_value=0, max_value=65535, step=1, - mode="box", unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="on_to_off_delay_ep2", - fallback_name="Turn off delay", + translation_key="on_to_off_delay", + fallback_name="Turn off delay right", ) .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, @@ -94,11 +92,10 @@ class AttributeDefs(BaseAttributeDefs): min_value=0, max_value=65535, step=1, - mode="box", unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="off_to_on_delay_ep1", - fallback_name="Turn on delay", + translation_key="off_to_on_delay", + fallback_name="Turn on delay left", ) .number( attribute_name=ThirdRealityPlugCluster.AttributeDefs.off_to_on_delay.name, @@ -107,11 +104,10 @@ class AttributeDefs(BaseAttributeDefs): min_value=0, max_value=65535, step=1, - mode="box", unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="off_to_on_delay_ep2", - fallback_name="Turn on delay", + translation_key="off_to_on_delay", + fallback_name="Turn on delay right", ) .add_to_registry() ) From bed3146c1ccd0def47d0ffa29da10657cf2fcaef Mon Sep 17 00:00:00 2001 From: jintj Date: Mon, 14 Jul 2025 14:52:25 +0800 Subject: [PATCH 48/51] update --- zhaquirks/thirdreality/plug_dual.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index febfb5665e..be13afc955 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -50,7 +50,7 @@ class AttributeDefs(BaseAttributeDefs): attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, - translation_key="reset_summation_delivered", + translation_key="reset_summation_delivered1", fallback_name="Reset left summation delivered", # ep1 is left ) .write_attr_button( @@ -58,7 +58,7 @@ class AttributeDefs(BaseAttributeDefs): attribute_value=0x01, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=2, - translation_key="reset_summation_delivered", + translation_key="reset_summation_delivered2", fallback_name="Reset right summation delivered", # ep2 is right ) .number( @@ -70,7 +70,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="on_to_off_delay", + translation_key="on_to_off_delay1", fallback_name="Turn off delay left", ) .number( @@ -82,7 +82,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="on_to_off_delay", + translation_key="on_to_off_delay2", fallback_name="Turn off delay right", ) .number( @@ -94,7 +94,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="off_to_on_delay", + translation_key="off_to_on_delay1", fallback_name="Turn on delay left", ) .number( @@ -106,7 +106,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="off_to_on_delay", + translation_key="off_to_on_delay2", fallback_name="Turn on delay right", ) .add_to_registry() From 0af949417f96c41a3e0fec1154178ddb4e331aa5 Mon Sep 17 00:00:00 2001 From: jintj Date: Mon, 14 Jul 2025 14:56:00 +0800 Subject: [PATCH 49/51] update --- zhaquirks/thirdreality/plug_dual.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index be13afc955..0cefb46676 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -42,7 +42,7 @@ class AttributeDefs(BaseAttributeDefs): ( QuirkBuilder("Third Reality, Inc", "3RDP01072Z") - .applies_to("Third Reality, Inc", "3RSP02028BZ") + .applies_to("Third Reality, Inc", "3RWP01073Z") .replaces(ThirdRealityPlugCluster, endpoint_id=1) .replaces(ThirdRealityPlugCluster, endpoint_id=2) .write_attr_button( From d4951f655f70a1511844da9e04b51e940d51503d Mon Sep 17 00:00:00 2001 From: jintj Date: Thu, 4 Sep 2025 15:26:42 +0800 Subject: [PATCH 50/51] update plug_dual translation_key --- zhaquirks/thirdreality/plug_dual.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index 0cefb46676..3306e6743c 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -50,7 +50,7 @@ class AttributeDefs(BaseAttributeDefs): attribute_value=0x01, # 1 reset summation delivered cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=1, - translation_key="reset_summation_delivered1", + translation_key="reset_summation_delivered_1", fallback_name="Reset left summation delivered", # ep1 is left ) .write_attr_button( @@ -58,7 +58,7 @@ class AttributeDefs(BaseAttributeDefs): attribute_value=0x01, cluster_id=ThirdRealityPlugCluster.cluster_id, endpoint_id=2, - translation_key="reset_summation_delivered2", + translation_key="reset_summation_delivered_2", fallback_name="Reset right summation delivered", # ep2 is right ) .number( @@ -70,7 +70,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="on_to_off_delay1", + translation_key="on_to_off_delay_1", fallback_name="Turn off delay left", ) .number( @@ -82,7 +82,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="on_to_off_delay2", + translation_key="on_to_off_delay_1", fallback_name="Turn off delay right", ) .number( @@ -94,7 +94,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="off_to_on_delay1", + translation_key="off_to_on_delay_1", fallback_name="Turn on delay left", ) .number( @@ -106,7 +106,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="off_to_on_delay2", + translation_key="off_to_on_delay_2", fallback_name="Turn on delay right", ) .add_to_registry() From 640321bcc0b7221ccd395d1734b28cb07801a716 Mon Sep 17 00:00:00 2001 From: jintj Date: Thu, 4 Sep 2025 15:30:06 +0800 Subject: [PATCH 51/51] update --- zhaquirks/thirdreality/plug_dual.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zhaquirks/thirdreality/plug_dual.py b/zhaquirks/thirdreality/plug_dual.py index 3306e6743c..d518f6ebcd 100644 --- a/zhaquirks/thirdreality/plug_dual.py +++ b/zhaquirks/thirdreality/plug_dual.py @@ -82,7 +82,7 @@ class AttributeDefs(BaseAttributeDefs): step=1, unit=UnitOfTime.SECONDS, device_class=NumberDeviceClass.DURATION, - translation_key="on_to_off_delay_1", + translation_key="on_to_off_delay_2", fallback_name="Turn off delay right", ) .number(