请选择 进入手机版 | 继续访问电脑版

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

 找回密码
 立即注册
查看: 887|回复: 19

[其他设备] 自制开源ESPHome通用蓝牙网关(ESP32)

[复制链接]

11

主题

183

帖子

853

积分

高级会员

Rank: 4

积分
853
金钱
665
HASS币
70
发表于 2022-5-6 21:22:35 | 显示全部楼层 |阅读模式
本帖最后由 riceball 于 2022-5-14 19:51 编辑

该蓝牙通用网关与Passive BLE Monitor 集成搭配使用.
从而解决因为蓝牙穿墙能力弱导致蓝牙信号无法穿墙的问题,蓝牙通用网关的主要用途有:

  1. 蓝牙信号过不来的就走开源ESPHome通用蓝牙网关,通过wifi信号再到HA上的 Passive BLE Monitor 集成.
  2. 接入只支持Active BLE connection的蓝牙设备

关于蓝牙设备的相关介绍,请参阅: HA智能硬件采购避坑指要(三) 蓝牙篇

硬件很简单,你只需要自备ESP32的主板一枚,建议最好选4M Flash的, 虽然2M的也能刷,但是稍微麻烦些(而且因为闪存小无法支持OTA了). 我选的是ESP-C3-32S(4M)的开发板. 可在某陶上搜索"ESP-C3-32S-Kit"记得问清楚是否4M(2M和4M只差几毛钱).

ESP32-C3是Espressif新出的RISC-V 32位单核处理器(160MHz)支持蓝牙5.0(BLE支持),以前的ESP32是基于蓝牙4.2.

然后准备好ESPHome开发环境,请升级到ESPHome的最新版(至少2022.1版本以后),请不要在arm环境下开发,因为Espressif目前还不支持ESP-C3在arm下的编译.

在Linux环境下安装使用很简单:

sudo apt -y install python3 python3-pip python3-pip-whl
sudo -H pip3 install --upgrade pip
pip3 install --user esphome
# To set this permanently, you can run echo 'export PATH=$PATHHOME/.local/bin' >> $HOME/.bashrc
export PATH=$PATHHOME/.local/bin
# You may need to logout and back in for the new group to take effect.
sudo usermod -a -G dialout $USER

好了,刷机的YAMLbluetooth-gateway.yaml配置如下(如果板子不是ESP32-C3请自行调整board参数),记得在相同目录下的secrets.yaml文件中填好参数:

substitutions:
  # Name the device and it's entities
  device: ble_gateway
  device_name: blegateway1

esphome:
  name: $device_name
  comment: $device
  platformio_options:
    board_build.flash_mode: dio

esp32:
  board: esp32-c3-devkitm-1
  variant: esp32c3
  framework:
    type: arduino
    version: 2.0.2
    platform_version: https://github.com/tasmota/platform-espressif32/releases/download/v2.0.2.3/platform-espressif32-2.0.2.3.zip

external_components:
  - source: github://myhomeiot/esphome-components

esp32_ble_tracker:

# Enable logging
logger:

# Enable Home Assistant API
api:
  reboot_timeout: 1h

ota:
  password: !secret ota_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot in case wifi connection fails
  ap:
    ssid: "$device_name Fallback Hotspot"
    password: !secret ap_password

ble_gateway:
  id: $device_name
  # devices:
  #   - mac_address: 01:23:45:67:89:AB
  #   - mac_address: !secret lywsd03mmc_mac
  on_ble_advertise:
    then:
      - homeassistant.service:
          service: ble_monitor.parse_data
          data:
            packet: !lambda return packet;
            gateway_id: $device_name
      - homeassistant.event:
          event: esphome.on_ble_advertise
          data:
            packet: !lambda return packet;

text_sensor:
  - platform: homeassistant
    id: ble_gateway_devices
    entity_id: binary_sensor.ble_gateway
    attribute: devices
    on_value:
      then:
        lambda: id($device_name).set_devices(x);
  # IP address of device. Not really needed for HA (as HA already knows it), but for showing on the display during startup. The startup screen will leave on if no instance connects to the API.
  - platform: wifi_info
    ip_address:
      name: $device_name IP address
      id: ip_address
  # ESPHome version used to compile the app
  - platform: version
    name: $device_name ESPHome Version

sensor:
  # WiFi signals strength sensor
  - platform: wifi_signal
    name: $device_name WiFi Signal Sensor
    update_interval: 60s

USB插上ESP32开发板,看清楚串口号(ls /dev/tty*),一般是/dev/ttyUSB0,然后执行如下语句编译烧录固件:

# choose the port after compiling
esphome run bluetooth-gateway.yaml

至此,通用蓝牙网关的硬件烧录部分完成.

接着,还要在HA上配置与Passive BLE Monitor 集成的搭配部分.

修改HA configuration.yaml文件:

input_boolean:
  ha_started:
    initial: false
  settings_ble_gateway:
    name: BLE Gateway
    icon: mdi:bluetooth

input_text:
  settings_ble_gateway_add_device:
    name: BLE Gateway Add Device
    icon: mdi:bluetooth-connect
    initial: ''

template:
  - binary_sensor:
      - name: BLE Gateway Add Device
        state: "{{ (state_attr('binary_sensor.ble_gateway_add_device', 'mac_address')) }}"
        availability: "{{ is_state('input_boolean.ha_started', 'on') }}"
        attributes:
          mac_address: "{{ states('input_text.settings_ble_gateway_add_device') | replace(':', '') | trim }}"
  - binary_sensor:
      - name: BLE Gateway
        icon: mdi:bluetooth
        state: "{{ is_state('input_boolean.settings_ble_gateway', 'on') }}"
        availability: "{{ is_state('input_boolean.ha_started', 'on') }}"
        attributes:
          devices: "{{ states.sensor | selectattr('entity_id', 'search', '^sensor.ble_') | selectattr('attributes.mac_address', 'defined') | map(attribute='attributes.mac_address') | unique | sort | join('') | replace(':', '' | trim) if is_state('binary_sensor.ble_gateway', 'on') }}"

然后修改automations.yaml文件:

- alias: HA Start automation
  initial_state: true
  trigger:
    platform: homeassistant
    event: start
  action:
    service: input_boolean.turn_on
    entity_id: input_boolean.ha_started
  id: ha_start

重启HA即可. 对了记得把刚刚新鲜出炉的蓝牙网关加入进来.

然后该蓝牙网关就会自动转发已发现的并且在Passive BLE Monitor 集成中设备.

如果要添加新的蓝牙设备请在Passive BLE Monitor 集成上添加.
如果想只针对个别设备在指定的蓝牙网关上转发,那么请使用input_text.settings_ble_gateway_add_device添加该设备的MAC地址.

蓝牙网关接收到已注册设备的广播后会同时触发事件esphome.on_ble_advertise发送原始数据.

最后,记得设置input_boolean.settings_ble_gateway为"on",启用蓝牙网关功能.

版本更新

2022-5-9: [Bug] esp-idf 下无法更改 scan_parameters, 使用 Arduino framework now.

评分

参与人数 3金钱 +40 HASS币 +20 收起 理由
+ 20 + 20 高手,这是高手!
liwei19920307 + 10
dscao + 10 感谢楼主分享!

查看全部评分

回复

使用道具 举报

0

主题

71

帖子

906

积分

高级会员

Rank: 4

积分
906
金钱
835
HASS币
0
发表于 2022-5-6 23:09:33 | 显示全部楼层
感谢LZ分享

ESP C3的开发板建议慎选,C3是单核RISC-V方案,优势是支持蓝牙5.0,价格更便宜,但是跟之前的ESP32的双核Xtensa还是差别比较大的,包括ESPHOME目前对它的支持还处于in development状态,我自己在编译的过程中遇到过奇奇怪怪的小坑。个人觉得,多花几块钱买普通的ESP32对新手更友好
回复

使用道具 举报

11

主题

183

帖子

853

积分

高级会员

Rank: 4

积分
853
金钱
665
HASS币
70
 楼主| 发表于 2022-5-7 06:10:07 | 显示全部楼层
hellkun 发表于 2022-5-6 23:09
感谢LZ分享

ESP C3的开发板建议慎选,C3是单核RISC-V方案,优势是支持蓝牙5.0,价格更便宜,但是跟之前的E ...

既然是用途作为蓝牙网关,当然要选蓝牙5,向下兼容的。
在PC上编译,没问题的,不过一定要记得升级esphome到最新版
回复

使用道具 举报

6

主题

73

帖子

1605

积分

论坛技术达人

积分
1605
金钱
1522
HASS币
50
发表于 2022-5-7 09:54:41 | 显示全部楼层
感谢分享 C3确实很好 我很多项目都用的C3 这个项目拓展了蓝牙功能 很棒
回复

使用道具 举报

11

主题

183

帖子

853

积分

高级会员

Rank: 4

积分
853
金钱
665
HASS币
70
 楼主| 发表于 2022-5-7 10:03:34 | 显示全部楼层
忘记写了,最后要记得设置`input_boolean.settings_ble_gateway`为"on",启用蓝牙网关功能.
回复

使用道具 举报

10

主题

78

帖子

1101

积分

金牌会员

Rank: 6Rank: 6

积分
1101
金钱
1023
HASS币
0
发表于 2022-5-7 10:55:58 | 显示全部楼层
有没购买链接啊,私发我一下吧,怕买错了
回复

使用道具 举报

72

主题

1832

帖子

7014

积分

超级版主

Rank: 8Rank: 8

积分
7014
金钱
5117
HASS币
380

教程狂人突出贡献

发表于 2022-5-7 11:37:46 来自手机 | 显示全部楼层
本帖最后由 XCray 于 2022-5-7 12:56 编辑

这个称为“蓝牙网关”不太准确吧?更接近于蓝牙中继器的概念。另外,ble_monitor虽然不错但也有明显的缺点。其实esphome本身已经可以实现很不错的蓝牙网关功能,使用上也更简单。加上自己撸的代码,扩展性也够了。我自己在用的就是花花草草、蓝牙温湿度(内置组件)、体脂秤、燃气灶、门锁、yeelight调光开关(自定义组件)一块esp32搞定
回复

使用道具 举报

21

主题

1586

帖子

5260

积分

论坛元老

Rank: 8Rank: 8

积分
5260
金钱
3664
HASS币
80
发表于 2022-5-7 13:10:04 | 显示全部楼层
XCray 发表于 2022-5-7 11:37
这个称为“蓝牙网关”不太准确吧?更接近于蓝牙中继器的概念。另外,ble_monitor虽然不错但也有明显的缺点 ...

X大白嫖一下体脂称+蓝牙温湿度可否?
回复

使用道具 举报

13

主题

146

帖子

783

积分

高级会员

Rank: 4

积分
783
金钱
637
HASS币
0
发表于 2022-5-7 13:42:48 | 显示全部楼层
esp32蓝牙距离有多远
回复

使用道具 举报

11

主题

183

帖子

853

积分

高级会员

Rank: 4

积分
853
金钱
665
HASS币
70
 楼主| 发表于 2022-5-7 13:47:00 | 显示全部楼层
XCray 发表于 2022-5-7 11:37
这个称为“蓝牙网关”不太准确吧?更接近于蓝牙中继器的概念。另外,ble_monitor虽然不错但也有明显的缺点 ...

1. 是的主要是能中继, 不过也可以说网关: HA上可以不用插蓝牙适配器, 就可以通过这货接入蓝牙设备.
2. ble_monitor 集成的缺陷在哪里? 还请多多指教.
3. 如果有更通用的方式,那自是更好
4. 如果能搞定蓝牙发送指令,未来就是蓝牙的,价格决定一切

回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2022-5-16 14:25 , Processed in 0.075416 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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