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

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

[已解决] uart (已实现)通过NR实现和设备的串口的透传Tasmota固件

[复制链接]
回帖奖励 14 金钱 回复本帖可获得 2 金钱奖励! 每人限 1 次

43

主题

407

帖子

3613

积分

元老级技术达人

积分
3613
金钱
3201
HASS币
136
发表于 2021-4-8 16:26:24 | 显示全部楼层 |阅读模式
本帖最后由 hunterfox 于 2021-4-9 22:25 编辑

微信图片_20210408180204.png
采用 alei643 大神建议,在Tasmota已基本实现交互,
目前进制的方法 采用Tasmota 的command的一个属性




例如:serialsend5 C0010102A5EF  可以通过控制台发出16进制数据,同时接收也支持到十六进制
感谢        mitu 大神     指点

原帖需求:

目标功能:
期望实
现的功能
    NR(mqtt)---ESP8266(esphome固件)---串口---RTU设备。想实现这样的一个双向通信功能,调试了1个星期
没有解决掉问题
参考的https://bbs.hassbian.com/forum.php?mod=viewthread&tid=9794  大神的帖子及编写方法
目前仅能实现:  NR向串口写入数据
无法 读取串口数据,还请大神可以指点一下。附件代码为esphome

另中途也刷了 Tasmota 固件:配置TX RX ,可以实现自动接收:
    命令:
      {"SSerialReceived":{"Data":"<string>"}}
      Baudrate 9600
即:esphome 仅实现了发的个功能
Tasmota  仅实现了收的功能,
悲催啊~~~~~~~~~相当绝望
esphome实现的发功能截图
1.png




Tasmota  实现了收的功能
2.png


#------- 固件说明 -------
#芯片模组:esp826601S
#硬件功能: 串口透传
#安装位置:待定
esphome:
  includes:
#    - uart_read_line_sensor.h
    - uarttext_sensor.h


substitutions:


  config_version: 'esp01_0203'   #
  #设备名称(多个dc1改成不一样的,API接入和ESPHOME容器会识别这个作为名称显示)
  device_name: esp12f_01_test  #

#---------不使用api与设备连接的话删除api配置---------

packages:
  wifiset: !include config_wifi.yaml

#------- MQTT配置,注意此配置与API配置互斥,只能选择1个 -------
mqtt:
  id: mqtt_client
  broker: !secret mqtt_broker
  port: !secret mqtt_port
  username: !secret mqtt_username
  password: !secret mqtt_password
  client_id: $device_name
  keepalive: $mqtt_keepalive
  reboot_timeout: $mqtt_reboot_timeout
  
  topic_prefix: $mqtt_topic_prefix
  log_topic:
    topic: "${device_name}/logs"
    level: debug
#topic 注入:{"cmd":"11442233445566"}
  on_json_message:
    topic: esphome32/listen/topic
    qos: 0
    then:
      lambda: |-
        const char* cmd="FD0301010160DF";
        auto sent_uart_eng = new CustomP1UartComponent(id(uart_bus));
        unsigned char temp[]={0xFD,0x03,0x01,0x02,0x09,0x60,0xDF,0x0};
        if (x.containsKey("cmd")){
          cmd = x["cmd"];
          sent_uart_eng->write_message(cmd);}

#---------不使用api与设备连接的话删除api配置---------
#api:
#  reboot_timeout: $api_reboot_timeout
#  password: !secret publicpassword

#----------------------------------------------------

debug:
#-------打印log设置,注意实际输出端口为主板上面的log_tx,而不是刷机用到的tx-------
logger:
  #不同的log等级看到的信息详细程度不一样,信息量从少到多依次为NONE、ERROR、WARN、INFO、DEBUG、VERBOSE、VERY_VERBOSE

  level: DEBUG
  #设置为0关闭通过UART的log输出
  baud_rate: 0

uart:
  id: uart_bus
  tx_pin: GPIO1
  rx_pin: GPIO3
  baud_rate: 9600

text_sensor:
  - platform: custom
    lambda: |-
      auto uart_custext_sensor = new CustomP1UartComponent(id(uart_bus));
      App.register_component(uart_custext_sensor); 
      return {uart_custext_sensor->uart_text_sensors};   
    text_sensors:
      id: "uart_readline"
      name: "${device_name}_UART"

switch:
  - platform: template
    name: "${device_name} switchtemp"
    lambda: |-
      if (id(uart_readline).state == "*POW=ON#") {
        return true;
      } else if(id(uart_readline).state == "*POW=OFF#") {
        return false;
      } else {
        return {};
      }
    turn_on_action:
      - uart.write: "\r*pow=on#\r"
    turn_off_action:
      - uart.write: "\r*pow=off#\r"

interval:
  - interval: 10s
    then:
      - uart.write: "\r*pow=?#\r"


下下策,放弃esphome,放弃Tasmota,采用单片机+ESP8266  AT指令来控制 ,自由度完全没有了。


评分

参与人数 1金钱 +20 收起 理由
27hh + 20 顶一下,同样关注这个问题。

查看全部评分

回复

使用道具 举报

23

主题

629

帖子

4330

积分

元老级技术达人

积分
4330
金钱
3686
HASS币
30

教程狂人

QQ
发表于 2021-4-8 17:09:45 | 显示全部楼层

回帖奖励 +2 金钱

Tasmota也可以发送啊,如果要通过NodeRed向Tasmota发送串口数据的话,可以用Http请求
回复

使用道具 举报

43

主题

407

帖子

3613

积分

元老级技术达人

积分
3613
金钱
3201
HASS币
136
 楼主| 发表于 2021-4-8 17:20:59 | 显示全部楼层
alei643 发表于 2021-4-8 17:09
Tasmota也可以发送啊,如果要通过NodeRed向Tasmota发送串口数据的话,可以用Http请求 ...

感谢回复,我通过命令控制台能发数据到串口,向问下http请求怎么处理。
另外我的交互都是string的,只支持0-127,怎么变成16进制的。命令格式怎么写都不响应
回复

使用道具 举报

23

主题

629

帖子

4330

积分

元老级技术达人

积分
4330
金钱
3686
HASS币
30

教程狂人

QQ
发表于 2021-4-8 17:35:10 | 显示全部楼层
https://tasmota.github.io/docs/Commands/ 官方文档有说明,with Web Requests一节,NR中用http request的节点,请求方式选择POST,URL输入tasmota的Http请求命令就可以了。第二个问题没明白你的意思,协议是Hex还是ASCII?利用NR转换?
回复

使用道具 举报

43

主题

407

帖子

3613

积分

元老级技术达人

积分
3613
金钱
3201
HASS币
136
 楼主| 发表于 2021-4-8 17:49:34 | 显示全部楼层
alei643 发表于 2021-4-8 17:35
https://tasmota.github.io/docs/Commands/ 官方文档有说明,with Web Requests一节,NR中用http request的 ...

我想用十六进制HEX进行串口交互。
回复

使用道具 举报

2

主题

65

帖子

1075

积分

金牌会员

Rank: 6Rank: 6

积分
1075
金钱
1010
HASS币
0
发表于 2021-4-8 21:42:54 | 显示全部楼层

回帖奖励 +2 金钱

可以参考这位https://bbs.hassbian.com/thread-11623-1-1.html,HEX在NR中直接tcp in / tcp out。

我自己的甲醛传感器

我自己的甲醛传感器

回复

使用道具 举报

43

主题

407

帖子

3613

积分

元老级技术达人

积分
3613
金钱
3201
HASS币
136
 楼主| 发表于 2021-4-8 22:10:44 | 显示全部楼层
fenytk 发表于 2021-4-8 21:42
可以参考这位https://bbs.hassbian.com/thread-11623-1-1.html,HEX在NR中直接tcp in / tcp out。
...

NR 有个不好的地方 tcp in 和tcp out  需要占用2个端口,我可以通过AT指令将esp8266切换至透传状态,但只能连接一个端口,即要么实现串口的发,要么实现串口的收,无法交互
回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2021-4-8 22:45:29 | 显示全部楼层

回帖奖励 +2 金钱

esphome 自定义 c 自由度也很高~
Nero
回复

使用道具 举报

23

主题

629

帖子

4330

积分

元老级技术达人

积分
4330
金钱
3686
HASS币
30

教程狂人

QQ
发表于 2021-4-9 08:02:09 | 显示全部楼层
通信协议贴出来看看
回复

使用道具 举报

6

主题

734

帖子

5568

积分

论坛元老

Rank: 8Rank: 8

积分
5568
金钱
4829
HASS币
20
发表于 2021-4-9 08:48:01 | 显示全部楼层

回帖奖励 +2 金钱

hunterfox 发表于 2021-4-8 17:20
感谢回复,我通过命令控制台能发数据到串口,向问下http请求怎么处理。
另外我的交互都是string的,只支 ...

Tasmota用serialsend5命令和SSerialsend5来发送16进制。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-20 17:32 , Processed in 0.874205 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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