Switchbot カーテンをRaspberry Piで動かしてみた

この記事はIoT LTアドベントカレンダー25日目の投稿です

今年はIoTLTで登壇したのは、記念すべき100回目の時だけでした

speakerdeck.com

(久々に見てたら今年公開したスライドの中でかなりたくさんの人に見られててかなり話題性あったことを物語ってますね)

実はあれから半年たち、名古屋市内に引っ越してついにれっきとした名古屋市民になりましたw

で僕が住んでいるマンションの近所では新たなマンションが絶賛建設中です。そのマンションにはこんな広告があります

最近はIoT対応のマンションも増えているようですが、今僕が住んでいるところはIoTという概念どころかインターネットが世に出始めたぐらいの20年以上昔に建てられた物件です

そういうところだからこそ自作でホームハックしがいがあるわけです

というわけで前置きが長くなりましたが、その一環として今回はSwitchbotカーテンを設置して実際に運用してみました

今回買ったもの

今回買ったデバイスは内側に車輪が入っているレールのカーテンに対応したモデルです。中のカーテンレールのサイズに合わせて車輪の大きさが調整できるようにアタッチメントも付属しています。

自宅のカーテンレールに対しては特にアタッチメントつけなくてもすんなり設置ができました。

設置ができたらアプリで2台のデバイスをグループ化させてキャリブレーションすればアプリ上でカーテンの開け閉めができるようになります

アプリを使わなくても手で開けることもできます

www.youtube.com

Raspberry Piで動かしてみる

ここまでできたところで本題です。

今度はRaspberry Piでハックしていきます。

SwitchBotシリーズはBLEのAPIがオープンになっており、プログラムで操作することができます。

そして、そのAPIでデバイスを操作するためのコードもGithubで公開されています

github.com

公式ではPyBluezを使った switchbot_py3.py のセットアップ方法が紹介されていますが、バグがあるようで動きません。そして、中で使われているgattlibのビルドも失敗します…

同じ現象のissueは立ってましたが、Openされたまま放置されてますね…

github.com

というわけでこのissueの回答通り switchbot_py2topy3.py を使ってみます。

こっちはbluepyを使ったコードになっており、セットアップはさほど難しくありません。

実行環境

セットアップ

基本的にはbluepyと同様のセットアップ方法で問題なさそうでした。

sudo apt-get install python3-pip libglib2.0-dev
sudo pip3 install bluepy

追加でSwitchbotを操作するスクリプトで必要になるライブラリもインストールします。

sudo apt-get update
sudo apt-get install python3-pexpect
sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev 
sudo apt-get install libudev-dev libical-dev libreadline-dev

動かしてみた

以下のコマンドを実行することでデバイスをスキャンします。

sudo python3 switchbot_py2topy3.py

スキャンが終わると以下の通りデバイスMACアドレスとそのコマンドがリストアップされます。

 0 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Open']
 1 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Close']
 2 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Pause']
 3 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Pause']
 4 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Open']
 5 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Close']

あとはリストアップされたコマンドの中で実行したいコマンドを番号で指定するとカーテンを操作できるようになります

ちなみに↑のポストのように2台同時に開閉するにはアプリのデバイス設定で確認できる「デバイス情報」のMACアドレスを選択すると操作できます。

これで接続、動作確認ができれば以下のコマンドでデバイスの操作ができます。

sudo python3 switchbot_py2topy3.py xx:xx:xx:xx:xx:xx Curtain [Close / Open]

あとはCronとかを使ってカーテンを自動で開閉する操作をRaspberry Piで実装できます

まとめ

今回はSwitchBotカーテンを使って自宅のカーテンを自動開閉できるようにしてみました。

実際にRaspberry PiにCronを仕込んで起床時間にカーテンを開けて帰宅前にカーテンを閉めるように操作してますが、ちょっとした操作が快適になった気がします!

久々にBLE周りのセットアップしましたが今までできたセットアップができなくなるなどのクセがあるので、他で使い回せるようにOS自体をバックアップするとか対策を取らないといけない気がしてきました。