Help adding a variation of Tuya TS0044, TS004F to ZHA

Let’s work together to make this into the official quirk db, shall we?
I don’t have the device myself.

@quentinn Would you be so kind as to post the latest version of your quirk, please
@all Never did it myself but you can now create custom quirks in HA.

The steps as I understand them:

  1. Create a custom quirk dir in HA, e.g., /config/custom_zha_quirks
  2. In configuration.yaml, point to this directory:
zha:
  custom_quirks_path: /config/custom_zha_quirks/
  1. in this directory, create a file ts004f.py with content of the quirk that will be posted

If anyone has actual experience with custom quirks, please shout if I say something stupid (@Hedda ?)

3 Likes

Hello
sorry did not have time to focus on this.

The problem I think comes from the function referenced in the quirk replacement TuyaSmartRemoteOnOffCluster which cannot handle the specific events of this type of switch.

here is my quirk

"""Tuya 4 Button Remote TS004F"""

from zigpy.profiles import zha
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.general import Basic, OnOff, Identify, Ota, LevelControl, PowerConfiguration, Time, Groups, Scenes
from zigpy.zcl.clusters.lightlink import LightLink

from zhaquirks.const import (
    BUTTON_1,
    BUTTON_2,
    BUTTON_3,
    BUTTON_4,
    COMMAND,
    DEVICE_TYPE,
    DOUBLE_PRESS,
    ENDPOINT_ID,
    ENDPOINTS,
    INPUT_CLUSTERS,
    LONG_PRESS,
    MODELS_INFO,
    OUTPUT_CLUSTERS,
    PROFILE_ID,
    SHORT_PRESS,
)
from zhaquirks.tuya import TuyaSmartRemoteOnOffCluster


class Tuya4NewButtonTriggers:
    """Tuya 4-button New version remote device triggers."""

    device_automation_triggers = {
        (SHORT_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: SHORT_PRESS},
        (LONG_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: LONG_PRESS},
        (DOUBLE_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: DOUBLE_PRESS},
        (SHORT_PRESS, BUTTON_2): {ENDPOINT_ID: 1, COMMAND: SHORT_PRESS},
        (LONG_PRESS, BUTTON_2): {ENDPOINT_ID: 1, COMMAND: LONG_PRESS},
        (DOUBLE_PRESS, BUTTON_2): {ENDPOINT_ID: 1, COMMAND: DOUBLE_PRESS},
        (SHORT_PRESS, BUTTON_3): {ENDPOINT_ID: 1, COMMAND: SHORT_PRESS},
        (LONG_PRESS, BUTTON_3): {ENDPOINT_ID: 1, COMMAND: LONG_PRESS},
        (DOUBLE_PRESS, BUTTON_3): {ENDPOINT_ID: 1, COMMAND: DOUBLE_PRESS},
        (SHORT_PRESS, BUTTON_4): {ENDPOINT_ID: 1, COMMAND: SHORT_PRESS},
        (LONG_PRESS, BUTTON_4): {ENDPOINT_ID: 1, COMMAND: LONG_PRESS},
        (DOUBLE_PRESS, BUTTON_4): {ENDPOINT_ID: 1, COMMAND: DOUBLE_PRESS},
    }


class TuyaSmartRemote004F(CustomDevice, Tuya4NewButtonTriggers):
    """Tuya 4-button New version remote device."""

    signature = {
        # "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=0, *allocate_address=True, *complex_descriptor_available=False, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False, *is_valid=True, *logical_type=<LogicalType.EndDevice: 2>, *user_descriptor_available=False)",
        # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=260, device_version=1, input_clusters=[0, 1, 3, 4, 6, 4096], output_clusters=[25, 10, 3, 4, 5, 6, 8, 4096])
        MODELS_INFO: [("_TZ3000_xabckq1v", "TS004F")],
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.DIMMER_SWITCH,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    OnOff.cluster_id,
                    LightLink.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Ota.cluster_id,
                    Time.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    LightLink.cluster_id,
                ],
            }
        },
    }
    replacement = {
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.REMOTE_CONTROL,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    TuyaSmartRemoteOnOffCluster,
                    LightLink.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Ota.cluster_id,
                    Time.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    TuyaSmartRemoteOnOffCluster,
                    LevelControl.cluster_id,
                    LightLink.cluster_id,
                ],
            }
        },
    }


class ZemiSmartRemote004F(CustomDevice, Tuya4NewButtonTriggers):
    """Tuya 4-button New version remote device."""

    signature = {
        # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=260, device_version=1, input_clusters=[0, 1, 3, 4, 6, 4096], output_clusters=[25, 10, 3, 4, 5, 6, 8, 4096])
        MODELS_INFO: [("_TZ3000_xabckq1v", "TS004F")],
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.DIMMER_SWITCH,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    OnOff.cluster_id,
                    LightLink.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Ota.cluster_id,
                    Time.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    LightLink.cluster_id,
                ],
            }
        },
    }
    replacement = {
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.REMOTE_CONTROL,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    TuyaSmartRemoteOnOffCluster,
                    LightLink.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Ota.cluster_id,
                    Time.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    TuyaSmartRemoteOnOffCluster,
                    LevelControl.cluster_id,
                    LightLink.cluster_id,
                ],
            }
        },
    }
1 Like

Thanks.
Am I correct that “ZemiSmartRemote004F” and “TuyaSmartRemote004F” are duplicates?

Yes. It is a copy of the other template. I’ve kept the architecture.

Could someone try this quirk with the steps I described above and report on the results (with logs), please.

"""Tuya 4 Button Remote TS004F"""

from zigpy.profiles import zha
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.general import Basic, OnOff, Identify, Ota, LevelControl, PowerConfiguration, Time, Groups, Scenes
from zigpy.zcl.clusters.lightlink import LightLink

from zhaquirks.const import (
    MODEL,
    BUTTON_1,
    BUTTON_2,
    BUTTON_3,
    BUTTON_4,
    ARGS,
    COMMAND,
    DEVICE_TYPE,
    DOUBLE_PRESS,
    ENDPOINT_ID,
    ENDPOINTS,
    INPUT_CLUSTERS,
    CLUSTER_ID,
    LONG_PRESS,
    LONG_RELEASE,
    MODELS_INFO,
    OUTPUT_CLUSTERS,
    PROFILE_ID,
    SHORT_PRESS,
    COMMAND_ON,
    COMMAND_OFF,
    COMMAND_STEP,
    COMMAND_MOVE,
    COMMAND_STOP,
)

class Tuya4NewButtonTriggers:
    """Tuya 4-button New version remote device triggers."""

    device_automation_triggers = {
        (SHORT_PRESS, BUTTON_1): {COMMAND: COMMAND_ON, CLUSTER_ID: 6, ENDPOINT_ID: 1},
        (SHORT_PRESS, BUTTON_2): {COMMAND: COMMAND_OFF, CLUSTER_ID: 6, ENDPOINT_ID: 1},
        (SHORT_PRESS, BUTTON_3): {
            COMMAND: COMMAND_STEP,
            CLUSTER_ID: 8,
            ENDPOINT_ID: 1,
            ARGS: [0, 51, 10],
        },
        (LONG_PRESS, BUTTON_3): {
            COMMAND: COMMAND_MOVE,
            CLUSTER_ID: 8,
            ENDPOINT_ID: 1,
            ARGS: [0, 51],
        },
        (SHORT_PRESS, BUTTON_4): {
            COMMAND: COMMAND_STEP,
            CLUSTER_ID: 8,
            ENDPOINT_ID: 1,
            ARGS: [1, 51, 10],
        },		
        (LONG_PRESS, BUTTON_4): {
            COMMAND: COMMAND_MOVE,
            CLUSTER_ID: 8,
            ENDPOINT_ID: 1,
            ARGS: [1, 51],
        },		
        (LONG_RELEASE, BUTTON_4): {COMMAND: COMMAND_STOP, ENDPOINT_ID: 1},        
    }


class TuyaSmartRemote004F(CustomDevice, Tuya4NewButtonTriggers):
    """Tuya 4-button New version remote device."""

    signature = {
        # "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=0, *allocate_address=True, *complex_descriptor_available=False, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False, *is_valid=True, *logical_type=<LogicalType.EndDevice: 2>, *user_descriptor_available=False)",
        # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=260, device_version=1, input_clusters=[0, 1, 3, 4, 6, 4096], output_clusters=[25, 10, 3, 4, 5, 6, 8, 4096])
        MODEL: "TS004F",
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.DIMMER_SWITCH,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    OnOff.cluster_id,
                    LightLink.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Ota.cluster_id,
                    Time.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    LightLink.cluster_id,
                ],
            }
        },
    }
    replacement = {
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.REMOTE_CONTROL,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    OnOff.cluster_id,
                    LightLink.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Ota.cluster_id,
                    Time.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    LightLink.cluster_id,
                ],
            }
        },
    }

I’ve tried as described and it ran into some errors:

  • first error there is missing a } at the end of your file
  • second error:
2021-06-26 19:48:59 DEBUG (MainThread) [zhaquirks] Loading custom quirks from /config/custom_zha_quirks
2021-06-26 19:48:59 DEBUG (MainThread) [zhaquirks] Loading custom quirks module ts004f
2021-06-26 19:48:59 ERROR (MainThread) [homeassistant.config_entries] Error setting up entry ConBee II, s/n: DE2250325 - dresden elektronik ingenieurtechnik GmbH for zha
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/config_entries.py", line 293, in async_setup
result = await component.async_setup_entry(hass, self) # type: ignore
File "/usr/src/homeassistant/homeassistant/components/zha/__init__.py", line 99, in async_setup_entry
setup_quirks(config)
File "/usr/local/lib/python3.8/site-packages/zhaquirks/__init__.py", line 403, in setup
importer.find_module(modname).load_module(modname)
File "<frozen importlib._bootstrap_external>", line 462, in _check_name_wrapper
File "<frozen importlib._bootstrap_external>", line 962, in load_module
File "<frozen importlib._bootstrap_external>", line 787, in load_module
File "<frozen importlib._bootstrap>", line 265, in _load_module_shim
File "<frozen importlib._bootstrap>", line 702, in _load
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 783, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/config/custom_zha_quirks/ts004f.py", line 28, in <module>
class Tuya4NewButtonTriggers:
File "/config/custom_zha_quirks/ts004f.py", line 39, in Tuya4NewButtonTriggers
COMMAND: COMMAND_STEP,
NameError: name 'COMMAND_STEP' is not defined

Thanks. I’ve updated the post, please try again

Alright, I tried:

I had to add 'CLUSTER_ID' and 'ARGS' to the import list.
Then HA started without errors.

2021-06-26 20:27:50 DEBUG (MainThread) [zhaquirks] Loading custom quirks from /config/custom_zha_quirks
2021-06-26 20:27:50 DEBUG (MainThread) [zhaquirks] Loading custom quirks module ts004f

Then I paired the device, here is the log:

[0xb904:1:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=64 command_id=Command.Report_Attributes>
[0xb904:1:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=34934>)]]
[0xb904:1:0x0400] Attribute report received: measured_value=34934
[0xb904:1:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=72 command_id=Command.Report_Attributes>
[0xb904:1:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=34900>)]]
[0xb904:1:0x0400] Attribute report received: measured_value=34900
[0xb904:1:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=76 command_id=Command.Report_Attributes>
[0xb904:1:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=34876>)]]
[0xb904:1:0x0400] Attribute report received: measured_value=34876
[0x55eb:1:0x0006] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=93 command_id=Command.Report_Attributes>
[0x55eb:1:0x0006] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=Bool, value=Bool.false>)]]
[0x55eb:1:0x0006] Attribute report received: on_off=0
[0xb904:1:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=83 command_id=Command.Report_Attributes>
[0xb904:1:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=34846>)]]
[0xb904:1:0x0400] Attribute report received: measured_value=34846
Device 0xf9ef (60:a4:23:ff:fe:db:2f:27) joined the network
[0xf9ef:zdo] ZDO request ZDOCmd.Device_annce: [0xF9EF, 60:a4:23:ff:fe:db:2f:27, 128]
[0xf9ef] Requesting 'Node Descriptor'
Tries remaining: 2
[0xf9ef] Extending timeout for 0x84 request
[0xf9ef] Node Descriptor: NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=0, *allocate_address=True, *complex_descriptor_available=False, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False, *is_valid=True, *logical_type=<LogicalType.EndDevice: 2>, *user_descriptor_available=False)
[0xf9ef] Discovering endpoints
Tries remaining: 3
[0xf9ef] Extending timeout for 0x86 request
[0xb904:1:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=86 command_id=Command.Report_Attributes>
[0xb904:1:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=34826>)]]
[0xb904:1:0x0400] Attribute report received: measured_value=34826
[0xf9ef] Discovered endpoints: [1]
[0xf9ef:1] Discovering endpoint information
Tries remaining: 3
[0xf9ef] Extending timeout for 0x88 request
[0xf9ef:1] Discovered endpoint information: SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=260, device_version=1, input_clusters=[0, 1, 3, 4, 6, 4096], output_clusters=[25, 10, 3, 4, 5, 6, 8, 4096])
[0xf9ef] Extending timeout for 0x8a request
[0xf9ef:1:0x0000] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=138 command_id=Command.Read_Attributes_rsp>
[0xf9ef:1] Manufacturer: _TZ3000_xabckq1v
[0xf9ef:1] Model: TS004F
Checking quirks for _TZ3000_xabckq1v TS004F (60:a4:23:ff:fe:db:2f:27)
Considering <class 'ts004f.TuyaSmartRemote004F'>
Found custom device replacement for 60:a4:23:ff:fe:db:2f:27: <class 'ts004f.TuyaSmartRemote004F'>
device - 0xF9EF:60:a4:23:ff:fe:db:2f:27 entering async_device_initialized - is_new_join: True
device - 0xF9EF:60:a4:23:ff:fe:db:2f:27 has joined the ZHA zigbee network
[0xF9EF](TS004F): started configuration
[0xF9EF:ZDO](TS004F): 'async_configure' stage succeeded
[0xf9ef] Extending timeout for 0x8c request
[0xF9EF:1:0x0000]: finished channel configuration
[0xf9ef] Extending timeout for 0x8e request
[0xf9ef] Extending timeout for 0x90 request
[0xF9EF:1:0x0001]: bound 'power' cluster: Status.SUCCESS
[0xf9ef] Extending timeout for 0x92 request
[0xF9EF:1:0x0008]: bound 'level' cluster: Status.SUCCESS
[0xF9EF:1:0x0008]: finished channel configuration
[0xf9ef] Extending timeout for 0x94 request
[0xf9ef:1:0x1000] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=140 command_id=Command.Default_Response>
[0xF9EF:1:0x0019]: finished channel configuration
[0xf9ef] Extending timeout for 0x96 request
[0xF9EF:1:0x0006]: bound 'TS004X_cluster' cluster: Status.SUCCESS
[0xF9EF:1:0x0006]: finished channel configuration
[0xb904:1:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=89 command_id=Command.Report_Attributes>
[0xb904:1:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=34811>)]]
[0xb904:1:0x0400] Attribute report received: measured_value=34811
[0xbed2:1:0x0006] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=4 command_id=Command.Report_Attributes>
[0xbed2:1:0x0006] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=int8s, value=0>)]]
[0xbed2:1:0x0006] Attribute report received: on_off=0
[0xF9EF:1:0x0005]: bound 'scenes' cluster: Status.SUCCESS
[0xF9EF:1:0x0005]: finished channel configuration
[0xf9ef:1:0x0001] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=146 command_id=Command.Configure_Reporting_rsp>
[0xF9EF:1:0x0001]: reporting 'battery_voltage' attr on 'power' cluster: 3600/10800/1: Result: '[[ConfigureReportingResponseRecord(status=0)]]'
[0xf9ef] Extending timeout for 0x99 request
[0xf9ef:1:0x0001] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=153 command_id=Command.Configure_Reporting_rsp>
[0xF9EF:1:0x0001]: reporting 'battery_percentage_remaining' attr on 'power' cluster: 3600/10800/1: Result: '[[ConfigureReportingResponseRecord(status=0)]]'
[0xF9EF:1:0x0001]: finished channel configuration
[0xF9EF:1:0x1000]: 'async_configure' stage failed: not enough values to unpack (expected 3, got 2)
[0xF9EF:1:0x0000]: 'async_configure' stage succeeded
[0xF9EF:1:0x0001]: 'async_configure' stage succeeded
[0xF9EF:1:0x0008]: 'async_configure' stage succeeded
[0xF9EF:1:0x0006]: 'async_configure' stage succeeded
[0xF9EF:1:0x0019]: 'async_configure' stage succeeded
[0xF9EF:1:0x0005]: 'async_configure' stage succeeded
[0xF9EF](TS004F): completed configuration
[0xF9EF](TS004F): stored in registry: ZhaDeviceEntry(name='_TZ3000_xabckq1v TS004F', ieee='60:a4:23:ff:fe:db:2f:27', last_seen=1624732394.3755572)
[0xf9ef] Extending timeout for 0x9b request
[0xf9ef:1:0x0003] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=155 command_id=Command.Default_Response>
[0xF9EF:1:0x0003]: executed 'trigger_effect' command with args: '(2, 0)' kwargs: '{}' result: [64, <Status.UNSUP_CLUSTER_COMMAND: 129>]
[0xF9EF](TS004F): started initialization
[0xF9EF:ZDO](TS004F): 'async_initialize' stage succeeded
[0xF9EF:1:0x1000]: initializing channel: from_cache: False
[0xF9EF:1:0x1000]: finished channel configuration
[0xF9EF:1:0x0000]: initializing channel: from_cache: False
[0xF9EF:1:0x0000]: finished channel configuration
[0xF9EF:1:0x0001]: initializing channel: from_cache: False
[0xf9ef] Extending timeout for 0x9d request
[0xF9EF:1:0x0008]: initializing channel: from_cache: False
[0xF9EF:1:0x0008]: finished channel configuration
[0xF9EF:1:0x0006]: initializing channel: from_cache: False
[0xF9EF:1:0x0006]: finished channel configuration
[0xF9EF:1:0x0019]: initializing channel: from_cache: False
[0xF9EF:1:0x0019]: finished channel configuration
[0xF9EF:1:0x0005]: initializing channel: from_cache: False
[0xF9EF:1:0x0005]: finished channel configuration
[0xf9ef:1:0x0001] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=157 command_id=Command.Read_Attributes_rsp>
[0xf9ef] Extending timeout for 0x9f request
[0xf9ef:1:0x0001] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=159 command_id=Command.Read_Attributes_rsp>
[0xF9EF:1:0x0001]: finished channel configuration
[0xF9EF:1:0x1000]: 'async_initialize' stage succeeded
[0xF9EF:1:0x0000]: 'async_initialize' stage succeeded
[0xF9EF:1:0x0001]: 'async_initialize' stage succeeded
[0xF9EF:1:0x0008]: 'async_initialize' stage succeeded
[0xF9EF:1:0x0006]: 'async_initialize' stage succeeded
[0xF9EF:1:0x0019]: 'async_initialize' stage succeeded
[0xF9EF:1:0x0005]: 'async_initialize' stage succeeded
[0xF9EF](TS004F): power source: Battery or Unknown
[0xF9EF](TS004F): completed initialization
[0xb904:1:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=92 command_id=Command.Report_Attributes>
[0xb904:1:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=34792>)]]
[0xb904:1:0x0400] Attribute report received: measured_value=34792
[0xde27:1:0x0405] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=104 command_id=Command.Report_Attributes>
[0xde27:1:0x0405] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=6115>)]]
[0xde27:1:0x0405] Attribute report received: measured_value=6115
[0xb904:1:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=95 command_id=Command.Report_Attributes>
[0xb904:1:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=34763>)]]
[0xb904:1:0x0400] Attribute report received: measured_value=34763

Thanks, updated.
Please report on what works and what doesn’t, now :slight_smile:

not much :sweat_smile:

only power, no buttons so far

grafik

You will get events, not entities.
Could provide a log when pressing the various buttons, both short, log, and double, please.

there you go:

top left single:
2021-06-26 22:35:44 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0006] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=49 command_id=1>
2021-06-26 22:35:44 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0006] ZCL request 0x0001: []
2021-06-26 22:35:44 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0006] TS004X: send default response

top left double:
nothing

top left long:
nothing

----

top right single:
2021-06-26 22:39:19 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=62 command_id=2>
2021-06-26 22:39:19 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL request 0x0002: [0, 51, 10]
2021-06-26 22:39:19 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] No handler for cluster command 2

top right double:
nothing

top right long:
 - while pressed, after 3 sec:
2021-06-26 22:40:46 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=74 command_id=1>
2021-06-26 22:40:46 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL request 0x0001: [0, 51]
2021-06-26 22:40:46 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] No handler for cluster command 1
 - on release:
2021-06-26 22:40:47 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=75 command_id=3>
2021-06-26 22:40:47 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL request 0x0003: []
2021-06-26 22:40:47 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] No handler for cluster command 3

----

bottom left single:

2021-06-26 22:42:58 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0006] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=83 command_id=0>
2021-06-26 22:42:58 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0006] ZCL request 0x0000: []
2021-06-26 22:42:58 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0006] TS004X: send default response

bottom left double:
nothing

bottom left long:
nothing

----

bottom right single:

2021-06-26 22:43:48 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=85 command_id=2>
2021-06-26 22:43:48 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL request 0x0002: [1, 51, 10]
2021-06-26 22:43:48 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] No handler for cluster command 2


bottom right double:
nothing

bottom right long:
 - while pressed, after 3 sec:
2021-06-26 22:44:15 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=91 command_id=1>
2021-06-26 22:44:15 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL request 0x0001: [1, 51]
2021-06-26 22:44:15 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] No handler for cluster command 1
 - on release:
2021-06-26 22:44:17 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=92 command_id=3>
2021-06-26 22:44:17 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] ZCL request 0x0003: []
2021-06-26 22:44:17 DEBUG (MainThread) [zigpy.zcl] [0xf9ef:1:0x0008] No handler for cluster command 3

Thanks.
Could you check in developer tools what equivalent zha_events you get, please:

top left single:
nothing

top left double:
nothing

top left long:
nothing

----

top right single:
{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "step",
        "args": [
            0,
            51,
            10
        ]
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-27T13:12:59.600102+00:00",
    "context": {
        "id": "34d1c7ca5c2682107a26af90063b8c93",
        "parent_id": null,
        "user_id": null
    }
}


top right double:
nothing

top right long:
 - while pressed, after 3 sec:
{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "move",
        "args": [
            0,
            51
        ]
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-27T13:13:13.751261+00:00",
    "context": {
        "id": "f8163ad1bb15fc95ef332eae122951e7",
        "parent_id": null,
        "user_id": null
    }
}
 - on release:
{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "stop",
        "args": []
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-27T13:13:14.663657+00:00",
    "context": {
        "id": "5b5d863f578fa934e823ef29660eaf2d",
        "parent_id": null,
        "user_id": null
    }
}

----

bottom left single:
nothing

bottom left double:
nothing

bottom left long:
nothing

----

bottom right single:

{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "step",
        "args": [
            1,
            51,
            10
        ]
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-27T13:14:12.566549+00:00",
    "context": {
        "id": "f5a218d8c97a692dc14add44a52b4d4c",
        "parent_id": null,
        "user_id": null
    }
}

bottom right double:
nothing

bottom right long:
 - while pressed, after 3 sec:
{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "move",
        "args": [
            1,
            51
        ]
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-27T13:14:36.288645+00:00",
    "context": {
        "id": "f4c04f6cab5b124a929fe1696443d49e",
        "parent_id": null,
        "user_id": null
    }
}

 - on release:
{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "stop",
        "args": []
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-27T13:14:37.158553+00:00",
    "context": {
        "id": "2a284ff613f373157d78282363f1396c",
        "parent_id": null,
        "user_id": null
    }
}

I can confirm I obtained the same result as above last night.

Looks like the initial assumption that this device is similar to TS0044 is wrong.
That one only support 6 actions:

  • Top-left single
  • Bottom-left single
  • Top-right single & long
  • Bottom-right single & long

I’ve updated the quirk.
Please redo the tests and show logs and events.

Thanks

P.S. sorry for the iterations, as a reminder I don’t own the device.

FYI the device should support all three actions on the buttons. And I checked in the Tuya app. I know this is weird and that is why I could not figure out the mapping

IDK, maybe those are emulated software-wise?
Zigbee-wise, the left ones are on-off, the right ones are “LevelControl” (dimmer).

@quentinn BTW, Are those “promises” actually fulfilled? Can you actually do a different long-press action on the left ones?

I’ve got all the logs for you. I havn’t tested it in the tuya app so far.

  • I’ve had to add following to the import section:
    • COMMAND_STOP
    • LONG_RELEASE

logs on key presses:

top left single:

2021-06-28 10:36:50 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0006] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=24 command_id=1>
2021-06-28 10:36:50 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0006] ZCL request 0x0001: []
2021-06-28 10:36:50 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0006] No handler for cluster command 1

---
bottom left single:

2021-06-28 10:37:07 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0006] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=28 command_id=0>
2021-06-28 10:37:07 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0006] ZCL request 0x0000: []
2021-06-28 10:37:07 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0006] No handler for cluster command 0

---
top right short:

2021-06-28 10:37:20 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=31 command_id=2>
2021-06-28 10:37:20 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL request 0x0002: [0, 51, 10]
2021-06-28 10:37:20 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] No handler for cluster command 2

---
top right long:

 - pressed (3s):

2021-06-28 10:38:17 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=32 command_id=1>
2021-06-28 10:38:17 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL request 0x0001: [0, 51]
2021-06-28 10:38:17 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] No handler for cluster command 1
 
 - on release:

2021-06-28 10:39:16 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=35 command_id=3>
2021-06-28 10:39:16 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL request 0x0003: []
2021-06-28 10:39:16 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] No handler for cluster command 3

---
bottom right short:

2021-06-28 10:40:08 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=39 command_id=2>
2021-06-28 10:40:08 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL request 0x0002: [1, 51, 10]
2021-06-28 10:40:08 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] No handler for cluster command 2

---
bottom right long:

 - pressed (3s):

2021-06-28 10:40:35 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=40 command_id=1>
2021-06-28 10:40:35 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL request 0x0001: [1, 51]
2021-06-28 10:40:35 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] No handler for cluster command 1

 - on release:

2021-06-28 10:40:36 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=41 command_id=3>
2021-06-28 10:40:36 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] ZCL request 0x0003: []
2021-06-28 10:40:36 DEBUG (MainThread) [zigpy.zcl] [0xbb77:1:0x0008] No handler for cluster command 3

events:

top left single:

 nothing

---

bottom left single:

 nothing


---

top right short:

{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "step",
        "args": [
            0,
            51,
            10
        ]
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-28T08:44:28.332268+00:00",
    "context": {
        "id": "fee6bda6f2d4b221f3e90e8fbc59eeec",
        "parent_id": null,
        "user_id": null
    }
}

---

top right long:

 - pressed:
 
 {
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "move",
        "args": [
            0,
            51
        ]
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-28T08:45:17.907806+00:00",
    "context": {
        "id": "6c0b740bb511f21ad4aa730f5722fd64",
        "parent_id": null,
        "user_id": null
    }
}
 
 - on release:
 
 {
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "stop",
        "args": []
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-28T08:45:18.696362+00:00",
    "context": {
        "id": "370e53caed41f35d5b936374ba2c41d2",
        "parent_id": null,
        "user_id": null
    }
}

---

bottom right short:

{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "step",
        "args": [
            1,
            51,
            10
        ]
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-28T08:48:02.407234+00:00",
    "context": {
        "id": "96c83c796ef0d89eb0f797c17079d6cd",
        "parent_id": null,
        "user_id": null
    }
}

---

bottom right long:

 - pressed:
 
{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "move",
        "args": [
            1,
            51
        ]
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-28T08:48:33.580849+00:00",
    "context": {
        "id": "48416446b841b3731d1a04a7e0dec0a7",
        "parent_id": null,
        "user_id": null
    }
}
 
 - on release:
 
{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "60:a4:23:ff:fe:db:2f:27",
        "unique_id": "60:a4:23:ff:fe:db:2f:27:1:0x0008",
        "device_id": "6553e1c231f756fc4ddeb1b181013424",
        "endpoint_id": 1,
        "cluster_id": 8,
        "command": "stop",
        "args": []
    },
    "origin": "LOCAL",
    "time_fired": "2021-06-28T08:48:34.429647+00:00",
    "context": {
        "id": "12bcad4782c1b2f8859c301d46da2543",
        "parent_id": null,
        "user_id": null
    }
}

I’m clueless on why the left ones do not produce any events, I must say…