From e8dfe21aff83878506432f487e7a124a07c5e21c Mon Sep 17 00:00:00 2001 From: Djordje <6750655+DjordjeMandic@users.noreply.github.com> Date: Tue, 18 Feb 2025 19:43:18 +0100 Subject: [PATCH] [remote_base] NEC, fix nec schema --- esphome/components/remote_base/__init__.py | 57 +++++++++++++--------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/esphome/components/remote_base/__init__.py b/esphome/components/remote_base/__init__.py index 3244372dfb..b0ae778947 100644 --- a/esphome/components/remote_base/__init__.py +++ b/esphome/components/remote_base/__init__.py @@ -757,37 +757,50 @@ NEC_CODE_TYPES = { TYPE_REPEAT: nec_code_type_enum_class.REPEAT, } -NEC_FRAME_SCHEMA = cv.Schema( - { - cv.Required(CONF_ADDRESS): cv.hex_uint16_t, - cv.Required(CONF_COMMAND): cv.hex_uint16_t, - cv.Optional(CONF_REPEATS, default=0): cv.uint16_t, - } -) -NEC_REPEAT_SCHEMA = cv.Schema( - { - cv.Optional(CONF_ADDRESS, default=0): cv.hex_uint16_t, - cv.Optional(CONF_COMMAND, default=0): cv.hex_uint16_t, - cv.Optional(CONF_REPEATS, default=1): cv.int_range(min=1, max=65535), - } -) +def nec_schema_validator(config): + """Custom NEC schema validator that enforces different rules for FRAME vs. REPEAT.""" + code_type = config[CONF_TYPE] + if code_type == NEC_CODE_TYPES[TYPE_FRAME]: + if CONF_ADDRESS not in config: + raise cv.Invalid(f"'{CONF_ADDRESS}' is required for type='{TYPE_FRAME}'.") + if CONF_COMMAND not in config: + raise cv.Invalid(f"'{CONF_COMMAND}' is required for type='{TYPE_FRAME}'.") + config.setdefault(CONF_REPEATS, 0) + + elif code_type == NEC_CODE_TYPES[TYPE_REPEAT]: + config.setdefault(CONF_ADDRESS, 0) + config.setdefault(CONF_COMMAND, 0) + config.setdefault(CONF_REPEATS, 1) + + if config[CONF_ADDRESS] != 0: + raise cv.Invalid(f"'{CONF_ADDRESS}' must be 0 for type='{TYPE_REPEAT}'.") + if config[CONF_COMMAND] != 0: + raise cv.Invalid(f"'{CONF_COMMAND}' must be 0 for type='{TYPE_REPEAT}'.") + if config[CONF_REPEATS] == 0: + raise cv.Invalid( + f"'{CONF_REPEATS}' must be greater than 0 for type='{TYPE_REPEAT}'." + ) + + else: + raise cv.Invalid(f"Invalid NEC type: '{config[CONF_TYPE]}'") -def nec_schema_convert_type_to_enum(config): - config[CONF_TYPE] = cv.enum(NEC_CODE_TYPES, lower=True)(config[CONF_TYPE]) return config NEC_SCHEMA = cv.All( - cv.typed_schema( + cv.Schema( { - TYPE_FRAME: NEC_FRAME_SCHEMA, - TYPE_REPEAT: NEC_REPEAT_SCHEMA, - }, - lower=True, + cv.Optional(CONF_TYPE, default=TYPE_FRAME): cv.enum( + NEC_CODE_TYPES, lower=True + ), + cv.Optional(CONF_ADDRESS): cv.hex_uint16_t, + cv.Optional(CONF_COMMAND): cv.hex_uint16_t, + cv.Optional(CONF_REPEATS): cv.uint16_t, + } ), - nec_schema_convert_type_to_enum, + nec_schema_validator, )