『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 2258|回复: 28

[新奇玩法] esphome 集成UART 消息到HomeAssitant

[复制链接]

25

主题

224

帖子

1013

积分

金牌会员

007潜水了

Rank: 6Rank: 6

积分
1013
金钱
789
HASS币
0
发表于 2023-10-29 19:36:53 | 显示全部楼层 |阅读模式
本帖最后由 demacia 于 2023-10-31 22:07 编辑

折腾了一天,esphome Uart ttl 消息接收接入HA,之所以要搞这个是之前看到全屋电量统计的帖子看到淘宝有卖那种UART TTL电量信息输出,包括可能其他传感器小板。

参考文档和帖子
https://bbs.hassbian.com/thread-9794-1-1.html (参考了大佬c++代码,如何读取UART RX 数据流,读取完并设置到HA实体的state)
https://esphome.io/components/uart (esphome官方uart bus组件)
https://esphome.io/custom/uart (esphome官方自定义文档)

效果展示:
屏幕截图 2023-10-29 192812.png

屏幕截图 2023-10-29 192826.png

esphome yaml

esphome:
  name: livingroom
  includes:
    - my_custom_component.h

...

# Enable logging
logger:
  level: DEBUG
  on_message:
    # level: DEBUG
    # then:
    #   - uart.write: !lambda |-
    #       std::vector<unsigned char> data;
    #       data.insert(data.end(), message, message + strlen(message));
    #       data.insert(data.end(), {13, 10});
    #       return data;
    - uart.write: !lambda |-
        std::vector<unsigned char> data;
        data.insert(data.end(), message, message + strlen(message));
        data.insert(data.end(), {13, 10});
        return data;
...
uart:
  id: uart_bus
  tx_pin: GPIO13
  rx_pin: GPIO14
  baud_rate: 9600
  debug:
    direction: RX
    dummy_receiver: false
    after:
      delimiter: "\r\n"
    sequence:
      - lambda: UARTDebug::log_string(direction, bytes);

# custom_component:
#   - lambda: |-
#       auto my_custom = new MyCustomComponent(id(uart_bus));
#       return {my_custom};
text_sensor:
  - platform: custom
    lambda: |-
      auto my_custom = new MyCustomComponent(id(uart_bus));
      App.register_component(my_custom);
      return {my_custom->uart_text_sensors};
    text_sensors:
      name: "UartSensor"



my_custom_component.h

#include "esphome.h"
using namespace esphome;

class MyCustomComponent : public Component, public uart::UARTDevice {
 protected:
  unsigned char telegram[100];
  char data[100];

  bool read_message() {
    int i = 0;
    if (available()) {
      while (available()) {
        telegram[i] = read();
        data[i] = (char) telegram[i];
        ESP_LOGD("DmsrCustom", "0x%x", telegram[i]);
        i++;
      }
      data[i] = 0;
      ESP_LOGD("DmsrCustom", data);
      uart_text_sensors->publish_state(data);
    }
    return false;
  }
 public:
  MyCustomComponent(UARTComponent *parent) : UARTDevice(parent) {}
  TextSensor *uart_text_sensors = new TextSensor();

  void setup() override {
    // nothing to do here
  }
  void loop() override {
    // Use Arduino API to read data, for example
    if (available()) {
      ESP_LOGD("DmsrCustom", "loop start");
      read_message();
    }
  }
};

踩坑1. dummy_receiver 设置为true导致自定义text_sensor无法读到Uart 数据```
uart:
  debug:
    dummy_receiver: false```
2. esphome编译时报错,TextSensor不存在,原因 esphome编译过程中,yaml是需要先把text_sensor定义好,即esphome编译是根据yaml增量编译的。

~~~~~~~~~~~~~~分割线~~~~~~~~~~~~
今天刷到个帖子https://bbs.hassbian.com/thread-5218-1-1.html
tb很多rs232 rs485的转wifi的,这还折腾个啥

回复

使用道具 举报

18

主题

424

帖子

1921

积分

金牌会员

Rank: 6Rank: 6

积分
1921
金钱
1497
HASS币
0
发表于 2023-10-29 23:28:37 | 显示全部楼层
编译失败
我折腾esphome的uart几乎没有成功过
即使用大佬这样现成的代码也没有成功过 简直了
回复

使用道具 举报

25

主题

224

帖子

1013

积分

金牌会员

007潜水了

Rank: 6Rank: 6

积分
1013
金钱
789
HASS币
0
 楼主| 发表于 2023-10-30 09:06:46 | 显示全部楼层
kjjuhfv 发表于 2023-10-29 23:28
编译失败
我折腾esphome的uart几乎没有成功过
即使用大佬这样现成的代码也没有成功过 简直了 ...

具体是啥错误可以发出来看看 万一坛友碰到过
回复

使用道具 举报

15

主题

230

帖子

2664

积分

金牌会员

Rank: 6Rank: 6

积分
2664
金钱
2434
HASS币
0
发表于 2023-10-30 12:03:47 | 显示全部楼层
esphome里面有两个uart的吧?试一下使用gpio5,gpio4引脚看看?也要看是用的什么模块吧,esp32是用的这两个引脚。
回复

使用道具 举报

25

主题

224

帖子

1013

积分

金牌会员

007潜水了

Rank: 6Rank: 6

积分
1013
金钱
789
HASS币
0
 楼主| 发表于 2023-10-30 14:24:25 | 显示全部楼层
本帖最后由 demacia 于 2023-10-30 14:26 编辑
wfx 发表于 2023-10-30 12:03
esphome里面有两个uart的吧?试一下使用gpio5,gpio4引脚看看?也要看是用的什么模块吧,esp32是用的这两个 ...

两个uart是只两个不同的uart组建吗?我是看到一个。
我上面例子是用的安信可的esp32cam 拆了摄像头的裸板实验的。具体IO引脚一般都可以,具体我也不太懂,电子这块是门外汉,IO引脚除了标明特殊用途的,都试了下,就选了俩没特殊用途的引脚测试的。
回复

使用道具 举报

9

主题

168

帖子

1552

积分

金牌会员

Rank: 6Rank: 6

积分
1552
金钱
1384
HASS币
10
发表于 2023-10-30 15:42:14 | 显示全部楼层
demacia 发表于 2023-10-30 14:24
两个uart是只两个不同的uart组建吗?我是看到一个。
我上面例子是用的安信可的esp32cam 拆了摄像头的裸板 ...

个人使用而言,透传在Node-RED中做比较简单,而且数据更直观。
回复

使用道具 举报

18

主题

424

帖子

1921

积分

金牌会员

Rank: 6Rank: 6

积分
1921
金钱
1497
HASS币
0
发表于 2023-10-30 15:54:36 | 显示全部楼层
demacia 发表于 2023-10-30 09:06
具体是啥错误可以发出来看看 万一坛友碰到过
--------------------------------------------------------------------------------
HARDWARE: ESP8266 80MHz, 80KB RAM, 4MB Flash
Dependency Graph
|-- ESPAsyncTCP-esphome @ 2.0.0
|-- ESPAsyncWebServer-esphome @ 3.1.0
|-- DNSServer @ 1.1.1
|-- ESP8266WiFi @ 1.0
|-- ESP8266mDNS @ 1.2
|-- noise-c @ 0.1.4
|-- ArduinoJson @ 6.18.5
Compiling .pioenvs/ass/src/main.cpp.o
Compiling .pioenvs/ass/lib551/ESPAsyncTCP-esphome/ESPAsyncTCP.cpp.o
Compiling .pioenvs/ass/lib551/ESPAsyncTCP-esphome/ESPAsyncTCPbuffer.cpp.o
In file included from src/esphome/core/log.h:8,
                 from src/esphome/components/api/proto.h:4,
                 from src/esphome/components/api/api_pb2.h:5,
                 from src/esphome/components/api/api_connection.h:4,
                 from src/esphome.h:3,
                 from src/main.cpp:3:
src/my_custom_component.h: In member function 'bool MyCustomComponent::read_message()':
src/my_custom_component.h:19:30: error: initializer fails to determine size of '__pstr__'
   19 |       ESP_LOGD("DmsrCustom", data);
/data/cache/platformio/packages/framework-arduinoespressif8266/cores/esp8266/WString.h:39:76: note: in definition of macro 'FPSTR'
   39 | #define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
      |                                                                            ^~~~~~~~~~~~
src/esphome/core/log.h:70:36: note: in expansion of macro 'F'
   70 | #define ESPHOME_LOG_FORMAT(format) F(format)
      |                                    ^
src/esphome/core/log.h:95:59: note: in expansion of macro 'ESPHOME_LOG_FORMAT'
   95 |   esp_log_printf_(ESPHOME_LOG_LEVEL_DEBUG, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
      |                                                           ^~~~~~~~~~~~~~~~~~
src/esphome/core/log.h:152:28: note: in expansion of macro 'esph_log_d'
  152 | #define ESP_LOGD(tag, ...) esph_log_d(tag, __VA_ARGS__)
      |                            ^~~~~~~~~~
src/my_custom_component.h:19:7: note: in expansion of macro 'ESP_LOGD'
   19 |       ESP_LOGD("DmsrCustom", data);
      |       ^~~~~~~~
src/my_custom_component.h:19:30: error: array must be initialized with a brace-enclosed initializer
   19 |       ESP_LOGD("DmsrCustom", data);
/data/cache/platformio/packages/framework-arduinoespressif8266/cores/esp8266/WString.h:39:76: note: in definition of macro 'FPSTR'
   39 | #define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
      |                                                                            ^~~~~~~~~~~~
src/esphome/core/log.h:70:36: note: in expansion of macro 'F'
   70 | #define ESPHOME_LOG_FORMAT(format) F(format)
      |                                    ^
src/esphome/core/log.h:95:59: note: in expansion of macro 'ESPHOME_LOG_FORMAT'
   95 |   esp_log_printf_(ESPHOME_LOG_LEVEL_DEBUG, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
      |                                                           ^~~~~~~~~~~~~~~~~~
src/esphome/core/log.h:152:28: note: in expansion of macro 'esph_log_d'
  152 | #define ESP_LOGD(tag, ...) esph_log_d(tag, __VA_ARGS__)
      |                            ^~~~~~~~~~
src/my_custom_component.h:19:7: note: in expansion of macro 'ESP_LOGD'
   19 |       ESP_LOGD("DmsrCustom", data);
      |       ^~~~~~~~
Compiling .pioenvs/ass/lib551/ESPAsyncTCP-esphome/SyncClient.cpp.o
*** [.pioenvs/ass/src/main.cpp.o] Error 1
========================= [FAILED] Took 14.08 seconds =========================

我折腾uart必定遇到这个
回复

使用道具 举报

25

主题

224

帖子

1013

积分

金牌会员

007潜水了

Rank: 6Rank: 6

积分
1013
金钱
789
HASS币
0
 楼主| 发表于 2023-10-30 16:17:11 | 显示全部楼层
65698888 发表于 2023-10-30 15:42
个人使用而言,透传在Node-RED中做比较简单,而且数据更直观。

嗯这个目前是个demo,按照论坛的帖子和esphome文档实践的demo。
如果后续真的接入一些uart 的ttl传感器,我可能也会考虑把数据通过esphome扔mqtt,在通过nodered来处理数据。
esphome c++编码比较痛苦
回复

使用道具 举报

25

主题

224

帖子

1013

积分

金牌会员

007潜水了

Rank: 6Rank: 6

积分
1013
金钱
789
HASS币
0
 楼主| 发表于 2023-10-30 16:23:45 | 显示全部楼层
kjjuhfv 发表于 2023-10-30 15:54
我折腾uart必定遇到这个

ESP_LOGD
要不你把.h 文件里面的日志打印全删了试试?

ESP8266 我看官网文档里经常有特殊声明,不行上个esp32把
回复

使用道具 举报

16

主题

205

帖子

1614

积分

论坛DIY达人

积分
1614
金钱
1404
HASS币
20
发表于 2023-10-30 16:38:32 | 显示全部楼层
kjjuhfv 发表于 2023-10-30 15:54
我折腾uart必定遇到这个

如果您焊接电路板没有问题的话,可以参考我以前弄的,ESP32或ESP8266都可以。https://bbs.hassbian.com/thread-19938-1-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-7 20:23 , Processed in 0.071615 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表