Add quirk for Bosch RFDL-ZB-MS TriTech motion sensor #4593
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Adds a device handler for the Bosch RFDL-ZB-MS RADION TriTech motion sensor with:
The hardware IAS Zone cluster intermittently fails to send motion clear events. This quirk provides a reliable software-based motion timeout through the occupancy cluster.
🤖 Generated with Claude Code
Proposed change
This quirk adds support for the Bosch RFDL-ZB-MS RADION TriTech motion sensor, which has a hardware issue where the IAS Zone cluster intermittently fails to send motion clear events.
The solution adds a virtual Occupancy Sensing cluster (0x0406) that:
It also handles "stuck" sensors - when the hardware has been stuck in motion-detected state and finally sends a late clear, the quirk treats this as new motion to ensure automations trigger correctly.
Additional information
Device diagnostics
{ "home_assistant": { "installation_type": "Home Assistant OS", "version": "2025.12.4", "dev": false, "hassio": true, "virtualenv": false, "python_version": "3.13.9", "docker": true, "arch": "aarch64", "timezone": "America/New_York", "os_name": "Linux", "os_version": "6.12.47-haos-raspi", "container_arch": "aarch64", "supervisor": "2025.12.3", "host_os": "Home Assistant OS 16.3", "docker_version": "28.3.3", "chassis": "embedded", "run_as_root": true }, "custom_components": { "hacs": { "documentation": "https://hacs.xyz/docs/use/", "version": "2.0.5", "requirements": [ "aiogithubapi>=22.10.1" ] }, "bambu_lab": { "documentation": "https://github.com/greghesp/ha-bambulab", "version": "2.2.18", "requirements": [ "beautifulsoup4" ] } }, "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" ], "requirements": [ "zha==0.0.81" ], "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.00022562919184565544 }, "8173f35af2cf9515153fa2d4e7393218": { "wait_import_platforms": -0.09561785636469722, "wait_base_component": -0.0019555678591132164, "config_entry_setup": 18.18183189537376 } }, "data": { "version": 1, "ieee": "**REDACTED**", "nwk": "0x1C2A", "manufacturer": "Bosch", "model": "RFDL-ZB-MS", "friendly_manufacturer": "Bosch", "friendly_model": "RFDL-ZB-MS", "name": "Bosch RFDL-ZB-MS", "quirk_applied": true, "quirk_class": "bosch_tritech.BoschRFDLZBMS", "exposes_features": [], "manufacturer_code": 4403, "power_source": "Battery or Unknown", "lqi": 180, "rssi": -66, "last_seen": "2025-12-22T13:30:18.280085+00:00", "available": true, "device_type": "EndDevice", "active_coordinator": false, "node_descriptor": { "logical_type": "EndDevice", "complex_descriptor_available": false, "user_descriptor_available": false, "reserved": 0, "aps_flags": 0, "frequency_band": 8, "mac_capability_flags": 128, "manufacturer_code": 4403, "maximum_buffer_size": 82, "maximum_incoming_transfer_size": 82, "server_mask": 0, "maximum_outgoing_transfer_size": 82, "descriptor_capability_field": 0 }, "endpoints": { "1": { "profile_id": 260, "device_type": { "name": "IAS_ZONE", "id": 1026 }, "in_clusters": [ { "cluster_id": "0x0000", "endpoint_attribute": "basic", "attributes": [ { "id": "0x0004", "name": "manufacturer", "zcl_type": "string", "value": "Bosch" }, { "id": "0x0005", "name": "model", "zcl_type": "string", "value": "RFDL-ZB-MS" } ] }, { "cluster_id": "0x0001", "endpoint_attribute": "power", "attributes": [ { "id": "0x0021", "name": "battery_percentage_remaining", "zcl_type": "uint8", "value": 200 }, { "id": "0x0033", "name": "battery_quantity", "zcl_type": "uint8", "value": 1 }, { "id": "0x0031", "name": "battery_size", "zcl_type": "enum8", "value": 2 }, { "id": "0x0020", "name": "battery_voltage", "zcl_type": "uint8", "value": 30 } ] }, { "cluster_id": "0x0003", "endpoint_attribute": "identify", "attributes": [] }, { "cluster_id": "0x0020", "endpoint_attribute": "poll_control", "attributes": [ { "id": "0x0003", "name": "fast_poll_timeout", "zcl_type": "uint16", "value": 120 } ] }, { "cluster_id": "0x0400", "endpoint_attribute": "illuminance", "attributes": [ { "id": "0x0000", "name": "measured_value", "zcl_type": "uint16", "value": 6976 } ] }, { "cluster_id": "0x0402", "endpoint_attribute": "temperature", "attributes": [ { "id": "0x0000", "name": "measured_value", "zcl_type": "int16", "value": 1763 } ] }, { "cluster_id": "0x0406", "endpoint_attribute": "occupancy", "attributes": [ { "id": "0x0000", "name": "occupancy", "zcl_type": "map8", "value": 0 }, { "id": "0x0010", "name": "pir_o_to_u_delay", "zcl_type": "uint16", "value": 0 } ] }, { "cluster_id": "0x0500", "endpoint_attribute": "ias_zone", "attributes": [ { "id": "0x0010", "name": "cie_addr", "zcl_type": "EUI64", "value": "6c:5c:b1:ff:fe:ed:64:97" }, { "id": "0x0000", "name": "zone_state", "zcl_type": "enum8", "value": 1 }, { "id": "0x0002", "name": "zone_status", "zcl_type": "map16", "value": 32 }, { "id": "0x0001", "name": "zone_type", "zcl_type": "enum16", "value": 13 } ] }, { "cluster_id": "0x0b05", "endpoint_attribute": "diagnostic", "attributes": [] } ], "out_clusters": [ { "cluster_id": "0x0019", "endpoint_attribute": "ota", "attributes": [ { "id": "0x0002", "name": "current_file_version", "zcl_type": "uint32", "value": 588403713 } ] } ] } }, "original_signature": { "models_info": [ [ "Bosch", "RFDL-ZB-MS" ] ], "endpoints": { "1": { "profile_id": "0x0104", "device_type": "0x0402", "input_clusters": [ "0x0000", "0x0001", "0x0003", "0x0020", "0x0400", "0x0402", "0x0500", "0x0b05" ], "output_clusters": [ "0x0019" ] } } }, "zha_lib_entities": { "binary_sensor": [ { "info_object": { "fallback_name": null, "unique_id": "**REDACTED**", "migrate_unique_ids": [], "platform": "binary_sensor", "class_name": "Occupancy", "translation_key": null, "translation_placeholders": null, "device_class": "occupancy", "state_class": null, "entity_category": null, "entity_registry_enabled_default": true, "enabled": true, "primary": false, "cluster_handlers": [ { "class_name": "OccupancySensingClusterHandler", "generic_id": "cluster_handler_0x0406", "endpoint_id": 1, "cluster": { "id": 1030, "name": "Occupancy Sensing", "type": "server" }, "id": "1:0x0406", "unique_id": "**REDACTED**", "status": "INITIALIZED", "value_attribute": "occupancy" } ], "device_ieee": "**REDACTED**", "endpoint_id": 1, "available": true, "group_id": null, "attribute_name": "occupancy" }, "state": { "class_name": "Occupancy", "available": true, "state": false } }, { "info_object": { "fallback_name": null, "unique_id": "**REDACTED**", "migrate_unique_ids": [], "platform": "binary_sensor", "class_name": "IASZone", "translation_key": null, "translation_placeholders": null, "device_class": "motion", "state_class": null, "entity_category": null, "entity_registry_enabled_default": true, "enabled": true, "primary": true, "cluster_handlers": [ { "class_name": "IASZoneClusterHandler", "generic_id": "cluster_handler_0x0500", "endpoint_id": 1, "cluster": { "id": 1280, "name": "IAS Zone", "type": "server" }, "id": "1:0x0500", "unique_id": "**REDACTED**", "status": "INITIALIZED", "value_attribute": null } ], "device_ieee": "**REDACTED**", "endpoint_id": 1, "available": true, "group_id": null, "attribute_name": "zone_status" }, "state": { "class_name": "IASZone", "available": true, "state": false } } ], "button": [ { "info_object": { "fallback_name": null, "unique_id": "**REDACTED**", "migrate_unique_ids": [], "platform": "button", "class_name": "IdentifyButton", "translation_key": null, "translation_placeholders": null, "device_class": "identify", "state_class": null, "entity_category": "diagnostic", "entity_registry_enabled_default": true, "enabled": true, "primary": false, "cluster_handlers": [ { "class_name": "IdentifyClusterHandler", "generic_id": "cluster_handler_0x0003", "endpoint_id": 1, "cluster": { "id": 3, "name": "Identify", "type": "server" }, "id": "1:0x0003", "unique_id": "**REDACTED**", "status": "INITIALIZED", "value_attribute": null } ], "device_ieee": "**REDACTED**", "endpoint_id": 1, "available": true, "group_id": null, "command": "identify", "args": [ 5 ], "kwargs": {} }, "state": { "class_name": "IdentifyButton", "available": true } } ], "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": 180 } }, { "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": -66 } }, { "info_object": { "fallback_name": null, "unique_id": "**REDACTED**", "migrate_unique_ids": [], "platform": "sensor", "class_name": "Battery", "translation_key": null, "translation_placeholders": null, "device_class": "battery", "state_class": "measurement", "entity_category": "diagnostic", "entity_registry_enabled_default": true, "enabled": true, "primary": false, "cluster_handlers": [ { "class_name": "PowerConfigurationClusterHandler", "generic_id": "cluster_handler_0x0001", "endpoint_id": 1, "cluster": { "id": 1, "name": "Power Configuration", "type": "server" }, "id": "1:0x0001", "unique_id": "**REDACTED**", "status": "INITIALIZED", "value_attribute": "battery_voltage" } ], "device_ieee": "**REDACTED**", "endpoint_id": 1, "available": true, "group_id": null, "suggested_display_precision": 0, "unit": "%" }, "state": { "class_name": "Battery", "available": true, "state": 100.0, "battery_size": "Other", "battery_quantity": 1, "battery_voltage": 3.0 }, "extra_state_attributes": [ "battery_quantity", "battery_size", "battery_voltage" ] }, { "info_object": { "fallback_name": null, "unique_id": "**REDACTED**", "migrate_unique_ids": [], "platform": "sensor", "class_name": "Illuminance", "translation_key": null, "translation_placeholders": null, "device_class": "illuminance", "state_class": "measurement", "entity_category": null, "entity_registry_enabled_default": true, "enabled": true, "primary": false, "cluster_handlers": [ { "class_name": "IlluminanceMeasurementClusterHandler", "generic_id": "cluster_handler_0x0400", "endpoint_id": 1, "cluster": { "id": 1024, "name": "Illuminance Measurement", "type": "server" }, "id": "1:0x0400", "unique_id": "**REDACTED**", "status": "INITIALIZED", "value_attribute": "measured_value" } ], "device_ieee": "**REDACTED**", "endpoint_id": 1, "available": true, "group_id": null, "suggested_display_precision": null, "unit": "lx" }, "state": { "class_name": "Illuminance", "available": true, "state": 5 } }, { "info_object": { "fallback_name": null, "unique_id": "**REDACTED**", "migrate_unique_ids": [], "platform": "sensor", "class_name": "Temperature", "translation_key": null, "translation_placeholders": null, "device_class": "temperature", "state_class": "measurement", "entity_category": null, "entity_registry_enabled_default": true, "enabled": true, "primary": false, "cluster_handlers": [ { "class_name": "TemperatureMeasurementClusterHandler", "generic_id": "cluster_handler_0x0402", "endpoint_id": 1, "cluster": { "id": 1026, "name": "Temperature Measurement", "type": "server" }, "id": "1:0x0402", "unique_id": "**REDACTED**", "status": "INITIALIZED", "value_attribute": "measured_value" } ], "device_ieee": "**REDACTED**", "endpoint_id": 1, "available": true, "group_id": null, "suggested_display_precision": null, "unit": "\u00b0C" }, "state": { "class_name": "Temperature", "available": true, "state": 17.63 } } ], "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": "0x23125401", "in_progress": false, "update_percentage": null, "latest_version": null, "release_summary": null, "release_notes": null, "release_url": null } } ] }, "neighbors": [], "routes": [] }, "issues": [] }Checklist
pre-commitchecks pass / the code has been formatted using Black