📶

ESPHomeでESP32C3にBluetooth Proxyを構築してBLE機器をネットワーク経由で使う方法

に公開

なぜBluetooth Proxyが必要なのか?

Home Assistantでスマートホームを構築していて、こんな悩みを抱えていませんか?

  • 「Bluetoothデバイスが遠すぎて認識しない…」
  • 「内蔵Bluetoothだと電波が届かない部屋がある」
  • 「BLE温湿度センサーをもっと広い範囲でカバーしたい」

私も同じ課題に直面し、試行錯誤の末にたどり着いたのがESPHomeのBluetooth Proxyでした。
ESP32C3という安価なマイコン(送料込み約1500円)を使うことで、Bluetoothの電波を中継し、Home Assistantからネットワーク経由で遠くのBLE機器を制御できるようになります。

この記事では、実際に私が構築したリポジトリ(bluetooth-proxy-for-esp32c3)を使って、Bluetooth Proxyを構築する手順を解説します。

https://github.com/saitogo555/bluetooth-proxy-for-esp32c3

この記事で得られるもの

  • ESP32C3を使ったBluetooth Proxyの構築方法(コピペ可能な設定付き)
  • ESPHome Web Toolsを使った環境構築不要の書き込み手順
  • 実際に遭遇したエラーと解決方法
  • Home Assistantへの統合手順

前提条件・ターゲット読者

対象読者

  • Home Assistantと連携したい方
  • Bluetoothデバイスの電波範囲を広げたい方

必要なもの

項目 詳細 参考価格
Seeed XIAO ESP32C3 小型で安価なESP32C3ボード 約1500円 (送料込み)
USB-Cケーブル データ転送対応のもの 手持ちでOK
Home Assistant環境 インストール済みであること (連携したい方のみ) -
Chromiumベースのブラウザ Chrome、Edge、Opera 無料

動作確認環境

  • OS: Windows 11 (WSL2)
  • ブラウザ: Brave
  • Home Assistant: Core 2025.10.1
  • ESPHome: 2025.9.3

Bluetooth Proxyとは?

仕組みの概要図

Bluetooth Proxyの役割

  1. BLE機器からの信号を受信(Bluetooth範囲内)
  2. WiFi経由でHome Assistantへデータを転送
  3. Home AssistantからBLE機器への制御コマンドを中継

通常、Home Assistantのサーバーからは届かない距離にあるBLE機器でも、ESP32C3をその近くに配置することで、ネットワーク経由で通信できるようになります。

構築手順:実際にやってみよう

ステップ1: リポジトリをクローン

まず、私が公開している設定ファイル一式をダウンロードします。

git clone https://github.com/saitogo555/bluetooth-proxy-for-esp32c3.git
cd bluetooth-proxy-for-esp32c3

リポジトリには以下のファイルが含まれています:

  • esphome-config.yaml: ESPHomeのメイン設定ファイル
  • secrets.sample.yaml: WiFi情報などの機密情報のテンプレート
  • .gitignore: Gitで管理しないファイルの指定
  • README.md: セットアップ手順

ステップ2: ESPHomeのインストール

# Pythonのバージョン確認
python --version  # Python 3.9以降であること

# ESPHomeをインストール
pip install esphome

ステップ3: 設定ファイルの準備

3-1. secrets.yamlの作成

secrets.sample.yamlをコピーしてsecrets.yamlを作成します。

cp secrets.sample.yaml secrets.yaml

3-2. secrets.yamlの編集

エディタでsecrets.yamlを開き、以下の情報を記入します。

# WiFi Configuration
wifi_ssid: "あなたのWiFi SSID"
wifi_password: "あなたのWiFiパスワード"

# API Encryption Key
api_key: "ここに生成したキーを貼り付け"

# OTA Password
ota_password: "任意の更新用パスワード"

# Fallback AP Password
ap_password: "任意のフォールバックAPパスワード"

3-3. APIキーの生成

Home AssistantとESP32C3間の通信を暗号化するためのキーを生成します。

openssl rand -base64 32

出力された32バイトのキーを、secrets.yamlapi_key欄にコピペします。

ステップ4: ファームウェアのコンパイル

設定ファイルをもとに、ESP32C3に書き込むファームウェアを生成します。

esphome compile esphome-config.yaml

コンパイルが成功すると、以下の場所にファームウェアが生成されます。

.esphome/build/xiao-esp32c3-bluetooth-proxy/.pioenvs/xiao-esp32c3-bluetooth-proxy/firmware.factory.bin

ステップ5: ESP32C3への書き込み

ESP32C3へ書き込む方法としてブラウザCLIの2種類がありますが、ESPHome Web Toolsを使えばブラウザだけで完結します。

5-1. ESP32C3をPCに接続

USB-CケーブルでESP32C3とPCを接続します。

5-2. ESPHome Web Toolsにアクセス

ブラウザで以下のURLにアクセス。

https://web.esphome.io/

5-3. デバイスを接続

  1. 「CONNECT」ボタンをクリック
  2. シリアルポート選択ダイアログが表示される
  3. ESP32C3のポートを選択(通常「USB JTAG/serial debug unit」や「USB Serial」と表示)

5-4. ファームウェアの書き込み

  1. INSTALL」ボタンをクリック
  2. ファイルを選択」をクリック
  3. 先ほど生成したfirmware.factory.binを選択
  4. INSTALL」をクリックして書き込み開始

書き込み中は進捗バーが表示されます。(通常30秒程度)

5-5. 動作確認

書き込み完了後、「LOGS」ボタンをクリックするとリアルタイムログが表示されます。

ステップ6: Home Assistantへの統合

6-1. ESPHome統合の追加

  1. Home Assistantの「設定」 → 「デバイスとサービス」を開く
  2. 右下の「統合を追加」をクリック
  3. 検索ボックスに「ESPHome」と入力して選択

6-2. デバイスの追加

通常、ESP32C3が同じネットワーク内にあれば自動検出されます。

  • 自動検出された場合: 「XIAO ESP32C3 Bluetooth Proxy」という名前で表示されるのでクリック
  • 手動で追加する場合:
    • ホスト: 192.168.1.123(LOGSで確認したIPアドレス)
    • ポート: 6053(デフォルト)

6-3. 動作確認

統合が完了すると、「デバイス」タブに「XIAO ESP32C3 Bluetooth Proxy」が表示されます。

デバイスページを開くと、以下の情報が確認できます:

  • WiFi Signal Strength: WiFi電波強度
  • Uptime: 稼働時間
  • Bluetooth connections: 接続中のBLE機器数

設定ファイルの詳細解説

esphome-config.yamlの構造

リポジトリのesphome-config.yamlは以下のような構造になっています。

esphome:
  name: xiao-esp32c3-bluetooth-proxy
  friendly_name: XIAO ESP32C3 Bluetooth Proxy

# ESP32C3固有の設定
esp32:
  board: seeed_xiao_esp32c3  # ボード指定
  variant: esp32c3            # チップバリアント
  framework:
    type: arduino             # Arduinoフレームワーク使用

# ログレベル設定
logger:
  level: DEBUG  # 開発時はDEBUG、本番はINFO推奨

# Home Assistant API(暗号化通信)
api:
  encryption:
    key: !secret api_key

# OTA(Over-The-Air)更新
ota:
  - platform: esphome
    password: !secret ota_password

# WiFi設定
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  
  # フォールバックAP(WiFi接続失敗時)
  ap:
    ssid: "XIAO-ESP32C3-Fallback"
    password: !secret ap_password

# Webサーバー(デバッグ用)
web_server:
  port: 80

# Bluetooth Proxy の核心部分
esp32_ble_tracker:
  scan_parameters:
    interval: 1100ms  # スキャン間隔
    window: 1100ms    # スキャン窓
    active: true      # アクティブスキャン有効

bluetooth_proxy:
  active: true

重要なパラメータの解説

パラメータ 説明 推奨値
logger.level ログの詳細度 DEBUG(開発時)/ INFO(本番)
esp32_ble_tracker.interval BLEスキャン間隔 1100ms(デフォルト)
esp32_ble_tracker.window スキャン窓の長さ 1100ms(連続スキャン)
esp32_ble_tracker.active アクティブスキャンON/OFF true(デバイス名取得のため)
「スキャン間隔」と「スキャン窓」とは

スキャン間隔(interval):
スキャン動作を開始する周期です。例えばinterval: 1100msの場合、1.1秒ごとにスキャンを開始します。

スキャン窓(window):
実際にBLE電波を受信し続ける時間です。例えばwindow: 1100msの場合、1.1秒間電波を聞き続けます。

時間軸 →
|-------- interval: 1100ms --------|-------- interval: 1100ms --------|
|========= window: 1100ms =========|========= window: 1100ms =========|
  ↑ 電波を受信している期間          ↑ 電波を受信している期間

設定のポイント:

  • interval = windowの場合(例: 両方1100ms): 連続スキャン

    • メリット: BLE機器を見逃しにくい、検出が速い
    • デメリット: 消費電力が高い
  • interval > windowの場合(例: interval: 1100ms, window: 500ms): 間欠スキャン

    • メリット: 消費電力を抑えられる
    • デメリット: BLE機器の信号を見逃す可能性がある

本リポジトリの設定では、確実にBLE機器を検出することを優先して、連続スキャン(interval = window)を採用しています。ESP32C3は常時給電されるため、消費電力はあまり気にする必要がありません。

応用編:さらに使いこなすために

Static IPの設定

IPアドレスが変わるたびに再設定するのは面倒なので、固定IPを割り当てましょう。

esphome-config.yamlwifiセクションで、コメントアウトされているmanual_ipを有効化します。

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  
  # Static IP設定(コメントを外す)
  manual_ip:
    static_ip: 192.168.1.100  # 任意の固定IP
    gateway: 192.168.1.1       # ルーターのIP
    subnet: 255.255.255.0
    dns1: 1.1.1.1              # CloudflareのDNS
    dns2: 8.8.8.8              # GoogleのDNS

設定変更後は再コンパイルして書き込みます。

esphome compile esphome-config.yaml
# Web Toolsで再度書き込み

OTA(Over-The-Air)更新

初回はUSB経由で書き込みましたが、次回からはWiFi経由で更新できます。

esphome upload esphome-config.yaml --device 192.168.1.100

これにより、ESP32C3を設置したまま遠隔でファームウェアを更新できます。

複数のBluetooth Proxyを配置

大きな家やオフィスでは、複数のESP32C3を配置することで、広範囲をカバーできます。

配置のコツ:

  • BLE機器の設置場所を中心に半径5〜10mの範囲に1台配置
  • WiFiの電波状況も考慮(ESP32C3自身がWiFiに接続できる場所)
  • 各ESP32C3に異なるnameを設定(例: xiao-esp32c3-living, xiao-esp32c3-bedroom

まとめ

この記事では、ESP32C3を使ったBluetooth Proxyの構築方法を解説しました。

記事のポイント振り返り

1500円のESP32C3でBluetoothの電波範囲を劇的に拡張
ESPHome Web Toolsでブラウザだけで書き込み完了
コピペ可能な設定ファイルで迷わず構築
OTA更新で設置後もメンテナンスが簡単

次のステップ:こんなこともできます

  • BLE温湿度センサーをリビング・寝室・玄関に配置して一元管理
  • BLEスマートロックをネットワーク経由で制御
  • BLE人感センサーで自動照明制御
  • 複数のBluetooth Proxyで家全体をカバー

参考リンク

最後に

もし、この記事が役に立ったらいいねをお願いします!
質問やつまずいた点があれば、コメント欄でお気軽にどうぞ。

また、リポジトリへの⭐️スターや、実際に構築してみた感想もお待ちしています。
一緒にスマートホームを楽しみましょう!🏠✨

GitHubで編集を提案

Discussion