MATTER 1.5 - implement Descriptor Cluster TagList on custom endpoints

Hello,
 
I am developing a custom Matter 1.5 application on an nRF54L15 using NCS 3.2.1.
 
My device exposes multiple Contact Sensor endpoints:
 
- Endpoint 0: Root Node
- Endpoint 1: Contact Sensor (window open/closed)
- Endpoint 2: Contact Sensor (window locked/unlocked)
 
I would like to use the Descriptor Cluster TagList feature to semantically differentiate these endpoints according to the Matter specification.
 
However, I am struggling to understand the expected implementation in NCS:
 
1. ZAP reports the following message when enabling TAGLIST:
"Check Feature Compliance on endpoint: X, cluster: Descriptor, feature: TagList (TAGLIST) cannot be enabled as its conformance is too complex for ZAP to process"
 
2. I cannot find where SemanticTagStruct entries are actually provided in the Nordic Matter framework.
 
3. I could not find examples in NCS showing how to expose a TagList containing standard Matter semantic tags.
 
My questions are:
 
- Does NCS 3.2.1 currently support Descriptor Cluster TagList?
- Is there an existing Nordic example exposing TagList?
- Where should SemanticTagStruct values be defined for an endpoint?
- Are standard semantic tag namespaces/tags already available in the SDK, or must they be manually defined?
- Has anybody successfully verified TagList exposure using a Matter controller (Google Home, Apple Home, chip-tool, etc.)?
 
My goal is to expose something conceptually similar to:
 
Endpoint 1:
TagList = { Window }
 
Endpoint 2:
TagList = { Lock }
 
but using the standard Matter semantic tag definitions.
 
Any code example or pointer to the relevant source files would be greatly appreciated.
 
Thank you.

  • Hi,

    - Does NCS 3.2.1 currently support Descriptor Cluster TagList?

    Yes, support should be in 3.2.1. From what I can see when searching for the cluster it is present in the closure sample (nrf\samples\matter\closure)

    Any code example or pointer to the relevant source files would be greatly appreciated.

    See nrf\samples\matter\closure https://github.com/nrfconnect/sdk-nrf/tree/v3.2.1/samples/matter/closure.

    From src/closure_manager.cpp:

    constexpr uint8_t kNamespaceClosure = 0x44;
    constexpr uint8_t kTagClosureGarageDoor = 0x05;
    
    const Clusters::Descriptor::Structs::SemanticTagStruct::Type kClosureControlEndpointTagList[] = {
    	{ .namespaceID = kNamespaceClosure,
    	  .tag = kTagClosureGarageDoor,
    	  .label = chip::MakeOptional(DataModel::Nullable<chip::CharSpan>("Closure.GarageDoor"_span)) }
    };
    ...
    ReturnErrorOnFailure(SetTagList(mClosureEndpoint,
    	Span<const Clusters::Descriptor::Structs::SemanticTagStruct::Type>(kClosureControlEndpointTagList)));

    - Where should SemanticTagStruct values be defined for an endpoint?

    It should be defined in the application code, and pass them to SetTagList() from modules/lib/matter/src/app/util/attribute-storage.h:

    CHIP_ERROR SetTagList(chip::EndpointId endpoint,
                          chip::Span<const chip::app::Clusters::Descriptor::Structs::SemanticTagStruct::Type> tagList);

    - Are standard semantic tag namespaces/tags already available in the SDK, or must they be manually defined?

    Not as C++ constants for the Closure namespaces. Only a few common ones (Area, Landmark, Position and similar) get generated enums, through src/app/zap-templates/zcl/data-model/chip/semantic-tag-namespace-enums.xml. For anything else, you define the numeric IDs yourself, as the closure sample does. The spec data for Matter 1.5 is in modules/lib/matter/data_model/1.5/namespaces/:

    File Namespace ID Relevant tags
    Namespace-Closure.xml
    0x44 Closure
    0x00 Covering, 0x01 Window, 0x02 Barrier, 0x03 Cabinet, 0x04 Gate, 0x05 GarageDoor, 0x06 Door
    Namespace-Closure-Window.xml
    0x47 Closure Window
    0x00 Roof, 0x01 Facade
    Namespace-Common-Closure.xml
    0x01 Common Closure
    0x00 Opening, 0x01 Closing, 0x02 Stop

    Endpoint 1 maps cleanly to { namespaceID = 0x44, tag = 0x01 } (Closure.Window). There is no standard "Lock" tag in any of the 1.5 namespaces. For endpoint 2 you can do one of these:

    • Use a manufacturer-specific namespace. Set mfgCode to your Vendor ID and choose your own namespace and tag IDs.
    • Use Closure.Window on both endpoints and add a second standard tag to tell them apart, for example from Common Number (0x07). Then use label for the human-readable text ("Open/Closed", "Locked").
    - Has anybody successfully verified TagList exposure using a Matter controller (Google Home, Apple Home, chip-tool, etc.)?

    With chip-tool you can do

    chip-tool descriptor read tag-list <node-id> 1
    chip-tool descriptor read feature-map <node-id> 1

    Kind regards,
    Andreas

Related