diff --git a/esphome/components/pca9554/__init__.py b/esphome/components/pca9554/__init__.py index 4abb2c1703..fd52fafc5d 100644 --- a/esphome/components/pca9554/__init__.py +++ b/esphome/components/pca9554/__init__.py @@ -10,7 +10,6 @@ from esphome.const import ( CONF_INVERTED, CONF_OUTPUT, ) -from esphome.core import CORE, ID CODEOWNERS = ["@hwstar", "@clydebarrow"] DEPENDENCIES = ["i2c"] @@ -53,27 +52,6 @@ def validate_mode(value): return value -def validate_pin(config): - pca_id = config[CONF_PCA9554].id - - # when pin config validation is performed, the entire YAML has been read, but depending on the component order, - # the pca9554 component may not yet have been processed, so its id property could be either the original string, - # or an ID object. - def matcher(p): - id = p[CONF_ID] - if isinstance(id, ID): - return id.id == pca_id - return id == pca_id - - pca = list(filter(matcher, CORE.raw_config[CONF_PCA9554])) - if not pca: - raise cv.Invalid(f"No pca9554 component found with id matching {pca_id}") - count = pca[0][CONF_PIN_COUNT] - if config[CONF_NUMBER] >= count: - raise cv.Invalid(f"Pin number must be in range 0-{count - 1}") - return config - - PCA9554_PIN_SCHEMA = cv.All( { cv.GenerateID(): cv.declare_id(PCA9554GPIOPin), @@ -88,11 +66,18 @@ PCA9554_PIN_SCHEMA = cv.All( ), cv.Optional(CONF_INVERTED, default=False): cv.boolean, }, - validate_pin, ) -@pins.PIN_SCHEMA_REGISTRY.register(CONF_PCA9554, PCA9554_PIN_SCHEMA) +def pca9554_pin_final_validate(pin_config, parent_config): + count = parent_config[CONF_PIN_COUNT] + if pin_config[CONF_NUMBER] >= count: + raise cv.Invalid(f"Pin number must be in range 0-{count - 1}") + + +@pins.PIN_SCHEMA_REGISTRY.register( + CONF_PCA9554, PCA9554_PIN_SCHEMA, pca9554_pin_final_validate +) async def pca9554_pin_to_code(config): var = cg.new_Pvariable(config[CONF_ID]) parent = await cg.get_variable(config[CONF_PCA9554])