跳到主要内容

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

PropertyTypePurpose
schedulesListESPCDFSchedule[]All schedules (computed from internal map)
schedulesByIDRecord<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

On this page