1
0
mirror of https://github.com/esphome/esphome.git synced 2025-03-14 06:38:17 +00:00

[remote_base] NEC, fix nec schema

This commit is contained in:
Djordje 2025-02-18 19:43:18 +01:00
parent 4cbafccd00
commit e8dfe21aff

View File

@ -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,
)