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: content/changelog/2025.10.0.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -159,7 +159,7 @@ If you manage multiple devices, the dashboard will feel noticeably faster and mo
159
159
160
160
## Device Onboarding Improvements
161
161
162
-
Getting your ESPHome devices online has never been easier. This release brings major improvements to the initial setup experience, particularly for ESP32-IDF devices and the [Made for ESPHome](https://esphome.io/guides/made_for_esphome/) program.
162
+
Getting your ESPHome devices online has never been easier. This release brings major improvements to the initial setup experience, particularly for ESP32-IDF devices and the [Made for ESPHome](/guides/made_for_esphome/) program.
163
163
164
164
### Captive Portal for ESP-IDF
165
165
@@ -179,9 +179,9 @@ This brings ESP-IDF up to feature parity with Arduino for onboarding, and since
179
179
180
180
**Why passive scanning matters:** Many home automation systems and BLE scanners only support passive scanning (not active scanning). Making the device name visible to passive scanners means your devices show up in more scanning apps and are easier to identify during setup.
181
181
182
-
These improvements directly support the [Made for ESPHome program](https://esphome.io/guides/made_for_esphome/), which requires Improv provisioning via BLE for Wi-Fi projects to ensure a consistent, high-quality setup experience across all ESPHome-compatible products.
182
+
These improvements directly support the [Made for ESPHome program](/guides/made_for_esphome/), which requires Improv provisioning via BLE for Wi-Fi projects to ensure a consistent, high-quality setup experience across all ESPHome-compatible products.
183
183
184
-
The Made for ESPHome program requires Improv BLE provisioning for Wi-Fi projects. See the [certification requirements](https://esphome.io/guides/made_for_esphome/) for details.
184
+
The Made for ESPHome program requires Improv BLE provisioning for Wi-Fi projects. See the [certification requirements](/guides/made_for_esphome/) for details.
- [HDC2010](https://esphome.io/components/sensor/hdc2010.html) ([#6674](https://github.com/esphome/esphome/pull/6674)) - Texas Instruments temperature and humidity sensor
146
-
- [MCP3221](https://esphome.io/components/sensor/mcp3221.html) ([#7764](https://github.com/esphome/esphome/pull/7764)) - I2C A-D converter with configurable reference voltage
147
-
- [HLK-FM22X](https://esphome.io/components/hlk_fm22x.html) ([#8059](https://github.com/esphome/esphome/pull/8059)) - Face recognition module family
148
-
- [BH1900NUX](https://esphome.io/components/sensor/bh1900nux.html) ([#8631](https://github.com/esphome/esphome/pull/8631)) - Rohm Semiconductor temperature sensor
- [BLE NUS Logger](https://esphome.io/components/logger.html#ble-logging) ([#9846](https://github.com/esphome/esphome/pull/9846)) - Logging over BLE for nRF52 platform
151
-
- [TinyUSB](https://esphome.io/components/tinyusb.html) ([#11678](https://github.com/esphome/esphome/pull/11678)) - USB device functionality foundation for ESP32-S2/S3
145
+
- [HDC2010](/components/sensor/hdc2010) ([#6674](https://github.com/esphome/esphome/pull/6674)) - Texas Instruments temperature and humidity sensor
146
+
- [MCP3221](/components/sensor/mcp3221) ([#7764](https://github.com/esphome/esphome/pull/7764)) - I2C A-D converter with configurable reference voltage
147
+
- [HLK-FM22X](/components/hlk_fm22x) ([#8059](https://github.com/esphome/esphome/pull/8059)) - Face recognition module family
148
+
- [BH1900NUX](/components/sensor/bh1900nux) ([#8631](https://github.com/esphome/esphome/pull/8631)) - Rohm Semiconductor temperature sensor
@@ -429,7 +435,7 @@ The following changes affect external component developers. Standard YAML config
429
435
430
436
## Core Framework Changes
431
437
432
-
- **Action/Trigger Framework**: All action/trigger/condition method signatures changed to use const references (`const Ts&... x`) instead of pass-by-value (`Ts... x`). See the [Action Framework Performance Optimization](https://developers.esphome.io/blog/2025/11/action-framework-performance-optimization.html) blog post for migration details. [#11704](https://github.com/esphome/esphome/pull/11704)
438
+
- **Action/Trigger Framework**: All action/trigger/condition method signatures changed to use const references (`const Ts&... x`) instead of pass-by-value (`Ts... x`). See the [Action Framework Performance Optimization](https://developers.esphome.io/blog/2025/11/06/action-framework-performance-optimization/) blog post for migration details. [#11704](https://github.com/esphome/esphome/pull/11704)
433
439
434
440
- **Controller API**: Controllers now use global registry pattern. Method signatures changed to remove unused state parameters (e.g., `on_sensor_update(sensor::Sensor *obj)` instead of `on_sensor_update(sensor::Sensor *obj, float state)`). External controller implementations extremely rare. [#11772](https://github.com/esphome/esphome/pull/11772)
435
441
@@ -443,17 +449,17 @@ The following changes affect external component developers. Standard YAML config
443
449
444
450
### Climate
445
451
446
-
See the [Climate Entity Class: FiniteSetMask and Flash Storage Optimizations](https://developers.esphome.io/blog/2025/11/climate-entity-class-memory-optimizations.html) blog post for migration details.
452
+
See the [Climate Entity Class: FiniteSetMask and Flash Storage Optimizations](https://developers.esphome.io/blog/2025/11/07/climate-entity-class-finitesetmask-and-flash-storage-optimizations/) blog post for migration details.
447
453
448
454
- **Custom modes storage**: Changed from `std::set<std::string>` to `FiniteSetMask` for supported modes, and from `std::vector<std::string>` to `std::vector<const char *>` for custom fan modes and presets. [#11466](https://github.com/esphome/esphome/pull/11466), [#11621](https://github.com/esphome/esphome/pull/11621)
449
455
450
-
- **Member access**: Climate device members (`custom_fan_mode_`, `custom_preset_`) are now private. Use protected setter methods (`set_custom_fan_mode_()`, `set_custom_preset_()`) in derived classes. [#11621](https://github.com/esphome/esphome/pull/11621)
456
+
- **Member access**: Climate device members (`custom_fan_mode_`, `custom_preset_`) are now private. Use protected setter methods (`set_custom_fan_mode_()`, `set_custom_preset_()`) in derived classes. Use public accessor methods to read values: `has_custom_fan_mode()`, `get_custom_fan_mode()`, `has_custom_preset()`, `get_custom_preset()`. [#11621](https://github.com/esphome/esphome/pull/11621)
See the [Light Entity Class: Memory Optimizations](https://developers.esphome.io/blog/2025/11/light-entity-class-memory-optimizations.html) blog post for migration details.
462
+
See the [Light Entity Class: Memory Optimizations](https://developers.esphome.io/blog/2025/11/07/light-entity-class-memory-optimizations/) blog post for migration details.
457
463
458
464
- **Color modes**: Replaced `std::set<ColorMode>` with `ColorModeMask` bitmask class. [#11348](https://github.com/esphome/esphome/pull/11348)
459
465
@@ -463,15 +469,15 @@ See the [Light Entity Class: Memory Optimizations](https://developers.esphome.io
463
469
464
470
### Fan
465
471
466
-
See the [Fan Entity Class: Preset Mode Flash Storage and Order Preservation](https://developers.esphome.io/blog/2025/11/fan-entity-class-memory-optimizations.html) blog post for migration details.
472
+
See the [Fan Entity Class: Preset Mode Flash Storage and Order Preservation](https://developers.esphome.io/blog/2025/11/07/fan-entity-class-preset-mode-flash-storage-and-order-preservation/) blog post for migration details.
467
473
468
474
- **Preset modes**: Changed from `std::set<std::string>` to `std::vector<const char *>`. The `.preset_mode` public member has been removed - use `get_preset_mode()` for reading and `set_preset_mode_()` for writing in derived classes. [#11483](https://github.com/esphome/esphome/pull/11483), [#11632](https://github.com/esphome/esphome/pull/11632)
469
475
470
476
- **Deprecated code**: Removed code deprecated in 2022.2. [#11392](https://github.com/esphome/esphome/pull/11392)
471
477
472
478
### Select
473
479
474
-
See the [Select Entity Class: Index-Based Operations and Flash Storage](https://developers.esphome.io/blog/2025/11/select-entity-class-memory-optimizations.html) blog post for migration details.
480
+
See the [Select Entity Class: Index-Based Operations and Flash Storage](https://developers.esphome.io/blog/2025/11/07/select-entity-class-index-based-operations-and-flash-storage/) blog post for migration details.
475
481
476
482
- **Options storage**: Changed from `std::vector<std::string>` to `FixedVector<const char *>`. [#11514](https://github.com/esphome/esphome/pull/11514)
477
483
@@ -481,15 +487,17 @@ See the [Select Entity Class: Index-Based Operations and Flash Storage](https://
481
487
482
488
### Event
483
489
484
-
See the [Event Entity Class: Memory Optimizations](https://developers.esphome.io/blog/2025/11/event-entity-class-memory-optimizations.html) blog post for migration details.
490
+
See the [Event Entity Class: Memory Optimizations](https://developers.esphome.io/blog/2025/11/07/event-entity-class-memory-optimizations/) blog post for migration details.
485
491
486
492
- **Event types storage**: Changed from `FixedVector<std::string>` to `FixedVector<const char *>`. The `last_event_type` field is now private - use `get_last_event_type()` getter instead. [#11463](https://github.com/esphome/esphome/pull/11463), [#11767](https://github.com/esphome/esphome/pull/11767)
487
493
488
494
### Network Components
489
495
496
+
See the [Network get_use_address() Optimization](https://developers.esphome.io/blog/2025/11/20/network-use-address-optimization/) blog post for migration details.
497
+
490
498
- **WiFi scan results**: External components that access WiFi scan results after connection must call `wifi.request_wifi_scan_results()` in their `to_code()` function to prevent cleanup. [#11205](https://github.com/esphome/esphome/pull/11205)
491
499
492
-
- **use_address**: Changed from `const std::string &` to `const char *` in WiFi, Ethernet, and OpenThread components. Update external components calling `get_use_address()` or `set_use_address()`. [#11707](https://github.com/esphome/esphome/pull/11707)
500
+
- **use_address**: Changed from `const std::string &` to `const char *` in WiFi, Ethernet, and OpenThread components. Remove `.c_str()` calls when using `get_use_address()`. [#11707](https://github.com/esphome/esphome/pull/11707)
493
501
494
502
### Other Components
495
503
@@ -510,6 +518,25 @@ The 2025.11 release blog posts include comprehensive migration examples for comm
510
518
511
519
<!-- markdownlint-disable MD013 -->
512
520
521
+
## Release 2025.11.1 - November 24
522
+
523
+
<details>
524
+
<summary></summary>
525
+
526
+
- [graph] Fix legend border [esphome#12000](https://github.com/esphome/esphome/pull/12000) by [@swoboda1337](https://github.com/swoboda1337)
527
+
- [network] Fix IPAddress constructor causing comparison failures and garbage output [esphome#12005](https://github.com/esphome/esphome/pull/12005) by [@bdraco](https://github.com/bdraco)
528
+
- [ltr501][ltr_als_ps] Rename enum to avoid collision with lwip defines [esphome#12017](https://github.com/esphome/esphome/pull/12017) by [@swoboda1337](https://github.com/swoboda1337)
529
+
- [cst816][packet_transport][udp][wake_on_lan] Fix error messages [esphome#12019](https://github.com/esphome/esphome/pull/12019) by [@swoboda1337](https://github.com/swoboda1337)
530
+
- [jsn_sr04t] Fix model AJ_SR04M [esphome#11992](https://github.com/esphome/esphome/pull/11992) by [@swoboda1337](https://github.com/swoboda1337)
531
+
- [cst816][http_request] Fix status_set_error() dangling pointer bugs [esphome#12033](https://github.com/esphome/esphome/pull/12033) by [@bdraco](https://github.com/bdraco)
532
+
- [esp32] Fix C2 builds [esphome#12050](https://github.com/esphome/esphome/pull/12050) by [@swoboda1337](https://github.com/swoboda1337)
533
+
- [core] Add support for passing yaml files to clean-all [esphome#12039](https://github.com/esphome/esphome/pull/12039) by [@swoboda1337](https://github.com/swoboda1337)
534
+
- [script][wait_until] Fix FIFO ordering and reentrancy bugs [esphome#12049](https://github.com/esphome/esphome/pull/12049) by [@bdraco](https://github.com/bdraco)
535
+
- [esp_ldo,mipi_dsi,mipi_rgb] Fix dangling pointer bugs in mark_failed() [esphome#12077](https://github.com/esphome/esphome/pull/12077) by [@bdraco](https://github.com/bdraco)
536
+
- [online_image] Fix some large PNGs causing watchdog timeout [esphome#12025](https://github.com/esphome/esphome/pull/12025) by [@jesserockz](https://github.com/jesserockz)
Copy file name to clipboardExpand all lines: content/components/api.md
+31-5Lines changed: 31 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -385,25 +385,51 @@ api:
385
385
- logger.log: "API client disconnected!"
386
386
```
387
387
388
+
## Conditions
389
+
388
390
{{< anchor "api-connected_condition" >}}
389
391
390
-
## `api.connected` Condition
392
+
### `api.connected` Condition
393
+
394
+
This [Condition](/automations/actions#all-conditions) checks if at least one client is connected to the ESPHome native API.
395
+
396
+
#### Configuration variables
391
397
392
-
This [Condition](/automations/actions#all-conditions) checks if at least one client is connected to the ESPHome
393
-
native API. Please note client not only includes Home Assistant, but also ESPHome's OTA log output
394
-
if logs are shown remotely.
398
+
- **state_subscription_only** (*Optional*, boolean): If enabled, only counts clients that have subscribed to entity state updates. This filters out logger-only connections (such as `esphome logs` command), which can cause false positives when waiting for Home Assistant. Defaults to `false`.
399
+
400
+
**Check if any client is connected:**
395
401
396
402
```yaml
397
403
on_...:
398
404
if:
399
405
condition:
400
406
api.connected:
401
407
then:
402
-
- logger.log: API is connected!
408
+
- logger.log: Client is connected to API!
403
409
```
404
410
405
411
The lambda equivalent for this is `id(api_id).is_connected()`.
406
412
413
+
**Check if a client subscribed to entity states is connected (typically Home Assistant):**
414
+
415
+
```yaml
416
+
on_boot:
417
+
- wait_until:
418
+
condition:
419
+
api.connected:
420
+
state_subscription_only: true
421
+
- logger.log: Home Assistant is connected!
422
+
- homeassistant.event:
423
+
event: esphome.device_booted
424
+
```
425
+
426
+
The lambda equivalent for this is `id(api_id).is_connected(true)`.
427
+
428
+
**Use Cases:**
429
+
430
+
- Use `state_subscription_only: false` (default) to detect any API connection
431
+
- Use `state_subscription_only: true` when you need to ensure Home Assistant (or other connections that subscribe to states) is connected before sending events or calling services, preventing errors from logger-only connections
Copy file name to clipboardExpand all lines: content/components/climate/_index.md
+28-4Lines changed: 28 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -234,18 +234,42 @@ advanced stuff.
234
234
id(my_climate).target_humidity
235
235
// Fan mode, type: FanMode (enum)
236
236
id(my_climate).fan_mode
237
-
// Custom Fan mode, type: string
238
-
id(my_climate).custom_fan_mode
239
237
// Swing mode, type: SwingMode (enum)
240
238
id(my_climate).swing_mode
241
239
// Current action (currentl on idle, cooling, heating, etc.), ClimateAction (enum)
242
240
id(my_climate).action
243
241
// Preset, type: Preset (enum)
244
242
id(my_climate).preset
245
-
// Custom Preset, type: string
246
-
id(my_climate).custom_preset
247
243
```
248
244
245
+
- Custom mode accessor methods:
246
+
247
+
```cpp
248
+
// Check if custom fan mode is active, type: bool
249
+
id(my_climate).has_custom_fan_mode()
250
+
// Get custom fan mode (read-only), type: const char*
251
+
id(my_climate).get_custom_fan_mode()
252
+
// Check if custom preset is active, type: bool
253
+
id(my_climate).has_custom_preset()
254
+
// Get custom preset (read-only), type: const char*
255
+
id(my_climate).get_custom_preset()
256
+
```
257
+
258
+
> [!WARNING]
259
+
> Always check if a custom mode is active before accessing it. Calling `get_custom_fan_mode()` or `get_custom_preset()` when no custom mode is set will return `nullptr`, which can cause crashes if dereferenced.
0 commit comments