Wi-Fi環境のない祖母宅の見守りシステムをSigfox + Arduino + AWS IoTで構築したくてプロトタイプを作っている話

# はじめに
[ハンズラボ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/handslab) 21日目を担当します[@ryosukeeeee](https://qiita.com/ryosukeeeee)です。4回目の登場です。

先日実家に帰った際に母から「高齢者の見守りサービスを祖母宅に導入したいのだが、おすすめのサービスを知らないか？」と言われました。祖母宅にはネット環境がありません。なのでWiFi環境が前提となっているサービスは使えません。3G/4G回線を使ったサービスも存在しますが、月額使用料が発生することに母は抵抗があるようです。

IoTには以前から興味があったので、良い機会だと思いプロトタイプを作ったので記事にしました。

# IoTデバイスをつくる
## LPWAとSigfox

通信には**長距離通信が可能**で、**通信費が安いこと**が（母から）要求されています。私はLPWA（Low Power Wide Area）のSigfoxを採用することにしました。
総務省が発行する『平成29年版 情報通信白書』ではLPWAはこのように解説されています。
> LPWAの通信速度は数kbpsから数百kbps程度と携帯電話システムと比較して低速なものの、一般的な電池で数年から数十年にわたって運用可能な省電力性や、数kmから数十kmもの通信が可能な広域性を有している [^1]

SigfoxはLPWAの一種です。Sigfox以外のLPWAにはLoRaWANやLTE Cat.M1、NB-IoTなどがあります。Sigfoxの特徴ですが、通信速度は100bps、ペイロード長は12バイト、1日の通信回数は最大140回です。Sigfoxを詳しく知りたい方は京セラコミュニケーションシステム株式会社さんの資料をご覧ください。
[Sigfoxネットワーク紹介資料 | KCCS](https://www.soumu.go.jp/main_content/000597413.pdf)

Sigfox開発キットを使うと手軽にSigfox通信を始められます。私はスイッチサイエンスさんから購入しました。ピンソケットは開発キットに含まれているので、ハンダ付けします。
[Sigfox Breakout board BRKWS01 RC3 - スイッチサイエンス](https://www.switch-science.com/catalog/5373/)
<img src="https://docid81hrs3j1.cloudfront.net/imagecontent/image-1549273613787.jpg" width="400">[^2]

商品代に1年間の通信費が含まれており、デバイスを登録するとすぐに使い始めることができます。技適取得済なので安心です。
開発キットの登録方法はこちら↓の記事を参考にしました。
[Sigfox Devkit（開発キット）を1年間の無償回線で利用する - すべてのモノが「つながる」新たな未来へ。IoTネットワーク「Sigfox」](https://www.kccs-iot.jp/20181119-technical/)




こちらの記事を参考にArduino Unoと接続して疎通確認しました。
[Sigfox Breakout Board (BRKWS01)の利用方法 - すべてのモノが「つながる」新たな未来へ。IoTネットワーク「Sigfox」](https://www.kccs-iot.jp/20181226-technical/)

<img src="https://www.kccs-iot.jp/files/1715/4467/5210/20181213-01-technical-04.jpg" width="400">[^3]
疎通確認ができたらCallbacksを設定します。
今回はAWS IoT経由でDynamoDBにデータを挿入します。
<img src="https://www.kccs-iot.jp/files/1115/4822/8601/tech-180601-1.png">[^4]


## Callbacksの設定

### Sigfoxクラウドの設定

[Sigfoxクラウド](https://backend.sigfox.com/auth/login)にアクセスし、ログインします。
![backend.sigfox.com_auth_login (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/f1b215f3-3778-31cf-798a-6fb733084f4e.png)

ページ上部の「DEVICE TYPE」タブを選択し、登録したデバイスを選択します。メニューから「Edit」を選択します。
![スクリーンショット 2020-12-20 14.56.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/12a3156e-ba5c-7fa3-6a01-ea9ea4d21a28.png)

左側のメニューから「CALLBACKS」を選択すると画面が切り替わるので、右上の「New」ボタンを選択します。

![backend.sigfox.com_devicetype_5fcf82e0e833d92dd0889423_callbacks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/0520c7a7-9059-b11d-f658-d6ad2fe9e89d.png)

Callbackの種類を選びます。http/httpsでAPI連携することも出来ますし、AWSやAzureのサービスと連携することも出来ます。ここではAWS IoTを選択します。
![backend.sigfox.com_devicetype_5fcf82e0e833d92dd0889423_callbacks_index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/dd326ae1-4ff2-5e20-c8a9-b789787caece.png)

適当なTopic名を付けます。今回は「sigfox」とします。
Regionは東京リージョンを選択します
External Idは後で使うのでメモしておきます。
ここまで準備したところで「Config method」欄の「Launch Stack」ボタンを押しましょう。AWSのログイン画面に飛ぶので自分のアカウントでログインしましょう。
![backend.sigfox.com_devicetype_5fcf82e0e833d92dd0889423_callbacks_5fde0b250499f54d02374972_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/e4d89afc-65df-64ac-d65b-76c30f989244.png)

ログインに成功すると、CloudFormationのスタックの作成画面が表示されます。なにもせず「次へ」を押します。
![ap-northeast-1.console.aws.amazon.com_cloudformation_home_region=ap-northeast-1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/cf750633-53de-45a5-2add-d5ec85abd66c.png)

パラメータを埋めていきます。
AWSAccountIdは自分のAWSアカウントIDを入力します。
ExternalIdは先ほどメモしたExternalIdを入力します。
Regionは東京リージョン（ap-northeast-1）を入力します。
TopicNameは先ほど決めたTopic名を入力します。今回は「sigfox」を入力します。
入力が終わったら「次へ」を押します。
![ap-northeast-1.console.aws.amazon.com_cloudformation_home_region=ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/6cd084ec-784d-97e5-0bd2-dd8c93c68862.png)

スタックオプションの設定ではIAMロールを選択する必要があります。完了したら「次へ」を押します。
![ap-northeast-1.console.aws.amazon.com_cloudformation_home_region=ap-northeast-1 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/e80b9db6-c022-c303-b5d4-20c73497217a.png)
![ap-northeast-1.console.aws.amazon.com_cloudformation_home_region=ap-northeast-1 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/07ebd4c0-d95a-f1de-e9e9-990a91f2c86a.png)

これまでに入力した設定が表示されるので、確認して問題なければ「AWS CloudFormationによって・・・」にチェックマークを付けて「スタックの作成」を押します。

![ap-northeast-1.console.aws.amazon.com_cloudformation_home_region=ap-northeast-1 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/9065d6be-a19b-3041-355e-639008785808.png)

![ap-northeast-1.console.aws.amazon.com_cloudformation_home_region=ap-northeast-1 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/1f5305a2-49c8-bed2-eb55-afd28e156636.png)

スタックの作成が完了したら、出力からARNをコピーしてSigfoxクラウドに戻ります。
![ap-northeast-1.console.aws.amazon.com_cloudformation_home_region=ap-northeast-1 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/3caa9279-1b1a-d426-d7da-56d043bd4c9f.png)

ARN RoleにコピーしたARNをペーストします。
Json Bodyには、トピックにpublishする内容を指定します。私は以下のように指定しました。

```json
{ "device":"{device}", "time":"{time}", "data":"{data}" } 
```

ここまで入力したら「Ok」を押します。これでSigfoxクラウドでの設定は完了です。次はAWS側の設定をします。
![backend.sigfox.com_devicetype_5fcf82e0e833d92dd0889423_callbacks_5fde0b250499f54d02374972_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/e4d89afc-65df-64ac-d65b-76c30f989244.png)

### AWSの設定

先にSigfoxデバイスが送信したデータを保存するテーブルをDynamoDBで作成しておきます。
テーブルのパーティションキーはdevice、ソートキーはtimeとしました。詳しい解説は省略します。

テーブルを作成したらAWS IoT Coreでルールを作成しましょう。AWS IoT CoreでACT > ルール を選択します

![ap-northeast-1.console.aws.amazon.com_iot_home_region=ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/1fa53a9a-e0b4-5d52-f2af-3ab791ec947d.png)

右上の「作成」を選択します。
![ap-northeast-1.console.aws.amazon.com_iot_home_region=ap-northeast-1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/f8b0b874-376c-155c-d33e-8de656d2fb5e.png)

ルールに適当な名前を付けます。
![ap-northeast-1.console.aws.amazon.com_iot_home_region=ap-northeast-1 (1)のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/e4f3d6a1-f9ad-41e8-527c-b8cb024b31a9.png)

ルールクエリステートメントで、先ほどSigfoxクラウドで指定したトピック名をFROM句に指定します。今回は'sigfox'を指定します

```sql
SELECT * FROM 'sigfox'
```

![ap-northeast-1.console.aws.amazon.com_iot_home_region=ap-northeast-1 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/32e41e98-3b0b-fb97-24f0-a9f55789dcb8.png)

「アクションの追加」を選択してアクションを設定しましょう。ここでは「DynamoDBテーブル（DynamoDBv2）の複数列にメッセージを分割する」を選択し、ページ下部の「アクションの設定」を押します。
![ap-northeast-1.console.aws.amazon.com_iot_home_region=ap-northeast-1 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/9b8dd60e-3b75-f191-cfae-83d69c8d261a.png)

publishされたメッセージを書き込むテーブルに、先ほど作成したテーブルを選択します。
次に、アクションを実行するためのロールを作成します。すでにAWS IoTにアクセス権限のあるロールがある場合はそちらを選択することも可能です。
以上の操作が完了したら「アクションの追加」を選択します。
![ap-northeast-1.console.aws.amazon.com_iot_home_region=ap-northeast-1 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/93a2614c-a516-ec9c-ea12-bd7acc42d79f.png)

ここまでの作業で「ルールの作成」を押せる状態になっているはずです。必須ではないですが、エラーアクションを追加しておくことをおすすめします。エラーが発生したらCloudWatch Logsにデータを送信するように設定しておくとデバッグに役立ちます（経験者談）

![ap-northeast-1.console.aws.amazon.com_iot_home_region=ap-northeast-1 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/de96b419-96cc-d995-f85d-d7e22c42c6a1.png)

Sigfoxデバイスからデータが送信されると、テーブルに項目が追加されることが確認できたら設定完了です🎉
![ap-northeast-1.console.aws.amazon.com_dynamodb_home_region=ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/64880339-d1e1-e3b8-ea3e-81f14436f70a.png)

# プロトタイプ作成の進捗状況と今後の展望
Arduinoからデータを送信してDynamoDBのテーブルに挿入するところまでは設定ができました。なにをセンシングしたら見守りができるか考えたみたのですが、マグネットセンサでドアの開閉をセンシングしようかと考えています。センサデータの使い方・見せ方は悩ましいのですが、まずはS3で静的ホスティングしてセンサデータをグラフにしてみようと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/112d4c88-2bcb-e595-53c3-eaf90aa15fde.jpeg" width="400"> 

デバイスをドア上部に設置するときにArduino Unoは大きくて嵩張るので、コンパクトなArduino Pro miniに置き換えられないか検討中です。写真の一番上がArduino Uno、真ん中がArduino Pro miniです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334984/4438ebff-9616-4d16-9275-f9939f5f7485.jpeg" width="240">


# さいごに
時間の都合でプロトタイプすら完成できていない状況で申し訳ないです💦プロトタイプが完成したら続編として記事にしようと思います。

[ハンズラボ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/handslab) 明日の22日目は、 [@sr-mtmt](https://qiita.com/sr-mtmt) さんです！お楽しみに🎉


[^1]: [総務省｜平成29年版 情報通信白書｜LPWA](https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/h29/html/nc133220.html)
[^2]: [Sigfox Breakout board BRKWS01 RC3 - スイッチサイエンス](https://www.switch-science.com/catalog/5373/)の内容物より引用
[^3]: [Sigfox Breakout Board (BRKWS01)の利用方法 - すべてのモノが「つながる」新たな未来へ。IoTネットワーク「Sigfox」](https://www.kccs-iot.jp/20181226-technical/)の「マイコンボードと接続」より引用
[^4]: [Sigfox Callback機能 - すべてのモノが「つながる」新たな未来へ。IoTネットワーク「Sigfox」](https://www.kccs-iot.jp/20180601-technical/)の「Sigfox Callbacksとは」より引用