Matter ESP32 Bridge App Example#
Please setup ESP-IDF and Matter Environment and refer building and commissioning guides to get started.
Introduction#
A prototype application that demonstrates a Matter bridge with dynamic endpoint management. The bridge allows you to add and remove non-Matter devices as endpoints at runtime using shell commands. Each bridged device appears as an On/Off Light to Matter controllers.
Usage Guide#
Shell Commands#
After flashing and commissioning the bridge, use these shell commands to manage bridged devices:
Command |
Description |
|---|---|
|
Add a new bridged light device |
|
Remove a device by endpoint ID |
|
List all bridged devices |
|
Toggle device(s) on/off |
|
Show endpoint limits |
|
Remove all bridged devices |
Adding Devices#
Add bridged devices with optional name and location:
bridge add # Adds "Light 1" in "Room"
bridge add "Kitchen Light" # Adds with custom name
bridge add "Lamp" "Bedroom" # Adds with name and location
Each device is assigned a unique endpoint ID automatically.
Removing Devices#
Remove a device by its endpoint ID:
bridge remove 3
Listing Devices#
View all bridged devices:
bridge list
Output example:
Bridged devices (2/16):
"Kitchen Light" @ Kitchen (endpoint 3, ON)
"Bedroom Lamp" @ Bedroom (endpoint 4, OFF)
Toggling Devices#
Toggle a specific device or all devices:
bridge toggle 3 # Toggle device at endpoint 3
bridge toggle # Toggle all devices
Controlling from Matter Controller#
After commissioning, use chip-tool to control bridged devices:
# Turn on device at endpoint 3
chip-tool onoff on <node-id> 3
# Turn off device at endpoint 3
chip-tool onoff off <node-id> 3
# Toggle device at endpoint 3
chip-tool onoff toggle <node-id> 3
Dynamic Endpoints#
The Bridge Example makes use of Dynamic Endpoints. Current SDK support is limited for dynamic endpoints, since endpoints are typically defined (along with the clusters and attributes they contain) in a .zap file which then generates code and static structures to define the endpoints.
To support endpoints that are not statically defined, the ZCL attribute storage
mechanisms will hold additional endpoint information for NUM_DYNAMIC_ENDPOINTS
additional endpoints. These additional endpoint structures must be defined by
the application and can change at runtime.
To facilitate the creation of these endpoint structures, several macros are defined:
DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(attrListName)
DECLARE_DYNAMIC_ATTRIBUTE(attId, attType, attSizeBytes, attrMask)
DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(clusterRevision)
These three macros are used to declare a list of attributes for use within a cluster. The declaration must begin with the
DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGINmacro which will define the name of the allocated attribute structure. Each attribute is then added by theDECLARE_DYNAMIC_ATTRIBUTEmacro. Finally,DECLARE_DYNAMIC_ATTRIBUTE_LIST_ENDmacro should be used to close the definition.All attributes defined with these macros will be configured as
MATTER_ATTRIBUTE_FLAG_EXTERNAL_STORAGEin the ZCL database and therefore will rely on the application to maintain storage for the attribute. Consequently, reads or writes to these attributes must be handled within the application by theemberAfExternalAttributeWriteCallbackandemberAfExternalAttributeReadCallbackfunctions. See the bridge application’smain.cppfor an example of this implementation.
DECLARE_DYNAMIC_CLUSTER_LIST_BEGIN(clusterListName)
DECLARE_DYNAMIC_CLUSTER(clusterId, clusterAttrs, role, incomingCommands, outgoingCommands)
DECLARE_DYNAMIC_CLUSTER_LIST_END
These three macros are used to declare a list of clusters for use within a endpoint. The declaration must begin with the
DECLARE_DYNAMIC_CLUSTER_LIST_BEGINmacro which will define the name of the allocated cluster structure. Each cluster is then added by theDECLARE_DYNAMIC_CLUSTERmacro referencing attribute list previously defined by theDECLARE_DYNAMIC_ATTRIBUTE...macros and the lists of incoming/outgoing commands terminated by kInvalidCommandId (or nullptr if there aren’t any commands in the list). Finally,DECLARE_DYNAMIC_CLUSTER_LIST_ENDmacro should be used to close the definition.
DECLARE_DYNAMIC_ENDPOINT(endpointName, clusterList)
This macro is used to declare an endpoint and its associated cluster list, which must be previously defined by the
DECLARE_DYNAMIC_CLUSTER...macros.
Cluster control#
onoff#
To use the Client to send Matter commands, run the built executable and pass it the target cluster name, the target command name as well as an endpoint id.
$ ./out/debug/chip-tool onoff on <NODE ID> <ENDPOINT>
The client will send a single command packet and then exit.