Skip to content

Commit 0be5bd6

Browse files
authored
Merge pull request #6292 from esphome/bump-2026.3.0b3
2026.3.0b3
2 parents dbacba4 + 04b5ae8 commit 0be5bd6

File tree

3 files changed

+39
-4
lines changed

3 files changed

+39
-4
lines changed

data/version.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
release: 2026.3.0b2
1+
release: 2026.3.0b3
22
version: '2026.3'

src/content/docs/changelog/2026.3.0.mdx

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ The RP2040/RP2350 platform takes a major step toward first-class support in this
7979

8080
- **BLE foundation** - New [rp2040_ble](/components/rp2040_ble) component initializes BTstack on Pico W/Pico 2 W boards, laying the groundwork for BLE scanning and Bluetooth proxy support with only ~17KB overhead ([#14603](https://github.com/esphome/esphome/pull/14603))
8181
- **BOOTSEL upload via picotool** - `esphome upload` now detects RP2040 devices in BOOTSEL mode, uploads with real-time progress, and automatically starts log output after reboot ([#14483](https://github.com/esphome/esphome/pull/14483))
82-
- **HardFault crash handler** - A new crash handler captures register state and stack backtrace when a HardFault occurs, stores it across reboot via watchdog scratch registers, and logs it on next boot ([#14685](https://github.com/esphome/esphome/pull/14685)). The CLI's serial log viewer auto-decodes addresses using `addr2line`. Works on both RP2040 and RP2350.
82+
- **HardFault crash handler** - See the [Crash Handlers](#crash-handlers-without-a-serial-cable) section below for details ([#14685](https://github.com/esphome/esphome/pull/14685), [#14716](https://github.com/esphome/esphome/pull/14716))
83+
- **Hardware UART with single pin** - RP2040 now supports configuring a hardware UART with only TX or only RX, useful for one-way serial protocols ([#14725](https://github.com/esphome/esphome/pull/14725))
84+
- **ADC fix for RP2350** - Fixed a `PICO_VSYS_PIN` compile error on RP2350 boards when using the ADC component ([#14724](https://github.com/esphome/esphome/pull/14724))
8385
- **Socket wake support** - The fast select optimization was ported to RP2040, enabling efficient socket polling without `lwip_select()` overhead ([#14498](https://github.com/esphome/esphome/pull/14498))
8486
- **WiFi AP and captive portal** - WiFi AP mode and AP+STA fallback now work reliably on RP2040/RP2350, with 7 WiFi fixes in arduino-pico 5.5.1 ([#14500](https://github.com/esphome/esphome/pull/14500)). The captive portal component was also enabled for the platform ([#14505](https://github.com/esphome/esphome/pull/14505))
8587

@@ -88,6 +90,10 @@ The RP2040/RP2350 platform takes a major step toward first-class support in this
8890
- **LWIP PCB use-after-free fixed** - A long-standing bug where `tcp_close()` left the PCB alive during the TCP close handshake, allowing LWIP `recv`/`err` callbacks to fire with dangling pointers after the socket object was destroyed, has been fixed ([#14706](https://github.com/esphome/esphome/pull/14706)). This caused `umm_malloc_core` heap corruption crashes that have plagued ESP8266 reliability for years, and also affected RP2040. Both platforms now pass the 500-iteration rapid connect/disconnect stress test with 4 concurrent clients.
8991
- **TCP race condition fixed** - A critical race between lwip IRQ callbacks and the main loop on Pico W was identified and fixed, preventing heap corruption under concurrent API connections ([#14679](https://github.com/esphome/esphome/pull/14679))
9092
- **Accept-in-IRQ heap corruption fixed** - Socket accept callbacks on RP2040 no longer allocate memory in IRQ context, eliminating crashes under rapid connect/disconnect stress testing ([#14687](https://github.com/esphome/esphome/pull/14687))
93+
- **OTA timeout fixed** - OTA updates on ESP8266 and RP2040 no longer time out under load; switched from polling to `SO_RCVTIMEO` for reliable socket reads ([#14675](https://github.com/esphome/esphome/pull/14675))
94+
- **mDNS restart after WiFi reconnect** - mDNS on RP2040 now correctly restarts after WiFi reconnects, fixing service discovery failures ([#14737](https://github.com/esphome/esphome/pull/14737))
95+
- **I2C bus selection** - Fixed RP2040 I2C bus selection to correctly choose the hardware I2C peripheral based on pin assignment ([#14745](https://github.com/esphome/esphome/pull/14745))
96+
- **Debug reset reason** - The debug component now correctly reports the reset reason on RP2040/RP2350 ([#14740](https://github.com/esphome/esphome/pull/14740))
9197

9298
**Flash and Performance:**
9399

@@ -172,6 +178,7 @@ The native API communication layer received over 20 targeted optimizations this
172178
- **Socket layer overhaul** - The entire socket abstraction was devirtualized, converting the virtual base class to concrete per-platform types (`BSDSocketImpl`, `LwIPSocketImpl`, `LWIPRawImpl`) with zero virtual methods ([#14398](https://github.com/esphome/esphome/pull/14398)). The compiler now fully inlines hot-path socket methods (`read`, `write`, `writev`, `ready`) directly into API frame helpers and OTA chunk handlers, eliminating vtable loads on every packet. Saves ~3KB flash on ESP32. Socket pointer caching ([#14408](https://github.com/esphome/esphome/pull/14408)) further inlined the entire `ready()` chain to ~30 bytes with zero function calls.
173179
- **Handshake timeout** - 15-second timeout for completing API handshakes prevents connection slot exhaustion from stale half-open connections ([#14050](https://github.com/esphome/esphome/pull/14050))
174180
- **Inlined send buffer fast path** - The `try_to_clear_buffer()` check on every `send_buffer()` call is now inlined, avoiding a function call when the TX buffer is already clear ([#14630](https://github.com/esphome/esphome/pull/14630))
181+
- **TCP_NODELAY fast path** - Setting `TCP_NODELAY` now bypasses the expensive `lwip_setsockopt` overhead by writing directly to the PCB flags ([#14693](https://github.com/esphome/esphome/pull/14693))
175182

176183
**BLE Event Processing:**
177184

@@ -252,12 +259,18 @@ ESP-IDF has been bumped to 5.5.3 ([#14122](https://github.com/esphome/esphome/pu
252259
- **Codebase-wide constexpr migration** - Over 20 PRs converted `static const` to `constexpr` across core, API, BLE, NFC, MQTT, and display components, moving constants to flash and enabling compiler optimizations ([#14071](https://github.com/esphome/esphome/pull/14071), [#14127](https://github.com/esphome/esphome/pull/14127), [#14129](https://github.com/esphome/esphome/pull/14129), and others)
253260
- **`esphome::optional` replaced with `std::optional`** - Eliminates a custom implementation in favor of the C++17 standard ([#14368](https://github.com/esphome/esphome/pull/14368))
254261

255-
## ESP32 Crash Handler
262+
## Crash Handlers Without a Serial Cable
263+
264+
**ESP32:**
256265

257266
A new crash handler for ESP32 devices using the ESP-IDF framework automatically captures backtraces when a crash occurs, stores them in `.noinit` memory (survives software reset), and logs the data on next boot ([#14709](https://github.com/esphome/esphome/pull/14709)). Crash data appears in `esphome logs` over the API — no serial cable needed — and in the Home Assistant log viewer when "Subscribe to logs" is enabled. The CLI automatically decodes addresses inline using `addr2line`.
258267

259268
The handler works on both **Xtensa** (ESP32, S2, S3) and **RISC-V** (C3, C6, H2, C2) architectures, capturing up to 16 backtrace frames with human-readable exception reasons. On RISC-V, stack-scanned entries are validated and labeled to distinguish from register-sourced frames. Memory cost is minimal: +92 bytes RAM, +1,092 bytes flash. No configuration needed — it's automatically enabled for all ESP-IDF devices.
260269

270+
**RP2040/RP2350:**
271+
272+
A HardFault crash handler captures register state and stack backtrace when a crash occurs, stores it across reboot via watchdog scratch registers, and logs it on next boot ([#14685](https://github.com/esphome/esphome/pull/14685)). A follow-up fix ([#14716](https://github.com/esphome/esphome/pull/14716)) improved backtrace storage and logger integration. The CLI's serial log viewer auto-decodes addresses using `addr2line`. Works on both RP2040 and RP2350.
273+
261274
## ESP32-P4 and ESP32-C5 Improvements
262275

263276
**ESP32-P4:**
@@ -402,6 +415,7 @@ Most users can update without any configuration changes. The items below are gro
402415
- **Time**: The libc timezone infrastructure has been replaced with a lightweight custom parser, saving ~9.5KB flash on ESP32 and ~2% RAM on ESP8266. The `dump_config()` output now shows human-readable timezone info (e.g., `UTC-6:00 (DST UTC-5:00)`) instead of raw POSIX strings [#13635](https://github.com/esphome/esphome/pull/13635)
403416
- **Icons (ESP8266)**: Icon strings are now stored in PROGMEM (flash), with a maximum length of 63 characters. All standard `mdi:*` icons are well under this limit [#14437](https://github.com/esphome/esphome/pull/14437)
404417
- **Device Classes (ESP8266)**: Device class strings are similarly moved to PROGMEM [#14443](https://github.com/esphome/esphome/pull/14443)
418+
- **Light**: Lambdas calling `set_effect(0)` to disable effects by integer index will get an ambiguous overload error. Use `set_effect(uint32_t{0})` or `set_effect("None")` instead [#14732](https://github.com/esphome/esphome/pull/14732)
405419
{/* BREAKING_CHANGES_USERS_END */}
406420

407421
### Undocumented API Changes
@@ -610,6 +624,16 @@ The lists below are grouped by tag and may contain duplicates across sections.
610624
- [online_image] Log download duration in milliseconds instead of seconds [esphome#14803](https://github.com/esphome/esphome/pull/14803) by [@leccelecce](https://github.com/leccelecce)
611625
- [core] Inline LwIPLock as no-op on platforms without lwIP core locking [esphome#14787](https://github.com/esphome/esphome/pull/14787) by [@bdraco](https://github.com/bdraco)
612626
- [debug] Fix shared buffer between reset reason and wakeup cause [esphome#14813](https://github.com/esphome/esphome/pull/14813) by [@bdraco](https://github.com/bdraco)
627+
- [runtime_image] Update jpegdec lib version [esphome#14726](https://github.com/esphome/esphome/pull/14726) by [@guillempages](https://github.com/guillempages)
628+
- [fastled] Include esp_lcd IDF component for ESP32-S3 compatibility [esphome#14839](https://github.com/esphome/esphome/pull/14839) by [@bdraco](https://github.com/bdraco)
629+
- [runtime_image] Add esp-dsp dependency for JPEGDEC SIMD on ESP32 [esphome#14840](https://github.com/esphome/esphome/pull/14840) by [@bdraco](https://github.com/bdraco)
630+
- Bump aioesphomeapi from 44.5.1 to 44.5.2 [esphome#14849](https://github.com/esphome/esphome/pull/14849) by [@dependabot[bot]](https://github.com/apps/dependabot)
631+
- [ble_nus] fix uart debug [esphome#14850](https://github.com/esphome/esphome/pull/14850) by [@tomaszduda23](https://github.com/tomaszduda23)
632+
- [gpio][dallas_temp] Fix one_wire read64() and DS18S20 division by zero [esphome#14866](https://github.com/esphome/esphome/pull/14866) by [@swoboda1337](https://github.com/swoboda1337)
633+
- [lilygo_t5_47] Fix Y coordinate mapping and clamp touch point count [esphome#14865](https://github.com/esphome/esphome/pull/14865) by [@swoboda1337](https://github.com/swoboda1337)
634+
- [am43] Fix battery update throttle using wrong type [esphome#14864](https://github.com/esphome/esphome/pull/14864) by [@swoboda1337](https://github.com/swoboda1337)
635+
- [as3935] Fix ENERGY_MASK dropping bit 4 of lightning energy MMSB [esphome#14861](https://github.com/esphome/esphome/pull/14861) by [@swoboda1337](https://github.com/swoboda1337)
636+
- [core] Support both dot and dash separators in Version.parse [esphome#14858](https://github.com/esphome/esphome/pull/14858) by [@swoboda1337](https://github.com/swoboda1337)
613637

614638
### All changes
615639

@@ -1106,6 +1130,15 @@ The lists below are grouped by tag and may contain duplicates across sections.
11061130
- [online_image] Log download duration in milliseconds instead of seconds [esphome#14803](https://github.com/esphome/esphome/pull/14803) by [@leccelecce](https://github.com/leccelecce)
11071131
- [core] Inline LwIPLock as no-op on platforms without lwIP core locking [esphome#14787](https://github.com/esphome/esphome/pull/14787) by [@bdraco](https://github.com/bdraco)
11081132
- [debug] Fix shared buffer between reset reason and wakeup cause [esphome#14813](https://github.com/esphome/esphome/pull/14813) by [@bdraco](https://github.com/bdraco)
1133+
- [runtime_image] Update jpegdec lib version [esphome#14726](https://github.com/esphome/esphome/pull/14726) by [@guillempages](https://github.com/guillempages)
1134+
- [fastled] Include esp_lcd IDF component for ESP32-S3 compatibility [esphome#14839](https://github.com/esphome/esphome/pull/14839) by [@bdraco](https://github.com/bdraco)
1135+
- [runtime_image] Add esp-dsp dependency for JPEGDEC SIMD on ESP32 [esphome#14840](https://github.com/esphome/esphome/pull/14840) by [@bdraco](https://github.com/bdraco)
1136+
- [ble_nus] fix uart debug [esphome#14850](https://github.com/esphome/esphome/pull/14850) by [@tomaszduda23](https://github.com/tomaszduda23)
1137+
- [gpio][dallas_temp] Fix one_wire read64() and DS18S20 division by zero [esphome#14866](https://github.com/esphome/esphome/pull/14866) by [@swoboda1337](https://github.com/swoboda1337)
1138+
- [lilygo_t5_47] Fix Y coordinate mapping and clamp touch point count [esphome#14865](https://github.com/esphome/esphome/pull/14865) by [@swoboda1337](https://github.com/swoboda1337)
1139+
- [am43] Fix battery update throttle using wrong type [esphome#14864](https://github.com/esphome/esphome/pull/14864) by [@swoboda1337](https://github.com/swoboda1337)
1140+
- [as3935] Fix ENERGY_MASK dropping bit 4 of lightning energy MMSB [esphome#14861](https://github.com/esphome/esphome/pull/14861) by [@swoboda1337](https://github.com/swoboda1337)
1141+
- [core] Support both dot and dash separators in Version.parse [esphome#14858](https://github.com/esphome/esphome/pull/14858) by [@swoboda1337](https://github.com/swoboda1337)
11091142

11101143
</details>
11111144

@@ -1140,6 +1173,7 @@ The lists below are grouped by tag and may contain duplicates across sections.
11401173
- Bump aioesphomeapi from 44.5.0 to 44.5.1 [esphome#14624](https://github.com/esphome/esphome/pull/14624) by [@dependabot[bot]](https://github.com/apps/dependabot)
11411174
- Bump setuptools from 82.0.0 to 82.0.1 [esphome#14665](https://github.com/esphome/esphome/pull/14665) by [@dependabot[bot]](https://github.com/apps/dependabot)
11421175
- Bump tornado from 6.5.4 to 6.5.5 [esphome#14704](https://github.com/esphome/esphome/pull/14704) by [@dependabot[bot]](https://github.com/apps/dependabot)
1176+
- Bump aioesphomeapi from 44.5.1 to 44.5.2 [esphome#14849](https://github.com/esphome/esphome/pull/14849) by [@dependabot[bot]](https://github.com/apps/dependabot)
11431177

11441178
</details>
11451179

src/content/docs/guides/supporters.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1565,6 +1565,7 @@ ESPHome was originally founded by [Otto Winter (@OttoWinter)](https://github.com
15651565
- [Neil Martin (@neilmartin83)](https://github.com/neilmartin83)
15661566
- [Nejc Koncan (@nejc-cc)](https://github.com/nejc-cc)
15671567
- [NeoAcheron (@NeoAcheron)](https://github.com/NeoAcheron)
1568+
- [Matthias König (@NeoExtended)](https://github.com/NeoExtended)
15681569
- [neographikal (@neographikal)](https://github.com/neographikal)
15691570
- [Nick (@neponn)](https://github.com/neponn)
15701571
- [nepozs (@nepozs)](https://github.com/nepozs)
@@ -2361,4 +2362,4 @@ ESPHome was originally founded by [Otto Winter (@OttoWinter)](https://github.com
23612362
- [Christian Zufferey (@zuzu59)](https://github.com/zuzu59)
23622363
- [Zynth-dev (@Zynth-dev)](https://github.com/Zynth-dev)
23632364

2364-
*This page was last updated March 16, 2026.*
2365+
*This page was last updated March 17, 2026.*

0 commit comments

Comments
 (0)