スマホ無しでマンションのオートロック開錠と部屋のドア開錠をしたい

こんにちは、新卒4年目の野地です。もうすぐ5年目...。

趣味でマラソンをやっていて、昨年8月末の北海道マラソンで初のサブ3、10月末の金沢マラソンにてサブエガ(フルマラソンで2時間50分切り)を達成しました。

練習するほど記録が伸びるので楽しいです。
そろそろ止まりそうですが...

さて、今回はスマートホーム化についてです。

スマートロック導入で浮上するマンションの課題

スマートロックを導入すると、部屋のドアをスマホやカードキーで簡単に解錠できるようになります。
特に外出先から遠隔で鍵を開けたり閉めたりできる便利さが魅力です。

しかし、マンションのエントランスがオートロックの場合、スマートロックだけでは部屋に入る前のエントランス解錠が課題となります。

SwitchBotでエントランスも解錠可能に

この課題の解決方法として、SwitchBotを使うのがメジャーです。
「スマートロック マンション オートロック」「スマートロック マンション エントランス」などで検索すればやってる人の記事や動画がたくさん出てきます。

SwitchBot エントランスから完全キーレスセットwww.switchbot.jp

SwitchBotは、物理的なボタンを押す機能を持ったスマートデバイスです。
これを部屋内のエントランスと通話ボタン、解錠ボタンに設置し、スマホで操作できるように設定します。
スマホがあればエントランスの解錠も部屋のドアの解錠もどちらも遠隔で操作できるようになり、鍵を使う必要はなくなります。

しかし、この解決策にはまだ課題が残ります。それは「常にスマホを持ち歩く必要がある」という点です。
鍵をスマホに置き換えただけとも言えます。

スマホなしでも家に入れる仕組みを考える

冒頭にも書いたように、私は趣味でランニングをしています。
ランニング中は身軽でいたいので、できるだけスマホや鍵を持たずに外出し、そのまま家に入れる仕組みを作りたいのです。

「手ぶらで気軽に走りに行き、帰宅できる」ことを目指して、新しい解決策を考えることにしました。

スマートスピーカーでインターホン対応を実現

ネット上でもやりたいことに近いことを実現している人がいました。

3190212 徳永 優也 (Sound Lock) – IoTメディアラボラトリー

しかし、ラズパイ、マイク、サーボモーターなどを自分で用意して組み上げて...というのは少しハードルが高い。

仕組みを参考にしつつ、最終的にたどり着いたのが
スマートスピーカー + SwitchBot + スマートロック
という方法です。

  1. エントランスで部屋番号呼出
  2. 部屋内のインターホン音にスマートスピーカーが反応、SwitchBotが通話ボタン押す
  3. エントランスからパスワードを言う
  4. インターホン経由でスマートスピーカーがパスワードを受け取り、あらかじめ設定していたものと同じならSwitchBotが開錠ボタン押す
  5. 部屋のドアのスマートロックを開錠する

インターホンとSwichBotとAmazon Echo

実現方法詳細

スマートスピーカーとしてAmazon Echoを使用しました。

Amazon Echoではよくあるスマートスピーカーの起動コマンドである「Alexa、○○して」など以外にも、家電の通知音をトリガーにしたり、別途センサーを購入すれば人が近づいたことをトリガーにしたりして、「スキル」を使用することが出来ます。

「スキル」とはAlexa向けのアプリのようなもので、Alexaで検知できるものをトリガーにして起動し、発話やAPI呼び出しなど、様々なことが出来ます。

developer.amazon.com

実体はAWS Lambdaのようで、自分で作ること、及び一般に公開などもできるようです。

当社マネックス・ラボでもスキルを開発・公開したことがあるようです

blog.tech-monex.com

 

今回は言われたパスワードに応じたAlexaのレスポンス+SwitchBotのAPIコールを行いたかったので↓のような実装をしました。

const PasswordIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'PasswordIntent';
    },
    async handle(handlerInput) {
        const spokenPassword = handlerInput.requestEnvelope.request.intent.slots.password.value;
        const correctPassword = '1234'; // 正しいパスワードを設定
        if (spokenPassword === correctPassword) {
            try {
                // 最初のリクエスト(オートロックの解錠)
                const firstResponse = await makeRequestWithRetries(deviceId02, body01);
                console.log('First operation successful:', firstResponse);
       
                // 2番目のリクエスト(玄関ロックの解錠)
                const secondResponse = await makeRequestWithRetries(deviceId03, body02);
                console.log('Second operation successful:', secondResponse);
               
                return handlerInput.responseBuilder
                    .speak('正しいパスワードです。ドアを開けました。')
                    .getResponse();
            } catch (error) {
                return handlerInput.responseBuilder
                    .speak(error.message)
                    .getResponse();
            }
           
        } else {
            return handlerInput.responseBuilder
                .speak('入力されたパスワード' + spokenPassword + 'は間違っています。処理を終了します。')
                .withShouldEndSession(true)
                .getResponse();
        }
    }
};

これにより、スマホも鍵も持たずにランニングへ行き、帰宅する際には音声で簡単に家に入れるようになりました。

※パスワードはデモ用の例です。セキュリティ面に気を付けてください。
・数字4桁でなくても構いません。Alexaが音声認識できればもっと複雑なほうが良いでしょう。
・平文のパスワードをハードコードするのも良くないです。
・パスワード入力されたらLINE通知するなど、別角度からのアプローチもあります。

以下はデモ動画です

https://drive.google.com/file/d/1VsWy5BBNco_iGWGdP-1HjuW0wD_FsaET/view?usp=sharing

結局...

この仕組みを作った後にマンションの改修工事があり、エントランス横の自転車用のドアが暗証番号で開くようになりました。

また、スマートロックの電池が弱くなったのかなんなのか、回転が引っかかって開けられないことが多くなり、ついには電池が切れました。

スマートロックの設置しなおしなどが面倒で、いまは稼働させていません。
結局毎回物理鍵を持って走りに行っています。

近いうちに気合い入れて全体をセッティングしなおします…。