There is a ZG-204ZL version from HOBEIAN with a different form factor.
The basic functions are available in ZHA without quirk. To set sensitivity, fading time, illuminance interval and LED, a quirk is necessary.
Here is a possible code for it:
"""Tuya motion sensors - HOBEIAN ZG-204ZL quirk."""
import zigpy.types as t
from zigpy.quirks.v2 import EntityType
from zigpy.quirks.v2.homeassistant import UnitOfTime
from zigpy.quirks.v2.homeassistant.sensor import SensorDeviceClass
from zigpy.zcl.clusters.general import Basic, PowerConfiguration, Identify
from zigpy.zcl.clusters.measurement import (
OccupancySensing,
IlluminanceMeasurement,
)
from zigpy.zcl.clusters.security import IasZone
from zhaquirks.tuya import TuyaLocalCluster
from zhaquirks.tuya.builder import TuyaQuirkBuilder
class TuyaOccupancySensing(OccupancySensing, TuyaLocalCluster):
"""Tuya local OccupancySensing cluster."""
# HOBEIAN ZG-204ZL, PIR motion sensor with illuminance
# Sensor data (battery, illuminance) reported via standard
# Zigbee clusters (0x0001, 0x0402, 0x0405, 0x0400) by the device itself
# Tuya datapoints used for: occupancy detection (DP 1) and device configuration
# (sensitivity, fading time, illuminance interval, LED)
class OnTimeValues(t.enum8):
"""Sensitivity level enum."""
_10_s = 0x00
_30_s = 0x01
_60_s = 0x02
_120_s = 0x03
(
TuyaQuirkBuilder("HOBEIAN", "ZG-204ZL")
.applies_to("HOBEIAN", "ZG-204ZL")
.tuya_dp(
dp_id=1,
ep_attribute=TuyaOccupancySensing.ep_attribute,
attribute_name=OccupancySensing.AttributeDefs.occupancy.name,
converter=lambda x: not (x in (1, 2)), # opposite value to that of ZG-204ZV
)
.adds(TuyaOccupancySensing)
.tuya_number(
dp_id=2,
attribute_name="motion_detection_sensitivity",
type=t.uint16_t,
min_value=0,
max_value=19,
step=1,
translation_key="motion_detection_sensitivity",
fallback_name="Motion detection sensitivity",
)
.tuya_enum(
dp_id=102,
attribute_name="fading_time",
enum_class=OnTimeValues,
translation_key="fading_time",
fallback_name="Motion keep time",
)
.tuya_number(
dp_id=107,
attribute_name="illuminance_interval",
type=t.uint16_t,
device_class=SensorDeviceClass.DURATION,
unit=UnitOfTime.MINUTES,
min_value=1,
max_value=720,
step=1,
translation_key="illuminance_interval",
fallback_name="Illuminance interval",
)
.tuya_switch(
dp_id=108,
attribute_name="led_indicator",
entity_type=EntityType.STANDARD,
translation_key="led_indicator",
fallback_name="LED indicator",
)
.skip_configuration()
.add_to_registry()
)