どうもこんにちは、ねじわさです。 家のスマートホームのコア部分であるラズパイの更新掛けてたら archive.raspberrypi.org が 20KB/s しか出なくてカーネルのダウンロードに 6 時間かかるやでって言われてキレ散らかしながらこの記事を書いてます。
ところで、みなさん IoT やってますか。いんたーねっつおぶしんぐすです。僕にはよくわかりません。がスマートホームは好きです。
とはいえ、家族が使う既存の家電をがちゃがちゃやるのは色々と面倒なので、自分の部屋の家電を隅から隅までスマホで操作できるようにしたり、みたいな事をやっています。
今回新たな餌食となるものは自室の鍵です。 普段そこまで使うものでもないですが、 まあなんか題材として面白そうというのとセールで謎に買った m5stick が余ってるのでここらへん組み合わせて超安価&雑スマートロックを作ってみました。
今回使用した食材はこちらです。
Homebridge については以前も書きましたが、Apple Homekit と TypeScript 製サーバーで色々なスマートホーム機器を非公式に連携させるものですが、 私は普段 Android スマートフォンを使用しているためhomebridge-gshを使用して Google Home に繋いで使用しています。
こういうものの一番の悩みが既存の物との接続部分で、 3D プリンターとかあれば楽勝なのかもしれませんが持ってないし技術も無いのでどうしようかな~~と思っていた所、 似たような物の先駆者がいらっしゃったので参考にさせて頂きました(ユニバーサルアームセットを購入しました): Raspberry Pi で開発したプロトタイプを実装する
M5StickC の方が更新作業とかめんどいので基本 M5StickC のファームウェアは触らない様な設計にする事を心がけました。
また、後述する M5Flow で最初から使用できる点とパフォーマンス的にも無駄が無さそうな点から、
双方向通信のプロトコルには MQTT を使用しています。
データとしてはとてもシンプルで、
update
: メッセージとして角度を送信する。toggle
: 解錠/施錠を更新して角度を Pub update で送り返す。toggle
: メインボタンをクリックしたら送信し、Homebridge 上の解錠/施錠をひっくり返して角度を送り返してもらう。update
: メッセージに入った角度を元にモーターを回す。とするように Homebridge 側で施錠/解錠時の角度や現在のステータスを持つようにしました。
Python はわからないので、M5Flow で適当に描きました。
TypeScript はわかるので、VSCode で適当に書きました。
ソースは nzws/homebridge-mqtt-smartlock にあります。
なんか当初思っていた 5000 兆倍はシンプルです。
サムターン部分は前述した記事を参考にさせて頂き、こんな感じに作りました。 端っこで出っ張っている部分は強力両面テープでドアに貼り付けるイメージです。
ほとんどネジで固定していて、サムターン部分に輪ゴム(ネジで固定できなかったため)、ドアとの接続部分と M5Stick のプラスチック部分には両面テープを使用しました。
M5Stick はこのようにプラスチックを貼り付けているだけで、本体側のネジの出っ張りを使用してはめ込んでいるだけなので、ケーブルを外すだけでメンテナンスができるようにしました。
貼り付け場所に少し手間取りましたが、接続部分の方向を固定しなかったこともありいい感じに設置できました。
また、M5Stick 自体はバッテリーが搭載されていますが、通常でも数時間しか持たず、 サーボモーターを使用すると恐らくそこまで持たないと思われるので、下にモバイルバッテリーをぶら下げるようにしてみました。こちらも結構いい感じです。
すごいあっさり動いてしまって若干びびりました。
一つ想定外だったのが、前述の通り私は普段 Homebridge 経由で Google Home を使用するのですが、 どうやら鍵の施錠/解錠は Google Home アプリからはまだできない様で、毎回音声入力は面倒なのでどうしようかなとなってしまいました。
そこで、homebridge-alexa を使用して Alexa を連携させてみた所、 Alexa は普通にアプリから解錠できたので Home アプリが対応するまではこちらを使用することにしました。
Alexa は初めて使いましたが使い勝手は普通に良かったです。
と、このように M5Stick はまじで IoT において用途無限大だと思っているので、いくつか持っておいて損は無いと思います。 みんな買いましょう: M5StickC - スイッチサイエンス