Page 1 of 1

【分享】TuyaOS中控设备控制介绍

Posted: 2024年 Jan 4日 18:06
by lightthgil

一、基本介绍

中控SDK提供了接口,可以获取到家庭下的符合标准指令的设备列表,并对设备进行控制操作

devices.png

二、使用流程

1. 获取设备列表

基于TuyaOS中控SDK,使用接口tuya_get_dev_brief_info_list即可获取到设备列表。需注意的是,获取到的设备列表,分配了一段内存,需要使用tuya_dev_brief_info_list_free进行释放

2. 获取房间列表

基于TuyaOS中控SDK,使用接口tuya_get_room_info_list即可获取到房间列表。需注意的是,获取到的房间列表,分配了一段内存,需要使用tuya_room_info_list_free进行释放
获取到的每个房间的数据大致如下

classDiagram class TUYA_ROOM_DEV_INFO_S { -CHAR_T dev_id[DEV_ID_LEN+1] } class TUYA_ROOM_INFO_S { -UINT_T id -CHAR_T name[TY_ROOM_NAME_LEN+1] -UINT_T seq -USHORT_T dev_num -TUYA_ROOM_DEV_INFO_S* dev_list } TUYA_ROOM_INFO_S "1" --> "*" TUYA_ROOM_DEV_INFO_S : contains

可以依据id区分房间,每个房间的设备信息,在dev_list里,存储了该房间的设备的dev_id。设备的具体信息,可以使用tuya_get_dev_brief_info_list获取到的设备详情查看

3.获取快捷开关列表

基于TuyaOS中控SDK,使用接口tuya_get_shortcut_switch_list即可获取到快捷列表。需注意的是,获取到的快捷列表,分配了一段内存,需要使用tuya_shortcut_switch_list_free进行释放

4. 设备控制及状态获取

1. 加载设备

使用设备之前,需要先使用tuya_home_ctrl_dev_open加载设备,该接口内部会对设备的一些信息做预处理,会消耗一定内存,具体消耗内存大小,取决于设备的dp,在内存吃紧的情况下,尽量在使用后,调用tuya_home_ctrl_dev_close释放掉。同时,该接口支持多实例,对于同一个设备,多次调用tuya_home_ctrl_dev_open,SDK仅保留一份预处理的信息,当任意一处(包括但不限于APP、设备本身、UI、语音)控制之后,会同步推送数据到多个实例的tuya_home_ctrl_dev_open注册的report_cb.function中

2. 卸载设备

设备使用完成后,可以通过tuya_home_ctrl_dev_close卸载掉

3. 获取设备可控指令

SDK针对多种品类,提供了一个tuya_home_ctrl_xxx.h来提供该品类可以控制的全量指令集,但并不是每个设备都支持全量指令集的。在实际使用中,需要通过tuya_home_ctrl_dev_get_all_dp获取当前设备可以控制的指令集。需注意:tuya_home_ctrl_dev_get_all_dp的输出参数dp_sets的内存虽然是SDK内部管理,在调用tuya_home_ctrl_dev_close的时候会释放掉,但是还是建议应用将可控的指令自己存储一份,防止设备的指令发生改变的时候,SDK重新成了新的指令,从而引发内部的指令地址发生变化,而应用还是用原来的失效地址,导致程序运行错误。一般地,当指令发生变化的时候,会有dps_update_cb.function回调,早期的版本,应用需要先tuya_home_ctrl_dev_close掉所有的实例,再重新tuya_home_ctrl_dev_open,来获取新的指令;新的SDK版本的,已经支持直接重新调用tuya_home_ctrl_dev_get_all_dp来获取新的指令,且该操作是强制性的,如果不调用tuya_home_ctrl_dev_get_all_dp或重新open设备,则后续对设备的任何控制都会反错

3. 主动获取设备指定指令的值

可以通过tuya_home_ctrl_dev_get_dp_value获取单个指令的值,也可以通过tuya_home_ctrl_dev_get_all_dp获取全部指令的值,再匹配需要的指令的方式来得到结果

4. 控制设备的指定指令

可以通过tuya_home_ctrl_dev_set_dp_value来控制设备的单个指令,需要注意的是,该指令必须在tuya_home_ctrl_dev_get_all_dp获取到的指令集范围内,且类型需要与其保持一致

5. 设备指令值变化后主动通报

当设备被任意一处(包括但不限于APP、设备本身、UI、语音)控制之后,SDK会通过tuya_home_ctrl_dev_open注册的report_cb.function回调进行通告

6. 不加载设备获取设备信息变化

tuya_home_ctrl_event.h中列出了可以不加载设备获取的设备信息,例如:

  • 获取到设备房间的变化

  • 获取到设备名称、图标的变化

  • 将一个二路开关的两个开关,直接展示到主页

7. 获取设备指令名称

有些设备,例如开关,可以针对每个开关都进行独立命名,可以通过tuya_home_ctrl_get_dp_name_list获取到修改过的名字,需要注意的是,如果在APP上没有修改过名字,则获取到的名字为空,需要应用层自己设置默认名字。当设备指令名字被修改后,也会通过tuya_home_ctrl_dev_open注册的dp_name_update_cb.function回调进行通告

8. 其他设备信息变化通告

tuya_home_ctrl_dev_open注册的回调接口,以及tuya_home_ctrl_event.h,有其他的设备信息的回调接口,具体请参照SDK的接口注释,随着SDK的更新,改部分内容再持续补充中

9. 自定义dp

部分应用,如果需要对特定PID的设备的具体某个非标准dp进行操作,可以通过自定义dp的方式进行,相应的接口是tuya_home_ctrl_dev_get_all_custom_dp、tuya_home_ctrl_dev_set_custom_dp_value、tuya_home_ctrl_dev_get_custom_dp_value,具体的内容请自行查阅SDK文档。需注意的是,如果该pid的设备,没有任何标准指令,且没有快捷方式,则获取设备列表的时候,是获取不到设备的。SDK仅支持具有标准指令集的设备。对于非标准设备,或者部分dp非标设备,优先考虑提交标准化申请,转换成标准设备使用