「あれ？ 家の鍵かけたっけ？」から安全に開放されるための技術

# :christmas_tree: はじめに

本記事はCiscoの有志による Cisco Systems Japan Advent Calendar 2021 (一枚目) の 10 日目として投稿しています。

- 2021年版(一枚目): https://qiita.com/advent-calendar/2021/cisco
- 2021年版(二枚目): https://qiita.com/advent-calendar/2021/cisco2
- 2020年版(一枚目): https://qiita.com/advent-calendar/2020/cisco
- 2020年版(二枚目): https://qiita.com/advent-calendar/2020/cisco2
- 2019年版: https://qiita.com/advent-calendar/2019/cisco
- 2018年版: https://qiita.com/advent-calendar/2018/cisco

このネタは、わたしが自宅で使うために考えました。

# :memo: TL;DR
- **家から離れたら** :runner: 玄関を自動的に施錠する :door::lock: 仕組みを作りました
    - 一定時間後に施錠するようなオートロックには幾つかの問題があります
    - スマホのアプリによって位置情報を活用したオートロックは電池が心配です
- この記事では **スマホにアプリを入れることなく** **家から離れたら** 自動で施錠するような安全なオートロックを目指します
    - できるだけオンプレに設備を用意せずにクラウドで完結する仕組みにしました

# :boom: 背景
- 廃車寸前の車を知人から 0 円で譲り受け、サビを削り塗装を塗り直し、新型コロナ渦における貴重な移動手段として活用し始めました :blue_car:
- わたしはよく**「玄関の鍵かけたっけ :worried:」**と心配する性格なのですが、徒歩ならともかく、車で出発した後にわざわざ家に戻るのは大変面倒です :disappointed_relieved:
- そこでスマートロック [SESAME 3](https://jp.candyhouse.co/products/sesame4) を取り付けてみました
    - 「＊分で自動的に施錠する」オートロック機能が備わって大変喜びました :laughing:
    - 喜んだのもつかの間、*大事件が起こりました* :fire:
- **玄関先でゴミ捨て作業をしていたら家から締め出されました** :tired_face:
    - 鍵もないスマホもない状態のため、本当にひどい目にあいました
    - *マスクも着けていない私に固定電話を貸してくださった御近所の方に、この場を借りて心からお礼申し上げます* :mask:

## :fire: 解決したい問題
- 世の中のスマートロックは「オートロック」の機能を備えていますが、**一定時間解錠されていること**をトリガにしていることが殆どです
    - そのため**ドアが実際には閉じられていないのに鍵だけ回ってしまう**場合や、**時間によって問答無用で施錠されてしまう**など、意図しない「施錠」状態を作ってしまうことがあります
- そこで今回は時間によらず「ある程度家から**離れた**:runner:」ことをトリガにする仕組みを簡単に作ってみます
    - 先行事例では、スマホ :iphone: を活用する例が多く見つかりました
        - たとえばメーカーが提供するアプリが定期的に位置情報を確認して施錠してくれたり、[Tasker](https://tasker.joaoapps.com/) を使った自動化など
        - しかしスマホの電池 :battery: がガリガリ削られていくのが心配なので、できるだけスマホに頼らない方法を考えたいと思います

# :eyes: At-A-Glance

![At-A-Glance](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/ef598a24-eef5-24fa-db35-6e3a6ea298d1.png)


# :muscle: 課題を解決する技術, 製品

## BLE Scanner: Cisco Meraki

![Cisco Meraki](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/427eb3ed-b7e6-eda8-3022-5bbd7d95f152.jpeg)

[Cisco Meraki](https://www.cisco.com/c/m/ja_jp/meraki.html) は**クラウド管理型ネットワーク製品**です。一般的な無線 LAN アクセスポイントは、それぞれの機器で設定を行ったり、無線 LAN コントローラ (WLC) と呼ばれる集中管理装置を用います。一方で、Cisco Meraki は全てクラウド側で管理を行います。例えば[無線 LAN アクセスポイント](https://www.cisco.com/c/m/ja_jp/meraki/products/wireless.html)では、SSID の設定や「今誰が繋がっているのか？」といった運用監視さえも、全てクラウドで提供される Web インターフェイスから行います。

MR20/MR70 以外の全ての Cisco Meraki **無線 LAN アクセスポイントは、Bluetooth のインターフェイスを持っています**。今回は**受信 (スキャナ) 機能**を使いますが、送信 (AP がビーコンになる) 機能も搭載しています :satellite:

[検証機プレゼント付きのウェビナー](https://www.cisco.com/c/m/ja_jp/meraki/webinars.html)もあるらしいので、興味がある方は是非ご参加ください :gift:

### Webhooks

![Webhooks](https://documentation.meraki.com/@api/deki/files/231/webhooks1.png)

クラウドにコントローラがあるおかげで (?) ネットワーク機器のアラートを [Webhook として外部に送信する機能](https://documentation.meraki.com/General_Administration/Other_Topics/Webhooks)が提供されています。[様々なイベント・アラート](https://developer.cisco.com/meraki/webhooks/#!webhook-sample-alerts) を送信 :mega: することができます。今回は**特定の Bluetooth クライアントが検知されなくなったことを Webhook で通知する機能**を利用します。

![Meraki Dashboard](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/7a49dbc0-025d-de6a-9f3c-68d8068962bd.png)


## BLE Beacon: Kontakt.io Smart Beacon

![Kontakt.io Smart Beacon](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/efcb0937-8900-e7f7-68d5-00877fdd99a2.jpeg)

今回は [Kontakt.io Smart Beacon](https://store.kontakt.io/product/smart-beacon/) を使いました。バッテリで 24 ヶ月動作し、技適も取得されている製品です。このビーコンを自宅近くに駐車した車の中に積み込みました。

## Smart Lock: CANDY HOUSE SESAME 3

![SESAME 3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/ced9c644-a43f-3df7-df54-9af5d0717764.jpeg)

個人的にコストパフォーマンスが最高だと思うスマートロック [SESAME](https://jp.candyhouse.co/products/sesame4) を使っています。[RESTful? な API](https://doc.candyhouse.co/ja/SesameAPI) が提供されており、[様々な野良ライブラリ](https://github.com/mochipon/pysesame3#related-projects)が作られています。

https://jp.candyhouse.co/

## Processing: AWS

Amazon API Gateway, AWS Lambda, AWS KMS を利用しながら処理をクラウドで完結させています。それぞれのセットアップ方法については既に沢山の情報が日本語で提供されているのでここでは省略します。

今回は SESAME スマートロックを制御するためのライブラリ [**pysesame3**](https://github.com/mochipon/pysesame3) を使った Python スクリプトを制作しました (コードはこちら :point_right: [Gist](https://gist.github.com/mochipon/1c58ee922eecbcd784dc10557dbb4542))

注意しなければならないのは、**pysesame3** には [awscrt](https://github.com/awslabs/aws-crt-python) への依存がありますが、これは [C 言語で書かれている](https://github.com/awslabs/aws-crt-python/tree/main/source)ためコンパイルが必要です。AWS Lambda 環境で外部ライブラリを利用する場合には、コードと一緒にそれらを同梱してデプロイする必要があります。従って、AWS Lambda の実行環境に合わせたバイナリを用意しなければなりません。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-package.html

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html

おすすめの方法は、[amazon/aws-sam-cli-build-image の Docker イメージ](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-image-repositories.html)を使った環境でビルドし、これを Lambda レイヤーとして取り込むことです。以下の Web サイトがわかりやすく解説していました。

https://dev.classmethod.jp/articles/lambda-layer-basics-how-it-works/

https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

##### 実行例
```shell
$ docker run --rm -v $(pwd):/var/task public.ecr.aws/sam/build-python3.9:latest pip install pysesame3[cognito] -t python/lib/python3.9/site-packages/
```



# :thought_balloon: 最後に
- いまのところ「コンロの火、消したっけ？」というのが次の課題なので、いいアイディアをお持ちの方がいらっしゃったら教えて下さい :innocent:
    - 電力における「スマートメーターの B ルート」のような仕組みがガスにもあればいいのに。。。

# 免責事項
本サイトおよび対応するコメントにおいて表明される意見は、投稿者本人の個人的意見であり、シスコの意見ではありません。本サイトの内容は、情報の提供のみを目的として掲載されており、シスコや他の関係者による推奨や表明を目的としたものではありません。各利用者は、本 Web サイトへの掲載により、投稿、リンクその他の方法でアップロードした全ての情報の内容に対して全責任を負い、本 Web サイトの利用に関するあらゆる責任からシスコを免責することに同意したものとします。