#17241·esphome

nRF52840 Zigbee sleepy deep_sleep still draws ~5.88 mA with minimal YAML

Author: jbrepogmailcomCreated Jun 27, 2026Updated Sep 18, 2026
Labelscomponent: nrf52

The problem

I am testing the new ESPHome Zigbee sleepy/deep sleep support on an nRF52840 board, but even the most minimal Zigbee + deep_sleep YAML still draws about 5.88 mA after the firmware logs that it is entering sleep.

This looks like the MCU/radio/USB stack is not actually reaching low-power sleep/system-off, or something in the Zigbee/Zephyr path keeps the device awake.

Hardware

Board/module: MINI NRF52840 Development Board BT5.0 Bluetooth Module MCU Main Control Board 18*21MM QSPIFlash TYPE-C

The YAML currently uses:

yaml
nrf52:
  board: xiao_ble

because this has been the working board profile for compiling/flashing this nRF52840 target.

Current measurement

Measured current after the sleep message: ~5.88 mA

Expected current for a real sleepy/deep sleep end device would be in the uA range, not mA.

ESPHome version

ESPHome 2026.6.2

What I tested

I stripped the configuration down to a minimal Zigbee deep sleep test:

  • no I2C
  • no ADC
  • no real sensors
  • no custom measurement loop
  • no application logic waiting for pairing/join
  • only one dummy template sensor, because ESPHome Zigbee requires at least one endpoint
  • zigbee.sleepy: true
  • deep_sleep.run_duration: 10s
  • deep_sleep.sleep_duration: 1min

The generated code confirms that ESPHome configured deep sleep:

cpp
deep_sleep_test->set_sleep_duration(60000);
deep_sleep_test->set_run_duration(10000);

The Zephyr backend generated for this build also contains sys_poweroff() in deep_sleep_zephyr.cpp, so it looks like the deep sleep path should be active.

Minimal YAML

yaml
substitutions:
  firmware_variant: "zigbee-deep-sleep-test"
  firmware_version: "2026.06.27-minimal-zigbee-deep-sleep-1min"
  logger_baud: "115200"
  awake_time: 10s
  sleep_time: 1min
  sleep_minutes: "1"

esphome:
  name: nrf52840-zigbee-tof
  friendly_name: nRF52840 Zigbee ToF
  project:
    name: jbrepogmailcom.zigbee_deep_sleep_test
    version: ${firmware_version}
  on_boot:
    - priority: -100
      then:
        - logger.log:
            format: "Firmware %s %s"
            args: ['"${firmware_variant}"', '"${firmware_version}"']
        - logger.log: "Minimal Zigbee deep sleep test: no sensors, no I2C, no ADC"
        - logger.log: "Awake 10s, then native deep sleep for 1 minute"

nrf52:
  board: xiao_ble

logger:
  baud_rate: ${logger_baud}
  level: DEBUG

zigbee:
  power_source: BATTERY
  wipe_on_boot: false
  sleepy: true

deep_sleep:
  id: deep_sleep_test
  run_duration: ${awake_time}
  sleep_duration: ${sleep_time}

preferences:
  flash_write_interval: never

sensor:
  - platform: template
    id: dummy_battery
    name: "Battery"
    unit_of_measurement: "%"
    accuracy_decimals: 0
    update_interval: never
    lambda: |-
      return 100.0f;

Question

Is this expected with the current nRF52 Zigbee sleepy/deep sleep implementation, or is there an additional required configuration/API call to actually put the nRF52840 + Zigbee radio into a uA-range sleep state?

If this should already work, what logs or generated files would be useful to debug why the device stays around 5.88 mA after entering deep sleep?