From 35a7ba75de7952026d04481de43fda87a4761df1 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 7 Apr 2026 11:26:06 -1000 Subject: [PATCH] reduce --- esphome/components/light/automation.h | 10 +--- esphome/components/light/automation.py | 73 ++++++++------------------ 2 files changed, 24 insertions(+), 59 deletions(-) diff --git a/esphome/components/light/automation.h b/esphome/components/light/automation.h index 1fece0bb24..a5c9220a23 100644 --- a/esphome/components/light/automation.h +++ b/esphome/components/light/automation.h @@ -24,14 +24,8 @@ template class ToggleAction : public Action { LightState *state_; }; -/** Compact light control action — every field is a function pointer. - * - * Python codegen wraps constant values in stateless lambdas, so each field - * is either nullptr (unset) or a typed function pointer. No tagged union, - * no type dispatch, no memcpy — just call through the pointer. - * - * Size: ~72 bytes on ESP32 (vs ~128 bytes with TemplatableValue per field). - */ +/// Compact light control action — each field is a function pointer (nullptr = unset). +/// Codegen wraps constants in stateless lambdas. 72 bytes vs 128 with TemplatableValue. template class LightControlAction : public Action { public: explicit LightControlAction(LightState *parent) : parent_(parent) {} diff --git a/esphome/components/light/automation.py b/esphome/components/light/automation.py index f97249bfeb..6906ef7cc2 100644 --- a/esphome/components/light/automation.py +++ b/esphome/components/light/automation.py @@ -172,58 +172,29 @@ def _resolve_effect_index(config: ConfigType) -> int: async def light_control_to_code(config, action_id, template_arg, args): paren = await cg.get_variable(config[CONF_ID]) var = cg.new_Pvariable(action_id, template_arg, paren) - if CONF_COLOR_MODE in config: - cg.add( - var.set_color_mode( - await _as_lambda(config[CONF_COLOR_MODE], args, ColorMode) + + # (config_key, setter_name, c++ type) + FIELDS = ( + (CONF_COLOR_MODE, "set_color_mode", ColorMode), + (CONF_STATE, "set_state", bool), + (CONF_TRANSITION_LENGTH, "set_transition_length", cg.uint32), + (CONF_FLASH_LENGTH, "set_flash_length", cg.uint32), + (CONF_BRIGHTNESS, "set_brightness", float), + (CONF_COLOR_BRIGHTNESS, "set_color_brightness", float), + (CONF_RED, "set_red", float), + (CONF_GREEN, "set_green", float), + (CONF_BLUE, "set_blue", float), + (CONF_WHITE, "set_white", float), + (CONF_COLOR_TEMPERATURE, "set_color_temperature", float), + (CONF_COLD_WHITE, "set_cold_white", float), + (CONF_WARM_WHITE, "set_warm_white", float), + ) + for conf_key, setter, type_ in FIELDS: + if conf_key in config: + cg.add( + getattr(var, setter)(await _as_lambda(config[conf_key], args, type_)) ) - ) - if CONF_STATE in config: - cg.add(var.set_state(await _as_lambda(config[CONF_STATE], args, bool))) - if CONF_TRANSITION_LENGTH in config: - cg.add( - var.set_transition_length( - await _as_lambda(config[CONF_TRANSITION_LENGTH], args, cg.uint32) - ) - ) - if CONF_FLASH_LENGTH in config: - cg.add( - var.set_flash_length( - await _as_lambda(config[CONF_FLASH_LENGTH], args, cg.uint32) - ) - ) - if CONF_BRIGHTNESS in config: - cg.add( - var.set_brightness(await _as_lambda(config[CONF_BRIGHTNESS], args, float)) - ) - if CONF_COLOR_BRIGHTNESS in config: - cg.add( - var.set_color_brightness( - await _as_lambda(config[CONF_COLOR_BRIGHTNESS], args, float) - ) - ) - if CONF_RED in config: - cg.add(var.set_red(await _as_lambda(config[CONF_RED], args, float))) - if CONF_GREEN in config: - cg.add(var.set_green(await _as_lambda(config[CONF_GREEN], args, float))) - if CONF_BLUE in config: - cg.add(var.set_blue(await _as_lambda(config[CONF_BLUE], args, float))) - if CONF_WHITE in config: - cg.add(var.set_white(await _as_lambda(config[CONF_WHITE], args, float))) - if CONF_COLOR_TEMPERATURE in config: - cg.add( - var.set_color_temperature( - await _as_lambda(config[CONF_COLOR_TEMPERATURE], args, float) - ) - ) - if CONF_COLD_WHITE in config: - cg.add( - var.set_cold_white(await _as_lambda(config[CONF_COLD_WHITE], args, float)) - ) - if CONF_WARM_WHITE in config: - cg.add( - var.set_warm_white(await _as_lambda(config[CONF_WARM_WHITE], args, float)) - ) + if CONF_EFFECT in config: if isinstance(config[CONF_EFFECT], Lambda): # Lambda returns a string — wrap in a C++ lambda that resolves