ESPHome 2025.7.0: Web server OTA, LoRa, and sub-devices

Release Overview
Section titled “Release Overview”ESPHome 2025.7.0 is a major release featuring significant architectural improvements, new hardware support, and important platform updates. This release modernizes the codebase while expanding hardware compatibility and introducing powerful new features for advanced users.
Major Changes:
- Web Server OTA moved to dedicated platform (breaking change - migration required)
- ESP-IDF 4.x support removed - ESP-IDF 5.3.2+ now required
- ESP32 Arduino updated to 3.1.3 for better compatibility and performance
- Sub-device support for logical entity grouping in Home Assistant
- Jinja2 template expressions for dynamic configuration generation
New Hardware:
- LoRa communication (SX126x/SX127x), ESP32 Hosted WiFi, LN882X SoCs
- New sensors: OPT3001 light, LPS22 pressure, GL-R01 ToF, Xiaomi BLE
Performance:
- Extensive memory optimizations (up to 40% reduction in component memory usage)
- Enhanced performance through C++20 support and optimized algorithms
- Improved interrupt handling and scheduler efficiency
Web Server OTA Platform
Section titled “Web Server OTA Platform”WARNING
Breaking Change: Read this carefully! If your only OTA method is web_server and you don’t have it explicitly
enabled, you will lose the ability to update devices OTA after updating to 2025.7.0. You must add the web_server
OTA platform to your configuration to maintain OTA functionality.
The Web Server component has undergone a significant architectural change. Previously, OTA functionality was built directly into the web server component. This has now been extracted into a dedicated OTA platform: Web Server.
Migration Required:
If you were relying on the web server’s built-in OTA functionality, you now need to explicitly configure the web server OTA platform:
# Before (implicit OTA in web server)web_server: port: 80
# After (explicit OTA platform required)web_server: port: 80
ota: - platform: esphome # Your existing OTA method - platform: web_server # Add this for web-based OTA uploadsBenefits of this change:
- Cleaner separation of concerns - Web server focuses on serving content, OTA platform handles updates
- More flexible OTA configuration - Better control over OTA methods and security
- Improved maintainability - Dedicated OTA platform allows for better features and bug fixes
ESP-IDF 4.x End of Life
Section titled “ESP-IDF 4.x End of Life”NOTE
Major Platform Change: This release completely removes support for ESP-IDF 4.x versions, marking the end of life for these older framework versions.
ESPHome 2025.7.0 removes all support for ESP-IDF 4.x versions as part of our commitment to supporting modern, secure, and well-maintained development frameworks. Please see our developer blog post for detailed background and technical reasons behind this decision.
What this means for users:
-
Most users are unaffected - We automatically set the recommended ESP-IDF version (currently 5.3.2) as the default
-
Explicit version users must update - If you’re explicitly setting the ESP-IDF version in your configuration, you must update to version 5.3.2 or later
-
Legacy projects may need updates - Older projects might require minor configuration adjustments
Required action if you explicitly set ESP-IDF version:
# Remove or update old explicit versionsesp32: board: esp32dev framework: type: esp-idf version: 4.4.7 # ❌ No longer supported
# Update to supported versionesp32: board: esp32dev framework: type: esp-idf version: 5.3.2 # ✅ Supported (or omit for latest recommended)Benefits of ESP-IDF 5.x:
- Enhanced security - Latest security patches and improvements
- Better performance - Optimized code generation and runtime performance
- Modern C++ support - Full C++20 support with improved standard library
- Expanded hardware support - Better support for newer ESP32 variants (S2, S3, C3, C6, H2)
- Active maintenance - Continued updates and bug fixes from Espressif
ESP32 Arduino Framework 3.x
Section titled “ESP32 Arduino Framework 3.x”NOTE
Framework Update: Arduino for ESP32 has been upgraded to version 3.1.3, bringing significant improvements and maintaining compatibility with ESP-IDF 5.3.2.
To maintain alignment and compatibility with the current ESP-IDF version of 5.3.2, the Arduino framework for ESP32 has been updated to version 3.1.3. This represents a major version jump from Arduino 2.x.
Key improvements in Arduino 3.1.3:
- ESP-IDF 5.3.2 compatibility - Full integration with the latest ESP-IDF features
- Improved stability - Better memory management and reduced crashes
- Enhanced WiFi performance - More reliable connections and better power management
- Updated libraries - Latest versions of core Arduino libraries
- Bug fixes - Numerous fixes for issues present in earlier versions
Potential compatibility considerations:
- Some third-party Arduino libraries may need updates for Arduino 3.x compatibility
- Timing-sensitive code might behave slightly differently due to framework optimizations
- Memory usage patterns may change slightly due to framework improvements
NOTE
Flash Usage Warning: Arduino 3.x can use more flash memory than Arduino 2.x, which may cause some projects with many components to exceed available flash space. If you encounter flash size issues, consider:
- Switching to ESP-IDF framework (recommended for large projects)
- Reducing the number of enabled components
- Using a board with more flash memory
Most users will see this as a transparent improvement with better performance and reliability.
Sub-Device Support
Section titled “Sub-Device Support”NOTE
New Feature: Entities can now be organized into logical sub-devices, enabling better organization and area management in Home Assistant.
ESPHome now supports sub-devices, a powerful new feature that allows you to logically group entities from a single physical ESPHome device into multiple virtual devices within Home Assistant. This is particularly useful for complex setups where one ESP32 controls sensors or actuators in different areas of your home.
Use cases and benefits:
-
Multi-room sensors - One ESP32 with temperature sensors in different rooms can appear as separate devices per room
-
Complex automation hubs - A single ESP32 controlling lights, fans, and sensors across multiple areas
-
Better Home Assistant organization - Entities automatically appear in the correct areas and can be managed independently
-
Cleaner dashboards - Related entities are grouped together logically rather than by physical device
How it works:
You can assign entities to sub-devices using the new device_id configuration option. First, define your devices
in the devices section under esphome:, then reference them in individual entities.
Example configuration:
esphome: name: multi_room_controller
# Define areas (optional) areas: - id: living_room_area name: "Living Room" - id: bedroom_area name: "Bedroom"
# Define devices devices: - id: living_room_device name: "Living Room Sensors" area_id: living_room_area - id: bedroom_device name: "Bedroom Sensors" area_id: bedroom_area
# Assign sensors to different devicessensor: - platform: dht pin: GPIO4 temperature: name: "Living Room Temperature" device_id: living_room_device humidity: name: "Living Room Humidity" device_id: living_room_device
- platform: dht pin: GPIO5 temperature: name: "Bedroom Temperature" device_id: bedroom_device humidity: name: "Bedroom Humidity" device_id: bedroom_deviceIn this example, Home Assistant will see two separate sensor devices (one for living room, one for bedroom) even though they’re controlled by a single ESPHome device.
This feature enhances the logical organization of your smart home while maintaining the efficiency of centralized ESPHome device management.
New Hardware Support Highlights
Section titled “New Hardware Support Highlights”This release brings support for exciting new hardware platforms and components:
New Wireless Communication:
- SX126x & SX127x LoRa modules - Long-range, low-power communication for remote sensors and IoT applications
- ESP32 Hosted WiFi - Use an ESP32 as a WiFi adapter for other microcontrollers, expanding connectivity options
New Sensors & Measurement:
- OPT3001 - High-precision ambient light sensor with excellent low-light sensitivity
- LPS22 - Accurate barometric pressure sensor for weather monitoring and altitude measurement
- GL-R01 - Time-of-flight distance sensor for precise proximity and ranging applications
- Xiaomi XMWSDJ04MMC - Support for popular Xiaomi Bluetooth temperature/humidity sensors
Expanded Platform Support:
- LN882X SoC Family - New LibreTiny support extends ESPHome to additional low-cost WiFi microcontrollers
- PI4IOE5V6408 - New I2C GPIO expander for applications requiring additional digital I/O pins
Infrastructure Improvements:
- DS2484 - Advanced 1-Wire bus master for improved reliability in complex 1-Wire networks
- Enhanced Camera Framework - New base camera class enables support for alternative camera implementations
Memory and Performance Optimizations
Section titled “Memory and Performance Optimizations”ESPHome 2025.7.0 includes extensive memory and performance optimizations, particularly beneficial for resource-constrained devices:
Memory Usage Reductions:
- Component memory reduced (8 bytes per component) - Significant savings for devices with many components
- Sensor entities optimized - Reduced memory footprint for devices with numerous sensors
- API and networking optimizations - Lower RAM usage for WiFi and API communication
- Color constant storage optimization - More efficient handling of color data in displays and lighting
Performance Improvements:
- Faster loop processing - Components can now disable their loop() method when not needed, reducing CPU overhead
- Optimized API communication - Improved batching and reduced redundant operations
- Enhanced logging performance - More efficient message processing and reduced CPU impact
- Bluetooth proxy optimizations - Better performance for ESP32 devices acting as Bluetooth proxies
Code Quality Enhancements:
- C++20 support - Modern C++ features for better performance and developer experience
- Improved interrupt handling - More reliable GPIO interrupt processing
- Enhanced scheduler - Better task management with comprehensive test coverage
Jinja2 Template Expressions in Substitutions
Section titled “Jinja2 Template Expressions in Substitutions”NOTE
New Feature: ESPHome now supports Jinja2 template expressions within substitutions, enabling more advanced and dynamic value generation.
ESPHome 2025.7.0 introduces support for Jinja2 template expressions within the existing substitutions system.
This enhancement extends the current ${ } substitution syntax to support Jinja2 expressions, allowing for
more sophisticated value calculations and transformations.
Enhanced substitution capabilities:
- Mathematical operations - Perform calculations using substitution variables
- Conditional expressions - Use ternary operators and conditional logic
- String formatting - Advanced string manipulation and formatting
- Type conversions - Convert between strings, numbers, and other types
- Filter operations - Apply Jinja2 filters for data transformation
Example usage:
substitutions: device_name: living_room_sensors num_sensors: 3 base_pin: 4 offset_voltage: 3.3 enable_debugging: false sensor_config: update_interval: 60s accuracy_decimals: 2
sensor: - platform: adc pin: GPIO${base_pin} name: "${device_name} voltage" update_interval: ${sensor_config.update_interval} accuracy_decimals: ${sensor_config.accuracy_decimals} filters: # Convert ADC reading to actual voltage - multiply: ${offset_voltage / 4095}
- platform: adc pin: GPIO${base_pin + 1} name: "${device_name} sensor ${num_sensors > 1 and 'secondary' or 'primary'}" accuracy_decimals: ${1 if num_sensors <= 2 else 2} update_interval: ${sensor_config.update_interval}
binary_sensor: - platform: gpio pin: GPIO${base_pin + 2} name: "${device_name} status ${enable_debugging and '(debug)' or ''}"Key features:
- Works within existing substitutions - Uses the familiar
${ }syntax you already know - Access to substitution variables - All defined substitutions are available as Jinja variables
- Dictionary and list access - Use dot notation (
device.name) or indexing (pins[0]) - Mathematical functions - Access to Python’s math library (
math.sqrt,math.pi, etc.) - Conditional logic - Ternary operators and boolean expressions for dynamic values
Benefits:
- More powerful substitutions - Calculate complex values instead of just simple replacements
- Reduced duplication - Generate values programmatically based on other substitutions
- Better maintainability - Change base values and have dependent values update automatically
- Enhanced flexibility - Support for conditional values and complex transformations
This feature builds upon ESPHome’s existing substitutions system, making it more powerful while maintaining backward compatibility. It’s particularly useful for responsive designs, calculated pin assignments, and configurations that need to adapt based on device capabilities or user preferences.
For complete documentation and more examples, see the Substitutions guide.
ArduinoJson Library 7.x
Section titled “ArduinoJson Library 7.x”WARNING
Breaking Change: The ArduinoJson library has been upgraded from version 6.x to 7.2.0, introducing breaking changes that may affect custom components and external integrations.
ESPHome 2025.7.0 upgrades the ArduinoJson library to version 7.2.0, bringing performance improvements and reduced memory usage. Most users will not be affected as all standard ESPHome components have been updated. However, if you have external components, or lambdas that directly use ArduinoJson, you may need to update your code.
For detailed migration information, see the ArduinoJson migration guide.
Release 2025.7.1 - July 17
Section titled “Release 2025.7.1 - July 17”- [lvgl]: fix missing await keyword in meter tick_style width processing esphome#9538 by @theshut
- Fix compilation error when using string lambdas with homeassistant services esphome#9543 by @bdraco
- Fix format string warnings in Web Server OTA component esphome#9569 by @bdraco
- Add helpful error message when ESP32+Arduino runs out of flash space esphome#9580 by @bdraco
- Allow disabling OTA for web_server while keeping it enabled for captive_portal esphome#9583 by @bdraco
- [esp32] Add missing include for helpers esphome#9579 by @jesserockz
- Fix lwIP thread safety assertion failures on ESP32 esphome#9570 by @bdraco
Release 2025.7.2 - July 19
Section titled “Release 2025.7.2 - July 19”- Fix template event web_server crash esphome#9618 by @AzonInc
- [api] Fix compilation error with char* lambdas in HomeAssistant services esphome#9638 by @bdraco
- [wireguard] Fix boot loop when CONFIG_LWIP_TCPIP_CORE_LOCKING is enabled esphome#9637 by @bdraco
- [scheduler] Fix cancellation of timers with empty string names esphome#9641 by @bdraco
- [logger] fix on_message esphome#9642 by @ssieb
- esp32_camera: deprecate i2c_pins; throw error if combined with i2c: block esphome#9615 by @RubenKelevra
- [scheduler] Fix DelayAction cancellation in restart mode scripts esphome#9646 by @bdraco
- [lvgl] Fix meter rotation esphome#9605 by @clydebarrow
- [libretiny] Remove unsupported lock-free queue and event pool implementations esphome#9653 by @bdraco
- [lvgl] Prevent keyerror on min/max value widgets with no default esphome#9660 by @jesserockz
- Fix AsyncTCP version mismatch between platformio.ini and async_tcp component esphome#9676 by @bdraco
- [speaker] Media player’s pipeline properly returns playing state near end of file esphome#9668 by @kahrendt
- [voice_assistant] Use media player callbacks to track TTS response status esphome#9670 by @kahrendt
- [gpio] Disable interrupt mode by default for LibreTiny platforms esphome#9687 by @bdraco
Release 2025.7.3 - July 23
Section titled “Release 2025.7.3 - July 23”- [gpio] Auto-disable interrupts for shared GPIO pins in binary sensors esphome#9701 by @bdraco
- Fix format string error in ota_web_server.cpp esphome#9711 by @tmpeh
- [sdl][mipi_spi] Respect clipping when drawing esphome#9722 by @JonasB2497
- [esp32_touch] Fix setup mode in v1 driver esphome#9725 by @swoboda1337
- [tuya] Update use of fan_schema esphome#9762 by @jesserockz
- [config_validation] Add support for suggesting alternate component/platform esphome#9757 by @kbx81
- [core] Process pending loop enables during setup blocking phase esphome#9787 by @bdraco
- [fastled_clockless, fastled_spi] Add suggested alternate when using IDF esphome#9784 by @kbx81
- [neopixelbus] Add suggested alternate when using IDF esphome#9783 by @kbx81
- [bme680_bsec] Add suggested alternate when using IDF esphome#9785 by @kbx81
Release 2025.7.4 - July 28
Section titled “Release 2025.7.4 - July 28”- [remote_receiver] Fix idle validation esphome#9819 by @swoboda1337
- [gt911] i2c fixes esphome#9822 by @clydebarrow
- fix: non-optional x/y target calculation for ld2450 esphome#9849 by @Hofferic
- [logger] Don’t allow
logger.logactions without configuring theloggeresphome#9821 by @jesserockz - Add seed flag when running setup with uv present esphome#9932 by @cryptk
- Fail with old lerp esphome#9914 by @HeMan
Release 2025.7.5 - August 5
Section titled “Release 2025.7.5 - August 5”- [lvgl] Bugfix for tileview esphome#9938 by @clydebarrow
- [api] Fix OTA progress updates not being sent when main loop is blocked esphome#10049 by @bdraco
- [font] Catch file load exception esphome#10058 by @clydebarrow
- [i2s_audio] Use high-pass filter for dc offset correction esphome#10005 by @doobry
Full List of Changes
Section titled “Full List of Changes”For the complete list of every merged pull request in this release, see the full 2025.7.0 changelog.







Comments