Top. Nach dem ich der Aqara-App Zugriff auf Bluetooth, Standort und co. erlaubt habe, konnte ich den FP300 auch auf Zigbee umflashen. Vielen Dank für den Hinweis 
Mit einem custom quirk funktioniert es nun auch mit ZHA 
Noch unvollständig aber Presence wird bereitgestellt und diverse Einstellungen können vorgenommen werden, den Rest schaue ich mir dann morgen bzw. am Wochenende an
from typing import Final
from zigpy import types as t
from zigpy.quirks.v2 import QuirkBuilder, ReportingConfig
from zigpy.quirks.v2.homeassistant import UnitOfTime
from zigpy.quirks.v2.homeassistant.binary_sensor import BinarySensorDeviceClass
from zigpy.quirks.v2.homeassistant.number import NumberDeviceClass
from zigpy.quirks.v2.homeassistant.sensor import SensorDeviceClass, SensorStateClass
from zigpy.zcl.foundation import BaseAttributeDefs, DataTypeId, ZCLAttributeDef
from zhaquirks.xiaomi import XiaomiAqaraE1Cluster
class MotionSensitivity(t.enum8):
Low = 0x01
Medium = 0x02
High = 0x03
class PresenceDetectionMode(t.enum8):
Both = 0x00
Mmwave = 0x01
Pir = 0x02
class AqaraFP300ManuCluster(XiaomiAqaraE1Cluster):
class AttributeDefs(BaseAttributeDefs):
presence: Final = ZCLAttributeDef(
id=0x0142,
type=t.Bool,
zcl_type=DataTypeId.bool_,
access="rp",
is_manufacturer_specific=True,
)
motion_sensitivity: Final = ZCLAttributeDef(
id=0x010C,
type=MotionSensitivity,
zcl_type=DataTypeId.uint8,
access="rwp",
is_manufacturer_specific=True,
)
absence_delay_timer: Final = ZCLAttributeDef(
id=0x0197,
type=t.uint32_t,
zcl_type=DataTypeId.uint32,
access="rwp",
is_manufacturer_specific=True,
)
pir_detection_interval: Final = ZCLAttributeDef(
id=0x014F,
type=t.uint16_t,
zcl_type=DataTypeId.uint16,
access="rwp",
is_manufacturer_specific=True,
)
presence_detection_options: Final = ZCLAttributeDef(
id=0x0199,
type=PresenceDetectionMode,
zcl_type=DataTypeId.uint8,
access="rwp",
is_manufacturer_specific=True,
)
(
QuirkBuilder("Aqara", "lumi.sensor_occupy.agl8")
.replaces(AqaraFP300ManuCluster, endpoint_id=1)
.binary_sensor(
attribute_name=AqaraFP300ManuCluster.AttributeDefs.presence.name,
cluster_id=AqaraFP300ManuCluster.cluster_id,
endpoint_id=1,
device_class=BinarySensorDeviceClass.OCCUPANCY,
translation_key="presence",
fallback_name="Presence",
reporting_config=ReportingConfig(
min_interval=1,
max_interval=300,
reportable_change=1,
),
)
.number(
attribute_name=AqaraFP300ManuCluster.AttributeDefs.absence_delay_timer.name,
cluster_id=AqaraFP300ManuCluster.cluster_id,
endpoint_id=1,
translation_key="absence_delay_timer",
fallback_name="Absence delay timer",
device_class=NumberDeviceClass.DURATION,
unit=UnitOfTime.SECONDS,
min_value=10,
max_value=300,
step=5,
)
.number(
attribute_name=AqaraFP300ManuCluster.AttributeDefs.pir_detection_interval.name,
cluster_id=AqaraFP300ManuCluster.cluster_id,
endpoint_id=1,
translation_key="pir_detection_interval",
fallback_name="PIR detection interval",
device_class=NumberDeviceClass.DURATION,
unit=UnitOfTime.SECONDS,
min_value=2,
max_value=300,
step=1,
)
.enum(
attribute_name=AqaraFP300ManuCluster.AttributeDefs.presence_detection_options.name,
enum_class=PresenceDetectionMode,
cluster_id=AqaraFP300ManuCluster.cluster_id,
endpoint_id=1,
translation_key="presence_detection_options",
fallback_name="Presence detection options",
)
.enum(
attribute_name=AqaraFP300ManuCluster.AttributeDefs.motion_sensitivity.name,
enum_class=MotionSensitivity,
cluster_id=AqaraFP300ManuCluster.cluster_id,
endpoint_id=1,
translation_key="motion_sensitivity",
fallback_name="Motion sensitivity",
)
.add_to_registry()
)
Quellen: