A long WS2812 strip showing full white can draw far more than the power supply behind it was sized for. ESPHome is getting a way to estimate that draw and, if you want, cap it. GitHub user mvoss96 opened the pull request in April, explaining that he wanted to keep his strips within what his power supply could deliver, the way WLED does. J. Nick Koston (bdraco) merged it into the development branch on 18 October at 20:08 Polish time, and the documentation went in a minute later. It is aimed at ESPHome 2026.11.

A block on the strip, not in the driver

The new power_estimation: block works on every addressable light platform, including esp32_rmt_led_strip, neopixelbus and fastled. Drivers did not need changes, because the calculation runs in the shared light code between the effect step and the moment the frame goes out.

light:
  - platform: esp32_rmt_led_strip
    id: my_leds
    pin: GPIO16
    num_leds: 60
    chipset: WS2812
    rgb_order: GRB
    name: "My LED Strip"
    power_estimation:
      ma_per_led_red: 16.0
      ma_per_led_green: 11.0
      ma_per_led_blue: 15.0
      idle_ma_per_led: 0.5
      max_current_ma: 1000.0

Before each frame, effects and transitions included, ESPHome adds up the raw channel values of every LED and converts them to milliamps with the constants you give it. If you leave them out, each channel counts as 20 mA at full brightness and each LED adds 1 mA of idle draw. With max_current_ma set, the whole strip is dimmed evenly until the estimate fits. Home Assistant still shows the brightness and colour you asked for; only the light coming out of the LEDs is reduced. Without max_current_ma, ESPHome only estimates and does not limit anything.

The idle draw is taken off the budget first, since dimming cannot change it. If the limit does not even cover that, ESPHome warns at boot and keeps the pixels at their dimmest level.

Reading the estimate

The value is available in a lambda as id(my_leds).get_estimated_current_ma(). The docs suggest reading it from something that polls, such as a template sensor, rather than on every loop. With a limit set, the reading stays at or near the limit, because it shows the frame that actually went out, not the one the effect asked for.

How close it gets

The limit holds to within one hardware level per lit channel, which the documentation puts at about 70 mA for 300 RGB pixels at 20 mA per channel. The estimate is still arithmetic, not a measurement, so its accuracy depends on the constants. The docs list rough values for common chips: 16, 11 and 15 mA (red, green, blue) for the WS2812B, 12 mA per channel for the SK6812 and 16, 14 and 12 mA for the APA106. They recommend measuring your own strip instead: put a multimeter in the supply line, read the draw with every LED off, then at full red, green and blue, subtract the idle draw from the colour readings and divide each value by the number of LEDs.

Two details are worth knowing before you set this up. The block belongs on the strip, not on a partition, and the strip's limit covers every partition drawn on it. FastLED applies brightness a second time when it sends the data, so on that driver the real draw is lower than the estimate.