nRF54L15 Zigbee - High current consumption

Hi,

I´m working on a Zigbee-based environment sensor. You can find all related files here: https://github.com/Kampi/BeeLight

Now I have the following scenario: the whole sensor consumes around 5 mA in idle mode (when going to sleep to wait for a new transmission interval). I´ve started to investigate the issue by using a PPK 2, and I got the following results:

Setup:

- Zigbee2MQTT
- Tx power set to 0
- Device connected to the Zigbee network

Test case 1:

Change main in main.c to:

int main(void)
{
    //dk_buttons_init(button_changed);
    //dk_leds_init();

    //register_factory_reset_button(FACTORY_RESET_BUTTON);

    /* Register callback for handling ZCL commands. */
    //ZB_ZCL_REGISTER_DEVICE_CB(zcl_device_cb);

    /* Register device context (endpoints). */
    //ZB_AF_REGISTER_DEVICE_CTX(&env_sensor_ctx);

    //clusters_attr_init();

    /* Register handler to identify notifications. */
    //ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(SENSOR_ENDPOINT, identify_cb);

    /* Start Zigbee default thread. */
    //zigbee_enable();

    //zbus_chan_add_obs(&light_data_chan, &light_data_lis, K_MSEC(100));
    //zbus_chan_add_obs(&battery_data_chan, &battery_data_lis, K_MSEC(100));
    //zbus_chan_add_obs(&env_data_chan, &env_data_lis, K_MSEC(100));

    //LOG_INF("BeeLight application started");

    return 0;
}

Goals:

- No I2C transmissions
- No Zigbee enabled
- Periodic wakeup of the processor to read the sensors
- Since no I2C, the sensors can´t be read
- No reports to Zigbee network

I got an average of 780 uA. I can´t say if this is good or bad because I don´t know any reference values.

Test case 2:

Change main in main.c to:

int main(void)
{
    //dk_buttons_init(button_changed);
    //dk_leds_init();

    //register_factory_reset_button(FACTORY_RESET_BUTTON);

    /* Register callback for handling ZCL commands. */
    //ZB_ZCL_REGISTER_DEVICE_CB(zcl_device_cb);

    /* Register device context (endpoints). */
    ZB_AF_REGISTER_DEVICE_CTX(&env_sensor_ctx);

    clusters_attr_init();

    /* Register handler to identify notifications. */
    ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(SENSOR_ENDPOINT, identify_cb);

    /* Start Zigbee default thread. */
    zigbee_enable();

    //zbus_chan_add_obs(&light_data_chan, &light_data_lis, K_MSEC(100));
    //zbus_chan_add_obs(&battery_data_chan, &battery_data_lis, K_MSEC(100));
    //zbus_chan_add_obs(&env_data_chan, &env_data_lis, K_MSEC(100));

    //LOG_INF("BeeLight application started");

    return 0;
}

Goals:

- No I2C transmissions
- Zigbee enabled
- Periodic wakeup of the processor to read the sensors
- Since no I2C, the sensors can´t be read
- No reports to the Zigbee network

I got an average of 4.2 to 4.8 mA, so enabling Zigbee increases the current consumption by a factor of 6?!

Questions:

- Do you have some values as a reference to compare with?
- Do I have any additional power-saving options?
- How can I cut down the current consumption?

Edit:

I´ve tried to run the light switch example on my board (I built the example for the nRF54L15DK), but the firmware stops booting after printing this

00> [00:00:00.000,356] <inf> ieee802154_nrf5: nRF5 802154 radio initialized

Flashing my firmware results in a correct boot:

00> [00:00:21.228,014] <inf> ieee802154_nrf5: nRF5 802154 radio initialized
00> *** Booting My Application v1.0.0-2cd7fb859a2a ***
00> *** Using nRF Connect SDK v2.9.2-4ab7b98fc76f ***
00> *** Using Zephyr OS v3.7.99-aa34a5632971 ***

I´m not sure about the issue, so I can´t test a sample as a reference. Do you have an idea why Zephyr isn´t booted with the light switch example?

  • I did some more testing to see if my hardware is working properly.

    I removed the sensors and the LED and tried the system_off sample from Zephyr (compiled for nRF54L15DK) and system_off in my firmware. I also replaced the system_off call in the Zephyr sample with k_sleep and use k_sleep instead of system_off in my firmware.

    With this, I get the following results:

    • Current on my board with system_off sample from Zephyr: avg. 1.6 uA

    • Current on my board with system_off sample from Zephyr and system_off replaced with k_sleep(K_FOREVER): avg. 4 uA

    • Current on my board with system_off in my firmware: avg. 0.61 uA

    • Current on my board with k_sleep in my firmware: avg. 150 uA

    So my board consumes less power with system_off than the Zephyr sample. I guess it comes from the pin conflict between the two boards. But it doesn´t care because the result is really good. But I´m wondering why k_sleep on my hardware is consuming that much current. There is something enabled that shouldn´t be enabled.

    Zigbee isn´t tested any further.

    Edit: Maybe someone can answer one question to me:
    Is it possible to use system_off with Zigbee and BSEC2 from Nordic? If I see it correctly, BSEC2 is using a thread with a sleep to run the periodic update of the state machine inside of the library. Is it possible to leave the system_off state by this thread? I don´t think it´s possible but maybe I´m wrong Slight smile

  • Hi, 

    Are you using the Zigbee R23 add-on solution for Zigbee developments on nRF54L15DK? If not, please use the samples from that to start. 

    Regards,
    Amanda H.

  • Hi, 

    System OFF is not supported with Zigbee. If you want to reduce current consumption, you should instead use the Sleepy End Device. The light switch sample supports the Sleepy End Device behavior that enables the sleepy behavior for the end device. 

    Kampino said:
    yes I´m using this addon.

    Which version of the Zigbee R23 add-on are you using? The latest v0.4.0 would only support NCS v2.9.0. If you set up correctly, the log would show like this: 

    -Amanda H.

  • Hi Amanda,

    Thanks for the tips. I´ve optimized the firmware and I was able to reduce the power consumption significantly. The device consumes around 70 uA when Zigbee is disabled in KConfig and ~220 uA with Zigbee after the pairing.

    I´ve also added the code from the light switch example but I can´t see any difference.

    int main(void)
    {
        dk_leds_init();
        dk_buttons_init(on_button_changed);
    
        //register_factory_reset_button(FACTORY_RESET_BUTTON);
    
        zb_set_ed_timeout(ED_AGING_TIMEOUT_64MIN);
        zb_set_keepalive_timeout(ZB_MILLISECONDS_TO_BEACON_INTERVAL(60000));
    
        zigbee_configure_sleepy_behavior(true);
    
        /* Power off unused sections of RAM to lower device power consumption. */
        if (IS_ENABLED(CONFIG_RAM_POWER_DOWN_LIBRARY)) {
            power_down_unused_ram();
        }
    
    #ifdef CONFIG_ZIGBEE_FOTA
        #error "Not supported yet!
        /* Initialize Zigbee FOTA download service. */
        zigbee_fota_init(ota_evt_handler);
    
        /* Mark the current firmware as valid. */
        confirm_image();
    
        /* Register callback for handling ZCL commands. */
        ZB_ZCL_REGISTER_DEVICE_CB(zcl_device_cb);
    #endif
    
        /* Register device context (endpoints). */
        ZB_AF_REGISTER_DEVICE_CTX(&env_sensor_ctx);
     
        app_clusters_attr_init();
    
        /* Register handler to identify notifications. */
        ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(SENSOR_ENDPOINT, identify_cb);
    
        /* Start Zigbee default thread. */
        zigbee_enable();
    
        zbus_chan_add_obs(&battery_data_chan, &battery_data_lis, K_MSEC(100));
        zbus_chan_add_obs(&light_data_chan, &light_data_lis, K_MSEC(100));
        zbus_chan_add_obs(&env_data_chan, &env_data_lis, K_MSEC(100));
    
        LOG_INF("BeeLight application started");
    
        while (1) {
            k_sleep(K_FOREVER);
        }
    
        return 0;
    }

    IMO 220 uA is high for a battery-based Zigbee device. Is there a solution to optimize the current consumption any further? I´m also wondering where this 3 s peak comes from

    It´s not from the sensor reading events (I guess) because these events were triggered all 5 min, 30 min and 24 h

    Thanks!

Related