更新时间:2024-08-28 06:29:08下载pdf
本文介绍一款基于 TuyaOS 平台开发的 Zigbee 两路开关 Demo。
支持配网功能。
支持开关功能(两路开关)。
控制方式:
状态同步:设备状态(开关指示灯)和 App 面板状态保持同步。
支持指示灯状态设置。
指示网络状态:上电或网络状态改变时,网络指示灯有相应的行为。
指示开/关状态:本 Demo 使用两路开关,分别通过指示灯来指示开关状态。打开开关后,对应的指示灯亮。关闭开关后,对应的指示灯灭。
在 App 面板打开/关闭开关,设备收到开/关命令后,设备上的开关状态立即切换,对应指示灯的亮灭状态也随之切换。
支持数据上报。
根据设备状态和连接情况,指示灯显示相应的指示信息。
配网成功后,操作面板按键,网关给设备发送携带开关状态的数据包。
设备接收到数据包后,根据数据包中的开关状态切换开关的开关状态。
关于产品创建流程,参考 创建产品。
参数 | 数值 |
---|---|
Profile ID | 0x0104 |
Device ID | 0x0103 |
Endpoint | 描述 |
---|---|
1 | 第一路开关端口号 |
2 | 第二路开关端口号 |
Input clusters (Server) | Output clusters (Client) |
---|---|
Basic(0x0000) | Over The Air Upgrade(0x0019) |
Identify(0x0003) | / |
Group (0x0004) | / |
Scene (0x0005) | / |
OnOff (0x0006) | / |
ID | Name | Data type | Range | Default |
---|---|---|---|---|
0x0000 | ZCL Version | uint8-0x20 | 0x00-0xff | 0x03 |
0x0001 | Application Version | uint8-0x20 | 0x00-0xff | 例如,0b 01 00 0001 = 1.0.1 ,即 0x41 为 1.0.1 。OTA 功能会用到该版本号,在 OTA 开始阶段,网关会读取 OTA 包的版本号推送给设备。在 OTA 成功重启后,网关会读取版本号来确定是否升级成功。只能往更高的版本升级。 |
0x0002 | Stack Version | uint8-0x20 | 0x00-0xff | 0x02 |
0x0003 | Hardware Version | uint8-0x20 | 0x00-0xff | 0x01 |
0x0004 | Manufacturer Name | string-0x42 | 0-32 bytes | XXX…XXX (长度为 16 个字节,由 8 字节前缀和 8 字节的 PID 组成),0-7 bytes:_TZ3000_ ,8-16 bytes:PID(由产品经理在平台或者自助创建和提供)。该字段决定了手机 App 界面的 UI 和功能展现,如果对 PID 没有特殊要求,可采用默认 PID。 |
0x0005 | Model Identifier | string-0x42 | 0-32 bytes | TS000x(零火开关)(接入涂鸦网关使用,x 表示路数,TS0002 表示 2 路零火开关) |
0x0007 | Power Source | enum8-0x30 | 0x00-0xff | 0x01 |
0xFFFD | Cluster Revision | uint16-0x21 | 0x0000-0xffff | 0x0001 |
ID | Name | Direction | Description |
---|---|---|---|
0x00 | Reset to Factory Defaults | C->S | 恢复出厂设置 |
ID | Name | Data type | Range | Default |
---|---|---|---|---|
0x0000 | identify time | uint16-0x21 | 0x0000-0xffff | 0x0000 |
ID | Name | Data type | Range | Default |
---|---|---|---|---|
0x0000 | name support | bitmap8-0x18 | 0x00-0xff | 0x00 |
ID | Name | Direction |
---|---|---|
0x00 | Add group | C->S |
0x03 | Remove group | C->S |
ID | Name | Data type | Range | Default |
---|---|---|---|---|
0x0000 | Scene count | uint8-0x20 | 0x00-0xff | 0x00 |
0x0001 | Current scene | uint8-0x20 | 0x00-0xff | 0x00 |
0x0002 | Current group | uint16-0x21 | 0x0000-0xffff | 0x0000 |
0x0003 | Scene valid | bool-0x10 | 0x00-0xff | 0x00 |
0x0004 | Name support | bitmap8-0x18 | 0x00-0xff | 0x00 |
ID | Name | Direction |
---|---|---|
0x04 | Store Scene | C->S |
0x05 | Recall Scene | C->S |
ID | Name | Data type | Range | Default |
---|---|---|---|---|
0x0000 | OnOff | bool-0x10 |
|
0x00 |
ID | Name | Direction |
---|---|---|
0x00 | Off | C->S |
0x01 | On | C->S |
DPID | DP 含义 | 是否为标准指令 | 对应 Endpoint |
---|---|---|---|
1 | 开关 1 | 是 | 1 |
2 | 开关 2 | 是 | 2 |
数据下发时,直接下发开、关命令即可。上报需使用标准开关属性进行上报。
指令方向 | Cluster ID | CMD / ATTR ID | Value |
---|---|---|---|
下发 | 0x0006 :on/off |
0x00 :off0x01 :on |
/ |
上报 | 0x0006 :on/off |
0x0000 :on/off |
0 :off1 :on |
在 Visual Studio Code 软件页面上,打开产品开发包,展开左侧 software/TuyaOS/apps
,可以看到本产品 Demo 的 project
文件夹。
右键产品文件夹,选择 Build Project,在弹出的文本框内,输入编译固件的版本号(格式为 x.x.x
)后,按回车键确认。
对于泰凌微芯片平台,建议在 Build Project 前先 Clean Project。
编译成功后,控制台打印内容如下,以芯科平台为例:
芯科平台的编译产物可在 software/TuyaOS/_output
文件夹查看,其中 QIO 标识的是烧录固件,UG 标识的是 OTA 升级文件,具体如下:
software/TuyaOS/_output
文件夹内。output
文件夹内。software/TuyaOS/_output
文件夹内。清除编译内容,Telink 平台编译前建议先清除上次编译内容。可右键产品文件夹,选择 Clean Project,输入版本号,按回车键,确认对产品编译内容进行清除。
设备注册配置
在产品工程的 src
文件夹中的 app_dev_register.c
文件,可修改注册的 Device ID、Cluster 和 Attribute 等设备信息。
可在文件的如下所示处,修改注册的 Server Cluster,您可根据需要进行删减:
// server cluster list CONST TAL_CLUSTER_T onoff_1_ep_server_cluster_list[] = { DEF_CLUSTER_IDENTIFY_CLUSTER_ID(identify_attr_list) DEF_CLUSTER_GROUPS_CLUSTER_ID(group_attr_list) DEF_CLUSTER_SCENES_CLUSTER_ID(scene_attr_list) DEF_CLUSTER_ON_OFF_CLUSTER_ID(onoff_attr_list) }; CONST TAL_CLUSTER_T onoff_2_ep_server_cluster_list[] = { DEF_CLUSTER_IDENTIFY_CLUSTER_ID(identify_attr_list) DEF_CLUSTER_GROUPS_CLUSTER_ID(group_attr_list) DEF_CLUSTER_SCENES_CLUSTER_ID(scene_attr_list) DEF_CLUSTER_ON_OFF_CLUSTER_ID(onoff_attr_list) };
在产品工程的 include
文件夹中的 app_dev_register.h
文件,可在文件的如下所示处,修改设备注册的 Endpoint 及其 Device ID 等信息。
//Endpoint descriptor TAL_ENDPOINT_T dev_endpoint_desc[] = { {ONOFF_1_ENDPOINT, ZHA_PROFILE_ID, ZG_DEVICE_ID_ON_OFF_LIGHT_SWITCH, ONOFF_1_EP_SERVER_CLUSTER_NUM, (TAL_CLUSTER_T *)&onoff_1_ep_server_cluster_list[0], 0, NULL}, {ONOFF_2_ENDPOINT, ZHA_PROFILE_ID, ZG_DEVICE_ID_ON_OFF_LIGHT_SWITCH, ONOFF_2_EP_SERVER_CLUSTER_NUM, (TAL_CLUSTER_T *)&onoff_2_ep_server_cluster_list[0], 0, NULL}, };
固件信息修改
在产品工程文件夹下的 app_config.yaml
,可配置该产品的 PID、Model ID 和设备类型等信息。文件支持两种配置方式,您根据需求任选其一即可。文件内容及作用如下:
####################################################################### # COMPATIBILITY of 【Tuya mode】 # For the use of tuya redefined attributes: # [cluster:0x0000,attribute:0x0004] tuya manu name # [cluster:0x0000,attribute:0x0005] tuya model id ######################################################################## Firmware_Information: description: "this is a demo project" device_role: "router" # router/sleep_end_dev image_type: 0x1602 manufacture_id: 0x1002 model_id: "TS0002" manufacture_name: "_TZ3000_qlizmo9x" # capacity+pid module_name: "" chip_id: "" # efr32mg21a020f1024im32/efr32mg21a020f768im32/TLSR8258F1KET ######################################################################## # COMPATIBILITY of 【zigbee standard mode】 # For the use of ZCL stardard attributes: # [cluster:0x0000,attribute:0x0004] ManufacturerName # [cluster:0x0000,attribute:0x0005] ModelIdentifier ######################################################################## # Firmware_Information: # description: "this is a demo project" # device_role: "router" # router/sleep_end_dev # image_type: 0x1602 # manufacture_id: 0x1002 # model_id: "custom" # manufacture_name: "custom" # product_id: "bhzkbugw" # capacity: "_TZ3210_" # product_type: "TS0502B" # module_name: "ZSU" # chip_id: "efr32mg21a020f1024im32" # efr32mg21a020f1024im32/efr32mg21a020f768im32
如果您想要自定义 model_id
和 manufacture_name
属性,则必须使用第二种配置方式,并填写 capacity
、product_type
和 product_id
字段。
名称 | 功能 |
---|---|
description | 产品描述字段 |
device_role | 设备角色类型,router 代表正常功耗路由设备,sleep_end_dev 代表休眠低功耗设备,请谨慎更改 |
image_type | 固件信息,用于 OTA 时验证使用 |
manufacture_id | 厂商 ID,用于 OTA 时验证使用 |
model_id | 设备型号,用于加入涂鸦网关后确定设备功能,请谨慎更改 |
manufacture_name | 产品能力值和涂鸦 PID 拼接,用下划线(_ )连接,例如 _TZ3000_qlizmo9x |
module_name | 模组型号,指示产品使用的模组 |
chip_id | 芯片型号,指示产品使用的芯片,请勿更改 |
capacity | 涂鸦产品能力值,该字段请勿更改。如需更改,请咨询涂鸦产品经理 |
product_type | 设备型号,用于加入涂鸦网关后确定设备功能,请谨慎更改 |
product_id | 涂鸦产品 ID,此处留空,烧录授权时会写入新 PID |
例程开发需要开发者配置的设备信息及其配置方法如下:
设备信息配置
可在产品工程的 include
文件夹的 switch_app_config.h
文件,修改组件配置项,可配置项如下:
配置项 | 功能 |
---|---|
ONOFF_1_ENDPOINT | 开关 1 默认 Endpoint 序号,不建议修改 |
ONOFF_2_ENDPOINT | 开关 2 默认 Endpoint 序号,不建议修改 |
APP_ZG_NODE_ROUTER | 设备类型(router),不建议修改 |
ZIGBEE_JOIN_TIMEOUT_MS | 配网超时时间,默认 30s |
ZCL_ID_ONOFF | onoff 属性值上报时的 ZCL ID |
PRESS_JOIN_TIME_MS | 长按网络按键来开启配网时间,默认 3s |
按键配置
可在产品工程的 include
文件夹的 switch_app_config.h
文件,修改组件配置项,可配置按键 I/O 口、有效电平和中断触发模式。可在文件如下所示处修改:
//key info #if defined(PHY622X_EVB) #define KEY_STA_1_PIN TUYA_GPIO_NUM_32 #elif defined(MCU_CORE_8258) #define KEY_STA_1_PIN TUYA_GPIO_NUM_26 #else #define KEY_STA_1_PIN TUYA_GPIO_NUM_0 #endif #define KEY_STA_1_ACTIVE_LEVEL TUYA_GPIO_LEVEL_LOW #define KEY_STA_1_IRQ_MODE TUYA_GPIO_IRQ_RISE_FALL #if defined(PHY622X_EVB) #define KEY_STA_2_PIN TUYA_GPIO_NUM_33 #elif defined(MCU_CORE_8258) #define KEY_STA_2_PIN TUYA_GPIO_NUM_12 #else #define KEY_STA_2_PIN TUYA_GPIO_NUM_3 #endif #define KEY_STA_2_ACTIVE_LEVEL TUYA_GPIO_LEVEL_LOW #define KEY_STA_2_IRQ_MODE TUYA_GPIO_IRQ_RISE_FALL #if defined(PHY622X_EVB) #define KEY_NWK_PIN TUYA_GPIO_NUM_34 #elif defined(MCU_CORE_8258) #define KEY_NWK_PIN TUYA_GPIO_NUM_13 #else #define KEY_NWK_PIN TUYA_GPIO_NUM_4 #endif #define KEY_NWK_ACTIVE_LEVEL TUYA_GPIO_LEVEL_LOW #define KEY_NWK_IRQ_MODE TUYA_GPIO_IRQ_RISE_FALL
指示灯配置
可在产品工程的 include
文件夹的 switch_app_config.h
文件,修改组件配置项,可配置指示灯 I/O 口、有效电平和初始化状态。可在文件如下所示处修改:
//led info #if defined(PHY622X_EVB) #define LED_STA_1_PIN TUYA_GPIO_NUM_31 #elif defined(MCU_CORE_8258) #define LED_STA_1_PIN TUYA_GPIO_NUM_18 #else #define LED_STA_1_PIN TUYA_GPIO_NUM_7 #endif #define LED_STA_1_ACTIVE_LEVEL TUYA_GPIO_LEVEL_LOW #define LED_STA_1_INIT_STATUS LED_ST_OFF //OFF #if defined(PHY622X_EVB) #define LED_STA_2_PIN TUYA_GPIO_NUM_26 #elif defined(MCU_CORE_8258) #define LED_STA_2_PIN TUYA_GPIO_NUM_1 #else #define LED_STA_2_PIN TUYA_GPIO_NUM_8 #endif #define LED_STA_2_ACTIVE_LEVEL TUYA_GPIO_LEVEL_LOW #define LED_STA_2_INIT_STATUS LED_ST_OFF //OFF #if defined(PHY622X_EVB) #define LED_NWK_PIN TUYA_GPIO_NUM_11 #elif defined(MCU_CORE_8258) #define LED_NWK_PIN TUYA_GPIO_NUM_0 #else #define LED_NWK_PIN TUYA_GPIO_NUM_19 #endif #define LED_NWK_ACTIVE_LEVEL TUYA_GPIO_LEVEL_LOW #define LED_NWK_INIT_STATUS LED_ST_OFF //OFF
不同平台的管脚对应关系不一样。
tkl_platform_types.h
文件中查看。以 芯科 MG21 为例,其管脚对应关系如下,其中 TUYA_GPIO_NUM_0
对应的是 PA0
,以此类推。
//GPIO Index #define APP_GPIO_PA0 TUYA_GPIO_NUM_0 #define APP_GPIO_PA1 TUYA_GPIO_NUM_1 #define APP_GPIO_PA2 TUYA_GPIO_NUM_2 #define APP_GPIO_PA3 TUYA_GPIO_NUM_3 #define APP_GPIO_PA4 TUYA_GPIO_NUM_4 #define APP_GPIO_PA5 TUYA_GPIO_NUM_5 #define APP_GPIO_PA6 TUYA_GPIO_NUM_6 #define APP_GPIO_PB0 TUYA_GPIO_NUM_7 #define APP_GPIO_PB1 TUYA_GPIO_NUM_8 #define APP_GPIO_PC0 TUYA_GPIO_NUM_9 #define APP_GPIO_PC1 TUYA_GPIO_NUM_10 #define APP_GPIO_PC2 TUYA_GPIO_NUM_11 #define APP_GPIO_PC3 TUYA_GPIO_NUM_12 #define APP_GPIO_PC4 TUYA_GPIO_NUM_13 #define APP_GPIO_PC5 TUYA_GPIO_NUM_14 #define APP_GPIO_PD0 TUYA_GPIO_NUM_15 #define APP_GPIO_PD1 TUYA_GPIO_NUM_16 #define APP_GPIO_PD2 TUYA_GPIO_NUM_17 #define APP_GPIO_PD3 TUYA_GPIO_NUM_18 #define APP_GPIO_PD4 TUYA_GPIO_NUM_19
在开发过程遇到问题,您可以登录 TuyaOS 开发者论坛 子设备开发版块 进行沟通咨询。
该内容对您有帮助吗?
是意见反馈