跳到主要内容

场景自动化

更新时间:2026-10-28 15:18:58

场景自动化SDK提供设备联动能力。

/**
* 创建场景
*
* @param sceneCreateReq - 创建参数
* @public
*/
declare function sceneCreate(sceneCreateReq: SceneCreateReq): Promise<SceneCreateRsp>;

/**
* 场景删除
*
* @param sceneId - 场景ID
* @public
*/
declare function sceneDelete(sceneId: number): Promise<void>;


/**
* 场景详情
*
* @param sceneId - 场景ID
* @public
*/
declare function sceneDetail(sceneId: number): Promise<SceneListItem>;


/**
* 场景执行
*
* @param sceneId - 场景ID
* @public
*/
declare function sceneExecute(sceneId: number): Promise<void>;

/**
* 场景列表
*
* @param pageNo - 页码,从1开始
* @param pageSize - 分页大小,最大50
* @param withDetail - 是否请求详细
* @public
*/
declare function sceneList(pageNo: number, pageSize: number, withDetail?: boolean): Promise<SceneListRsp>;


/**
* 更新场景
*
* @param sceneUpdateReq - 更新参数
* @public
*/
declare function sceneUpdate(sceneUpdateReq: SceneUpdateReq): Promise<void>;

/**
* 更新场景名称和是否启用
*
* @param sceneUpdateBasicReq - 更新参数
* @public
*/
declare function sceneUpdateBasic(sceneUpdateBasicReq: SceneUpdateBasicReq): Promise<void>;

export declare namespace RTCXDeviceSceneMgr {
export {
sceneCreate,
sceneDelete,
sceneUpdate,
sceneUpdateBasic,
sceneExecute,
sceneList,
sceneDetail
}
}

创建场景​

创建场景

/**
* 创建场景
*
* @param sceneCreateReq - 创建参数
* @public
*/
declare function sceneCreate(sceneCreateReq: SceneCreateReq): Promise<SceneCreateRsp>;

示例

import { RTCXDeviceSceneMgr, RTCXDeviceSceneTypes, RTCXDeviceMgr, RTCXDeviceMgrTypes } from '@rtcx/websdk';

// 表单数据结构(扩展以支持设备选择)
interface ConditionFormItem {
device: string; // iotId (用于前端选择,不提交到后端)
uri: RTCXDeviceSceneTypes.SceneConditionUriEnum; // 条件类型
productKey: string;
deviceName: string;
identifier: string; // 物模型属性标识
propertyName: string;
compareType: string; // 比较类型
compareValue: string; // 比较值
}

interface ActionFormItem {
device: string; // iotId (用于前端选择,不提交到后端)
uri: RTCXDeviceSceneTypes.SceneActionUriEnum; // 动作类型
productKey: string;
deviceName: string;
identifier: string;
args: string;
}

const createForm = reactive<{
name: string;
enable: boolean;
mode: RTCXDeviceSceneTypes.SceneModeEnum;
conditions: ConditionFormItem[];
actions: ActionFormItem[];
}>({
name: '',
enable: true,
mode: SceneModeEnum.Any,
conditions: [],
actions: []
});

const handleCreate = async () => {
if (!formRef.value) return;

try {
await formRef.value.validate();
} catch {
ElMessage.warning('请填写完整信息');
return;
}


// 构建符合SceneCreateReq格式的数据
const sceneCreateReq: RTCXDeviceSceneTypes.SceneCreateReq = {
name: createForm.name,
enable: createForm.enable,
mode: createForm.mode,
conditions: createForm.conditions.map(c => ({
uri: c.uri,
params: {
productKey: c.productKey,
deviceName: c.deviceName,
identifier: c.identifier,
propertyName: c.propertyName,
compareType: c.compareType as RTCXDeviceSceneTypes.SceneConditionCompareTypeEnum,
compareValue: c.compareValue
}
})),
actions: createForm.actions.map(a => ({
uri: a.uri,
params: {
productKey: a.productKey,
deviceName: a.deviceName,
identifier: a.identifier,
args: a.args || '{}'
}
}))
};

createLoading.value = true;
try {
await RTCXDeviceSceneMgr.sceneCreate(sceneCreateReq);
ElMessage.success('创建成功');
dialogVisible.value = false;
fetchList();
} catch (error) {
console.error('创建场景失败:', error);
ElMessage.error('创建场景失败');
} finally {
createLoading.value = false;
}
};

删除场景​

/**
* 场景删除
*
* @param sceneId - 场景ID
* @public
*/
declare function sceneDelete(sceneId: number): Promise<void>;

示例

import { RTCXDeviceSceneMgr, RTCXDeviceSceneTypes, RTCXDeviceMgr, RTCXDeviceMgrTypes } from '@rtcx/websdk';

const handleDelete = async (sceneId: number, name?: string) => {
try {
await ElMessageBox.confirm(
`确定要删除场景「${name || sceneId}」吗?删除后不可恢复。`,
'删除确认',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
);

await RTCXDeviceSceneMgr.sceneDelete(sceneId);
ElMessage.success('删除成功');
fetchList();
} catch (error) {
if (error !== 'cancel') {
console.error('删除场景失败:', error);
ElMessage.error('删除场景失败');
}
}
};

更新场景​


/**
* 更新场景
*
* @param sceneUpdateReq - 更新参数
* @public
*/
declare function sceneUpdate(sceneUpdateReq: SceneUpdateReq): Promise<void>;

/**
* 更新场景名称和是否启用
*
* @param sceneUpdateBasicReq - 更新参数
* @public
*/
declare function sceneUpdateBasic(sceneUpdateBasicReq: SceneUpdateBasicReq): Promise<void>;

示例

更新全部信息

import { RTCXDeviceSceneMgr, RTCXDeviceSceneTypes, RTCXDeviceMgr, RTCXDeviceMgrTypes } from '@rtcx/websdk';
// 更新场景
const handleUpdate = async () => {
if (!editFormRef.value) return;

try {
await editFormRef.value.validate();
} catch {
ElMessage.warning('请填写完整信息');
return;
}

// 构建符合SceneUpdateReq格式的数据
const sceneUpdateReq: RTCXDeviceSceneTypes.SceneUpdateReq = {
sceneId: currentEditSceneId.value,
name: editForm.name,
enable: editForm.enable,
mode: editForm.mode,
conditions: editForm.conditions.map(c => ({
uri: c.uri,
params: {
productKey: c.productKey,
deviceName: c.deviceName,
identifier: c.identifier,
propertyName: c.propertyName,
compareType: c.compareType as RTCXDeviceSceneTypes.SceneConditionCompareTypeEnum,
compareValue: c.compareValue
}
})),
actions: editForm.actions.map(a => ({
uri: a.uri,
params: {
productKey: a.productKey,
deviceName: a.deviceName,
identifier: a.identifier,
args: a.args || '{}'
}
}))
};

updateLoading.value = true;
try {
await RTCXDeviceSceneMgr.sceneUpdate(sceneUpdateReq);
ElMessage.success('更新成功');
editDialogVisible.value = false;
fetchList();
} catch (error) {
console.error('更新场景失败:', error);
ElMessage.error('更新场景失败');
} finally {
updateLoading.value = false;
}
};

更新基础信息

import { RTCXDeviceSceneMgr, RTCXDeviceSceneTypes, RTCXDeviceMgr, RTCXDeviceMgrTypes } from '@rtcx/websdk';
const handleEnableChange = async ( row: RTCXDeviceSceneTypes.SceneListItem,
val: boolean
) => {

try {
await RTCXDeviceSceneMgr.sceneUpdateBasic({
sceneId: row.sceneId,
name: row.name,
enable: val
});
ElMessage.success(val ? '已启用' : '已禁用');
} catch (error) {
row.enable = !val;
console.error('更新状态失败:', error);
ElMessage.error('更新状态失败');
} finally {

}
};

场景执行​

/**
* 场景执行
*
* @param sceneId - 场景ID
* @public
*/
declare function sceneExecute(sceneId: number): Promise<void>;

示例

import { RTCXDeviceSceneMgr, RTCXDeviceSceneTypes, RTCXDeviceMgr, RTCXDeviceMgrTypes } from '@rtcx/websdk';
const handleExecute = async (sceneId: number) => {
const row = tableData.value.find(item => item.sceneId === sceneId);

try {
await RTCXDeviceSceneMgr.sceneExecute(sceneId);
ElMessage.success('场景执行指令已下发');
} catch (error) {
console.error('执行场景失败:', error);
ElMessage.error('执行场景失败');
} finally {

}
};

场景列表​

/**
* 场景列表
*
* @param pageNo - 页码,从1开始
* @param pageSize - 分页大小,最大50
* @param withDetail - 是否请求详细
* @public
*/
declare function sceneList(pageNo: number, pageSize: number, withDetail?: boolean): Promise<SceneListRsp>;

示例

import { RTCXDeviceSceneMgr, RTCXDeviceSceneTypes, RTCXDeviceMgr, RTCXDeviceMgrTypes } from '@rtcx/websdk';
const pageNo = ref(1);
const pageSize = ref(10);
const total = ref(0);

const fetchList = async () => {
loading.value = true;
try {
const rsp = await RTCXDeviceSceneMgr.sceneList(pageNo.value, pageSize.value, true);
tableData.value = rsp?.sceneList || [];
total.value = rsp?.total || 0;
} catch (error) {
console.error('获取场景列表失败:', error);
ElMessage.error('获取场景列表失败');
} finally {
loading.value = false;
}
};

场景详细​

/**
* 场景详情
*
* @param sceneId - 场景ID
* @public
*/
declare function sceneDetail(sceneId: number): Promise<SceneListItem>;

示例

const getDetail = async (sceneId: number) => {
try {
const detail = await RTCXDeviceSceneMgr.sceneDetail(sceneId);
} catch (error) {
console.error('获取场景列表失败:', error);
}
}