Schedule Store
ScheduleStore is the time-based automation engine. It stores recurring schedules that execute device actions at specific times.
What it does
Schedules automate routine tasks:
- "7:00 AM daily: Turn on lights"
- "10 PM weekdays: Lock doors"
- "2:30 PM Mondays: Water plants"
The store manages create, edit, enable/disable, and delete. Synchronizer keeps state in sync.
API reference
Properties
| Property | Type | Purpose |
|---|---|---|
schedulesList | ESPCDFSchedule[] | All schedules (computed from internal map) |
schedulesByID | Record<string, …> | Map for fast O(1) lookup |
Getting the store
import { initCDF } from "@espressif/rainmaker-base-cdf";
const espCDF = await initCDF({ sdkAdaptorRegistry });
const { scheduleStore } = espCDF;
How to use it
Load schedules
const group = espCDF.groupStore.getGroupById("group-id")!;
await group.getSchedules();
// scheduleStore is now populated
console.log(espCDF.scheduleStore.schedulesList.length);
Query schedules
const schedules = espCDF.scheduleStore.schedulesList;
const schedule = espCDF.scheduleStore.getScheduleById("schedule-id");
// Schedules that include a given node
const forNode = espCDF.scheduleStore.getSchedulesForNode("light-node-id");
Create a schedule
Triggers define when a schedule runs. The m field is minutes since midnight; d is a bitmask of days (bit 0 = Sunday … bit 6 = Saturday):
const group = espCDF.groupStore.getGroupById("group-id")!;
const rows = await group.getScheduleCapableDevices();
const schedule = await group.createSchedule({
id: "sch-morning",
name: "Morning Routine",
nodes: ["light-node-id"],
triggers: [{ m: 420, d: 127 }], // 07:00 daily
action: {
"light-node-id": { Light: { Power: true, Brightness: 100 } },
},
enabled: true,
});
GroupStoreSynchronizer adds the returned entity to ScheduleStore.
Edit, enable/disable, and delete schedules
const schedule = espCDF.scheduleStore.getScheduleById("schedule-id")!;
await schedule.edit({
name: "Updated Routine",
triggers: [{ m: 480, d: 127 }],
action: { "light-node-id": { Light: { Power: true, Brightness: 80 } } },
});
await schedule.enable();
await schedule.disable();
await schedule.remove();
Reactive schedule list
import { observer } from "mobx-react-lite";
import type { ESPCDF } from "@espressif/rainmaker-base-cdf";
const ScheduleList = observer(function ScheduleList({
espCDF,
}: {
espCDF: ESPCDF;
}) {
const { scheduleStore } = espCDF;
return (
<FlatList
data={scheduleStore.schedulesList}
keyExtractor={(s) => s.id}
renderItem={({ item }) => (
<View>
<Text>{item.name}</Text>
<Switch
value={item.enabled}
onValueChange={() => (item.enabled ? item.disable() : item.enable())}
/>
</View>
)}
/>
);
});
Understanding trigger format
Each trigger specifies a time and days:
m: minutes since midnight (0–1439)d: bitmask of days (bit 0 = Sunday, bit 6 = Saturday)
triggers: [
{ m: 420, d: 127 }, // 07:00 every day (0b1111111)
{ m: 1320, d: 62 }, // 22:00 Mon–Fri (0b0111110)
{ m: 840, d: 1 }, // 14:00 Sundays only (0b0000001)
];
// Breakdown: 07:00 = 7 * 60 = 420 minutes
// Daily = 0b1111111 = all 7 days
Reactive schedule list
import { observer } from "mobx-react-lite";
import type { ESPCDF } from "@espressif/rainmaker-base-cdf";
const ScheduleList = observer(function ScheduleList({
espCDF,
}: {
espCDF: ESPCDF;
}) {
const schedules = espCDF.scheduleStore.schedulesList;
return (
<FlatList
data={schedules}
keyExtractor={(s) => s.id}
renderItem={({ item }) => (
<View>
<Text>{item.name}</Text>
<Switch
value={item.enabled}
onValueChange={() => (item.enabled ? item.disable() : item.enable())}
/>
</View>
)}
/>
);
});
See also
Implementation
API Reference