You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:30:41