スマートロック「セサミ」をLINE Beaconで操作


はじめに

以前、NFCタグでスマートロック「セサミ」の解錠を実装しましたが、スマホ上でNode-REDを起動しなければならなかったり、スマホのロック解除をしないとNFCタグの読み取りができない事から使い勝手は微妙でした。

やはり位置情報での解錠がスマートな運用なのですが、AndroidスマホのGPS情報はiOSより安定しておらず、夜中に解錠してしまう方が続出しているようです。私のXperiaも同様に、Googleのロケーション履歴で位置情報がおかしな場所に飛んでいるのを確認しており、GPS情報は信用したくないので、解錠の手段としては論外としていました。
位置情報をどうするか模索する中、ふとローソンに入店したところ、LINEのローソンアカウトからメッセージが来る事に目をつけました。明らかにスマホのGPSより細かい精度で反応しており、どのような技術が使われているのか調べると、どうやら「LINE Beacon」というビーコンをローソン店舗で送信しており、ローソンアカウントをフォローしているアカウント(スマホ)がビーコンを受信すると、ローソンのボットアカウントがトークメッセージを送る仕組みになっているようでした。

スマートロックの解錠に使えるのではないかと考え、Raspberry Pi Zero WをLINE Beaconにし、自宅のボットアカウントをフォローしている端末がビーコンを受信すると解錠するように実装してみます。

環境

外部サービスの設定

「Sesame API」

公式ドキュメントにて設定。
APIまで設定は必要ないかもしれません。アカウントの作成とセサミの認識は必要かもしれません。

「IFTTT」

IFTTTは標準でSesameの施錠/解錠/状態確認をサポートしています。「CANDY HOUSE Dashboard」へのログインが必要です。
以下のように、「Webhook」から「Sesame」を解錠するアプレットを作成しておきます。

IFTTTで作ったWebhookのURLは、IFTTTの『Webhooks』の使い方を例題で簡単説明【初心者向け解説】を参考にしました。

「Raspberry Pi Zero W」 と 「LINE Developers Messaging API」

主に偉大なる先人達の記事を参考にしました。『Raspberry Pi Zero W を LINE Simple Beacon にしてしまう』が纏まっており、非常に参考にさせていただきました。若干食い違う部分(ハードウェアID払い出しのURL)は、LINE Developersのドキュメントを参照しました。
Webhook URLは、IFTTTで作ったURLを入力しました。

「接続確認」でセサミが解錠される事を確認しておきます。

「Node-RED Alexa Home Skill Bridge」

Node-RED Alexa Home Skill Bridge で、「いってきます」と「ただいま」を作成しています。

既に何か不在になるイベントで動作させているものがあれば、代替え可能だと思います。

LINE Beaconの特性と解錠ロジック検討

LINE Beaconは範囲の中にいる際に、何度もイベントが発生するようです。
イベントが発生する度にセサミを解錠されては困るので、我が家のスマートホーム環境では、以下のように外出時だけLINEビーコンを送信させています。

 1)アレクサへの「いってきます」イベントをNode-REDで拾う
 2)イベントの5分後に、LINEビーコンを送信開始
 3)帰宅時にLINEビーコンを受信
 4)セサミを解錠
 5)アレクサへの「ただいま」イベントをNode-REDで拾う
 6)LINEビーコンの送信停止

「セサミを施錠」の動作は含めていません。
私も1度何も持たずにオートロックに締め出された経緯があり、奥の手で郵便受けから大声でアレクサに解錠させました。それ以来、手動施錠(アプリから)しています。
よくよく考えると、鍵かけたか不安になっても、施錠まで自動にしてもあまり便利ではないんですよね。アプリからリモートで施錠確認と施錠ができればそれでいいんです。

作り込み

上記の記事のシェルを第1引数に "on" か "off" を渡して動作を変えるよう作ります。
私はrootユーザでシェルを作っています。Node-REDもハードウェアを扱う場合は色々権限が面倒なので、最初からrootユーザで起動させています。

# cat linebeacon.sh 
#!/bin/bash

if [ "$1" == "on" ]; then
  HWID='01 xx xx xx xx'
  ADVERTISE_DATA="13 02 01 06 03 03 6F FE 0B 16 6F FE 02 ${HWID} 7F 00"
  hciconfig hci0 up
  hcitool -i hci0 cmd 0x08 0x0008 ${ADVERTISE_DATA}
  hciconfig hci0 leadv 3
else 
  if [ "$1" == "off" ]; then
    hciconfig hci0 down
  else
    hciconfig | grep -w DOWN | wc -l
  fi
fi

Node-RED側のフローは以下のようにしています。かなり不恰好です。
アレクサのイベントを拾っている家電制御用のNode-REDは別にあるので、そこからWebhookでイベント受信しています。

書き出したコードは以下です。

[{"id":"d8f2b9a5.2572e8","type":"exec","z":"4b6477de.479d28","command":"/root/bin/linebeacon.sh ","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":760,"y":130,"wires":[["1e1a51e.dfa3eae"],[],[]]},{"id":"1e1a51e.dfa3eae","type":"http response","z":"4b6477de.479d28","name":"","statusCode":"200","headers":{"content-type":"text/plain"},"x":990,"y":130,"wires":[]},{"id":"43dcf9e9.a131d8","type":"http in","z":"4b6477de.479d28","name":"","url":"/beacon","method":"get","upload":false,"swaggerDoc":"","x":90,"y":120,"wires":[["e9d3e605.575ec8"]]},{"id":"e9d3e605.575ec8","type":"function","z":"4b6477de.479d28","name":"","func":"\nmsg.payload = msg.payload.switch;\n\nreturn msg;","outputs":1,"noerr":0,"x":240,"y":120,"wires":[["e1aa6ec5.ee47c"]]},{"id":"e1aa6ec5.ee47c","type":"switch","z":"4b6477de.479d28","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"},{"t":"eq","v":"status","vt":"str"}],"checkall":"false","repair":false,"outputs":3,"x":370,"y":120,"wires":[["476e96d6.efeca8"],["d8f2b9a5.2572e8"],["d8f2b9a5.2572e8"]]},{"id":"476e96d6.efeca8","type":"delay","z":"4b6477de.479d28","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":530,"y":90,"wires":[["d8f2b9a5.2572e8"]]}]

呼び出し元のNode-REDのフローは以下のようにしています。

コードは載せられませんが、「ビーコン送波」のノードは以下のような設定です。
全然関係無いですが、最近のBRAVIAってREST APIで制御できたりするんですね...

うまく繋がれば、ロジックどおりの思惑でセサミが解錠されます。
ビーコン自体は電池駆動のセサミ本体でも実装できそうなので、是非スマートロック開発元は最初からビーコンでの解錠機能を付けていてほしいです。