zb_zdo_pim_start_turbo_poll_continuous() not working

I am developing a Zigbee sensor device based on the nRF52840. I have based my firmware on the "Thingy:53: Zigbee weather station" sample. This means it is a Sleepy End Device. To reduce power consumption, I increased the long poll interval to 60s using zb_zdo_pim_set_long_poll_interval(). This works so far, with the disadvantage that it is practically impossible to send any commands (configure reporting, identify, ...) to the device from the coordinator, which only keeps outgoing packets for around 10s before timing out.

To resolve this, I intend to use the button on the device to poll the coordinator manually. From the SDK documentation I inferred that zb_zdo_pim_start_turbo_poll_continuous() should do what I want, i.e. polling the coordinator manually for a few seconds. However, the function call doesn't seem to do anything. Using a Zigbee sniffer in Wireshark I see no packets of any kind being sent upon pressing the button and calling the function.

The Turbo Poll feature is enabled: After joining the network, the ED sends multiple polling packets in increasing time intervals, which I assume to be determined by the "Turbo Poll adaptive algorithm". If I explicitly disable Turbo Poll using zb_zdo_pim_permit_turbo_poll(ZB_FALSE), these multiple polling packets don't happen. Calling zb_zdo_pim_start_turbo_poll_continuous() in the button handler doesn't do anything either way.

This is the part of the documentation that I am referring to : https://developer.nordicsemi.com/nRF_Connect_SDK/doc/zboss/3.11.4.0/zigbee_prog_principles.html#zigbee_data_polling_mechanism

Did I misunderstand what zb_zdo_pim_start_turbo_poll_continuous() is supposed to do? I expected that simply calling this function once sends multiple polling packets over the specified time. Are there any other prerequisites I need to ensure, such as disabling ZBOSS sleep or explicitely sending a packet?

  • I just noticed an inconsistency in the documentation for zb_zdo_pim_start_turbo_poll_continuous(). The parameter is described as "turbo_poll_timeout_ms: Timeout in milliseconds." but it is of type zb_time_t, which, according to its documentation, is "Time stored in ticks".

    I'm calling the function as zb_zdo_pim_start_turbo_poll_continuous(10000); so an intended 10s timeout. Could this be a problem?

Related