Zigbee 场景管理

更新时间:2022-11-24 09:20:26下载pdf

当增加情景时,保存用户自定义数据,调用情景时读取该数据给用户,网络收到增加场景命令时调用 dev_scene_add_callback 接口。

static uint8_t g_onoff_status = 0; //假定代表开关状态
void dev_scene_add_callback(uint8_t endpoint, uint8_t *out_data, uint8_t *in_out_len)
{
    out_data[0] = g_onoff_status;
    *in_out_len = 1;

    //TODO:保存设备状态,增加场景时调用该函数
}

void dev_scene_recall_callback(uint8_t endpoint, const scene_save_data_t *in_data)
{
    //TODO:执行场景
    switch(in_data->type) {
        case SCENE_DATA_TYPE_USER_DEFINE: {
            if(in_data->data[0] == 1) {
                g_onoff_status = 1;
                //TODO:执行开
            }
            else if(in_data->data[0] == 0) {
                g_onoff_status = 1;
                //TODO:执行关
            }
            break;
        }
        default: {
            break;
        }
    }
    return;
}

对于设备是一个场景面板,而不是是执行设备时,需要如下特殊操作。

添加场景之前是否移除 endpoint 下所有场景, 用于场景开关添加场景时使用,返回 FALSE 代表不移除所有, 返回 TRUE 代表移除所有,默认返回 FALSE

bool_t zigbee_sdk_scene_remove_before_add(uint8_t endpoint)
{
   return TRUE; //场景面板需要实现固定返回TRUE
}

场景开关需要 recall scene 时使用 dev_scene_recall_send_command 接口:

bool_t devGetSceneCallback(uint16_t endpoint, uint16_t* groupId, uint8_t* sceneId);
bool_t dev_scene_recall_send_command(uint8_t endpoint, uint16_t groupId, uint8_t sceneId);

static void __scene_panel_demo(void)
{
    bool_t result = FALSE;
    uint16_t group_id = 0;
    uint8_t  scene_id = 0;

    result = devGetSceneCallback(1, &group_id, &scene_id);  ///< 获取 endpoint=1 的场景 id 和组 id
    if(result) {
        dev_scene_recall_send_command(1, group_id, scene_id); ///< 发送 endpoint=1 的场景
    }
}