TS0601_TZE284 debczeci shows no sensors

TS0601_TZE284 debczeci
Does anyone know of a working quirk for an “ali presence sensor” that refuses to report its sensors in ZHA?

sensor type: presence detector 24G (rectangular model of about 7 cm) with notification data : TS0601 _TZE284 debczeci?

I’d love to hear from you, because even our smart AIs are getting stuck on it.

I used this and it works.

"""Custom ZHA quirk for _TZE284_debczeci TS0601 human presence sensor."""

import zigpy.types as t
from zigpy.zcl.clusters.measurement import OccupancySensing

from zhaquirks.tuya import TuyaLocalCluster
from zhaquirks.tuya.builder import TuyaQuirkBuilder


class TuyaOccupancySensing(OccupancySensing, TuyaLocalCluster):
    """Local occupancy cluster for Tuya presence sensor."""


class PirSensitivity(t.enum8):
    """PIR sensitivity enum."""

    Low = 0x00
    Middle = 0x01
    High = 0x02


class PirTime(t.enum8):
    """PIR clear delay enum."""

    S15 = 0x00
    S30 = 0x01
    S60 = 0x02


def presence_to_occupancy(value):
    """Map Tuya presence bool/int to ZCL occupancy."""
    return (
        OccupancySensing.Occupancy.Unoccupied
        if value
        else OccupancySensing.Occupancy.Occupied
    )


(
    TuyaQuirkBuilder("_TZE284_debczeci", "TS0601")
    .applies_to("_TZE284_1lvln0x6", "TS0601")
    .applies_to("_TZE204_debczeci", "TS0601")
    .tuya_dp(
        dp_id=1,
        ep_attribute=TuyaOccupancySensing.ep_attribute,
        attribute_name=OccupancySensing.AttributeDefs.occupancy.name,
        converter=presence_to_occupancy,
    )
    .adds(TuyaOccupancySensing)
    .tuya_battery(dp_id=4)
    .tuya_enum(
        dp_id=9,
        attribute_name="pir_sensitivity",
        enum_class=PirSensitivity,
        translation_key="pir_sensitivity",
        fallback_name="PIR sensitivity",
    )
    .tuya_enum(
        dp_id=10,
        attribute_name="pir_time",
        enum_class=PirTime,
        translation_key="pir_time",
        fallback_name="PIR time",
    )
    .add_to_registry()
)

bonjour,
voici un code qui fonctionne by Socrate :wink:

"""Tuya TS0601 human presence sensor _TZE284_debczeci."""

from __future__ import annotations

from enum import Enum
from typing import cast

from zigpy import types as t
from zigpy.zcl.clusters.measurement import OccupancySensing

from zhaquirks.tuya import TuyaLocalCluster
from zhaquirks.tuya.builder import TuyaQuirkBuilder

def _true_false_0_to_occupancy(value: int) -> int:
    """Convert Tuya 'trueFalse0' to ZCL OccupancySensing.occupancy."""
    return 1 if int(value) == 0 else 0

class PirSensitivity(t.enum8):
    """PIR sensor sensitivity."""
    low = 0
    middle = 1
    high = 2

class PirTime(t.enum8):
    """PIR delay time in seconds."""
    s15 = 0
    s30 = 1
    s60 = 2

class IhsenoPresenceOccupancy(OccupancySensing, TuyaLocalCluster):
    """Occupancy cluster backed by Tuya presence datapoints."""

(
    TuyaQuirkBuilder("_TZE284_debczeci", "TS0601")
    # On force la reconnaissance de la signature exacte vue dans ton diagnostic
    .applies_to("_TZE284_debczeci", "TS0601")
    # On ajoute le cluster de présence
    .adds(IhsenoPresenceOccupancy)
    
    # DP 1: presence (0=mouvement, 1=pas de mouvement)
    .tuya_dp(
        dp_id=1,
        ep_attribute=IhsenoPresenceOccupancy.ep_attribute,
        attribute_name=OccupancySensing.AttributeDefs.occupancy.name,
        converter=_true_false_0_to_occupancy,
    )
    
    # DP 4: batterie (0-100%)
    .tuya_battery(
        dp_id=4,
        scale=2,
    )
    
    # DP 9: Sensibilité PIR
    .tuya_enum(
        dp_id=9,
        attribute_name="pir_sensitivity",
        enum_class=cast(type[Enum], PirSensitivity),
        translation_key="pir_sensitivity",
        fallback_name="PIR sensitivity",
    )
    
    # DP 10: Délai PIR
    .tuya_enum(
        dp_id=10,
        attribute_name="pir_time",
        enum_class=cast(type[Enum], PirTime),
        translation_key="pir_time",
        fallback_name="PIR delay",
    )
    
    # Cette option force l'ajout même si la signature ne correspond pas à 100% à un profil standard
    .add_to_registry(force_add_cluster=True)
)