Hello Nordic Support Team,
I’m developing a Zigbee-based light switch using a Sleepy End Device (SED) configuration with ZBOSS. I've encountered a critical issue related to power consumption after the parent (coordinator/router) becomes unavailable.
Here’s a detailed description of the behavior:
-
When the SED loses connection to its parent, it initiates around 10 Data Request attempts, each repeated 3 times.
-
After that, the device continues consuming approximately 4 mA, presumably because the radio remains in an active state.
-
During this period, I observe repeating
ZB_BDB_SIGNAL_DEVICE_REBOOT
signals with decreasing frequency. -
Eventually, the stack reports
ZB_BDB_SIGNAL_TC_REJOIN_DONE
with an error (status -1), but the device remains in the high-power state (~4 mA). -
If I power on the coordinator later, the device does not reconnect automatically. Only after pressing a button on the SED (which triggers a report or bind), the power consumption drops to ~10 µA and I receive
ZB_SIGNAL_JOIN_DONE
.
During high current draw, ZB_COMMON_SIGNAL_CAN_SLEEP
continues to be emitted regularly. I respond with:
ZB_ERROR_CHECK(zigbee_default_signal_handler(bufid));
ZB_BDB_SIGNAL_TC_REJOIN_DONE
with failure, I additionally try:zigbee_configure_sleepy_behavior(true); zb_set_rx_on_when_idle(ZB_FALSE); zb_sleep_now();
However, this doesn’t seem to reduce current consumption.
My use case:
-
The switch doesn’t need frequent polling — it only needs to notify the parent when a button is pressed.
-
If polling could be disabled entirely (or minimized), and binding/reporting used when needed, I could achieve much better battery life.
-
Unfortunately, due to the above behavior, a power outage longer than 24 hours fully drains the battery, as the device never re-enters deep sleep.
-
This makes the current implementation impractical in real-world deployments (e.g., leaving home over a weekend).
My question:
Is there a supported way in ZBOSS to:
-
Change or disable the polling/rejoin behavior after parent loss?
-
Manually handle parent loss (e.g., catch
ZB_ZDO_SIGNAL_LEAVE
withZB_NWK_LEAVE_TYPE_NO_PARENT
) and prevent the stack from entering the high-consumption state? -
Fully control radio and sleep state after failed rejoin attempts, to allow the SED to stay in deep sleep until user interaction?
I’ve already used ZB_AF_SET_ENDPOINT_HANDLER()
in other parts of the app and I’m open to handling parent loss manually if possible.
I would appreciate any guidance, workarounds, or configuration options to resolve this — or any hints on what ZBOSS constants or behavior could be overridden. I’m also willing to modify the default signal handler or extend stack behavior if needed.
Thank you very much in advance!
Best regards,
Andris Matveev
(Latvia)