diff --git a/esphome/config_validation.py b/esphome/config_validation.py index 9f7ce4d2e3..858c6e197c 100644 --- a/esphome/config_validation.py +++ b/esphome/config_validation.py @@ -1641,140 +1641,39 @@ class GenerateID(Optional): super().__init__(key, default=lambda: None) -def _get_priority_default(*args): - for arg in args: - if arg is not vol.UNDEFINED: - return arg - return vol.UNDEFINED +def _get_default_key(*args): + return ["_".join([CORE.target_platform] + list(args))] class SplitDefault(Optional): """Mark this key to have a split default for ESP8266/ESP32.""" - def __init__( - self, - key, - esp8266=vol.UNDEFINED, - esp32=vol.UNDEFINED, - esp32_arduino=vol.UNDEFINED, - esp32_idf=vol.UNDEFINED, - esp32_s2=vol.UNDEFINED, - esp32_s2_arduino=vol.UNDEFINED, - esp32_s2_idf=vol.UNDEFINED, - esp32_s3=vol.UNDEFINED, - esp32_s3_arduino=vol.UNDEFINED, - esp32_s3_idf=vol.UNDEFINED, - esp32_c3=vol.UNDEFINED, - esp32_c3_arduino=vol.UNDEFINED, - esp32_c3_idf=vol.UNDEFINED, - esp32_c6=vol.UNDEFINED, - esp32_c6_arduino=vol.UNDEFINED, - esp32_c6_idf=vol.UNDEFINED, - esp32_h2=vol.UNDEFINED, - esp32_h2_arduino=vol.UNDEFINED, - esp32_h2_idf=vol.UNDEFINED, - rp2040=vol.UNDEFINED, - bk72xx=vol.UNDEFINED, - rtl87xx=vol.UNDEFINED, - host=vol.UNDEFINED, - ): + def __init__(self, key, **kwargs): super().__init__(key) - self._esp8266_default = vol.default_factory(esp8266) - self._esp32_arduino_default = vol.default_factory( - _get_priority_default(esp32_arduino, esp32) - ) - self._esp32_idf_default = vol.default_factory( - _get_priority_default(esp32_idf, esp32) - ) - self._esp32_s2_arduino_default = vol.default_factory( - _get_priority_default(esp32_s2_arduino, esp32_s2, esp32_arduino, esp32) - ) - self._esp32_s2_idf_default = vol.default_factory( - _get_priority_default(esp32_s2_idf, esp32_s2, esp32_idf, esp32) - ) - self._esp32_s3_arduino_default = vol.default_factory( - _get_priority_default(esp32_s3_arduino, esp32_s3, esp32_arduino, esp32) - ) - self._esp32_s3_idf_default = vol.default_factory( - _get_priority_default(esp32_s3_idf, esp32_s3, esp32_idf, esp32) - ) - self._esp32_c3_arduino_default = vol.default_factory( - _get_priority_default(esp32_c3_arduino, esp32_c3, esp32_arduino, esp32) - ) - self._esp32_c3_idf_default = vol.default_factory( - _get_priority_default(esp32_c3_idf, esp32_c3, esp32_idf, esp32) - ) - self._esp32_c6_arduino_default = vol.default_factory( - _get_priority_default(esp32_c6_arduino, esp32_c6, esp32_arduino, esp32) - ) - self._esp32_c6_idf_default = vol.default_factory( - _get_priority_default(esp32_c6_idf, esp32_c6, esp32_idf, esp32) - ) - self._esp32_h2_arduino_default = vol.default_factory( - _get_priority_default(esp32_h2_arduino, esp32_h2, esp32_arduino, esp32) - ) - self._esp32_h2_idf_default = vol.default_factory( - _get_priority_default(esp32_h2_idf, esp32_h2, esp32_idf, esp32) - ) - self._rp2040_default = vol.default_factory(rp2040) - self._bk72xx_default = vol.default_factory(bk72xx) - self._rtl87xx_default = vol.default_factory(rtl87xx) - self._host_default = vol.default_factory(host) + + self._defaults = {} + + for platform_key, value in kwargs.items(): + self._defaults[platform_key] = vol.default_factory(value) @property def default(self): - if CORE.is_esp8266: - return self._esp8266_default + keys = [] if CORE.is_esp32: from esphome.components.esp32 import get_esp32_variant - from esphome.components.esp32.const import ( - VARIANT_ESP32C3, - VARIANT_ESP32C6, - VARIANT_ESP32H2, - VARIANT_ESP32S2, - VARIANT_ESP32S3, - ) + from esphome.components.esp32.const import VARIANT_ESP32 - variant = get_esp32_variant() - if variant == VARIANT_ESP32S2: - if CORE.using_arduino: - return self._esp32_s2_arduino_default - if CORE.using_esp_idf: - return self._esp32_s2_idf_default - elif variant == VARIANT_ESP32S3: - if CORE.using_arduino: - return self._esp32_s3_arduino_default - if CORE.using_esp_idf: - return self._esp32_s3_idf_default - elif variant == VARIANT_ESP32C3: - if CORE.using_arduino: - return self._esp32_c3_arduino_default - if CORE.using_esp_idf: - return self._esp32_c3_idf_default - elif variant == VARIANT_ESP32C6: - if CORE.using_arduino: - return self._esp32_c6_arduino_default - if CORE.using_esp_idf: - return self._esp32_c6_idf_default - elif variant == VARIANT_ESP32H2: - if CORE.using_arduino: - return self._esp32_h2_arduino_default - if CORE.using_esp_idf: - return self._esp32_h2_idf_default - else: - if CORE.using_arduino: - return self._esp32_arduino_default - if CORE.using_esp_idf: - return self._esp32_idf_default - if CORE.is_rp2040: - return self._rp2040_default - if CORE.is_bk72xx: - return self._bk72xx_default - if CORE.is_rtl87xx: - return self._rtl87xx_default - if CORE.is_host: - return self._host_default - raise NotImplementedError + variant = get_esp32_variant().replace(VARIANT_ESP32, "").lower() + framework = CORE.target_framework.replace("esp-", "") + if variant: + keys += _get_default_key(variant, framework) + keys += _get_default_key(variant) + keys += _get_default_key(framework) + keys += _get_default_key() + for key in keys: + if self._defaults.get(key) is not None: + return self._defaults[key] + return vol.default_factory(vol.UNDEFINED) @default.setter def default(self, value):