找回密碼
 立即註冊
惟家LINE群QRCODE
    查看: 0|回覆: 0

    用 ESP32 做藍牙代理:2026 年的新選擇(更便宜的板子也行)

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    藍牙代理(Bluetooth Proxy)是 ESPHome 最實用的功能之一,
    而且幾乎不用寫設定



    它在解決什麼問題

    很多便宜的感測器是藍牙(BLE)的:


    • 小米的溫濕度計(LYWSD03MMC)
    • 各種 BLE 溫度計、土壤濕度計
    • 某些門磁、體重計
    • 藍牙追蹤器(Tile、AirTag 之類)


    問題:HA 主機的藍牙範圍只有幾公尺。

    藍牙代理的做法:在家裡各處放幾片 ESP32,
    它們負責接收藍牙訊號,透過 Wi-Fi 轉給 HA

    等於幫 HA 的藍牙「延長天線」。

    2026 年的重要進展

    ESPHome 在 2026 年 8 月的版本把 BLE 層改成平台中立
    把 39 個 BLE 感測器平台從「只支援 ESP32」的架構裡解放出來。

    結果:現在這些板子也能跑藍牙代理


    • Raspberry Pi Pico W
    • BK72xx(很多便宜的 Wi-Fi 裝置用這個晶片)
    • LN882H


    這代表更便宜的板子也能當藍牙偵測節點
    對想涵蓋全屋藍牙的人是好消息。

    不過 ESP32 還是最成熟的選擇,這篇以 ESP32 為主。



    設定:真的只要幾行
    1. substitutions:
    2.   device_name: bt-proxy-living
    3.   friendly_name: 客廳藍牙代理
    4. packages:
    5.   base: !include common/base.yaml
    6.   wifi: !include common/wifi.yaml
    7. esp32_ble_tracker:
    8.   scan_parameters:
    9.     # 連續掃描效果最好
    10.     interval: 1100ms
    11.     window: 1100ms
    12.     active: true
    13. bluetooth_proxy:
    14.   active: true
    複製代碼

    就這樣。

    兩個參數的意思

    esp32_ble_tracker.scan_parameters.active


    • true —— 主動掃描,會發送掃描請求。能拿到更多資料,但耗電高一點
    • false —— 被動掃描,只聽廣播


    大部分裝置需要 active: true 才能拿到完整資訊。

    bluetooth_proxy.active


    • true —— 允許 HA 透過這個代理「連線」到藍牙裝置
        (不只是接收廣播)
    • false —— 只轉發廣播


    要用需要連線的裝置(某些門鎖、需要設定的感測器)就要開 true。

    但 active: true 會佔用「連線插槽」 ——
    一片 ESP32 通常只能同時連 3 個裝置。

    HA 這邊

    裝置一連上,HA 就會自動發現,不用做任何設定。

    然後:


    • 設定 → 裝置與服務,會看到 Bluetooth 整合多了新的來源
    • 範圍內的 BLE 裝置會自動被發現
    • 支援的裝置會直接跳出「要不要加入」




    放幾片、放哪裡

    一片 ESP32 的有效範圍大概 10-15 公尺(有牆的話更短)。

    我的建議


    • 小坪數(20 坪以內) → 1-2 片
    • 一般公寓(25-35 坪) → 2-3 片
    • 透天或大坪數 → 每層樓 1-2 片


    放置原則


    • 放在「你要偵測的藍牙裝置」附近
    • 不要全部擠在一起 —— 那樣等於只有一片
    • 避開金屬(冰箱、鐵櫃、電箱)
    • 高一點比較好(櫃子上、牆上)
    • 離 Wi-Fi 路由器和 Zigbee 協調器遠一點(都是 2.4GHz)


    多片代理會怎樣

    HA 會自動選訊號最好的那一片,你不用管。

    而且同一個藍牙裝置被多片收到的話,HA 會去重

    用什麼板子

    最省事:現成的 Bluetooth Proxy 板

    有些廠商直接賣做好的(插上電就用),但價格比 DIY 高。

    最便宜:ESP32 開發板 + USB 電源


    • 約 150-250 元
    • 插在任何 USB 充電器上就好
    • 建議用有外殼的,不然裸板放在客廳很醜


    進階:ESP32 + PoE

    有些 ESP32 板子支援 PoE(乙太網路供電),
    一條網路線搞定電源和網路

    優點:不依賴 Wi-Fi,更穩定。

    2026.8 之後的新選擇


    • Raspberry Pi Pico W —— 約 200 元,有 Wi-Fi 和藍牙
    • BK72xx 的便宜板子 —— 更便宜,但社群資源少


    老實說 ESP32 的價格已經夠低了
    這些新選擇主要的意義是「你手上剛好有的板子也能用」。



    已知問題與注意事項(2026 年的狀況)

    一、連線插槽的問題

    ESPHome 2026.5.1 修了一個長期存在的 bug

    藍牙代理的連線插槽可能永久卡住 ——
    ESP-IDF 沒送出斷線事件時,插槽會停在 DISCONNECTING 狀態。

    原本有一個 10 秒的安全逾時,但那個元件的迴圈在斷線期間是停用的
    所以逾時根本不會執行 —— 一次丟失的事件就會燒掉一個插槽,直到重開機。

    對策:用 2026.5.1 以上的版本。

    二、ESP-IDF 5.5.2 的藍牙控制器問題

    ESP-IDF 5.5.2 有一個 BT 控制器的回歸
    會讓 BLE 掃描在幾小時或幾天後默默停止
    而且只能靠完整重開機恢復

    後來的 ESPHome 版本已經套用了 Espressif 上游的修正。

    症狀:藍牙裝置突然全部不更新,但 ESP32 看起來還活著。

    對策


    • 保持 ESPHome 更新
    • 設一個每天自動重開機的保險(下面說明)


    三、2026.9 修的幾個問題


    • 壅塞警告變成「每筆交易一次、每條連線一次」
        不再是每個丟棄週期都印 —— 大量傳輸時的日誌洪水終於停了
    • ble.disable / ble.enable 之後插槽卡在連線中 的問題修好了
    • OTA 期間無線電偏向藍牙 的問題修好了(現在會恢復成平衡)
    • 記憶體不足時的強化 —— Wi-Fi 掃描、API 寫入停滯、OTA 驗證時不會再重開機


    加一個「自動重開機」的保險
    1. # 每天凌晨 4 點重開一次
    2. time:
    3.   - platform: homeassistant
    4.     id: ha_time
    5.     on_time:
    6.       - seconds: 0
    7.         minutes: 0
    8.         hours: 4
    9.         then:
    10.           - logger.log: "每日例行重開機"
    11.           - button.press: restart_button
    12. button:
    13.   - platform: restart
    14.     name: "重新開機"
    15.     id: restart_button
    16.     entity_category: config
    複製代碼

    我知道這是治標,但藍牙代理本來就是「有就好」的功能,
    每天重開一次幾乎沒有成本。

    加一個監控

    在 HA 做一個「代理還活著嗎」的判斷:
    1. template:
    2.   - binary_sensor:
    3.       - name: 藍牙代理異常
    4.         unique_id: bt_proxy_problem
    5.         device_class: problem
    6.         delay_on: "00:30:00"
    7.         state: >
    8.           {{ states('sensor.bt_proxy_living_wi_fi_訊號')
    9.              in ['unavailable','unknown']
    10.              or (now() -
    11.                  states.sensor.xiaomi_bedroom_temperature.last_updated
    12.                 ).total_seconds() > 3600 }}
    複製代碼

    判斷方式:那些靠藍牙代理的感測器超過一小時沒更新就是有問題。

    順便:藍牙追蹤(存在偵測)

    同一片板子還可以做藍牙追蹤:
    1. esp32_ble_tracker:
    2.   scan_parameters:
    3.     interval: 1100ms
    4.     window: 1100ms
    5.     active: true
    6.   on_ble_advertise:
    7.     - mac_address: AA:BB:CC:DD:EE:FF
    8.       then:
    9.         - logger.log: "偵測到手錶"
    10. sensor:
    11.   - platform: ble_rssi
    12.     mac_address: AA:BB:CC:DD:EE:FF
    13.     name: "手錶 RSSI"
    14.     filters:
    15.       - sliding_window_moving_average:
    16.           window_size: 5
    17.           send_every: 5
    複製代碼

    用 RSSI(訊號強度)判斷「離哪一片代理最近」
    可以做房間層級的存在偵測

    但要注意


    • iPhone 的 MAC 會隨機化,這招對 iPhone 無效
    • 要用藍牙信標(beacon)或手錶這類固定 MAC 的裝置
    • RSSI 很不穩定,一定要濾波


    ---

    下一篇:ESPHome 的 Lambda ——
    什麼時候需要寫 C++,以及怎麼寫最簡單的那種。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-9-24 10:30 , Processed in 0.080231 second(s), 26 queries .

    快速回覆 返回頂部 返回列表