EspHome自定义组件回调类型转换错误求助(HA 2022.8.3)
解决ESPHome自定义组件lambda转std::function的编译错误
问题场景
在HomeAssistant平台的ESPHome 2022.8.3版本开发自定义组件时,注册HomeassistantTextSensor的add_on_state_callback回调时触发编译错误,错误提示无法将lambda表达式转换为std::function<void(std::__cxx11::basic_string<char>)>。
错误信息
src/screen.h:23:59: error: cannot convert 'MyCustomComponent::MyCustomComponent(esphome::template_::TemplateNumber*&, esphome::template_::TemplateNumber*&, esphome::template_::TemplateNumber*&, esphome::homeassistant::HomeassistantTextSensor*&)::<lambda(String)>' to 'std::function<void(std::__cxx11::basic_string<char>)>' 23 | { str = str_n; }); | ^
问题原因
ESPHome中TextSensor的add_on_state_callback要求的回调参数类型是标准库的std::string(即错误信息里的std::__cxx11::basic_string<char>),但代码里lambda用了Arduino的String类型,两者不是同一类型,编译器无法完成自动转换。
修复方案
把lambda的参数类型从String改为std::string即可。如果后续需要用Arduino String操作,可以在lambda内部把std::string显式转换为String。
修改后的组件代码
#include "esphome.h" #include <Wire.h> #include "rgb_lcd.h" class MyCustomComponent : public Component, public CustomAPIDevice { public: rgb_lcd lcd; bool enable = false; int led_r = 0; int led_g = 0; int led_b = 0; String str = "ff"; MyCustomComponent(esphome::template_::TemplateNumber *&_led_r, esphome::template_::TemplateNumber *&_led_g, esphome::template_::TemplateNumber *&_led_b, esphome::homeassistant::HomeassistantTextSensor *&_str) { _led_r->add_on_state_callback([this](float led_r_n) { led_r = led_r_n; }); _led_g->add_on_state_callback([this](float led_g_n) { led_g = led_g_n; }); _led_b->add_on_state_callback([this](float led_b_n) { led_b = led_b_n; }); // 修改参数类型为std::string,同时按需转换为Arduino String _str->add_on_state_callback([this](std::string str_n) { str = String(str_n); }); } void setup() override { lcd.begin(16, 2); } void loop() override { lcd.setRGB(led_r, led_g, led_b); } };
内容的提问来源于stack exchange,提问作者Amako Yoko
相关产品推荐
相关产品推荐

