Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

LDKのカーテンの自動化(3):Switchbotカーテン3とHome AssistantのBT接続のラグを改善する

Sympapaです。
この記事は前回の"LDKのカーテンの自動化(2): 両開きカーテンのSwitchbotカーテン3をHome Assistantから左右別々に動かす"のつづきです。
sympapa.hatenablog.com



Switchbotカーテン3は2台を両開きカーテン設定出来るのですが、それをすると
Switchbot Bluetoothインテグレーションを使って接続したHome Assistantから左右別々にカーテンを操作することが出来ず片方だけを開けるといったことが出来ません。
前回の記事では、両開きカーテンに取り付けたSwitchbotカーテン3をHome Assistantから左右別々に操作できるように2台のSwitchbotカーテン3を片開き設定にし、Home Assistant側で左右別に任意のカーテン開度のプリセットを作成してワンタッチで呼び出せるようにしました。


しかし、私がhome Assistantのサーバーとして使っているラズパイ4とSwitchbot bluetoothインテグレーションを使って接続したSwitchbotカーテン3の相性(?)はよろしくなく、操作からSwitchbotカーテン3が動作するまでに2~3」秒のラグがあり、特に片開きカーテンに設定にした2台のSwitchbotカーテン3に対して連続で操作すると、先に操作した方が動作し始めてから5~10秒後に後で操作した方が動き始めるというかなりのラグが生じました。
例えば左右全閉の状態から左右全開のプリセットを呼び出した場合、右のカーテンが動き初めてからかなり遅れて左のカーテンが動き始めるので、「本当に正しくプリセットを選択できたのか?」というプチストレスが発生します。


過去にhome AssistantにSwitchbotの指ボットを接続した時はもっとラグが大きく動かない時さえあり、試しに別のラズパイ4にhome Assistantをインストールして試したらラグが小さかったので、ラズパイ4の個体によって相性があるのかもしれません。ググるとやはり一部の人はラグの問題を抱えているようです。


そんなワケで今回はSwitchbotカーテン3(というかSwitchbotデバイス)とHome Assistantをbluetooth接続した際のラグの改善にトライしていこうと思います。

■Home Assistantに標準で用意されたSwitchbotデバイスの接続方法について

Home AssistantにはSwitchbotデバイスを接続するインテグレーションが標準で用意されています。
ひとつめはSwitchbotデバイスを直接Bluetoothで接続できるSwitchbot Bluetoothインテグレーションです。Switchbotカーテン3にも対応しています。
今回はこれを使ってSwitchbotカーテン3を接続しているワケですが、ラグの問題が発生しています。
www.home-assistant.io
もうひとつはSwitchbotハブを使ってクラウドAPI経由で接続するSwitchBot Cloudインテグレーション。しかしこちらはSwitchbotカーテン3には非対応です。
www.home-assistant.io

■BTドングルを試す

ラズパイ4本体のBluetoothがよろしくないならUSBのBTアダプタ付ければ改善されるんじゃね?って単純に思って、ラズパイに4にUSB接続のBTドングルを取り付けてみました。使用したBTドングルは、Home AssistantのBluetoothインテグレーションのページで動作確認済みとされているPLANEX BT-Micro4です。
結果、1台のSwitchbotカーテン3を操作した時のラグはちょっと改善した気がしますが、2台のSwitchbotカーテン3に対して連続で操作した時に後で操作したSwitchbotカーテン3が大きく遅れて動き出す問題は解決しませんでした。

■最新情報をググる

過去にSwitchbot指Botを接続した時のラグ対策について色々ググってはいましたが、最新の情報を確認してみます。
するとこんな記事をみつけました。
cozycodes.net


Switchbot MQTTというHome Assistantのアドオンを使うとラグが少ないとのこと。
しかし、クラウドAPI経由だし、もうひとつ別のアドオンをインストールしたりで設定がやや大変そう。。。
それにZigbee2MQTTをがっつり使ってはいるけど、MQTTってあんま良く理解できていないのです(汗)


あとは似て非なるものでSwitchBot-MQTT-BLE-ESP32ってのをこの記事の中で見つけました。
smarthomescene.com
こっちはESP32を使ってBT通信しローカルで完結するやつですね。でもこっちもMQTT。。。

■ESP HOMEのbluetooth ploxyを試す

更に調べていると、Home Assistantのbluetoothインテグレーションのページにこんな記述がありました。
「多くの場合、直接接続されたアダプタやカードよりも、ESP32 を使用した (ESP Homeの)Bluetooth proxyを使用する方がよい方法です。Linux カーネルの更新によりBluetooth 機能や Bluetooth ドライバのサポートが以前から中断されていたためです。」
なるほどードライバーのサポートの問題ならばUSB BTドングルを使っても厳しそうな気がします。
esphome.io


で、Bluetooth proxyが何なのかというと、Home AssistantとWiーFiで通信するワイヤレスBluetoothレシーバーをESP32で作ってやろうって感じのものでESP32内臓のBluetoothを使用します。
Bluetoothバイスがどこにあっても近くに置いてBT通信できるというメリットもありますが、3台同時にアクティブ接続をサポートしている的なことが書かれているのでそれも「良い方法」とされている理由かもしれません。


そしてBluetooth proxyを提供してくれているESP Homeが何なのかというと、公式の説明では「シンプルでありながら強力な構成ファイルを使用してマイクロコントローラーを制御し、ホームオートメーション システムを通じてリモートで制御するシステムです。」だそうです。
ESP32やESP8266などのマイコンにフツーのスマートホームシステムの既製品にはないようなセンサーを繋いでスマートホームシステムで使えるようにしたり、GPIOの入出力を使ったデバイスの制御を「比較的」簡単に出来るようにするツールです。「比較的」です(笑)
色々なコンポーネントへの対応が用意されていて、設定さえyamlに書いてやればコンパイルしてファームを焼いてくれるといったものです。よーわかりませんが(汗)
Home Assistantと同じNabucasaが運営していて、Home Assistantと簡単に連携できるのも良い点です。
esphome.io


Home AssistantへのESP Homeの導入方法については、過去のこの記事で書いてます。
sympapa.hatenablog.com


そんなワケでHome Assistant公式がおススメしてるんだから試さなくては、ってことでESPhomeのBluetooth ploxyを試すことにしました。
ここのページを参考にして既にESP HomeでLDKのCO2計測に使っているESP32にBluetooth ploxyに関する記述を足してみました。
www.creatingsmarthome.com
captive_portal:より前のWi-Fiとか同じレベルに下のコードを足します。

esp32_ble_tracker:
  scan_parameters:
    interval: 1100ms
    window: 1100ms
    active: true

bluetooth_proxy:
  active: true


それをESP32に書き込みしてみたのですが、エラーも吐かなければ何の反応もなくウンともスンとも言いませんでした。


前述の参考にしたページの手順に「うまくいくとインテグレーションのページでbluetooth proxyが検出される」と書かれていたのですがそれが検出されなかったのと、書き込み直後にカーテン3を操作したところ動作が改善されていなかったので「何か失敗してるな」と思っていました。
その後、用事があって時間が無くなったので放置し用事を済ませてからSwitchbotカーテン3を動かしてみると。。。ラグが改善されてるー!


念のため、さっき追加したBTドングルは取り外してそれに適用していたBluetoothインテグレーションを削除し、ラズパイ本体のBluetoothアダプタに適用していたBluetoothインテグレーションも削除してHome AssistantからSwitchbotカーテン3を動かしてみましたがラグはありません。
更にBluetooth ProxyをインストールしたESP32の電源を抜くと、Home Assistantから操作してもSwitchbotカーテン3が動かないことも確認できました。
ちゃんとBluetooth Proxyが働き、そのおかげでラグが改善されたってことになります。
導入のポイントは「果報は寝て。。。(笑)


ちなみにBluetooth Proxyのページによると「このコンポーネントの名前はbluetooth_proxyですが、BLE デバイス (およびその Home Assistant 統合) のみがサポートされていることに注意してください。単なる Bluetooth Proxyである ESPHome ノードを作成する場合は、Bluetooth プロキシ インストーラーのWeb サイトを参照してください。」って説明されているので、上記のやり方ではBLEデバイスにしか対応しないようです。
単なる(?)Bluetooth proxyはこちらのようですが、何故かいきなりインストーラーでインストールしろって感じなのが不思議。。。何か特殊なんかな?
esphome.io

■結果は

結果はとてもマルでした!
Switchbotカーテン3を1台操作した時のラグは、アプリからBT接続で操作した時のソレと変わらないかむしろ早いと感じるくらいです。
Switchbotカーテン3を2台連続操作した時の、後で操作した方が動き出すまでのラグについては1台目が動き始めてからコンマウン秒しかありません。
試しに、もう使っていなかったすこぶるラグがあって安定性も悪かったSwitchbot指ボットも(電池が切れていたのでわざわざ電池を買って(笑))試してみましたが、こちらも1秒以内に動作し、かつ確実に動くようになりました。指ボットの方はラグと動作の確実性の面で全く使えないレベルだったのでめちゃめちゃ大きな改善です。
Switchbot以外のメーカーのBluetooth接続デバイスにもきっと恩恵があると思います。

■まとめ

今回は、Switchbotカーテン3をHome AssistantとBluetooth接続した場合のラグをESP HomeのBluetooth Proxyを使って改善したというお話でした。
Switchbot指botのラグも大幅に改善されたので、Switchbotデバイス(あるいは他のBT接続デバイス)をHome AssistantとBluetooth接続したデバイスのラグや安定性で困っているって方は試してみると御利益が得られるかもしれません。
それでは、アーメン。


Switchbotカーテン3ネタはこれにておしまい。