Complex Trait Details
SupportedEndpointDynamic and EndpointArrayDynamic
Meaning of Traits
- SupportedEndpointDynamic: (For non-Matter devices) Used to determine whether the device supports "dynamic endpoints".
- EndpointArrayDynamic: (For all devices) Displays the current dynamic list of available (activated, working, etc.) endpoints of the device.
When querying device capabilities, if the above fields appear in the response, please determine whether to obtain the dynamic endpoint list based on the device type.
Matter devices (model prefix aqara.matter) and non-Matter devices have different handling for these two traits. Please refer to the How to Determine below for specific methods.
How to Determine
Based on the device type, the specific process for determining whether a device supports dynamic endpoints is as follows:
Matter Devices
For all Matter devices, please make the following checks:
- Use the spec.query.specdevice.config API to query device traits.
- Look for the
EndpointArrayDynamicfield in the API response:- If it exists and has a value: The value is the list of available endpoints.
- If it does not exist or has no value: All endpoints are available by default; no extra handling is required.
Non-Matter Devices
Only the non-Matter devices listed in the table below support the SupportedEndpointDynamic and EndpointArrayDynamic traits. Only when querying the traits of these devices do you need to follow the determination process below. Other non-Matter devices can ignore these two traits.
Note
The following list contains devices supporting dynamic endpoints as of November 26, 2025. As products are continually updated, this list will also change. Do not hardcode this table content into your program. We recommend always referring to the latest device list on this page during development to ensure compatibility and stability.
| Model | Device Name |
|---|---|
| aqara.airrtc.ecn001 | VRF Controller T1 |
| lumi.motion.agl001 | Presence Sensor FP2 |
| lumi.gateway.agl004 | Hub M3 |
| lumi.gateway.acn012 | Hub M3 |
| aqara.airrtc.acn02 | Temperature control mate T1 (indoor unit) |
| lumi.curtain.acn010 | Organ smart Curtain Controller C4 |
| lumi.airrtc.aus002 | Thermostat Hub W200 |
| lumi.airrtc.aus001 | Aqara Wall Thermostat S1 Pro |
| lumi.fitting.agl001 | Current Sensor R100 |
| lumi.airrtc.aeu001 | Floor Heating Thermostat W500 |
| lumi.airrtc.acn002 | Thermostat W400 (VRF) |
| lumi.airrtc.acn003 | Thermostat W400 (FCU) |
| lumi.gateway.agl011 | Hub M200 |
- Call the spec.query.qlinkmodel.config API to query device traits.
- Check whether
SupportedEndpointDynamic.attribute.defaultValuein the response is 1:- Yes: The device supports dynamic endpoints.
- Call spec.query.trait API (
traitCodeset asEndpointArrayDynamic) to get the device's current dynamic endpoint list. - Check whether
valuein the response has a value:- Yes: This value is the list of available endpoints.
- No or this trait does not exist: All endpoints returned by the trait query API are available.
- Call spec.query.trait API (
- No: The device does not support dynamic endpoints; all endpoints returned by the trait query API are available.
- Yes: The device supports dynamic endpoints.
Example
Below is an example using the VRF Controller T1 (model aqara.airrtc.ecn001).
Query Device Traits
This device's model does not start with aqara.matter, so it's a non-Matter device.
Therefore, you should call spec.query.qlinkmodel.config to query this device's traits.
Tips
For VRF Controllers (such as
aqara.airrtc.ecn001andlumi.airrtc.vrfegl01), it's recommended to only pass in a single model per API call. This helps avoid excessive response data size, improves query efficiency.
Request Example
{
"intent" : "spec.query.qlinkmodel.config",
"data":{
"models": ["aqara.airrtc.ecn001"]
}
}
Response Example
The following response contains both SupportedEndpointDynamic and EndpointArrayDynamic, and SupportedEndpointDynamic.defaultValue is 1, which means the endpoints for VRF Controller T1 are dynamically variable.
{
"code": 0,
"message": "Success",
"msgDetails": null,
"requestId": "xxxxxxx.xxxxxxxxx.xxxxxxx",
"result": {
"data": {
"aqara.airrtc.ecn001": {
"types": [
"AirConditioner",
"Ventilation",
"FloorHeating"
],
"endpoints": [
{
"functions": [
{
"functionId": 128,
"traits": [
{
"traitId": 32901,
"attribute": {
"readable": true,
"enums": [
{
"value": "0",
"key": "Offline"
},
{
"value": "1",
"key": "Online"
}
],
"format": "Bool",
"type": "BOOLEAN",
"subscribable": true,
"writable": false
},
"traitCode": "Reachable"
}
],
"functionCode": "BasicInformation",
"commands": []
},
{
"functionId": 129,
"traits": [
{
"traitId": 33013,
"attribute": {
"readable": true,
"defaultValue": "[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97]",
"format": "Array",
"type": "OTHER",
"subscribable": true,
"writable": false
},
"traitCode": "EndpointArrayDynamic"
},
{
"traitId": 32906,
"attribute": {
"readable": true,
"enums": [
{
"value": "0",
"key": "False"
},
{
"value": "1",
"key": "True"
}
],
"defaultValue": "1",
"format": "Bool",
"type": "BOOLEAN",
"subscribable": true,
"writable": false
},
"traitCode": "SupportedEndpointDynamic"
}
],
"functionCode": "Descriptor",
"commands": []
},
// ...other traits
],
"endpointId": 0,
"endpointTypes": [
"Root"
]
},
// ... other endpoints
],
"model": "aqara.airrtc.ecn001"
}
}
}
}
Query Latest Value of EndpointArrayDynamic
Call the spec.query.trait API to query the device's current available endpoint list.
Request Example
{
"intent": "spec.query.trait",
"data": {
"traits": [
{
"deviceId": "aqara.airrtc.ecn001",
"endpointId": 0,
"functionCode": "Descriptor",
"traitCode": "EndpointArrayDynamic"
}
]
}
}
Response Example
From the value field in the response below, you can see that the currently available endpoints for this device are endpointId 0 through 10.
{
"code": 0,
"message": "Success",
"msgDetails": null,
"requestId": "",
"result": {
"data": [
{
"functionCode": "Descriptor",
"endpointId": 0,
"time": 1762417659743,
"deviceId": "aqara.airrtc.ecn001",
"value": "[0,1,2,3,4,5,6,7,8,9,10]",
"traitCode": "EndpointArrayDynamic"
}
]
}
}