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

 找回密码
 立即注册
查看: 121264|回复: 36

[基础教程] 通过ESPhome集成射频收发功能,可以让射频遥控器作为输入.

  [复制链接]

20

主题

218

帖子

1466

积分

论坛DIY达人

积分
1466
金钱
1223
HASS币
100
发表于 2020-4-17 15:30:53 | 显示全部楼层 |阅读模式
本帖最后由 zro22 于 2020-4-17 16:13 编辑

通过ESPhome集成射频收发功能,可以让射频遥控器作为输入,控制HA里面的东西,也可以反过来通过HA控制射频设备。

硬件比较简单,ESP32或者8266,再加UART射频模块,要买可以解码遥控器和发射遥控器码的,不要买那种uart传送数据的。
微信图片_20200417134921.jpg 微信图片_20200417134925.jpg
就这俩玩意。
具体可以去淘宝搜索一下 RF34T
模块有四根线VCC GND TX RX。VCC接5V TX RX随便找esp上面的gpio一接。
我是TX接的GPIO15,RX接的GPIO35.
所以在esphome配置文件里面这样写。
uart:
  - id: uart_bus1
    tx_pin: GPIO15
    rx_pin: GPIO35
    baud_rate: 9600

因为我的esp上有多个uart设备,所以需要给指定ID。

简单说一下原理
1,接收遥控器命令。 这个射频模块接收到遥控器指令后会通过uart发送数据,esphome接收到数据后转发到mqtt,这样在ha里面通过mqtt做trigger就可以执行相应的动作。
2,发射命令控制射频设备。在指定的mqtt topic里面写入命令,esphome会侦测指定topic,然后有新消息后把对应的消息通过uart发送出去。

实现步骤,写一个自定义的text sensor组件,主要负责uart的收发。
具体实现就是我附件的这个文件 uarttext_sensor.h (2.46 KB, 下载次数: 243)
把他放在ESPhome的根目录,然后在espome .yaml配置文件里面最前面esphome下面加上 [size=14.3999996185303px]  includes: [size=14.3999996185303px]   - uarttext_sensor.h
[size=14.3999996185303px]如下面这样
esphome:
  name: esphome32
  platform: ESP32
  board: nodemcu-32s
  includes:
   - uarttext_sensor.h
在mqtt下面增加一个自动化,负责把[size=14.3999996185303px]esphome32/listen/topic topic里面的内容通过uart发送出去。
mqtt:
  broker: 192.168.xx.x
  username: xxx
  password: xxx

  on_json_message:
    topic: esphome32/listen/topic
    qos: 0
    then:
      lambda: |-
        const char* cmd="FD0301010160DF";
        auto sent_uart_eng = new CustomP1UartComponent(id(uart_bus1));
        unsigned char temp[]={0xFD,0x03,0x01,0x02,0x09,0x60,0xDF,0x0};
        if (x.containsKey("cmd")){
          cmd = x["cmd"];
          sent_uart_eng->write_message(cmd);}


增加一个text_sensor 负责处理uart收到的消息

text_sensor:
  - platform: custom
    lambda: |-
      auto uart_custext_sensor = new CustomP1UartComponent(id(uart_bus1));
      App.register_component(uart_custext_sensor);
      return {uart_custext_sensor->uart_text_sensors};
    text_sensors:
      name: "RF Text Sensor"

如上就完成了, 按下遥控器按钮,会在[size=14.3999996185303px]esphome32/sensor/rf_text_sensor/state 下面收到消息,然后HA里面根据消息触发自动化。想要发射控制信号的时候,只需要把数据放到[size=14.3999996185303px]esphome32/listen/topic 这个topic,数据就会经由uart发送出去。

具体esphome发送的topic如果不知道的话,可以用mqtt.fx工具,点scan,让他自动扫描一下topic
结果展示
通过mqtt发送射频信号
PIC20200417161021001.png

解析射频信号push到mqtt

PIC20200417161248001.png

评分

参与人数 1金钱 +20 HASS币 +20 收起 理由
+ 20 + 20 墙都不扶,就服楼主!

查看全部评分

回复

使用道具 举报

4

主题

443

帖子

2587

积分

金牌会员

Rank: 6Rank: 6

积分
2587
金钱
2144
HASS币
0
发表于 2020-4-17 16:21:05 | 显示全部楼层
感谢分享。顶楼主下一楼
回复

使用道具 举报

11

主题

220

帖子

3365

积分

元老级技术达人

积分
3365
金钱
3110
HASS币
170

活跃会员教程狂人卓越贡献

发表于 2020-4-17 21:18:14 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

20

主题

218

帖子

1466

积分

论坛DIY达人

积分
1466
金钱
1223
HASS币
100
 楼主| 发表于 2020-4-17 22:01:23 | 显示全部楼层
试用下来感觉没有红外灵敏,但是红外的缺点是只能在有限空间内使用。
RF的优点是可以隔墙操作。
红外的实现见下面的帖子。我现在是用闲置的机顶盒遥控器控制家里的窗帘灯光。kodi,功放,投影,幕布。
https://bbs.hassbian.com/forum.php?mod=viewthread&tid=9628
回复

使用道具 举报

21

主题

188

帖子

1483

积分

金牌会员

Rank: 6Rank: 6

积分
1483
金钱
1290
HASS币
60
发表于 2020-4-18 05:12:09 | 显示全部楼层
之前设备多的时候有设想过类似操作,但没有落实。LZNB
还有一种操作是买sonoff rf bridge,飞线,然后刷esphome。
回复

使用道具 举报

20

主题

218

帖子

1466

积分

论坛DIY达人

积分
1466
金钱
1223
HASS币
100
 楼主| 发表于 2020-4-18 09:55:01 | 显示全部楼层
chiunownow 发表于 2020-4-18 05:12
之前设备多的时候有设想过类似操作,但没有落实。LZNB
还有一种操作是买sonoff rf bridge,飞线,然后刷esp ...

据说esphome下板就会集成rf bridge
回复

使用道具 举报

33

主题

312

帖子

1875

积分

金牌会员

Rank: 6Rank: 6

积分
1875
金钱
1558
HASS币
40
发表于 2020-4-18 10:18:36 | 显示全部楼层
楼主,能否不通过mqtt?
在使用不带解码功能的射频接收模块时,esphome可以设置成,当收到指定的射频信号后触发一个虚拟的二进制传感器的开关。使用你介绍的这种带解码的串口转射频模块时,是否可以使esphome在收到指定的串口数据时,触发一个虚拟的二进制传感器的开关。
我也就esphome的射频写过2个帖子,可以解决
1、使用不带解码的射频接收模块,配合esphome,在收到指定的射频信号后触发自动化。
2、使用带解码功能的串口转射频发射模块,配合esphome,直接发送射频信号来进行遥控。
帖子地址:
https://bbs.hassbian.com/thread-9308-1-1.html
https://bbs.hassbian.com/thread-9210-1-1.html
因为我的mqtt有问题,所以不想通过mqtt,但node-red我觉得不错
但是我还是希望可以解决收到指定的串口信号,用esphome来直接触发自动化,请楼主指教
回复

使用道具 举报

20

主题

218

帖子

1466

积分

论坛DIY达人

积分
1466
金钱
1223
HASS币
100
 楼主| 发表于 2020-4-18 11:55:16 | 显示全部楼层
lione95678 发表于 2020-4-18 10:18
楼主,能否不通过mqtt?
在使用不带解码功能的射频接收模块时,esphome可以设置成,当收到指定的射频信号后 ...

你可以试试这个文件 uarttext_sensor.h (2.75 KB, 下载次数: 35) 首先在public下面新加一个sensor
public:
  CustomP1UartComponent(UARTComponent *parent) : UARTDevice(parent) {}
  TextSensor *uart_text_sensors = new TextSensor();
  Sensor *uart_bin_sensors = new Sensor();


然后在收到消息之后,你根据消息内容判断发送 状态为1并计时
uart_bin_sensors->publish_state(1);        // set sensor to 1 and count
                                          mainlooptime = millis();


在loop里面计时超过多长时间没有收到指定的消息发送状态为0
if((now - mainlooptime) > 1000)        // 1s no rev set sensor to 0
                                                uart_bin_sensors->publish_state(0);


我没有试具体有没有用。

这样会多出一个sensor,你依靠这个sensor的状态去做action就可以了
回复

使用道具 举报

20

主题

218

帖子

1466

积分

论坛DIY达人

积分
1466
金钱
1223
HASS币
100
 楼主| 发表于 2020-4-18 11:57:16 | 显示全部楼层
lione95678 发表于 2020-4-18 10:18
楼主,能否不通过mqtt?
在使用不带解码功能的射频接收模块时,esphome可以设置成,当收到指定的射频信号后 ...

我之前也参照了你的帖子,后来发现那个射频不解码和你一样,距离稍微远一点点就收不到信号,不知道为什么。

另外通过mqtt的好处是,esphome只用编写一次,作为桥梁传输内容,具体内容靠mqtt去判断,这样不用每次修改都去烧录esphome。
回复

使用道具 举报

0

主题

17

帖子

54

积分

注册会员

Rank: 2

积分
54
金钱
37
HASS币
0
发表于 2020-4-18 16:45:54 | 显示全部楼层
学习学习
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-22 21:17 , Processed in 0.058047 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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