Switchbotで受話器を上げて解錠ボタンを押す
「RaspberryPiでSwitchbotを動かす」で家の玄関を開けようと思ったが、セキュリティの問題があったので止めた。
別の活用方法としてマンションのエントランスのオートロックを解除することにした。
エントランスからSwitchbotまではBluetoothが届かないのでセキュリティ問題はクリア。
仮にエントランスを開けることができたとしても部屋の鍵は開けられないので良しとする。
やりたいこと
- エントランスの鍵を忘れて家を出てしまったときに詰むのを防ぎたい
- 普段使いするものではなく緊急時用
- エントランスの鍵を開けるには受話器を上げてから解錠ボタンを押す必要がある
実現方法
ハードウェア
Switchbotを2個組み合わせて以下を実現した。
- 受話器を上げる
- 解錠ボタンを押す
難しかったのが受話器を上げる部分で、Switchbotのモータでは受話器を上げる力がないので擬似的に受話器を下げた状態を作ることにした。
受話器のボタンと引っ掛け部分の間にスポンジを挟んで受話器が下がっているのと同じ状態にする。
受話器のボタンに両面テープのフックを取り付けて、Switchbotを引き上げるモードにすると引き上げている間は受話器が上がっている状態になる。
この状態でもう一個のSwitchbotで解錠ボタンを押すとエントランスのドアが開く。
文章で書くと分かりづらいが写真だとこんな感じになっている。
Switchbotアプリの設定で15秒間引き上げるとSwitchbotが元の位置に戻るようにしている。
ソフトウェア
API作成
python-hostを呼び出すNodeアプリケーションを用意する。
const express = require('express')
const exec = require('child_process').exec
const app = express()
app.get(`/open`, (req, res) => {
// 受話器を上げる
exec('sudo python3 switchbot_py3.py --device XXXX --command on')
// 解錠ボタンを押す
exec('sudo python3 switchbot_py3.py --device YYYY --command press')
res.send('ok')
})
app.listen(3000, () => console.log('app listening on port 3000'))
このAPIをinletsを使って外部からアクセスできるようにする。
試してはいないけどinletsの代わりにArgo Tunnelを使うこともできそう。
APIを呼ぶ
あとは何かしらの方法で上記のAPIを呼び出せば完成。
今回はIFTTTを使って、
- GoogleAssistantをトリガーにして
- WebhooksでAPIにHTTPリクエストを送る
ようにした。
まとめ
これでようやくGoogleAssistantに「玄関開けて」と言うと鍵が開くようになった。
ただ、鍵を開けるためにはまずエントランスで部屋番号を入力して呼び出しをしたあとにGoogleAssistantに話しかける必要があり正直手間ではある。
最初に普段使いするものではないと書いたのはこれが理由。
とはいえこれで、鍵を忘れたまま家を出たとしてもなんとかなるようになったので安心して外に出れるようになった。(スマホも忘れると詰むけど)