ESPCDFGroup
ESPCDFGroup represents a home, room, fabric, or other node collection in CDF. Use it when you need to load members, manage membership, or create scenes, schedules, and automations scoped to that group.
Groups arrive in GroupStore after user.getGroups() or group.getSubGroups(). Obtain them from groupStore.getGroupById or groupStore.groupsList — do not construct them in UI code.
Mutating methods use runAndEmit; synchronizers update GroupStore, NodeStore, and child domain stores on success.
Properties
| Property | Type | Description |
|---|---|---|
identifier | string | Adaptor that constructed this entity |
id / name | string | Backend identifiers |
nodeIds | string[] | Member node IDs |
nodeDetails | ESPCDFNode[] | undefined | Cached node instances when provided |
subGroups | ESPCDFGroup[] | undefined | Nested groups |
type / parentId | optional | Hierarchy semantics (e.g. home, room) |
isMatter | boolean | undefined | Matter fabric context |
fabricId | optional | Matter fabric identifier |
operations | ESPCDFGroupOperation | SDK-facing operations (not observed) |
_raw | any | Original SDK group; adaptor layer only |
events | ESPCDFOperationEventEmitter | Operation lifecycle for synchronizers |
Common Workflows
Get a group from the store
import { initCDF } from "@espressif/rainmaker-base-cdf";
const espCDF = await initCDF({ sdkAdaptorRegistry });
const group = espCDF.groupStore.getGroupById("group-id");
if (!group) {
// Group not loaded yet — call user.getGroups() first
}
Load nodes in a group
getNodes populates NodeStore via GroupStoreSynchronizer.
const nodes = await group.getNodes();
// espCDF.nodeStore.nodesList now includes returned nodes
Update group info and membership
await group.updateGroupInfo({ groupName: "Living Room" } as any);
await group.updateMetadata({ location: "downstairs" } as any);
await group.addNodes(["new-node-id"]);
await group.removeNodes(["old-node-id"]);
Create and list scenes
const rows = await group.getSceneCapableDevices();
const scene = await group.createScene({
id: "scene-movie",
name: "Movie Night",
nodes: ["node-1"],
actions: { "node-1": { Light: { Power: true, Brightness: 30 } } },
});
await group.getScenes();
const scenes = espCDF.sceneStore.sceneList;
Create and list schedules
const rows = await group.getScheduleCapableDevices();
const schedule = await group.createSchedule({
id: "sch-morning",
name: "Morning",
nodes: ["node-1"],
triggers: [{ m: 420, d: 127 }],
action: { "node-1": { Light: { Power: true } } },
enabled: true,
});
await group.getSchedules();
Create and list automations
const { data: automations } = await group.getAutomations();
const automation = await group.createAutomation({
name: "Lights at sunset",
enabled: true,
eventType: "daylight",
events: [{ check: { name: "sunset" } }],
eventOperator: "any",
actions: [{ nodeId: "node-1", action: { Light: { Power: true } } }],
location: { latitude: 18.5, longitude: 73.9 },
});
Sharing and ownership
await group.share({ username: "guest@example.com" } as any);
const info = await group.getSharingInfo({} as any);
await group.removeSharingFor("guest@example.com");
await group.transfer({ newOwner: "other@example.com" } as any);
Leave or delete a group
// Secondary user leaves shared group
await group.leave();
// Primary user deletes the group
await group.delete();
Error Handling
Adaptor-specific operations such as getSceneCapableDevices throw if the active adaptor does not implement them:
try {
await group.getSceneCapableDevices();
} catch (e) {
showErrorBanner("Scenes are not supported for this SDK");
}
runAndEmit methods re-throw on failure while still emitting a failure event for synchronizer logging.
Subgroups
const subGroups = await group.getSubGroups();
const child = await group.createSubGroup({ name: "Bedroom", type: "room" } as any);
Matter fabric helpers
When isMatter is true and the adaptor implements the operations:
const noc = await group.issueUserNoC();
await group.startCommissioning({} as any);
Related Resource
- Group store
- ESPCDFUser —
getGroupspopulatesGroupStore - ESPCDFGroup source
- API Reference: