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

#はじめに
以前、[NFCタグでスマートロック「セサミ」の解錠](https://qiita.com/Y-Shikase/items/deb9df332f09adebbe7e)を実装しましたが、スマホ上でNode-REDを起動しなければならなかったり、スマホのロック解除をしないとNFCタグの読み取りができない事から使い勝手は微妙でした。

やはり位置情報での解錠がスマートな運用なのですが、AndroidスマホのGPS情報はiOSより安定しておらず、夜中に解錠してしまう方が続出しているようです。私のXperiaも同様に、[Googleのロケーション履歴](https://www.google.co.jp/maps/timeline)で位置情報がおかしな場所に飛んでいるのを確認しており、GPS情報は信用したくないので、解錠の手段としては論外としていました。
位置情報をどうするか模索する中、ふとローソンに入店したところ、LINEのローソンアカウトからメッセージが来る事に目をつけました。明らかにスマホのGPSより細かい精度で反応しており、どのような技術が使われているのか調べると、どうやら「[LINE Beacon](https://developers.line.biz/ja/docs/messaging-api/using-beacons/)」というビーコンを[ローソン店舗で送信しており](http://www.lawson.co.jp/lab/tsuushin/art/1375693_4659.html)、ローソンアカウントをフォローしているアカウント（スマホ）がビーコンを受信すると、ローソンのボットアカウントがトークメッセージを送る仕組みになっているようでした。

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

#環境
- ハードウェア
 - Raspberry Pi Zero W (ビーコン送信用)
 - Xperia XZ1 (LINEインストール&設定済み)
- サービス
 - [LINE Developers](https://developers.line.biz/console/) Messaging API  
 - [IFTTT](https://ifttt.com/)
 - [CANDY HOUSE Dashboard](https://my.candyhouse.co/) Sesame API
 - [Node-RED Alexa Home Skill Bridge](https://alexa-node-red.bm.hardill.me.uk/)

#外部サービスの設定
#### 「Sesame API」
[公式ドキュメント](https://docs.candyhouse.co/#sesame-api-tutorial)にて設定。
APIまで設定は必要ないかもしれません。アカウントの作成とセサミの認識は必要かもしれません。

#### 「IFTTT」
IFTTTは標準でSesameの施錠/解錠/状態確認をサポートしています。「CANDY HOUSE Dashboard」へのログインが必要です。
以下のように、「Webhook」から「Sesame」を解錠するアプレットを作成しておきます。
![スクリーンショット 2019-06-23 16.04.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/38fa5c02-498b-4697-320b-caa705080c43.png)

IFTTTで作ったWebhookのURLは、[IFTTTの『Webhooks』の使い方を例題で簡単説明【初心者向け解説】](https://ifttt-japan.club/apply-webhooks)を参考にしました。

#### 「Raspberry Pi Zero W」 と 「LINE Developers Messaging API」
主に偉大なる先人達の記事を参考にしました。『[Raspberry Pi Zero W を LINE Simple Beacon にしてしまう](https://qiita.com/torisankanasan/items/e258ee0ecfc10fb442a7)』が纏まっており、非常に参考にさせていただきました。若干食い違う部分（ハードウェアID払い出しのURL）は、[LINE Developersのドキュメント](https://developers.line.biz/ja/docs/messaging-api/using-beacons/)を参照しました。
Webhook URLは、IFTTTで作ったURLを入力しました。
![スクリーンショット 2019-06-23 16.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/9f97ce47-5a30-05b7-3e4c-058704956bae.png)
「接続確認」でセサミが解錠される事を確認しておきます。

#### 「Node-RED Alexa Home Skill Bridge」
[Node-RED Alexa Home Skill Bridge](https://alexa-node-red.bm.hardill.me.uk/) で、「いってきます」と「ただいま」を作成しています。
![スクリーンショット 2019-06-26 21.06.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/21c01ca9-3d3d-7087-e27c-08f8cccdfde6.png)

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

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

　１）アレクサへの「いってきます」イベントをNode-REDで拾う
　２）イベントの５分後に、LINEビーコンを送信開始
　３）帰宅時にLINEビーコンを受信
　４）セサミを解錠
　５）アレクサへの「ただいま」イベントをNode-REDで拾う
　６）LINEビーコンの送信停止

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

## 作り込み
上記の記事のシェルを第１引数に "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でイベント受信しています。
![スクリーンショット 2019-06-26 21.39.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/904c7091-bef6-7f80-c653-26cc5d5a0852.png)
書き出したコードは以下です。

```json:
[{"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のフローは以下のようにしています。
![スクリーンショット 2019-06-26 21.49.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/a44e2970-d4e0-3a15-d43c-cde34f6018b2.png)

コードは載せられませんが、「ビーコン送波」のノードは以下のような設定です。
全然関係無いですが、最近のBRAVIAってREST APIで制御できたりするんですね...
![スクリーンショット 2019-06-26 21.50.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/b92c8ddc-aca9-76e9-3757-558585f3bc16.png)

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