はじめに
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の画面から追加する
- 対象VMを停止する。
- Proxmoxの「Hardware」を開く。
- 「Add」→「USB Device」を選択する。
- 「Use USB Vendor/Device ID」を選ぶ。
- Bluetoothデバイスを選択して追加する。
- 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になっている。 -
Rolesにcentralとperipheralが表示される。 -
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で次を開く。
- 「設定」
- 「デバイスとサービス」
- 「統合を追加」
-
BLE ADV Ceiling Fan / Lampsを選択 -
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.xmlにHome Assistant Bridgeが表示される。 -
api/v2/lightsにリビングライトだけが表示される。 - 次のコマンドでポート80の待受が確認できる。
sudo ss -ltnp | grep ':80 '
8. Alexaからデバイスを検出する
Amazon EchoとHome Assistant VMが同じLANから相互通信できる状態にする。
まずEchoへ次のように話しかける。
アレクサ、デバイスを検出して
見つからない場合はAlexaアプリで次を実行する。
- 「デバイス」→「+」→「デバイスを追加」
-
Philips Hueを選択 -
Philips Hue Bridge V1(丸型)を選択 - デバイス検出を開始する
検出される名前はリビングライトである。
音声操作例:
アレクサ、リビングライトをつけて
アレクサ、リビングライトを消して
アレクサ、リビングライトを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 showでPowered: yesを確認する。
点滅テストが失敗する
No, try Next.で次の候補を試す。LampSmart Proには複数の通信形式があるため、最初の候補が必ず一致するとは限らない。
Home Assistantでは動くがAlexaが検出できない
次を順番に確認する。
-
http://<HA-IP>/description.xmlへLAN内からアクセスできる。 -
http://<HA-IP>/api/v2/lightsに対象照明が表示される。 -
listen_port: 80になっている。 - EchoとHome Assistantが同じLANにいる。
- Wi-FiのAP Isolation、ゲストネットワーク分離、VLAN間の遮断がない。
- SSDP/UPnPのマルチキャスト
239.255.255.250:1900/UDPが遮断されていない。 - Alexaアプリから
Philips Hue Bridge V1(丸型)として再検出する。
10. 安定して使うためのメモ
- Home Assistant VMのアドレスは固定しておくと、Alexaの再検出を避けやすい。
- Emulated Hueのポート80はLAN内だけで使い、ルーターでは外部公開しない。
-
/opt/homeassistant/configは、ときどきバックアップしておくと安心。 - Proxmoxホストを変更したときは、BluetoothのUSBパススルーも設定し直す。
- ミニPCと照明が離れている場合は、Bluetoothの届きやすい場所へ移動すると安定しやすい。
参考資料
- LampSmart Pro(App Store)
- BLE ADV Ceiling Fan / Lamps
- Home Assistant: Emulated Hue
- Proxmox VE Administration Guide: USB Passthrough
おわりに
一度設定すれば、これまで専用アプリからしか動かせなかった照明を、Home Assistantの画面やAlexaの音声操作から使えるようになる。ESP32などの追加機器も不要で、ミニPCの内蔵Bluetoothをそのまま活用できる。