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

 找回密码
 立即注册
楼主: furong600

[基础教程] 用Esphome发射和接收任意315/433MHz射频

  [复制链接]

4

主题

92

帖子

1225

积分

金牌会员

Rank: 6Rank: 6

积分
1225
金钱
1128
HASS币
20
 楼主| 发表于 2021-12-9 09:48:47 | 显示全部楼层
本帖最后由 furong600 于 2021-12-9 09:50 编辑
step0766 发表于 2021-12-4 01:11
你用的发射模块是什么?有图片或者链接吗?

这个功率大些。
WeChat Image_20211118155438.jpg
回复

使用道具 举报

10

主题

184

帖子

1822

积分

论坛技术达人

积分
1822
金钱
1633
HASS币
20
发表于 2021-12-14 16:02:19 | 显示全部楼层
furong600 发表于 2021-11-29 14:35
买sonoff RF bridge刷esphome,和这个一样。都需要解决参数配置问题。
想正确读取raw码,就需要正确的参 ...

不需要,esphome新版本自带rf_bridge组件,直接添加rf_bridge: 就行了。remote_receiver和transmitter都不需要配置。现在我的rf_bridge 搭配刷写esphome的墙壁开关实现单击开关晾衣架的灯,双击控制晾衣架的升降,顺便搭配射频按钮一键控制开关电视、电视盒子、功放。详见yaml
substitutions:
  node_name: "rfbridge-livingroom"
  node_id: rfbridge_livingroom
  node_name_friendly: ${node_name}

packages:
  common: !include common/common.yaml

esphome:
  on_boot:
    priority: -100
    then:
      #初始化晾衣架的灯为关闭状态
      - rf_bridge.send_raw:
          raw: "AAB029030800F002801AF428190819081909090819090818181818181908181819081818181908181818181855"
#默认重启之后 灯是关闭状态,应该无需重新发布状态
#      - lambda: |-
#          id(${node_id}_cover_light).publish_state(false);
api:
  services:
    - service: send_rf_code
      variables:
        sync: int
        low: int
        high: int
        code: int
      then:
        - rf_bridge.send_code:
            sync: !lambda 'return sync;'
            low: !lambda 'return low;'
            high: !lambda 'return high;'
            code: !lambda 'return code;'

    - service: send_rf_raw
      variables:
        raw: string
      then:
        - rf_bridge.send_raw:
            raw: !lambda 'return raw;'

    - service: learn
      then:
        - rf_bridge.learn

# with Portisch firmware
    - service: beep
      then:
        - rf_bridge.beep:
            duration: 100

    - service: send_rf_advanced_code
      variables:
        length: int
        protocol: int
        code: string
      then:
        - rf_bridge.send_advanced_code:
            length: !lambda 'return length;'
            protocol: !lambda 'return protocol;'
            code: !lambda 'return code;'

    - service: learn_raw
      then:
        - rf_bridge.start_bucket_sniffing

    - service: learn_advanced_code_start
      then:
        - rf_bridge.start_advanced_sniffing

    - service: learn_advanced_code_stop
      then:
        - rf_bridge.stop_advanced_sniffing


#this is important as the RF chip talks to esp on these pins at this baud rate
uart:
  tx_pin: GPIO01
  rx_pin: GPIO03
  baud_rate: 19200
#need to disable uart logging as it will interfere
logger:
  baud_rate: 0

#this allows ha to when RF signals are received, I'm not using this for anything yet.
rf_bridge:
  on_code_received:
    if:
      condition:
        switch.is_on: ${node_id}_pair_switch
      then:
        - homeassistant.event:
            event: esphome.rf_code_received
            data:
              sync: !lambda 'char buffer [10];return itoa(data.sync,buffer,16);'
              low: !lambda 'char buffer [10];return itoa(data.low,buffer,16);'
              high: !lambda 'char buffer [10];return itoa(data.high,buffer,16);'
              code: !lambda 'char buffer [10];return itoa(data.code,buffer,16);'

#with Portisch firmware
  on_advanced_code_received:
    if:
      condition:
        switch.is_on: ${node_id}_pair_switch
      then:
        - homeassistant.event:
            event: esphome.rf_advanced_code_received
            data:
              length: !lambda 'char buffer [10];return itoa(data.length,buffer,16);'
              protocol: !lambda 'char buffer [10];return itoa(data.protocol,buffer,16);'
              code: !lambda 'return data.code;'

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO00
      inverted: True
    name: "${node_name_friendly}-PairButton"
    id: ${node_id}_pair_button
    on_multi_click:
    #长按(按键时长为x秒到y秒之间,松开按键0.2秒之后发送状态)
    - timing:
        - ON for at least 0.7s
        - OFF for at least 0.2s
      then:
        - rf_bridge.beep:
            duration: 1000
        - delay: 200ms
        - switch.toggle: ${node_id}_restart
      invalid_cooldown: 0s
    #短按(x秒内按一下,松开按键0.3秒之后反馈状态)
    - timing:
        - ON for at most 0.3s
        - OFF for at least 0.2s
      then:
        - switch.turn_on: ${node_id}_pair_switch
        - delay: 5min
        - switch.turn_off: ${node_id}_pair_switch

      invalid_cooldown: 0s
# the interesting bit, controlling the awning motor
switch:
  - platform: template
    name: "${node_name_friendly}-Cover-Light"
    id: ${node_id}_cover_light

    turn_on_action:
      #发送开灯指令
      - rf_bridge.send_raw:
          raw: "AAB029030802A800C81AF428181909081818190819081819090908190908190909081908190819081909081955"
      - lambda: |-
          id(${node_id}_cover_light).publish_state(true);
    turn_off_action:
      - rf_bridge.send_raw:
          raw: "AAB029030802A800C81AF428181909081818190819081819090908190908190909081908190819081909081955"
      - lambda: |-
          id(${node_id}_cover_light).publish_state(false);
  - platform: template
    name: "${node_name_friendly}-Pair-Switch"
    id: ${node_id}_pair_switch
    optimistic: true
    on_turn_on:
        - rf_bridge.beep:
            duration: 200
        - delay: 200ms
        - rf_bridge.beep:
            duration: 200

light:
#状态指示灯
  - platform: status_led
    name: "${node_name_friendly}-LinkLed"
    id: ${node_id}_link_led
    pin: 
      number: GPIO13
      inverted: True

cover:
  - platform: time_based
    name: "${node_name_friendly}-Cover"
    device_class: garage
    assumed_state: true
    has_built_in_endstop: true

    open_action:
      - rf_bridge.send_raw:
          raw: "AAB029030802A800BE1AFE28181909090819090819081818190818190819081818190818190819090908181955"
    open_duration: 1s

    close_action:
      - rf_bridge.send_raw:
          raw: "AAB029030802B200BE1AF428190818190909081819090909081819081908190908181908181909090818190955"
    close_duration: 1s

    stop_action:
      - rf_bridge.send_raw:
          raw: "AAB029030802A800BE1AF428181909081818190819081819090908190819081818181818190819081909081955"


回复

使用道具 举报

4

主题

56

帖子

347

积分

中级会员

Rank: 3Rank: 3

积分
347
金钱
291
HASS币
0
发表于 2021-12-20 15:37:35 | 显示全部楼层
本帖最后由 1ban 于 2021-12-20 15:48 编辑

楼主您好,我用esphome/openmqttgetway都能抓取到发射码,openmqttgatway获取的是8位十进制妈,esphome获取的是二进制码,转换成十进制与opengatway相同,但都不能控制射频开关。请问为什么?是否也必须按你的方法来抓码?另外我安装PulseView不成功,提示缺少一个文件,请问怎么办?
remote_receiver:
  pin: D2
  dump:
    - rc_switch
  tolerance: 50%
  filter: 24us
  idle: 4ms
  buffer_size: 1kb

remote_transmitter:
  pin: D0
  # RF uses a 100% carrier signal
  carrier_duty_percent: 100%


switch:
  - platform: template
    name: RF Power Button
    turn_on_action:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '101010011011101100000001'
          protocol: 1
          repeat:
            times: 4
            wait_time: 1ms
         

    turn_off_action:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '101010011011101100000001'
          protocol: 1
          repeat:
            times: 4
            wait_time: 1ms
回复

使用道具 举报

4

主题

92

帖子

1225

积分

金牌会员

Rank: 6Rank: 6

积分
1225
金钱
1128
HASS币
20
 楼主| 发表于 2021-12-21 13:55:43 | 显示全部楼层
1ban 发表于 2021-12-20 15:37
楼主您好,我用esphome/openmqttgetway都能抓取到发射码,openmqttgatway获取的是8位十进制妈,esphome获取 ...

1. dump里面加raw,你把esphome的log,发出来看看。log里面的时序(有规律的正数、负数)和逻辑分析仪一样。
remote_receiver:
  pin: D2
  dump:
    - rc_switch
    - raw
2. PulseView需要安装驱动,否则会报缺少文件。淘宝店家里面都会介绍怎么安装驱动。(你已经买逻辑分析仪了?)
你的问题应该好解决,有问题随时回帖。
回复

使用道具 举报

0

主题

14

帖子

100

积分

注册会员

Rank: 2

积分
100
金钱
86
HASS币
0
发表于 2021-12-21 17:09:24 | 显示全部楼层
本帖最后由 ysahsh 于 2021-12-22 17:08 编辑

大神,请教下,我买的是超外差接收模块,不知道是不是这个原因,接收到的杂波特别多

然后试着,用大神的方法,用逻辑分析仪,抓波,然后间断按了5次,大概这样

4.png

放大好,有规律的波形大概是这样

5.png

再放大,量规律波形峰谷的时间数值比如这个是3.056ms  = 3056us,2032us

6.png 7.png

对应是不是就是您上面分析   [3056,2032]  就是一对 0,1 或者叫1,0

然后其中规律波形中的最小值  979us

所以ESPHOME 设置

3.png

filter  本来想设置500,但是发现设置200以上编译固件时好像会报错

2.png

但是固件依旧可以刷进去,然后开始大量的数据(当然我还没开始按遥控器)

1.jpg

然后大约按了4~5下遥控得到日志

log.rar (11.87 KB, 下载次数: 2)

想请教您:
1.以上分析步骤是否有问题?
2.已经可以ESPHOME抓取,请问如何改成1,0这种形式,(已经确认遥控器应该是滚码,所以我抓的信息可能是错的?)
3.另外我的这个好像是分为前后两段,连续发送3~4次,这种应该发送的时候应该如何设置呢?
回复

使用道具 举报

4

主题

56

帖子

347

积分

中级会员

Rank: 3Rank: 3

积分
347
金钱
291
HASS币
0
发表于 2021-12-21 23:44:23 | 显示全部楼层
本帖最后由 1ban 于 2021-12-22 09:40 编辑
furong600 发表于 2021-12-21 13:55
1. dump里面加raw,你把esphome的log,发出来看看。log里面的时序(有规律的正数、负数)和逻辑分析仪一 ...

谢谢回复。我买的逻辑分析仪店家给了说明书,软件是Saleae Logic 1.2.17,安装 连接成功,但是说明书看不懂,不会设置和使用,折腾了半天也抓不到信号。接收模块是433/315超再生模块。
回复

使用道具 举报

4

主题

92

帖子

1225

积分

金牌会员

Rank: 6Rank: 6

积分
1225
金钱
1128
HASS币
20
 楼主| 发表于 2021-12-25 22:33:49 | 显示全部楼层
1ban 发表于 2021-12-21 23:44
谢谢回复。我买的逻辑分析仪店家给了说明书,软件是Saleae Logic 1.2.17,安装 连接成功,但是说明书看不懂 ...

连接好后,再打开软件。
回复

使用道具 举报

4

主题

92

帖子

1225

积分

金牌会员

Rank: 6Rank: 6

积分
1225
金钱
1128
HASS币
20
 楼主| 发表于 2021-12-25 23:00:32 | 显示全部楼层
ysahsh 发表于 2021-12-21 17:09
大神,请教下,我买的是超外差接收模块,不知道是不是这个原因,接收到的杂波特别多

然后试着,用大神的方 ...

你这个步骤没有问题。很接近结果了
从波形的第一张图看,你两次之间间隔可能有点短。建议间隔2-3秒以上。
log分析步骤也是对的。波形和log不对应。log里面,很多一个电平宽度是350左右us,但波形说最小时900+us。
等你间隔延长点,把波形文件和log,都发出,再帮你分析下。干扰一直都有,在卫生间等地方狭小空间,可以减少干扰。
如果是滚码的话,不一定能模拟,毕竟不知道滚码算法。但能分析出发出的码都是多少。
遥控器为了保证,命令正确传输,都会重复发好几次。所以你看到按一次,波形发了好几次是正常的。
回复

使用道具 举报

4

主题

56

帖子

347

积分

中级会员

Rank: 3Rank: 3

积分
347
金钱
291
HASS币
0
发表于 2021-12-26 12:32:47 | 显示全部楼层
furong600 发表于 2021-12-21 13:55
1. dump里面加raw,你把esphome的log,发出来看看。log里面的时序(有规律的正数、负数)和逻辑分析仪一 ...

dump里面加raw后,打开LOGS屏幕就不停地滚动,按下遥控器也不知道接收到的信号是哪个,怎么抓码呢?
回复

使用道具 举报

4

主题

56

帖子

347

积分

中级会员

Rank: 3Rank: 3

积分
347
金钱
291
HASS币
0
发表于 2021-12-26 21:54:20 | 显示全部楼层
本帖最后由 1ban 于 2021-12-26 22:09 编辑
furong600 发表于 2021-12-25 22:33
连接好后,再打开软件。

屏幕截图 2021-12-26 215544.png 还是不会设置,抓不到码。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-16 08:58 , Processed in 0.354540 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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