From 5a73a79bab9d8609f9d46fa8441446e3608a67c6 Mon Sep 17 00:00:00 2001 From: InovelliUSA Date: Fri, 5 Dec 2025 19:45:54 -0700 Subject: [PATCH 1/2] updating support for VZM32 --- zhaquirks/inovelli/VZM32SN.py | 3 +- zhaquirks/inovelli/__init__.py | 99 ++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/zhaquirks/inovelli/VZM32SN.py b/zhaquirks/inovelli/VZM32SN.py index ba731cfe61..616b8353cb 100644 --- a/zhaquirks/inovelli/VZM32SN.py +++ b/zhaquirks/inovelli/VZM32SN.py @@ -3,11 +3,12 @@ from zigpy.profiles import zha from zigpy.quirks.v2 import QuirkBuilder -from zhaquirks.inovelli import INOVELLI_AUTOMATION_TRIGGERS, InovelliVZM32SNCluster +from zhaquirks.inovelli import INOVELLI_AUTOMATION_TRIGGERS, InovelliVZM32SNCluster, InovelliVZM32SNMMWaveCluster ( QuirkBuilder("Inovelli", "VZM32-SN") .replaces_endpoint(1, device_type=zha.DeviceType.DIMMABLE_LIGHT) + .replace_cluster_occurrences(InovelliVZM32SNMMWaveCluster) .replace_cluster_occurrences(InovelliVZM32SNCluster) .device_automation_triggers(INOVELLI_AUTOMATION_TRIGGERS) .add_to_registry() diff --git a/zhaquirks/inovelli/__init__.py b/zhaquirks/inovelli/__init__.py index 83aca1ec01..b3d0bc45ef 100644 --- a/zhaquirks/inovelli/__init__.py +++ b/zhaquirks/inovelli/__init__.py @@ -1277,6 +1277,105 @@ class AttributeDefs(InovelliCluster.AttributeDefs): ) +class InovelliVZM32SNMMWaveCluster(CustomCluster): + """Inovelli VZM32-SN MMWave custom cluster.""" + + cluster_id = 0xFC32 + ep_attribute = "inovelli_vzm32snmmwave_cluster" + + class AttributeDefs(BaseAttributeDefs): + """Attribute definitions.""" + + mmwave_z_min = ZCLAttributeDef( + id=0x0065, + type=t.int16s, + is_manufacturer_specific=True, + ) + mmwave_z_max = ZCLAttributeDef( + id=0x0066, + type=t.int16s, + is_manufacturer_specific=True, + ) + mmwave_x_min = ZCLAttributeDef( + id=0x0067, + type=t.int16s, + is_manufacturer_specific=True, + ) + mmwave_x_max = ZCLAttributeDef( + id=0x0068, + type=t.int16s, + is_manufacturer_specific=True, + ) + mmwave_y_min = ZCLAttributeDef( + id=0x0069, + type=t.int16s, + is_manufacturer_specific=True, + ) + mmwave_y_max = ZCLAttributeDef( + id=0x006A, + type=t.int16s, + is_manufacturer_specific=True, + ) + mmwave_target_info_report = ZCLAttributeDef( + id=0x006B, + type=t.uint8_t, + is_manufacturer_specific=True, + ) + mmwave_stay_life = ZCLAttributeDef( + id=0x006C, + type=t.uint32_t, + is_manufacturer_specific=True, + ) + mmwave_detect_sensitivity = ZCLAttributeDef( + id=0x0070, + type=t.uint8_t, + is_manufacturer_specific=True, + ) + mmwave_detect_trigger = ZCLAttributeDef( + id=0x0071, + type=t.uint8_t, + is_manufacturer_specific=True, + ) + mmwave_hold_time = ZCLAttributeDef( + id=0x0072, + type=t.uint32_t, + is_manufacturer_specific=True, + ) + mmwave_version = ZCLAttributeDef( + id=0x0073, + type=t.uint32_t, + is_manufacturer_specific=True, + ) + + class ServerCommandDefs(BaseCommandDefs): + """Server command definitions.""" + + mmwave_control_command = ZCLCommandDef( + id=0x00, + schema={ + "control_id": t.uint8_t, + }, + is_manufacturer_specific=True, + ) + + def handle_cluster_request( + self, + hdr: ZCLHeader, + args: list[Any], + *, + dst_addressing: Optional[ + Union[t.Addressing.Group, t.Addressing.IEEE, t.Addressing.NWK] + ] = None, + ): + """Handle a cluster request.""" + _LOGGER.debug( + "%s: handle_cluster_request - Command: %s Data: %s", + self.name, + hdr.command_id, + args, + ) + + class InovelliVZM35SNCluster(InovelliCluster): """Inovelli VZM35-SN custom cluster.""" From 648a15b94f3347a9bc480ce58f4edf565dffb76d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 04:30:02 +0000 Subject: [PATCH 2/2] Apply pre-commit auto fixes --- zhaquirks/inovelli/VZM32SN.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/zhaquirks/inovelli/VZM32SN.py b/zhaquirks/inovelli/VZM32SN.py index 616b8353cb..a3d9811b90 100644 --- a/zhaquirks/inovelli/VZM32SN.py +++ b/zhaquirks/inovelli/VZM32SN.py @@ -3,7 +3,11 @@ from zigpy.profiles import zha from zigpy.quirks.v2 import QuirkBuilder -from zhaquirks.inovelli import INOVELLI_AUTOMATION_TRIGGERS, InovelliVZM32SNCluster, InovelliVZM32SNMMWaveCluster +from zhaquirks.inovelli import ( + INOVELLI_AUTOMATION_TRIGGERS, + InovelliVZM32SNCluster, + InovelliVZM32SNMMWaveCluster, +) ( QuirkBuilder("Inovelli", "VZM32-SN")