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?

Parents
  • 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!

Reply
  • 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!

Children
No Data
Related