You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/content/docs/changelog/2026.4.0.mdx
+35Lines changed: 35 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -501,6 +501,41 @@ For detailed migration guides and API documentation, see the [ESPHome Developers
501
501
502
502
{/* markdownlint-disable MD013 */}
503
503
504
+
## Release 2026.4.1 - April 20
505
+
506
+
<details>
507
+
<summary></summary>
508
+
509
+
- [core] Fix app_state_ status bits clobbered for non-looping components [esphome#15658](https://github.com/esphome/esphome/pull/15658) by [@bdraco](https://github.com/bdraco)
510
+
- [core] Inline feed_wdt hot path with out-of-line slow path [esphome#15656](https://github.com/esphome/esphome/pull/15656) by [@bdraco](https://github.com/bdraco)
511
+
- [st7789v] Fix swapped offset_width/offset_height in model presets [esphome#15755](https://github.com/esphome/esphome/pull/15755) by [@swoboda1337](https://github.com/swoboda1337)
512
+
- [sx126x][sx127x] Fix frequency precision loss from float32 codegen [esphome#15753](https://github.com/esphome/esphome/pull/15753) by [@swoboda1337](https://github.com/swoboda1337)
513
+
- Bump aioesphomeapi from 44.15.0 to 44.16.0 [esphome#15757](https://github.com/esphome/esphome/pull/15757) by [@dependabot[bot]](https://github.com/apps/dependabot)
514
+
- [lvgl] Clean the build if lv_conf.h changes [esphome#15777](https://github.com/esphome/esphome/pull/15777) by [@clydebarrow](https://github.com/clydebarrow)
515
+
- [mitsubishi_cn105] use HEAT_COOL mode to enable temperature slider [esphome#15748](https://github.com/esphome/esphome/pull/15748) by [@crnjan](https://github.com/crnjan)
516
+
- [core] Diagnose missing cg.templatable in codegen for TEMPLATABLE_VALUE fields [esphome#15758](https://github.com/esphome/esphome/pull/15758) by [@bdraco](https://github.com/bdraco)
517
+
- [time] Fix RTC is_valid() rejecting valid times after day_of_year cleanup [esphome#15763](https://github.com/esphome/esphome/pull/15763) by [@bdraco](https://github.com/bdraco)
518
+
- [qmc5883l] Move per-update log line from DEBUG to VERBOSE [esphome#15781](https://github.com/esphome/esphome/pull/15781) by [@swoboda1337](https://github.com/swoboda1337)
519
+
- [bundle] Force-resolve nested IncludeFile during file discovery [esphome#15762](https://github.com/esphome/esphome/pull/15762) by [@bdraco](https://github.com/bdraco)
520
+
- [ili9xxx] Guard against null buffer in display_() when allocation fails [esphome#15786](https://github.com/esphome/esphome/pull/15786) by [@bdraco](https://github.com/bdraco)
521
+
- [esp32] Accept unquoted minimum_chip_revision values [esphome#15785](https://github.com/esphome/esphome/pull/15785) by [@swoboda1337](https://github.com/swoboda1337)
522
+
- [lvgl] Guard lv_image_set_src wrapper with LV_USE_IMAGE [esphome#15789](https://github.com/esphome/esphome/pull/15789) by [@swoboda1337](https://github.com/swoboda1337)
523
+
- [mipi_spi] Drawing fixes for native display [esphome#15802](https://github.com/esphome/esphome/pull/15802) by [@clydebarrow](https://github.com/clydebarrow)
524
+
- [image] Fix byte order handling [esphome#15800](https://github.com/esphome/esphome/pull/15800) by [@clydebarrow](https://github.com/clydebarrow)
525
+
- [core] coerce set_interval(0) / update_interval: 0ms to 1ms [esphome#15799](https://github.com/esphome/esphome/pull/15799) by [@bdraco](https://github.com/bdraco)
526
+
- [ethernet] Fix SPI3_HOST default breaking compile on variants without SPI3 [esphome#15809](https://github.com/esphome/esphome/pull/15809) by [@swoboda1337](https://github.com/swoboda1337)
527
+
- [core] Fix DelayAction compile error with non-const reference args [esphome#15814](https://github.com/esphome/esphome/pull/15814) by [@bdraco](https://github.com/bdraco)
528
+
- [esp32] Downgrade unneeded `ignore_pin_validation_error` to a warning [esphome#15811](https://github.com/esphome/esphome/pull/15811) by [@swoboda1337](https://github.com/swoboda1337)
529
+
- [runtime_image] Fix RGB order [esphome#15813](https://github.com/esphome/esphome/pull/15813) by [@clydebarrow](https://github.com/clydebarrow)
530
+
- [lvgl] Fix crash with snow on rotated display [esphome#15822](https://github.com/esphome/esphome/pull/15822) by [@clydebarrow](https://github.com/clydebarrow)
531
+
- [core] Feed WDT unconditionally in main loop to fix empty-config panic [esphome#15830](https://github.com/esphome/esphome/pull/15830) by [@bdraco](https://github.com/bdraco)
532
+
- Bump aioesphomeapi from 44.16.0 to 44.16.1 [esphome#15836](https://github.com/esphome/esphome/pull/15836) by [@dependabot[bot]](https://github.com/apps/dependabot)
533
+
- [core] Default PollingComponent() to 1ms when codegen is bypassed [esphome#15831](https://github.com/esphome/esphome/pull/15831) by [@bdraco](https://github.com/bdraco)
534
+
- [substitutions] Fix `substitutions: !include file.yaml` regression [esphome#15850](https://github.com/esphome/esphome/pull/15850) by [@bdraco](https://github.com/bdraco)
535
+
- [packages] Improve error messages with include stack and fix missing path propagation [esphome#15844](https://github.com/esphome/esphome/pull/15844) by [@jpeletier](https://github.com/jpeletier)
Copy file name to clipboardExpand all lines: src/content/docs/components/image.mdx
+3-2Lines changed: 3 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -75,9 +75,10 @@ image:
75
75
- `NONE` : Every pixel converts to its nearest color.
76
76
- `FLOYDSTEINBERG` : Uses Floyd-Steinberg dither to approximate the original image luminosity levels.
77
77
78
-
- **byte_order** (*Optional*, string): For RGB565 images, the pixels are converted to 16 bit values. By default these will be stored in big endian byte order (MSB first),
79
-
but you can override this by setting `byte_order` to `little_endian`. Options are `big_endian` (default) and `little_endian`.
78
+
- **byte_order** (*Optional*, string): For RGB565 images, the pixels are converted to 16 bit values. By default these will be stored in little endian byte order (LSB first),
79
+
but you can override this by setting `byte_order` to `big_endian`. Options are `little_endian` (default) and `big_endian`.
80
80
Not applicable to other image formats.
81
+
Images used in displays and LVGL are expected to be in little endian format.
Copy file name to clipboardExpand all lines: src/content/docs/components/runtime_stats.mdx
+36-8Lines changed: 36 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -55,18 +55,46 @@ For each component, the following metrics are reported:
55
55
56
56
Components are sorted by total execution time (descending) to highlight the most impactful components first.
57
57
58
+
### Main loop metrics
59
+
60
+
In addition to per-component timings, two main-loop lines are emitted in both the Period and Total sections. They describe the wall time spent in `Application::loop()` **excluding** the sleep/yield at the end of each iteration, so they reflect real work the CPU is doing for ESPHome — not idle time.
61
+
62
+
**`main_loop:` line**
63
+
64
+
- **iters**: Number of main-loop iterations observed in this window.
65
+
- **active_avg**: Average per-iteration active time (loop start to just before yield/sleep).
66
+
- **active_max**: Largest single-iteration active time seen (outliers often point to a component that blocked the loop).
67
+
- **active_total**: Sum of per-iteration active time across the window — i.e. total non-sleeping CPU time in the main loop.
68
+
- **overhead_total**: `active_total` minus the sum of all per-component `total` times. Represents time spent in the main loop that is *not* attributable to any single component (scheduler dispatch, inter-component bookkeeping, framework glue).
69
+
70
+
**`main_loop_overhead_section:` line**
71
+
72
+
Breaks `overhead_total` down into three buckets so you can tell *where* overhead is being spent:
73
+
74
+
- **before**: Time inside `before_loop_tasks_` — scheduler dispatch and ISR `enable_loop` processing.
75
+
- **tail**: Time inside `after_loop_tasks_` plus the small prefix before stats recording. Normally near zero.
76
+
- **inter_component**: Residual per-iteration bookkeeping that runs between components (`set_current_component`, per-component timing guard construction/destruction, `feed_wdt_with_time` calls, the for-loop itself).
77
+
78
+
A regression in `before` points at the scheduler or a component requesting `enable_loop` frequently from an ISR; a regression in `inter_component` points at the per-component dispatch path; `tail` should stay flat.
79
+
58
80
## Example Output
59
81
82
+
In the example below, `overhead_total` is the difference between `active_total` and the sum of per-component `total` times — for the period section, `479.1ms − (300.0 + 40.0 + 10.4)ms = 128.7ms`. The three overhead-section buckets (`before + tail + inter_component`) sum back to `overhead_total`.
0 commit comments