SwitchBot Color BulbをPython × BLEで制御するよ
💭 ふりかえり
その後、日常で運用していましたが、問題点が浮き彫りになってきました。
・遅延が5秒程度ある。
・反応しない(エラーが発生する)場合がある。
・インターネットに接続されていないと制御できない。
どうしても一旦はWebを経由するため、この運用方法では不安定になりがちでした。
📡 SwitchBotAPI BLE
SwitchBot公式GitHubにBLEを介して通信するためのAPIが提供されています。
これを参考にして、サーバからBLE経由でBulbを制御します。
🐍 Python
UUID: ''cba20002-224d-11e6-9fb8-0002a5d5c51b''
Turn On Bulb REQ 0x570f470101
Turn Off Bulb REQ 0x570f470102
上記のRX characteristic UUID, REQをPythonスクリプト内に組み込みます。
REQは1バイトずつに区切ります。
ble_bulb.py
BLE通信でBulbを制御するための基本的なスクリプトです。
Bulbを複数使用することを考慮して、並列処理を行っています。
numpad_bulb_ctrl.py
テンキーでBulbを制御するために応用したスクリプトです。
お好みのキーマップに変更してください。
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スクリプトを実行するようにします。
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
[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
というエラーが発生することがあります。仕方ないね。
🔖 参考
Discussion