n番煎じですが、スマートロックを自作しました。
MESHボタンでの解錠/施錠が可能になりました
— Daiki Ebisawa 💪 (@d_ebi_k) January 20, 2020
これで宅配の応対時、手ぶらで応対してもロック解除できるのでいつでも対応ができますね#IoT pic.twitter.com/GHd5WluoNU
プラ棒とプラ板とサーボモータ、100均のネオジム磁石らしきもので構成されてます
— Daiki Ebisawa 💪 (@d_ebi_k) January 19, 2020
ラズパイで制御していますね pic.twitter.com/ZLU01OfIED
概要
ソースコード
GitHubにおいてあります。
https://github.com/d-ebi/smartlock
できること
- スマホのブラウザから開錠/施錠ができる
- Slackのbotにメッセージを送信してリモートで開錠/施錠ができる
- MESHのボタンタグから開錠/施錠ができる
なぜつくったのか
- 買い物帰りで両手がふさがっているとき、鍵探して刺して開けるのが結構辛い
- セサミ高い(1人暮らしなのでオーバースペックだと思った)
- サーボモーター使ってみたかった
- 持て余しているラズパイZero WHを有効に使いたかった
- 持て余しているMESHタグを有効に使いたかった
要件
- スマホから開け閉めができること
- 開け閉めしたらSlackに通知がくること
- 内側から操作するとき、物理錠同様に簡単に開け閉めができること
- 外から物理鍵でも開けられること
作ってみて
楽しかったですが、手が接着剤まみれになったり、中々に大変でした。セサミ買った方が楽ではあると思います。作ったことには後悔してないです。
ちなみに利便性の方ですが、スマートロック、これはとても便利なのでおすすめです。買い物後本当に楽になりました。
構成
ブラウザから操作するパターン
図
説明
BottleというPythonの超軽量Webアプリケーションフレームワークで作ったWebアプリケーションをラズパイ上で立ち上げています。スマホブラウザからラズパイのIPアドレスでアクセスができ、WebUIが表示されます(動画に写ってます)。あとはこれをタップすることで、鍵開けたり閉めたりができる、という単純なものです。鍵の開け閉めを行なった場合、Slackbotを介してSlackに開け閉めの通知が飛んできます。
このパターンでの開け閉めを行なうためには、スマホとラズパイが同じLANに属している必要があります。なので、家から出るときによく使いますね。
Slackbotを介して操作するパターン
図
説明
Slackbotに決められたメッセージをメンションすることで操作するパターンです。Web UIと違って文章を打たないといけないのでやや面倒なんですが、この後の「MESHのボタンタグから操作するパターン」で必要だったこと、自宅のWi-Fiを捕まえるのに若干時間がかかり、扉の前でもたついてしまうということがあり、同一LAN内にいなくても操作したいということで、このパターンで操作できるようにしました。
MESHボタンタグから操作するパターン
図
説明
あらかじめラズパイをMESHハブ化しておき、MESHボタンを1回押すとIFTTTを通しSlackに開錠メッセージを、MESHボタンを2回押すとIFTTTを通しSlackに施錠メッセージを飛ばすことで操作できます。物理鍵を直接操作することができなくなってしまったため、それの代わりですね。とっさの訪問に対応するために設置したやつです。MESHのレシピは本当に単純にSlackbotにメッセージをダイレクトメッセージで送っているだけなので、後の処理は「Slackbotを介して操作するパターン」と同じです。ただし、IFTTTからの投稿に対し、デフォルトでは反応してくれなかったため、下記を参考にライブラリに手を加えたりはしました。
IFTTTからslackに投稿した内容をpythonのslackbotライブラリが拾えない現象について - Qiita
まとめ
使ったサーボモータやもろもろは下記を参考にしました。
スマートロックを自作してAlexaに鍵を開けてもらう。 - Qiita
一番大変だったのは、内鍵の形状に合わせてプラ棒やプラ板を加工したところですね。ちょっとでも力が正しく伝わらないと上手く開かなかったり、設置するためのフレーム部分に干渉してしまったり、とにかく微調整の連続でした。このハードウェア部分の調整がかなり大変で、これを作るなら出来合いのものを買った方がいいな…と思いました。
とはいえ物を作るのは好きなので、そういう意味ではかなり楽しめたと思います。ソフトウェア部分も地味に汎用的に作ってあったり、久々に工夫を凝らして作れたと思います。