场景存储
SceneStore 是一种响应式存储,用于在应用中管理场景配置与场景操作。场景可以同时保存与恢复多个设备状态,从而通过一次操作快速控制多个设备。
概览
SceneStore 提供以下功能:
- 管理与同步场景列表
- 创建与更新场景
- 激活场景
- 查询节点配置并自动转换
- 合并多节点场景
- 自动同步
NodeStore - 响应式状态管理
场景在 CDF 中如何工作
查询节点配置并自动转换场景
在 CDF 中,场景会查询节点配置并进行自动转换。每个节点的 nodeConfig.services 包含一个场景服务,其中含有场景列表。SceneStore 会自动提取并合并这些场景。
无需手动转换 – 使用 CDF 时,场景会自动从以下路径转换:
node.nodeConfig.services[scenes].params[scenes].value
识别场景服务与参数
SceneStore 通过特定的服务类型与参数类型来识别场景:
-
服务类型:
esp.service.scenes(ESPRM_SERVICE_SCENES)- 标识节点服务数组中的场景服务。
- 位于
node.nodeConfig.services[],其中service.type === "esp.service.scenes"。
-
参数类型:
esp.param.scenes(ESPRM_PARAM_SCENES)- 标识场景服务中的场景参数。
- 位于
service.params[],其中param.type === "esp.param.scenes"。 - 实际的场景列表存放在
param.value[]中。
节点配置结构示例:
node.nodeConfig.services = [
{
type: "esp.service.scenes", // 服务类型标识符
params: [
{
type: "esp.param.scenes", // 参数类型标识符
value: [
// 场景数组
{
id: "scene1",
name: "Living Room Scene",
info: "Evening lighting",
action: { light: { power: true, brightness: 80 } },
},
{
id: "scene2",
name: "Bedroom Scene",
action: { fan: { power: false } },
},
],
},
],
},
];
多节点场景合并
多个节点上具有相同 ID 的场景会自动合并为一个场景,便于管理跨多个 设备的场景。
示例:
- 节点 1 中存在 ID 为
scene1的场景 →{ id: 'scene1', nodes: ['node1'], actions: { node1: {...} } }。 - 节点 2 中存在 ID 为
scene1的场景 → 与节点 1 的场景合并。 - 节点 3 中存在 ID 为
scene1的场景 → 与节点 1 和节点 2 的场景合并。 - 结果:
{ id: 'scene1', nodes: ['node1', 'node2', 'node3'], actions: { node1: {...}, node2: {...}, node3: {...} } }。
当多个节点共享同一个场景 ID 时,这些节点会被合并为一个场景对象。可以通过查看场景的 nodes 数组属性来确认其涉及哪些节点:
const scene = sceneStore.getScene("scene1");
console.log("Scene spans nodes:", scene.nodes); // ['node1', 'node2', 'node3']
console.log("Actions per node:", scene.actions);
// {
// node1: { light: { power: true } },
// node2: { fan: { power: false } },
// node3: { switch: { power: true } }
// }
场景更新与节点定向
更新场景时,更改的应用方式取决于操作类型:
- 更新所有节点:如果更新跨多个节点的场景,则改动将应用至包含该场景的所有节点。
- 仅更新特定节点:如果仅更新某个设备/节点的场景,则改动将仅应用至该节点的场景配置。
SceneStore 会通过 updateNodeScene 函数自动处理节点更新,并在 NodeStore 中更新该节点的场景配置。
访问存储
通过 CDF 实例访问 SceneStore:
const sceneStore = espCDF.sceneStore;

