复杂协议结构化

背景: 在目前扫地机的对外方案中,一些特有的高级功能是通过DP15:command_trans进行面板与设备端通信的。在通信时,需要按照涂鸦扫地机对外协议文档约定的格式进行组装、解析,理解成本及开发成本都比较高。为了帮助开发者快速的构建一款扫地机应用,我们将此DP中的功能拆解成结构化数据进行两端通信。

如何接入

设备端

设备端SDK版本要求:tuyaos_robot_rvc_sdk>=1.0.0 版本才可使用

面板端

在 @ray-js/robot-data-stream 依赖包中,针对特定的高级功能提供了相应的请求及设置方法,同时此依赖包也注册了一个事件监听器 StreamDataNotificationCenter ,当设备端回复了相应的指令时,面板开发者可以通过事件监听的方式收到上报的数据。

功能列表

虚拟墙

const { requestVirtualWall, setVirtualWall } = useVirtualWall(devId);

虚拟墙功能提供了两个方法,分别是设置虚拟墙 setVirtualWall 和查询虚拟墙 requestVirtualWall 。

设置置虚拟墙

参数

  • params (对象): 包含以下属性的对象
    • points (string[]): 虚拟墙的端点坐标,参考格式['x0,y0,x1,y1','x2,y2,x3,y3'],x0 | y0:虚拟墙其中一个点的坐标,x1 | y1:虚拟墙另一个点的坐标
    • num (humber,可选): 虚拟墙个数
    • mode: (number[],可选),虚拟墙的清扫模式,0: 全禁,1: 禁扫, 2:禁拖, 如果此功能未使用,可以忽略此参数

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构

type Response = {
  modes: number[]; // 虚拟墙的模式
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  num: number; // 虚拟墙的数量
  reqType: "virtualWallQry"; // 请求类型,固定为 "virtualWallQry"
  mapId: number; // 地图ID
  version: string; // 版本号
  taskId: string; // 任务ID
  points: string[]; // 虚拟墙的点数组
}

例子

// 导入useVirtualWall
import { useVirtualWall } from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
// 初始化setVirtualWall
const { setVirtualWall } = useVirtualWall(devId);

setVirtualWall({
  points:['10,10,50,40']
}).then(data=>{
  // 表示设置成功
  console.log(data)
  //   {
  //     "reqType": "virtualWallQry",
  //     "version": "1.0.0",
  //     "num": 1,
  //     "modes": [
  //         0
  //     ],
  //     "points": [
  //         "-113, -11, -30, -26"
  //     ],
  //     "mapId": 2,
  //     "success": true,
  //     "errCode": 0,
  //     "taskId": "1738980882764"
  // }
}).catch(error=>{
  // 表示操作失败,设备返回失败或设备超时未响应导致失败,超时时间5s
  console.log(error)
})

注意

  • 下发给设备的坐标点信息需要机器坐标系下的数据,通过扫地机 SDK 获取的虚拟墙坐标信息需要根据原点坐标进行转换。
  • 收到设备虚拟墙信息的回复后,会抛出 virtualWallQry 的事件,可以通过 StreamDataNotificationCenter 进行监听。

查询虚拟墙

参数

--

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构

type Response = {
  modes: number[]; // 虚拟墙的模式
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  num: number; // 虚拟墙的数量
  reqType: "virtualWallQry"; // 请求类型,固定为 "virtualWallQry"
  mapId: number; // 地图ID
  version: string; // 版本号
  taskId: string; // 任务ID
  points: string[]; // 虚拟墙的点数组
}

例子

// 导入useVirtualWall
import { useVirtualWall,StreamDataNotificationCenter,VirtualWallEnum } from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
// 初始化setVirtualWall
const { requestVirtualWall } = useVirtualWall(devId);

requestVirtualWall();

// 监听虚拟墙设备上报信息
 StreamDataNotificationCenter.on(VirtualWallEnum.query, handleVirtualWall);

// 在这个方法中可以获取到设备上报的虚拟墙信息,可以更新项目中的redux数据
const handleVirtualWall = (data)=>{
  console.log(data)
}

注意

  • 设备上报的坐标点数据是机器坐标系下的数据,传入扫地机SDK时需要将数据转换成屏幕坐标系下的数据。
  • 收到设备虚拟墙信息的回复后,会抛出 virtualWallQry 的事件,可以通过 StreamDataNotificationCenter 进行监听。

禁区

const { requestVirtualArea, setVirtualArea } = useVirtualArea(devId);

禁区功能提供了两个方法,分别是设置禁区setVirtualArea和查询禁区requestVirtualArea

设置禁区

参数

  • params (对象): 包含虚拟区域设置参数的对象,具有以下属性:
    • polygons (string[]): 多边形数组,每个元素为一个多边形的坐标字符串。
    • names (string[], 可选): 名称数组,每个元素为一个区域的名称。
    • modes (number[]): 模式数组,每个元素为一个区域的模式,0:全禁,1:禁扫,2:禁拖。
    • num (number, 可选): 虚拟区域的数量。

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// VirtualAreaResponse对象结构
interface VirtualAreaResponse {
  reqType: string; // 请求类型
  version: string; // 版本号
  num: number; // 虚拟区域的数量
  modes: number[]; // 模式数组,每个元素为一个区域的模式
  polygons: string[]; // 多边形数组,每个元素为一个多边形的坐标字符串
  names: string[]; // 名称数组,每个元素为一个区域的名称
  mapId: number; // 地图ID
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  taskId: string; // 任务ID
}

例子

// 导入useVirtualArea
import { useVirtualArea } from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
const { setVirtualArea } = useVirtualArea(devId);

 setVirtualArea({
    "polygons": [
        "-165,64,-81,64,-81,19,-165,19",
        "-175,53,-92,53,-92,9,-175,9"
    ],
    "modes": [
        0,
        2
    ],
})
  .then(data => {
    console.log(data);
//    {
//     "reqType": "restrictedAreaQry",
//     "version": "1.0.0",
//     "num": 2,
//     "modes": [
//         0,
//         2
//     ],
//     "polygons": [
//         "-165, 64,-81, 64,-81, 19,-165, 19",
//         "-175, 53,-92, 53,-92, 9,-175, 9"
//     ],
//     "names": [
//         "",
//         ""
//     ],
//     "mapId": 2,
//     "success": true,
//     "errCode": 0,
//     "taskId": "1738994024502"
// }
  })
  .catch((error) => {
    console.log(error)
  });

注意

  • 下发给设备的坐标点信息需要机器坐标系下的数据,通过扫地机SDK获取的虚拟区域信息需要根据原点坐标进行转换。
  • 收到设备禁区信息的回复后,会抛出 restrictedAreaQry 的事件,可以通过 StreamDataNotificationCenter 进行监听。

查询禁区

参数

--

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// VirtualAreaResponse对象结构
interface VirtualAreaResponse {
  reqType: string; // 请求类型
  version: string; // 版本号
  num: number; // 虚拟区域的数量
  modes: number[]; // 模式数组,每个元素为一个区域的模式
  polygons: string[]; // 多边形数组,每个元素为一个多边形的坐标字符串
  names: string[]; // 名称数组,每个元素为一个区域的名称
  mapId: number; // 地图ID
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  taskId: string; // 任务ID
}

例子

// 导入useVirtualArea
import { useVirtualArea,StreamDataNotificationCenter,VirtualAreaEnum } from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
// 初始化requestVirtualArea
const { requestVirtualArea } = useVirtualArea(devId);

requestVirtualArea();

// 监听虚拟墙设备上报信息
 StreamDataNotificationCenter.on(VirtualAreaEnum.query, handleVirtualArea);

// 在这个方法中可以获取到设备上报的虚拟墙信息,可以更新项目中的redux数据
const handleVirtualArea = (data)=>{
  console.log(data)
}

注意

  • 设备上报的坐标点数据是机器坐标系下的数据,传入扫地机SDK时需要将数据转换成屏幕坐标系下的数据。
  • 收到设备禁区信息的回复后,会抛出restrictedAreaQry的事件,可以通过StreamDataNotificationCenter进行监听。

机器语音

const { requestAllVoices, requestVoiceInUse,setVoice } = useVoice(devId);

机器语音功能提供了三个方法,分别是查询所支持的所有设备语音 requestAllVoices , 查询当前使用的机器语音 requestVoiceInUse 和设置语音 setVoice 。

查询语音列表

参数

--

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// GetVoiceListResponse对象结构
  type GetVoiceListResponse = {
    datas: {
      auditionUrl: string // 试听链接
      desc?: string // 描述
      extendData: {
        extendId: number // 扩展ID,通过这个id与设备上报的语言包id进行对比,判断语音包是否使用中
        version: string // 版本
      }
      id: number // ID
      imgUrl: string // 图片链接
      name: string // 名称
      officialUrl: string // 官方链接
      productId: string // 产品ID
      region: string[] // 区域代码
    }[] // 语音数据数组
    pageNo: number // 页码
    totalCount: number // 数据总数
  }

例子

import { useVoice } from '@ray-js/robot-data-stream';
const { requestAllVoices } = useVoice(devId);

requestAllVoices()
  .then(res => {
    console.log(res.data)
  })
  .finally(() => {
    setLoading(false);
  });

注意

  • 此功能是需要在涂鸦IoT平台上上传语音文件后才可使用,操作方法请联系您的客户经理或提工单进行咨询。

查询使用中的语音文件

参数

--

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// VoiceLanguageResponse对象结构
interface VoiceLanguageResponse {
  reqType: string; // 请求类型
  version: string; // 版本号
  id: number; // 语音语言ID
  schedule: number; // 进度百分比
  status: number; // 状态码
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  taskId: string; // 任务ID
}

例子

requestVoiceInUse().then(data => {
  console.log(data);
// {
//     "reqType": "voiceLanguageQry",
//     "version": "1.0.0",
//     "id": 0,
//     "schedule": 100,
//     "status": 3,
//     "success": true,
//     "errCode": 0,
//     "taskId": "1738996454610"
// }
});

注意

  • 在收到设备当前使用的语音文件的回复后,会抛出 voiceLanguageQry 的事件,可以通过 StreamDataNotificationCenter 进行监听。

设置语音

参数

  • message (对象): 包含语音语言设置参数的对象,具有以下属性:
    • id (number): 语音语言ID。
    • url (string): 语音语言文件的URL。
    • md5 (string): 语音语言文件的MD5值。

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// VoiceLanguageResponse对象结构
interface VoiceLanguageResponse {
  reqType: string; // 请求类型
  version: string; // 版本号
  id: number; // 语音语言ID
  schedule: number; // 进度百分比
  status: number; // 状态码
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  taskId: string; // 任务ID
}

例子

import { useVoice,StreamDataNotificationCenter ,VoiceLanguageEnum} from '@ray-js/robot-data-stream';

const { setVoice } = useVoice(devId);

// 这里的数据来源是requestAllVoices方法中返回的数据
setVoice({
  id: extendData.extendId,
  url: officialUrl,
  md5: desc,
});

// 监听设备上报
StreamDataNotificationCenter.on(VoiceLanguageEnum.query, (data) => {
  console.log('收到了voiceLanguageQry====>', data);
});

注意

  • 下发设备语音后,设备端会定时上报语音文件的下载进度直至下载完成,因此代码实现时建议使用事件监听的方式
  • 在每次收到设备下载语音文件的回复后,会抛出 voiceLanguageQry 的事件,可以通过 StreamDataNotificationCenter 进行监听。

机器信息

const { requestDevInfo } = useDevInfo(devId);

机器信息功能提供了1个方法,请求机器信息 requestDevInfo 。

请求机器信息

参数

--

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// DevInfoResponse 对象结构

interface DevInfoResponse {
  reqType: string; // 请求类型
  version: string; // 版本号
  info: string; // 设备信息的 JSON 字符串
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  taskId: string; // 任务ID
}

例子

import { useDevInfo } from '@ray-js/robot-data-stream';

const { requestDevInfo } = useDevInfo(devId);

   requestDevInfo()
      .then(data => {
        const { info } = data;
        const robotInfo = JsonUtil.parseJSON(info);
        console.log(robotInfo)
//      {
//     "WiFi_Name": "robot",
//     "RSSI": 58,
//     "IP": "**",
//     "Mac": "**",
//     "Firmware_Version": "**",
//     "Device_SN": "**",
//     "Module_UUID": "**"
// }
      })
      .catch(error => {
        console.log(error);
      });

注意

  • 在收到设备机器信息回复后,会抛出 devInfoQry 的事件,可以通过StreamDataNotificationCenter进行监听。

历史地图

const { deleteHistoryMap, changeCurrentMap,saveMap } = useHistoryMap(devId);

历史地图功能提供了3个方法,分别是保存地图 saveMap、删除历史地图 deleteHistoryMap、修改首页地图 changeCurrentMap

保存地图

参数

--

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构

type Response = {
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  reqType: string; // 请求类型
  version: string; // 版本号
  taskId: string; // 任务ID
}

例子

import { useHistoryMap,StreamDataNotificationCenter ,SaveCurrentMapEnum} from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
const { saveMap } = useHistoryMap(devId);

saveMap().then(()=>{
  console.log('保存成功')
}).catch(()=>{
  console.log('保存失败')
});

// 监听保存地图的设备上报
 StreamDataNotificationCenter.on(SaveCurrentMapEnum.query, (data)=>{
  console.log(data)
 });
  • 在收到设备保存地图的回复后,会抛出 SaveCurrMapRst 的事件,可以通过 StreamDataNotificationCenter 进行监听。

删除地图

参数

mapId (number): 地图云端ID。

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构

type Response = {
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  reqType: string; // 请求类型
  version: string; // 版本号
  taskId: string; // 任务ID
}

例子

import { useHistoryMap,StreamDataNotificationCenter ,DeleteMapEnum} from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
const { deleteHistoryMap } = useHistoryMap(devId);

 deleteHistoryMap(id)
  .then((data) => {
    console.log('删除成功')
  }).catch(error=>{
    console.log(error)
  })

// 监听删除历史地图的上报
 StreamDataNotificationCenter.on(DeleteMapEnum.rst, ()=>{
  console.log('收到设备上报')
 });

注意

在收到设备保存地图的回复后,会抛出 deleteMapRst 的事件,可以通过 StreamDataNotificationCenter 进行监听。

修改首页地图

参数

  • mapId (number): 地图ID。
  • url (string): 地图URL。

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构

type Response = {
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  reqType: string; // 请求类型
  mapId: number; // 地图ID
  version: string; // 版本号
  taskId: string; // 任务ID
}

例子

import { useHistoryMap,UseMapEnum,StreamDataNotificationCenter } from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
const { changeCurrentMap } = useHistoryMap(devId);

const mapId = 123;
const url = 'https://example.com/map.png';

changeCurrentMap(mapId, url).then(response => {
  console.log('更改成功:', response);
}).catch(error => {
  console.error('更改失败:', error);
});

 StreamDataNotificationCenter.on(UseMapEnum.query, ()=>{
  console.log('收到设备上报')
 });

注意

在收到设备保存地图的回复后,会抛出 useMapRst 的事件,可以通过 StreamDataNotificationCenter 进行监听。

房间分隔

const {setPartDivision} = usePartDivision(devId);

房间分隔为一个用户操作行为,此 hooks 中仅提供了一个房间分隔操作 setPartDivision 的函数。

房间分隔

参数

  • points (Point[]): 分隔点数组,SDK方法抛出来的坐标直接传入即可。
  • roomId (number): 房间ID,当前要分隔的房间。
  • origin (Point): 地图原点坐标。

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构

type Response = {
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  reqType: string; // 请求类型
  version: string; // 版本号
  taskId: string; // 任务ID
}

例子

import { usePartDivision } from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
const { setPartDivision } = usePartDivision(devId);

const points = [
  { x: 100, y: 100 },
  { x: 200, y: 200 },
];
const roomId = 1;
const origin = { x: 0, y: 0 };


setPartDivision(points, roomId, origin).then(()=>{
  console.log('保存成功')
}).catch(()=>{
  console.log('保存失败')
});

注意

  • 在收到设备房间分隔的回复后,会抛出 partDivisionRst 的事件,可以通过 StreamDataNotificationCenter 进行监听。
  • setPartDivision 方法传入的分割线坐标为屏幕坐标系下的数据,即扫地机SDK方法中抛出来的数据

分区合并

const {setPartMerge} = usePartMerge(devId);

分区合并为一个用户操作行为,此 hooks 中仅提供了一个房间分隔操作 setPartMerge 的函数。

分区合并

参数

  • ids (number[]): 要合并的房间ID数组。

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构

type Response = {
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  reqType: string; // 请求类型
  version: string; // 版本号
  taskId: string; // 任务ID
}

例子

import { usePartMerge } from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
const { setPartMerge } = usePartMerge(devId);

const ids = [1, 2, 3];

setPartMerge(ids).then(response => {
  console.log('设置成功:', response);
}).catch(error => {
  console.error('设置失败:', error);
});

注意

  • 在收到设备房间合并的回复后,会抛出partMergeRst的事件,可以通过StreamDataNotificationCenter进行监听。

勿扰模式

import { useQuiteHours } from '@ray-js/robot-data-stream';

const { setQuiteHours ,requestQuiteHours} = useQuiteHours(devId);

勿扰模式功能提供了两个方法,分别是设置勿扰模式 setQuiteHours 和查询勿扰模式 requestQuiteHours 。

请求勿扰模式

参数

--

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构

type Response = {
  time: string[]; // 时间段数组,每个元素为 "开始时间, 结束时间" 的字符串
  day: number; // 是否有跨天,1 表示有,0 表示无。
  active: number; // 是否激活,0 表示未激活,1 表示激活
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  reqType: string; // 请求类型
  mapId: number; // 地图ID
  version: string; // 版本号
  taskId: string; // 任务ID
}

例子

// 导入useVirtualWall
import { useQuiteHours } from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
// requestQuiteHours
const { requestQuiteHours } = useVirtualWall(devId);

requestQuiteHours().then(data => {
  console.log('勿扰模式数据:', data);
  //  {
  //   "reqType": "quietHoursQry",
  //   "time": ["9,15", "0,18"],
  //   "version": "1.0.0",
  //   "day": 1,
  //   "taskId": "1733126622485",
  //   "mapId":111
  // }
}).catch(error => {
  console.error('请求失败:', error);
});

设置勿扰模式

参数

  • params (对象): 包含勿扰模式设置参数的对象,具有以下属性:
    • startTime (对象): 开始时间,包含以下属性:
      • hour (number): 小时,范围为 0-23。
      • minute (number): 分钟,范围为 0-59。
    • endTime (对象): 结束时间,包含以下属性:
      • hour (number): 小时,范围为 0-23。
      • minute (number): 分钟,范围为 0-59。
    • active (number): 勿扰模式开关,1 表示开启,0 表示关闭。
    • day (number): 是否有跨天,1 表示有,0 表示无。
    • version (string, 可选): 协议版本。

返回值

返回值Promise: Promise 对象,用于处理异步操作的结果。

{ 
  reqType: string;  // 请求类型
  version: string;// 版本号
  active: number;// 是否激活,0 表示未激活,1 表示激活
  time: string[];// 时间段数组,每个元素为 "开始时间, 结束时间" 的字符
  day: number;// 是否有跨天,1 表示有,0 表示无。
  success: boolean; // 请求是否成功
  errCode: number;// 错误代码,0 表示无错误
  taskId: string; // 任务ID
}

例子

import { Switch } from '@ray-js/smart-ui';
import { useQuiteHours } from '@ray-js/robot-data-stream';

// 设备ID
const { devId } = useDevice(device => device.devInfo);
const { setQuiteHours } = useQuiteHours(devId);


  setQuiteHours({
    startTime:{
      hour:22,
      minute:0
    },
    endTime:{
      hour:8,
      minute:0
    },
    active: value,
    day: 1,
  })
    .then(data => {
     console.log('修改成功')
    })
    .catch(() => {
     console.log('修改失败')
    });

重置地图

const {setResetMap} = useResetMap(devId);

重置地图

参数

--

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构

type Response = {
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  reqType: string; // 请求类型
  version: string; // 版本号
  taskId: string; // 任务ID
}

例子

import { useResetMap } from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
const { setResetMap } = useResetMap(devId);


setResetMap().then(response => {
  console.log('重置地图成功', response);
}).catch(error => {
  console.error('重置地图失败:', error);
});

房间属性

const { requestRoomProperty, setRoomProperty } = useRoomProperty(devId);

房间属性功能提供了两个方法,分别是设置房间属性 setRoomProperty 和查询房间属性 requestRoomProperty 。

设置房间属性

参数

  • message (对象): 包含房间属性设置参数的对象,具有以下属性:
    • suctions (string[], 可选): 吸力数组。
    • cisterns (string[], 可选): 水箱数组。
    • cleanCounts (number[], 可选): 清扫次数数组。
    • yMops (number[], 可选): 拖布数组。
    • sweepMopModes (string[], 可选): 扫拖模式数组。
    • names (string[], 可选): 名称数组。
    • ids (number[]): 房间ID数组。

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构
type Response = {
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  reqType: string; // 请求类型
  version: string; // 版本号
  taskId: string; // 任务ID
  num:number; //房间数量
  mapId:number;//地图id
    // 吸力, closed - 关闭 gentle - 安静 normal - 正常 strong - 强劲 max - 超强 ,默认值为''
  suctions?: string[];
  // 拖地水量 "closed"- 关闭,"low"-低,"middle"-中,"high"-高,默认值为''
  cisterns?: string[];
  // 清扫次数 默认值1
  cleanCounts?: number[];
  // 拖地模式 1:开启Y型拖地 0:关闭Y型拖地  -1 未设置 默认值-1
  yMops?: number[];
  // 扫拖模式 "only_sweep":仅扫,"only_mop":仅拖,"both_work":扫拖同时,"clean_before_mop":先扫后拖,默认值为'only_sweep'
  sweepMopModes?: string[];
  // 房间地板类型,默认值-1
  floorTypes?: number[];
  // 房间名称,默认是空字符串
  names?: string[];
  // 房间id集合
  ids?: number[];
  // 房间顺序
  orders?: number[];
}

例子

import { useRoomProperty } from '@ray-js/robot-data-stream';
const { devId } = useDevice(device => device.devInfo);
const { setRoomProperty } = usePartMerge(devId);

const roomPropertyData = {
  suctions: ['low', 'gentle', 'max'],
  cisterns: ['closed', 'middle', 'high'],
  cleanCounts: [1, 2, 1],
  yMops: [0, 1, -1],
  sweepMopModes: ['only_sweep', 'sweep_and_mop', 'only_mop'],
  names: ['Living Room', 'Bedroom', 'Kitchen'],
  ids: [1, 2, 3],
  floorTypes:[-1,-1,-1]
  orders:[1,2,3]
};

setRoomProperty(roomPropertyData).then(response => {
  console.log('设置成功:', response);
}).catch(error => {
  console.error('设置失败:', error);
});

注意

  • 设置房间属性时需要注意要将所有的房间属性都需要传入,比如现在在修改房间地板,在下发时也需要将房间名称等数据同时下发给设备。
  • suctions,cisterns 等字段的顺序需要保持与ids的顺序一致,比如ids第1个数据是卧室,那 suctions 第1个元素也需要是卧室的吸力。

请求房间属性

方法名

requestRoomProperty

参数

--

返回值

参考 setRoomProperty 。

例子

import { useRoomProperty } from '@ray-js/robot-data-stream';
const { devId } = useDevice(device => device.devInfo);
const { requestRoomProperty } = usePartMerge(devId);

requestRoomProperty().then(response => {
  console.log('房间属性数据:', response);
}).catch(error => {
  console.error('请求失败:', error);
});

定时任务

const { requestSchedule, setSchedule } = useSchedule(devId);

定时任务功能提供了两个方法,分别是设置定时 setSchedule 和查询定时 requestSchedule 。

设置定时

参数

  • message (对象): 包含定时任务设置参数的对象,具有以下属性:
    • list (Array): 定时任务列表。
    • num (number): 定时任务数量。
type ScheduleItem = {
   // 吸力, closed - 关闭 gentle - 安静 normal - 正常 strong - 强劲 max - 超强 ,默认值为''
  suctions?: string[];
   // 拖地水量 "closed"- 关闭,"low"-低,"middle"-中,"high"-高,默认值为''
  cisterns?: string[];
  // 拖地模式 1:开启Y型拖地 0:关闭Y型拖地  -1 未设置 默认值-1
  yMops?: number[];
 // 扫拖模式 "only_sweep":仅扫,"only_mop":仅拖,"both_work":扫拖同时,"clean_before_mop":先扫后拖,默认值为'only_sweep'
  sweepMopModes?: string[];
    // 房间id集合,如果ids 为空数组,则表示全屋执行
  ids?: number[];
  // 定时是否有效,0:定时关闭 1:定时开启
  active: number; 
  // 周循环,周一到周日
  cycle: number[]; 
   // 执行时间, [小时, 分钟]
  time: number[];
};

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构,ScheduleItem 结构与入参结构一致
type Response ={
  reqType: string; // 请求类型
  version: string; // 版本号
  success: boolean; // 请求是否成功
  errCode: number; // 错误代码,0 表示无错误
  taskId: string; // 任务ID
  list: Array<ScheduleItem>;
  num: number;
};

例子

import { useSchedule } from '@ray-js/robot-data-stream';
const { devId } = useDevice(device => device.devInfo);
const {  setSchedule } = useSchedule(devId);


const scheduleData = {
  list: [
    {
      // 定时开启
      active: 1,
      // 仅执行一次
      cycle:[0,0,0,0,0,0,0],
      // 清扫时间8:00
      time: [8, 0],
      // 吸力正常
      suctions: ['normal'],
      // 水量关闭
      cisterns: ['closed'],
      // 仅清扫一次
      cleanCounts: [1],
      // y字型拖地关闭
      yMops: [0],
      // 禁扫模式
      sweepMopModes: ['only_sweep'],
      // 全屋清扫
      ids: [],
    },
  ],
  num: 1,
};

setSchedule(scheduleData).then(response => {
  console.log('设置成功:', response);
}).catch(error => {
  console.error('设置失败:', error);
});

注意

  • 定时数据需要全量下发,比如现在已经添加了1条定时,在第二条定时添加时,下发的列表数据中需要包含第一条定时的数据

查询定时

参数

--

返回值

参考 setSchedule 方法的返回参数。

例子

import { useSchedule } from '@ray-js/robot-data-stream';
const { devId } = useDevice(device => device.devInfo);
const { requestRoomProperty } = useSchedule(devId);

requestSchedule().then(response => {
  console.log('定时数据:', response);
}).catch(error => {
  console.error('请求失败:', error);
});

选区清扫

const { requestSelectRoomClean, setRoomClean } = useSelectRoomClean(devId);

选区清扫功能提供了两个方法,分别是设置选区清扫 setSpotClean 和查询选区清扫 requestSpotClean 。

设置选区清扫

参数

  • message (对象): 包含选区清扫设置参数的对象,具有以下属性:
    • ids (number[]): 房间ID数组。
    • suctions (string[], 可选): 吸力数组。
    • cisterns (string[], 可选): 水箱数组。
    • cleanCounts (number[], 可选): 清扫次数数组。
    • yMops (number[], 可选): 拖布数组。
    • sweepMopModes (string[], 可选): 扫拖模式数组。

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果

// Response 对象结构,ScheduleItem 结构与入参结构一致
type Response ={
   reqType: string; // 请求类型
    version: string; // 版本号
    success: boolean; // 请求是否成功
    errCode: number; // 错误代码,0 表示无错误
    taskId: string; // 任务ID
    ids:string[];  // 房间id
    suctions: string[];//吸力
    cisterns:string[]; // 拖地水量
    cleanCounts:number[];//清扫次数
    yMops: number[];//拖地模式 
    sweepMopModes: string[];  //扫拖模式 
};

例子

const roomCleanData = {
  ids: [1, 2, 3],
  suctions: ['strong', 'strong', 'high'],
  cisterns: ['low', 'middle', 'high'],
  cleanCounts: [1, 2, 1],
  yMops: [0, 1, 0],
  sweepMopModes: ['only_sweep', 'clean_before_mop', 'both_work'],
};

setRoomClean(roomCleanData).then(() => {
  console.log('设置成功');
}).catch(error => {
  console.error('设置失败:', error);
});

注意

  • 在收到设备选区清扫的回复后,会抛出 roomCleanQry 的事件,可以通过 StreamDataNotificationCenter 进行监听。

查询选区清扫

参数

--

返回值

参考 setRoomClean 。

例子

import { useSelectRoomClean } from '@ray-js/robot-data-stream';
const { devId } = useDevice(device => device.devInfo);
const { requestSelectRoomClean } = useSelectRoomClean(devId);

requestSelectRoomClean().then(response => {
  console.log('清扫数据:', response);
}).catch(error => {
  console.error('请求失败:', error);
});

注意

  • 在收到设备选区清扫的回复后,会抛出 roomCleanQry 的事件,可以通过 StreamDataNotificationCenter 进行监听。

划区清扫

const { requestZoneClean, setZoneClean } = useZoneClean(devId);

划区清扫功能提供了两个方法,分别是设置划区清扫 setZoneClean 和查询划区清扫 requestZoneClean 。

设置划区清扫

参数

  • message (对象): 包含定点清扫设置参数的对象,具有以下属性:
    • polygons (string[]): 多边形数组,每个元素为一个多边形的坐标字符串。
    • suctions (string[], 可选): 吸力数组。
    • cisterns (string[], 可选): 水箱数组。
    • cleanCounts (number[], 可选): 清扫次数数组。
    • yMops (number[], 可选): 拖布数组。
    • sweepMopModes (string[], 可选): 扫拖模式数组。
    • names (string[], 可选): 名称数组。

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构
type Response ={
   reqType: string; // 请求类型
    version: string; // 版本号
    success: boolean; // 请求是否成功
    errCode: number; // 错误代码,0 表示无错误
    taskId: string; // 任务ID
    polygons:string[];  // 多边形数组,每个元素为一个多边形的坐标字符串。
    suctions: string[];//吸力
    cisterns:string[]; // 拖地水量
    cleanCounts:number[];//清扫次数
    yMops: number[];//拖地模式 
    sweepMopModes: string[];  //扫拖模式 
    names?:string[]; //名称数组。
};

例子

const zoneCleanData = {
  polygons: ['-165,64,-81,64,-81,19,-165,19', '-175,53,-92,53,-92,9,-175,9'],
  suctions: ['gentle', 'normal'],
  cisterns: ['closed', 'middle'],
  cleanCounts: [1, 2],
  yMops: [0, 1],
  sweepMopModes: ['only_sweep', 'both_work'],
  names: ['区域1', '区域2'],
};

setZoneClean(spotCleanData).then(response => {
  console.log('设置成功:', response);
}).catch(error => {
  console.error('设置失败:', error);
});

注意

  • 在收到设备划区清扫的回复后,会抛出 zoneCleanQry 的事件,可以通过 StreamDataNotificationCenter 进行监听。

查询划区清扫

参数

--

返回值

参考 setZoneClean 返回值。

注意

  • 在收到设备划区清扫的回复后,会抛出 zoneCleanQry 的事件,可以通过 StreamDataNotificationCenter 进行监听。

定点清扫

const { requestSpotClean, setSpotClean } = useSpotClean(devId);

定点清扫功能提供了两个方法,分别是设置定点清扫 setSpotClean 和查询定点清扫 requestSpotClean .

设置定点清扫

参数

  • message (对象): 包含定点清扫设置参数的对象,具有以下属性:
    • polygons (string[]): 多边形数组,每个元素为一个多边形的坐标字符串。
    • suctions (string[], 可选): 吸力数组。
    • cisterns (string[], 可选): 水箱数组。
    • cleanCounts (number[], 可选): 清扫次数数组。
    • yMops (number[], 可选): 拖布数组。
    • sweepMopModes (string[], 可选): 扫拖模式数组。
    • names (string[], 可选): 名称数组。

返回值

Promise: 一个 Promise 对象,表示异步操作的响应结果。

// Response 对象结构
type Response ={
   reqType: string; // 请求类型
    version: string; // 版本号
    success: boolean; // 请求是否成功
    errCode: number; // 错误代码,0 表示无错误
    taskId: string; // 任务ID
    polygons:string[];  // 多边形数组,每个元素为一个多边形的坐标字符串。
    suctions: string[];//吸力
    cisterns:string[]; // 拖地水量
    cleanCounts:number[];//清扫次数
    yMops: number[];//拖地模式 
    sweepMopModes: string[];  //扫拖模式 
    names?:string[]; //名称数组。
};

例子

import { useSpotClean } from '@ray-js/robot-data-stream';

const { devId } = useDevice(device => device.devInfo);
const { setSpotClean } = useSpotClean(devId);

const params ={
  "yMops":[-1],
  "names":[""],
  "polygons":["13,30"],
  "num":1,
  "suctions":["max"],
  "cisterns":["max"],
  "sweepMopModes":["both_work"]
}

setSpotClean(params).then((data)=>{
  console.log('设置定点清扫',data)
}).catch(err=>{
  console.log(err)
})

注意

  • 在收到设备定点清扫的回复后,会抛出 spotCleanQry 的事件,可以通过 StreamDataNotificationCenter 进行监听。

查询定点清扫

参数

--

返回值

参考 setSpotClean 返回值.

例子

import { useSpotClean } from '@ray-js/robot-data-stream';
const { devId } = useDevice(device => device.devInfo);
const { requestSpotClean } = useSpotClean(devId);

requestSpotClean().then(response => {
  console.log('定点清扫数据:', response);
}).catch(error => {
  console.error('请求失败:', error);
});

注意

  • 在收到设备定点清扫的回复后,会抛出 spotCleanQry 的事件,可以通过 StreamDataNotificationCenter 进行监听。