uart (已实现)通过NR实现和设备的串口的透传Tasmota固件
本帖最后由 hunterfox 于 2021-4-9 22:25 编辑采用 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实现的发功能截图
Tasmota实现了收的功能
#------- 固件说明 -------
#芯片模组: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,采用单片机+ESP8266AT指令来控制 ,自由度完全没有了。
Tasmota也可以发送啊,如果要通过NodeRed向Tasmota发送串口数据的话,可以用Http请求 alei643 发表于 2021-4-8 17:09
Tasmota也可以发送啊,如果要通过NodeRed向Tasmota发送串口数据的话,可以用Http请求 ...
感谢回复,我通过命令控制台能发数据到串口,向问下http请求怎么处理。
另外我的交互都是string的,只支持0-127,怎么变成16进制的。命令格式怎么写都不响应 https://tasmota.github.io/docs/Commands/ 官方文档有说明,with Web Requests一节,NR中用http request的节点,请求方式选择POST,URL输入tasmota的Http请求命令就可以了。第二个问题没明白你的意思,协议是Hex还是ASCII?利用NR转换? alei643 发表于 2021-4-8 17:35
https://tasmota.github.io/docs/Commands/ 官方文档有说明,with Web Requests一节,NR中用http request的 ...
我想用十六进制HEX进行串口交互。 可以参考这位https://bbs.hassbian.com/thread-11623-1-1.html,HEX在NR中直接tcp in / tcp out。
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切换至透传状态,但只能连接一个端口,即要么实现串口的发,要么实现串口的收,无法交互 esphome 自定义 c 自由度也很高~ 通信协议贴出来看看 hunterfox 发表于 2021-4-8 17:20
感谢回复,我通过命令控制台能发数据到串口,向问下http请求怎么处理。
另外我的交互都是string的,只支 ...
Tasmota用serialsend5命令和SSerialsend5来发送16进制。