mirror of
https://github.com/esphome/esphome.git
synced 2026-02-08 00:31:58 +00:00
[esp32] Reduce compile time by excluding unused IDF components (#13610)
This commit is contained in:
@@ -2,7 +2,7 @@ import logging
|
|||||||
|
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components import sensor, voltage_sampler
|
from esphome.components import sensor, voltage_sampler
|
||||||
from esphome.components.esp32 import get_esp32_variant
|
from esphome.components.esp32 import get_esp32_variant, include_builtin_idf_component
|
||||||
from esphome.components.nrf52.const import AIN_TO_GPIO, EXTRA_ADC
|
from esphome.components.nrf52.const import AIN_TO_GPIO, EXTRA_ADC
|
||||||
from esphome.components.zephyr import (
|
from esphome.components.zephyr import (
|
||||||
zephyr_add_overlay,
|
zephyr_add_overlay,
|
||||||
@@ -118,6 +118,9 @@ async def to_code(config):
|
|||||||
cg.add(var.set_sampling_mode(config[CONF_SAMPLING_MODE]))
|
cg.add(var.set_sampling_mode(config[CONF_SAMPLING_MODE]))
|
||||||
|
|
||||||
if CORE.is_esp32:
|
if CORE.is_esp32:
|
||||||
|
# Re-enable ESP-IDF's ADC driver (excluded by default to save compile time)
|
||||||
|
include_builtin_idf_component("esp_adc")
|
||||||
|
|
||||||
if attenuation := config.get(CONF_ATTENUATION):
|
if attenuation := config.get(CONF_ATTENUATION):
|
||||||
if attenuation == "auto":
|
if attenuation == "auto":
|
||||||
cg.add(var.set_autorange(cg.global_ns.true))
|
cg.add(var.set_autorange(cg.global_ns.true))
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components.esp32 import add_idf_component
|
from esphome.components.esp32 import add_idf_component, include_builtin_idf_component
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_BITS_PER_SAMPLE, CONF_NUM_CHANNELS, CONF_SAMPLE_RATE
|
from esphome.const import CONF_BITS_PER_SAMPLE, CONF_NUM_CHANNELS, CONF_SAMPLE_RATE
|
||||||
import esphome.final_validate as fv
|
import esphome.final_validate as fv
|
||||||
@@ -166,6 +166,9 @@ def final_validate_audio_schema(
|
|||||||
|
|
||||||
|
|
||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
|
# Re-enable ESP-IDF's HTTP client (excluded by default to save compile time)
|
||||||
|
include_builtin_idf_component("esp_http_client")
|
||||||
|
|
||||||
add_idf_component(
|
add_idf_component(
|
||||||
name="esphome/esp-audio-libs",
|
name="esphome/esp-audio-libs",
|
||||||
ref="2.0.3",
|
ref="2.0.3",
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from esphome.const import (
|
|||||||
CONF_UPDATE_INTERVAL,
|
CONF_UPDATE_INTERVAL,
|
||||||
SCHEDULER_DONT_RUN,
|
SCHEDULER_DONT_RUN,
|
||||||
)
|
)
|
||||||
from esphome.core import CoroPriority, coroutine_with_priority
|
from esphome.core import CORE, CoroPriority, coroutine_with_priority
|
||||||
|
|
||||||
IS_PLATFORM_COMPONENT = True
|
IS_PLATFORM_COMPONENT = True
|
||||||
|
|
||||||
@@ -222,3 +222,8 @@ async def display_is_displaying_page_to_code(config, condition_id, template_arg,
|
|||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
cg.add_global(display_ns.using)
|
cg.add_global(display_ns.using)
|
||||||
cg.add_define("USE_DISPLAY")
|
cg.add_define("USE_DISPLAY")
|
||||||
|
if CORE.is_esp32:
|
||||||
|
# Re-enable ESP-IDF's LCD driver (excluded by default to save compile time)
|
||||||
|
from esphome.components.esp32 import include_builtin_idf_component
|
||||||
|
|
||||||
|
include_builtin_idf_component("esp_lcd")
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ from .const import ( # noqa
|
|||||||
KEY_BOARD,
|
KEY_BOARD,
|
||||||
KEY_COMPONENTS,
|
KEY_COMPONENTS,
|
||||||
KEY_ESP32,
|
KEY_ESP32,
|
||||||
|
KEY_EXCLUDE_COMPONENTS,
|
||||||
KEY_EXTRA_BUILD_FILES,
|
KEY_EXTRA_BUILD_FILES,
|
||||||
KEY_FLASH_SIZE,
|
KEY_FLASH_SIZE,
|
||||||
KEY_FULL_CERT_BUNDLE,
|
KEY_FULL_CERT_BUNDLE,
|
||||||
@@ -86,6 +87,7 @@ IS_TARGET_PLATFORM = True
|
|||||||
CONF_ASSERTION_LEVEL = "assertion_level"
|
CONF_ASSERTION_LEVEL = "assertion_level"
|
||||||
CONF_COMPILER_OPTIMIZATION = "compiler_optimization"
|
CONF_COMPILER_OPTIMIZATION = "compiler_optimization"
|
||||||
CONF_ENABLE_IDF_EXPERIMENTAL_FEATURES = "enable_idf_experimental_features"
|
CONF_ENABLE_IDF_EXPERIMENTAL_FEATURES = "enable_idf_experimental_features"
|
||||||
|
CONF_INCLUDE_BUILTIN_IDF_COMPONENTS = "include_builtin_idf_components"
|
||||||
CONF_ENABLE_LWIP_ASSERT = "enable_lwip_assert"
|
CONF_ENABLE_LWIP_ASSERT = "enable_lwip_assert"
|
||||||
CONF_ENABLE_OTA_ROLLBACK = "enable_ota_rollback"
|
CONF_ENABLE_OTA_ROLLBACK = "enable_ota_rollback"
|
||||||
CONF_EXECUTE_FROM_PSRAM = "execute_from_psram"
|
CONF_EXECUTE_FROM_PSRAM = "execute_from_psram"
|
||||||
@@ -114,6 +116,36 @@ COMPILER_OPTIMIZATIONS = {
|
|||||||
"SIZE": "CONFIG_COMPILER_OPTIMIZATION_SIZE",
|
"SIZE": "CONFIG_COMPILER_OPTIMIZATION_SIZE",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ESP-IDF components excluded by default to reduce compile time.
|
||||||
|
# Components can be re-enabled by calling include_builtin_idf_component() in to_code().
|
||||||
|
#
|
||||||
|
# Cannot be excluded (dependencies of required components):
|
||||||
|
# - "console": espressif/mdns unconditionally depends on it
|
||||||
|
# - "sdmmc": driver -> esp_driver_sdmmc -> sdmmc dependency chain
|
||||||
|
DEFAULT_EXCLUDED_IDF_COMPONENTS = (
|
||||||
|
"cmock", # Unit testing mock framework - ESPHome doesn't use IDF's testing
|
||||||
|
"esp_adc", # ADC driver - only needed by adc component
|
||||||
|
"esp_driver_i2s", # I2S driver - only needed by i2s_audio component
|
||||||
|
"esp_driver_rmt", # RMT driver - only needed by remote_transmitter/receiver, neopixelbus
|
||||||
|
"esp_driver_touch_sens", # Touch sensor driver - only needed by esp32_touch
|
||||||
|
"esp_eth", # Ethernet driver - only needed by ethernet component
|
||||||
|
"esp_hid", # HID host/device support - ESPHome doesn't implement HID functionality
|
||||||
|
"esp_http_client", # HTTP client - only needed by http_request component
|
||||||
|
"esp_https_ota", # ESP-IDF HTTPS OTA - ESPHome has its own OTA implementation
|
||||||
|
"esp_https_server", # HTTPS server - ESPHome has its own web server
|
||||||
|
"esp_lcd", # LCD controller drivers - only needed by display component
|
||||||
|
"esp_local_ctrl", # Local control over HTTPS/BLE - ESPHome has native API
|
||||||
|
"espcoredump", # Core dump support - ESPHome has its own debug component
|
||||||
|
"fatfs", # FAT filesystem - ESPHome doesn't use filesystem storage
|
||||||
|
"mqtt", # ESP-IDF MQTT library - ESPHome has its own MQTT implementation
|
||||||
|
"perfmon", # Xtensa performance monitor - ESPHome has its own debug component
|
||||||
|
"protocomm", # Protocol communication for provisioning - unused by ESPHome
|
||||||
|
"spiffs", # SPIFFS filesystem - ESPHome doesn't use filesystem storage (IDF only)
|
||||||
|
"unity", # Unit testing framework - ESPHome doesn't use IDF's testing
|
||||||
|
"wear_levelling", # Flash wear levelling for fatfs - unused since fatfs unused
|
||||||
|
"wifi_provisioning", # WiFi provisioning - ESPHome uses its own improv implementation
|
||||||
|
)
|
||||||
|
|
||||||
# ESP32 (original) chip revision options
|
# ESP32 (original) chip revision options
|
||||||
# Setting minimum revision to 3.0 or higher:
|
# Setting minimum revision to 3.0 or higher:
|
||||||
# - Reduces flash size by excluding workaround code for older chip bugs
|
# - Reduces flash size by excluding workaround code for older chip bugs
|
||||||
@@ -203,6 +235,9 @@ def set_core_data(config):
|
|||||||
)
|
)
|
||||||
CORE.data[KEY_ESP32][KEY_SDKCONFIG_OPTIONS] = {}
|
CORE.data[KEY_ESP32][KEY_SDKCONFIG_OPTIONS] = {}
|
||||||
CORE.data[KEY_ESP32][KEY_COMPONENTS] = {}
|
CORE.data[KEY_ESP32][KEY_COMPONENTS] = {}
|
||||||
|
# Initialize with default exclusions - components can call include_builtin_idf_component()
|
||||||
|
# to re-enable any they need
|
||||||
|
CORE.data[KEY_ESP32][KEY_EXCLUDE_COMPONENTS] = set(DEFAULT_EXCLUDED_IDF_COMPONENTS)
|
||||||
CORE.data[KEY_CORE][KEY_FRAMEWORK_VERSION] = cv.Version.parse(
|
CORE.data[KEY_CORE][KEY_FRAMEWORK_VERSION] = cv.Version.parse(
|
||||||
config[CONF_FRAMEWORK][CONF_VERSION]
|
config[CONF_FRAMEWORK][CONF_VERSION]
|
||||||
)
|
)
|
||||||
@@ -328,6 +363,28 @@ def add_idf_component(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def exclude_builtin_idf_component(name: str) -> None:
|
||||||
|
"""Exclude an ESP-IDF component from the build.
|
||||||
|
|
||||||
|
This reduces compile time by skipping components that are not needed.
|
||||||
|
The component will be passed to ESP-IDF's EXCLUDE_COMPONENTS cmake variable.
|
||||||
|
|
||||||
|
Note: Components that are dependencies of other required components
|
||||||
|
cannot be excluded - ESP-IDF will still build them.
|
||||||
|
"""
|
||||||
|
CORE.data[KEY_ESP32][KEY_EXCLUDE_COMPONENTS].add(name)
|
||||||
|
|
||||||
|
|
||||||
|
def include_builtin_idf_component(name: str) -> None:
|
||||||
|
"""Remove an ESP-IDF component from the exclusion list.
|
||||||
|
|
||||||
|
Call this from components that need an ESP-IDF component that is
|
||||||
|
excluded by default in DEFAULT_EXCLUDED_IDF_COMPONENTS. This ensures the
|
||||||
|
component will be built when needed.
|
||||||
|
"""
|
||||||
|
CORE.data[KEY_ESP32][KEY_EXCLUDE_COMPONENTS].discard(name)
|
||||||
|
|
||||||
|
|
||||||
def add_extra_script(stage: str, filename: str, path: Path):
|
def add_extra_script(stage: str, filename: str, path: Path):
|
||||||
"""Add an extra script to the project."""
|
"""Add an extra script to the project."""
|
||||||
key = f"{stage}:{filename}"
|
key = f"{stage}:{filename}"
|
||||||
@@ -844,6 +901,9 @@ FRAMEWORK_SCHEMA = cv.Schema(
|
|||||||
cv.Optional(
|
cv.Optional(
|
||||||
CONF_USE_FULL_CERTIFICATE_BUNDLE, default=False
|
CONF_USE_FULL_CERTIFICATE_BUNDLE, default=False
|
||||||
): cv.boolean,
|
): cv.boolean,
|
||||||
|
cv.Optional(
|
||||||
|
CONF_INCLUDE_BUILTIN_IDF_COMPONENTS, default=[]
|
||||||
|
): cv.ensure_list(cv.string_strict),
|
||||||
cv.Optional(CONF_DISABLE_DEBUG_STUBS, default=True): cv.boolean,
|
cv.Optional(CONF_DISABLE_DEBUG_STUBS, default=True): cv.boolean,
|
||||||
cv.Optional(CONF_DISABLE_OCD_AWARE, default=True): cv.boolean,
|
cv.Optional(CONF_DISABLE_OCD_AWARE, default=True): cv.boolean,
|
||||||
cv.Optional(
|
cv.Optional(
|
||||||
@@ -1043,6 +1103,19 @@ def _configure_lwip_max_sockets(conf: dict) -> None:
|
|||||||
add_idf_sdkconfig_option("CONFIG_LWIP_MAX_SOCKETS", max_sockets)
|
add_idf_sdkconfig_option("CONFIG_LWIP_MAX_SOCKETS", max_sockets)
|
||||||
|
|
||||||
|
|
||||||
|
@coroutine_with_priority(CoroPriority.FINAL)
|
||||||
|
async def _write_exclude_components() -> None:
|
||||||
|
"""Write EXCLUDE_COMPONENTS cmake arg after all components have registered exclusions."""
|
||||||
|
if KEY_ESP32 not in CORE.data:
|
||||||
|
return
|
||||||
|
excluded = CORE.data[KEY_ESP32].get(KEY_EXCLUDE_COMPONENTS)
|
||||||
|
if excluded:
|
||||||
|
exclude_list = ";".join(sorted(excluded))
|
||||||
|
cg.add_platformio_option(
|
||||||
|
"board_build.cmake_extra_args", f"-DEXCLUDE_COMPONENTS={exclude_list}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@coroutine_with_priority(CoroPriority.FINAL)
|
@coroutine_with_priority(CoroPriority.FINAL)
|
||||||
async def _add_yaml_idf_components(components: list[ConfigType]):
|
async def _add_yaml_idf_components(components: list[ConfigType]):
|
||||||
"""Add IDF components from YAML config with final priority to override code-added components."""
|
"""Add IDF components from YAML config with final priority to override code-added components."""
|
||||||
@@ -1256,6 +1329,11 @@ async def to_code(config):
|
|||||||
|
|
||||||
# Apply LWIP optimization settings
|
# Apply LWIP optimization settings
|
||||||
advanced = conf[CONF_ADVANCED]
|
advanced = conf[CONF_ADVANCED]
|
||||||
|
|
||||||
|
# Re-include any IDF components the user explicitly requested
|
||||||
|
for component_name in advanced.get(CONF_INCLUDE_BUILTIN_IDF_COMPONENTS, []):
|
||||||
|
include_builtin_idf_component(component_name)
|
||||||
|
|
||||||
# DHCP server: only disable if explicitly set to false
|
# DHCP server: only disable if explicitly set to false
|
||||||
# WiFi component handles its own optimization when AP mode is not used
|
# WiFi component handles its own optimization when AP mode is not used
|
||||||
# When using Arduino with Ethernet, DHCP server functions must be available
|
# When using Arduino with Ethernet, DHCP server functions must be available
|
||||||
@@ -1440,6 +1518,11 @@ async def to_code(config):
|
|||||||
if conf[CONF_COMPONENTS]:
|
if conf[CONF_COMPONENTS]:
|
||||||
CORE.add_job(_add_yaml_idf_components, conf[CONF_COMPONENTS])
|
CORE.add_job(_add_yaml_idf_components, conf[CONF_COMPONENTS])
|
||||||
|
|
||||||
|
# Write EXCLUDE_COMPONENTS at FINAL priority after all components have had
|
||||||
|
# a chance to call include_builtin_idf_component() to re-enable components they need.
|
||||||
|
# Default exclusions are added in set_core_data() during config validation.
|
||||||
|
CORE.add_job(_write_exclude_components)
|
||||||
|
|
||||||
|
|
||||||
APP_PARTITION_SIZES = {
|
APP_PARTITION_SIZES = {
|
||||||
"2MB": 0x0C0000, # 768 KB
|
"2MB": 0x0C0000, # 768 KB
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ KEY_FLASH_SIZE = "flash_size"
|
|||||||
KEY_VARIANT = "variant"
|
KEY_VARIANT = "variant"
|
||||||
KEY_SDKCONFIG_OPTIONS = "sdkconfig_options"
|
KEY_SDKCONFIG_OPTIONS = "sdkconfig_options"
|
||||||
KEY_COMPONENTS = "components"
|
KEY_COMPONENTS = "components"
|
||||||
|
KEY_EXCLUDE_COMPONENTS = "exclude_components"
|
||||||
KEY_REPO = "repo"
|
KEY_REPO = "repo"
|
||||||
KEY_REF = "ref"
|
KEY_REF = "ref"
|
||||||
KEY_REFRESH = "refresh"
|
KEY_REFRESH = "refresh"
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ from esphome import pins
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components import esp32, light
|
from esphome.components import esp32, light
|
||||||
from esphome.components.const import CONF_USE_PSRAM
|
from esphome.components.const import CONF_USE_PSRAM
|
||||||
|
from esphome.components.esp32 import include_builtin_idf_component
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
CONF_CHIPSET,
|
CONF_CHIPSET,
|
||||||
@@ -129,6 +130,9 @@ CONFIG_SCHEMA = cv.All(
|
|||||||
|
|
||||||
|
|
||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
|
# Re-enable ESP-IDF's RMT driver (excluded by default to save compile time)
|
||||||
|
include_builtin_idf_component("esp_driver_rmt")
|
||||||
|
|
||||||
var = cg.new_Pvariable(config[CONF_OUTPUT_ID])
|
var = cg.new_Pvariable(config[CONF_OUTPUT_ID])
|
||||||
await light.register_light(var, config)
|
await light.register_light(var, config)
|
||||||
await cg.register_component(var, config)
|
await cg.register_component(var, config)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from esphome.components.esp32 import (
|
|||||||
VARIANT_ESP32S3,
|
VARIANT_ESP32S3,
|
||||||
get_esp32_variant,
|
get_esp32_variant,
|
||||||
gpio,
|
gpio,
|
||||||
|
include_builtin_idf_component,
|
||||||
)
|
)
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
@@ -266,6 +267,9 @@ CONFIG_SCHEMA = cv.All(
|
|||||||
|
|
||||||
|
|
||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
|
# Re-enable ESP-IDF's touch sensor driver (excluded by default to save compile time)
|
||||||
|
include_builtin_idf_component("esp_driver_touch_sens")
|
||||||
|
|
||||||
touch = cg.new_Pvariable(config[CONF_ID])
|
touch = cg.new_Pvariable(config[CONF_ID])
|
||||||
await cg.register_component(touch, config)
|
await cg.register_component(touch, config)
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ from esphome.components.esp32 import (
|
|||||||
add_idf_component,
|
add_idf_component,
|
||||||
add_idf_sdkconfig_option,
|
add_idf_sdkconfig_option,
|
||||||
get_esp32_variant,
|
get_esp32_variant,
|
||||||
|
include_builtin_idf_component,
|
||||||
)
|
)
|
||||||
from esphome.components.network import ip_address_literal
|
from esphome.components.network import ip_address_literal
|
||||||
from esphome.components.spi import CONF_INTERFACE_INDEX, get_spi_interface
|
from esphome.components.spi import CONF_INTERFACE_INDEX, get_spi_interface
|
||||||
@@ -419,6 +420,9 @@ async def to_code(config):
|
|||||||
# Also disable WiFi/BT coexistence since WiFi is disabled
|
# Also disable WiFi/BT coexistence since WiFi is disabled
|
||||||
add_idf_sdkconfig_option("CONFIG_SW_COEXIST_ENABLE", False)
|
add_idf_sdkconfig_option("CONFIG_SW_COEXIST_ENABLE", False)
|
||||||
|
|
||||||
|
# Re-enable ESP-IDF's Ethernet driver (excluded by default to save compile time)
|
||||||
|
include_builtin_idf_component("esp_eth")
|
||||||
|
|
||||||
if config[CONF_TYPE] == "LAN8670":
|
if config[CONF_TYPE] == "LAN8670":
|
||||||
# Add LAN867x 10BASE-T1S PHY support component
|
# Add LAN867x 10BASE-T1S PHY support component
|
||||||
add_idf_component(name="espressif/lan867x", ref="2.0.0")
|
add_idf_component(name="espressif/lan867x", ref="2.0.0")
|
||||||
|
|||||||
@@ -155,6 +155,9 @@ async def to_code(config):
|
|||||||
cg.add(var.set_watchdog_timeout(timeout_ms))
|
cg.add(var.set_watchdog_timeout(timeout_ms))
|
||||||
|
|
||||||
if CORE.is_esp32:
|
if CORE.is_esp32:
|
||||||
|
# Re-enable ESP-IDF's HTTP client (excluded by default to save compile time)
|
||||||
|
esp32.include_builtin_idf_component("esp_http_client")
|
||||||
|
|
||||||
cg.add(var.set_buffer_size_rx(config[CONF_BUFFER_SIZE_RX]))
|
cg.add(var.set_buffer_size_rx(config[CONF_BUFFER_SIZE_RX]))
|
||||||
cg.add(var.set_buffer_size_tx(config[CONF_BUFFER_SIZE_TX]))
|
cg.add(var.set_buffer_size_tx(config[CONF_BUFFER_SIZE_TX]))
|
||||||
cg.add(var.set_verify_ssl(config[CONF_VERIFY_SSL]))
|
cg.add(var.set_verify_ssl(config[CONF_VERIFY_SSL]))
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
from esphome import pins
|
from esphome import pins
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components.esp32 import (
|
from esphome.components.esp32 import (
|
||||||
|
add_idf_sdkconfig_option,
|
||||||
|
get_esp32_variant,
|
||||||
|
include_builtin_idf_component,
|
||||||
|
)
|
||||||
|
from esphome.components.esp32.const import (
|
||||||
VARIANT_ESP32,
|
VARIANT_ESP32,
|
||||||
VARIANT_ESP32C3,
|
VARIANT_ESP32C3,
|
||||||
VARIANT_ESP32C5,
|
VARIANT_ESP32C5,
|
||||||
@@ -10,8 +15,6 @@ from esphome.components.esp32 import (
|
|||||||
VARIANT_ESP32P4,
|
VARIANT_ESP32P4,
|
||||||
VARIANT_ESP32S2,
|
VARIANT_ESP32S2,
|
||||||
VARIANT_ESP32S3,
|
VARIANT_ESP32S3,
|
||||||
add_idf_sdkconfig_option,
|
|
||||||
get_esp32_variant,
|
|
||||||
)
|
)
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_BITS_PER_SAMPLE, CONF_CHANNEL, CONF_ID, CONF_SAMPLE_RATE
|
from esphome.const import CONF_BITS_PER_SAMPLE, CONF_CHANNEL, CONF_ID, CONF_SAMPLE_RATE
|
||||||
@@ -272,6 +275,10 @@ FINAL_VALIDATE_SCHEMA = _final_validate
|
|||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
var = cg.new_Pvariable(config[CONF_ID])
|
var = cg.new_Pvariable(config[CONF_ID])
|
||||||
await cg.register_component(var, config)
|
await cg.register_component(var, config)
|
||||||
|
|
||||||
|
# Re-enable ESP-IDF's I2S driver (excluded by default to save compile time)
|
||||||
|
include_builtin_idf_component("esp_driver_i2s")
|
||||||
|
|
||||||
if use_legacy():
|
if use_legacy():
|
||||||
cg.add_define("USE_I2S_LEGACY")
|
cg.add_define("USE_I2S_LEGACY")
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,10 @@ from esphome import automation
|
|||||||
from esphome.automation import Condition
|
from esphome.automation import Condition
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components import logger, socket
|
from esphome.components import logger, socket
|
||||||
from esphome.components.esp32 import add_idf_sdkconfig_option
|
from esphome.components.esp32 import (
|
||||||
|
add_idf_sdkconfig_option,
|
||||||
|
include_builtin_idf_component,
|
||||||
|
)
|
||||||
from esphome.config_helpers import filter_source_files_from_platform
|
from esphome.config_helpers import filter_source_files_from_platform
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
@@ -360,6 +363,8 @@ async def to_code(config):
|
|||||||
# This enables low-latency MQTT event processing instead of waiting for select() timeout
|
# This enables low-latency MQTT event processing instead of waiting for select() timeout
|
||||||
if CORE.is_esp32:
|
if CORE.is_esp32:
|
||||||
socket.require_wake_loop_threadsafe()
|
socket.require_wake_loop_threadsafe()
|
||||||
|
# Re-enable ESP-IDF's mqtt component (excluded by default to save compile time)
|
||||||
|
include_builtin_idf_component("mqtt")
|
||||||
|
|
||||||
cg.add_define("USE_MQTT")
|
cg.add_define("USE_MQTT")
|
||||||
cg.add_global(mqtt_ns.using)
|
cg.add_global(mqtt_ns.using)
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
from esphome import pins
|
from esphome import pins
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components import light
|
from esphome.components import light
|
||||||
from esphome.components.esp32 import VARIANT_ESP32C3, VARIANT_ESP32S3, get_esp32_variant
|
from esphome.components.esp32 import (
|
||||||
|
VARIANT_ESP32C3,
|
||||||
|
VARIANT_ESP32S3,
|
||||||
|
get_esp32_variant,
|
||||||
|
include_builtin_idf_component,
|
||||||
|
)
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
CONF_CHANNEL,
|
CONF_CHANNEL,
|
||||||
@@ -205,6 +210,10 @@ async def to_code(config):
|
|||||||
has_white = "W" in config[CONF_TYPE]
|
has_white = "W" in config[CONF_TYPE]
|
||||||
method = config[CONF_METHOD]
|
method = config[CONF_METHOD]
|
||||||
|
|
||||||
|
# Re-enable ESP-IDF's RMT driver if using RMT method (excluded by default)
|
||||||
|
if CORE.is_esp32 and method[CONF_TYPE] == METHOD_ESP32_RMT:
|
||||||
|
include_builtin_idf_component("esp_driver_rmt")
|
||||||
|
|
||||||
method_template = METHODS[method[CONF_TYPE]].to_code(
|
method_template = METHODS[method[CONF_TYPE]].to_code(
|
||||||
method, config[CONF_VARIANT], config[CONF_INVERT]
|
method, config[CONF_VARIANT], config[CONF_INVERT]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -177,6 +177,8 @@ async def to_code(config):
|
|||||||
cg.add_define("USE_NEXTION_TFT_UPLOAD")
|
cg.add_define("USE_NEXTION_TFT_UPLOAD")
|
||||||
cg.add(var.set_tft_url(config[CONF_TFT_URL]))
|
cg.add(var.set_tft_url(config[CONF_TFT_URL]))
|
||||||
if CORE.is_esp32:
|
if CORE.is_esp32:
|
||||||
|
# Re-enable ESP-IDF's HTTP client (excluded by default to save compile time)
|
||||||
|
esp32.include_builtin_idf_component("esp_http_client")
|
||||||
esp32.add_idf_sdkconfig_option("CONFIG_ESP_TLS_INSECURE", True)
|
esp32.add_idf_sdkconfig_option("CONFIG_ESP_TLS_INSECURE", True)
|
||||||
esp32.add_idf_sdkconfig_option(
|
esp32.add_idf_sdkconfig_option(
|
||||||
"CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY", True
|
"CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY", True
|
||||||
|
|||||||
@@ -170,6 +170,9 @@ CONFIG_SCHEMA = remote_base.validate_triggers(
|
|||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
pin = await cg.gpio_pin_expression(config[CONF_PIN])
|
pin = await cg.gpio_pin_expression(config[CONF_PIN])
|
||||||
if CORE.is_esp32:
|
if CORE.is_esp32:
|
||||||
|
# Re-enable ESP-IDF's RMT driver (excluded by default to save compile time)
|
||||||
|
esp32.include_builtin_idf_component("esp_driver_rmt")
|
||||||
|
|
||||||
var = cg.new_Pvariable(config[CONF_ID], pin)
|
var = cg.new_Pvariable(config[CONF_ID], pin)
|
||||||
cg.add(var.set_rmt_symbols(config[CONF_RMT_SYMBOLS]))
|
cg.add(var.set_rmt_symbols(config[CONF_RMT_SYMBOLS]))
|
||||||
cg.add(var.set_receive_symbols(config[CONF_RECEIVE_SYMBOLS]))
|
cg.add(var.set_receive_symbols(config[CONF_RECEIVE_SYMBOLS]))
|
||||||
|
|||||||
@@ -112,6 +112,9 @@ async def digital_write_action_to_code(config, action_id, template_arg, args):
|
|||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
pin = await cg.gpio_pin_expression(config[CONF_PIN])
|
pin = await cg.gpio_pin_expression(config[CONF_PIN])
|
||||||
if CORE.is_esp32:
|
if CORE.is_esp32:
|
||||||
|
# Re-enable ESP-IDF's RMT driver (excluded by default to save compile time)
|
||||||
|
esp32.include_builtin_idf_component("esp_driver_rmt")
|
||||||
|
|
||||||
var = cg.new_Pvariable(config[CONF_ID], pin)
|
var = cg.new_Pvariable(config[CONF_ID], pin)
|
||||||
cg.add(var.set_rmt_symbols(config[CONF_RMT_SYMBOLS]))
|
cg.add(var.set_rmt_symbols(config[CONF_RMT_SYMBOLS]))
|
||||||
cg.add(var.set_non_blocking(config[CONF_NON_BLOCKING]))
|
cg.add(var.set_non_blocking(config[CONF_NON_BLOCKING]))
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ esp32:
|
|||||||
enable_lwip_bridge_interface: true
|
enable_lwip_bridge_interface: true
|
||||||
disable_libc_locks_in_iram: false # Test explicit opt-out of RAM optimization
|
disable_libc_locks_in_iram: false # Test explicit opt-out of RAM optimization
|
||||||
use_full_certificate_bundle: false # Test CMN bundle (default)
|
use_full_certificate_bundle: false # Test CMN bundle (default)
|
||||||
|
include_builtin_idf_components:
|
||||||
|
- freertos # Test escape hatch (freertos is always included anyway)
|
||||||
disable_debug_stubs: true
|
disable_debug_stubs: true
|
||||||
disable_ocd_aware: true
|
disable_ocd_aware: true
|
||||||
disable_usb_serial_jtag_secondary: true
|
disable_usb_serial_jtag_secondary: true
|
||||||
|
|||||||
Reference in New Issue
Block a user