跳到主要内容

Group Store

GroupStore is the hierarchy and sharing manager. It stores homes, groups, subgroups, node membership, and group sharing requests.

What it does​

Devices are organized into groups (homes, rooms, zones). The store tracks:

  • Group hierarchy — homes, groups, and nested subgroups
  • Membership — which devices belong to which group
  • Sharing — who you've shared groups with and requests you've received
  • Home selection — which group is currently active

API reference​

Properties​

PropertyTypePurpose
groupsListESPCDFGroup[]All groups (computed from groupsByIdMap)
groupsByIdMapRecord<string, ESPCDFGroup>Observable map for fast O(1) lookup
currentHomeIdstring | nullID of the currently selected home group
issuedGroupSharingRequestsListESPCDFGroupSharingRequest[]Sharing requests you've sent
receivedGroupSharingRequestsListESPCDFGroupSharingRequest[]Sharing requests you've received
issuedGroupSharingRequestsRecord<string, ESPCDFGroupSharingRequest[]>Your requests keyed by status (pending, accepted, etc.)
receivedGroupSharingRequestsRecord<string, ESPCDFGroupSharingRequest[]>Received requests keyed by status

Getting the store​

import { initCDF } from "@espressif/rainmaker-base-cdf";

const espCDF = await initCDF({ sdkAdaptorRegistry });
const { groupStore } = espCDF;

How to use it​

Query groups​

// All groups
const groups = espCDF.groupStore.groupsList;

// Single group by ID
const group = espCDF.groupStore.getGroupById("group-id");

// Currently selected home
const home = espCDF.getCurrentHome();

// Nodes belonging to the current home
const homeNodes = espCDF.getNodesForCurrentHome();

Load groups and nodes​

Groups are populated via the user entity's getGroups method, then nodes are fetched per-group:

const user = espCDF.userStore.user!;

// Populates GroupStore — UserStoreSynchronizer calls groupStore.processGetGroupsRes() on getGroups success
await user.getGroups();

// Fetch nodes for a specific group — populates NodeStore
const group = espCDF.groupStore.groupsList[0]!;
await group.getNodes();

Manage group membership​

const group = espCDF.groupStore.getGroupById("group-id")!;

// Fetch the group's nodes (also updates NodeStore)
await group.getNodes();

// Add / remove nodes
await group.addNodes(["node-1", "node-2"]);
await group.removeNodes(["node-1"]);

Update group info and metadata​

await group.updateGroupInfo({
groupName: "Living Room",
description: "Main living area devices",
customData: { floor: 1 },
});

await group.updateMetadata({ lastModifiedBy: "user@example.com" });

Manage subgroups​

// Fetch subgroups
const subs = await group.getSubGroups();

// Create a subgroup
const subGroup = await group.createSubGroup({
name: "Lights",
nodeIds: ["node-1"],
});

Share groups​

// Share a group with another user
await group.share({ username: "other@example.com", role: "secondary" });

// Remove sharing
await group.removeSharingFor("other@example.com");

// Transfer ownership
await group.transfer({ username: "new-owner@example.com" });

// Get current sharing info
const { data: sharingInfo } = await group.getSharingInfo({});

Leave or delete a group​

await group.leave();   // user is a secondary member
await group.delete(); // user is the primary owner

Scenes, schedules, and automations via group​

Groups are the entry point for scene, schedule, and automation operations:

// Scenes
const scenes = await group.getScenes();
const scene = await group.createScene({ id: "sc-1", name: "Movie Night", nodes: [...], actions: [...] });

// Schedules
const schedules = await group.getSchedules();
const schedule = await group.createSchedule({ id: "sch-1", name: "Morning", triggers: [...], action: {...} });

// Automations
const { data: automations } = await group.getAutomations();
const automation = await group.createAutomation({ name: "Sunset lights", eventType: "daylight", ... });

GroupStoreSynchronizer routes these results into SceneStore, ScheduleStore, and AutomationStore automatically.

Manage sharing requests​

// Fetch issued sharing requests
await espCDF.userStore.user!.getIssuedGroupSharingRequests();

// Fetch received sharing requests
await espCDF.userStore.user!.getReceivedGroupSharingRequests();

// Access in store (keyed by status: "pending", "accepted", "rejected", …)
const pending = espCDF.groupStore.issuedGroupSharingRequests["pending"] ?? [];
const received = espCDF.groupStore.receivedGroupSharingRequests["pending"] ?? [];

// Act on a received request
await received[0]?.accept();
await received[0]?.decline();

// Retract an issued request
await pending[0]?.remove();

Manage home selection​

// Sync home (populates GroupStore and selects the primary home)
await espCDF.userStore.user?.syncHomeWithNodes();

// Switch to a different home
await espCDF.userStore.user?.setCurrentHome(home);

// Current home
const home = espCDF.getCurrentHome();
const nodes = espCDF.getNodesForCurrentHome();

Reactive group list rendering​

import { observer } from "mobx-react-lite";
import type { ESPCDF } from "@espressif/rainmaker-base-cdf";

const GroupListScreen = observer(function GroupListScreen({
espCDF,
}: {
espCDF: ESPCDF;
}) {
const { groupStore } = espCDF;
return (
<FlatList
data={groupStore.groupsList}
keyExtractor={(g) => g.id}
renderItem={({ item }) => (
<Text>{item.name} ({item.nodeIds.length} nodes)</Text>
)}
/>
);
});

Handle pagination​

For large group lists, groups are paginated:

const state = espCDF.groupStore.sdkAdaptorGroupsPaginationMap["rainmaker-base-sdk"];
if (state?.hasNext) {
await espCDF.groupStore.fetchNextPageGroupsForSDK("rainmaker-base-sdk");
}

See also​

Implementation

API Reference

On this page