Skip to content

Commit b55ccb8

Browse files
authored
Merge branch 'next' into ssd1677
2 parents 4c180ef + c8af9ba commit b55ccb8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+783
-350
lines changed

Makefile

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ check-links: anchors
2727
anchors: repo-data
2828
$(PAGEFIND) -s pagefind-bootstrap
2929
hugo --environment anchors
30-
python3 script/md_anchors.py
3130

3231
repo-data: directories
3332
mkdir -p data/automations
@@ -54,7 +53,6 @@ convert-branch-in-place:
5453
netlify: repo-data
5554
$(PAGEFIND) -s pagefind-bootstrap
5655
hugo --environment anchors
57-
python3 script/md_anchors.py
5856
hugo --minify
5957
$(PAGEFIND)
6058
# rerun hugo to incorporate generated index

content/changelog/2025.10.0.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ If you manage multiple devices, the dashboard will feel noticeably faster and mo
159159

160160
## Device Onboarding Improvements
161161

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.
163163

164164
### Captive Portal for ESP-IDF
165165

@@ -179,9 +179,9 @@ This brings ESP-IDF up to feature parity with Arduino for onboarding, and since
179179

180180
**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.
181181

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.
183183

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.
185185

186186
## Home Assistant Action Responses
187187

content/changelog/2025.11.0.md

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,13 @@ Added `ignore_not_found` option (default `true`) to allow disabling `CONFIG_SPIR
142142

143143
**7 New Sensor/Device Components:**
144144

145-
- [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
149-
- [RX8130](https://esphome.io/components/time/rx8130.html) ([#10511](https://github.com/esphome/esphome/pull/10511)) - Epson RTC chip (used in M5Stack devices)
150-
- [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
149+
- [RX8130](/components/time/rx8130) ([#10511](https://github.com/esphome/esphome/pull/10511)) - Epson RTC chip (used in M5Stack devices)
150+
- [BLE NUS Logger](/components/ble_nus) ([#9846](https://github.com/esphome/esphome/pull/9846)) - Logging over BLE for nRF52 platform
151+
- [TinyUSB](/components/tinyusb) ([#11678](https://github.com/esphome/esphome/pull/11678)) - USB device functionality foundation for ESP32-S2/S3
152152

153153
**Extended Hardware Support:**
154154

@@ -419,6 +419,12 @@ Users who access component members directly in YAML lambdas may need updates:
419419
- **Fan**: Change `id(my_fan).preset_mode` to `id(my_fan).get_preset_mode()`. [#11632](https://github.com/esphome/esphome/pull/11632)
420420

421421
- **Event**: Change `id(my_event).last_event_type` to `id(my_event).get_last_event_type()`. [#11767](https://github.com/esphome/esphome/pull/11767)
422+
423+
- **Climate**: Custom mode members are now private. Change direct access to public accessor methods:
424+
- Check if active: `id(my_climate).custom_fan_mode.has_value()` → `id(my_climate).has_custom_fan_mode()`, `id(my_climate).custom_preset.has_value()` → `id(my_climate).has_custom_preset()`
425+
- Get value: `id(my_climate).custom_fan_mode.value()` → `id(my_climate).get_custom_fan_mode()`, `id(my_climate).custom_preset.value()` → `id(my_climate).get_custom_preset()`
426+
427+
[#11621](https://github.com/esphome/esphome/pull/11621)
422428
<!-- BREAKING_CHANGES_USERS_END -->
423429

424430
### Breaking Changes for Developers
@@ -429,7 +435,7 @@ The following changes affect external component developers. Standard YAML config
429435

430436
## Core Framework Changes
431437

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)
433439

434440
- **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)
435441

@@ -443,17 +449,17 @@ The following changes affect external component developers. Standard YAML config
443449

444450
### Climate
445451

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.
447453

448454
- **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)
449455

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)
451457

452458
- **Deprecated methods**: Removed methods deprecated in 1.20 (July 2021). [#11388](https://github.com/esphome/esphome/pull/11388)
453459

454460
### Light
455461

456-
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.
457463

458464
- **Color modes**: Replaced `std::set<ColorMode>` with `ColorModeMask` bitmask class. [#11348](https://github.com/esphome/esphome/pull/11348)
459465

@@ -463,15 +469,15 @@ See the [Light Entity Class: Memory Optimizations](https://developers.esphome.io
463469

464470
### Fan
465471

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.
467473

468474
- **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)
469475

470476
- **Deprecated code**: Removed code deprecated in 2022.2. [#11392](https://github.com/esphome/esphome/pull/11392)
471477

472478
### Select
473479

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.
475481

476482
- **Options storage**: Changed from `std::vector<std::string>` to `FixedVector<const char *>`. [#11514](https://github.com/esphome/esphome/pull/11514)
477483

@@ -481,15 +487,17 @@ See the [Select Entity Class: Index-Based Operations and Flash Storage](https://
481487

482488
### Event
483489

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.
485491

486492
- **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)
487493

488494
### Network Components
489495

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+
490498
- **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)
491499

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)
493501

494502
### Other Components
495503

@@ -510,6 +518,25 @@ The 2025.11 release blog posts include comprehensive migration examples for comm
510518

511519
<!-- markdownlint-disable MD013 -->
512520

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)
537+
538+
</details>
539+
513540
## Full list of changes
514541

515542
### New Features

content/components/_index.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ Sensors are organized into categories; if a given sensor fits into more than one
292292
"Mopeka Pro Check LP","components/sensor/mopeka_pro_check","mopeka_pro_check.jpg","Tank level"
293293
"Mopeka Standard Check LP","components/sensor/mopeka_std_check","mopeka_std_check.jpg","Tank level"
294294
"RuuviTag","components/sensor/ruuvitag","ruuvitag.jpg","Temperature & Humidity & Accelerometer"
295+
"ThermoPro BLE","components/sensor/thermopro_ble","thermopro_tp357.jpg","Temperature & Humidity"
295296
"Xiaomi BLE","components/sensor/xiaomi_ble","xiaomi_mijia_logo.jpg","Various"
296297
{{< /imgtable >}}
297298

@@ -1001,6 +1002,7 @@ at the {{< docref "light/fastled" "FastLED Light" >}}.
10011002

10021003
{{< imgtable >}}
10031004
"Time Core","components/time/index","clock-outline.svg","dark-invert"
1005+
"BM8563 RTC","components/time/bm8563","bm8563.svg",""
10041006
"DS1307 RTC","components/time/ds1307","clock-outline.svg","dark-invert"
10051007
"RX8130 RTC","components/time/rx8130","clock-outline.svg","dark-invert"
10061008
"GPS Time","components/time/gps","crosshairs-gps.svg","dark-invert"

content/components/api.md

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -385,25 +385,51 @@ api:
385385
- logger.log: "API client disconnected!"
386386
```
387387

388+
## Conditions
389+
388390
{{< anchor "api-connected_condition" >}}
389391

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
391397

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:**
395401

396402
```yaml
397403
on_...:
398404
if:
399405
condition:
400406
api.connected:
401407
then:
402-
- logger.log: API is connected!
408+
- logger.log: Client is connected to API!
403409
```
404410

405411
The lambda equivalent for this is `id(api_id).is_connected()`.
406412

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
432+
407433
{{< anchor "api-device-actions" >}}
408434

409435
## User-defined Actions

content/components/climate/_index.md

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -234,18 +234,42 @@ advanced stuff.
234234
id(my_climate).target_humidity
235235
// Fan mode, type: FanMode (enum)
236236
id(my_climate).fan_mode
237-
// Custom Fan mode, type: string
238-
id(my_climate).custom_fan_mode
239237
// Swing mode, type: SwingMode (enum)
240238
id(my_climate).swing_mode
241239
// Current action (currentl on idle, cooling, heating, etc.), ClimateAction (enum)
242240
id(my_climate).action
243241
// Preset, type: Preset (enum)
244242
id(my_climate).preset
245-
// Custom Preset, type: string
246-
id(my_climate).custom_preset
247243
```
248244

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.
260+
>
261+
> ```cpp
262+
> // Correct - check before accessing
263+
> if (id(my_climate).has_custom_fan_mode()) {
264+
> const char* mode = id(my_climate).get_custom_fan_mode();
265+
> // Now safe to use mode
266+
> }
267+
>
268+
> // Wrong - may crash if no custom mode is set
269+
> const char* mode = id(my_climate).get_custom_fan_mode();
270+
> ESP_LOGD("tag", "Mode: %s", mode); // Crashes if mode is nullptr
271+
> ```
272+
249273
- `.make_call` : Control the climate device
250274

251275
```cpp

0 commit comments

Comments
 (0)