2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Proxmoxの内蔵BluetoothでLampSmart Pro照明をHome Assistant・Alexaに連携する

2
Posted at

はじめに

2,000円台の激安シーリングライトを、追加機器なしでAlexa対応にしてみた。

購入したのは、Amazonで販売されているAntree LEDシーリングライト 6畳・3600lm・黒枠。安価ながら調光・調色・常夜灯に対応し、付属リモコンだけでなくスマートフォンからも操作できる。

ところが、付属リモコンは赤外線式ではなく、対応アプリ「LampSmart Pro」もBluetooth接続。一般的な赤外線スマートリモコンでは学習できず、製品単体ではAlexaにも連携できない。

そこで「Proxmoxを動かしているミニPCの内蔵Bluetoothを使えば操作できるのでは?」と試したところ、Home Assistantを経由してAlexaからの音声操作まで実現できた。

本記事では、次の構成を使って、照明のON/OFF・明るさ・色温度をHome AssistantとAlexaから操作できるようにする。

  • ミニPC上のProxmox VE
  • Debian仮想マシン
  • Home Assistant Container
  • ミニPC内蔵BluetoothのUSBパススルー
  • Home Assistantカスタム連携「BLE ADV Ceiling Fan / Lamps」
  • Alexaとのローカル連携「Emulated Hue」

この構成では、照明のON/OFF、明るさ、色温度をHome AssistantとAlexaから操作できる。ESP32、赤外線送信機、AWS Lambda、外部公開用のポート開放は使用しない。

LampSmart Pro対応照明の多くは、通常のBluetooth接続ではなくBLE Advertising(BLE広告パケット)でコマンドを送信する。そのため、Bluetoothデバイス一覧に照明が常時表示されなくても問題ない。

完成構成

動作確認済みの例は次のとおり。

項目
Proxmoxホスト ミニPC
Home Assistant VM Debian 13、2 vCPU、4 GB RAM、32 GBディスク
Bluetooth USB ID MediaTek 0e8d:0616
Home Assistant Container版 2026.8.1
BLE ADV連携 NicoIIT/ha-ble-adv v2.0.6
対象アプリ LampSmart Pro

USB ID、VM ID、エンティティIDは環境に合わせて読み替える。

1. Proxmox VMを用意する

Debian VMを作成する。Bluetooth処理自体は軽いため、以下を目安にすればよい。

  • OS:Debian 13
  • CPU:2 vCPU
  • メモリ:4 GB
  • ディスク:32 GB
  • ネットワーク:ブリッジ接続
  • IPアドレス:DHCP予約または固定IP

AlexaのEmulated HueはHome AssistantのIPアドレスを記憶するため、VMのIPは固定する。

2. 内蔵BluetoothをVMへパススルーする

2.1 ProxmoxホストでUSB IDを確認する

Proxmoxホストのシェルで次を実行する。

lsusb

動作確認環境では次のMediaTek Bluetoothが表示された。

0e8d:0616 MediaTek Inc. Wireless_Device

2.2 Proxmoxの画面から追加する

  1. 対象VMを停止する。
  2. Proxmoxの「Hardware」を開く。
  3. 「Add」→「USB Device」を選択する。
  4. 「Use USB Vendor/Device ID」を選ぶ。
  5. Bluetoothデバイスを選択して追加する。
  6. VMを起動する。

CLIで設定する場合の例は次のとおり。106はVM IDなので置き換える。

qm set 106 -usb0 host=0e8d:0616

なお、このVMを別のProxmoxノードへ移す場合は、移動先でBluetoothのUSBパススルーを設定し直す。

3. Debianに必要なパッケージを入れる

VMへSSH接続し、Docker、BlueZ、Git、curlを導入する。

sudo apt update
sudo apt install -y docker.io bluez git curl
sudo systemctl enable --now docker
sudo systemctl enable --now bluetooth

BluetoothがVMから認識されていることを確認する。

lsusb
bluetoothctl show
sudo btmgmt info

次の表示が確認できれば準備完了。

  • Bluetooth Controllerが1台表示される。
  • Powered: yesになっている。
  • Rolescentralperipheralが表示される。
  • SupportedInstancesが0より大きい。

4. Home Assistant Containerを起動する

設定保存先を作成する。

sudo install -d -m 755 /opt/homeassistant/config

Home Assistantを起動する。

sudo docker run -d \
  --name homeassistant \
  --restart unless-stopped \
  --network host \
  --cap-add NET_ADMIN \
  --cap-add NET_RAW \
  -e TZ=Asia/Tokyo \
  -v /opt/homeassistant/config:/config \
  -v /etc/localtime:/etc/localtime:ro \
  -v /run/dbus:/run/dbus:ro \
  -v /run/udev:/run/udev:ro \
  ghcr.io/home-assistant/home-assistant:stable

BLE広告の送受信に必要な指定は次のとおり。

指定 目的
--network host Bluetooth HCIソケットとLAN内SSDPを利用する
--cap-add NET_ADMIN Bluetoothアダプターを管理する
--cap-add NET_RAW Raw HCIパケットを扱う
/run/dbus:/run/dbus:ro BlueZの状態をHome Assistantから参照する
/run/udev:/run/udev:ro Bluetooth機器情報を参照する

ブラウザからHome Assistantの初期画面(ポート8123)を開き、初期設定を完了する。

5. BLE ADV連携をインストールする

最新版ではなく、再現性を優先して動作確認済みタグを指定する。

git clone --depth 1 --branch v2.0.6 \
  https://github.com/NicoIIT/ha-ble-adv.git \
  /tmp/ha-ble-adv

sudo install -d -m 755 /opt/homeassistant/config/custom_components
sudo cp -a \
  /tmp/ha-ble-adv/custom_components/ble_adv \
  /opt/homeassistant/config/custom_components/

sudo docker restart homeassistant

起動ログを確認する。

sudo docker logs --since 5m homeassistant

カスタム連携なので警告は表示されるが、ble_advの読み込みエラーがなければOK。

6. LampSmart Proの設定をHome Assistantへ複製する

6.1 事前条件

  • iPhoneのLampSmart Proから対象照明を操作できること。
  • iPhone、照明、ミニPCがBluetoothの届く範囲にあること。
  • Home AssistantのBluetooth統合に内蔵Bluetoothが表示されること。

6.2 連携を追加する

Home Assistantで次を開く。

  1. 「設定」
  2. 「デバイスとサービス」
  3. 「統合を追加」
  4. BLE ADV Ceiling Fan / Lampsを選択
  5. Duplicate Paired Phone App config (Recommended)を選択

10秒間の待受が始まったら、LampSmart Proで対象ライトのON/OFFを1秒間隔で2~3回操作する。

No configuration listened within 10sと表示された場合はRetryを押し、直後にもう一度アプリを操作する。

6.3 点滅テストで通信方式を確定する

連携が複数の候補を検出すると、候補ごとに照明を点滅させる。

  • 点滅した場合:Yes!
  • 点滅しない場合:No, try Next.

機種ごとに使用するLampSmart Proのコーデックが異なるため、コーデック名を手入力せず、この点滅テストで自動判定する。

6.4 照明エンティティを設定する

Configure Lights / Fansを開き、一般的な調光・調色シーリングライトでは次のように設定する。

項目 設定
Main Light / Type Cold / Warm White
Minimum Brightness 3
Force color / brightness refresh OFF
Reverse Cold / Warm OFF
Turn ONを常時送信 OFF
Turn OFFを常時送信 OFF
Second Light None
Main Fan None

「送信」を押して設定メニューへ戻り、Finalizeを選択する。デバイス名の例はリビング シーリングライトとする。

設定完了後、Home Assistantのライト画面から次を確認する。

  • ON/OFF
  • 明るさ変更
  • 色温度変更

色温度の暖色・寒色が逆になる場合は、連携の「再設定」からReverse Cold / WarmをONにする。

7. Alexaへ無料でローカル公開する

Home AssistantのEmulated Hueを利用し、対象ライトだけをAlexaへ公開する。

7.1 Home AssistantのエンティティIDを確認する

「設定」→「デバイスとサービス」→「エンティティ」で対象ライトを開き、エンティティIDを確認する。

動作確認環境では次のIDになった。

light.rihinku_sirinkuraito_main_light

エンティティIDは画面から確認できるため、.storage配下を直接編集する必要はない。

7.2 ポート80が空いていることを確認する

sudo ss -ltnp

:80を使用中のプロセスがないことを確認する。新しいAlexa機器によるEmulated Hueの検出にはポート80が必要である。

7.3 configuration.yamlを編集する

まずバックアップする。

sudo cp \
  /opt/homeassistant/config/configuration.yaml \
  /opt/homeassistant/config/configuration.yaml.before-alexa

/opt/homeassistant/config/configuration.yamlへ次を追加する。HOME_ASSISTANT_IPとエンティティIDは自分の環境に合わせて置き換える。

emulated_hue:
  host_ip: HOME_ASSISTANT_IP
  listen_port: 80
  expose_by_default: false
  entities:
    light.rihinku_sirinkuraito_main_light:
      name: "リビングライト"
      hidden: false

expose_by_default: falseにより、Home Assistant内の他の機器が意図せずAlexaへ公開されるのを防ぐ。

7.4 設定検査と再起動

sudo docker exec homeassistant \
  python -m homeassistant --script check_config -c /config

エラーがなければ再起動する。

sudo docker restart homeassistant

7.5 Emulated Hueを検証する

ブラウザまたはcurlで、Home Assistantの/description.xml/api/v2/lightsを開く。

期待する結果は次のとおり。

  • description.xmlHome Assistant Bridgeが表示される。
  • api/v2/lightsリビングライトだけが表示される。
  • 次のコマンドでポート80の待受が確認できる。
sudo ss -ltnp | grep ':80 '

8. Alexaからデバイスを検出する

Amazon EchoとHome Assistant VMが同じLANから相互通信できる状態にする。

まずEchoへ次のように話しかける。

アレクサ、デバイスを検出して

見つからない場合はAlexaアプリで次を実行する。

  1. 「デバイス」→「+」→「デバイスを追加」
  2. Philips Hueを選択
  3. Philips Hue Bridge V1(丸型)を選択
  4. デバイス検出を開始する

検出される名前はリビングライトである。

音声操作例:

アレクサ、リビングライトをつけて
アレクサ、リビングライトを消して
アレクサ、リビングライトを50パーセントにして

9. トラブルシューティング

Bluetooth管理権限のエラー

ログに次のような内容が出る場合:

Missing required permissions for Bluetooth management

Home Assistantコンテナに次があることを確認する。

  • --network host
  • --cap-add NET_ADMIN
  • --cap-add NET_RAW
  • /run/dbus/run/udevのマウント

既存コンテナへCapabilityを後から追加することはできないため、/configがホストへ保存されていることを確認してから、同じ設定ディレクトリを使ってコンテナを再作成する。

BLE ADV連携が一覧に出ない

sudo test -f \
  /opt/homeassistant/config/custom_components/ble_adv/manifest.json \
  && echo OK

sudo docker restart homeassistant
sudo docker logs --since 5m homeassistant

配置先が/config/custom_components/ble_advとしてコンテナから見えることを確認する。

アプリの信号を検出できない

  • Retryを押してから10秒以内に操作する。
  • ON/OFFを1回だけでなく2~3回送る。
  • iPhoneをミニPCの近くへ移動する。
  • LampSmart Proから実際に照明を操作できることを再確認する。
  • bluetoothctl showPowered: yesを確認する。

点滅テストが失敗する

No, try Next.で次の候補を試す。LampSmart Proには複数の通信形式があるため、最初の候補が必ず一致するとは限らない。

Home Assistantでは動くがAlexaが検出できない

次を順番に確認する。

  1. http://<HA-IP>/description.xmlへLAN内からアクセスできる。
  2. http://<HA-IP>/api/v2/lightsに対象照明が表示される。
  3. listen_port: 80になっている。
  4. EchoとHome Assistantが同じLANにいる。
  5. Wi-FiのAP Isolation、ゲストネットワーク分離、VLAN間の遮断がない。
  6. SSDP/UPnPのマルチキャスト239.255.255.250:1900/UDPが遮断されていない。
  7. AlexaアプリからPhilips Hue Bridge V1(丸型)として再検出する。

10. 安定して使うためのメモ

  • Home Assistant VMのアドレスは固定しておくと、Alexaの再検出を避けやすい。
  • Emulated Hueのポート80はLAN内だけで使い、ルーターでは外部公開しない。
  • /opt/homeassistant/configは、ときどきバックアップしておくと安心。
  • Proxmoxホストを変更したときは、BluetoothのUSBパススルーも設定し直す。
  • ミニPCと照明が離れている場合は、Bluetoothの届きやすい場所へ移動すると安定しやすい。

参考資料

おわりに

一度設定すれば、これまで専用アプリからしか動かせなかった照明を、Home Assistantの画面やAlexaの音声操作から使えるようになる。ESP32などの追加機器も不要で、ミニPCの内蔵Bluetoothをそのまま活用できる。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?