跳到主要内容

App-Side Controller Wiring

The Enable Controller Transport guide covers the SDK contract (availableTransports.matter_controller + controllerNodeId). This page documents a reference architecture used in the Espressif RainMaker Home app: how the app reacts to controller discovery, reads peer reachability from the controller setup service, and adds or removes remote transport on peers.

信息

Cmd-resp create, poll, and parse stay in the Matter SDK. The app supplies controllerNodeId only. Adapt file names and store APIs to your project.


What “app side” means​

LayerResponsibility
Matter SDKsyncMatterControllers, found/lost events, executeMatterControl, cmd-resp handler
Group syncLoad fabric nodes; subscribe to controller found/lost once per session
Transport handlerOn found: cloud-subscribe controller, sync peer transports from MTDevices
CDF / storehandleNodeTransportUpdate add/remove; fan-out peer param updates to UI
Controller settings UIOptional: MTCtlCMD = 2 to refresh the hub’s Matter device list

Found: discover hub → subscribe → read reachability → attach matter_controller on online peers (and refresh when setup params change).

Lost: detach matter_controller from peers that used that hub.


Subscribe after group sync​

After the user is logged in and group/fabric nodes are loaded, subscribe once:

import { ESPRMMatterEventType } from "@espressif/rainmaker-matter-sdk";

user.subscribe(ESPRMMatterEventType.matterControllerFound, (event) => {
handleMatterControllerFound(event); // event.nodeId = controller RainMaker id
});

user.subscribe(ESPRMMatterEventType.matterControllerLost, (event) => {
handleMatterControllerLost(event);
});

Home app entry point (reference): subscribeMatterControllerTransport(esprmUser) from the Matter base adaptor / group sync path.


On controller found​

  1. Resolve the controller node in your store
  2. If the controller is not cloud-connected, treat as lost (remove peer transports)
  3. Cloud-subscribe the controller node so you receive connect / disconnect / param updates
  4. Read setup-service reachability and add matter_controller on online peers
peer.availableTransports.matter_controller = {
type: "matter_controller",
metadata: { controllerNodeId },
};

In CDF apps, prefer the store helper (e.g. handleNodeTransportUpdate(store, peerId, { type, metadata }, "add")) so UI reachability stays consistent.


Peer reachability from setup service​

Constant (concept)Value
Setup serviceesp.service.matter-controller-setup
Devices param typeesp.param.matter-devices
Notification keyMatterCTLSetup → nested MTDevices

Each MTDevices entry typically includes a RainMaker node id and an online flag. Suggested rules:

  • Online + rainmaker_node_id → add matter_controller with that controller’s id
  • Offline → remove matter_controller from that peer
  • Controller lost / disconnected → remove matter_controller from all peers that pointed at that controller

Fan-out live updates​

When the controller setup param changes, the hub may push peer attribute snapshots. The Home app:

  1. Parses MatterCTLSetup / MTDevices from the controller’s param update
  2. Builds a synthetic peer ESPNodeUpdateData
  3. Forwards it through the same Matter node-update handler used for local Matter subscriptions

That keeps UI state fresh for peers reached only via the controller, without requiring LAN Matter subscriptions.


Refresh controller device list​

If peers are missing from the hub’s list, request a refresh by writing MTCtlCMD = 2 on the controller (or setup) service’s writable command param.

Home app helpers (reference): getMatterControllerConfig / updateMatterControllerDeviceList under shared Matter controller utilities.


On controller lost​

  1. Unsubscribe from the controller’s cloud subscription
  2. Find peers whose matter_controller metadata controllerNodeId matches
  3. Remove that transport from those peers

Do not rely on the controller still being in the node store — resolve peer ids from your registered-transports map if needed.


Explicit contract​

Owned by SDKOwned by app
Detect controllers in group listsSubscribe to found/lost
Emit found/lost eventsDecide which peers get transport
Cmd-resp create / poll / parseSupply controllerNodeId
Default transport orderAdd/remove availableTransports
Local control via adapterOptional MTDevices fan-out + settings UX

What could go wrong​

SymptomLikely cause
Found event but no remote controlForgot to register peer transports
Transports stuck after hub offlineMissing lost/disconnect handler
UI not updating remotelyNo fan-out from setup param pushes
Empty MTDevicesHub list stale — try MTCtlCMD = 2

On this page