LTE-M Buttonで子育て支援するシステムを作ったお話

本記事は [SORACOM LTE-M Button powered by AWS Advent Calendar 2018](https://qiita.com/advent-calendar/2018/soracom)の14日目の記事です。

また、2018年11月22日に行われたSORACOM Technology Camp 2018のナイトイベントのLTで発表させていただいた、[「あのボタンで子育て支援～娘ちゃん可愛いよ娘ちゃん～」](https://www.slideshare.net/kenichiroukimura/ss-123792215)の具体的な実装と設置についてのお話となりますので、こちらの資料をご覧になってからの方が分かりやすいかもしれません。

# システム作成の動機・目的
子育てを経験された皆様はご存じかと思いますが、赤ちゃんが小さい間(だいたい0歳児前半？)は、授乳の回数や量、排泄の回数などをできるだけマメに記録することを病院や助産院などから指示されます。

赤ちゃんの健康管理のためにも記録した方がいいのですが、まぁこれが大変なわけです。ただでさえ小さい赤ちゃんの相手をするというのは毎日が戦争状態なのに、そのうえに記録までと言われても

- 「あー、書いてる間にまた泣き出した！もういい、あとで書く！」(←あとで書かない)
- 「出先にノート持ってくるの忘れた！」(←オムツやお尻ふきや着替えやミルクなど持ち歩くもの沢山ですよね)
- 「ノート持って外出したけど広げる場所なんてないし両手は荷物と赤ちゃんで埋まってるよ！」(←オムツ台のあるトイレももっと増えて欲しいですよね)


・・・なんて感じですよね。

とどめにそれでクタクタになったところにお父さんが仕事から帰ってきて<font color="Red">「ただいまー、娘ちゃん今日も可愛いでちゅねー、いっぱいミルク飲みまちたかー？」</font>なんてのんきなこと言われようものなら殺意もわこうってもんです(我が家はきっと違うはず・・多分・・うん、**<font color="Red">奥さんごめんなさい</font>**)。

そこで、少しでもその助けができないかと思ったのがこのシステムになります。このシステムの目的とその解決案は以下の通りです。

- 授乳・おしっこ・ウンチの回数を簡単に記録したい
    - 例のボタンなら押すだけでOKなので**「簡単」**
    - 押されたらGoogle Spreadsheetに**「記録される」**
    - LTE-Mなので、**「外出先でも使える」**
- 夫婦間で状況の共有をできるだけリアルタイムで行いたい
    - 記録と同時にLINEグループに投稿することで**「情報を共有する」**

# 準備
準備するものは以下の通りです。
なお、URLならびに画面写真は2018年12月時点のものですので、変更になっている場合は適宜読み替えをお願いします。

- [SORACOM](https://soracom.jp/)のアカウント
- [SORACOM LTE-M Button powered by AWS](https://soracom.jp/products/gadgets/aws_button/)
- [AWS](https://aws.amazon.com/jp/)のアカウント
- [LINE Developers](https://developers.line.biz/ja/)のアカウント
- Lambdaファンクションを書くためのpython2.7(3でもOKなはず)の環境
- [Serverless Framework](https://serverless.com/)のインストール
- git(私のコードをcloneするため。zipでダウンロードしてもOK)
- [GCP](https://console.cloud.google.com/getting-started?hl=ja&pli=1)のアカウント

各アカウントの取得方法やServerless FrameworkのためのAWSクレデンシャルの設定方法等は割愛します。

# 手順1:LINEボットの登録
まずはLINEのボットを登録・設定します。

- [LINE Developers](https://developers.line.biz/ja/)のページでログインします
- **「プロバイダー」**から適当なプロバイダーを新規に作成するか、既存のプロバイダーがあればそれを選択します
- **「新規チャンネル作成」**から**「Messaging API」**でチャンネルを作成します。プッシュメッセージを使いますので、プランは<font color="Red">「Developer Trial」</font>を選んでください
- 登録できたらチャンネル基本設定画面で、**「Webhook送信」**を「利用する」にし、アクセストークンの値を手元に保存しておきます。
- **「基本情報」**の**「変更はこちら」**からLINE@Managerのページにログインし、**「Messaging API設定」**で**「Botのグループトーク参加」**を「利用する」にしておきます
   ![blog-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59415/07d38a6e-8c82-18ce-cb5f-56b69f7920e9.jpeg)

# 手順2: Google Drive APIとGoogleスプレッドシートの準備
次に、GCPのコンソールからSpreadsheetのAPIを利用できるようにし、記録を取るスプレッドシートを準備します。

- [https://console.developers.google.com/project](https://console.developers.google.com/project)にアクセスして、**「プロジェクト作成」** を押してプロジェクトを作成します
- 作成したプロジェクトの API Manager から **「Drive API」** をクリックします
  ![blog-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59415/bee8fa5e-1bca-f3cf-0001-e9e5baaece0e.jpeg)
  ![blog-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59415/a5511fe6-c3f7-0ce9-3118-849947232759.jpeg)
- Google Drive API の**「有効にする」** をクリックします
- API Manager のメニューから**「認証情報」** をクリックします
  ![blog-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/59415/40dd3139-f777-0d7c-f7d1-e665bb110f20.jpeg)
- **「サービス アカウント」**プルダウンから**「新しいサービスアカウント」**をクリックします
- **「サービス アカウント名」** に任意の名前を入力します
- **「役割」**で<font color="red">[Project] の [編集者] </font>をクリックします
- **「キーのタイプ」**は<font color="red">JSON</font>を選択します
- 最後に**「作成」**ボタンをクリックし、取得したファイル(クレデンシャル情報)を適当な名前で保存します。
- googleスプレッドシートの新規ファイルを作成し、<font color="red">上記で取得した上記のクレデンシャル情報に含まれるメールアドレス</font>に対して共有を出します

# 手順3: CGの準備
本システムでLINEグループに送信されるメッセージは画像メッセージとなりますので、適当な画像を三種類(授乳/おしっこ/ウンチ)を準備します。私がデモをしたシステムでは、[いらすとや](https://www.irasutoya.com/)さんのものを使わせていただきました。

そして、そのファイルをhttpsでアクセスできるところに置きます。手軽にやるにはs3に置いて、読み込みにパブリックアクセス権限を出してしまうといいかと思います(スタティックWEBサイトホスティングだとhttpsじゃないのでCloudFront挟んだりとまためんどいので・・)。

# 手順4: システムの設定と設置(1)
システムを設置します。
まずは私のソースコードをcloneします。

```bash
%git clone https://github.com/kenichiro-kimura/babycounte_aws-iot-1click.git
```

cloneしたプロジェクトのディレクトリで、必要なライブラリをインストールします(python/pipのインストール手順は割愛)。

```bash
%cd babyconter_aws-iot-1click
%pip install -r requirements.txt -t ./
```

config.iniを編集します。

- [general]
    - babyname: 赤ちゃんの名前
- [line]
    - targetId: 現時点では空でOK
    - token: 手順1でLINE Developersで取得したアクセストークンを設定
- [s3]
    - url:手順3でCGファイルを置いたURL
    - shortcg:ボタンクリックで送られるメッセージ(「おしっこした！」)に付けるCGファイル名
    - doublecg:ボタンダブルクリックで送られるメッセージ(「うんちした！」)に付けるCGファイル名
    - longcg:ボタンロングクリックで送られるメッセージ(「ミルク飲んだ！)に付けるCGファイル名
- [google]
    - credential_file:手順2で保存したクレデンシャルファイル名。ファイルはこのプロジェクトディレクトリにコピーしておく。
    - scope: 今の所このままでOK。もしGoogleスプレッドシートのURLが変わった場合は適宜変更。
    - sheet_key: スプレッドシートのURLが https://docs.google.com/spreadsheets/d/hogehoge/... となっていると思うので、この「hogehoge」の部分

    - sheet: スプレッドシートのシート名(半角英数にしておくとハマらないと思われます)

ひとまずデプロイします。

```bash
%sls deploy
```

デプロイに成功したらAPI GatewayのURLが表示されるので、それをLINE Developersのボットの設定の**「Webhook URL」**に設定します。

# 手順5: LINEグループを作成し、そのIDをconfig.iniに設定する

まず、LINE Developersのボットの設定の**「LINEアプリへのQRコード」**をLINEアプリで読み込んで友達になります。

次にLINEアプリの**「友だち追加」**メニューの**「グループ作成」**で、適当なグループを作成します。そして、そのグループに<font color="red">先ほど友達になったボットを招待</font>します。

ボットをグループに招待したら、AWSのコンソールからLambdaのページを開きます。リージョンは「東京」です(serverless.ymlをいじってなければ)。
デプロイした**「babycounter-dev-hello」**という関数があるはずですので、その**「モニタリング」**から**「CloudWatch Logsを表示」**を選び、ログを表示します。
一番新しいものに以下のようなメッセージが出力されているはずですので、この中から<font color="red">「"source\":{\"groupId\":\"************\",\...」</font>という部分を探してグループIDを取得してください。

![blog-9.jpg](https://qiita-image-store.s3.amazonaws.com/0/59415/e9b777fb-c1be-f336-c592-4d6d1fbc3e45.jpeg)


これ(****の部分。ダブルクオートは不要)をconfig.iniの「[line]targetid」に設定します。

設定したら再度デプロイします。

```bash
%sls deploy
```

このグループIDの取得と設定の手順はやや面倒ですが、どうせ1回しかやらない作業ですので、これを簡単にするための作り込みまでやるつもりは今のところないです(需要があればやりますが...)。
複数のグループで使うのであれば、ボタンの属性として渡すなどの方が良いかと思います。

# 手順6: AWS IoT 1-clickの設定

AWSのコンソールから、LTE-Mボタンと作ったLambda関数<font color="red">「**babycounter-dev-sendmsg**」</font>(先ほどのbabycounter-dev-helloではありませんので注意！)を紐付けます。

ボタンの設定方法は[SORACOMさんのページ](https://dev.soracom.io/jp/start/aws_button_slack/)参考にしてください。こちらのページの手順通りに進めて、最後のLambda関数だけ読み替えたらOKです。

# テストしましょう
ボタンをクリック/ダブルクリック/ロングクリックしてみて、スプレッドシートに記録されることとLINEグループに投稿されることを確認しましょう。

- シングルクリック
  ![blog-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/59415/ef4be4fe-6f4d-5a4a-aa79-05c319579bd2.jpeg)
- ロングクリック
  ![blog-6.jpg](https://qiita-image-store.s3.amazonaws.com/0/59415/a797ba20-2fe9-2c98-85be-63987f2f98ab.jpeg)
- ダブルクリック
  ![blog-7.jpg](https://qiita-image-store.s3.amazonaws.com/0/59415/7e0a57cc-9d55-1e20-98d7-d7db3f3d1508.jpeg)
- 記録
  ![blog-8.jpg](https://qiita-image-store.s3.amazonaws.com/0/59415/da06b7f8-4a1a-16c9-5f3d-bac98c8e7534.jpeg)

動かなかったときは以下の順番で確認すると良いかと思います。

- [SORACOMさんのコンソール](https://console.soracom.io/)の「ガジェット(ボタン)」のページから、ボタンクリックの回数が減っているか
- AWSのコンソールで、Lambda関数「babycounter-dev-sendmsg」の「モニタリング」で、Lambda関数が起動しているか。
- 同じくモニタリングページでLambda関数の実行結果がエラーになっていないか
- CloudWatch Logsを見て、何かエラーが出ていないか

# まとめ

無事に動きましたか？メッセージや動作を変更する場合はソースをいじってください(手抜き)。
ボタンで「LINEに通知する」「Googleスプレッドシートに登録する」という動作は色々な記録や連絡が必要な場面で使えると思うので、ぜひ改造して遊んでみてください。

なお、せっかく作ったのですが私の娘はすでに1歳5ヶ月(2018年12月時点)になり、記録を取る必要が無くなったので我が家ではこのまま使うことはなさそうです・・(´･ω･`)