diff --git a/all_automations.json b/all_automations.json index eac8a7ec71..eacff62c3d 100644 --- a/all_automations.json +++ b/all_automations.json @@ -287,6 +287,7 @@ "remote_transmitter.transmit_dish", "remote_transmitter.transmit_dooya", "remote_transmitter.transmit_drayton", + "remote_transmitter.transmit_dyson", "remote_transmitter.transmit_haier", "remote_transmitter.transmit_jvc", "remote_transmitter.transmit_keeloq", diff --git a/content/automations/actions.md b/content/automations/actions.md index cd865f7e09..f7eb9a1f91 100644 --- a/content/automations/actions.md +++ b/content/automations/actions.md @@ -462,7 +462,21 @@ on_...: - **condition** (**Required**, [condition](#all-conditions)): The condition to check. -{{< anchor "lambda_condition" >}} +### `component.is_idle` Condition + +This condition checks if a given component is idle. A component is considered to be idle if it has completed +setup, has not been marked as failed, and is not currently being called by the loop task. This is useful for +synchronizing actions with the state of the component, for example, an e-paper display component that requires +a significant amount of time to update the display panel. + +```yaml +on_...: + then: + - if: + condition: + component.is_idle: some_component + # ... +``` ### `lambda` Condition diff --git a/content/automations/all_actions.md b/content/automations/all_actions.md index 1375be193d..523d2fc5cc 100644 --- a/content/automations/all_actions.md +++ b/content/automations/all_actions.md @@ -23,6 +23,7 @@ title: "" - **dfrobot_sen0395:** `reset`, `settings` - **display_menu:** `down`, `enter`, `hide`, `left`, `right`, `show`, `show_main`, `up` - **ds1307:** `read_time`, `write_time` +- **rx8130:** `read_time`, `write_time` - **esp32_ble_tracker:** `start_scan`, `stop_scan` - **event:** `trigger` - **ezo_pmp:** `arbitrary_command`, `change_i2c_address`, `clear_calibration`, `clear_total_volume_dosed`, `dose_continuously`, `dose_volume`, `dose_volume_over_time`, `dose_with_constant_flow_rate`, `find`, `pause_dosing`, `set_calibration_volume`, `stop_dosing` diff --git a/content/changelog/2025.11.0.md b/content/changelog/2025.11.0.md new file mode 100644 index 0000000000..e933bdac27 --- /dev/null +++ b/content/changelog/2025.11.0.md @@ -0,0 +1,567 @@ +--- +description: "Changelog for ESPHome 2025.10.0." +title: "ESPHome 2025.11.0 - November 2025" +params: + seo: + description: Changelog for ESPHome 2025.11.0. + image: /changelog/images/changelog-2025.11.0.png +--- + +{{< imgtable >}} +"BH1900NUX","components/sensor/bh1900nux","bh1900nux-evk-001.png","" +"HDC2010","components/sensor/hdc2010","hdc2010.png","" +"TinyUSB","components/tinyusb","usb.svg","dark-invert" +"MCP3221","components/sensor/mcp3221","mcp3221.png","" +"HLK-FM22x Face Recognition Module","components/hlk_fm22x","face.svg","dark-invert" +"RX8130 RTC","components/time/rx8130","clock-outline.svg","dark-invert" +{{< /imgtable >}} + + + +## Full list of changes + +### New Features + +- [esp32] Accept more framework URL schemes as sources [esphome#11125](https://github.com/esphome/esphome/pull/11125) by [@j9brown](https://github.com/j9brown) (new-feature) +- [esp32_ble] Add support for hosted BLE [esphome#11167](https://github.com/esphome/esphome/pull/11167) by [@swoboda1337](https://github.com/swoboda1337) (new-feature) +- [esp32] Add option to disable libc locks in IRAM, saving ~1.3KB RAM [esphome#10930](https://github.com/esphome/esphome/pull/10930) by [@bdraco](https://github.com/bdraco) (new-feature) (breaking-change) +- [ina2xx_base] add device reset-on-boot disablement option [esphome#10787](https://github.com/esphome/esphome/pull/10787) by [@joshuaboniface](https://github.com/joshuaboniface) (new-feature) +- [toshiba] Add support for RAS-2819T air conditioner [esphome#9490](https://github.com/esphome/esphome/pull/9490) by [@exotime](https://github.com/exotime) (new-feature) +- [bh1900nux] Add bh1900nux temperature Sensor [esphome#8631](https://github.com/esphome/esphome/pull/8631) by [@B48D81EFCC](https://github.com/B48D81EFCC) (new-component) (new-feature) (new-platform) +- [xgzp68xx] Add oversampling config and tidy up implementation. [esphome#10306](https://github.com/esphome/esphome/pull/10306) by [@ned14](https://github.com/ned14) (new-feature) +- [remote_base] Add Symphony IR protocol (encode/decode) with command_repeats support [esphome#10777](https://github.com/esphome/esphome/pull/10777) by [@leodrivera](https://github.com/leodrivera) (new-feature) +- [thermostat] Add humidity support [esphome#11286](https://github.com/esphome/esphome/pull/11286) by [@kbx81](https://github.com/kbx81) (new-feature) +- [nrf52, ble_nus] add logging over BLE [esphome#9846](https://github.com/esphome/esphome/pull/9846) by [@tomaszduda23](https://github.com/tomaszduda23) (new-component) (new-feature) +- [substitutions] !extend and !remove now support substitutions and jinja [esphome#11203](https://github.com/esphome/esphome/pull/11203) by [@jpeletier](https://github.com/jpeletier) (new-feature) +- [cli] Add `analyze-memory` command [esphome#11395](https://github.com/esphome/esphome/pull/11395) by [@bdraco](https://github.com/bdraco) (new-feature) +- [mipi_rgb] Add Waveshare 5" 1024x600 [esphome#11206](https://github.com/esphome/esphome/pull/11206) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- [esp32_improv]: add next_url support for WiFi provisioning [esphome#10757](https://github.com/esphome/esphome/pull/10757) by [@amankrokx](https://github.com/amankrokx) (new-feature) +- [espnow] Add transport platform for packet_transport [esphome#11025](https://github.com/esphome/esphome/pull/11025) by [@EasilyBoredEngineer](https://github.com/EasilyBoredEngineer) (new-feature) (new-platform) +- [sensor] Add optimistic option to heartbeat filter [esphome#10993](https://github.com/esphome/esphome/pull/10993) by [@pkejval](https://github.com/pkejval) (new-feature) +- [openthread] Fix OTA by populating CORE.address with device's mDNS address [esphome#11095](https://github.com/esphome/esphome/pull/11095) by [@danstiner](https://github.com/danstiner) (new-feature) +- [nrf52] support BLE --device for logging [esphome#9861](https://github.com/esphome/esphome/pull/9861) by [@tomaszduda23](https://github.com/tomaszduda23) (new-feature) +- [hdc2010] New component [esphome#6674](https://github.com/esphome/esphome/pull/6674) by [@optimusprimespace](https://github.com/optimusprimespace) (new-component) (new-feature) (new-platform) +- [remote_base] add support for Dyson cool AM07 tower fan [esphome#10163](https://github.com/esphome/esphome/pull/10163) by [@aanban](https://github.com/aanban) (new-feature) +- [remote_transmitter] Add non-blocking mode [esphome#11524](https://github.com/esphome/esphome/pull/11524) by [@swoboda1337](https://github.com/swoboda1337) (new-feature) (breaking-change) +- [lvgl] Trigger improvements and additions [esphome#11628](https://github.com/esphome/esphome/pull/11628) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- [component] Add is_idle method and condition [esphome#11651](https://github.com/esphome/esphome/pull/11651) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- Add support for Mopeka standard check alternate ID [esphome#10907](https://github.com/esphome/esphome/pull/10907) by [@pixelatedmirror](https://github.com/pixelatedmirror) (new-feature) +- [esp32] Make loop task stack size configurable [esphome#10564](https://github.com/esphome/esphome/pull/10564) by [@idstein](https://github.com/idstein) (new-feature) +- [nrf52, i2c] i2c support for nrf52 [esphome#8150](https://github.com/esphome/esphome/pull/8150) by [@tomaszduda23](https://github.com/tomaszduda23) (new-feature) +- [esp32_hosted] Initial OTA implementation [esphome#11562](https://github.com/esphome/esphome/pull/11562) by [@swoboda1337](https://github.com/swoboda1337) (new-feature) (new-platform) +- [epaper_spi] Refactoring [esphome#11540](https://github.com/esphome/esphome/pull/11540) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- [tinyusb] New component [esphome#11678](https://github.com/esphome/esphome/pull/11678) by [@kbx81](https://github.com/kbx81) (new-component) (new-feature) +- [lvgl] Layout improvements [esphome#10149](https://github.com/esphome/esphome/pull/10149) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- Dallas indexing [esphome#11346](https://github.com/esphome/esphome/pull/11346) by [@leejoow](https://github.com/leejoow) (new-feature) +- [gp8403] Add gp8413 (15 bits) DAC model [esphome#7726](https://github.com/esphome/esphome/pull/7726) by [@SeByDocKy](https://github.com/SeByDocKy) (new-feature) +- [lvgl] Allow text substitution for NaN [esphome#11712](https://github.com/esphome/esphome/pull/11712) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- [openthread] add poll period for mtd devices [esphome#11374](https://github.com/esphome/esphome/pull/11374) by [@rwrozelle](https://github.com/rwrozelle) (new-feature) +- [psram] Add option to disable ignore not found sdkconfig setting [esphome#11411](https://github.com/esphome/esphome/pull/11411) by [@kahrendt](https://github.com/kahrendt) (new-feature) +- Add MCP3221 i2c A-D-Converter [esphome#7764](https://github.com/esphome/esphome/pull/7764) by [@philippderdiedas](https://github.com/philippderdiedas) (new-component) (new-feature) (new-platform) +- [nrf52] api [esphome#11751](https://github.com/esphome/esphome/pull/11751) by [@lboue](https://github.com/lboue) (new-feature) +- [sx126x] Change BUSY, RST, DIO1 pins to general GPIO (from internal) [esphome#11782](https://github.com/esphome/esphome/pull/11782) by [@PaulSchulz](https://github.com/PaulSchulz) (new-feature) +- HLK-FM22X Face Recognition module component [esphome#8059](https://github.com/esphome/esphome/pull/8059) by [@OnFreund](https://github.com/OnFreund) (new-component) (new-feature) (new-platform) +- Add support for RX8130 RTC Chip [esphome#10511](https://github.com/esphome/esphome/pull/10511) by [@Beormund](https://github.com/Beormund) (new-component) (new-feature) (new-platform) +- [nrf52,gpio] add gpio levels for high voltage mode [esphome#9858](https://github.com/esphome/esphome/pull/9858) by [@tomaszduda23](https://github.com/tomaszduda23) (new-feature) +- [wifi] Add min_auth_mode configuration option [esphome#11814](https://github.com/esphome/esphome/pull/11814) by [@bdraco](https://github.com/bdraco) (new-feature) (breaking-change) +- [network, psram, speaker wifi] Use CORE.data to enable high performance networking [esphome#11812](https://github.com/esphome/esphome/pull/11812) by [@kahrendt](https://github.com/kahrendt) (new-feature) (breaking-change) + +### New Components + +- [bh1900nux] Add bh1900nux temperature Sensor [esphome#8631](https://github.com/esphome/esphome/pull/8631) by [@B48D81EFCC](https://github.com/B48D81EFCC) (new-component) (new-feature) (new-platform) +- [nrf52, ble_nus] add logging over BLE [esphome#9846](https://github.com/esphome/esphome/pull/9846) by [@tomaszduda23](https://github.com/tomaszduda23) (new-component) (new-feature) +- [hdc2010] New component [esphome#6674](https://github.com/esphome/esphome/pull/6674) by [@optimusprimespace](https://github.com/optimusprimespace) (new-component) (new-feature) (new-platform) +- [tinyusb] New component [esphome#11678](https://github.com/esphome/esphome/pull/11678) by [@kbx81](https://github.com/kbx81) (new-component) (new-feature) +- Add MCP3221 i2c A-D-Converter [esphome#7764](https://github.com/esphome/esphome/pull/7764) by [@philippderdiedas](https://github.com/philippderdiedas) (new-component) (new-feature) (new-platform) +- HLK-FM22X Face Recognition module component [esphome#8059](https://github.com/esphome/esphome/pull/8059) by [@OnFreund](https://github.com/OnFreund) (new-component) (new-feature) (new-platform) +- Add support for RX8130 RTC Chip [esphome#10511](https://github.com/esphome/esphome/pull/10511) by [@Beormund](https://github.com/Beormund) (new-component) (new-feature) (new-platform) + +### New Platforms + +- [bh1900nux] Add bh1900nux temperature Sensor [esphome#8631](https://github.com/esphome/esphome/pull/8631) by [@B48D81EFCC](https://github.com/B48D81EFCC) (new-component) (new-feature) (new-platform) +- [espnow] Add transport platform for packet_transport [esphome#11025](https://github.com/esphome/esphome/pull/11025) by [@EasilyBoredEngineer](https://github.com/EasilyBoredEngineer) (new-feature) (new-platform) +- [hdc2010] New component [esphome#6674](https://github.com/esphome/esphome/pull/6674) by [@optimusprimespace](https://github.com/optimusprimespace) (new-component) (new-feature) (new-platform) +- [esp32_hosted] Initial OTA implementation [esphome#11562](https://github.com/esphome/esphome/pull/11562) by [@swoboda1337](https://github.com/swoboda1337) (new-feature) (new-platform) +- [gdk101] Fix fw version reporting [esphome#11029](https://github.com/esphome/esphome/pull/11029) by [@Szewcson](https://github.com/Szewcson) (breaking-change) (new-platform) +- Add MCP3221 i2c A-D-Converter [esphome#7764](https://github.com/esphome/esphome/pull/7764) by [@philippderdiedas](https://github.com/philippderdiedas) (new-component) (new-feature) (new-platform) +- HLK-FM22X Face Recognition module component [esphome#8059](https://github.com/esphome/esphome/pull/8059) by [@OnFreund](https://github.com/OnFreund) (new-component) (new-feature) (new-platform) +- Add support for RX8130 RTC Chip [esphome#10511](https://github.com/esphome/esphome/pull/10511) by [@Beormund](https://github.com/Beormund) (new-component) (new-feature) (new-platform) + +### Breaking Changes + +- [wifi] Free scan results memory after connection (saves up to 1.2KB RAM) [esphome#11205](https://github.com/esphome/esphome/pull/11205) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [esp32] Add option to disable libc locks in IRAM, saving ~1.3KB RAM [esphome#10930](https://github.com/esphome/esphome/pull/10930) by [@bdraco](https://github.com/bdraco) (new-feature) (breaking-change) +- [esp32] Reduce tx power on IDF in the event of a brownout [esphome#11306](https://github.com/esphome/esphome/pull/11306) by [@swoboda1337](https://github.com/swoboda1337) (breaking-change) +- [nrf52] add xiao_ble board [esphome#10698](https://github.com/esphome/esphome/pull/10698) by [@tomaszduda23](https://github.com/tomaszduda23) (breaking-change) +- [light] Use bitmask instead of std::set for color modes [esphome#11348](https://github.com/esphome/esphome/pull/11348) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [script] Fix unbounded queue growth, optimize queued mode (default max_runs=5) [esphome#11308](https://github.com/esphome/esphome/pull/11308) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [light] Clean up deprecated functions from 1.21 [esphome#11389](https://github.com/esphome/esphome/pull/11389) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [climate] Clean up deprecated functions from 1.20 [esphome#11388](https://github.com/esphome/esphome/pull/11388) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [nextion] Clean up deprecated code from 1.20 [esphome#11393](https://github.com/esphome/esphome/pull/11393) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- remove hexencode due 2022.1 deprecation [esphome#11383](https://github.com/esphome/esphome/pull/11383) by [@JuantAldea](https://github.com/JuantAldea) (breaking-change) +- [uponor_smatrix] Use combined 32 bit addresses instead of separate 16 bit system and device addresses [esphome#11066](https://github.com/esphome/esphome/pull/11066) by [@kroimon](https://github.com/kroimon) (breaking-change) +- [fan] Clean up deprecated code from 2022.2 [esphome#11392](https://github.com/esphome/esphome/pull/11392) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [cover] Clean up deprecated functions from 2021.9 [esphome#11391](https://github.com/esphome/esphome/pull/11391) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [epaper_spi] Fix busy pin logic [esphome#11349](https://github.com/esphome/esphome/pull/11349) by [@egalli-dev](https://github.com/egalli-dev) (breaking-change) +- [pipsolar] cleanup / refactoring [esphome#10291](https://github.com/esphome/esphome/pull/10291) by [@patagonaa](https://github.com/patagonaa) (breaking-change) +- [esp32] Add advanced options to disable unused VFS features (saves ~8.7 KB flash) [esphome#11441](https://github.com/esphome/esphome/pull/11441) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [event] Replace std::set with FixedVector for event type storage [esphome#11463](https://github.com/esphome/esphome/pull/11463) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [light] Store effect names in flash (const char*) to save RAM [esphome#11487](https://github.com/esphome/esphome/pull/11487) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [climate] Replace std::set with FiniteSetMask for trait storage [esphome#11466](https://github.com/esphome/esphome/pull/11466) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [http_request] Pass trigger variables into on_response/on_error [esphome#11464](https://github.com/esphome/esphome/pull/11464) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [select] Store options in flash to reduce RAM usage [esphome#11514](https://github.com/esphome/esphome/pull/11514) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [core] Remove deprecated schema constants [esphome#11591](https://github.com/esphome/esphome/pull/11591) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [remote_transmitter] Add non-blocking mode [esphome#11524](https://github.com/esphome/esphome/pull/11524) by [@swoboda1337](https://github.com/swoboda1337) (new-feature) (breaking-change) +- [core] .local addresses are only resolvable if mDNS is enabled [esphome#11508](https://github.com/esphome/esphome/pull/11508) by [@Links2004](https://github.com/Links2004) (breaking-change) +- [fan] Use std::vector for preset modes, preserve config order [esphome#11483](https://github.com/esphome/esphome/pull/11483) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [climate] Replace std::vector with const char* for custom fan modes and presets [esphome#11621](https://github.com/esphome/esphome/pull/11621) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [psram] Require mode for S3 [esphome#11470](https://github.com/esphome/esphome/pull/11470) by [@clydebarrow](https://github.com/clydebarrow) (breaking-change) +- [network] Store use_address in RODATA to save RAM [esphome#11707](https://github.com/esphome/esphome/pull/11707) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [fan] Remove duplicate preset mode storage to save RAM [esphome#11632](https://github.com/esphome/esphome/pull/11632) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [select] Refactor to index-based operations for immediate and future RAM savings [esphome#11623](https://github.com/esphome/esphome/pull/11623) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [core] Reduce action framework argument copies by 83% [esphome#11704](https://github.com/esphome/esphome/pull/11704) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [gdk101] Fix fw version reporting [esphome#11029](https://github.com/esphome/esphome/pull/11029) by [@Szewcson](https://github.com/Szewcson) (breaking-change) (new-platform) +- [event] Store event types in flash memory [esphome#11767](https://github.com/esphome/esphome/pull/11767) by [@bdraco](https://github.com/bdraco) (breaking-change) +- Updated AQI calculation for HM3301 to the new standard [esphome#9442](https://github.com/esphome/esphome/pull/9442) by [@optimusprimespace](https://github.com/optimusprimespace) (breaking-change) +- [core] Remove deprecated EntityBase::hash_base() method [esphome#11783](https://github.com/esphome/esphome/pull/11783) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [core] Implement Global Controller Registry to reduce RAM usage [esphome#11772](https://github.com/esphome/esphome/pull/11772) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [wifi][ethernet] Don't block setup until connected [esphome#9823](https://github.com/esphome/esphome/pull/9823) by [@clydebarrow](https://github.com/clydebarrow) (breaking-change) +- [wifi] Change priority type from float to int8_t [esphome#11830](https://github.com/esphome/esphome/pull/11830) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [wifi] Add min_auth_mode configuration option [esphome#11814](https://github.com/esphome/esphome/pull/11814) by [@bdraco](https://github.com/bdraco) (new-feature) (breaking-change) +- [network, psram, speaker wifi] Use CORE.data to enable high performance networking [esphome#11812](https://github.com/esphome/esphome/pull/11812) by [@kahrendt](https://github.com/kahrendt) (new-feature) (breaking-change) + +### All changes + +
+ + +- [ci] Reduce component test group size to prevent runner disk exhaustion [esphome#11121](https://github.com/esphome/esphome/pull/11121) by [@bdraco](https://github.com/bdraco) +- [ci] Reduce component test group size to 10 to prevent runner disk exhaustion [esphome#11122](https://github.com/esphome/esphome/pull/11122) by [@bdraco](https://github.com/bdraco) +- [esp32] Accept more framework URL schemes as sources [esphome#11125](https://github.com/esphome/esphome/pull/11125) by [@j9brown](https://github.com/j9brown) (new-feature) +- [stale] Increase operations-per-run [esphome#11135](https://github.com/esphome/esphome/pull/11135) by [@swoboda1337](https://github.com/swoboda1337) +- [esp32_ble_tracker] Replace std::vector with StaticVector for listeners and clients [esphome#11173](https://github.com/esphome/esphome/pull/11173) by [@bdraco](https://github.com/bdraco) +- [web_server] Consolidate duplicate client connection checks (saves 288 bytes of flash) [esphome#11116](https://github.com/esphome/esphome/pull/11116) by [@bdraco](https://github.com/bdraco) +- [web_server] Reduce code duplication in JSON generation with helper functions [esphome#11117](https://github.com/esphome/esphome/pull/11117) by [@bdraco](https://github.com/bdraco) +- [mdns] Conditionally store services to reduce RAM usage by 200-464 bytes [esphome#11180](https://github.com/esphome/esphome/pull/11180) by [@bdraco](https://github.com/bdraco) +- [core] Optimize looping_components_ with FixedVector to save flash [esphome#11183](https://github.com/esphome/esphome/pull/11183) by [@bdraco](https://github.com/bdraco) +- [core] Add make_name_with_suffix helper to optimize string concatenation [esphome#11176](https://github.com/esphome/esphome/pull/11176) by [@bdraco](https://github.com/bdraco) +- [http_request] Pass parameters by const reference to reduce flash usage [esphome#11184](https://github.com/esphome/esphome/pull/11184) by [@bdraco](https://github.com/bdraco) +- [socket] Split LWIP socket classes to reduce memory overhead on ESP8266/RP2040 [esphome#11172](https://github.com/esphome/esphome/pull/11172) by [@bdraco](https://github.com/bdraco) +- [esp32_ble] Replace handler vectors with StaticVector for 560B-2KB memory savings [esphome#11200](https://github.com/esphome/esphome/pull/11200) by [@bdraco](https://github.com/bdraco) +- [bluetooth_proxy] Use FixedVector for GATT characteristics and descriptors [esphome#11214](https://github.com/esphome/esphome/pull/11214) by [@bdraco](https://github.com/bdraco) +- [network] Optimize get_use_address() to return const reference instead of a copy [esphome#11218](https://github.com/esphome/esphome/pull/11218) by [@bdraco](https://github.com/bdraco) +- [docs] Add state management best practices to CLAUDE.md [esphome#11224](https://github.com/esphome/esphome/pull/11224) by [@bdraco](https://github.com/bdraco) +- [docs] Add embedded systems optimization best practices to AI instructions [esphome#11225](https://github.com/esphome/esphome/pull/11225) by [@bdraco](https://github.com/bdraco) +- Bump pillow to 11.3.0 [esphome#11239](https://github.com/esphome/esphome/pull/11239) by [@bdraco](https://github.com/bdraco) +- [netlify] Pin python version [esphome#11244](https://github.com/esphome/esphome/pull/11244) by [@jesserockz](https://github.com/jesserockz) +- [wifi] Free scan results memory after connection (saves up to 1.2KB RAM) [esphome#11205](https://github.com/esphome/esphome/pull/11205) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [core] Use FixedVector for automation condition vectors to save 384 bytes flash [esphome#11237](https://github.com/esphome/esphome/pull/11237) by [@bdraco](https://github.com/bdraco) +- [wifi] Use FixedVector for scan results to reduce flash usage [esphome#11216](https://github.com/esphome/esphome/pull/11216) by [@bdraco](https://github.com/bdraco) +- [web_server_idf] Use std::vector instead of std::set for SSE sessions [esphome#11233](https://github.com/esphome/esphome/pull/11233) by [@bdraco](https://github.com/bdraco) +- [light] Use FixedVector for LightState effects list [esphome#11232](https://github.com/esphome/esphome/pull/11232) by [@bdraco](https://github.com/bdraco) +- [api] Convert HomeassistantActionRequest vectors to FixedVector for flash savings [esphome#11229](https://github.com/esphome/esphome/pull/11229) by [@bdraco](https://github.com/bdraco) +- [mdns] Use FixedVector for txt_records to reduce flash usage [esphome#11228](https://github.com/esphome/esphome/pull/11228) by [@bdraco](https://github.com/bdraco) +- [core] Fix regression from #10654 [esphome#11248](https://github.com/esphome/esphome/pull/11248) by [@stuartparmenter](https://github.com/stuartparmenter) +- [const] Add CONF_ROWS [esphome#11249](https://github.com/esphome/esphome/pull/11249) by [@stuartparmenter](https://github.com/stuartparmenter) +- [ci] Group all PR builds, isolate direct changes for full validation on dev [esphome#11193](https://github.com/esphome/esphome/pull/11193) by [@bdraco](https://github.com/bdraco) +- [ci] Add Python 3.14 testing and streamline version matrix [esphome#11238](https://github.com/esphome/esphome/pull/11238) by [@bdraco](https://github.com/bdraco) +- [esp32_hosted] Bump hosted components [esphome#11170](https://github.com/esphome/esphome/pull/11170) by [@swoboda1337](https://github.com/swoboda1337) +- [esp32] Remove kconfiglib from requirements.txt [esphome#11210](https://github.com/esphome/esphome/pull/11210) by [@thanegill](https://github.com/thanegill) +- [esp32_rmt_led_strip] Don't send reset if duration is zero [esphome#11235](https://github.com/esphome/esphome/pull/11235) by [@swoboda1337](https://github.com/swoboda1337) +- [ci] Isolate openthread [esphome#11259](https://github.com/esphome/esphome/pull/11259) by [@swoboda1337](https://github.com/swoboda1337) +- [esp32] Bump IDF version to 5.5.1 and Arduino version to 3.3.2 [esphome#9839](https://github.com/esphome/esphome/pull/9839) by [@swoboda1337](https://github.com/swoboda1337) +- [esp32_ble] Add support for hosted BLE [esphome#11167](https://github.com/esphome/esphome/pull/11167) by [@swoboda1337](https://github.com/swoboda1337) (new-feature) +- [esp32] Add option to disable libc locks in IRAM, saving ~1.3KB RAM [esphome#10930](https://github.com/esphome/esphome/pull/10930) by [@bdraco](https://github.com/bdraco) (new-feature) (breaking-change) +- [api] Use FixedVector for ListEntitiesServicesResponse args [esphome#11230](https://github.com/esphome/esphome/pull/11230) by [@bdraco](https://github.com/bdraco) +- [api] Use std::unique_ptr for fixed-size byte buffers in Noise protocol [esphome#11278](https://github.com/esphome/esphome/pull/11278) by [@bdraco](https://github.com/bdraco) +- [api] Use FixedVector for HomeAssistantServiceCallAction to reduce flash usage and avoid realloc [esphome#11277](https://github.com/esphome/esphome/pull/11277) by [@bdraco](https://github.com/bdraco) +- [git] Automatically recover from broken git repositories in external_components [esphome#11246](https://github.com/esphome/esphome/pull/11246) by [@bdraco](https://github.com/bdraco) +- [api, climate, thermostat] Implement feature_flags for `climate` [esphome#10987](https://github.com/esphome/esphome/pull/10987) by [@kbx81](https://github.com/kbx81) +- [i2s_audio] Refactor to use CORE.data instead of module-level globals [esphome#11223](https://github.com/esphome/esphome/pull/11223) by [@bdraco](https://github.com/bdraco) +- [esp32_ble] Refactor to use CORE.data instead of module-level globals [esphome#11222](https://github.com/esphome/esphome/pull/11222) by [@bdraco](https://github.com/bdraco) +- [esp32_ble_tracker] Refactor to use CORE.data instead of module-level globals [esphome#11220](https://github.com/esphome/esphome/pull/11220) by [@bdraco](https://github.com/bdraco) +- [api] Use FixedVector for ExecuteServiceRequest/Argument arrays to eliminate reallocations [esphome#11270](https://github.com/esphome/esphome/pull/11270) by [@bdraco](https://github.com/bdraco) +- [ci] Merge components with different buses to reduce CI time [esphome#11251](https://github.com/esphome/esphome/pull/11251) by [@bdraco](https://github.com/bdraco) +- [esp32] Reduce tx power on IDF in the event of a brownout [esphome#11306](https://github.com/esphome/esphome/pull/11306) by [@swoboda1337](https://github.com/swoboda1337) (breaking-change) +- [ina2xx_base] add device reset-on-boot disablement option [esphome#10787](https://github.com/esphome/esphome/pull/10787) by [@joshuaboniface](https://github.com/joshuaboniface) (new-feature) +- [tests] Fix ESP32-C3 component test binary size by using larger partition table [esphome#11319](https://github.com/esphome/esphome/pull/11319) by [@bdraco](https://github.com/bdraco) +- Synchronise Device Classes from Home Assistant [esphome#11285](https://github.com/esphome/esphome/pull/11285) by [@esphomebot](https://github.com/esphomebot) +- [toshiba] Add support for RAS-2819T air conditioner [esphome#9490](https://github.com/esphome/esphome/pull/9490) by [@exotime](https://github.com/exotime) (new-feature) +- [cap1188] remove delays in setup [esphome#11317](https://github.com/esphome/esphome/pull/11317) by [@mrtoy-me](https://github.com/mrtoy-me) +- [nrf52] add xiao_ble board [esphome#10698](https://github.com/esphome/esphome/pull/10698) by [@tomaszduda23](https://github.com/tomaszduda23) (breaking-change) +- [bh1900nux] Add bh1900nux temperature Sensor [esphome#8631](https://github.com/esphome/esphome/pull/8631) by [@B48D81EFCC](https://github.com/B48D81EFCC) (new-component) (new-feature) (new-platform) +- [debug] Replace std::map with struct array for ESP32 chip features [esphome#11307](https://github.com/esphome/esphome/pull/11307) by [@bdraco](https://github.com/bdraco) +- [tests] Add i2c_id to mcp47a1 & mcp4725 and remove from isolation [esphome#11324](https://github.com/esphome/esphome/pull/11324) by [@swoboda1337](https://github.com/swoboda1337) +- [ci] Fix test_build_components missing test files with hyphen naming pattern [esphome#11329](https://github.com/esphome/esphome/pull/11329) by [@bdraco](https://github.com/bdraco) +- [xgzp68xx] Add oversampling config and tidy up implementation. [esphome#10306](https://github.com/esphome/esphome/pull/10306) by [@ned14](https://github.com/ned14) (new-feature) +- [remote_base] Add Symphony IR protocol (encode/decode) with command_repeats support [esphome#10777](https://github.com/esphome/esphome/pull/10777) by [@leodrivera](https://github.com/leodrivera) (new-feature) +- [tests] Migrate remote_transmitter/receiver to common bus definitions [esphome#11325](https://github.com/esphome/esphome/pull/11325) by [@bdraco](https://github.com/bdraco) +- [tests] Remove superfluous else-blocks from lambdas [esphome#11322](https://github.com/esphome/esphome/pull/11322) by [@JuantAldea](https://github.com/JuantAldea) +- [total_daily_energy] Fix ID conflicts in component test configuration [esphome#11337](https://github.com/esphome/esphome/pull/11337) by [@bdraco](https://github.com/bdraco) +- [thermostat] Add humidity support [esphome#11286](https://github.com/esphome/esphome/pull/11286) by [@kbx81](https://github.com/kbx81) (new-feature) +- [api] Update to use new climate API [esphome#11357](https://github.com/esphome/esphome/pull/11357) by [@kbx81](https://github.com/kbx81) +- [web_server] Update to use new climate API [esphome#11363](https://github.com/esphome/esphome/pull/11363) by [@kbx81](https://github.com/kbx81) +- [mqtt] Update to use new climate API [esphome#11360](https://github.com/esphome/esphome/pull/11360) by [@kbx81](https://github.com/kbx81) +- [prometheus] Update to use new climate API [esphome#11361](https://github.com/esphome/esphome/pull/11361) by [@kbx81](https://github.com/kbx81) +- [nrf52] fix task names in logs [esphome#11367](https://github.com/esphome/esphome/pull/11367) by [@tomaszduda23](https://github.com/tomaszduda23) +- [nrf52, ble_nus] add logging over BLE [esphome#9846](https://github.com/esphome/esphome/pull/9846) by [@tomaszduda23](https://github.com/tomaszduda23) (new-component) (new-feature) +- make types sensors_t and sensor_type_t internal to StatsdComponent [esphome#11345](https://github.com/esphome/esphome/pull/11345) by [@JuantAldea](https://github.com/JuantAldea) +- [api][time] Refactor timezone update logic for cleaner code [esphome#11327](https://github.com/esphome/esphome/pull/11327) by [@bdraco](https://github.com/bdraco) +- [scheduler] Replace defer queue deque with vector to avoid 512-byte upfront allocation [esphome#11305](https://github.com/esphome/esphome/pull/11305) by [@bdraco](https://github.com/bdraco) +- [ci] Add automated memory impact analysis for pull requests [esphome#11242](https://github.com/esphome/esphome/pull/11242) by [@bdraco](https://github.com/bdraco) +- [light] Use bitmask instead of std::set for color modes [esphome#11348](https://github.com/esphome/esphome/pull/11348) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [esp32_ble_client] Remove duplicate MAC address extraction in set_address() [esphome#11358](https://github.com/esphome/esphome/pull/11358) by [@bdraco](https://github.com/bdraco) +- [wifi] Replace std::vector with std::unique_ptr for WiFi scan buffer [esphome#11364](https://github.com/esphome/esphome/pull/11364) by [@bdraco](https://github.com/bdraco) +- [bluetooth_proxy] Merge duplicate loops in get_connection_() [esphome#11359](https://github.com/esphome/esphome/pull/11359) by [@bdraco](https://github.com/bdraco) +- [mdns] Use std::unique_ptr for TXT records to reduce ESP32 flash usage [esphome#11362](https://github.com/esphome/esphome/pull/11362) by [@bdraco](https://github.com/bdraco) +- [sensor] Optimize sliding window filters to eliminate heap fragmentation [esphome#11282](https://github.com/esphome/esphome/pull/11282) by [@bdraco](https://github.com/bdraco) +- [mqtt] Reduce flash usage by optimizing ArduinoJson assignments [esphome#11340](https://github.com/esphome/esphome/pull/11340) by [@bdraco](https://github.com/bdraco) +- [wifi] Optimize WiFi scanning to reduce copies and heap allocations [esphome#11323](https://github.com/esphome/esphome/pull/11323) by [@bdraco](https://github.com/bdraco) +- [script] Fix unbounded queue growth, optimize queued mode (default max_runs=5) [esphome#11308](https://github.com/esphome/esphome/pull/11308) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [wifi] Convert fast_connect to compile-time define, save 156-1024 bytes flash [esphome#11328](https://github.com/esphome/esphome/pull/11328) by [@bdraco](https://github.com/bdraco) +- [wifi] Optimize WiFi scan results with in-place construction [esphome#11330](https://github.com/esphome/esphome/pull/11330) by [@bdraco](https://github.com/bdraco) +- Migrate from hexencode() to format_hex_pretty() in Kuntze component [esphome#11372](https://github.com/esphome/esphome/pull/11372) by [@JuantAldea](https://github.com/JuantAldea) +- [substitutions] !extend and !remove now support substitutions and jinja [esphome#11203](https://github.com/esphome/esphome/pull/11203) by [@jpeletier](https://github.com/jpeletier) (new-feature) +- [light] Clean up deprecated functions from 1.21 [esphome#11389](https://github.com/esphome/esphome/pull/11389) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [climate] Clean up deprecated functions from 1.20 [esphome#11388](https://github.com/esphome/esphome/pull/11388) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [nextion] Clean up deprecated code from 1.20 [esphome#11393](https://github.com/esphome/esphome/pull/11393) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [ci] Fix memory impact analysis failing on fork PRs [esphome#11380](https://github.com/esphome/esphome/pull/11380) by [@bdraco](https://github.com/bdraco) +- remove hexencode due 2022.1 deprecation [esphome#11383](https://github.com/esphome/esphome/pull/11383) by [@JuantAldea](https://github.com/JuantAldea) (breaking-change) +- [substitutions] Recursive substitutions and better jinja error handling and debug help [esphome#10806](https://github.com/esphome/esphome/pull/10806) by [@jpeletier](https://github.com/jpeletier) +- [cli] Add `analyze-memory` command [esphome#11395](https://github.com/esphome/esphome/pull/11395) by [@bdraco](https://github.com/bdraco) (new-feature) +- [ci] Fix fork PR workflow failing to find PRs from forks [esphome#11396](https://github.com/esphome/esphome/pull/11396) by [@bdraco](https://github.com/bdraco) +- [nrf52] add missing defines for tests [esphome#11384](https://github.com/esphome/esphome/pull/11384) by [@tomaszduda23](https://github.com/tomaszduda23) +- [uponor_smatrix] Use combined 32 bit addresses instead of separate 16 bit system and device addresses [esphome#11066](https://github.com/esphome/esphome/pull/11066) by [@kroimon](https://github.com/kroimon) (breaking-change) +- [fan] Clean up deprecated code from 2022.2 [esphome#11392](https://github.com/esphome/esphome/pull/11392) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [mipi_rgb] Add Waveshare 5" 1024x600 [esphome#11206](https://github.com/esphome/esphome/pull/11206) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- [ci] Skip memory analysis when only Python/config files change in core [esphome#11397](https://github.com/esphome/esphome/pull/11397) by [@bdraco](https://github.com/bdraco) +- [climate] Add basic compile tests for climate component [esphome#11404](https://github.com/esphome/esphome/pull/11404) by [@bdraco](https://github.com/bdraco) +- [tests] Fix flaky test_noise_corrupt_encrypted_frame integration test [esphome#11405](https://github.com/esphome/esphome/pull/11405) by [@bdraco](https://github.com/bdraco) +- [esp32][ci] Fix IRAM overflow in grouped component tests for ESP32-IDF [esphome#11386](https://github.com/esphome/esphome/pull/11386) by [@bdraco](https://github.com/bdraco) +- [cover] Clean up deprecated functions from 2021.9 [esphome#11391](https://github.com/esphome/esphome/pull/11391) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- MQTT Light - Min/Max Color Temperature [esphome#11103](https://github.com/esphome/esphome/pull/11103) by [@cram42](https://github.com/cram42) +- [climate] First pass at some optimization [esphome#11366](https://github.com/esphome/esphome/pull/11366) by [@kbx81](https://github.com/kbx81) +- [esp32_improv]: add next_url support for WiFi provisioning [esphome#10757](https://github.com/esphome/esphome/pull/10757) by [@amankrokx](https://github.com/amankrokx) (new-feature) +- [epaper_spi] Fix busy pin logic [esphome#11349](https://github.com/esphome/esphome/pull/11349) by [@egalli-dev](https://github.com/egalli-dev) (breaking-change) +- [climate] Migrate components to the new API [esphome#11369](https://github.com/esphome/esphome/pull/11369) by [@JuantAldea](https://github.com/JuantAldea) +- [bang_bang] Various clean-up [esphome#11356](https://github.com/esphome/esphome/pull/11356) by [@kbx81](https://github.com/kbx81) +- [espnow] Add transport platform for packet_transport [esphome#11025](https://github.com/esphome/esphome/pull/11025) by [@EasilyBoredEngineer](https://github.com/EasilyBoredEngineer) (new-feature) (new-platform) +- [pipsolar] cleanup / refactoring [esphome#10291](https://github.com/esphome/esphome/pull/10291) by [@patagonaa](https://github.com/patagonaa) (breaking-change) +- [json] Add basic compile tests [esphome#11409](https://github.com/esphome/esphome/pull/11409) by [@bdraco](https://github.com/bdraco) +- Add tests for FilterOutValueFilter and ThrottleWithPriorityFilter [esphome#11408](https://github.com/esphome/esphome/pull/11408) by [@bdraco](https://github.com/bdraco) +- [esp32] Automatic CONFIG_LWIP_MAX_SOCKETS configuration based on component needs [esphome#11378](https://github.com/esphome/esphome/pull/11378) by [@bdraco](https://github.com/bdraco) +- [sensor] Optimize filter memory usage with ValueListFilter base class [esphome#11407](https://github.com/esphome/esphome/pull/11407) by [@bdraco](https://github.com/bdraco) +- [esp32_improv, improv_base] Reduce flash usage by 352 bytes [esphome#11406](https://github.com/esphome/esphome/pull/11406) by [@bdraco](https://github.com/bdraco) +- [esp32_hosted] Bump esp hosted to 2.6.1 [esphome#11414](https://github.com/esphome/esphome/pull/11414) by [@swoboda1337](https://github.com/swoboda1337) +- [ci] Optimize clang-tidy for small PRs by avoiding unnecessary job spitting [esphome#11402](https://github.com/esphome/esphome/pull/11402) by [@bdraco](https://github.com/bdraco) +- [ci] Prefer platform-specific tests for memory impact analysis [esphome#11398](https://github.com/esphome/esphome/pull/11398) by [@bdraco](https://github.com/bdraco) +- Add basic text_sensor tests [esphome#11424](https://github.com/esphome/esphome/pull/11424) by [@bdraco](https://github.com/bdraco) +- ESP8266: Complete testing mode memory patches with DRAM and Flash [esphome#11427](https://github.com/esphome/esphome/pull/11427) by [@bdraco](https://github.com/bdraco) +- [ci] Fix clang-tidy split decision to account for component dependencies [esphome#11430](https://github.com/esphome/esphome/pull/11430) by [@bdraco](https://github.com/bdraco) +- [core] Add support for extern "C" includes [esphome#11422](https://github.com/esphome/esphome/pull/11422) by [@swoboda1337](https://github.com/swoboda1337) +- [sensor,text_sensor,binary_sensor] Optimize filter parameters with std::initializer_list [esphome#11426](https://github.com/esphome/esphome/pull/11426) by [@bdraco](https://github.com/bdraco) +- [ci] Fix memory impact workflow for new components [esphome#11421](https://github.com/esphome/esphome/pull/11421) by [@bdraco](https://github.com/bdraco) +- [text_sensor] Optimize filters with FixedVector (1.6KB flash savings) [esphome#11423](https://github.com/esphome/esphome/pull/11423) by [@bdraco](https://github.com/bdraco) +- [improv] Put next_url behind defines to save flash [esphome#11420](https://github.com/esphome/esphome/pull/11420) by [@jesserockz](https://github.com/jesserockz) +- [core] Optimize automation actions memory usage with std::initializer_list [esphome#11433](https://github.com/esphome/esphome/pull/11433) by [@bdraco](https://github.com/bdraco) +- [espnow] Fix compilation error with initializer_list after #11433 [esphome#11436](https://github.com/esphome/esphome/pull/11436) by [@bdraco](https://github.com/bdraco) +- [analyze-memory] Improve symbol categorization accuracy [esphome#11440](https://github.com/esphome/esphome/pull/11440) by [@bdraco](https://github.com/bdraco) +- Add additional sensor filter tests [esphome#11438](https://github.com/esphome/esphome/pull/11438) by [@bdraco](https://github.com/bdraco) +- [ci] Fix clang-tidy split mode for core file changes [esphome#11434](https://github.com/esphome/esphome/pull/11434) by [@bdraco](https://github.com/bdraco) +- [climate] Add some integration tests [esphome#11439](https://github.com/esphome/esphome/pull/11439) by [@kbx81](https://github.com/kbx81) +- [sensor] Optimize calibration and Or filters with FixedVector [esphome#11437](https://github.com/esphome/esphome/pull/11437) by [@bdraco](https://github.com/bdraco) +- [binary_sensor] Add compile test for auto repeat [esphome#11443](https://github.com/esphome/esphome/pull/11443) by [@bdraco](https://github.com/bdraco) +- [binary_sensor] Optimize AutorepeatFilter with FixedVector [esphome#11444](https://github.com/esphome/esphome/pull/11444) by [@bdraco](https://github.com/bdraco) +- [climate] Remove unnecessary vector allocations in state save/restore [esphome#11445](https://github.com/esphome/esphome/pull/11445) by [@bdraco](https://github.com/bdraco) +- [sensor] Add optimistic option to heartbeat filter [esphome#10993](https://github.com/esphome/esphome/pull/10993) by [@pkejval](https://github.com/pkejval) (new-feature) +- [light] Decouple AddressableLight and Light transition classes [esphome#11166](https://github.com/esphome/esphome/pull/11166) by [@j9brown](https://github.com/j9brown) +- Add gpio switch interlock compile tests [esphome#11449](https://github.com/esphome/esphome/pull/11449) by [@bdraco](https://github.com/bdraco) +- [CI] Add auto label for chained PRs [esphome#11457](https://github.com/esphome/esphome/pull/11457) by [@jesserockz](https://github.com/jesserockz) +- [light] Add tests for AddressableColorWipeEffectColor/StrobeLightEffectColor [esphome#11456](https://github.com/esphome/esphome/pull/11456) by [@bdraco](https://github.com/bdraco) +- Add compile tests for binary_sensor MultiClickTrigger [esphome#11454](https://github.com/esphome/esphome/pull/11454) by [@bdraco](https://github.com/bdraco) +- [gpio] Optimize switch interlock with FixedVector [esphome#11448](https://github.com/esphome/esphome/pull/11448) by [@bdraco](https://github.com/bdraco) +- [esp32] Add advanced options to disable unused VFS features (saves ~8.7 KB flash) [esphome#11441](https://github.com/esphome/esphome/pull/11441) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [light] Improve gamma correction precision [esphome#11141](https://github.com/esphome/esphome/pull/11141) by [@j9brown](https://github.com/j9brown) +- C++ components unit test framework [esphome#9284](https://github.com/esphome/esphome/pull/9284) by [@jpeletier](https://github.com/jpeletier) +- [light] Replace std::vector with FixedVector in strobe and color_wipe effects [esphome#11455](https://github.com/esphome/esphome/pull/11455) by [@bdraco](https://github.com/bdraco) +- [core] Stop clang-format "fixing" a single line [esphome#11462](https://github.com/esphome/esphome/pull/11462) by [@jesserockz](https://github.com/jesserockz) +- [api] Allow clearing noise psk if dynamically set [esphome#11429](https://github.com/esphome/esphome/pull/11429) by [@jesserockz](https://github.com/jesserockz) +- [binary_sensor] Optimize MultiClickTrigger with FixedVector [esphome#11453](https://github.com/esphome/esphome/pull/11453) by [@bdraco](https://github.com/bdraco) +- [wifi] Test multiple stas in wifi compile tests [esphome#11460](https://github.com/esphome/esphome/pull/11460) by [@bdraco](https://github.com/bdraco) +- [event] Replace std::set with FixedVector for event type storage [esphome#11463](https://github.com/esphome/esphome/pull/11463) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [CI] Fix component detection when core files change in determine-jobs [esphome#11461](https://github.com/esphome/esphome/pull/11461) by [@bdraco](https://github.com/bdraco) +- [light] Add compile test for addressable lights [esphome#11465](https://github.com/esphome/esphome/pull/11465) by [@bdraco](https://github.com/bdraco) +- [wifi] Optimize WiFi network storage with FixedVector [esphome#11458](https://github.com/esphome/esphome/pull/11458) by [@bdraco](https://github.com/bdraco) +- [climate] Fix restore state for fan mode, preset, and swing mode [esphome#11126](https://github.com/esphome/esphome/pull/11126) by [@j9brown](https://github.com/j9brown) +- [light] Eliminate dimming undershoot during addressable light transition [esphome#11471](https://github.com/esphome/esphome/pull/11471) by [@j9brown](https://github.com/j9brown) +- [ci] Fix test detection for components with only variant tests [esphome#11474](https://github.com/esphome/esphome/pull/11474) by [@bdraco](https://github.com/bdraco) +- [ci] Fix component splitter for components with only variant tests [esphome#11476](https://github.com/esphome/esphome/pull/11476) by [@bdraco](https://github.com/bdraco) +- [esp32] Set the location of the IDF component manager cache [esphome#11467](https://github.com/esphome/esphome/pull/11467) by [@swoboda1337](https://github.com/swoboda1337) +- [ci] Fix WiFi testing mode validation and component splitter for variant-only tests [esphome#11481](https://github.com/esphome/esphome/pull/11481) by [@bdraco](https://github.com/bdraco) +- [openthread] Fix OTA by populating CORE.address with device's mDNS address [esphome#11095](https://github.com/esphome/esphome/pull/11095) by [@danstiner](https://github.com/danstiner) (new-feature) +- [fan] Add basic fan compile tests [esphome#11484](https://github.com/esphome/esphome/pull/11484) by [@bdraco](https://github.com/bdraco) +- [nrf52] support BLE --device for logging [esphome#9861](https://github.com/esphome/esphome/pull/9861) by [@tomaszduda23](https://github.com/tomaszduda23) (new-feature) +- [light] Store effect names in flash (const char*) to save RAM [esphome#11487](https://github.com/esphome/esphome/pull/11487) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [light] Use std::initializer_list for add_effects to reduce flash overhead [esphome#11485](https://github.com/esphome/esphome/pull/11485) by [@bdraco](https://github.com/bdraco) +- [light] Extract ColorModeMask into generic FiniteSetMask helper [esphome#11472](https://github.com/esphome/esphome/pull/11472) by [@bdraco](https://github.com/bdraco) +- [improv_serial] Various optimizations [esphome#11473](https://github.com/esphome/esphome/pull/11473) by [@kbx81](https://github.com/kbx81) +- [hdc2010] New component [esphome#6674](https://github.com/esphome/esphome/pull/6674) by [@optimusprimespace](https://github.com/optimusprimespace) (new-component) (new-feature) (new-platform) +- [api] Fix clang-tidy modernize-use-emplace warning for light effects [esphome#11490](https://github.com/esphome/esphome/pull/11490) by [@bdraco](https://github.com/bdraco) +- [ethernet] Add RMII GPIO pin conflict validation [esphome#11488](https://github.com/esphome/esphome/pull/11488) by [@bdraco](https://github.com/bdraco) +- [scheduler] Remove unused deque include after defer queue optimization [esphome#11491](https://github.com/esphome/esphome/pull/11491) by [@bdraco](https://github.com/bdraco) +- [pipsolar] improve sensor readout in HA, set unknown state on timeout / error [esphome#10292](https://github.com/esphome/esphome/pull/10292) by [@patagonaa](https://github.com/patagonaa) +- [tests] Isolate gps component to prevent TinyGPSPlus millis() conflicts [esphome#11499](https://github.com/esphome/esphome/pull/11499) by [@bdraco](https://github.com/bdraco) +- [core][sensor] Eliminate redundant default value setters in generated code [esphome#11495](https://github.com/esphome/esphome/pull/11495) by [@bdraco](https://github.com/bdraco) +- [http_request] Pass collect_headers by const reference instead of by value [esphome#11494](https://github.com/esphome/esphome/pull/11494) by [@bdraco](https://github.com/bdraco) +- [remote_transmitter] Remove delays and use RMT instead [esphome#11505](https://github.com/esphome/esphome/pull/11505) by [@swoboda1337](https://github.com/swoboda1337) +- [esp32] Add IDF 5.4.3 to platform list and switch to tar.xz [esphome#11528](https://github.com/esphome/esphome/pull/11528) by [@swoboda1337](https://github.com/swoboda1337) +- [sntp] Replace std::vector with std::array to save heap memory [esphome#11525](https://github.com/esphome/esphome/pull/11525) by [@bdraco](https://github.com/bdraco) +- [gpio] Skip set_inverted() call for default false value [esphome#11538](https://github.com/esphome/esphome/pull/11538) by [@bdraco](https://github.com/bdraco) +- [core] Don't allow python 3.14 [esphome#11527](https://github.com/esphome/esphome/pull/11527) by [@swoboda1337](https://github.com/swoboda1337) +- Optimize stateless lambdas to use function pointers [esphome#11551](https://github.com/esphome/esphome/pull/11551) by [@bdraco](https://github.com/bdraco) +- [substitutions] fix #11077 Preserve ESPHomeDatabase (document metadata) in substitutions [esphome#11087](https://github.com/esphome/esphome/pull/11087) by [@jpeletier](https://github.com/jpeletier) +- [network] Eliminate runtime string parsing for IP address initialization [esphome#11561](https://github.com/esphome/esphome/pull/11561) by [@bdraco](https://github.com/bdraco) +- [api] Register user services with initializer_list [esphome#11545](https://github.com/esphome/esphome/pull/11545) by [@bdraco](https://github.com/bdraco) +- [light] Optimize LambdaLightEffect and AddressableLambdaLightEffect with function pointers [esphome#11556](https://github.com/esphome/esphome/pull/11556) by [@bdraco](https://github.com/bdraco) +- [core] Optimize TemplatableValue to use function pointers for stateless lambdas [esphome#11554](https://github.com/esphome/esphome/pull/11554) by [@bdraco](https://github.com/bdraco) +- [template] Optimize all template platforms to use function pointers for stateless lambdas [esphome#11555](https://github.com/esphome/esphome/pull/11555) by [@bdraco](https://github.com/bdraco) +- [api] Use FixedVector const references for service array arguments [esphome#11546](https://github.com/esphome/esphome/pull/11546) by [@bdraco](https://github.com/bdraco) +- [core] Simplify ESPTime::strftime() and save 20 bytes flash [esphome#11539](https://github.com/esphome/esphome/pull/11539) by [@bdraco](https://github.com/bdraco) +- [number] Skip set_mode call when using default AUTO mode [esphome#11537](https://github.com/esphome/esphome/pull/11537) by [@bdraco](https://github.com/bdraco) +- [template] Store initial option as index in template select [esphome#11523](https://github.com/esphome/esphome/pull/11523) by [@bdraco](https://github.com/bdraco) +- fix: load_cert_chain requires the path, not a file object [esphome#11543](https://github.com/esphome/esphome/pull/11543) by [@waza-ari](https://github.com/waza-ari) +- [tuya] allow enum for eco id [esphome#11544](https://github.com/esphome/esphome/pull/11544) by [@ssieb](https://github.com/ssieb) +- [nextion] Remove TFT upload baud rate validation to reduce flash usage [esphome#11012](https://github.com/esphome/esphome/pull/11012) by [@edwardtfn](https://github.com/edwardtfn) +- [nextion] Add `set_component_visibility()` method for dynamic visibility control [esphome#11530](https://github.com/esphome/esphome/pull/11530) by [@edwardtfn](https://github.com/edwardtfn) +- [remote_base] add support for Dyson cool AM07 tower fan [esphome#10163](https://github.com/esphome/esphome/pull/10163) by [@aanban](https://github.com/aanban) (new-feature) +- Additional tests for ble_client lambdas [esphome#11565](https://github.com/esphome/esphome/pull/11565) by [@bdraco](https://github.com/bdraco) +- Add additional modbus compile tests [esphome#11567](https://github.com/esphome/esphome/pull/11567) by [@bdraco](https://github.com/bdraco) +- [http_request] update timeout to be uint32_t [esphome#11577](https://github.com/esphome/esphome/pull/11577) by [@rwrozelle](https://github.com/rwrozelle) +- Add additional uart test coverage [esphome#11571](https://github.com/esphome/esphome/pull/11571) by [@bdraco](https://github.com/bdraco) +- [esp32_ble_server][esp32_improv] Eliminate unnecessary heap allocations [esphome#11569](https://github.com/esphome/esphome/pull/11569) by [@bdraco](https://github.com/bdraco) +- [modbus_controller] Optimize lambdas to use function pointers instead of std::function [esphome#11566](https://github.com/esphome/esphome/pull/11566) by [@bdraco](https://github.com/bdraco) +- [ci] Remove base bus components exclusion from memory impact analysis [esphome#11572](https://github.com/esphome/esphome/pull/11572) by [@bdraco](https://github.com/bdraco) +- [ble_client] Use function pointers for lambda actions and sensors [esphome#11564](https://github.com/esphome/esphome/pull/11564) by [@bdraco](https://github.com/bdraco) +- [climate] Replace std::set with FiniteSetMask for trait storage [esphome#11466](https://github.com/esphome/esphome/pull/11466) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [uart] Optimize UART components to eliminate temporary vector allocations [esphome#11570](https://github.com/esphome/esphome/pull/11570) by [@bdraco](https://github.com/bdraco) +- [packages] Tighten package validation [esphome#11584](https://github.com/esphome/esphome/pull/11584) by [@jpeletier](https://github.com/jpeletier) +- [http_request] Pass trigger variables into on_response/on_error [esphome#11464](https://github.com/esphome/esphome/pull/11464) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [ci] Change upper Python version being tested to 3.13 [esphome#11587](https://github.com/esphome/esphome/pull/11587) by [@bdraco](https://github.com/bdraco) +- template_alarm_control_panel cleanups [esphome#11469](https://github.com/esphome/esphome/pull/11469) by [@warthog618](https://github.com/warthog618) +- [ci] Fix auto labeller workflow with wrong comment for too-big with labels [esphome#11592](https://github.com/esphome/esphome/pull/11592) by [@jesserockz](https://github.com/jesserockz) +- [logger] Improve level validation errors [esphome#11589](https://github.com/esphome/esphome/pull/11589) by [@jesserockz](https://github.com/jesserockz) +- [fan] Remove deprecated `set_speed` function [esphome#11590](https://github.com/esphome/esphome/pull/11590) by [@jesserockz](https://github.com/jesserockz) +- [select] Store options in flash to reduce RAM usage [esphome#11514](https://github.com/esphome/esphome/pull/11514) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [ci] Fix component tests not running when only test files change [esphome#11580](https://github.com/esphome/esphome/pull/11580) by [@bdraco](https://github.com/bdraco) +- template_alarm_control_panel readability improvements [esphome#11593](https://github.com/esphome/esphome/pull/11593) by [@warthog618](https://github.com/warthog618) +- [core] Remove deprecated schema constants [esphome#11591](https://github.com/esphome/esphome/pull/11591) by [@jesserockz](https://github.com/jesserockz) (breaking-change) +- [remote_transmitter] Add non-blocking mode [esphome#11524](https://github.com/esphome/esphome/pull/11524) by [@swoboda1337](https://github.com/swoboda1337) (new-feature) (breaking-change) +- [core] Fix substitution id redefinition false positive [esphome#11603](https://github.com/esphome/esphome/pull/11603) by [@jpeletier](https://github.com/jpeletier) +- [lvgl] fix typo from previous refactor [esphome#11596](https://github.com/esphome/esphome/pull/11596) by [@stuartparmenter](https://github.com/stuartparmenter) +- [lvgl] memset canvas buffer to prevent display of random garbage [esphome#11582](https://github.com/esphome/esphome/pull/11582) by [@stuartparmenter](https://github.com/stuartparmenter) +- [ci] Restore parallel execution for clang-tidy split mode [esphome#11613](https://github.com/esphome/esphome/pull/11613) by [@bdraco](https://github.com/bdraco) +- [ci] Consolidate component splitting into determine-jobs [esphome#11614](https://github.com/esphome/esphome/pull/11614) by [@bdraco](https://github.com/bdraco) +- [gpio] Skip set_use_interrupt call when using default value [esphome#11612](https://github.com/esphome/esphome/pull/11612) by [@bdraco](https://github.com/bdraco) +- [template] Eliminate optional wrapper to save 4 bytes RAM per instance [esphome#11610](https://github.com/esphome/esphome/pull/11610) by [@bdraco](https://github.com/bdraco) +- [e131] Replace std::set with std::vector to reduce flash usage [esphome#11598](https://github.com/esphome/esphome/pull/11598) by [@bdraco](https://github.com/bdraco) +- [core] .local addresses are only resolvable if mDNS is enabled [esphome#11508](https://github.com/esphome/esphome/pull/11508) by [@Links2004](https://github.com/Links2004) (breaking-change) +- [substitutions] fix jinja parsing strings that look like sets as sets [esphome#11611](https://github.com/esphome/esphome/pull/11611) by [@jpeletier](https://github.com/jpeletier) +- [automations] Update error message [esphome#11640](https://github.com/esphome/esphome/pull/11640) by [@clydebarrow](https://github.com/clydebarrow) +- [ruff] Remove deprecated UP038 rule from ignore list [esphome#11646](https://github.com/esphome/esphome/pull/11646) by [@bdraco](https://github.com/bdraco) +- [lvgl] Trigger improvements and additions [esphome#11628](https://github.com/esphome/esphome/pull/11628) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- [cpp_generator] Align isinstance() with codebase style (tuple vs PEP 604) [esphome#11645](https://github.com/esphome/esphome/pull/11645) by [@bdraco](https://github.com/bdraco) +- [json] Fix component test compilation errors [esphome#11647](https://github.com/esphome/esphome/pull/11647) by [@bdraco](https://github.com/bdraco) +- [nrf52] fix compilation warning [esphome#11656](https://github.com/esphome/esphome/pull/11656) by [@tomaszduda23](https://github.com/tomaszduda23) +- [core] Remove redundant fd bounds check in yield_with_select_() [esphome#11666](https://github.com/esphome/esphome/pull/11666) by [@bdraco](https://github.com/bdraco) +- [api] Remove unnecessary intermediate variable in frame helpers [esphome#11668](https://github.com/esphome/esphome/pull/11668) by [@bdraco](https://github.com/bdraco) +- Add basic tests for web_server_idf [esphome#11659](https://github.com/esphome/esphome/pull/11659) by [@bdraco](https://github.com/bdraco) +- add integration test for script re-entry argument issue [esphome#11652](https://github.com/esphome/esphome/pull/11652) by [@afflux](https://github.com/afflux) +- [nextion] Send `auto_wake_on_touch` as part of startup commands on loop [esphome#11670](https://github.com/esphome/esphome/pull/11670) by [@edwardtfn](https://github.com/edwardtfn) +- ESP32 Pin loopTask to CORE 1 [esphome#11669](https://github.com/esphome/esphome/pull/11669) by [@glmnet](https://github.com/glmnet) +- [nrf52,gpio] switch input gpio to polling mode [esphome#11664](https://github.com/esphome/esphome/pull/11664) by [@tomaszduda23](https://github.com/tomaszduda23) +- [nrf52] enable nrf52 test [esphome#11379](https://github.com/esphome/esphome/pull/11379) by [@tomaszduda23](https://github.com/tomaszduda23) +- Enable IPv6 for host [esphome#11630](https://github.com/esphome/esphome/pull/11630) by [@HeMan](https://github.com/HeMan) +- Use lists inits initialization instead of std::fill [esphome#11532](https://github.com/esphome/esphome/pull/11532) by [@JuantAldea](https://github.com/JuantAldea) +- [nrf52, zigbee] OnlyWith support list of components [esphome#11533](https://github.com/esphome/esphome/pull/11533) by [@tomaszduda23](https://github.com/tomaszduda23) +- actions: fix loop re-entry [esphome#7972](https://github.com/esphome/esphome/pull/7972) by [@afflux](https://github.com/afflux) +- [component] Add is_idle method and condition [esphome#11651](https://github.com/esphome/esphome/pull/11651) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- [font][image] Use ESPHome urls for remote images [esphome#11675](https://github.com/esphome/esphome/pull/11675) by [@clydebarrow](https://github.com/clydebarrow) +- [esphome][ota] Add write_byte_() helper to reduce code duplication [esphome#11511](https://github.com/esphome/esphome/pull/11511) by [@bdraco](https://github.com/bdraco) +- [esp32_ble] Optimize loop() to reduce flash usage by ~104 bytes [esphome#11627](https://github.com/esphome/esphome/pull/11627) by [@bdraco](https://github.com/bdraco) +- [ble_client] Fix premature disconnections by reading characteristics immediately after service discovery [esphome#11410](https://github.com/esphome/esphome/pull/11410) by [@bdraco](https://github.com/bdraco) +- Add action continuation tests [esphome#11674](https://github.com/esphome/esphome/pull/11674) by [@bdraco](https://github.com/bdraco) +- [web_server] Remove redundant assignment in deq_push_back_with_dedup_ [esphome#11642](https://github.com/esphome/esphome/pull/11642) by [@bdraco](https://github.com/bdraco) +- [web_server] Eliminate nested lambdas in DeferredUpdateEventSourceList [esphome#11641](https://github.com/esphome/esphome/pull/11641) by [@bdraco](https://github.com/bdraco) +- [web_server] Use zero-copy entity ID comparison in request handlers [esphome#11644](https://github.com/esphome/esphome/pull/11644) by [@bdraco](https://github.com/bdraco) +- [esp32_ble] Reduce GATT event latency from 8ms to 12μs with notification socket [esphome#11663](https://github.com/esphome/esphome/pull/11663) by [@bdraco](https://github.com/bdraco) +- [fan] Use std::vector for preset modes, preserve config order [esphome#11483](https://github.com/esphome/esphome/pull/11483) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [web_server_idf] Reduce flash by eliminating temporary string allocations in event formatting [esphome#11658](https://github.com/esphome/esphome/pull/11658) by [@bdraco](https://github.com/bdraco) +- [scheduler] Refactor call() for improved code organization [esphome#11643](https://github.com/esphome/esphome/pull/11643) by [@bdraco](https://github.com/bdraco) +- [core] Avoid redundant millis() calls in base_automation loop methods [esphome#11676](https://github.com/esphome/esphome/pull/11676) by [@bdraco](https://github.com/bdraco) +- [esp32_ble] Wake main loop for GAP security events [esphome#11677](https://github.com/esphome/esphome/pull/11677) by [@bdraco](https://github.com/bdraco) +- [climate] Replace std::vector with const char* for custom fan modes and presets [esphome#11621](https://github.com/esphome/esphome/pull/11621) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [nrf52,debug] fix status of nRESET pin, add extra registry from UICR [esphome#11667](https://github.com/esphome/esphome/pull/11667) by [@tomaszduda23](https://github.com/tomaszduda23) +- [template] alarm_control_panel more ESP_LOGCONFIG reductions [esphome#11691](https://github.com/esphome/esphome/pull/11691) by [@warthog618](https://github.com/warthog618) +- [mqtt] Fix climate custom fan mode and preset compilation errors [esphome#11692](https://github.com/esphome/esphome/pull/11692) by [@bdraco](https://github.com/bdraco) +- Add support for Mopeka standard check alternate ID [esphome#10907](https://github.com/esphome/esphome/pull/10907) by [@pixelatedmirror](https://github.com/pixelatedmirror) (new-feature) +- [esp32] Make loop task stack size configurable [esphome#10564](https://github.com/esphome/esphome/pull/10564) by [@idstein](https://github.com/idstein) (new-feature) +- [nrf52, i2c] i2c support for nrf52 [esphome#8150](https://github.com/esphome/esphome/pull/8150) by [@tomaszduda23](https://github.com/tomaszduda23) (new-feature) +- [core][esp32_ble][socket] Add wake_loop_threadsafe() helper for background thread wakeups [esphome#11681](https://github.com/esphome/esphome/pull/11681) by [@bdraco](https://github.com/bdraco) +- [usb_host] Add wake_loop_threadsafe() for low-latency USB event processing [esphome#11683](https://github.com/esphome/esphome/pull/11683) by [@bdraco](https://github.com/bdraco) +- [esp32_hosted] Initial OTA implementation [esphome#11562](https://github.com/esphome/esphome/pull/11562) by [@swoboda1337](https://github.com/swoboda1337) (new-feature) (new-platform) +- [epaper_spi] Refactoring [esphome#11540](https://github.com/esphome/esphome/pull/11540) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- [micro_wake_word] Add wake_loop_threadsafe() for low-latency wake word detection [esphome#11698](https://github.com/esphome/esphome/pull/11698) by [@bdraco](https://github.com/bdraco) +- [usb_uart] Fixes for transfer queue allocation [esphome#11548](https://github.com/esphome/esphome/pull/11548) by [@clydebarrow](https://github.com/clydebarrow) +- [helpers] Add `get_mac_address_into_buffer()` [esphome#11700](https://github.com/esphome/esphome/pull/11700) by [@kbx81](https://github.com/kbx81) +- [tinyusb] New component [esphome#11678](https://github.com/esphome/esphome/pull/11678) by [@kbx81](https://github.com/kbx81) (new-component) (new-feature) +- [ci] Fix memory impact analysis to filter incompatible platform components [esphome#11706](https://github.com/esphome/esphome/pull/11706) by [@bdraco](https://github.com/bdraco) +- [core] Fix ESPTime crash [esphome#11705](https://github.com/esphome/esphome/pull/11705) by [@swoboda1337](https://github.com/swoboda1337) +- [psram] Require mode for S3 [esphome#11470](https://github.com/esphome/esphome/pull/11470) by [@clydebarrow](https://github.com/clydebarrow) (breaking-change) +- [lvgl] Layout improvements [esphome#10149](https://github.com/esphome/esphome/pull/10149) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- [lvgl] Fix rotation with unusual width [esphome#11680](https://github.com/esphome/esphome/pull/11680) by [@clydebarrow](https://github.com/clydebarrow) +- [mqtt] Add wake_loop_threadsafe() for low-latency event processing on ESP32 [esphome#11695](https://github.com/esphome/esphome/pull/11695) by [@bdraco](https://github.com/bdraco) +- [espnow] Add wake_loop_threadsafe() for low-latency event processing [esphome#11696](https://github.com/esphome/esphome/pull/11696) by [@bdraco](https://github.com/bdraco) +- [esp32_ble] Remove leftover lwip/sockets.h include [esphome#11702](https://github.com/esphome/esphome/pull/11702) by [@bdraco](https://github.com/bdraco) +- [ci] Fix non-component files incorrectly detected as components [esphome#11701](https://github.com/esphome/esphome/pull/11701) by [@bdraco](https://github.com/bdraco) +- [ci] Cache component dependency graph for up to 3.4x faster determine-jobs [esphome#11648](https://github.com/esphome/esphome/pull/11648) by [@bdraco](https://github.com/bdraco) +- Dallas indexing [esphome#11346](https://github.com/esphome/esphome/pull/11346) by [@leejoow](https://github.com/leejoow) (new-feature) +- [sgp30] Fix reading from preexisting stored baseline even with `store_baseline:false` [esphome#7922](https://github.com/esphome/esphome/pull/7922) by [@chaserhkj](https://github.com/chaserhkj) +- [max7219digit] support `flip_x` when `rotate_chip` is 90° or 270° [esphome#6109](https://github.com/esphome/esphome/pull/6109) by [@Tugzrida](https://github.com/Tugzrida) +- [gp8403] Add gp8413 (15 bits) DAC model [esphome#7726](https://github.com/esphome/esphome/pull/7726) by [@SeByDocKy](https://github.com/SeByDocKy) (new-feature) +- [gt911] Fix gt911 touchscreen with reset pin not initializing when loglevel is set to NONE [esphome#11715](https://github.com/esphome/esphome/pull/11715) by [@jpeletier](https://github.com/jpeletier) +- [automations] Reduce memory usage in if/while/repeat actions (32-36 bytes per instance) [esphome#11650](https://github.com/esphome/esphome/pull/11650) by [@bdraco](https://github.com/bdraco) +- [network] Store use_address in RODATA to save RAM [esphome#11707](https://github.com/esphome/esphome/pull/11707) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [fan] Remove duplicate preset mode storage to save RAM [esphome#11632](https://github.com/esphome/esphome/pull/11632) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [lvgl] Fix case sensitivity in flex layout [esphome#11717](https://github.com/esphome/esphome/pull/11717) by [@clydebarrow](https://github.com/clydebarrow) +- [display] Optimize display writers with function pointers for stateless lambdas [esphome#11629](https://github.com/esphome/esphome/pull/11629) by [@bdraco](https://github.com/bdraco) +- [select] Refactor to index-based operations for immediate and future RAM savings [esphome#11623](https://github.com/esphome/esphome/pull/11623) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [const] Move `CONF_ENABLED` to const.py [esphome#11719](https://github.com/esphome/esphome/pull/11719) by [@Gnuspice](https://github.com/Gnuspice) +- [core] Reduce action framework argument copies by 83% [esphome#11704](https://github.com/esphome/esphome/pull/11704) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [select][lvgl] Fix FixedVector size() returning 0 when using operator[] after init() [esphome#11721](https://github.com/esphome/esphome/pull/11721) by [@bdraco](https://github.com/bdraco) +- [wifi_info] Reduce heap usage by up to 1.7KB in scan_results sensor [esphome#11723](https://github.com/esphome/esphome/pull/11723) by [@bdraco](https://github.com/bdraco) +- [voice_assistant] Eliminate substr() allocations in text truncation [esphome#11725](https://github.com/esphome/esphome/pull/11725) by [@bdraco](https://github.com/bdraco) +- [rtttl] Reduce flash usage by eliminating substr() allocations [esphome#11722](https://github.com/esphome/esphome/pull/11722) by [@bdraco](https://github.com/bdraco) +- [ld2420] Eliminate substr() allocation in firmware version parsing [esphome#11724](https://github.com/esphome/esphome/pull/11724) by [@bdraco](https://github.com/bdraco) +- [scheduler] Extract helper functions to improve code readability [esphome#11730](https://github.com/esphome/esphome/pull/11730) by [@bdraco](https://github.com/bdraco) +- [template] Mark all component classes as final [esphome#11733](https://github.com/esphome/esphome/pull/11733) by [@bdraco](https://github.com/bdraco) +- [mqtt] Use StringRef to avoid string copies in discovery [esphome#11731](https://github.com/esphome/esphome/pull/11731) by [@bdraco](https://github.com/bdraco) +- [mdns] Eliminate redundant hostname copy to save heap memory [esphome#11734](https://github.com/esphome/esphome/pull/11734) by [@bdraco](https://github.com/bdraco) +- [core] Deprecate get_icon(), get_device_class(), get_unit_of_measurement() and fix remaining non-MQTT usages [esphome#11732](https://github.com/esphome/esphome/pull/11732) by [@bdraco](https://github.com/bdraco) +- [tests] Fix ID collision between bl0940 and nau7802 component tests [esphome#11739](https://github.com/esphome/esphome/pull/11739) by [@bdraco](https://github.com/bdraco) +- [ci] Skip memory impact analysis for release and beta branches [esphome#11740](https://github.com/esphome/esphome/pull/11740) by [@bdraco](https://github.com/bdraco) +- [lvgl] Allow text substitution for NaN [esphome#11712](https://github.com/esphome/esphome/pull/11712) by [@clydebarrow](https://github.com/clydebarrow) (new-feature) +- [ci] Skip memory impact analysis when more than 40 components changed [esphome#11741](https://github.com/esphome/esphome/pull/11741) by [@bdraco](https://github.com/bdraco) +- Update AI instructions with C++ style guidelines from developers docs [esphome#11743](https://github.com/esphome/esphome/pull/11743) by [@bdraco](https://github.com/bdraco) +- [api] Store YAML service names in flash instead of heap [esphome#11744](https://github.com/esphome/esphome/pull/11744) by [@bdraco](https://github.com/bdraco) +- [core] Add helper functions for clamp_at_... [esphome#10387](https://github.com/esphome/esphome/pull/10387) by [@clydebarrow](https://github.com/clydebarrow) +- [core] Fix wait_until and for_condition timing regression in automation chains [esphome#11716](https://github.com/esphome/esphome/pull/11716) by [@bdraco](https://github.com/bdraco) +- [select] Convert remaining components to use index-based control() [esphome#11693](https://github.com/esphome/esphome/pull/11693) by [@bdraco](https://github.com/bdraco) +- [gdk101] Fix fw version reporting [esphome#11029](https://github.com/esphome/esphome/pull/11029) by [@Szewcson](https://github.com/Szewcson) (breaking-change) (new-platform) +- [openthread] add poll period for mtd devices [esphome#11374](https://github.com/esphome/esphome/pull/11374) by [@rwrozelle](https://github.com/rwrozelle) (new-feature) +- [socket] Deduplicate IP formatting in LWIP raw TCP implementation [esphome#11747](https://github.com/esphome/esphome/pull/11747) by [@bdraco](https://github.com/bdraco) +- [psram] Add option to disable ignore not found sdkconfig setting [esphome#11411](https://github.com/esphome/esphome/pull/11411) by [@kahrendt](https://github.com/kahrendt) (new-feature) +- Add MCP3221 i2c A-D-Converter [esphome#7764](https://github.com/esphome/esphome/pull/7764) by [@philippderdiedas](https://github.com/philippderdiedas) (new-component) (new-feature) (new-platform) +- [ci] Reduce release time by removing 468 redundant ESP32-C3 IDF tests [esphome#11737](https://github.com/esphome/esphome/pull/11737) by [@bdraco](https://github.com/bdraco) +- [wifi] Guard AP-related members with USE_WIFI_AP to save RAM [esphome#11753](https://github.com/esphome/esphome/pull/11753) by [@bdraco](https://github.com/bdraco) +- [wifi] Refactor AP selection to use index instead of copy (saves 88 bytes) [esphome#11749](https://github.com/esphome/esphome/pull/11749) by [@bdraco](https://github.com/bdraco) +- [core] Use ESPDEPRECATED macro for deprecation warnings [esphome#11755](https://github.com/esphome/esphome/pull/11755) by [@bdraco](https://github.com/bdraco) +- [ai_instructions] Add public API and breaking changes guidelines [esphome#11756](https://github.com/esphome/esphome/pull/11756) by [@bdraco](https://github.com/bdraco) +- [tests] Fix determine_jobs tests failing when target branch is beta [esphome#11758](https://github.com/esphome/esphome/pull/11758) by [@bdraco](https://github.com/bdraco) +- [ci] Fix component batching for beta/release branches (3-4 → 40 per batch) [esphome#11759](https://github.com/esphome/esphome/pull/11759) by [@bdraco](https://github.com/bdraco) +- [event] Store event types in flash memory [esphome#11767](https://github.com/esphome/esphome/pull/11767) by [@bdraco](https://github.com/bdraco) (breaking-change) +- Updated AQI calculation for HM3301 to the new standard [esphome#9442](https://github.com/esphome/esphome/pull/9442) by [@optimusprimespace](https://github.com/optimusprimespace) (breaking-change) +- Expand uart.write tests [esphome#11785](https://github.com/esphome/esphome/pull/11785) by [@bdraco](https://github.com/bdraco) +- Add ble_client lambda compile tests [esphome#11787](https://github.com/esphome/esphome/pull/11787) by [@bdraco](https://github.com/bdraco) +- Add additional compile time tests for canbus [esphome#11789](https://github.com/esphome/esphome/pull/11789) by [@bdraco](https://github.com/bdraco) +- Add additional sx126x lambda tests [esphome#11791](https://github.com/esphome/esphome/pull/11791) by [@bdraco](https://github.com/bdraco) +- Add additional sx127x lambda tests [esphome#11793](https://github.com/esphome/esphome/pull/11793) by [@bdraco](https://github.com/bdraco) +- Add additional speaker lambda tests [esphome#11797](https://github.com/esphome/esphome/pull/11797) by [@bdraco](https://github.com/bdraco) +- Add additional udp lambda tests [esphome#11795](https://github.com/esphome/esphome/pull/11795) by [@bdraco](https://github.com/bdraco) +- Add additonal abbwelcome remote_base tests [esphome#11799](https://github.com/esphome/esphome/pull/11799) by [@bdraco](https://github.com/bdraco) +- Add additional tests for remote_transmitter raw [esphome#11801](https://github.com/esphome/esphome/pull/11801) by [@bdraco](https://github.com/bdraco) +- [ble_client] Optimize ble_write memory usage - store static data in flash [esphome#11786](https://github.com/esphome/esphome/pull/11786) by [@bdraco](https://github.com/bdraco) +- [canbus] Optimize canbus.send memory usage - store static data in flash [esphome#11788](https://github.com/esphome/esphome/pull/11788) by [@bdraco](https://github.com/bdraco) +- [sx126x] Optimize send_packet action memory usage - store static data in flash [esphome#11790](https://github.com/esphome/esphome/pull/11790) by [@bdraco](https://github.com/bdraco) +- [remote_base] Optimize raw transmit action memory usage - use function pointers [esphome#11800](https://github.com/esphome/esphome/pull/11800) by [@bdraco](https://github.com/bdraco) +- [sx127x] Optimize send_packet action memory usage - store static data in flash [esphome#11792](https://github.com/esphome/esphome/pull/11792) by [@bdraco](https://github.com/bdraco) +- [remote_base] Eliminate substr() allocations in Pronto dump logging [esphome#11726](https://github.com/esphome/esphome/pull/11726) by [@bdraco](https://github.com/bdraco) +- [bl0940] Fix calibration number preference hash for multi-device configs [esphome#11769](https://github.com/esphome/esphome/pull/11769) by [@bdraco](https://github.com/bdraco) +- [speaker] Optimize speaker.play action memory usage - store static data in flash [esphome#11796](https://github.com/esphome/esphome/pull/11796) by [@bdraco](https://github.com/bdraco) +- [udp] Optimize udp.write action memory usage - store static data in flash [esphome#11794](https://github.com/esphome/esphome/pull/11794) by [@bdraco](https://github.com/bdraco) +- [uart] Store static data in flash and use function pointers for lambdas [esphome#11784](https://github.com/esphome/esphome/pull/11784) by [@bdraco](https://github.com/bdraco) +- [core] Remove deprecated EntityBase::hash_base() method [esphome#11783](https://github.com/esphome/esphome/pull/11783) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [remote_base] Optimize abbwelcome action memory usage - store static data in flash [esphome#11798](https://github.com/esphome/esphome/pull/11798) by [@bdraco](https://github.com/bdraco) +- [nrf52] api [esphome#11751](https://github.com/esphome/esphome/pull/11751) by [@lboue](https://github.com/lboue) (new-feature) +- [core] Implement Global Controller Registry to reduce RAM usage [esphome#11772](https://github.com/esphome/esphome/pull/11772) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [sx126x] Change BUSY, RST, DIO1 pins to general GPIO (from internal) [esphome#11782](https://github.com/esphome/esphome/pull/11782) by [@PaulSchulz](https://github.com/PaulSchulz) (new-feature) +- Ensure event paths are enabled in api compile tests [esphome#11776](https://github.com/esphome/esphome/pull/11776) by [@bdraco](https://github.com/bdraco) +- [nrf52,watchdog] do not disable watchog if it is not nesesery [esphome#11686](https://github.com/esphome/esphome/pull/11686) by [@tomaszduda23](https://github.com/tomaszduda23) +- HLK-FM22X Face Recognition module component [esphome#8059](https://github.com/esphome/esphome/pull/8059) by [@OnFreund](https://github.com/OnFreund) (new-component) (new-feature) (new-platform) +- [tests] Add unit test coverage for web_port property [esphome#11811](https://github.com/esphome/esphome/pull/11811) by [@bdraco](https://github.com/bdraco) +- [ai] simplify namespace syntax [esphome#11824](https://github.com/esphome/esphome/pull/11824) by [@ximex](https://github.com/ximex) +- [lvgl] Automatically register widget types [esphome#11394](https://github.com/esphome/esphome/pull/11394) by [@stuartparmenter](https://github.com/stuartparmenter) +- Add support for RX8130 RTC Chip [esphome#10511](https://github.com/esphome/esphome/pull/10511) by [@Beormund](https://github.com/Beormund) (new-component) (new-feature) (new-platform) +- [wifi] Fix mesh network failover and improve retry logic reliability [esphome#11805](https://github.com/esphome/esphome/pull/11805) by [@bdraco](https://github.com/bdraco) +- [tests] Migrate components to shared packages and fix ID ambiguity [esphome#11819](https://github.com/esphome/esphome/pull/11819) by [@bdraco](https://github.com/bdraco) +- [CI] Don't request codeowners review in forks [esphome#11827](https://github.com/esphome/esphome/pull/11827) by [@jesserockz](https://github.com/jesserockz) +- [wifi][ethernet] Don't block setup until connected [esphome#9823](https://github.com/esphome/esphome/pull/9823) by [@clydebarrow](https://github.com/clydebarrow) (breaking-change) +- [core] Update clamp functions to allow mixed but comparable types [esphome#11828](https://github.com/esphome/esphome/pull/11828) by [@clydebarrow](https://github.com/clydebarrow) +- [nrf52,gpio] add gpio levels for high voltage mode [esphome#9858](https://github.com/esphome/esphome/pull/9858) by [@tomaszduda23](https://github.com/tomaszduda23) (new-feature) +- [nrf52,pcf8563] fix build error [esphome#11846](https://github.com/esphome/esphome/pull/11846) by [@tomaszduda23](https://github.com/tomaszduda23) +- [nrf52,ssd1306_i2c] fix build error [esphome#11847](https://github.com/esphome/esphome/pull/11847) by [@tomaszduda23](https://github.com/tomaszduda23) +- [lvgl]Adjust condition for LVGL style transformation defines [esphome#11845](https://github.com/esphome/esphome/pull/11845) by [@CzBiX](https://github.com/CzBiX) +- [nrf52,debug] add partition dump [esphome#11839](https://github.com/esphome/esphome/pull/11839) by [@tomaszduda23](https://github.com/tomaszduda23) +- [nrf52] fix boot loop [esphome#11854](https://github.com/esphome/esphome/pull/11854) by [@tomaszduda23](https://github.com/tomaszduda23) +- [wifi] Fix infinite retry loop when no hidden networks and captive portal active [esphome#11831](https://github.com/esphome/esphome/pull/11831) by [@bdraco](https://github.com/bdraco) +- [wifi] Change priority type from float to int8_t [esphome#11830](https://github.com/esphome/esphome/pull/11830) by [@bdraco](https://github.com/bdraco) (breaking-change) +- [wifi] Fix all-hidden networks duplicate attempts and scan skipping [esphome#11848](https://github.com/esphome/esphome/pull/11848) by [@bdraco](https://github.com/bdraco) +- [wifi] Add min_auth_mode configuration option [esphome#11814](https://github.com/esphome/esphome/pull/11814) by [@bdraco](https://github.com/bdraco) (new-feature) (breaking-change) +- [wifi] Fix scan and connection failures after adapter restart [esphome#11851](https://github.com/esphome/esphome/pull/11851) by [@bdraco](https://github.com/bdraco) +- [wifi] Restore two-attempt BSSID filtering for mesh networks [esphome#11844](https://github.com/esphome/esphome/pull/11844) by [@bdraco](https://github.com/bdraco) +- [wifi] Conditionally compile manual_ip to save 24-72 bytes RAM [esphome#11833](https://github.com/esphome/esphome/pull/11833) by [@bdraco](https://github.com/bdraco) +- [network, psram, speaker wifi] Use CORE.data to enable high performance networking [esphome#11812](https://github.com/esphome/esphome/pull/11812) by [@kahrendt](https://github.com/kahrendt) (new-feature) (breaking-change) + +
+ +
+ + +- Bump pyupgrade from 3.20.0 to 3.21.0 [esphome#11139](https://github.com/esphome/esphome/pull/11139) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump github/codeql-action from 4.30.7 to 4.30.8 [esphome#11163](https://github.com/esphome/esphome/pull/11163) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump pylint from 3.3.9 to 4.0.0 [esphome#11211](https://github.com/esphome/esphome/pull/11211) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump aioesphomeapi from 41.16.1 to 41.17.0 [esphome#11231](https://github.com/esphome/esphome/pull/11231) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump ruamel-yaml-clib from 0.2.12 to 0.2.14 [esphome#10842](https://github.com/esphome/esphome/pull/10842) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump aioesphomeapi from 41.17.0 to 41.18.0 [esphome#11247](https://github.com/esphome/esphome/pull/11247) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump pylint from 4.0.0 to 4.0.1 [esphome#11267](https://github.com/esphome/esphome/pull/11267) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump aioesphomeapi from 41.18.0 to 42.0.0 [esphome#11273](https://github.com/esphome/esphome/pull/11273) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump ruff from 0.14.0 to 0.14.1 [esphome#11303](https://github.com/esphome/esphome/pull/11303) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump github/codeql-action from 4.30.8 to 4.30.9 [esphome#11326](https://github.com/esphome/esphome/pull/11326) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump aioesphomeapi from 42.0.0 to 42.1.0 [esphome#11350](https://github.com/esphome/esphome/pull/11350) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump aioesphomeapi from 42.1.0 to 42.2.0 [esphome#11352](https://github.com/esphome/esphome/pull/11352) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump pylint from 4.0.1 to 4.0.2 [esphome#11418](https://github.com/esphome/esphome/pull/11418) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump actions/download-artifact from 4.3.0 to 5.0.0 [esphome#11419](https://github.com/esphome/esphome/pull/11419) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump bleak from 1.0.1 to 1.1.1 [esphome#11492](https://github.com/esphome/esphome/pull/11492) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump aioesphomeapi from 42.2.0 to 42.3.0 [esphome#11493](https://github.com/esphome/esphome/pull/11493) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump ruamel-yaml from 0.18.15 to 0.18.16 [esphome#11482](https://github.com/esphome/esphome/pull/11482) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump aioesphomeapi from 42.3.0 to 42.4.0 [esphome#11586](https://github.com/esphome/esphome/pull/11586) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump aioesphomeapi from 42.4.0 to 42.5.0 [esphome#11597](https://github.com/esphome/esphome/pull/11597) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump github/codeql-action from 4.30.9 to 4.31.0 [esphome#11522](https://github.com/esphome/esphome/pull/11522) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump actions/upload-artifact from 4.6.2 to 5.0.0 [esphome#11520](https://github.com/esphome/esphome/pull/11520) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump actions/download-artifact from 5.0.0 to 6.0.0 [esphome#11521](https://github.com/esphome/esphome/pull/11521) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump ruff from 0.14.1 to 0.14.2 [esphome#11519](https://github.com/esphome/esphome/pull/11519) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump github/codeql-action from 4.31.0 to 4.31.2 [esphome#11626](https://github.com/esphome/esphome/pull/11626) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump ruff from 0.14.2 to 0.14.3 [esphome#11633](https://github.com/esphome/esphome/pull/11633) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump aioesphomeapi from 42.5.0 to 42.6.0 [esphome#11682](https://github.com/esphome/esphome/pull/11682) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump ruff from 0.14.3 to 0.14.4 [esphome#11768](https://github.com/esphome/esphome/pull/11768) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump aioesphomeapi from 42.6.0 to 42.7.0 [esphome#11771](https://github.com/esphome/esphome/pull/11771) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump pytest-asyncio from 1.2.0 to 1.3.0 [esphome#11815](https://github.com/esphome/esphome/pull/11815) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump pyupgrade from 3.21.0 to 3.21.1 [esphome#11816](https://github.com/esphome/esphome/pull/11816) by [@dependabot[bot]](https://github.com/apps/dependabot) +- Bump pytest from 8.4.2 to 9.0.0 [esphome#11817](https://github.com/esphome/esphome/pull/11817) by [@dependabot[bot]](https://github.com/apps/dependabot) + +
+ + + +## All Changelogs + +{{< changelogs >}} diff --git a/content/changelog/_index.md b/content/changelog/_index.md index 17ff88e035..9c805b76c4 100644 --- a/content/changelog/_index.md +++ b/content/changelog/_index.md @@ -3,4 +3,4 @@ description: "Changelog" title: "Changelog" --- -{{< redirect url="/changelog/2025.10.0.html" >}} +{{< redirect url="/changelog/2025.11.0.html" >}} diff --git a/content/changelog/images/changelog-2025.11.0.png b/content/changelog/images/changelog-2025.11.0.png new file mode 100644 index 0000000000..f69e56a835 Binary files /dev/null and b/content/changelog/images/changelog-2025.11.0.png differ diff --git a/content/components/_index.md b/content/components/_index.md index c54d7772c4..dfb5648d56 100644 --- a/content/components/_index.md +++ b/content/components/_index.md @@ -123,6 +123,7 @@ ESPHome-specific components or components supporting ESPHome device provisioning "ESP32 BLE Server","components/esp32_ble_server","bluetooth.svg","dark-invert" "Bluetooth Proxy","components/bluetooth_proxy","bluetooth.svg","dark-invert" "Improv via BLE","components/esp32_improv","improv.svg","dark-invert" +"Nordic UART Service (NUS)","components/ble_nus","uart.svg","" {{< /imgtable >}} ## Management and Monitoring @@ -166,6 +167,7 @@ Create update entities simplifying management of OTA updates. "I²S Audio","components/i2s_audio","i2s_audio.svg","" "OpenTherm","components/opentherm","opentherm.png","" "SPI Bus","components/spi","spi.svg","" +"TinyUSB","components/tinyusb","usb.svg","dark-invert" "UART","components/uart","uart.svg","" "USB Host","components/usb_host","usb.svg","dark-invert" "USB UART","components/usb_uart","usb.svg","dark-invert" @@ -272,6 +274,7 @@ Sensors are organized into categories; if a given sensor fits into more than one "CD74HC4067","components/sensor/cd74hc4067","cd74hc4067.jpg","16-channel analog multiplexer","" "MCP3008","components/sensor/mcp3008","mcp3008.jpg","8-channel ADC","" "MCP3204 / MCP3208","components/sensor/mcp3204","mcp3204.jpg","4-channel ADC","" +"MCP3221","components/sensor/mcp3221","mcp3221.png","ADC","" "NAU7802","components/sensor/nau7802","nau7802.jpg","ADC","" "Resistance","components/sensor/resistance","omega.svg","dark-invert","" {{< /imgtable >}} @@ -377,6 +380,7 @@ Sensors are organized into categories; if a given sensor fits into more than one "ENS160","components/sensor/ens160","ens160.jpg","eCO₂ & Air Quality","" "ENS210","components/sensor/ens210","ens210.jpg","Temperature & Humidity","" "HDC1080","components/sensor/hdc1080","hdc1080.jpg","Temperature & Humidity","" +"HDC2010","components/sensor/hdc2010","hdc2010.png","Temperature & Humidity","" "HHCCJCY10 (MiFlora Pink)","components/sensor/xiaomi_hhccjcy10","xiaomi_hhccjcy10.jpg","Soil moisture & Temperature & Light","" "Honeywell ABP","components/sensor/honeywellabp","honeywellabp.jpg","Pressure & Temperature","" "Honeywell ABP2 I2C","components/sensor/honeywellabp2_i2c","honeywellabp.jpg","Pressure & Temperature","" @@ -994,6 +998,7 @@ at the {{< docref "light/fastled" "FastLED Light" >}}. {{< imgtable >}} "Time Core","components/time/index","clock-outline.svg","dark-invert" "DS1307 RTC","components/time/ds1307","clock-outline.svg","dark-invert" +"RX8130 RTC","components/time/rx8130","clock-outline.svg","dark-invert" "GPS Time","components/time/gps","crosshairs-gps.svg","dark-invert" "Home Assistant Time","components/time/homeassistant","home-assistant.svg","dark-invert" "PCF85063 RTC","components/time/pcf85063","clock-outline.svg","dark-invert" @@ -1047,6 +1052,7 @@ ESPHome to cellular networks. **Does not encompass Wi-Fi.** "Exposure Notifications","components/exposure_notifications","exposure_notifications.png","" "GPS","components/gps","crosshairs-gps.svg","dark-invert" "Grow Fingerprint Reader","components/fingerprint_grow","fingerprint.svg","dark-invert" +"HLK-FM22x Face Recognition Module","components/hlk_fm22x","face.svg","dark-invert" "Modbus Controller","components/modbus_controller","modbus.png","" "Sprinkler","components/sprinkler","sprinkler-variant.svg","dark-invert" "Status LED","components/status_led","led-on.svg","dark-invert" diff --git a/content/components/ble_nus.md b/content/components/ble_nus.md new file mode 100644 index 0000000000..017ac6f853 --- /dev/null +++ b/content/components/ble_nus.md @@ -0,0 +1,39 @@ +--- +description: "Nordic UART Service (NUS)" +title: "Nordic UART Service (NUS)" +params: + seo: + description: BLE UART support using Nordic UART Service (NUS) for ESPHome logging and communication. + image: uart.svg +--- + +The BLE NUS component provides a Bluetooth Low Energy UART interface based on the Nordic UART Service. +It can be used to stream logs or enable custom bidirectional communication with ESPHome. + +```yaml +# Example configuration entry +ble_nus: + type: logs +``` + +## Configuration variables + +- **type** (**Required**, string): Mode of operation. Must be set to ``logs`` to stream ESPHome logs over the BLE UART. + +## Usage + +To connect and view logs from the device over BLE: + +```bash +esphome logs d.yaml --device BLE +``` + +Or connect to a specific BLE address: + +```bash +esphome logs d.yaml --device 00:11:22:33:44:55 +``` + +## See Also + +- Nordic UART Service diff --git a/content/components/climate/climate_ir.md b/content/components/climate/climate_ir.md index e879ed78c8..83caa0002a 100644 --- a/content/components/climate/climate_ir.md +++ b/content/components/climate/climate_ir.md @@ -216,11 +216,12 @@ climate: ### `toshiba` -- **model** (*Optional*, string): There are two valid models +- **model** (*Optional*, string): There are four valid models: - `GENERIC` : Temperature range is from 17 to 30 (default) - `RAC-PT1411HWRU-C` : Temperature range is from 16 to 30; unit displays temperature in degrees Celsius - `RAC-PT1411HWRU-F` : Temperature range is from 16 to 30; unit displays temperature in degrees Fahrenheit + - `RAS-2819T` : Temperature range is from 18 to 30; supports two-packet IR protocol > [!NOTE] > @@ -237,9 +238,22 @@ climate: > internal temperature sensor; a value of 30 seconds seems to work well. See {{< docref "/components/sensor" >}} > for more information. > +> - The `RAS-2819T` model uses a two-packet IR protocol where most commands send a primary packet (containing +> temperature, mode, and fan speed) followed by a secondary packet (containing fan speed confirmation and +> mode-specific data). Single-packet commands are used for power-off and swing toggle operations. +> > - This climate IR component is also known to work with Midea model MAP14HS1TBL and may work with other similar > models, as well. (Midea acquired Toshiba's product line and re-branded it.) +```yaml +# Example configuration entry for RAS-2819T +climate: + - platform: toshiba + name: "Toshiba AC" + model: RAS-2819T + sensor: room_temperature +``` + {{< anchor "whirlpool" >}} ### `whirlpool` diff --git a/content/components/climate/thermostat.md b/content/components/climate/thermostat.md index 8128f2b1dd..d510832cd7 100644 --- a/content/components/climate/thermostat.md +++ b/content/components/climate/thermostat.md @@ -161,8 +161,8 @@ Got all that? Great. Let's take a closer look at some configuration. The thermostat controller uses the sensor to determine whether it should heat or cool. - **sensor** (**Required**, [ID](/guides/configuration-types#id)): The sensor that is used to measure the current temperature. -- **humidity_sensor** (*Optional*, [ID](/guides/configuration-types#id)): If specified, this sensor is used to measure the current humidity. - This is used for information only and does not influence temperature control. +- **humidity_sensor** (*Optional*, [ID](/guides/configuration-types#id)): If specified, this sensor is used to measure + the current humidity. This may be used for humidity control; see [Humidity Control Actions](#humidity-control-actions). ### Heating and Cooling Actions @@ -296,6 +296,20 @@ These should be used to control the fan only, if available. - **swing_both_action** (*Optional*, [Action](/automations/actions#all-actions)): The action to call when the fan should oscillate in horizontal and vertical directions. +### Humidity Control Actions + +These are triggered when the humidity control action is changed by the thermostat controller. It can trigger actions +to activate humidification **or** dehumidification. + +- **humidity_control_dehumidify_action** (*Optional*, [Action](#config-action)): The action to call when + dehumidification is required. + +- **humidity_control_humidify_action** (*Optional*, [Action](#config-action)): The action to call when + humidification is required. + +- **humidity_control_off_action** (*Optional*, [Action](#config-action)): The action to call when + (de)humidification should stop. This action is **required** when either of the above actions are configured. + ## Advanced Configuration/Behavior ### Set Point Options/Behavior @@ -467,8 +481,11 @@ climate: ### Additional Actions/Behavior -- **target_temperature_change_action** (*Optional*, [Action](/automations/actions#all-actions)): The action to call when the - thermostat's target temperature(s) is/are changed. +- **target_humidity_change_action** (*Optional*, [Action](/automations/actions#all-actions)): The action to call when + the thermostat's target humidity is changed. + +- **target_temperature_change_action** (*Optional*, [Action](/automations/actions#all-actions)): The action to call when + the thermostat's target temperature(s) is/are changed. - **startup_delay** (*Optional*, boolean): If set to `true`, when ESPHome starts, `min_cooling_off_time`, `min_fanning_off_time`, and `min_heating_off_time` must elapse before each respective action may be invoked. @@ -544,6 +561,9 @@ the range of allowed temperature values in the thermostat component. See {{< doc - **heat_overrun** (*Optional*, float): The minimum temperature differential (heating beyond the set point) before calling the idle [action](/automations/actions#all-actions). Defaults to 0.5 °C. +- **humidity_hysteresis** (*Optional*, float): The maximum humidity differential (above/below the set point) + before calling the respective humidity control [action](#config-action). Defaults to 1%. + > [!NOTE] > > - While this platform uses the term temperature everywhere, it can also be used to regulate other values. diff --git a/content/components/display/epaper_spi.md b/content/components/display/epaper_spi.md index c52777a744..a18ed53789 100644 --- a/content/components/display/epaper_spi.md +++ b/content/components/display/epaper_spi.md @@ -15,28 +15,34 @@ better integration with ESPHome's async architecture. The communication method uses 4-wire [SPI](/components/spi), so you need to have an `spi:` section in your configuration. +The driver supports a number of displays and there are also specific configurations for ESP32 boards with integrated displays. +For those boards the predefined configuration will set the correct pins and dimensions for the display. + ```yaml display: - platform: epaper_spi - cs_pin: GPIOXX - dc_pin: GPIOXX - busy_pin: GPIOXX - reset_pin: GPIOXX - model: 7.3in-spectra-e6 + model: Seeed-reTerminal-E1002 lambda: |- it.filled_circle(it.get_width() / 2, it.get_height() / 2, 50, Color::BLACK); ``` -## Configuration variables +## Supported displays -- **cs_pin** (**Required**, [Pin Schema](/guides/configuration-types#pin-schema)): The CS pin. -- **dc_pin** (**Required**, [Pin Schema](/guides/configuration-types#pin-schema)): The DC pin. -- **model** (**Required**): The model of the ePaper display. Currently supported: +| Model name | Manufacturer | Product Description | +| ---------------------- | ------------ | ---------------------------------------------------------- | +| Spectra-E6 | Eink | | +| Seeed-reTerminal-E1002 | Seeed Studio | | + +## Configuration variables - - `7.3in-spectra-e6` - 7.3" Spectra E6 6-color display (800×480 pixels) +When using a model defining an integrated ESP32 display board most of the configuration such as the pins and dimensions will be set by default, +but can be overridden if needed. -- **busy_pin** (*Optional*, [Pin Schema](/guides/configuration-types#pin-schema)): The BUSY pin. Defaults to not connected. -- **reset_pin** (*Optional*, [Pin Schema](/guides/configuration-types#pin-schema)): The RESET pin. Defaults to not connected. +- **model** (**Required**): The model of the ePaper display. See the table above for options. +- **cs_pin** (**Required**, [Pin Schema](/guides/configuration-types#pin-schema)): The CS pin. Predefined for integrated boards. +- **dc_pin** (**Required**, [Pin Schema](/guides/configuration-types#pin-schema)): The DC pin. Predefined for integrated boards. +- **busy_pin** (*Optional*, [Pin Schema](/guides/configuration-types#pin-schema)): The BUSY pin, if used. +- **reset_pin** (*Optional*, [Pin Schema](/guides/configuration-types#pin-schema)): The RESET pin, if used. Make sure you pull this pin high (by connecting it to 3.3V with a resistor) if not connected to a GPIO pin. - **rotation** (*Optional*): Set the rotation of the display. Everything you draw in `lambda:` will be rotated diff --git a/content/components/display/mipi_rgb.md b/content/components/display/mipi_rgb.md index 540e19b8f6..7e5ccca231 100644 --- a/content/components/display/mipi_rgb.md +++ b/content/components/display/mipi_rgb.md @@ -40,7 +40,7 @@ These boards have completely pre-filled configurations for the display driver, s option is `model`. | Board | Driver Chip | Manufacturer | Product link | -| ---------------------------- | ----------- | ------------ | ---------------------------------------------------------------- | +|------------------------------| ----------- | ------------ | ---------------------------------------------------------------- | | GUITION-4848S040 | ST7701s | Guition | | | T-PANEL-S3 | ST7701s | Lilygo | | | T-RGB-2.1 | ST7701s | Lilygo | | @@ -48,7 +48,8 @@ option is `model`. | SEEED-INDICATOR-D1 | ST7701s | Seeed Studio | | | ESP32-S3-TOUCH-LCD-4.3 | RPI | Waveshare | | | ESP32-S3-TOUCH-LCD-7-800X480 | RPI | Waveshare | | -| WAVESHARE-4-480x480 | RPI | Waveshare | | +| WAVESHARE-4-480X480 | RPI | Waveshare | | +| WAVESHARE-5-1024X600 | RPI | Waveshare | | ## Usage diff --git a/content/components/display/mipi_spi.md b/content/components/display/mipi_spi.md index 75d4dc7634..00a482acbe 100644 --- a/content/components/display/mipi_spi.md +++ b/content/components/display/mipi_spi.md @@ -29,7 +29,7 @@ boards and chips, but the driver is also designed to be customisable in YAML for ## Supported boards and driver chips The driver supports a number of display driver chips, and can be configured for custom displays. As well as support for -driver chips, there are also specific configurations for several ESP32 boards with integrated displays. For tbose boards +driver chips, there are also specific configurations for several ESP32 boards with integrated displays. For those boards the predefined configuration will set the correct pins and dimensions for the display. For custom displays, the driver can be configured with the correct pins and dimensions, and the driver chip can be @@ -61,25 +61,26 @@ using an octal SPI bus, so references here to parallel and octal SPI are equival | ------------------------------------ | ------------ | ----------------------------------------------------------------- | | ADAFRUIT-S2-TFT-FEATHER | Adafruit | | | ADAFRUIT-FUNHOUSE | Adafruit | | -| M5CORE | M5Stack | | -| S3BOX | Espressif | | -| S3BOXLITE | Espressif | | -| WAVESHARE-4-TFT | Waveshare | | -| PICO-RESTOUCH-LCD-3.5 | Waveshare | | -| WAVESHARE-ESP32-S3-TOUCH-AMOLED-1.75 | Waveshare | | -| WT32-SC01-PLUS | Wireless-Tag | | -| ESP32-2432S028 | Sunton | | -| JC3248W535 | Guition | | -| JC3636W518 | Guition | | -| JC3636W518V2 | Guition | | -| LANBON-L8 | Lanbon | | -| T4-S3 | Lilygo | | -| T-EMBED | Lilygo | | -| T-DISPLAY | Lilygo | | -| T-DISPLAY-S3 | Lilygo | | -| T-DISPLAY-S3-PRO | Lilygo | | -| T-DISPLAY-S3-AMOLED | Lilygo | | -| T-DISPLAY-S3-AMOLED-PLUS | Lilygo | | +| M5CORE | M5Stack | | +| S3BOX | Espressif | | +| S3BOXLITE | Espressif | | +| WAVESHARE-4-TFT | Waveshare | | +| PICO-RESTOUCH-LCD-3.5 | Waveshare | | +| WAVESHARE-ESP32-S3-TOUCH-AMOLED-1.75 | Waveshare | | +| WAVESHARE-ESP32-S3-TOUCH-LCD-3.49 | Waveshare | | +| WT32-SC01-PLUS | Wireless-Tag | | +| ESP32-2432S028 | Sunton | | +| JC3248W535 | Guition | | +| JC3636W518 | Guition | | +| JC3636W518V2 | Guition | | +| LANBON-L8 | Lanbon | | +| T4-S3 | Lilygo | | +| T-EMBED | Lilygo | | +| T-DISPLAY | Lilygo | | +| T-DISPLAY-S3 | Lilygo | | +| T-DISPLAY-S3-PRO | Lilygo | | +| T-DISPLAY-S3-AMOLED | Lilygo | | +| T-DISPLAY-S3-AMOLED-PLUS | Lilygo | | ## SPI Bus @@ -203,6 +204,8 @@ dimensions: width: 320 ``` +When using the `CUSTOM` model with rotation, if the chip does not support hardware transform use `transform: disabled` to disable hardware transform and ensure software rotation. + ## LCD Backlights Many displays have an integrated backlight, which may need to be turned on for the display to show. This backlight is not controlled diff --git a/content/components/esp32.md b/content/components/esp32.md index 9233a2288d..87d5e0a0b0 100644 --- a/content/components/esp32.md +++ b/content/components/esp32.md @@ -82,18 +82,27 @@ esp32: - **version** (*Optional*, string): The base framework version number to use, from [ESP32 ESP-IDF releases](https://github.com/espressif/esp-idf/releases) or - [ESP32 arduino releases](https://github.com/espressif/arduino-esp32/releases). Defaults to `recommended`. + [ESP32 Arduino releases](https://github.com/espressif/arduino-esp32/releases). Defaults to `recommended`. Additional values are: - `dev` : Use the latest commit, note this may break at any time - `latest` : Use the latest *release*, even if it hasn't been recommended yet. - `recommended` : Use the recommended framework version. -- **source** (*Optional*, string): The PlatformIO package or repository to use for the framework. This can be used to - use a custom or patched version of the framework. +- **source** (*Optional*, string): The PlatformIO package to use for the framework. This variable provides + the URL of the git repository or file archive of a custom or patched version of the + [pioarduino/framework-arduinoespressif32](https://github.com/espressif/arduino-esp32) or + [pioarduino/framework-espidf](https://github.com/pioarduino/esp-idf) package for the framework type. Refer to + [PlatformIO package specifications](https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_install.html#package-specifications) + for the supported URL schemes. Examples: + + - `https://github.com/user/arduino-esp32/releases/download/archive.zip` + - `https://github.com/user/esp-idf.git#branch` + - `symlink:///path/to/esp-idf` - **platform_version** (*Optional*, string): The version of the - [pioarduino/espressif32](https://github.com/pioarduino/platform-espressif32/releases/) package to use. + [pioarduino/espressif32](https://github.com/pioarduino/platform-espressif32/releases/) package to use. For known framework versions + this value will be set automatically. - **sdkconfig_options** (*Optional*, mapping): Custom sdkconfig [compiler options](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/kconfig.html#compiler-options) @@ -139,6 +148,10 @@ esp32: - **enable_idf_experimental_features** (*Optional*, boolean): Can be set to `true` to enable experimental features. Use of experimental features may cause instability or other issues. +- **loop_task_stack_size** (*Optional*, int): Loop task stack size in bytes. Increase if experiencing stack overflow + errors (e.g., with complex code or deep recursion). Higher values reduce heap availability. Valid range is 8192-32768 + bytes. Defaults to 8192 bytes. + **LWIP Optimization Options (ESP-IDF only):** The following options are available under the `advanced` section when using the ESP-IDF framework to optimize @@ -162,11 +175,34 @@ LWIP (Lightweight IP) behavior. Some options improve performance while others sa - **enable_lwip_check_thread_safety** (*Optional*, boolean): Enable LWIP thread safety checks to detect incorrect usage of the TCP/IP stack from multiple threads. This helps catch thread safety issues when core locking is enabled. Defaults to `true`. +- **disable_libc_locks_in_iram** (*Optional*, boolean): Disable placing libc lock functions in IRAM. This saves approximately + 1.3 KB of IRAM by placing these functions in flash memory instead. This is safe for ESPHome since no IRAM interrupt service + routines (ISRs that run while cache is disabled) use libc lock APIs. Defaults to `true` (IRAM placement disabled to save RAM). + +**VFS (Virtual File System) Optimization Options:** + +The following options disable unused VFS features to save flash memory: + +- **disable_vfs_support_termios** (*Optional*, boolean): Disable VFS support for termios (terminal I/O) functions. ESPHome + doesn't use termios functions on ESP32 (they're only used in the host UART driver for Linux/macOS). Disabling this saves + approximately 1.8 KB of flash. Defaults to `true` (VFS termios disabled to save flash). + +- **disable_vfs_support_select** (*Optional*, boolean): Disable VFS support for select() with file descriptors. ESPHome uses + `lwip_select()` for socket operations, which works independently of VFS select support. VFS select is only needed for UART + and eventfd file descriptors. Socket operations continue to work normally with this disabled. Components that require VFS + select (e.g., OpenThread) automatically enable it regardless of this setting. Disabling this saves approximately 2.7 KB of + flash. Defaults to `true` (VFS select disabled to save flash). + +- **disable_vfs_support_dir** (*Optional*, boolean): Disable VFS support for directory-related functions (opendir, readdir, + mkdir, rmdir, etc.). ESPHome doesn't use directory operations on ESP32. Components that require directory support (e.g., + future storage components) automatically enable it regardless of this setting. Disabling this saves approximately 0.5 KB+ + of flash. Defaults to `true` (VFS directory support disabled to save flash). + Some options can be disabled to save flash memory without affecting typical ESPHome functionality. The performance options (defaulting to `true` ) improve socket operation performance but can be disabled if you need better multi-threaded scalability (which is uncommon since ESPHome uses an event loop). -**Example configuration with advanced LWIP options:** +**Example configuration with advanced LWIP and VFS options:** ```yaml # Example configuration entry @@ -180,6 +216,10 @@ esp32: enable_lwip_check_thread_safety: true # Thread safety validation # Memory saving options + disable_libc_locks_in_iram: true # Enabled by default, saves 1.3 KB IRAM + disable_vfs_support_termios: true # Enabled by default, saves 1.8 KB flash + disable_vfs_support_select: true # Enabled by default, saves 2.7 KB flash (auto-enabled by openthread) + disable_vfs_support_dir: true # Enabled by default, saves 0.5 KB+ flash enable_lwip_dhcp_server: false # Disabled by default, only needed for AP mode enable_lwip_mdns_queries: false # Enabled by default, can disable if not using .local hostnames enable_lwip_bridge_interface: false # Disabled by default diff --git a/content/components/esp32_hosted.md b/content/components/esp32_hosted.md index 0d73842b34..d86bd2824f 100644 --- a/content/components/esp32_hosted.md +++ b/content/components/esp32_hosted.md @@ -48,9 +48,15 @@ wifi: - **active_high** (*Required*, boolean): If enabled, the co-processor is active when reset is high. If disabled, the co-processor is active when reset is low. +## Updating co-processor firmware + +You can update the firmware on your ESP32 co-processor using the {{< docref "update/esp32_hosted/" >}} +platform. This allows you to deploy firmware updates to the co-processor without manually reflashing it. + ## See Also - {{< docref "wifi/" >}} - {{< docref "network/" >}} - {{< docref "ethernet/" >}} +- {{< docref "update/esp32_hosted/" >}} - [ESP-Hosted-MCU](https://github.com/espressif/esp-hosted-mcu) by [Espressif Systems](https://www.espressif.com/) diff --git a/content/components/esp32_improv.md b/content/components/esp32_improv.md index f26cfdfb81..767c0436a0 100644 --- a/content/components/esp32_improv.md +++ b/content/components/esp32_improv.md @@ -40,6 +40,8 @@ esp32_improv: - **identify_duration** (*Optional*, [Time](/guides/configuration-types#time)): The amount of time to identify for. Defaults to `10s`. - **wifi_timeout** (*Optional*, [Time](/guides/configuration-types#time)): The amount of time to wait before starting the Improv service after Wi-Fi is no longer connected. Defaults to `1min`. +- **next_url** (*Optional*, string): The URL to open after provisioning is complete. Defaults to + `https://my.home-assistant.io/redirect/config_flow_start?domain=esphome`. - **on_start** (*Optional*, [Automation](/automations)): An action to be performed when Improv is waiting for authorization and/or upon authorization. See [`on_start`](#improv-on_start). diff --git a/content/components/esphome.md b/content/components/esphome.md index 99db74d259..f62b981208 100644 --- a/content/components/esphome.md +++ b/content/components/esphome.md @@ -56,6 +56,9 @@ Advanced options: The paths in this list are relative to the directory where the YAML configuration file is located or `<...>` includes. See [`includes`](#esphome-includes). +- **includes_c** (*Optional*, list of files): The same as `includes` but for files that require C linkage. All includes + will be wrapped in `extern "C" {}`. See [`includes`](#esphome-includes). + - **libraries** (*Optional*, list of libraries): A list of libraries to include in the project. See [`libraries`](#esphome-libraries). diff --git a/content/components/hlk_fm22x.md b/content/components/hlk_fm22x.md new file mode 100644 index 0000000000..28e1d7bdd9 --- /dev/null +++ b/content/components/hlk_fm22x.md @@ -0,0 +1,337 @@ +--- +description: "Instructions for setting up an HLK-FM22x Face Recognition component in ESPHome." +title: "HLK-FM22x Face Recognition Module" +params: + seo: + description: Instructions for setting up an HLK-FM22x Face Recognition component in ESPHome. + image: face.svg +--- + +The `hlk_fm22x` component allows you to use your HLK-FM225 and HLK-FM223 face recognition modules with ESPHome. + +{{< img src="hlk-fm225.jpg" alt="HLK-FM225 Face Recognition Module" caption="HLK-FM225 Face Recognition Module ([datasheet](https://h.hlktech.com/Mobile/download/fdetail/294.html), [AliExpress](https://www.aliexpress.com/item/1005007267992270.html)). Image by [AliExpress](https://www.aliexpress.com/item/1005007267992270.html)." width="50.0%" class="align-center" >}} + +{{< img src="hlk-fm223.jpg" alt="HLK-FM223 Face Recognition Module" caption="HLK-FM223 Face Recognition Module ([datasheet](https://h.hlktech.com/Mobile/download/fdetail/295.html), [AliExpress](https://www.aliexpress.com/item/3256806438681135.html)). Image by [AliExpress](https://www.aliexpress.com/item/3256806438681135.html)." width="50.0%" class="align-center" >}} + +## Component/Hub + +The module can be powered by the 5V output. As the communication with the reader is done using UART (default baud rate is 115200), you need to have an [UART bus](uart) in your configuration with the `rx_pin` connected to the reader's `TX` and the `tx_pin` connected to the reader's `RX`. + +```yaml +# Example configuration entry +hlk_fm22x: + on_face_scan_matched: + ... + on_face_scan_unmatched: + ... + on_face_scan_invalid: + ... + on_face_info: + ... + on_enrollment_done: + ... + on_enrollment_failed: + ... +``` + +### Configuration variables + +The configuration is made up of three parts: The central component, optional individual sensors, the optional enrolling binary sensor, and the optional version text sensor. + +**Base Configuration:** + +- **uart_id** (*Optional*, ID): Manually specify the ID of the UART hub. +- **id** (*Optional*, ID): Manually specify the ID used for code generation. +- **on_face_scan_matched** (*Optional*, [Automation](automations)): An action to be performed when an enrolled face is scanned and recognized. See [`on_face_scan_matched`](#on_face_scan_matched-trigger). +- **on_face_scan_unmatched** (*Optional*, [Automation](automations)): An action to be performed when an unknown face is scanned. See [`on_face_scan_unmatched`](#on_face_scan_unmatched-trigger). +- **on_face_scan_invalid** (*Optional*, [Automation](automations)): An action to be performed when the face scan failed. See [`on_face_scan_invalid`](#on_face_scan_invalid-trigger). +- **on_face_info** (*Optional*, [Automation](automations)): An action to be performed when face information is available. See [`on_face_info`](#on_face_info-trigger). +- **on_enrollment_done** (*Optional*, [Automation](automations)): An action to be performed when a face enrollment step is successful. See [`on_enrollment_done`](#on_enrollment_done-trigger). +- **on_enrollment_failed** (*Optional*, [Automation](automations)): An action to be performed when a face enrollment step failed. See [`on_enrollment_failed`](#on_enrollment_failed-trigger). + +## Binary Sensor + +**Configuration variables:** + +- All options from [Binary Sensor](binary_sensor/index). + +## Sensor + +- **face_count**: The number of enrolled faces stored on the module. +- All options from [Sensor](sensor/index). + +- **last_face_id**: The last matched enrolled face as set by [`on_face_scan_matched`](#on_face_scan_matched-trigger). +- All options from [Sensor](sensor/index). + +- **status**: The integer representation of the internal status register of the module. +- All options from [Sensor](sensor/index). + +## Text Sensor + +- **version**: The module's firmware version. +- All options from [Text Sensor](text_sensor/index). + +- **last_face_name**: The last matched enrolled face as set by [`on_face_scan_matched`](#on_face_scan_matched-trigger). +- All options from [Text Sensor](text_sensor/index). + +## `on_face_scan_matched` Trigger + +With this configuration option you can write complex automations whenever a face scan is matched to an enrolled face. +To use the variables, use a [lambda](lambda) template, the matched face id is available inside that lambda under the variable named `face_id` and the face name under the variable named `name`. + +```yaml +on_face_scan_matched: + - text_sensor.template.publish: + id: face_state + state: !lambda 'return "Authorized face " + name + " (" + to_string(face_id) + ")";' + # Pushing a tag_scanned event based on face_id + - homeassistant.tag_scanned: !lambda |- + switch (face_id) { + case 0: + return "person_a"; + case 1: + return "person_b"; + ... + default: + return "person_unknown"; + } +``` + +## `on_face_scan_unmatched` Trigger + +With this configuration option you can write complex automations whenever an unknown face is scanned. + +```yaml +on_face_scan_unmatched: + - text_sensor.template.publish: + id: face_state + state: "Unauthorized face" +``` + +## `on_face_scan_invalid` Trigger + +With this configuration option you can write complex automations whenever a scan fails, e.g. when no face is visible. This is different from `on_face_scan_unmatched` which is triggered when an unknown face is scanned. +To use the variable, use a [lambda](lambda) template, the error number is available inside that lambda under the variable named `error`. + +```yaml +on_face_scan_invalid: + - text_sensor.template.publish: + id: face_state + state: !lambda 'return "Invalid face. Error number: " + to_string(error);' +``` + +## `on_face_info` Trigger + +With this configuration option you can write complex automations whenever face information is available. +The module sends face info during enrollment and scanning, and it's mostly useful for debugging. +To use the variables, use a [lambda](lambda) template, the status is available inside that lambda under the variable named `status`. +A zero value means normal, and the datasheet contains various error status codes (e.g. 6 for the face being too far). +There are additional values to determine the position (`left`, `top`, `right`, `bottom`) of the face in the frame as well as its rotation (`yaw`, `pitch`, `roll`). + +```yaml +on_face_info: + - text_sensor.template.publish: + id: face_info + state: !lambda |- + switch (status) { + case 0: + return "Normal"; + case 1: + return "No face detected"; + case 2: + return "Face too high"; + case 3: + return "Face too low"; + ... + default: + return "Unknown status " + to_string(status); + } +``` + +## `on_enrollment_done` Trigger + +With this configuration option you can write complex automations whenever an enrollment step for a face is successful. +To use the variables, use a [lambda](lambda) template, the slot number enrolled into is available inside that lambda under the variable named `face_id`. +Note that the value is only valid after the face has been enrolled in all directions (otherwise it will be -1). +The direction value is a bitmask representing the directions that have been captured so far. A value of `0x1f` means all directions have been captured and the face id should be valid. + +```yaml +on_enrollment_done: + - text_sensor.template.publish: + id: face_state + state: !lambda 'return "Enrolled into slot " + to_string(face_id);' +``` + +## `on_enrollment_failed` Trigger + +With this configuration option you can write complex automations whenever a face failed to be enrolled. +To use the variable, use a [lambda](lambda) template, the error number is available inside that lambda under the variable named `error`. + +```yaml +on_enrollment_failed: + - text_sensor.template.publish: + id: face_state + state: !lambda 'return "Failed to enroll face. Error: " + to_string(error);' +``` + +## `hlk_fm22x.enroll` Action + +Starts the face enrollment process with a name and direction. +To successfully enroll a face, you need to successfully and consecutively scan the face from all directions. +A failure in one direction will require enrolling the face again from the start. + +```yaml +on_...: + then: + - hlk_fm22x.enroll: + name: "My name" + direction: 1 + # Update the template text sensor for visual feedback + - text_sensor.template.publish: + id: face_state + state: "Look directly at the camera" +``` + +**Configuration options:** + +- **name** (**Required**, string, templatable): The name associated with the face. Up to 32 ASCII characters. +- **direction** (**Required**, int, templatable): The direction to scan the face for. `1` for center, `2` for right, `4` for left, `8` for down, and `16` for up. + +## `hlk_fm22x.scan` Action + +Scans and tries to match to an enrolled face. Triggers one of the on_face_scan triggers. + +```yaml +on_...: + then: + - hlk_fm22x.scan: +``` + +## `hlk_fm22x.delete` Action + +Removes the enrolled face from the slot number defined. + +```yaml +on_...: + then: + - hlk_fm22x.delete: + face_id: 0 + # Shorthand + - hlk_fm22x.delete: 0 +``` + +**Configuration options:** + +- **face_id** (**Required**, int, templatable): The slot number of the enrolled face to delete. + +## `hlk_fm22x.delete_all` Action + +Removes all enrolled faces. + +```yaml +on_...: + then: + - hlk_fm22x.delete_all: +``` + +## `hlk_fm22x.reset` Action + +Resets the module. Can be useful after a failed enrollment or scan if the module isn't responding correctly. +If this command fails it will mark the module as failed. + +```yaml +on_...: + then: + - hlk_fm22x.reset: +``` + +## All actions + +- **id** (*Optional*, ID): Manually specify the ID of the HLK-FM22x reader if you have multiple components. + +## Test setup + +With the following code you can quickly setup a node and use Home Assistant's action in the developer tools. +E.g. for calling `hlk_fm22x.enroll` select the action `esphome.test_node_enroll` and in action data enter + +```json +{ "name": "My name", "direction": 1 } +``` + +### Sample code + +```yaml +uart: + rx_pin: GPIOXX + tx_pin: GPIOXX + baud_rate: 115200 + +hlk_fm22x: + on_face_scan_invalid: + - homeassistant.event: + event: esphome.test_node_face_scan_invalid + data: + error: !lambda 'return error;' + on_face_scan_matched: + - homeassistant.event: + event: esphome.test_node_face_scan_matched + data: + face_id: !lambda 'return face_id;' + name: !lambda 'return name;' + on_face_scan_unmatched: + - homeassistant.event: + event: esphome.test_node_face_scan_unmatched + on_face_info: + - homeassistant.event: + event: esphome.test_node_face_info + data: + status: !lambda 'return status;' + left: !lambda 'return left;' + top: !lambda 'return top;' + right: !lambda 'return right;' + bottom: !lambda 'return bottom;' + yaw: !lambda 'return yaw;' + pitch: !lambda 'return pitch;' + roll: !lambda 'return roll;' + on_enrollment_done: + - homeassistant.event: + event: esphome.test_node_enrollment_done + data: + face_id: !lambda 'return face_id;' + direction: !lambda 'return direction;' + on_enrollment_failed: + - homeassistant.event: + event: esphome.test_node_enrollment_failed + data: + error: !lambda 'return error;' + +api: + actions: + - action: enroll + variables: + name: string + direction: int + then: + - hlk_fm22x.enroll: + name: !lambda 'return name;' + direction: !lambda 'return direction;' + - action: scan + then: + - hlk_fm22x.scan: + - action: delete + variables: + face_id: int + then: + - hlk_fm22x.delete: + face_id: !lambda 'return face_id;' + - action: delete_all + then: + - hlk_fm22x.delete_all: + - action: reset + then: + - hlk_fm22x.reset: +``` + +## See Also + +- {{< apiref "hlk_fm22x/hlk_fm22x.h" >}} diff --git a/content/components/i2c.md b/content/components/i2c.md index 124dfe35bd..3e6c80827f 100644 --- a/content/components/i2c.md +++ b/content/components/i2c.md @@ -9,7 +9,7 @@ params: {{< anchor "i2c" >}} -This component sets up the I²C bus for your ESP32 or ESP8266. In order for these components +This component sets up the I²C bus for your ESP32, ESP8266, RP2040 or NRF52. In order for these components to work correctly, you need to define the I²C bus in your configuration. Please note the ESP will enable its internal 10kΩ pullup resistors for these pins, so you usually don't need to put on external ones. You can use multiple devices on one I²C bus as each device is given a @@ -39,7 +39,8 @@ i2c: Defaults to `true`. - **frequency** (*Optional*, float): Set the frequency the I²C bus should operate on. - Defaults to `50kHz`. Values are `10kHz`, `50kHz`, `100kHz`, `200kHz`, ... `800kHz` + Defaults to `50kHz`. Default for NRF52 is `100kHz`. Values are `10kHz`, `50kHz`, `100kHz`, `200kHz`, ... `800kHz`. + NRF52 supports only `100kHz` and `400kHz`. - **timeout** (*Optional*, [Time](/guides/configuration-types#time)): Set the I²C bus timeout. Defaults to the framework defaults (`100us` on `esp32` with `esp-idf`, `50ms` on `esp32` with `Arduino`, diff --git a/content/components/images/hlk-fm223.jpg b/content/components/images/hlk-fm223.jpg new file mode 100644 index 0000000000..a8e1f0cddd Binary files /dev/null and b/content/components/images/hlk-fm223.jpg differ diff --git a/content/components/images/hlk-fm225.jpg b/content/components/images/hlk-fm225.jpg new file mode 100644 index 0000000000..cd86918737 Binary files /dev/null and b/content/components/images/hlk-fm225.jpg differ diff --git a/content/components/lvgl/_index.md b/content/components/lvgl/_index.md index 113b275ca3..db14270010 100644 --- a/content/components/lvgl/_index.md +++ b/content/components/lvgl/_index.md @@ -16,7 +16,10 @@ embedded graphics library to create beautiful UIs for any MCU, MPU and display t To use LVGL with a [display](/components#display-hw) in ESPHome, you'll need an ESP32 or RP2040. PSRAM is not a strict requirement but it is generally recommended, especially for large color displays. -The graphic display should be configured with `auto_clear_enabled: false` and should not have any `lambda` set. The LVGL component will take care of the display rendering. For most displays, the `update_interval` should be set to `never`, but note that some displays such as OLED and ePaper will need the update interval set to a suitable value. +The graphic display should be configured with `auto_clear_enabled: false` and should not have any `lambda` set. +The LVGL component will take care of the display rendering. For most displays, the `update_interval` should be +set to `never`, but note that some displays such as OLED and e-paper will need the update interval set to a suitable +interval, or make use of the [`on_draw_end`](#on_draw_end) trigger to manually update the display. For interactivity, a {{< docref "/components/touchscreen/index" "Touchscreen" >}} (capacitive highly preferred), a {{< docref "/components/sensor/rotary_encoder" >}} or a custom keypad made up from discrete {{< docref "/components/binary_sensor/index" "Binary Sensors" >}} can be used. @@ -498,162 +501,6 @@ on_...: border_color: 0x00FF00 ``` -{{< anchor "lvgl-layouts" >}} - -### Layouts - -Layouts aim to position widgets automatically, eliminating the need to specify `x` and `y` coordinates to position each widget. This is a great way to simplify your configuration as it allows you to omit alignment options. - -The layout configuration options are applied to any parent widget or page, influencing the appearance of the children. The position and size calculated by the layout overwrites the *normal* `x`, `y`, `width`, and `height` settings of the children. - -Check out [Flex layout positioning](/cookbook/lvgl#lvgl-cookbook-flex), [Grid layout positioning](/cookbook/lvgl#lvgl-cookbook-grid) and [Weather forecast panel](/cookbook/lvgl#lvgl-cookbook-weather) in the Cookbook for examples which demonstrate how to automate widget positioning, potentially reducing the size of your device's YAML configuration, and saving you from lots of manual calculations. - -The `hidden`, `ignore_layout` and `floating` [flags](/components/lvgl/widgets#lvgl-widget-flags) can be used on widgets to ignore them in layout calculations. - -#### Configuration variables - -- **layout** (*Optional*, dict): A dictionary describing the layout configuration: - - **type** (*Optional*, string): `FLEX`, `GRID` or `NONE`. Defaults to `NONE`. - - Further options from below depending on the chosen type. - -#### Flex - -The Flex layout in LVGL is a subset implementation of [CSS Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/). - -It can arrange items into rows or columns (tracks), handle wrapping, adjust spacing between items and tracks and even handle growing the layout to make the item(s) fill the remaining space with respect to minimum/maximum width and height. - -**Terms used:** - -- *track*: the rows or columns *main* direction flow: row or column in the direction in which the items are placed one after the other. -- *cross direction*: perpendicular to the main direction. -- *wrap*: if there is no more space in the track a new track is started. -- *gap*: the space between the rows and columns or the items on a track. -- *grow*: if set on an item it will grow to fill the remaining space on the track. The available space will be distributed among items respective to their grow value (larger value means more space). It dictates what amount of the available space the widget should take up. For example if all items on the track have a `grow` set to `1`, the space in the track will be distributed equally to all of them. If one of the items has a value of 2, that one would take up twice as much of the space as either one of the others. - -**Configuration variables:** - -- **flex_flow** (*Optional*, string): Select the arrangement of the children widgets: -- `ROW` : place the children in a row without wrapping. -- `COLUMN` : place the children in a column without wrapping. -- `ROW_WRAP` : place the children in a row with wrapping (default). -- `COLUMN_WRAP` : place the children in a column with wrapping. -- `ROW_REVERSE` : place the children in a row without wrapping but in reversed order. -- `COLUMN_REVERSE` : place the children in a column without wrapping but in reversed order. -- `ROW_WRAP_REVERSE` : place the children in a row with wrapping but in reversed order. -- `COLUMN_WRAP_REVERSE` : place the children in a column with wrapping but in reversed order. - -- **flex_align_main** (*Optional*, string): Determines how to distribute the items in their track on the *main* axis. For example, flush the items to the right on with `flex_flow: ROW_WRAP` (known as *justify-content* in CSS). Possible options below. -- **flex_align_cross** (*Optional*, string): Determines how to distribute the items in their track on the *cross* axis. For example, if the items have different height place them to the bottom of the track (known as *align-items* in CSS). Possible options below. -- **flex_align_track** (*Optional*, string): Determines how to distribute the tracks (known as *align-content* in CSS). Possible options below. - - Values for use with `flex_align_main`, `flex_align_cross`, `flex_align_track` : - -- `START` : means left horizontally and top vertically (default). -- `END` : means right horizontally and bottom vertically. -- `CENTER` : simply center. -- `SPACE_EVENLY` : items are distributed so that the spacing between any two items (and the space to the edges) is equal. Does not apply to `flex_align_track`. -- `SPACE_AROUND` : items are evenly distributed in the track with equal space around them. Note that visually the spaces aren't equal, since all the items have equal space on both sides. The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies. Does not apply to `flex_align_track`. -- `SPACE_BETWEEN` : items are evenly distributed in the track: first item is on the start line, last item on the end line. Does not apply to `flex_align_track`. - -- **pad_row** (*Optional*, int16): Set the padding between the rows, in pixels. -- **pad_column** (*Optional*, int16): Set the padding between the columns, in pixels. -- **flex_grow** (*Optional*, int16): Can be used to make one or more children fill the available space on the track. When one or more children have `flex_grow` set, the available space will be distributed proportionally to the grow values. Defaults to `0`, which disables growing. - -```yaml -# Example flex layout - -- obj: - layout: - type: flex - pad_row: 4 - pad_column: 4px - flex_align_main: center - flex_align_cross: start - flex_align_track: end - widgets: - - animimg: - flex_grow: 1 -``` - -#### Grid - -The Grid layout in LVGL is a subset implementation of [CSS Grid](https://css-tricks.com/snippets/css/complete-guide-grid//). - -It can arrange items into a 2D "table" that has rows or columns (tracks). The item(s) can span through multiple columns or rows. The track's size can be set in pixels, to the largest item of the track (`CONTENT` ) or in "free units" to distribute the free space proportionally. - -**Terms used:** - -- *tracks*: the rows or the columns. -- *gap*: the space between the rows and columns or the items on a track. -- *free unit (FR)*: a proportional distribution unit for the space available on the track. It accepts a unitless integer value that serves as a proportion. It dictates what amount of the available space the widget should take up. For example if all items on the track have a `FR` set to `1`, the space in the track will be distributed equally to all of them. If one of the items has a value of 2, that one would take up twice as much of the space as either one of the others. - -Child widgets can be placed on the grid using the `grid_cell_row_pos` and `grid_cell_column_pos` configuration variables. -If either is specified both must be specified. If neither is specified the widget will be placed in the first available position, in a row-major order. -Row and column spans will be taken into account when reserving space. - -**Configuration variables (must be placed under the layout key):** - -- **grid_rows** (**Required**): The number of rows in the grid, expressed a list of values in pixels, `CONTENT` or `FR(n)` (free units, where `n` is a proportional integer value). -- **grid_columns** (**Required**): The number of columns in the grid, expressed a list of values in pixels, `CONTENT` or `FR(n)` (free units, where `n` is a proportional integer value). -- **grid_row_align** (*Optional*, string): How to align the row. Works only when `grid_rows` is given in pixels. Possible options below. -- **grid_column_align** (*Optional*, string): How to align the column. Works only when `grid_columns` is given in pixels. Possible options below. -- **pad_row** (*Optional*, int16): Set the padding between the rows, in pixels. -- **pad_column** (*Optional*, int16): Set the padding between the columns, in pixels. - -In a grid layout, *all the widgets placed on the grid* can have some additional configuration variables to help with placement: - -- **grid_cell_row_pos** (*Optional*, int16): Position of the widget, in which row to appear (0 based count). -- **grid_cell_column_pos** (*Optional*, int16): Position of the widget, in which column to appear (0 based count). -- **grid_cell_x_align** (*Optional*, string): How to align the widget horizontally within the cell. Can also be applied through [Style properties](#lvgl-styling). Possible options below. -- **grid_cell_y_align** (*Optional*, string): How to align the widget vertically within the cell. Can also be applied through [Style properties](#lvgl-styling). Possible options below. -- **grid_cell_row_span** (*Optional*, int16): How many rows to span across the widget. Defaults to `1`. -- **grid_cell_column_span** (*Optional*, int16): How many columns to span across the widget.. Defaults to `1`. - -> [!NOTE] -> These `grid_cell_` variables are applied to individual widgets (cells) within the grid layout! - -Values for use with `grid_column_align`, `grid_row_align`, `grid_cell_x_align`, `grid_cell_y_align` : - -- `START` : means left horizontally and top vertically (default). -- `END` : means right horizontally and bottom vertically. -- `CENTER` : simply center. -- `STRETCH` : stretch the widget to the cell in the respective direction. Does not apply to `grid_column_align`, `grid_row_align`. -- `SPACE_EVENLY` : items are distributed so that the spacing between any two items (and the space to the edges) is equal. -- `SPACE_AROUND` : items are evenly distributed in the track with equal space around them. Note that visually the spaces aren't equal, since all the items have equal space on both sides. The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies. -- `SPACE_BETWEEN` : items are evenly distributed in the track: first item is on the start line, last item on the end line. - -```yaml -# Example grid layout - -- obj: - layout: - type: grid - grid_row_align: end - grid_rows: [25px, fr(1), content] - grid_columns: [fr(1), fr(1)] - pad_row: 6px - pad_column: 0 - widgets: - - image: - grid_cell_row_pos: 0 - grid_cell_column_pos: 0 - - obj: - grid_cell_row_pos: 0 - grid_cell_column_pos: 1 - - obj: - grid_cell_row_pos: 2 - grid_cell_column_pos: 0 - - label: - text: "This will be placed in row 1, column 0" - - label: - text: "This will be placed in row 1, column 1" - - label: - text: "This will be placed in row 2, column 1, since 2/0 is occupied" -``` - -> [!TIP] -> To visualize real, calculated sizes of transparent widgets you can temporarily set `outline_width: 1` on them. - {{< anchor "lvgl-gradients" >}} ### Gradients @@ -983,6 +830,22 @@ This [trigger](/components/lvgl/widgets#lvgl-automation-triggers) is triggered w This [trigger](/components/lvgl/widgets#lvgl-automation-triggers) is triggered after LVGL has been setup. It is also available on any widget, but the timing is the same. +### `on_draw_start` + +This [trigger](#lvgl-automation-triggers) is executed before each LVGL drawing operation. + +### `on_draw_end` + +This [trigger](#lvgl-automation-triggers) is executed after LVGL has completed drawing all updated screen elements. It +may be used for example to trigger an update of a display component like an e-paper screen that requires the buffer +to be sent to the display for it to be updated. + +```yaml +lvgl: + on_draw_end: + component.update: my_display_id +``` + ## See Also - {{< docref "/cookbook/lvgl" "LVGL Examples in the Cookbook" >}} diff --git a/content/components/lvgl/images/lvgl_grid_layout.png b/content/components/lvgl/images/lvgl_grid_layout.png new file mode 100644 index 0000000000..c6fa9de7c6 Binary files /dev/null and b/content/components/lvgl/images/lvgl_grid_layout.png differ diff --git a/content/components/lvgl/layouts.md b/content/components/lvgl/layouts.md new file mode 100644 index 0000000000..a4bf537309 --- /dev/null +++ b/content/components/lvgl/layouts.md @@ -0,0 +1,254 @@ +--- +description: "LVGL Layouts" +title: "LVGL Layouts" +--- + +{{< anchor "lvgl-layouts" >}} + +## LVGL Layouts + +Layouts aim to position widgets automatically, eliminating the need to specify `x` and `y` coordinates to position each +widget. This is a great way to simplify your configuration as it allows you to omit alignment options. + +The layout configuration options are applied to any parent widget or page, influencing the appearance of the children. +The position and size calculated by the layout override the *normal* `x`, `y`, `width`, and `height` settings of the +children. + +Check out [Flex layout positioning](#lvgl-cookbook-flex), [Grid layout positioning](#lvgl-cookbook-grid) +and [Weather forecast panel](#lvgl-cookbook-weather) in the Cookbook for examples which demonstrate how to automate +widget positioning, potentially reducing the size of your device's YAML configuration, and saving you from lots of +manual calculations. + +The `hidden`, `ignore_layout` and `floating` [flags](#lvgl-widget-flags) can be used on widgets to ignore them in layout +calculations. + +### Configuration variables + +- **layout** (*Optional*, dict): One of `HORIZONTAL`, `VERTICAL` or a dictionary describing the layout configuration: + - **type** (*Optional*, string): `FLEX`, `GRID` or `NONE`. Defaults to `NONE`. + - Further options from below depending on the chosen type. + +### Horizontal Layout + +The configuration `layout: horizontal` is a shorthand for a flex layout: + +```yaml + layout: + type: flex + flex_flow: row + flex_align_main: space_evenly + flex_align_track: center + flex_align_cross: stretch +``` + +### Vertical Layout + +The configuration `layout: vertical` is a shorthand for a flex layout: + +```yaml + layout: + type: flex + flex_flow: column + flex_align_main: space_evenly + flex_align_track: center + flex_align_cross: stretch +``` + +### Flex + +The Flex layout in LVGL is a subset implementation +of [CSS Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/). + +It can arrange items into rows or columns (tracks), handle wrapping, adjust spacing between items and tracks and even +handle growing the layout to make the item(s) fill the remaining space with respect to minimum/maximum width and height. + +**Terms used:** + +- *track*: the rows or columns *main* direction flow: row or column in the direction in which the items are placed one + after the other. +- *cross direction*: perpendicular to the main direction. +- *wrap*: if there is no more space in the track a new track is started. +- *gap*: the space between the rows and columns or the items on a track. +- *grow*: if set on an item it will grow to fill the remaining space on the track. The available space will be + distributed among items respective to their grow value (larger value means more space). It dictates what amount of the + available space the widget should take up. For example if all items on the track have a `grow` set to `1`, the space + in the track will be distributed equally to all of them. If one of the items has a value of 2, that one would take up + twice as much of the space as either one of the others. + +**Configuration variables:** + +- **flex_flow** (*Optional*, string): Select the arrangement of the children widgets: +- `ROW` : place the children in a row without wrapping. +- `COLUMN` : place the children in a column without wrapping. +- `ROW_WRAP` : place the children in a row with wrapping (default). +- `COLUMN_WRAP` : place the children in a column with wrapping. +- `ROW_REVERSE` : place the children in a row without wrapping but in reversed order. +- `COLUMN_REVERSE` : place the children in a column without wrapping but in reversed order. +- `ROW_WRAP_REVERSE` : place the children in a row with wrapping but in reversed order. +- `COLUMN_WRAP_REVERSE` : place the children in a column with wrapping but in reversed order. + +- **flex_align_main** (*Optional*, string): Determines how to distribute the items in their track on the *main* axis. + For example, flush the items to the right on with `flex_flow: ROW_WRAP` (known as *justify-content* in CSS). Possible + options below. +- **flex_align_cross** (*Optional*, string): Determines how to distribute the items in their track on the *cross* axis. + For example, if the items have different heights then `flex_align_cross: end` will align each item to the bottom of + the track (known as *align-items* in CSS). + Possible options below. +- **flex_align_track** (*Optional*, string): Determines how to distribute the tracks (known as *align-content* in CSS). + Possible options below. + + Values for use with `flex_align_main`, `flex_align_cross`, `flex_align_track` : + +- `START` : means left horizontally and top vertically (default). +- `END` : means right horizontally and bottom vertically. +- `CENTER` : simply center. +- `SPACE_EVENLY` : items are distributed so that the spacing between any two items (and the space to the edges) is + equal. Does not apply to `flex_align_track`. +- `SPACE_AROUND` : items are evenly distributed in the track with equal space around them. Note that visually the + spaces aren't equal, since all the items have equal space on both sides. The first item will have one unit of space + against the container edge, but two units of space between the next item because that next item has its own spacing + that applies. Does not apply to `flex_align_track`. +- `SPACE_BETWEEN` : items are evenly distributed in the track: first item is on the start line, last item on the end + line. Does not apply to `flex_align_track`. + +The `flex_align_cross` option may also take the argument `STRETCH` which will cause the items to fill the available +space on the cross axis. This is achieved by setting the default height or width of each item to 100%. An explicit +height or width on an item will override this. + +- **pad_row** (*Optional*, int16): Set the padding between the rows, in pixels. +- **pad_column** (*Optional*, int16): Set the padding between the columns, in pixels. +- **flex_grow** (*Optional*, int16): Can be used to make one or more children fill the available space on the track. + When one or more children have `flex_grow` set, the available space will be distributed proportionally to the grow + values. Defaults to `0`, which disables growing. + +```yaml +# Example flex layout + +- obj: + layout: + type: flex + pad_row: 4 + pad_column: 4px + flex_align_main: center + flex_align_cross: start + flex_align_track: end + widgets: + - animimg: + flex_grow: 1 +``` + +### Grid + +The Grid layout in LVGL is a subset implementation +of [CSS Grid](https://css-tricks.com/snippets/css/complete-guide-grid//). + +It can arrange items into a 2D "table" that has rows or columns (tracks). The item(s) can span through multiple columns +or rows. The track's size can be set in pixels, to the largest item of the track (`CONTENT`) or in "free units" to +distribute the free space proportionally. + +**Terms used:** + +- *tracks*: the rows or the columns. +- *gap*: the space between the rows and columns or the items on a track. +- *free unit (FR)*: a proportional distribution unit for the space available on the track. It accepts a unitless integer + value that serves as a proportion. It dictates what amount of the available space the widget should take up. For + example if all items on the track have a `FR` set to `1`, the space in the track will be distributed equally to all of + them. If one of the items has a value of 2, that one would take up twice as much of the space as either one of the + others. + +Child widgets can be placed on the grid using the `grid_cell_row_pos` and `grid_cell_column_pos` configuration +variables. +If either is specified both must be specified. If neither is specified the widget will be placed in the first available +position, in a row-major order. +Row and column spans will be taken into account when reserving space. + +#### Shorthand + +The configuration `layout: x` is a shorthand for a grid layout with the specified number of rows and +columns, with all rows and columns of equal size. For example `layout: 2x3` is a shorthand for +`layout: { type: grid, grid_rows: [2], grid_columns: [3] }` with +`FR(1)` set for all rows and columns. + +**Configuration variables (must be placed under the layout key):** + +- **grid_rows** (**Required**): The number of rows in the grid, expressed a list of values in pixels, `CONTENT` or + `FR(n)` (free units, where `n` is a proportional integer value). +- **grid_columns** (**Required**): The number of columns in the grid, expressed a list of values in pixels, `CONTENT` or + `FR(n)` (free units, where `n` is a proportional integer value). +- **grid_row_align** (*Optional*, string): How to align the row. Works only when `grid_rows` is given in pixels. + Possible options below. +- **grid_column_align** (*Optional*, string): How to align the column. Works only when `grid_columns` is given in + pixels. Possible options below. +- **pad_row** (*Optional*, int16): Set the padding between the rows, in pixels. +- **pad_column** (*Optional*, int16): Set the padding between the columns, in pixels. + +In a grid layout, *all the widgets placed on the grid* can have some additional configuration variables to help with +placement: + +- **grid_cell_row_pos** (*Optional*, int16): Position of the widget, in which row to appear (0 based count). +- **grid_cell_column_pos** (*Optional*, int16): Position of the widget, in which column to appear (0 based count). +- **grid_cell_x_align** (*Optional*, string): How to align the widget horizontally within the cell. Can also be applied + through [Style properties](#lvgl-styling). Possible options below. +- **grid_cell_y_align** (*Optional*, string): How to align the widget vertically within the cell. Can also be applied + through [Style properties](#lvgl-styling). Possible options below. +- **grid_cell_row_span** (*Optional*, int16): How many rows to span across the widget. Defaults to `1`. +- **grid_cell_column_span** (*Optional*, int16): How many columns to span across the widget. Defaults to `1`. + +> [!NOTE] +> These `grid_cell_` variables are applied to individual widgets (cells) within the grid layout! + +Values for use with `grid_column_align`, `grid_row_align`, `grid_cell_x_align`, `grid_cell_y_align` : + +- `START` : means left horizontally and top vertically (default). +- `END` : means right horizontally and bottom vertically. +- `CENTER` : simply center. +- `STRETCH` : stretch the widget to the cell in the respective direction. Does not apply to `grid_column_align`, + `grid_row_align`. +- `SPACE_EVENLY` : items are distributed so that the spacing between any two items (and the space to the edges) is + equal. +- `SPACE_AROUND` : items are evenly distributed in the track with equal space around them. Note that visually the + spaces aren't equal, since all the items have equal space on both sides. The first item will have one unit of space + against the container edge, but two units of space between the next item because that next item has its own spacing + that applies. +- `SPACE_BETWEEN` : items are evenly distributed in the track: first item is on the start line, last item on the end + line. + +```yaml +# Example grid layout + +- obj: + layout: + type: grid + grid_row_align: end + grid_rows: [ 100px, fr(1), content ] + grid_columns: [ fr(1), fr(1) ] + pad_row: 12px + pad_column: 12px + widgets: + - image: + src: image_id + grid_cell_row_pos: 0 + grid_cell_column_pos: 0 + on_click: + lvgl.page.next: + - label: + text: "row 0, column 1" + grid_cell_row_pos: 0 + grid_cell_column_pos: 1 + - label: + text: "row 2, column 0" + grid_cell_row_pos: 2 + grid_cell_column_pos: 0 + - label: + text: "row 1, column 0" + - label: + text: "row 1, column 1" + - label: + long_mode: wrap + text: "row 2, col 1 (2/0 occupied)" +``` + +{{< img src="lvgl_grid_layout.png" alt="Image" class="align-center" >}} + +> [!TIP] +> To visualize real, calculated sizes of transparent widgets you can temporarily set `outline_width: 1` on them. diff --git a/content/components/lvgl/widgets.md b/content/components/lvgl/widgets.md index 06b441e50b..cbf73ad391 100644 --- a/content/components/lvgl/widgets.md +++ b/content/components/lvgl/widgets.md @@ -165,6 +165,9 @@ The text value may also be a lambda returning a `std::string` or may be specified with a `format` property utilising `printf` style formatting. There is also a `time_format` option which allows use of [strftime](http://www.cplusplus.com/reference/ctime/strftime/) formats. +When formatting a single floating point value, it is possible to provide a substitute string to be used when the +value is `nan` or `inf`. The substitute string is specified with the `if_nan` option. + **Examples:** ```yaml @@ -199,6 +202,12 @@ on_...: text: time_format: "%c" time: !lambda return id(sntp_id).utcnow(); + - lvgl.label.update: + id: value_id + text: + format: "%.1f" + args: [id(sensor_id).state] + if_nan: "N/A" ``` {{< anchor "lvgl-widget-animimg" >}} @@ -789,6 +798,35 @@ on_...: The `checkbox` can be also integrated as a {{< docref "/components/switch/lvgl" "Switch" >}} component. +{{< anchor "lvgl-widget-container" >}} + +## `container` + +A `container` is an unstyled widget that is, as the name suggests, intended to act as a container for other widgets. +It is functionally identical to an [`obj`](#obj) but has no styles applied to it, so without any styling or widgets +it is invisible. It has a default width and height of 100%. + +**Configuration variables:** + +- Style options from [Style properties](#lvgl-styling). + +**Triggers:** + +- [interaction](#lvgl-automation-triggers) LVGL event triggers. + +**Example:** + +```yaml +# Example widget: +- container: + x: 10 + y: 10 + width: 220 + height: 300 + widgets: + - ... +``` + {{< anchor "lvgl-widget-dropdown" >}} ## `dropdown` @@ -1334,7 +1372,9 @@ The base object is just a simple, empty widget. By default, it's nothing more th {{< img src="lvgl_baseobj.png" alt="Image" class="align-center" >}} -You can use it as a parent container for other widgets. By default, it catches touches. +You can use it as a parent container for other widgets. By default, it catches touches. Since `obj` has default +styling applied, you may choose to use [`container`](#container) instead if the role is simply to group other +widgets. **Configuration variables:** diff --git a/content/components/media_player/speaker.md b/content/components/media_player/speaker.md index 6e93320e8f..1f74e8adf7 100644 --- a/content/components/media_player/speaker.md +++ b/content/components/media_player/speaker.md @@ -45,7 +45,7 @@ media_player: - **media_pipeline** (*Optional*, Pipeline Schema): Configuration settings for the media pipeline. Same options as the `announcement_pipeline`. - **buffer_size** (*Optional*, positive integer): The buffer size in bytes for each pipeline. Must be between `4000` and `4000000`. Defaults to `1000000`. -- **codec_support_enabled** (*Optional*, boolean): Enables the MP3 and FLAC decoders and optimizes the WiFi configuration for streaming high quality audio. Defaults to `true`. +- **codec_support_enabled** (*Optional*, boolean): Enables the MP3 and FLAC decoders. Defaults to `true`. - **task_stack_in_psram** (*Optional*, boolean): Run the audio tasks in external memory. Defaults to `false`. - **volume_increment** (*Optional*, percentage): Increment amount that the `media_player.volume_up` and `media_player.volume_down` actions will increase or decrease volume by. Defaults to `5%`. - **volume_initial** (*Optional*, percentage): The default volume that mediaplayer uses for first boot where a volume has not been previously saved. Defaults to `50%`. @@ -171,6 +171,17 @@ Configuration variables: Decoding audio files is CPU and memory intensive. PSRAM external memory is strongly recommended. To use the component on a memory constrained device, define only the announcement pipeline, decrease the buffer size, set `codec_support_enabled` to false, and set the pipeline transcode setting format to `WAV` with a low sample rate and only 1 channel. +### Network Optimizations + +The speaker media player automatically enables high-performance networking to optimize audio streaming. This configures both WiFi and TCP/IP settings for better throughput and lower latency. The optimization level is PSRAM-aware: + +- **With PSRAM guaranteed** ({{< docref "psram" >}} configured with `ignore_not_found: false`): Aggressive settings with 512KB TCP windows and 512 WiFi RX buffers +- **Without PSRAM guaranteed**: Conservative optimized settings with 65KB TCP windows and 64 WiFi buffers + +If you experience out-of-memory issues, you can disable these optimizations by setting `enable_high_performance: false` in the {{< docref "network" >}} component configuration. + +### Audio Codec Performance + In general, decoding FLAC has the lowest CPU usage, but requires a strong WiFi connection. Decoding MP3 requires less data to be sent over WiFi but is more CPU intensive to decode. Decoding WAV is only recommended at low sample rates if streamed over a network connection. Increasing the buffer size may reduce stuttering, but do not set it to the entire size of the external memory. Each pipeline allocates the configured amount, and this setting also does not take into account other smaller buffers allocated throughout the audio stack. @@ -183,12 +194,16 @@ Only set `task_stack_in_psram` to true if you have many components configured an While you are troubleshooting, simplify your setup as much as possible. Only configure the `announcement_pipeline` and do not use `resampler` or `mixer` speakers. +### Audio Issues + If you can't hear anything, check whether your hardware requires a GPIO pin to be high or low to enable the speaker. Verify you have the correct speaker channel configured: try setting your speaker configuration to stereo if you are unsure which channels are available. If the audio quality is poor, check your output speaker configuration. Experiment with the bits per sample, channels, and sample rate settings. In general, higher sample rates improve audio quality: try using `44100` Hz or `48000` Hz instead of `16000` Hz. If there is a noticeable delay before a pause command takes effect, reduce the buffer duration in the output speaker. Be sure to adjust both the hardware speaker component settings and the `mixer` speaker component settings, if used. +If audio stutters, and your device has PSRAM, add ({{< docref "psram" >}} configured with `ignore_not_found: false`) so that the networking stack uses higher performance optimization settings. + ## See also - {{< docref "/components/speaker" >}} diff --git a/content/components/network.md b/content/components/network.md index 5fc4aa5e48..f1b0dafc14 100644 --- a/content/components/network.md +++ b/content/components/network.md @@ -3,7 +3,7 @@ description: "Network component" title: "Network component" params: seo: - description: + description: image: network-wifi.svg --- @@ -15,12 +15,36 @@ networks (WiFi, Ethernet). network: enable_ipv6: true min_ipv6_addr_count: 2 + enable_high_performance: true ``` ## Configuration variables - **enable_ipv6** (*Optional*, boolean): Enables IPv6 support. Defaults to `false`. - **min_ipv6_addr_count** (*Optional*, integer): ESPHome considers the network to be connected when it has one IPv4 address and this number of IPv6 addresses. Defaults to `0` so as to not hang on boot with networks where IPv6 is not enabled. `2` is typically a reasonable value for configurations requiring IPv6. +- **enable_high_performance** (*Optional*, boolean): Explicitly enables or disables high-performance networking optimizations. Only supported on ESP32 devices. When not specified, this is automatically enabled by components that benefit from optimized network settings. Set to `false` to disable these optimizations if they cause memory issues on your device. Defaults to component-driven behavior. + +## High-performance networking + +The network component can automatically apply optimized settings for components that require high throughput or low latency, such as media streaming. When enabled, this feature configures both the lwIP TCP/IP stack and WiFi driver with settings optimized for performance. + +### PSRAM-Aware Optimizations + +The optimization level depends on whether PSRAM is guaranteed to be available (configured via the {{< docref "psram" >}} component with `ignore_not_found: false`): + +**With PSRAM guaranteed:** + +- TCP send/receive buffers: 512KB windows with window scaling enabled +- WiFi RX buffers: 512 dynamic buffers +- WiFi TX buffers: 32 static buffers +- AMPDU aggregation: Optimized block acknowledgment windows + +**Without PSRAM (or when not guaranteed):** + +- TCP send/receive buffers: 65KB windows +- WiFi RX buffers: 64 dynamic buffers +- WiFi TX buffers: 64 dynamic buffers +- AMPDU aggregation: Standard block acknowledgment windows > [!NOTE] > The [lwIP](https://savannah.nongnu.org/projects/lwip/) library used for the network component currently only implements IPv6 SLAAC according to [RFC4862](https://datatracker.ietf.org/doc/rfc4862/). The interface identifier (IID) is directly generated from the device MAC address. @@ -29,5 +53,5 @@ network: ## See Also -- {{< docref "/components/wifi" >}} -- {{< docref "/components/ethernet" >}} +- {{< docref "wifi/" >}} +- {{< docref "ethernet/" >}} diff --git a/content/components/openthread.md b/content/components/openthread.md index 196292d1e8..8a52f2ec10 100644 --- a/content/components/openthread.md +++ b/content/components/openthread.md @@ -9,12 +9,12 @@ params: [Thread](https://www.threadgroup.org) is a low-power mesh networking standard for IoT devices. The low-power aspect is important for battery-powered smart home devices. However, it’s also low-bandwidth, making it ideal for applications that don’t send a lot of data, like switches or motion sensors. -Thread uses the same RF technology as Zigbee (IEEE 802.15.4) but provides IP connectivity similar to Wi-Fi. Unlike Zigbee, Thread by itself does not allow controlling devices: It is just a communication protocol. To control the Thread devices, a higher-level protocol is required: Matter or Apple HomeKit or {{< docref "/components/api" "ESPHome API" >}}. +Thread uses the same RF technology as Zigbee (IEEE 802.15.4), but provides IPv6 connectivity similar to Wi-Fi. Unlike Zigbee, Thread by itself does not allow controlling devices: It is just a communication protocol. To control the Thread devices, a higher-level protocol is required: Matter or Apple HomeKit or {{< docref "/components/api" "ESPHome API" >}}. -The purpose of this component is to allow ESPHome nodes to communicate over a Thread network. It permits the state of sensors and binary sensors to be send to Home Assistant via 6LoWPAN packets. This OpenThread component relies on [OpenThread](https://openthread.io) which is an open-source implementation of Thread. +This component allows ESPHome nodes to communicate with Home Assistant over a Thread network. It permits sending sensor state to Home Assistant and receiving {{< docref "/components/ota/index" "Over-the-Air Updates (OTA)" >}}. This OpenThread component relies on [OpenThread](https://openthread.io) which is an open-source implementation of Thread. > [!NOTE] -> You will need a [Thread border router](https://www.home-assistant.io/integrations/thread#about-thread-border-routers) to connect your node to a Thread network. +> You will need a [Thread border router](https://www.home-assistant.io/integrations/thread#about-thread-border-routers) to connect your node to a Thread network. The border router adapts IPv6 packets on your Home Assistant network to 6LoWPAN packets on your Thread network, allowing communication across both networks. ## Usage @@ -62,6 +62,12 @@ openthread: - **extpanid** (string): 8-byte Extended Personal Area Network ID (XPAN ID) - **pskc** (string): PSKc is used to authenticate an external Thread Commissioner to a Thread network - **mesh_local_prefix** (ipv6network): Used to build Mesh-Local IPv6 addresses (ML-EIDs), which are unique to each Thread device within the network partition +- **use_address** (*Optional*, string): Manually override what address to use to connect + to the ESP. Defaults to auto-generated value. +- **poll_period** (*Optional*, [Time](#config-time)): When Poll_Period is set on an MTD device, the parent router will enqueue any messages and wait for the child to submit a poll data request + +> [!NOTE] +> esphome.ota does not work when poll_period > 0, instead use http_request.ota, timeout and watchdog_timeout need to be tested to find the correct values. Values greater than 100sec may be required. ## Dataset TLV Configuration @@ -83,3 +89,8 @@ See - **FTD** - Full Thread Device, sets CONFIG_OPENTHREAD_FTD, observed behavior is that this enables a REED (Router Eligible End Device) and can be promoted to a Router. - **MTD** - Minimal Thread Device, sets CONFIG_OPENTHREAD_MTD, cannot be promoted to Router. Switching back from MTD to FTD will not result in a REED unless Non Volatile Storage (NVS) is cleared. + +## Sleepy End Device (SED) + +The Poll Period makes the device behave as a SED. Follow on work is needed utilizing Power Management and/or Light Sleep capability in esp-idf. +If the device is always awake, the API timeout is 60 seconds, so a ping request will force interaction with the parent when the poll period is greater than 60 seconds. diff --git a/content/components/ota/esphome.md b/content/components/ota/esphome.md index 26cb556fea..a34da9fb79 100644 --- a/content/components/ota/esphome.md +++ b/content/components/ota/esphome.md @@ -10,7 +10,7 @@ params: {{< anchor "config-ota_esphome" >}} ESPHome's Over-The-Air (OTA) platform allows you to remotely install modified/updated firmware binaries onto your -ESPHome devices over their network (Wi-Fi or Ethernet) interface. +ESPHome devices over their network interface (Wi-Fi / Ethernet / Thread). This platform is used by both the ESPHome dashboard as well as the command line interface (CLI) (via `esphome run ...` ) to install firmware onto supported devices. diff --git a/content/components/output/gp8403.md b/content/components/output/gp8403.md index 232ad097c7..fd75e770fe 100644 --- a/content/components/output/gp8403.md +++ b/content/components/output/gp8403.md @@ -7,7 +7,8 @@ params: image: gp8403.svg --- -The `gp8403` is a 2-channel DAC output module. It requires an {{< docref "/components/i2c" >}} to be setup. +The ``gp8403`` (12-bit) and ``gp8413`` (15-bit) are 2-channel DAC output modules respectively. They +require an {{< docref "/components/i2c" >}} to be setup. ## Component/Hub @@ -15,12 +16,14 @@ The `gp8403` is a 2-channel DAC output module. It requires an {{< docref "/compo gp8403: id: my_gp8403 voltage: 5V + model: GP8403 ``` Configuration variables: - **id** (*Optional*, [ID](/guides/configuration-types#id)): Manually specify the ID used for code generation. - **voltage** (**Required**, voltage): The output voltage range of the DAC. Must be one of `5V` or `10V`. +- **model** (*Optional*, enum): GP8403 for the 12 bit model and GP8413 for the 15 bit model. Defaults to GP8403. ## Output @@ -41,7 +44,6 @@ Configuration variables: - **id** (*Optional*, [ID](/guides/configuration-types#id)): Manually specify the ID used for code generation. - **gp8403_id** (*Optional*, [ID](/guides/configuration-types#id)): The ID of the GP8403 component. Defaults to the only GP8403 component if there is only one. - - **channel** (**Required**, int): The channel of the GP8403 to use. Must be `0` or `1`. - All other options from [Base Output Configuration](/components/output#config-output). diff --git a/content/components/packages.md b/content/components/packages.md index 250626cfa1..29d223287f 100644 --- a/content/components/packages.md +++ b/content/components/packages.md @@ -182,7 +182,7 @@ captive_portal: sensor: - platform: uptime id: uptime_sensor - update_interval: 1min + update_interval: 5min ``` ```yaml @@ -194,6 +194,31 @@ sensor: update_interval: 10s ``` +`!extend` also works with substitutions and jinja: + +```yaml +substitutions: + switches: + - left_switch + - right_switch + - center_switch + + mains_switch: 1 + +switch: + - platform: gpio + id: left_switch + pin: 1 + - platform: gpio + id: right_switch + pin: 2 + - platform: gpio + id: center_switch + pin: 3 + - id: !extend ${ switches[mains_switch] } + name: "Mains switch" +``` + {{< anchor "config-packages_remove" >}} ## Remove @@ -229,6 +254,19 @@ sensor: update_interval: !remove ``` +`!remove` also works with substitutions: + +```yaml +substitutions: + disable_reboot: true + +switch: + - platform: restart + id: restart_switch + name: "Living Room Restart" + - id: !remove ${disable_reboot and "restart_switch"} +``` + ## See Also - {{< docref "/index" "ESPHome index" >}} diff --git a/content/components/packet_transport/_index.md b/content/components/packet_transport/_index.md index 701b428bae..a2bdd819cc 100644 --- a/content/components/packet_transport/_index.md +++ b/content/components/packet_transport/_index.md @@ -12,7 +12,7 @@ params: The purpose of this component is to allow ESPHome nodes to directly communicate with each over a communication channel. It permits the state of sensors and binary sensors to be transmitted from one node to another, without the need for a central server or broker. The actual transport channel is provided by another component. Currently the supported -transports are {{< docref "/components/sx126x" >}}, {{< docref "/components/sx127x" >}}, {{< docref "/components/uart" >}} and {{< docref "/components/udp" >}}. +transports are {{< docref "/components/espnow" >}}, {{< docref "/components/sx126x" >}}, {{< docref "/components/sx127x" >}}, {{< docref "/components/uart" >}} and {{< docref "/components/udp" >}}. Nodes may be *providers* which transmit or broadcast sensor data, or *consumers* which receive sensor data from one or more providers. A node may be both a provider and a consumer. Optional security is provided by one or more of: diff --git a/content/components/packet_transport/espnow.md b/content/components/packet_transport/espnow.md new file mode 100644 index 0000000000..4212522106 --- /dev/null +++ b/content/components/packet_transport/espnow.md @@ -0,0 +1,194 @@ +--- +description: "Instructions for setting up an ESP-NOW packet transport platform on ESPHome" +title: "ESP-NOW Packet Transport Platform" +params: + seo: + description: Instructions for setting up an ESP-NOW packet transport platform on ESPHome + image: espnow.svg +--- + +{{< anchor "espnow-packet-transport" >}} + +The [Packet Transport Component](#packet-transport) platform allows ESPHome nodes to directly communicate with each over a communication channel. The ESP-NOW implementation of the platform uses ESP-NOW as a communication medium. See the [Packet Transport Component](#packet-transport) and {{< docref "/components/espnow" >}} for more information. + +ESP-NOW provides low-latency, low-power wireless communication between ESP32 devices without requiring a Wi-Fi connection. This makes it ideal for battery-powered sensors or applications where Wi-Fi overhead would impact performance. + +> **Note:** +> ESP-NOW communication occurs independently of Wi-Fi. Devices can communicate via ESP-NOW even when Wi-Fi is disabled, making it suitable for power-sensitive applications. + +## Example Configuration + +```yaml +# Example configuration entry +espnow: + id: espnow_component + +packet_transport: + - platform: espnow + id: transport_unicast + espnow_id: espnow_component + peer_address: "AA:BB:CC:DD:EE:FF" + encryption: + key: "0123456789abcdef0123456789abcdef" + sensors: + - temp_sensor + +sensor: + - platform: internal_temperature + id: temp_sensor + name: "Test Temperature" +``` + +## Configuration Variables + +- **espnow_id** (**Required**, [ID](#config-id)): The esp-now ID to use for transport. +- **peer_address** (*Optional*, MAC Address): MAC address to send packets to. This can be either a specific + peer address for point-to-point communication, or the broadcast address. Default FF:FF:FF:FF:FF:FF +- All other options from the [Packet Transport Component](#packet-transport) + +> **Note:** +> Peers must be registered with the {{< docref "/components/espnow" >}} component before +> they can receive packets. The `peer_address` only controls which peer(s) receive transmitted data; +> incoming packets are accepted from all registered peers. + +## Broadcast vs Unicast + +The `peer_address` configuration determines the transmission mode. + +### Broadcast Mode (default) + +```yaml +packet_transport: + - platform: espnow + sensors: + - sensor_id +``` + +All devices with the broadcast address (`FF:FF:FF:FF:FF:FF`) registered as a peer will receive the packets. This is useful for hub-and-spoke topologies where multiple devices monitor a single sensor source. + +> **Warning:** +> Using broadcast mode increases ESP-NOW traffic on the radio channel, which may impact performance of other ESP-NOW devices in range. Use specific peer addresses whenever possible to minimize interference. + +### Unicast Mode + +```yaml +packet_transport: + - platform: espnow + peer_address: "AA:BB:CC:DD:EE:FF" + sensors: + - sensor_id +``` + +Only the specified peer receives the packets. This is more efficient for point-to-point communication and reduces radio channel congestion for neighboring ESP-NOW devices. + +## Simple Example + +This example shows two devices exchanging sensor data over ESP-NOW with encryption enabled. + +### Temperature Provider + +```yaml +espnow: + peers: + - mac_address: "AA:BB:CC:DD:EE:01" # Device 2 + +packet_transport: + - platform: espnow + peer_address: "AA:BB:CC:DD:EE:01" # Send to Device 2 + encryption: "MySecretKey123" + sensors: + - outdoor_temp + +sensor: + - platform: ... + temperature: + name: "Outdoor Temperature" + id: outdoor_temp +``` + +### Temperature Consumer + +```yaml +espnow: + peers: + - mac_address: "AA:BB:CC:DD:EE:00" # Device 1 + +packet_transport: + - platform: espnow + encryption: "MySecretKey123" + providers: + - name: temp-sensor + +sensor: + - platform: packet_transport + provider: temp-sensor + id: remote_temp + remote_id: outdoor_temp + name: "Remote Outdoor Temperature" +``` + +## Multi-Device Hub Example + +This example shows a central hub receiving sensor data from multiple remote devices. + +### Hub Device + +```yaml +espnow: + peers: + - mac_address: "FF:FF:FF:FF:FF:FF" + +packet_transport: + - platform: espnow + encryption: "HubSecret123" + providers: + - name: room-sensor-1 + - name: room-sensor-2 + - name: outdoor-sensor + +sensor: + - platform: packet_transport + provider: room-sensor-1 + remote_id: temperature + name: "Room 1 Temperature" + + - platform: packet_transport + provider: room-sensor-2 + remote_id: temperature + name: "Room 2 Temperature" + + - platform: packet_transport + provider: outdoor-sensor + remote_id: temperature + name: "Outdoor Temperature" +``` + +### Remote Sensors + +```yaml +espnow: + peers: + - mac_address: "FF:FF:FF:FF:FF:FF" + +packet_transport: + - platform: espnow + peer_address: "FF:FF:FF:FF:FF:FF" + encryption: "HubSecret123" + sensors: + - temperature + +sensor: + - platform: ... + temperature: + id: temperature +``` + +## See Also + +- [Packet Transport Component](#packet-transport) +- {{< docref "/components/espnow" >}} +- {{< docref "/components/binary_sensor/packet_transport" >}} +- {{< docref "/components/sensor/packet_transport" >}} +- [UDP Packet Transport](#udp-packet-transport) +- [Automation](#automation) +- {{< apiref "packet_transport/espnow_transport.h" "packet_transport/espnow_transport.h" >}} diff --git a/content/components/psram.md b/content/components/psram.md index 57c7d3bb94..afc496d82a 100644 --- a/content/components/psram.md +++ b/content/components/psram.md @@ -8,9 +8,10 @@ params: --- This component enables and configures PSRAM if/when available on ESP32 modules/boards. -It is automatically loaded and enabled by components that require it. +Some components require PSRAM, while others may use it for optional features. In any case +it is required to explicitly configured - this is a change from previous versions of ESPHome. -PSRAM is only available on the ESP32. +PSRAM is not available with platforms other than ESP32. ```yaml # Example configuration entry @@ -21,7 +22,9 @@ psram: ## Configuration variables -- **mode** (*Optional*): Defines the operating mode the PSRAM should utilize. One of `quad` (default) or `octal`. +- **mode** (*Optional*): Defines the operating mode the PSRAM should utilize. One of `quad`, `octal` or `hex`. + Defaults to `quad` for ESP32 and `hex` for ESP32-P4. ESP32-S3 has no default and *requires* this option to be set. + See notes below. - **speed** (*Optional*, int): The speed at which the PSRAM should operate. One of `40MHz` (default), `80MHz` or `120MHz`. - **enable_ecc** (*Optional*, bool): For octal mode, enable ECC (Error Correction Code) for the PSRAM (default is off.) ECC is a method of detecting and correcting single-bit errors in memory. It will reduce the available PSRAM size and speed by @@ -30,15 +33,26 @@ psram: - **disabled** (*Optional*, bool): Don't try to initialize the PSRAM. This is needed if one of the configured components autoloads psram but the ESP32 module doesn't have PSRAM and you need to use one of the PSRAM control lines for something else. e.g. ethernet. Defaults to `false`. -## Restrictions +- **ignore_not_found** (*Optional*, bool): When ``true`` (default), the firmware ignores PSRAM initialisation failures and continues to boot. + When ``false``, other components can configure larger WiFi buffers for faster data transfer, but **PSRAM must be available or the device will + fail to boot.** + +## Modes + +The ESP32 PSRAM is only available in `quad` mode, and ESP32-P4 only supports `hex` mode. These are the defaults +when using those variants. For ESP32-S3, the `mode` option is required and must be set to `quad` or `octal`. +Typically on ESP32-S3 modules, a 2MB PSRAM will use quad mode, while 8 or 16MB will use octal mode, but check +the datasheet for the module you are using to be sure. + +> [!WARNING] +> If you choose the wrong mode for your board, the PSRAM will not work. + +## Notes - Not all ESP32 modules have PSRAM available. If you are unsure, consult the datasheet of your module. - Not all modules support all modes and speeds. - 120MHz is not available with octal mode, unless using ESP-IDF and the `enable_idf_experimental_features` is enabled in the ESP-IDF platform [Advanced Configuration](/components/esp32#esp32-advanced_configuration). - -- If you choose the wrong mode for your board, the PSRAM will not work. - Configuring an unsupported speed will usually result in the PSRAM running at the default speed. -- Typically on ESP32-S3 modules, a 2MB PSRAM will use quad mode, while 8 or 16MB will use octal mode. ## See Also diff --git a/content/components/remote_receiver.md b/content/components/remote_receiver.md index dda69148ba..f29d02915c 100644 --- a/content/components/remote_receiver.md +++ b/content/components/remote_receiver.md @@ -45,6 +45,7 @@ Multiple remote receivers can be configured as a list of dict definitions within - **dish**: Decode and dump Dish infrared codes. - **dooya**: Decode and dump Dooya RF codes. - **drayton**: Decode and dump Drayton Digistat RF codes. + - **dyson**: Decode and dump Dyson Cool AM7 tower fan codes. - **jvc**: Decode and dump JVC infrared codes. - **gobox**: Decode and dump Go-Box infrared codes. - **keeloq**: Decode and dump KeeLoq RF codes. @@ -64,6 +65,7 @@ Multiple remote receivers can be configured as a list of dict definitions within - **roomba**: Decode and dump Roomba infrared codes. - **samsung**: Decode and dump Samsung infrared codes. - **samsung36**: Decode and dump Samsung36 infrared codes. + - **symphony**: Decode and dump Symphony infrared codes. - **sony**: Decode and dump Sony infrared codes. - **toshiba_ac**: Decode and dump Toshiba AC infrared codes. - **mirage**: Decode and dump Mirage infrared codes. @@ -187,6 +189,10 @@ To enable signal demodulation, configure the signal carrier frequency and duty c Drayton Digistat RF code has been decoded. A variable `x` of type {{< apistruct "remote_base::DraytonData" "remote_base::DraytonData" >}} is passed to the automation for use in lambdas. +- **on_dyson** (*Optional*, [Automation](/automations)): An automation to perform when a + Dyson cool AM07 code has been decoded. A variable `x` of type {{< apistruct "remote_base::DysonData" "remote_base::DysonData" >}} + is passed to the automation for use in lambdas. + - **on_gobox** (*Optional*, [Automation](/automations)): An automation to perform when a Go-Box remote code has been decoded. A variable `x` of type {{< apistruct "remote_base::GoboxData" "remote_base::GoboxData" >}} is passed to the automation for use in lambdas. @@ -267,6 +273,10 @@ To enable signal demodulation, configure the signal carrier frequency and duty c Sony remote code has been decoded. A variable `x` of type {{< apistruct "remote_base::SonyData" "remote_base::SonyData" >}} is passed to the automation for use in lambdas. +- **on_symphony** (*Optional*, [Automation](/automations)): An automation to perform when a + Symphony remote code has been decoded. A variable `x` of type {{< apistruct "remote_base::SymphonyData" "remote_base::SymphonyData" >}} + is passed to the automation for use in lambdas. + - **on_toshiba_ac** (*Optional*, [Automation](/automations)): An automation to perform when a Toshiba AC remote code has been decoded. A variable `x` of type {{< apistruct "remote_base::ToshibaAcData" "remote_base::ToshibaAcData" >}} is passed to the automation for use in lambdas. @@ -424,6 +434,11 @@ Remote code selection (exactly one of these has to be included): - **channel** (**Required**, int): The 7-bit switch/channel to listen for. - **command** (**Required**, int): The 5-bit command to listen for. +- **dyson**: Trigger on a decoded dyson cool AM07 infrared remote code with the given data. + + - **code** (**Required**, int): The 16-bit code to trigger on, e.g. 0x1200=power, 0x1215=fan++,0x122a=swing..., see dumper output for more info. + - **index** (**Required**, int): The 8-bit rolling index [0..3], to be increased with every transmit, see dumper output for more info. + - **gobox**: Trigger on a decoded Go-Box remote code with the given data. - **code** (**Required**, int): The Go-Box code to trigger on, see dumper output for more info. @@ -567,6 +582,11 @@ Remote code selection (exactly one of these has to be included): - **data** (**Required**, int): The Sony code to trigger on, see dumper output for more info. - **nbits** (*Optional*, int): The number of bits of the remote code. Defaults to `12`. +- **symphony**: Trigger on a decoded Symphony remote code with the given data. + + - **data** (**Required**, int): The Symphony code to trigger on, see dumper output for more info. + - **nbits** (**Required**, int): The number of bits of the remote code. Typical values: `8`, `12`, or `16`. + - **toshiba_ac**: Trigger on a decoded Toshiba AC remote code with the given data. - **rc_code_1** (**Required**, int): The remote control code to trigger on, see dumper output for more details. diff --git a/content/components/remote_transmitter.md b/content/components/remote_transmitter.md index bf95120859..e02ca0f7cb 100644 --- a/content/components/remote_transmitter.md +++ b/content/components/remote_transmitter.md @@ -57,6 +57,8 @@ remote_transmitter: | ESP32-S3 | 192 symbols | 48 symbols | - **clock_resolution** (*Optional*, int): The clock resolution used by the RMT peripheral in Hz. Defaults to `1000000`. +- **non_blocking** (*Optional*, boolean): If enabled, any transmit will return immediately and the RMT will run in the + background. The `on_complete` automation will trigger after the transmit completes. Defaults to `true`. - **use_dma** (*Optional*, boolean): Enable DMA on variants that support it. If enabled `rmt_symbols` controls the DMA buffer size and can be set to a large value. @@ -376,6 +378,34 @@ on_...: - **command** (**Required**, int): The command to send, between 0 and 63 inclusive. - All other options from [Remote Transmitter Actions](#remote_transmitter-transmit_action). +{{< anchor "remote_transmitter-transmit_dyson" >}} + +### `remote_transmitter.transmit_dyson` **Action** + +This [action](#config-action) sends a Dyson cool AM07 infrared protocol code to a remote transmitter. + +```yaml +on_...: + - remote_transmitter.transmit_dyson: + code: '0x1200' + index: !lambda |- + uint8_t idx = id(idx); + id(idx) = (id(idx) + 1) & 3; + return idx; +``` + +#### Configuration variables + +- **code** (**Required**, int): The 16-bit code to trigger on, e.g. 0x1200=power, 0x1215=fan++, + 0x122a=swing..., see dumper output for more info. +- **index** (**Required**, int): The 8-bit rolling index (range=0..3). +- All other options from [Remote Transmitter Actions](#remote_transmitter-transmit_action). + +> [!NOTE] +> The **dyson** devices use rolling codes, i.e. each remote button generates 4 different codes in a pseudo +> random manner. On every transmit the **index** variable must loop to let the **..transmit_dyson** function +> generate a code that differs from the previous one. + {{< anchor "remote_transmitter-transmit_gobox" >}} ### `remote_transmitter.transmit_gobox` **Action** @@ -923,6 +953,32 @@ on_...: - **command** (**Required**, int): The Samsung36 command to send, see dumper output for more details. - All other options from [Remote Transmitter Actions](#remote_transmitter-transmit_action). +{{< anchor "remote_transmitter-transmit_symphony" >}} + +### `remote_transmitter.transmit_symphony` **Action** + +This [action](#config-action) sends a Symphony infrared remote code to a remote transmitter. +It transmits constant bit-time frames with a footer gap. Physical Symphony remotes typically +send the same frame twice separated by a ~35 ms gap. Use `command_repeats` to control how +many identical frames are sent; defaults to 2. + +```yaml +on_...: + - remote_transmitter.transmit_symphony: + data: 0x0E88 + nbits: 12 + command_repeats: 2 +``` + +#### Configuration variables + +- **data** (**Required**, int): The Symphony code to send, see dumper output for more info. +- **nbits** (**Required**, int): The number of bits to send. Typical values: `8`, `12`, or `16`. +- **command_repeats** (*Optional*, int): Number of times to send the same frame in one transmission. + Defaults to `2` to match typical handsets. + +- All other options from [Remote Transmitter Actions](#remote_transmitter-transmit_action). + {{< anchor "remote_transmitter-transmit_sony" >}} ### `remote_transmitter.transmit_sony` **Action** diff --git a/content/components/script.md b/content/components/script.md index ee820924d8..e8791e6ba5 100644 --- a/content/components/script.md +++ b/content/components/script.md @@ -26,11 +26,22 @@ script: - `single` : Do not start a new run. Issue a warning. - `restart` : Start a new run after first stopping previous run. - - `queued` : Start a new run after previous runs complete. + - `queued` : Start a new run after previous runs complete. By default, allows up to 5 total instances (1 running + 4 queued). + When the limit is reached, additional calls are rejected with a warning. - `parallel` : Start a new, independent run in parallel with previous runs. -- **max_runs** (*Optional*, int): Allows limiting the maximum number of runs when using script modes `queued` and - `parallel`, use value `0` for unlimited runs. Defaults to `0`. +- **max_runs** (*Optional*, int): Allows limiting the maximum number of script instances. + - For `queued` mode: Specifies max total instances (including the running one). Defaults to `5` (1 running + 4 queued). Valid range: 1-100. + - For `parallel` mode: Specifies max parallel instances. Defaults to `0` (unlimited). Valid range: 0-100. + + ```yaml + script: + - id: my_script + mode: queued + max_runs: 10 # Allow up to 10 total instances (1 running + 9 queued) + then: + - logger.log: "Processing..." + ``` - **parameters** (*Optional*, [Script Parameters](#script-parameters)): A script can define one or more parameters that must be provided in order to execute. All parameters defined here are mandatory and must be given when calling diff --git a/content/components/sensor/bh1900nux.md b/content/components/sensor/bh1900nux.md new file mode 100644 index 0000000000..c1ce98701a --- /dev/null +++ b/content/components/sensor/bh1900nux.md @@ -0,0 +1,57 @@ +--- +description: "Instructions for setting up the Rohm Semiconductor BH1900NUX temperature sensor in ESPHome." +title: "BH1900NUX Temperature Sensor" +params: + seo: + description: Instructions for setting up the Rohm Semiconductor BH1900NUX temperature sensor in ESPHome + image: bh1900nux-evk-001.png +--- +{{< anchor "bh1900nux" >}} +The `bh1900nux` sensor platform allows you to use the **BH1900NUX** +([datasheet](https://fscdn.rohm.com/en/products/databook/datasheet/ic/sensor/temperature/bh1900nux-e.pdf)) +**temperature sensor** from Rohm Semiconductor with ESPHome. +The [I²C bus](#i2c) must be set up in your configuration for this sensor to work. + +{{< img src="bh1900nux-evk-001.png" alt="BH1900NUX-EVK-001 Evaluation Board" class="align-center" >}} + +```yaml +# Example configuration entry +sensor: + - platform: bh1900nux + name: "BH1900NUX Temperature" + address: 0x48 + update_interval: 60s +``` + +## Configuration Variables + +- **address** (*Optional*, int): Manually specify the I²C address of the sensor. Defaults to `0x48`. + +- **update_interval** (*Optional*, [Time](#config-time)): The interval to check the sensor. Defaults to `60s`. + +- All other options from [Sensor](#config-sensor). + +> [!NOTE] +> The following features are **not supported**: `ALERT` pin functionality and `TLOW`/`THIGH` configuration (thermostat mode). + +## Configurable I²C Addresses + +The BH1900NUX provides **3 address pins (A0, A1, A2)** to set the I²C address by connecting them to **VCC (1)** or **GND (0)**. +This allows **8 possible addresses**: + +| Address | A0 | A1 | A2 | +|---------|----|----|----| +| `0x48` | 0 | 0 | 0 | +| `0x49` | 0 | 0 | 1 | +| `0x4A` | 0 | 1 | 0 | +| `0x4B` | 0 | 1 | 1 | +| `0x4C` | 1 | 0 | 0 | +| `0x4D` | 1 | 0 | 1 | +| `0x4E` | 1 | 1 | 0 | +| `0x4F` | 1 | 1 | 1 | + +## See Also + +- [Sensor Filters](#sensor-filters) +- [Product Page](https://www.rohm.com/products/sensors-mems/temperature-sensor-ics/bh1900nux-product) +- [BH1900NUX Datasheet](https://fscdn.rohm.com/en/products/databook/datasheet/ic/sensor/temperature/bh1900nux-e.pdf) diff --git a/content/components/sensor/dallas_temp.md b/content/components/sensor/dallas_temp.md index 39122b8095..0310adf24e 100644 --- a/content/components/sensor/dallas_temp.md +++ b/content/components/sensor/dallas_temp.md @@ -14,17 +14,27 @@ and similar 1-Wire temperature sensors. A {{< docref "/components/one_wire/index required to be set up in your configuration for this sensor to work. ```yaml -# Example configuration entry +# Example configuration entries sensor: + # only one device - platform: dallas_temp - address: 0x1234567812345628 name: temperature update_interval: 120s + # specific address + - platform: dallas_temp + address: 0x1234567812345628 + name: temperature2 + # second device + - platform: dallas_temp + index: 1 + name: temperature1 ``` ## Configuration variables -- **address** (*Optional*, int): The address of the sensor. Required if there is more than one device on the bus. +- **address** (*Optional*, int): The address of the sensor. Required if there is more than one device on the bus and index is not specified. +- **index** (*Optional*, byte): The index (0-based) of the sensor. Required if there is more than one device on the bus and address is not specified. + *Note this index is based on the hardware addresses of the sensors and the order can change if sensors are changed, added, or removed.* - **resolution** (*Optional*, int): An optional resolution from 9 to 12. Higher means more accurate. Defaults to the maximum for most Dallas temperature sensors: 12. diff --git a/content/components/sensor/filter/heartbeat.md b/content/components/sensor/filter/heartbeat.md index fd73ad0eb7..4db73688ff 100644 --- a/content/components/sensor/filter/heartbeat.md +++ b/content/components/sensor/filter/heartbeat.md @@ -3,9 +3,29 @@ description: "" headless: true --- -Send the value periodically with the specified time interval. -If the sensor value changes during the interval the interval will not reset. -The last value of the sensor will be sent. +Send the sensor value periodically at the specified time interval. If the sensor value changes +during this interval, the timer will not reset — the last known value of the sensor will still +be sent when the interval elapses. -So a value of `10s` will cause the filter to output values every 10s regardless -of the input values. +For example, a value of `10s` will cause the filter to output the last known value every 10 seconds, +regardless of how often the input value changes. + +When using `optimistic` mode, the filter will still repeat the last known value at the configured interval, +but in addition, every new incoming value is published immediately as it arrives. This ensures that the +sensor output updates instantly on change, while maintaining a steady periodic "heartbeat" of the last value +between updates. This mode is useful for sensors where immediate responsiveness is desired. + +Configuration variables: + +- **period** (Required, time): The interval at which the last known value is republished. +- **optimistic** (*Optional*, boolean): When enabled, every new incoming value is published immediately as it + arrives, regardless of the configured time interval. + +```yaml +# Example filters +filters: + - heartbeat: 5s + - heartbeat: + period: 5s + optimistic: true +``` diff --git a/content/components/sensor/gdk101.md b/content/components/sensor/gdk101.md index 5c89e37651..6316a43e34 100644 --- a/content/components/sensor/gdk101.md +++ b/content/components/sensor/gdk101.md @@ -19,21 +19,19 @@ The GDK101 requires setting up [I²C](/components/i2c) for data communication. | ---------- | ----------------------- | | TX | UART TX pin | | RX | UART RX pin | -| +5VIN | Positive supply voltage | -| GND1 | Ground | -| SDA | I²C data bus | -| SCL | I²C clock bus | - -A0 Adress Jumper 1 -A1 Adress Jumper 2 -============ =============================================================== +| +5VIN | Positive supply voltage | +| GND1 | Ground | +| SDA | I²C data bus | +| SCL | I²C clock bus | +| A0 | Address Jumper 1 | +| A1 | Address Jumper 2 | | I2C Address | Jumpers State | | ----------- | ------------------ | | 0x18 | A0 Short, A1 Short | -| 0x19 | A0 Open, A1 Short | -| 0x1A | A0 Short, A1 Open | -| 0x1B | A0 Open, A1 Open | +| 0x19 | A0 Open, A1 Short | +| 0x1A | A0 Short, A1 Open | +| 0x1B | A0 Open, A1 Open | {{< img src="gdk101.jpg" alt="Image" caption="GDK101 Gamma Radiation Sensor Module." width="50.0%" class="align-center" >}} @@ -66,8 +64,6 @@ sensor: name: "GDK101 Radiation Dose @ 10 min" status: name: "GDK101 Status" - version: - name: "GDK101 FW Version" measurement_duration: name: "GDK101 Measuring Time" ``` @@ -76,13 +72,10 @@ A sensor platform to radiation data Configuration variables: -- **radiation_dose_per_1m** (**Required**): Radiation average dose per 1 minute. +- **radiation_dose_per_1m** (*Optional*): Radiation average dose per 1 minute. All options from [Sensor](/components/sensor). -- **radiation_dose_per_10m** (**Required**): Radiation average dose per 10 minutes. - All options from [Sensor](/components/sensor). - -- **version** (**Required**): Fimware version of the module. +- **radiation_dose_per_10m** (*Optional*): Radiation average dose per 10 minutes. All options from [Sensor](/components/sensor). - **status** (*Optional*): Sensor status. @@ -108,6 +101,58 @@ Configuration variables: - **vibrations** (**Required**): Vibration status. All options from [Binary Sensor](/components/binary_sensor#config-binary_sensor). +## Text Sensor + +```yaml +# Example configuration entry +text_sensor: + - platform: gdk101 + version: + name: "GDK101 FW Version" +``` + +Text sensor that reports firmware version of the sensor. + +Configuration variables: + +- **version** (**Required**): Firmware version of the module. + All options from [Text Sensor](#config-text_sensor). + +## Sensor Status + +Sensor status indicates how long the sensor has been working, which indicates the accuracy of the measurements. + +| Status | Description | +| ------ | ---------------- | +| 0 | Power On ~ 10sec | +| 1 | 10sec to 10min | +| 2 | After 10 min | + +This can be represented by a template text sensor such as below: + +```yaml +sensor: + - platform: gdk101 + status: + name: "GDK101 status" + id: gdk101_status + +text_sensor: + - platform: template + name: "GDK101 Status Description" + lambda: |- + int status = int(id(gdk101_status).state); + if (status == 0) { + return {"Powered On"}; + } else if (status == 1) { + return {"Settling"}; + } else if (status == 2) { + return {"Settled"}; + } else { + return {"Unknown status"}; + } +``` + ## See Also - [Sensor Filters](/components/sensor#sensor-filters) diff --git a/content/components/sensor/hdc2010.md b/content/components/sensor/hdc2010.md new file mode 100644 index 0000000000..317a9e8c3b --- /dev/null +++ b/content/components/sensor/hdc2010.md @@ -0,0 +1,51 @@ +--- +description: "Instructions for setting up HDC2010 temperature and humidity sensors." +title: "HDC2010 High Precision Temperature and Humidity Sensor" +params: + seo: + description: Instructions for setting up HDC2010 temperature and humidity sensors. + image: hdc2010.png +--- + +The HDC2010 Temperature and Humidity sensor allows you to use your HDC2010 +([datasheet](https://www.ti.com/lit/ds/symlink/hdc2010.pdf), +[Itbrainpower](https://itbrainpower.net/a-gsm/Arduino-HDC2010-sensor_howto)) sensors with +ESPHome. The {{< docref "i2c/" >}} is +required to be set up in your configuration for this sensor to work. + +{{< img src="hdc2010-full.png" alt="Image" caption="HDC2010 Temperature & Humidity Sensor. Image by `Mikroe`." width="50.0%" class="align-center" >}} + +{{< img src="temperature-humidity.png" alt="Image" width="80.0%" class="align-center" >}} + +```yaml +# Example configuration entry +sensor: + - platform: hdc2010 + temperature: + name: "Living Room Temperature" + humidity: + name: "Living Room Humidity" + update_interval: 60s +``` + +## Configuration variables + +- **temperature** (**Required**): The information for the temperature sensor. + + - All options from {{< docref "sensor/" >}}. + +- **humidity** (**Required**): The information for the humidity sensor + + - All options from {{< docref "sensor/" >}}. + +- **update_interval** (*Optional*, {{< docref "time/" >}}): The interval to check the sensor. Defaults to `60s`. + +## See Also + +- {{< docref "sensor/#sensor-filters" >}} +- {{< docref "absolute_humidity/" >}} +- {{< docref "dht/" >}} +- {{< docref "dht12/" >}} +- {{< docref "htu21d/" >}} +- {{< docref "sht3xd/" >}} +- {{< apiref "hdc2010/hdc2010.h" "hdc2010/hdc2010.h" >}} diff --git a/content/components/sensor/images/bh1900nux-evk-001.png b/content/components/sensor/images/bh1900nux-evk-001.png new file mode 100644 index 0000000000..40a84e7fa9 Binary files /dev/null and b/content/components/sensor/images/bh1900nux-evk-001.png differ diff --git a/content/components/sensor/images/hdc2010-full.png b/content/components/sensor/images/hdc2010-full.png new file mode 100644 index 0000000000..faf5d4347f Binary files /dev/null and b/content/components/sensor/images/hdc2010-full.png differ diff --git a/content/components/sensor/images/mcp3221.png b/content/components/sensor/images/mcp3221.png new file mode 100644 index 0000000000..657a6b4117 Binary files /dev/null and b/content/components/sensor/images/mcp3221.png differ diff --git a/content/components/sensor/ina2xx.md b/content/components/sensor/ina2xx.md index 0d18717882..2df8d6b830 100644 --- a/content/components/sensor/ina2xx.md +++ b/content/components/sensor/ina2xx.md @@ -19,9 +19,9 @@ requred to be set up in your configuration for this sensor to work. | ----------------------------------------------------- | ----------- | ------------------------------------------------------ | | [INA228](http://www.ti.com/lit/ds/symlink/ina228.pdf) | I²C 8 | 5-V, 20-Bit, Ultra-Precise Power/Energy/Charge Monitor | | [INA229](http://www.ti.com/lit/ds/symlink/ina229.pdf) | SPI 8 | 5-V, 20-Bit, Ultra-Precise Power/Energy/Charge Monitor | -| [INA238](http://www.ti.com/lit/ds/symlink/ina238.pdf) | I²C 8 | 5-V, 16-Bit, High-Precision Power Monitor | -| [INA239](http://www.ti.com/lit/ds/symlink/ina239.pdf) | SPI 8 | 5-V, 16-Bit, High-Precision Power Monitor | -| [INA237](http://www.ti.com/lit/ds/symlink/ina237.pdf) | I²C 8 | 5-V, 16-Bit, Precision Power Monitor | +| [INA238](http://www.ti.com/lit/ds/symlink/ina238.pdf) | I²C 8 | 5-V, 16-Bit, High-Precision Power Monitor | +| [INA239](http://www.ti.com/lit/ds/symlink/ina239.pdf) | SPI 8 | 5-V, 16-Bit, High-Precision Power Monitor | +| [INA237](http://www.ti.com/lit/ds/symlink/ina237.pdf) | I²C 8 | 5-V, 16-Bit, Precision Power Monitor | All devices can measure a selectable full-scale differential input of ±163.84 mV or ±40.96 mV across the shunt with common-mode voltage support from –0.3 V to +85 V. @@ -79,7 +79,12 @@ sensor: shunt for temperature compensation correction. Only applicable to INA228 and INA229 devices. Zero value means no compensation is done. Defaults to `0`. -- **update_interval** (*Optional*, [Time](/guides/configuration-types#time)): The interval to check the sensor. Defaults to `60s`. +- **update_interval** (*Optional*, [Time](/guides/configuration-types#time)): The interval to check the sensor. + Defaults to `60s`. + +- **reset_on_boot** (*Optional*, boolean): Whether or not to reset the device configuration (including counters) on + component initialization. Defaults to `true`; set `false` to preserve counters through ESPHome resets. + - All other options from [Sensor](/components/sensor) and [I²C device](/components/i2c). ## Over SPI @@ -129,7 +134,12 @@ sensor: shunt for temperature compensation correction. Only applicable to INA228 and INA229 devices. Zero value means no compensation is done. Defaults to `0`. -- **update_interval** (*Optional*, [Time](/guides/configuration-types#time)): The interval to check the sensor. Defaults to `60s`. +- **update_interval** (*Optional*, [Time](/guides/configuration-types#time)): The interval to check the sensor. + Defaults to `60s`. + +- **reset_on_boot** (*Optional*, boolean): Whether or not to reset the device configuration (including counters) on + component initialization. Defaults to `true`; set `false` to preserve counters through ESPHome resets. + - All other options from [Sensor](/components/sensor) and [SPI device](/components/spi). ## Sensors diff --git a/content/components/sensor/mcp3221.md b/content/components/sensor/mcp3221.md new file mode 100644 index 0000000000..65ecfd9916 --- /dev/null +++ b/content/components/sensor/mcp3221.md @@ -0,0 +1,43 @@ +--- +description: "Instructions for setting up MCP3221 ADC with ESPHome." +title: "MCP3221 12-bit ADC" +params: + seo: + description: Instructions for setting up MCP3221 ADC with ESPHome. + image: mcp3221.png +--- + +The Microchip Technology Inc. `mcp3221` sensor platform allows you to use your MCP3221 ADC +([datasheet](https://ww1.microchip.com/downloads/en/devicedoc/20001732e.pdf)) with ESPHome. + +{{< img src="mcp3221.png" alt="Image" width="50.0%" class="align-center" >}} + +## Sensor + +The MCP3221 sensor platform allows you to use your MCP3221 ADC +([datasheet](https://ww1.microchip.com/downloads/en/devicedoc/20001732e.pdf)) with ESPHome. + +It uses the [I2C Bus](#i2c) for communication. + +Connect power pins (``VCC``/``GND``, 2.7V to 5.5V) and I2C (``SDA``/``SCL``). + +Most configurations will set the `reference_voltage` = VREF pin + +```yaml +# Example configuration entry +sensor: + - platform: mcp3221 + name: "MCP3221 Value" +``` + +### Configuration variables + +- **address** (*Optional*, int): Defaults to ``0x48``. ``0b1001XXX`` - ``X``: See packaging for the last 3 bits +- **reference_voltage** (*Optional*, float): The reference voltage. Should be ``VCC``, range 2.7V to 5.5V +- **update_interval** (*Optional*, [Time](#config-time)): The interval to check the sensor. Defaults to ``60s``. +- All other options from [Sensor](#config-sensor). + +## See Also + +- [I2C Bus](#i2c) +- {{< apiref "mcp3221/mcp3221_sensor.h" >}} diff --git a/content/components/sensor/xgzp68xx.md b/content/components/sensor/xgzp68xx.md index 2da316f1a2..29085fc47b 100644 --- a/content/components/sensor/xgzp68xx.md +++ b/content/components/sensor/xgzp68xx.md @@ -1,20 +1,28 @@ --- -description: "Instructions for setting up the CFSensor XGZP68xx Series Differential Pressure sensor." -title: "CFSensor XGZP68xx Series Differential Pressure Sensor" +description: "Instructions for setting up the CFSensor XGZP68xx Non-C Series Differential Pressure sensor." +title: "CFSensor XGZP68xx Non-C Series Differential Pressure Sensor" params: seo: - description: Instructions for setting up the CFSensor XGZP68xx Series Differential Pressure sensor. + description: Instructions for setting up the CFSensor XGZP68xx Non-C Series Differential Pressure sensor. image: 6897d.jpg --- -The XGZP68xx Differential Pressure sensor allows you to use digital differential pressure sensors such as the 6899D -([datasheet](https://cfsensor.com/wp-content/uploads/2022/11/XGZP6899D-Pressure-Sensor-V2.8.pdf)) or -6897D Series ([datasheet](https://cfsensor.com/wp-content/uploads/2022/11/XGZP6897D-Pressure-Sensor-V2.7.pdf)) -sensors with ESPHome. The sensors pressure ranges are specified in the datasheets. +CFSensor makes multiple generations of sensors with identical model numbers such as the 6899D or +6897D, but unfortunately with completely different I²C interfaces. You can identify which from +the part number: -Calibrating the sensor can be done by checking the value that is returned when -the ports are open to the air. This value should be 0. If it is not, you can use the offset option to correct the -reading. For example, if your sensor is reading -40Pa when the ports are disconnected, you can set the offset to 40. +- XGZP6897Dxxxxxxxx is the non-C series, which this component supports. +- XGZP6897D**C**xxxxxxxx is the C series, which this component does NOT support. + +Another way of telling the difference is the I²C address: + +- If the device is one of the non-C series, it appears at I²C address `0x6d`. +- If the device is one of the C series, it appears at I²C address `0x58`. + +Unfortunately CFSensor have removed from their website the datasheets for the non-C series of +sensors. You will need to specifically find the older datasheet from another source. +**The v3.1 or later datasheets from CFSensor describe the C series which is a completely +different device even though it has an identical model number to the <= v3.0 device**. {{< img src="6897d.jpg" alt="Image" caption="XGZP6897D Differential Pressure Sensor. (Credit: [CFSensor](https://cfsensor.net/i2c-differential-pressure-sensor-xgzp6897d/), image cropped and compressed)" width="30.0%" class="align-center" >}} @@ -25,10 +33,12 @@ To use the sensor, set up an [I²C Bus](/components/i2c) and connect the sensor # It uses a filter offset to calibrate the sensor sensor: - platform: xgzp68xx + k_value: 16384 temperature: name: "Temperature" pressure: name: "Differential Pressure" + oversampling: "32768x" filters: - offset: 40.5 ``` @@ -37,11 +47,34 @@ sensor: - **temperature** (*Optional*): All options from [Sensor](/components/sensor). - **pressure** (*Optional*): All options from [Sensor](/components/sensor). -- **k_value** (*Optional*, int): The K value comes from the datasheet. It will default to 4096 if not specified, which is appropriate for a sensor with a range of +/- 0.5kPa. + - **oversampling** (*Optional*): One of `256x`, `512x`, `1024x`, `2048x`, `4096x`, `8192x`, `16384x`, `32768x`. It is not possible to disable oversampling. If not specified, this defaults to `4096x`. +- **k_value** (*Optional*, int): The K value comes from the list below. It will default to 4096 if not specified. - **update_interval** (*Optional*, [Time](/guides/configuration-types#time)): The interval to check the sensor. Defaults to `60s`. +## Usage + +The sensors come in a series of pressure ranges. The now hard to find datasheet lists +a table of pressure ranges to ``k_value``, which you will need to set in your configuration: + +- -0.5 kPa to +0.5 kPa (``k_value = 16384``) +- -1 kPa to +1 kPa (``k_value = 8192``) +- -2.5 kPa to +2.5 kPa (``k_value = 2048``) +- -5 kPa to +5 kPa (``k_value = 1024``) +- -10 kPa to +10 kPa (``k_value = 512``) +- -50 kPa to +50 kPa (``k_value = 128``) + +On power up, the sensor will read an offset. You will need to calibrate the sensor which can be done +by checking the value that is returned when the ports are open to the air. You can use the offset +option to correct the reading. For example, if your sensor is reading -40Pa when the ports are +disconnected, you can set the offset to 40. + +If the sensor is running for a time, you will find that the zero point does drift after a while, +especially if the sensor is used to detect pressure shocks. +Designing in a way to periodically equalise the pressure between the ports so a new offset can be +determined would be wise. + ## See Also - [esphome-pressure device](https://github.com/gcormier/esphome-pressure/) - [Sensor Filters](/components/sensor#sensor-filters) -- {{< apiref "sdp3x/sdp3x.h" "sdp3x/sdp3x.h" >}} +- {{< apiref "xgzp6xx/xgzp6xx.h" "xgzp6xx/xgzp6xx.h" >}} diff --git a/content/components/time/rx8130.md b/content/components/time/rx8130.md new file mode 100644 index 0000000000..04e6c2aea7 --- /dev/null +++ b/content/components/time/rx8130.md @@ -0,0 +1,88 @@ +--- +description: "RX8130 Time Source" +title: "RX8130 Time Source" +--- + +You first need to set up the {{< docref "/components/i2c" "I2C" >}} component. + +```yaml +# Example configuration entry +time: + - platform: rx8130 + id: rx8130_time +``` + +## Configuration variables + +- **address** (*Optional*, int): Manually specify the I²C address of the RTC. Defaults to `0x32`. +- All other options from [Base Time Configuration](#base_time_config). + +{{< anchor "rx8130-write_time_action" >}} + +## `rx8130.write_time` Action + +This [Action](#config-action) triggers a synchronization of the current system time to the RTC hardware. + +> [!NOTE] +> The RX8130 component will *not* write to the RTC clock if not triggered *explicitly* by this action. + +```yaml +on_...: + - rx8130.write_time + + # in case you need to specify the RX8130 id + - rx8130.write_time: + id: rx8130_time +``` + +{{< anchor "rx8130-read_time_action" >}} + +## `rx8130.read_time` Action + +This [Action](#config-action) triggers a synchronization of the current system time from the RTC hardware. + +> [!NOTE] +> The RX8130 component will automatically read the RTC clock every 15 minutes by default and synchronize the +> system clock when a valid timestamp is read from the RTC. (The `update_interval` can be changed.) +> This action can be used to trigger *additional* synchronizations. + +```yaml +on_...: + - rx8130.read_time + + # in case you need to specify the RX8130 id + - rx8130.read_time: + id: rx8130_time +``` + +{{< anchor "rx8130-config_example" >}} + +## Full Configuration Example + +In a typical setup, you will have at least one additional time source to synchronize the RTC with. Such an +external time source might not always be available e.g. due to a limited network connection. +In order to have a valid, reliable system time, the system should read the RTC once at start and then try to +synchronize with an external reliable time source. +When a synchronization to another time source was successful, the RTC can be resynchronized. + +```yaml +esphome: + on_boot: + then: + # read the RTC time once when the system boots + rx8130.read_time: + +time: + - platform: rx8130 + # repeated synchronization is not necessary unless the external RTC + # is much more accurate than the internal clock + update_interval: never + - platform: homeassistant + # instead try to synchronize via network repeatedly ... + on_time_sync: + then: + # ... and update the RTC when the synchronization was successful + rx8130.write_time: +``` + +## See Also diff --git a/content/components/tinyusb.md b/content/components/tinyusb.md new file mode 100644 index 0000000000..b59f909fcc --- /dev/null +++ b/content/components/tinyusb.md @@ -0,0 +1,68 @@ +--- +description: "Instructions for setting up TinyUSB in ESPHome" +title: "TinyUSB" +params: + seo: + description: Instructions for setting up TinyUSB in ESPHome + image: usb.svg +--- + +The `tinyusb` component implements a foundation for USB device functionality. It is currently supported on the +following ESP32 microcontroller variants: + +- ESP32-P4 +- ESP32-S2 +- ESP32-S3 + +The component simply initializes the TinyUSB driver, allowing the microcontroller to act as a USB device when connected +to a USB host. + +> [!NOTE] +> This component: +> +> - does **not** implement any specific device functionality; it is simply a foundation for other components to do so. +> - cannot be used with the {{< docref "/components/usb_host" >}}; operation as both a host and a device simultaneously +> is not possible. + +```yaml +# Example minimal configuration entry +tinyusb: +``` + +## Configuration variables + +- **id** (*Optional*, [ID](#config-id)): Manually specify the ID for this component. +- **usb_product_id** (*Optional*, int): USB product identifier. Defaults to `0x4001`. +- **usb_vendor_id** (*Optional*, int): USB vendor identifier. Defaults to `0x303A` (Espressif Systems). +- **usb_lang_id** (*Optional*, int): USB language identifier. Defaults to `0x0409` (English - United States). +- **usb_manufacturer_str** (*Optional*, string): Manufacturer string descriptor. Defaults to `"ESPHome"`. +- **usb_product_str** (*Optional*, string): Product name string descriptor. Defaults to `"ESPHome"`. +- **usb_serial_str** (*Optional*, string): Serial number string descriptor. If not specified, the device's MAC address + will be used. + +## Notes + +### Vendor and Product IDs + +When specifying custom `usb_vendor_id` and `usb_product_id` values, be aware that: + +- USB Vendor IDs are officially assigned by the USB Implementers Forum (USB-IF). +- Using unassigned or third-party vendor/product ID combinations may result in unexpected (host) behavior. +- The default vendor ID `0x303A` is assigned to Espressif Systems. +- For hobbyist and development purposes, you may use test IDs, but these should not be used in production devices. + +### Language Identifiers + +The `usb_lang_id` field uses USB Language IDs as defined by the USB specification. Common values include: + +- `0x0409` - English (United States) - Default +- `0x0809` - English (United Kingdom) +- `0x0407` - German (Germany) +- `0x040C` - French (France) + +A more complete list can be found [here](https://github.com/brookebasile/USB-langids/blob/master/USB_LANGIDs.pdf). + +## See Also + +- [TinyUSB Documentation](https://docs.tinyusb.org/) +- {{< apiref "tinyusb/tinyusb_component.h" "tinyusb/tinyusb_component.h" >}} diff --git a/content/components/update/_index.md b/content/components/update/_index.md index ec860cdf68..712a3d4786 100644 --- a/content/components/update/_index.md +++ b/content/components/update/_index.md @@ -65,4 +65,9 @@ Configuration variables: - **id** (**Required**, [ID](/guides/configuration-types#id)): The ID of the update entity. +## Update Platforms + +- {{< docref "update/http_request/" >}} +- {{< docref "update/esp32_hosted/" >}} + ## See Also diff --git a/content/components/update/esp32_hosted.md b/content/components/update/esp32_hosted.md new file mode 100644 index 0000000000..fe3207b908 --- /dev/null +++ b/content/components/update/esp32_hosted.md @@ -0,0 +1,103 @@ +--- +description: "Instructions for using the ESP32 Hosted update platform to manage co-processor firmware updates." +title: "ESP32 Hosted Co-processor Update" +params: + seo: + description: Instructions for using the ESP32 Hosted update platform to manage co-processor firmware updates. + image: system-update.svg +--- + +This platform allows you to update the firmware of an ESP32 co-processor connected via the +{{< docref "/components/esp32_hosted" >}} component. The firmware binary is embedded into +your device's flash at compile time and can be deployed to the co-processor on demand. + +The component automatically detects the current co-processor firmware version and compares it to the +version embedded in your device. If the versions differ, an update becomes available in Home Assistant +or through the ESPHome API. + +```yaml +# Example configuration entry +# Note: Host device must be ESP32-H2 or ESP32-P4 +esp32_hosted: + variant: ESP32C6 # Co-processor variant + reset_pin: GPIOXX + cmd_pin: GPIOXX + clk_pin: GPIOXX + d0_pin: GPIOXX + d1_pin: GPIOXX + d2_pin: GPIOXX + d3_pin: GPIOXX + active_high: true + +update: + - platform: esp32_hosted + path: coprocessor-firmware.bin + sha256: 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` + +{{< anchor "update_esp32_hosted-configuration_variables" >}} + +## Configuration variables + +- **path** (**Required**, string): Path to the co-processor firmware binary file (`.bin`). + The path is relative to your ESPHome configuration file. + +- **sha256** (**Required**, string): SHA256 hash of the firmware binary file. This is used to verify + the integrity of the firmware both at compile time and at runtime before flashing to the co-processor. + +- All other options from [Update](#config-update). + +## Platform requirements + +This update platform requires: + +- **Host device** (running ESPHome): `ESP32-H2` or `ESP32-P4` +- **Co-processor** (being updated): Any ESP32 variant supported by ESP-Hosted (e.g., `ESP32-C6` as shown in the example) + +The host device must have sufficient flash space to store the co-processor firmware binary. + +## Obtaining co-processor firmware + +To build firmware for your ESP32 co-processor, refer to the +[ESP IDF Get Started](https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/index.html). The +firmware should be built using the ESP-IDF framework and the resulting `.bin` file should be placed in your ESPHome +configuration directory. + +```sh +# Build instructions for IDF 5.5.1 and ESP Hosted 2.6.1 +git clone -b v5.5.1 --recursive https://github.com/espressif/esp-idf.git +cd esp-idf +./install.sh esp32c6 +source export.sh # for Linux/macOS +export.bat # for Windows +cd .. +idf.py create-project-from-example "espressif/esp_hosted^2.6.1:slave" +cd slave/ +idf.py set-target esp32c6 +idf.py build +``` + +After building the firmware, copy it to your ESPHome configuration directory and generate its SHA256 hash: + +```sh +# Copy the firmware to your ESPHome config directory +cp build/network_adapter.bin /path/to/your/esphome/config/coprocessor-firmware.bin + +# Generate SHA256 hash (Linux/macOS) +sha256sum /path/to/your/esphome/config/coprocessor-firmware.bin + +# Generate SHA256 hash (Windows PowerShell) +Get-FileHash -Algorithm SHA256 coprocessor-firmware.bin + +# Generate SHA256 hash (Windows Command Prompt with certutil) +certutil -hashfile coprocessor-firmware.bin SHA256 +``` + +Use the generated hash in your `sha256` configuration parameter. + +## See Also + +- {{< docref "/components/esp32_hosted" >}} +- {{< docref "/components/update" >}} +- [ESP-Hosted-MCU](https://github.com/espressif/esp-hosted-mcu) by [Espressif Systems](https://www.espressif.com/) +- {{< apiref "esp32_hosted/update/esp32_hosted_update.h" "esp32_hosted/update/esp32_hosted_update.h" >}} diff --git a/content/components/uponor_smatrix.md b/content/components/uponor_smatrix.md index 10d664a52a..9cf54c4c20 100644 --- a/content/components/uponor_smatrix.md +++ b/content/components/uponor_smatrix.md @@ -22,7 +22,7 @@ The [UART Component](/components/uart) must be configured with a baud rate of 19 ## Getting started -The controller and the thermostats have unique addresses used for communication that are not displayed anywhere but can only be found when scanning the bus. +The thermostats have unique addresses used for communication that are not displayed anywhere but can only be found when scanning the bus. Start with a basic configuration that just contains the UART and Uponor hub components. Make sure that the UART pins are configured according to your wiring and the baud rate is set to 19200. ```yaml @@ -32,28 +32,32 @@ uponor_smatrix: When you upload this configuration to your ESPHome device and connect it to the Uponor Smatrix bus, it will print a list of detected addresses to the log output. ```text -[00:00:00][C][uponor_smatrix:019]: Uponor Smatrix -[00:00:00][C][uponor_smatrix:020]: System address: 0x110B +[00:00:00][C][uponor_smatrix:020]: Uponor Smatrix [00:00:00][C][uponor_smatrix:031]: Detected unknown device addresses: -[00:00:00][C][uponor_smatrix:033]: 0xDE62 -[00:00:00][C][uponor_smatrix:033]: 0xDDFF -[00:00:00][C][uponor_smatrix:033]: 0xDE72 -[00:00:00][C][uponor_smatrix:033]: 0xDE4A -[00:00:00][C][uponor_smatrix:033]: 0xDE13 +[00:00:00][C][uponor_smatrix:033]: 0x110BDE62 +[00:00:00][C][uponor_smatrix:033]: 0x110BDDFF +[00:00:00][C][uponor_smatrix:033]: 0x110BDE72 +[00:00:00][C][uponor_smatrix:033]: 0x110BDE4A +[00:00:00][C][uponor_smatrix:033]: 0x110BDE13 ``` -With that you can then add `climate` or `sensor` components for the detected devices. Optionally, you can also statically add the detected system address to your `uponor_smatrix` configuration. +With that you can then add `climate` or `sensor` components for the detected devices. ```yaml uponor_smatrix: - address: 0x110B climate: - platform: uponor_smatrix - address: 0xDE13 + address: 0x110BDE13 name: Thermostat Living Room ``` +> [!IMPORTANT] +> Previous versions of the component used a 16 bit system address in addition to 16 bit device addresses. +> This has now been combined into 32 bit device addresses. +> Please update your configuration by prepending the old system address to your device addresses. +> **Example:** The system address 0x110B and device address 0xDE13 should now become 0x110BDE13. + ## Component/Hub The main `uponor_smatrix` component is responsible for the communication with the controller and thermostats and distributes data to the climate and sensor components described below. @@ -62,36 +66,40 @@ It is also able to synchronize the date and time of the thermostats with a time ```yaml uponor_smatrix: - address: 0x110B uart_id: my_uart time_id: my_time ``` ### Configuration variables -- **address** (*Optional*, int): The 16 bit system/controller address. This will be automatically detected from the bus if not specified. See [Getting started](#uponor-gettingstarted) on how to find the address. -- **uart_id** (*Optional*, [ID](/guides/configuration-types#id)): Manually specify the ID of the [UART Component](/components/uart) if you want to use multiple UART buses. -- **time_id** (*Optional*, [ID](/guides/configuration-types#id)): Specify the ID of the {{< docref "time/index" "Time Component" >}} to use as the time source if you want ESPHome to automatically synchronize the date and time of the thermostats. -- **time_device_address** (*Optional*, int): The 16 bit device address of the thermostat that keeps the system time. This will be automatically detected from the bus if not specified. +- **uart_id** (*Optional*, [ID](/guides/configuration-types#id)): Manually specify the ID of the + [UART Component](/components/uart) if you want to use multiple UART buses. +- **time_id** (*Optional*, [ID](/guides/configuration-types#id)): Specify the ID of the + {{< docref "time/index" "Time Component" >}} to use as the time source if you want ESPHome to automatically + synchronize the date and time of the thermostats. +- **time_device_address** (*Optional*, int): The 32 bit device address of the thermostat that keeps the system time. + This will be automatically detected from the bus if not specified. It needs to be the device address of the first thermostat that was paired to the controller, and the one where you can manually change the date and time via the buttons on the thermostat. > [!NOTE] -> The system address and the address of the thermostat keeping the time will be automatically detected from the bus if not specified in the configuration! -> You can safely leave out those parameters in almost all cases. +> The address of the thermostat keeping the time will be automatically detected from the bus if not specified in the configuration! +> You can safely leave it out in almost all cases. Time synchronization should work automatically as long as you add any time component to your configuration. ## Climate ```yaml climate: - platform: uponor_smatrix - address: 0xDE13 + address: 0x110BDE13 name: Thermostat Living Room ``` ### Configuration variables -- **address** (**Required**, int): The 16 bit device address of the thermostat. See [Getting started](#uponor-gettingstarted) on how to find the address. -- **uponor_smatrix_id** (*Optional*, [ID](/guides/configuration-types#id)): Manually specify the ID of the `uponor_smatrix` hub component if you want to use multiple hub components on one ESPHome device. +- **address** (**Required**, int): The 32 bit device address of the thermostat. + See [Getting started](#uponor-gettingstarted) on how to find the address. +- **uponor_smatrix_id** (*Optional*, [ID](/guides/configuration-types#id)): Manually specify the ID of the + `uponor_smatrix` hub component if you want to use multiple hub components on one ESPHome device. - All options from [Climate](/components/climate#config-climate). ## Sensor @@ -99,7 +107,7 @@ climate: ```yaml sensor: - platform: uponor_smatrix - address: 0xDE13 + address: 0x110BDE13 humidity: name: Humidity Living Room temperature: @@ -112,8 +120,10 @@ sensor: ### Configuration variables -- **address** (**Required**, int): The 16 bit device address of the thermostat. See [Getting started](#uponor-gettingstarted) on how to find the address. -- **uponor_smatrix_id** (*Optional*, [ID](/guides/configuration-types#id)): Manually specify the ID of the `uponor_smatrix` hub component if you want to use multiple hub components on one ESPHome device. +- **address** (**Required**, int): The 32 bit device address of the thermostat. + See [Getting started](#uponor-gettingstarted) on how to find the address. +- **uponor_smatrix_id** (*Optional*, [ID](/guides/configuration-types#id)): Manually specify the ID of the + `uponor_smatrix` hub component if you want to use multiple hub components on one ESPHome device. - **humidity** (*Optional*): A sensor reading the current humidity the thermostat reports. All options from [Sensor](/components/sensor). diff --git a/content/components/wifi.md b/content/components/wifi.md index 22120bcb8e..11eadcf6be 100644 --- a/content/components/wifi.md +++ b/content/components/wifi.md @@ -101,6 +101,20 @@ wifi: In case it fails, all networks are then tested one after the other in their declared order, starting with the first one in the list. +- **min_auth_mode** (*Optional*, string): Only on `esp32` and `esp8266`. Sets the minimum WiFi authentication mode + that the device will accept when connecting to access points. This controls the weakest encryption your device will + allow. Possible values are: + + - `WPA` - Allows WPA, WPA2, and WPA3 networks (least secure, uses TKIP encryption with known vulnerabilities) + - `WPA2` - Allows WPA2 and WPA3 networks (recommended, uses AES encryption) + - `WPA3` - Only allows WPA3 networks (most secure, ESP32 only) + + Defaults to `WPA2` on ESP32 and `WPA` on ESP8266 (will change to `WPA2` in 2026.6.0). + + **Security Warning:** Setting `min_auth_mode: WPA` allows connection to networks using deprecated WPA/TKIP encryption, + which has known security vulnerabilities. Only use this setting for legacy routers that cannot be upgraded to WPA2 or WPA3. + If your router supports WPA2 or newer, use the default `WPA2` setting for better security. + - **passive_scan** (*Optional*, boolean): If enabled, then the device will perform WiFi scans in a passive fashion. Defaults to `false`. @@ -202,6 +216,41 @@ wifi: power_save_mode: none ``` +{{< anchor "wifi-min_auth_mode" >}} + +## WiFi Authentication Mode + +The `min_auth_mode` option allows you to control the minimum WiFi security standard your device will accept. +This is useful for ensuring your device only connects to secure networks, or for maintaining compatibility with +legacy routers that only support older encryption standards. + +### Example: Maximum Security (WPA2 or newer) + +```yaml +wifi: + ssid: MyHomeNetwork + password: VerySafePassword + min_auth_mode: WPA2 # Reject WPA-only networks +``` + +### Example: Legacy Router Support (WPA allowed) + +```yaml +wifi: + ssid: OldRouter + password: VerySafePassword + min_auth_mode: WPA # Allow connection to WPA-only routers (less secure) +``` + +### Example: Modern Security (WPA3 only, ESP32 only) + +```yaml +wifi: + ssid: ModernRouter + password: VerySafePassword + min_auth_mode: WPA3 # Only connect to WPA3 networks (most secure) +``` + {{< anchor "wifi-networks" >}} ## Connecting to Multiple Networks @@ -248,8 +297,9 @@ wifi: - **hidden** (*Optional*, boolean): Whether this network is hidden. Defaults to false. If you add this option you also have to specify ssid. -- **priority** (*Optional*, float): The priority of this network. After each time, the network with - the highest priority is chosen. If the connection fails, the priority is decreased by one. +- **priority** (*Optional*, int): The priority of this network (range: -128 to 127). The network with + the highest priority is chosen. After each connection failure, the priority is decreased by one. + If all tracked BSSIDs have identical priorities, they are automatically reset to 0 to start fresh. Defaults to `0`. {{< anchor "eap" >}} diff --git a/content/guides/cli.md b/content/guides/cli.md index 3a71316fc1..6601ec0719 100644 --- a/content/guides/cli.md +++ b/content/guides/cli.md @@ -245,6 +245,23 @@ If set, opens the dashboard UI in a browser once the server is up and running. D `--socket`. {{< /option >}} +### `analyze-memory` Command + +> [!NOTE] +> This is an advanced command primarily intended for developers and debugging memory issues. + +The `esphome analyze-memory ` command compiles the configuration and analyzes memory usage by component. + +This command is useful for: + +* Understanding which components are consuming the most memory +* Identifying optimization opportunities to reduce flash or RAM usage +* Analyzing memory usage before adding more components to a tight build +* Debugging builds that are approaching memory limits (especially on ESP8266) +* Contributing to ESPHome development and optimization efforts + +The command automatically compiles the configuration if needed (or quickly relinks if sources haven't changed), then analyzes the resulting firmware to show a detailed breakdown of memory usage by component, including flash memory (code and data) and RAM usage (data and BSS). + ### `logs` Command The `esphome logs ` command validates the configuration and shows all logs. diff --git a/data/version.yaml b/data/version.yaml index 0191b1c5de..591e925c4f 100644 --- a/data/version.yaml +++ b/data/version.yaml @@ -1,2 +1,2 @@ -release: 2025.10.5 -version: '2025.10' +release: 2025.11.0b1 +version: '2025.11' diff --git a/static/images/bh1900nux-evk-001.png b/static/images/bh1900nux-evk-001.png new file mode 100644 index 0000000000..81d039b8af Binary files /dev/null and b/static/images/bh1900nux-evk-001.png differ diff --git a/static/images/face.svg b/static/images/face.svg new file mode 100644 index 0000000000..c97a3ead36 --- /dev/null +++ b/static/images/face.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + diff --git a/static/images/hdc2010.png b/static/images/hdc2010.png new file mode 100644 index 0000000000..b407e82149 Binary files /dev/null and b/static/images/hdc2010.png differ diff --git a/static/images/mcp3221.png b/static/images/mcp3221.png new file mode 100644 index 0000000000..a2b60c8148 Binary files /dev/null and b/static/images/mcp3221.png differ