diff --git a/esphome/components/template/binary_sensor/template_binary_sensor.h b/esphome/components/template/binary_sensor/template_binary_sensor.h index f63738d93f..0373f898a8 100644 --- a/esphome/components/template/binary_sensor/template_binary_sensor.h +++ b/esphome/components/template/binary_sensor/template_binary_sensor.h @@ -1,7 +1,7 @@ #pragma once #include "esphome/core/component.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" #include "esphome/components/binary_sensor/binary_sensor.h" namespace esphome { diff --git a/esphome/components/template/cover/template_cover.h b/esphome/components/template/cover/template_cover.h index 57a5e11c5c..56ab61c3fb 100644 --- a/esphome/components/template/cover/template_cover.h +++ b/esphome/components/template/cover/template_cover.h @@ -2,7 +2,7 @@ #include "esphome/core/component.h" #include "esphome/core/automation.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" #include "esphome/components/cover/cover.h" namespace esphome { diff --git a/esphome/components/template/datetime/template_date.h b/esphome/components/template/datetime/template_date.h index b0fdbcbfbb..7fed704d0e 100644 --- a/esphome/components/template/datetime/template_date.h +++ b/esphome/components/template/datetime/template_date.h @@ -9,7 +9,7 @@ #include "esphome/core/component.h" #include "esphome/core/preferences.h" #include "esphome/core/time.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" namespace esphome { namespace template_ { diff --git a/esphome/components/template/datetime/template_datetime.h b/esphome/components/template/datetime/template_datetime.h index b1c94d7d34..ec45bf0326 100644 --- a/esphome/components/template/datetime/template_datetime.h +++ b/esphome/components/template/datetime/template_datetime.h @@ -9,7 +9,7 @@ #include "esphome/core/component.h" #include "esphome/core/preferences.h" #include "esphome/core/time.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" namespace esphome { namespace template_ { diff --git a/esphome/components/template/datetime/template_time.h b/esphome/components/template/datetime/template_time.h index c6938fe7a0..ea7474c0ba 100644 --- a/esphome/components/template/datetime/template_time.h +++ b/esphome/components/template/datetime/template_time.h @@ -9,7 +9,7 @@ #include "esphome/core/component.h" #include "esphome/core/preferences.h" #include "esphome/core/time.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" namespace esphome { namespace template_ { diff --git a/esphome/components/template/lock/template_lock.h b/esphome/components/template/lock/template_lock.h index 2bb11bfef6..347c4effb3 100644 --- a/esphome/components/template/lock/template_lock.h +++ b/esphome/components/template/lock/template_lock.h @@ -2,7 +2,7 @@ #include "esphome/core/component.h" #include "esphome/core/automation.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" #include "esphome/components/lock/lock.h" namespace esphome { diff --git a/esphome/components/template/number/template_number.h b/esphome/components/template/number/template_number.h index 1a6e9d964f..a9307e9246 100644 --- a/esphome/components/template/number/template_number.h +++ b/esphome/components/template/number/template_number.h @@ -4,7 +4,7 @@ #include "esphome/core/automation.h" #include "esphome/core/component.h" #include "esphome/core/preferences.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" namespace esphome { namespace template_ { diff --git a/esphome/components/template/select/template_select.h b/esphome/components/template/select/template_select.h index 53cadfa303..1c33153872 100644 --- a/esphome/components/template/select/template_select.h +++ b/esphome/components/template/select/template_select.h @@ -4,7 +4,7 @@ #include "esphome/core/automation.h" #include "esphome/core/component.h" #include "esphome/core/preferences.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" namespace esphome { namespace template_ { diff --git a/esphome/components/template/sensor/template_sensor.h b/esphome/components/template/sensor/template_sensor.h index 27980414f9..793d754a0f 100644 --- a/esphome/components/template/sensor/template_sensor.h +++ b/esphome/components/template/sensor/template_sensor.h @@ -1,7 +1,7 @@ #pragma once #include "esphome/core/component.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" #include "esphome/components/sensor/sensor.h" namespace esphome { diff --git a/esphome/components/template/switch/template_switch.h b/esphome/components/template/switch/template_switch.h index f436f657ae..47154fd047 100644 --- a/esphome/components/template/switch/template_switch.h +++ b/esphome/components/template/switch/template_switch.h @@ -2,7 +2,7 @@ #include "esphome/core/component.h" #include "esphome/core/automation.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" #include "esphome/components/switch/switch.h" namespace esphome { diff --git a/esphome/components/template/template_lambda.h b/esphome/components/template/template_lambda.h deleted file mode 100644 index 894b5edffa..0000000000 --- a/esphome/components/template/template_lambda.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#include "esphome/core/optional.h" - -namespace esphome { - -/** Lightweight wrapper for template platform lambdas (stateless function pointers only). - * - * This optimizes template platforms by storing only a function pointer (4 bytes on ESP32) - * instead of std::function (16-32 bytes). - * - * IMPORTANT: This only supports stateless lambdas (no captures). The set_template() method - * is an internal API used by YAML codegen, not intended for external use. - * - * Lambdas must return optional to support the pattern: - * return {}; // Don't publish a value - * return 42.0; // Publish this value - * - * operator() returns optional, returning nullopt when no lambda is set (nullptr check). - * - * @tparam T The return type (e.g., float for sensor values) - * @tparam Args Optional arguments for the lambda - */ -template class TemplateLambda { - public: - TemplateLambda() : f_(nullptr) {} - - /** Set the lambda function pointer. - * INTERNAL API: Only for use by YAML codegen. - * Only stateless lambdas (no captures) are supported. - */ - void set(optional (*f)(Args...)) { this->f_ = f; } - - /** Check if a lambda is set */ - bool has_value() const { return this->f_ != nullptr; } - - /** Call the lambda, returning nullopt if no lambda is set */ - optional operator()(Args... args) { - if (this->f_ == nullptr) - return nullopt; - return this->f_(args...); - } - - /** Alias for operator() for compatibility */ - optional call(Args... args) { return (*this)(args...); } - - protected: - optional (*f_)(Args...); // Function pointer (4 bytes on ESP32) -}; - -} // namespace esphome diff --git a/esphome/components/template/text/template_text.h b/esphome/components/template/text/template_text.h index fd28800bab..c12021f80e 100644 --- a/esphome/components/template/text/template_text.h +++ b/esphome/components/template/text/template_text.h @@ -4,7 +4,7 @@ #include "esphome/core/automation.h" #include "esphome/core/component.h" #include "esphome/core/preferences.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" namespace esphome { namespace template_ { diff --git a/esphome/components/template/text_sensor/template_text_sensor.h b/esphome/components/template/text_sensor/template_text_sensor.h index fda28f53c7..0d01c72023 100644 --- a/esphome/components/template/text_sensor/template_text_sensor.h +++ b/esphome/components/template/text_sensor/template_text_sensor.h @@ -2,7 +2,7 @@ #include "esphome/core/component.h" #include "esphome/core/automation.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" #include "esphome/components/text_sensor/text_sensor.h" namespace esphome { diff --git a/esphome/components/template/valve/template_valve.h b/esphome/components/template/valve/template_valve.h index 7713091673..23a77ff918 100644 --- a/esphome/components/template/valve/template_valve.h +++ b/esphome/components/template/valve/template_valve.h @@ -2,7 +2,7 @@ #include "esphome/core/component.h" #include "esphome/core/automation.h" -#include "../template_lambda.h" +#include "esphome/core/template_lambda.h" #include "esphome/components/valve/valve.h" namespace esphome { diff --git a/tests/components/template/common-base.yaml b/tests/components/template/common-base.yaml index da449111a2..f101eea942 100644 --- a/tests/components/template/common-base.yaml +++ b/tests/components/template/common-base.yaml @@ -10,7 +10,7 @@ esphome: state: !lambda "return 42.0;" # Test C++ API: set_template() with stateless lambda (no captures) - # IMPORTANT: set_template() is an internal API. Only stateless lambdas are supported. + # NOTE: set_template() is not intended to be a public API, but we test it to ensure it doesn't break. - lambda: |- id(template_sens).set_template([]() -> esphome::optional { return 123.0f;