Skip to content

Commit a21fe04

Browse files
authored
Merge pull request #5456 from esphome/bump-2025.10.0b1
2025.10.0b1
2 parents 38ff935 + 7a46963 commit a21fe04

37 files changed

+1178
-131
lines changed

content/changelog/2025.10.0.md

Lines changed: 568 additions & 0 deletions
Large diffs are not rendered by default.

content/changelog/_index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ description: "Changelog"
33
title: "Changelog"
44
---
55

6-
{{< redirect url="/changelog/2025.9.0.html" >}}
6+
{{< redirect url="/changelog/2025.10.0.html" >}}
105 KB
Loading

content/components/_index.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ Sensors are organized into categories; if a given sensor fits into more than one
388388
"HYT271","components/sensor/hyt271","hyt271.jpg","Temperature & Humidity",""
389389
"Inkbird IBS-TH1 Mini","components/sensor/inkbird_ibsth1_mini","inkbird_isbth1_mini.jpg","Temperature & Humidity",""
390390
"Internal Temperature","components/sensor/internal_temperature","thermometer.svg","Temperature","dark-invert"
391+
"LM75B","components/sensor/lm75b","lm75b.jpg","Temperature",""
391392
"LPS22","components/sensor/lps22","lps22.webp","Temperature & Barometric Pressure",""
392393
"MCP9808","components/sensor/mcp9808","mcp9808.jpg","Temperature",""
393394
"MH-Z19","components/sensor/mhz19","mhz19.jpg","CO₂ & Temperature",""
@@ -416,6 +417,7 @@ Sensors are organized into categories; if a given sensor fits into more than one
416417
"TMP102","components/sensor/tmp102","tmp102.jpg","Temperature",""
417418
"TMP1075","components/sensor/tmp1075","tmp1075.jpg","Temperature",""
418419
"TMP117","components/sensor/tmp117","tmp117.jpg","Temperature",""
420+
"WTS01","components/sensor/wts01","wts01.png","Temperature",""
419421
"XGZP68xx Series","components/sensor/xgzp68xx","6897d.jpg","Differential Pressure",""
420422
{{< /imgtable >}}
421423

@@ -724,6 +726,7 @@ Often known as "tag" or "card" readers within the community.
724726
"MIPI DSI Displays","components/display/mipi_dsi","tab5.jpg"
725727
"MIPI RGB Displays","components/display/mipi_rgb","indicator.jpg"
726728
"MIPI SPI Displays","components/display/mipi_spi","t4-s3.jpg"
729+
"ePaper SPI Displays","components/display/epaper_spi","epaper.svg"
727730
"ILI9xxx","components/display/ili9xxx","ili9341.jpg"
728731
"ILI9341","components/display/ili9xxx","ili9341.svg"
729732
"ILI9342","components/display/ili9xxx","ili9342.svg"
@@ -1049,6 +1052,7 @@ ESPHome to cellular networks. **Does not encompass Wi-Fi.**
10491052
"Status LED","components/status_led","led-on.svg","dark-invert"
10501053
"Sun","components/sun","weather-sunny.svg","dark-invert"
10511054
"Tuya MCU","components/tuya","tuya.png",""
1055+
"Z-Wave Proxy","components/zwave_proxy","z-wave.svg",""
10521056
{{< /imgtable >}}
10531057

10541058
## Cookbook

content/components/api.md

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ api:
3636
api:
3737
port: 6053
3838
batch_delay: 50ms # Reduce latency for real-time applications
39+
listen_backlog: 2 # Allow 2 pending connections in queue
40+
max_connections: 6 # Allow up to 6 simultaneous connections
41+
max_send_queue: 10 # Maximum queued messages per connection before disconnect
3942
encryption:
4043
key: "YOUR_ENCRYPTION_KEY_HERE"
4144
reboot_timeout: 30min
@@ -44,6 +47,25 @@ api:
4447
## Configuration variables
4548
4649
- **port** (*Optional*, int): The port to run the API server on. Defaults to `6053`.
50+
- **listen_backlog** (*Optional*, int): The maximum number of pending connections in the listen queue. Must be between 1 and 10.
51+
Defaults to `1` for ESP8266/RP2040, `4` for ESP32 and other platforms. Lower values use less memory but may reject connections during bursts.
52+
- **max_connections** (*Optional*, int): The maximum number of simultaneous API connections allowed. Must be between 1 and 20.
53+
Defaults to `4` for ESP8266/RP2040, `8` for ESP32 and other platforms. Each connection uses approximately 500-1000 bytes of RAM.
54+
55+
> [!NOTE]
56+
> Each API connection consumes approximately 500–1000 bytes of RAM while connected. ESP8266 and RP2040 devices have limited
57+
> RAM available (ESP8266 typically has around 40KB of free RAM after boot, but this can drop to under 20KB once sensors and other components are configured; RP2040 uses LWIP raw sockets with similar constraints), so be careful not to set this value too high or it may cause out-of-memory crashes.
58+
> The defaults are set to balance memory usage with allowing multiple simultaneous connections.
59+
60+
- **max_send_queue** (*Optional*, int): The maximum number of messages that can be queued for sending per connection before the connection is dropped. Must be between 1 and 64.
61+
Defaults to `5` for ESP8266/RP2040, `8` for ESP32/BK72xx/RTL87xx/LN882x, `16` for host platform. This prevents memory exhaustion when a client is slow or network-stalled.
62+
Each queued message uses approximately 8-12 bytes of overhead plus the message size.
63+
64+
> [!NOTE]
65+
> When the send queue is full for a connection, the device will log an error and disconnect that client to prevent out-of-memory crashes.
66+
> Slow clients, poor WiFi connections causing retries, or network congestion may trigger this. Increase this value if legitimate clients are being disconnected, but be mindful
67+
> of memory constraints on embedded devices.
68+
4769
- **encryption** (*Optional*): If present, encryption will be enabled for the API. Using encryption helps to secure the
4870
communication between the device running ESPHome and the connected client(s).
4971

@@ -93,6 +115,10 @@ api:
93115
Before using any of the actions below, you'll need to tell Home Assistant to allow your device to
94116
perform actions.
95117

118+
> [!NOTE]
119+
> Starting with ESPHome 2025.10.0, you can configure actions to receive and process responses from
120+
> Home Assistant using `capture_response`, `on_success`, and `on_error`. See [Action Response Handling](#action-response-handling) for details.
121+
96122
Open the ESPHome integration page on your Home Assistant instance:
97123

98124
[![Open your Home Assistant instance and show the ESPHome integration.](https://my.home-assistant.io/badges/integration.svg)](https://my.home-assistant.io/redirect/integration/?domain=esphome)
@@ -180,6 +206,20 @@ on_...:
180206
- **variables** (*Optional*, mapping): Optional variables that can be used in the `data_template`.
181207
Values are [lambdas](#config-lambda) and will be evaluated before sending the request.
182208

209+
- **capture_response** (*Optional*, boolean): Enable capturing the response from the Home Assistant action call.
210+
When enabled, `on_success` must be configured. Defaults to `false`.
211+
212+
- **response_template** (*Optional*, [templatable](#config-templatable), string): Optional Jinja template to process
213+
the action response data. This template is evaluated on the Home Assistant side with Home Assistant's templating engine.
214+
Requires `capture_response: true`.
215+
216+
- **on_success** (*Optional*, [Automation](#automation)): Optional automation to execute when the Home Assistant action
217+
call succeeds. When `capture_response: true`, the response data is available as a `response` variable of type `JsonObjectConst`.
218+
See [Action Response Handling](#action-response-handling).
219+
220+
- **on_error** (*Optional*, [Automation](#automation)): Optional automation to execute when the Home Assistant action
221+
call fails. See [Action Response Handling](#action-response-handling).
222+
183223
Data structures are not possible, but you can create a script in Home Assistant and call with all
184224
the parameters in plain format.
185225

@@ -213,6 +253,74 @@ on_...:
213253
blue: '71'
214254
```
215255

256+
#### Action Response Handling
257+
258+
> [!NOTE]
259+
> Action response handling is available in ESPHome 2025.10.0 and later.
260+
261+
You can configure actions to receive and process responses from Home Assistant. This enables bidirectional
262+
communication where ESPHome can not only call Home Assistant actions but also handle their responses.
263+
264+
##### Basic Success/Error Handling
265+
266+
Use `on_success` and `on_error` to respond to action completion:
267+
268+
```yaml
269+
on_...:
270+
- homeassistant.action:
271+
action: light.toggle
272+
data:
273+
entity_id: light.demo_light
274+
on_success:
275+
- logger.log: "Toggled demo light"
276+
on_error:
277+
- logger.log: "Failed to toggle demo light"
278+
```
279+
280+
##### Capturing Response Data
281+
282+
To capture and process response data from actions, set `capture_response: true`. When enabled, `on_success` must be configured
283+
and the response data is available as a [`JsonObjectConst`](https://arduinojson.org/v7/api/jsonobjectconst/) variable named `response`.
284+
285+
```yaml
286+
# Example: Get weather forecast and parse JSON response
287+
on_...:
288+
- homeassistant.action:
289+
action: weather.get_forecasts
290+
data:
291+
entity_id: weather.forecast_home
292+
type: hourly
293+
capture_response: true
294+
on_success:
295+
- lambda: |-
296+
JsonObjectConst next_hour = response["response"]["weather.forecast_home"]["forecast"][0];
297+
float next_temperature = next_hour["temperature"].as<float>();
298+
ESP_LOGI("weather", "Temperature next hour: %.1f", next_temperature);
299+
```
300+
301+
##### Using Response Templates
302+
303+
Use `response_template` to extract and format data from complex responses using Home Assistant's Jinja templating engine.
304+
This requires `capture_response: true`.
305+
306+
```yaml
307+
# Example: Extract temperature using a template
308+
on_...:
309+
- homeassistant.action:
310+
action: weather.get_forecasts
311+
data:
312+
entity_id: weather.forecast_home
313+
type: hourly
314+
capture_response: true
315+
response_template: "{{ response['weather.forecast_home']['forecast'][0]['temperature'] }}"
316+
on_success:
317+
- lambda: |-
318+
float temperature = response["response"].as<float>();
319+
ESP_LOGI("weather", "Temperature next hour: %.1f", temperature);
320+
```
321+
322+
When `response_template` is used, the processed result is available in `response["response"]`.
323+
216324
{{< anchor "api-homeassistant_tag_scanned_action" >}}
217325

218326
### `homeassistant.tag_scanned` Action

content/components/bluetooth_proxy.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,12 @@ bluetooth_proxy:
4949
```
5050

5151
- **active** (*Optional*, boolean): Enables proxying active connections. Defaults to `true`.
52-
- **cache_services** (*Optional*, boolean): Enables caching GATT services in NVS flash storage which significantly speeds up active connections. Defaults to `true` when using the ESP-IDF framework.
52+
- **cache_services** (*Optional*, boolean): Enables caching GATT services in NVS flash storage which significantly speeds up active connections. Defaults to `true`.
5353
- **connection_slots** (*Optional*, int): The maximum number of BLE connection slots to use.
54-
Each configured slot consumes ~1KB of RAM. This can only be adjusted when using
55-
the `esp-idf` framework up to a maximum of `9`. It is recommended not to exceed `5`
54+
Each configured slot consumes ~1KB of RAM, with a maximum of `9`. It is recommended not to exceed `5`
5655
connection slots to avoid memory issues. Defaults to `3`.
5756
The value must not exceed the total configured `max_connections`
58-
for {{< docref "esp32_ble_tracker/" >}}.
57+
for {{< docref "esp32_ble/" >}}.
5958

6059
The Bluetooth proxy depends on {{< docref "esp32_ble_tracker/" >}} so make sure to add that to your configuration.
6160

content/components/debug.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,17 @@ sensor:
8888
8989
- **cpu_frequency** (*Optional*): Reports the CPU frequency in Hz. All options from [Sensor](#config-sensor).
9090
91+
## Zephyr
92+
93+
The component enables debugging features for ESPHome devices running on the Zephyr RTOS.
94+
It helps with low-level firmware debugging using **SWD (Serial Wire Debug)**. It enables:
95+
96+
- **Thread Awareness in GDB**
97+
Injects Zephyr thread metadata so that all active threads can be inspected via GDB when connected over SWD.
98+
99+
- **Real-Time Logging over RTT**
100+
Enables logging output over **SEGGER RTT** (Real Time Transfer), allowing non-intrusive debug logs through SWD.
101+
91102
## See Also
92103
93104
- [Sensor Filters](#sensor-filters)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
---
2+
description: "Instructions for setting up ePaper SPI displays in ESPHome."
3+
title: "ePaper SPI Display"
4+
params:
5+
seo:
6+
description: Instructions for setting up ePaper SPI displays with improved architecture in ESPHome.
7+
image: epaper.svg
8+
---
9+
10+
The `epaper_spi` display platform provides a new ePaper display component architecture
11+
with improved state management and non-blocking operation. This component implements a
12+
queue-based state machine that eliminates blocking waits for the busy pin and provides
13+
better integration with ESPHome's async architecture.
14+
15+
The communication method uses 4-wire [SPI](#spi), so you need to have an `spi:` section in your
16+
configuration.
17+
18+
```yaml
19+
display:
20+
- platform: epaper_spi
21+
cs_pin: GPIOXX
22+
dc_pin: GPIOXX
23+
busy_pin: GPIOXX
24+
reset_pin: GPIOXX
25+
model: 7.3in-spectra-e6
26+
lambda: |-
27+
it.filled_circle(it.get_width() / 2, it.get_height() / 2, 50, Color::BLACK);
28+
```
29+
30+
## Configuration variables
31+
32+
- **cs_pin** (**Required**, [Pin Schema](#config-pin_schema)): The CS pin.
33+
- **dc_pin** (**Required**, [Pin Schema](#config-pin_schema)): The DC pin.
34+
- **model** (**Required**): The model of the ePaper display. Currently supported:
35+
36+
- `7.3in-spectra-e6` - 7.3" Spectra E6 6-color display (800×480 pixels)
37+
38+
- **busy_pin** (*Optional*, [Pin Schema](#config-pin_schema)): The BUSY pin. Defaults to not connected.
39+
- **reset_pin** (*Optional*, [Pin Schema](#config-pin_schema)): The RESET pin. Defaults to not connected.
40+
Make sure you pull this pin high (by connecting it to 3.3V with a resistor) if not connected to a GPIO pin.
41+
42+
- **rotation** (*Optional*): Set the rotation of the display. Everything you draw in `lambda:` will be rotated
43+
by this option. One of `0°` (default), `90°`, `180°`, `270°`.
44+
45+
- **reset_duration** (*Optional*, [Time](#config-time)): Duration for the display reset operation. Defaults to `200ms`.
46+
47+
- **lambda** (*Optional*, [lambda](#config-lambda)): The lambda to use for rendering the content on the display.
48+
See [Display Rendering Engine](#display-engine) for more information.
49+
- **pages** (*Optional*, list): Show pages instead of a single lambda. See [Display Pages](#display-pages).
50+
51+
- **update_interval** (*Optional*, [Time](#config-time)): The interval to re-draw the screen. Defaults to `60s`,
52+
use `never` to only manually update the screen via `component.update`.
53+
- **spi_id** (*Optional*, [ID](#config-id)): Manually specify the ID of the [SPI Component](#spi) if you want
54+
to use multiple SPI buses.
55+
- **id** (*Optional*, [ID](#config-id)): Manually specify the ID used for code generation.
56+
57+
## See Also
58+
59+
- {{< docref "index/" >}}
60+
- {{< apiref "epaper_spi/epaper_spi.h" "epaper_spi/epaper_spi.h" >}}
61+
- [ESPHome Display Rendering Engine](#display-engine)
Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)