Remote Control
Remote Control commands Matter devices when the phone is not on the LAN. The SDK uses the matter_controller transport: RainMaker command-response to a RainMaker Controller node, which relays the Matter operation to the peer on the fabric.
Requires @espressif/rainmaker-matter-sdk 3.1.0+.
This path does not use matterControlAdapter. Local LAN control is a separate path — see Local Control.
Dependencies (remote path)
What you need for matter_controller only. This hop does not call matterControlAdapter.
Required
| Dependency | What it does | Reference |
|---|---|---|
| RainMaker Controller on the fabric | Hub that relays Matter ops to peers | RainMaker Controller |
| availableTransports.matter_controller on the peer | Enables remote transport; metadata needs controllerNodeId | Enable Controller Transport |
| Built-in matterControllerControlHandler | createCmdResp → poll → parse (in the SDK) | SDK 3.1.0+ |
| Logged-in user + cloud APIs | Cmd-resp targets the controller RainMaker node id | Base SDK auth / cmd-resp |
Recommended
| Dependency | What it does | Reference |
|---|---|---|
| App wiring for found/lost + MTDevices | Attach / remove peer transports when the hub is online | App-Side Controller Wiring |
Not used on this path
| Dependency | Why |
|---|---|
| matterControlAdapter | Local LAN hop only — see Local Control |
How it differs from local
| Local | Remote | |
|---|---|---|
| Transport | matter_local | matter_controller |
| Adapter | ESPMatterControlAdapterInterface | None — SDK handler |
| Network | LAN / CASE | Cloud cmd-resp → hub → fabric |
| App must supply | Native control adapter | controllerNodeId on peer transport |
Same UI API:
await powerParam.getValue();
await powerParam.setValue(true);
When to use it
- Phone is off the home LAN, but a Matter controller hub is online in the cloud
- Local Matter fails and you want automatic fallback (default order: local → remote)
- A RainMaker Controller is commissioned into the same fabric as peer devices
For LAN-only apps, skip this section and use Local Control alone.
Enable the transport
Register on each peer you want to reach remotely:
peerNode.availableTransports.matter_controller = {
type: "matter_controller",
metadata: {
controllerNodeId: "<CONTROLLER_RAINMAKER_NODE_ID>",
// timeoutSeconds: 60,
},
};
Full cmd IDs (4352 / 4353 / 4354) and handler flow: Enable Controller Transport.
The SDK emits matterControllerFound / matterControllerLost but does not auto-attach peer transports. Your app must register metadata — see App-Side Controller Wiring.
Custom transport managers
Override the built-in remote handler per node if needed:
node.customTransportManagers = {
matter_controller: {
getParams: async (payload, node) => { /* ... */ },
setParam: async (payload, node) => { /* ... */ },
},
};
Documentation
| Guide | Covers |
|---|---|
| RainMaker Controller | Hub node, discovery events, services |
| Enable Controller Transport | availableTransports, cmd IDs, SDK handler |
| App-Side Controller Wiring | Home-app found/lost, MTDevices, fan-out |
What could go wrong
| Symptom | Likely cause |
|---|---|
| NODE_UNREACHABLE | No transports registered, or every transport failed |
| Remote never attempted | Peer missing matter_controller / wrong controllerNodeId |
| Cmd-resp timeout | Controller offline, peer not in hub device list, or timeout too low |
| Local always used | Local succeeds first — expected with default order |
Related
- Controlling — overall model and path comparison
- Local Control —
matter_local+ control adapter - RainMaker Controller — hub details
- Matter Adapters — local adapters (not used for this hop)