Page 1 of 2

子设备连HA,能正常连接,但无法report数据

Posted: 2025年 Nov 20日 11:54
by jafil10

使用 TLSR8258 Zigbee SDK 3.12.0 进行二次开发,连接涂鸦双模网关能正常上报与下发,但连接HA(使用标准Zigbee 3.0 Dongle作为网关)时,report attribute时,callback不产生,同时也没有发出数据来。
麻烦帮忙看看是什么原因导致发不出包来。

Code: Select all

static void report_single_zg_cluster_attr_value(uint16_t cluster_id, uint16_t attr_id, uint8_t type, uint8_t size)
{
    TAL_ZG_SEND_DATA_T send_data;
    uint8_t zcl_id;

switch (cluster_id) {
    case CLUSTER_ON_OFF_CLUSTER_ID:
        zcl_id = USER_ZCL_ID_ON_OFF;  // 0x65
        break;
    case CLUSTER_POWER_CONFIG_CLUSTER_ID:
        zcl_id = USER_ZCL_ID_BATTER_PERCENT; // 0x66
        break;
    default:
        break;
}

tal_system_memset(&send_data, 0, sizeof(TAL_ZG_SEND_DATA_T));

send_data.addr.mode = SEND_MODE_DEV;
send_data.addr.type.dev.src_ep = DEV_ENDPOINT; // 0x01
send_data.addr.type.dev.dst_ep = 0x01;
send_data.addr.type.dev.dst_addr = TUYA_GATEWAY_ADDRESS; // 0x00
send_data.addr.type.dev.cluster_id = cluster_id;

send_data.zcl_id = zcl_id;
send_data.qos = QOS_1;
send_data.frame_type = ZG_ZCL_FRAME_TYPE_GLOBAL;
send_data.direction = ZG_ZCL_DATA_SERVER_TO_CLIENT;
send_data.command_id = CMD_REPORT_ATTRIBUTES_COMMAND_ID;

send_data.data.zg.attr_sum = 1;
send_data.data.zg.attr[0].attr_id = attr_id;
send_data.data.zg.attr[0].type = type;
send_data.data.zg.attr[0].size = size;
tal_zg_read_attribute(DEV_ENDPOINT, cluster_id, attr_id,
                      &send_data.data.zg.attr[0].value[0], size);
TAL_PR_DEBUG("cluster_id = %d, attr_id = %d, type = %d, size = %d\n", cluster_id, attr_id, type, size);
tal_zg_clear_send_data(ZG_CLEAR_ALL_ZCL_ID, &send_data.zcl_id);
tal_zg_send_data(&send_data, dp_send_result_cb, SPROP_SEND_TIMEOUT);
}

Re: 子设备连HA,能正常连接,但无法report数据

Posted: 2025年 Nov 20日 12:00
by jafil10

补充一下,每次上电,都有“nwk_rejoin_ok”的日志


Re: 子设备连HA,能正常连接,但无法report数据

Posted: 2025年 Nov 20日 13:42
by 心_远

连接第三方网关时,请走订阅方式,而非主动 report


Re: 子设备连HA,能正常连接,但无法report数据

Posted: 2025年 Nov 20日 14:10
by jafil10

使用哪个接口呢?有示例吗?


Re: 子设备连HA,能正常连接,但无法report数据

Posted: 2025年 Nov 20日 14:21
by huanghuan

1.请先了解一下,Zigbee 3.0标准中有关bind和report table相关内容。
2.tuyaos 中配置 report table 参数可以参考 https://www.tuyaos.com/viewtopic.php?t=4941 中的使用说明 TAL_API\Zigbee_API\tal_reporting.md 进行配置


Re: 子设备连HA,能正常连接,但无法report数据

Posted: 2025年 Nov 20日 14:50
by jafil10
huanghuan 2025年 Nov 20日 14:21

1.请先了解一下,Zigbee 3.0标准中有关bind和report table相关内容。
2.tuyaos 中配置 report table 参数可以参考 https://www.tuyaos.com/viewtopic.php?t=4941 中的使用说明 TAL_API\Zigbee_API\tal_reporting.md 进行配置

网关和子设备已经通过bind request和bind response建立了绑定关系。
子设备也通过 tal_zg_reporting_init 创建了report table。
我想了解的是,当子设备的属性发生变化,通过 tal_zg_write_attribute 也更新了attribute的值,但子设备如何触发report attibute命令上报呢?

Code: Select all

static TAL_REPORT_TABLE_T g_dp_cluster_tbl[] =
{
    {TAL_REPORT_DIRECTION_REPORTED, DEV_ENDPOINT, CLUSTER_ON_OFF_CLUSTER_ID, ATTR_ON_OFF_ATTRIBUTE_ID, ZG_CLUSTER_MASK_SERVER, 0,
     {{0, 65534, 0}}},
};
tal_zg_reporting_init((TAL_REPORT_TABLE_T *)g_dp_cluster_tbl, ARRAY_LEN(g_dp_cluster_tbl));

Re: 子设备连HA,能正常连接,但无法report数据

Posted: 2025年 Nov 20日 15:01
by huanghuan

Code: Select all

typedef struct {
    TAL_REPORT_DIREC_E direction;   ///< reporting direction
    UINT8_T  ep_id;                 ///< endpoint id
    UINT16_T cluster_id;            ///< cluster id, see TUYA_CLUSTER_ID_E
    UINT16_T attr_id;               ///< attribute id
    ZG_CLUSTER_MASK_E mask;         ///< reporting cluster mask
    UINT16_T manuf_code;            ///< manufacturer code
    union {
        struct {
            UINT16_T min_interval;  ///< mini reporting interval, measured in seconds
            UINT16_T max_interval;  ///< max reporting interval, measured in seconds
            UINT_T   report_change; ///< mini change to the attribute that will result in a report being sent
        } reported;
        struct {
            UINT16_T source_addr;   ///< node id of the source of the received reports
            UINT8_T  endpoint;      ///< remote endpoint from which the attribute is reported
            UINT16_T timeout;       ///< max expected time between reports, measured in seconds
        } received;
    } data;
} TAL_REPORT_TABLE_T;

你的report table里面的 report_change需要置为 可以触发上报的发生变化的最小值(非0)


Re: 子设备连HA,能正常连接,但无法report数据

Posted: 2025年 Nov 20日 15:14
by jafil10

也就是说只要值的变化超过了report_change,就会自动上报?不需要应用程序主动上报是吧?
如果是这样的话,那report_change设置0,当 ON_OFF 的值有变化就会自动上报才对,实测抓包时并没有抓到这样的数据我


Re: 子设备连HA,能正常连接,但无法report数据

Posted: 2025年 Nov 20日 15:15
by huanghuan

report_change设置0时,变化不触发上报,得要非零值


Re: 子设备连HA,能正常连接,但无法report数据

Posted: 2025年 Nov 20日 15:37
by jafil10

配网时,网关有下发bind request和configure reporting,如图所示。

2.png
1.png

Code: Select all

static TAL_REPORT_TABLE_T g_dp_cluster_tbl[] =
{
    {TAL_REPORT_DIRECTION_REPORTED, 1, CLUSTER_ON_OFF_CLUSTER_ID, ATTR_ON_OFF_ATTRIBUTE_ID, ZG_CLUSTER_MASK_SERVER, 0, {{0, 65534, 1}}},
};

OPERATE_RET tuya_init_second(void)
{
    TAL_PR_DEBUG("/*********second init*********\r\n");

dev_zigbee_init();
tal_zg_reporting_init((TAL_REPORT_TABLE_T *)g_dp_cluster_tbl, ARRAY_LEN(g_dp_cluster_tbl));
 }
 
tal_zg_read_attribute(DEV_ENDPOINT,
                                   CLUSTER_ON_OFF_CLUSTER_ID,
                                   ATTR_ON_OFF_ATTRIBUTE_ID,
                                   &val_u8, 1);
            TAL_PR_DEBUG("before write onoff %d\n", val_u8);
            val_u8 = !val_u8;
            tal_zg_write_attribute(DEV_ENDPOINT,
                                   CLUSTER_ON_OFF_CLUSTER_ID,
                                   ATTR_ON_OFF_ATTRIBUTE_ID,
                                   &val_u8, ATTR_BOOLEAN_ATTRIBUTE_TYPE);
            tal_zg_read_attribute(DEV_ENDPOINT,
                                   CLUSTER_ON_OFF_CLUSTER_ID,
                                   ATTR_ON_OFF_ATTRIBUTE_ID,
                                   &val_u8, 1);
            TAL_PR_DEBUG("after write onoff %d\n", val_u8);

如上述代码,当onoff attribute值变化后,抓包也没有抓到有上报