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

 找回密码
 立即注册
查看: 53854|回复: 41

[技术探讨] 小白教小白-esphome固件通过433/315射频遥开关无需mqtt

  [复制链接]

33

主题

312

帖子

1847

积分

金牌会员

Rank: 6Rank: 6

积分
1847
金钱
1530
HASS币
40
发表于 2020-2-24 14:29:57 | 显示全部楼层 |阅读模式
本帖最后由 lione95678 于 2020-2-24 14:32 编辑

小白教小白-利用esphome固件来做一个可以通过433/315射频遥控器来控制的开关(无需mqtt
    起因:家里原来的灯都是通过315射频开关来控制的,以前接入hass,都是通过nodemcuat固件配合串口转射频模块,并通过mqtt来实现,缺点:1)我这mqtt不稳定,运行时间长了以后会发神经,自动不定时发送信息,造成灯自动开关;2hass无法反馈灯的状态。
    论坛里有卖模块的,但是手里有好几块nodemcu esp8266的模块,所以一直想自己做。
    这篇文章里有2种方式,文章中会指出问题(我自己也没有解决办法,后面请各位懂的朋友来指教),一个一个来。
    第一种方法:
    1、硬件:
    nodemcu esp8266一块,超再生射频接收模块(加一个弹簧天线)(很便宜的那种,我买的不到3元,如下图),4路继电器模块一个。nodemcuesphome固件(配置我另外会贴)

无标题1.jpg

    2、接线方式:
    超再生射频接收模块有4个接口,正负极就不说了,当中2个针脚只使用1个,随便哪一个,连接nodemcu的一个pin脚(随意),我这里选择D1esphome设置中相对应)
    继电器模块正负极也不说了,信号针脚连接nodemcupin脚,我这里连了nodemcuD5/D6/D7/D8(注意一下,我用的是高电平触发的继电器模块,我刷了esphome后,nodemcu默认是D3D4D9D10是高电平,D8低电平,所以不能使用D3D4D9D10针脚,D9D10就是nodemcu板子上印刷的rxtx
    3、使用
    你先按我的yaml文件来刷固件,然后连接到hass,这时hass单独控制继电器模块是没有问题的,但射频遥控器不能用,你可以理解为没有配对,接下来,在esphome的网页上点击 SHOW LOGS ,显示日志。
    然后拿起你的射频遥控器,当你按下遥控器的按键是,esphome的日志页面会显示如下图:

无标题2.jpg

这里,引号里面的的数值就是遥控器的信号代码,可能会出现好几个,长度也不一致,你选用最长的那个(你可以二进制转十六进制的工具试试,把这些数字转变为16进制,就是316进制英文或数字,比如110101010001000000000001就是D5 10 01)。
    这时,你就可以将遥控器按键对应的信号代码复制到yaml文件中进行替换了。在yaml文件中,有这样一组二进制传感器的,我这里稍微解释一下:
switch:
  - platform: gpio
    pin: D5
    name: "jidianqi1"
    id: jidianqi1
binary_sensor:
  - platform: remote_receiver
    name: "woshideng1 rf xinhao"
    rc_switch_raw:
      code: '110101010001000000000001'
      protocol: 1
    on_press:
      then:
        - switch.toggle: jidianqi1
remote_receiver:
  pin: D5
  dump:
    - rc_switch
  tolerance: 50%
  filter: 200us
  idle:4ms
  buffer_size: 1kb
    先看switch,这里是一个继电器开关,platformgpio针脚,针脚是D5(我喜欢用D*,这样不用对比nodemcugpio针脚图),namejidianqi1(这个随你喜欢,是显示在hass中的名称,注意有引号),id jidianqi1(也随你喜欢,注意没有引号),这个id在本例中必须有,用于后续esphome自动化中予以调用。
    再看binary_sensor,二进制传感器,platform remote_receiver,这个不能更改,namewoshideng1 rf xinhao(随意取,注意有引号),
rc_switch_raw:(这个不能改),id(这个需要改,根据我上面说的,你按了遥控器按键后esphome的日志文件中显示的收到的一组二进制信号代码,注意有单引号)。protocol:1(我是按照我的理解,因为我的esphome中收到的遥控器代码是这么显示的)。on_press:(这个是启用自动化,意思是当传感器是on状态下,启用下面的自动化),then不去管它,- switch.toggle: jidianqi1(意思就是切换idjidianqi1switch的状态)
    这个实际上就是esphome的一个功能,当esphome收到一个你指定的射频信号,就会自动将一个虚拟的二进制传感器状态进行短暂的由onoff变化,详见https://esphome.io/components/remote_receiver.html#binary-sensor
我就是再后面加了一个传感器的自动化操作。
    说一下remote_receiver:,这个我就不多说了,esphom的页面有,参照上面那个网址
    方法一就这样了,说一下优缺点,优点就是射频模块价格便宜,缺点就是1、当我按下遥控器按键后,实际上我可能一下子收到多个相同的代码,或者说当你按一下遥控,实际上遥控器发射了多次信号,这时二进制传感器会多次打开关闭,造成继电器也多次触发。同理,当长按遥控器时,也会造成这个问题。这个问题要请懂的朋友们来指点一下了,到底是esphome中接收射频信号中的设置问题还是其他问题,我不知道是否可以变更自动化方式来解决,比如说,在3秒内无论收到多少次指定信号,我只触发一次继电器的操作。2、在这个射频模块我加了一个弹簧天线,但是接受距离还是不行,只有5米左右,不知道是个案还是这个模块的问题。
第二种方法:
    因为第一种方法有了我上面说的缺点,我这个小白又暂时无法解决,后来想到自己还有几个射频接收带解码的4路点动自锁模块,就有了这个想法,这种模块是可以和多种芯片进行学习对码的,当完成对码后,按一下遥控器,模块其中一个针脚就会输出高电平,我就把这个模块当一个二进制传感器使用,也就是说,我按下射频遥控器,射频模块的一个针脚输出高电平,esphome这时认为对应针脚的二进制传感器是on或者off,触发后面自动化对继电器进行触发。
    上射频带解码模块的图:

无标题.jpg

这个模块有7个针脚,除了dc+gnd以外,还有4个输出高电平的针脚,还有一个是针脚是key,外接按键和led的,我们用不到。
    针脚连接方面,正负极不说了,射频模块的out1-out3我分别接了nodemcuD1/D2/D5,老样子,D3D4D9D10因为默认为高电平我没有用它,继电器的3个信号针脚我接了nodemcuD6/D7/D8
    射频模块方面,我设置的是自锁模式,也就是说当按一下遥控器,模块针脚对应一直输出高电平,只有再一下遥控器,模块对应针脚输出低电平。
    esphomeyaml设置中,我把二进制传感器的自动化设置成,当传感器on时,继电器为开,传感器为off时,继电器关。
   方法二的优点是:没有了方法一的缺点,不会因为长按按键造成继电器自动多次切换,而且距离方面没有问题,接在nodemcu上我没有测试(手头没有弹簧天线了),不过我以前用过这个模块焊接好弹簧天线后,接在3楼电梯的按键上,可以从地下车库遥控到3楼的射频模块,使用那种普通的桃木四键遥控器。
    缺点:这样的接法很占用nodemcu的针脚,而且我的nodemcu刷了esphome后,D3/4/D9/D10默认高电平,只能接继电器用,不能接在射频模块上。另外这个射频模块只有4个输出针脚,最多只能控制4个继电器了。我原来是一个6键遥控器,其中4个键是对应4个灯,还有2个键是一键全开和一键全开,现在不行了。
  所以如果有朋友可以解决第一种方案的缺点的话,还是第一种方案好。
下面分别放上2种方案的esphome的yaml代码

评分

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

查看全部评分

回复

使用道具 举报

33

主题

312

帖子

1847

积分

金牌会员

Rank: 6Rank: 6

积分
1847
金钱
1530
HASS币
40
 楼主| 发表于 2020-2-24 14:31:12 | 显示全部楼层
esphome:
  name: espceshi2
  platform: ESP8266
  board: nodemcuv2

wifi:
  ssid: "你的ssid"                   #需连接无线wifi的SSID
  password: "你的wifi密码"           #需连接无线wifi的密码

  manual_ip:                              #需要对nodemcu设定固定的ip地址,可以填写,否则删除掉
    static_ip: 192.168.2.10              #ip地址   
    gateway: 192.168.2.1                  #网关
    subnet: 255.255.255.0                 #子网掩码
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:                               #如果不能连接到wifi,就作为热点使用,下面是热点的名称和密码,随意更改
    ssid: "Esphome"
    password: "mima"

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: "你的hass与esphome连接的密码"    #当连接homeassistant时,需要输入的密码

ota:
  password: "你的ota密码"                     #当进行ota升级时,需要输入的密码



binary_sensor:                           #二进制传感器
  - platform: remote_receiver             #来源是射频信号,这个不能改
    name: "woshideng1 rf xinhao"          #名称,随意
    rc_switch_raw:                        #经过rc_switch_raw解码后的信号
      code: '110101010001000000000001'    #信号值,填写你收到的信号值
      protocol: 1                        #协议,我填了1,个人理解,看你收到的信号中protocol后面的值
    on_press:                            #当传感器为on时,进行自动化
      then:
        - switch.toggle: jidianqi1       #自动对id为jidianqi1的继电器切换状态
        
  - platform: remote_receiver             #来源是射频信号,这个不能改
    name: "woshideng1 rf xinhao"          #名称,随意
    rc_switch_raw:                        #经过rc_switch_raw解码后的信号
      code: '1110101010001000000000010'    #信号值,填写你收到的信号值
      protocol: 1                         #协议,我填了1,个人理解,看你收到的信号中protocol后面的值
    on_press:                             #当传感器为on时,进行自动化
      then:
        - switch.toggle: jidianqi2         #自动对id为jidianqi2的继电器切换状态
        
  - platform: remote_receiver               #以下操作就是当收到指定的喜好,就把2个继电器全开
    name: "woshideng quankai rf xinhao"
    rc_switch_raw:
      code: '110101010001000000000011'
      protocol: 1
    on_press:
      then:
        - switch.turn_on: jidianqi2      #自动将id为jidianqi1的继电器进行打开
        - switch.turn_on: jidianqi1      #自动将id为jidianqi2的继电器进行打开
        
  - platform: remote_receiver            #以下操作就是当收到指定的喜好,就把2个继电器全关
    name: "woshideng quanguan rf xinhao"
    rc_switch_raw:
      code: '110101010001000000000100'
      protocol: 1
    on_press:
      then:
        - switch.turn_off: jidianqi2     #自动将id为jidianqi1的继电器进行关闭
        - switch.turn_off: jidianqi1     #自动将id为jidianqi2的继电器进行关闭
        
switch:                                #switch开关
  - platform: gpio                     #来自gpio针脚
    pin: D1                           #针脚是D6
    name: "jidianqi1"                 #名字自取,随意,注意需要双引号
    id: jidianqi1                     #该switch的id,如果需要自动化,必填,名字随意,但注意要与自动化中填写的一样
    
  - platform: gpio
    pin: D8
    name: "jidianqi2"
    id: jidianqi2
    



remote_receiver:                 #rf射频的接收,详见https://esphome.io/components/remote_receiver.html
  pin: D5                        #rf射频接收模块的信号引脚接入nodemcu的D6引脚  
  dump:                         #解码的类型 
    - rc_switch                  #使用RCSwitch RF来解码
  tolerance: 50%                #远程信号长度在解码过程中可以偏离的百分比。默认为25%,我这设置50%  
  filter: 200us                  #过滤所有比此短的脉冲。用于消除噪声信号中的毛刺。默认为10us,我这设置为200us
  idle: 4ms                     #信号应保持稳定(即不发生变化)以使其被视为完整的时间。默认为10ms,我这设置为4ms
  buffer_size: 1kb              #用于存储远程代码的内部缓冲区的大小。ESP32默认10kb ,ESP8266 默认1kb(以上步骤完成并刷新固件后,在esphome网页的showlogs页面,当按下rf遥控器,可以看到一串二进制的code,以上参数需要自行调整,详见https://esphome.io/components/remote_receiver.html以及https://esphome.io/components/remote_transmitter.html)


sensor:                                 #传感器
  - platform: wifi_signal             #这个可以让你的hass显示你nodemcu联网信号强度
    name: "WiFi Signal Sensor"        #名字自取,随意
    update_interval: 60s              #更新时间,这里为60秒


    
text_sensor:                            #这个可以让你的hass显示你nodemcu联网的信息
  - platform: wifi_info
    ip_address:
      name: ESP IP Address            #nodemcu的ip地址
    ssid:
      name: ESP Connected SSID          #wifi设备的ssid
    bssid:
      name: ESP Connected BSSID       #wifi设备的mac地址
回复

使用道具 举报

33

主题

312

帖子

1847

积分

金牌会员

Rank: 6Rank: 6

积分
1847
金钱
1530
HASS币
40
 楼主| 发表于 2020-2-24 14:33:19 | 显示全部楼层
esphome:
  name: esphomeceshi3
  platform: ESP8266
  board: nodemcuv2

wifi:
  ssid: "你的ssid"                   #需连接无线wifi的SSID
  password: "你的wifi密码"           #需连接无线wifi的密码
  manual_ip:                              #需要对nodemcu设定固定的ip地址,可以填写,否则删除掉
    static_ip: 192.168.2.10              #ip地址   
    gateway: 192.168.2.1                  #网关
    subnet: 255.255.255.0                 #子网掩码
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esphomeketing3 Fallback Hotspot"
    password: "4qGlQ1ddlBUC"

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: "你的hass与esphome连接的密码"    #当连接homeassistant时,需要输入的密码

ota:
  password: "你的ota密码"                     #当进行ota升级时,需要输入的密码


binary_sensor:                              #二进制传感器
  - platform: gpio                           #来自你的gpio针脚
    pin:
      number: D1                             #针脚是D1
    name: "xuni1"
    device_class: door                       #传感器的类别,门、窗等
    on_press:                                #当传感器为on时执行以下自动化
      then:
        - switch.turn_on: jidianqi1         #把id为jidianqi1的switch设置为on
    on_release:                             #当传感器为off时执行以下自动化
      then:
        - switch.turn_off: jidianqi1        #把id为jidianqi1的switch设置为off
        
  - platform: gpio
    pin:
      number: D2
    name: "xuni2"
    device_class: door
    on_press:
      then:
        - switch.turn_on: jidianqi2
    on_release:
      then:
        - switch.turn_off: jidianqi2
        
  - platform: gpio
    pin:
      number: D3
    name: "xuni3"
    device_class: door

  - platform: gpio
    pin:
      number: D4
    name: "xuni4"
    device_class: door
    
  - platform: gpio
    pin:
      number: D5
    name: "xuni5"
    device_class: door
    on_press:
      then:
        - switch.turn_on: jidianqi3
    on_release:
      then:
        - switch.turn_off: jidianqi3    

  - platform: gpio
    pin:
      number: D9
    name: "xuni9"
    device_class: door    
    
  - platform: gpio
    pin:
      number: D10
    name: "xuni10"
    device_class: door    
    
    
    
text_sensor:                            #这个可以让你的hass显示你nodemcu联网的信息
  - platform: wifi_info
    ip_address:
      name: ESP IP Address            #nodemcu的ip地址
    ssid:
      name: ESP Connected SSID          #wifi设备的ssid
    bssid:
      name: ESP Connected BSSID       #wifi设备的mac地址


sensor:                                 #传感器
  - platform: wifi_signal             #这个可以让你的hass显示你nodemcu联网信号强度
    name: "WiFi Signal Sensor"        #名字自取,随意
    update_interval: 60s              #更新时间,这里为60秒
    
switch:                                #switch开关
  - platform: gpio                     #来自gpio针脚
    pin: D6                           #针脚是D6
    name: "jidianqi1"                 #名字自取,随意,注意需要双引号
    id: jidianqi1                     #该switch的id,如果需要自动化,必填,名字随意,但注意要与自动化中填写的一样
    
  - platform: gpio
    pin: D7
    name: "jidianqi2"
    id: jidianqi2    
    
  - platform: gpio
    pin: D8
    name: "jidianq3"
    id: jidianqi3    
        
 
回复

使用道具 举报

33

主题

312

帖子

1847

积分

金牌会员

Rank: 6Rank: 6

积分
1847
金钱
1530
HASS币
40
 楼主| 发表于 2020-2-24 14:36:16 | 显示全部楼层
以下是word文件及yaml文件
esphomeceshi3.yml (3.65 KB, 下载次数: 39) esphomeceshi2.yml (5.46 KB, 下载次数: 44)


小白教小白-利用esphome固件来做一个可以通过433315射频遥控器来控制的开关无需mqtt.d.docx (325.29 KB, 下载次数: 84)


回复

使用道具 举报

19

主题

274

帖子

1948

积分

金牌会员

Rank: 6Rank: 6

积分
1948
金钱
1674
HASS币
50
发表于 2020-2-24 16:39:57 | 显示全部楼层
本帖最后由 姚远 于 2020-2-24 16:42 编辑

受教了。之前一直没有搞懂,既然开关侧已经有了433遥控了,干嘛还要搞个8266上去,两路无线到一个开关没啥意义。通过你的方案才明白,其实是脱离了hass的主动控制,由433去控制8266进行开关操作。433相当于是个遥控器,esphome可以直接接收rf信号控制芯片做开关动作,hass只做状态反馈或其他自动控制。
我最近一直在看esphome,rf这块给的选择太少,你这第一个方法就是受它的限制,我查了好多地方都没有找到突破限制的方法。虽然mqtt驱动rf有点慢,有时还需要多调用几次才行,但是还是能忍受的。关键我不怎么用遥控器,主要是晚上睡觉前全屋灯光关闭和夜灯开启的自动化用一个门铃按钮控制,其他时候的单灯控制就是靠智能音箱控制了。
很期待哪位大神提出突破esphome中rf可选择可控制参数太少的方案。
回复

使用道具 举报

33

主题

312

帖子

1847

积分

金牌会员

Rank: 6Rank: 6

积分
1847
金钱
1530
HASS币
40
 楼主| 发表于 2020-2-24 17:06:34 | 显示全部楼层
本帖最后由 lione95678 于 2020-2-24 19:30 编辑
姚远 发表于 2020-2-24 16:39
受教了。之前一直没有搞懂,既然开关侧已经有了433遥控了,干嘛还要搞个8266上去,两路无线到一个开关没啥 ...

对的,方案二的话,脱离hass也可以,脱离射频后单用hass也可以,不用再通过mqtt来转,你可以直接通过hass或者node-red的自动化来控制继电器。方案一还要各位朋友来指点了
我的本意是想让射频技能控制hass,又能单独工作,因为担心nodemcu因为网络等问题出现故障,我看论坛里卖的模块就有这个介绍,但是实在不会。后来听说esphome可以脱离mqtt和hass连接,且很稳定,就想到了这种办法。可惜方案一至今搞不定,方案二实际上是只是曲线救国,等于论坛里的diy高手们的86开关+nodemcu,433射频模块充当了86开关的角色。
回复

使用道具 举报

6

主题

352

帖子

1333

积分

金牌会员

Rank: 6Rank: 6

积分
1333
金钱
981
HASS币
0
发表于 2020-2-24 18:36:02 | 显示全部楼层
受教了。
回复

使用道具 举报

33

主题

312

帖子

1847

积分

金牌会员

Rank: 6Rank: 6

积分
1847
金钱
1530
HASS币
40
 楼主| 发表于 2020-2-24 21:49:28 | 显示全部楼层
本帖最后由 lione95678 于 2020-2-24 21:50 编辑

今晚趁着有空,又看了一遍esphome网页上的介绍,找到了二进制传感器的一个设置,Debouncing Values,百度翻译是“去噪值”,总算解决了方案一的一个缺点,用下面的代码就可以让二进制传感器立即发布一个ON值后,在等待**时间后才转成off,我设置了3秒,总算可以解决了(就是在3秒内,无论接收到多少次指定的信号,传感器都不会在ON和OFF之间变化,我设置3秒,实际在5秒左右,具体的要多调试一下了)。
不知道遥控距离长短有哪位朋友可以解决吗?我吃不准是wifi信号和射频信号相互影响,还是超再生射频模块本身原因,又或者是esphome中关于射频的一些参数没有调整好,以后有空先调整参数试试吧。
可怜我的移动宽带,esphome老是不能编译固件,ota都不行,每次都要用单位的电脑编译后下载,再通过usb线刷,修改一次代码实在麻烦。
这个参数详见网页https://esphome.io/components/binary_sensor/gpio.html#debouncing-values


代码如下:
binary_sensor:
  - platform: gpio
    pin: D2
    name: ...
    filters:
      - delayed_off: 10ms


回复

使用道具 举报

19

主题

274

帖子

1948

积分

金牌会员

Rank: 6Rank: 6

积分
1948
金钱
1674
HASS币
50
发表于 2020-2-24 22:44:49 来自手机 | 显示全部楼层
没错没错,你这经验值太重要了。有关距离,你使用的是315。这个频率的距离还是不错的,室内15米是可以的。我是发射和接收模块都接了个25厘米电线。如果再扩大发射距离,就是提高电压到12v
回复

使用道具 举报

2

主题

137

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
金钱
2249
HASS币
0
发表于 2020-2-25 09:49:16 | 显示全部楼层
下一版 ESPHome 會支援 RFBridge,
https://github.com/esphome/espho ... 5eeca38f619849d280b
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-21 21:22 , Processed in 1.693342 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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