💡

SwitchBot Color BulbをPython × BLEで制御するよ

2024/08/17に公開

💭 ふりかえり

https://zenn.dev/gaimo_ch/articles/45ea37e1b281d3
以前、Python × SwitchBot API 1.1でColor Bulbを制御できるようにしました。
その後、日常で運用していましたが、問題点が浮き彫りになってきました。

・遅延が5秒程度ある。
・反応しない(エラーが発生する)場合がある。
・インターネットに接続されていないと制御できない。

どうしても一旦はWebを経由するため、この運用方法では不安定になりがちでした。

📡 SwitchBotAPI BLE

https://github.com/OpenWonderLabs/SwitchBotAPI-BLE
Color BulbはBLE(Bluetooth Low Energy)でも制御することができ、
SwitchBot公式GitHubにBLEを介して通信するためのAPIが提供されています。
これを参考にして、サーバからBLE経由でBulbを制御します。

🐍 Python

devicetypes/colorbulb.mdより引用

RX characteristic UUID
UUID: ''cba20002-224d-11e6-9fb8-0002a5d5c51b''
REQ
Turn On Bulb REQ 0x570f470101
Turn Off Bulb REQ 0x570f470102

上記のRX characteristic UUID, REQをPythonスクリプト内に組み込みます。
REQは1バイトずつに区切ります。

ble_bulb.py

BLE通信でBulbを制御するための基本的なスクリプトです。
Bulbを複数使用することを考慮して、並列処理を行っています。

https://github.com/gaimo-ch/switchbot-ble/blob/main/ble_bulb.py

numpad_bulb_ctrl.py

テンキーでBulbを制御するために応用したスクリプトです。
お好みのキーマップに変更してください。

https://github.com/gaimo-ch/switchbot-ble/blob/main/numpad_bulb_ctrl.py

venv

pythonの仮想環境を作成して、bluepyをインストールします。

python3 -m venv venv
pip install bluepy
. venv/bin/activate

🌀 Debian

Proxmox VE上でDebianのVMを立てて運用します。
必要に応じてBluetoothアダプタを取り付けてUSBパススルー設定をします。
Bluetoothのライブラリをインストールします。

sudo apt install bluetooth bluez

キーボード入力から制御する

Bulbを小さいマクロパッドとテンキーで制御できるようにします。

マクロパッド

テンキー

Proxmox VEのWebGUIからUSBパススルーの設定を行います。
当該VMハードウェア追加USBデバイスUSBポートを使用プルダウンからUSB機器を選択する

~/.zshrc

シェルを起動したら自動でPythonスクリプトを実行するようにします。

~/.zshrc
cd switchbot-ble
. venv/bin/activate
python3 numple_bulb_ctrl.py

自動ログインを有効化

もしVMがシャットダウンされたら起動時に手動でログインする必要があるため、
自動でログインするようにTTY1の設定をいじくります。

sudo mkdir /etc/systemd/system/getty@tty1.service.d
sudo nano /etc/systemd/system/getty@tty1.service.d/autologin.conf
/etc/systemd/system/getty@tty1.service.d/autologin.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin {user name} --noclear %I $TERM
sudo reboot

✅ 試してみよう

キーを押下してから大体1秒程度でBulbの制御ができるようになりました。
WebAPIを経由するよりも素早く反応するので大成功です。

あまり早く複数のキーを押下すると、
Error: Failed to connect to peripheral (Macアドレス), addr type: public
というエラーが発生することがあります。仕方ないね。

🔖 参考

https://github.com/OpenWonderLabs/SwitchBotAPI-BLE

GitHubで編集を提案

Discussion