Help with custom Quirk needed - _TZE200_7iqgciln MG-AUDIM02ZLP-XX - TS0601 - Tuya

I have those dimmers: Zigbee Dimmer Switch RGB Backlight Adjustable - 2025 MODEL SAA APPROVE – Asthome Smart Electrical Supplies

When adding to ZHA they connect but have no identities for on/off, dimmer, etc.

Diag:

{
  "home_assistant": {
    "arch": "aarch64",
    "dev": false,
    "docker": true,
    "hassio": true,
    "installation_type": "Home Assistant OS",
    "os_name": "Linux",
    "os_version": "6.12.75-haos-raspi",
    "python_version": "3.14.2",
    "timezone": "Australia/Sydney",
    "version": "2026.5.0",
    "virtualenv": false,
    "container_arch": "aarch64",
    "supervisor": "2026.04.2",
    "host_os": "Home Assistant OS 17.3",
    "docker_version": "29.3.1",
    "chassis": "embedded",
    "run_as_root": true
  },
  "custom_components": {
    "hacs": {
      "documentation": "https://hacs.xyz/docs/use/",
      "version": "2.0.5",
      "requirements": [
        "aiogithubapi>=22.10.1"
      ]
    },
    "home_connect_alt": {
      "documentation": "https://github.com/ekutner/home-connect-hass",
      "version": "1.3.6",
      "requirements": [
        "home-connect-async==0.8.5"
      ]
    },
    "presence_simulation": {
      "documentation": "https://github.com/slashback100/presence_simulation",
      "version": "5.1",
      "requirements": []
    },
    "localtuya": {
      "documentation": "https://github.com/rospogrigio/localtuya/",
      "version": "5.2.3",
      "requirements": []
    },
    "bureau_of_meteorology": {
      "documentation": "https://github.com/bremor/bureau_of_meteorology",
      "version": "1.3.5",
      "requirements": [
        "iso8601"
      ]
    },
    "patch_aionanoleaf": {
      "documentation": null,
      "version": "2025.09.21",
      "requirements": []
    },
    "lunar_phase": {
      "documentation": "https://github.com/ngocjohn/lunar-phase",
      "version": "0.2.2",
      "requirements": [
        "ephem==4.1.6"
      ]
    },
    "govee_lan": {
      "documentation": "https://github.com/wez/govee-lan-hass",
      "version": "1.0.0",
      "requirements": [
        "govee-led-wez>=0.0.15"
      ]
    },
    "awtrix": {
      "documentation": "https://github.com/MiguelAngelLV/ha-awtrix",
      "version": "0.7.0",
      "requirements": []
    },
    "battery_notes": {
      "documentation": "https://andrew-codechimp.github.io/HA-Battery-Notes/",
      "version": "3.4.5",
      "requirements": []
    }
  },
  "integration_manifest": {
    "domain": "zha",
    "name": "Zigbee Home Automation",
    "after_dependencies": [
      "hassio",
      "onboarding",
      "usb"
    ],
    "codeowners": [
      "dmulcahey",
      "adminiuga",
      "puddly",
      "TheJulianJES"
    ],
    "config_flow": true,
    "dependencies": [
      "file_upload",
      "homeassistant_hardware"
    ],
    "documentation": "https://www.home-assistant.io/integrations/zha",
    "integration_type": "hub",
    "iot_class": "local_polling",
    "loggers": [
      "aiosqlite",
      "bellows",
      "crccheck",
      "pure_pcapy3",
      "zhaquirks",
      "zigpy",
      "zigpy_deconz",
      "zigpy_xbee",
      "zigpy_zigate",
      "zigpy_znp",
      "zha",
      "universal_silabs_flasher",
      "serialx"
    ],
    "requirements": [
      "zha==1.3.0"
    ],
    "usb": [
      {
        "description": "*2652*",
        "known_devices": [
          "slae.sh cc2652rb stick"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*slzb-07*",
        "known_devices": [
          "smlight slzb-07"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*sonoff*plus*",
        "known_devices": [
          "sonoff zigbee dongle plus v2"
        ],
        "pid": "55D4",
        "vid": "1A86"
      },
      {
        "description": "*sonoff*plus*",
        "known_devices": [
          "sonoff zigbee dongle plus"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ],
        "pid": "7523",
        "vid": "1A86"
      },
      {
        "description": "*zigstar*",
        "known_devices": [
          "ZigStar Coordinators"
        ],
        "pid": "7523",
        "vid": "1A86"
      },
      {
        "description": "*conbee*",
        "known_devices": [
          "Conbee II"
        ],
        "pid": "0030",
        "vid": "1CF1"
      },
      {
        "description": "*conbee*",
        "known_devices": [
          "Conbee III"
        ],
        "pid": "6015",
        "vid": "0403"
      },
      {
        "description": "*zigbee*",
        "known_devices": [
          "Nortek HUSBZB-1"
        ],
        "pid": "8A2A",
        "vid": "10C4"
      },
      {
        "description": "*zigate*",
        "known_devices": [
          "ZiGate+"
        ],
        "pid": "6015",
        "vid": "0403"
      },
      {
        "description": "*zigate*",
        "known_devices": [
          "ZiGate"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*bv 2010/10*",
        "known_devices": [
          "Bitron Video AV2010/10"
        ],
        "pid": "8B34",
        "vid": "10C4"
      },
      {
        "description": "*sonoff*max*",
        "known_devices": [
          "SONOFF Dongle Max MG24"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*sonoff*lite*mg21*",
        "known_devices": [
          "sonoff zigbee dongle lite mg21"
        ],
        "pid": "EA60",
        "vid": "10C4"
      }
    ],
    "zeroconf": [
      {
        "name": "tube*",
        "type": "_esphomelib._tcp.local."
      },
      {
        "name": "*zigate*",
        "type": "_zigate-zigbee-gateway._tcp.local."
      },
      {
        "name": "*zigstar*",
        "type": "_zigstar_gw._tcp.local."
      },
      {
        "name": "uzg-01*",
        "type": "_uzg-01._tcp.local."
      },
      {
        "name": "slzb-06*",
        "type": "_slzb-06._tcp.local."
      },
      {
        "name": "xzg*",
        "type": "_xzg._tcp.local."
      },
      {
        "name": "czc*",
        "type": "_czc._tcp.local."
      },
      {
        "name": "*",
        "type": "_zigbee-coordinator._tcp.local."
      }
    ],
    "is_built_in": true,
    "overwrites_built_in": false
  },
  "setup_times": {
    "null": {
      "setup": 0.0001795560000346086
    },
    "d290d4d694e1199eac1aefb0e281c2b5": {
      "wait_import_platforms": -0.07437576799998169,
      "config_entry_setup": 21.39404456500006
    }
  },
  "data": {
    "version": 1,
    "ieee": "**REDACTED**",
    "nwk": "0x2A7F",
    "manufacturer": "_TZE200_7iqgciln",
    "model": "TS0601",
    "friendly_manufacturer": "_TZE200_7iqgciln",
    "friendly_model": "TS0601",
    "name": "_TZE200_7iqgciln TS0601",
    "quirk_applied": false,
    "quirk_class": "zigpy.device.Device",
    "exposes_features": [],
    "manufacturer_code": 4417,
    "power_source": "Mains",
    "lqi": 164,
    "rssi": -59,
    "last_seen": "2026-05-07T05:18:34.055114+00:00",
    "available": true,
    "device_type": "Router",
    "active_coordinator": false,
    "node_descriptor": {
      "logical_type": "Router",
      "complex_descriptor_available": false,
      "user_descriptor_available": false,
      "reserved": 0,
      "aps_flags": 0,
      "frequency_band": 8,
      "mac_capability_flags": 142,
      "manufacturer_code": 4417,
      "maximum_buffer_size": 66,
      "maximum_incoming_transfer_size": 66,
      "server_mask": 10752,
      "maximum_outgoing_transfer_size": 66,
      "descriptor_capability_field": 0
    },
    "endpoints": {
      "1": {
        "profile_id": 260,
        "device_type": {
          "name": "SMART_PLUG",
          "id": 81
        },
        "in_clusters": [
          {
            "cluster_id": "0x0000",
            "endpoint_attribute": "basic",
            "attributes": [
              {
                "id": "0x0001",
                "name": "app_version",
                "zcl_type": "uint8",
                "value": 65
              },
              {
                "id": "0x0004",
                "name": "manufacturer",
                "zcl_type": "string",
                "value": "_TZE200_7iqgciln"
              },
              {
                "id": "0x0005",
                "name": "model",
                "zcl_type": "string",
                "value": "TS0601"
              }
            ]
          },
          {
            "cluster_id": "0x0004",
            "endpoint_attribute": "groups",
            "attributes": []
          },
          {
            "cluster_id": "0x0005",
            "endpoint_attribute": "scenes",
            "attributes": []
          },
          {
            "cluster_id": "0xef00",
            "endpoint_attribute": null,
            "attributes": []
          }
        ],
        "out_clusters": [
          {
            "cluster_id": "0x000a",
            "endpoint_attribute": "time",
            "attributes": []
          },
          {
            "cluster_id": "0x0019",
            "endpoint_attribute": "ota",
            "attributes": [
              {
                "id": "0x0002",
                "name": "current_file_version",
                "zcl_type": "uint32",
                "value": 65
              }
            ],
            "last_query_cmd": {
              "manufacturer_code": 4417,
              "image_type": 54179,
              "current_file_version": 65,
              "hardware_version": null
            }
          }
        ]
      },
      "242": {
        "profile_id": 41440,
        "device_type": {
          "name": "PROXY_BASIC",
          "id": 97
        },
        "in_clusters": [],
        "out_clusters": [
          {
            "cluster_id": "0x0021",
            "endpoint_attribute": "green_power",
            "attributes": []
          }
        ]
      }
    },
    "original_signature": {
      "manufacturer": "_TZE200_7iqgciln",
      "model": "TS0601",
      "node_desc": {
        "logical_type": 1,
        "complex_descriptor_available": 0,
        "user_descriptor_available": 0,
        "reserved": 0,
        "aps_flags": 0,
        "frequency_band": 8,
        "mac_capability_flags": 142,
        "manufacturer_code": 4417,
        "maximum_buffer_size": 66,
        "maximum_incoming_transfer_size": 66,
        "server_mask": 10752,
        "maximum_outgoing_transfer_size": 66,
        "descriptor_capability_field": 0
      },
      "endpoints": {
        "1": {
          "profile_id": "0x0104",
          "device_type": "0x0051",
          "input_clusters": [
            "0x0004",
            "0x0005",
            "0xef00",
            "0x0000"
          ],
          "output_clusters": [
            "0x0019",
            "0x000a"
          ]
        },
        "242": {
          "profile_id": "0xa1e0",
          "device_type": "0x0061",
          "input_clusters": [],
          "output_clusters": [
            "0x0021"
          ]
        }
      }
    },
    "zha_lib_entities": {
      "sensor": [
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "sensor",
            "class_name": "LQISensor",
            "translation_key": "lqi",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": "measurement",
            "entity_category": "diagnostic",
            "entity_registry_enabled_default": false,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "BasicClusterHandler",
                "generic_id": "cluster_handler_0x0000",
                "endpoint_id": 1,
                "cluster": {
                  "id": 0,
                  "name": "Basic",
                  "type": "server"
                },
                "id": "1:0x0000",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": null
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "suggested_display_precision": null,
            "unit": null
          },
          "state": {
            "class_name": "LQISensor",
            "available": true,
            "state": 164
          }
        },
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "sensor",
            "class_name": "RSSISensor",
            "translation_key": "rssi",
            "translation_placeholders": null,
            "device_class": "signal_strength",
            "state_class": "measurement",
            "entity_category": "diagnostic",
            "entity_registry_enabled_default": false,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "BasicClusterHandler",
                "generic_id": "cluster_handler_0x0000",
                "endpoint_id": 1,
                "cluster": {
                  "id": 0,
                  "name": "Basic",
                  "type": "server"
                },
                "id": "1:0x0000",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": null
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "suggested_display_precision": null,
            "unit": "dBm"
          },
          "state": {
            "class_name": "RSSISensor",
            "available": true,
            "state": -59
          }
        }
      ],
      "update": [
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "update",
            "class_name": "FirmwareUpdateEntity",
            "translation_key": null,
            "translation_placeholders": null,
            "device_class": "firmware",
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "OtaClientClusterHandler",
                "generic_id": "cluster_handler_0x0019_client",
                "endpoint_id": 1,
                "cluster": {
                  "id": 25,
                  "name": "Ota",
                  "type": "client"
                },
                "id": "1:0x0019_client",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": null
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "supported_features": 7
          },
          "state": {
            "class_name": "FirmwareUpdateEntity",
            "available": true,
            "installed_version": "0x00000041",
            "in_progress": false,
            "update_percentage": null,
            "latest_version": null,
            "release_summary": null,
            "release_notes": null,
            "release_url": null
          }
        }
      ]
    },
    "neighbors": [],
    "routes": []
  },
  "issues": []
}

I found out that this would need a custom quirk. I already have a custom quirk setup for another device.

I went ahead and took the following file: zha-device-handlers/zhaquirks/tuya/ts0601_dimmer.py at 69bdc1564abbfae2ec1cf086d425fbfe41b7283c · zigpy/zha-device-handlers · GitHub

added the model in question to the signature section - restarted, etc.

after that, depending on where I add the signature, switches show up, but don't actually do anything

I am not very familiar with setting up custom quirks, so question:

How can I make the device work with ZHA (not going to other Zigbee integrations) by using a correctly working custom quirk, until it the device may or may not be supported. (I already opened a device add request ([Device Support Request] _TZE200_7iqgciln MG-AUDIM02ZLP-XX · Issue #4979 · zigpy/zha-device-handlers · GitHub)

I tested some more things. I added the signature for the device into the custom quirk taken from the zha-devices. When trying to change state these are the logs:

2026-05-09 07:17:15.009 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0x0006] Sending Tuya Cluster Command... Cluster Command is 0, Arguments are ()
2026-05-09 07:17:15.009 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] tuya_mcu_command: cluster_data=TuyaClusterData(endpoint_id=1, cluster_name='on_off', cluster_attr='on_off', attr_value=False, expect_reply=True)
2026-05-09 07:17:15.010 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] get_dp_mapping --> found DP: 1
2026-05-09 07:17:15.010 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] from_cluster_data: {1: DPToAttributeMapping(ep_attribute='on_off', attribute_name='on_off', converter=None, endpoint_id=None)}
2026-05-09 07:17:15.011 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] value: False
2026-05-09 07:17:15.011 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] raw: b'\x00'
2026-05-09 07:17:15.012 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] tuya_commands: [TuyaCommand(status=0, tsn=29, datapoints=[TuyaDatapointData(dp=1, data=<zhaquirks.tuya.TuyaData object at 0x7f520d8d60>)])]
2026-05-09 07:17:15.018 DEBUG (MainThread) [zigpy.event] Emitting event attribute_updated with data AttributeUpdatedEvent(event_type='attribute_updated', device_ieee='a4:c1:38:55:e5:a1:a0:d5', endpoint_id=1, cluster_type=<ClusterType.Server: 0>, cluster_id=6, attribute_name='on_off', attribute_id=0, manufacturer_code=None, value=False) (2 listeners)
2026-05-09 07:17:15.019 DEBUG (MainThread) [zha.zigbee.cluster_handlers] [0x611A:1:0x0006]: cluster_handler[on_off] attribute_updated - cluster[On/Off] attr[on_off] value[False]
2026-05-09 07:17:15.019 DEBUG (MainThread) [zha] Emitting event cluster_handler_attribute_updated with data ClusterAttributeUpdatedEvent(attribute_id=0, attribute_name='on_off', attribute_value=False, cluster_handler_unique_id='a4:c1:38:55:e5:a1:a0:d5:1:0x0006', cluster_id=6, event_type='cluster_handler_event', event='cluster_handler_attribute_updated') (1 listeners)
2026-05-09 07:17:15.020 DEBUG (MainThread) [zha.application.platforms] a4:c1:38:55:e5:a1:a0:d5-1: received onoff False while transitioning - buffering
2026-05-09 07:17:15.020 DEBUG (MainThread) [zha.application.platforms] a4:c1:38:55:e5:a1:a0:d5-1: starting transitioning timer for 1.5
2026-05-09 07:17:15.021 DEBUG (MainThread) [zha.application.platforms] a4:c1:38:55:e5:a1:a0:d5-1: turned off: DefaultResponse(command_id=0, status=<Status.SUCCESS: 0>)
2026-05-09 07:17:15.021 DEBUG (MainThread) [zha] Emitting event state_changed with data EntityStateChangedEvent(event_type='entity', event='state_changed', platform=<Platform.LIGHT: 'light'>, unique_id='a4:c1:38:55:e5:a1:a0:d5-1', device_ieee=a4:c1:38:55:e5:a1:a0:d5, endpoint_id=1, group_id=None) (1 listeners)
2026-05-09 07:17:15.021 DEBUG (MainThread) [homeassistant.components.zha.entity] light.kali_bedside: Handling event from entity: EntityStateChangedEvent(event_type='entity', event='state_changed', platform=<Platform.LIGHT: 'light'>, unique_id='a4:c1:38:55:e5:a1:a0:d5-1', device_ieee=a4:c1:38:55:e5:a1:a0:d5, endpoint_id=1, group_id=None)
2026-05-09 07:17:15.024 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] Sending request header: ZCLHeader(frame_control=FrameControl<0x01>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=4, command_id=0, *direction=<Direction.Client_to_Server: 0>)
2026-05-09 07:17:15.027 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] Sending request: set_data(data=TuyaCommand(status=0, tsn=29, datapoints=[TuyaDatapointData(dp=1, data=<zhaquirks.tuya.TuyaData object at 0x7f520d8d60>)]))
2026-05-09 07:17:15.029 DEBUG (MainThread) [zigpy_deconz.zigbee.application] Sending packet: ZigbeePacket(timestamp=datetime.datetime(2026, 5, 8, 21, 17, 15, 29043, tzinfo=datetime.timezone.utc), priority=None, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x611A), dst_ep=1, source_route=None, extended_timeout=False, tsn=4, profile_id=260, cluster_id=61184, data=Serialized[b'\x01\x04\x00\x00\x1d\x01\x01\x00\x01\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=None, rssi=None)
2026-05-09 07:17:15.032 DEBUG (MainThread) [zigpy_deconz.api] Sending CommandId.aps_data_request{'request_id': 30, 'flags': <DeconzSendDataFlags.NONE: 0>, 'dst': DeconzAddressEndpoint(address_mode=<AddressMode.NWK: 2>, address=0x611A, endpoint=1), 'profile_id': 260, 'cluster_id': 61184, 'src_ep': 1, 'asdu': b'\x01\x04\x00\x00\x1d\x01\x01\x00\x01\x00', 'tx_options': <DeconzTransmitOptions.USE_NWK_KEY_SECURITY: 2>, 'radius': 0, 'relays': None} (seq=178)
2026-05-09 07:17:15.033 DEBUG (MainThread) [serialx.descriptor_transport] Immediately writing b'\xc0\x12\xb2\x00 \x00\x19\x00\x1e\x00\x02\x1aa\x01\x04\x01\x00\xef\x01\n\x00\x01\x04\x00\x00\x1d\x01\x01\x00\x01\x00\x02\x00A\xfd\xc0'
2026-05-09 07:17:15.040 DEBUG (MainThread) [serialx.descriptor_transport] Sent 36 of 36 bytes
2026-05-09 07:17:15.042 DEBUG (MainThread) [serialx.descriptor_transport] Event loop woke up reader
2026-05-09 07:17:15.043 DEBUG (Thread-6) [aiosqlite] executing functools.partial(<built-in method execute of sqlite3.Connection object at 0x7f570f49a0>, '\n            INSERT INTO attributes_cache_v15 (ieee, endpoint_id, cluster_type, cluster_id, attr_id, manufacturer_code, status, value, last_updated)\n            VALUES (:ieee, :endpoint_id, :cluster_type, :cluster_id, :attr_id, :manufacturer_code, :status, :value, :timestamp)\n                ON CONFLICT (ieee, endpoint_id, cluster_type, cluster_id, attr_id, manufacturer_code_idx) DO UPDATE\n                SET status=excluded.status, value=excluded.value, last_updated=excluded.last_updated\n                WHERE\n                    value != excluded.value\n                    OR status != excluded.status\n                    OR :timestamp - last_updated > :min_update_delta\n            ', {'ieee': 'a4:c1:38:55:e5:a1:a0:d5', 'endpoint_id': 1, 'cluster_type': <ClusterType.Server: 0>, 'cluster_id': 6, 'attr_id': 0, 'manufacturer_code': None, 'status': <Status.SUCCESS: 0>, 'value': False, 'timestamp': 1778275035.04097, 'min_update_delta': 30.0})
2026-05-09 07:17:15.047 DEBUG (MainThread) [serialx.descriptor_transport] Received b'\xc0\x12\xb2\x00\t\x00\x02\x00"\x1e\xf1\xfe\xc0'
2026-05-09 07:17:15.047 DEBUG (MainThread) [zigpy_deconz.uart] Frame received: 0x12b20009000200221e
2026-05-09 07:17:15.048 DEBUG (MainThread) [zigpy_deconz.api] Received command CommandId.aps_data_request{'status': <Status.SUCCESS: 0>, 'frame_length': 9, 'payload_length': 2, 'device_state': DeviceState(network_state=<NetworkState2.CONNECTED: 2>, device_state=<DeviceStateFlags.APSDE_DATA_REQUEST_FREE_SLOTS_AVAILABLE: 8>), 'request_id': 30} (seq 178)
2026-05-09 07:17:15.051 DEBUG (Thread-6) [aiosqlite] operation functools.partial(<built-in method execute of sqlite3.Connection object at 0x7f570f49a0>, '\n            INSERT INTO attributes_cache_v15 (ieee, endpoint_id, cluster_type, cluster_id, attr_id, manufacturer_code, status, value, last_updated)\n            VALUES (:ieee, :endpoint_id, :cluster_type, :cluster_id, :attr_id, :manufacturer_code, :status, :value, :timestamp)\n                ON CONFLICT (ieee, endpoint_id, cluster_type, cluster_id, attr_id, manufacturer_code_idx) DO UPDATE\n                SET status=excluded.status, value=excluded.value, last_updated=excluded.last_updated\n                WHERE\n                    value != excluded.value\n                    OR status != excluded.status\n                    OR :timestamp - last_updated > :min_update_delta\n            ', {'ieee': 'a4:c1:38:55:e5:a1:a0:d5', 'endpoint_id': 1, 'cluster_type': <ClusterType.Server: 0>, 'cluster_id': 6, 'attr_id': 0, 'manufacturer_code': None, 'status': <Status.SUCCESS: 0>, 'value': False, 'timestamp': 1778275035.04097, 'min_update_delta': 30.0}) completed

which seems to send it just fine (does it get an ack just fine?)

but I am also seeing those errors:

6-05-09 07:17:17.019 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] Received ZCL frame: '18 06 0b 00 00'
2026-05-09 07:17:17.020 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x18>(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=6, command_id=11, *direction=<Direction.Server_to_Client: 1>)
2026-05-09 07:17:17.020 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] Decoded ZCL frame: TuyaLevelControlManufCluster:DefaultResponse(command_id=0, status=<Status.SUCCESS: 0>)
2026-05-09 07:17:17.021 DEBUG (MainThread) [zigpy_deconz.api] Sending CommandId.aps_data_confirm{} (seq=187)
2026-05-09 07:17:17.021 DEBUG (MainThread) [serialx.descriptor_transport] Immediately writing b'\xc0\x04\xbb\x00\x07\x00\x00\x00:\xff\xc0'
2026-05-09 07:17:17.022 DEBUG (MainThread) [serialx.descriptor_transport] Sent 11 of 11 bytes
2026-05-09 07:17:17.022 DEBUG (Thread-6) [aiosqlite] executing functools.partial(<built-in method execute of sqlite3.Connection object at 0x7f570f49a0>, 'UPDATE devices_v15\n                    SET last_seen=:ts\n                    WHERE ieee=:ieee AND :ts - last_seen > :min_update_delta', {'ts': 1778275037.017727, 'ieee': a4:c1:38:55:e5:a1:a0:d5, 'min_update_delta': 30.0})
2026-05-09 07:17:17.027 DEBUG (MainThread) [serialx.descriptor_transport] Event loop woke up reader
2026-05-09 07:17:17.027 DEBUG (MainThread) [serialx.descriptor_transport] Received b'\xc0\x04\xbb\x00\x13\x00\x0c\x00""\x02\x1aa\x01\x01\x00\x00\x00\x00\x00_\xfe\xc0'
2026-05-09 07:17:17.028 DEBUG (MainThread) [zigpy_deconz.uart] Frame received: 0x04bb0013000c002222021a6101010000000000
2026-05-09 07:17:17.029 DEBUG (MainThread) [zigpy_deconz.api] Received command CommandId.aps_data_confirm{'status': <Status.SUCCESS: 0>, 'frame_length': 19, 'payload_length': 12, 'device_state': DeviceState(network_state=<NetworkState2.CONNECTED: 2>, device_state=<DeviceStateFlags.APSDE_DATA_REQUEST_FREE_SLOTS_AVAILABLE: 8>), 'request_id': 34, 'dst_addr': DeconzAddressEndpoint(address_mode=<AddressMode.NWK: 2>, address=0x611A, endpoint=1), 'src_ep': 1, 'confirm_status': <TXStatus.SUCCESS: 0>, 'reserved1': 0, 'reserved2': 0, 'reserved3': 0, 'reserved4': 0} (seq 187)
2026-05-09 07:17:17.030 DEBUG (Thread-6) [aiosqlite] operation functools.partial(<built-in method execute of sqlite3.Connection object at 0x7f570f49a0>, 'UPDATE devices_v15\n                    SET last_seen=:ts\n                    WHERE ieee=:ieee AND :ts - last_seen > :min_update_delta', {'ts': 1778275037.017727, 'ieee': a4:c1:38:55:e5:a1:a0:d5, 'min_update_delta': 30.0}) completed
2026-05-09 07:17:17.033 DEBUG (Thread-6) [aiosqlite] executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x7f570f49a0>)
2026-05-09 07:17:17.034 DEBUG (Thread-6) [aiosqlite] operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x7f570f49a0>) completed
2026-05-09 07:17:17.362 DEBUG (MainThread) [zha.application.platforms] a4:c1:38:55:e5:a1:a0:d5-1: transition complete - future attribute reports will write HA state
2026-05-09 07:17:17.362 DEBUG (MainThread) [zha.application.platforms] a4:c1:38:55:e5:a1:a0:d5-1: applying buffered brightness 150 from transition
2026-05-09 07:17:18.631 DEBUG (MainThread) [zha.application.platforms] a4:c1:38:55:e5:a1:a0:d5-1: setting transitioning flag to True
2026-05-09 07:17:18.632 DEBUG (MainThread) [zigpy.util] Tries remaining: 3
2026-05-09 07:17:18.632 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0x0008] Sending Tuya Cluster Command. Cluster Command is 4, Arguments are (), {'level': 135, 'transition_time': 0}
2026-05-09 07:17:18.633 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] tuya_mcu_command: cluster_data=TuyaClusterData(endpoint_id=1, cluster_name='level', cluster_attr='current_level', attr_value=135, expect_reply=True)
2026-05-09 07:17:18.633 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] get_dp_mapping --> found DP: 2
2026-05-09 07:17:18.633 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] from_cluster_data: {2: DPToAttributeMapping(ep_attribute='level', attribute_name='current_level', converter=<function TuyaLevelControlManufCluster.<lambda> at 0x7f59374e00>, endpoint_id=None)}
2026-05-09 07:17:18.634 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] value: 529
2026-05-09 07:17:18.634 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] raw: b'\x00\x00\x02\x11'
2026-05-09 07:17:18.635 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] tuya_commands: [TuyaCommand(status=0, tsn=35, datapoints=[TuyaDatapointData(dp=2, data=<zhaquirks.tuya.TuyaData object at 0x7f4de46670>)])]
2026-05-09 07:17:18.643 DEBUG (MainThread) [zigpy.event] Emitting event attribute_updated with data AttributeUpdatedEvent(event_type='attribute_updated', device_ieee='a4:c1:38:55:e5:a1:a0:d5', endpoint_id=1, cluster_type=<ClusterType.Server: 0>, cluster_id=8, attribute_name='current_level', attribute_id=0, manufacturer_code=None, value=135) (2 listeners)
2026-05-09 07:17:18.643 DEBUG (MainThread) [zha.zigbee.cluster_handlers] [0x611A:1:0x0008]: received attribute: 0 update with value: 135
2026-05-09 07:17:18.644 DEBUG (MainThread) [zha] Emitting event cluster_handler_level_changed with data LevelChangeEvent(level=135, event='cluster_handler_set_level', event_type='cluster_handler_event') (1 listeners)
2026-05-09 07:17:18.644 DEBUG (MainThread) [zha.application.platforms] a4:c1:38:55:e5:a1:a0:d5-1: received level change event LevelChangeEvent(level=135, event='cluster_handler_set_level', event_type='cluster_handler_event') while transitioning - buffering
2026-05-09 07:17:18.644 DEBUG (MainThread) [zha.application.platforms] a4:c1:38:55:e5:a1:a0:d5-1: handling color commands after turning on/level
2026-05-09 07:17:18.645 DEBUG (MainThread) [zha.application.platforms] a4:c1:38:55:e5:a1:a0:d5-1: starting transitioning timer for 0.5
2026-05-09 07:17:18.645 DEBUG (MainThread) [zha.application.platforms] a4:c1:38:55:e5:a1:a0:d5-1: turned on: {'move_to_level_with_on_off': DefaultResponse(command_id=4, status=<Status.SUCCESS: 0>)}
2026-05-09 07:17:18.645 DEBUG (MainThread) [zha] Emitting event state_changed with data EntityStateChangedEvent(event_type='entity', event='state_changed', platform=<Platform.LIGHT: 'light'>, unique_id='a4:c1:38:55:e5:a1:a0:d5-1', device_ieee=a4:c1:38:55:e5:a1:a0:d5, endpoint_id=1, group_id=None) (1 listeners)
2026-05-09 07:17:18.645 DEBUG (MainThread) [homeassistant.components.zha.entity] light.kali_bedside: Handling event from entity: EntityStateChangedEvent(event_type='entity', event='state_changed', platform=<Platform.LIGHT: 'light'>, unique_id='a4:c1:38:55:e5:a1:a0:d5-1', device_ieee=a4:c1:38:55:e5:a1:a0:d5, endpoint_id=1, group_id=None)
2026-05-09 07:17:18.648 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] Sending request header: ZCLHeader(frame_control=FrameControl<0x01>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=7, command_id=0, *direction=<Direction.Client_to_Server: 0>)
2026-05-09 07:17:18.650 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] Sending request: set_data(data=TuyaCommand(status=0, tsn=35, datapoints=[TuyaDatapointData(dp=2, data=<zhaquirks.tuya.TuyaData object at 0x7f4de46670>)]))
2026-05-09 07:17:18.652 DEBUG (MainThread) [zigpy_deconz.zigbee.application] Sending packet: ZigbeePacket(timestamp=datetime.datetime(2026, 5, 8, 21, 17, 18, 652089, tzinfo=datetime.timezone.utc), priority=None, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x611A), dst_ep=1, source_route=None, extended_timeout=False, tsn=7, profile_id=260, cluster_id=61184, data=Serialized[b'\x01\x07\x00\x00#\x02\x02\x00\x04\x00\x00\x02\x11'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=None, rssi=None)
2026-05-09 07:17:18.652 DEBUG (MainThread) [zigpy_deconz.api] Sending CommandId.aps_data_request{'request_id': 36, 'flags': <DeconzSendDataFlags.NONE: 0>, 'dst': DeconzAddressEndpoint(address_mode=<AddressMode.NWK: 2>, address=0x611A, endpoint=1), 'profile_id': 260, 'cluster_id': 61184, 'src_ep': 1, 'asdu': b'\x01\x07\x00\x00#\x02\x02\x00\x04\x00\x00\x02\x11', 'tx_options': <DeconzTransmitOptions.USE_NWK_KEY_SECURITY: 2>, 'radius': 0, 'relays': None} (seq=188)
2026-05-09 07:17:18.653 DEBUG (MainThread) [serialx.descriptor_transport] Immediately writing b'\xc0\x12\xbc\x00#\x00\x1c\x00$\x00\x02\x1aa\x01\x04\x01\x00\xef\x01\r\x00\x01\x07\x00\x00#\x02\x02\x00\x04\x00\x00\x02\x11\x02\x00\x07\xfd\xc0'
2026-05-09 07:17:18.653 DEBUG (MainThread) [serialx.descriptor_transport] Sent 39 of 39 bytes
2026-05-09 07:17:18.654 DEBUG (Thread-6) [aiosqlite] executing functools.partial(<built-in method execute of sqlite3.Connection object at 0x7f570f49a0>, '\n            INSERT INTO attributes_cache_v15 (ieee, endpoint_id, cluster_type, cluster_id, attr_id, manufacturer_code, status, value, last_updated)\n            VALUES (:ieee, :endpoint_id, :cluster_type, :cluster_id, :attr_id, :manufacturer_code, :status, :value, :timestamp)\n                ON CONFLICT (ieee, endpoint_id, cluster_type, cluster_id, attr_id, manufacturer_code_idx) DO UPDATE\n                SET status=excluded.status, value=excluded.value, last_updated=excluded.last_updated\n                WHERE\n                    value != excluded.value\n                    OR status != excluded.status\n                    OR :timestamp - last_updated > :min_update_delta\n            ', {'ieee': 'a4:c1:38:55:e5:a1:a0:d5', 'endpoint_id': 1, 'cluster_type': <ClusterType.Server: 0>, 'cluster_id': 8, 'attr_id': 0, 'manufacturer_code': None, 'status': <Status.SUCCESS: 0>, 'value': 135, 'timestamp': 1778275038.654247, 'min_update_delta': 30.0})
2026-05-09 07:17:18.655 DEBUG (Thread-6) [aiosqlite] operation functools.partial(<built-in method execute of sqlite3.Connection object at 0x7f570f49a0>, '\n            INSERT INTO attributes_cache_v15 (ieee, endpoint_id, cluster_type, cluster_id, attr_id, manufacturer_code, status, value, last_updated)\n            VALUES (:ieee, :endpoint_id, :cluster_type, :cluster_id, :attr_id, :manufacturer_code, :status, :value, :timestamp)\n                ON CONFLICT (ieee, endpoint_id, cluster_type, cluster_id, attr_id, manufacturer_code_idx) DO UPDATE\n                SET status=excluded.status, value=excluded.value, last_updated=excluded.last_updated\n                WHERE\n                    value != excluded.value\n                    OR status != excluded.status\n                    OR :timestamp - last_updated > :min_update_delta\n            ', {'ieee': 'a4:c1:38:55:e5:a1:a0:d5', 'endpoint_id': 1, 'cluster_type': <ClusterType.Server: 0>, 'cluster_id': 8, 'attr_id': 0, 'manufacturer_code': None, 'status': <Status.SUCCESS: 0>, 'value': 135, 'timestamp': 1778275038.654247, 'min_update_delta': 30.0}) completed
2026-05-09 07:17:18.657 DEBUG (Thread-6) [aiosqlite] executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x7f570f49a0>)
2026-05-09 07:17:18.663 DEBUG (Thread-6) [aiosqlite] operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x7f570f49a0>) completed
2026-05-09 07:17:18.663 DEBUG (MainThread) [serialx.descriptor_transport] Event loop woke up reader
2026-05-09 07:17:18.664 DEBUG (MainThread) [serialx.descriptor_transport] Received b'\xc0\x12\xbc\x00\t\x00\x02\x00"$\xe1\xfe\xc0'
2026-05-09 07:17:18.664 DEBUG (MainThread) [zigpy_deconz.uart] Frame received: 0x12bc00090002002224
2026-05-09 07:17:18.665 DEBUG (MainThread) [zigpy_deconz.api] Received command CommandId.aps_data_request{'status': <Status.SUCCESS: 0>, 'frame_length': 9, 'payload_length': 2, 'device_state': DeviceState(network_state=<NetworkState2.CONNECTED: 2>, device_state=<DeviceStateFlags.APSDE_DATA_REQUEST_FREE_SLOTS_AVAILABLE: 8>), 'request_id': 36} (seq 188)
2026-05-09 07:17:18.705 DEBUG (MainThread) [serialx.descriptor_transport] Event loop woke up reader
2026-05-09 07:17:18.706 DEBUG (MainThread) [serialx.descriptor_transport] Received b'\xc0\x0e\xbd\x00\x07\x00*'
2026-05-09 07:17:18.707 DEBUG (MainThread) [serialx.descriptor_transport] Event loop woke up reader
2026-05-09 07:17:18.709 DEBUG (MainThread) [serialx.descriptor_transport] Received b'\x00\x04\xff\xc0'
2026-05-09 07:17:18.709 DEBUG (MainThread) [zigpy_deconz.uart] Frame received: 0x0ebd0007002a00
2026-05-09 07:17:18.710 DEBUG (MainThread) [zigpy_deconz.api] Received command CommandId.device_state_changed{'status': <Status.SUCCESS: 0>, 'frame_length': 7, 'device_state': DeviceState(network_state=<NetworkState2.CONNECTED: 2>, device_state=<DeviceStateFlags.APSDE_DATA_INDICATION|APSDE_DATA_REQUEST_FREE_SLOTS_AVAILABLE: 10>), 'reserved': 0} (seq 189)
2026-05-09 07:17:18.712 DEBUG (MainThread) [zigpy_deconz.api] Sending CommandId.aps_data_indication{'flags': <DataIndicationFlags.Always_Use_NWK_Source_Addr: 1>} (seq=189)
2026-05-09 07:17:18.712 DEBUG (MainThread) [serialx.descriptor_transport] Immediately writing b'\xc0\x17\xbd\x00\x08\x00\x01\x00\x01"\xff\xc0'
2026-05-09 07:17:18.715 DEBUG (MainThread) [serialx.descriptor_transport] Sent 12 of 12 bytes
2026-05-09 07:17:18.716 DEBUG (MainThread) [serialx.descriptor_transport] Event loop woke up reader
2026-05-09 07:17:18.718 DEBUG (MainThread) [serialx.descriptor_transport] Received b'\xc0\x17\xbd\x00#\x00\x1c\x00"\x02\x00\x00\x01\x02\x1aa\x01\x04\x01\x00\xef\x05\x00'
2026-05-09 07:17:18.719 DEBUG (MainThread) [serialx.descriptor_transport] Event loop woke up reader
2026-05-09 07:17:18.719 DEBUG (MainThread) [serialx.descriptor_transport] Received b'\x18\x07\x0b\x00\x00\x00\x00x\x00\x00\x00\x00\xba\xf5\xfb\xc0'
2026-05-09 07:17:18.720 DEBUG (MainThread) [zigpy_deconz.uart] Frame received: 0x17bd0023001c002202000001021a6101040100ef050018070b000000007800000000ba
2026-05-09 07:17:18.721 DEBUG (MainThread) [zigpy_deconz.api] Received command CommandId.aps_data_indication{'status': <Status.SUCCESS: 0>, 'frame_length': 35, 'payload_length': 28, 'device_state': DeviceState(network_state=<NetworkState2.CONNECTED: 2>, device_state=<DeviceStateFlags.APSDE_DATA_REQUEST_FREE_SLOTS_AVAILABLE: 8>), 'dst_addr': DeconzAddress(address_mode=<AddressMode.NWK: 2>, address=0x0000), 'dst_ep': 1, 'src_addr': DeconzAddress(address_mode=<AddressMode.NWK: 2>, address=0x611A), 'src_ep': 1, 'profile_id': 260, 'cluster_id': 61184, 'asdu': b'\x18\x07\x0b\x00\x00', 'reserved1': 0, 'reserved2': 0, 'lqi': 120, 'reserved3': 0, 'reserved4': 0, 'reserved5': 0, 'reserved6': 0, 'rssi': -70} (seq 189)
2026-05-09 07:17:18.722 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2026, 5, 8, 21, 17, 18, 722909, tzinfo=datetime.timezone.utc), priority=None, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x611A), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=None, profile_id=260, cluster_id=61184, data=Serialized[b'\x18\x07\x0b\x00\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=120, rssi=-70)
2026-05-09 07:17:18.731 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] Received ZCL frame: '18 07 0b 00 00'
2026-05-09 07:17:18.733 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x18>(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=7, command_id=11, *direction=<Direction.Server_to_Client: 1>)
2026-05-09 07:17:18.734 DEBUG (MainThread) [zigpy.zcl] [0x611A:1:0xef00] Decoded ZCL frame: TuyaLevelControlManufCluster:DefaultResponse(command_id=0, status=<Status.SUCCESS: 0>)
2026-05-09 07:17:18.735 DEBUG (Thread-6) [aiosqlite] executing functools.partial(<built-in method execute of sqlite3.Connection object at 0x7f570f49a0>, 'UPDATE devices_v15\n                    SET last_seen=:ts\n                    WHERE ieee=:ieee AND :ts - last_seen > :min_update_delta', {'ts': 1778275038.722909, 'ieee': a4:c1:38:55:e5:a1:a0:d5, 'min_update_delta': 30.0})
2026-05-09 07:17:18.737 DEBUG (Thread-6) [aiosqlite] operation functools.partial(<built-in method execute of sqlite3.Connection object at 0x7f570f49a0>, 'UPDATE devices_v15\n                    SET last_seen=:ts\n                    WHERE ieee=:ieee AND :ts - last_seen > :min_update_delta', {'ts': 1778275038.722909, 'ieee': a4:c1:38:55:e5:a1:a0:d5, 'min_update_delta': 30.0}) completed
2026-05-09 07:17:18.739 DEBUG (Thread-6) [aiosqlite] executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x7f570f49a0>)
2026-05-09 07:17:18.740 DEBUG (Thread-6) [aiosqlite] operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x7f570f49a0>) completed
2026-05-09 07:17:18.956 DEBUG (MainThread) [serialx.descriptor_transport] Event loop woke up reader
2026-05-09 07:17:18.957 DEBUG (MainThread) [serialx.descriptor_transport] Received b'\xc0\x0e\xbe\x00\x07'
2026-05-09 07:17:18.958 DEBUG (MainThread) [serialx.descriptor_transport] Event loop woke up reader
2026-05-09 07:17:18.958 DEBUG (MainThread) [serialx.descriptor_transport] Received b'\x00&\x00\x07\xff\xc0'
2026-05-09 07:17:18.958 DEBUG (MainThread) [zigpy_deconz.uart] Frame received: 0x0ebe0007002600
2026-05-09 07:17:18.960 DEBUG (MainThread) [zigpy_deconz.api] Received command CommandId.device_state_changed{'status': <Status.SUCCESS: 0>, 'frame_length': 7, 'device_state': DeviceState(network_state=<NetworkState2.CONNECTED: 2>, device_state=<DeviceStateFlags.APSDE_DATA_CONFIRM|APSDE_DATA_REQUEST_FREE_SLOTS_AVAILABLE: 9>), 'reserved': 0} (seq 190)
2026-05-09 07:17:18.961 DEBUG (MainThread) [zigpy_deconz.api] Sending CommandId.aps_data_confirm{} (seq=190)
2026-05-09 07:17:18.962 DEBUG (MainThread) [serialx.descriptor_transport] Immediately writing b'\xc0\x04\xbe\x00\x07\x00\x00\x007\xff\xc0'
2026-05-09 07:17:18.966 DEBUG (MainThread) [serialx.descriptor_transport] Sent 11 of 11 bytes
2026-05-09 07:17:18.967 DEBUG (MainThread) [serialx.descriptor_transport] Event loop woke up reader
2026-05-09 07:17:18.967 DEBUG (MainThread) [serialx.descriptor_transport] Received b'\xc0\x04\xbe\x00\x13\x00\x0c\x00"$\x02\x1aa\x01\x01\xa7\x00\x00\x00\x00\xb3\xfd\xc0'
2026-05-09 07:17:18.967 DEBUG (MainThread) [zigpy_deconz.uart] Frame received: 0x04be0013000c002224021a610101a700000000
2026-05-09 07:17:18.969 DEBUG (MainThread) [zigpy_deconz.api] Received command CommandId.aps_data_confirm{'status': <Status.SUCCESS: 0>, 'frame_length': 19, 'payload_length': 12, 'device_state': DeviceState(network_state=<NetworkState2.CONNECTED: 2>, device_state=<DeviceStateFlags.APSDE_DATA_REQUEST_FREE_SLOTS_AVAILABLE: 8>), 'request_id': 36, 'dst_addr': DeconzAddressEndpoint(address_mode=<AddressMode.NWK: 2>, address=0x611A, endpoint=1), 'src_ep': 1, 'confirm_status': <TXStatus.APS_NO_ACK: 167>, 'reserved1': 0, 'reserved2': 0, 'reserved3': 0, 'reserved4': 0} (seq 190)
2026-05-09 07:17:18.970 DEBUG (MainThread) [zigpy.application] Failed to send packet, attempt 1 of 3
Traceback (most recent call last):
  File "/usr/local/lib/python3.14/site-packages/zigpy/application.py", line 1094, in request
    await self.send_packet(
    ...<14 lines>...
    )
  File "/usr/local/lib/python3.14/site-packages/zigpy_deconz/zigbee/application.py", line 591, in send_packet
    raise zigpy.exceptions.DeliveryError(
        f"Failed to deliver packet: {status!r}", status
    )
zigpy.exceptions.DeliveryError: Failed to deliver packet: <TXStatus.APS_NO_ACK: 167>

but I am not even sure if the no ack is related to the device in question

I encounter a similar issue with MG-DIM02Z, which I believe is from the same manufacturer.

My device identifies as:

  • Model: TS0601
  • Manufacturer: _TZE284_da26abzz
  • Tuya PID: da26abzz

The interesting part is that the dimmer works correctly in the Smart Life app, including brightness control, but it is not exposed correctly through the standard Tuya device model.

After looking into the Tuya product definition, it appears that this device is currently classified as kg (Switch) instead of tgq (Dimmer), and the standard function is empty. This would explain why Home Assistant/ZHA cannot automatically expose the switch and brightness controls.

For this device, the relevant DPs appear to be:

  • DP141 – on/off, which should map to switch_led_1
  • DP142 – brightness, which should map to bright_value_1 with a range of 10–1000
  • DP143 / DP144 – minimum / maximum brightness
  • DP146 – power-on state

At the moment, I also cannot get usable dimming control through Matter Bridge, Tuya HA, ZHA, or Zigbee2MQTT. Smart Life is the only place where the device works correctly, which further suggests that it is relying on the private Tuya schema rather than a properly exposed standard device model.

So this looks like it may not only be a ZHA quirk issue. The upstream Tuya standard product model itself seems to be incorrectly mapped.

I have reported this to the manufacturer/Tuya and asked them to correct PID da26abzz from a standard Switch model to a Dimmer model and expose DP141/DP142 as standard switch and brightness capabilities.

A custom ZHA quirk would still be very useful as a workaround, but ideally this should also be fixed at the Tuya product-model level so the device can be recognized correctly by other platforms without custom DP mappings.

This is the Zigbee2MQTT external converter I am currently using for the MG-DIM02Z.

It may also be useful as a reference for creating a ZHA custom quirk, since it contains the confirmed Tuya DP mappings for this device.

const exposes = require('zigbee-herdsman-converters/lib/exposes');
const tuya = require('zigbee-herdsman-converters/lib/tuya');

const e = exposes.presets;
const ea = exposes.access;

const tzLocal = {
    light: {
        key: ['state', 'brightness'],

        convertSet: async (entity, key, value, meta) => {
            if (key === 'state') {
                const on = String(value).toUpperCase() === 'ON';

                await tuya.sendDataPointBool(entity, 141, on);

                return {
                    state: {
                        state: on ? 'ON' : 'OFF',
                    },
                };
            }

            if (key === 'brightness') {
                const brightness = Number(value);

                // Brightness 0 should actually turn the load off
                if (brightness <= 0) {
                    await tuya.sendDataPointBool(entity, 141, false);

                    return {
                        state: {
                            state: 'OFF',
                            brightness: 0,
                        },
                    };
                }

                // Z2M brightness: 0-254
                // Tuya DP142: 0-1000
                const clamped = Math.min(254, Math.max(1, brightness));
                const tuyaBrightness = Math.round(clamped * 1000 / 254);

                // Make sure the device is ON before changing brightness
                await tuya.sendDataPointBool(entity, 141, true);
                await tuya.sendDataPointValue(entity, 142, tuyaBrightness);

                return {
                    state: {
                        state: 'ON',
                        brightness: clamped,
                    },
                };
            }
        },
    },
};

const definition = {
    fingerprint: [
        {
            modelID: 'TS0601',
            manufacturerName: '_TZE284_da26abzz',
        },
    ],

    model: 'MG-DIM02Z',
    vendor: 'Tuya',
    description: 'Zigbee Dimmer Module with Power Monitoring',

    fromZigbee: [
        tuya.fz.datapoints,
    ],

    toZigbee: [
        tzLocal.light,
        tuya.tz.datapoints,
    ],

    onEvent: tuya.onEventSetTime,
    configure: tuya.configureMagicPacket,

    exposes: [
        e.light_brightness(),

        e.numeric('min_brightness', ea.STATE_SET)
            .withValueMin(10)
            .withValueMax(1000)
            .withValueStep(10)
            .withDescription('Minimum brightness limit'),

        e.numeric('max_brightness', ea.STATE_SET)
            .withValueMin(10)
            .withValueMax(1000)
            .withValueStep(10)
            .withDescription('Maximum brightness limit'),

        e.power(),
        e.current(),
        e.voltage(),
    ],

    meta: {
        tuyaDatapoints: [
            // Main switch
            [141, 'state', tuya.valueConverter.onOff],

            // Main brightness
            // Tuya native: 0-1000
            // Z2M: 0-254
            [142, 'brightness', tuya.valueConverter.scale0_254to0_1000],

            // Smart Life brightness limits
            [143, 'min_brightness', tuya.valueConverter.raw],
            [144, 'max_brightness', tuya.valueConverter.raw],

            // Power monitoring
            [21, 'current', tuya.valueConverter.divideBy1000],
            [22, 'power', tuya.valueConverter.divideBy10],
            [23, 'voltage', tuya.valueConverter.divideBy10],
        ],
    },
};

module.exports = definition;

The confirmed mappings are:

  • DP141: On/Off
  • DP142: Brightness
  • DP143: Minimum brightness
  • DP144: Maximum brightness
  • DP21: Current
  • DP22: Power
  • DP23: Voltage

Hopefully this can help with implementing a proper ZHA quirk for the same device.