SORACOM・Azure・LINE で授乳・おむつ・夜泣きを記録

このブログは [SORACOM Advent Calendar 2019 ふたつめ](https://qiita.com/advent-calendar/2019/soracom2) の 21 日目です。

# はじめに - 製作の背景

最近子供が生まれまして、夫婦で夜泣きと戦う日々を過ごしています。
夜泣きで難しいのは原因分析です。ミルクなのか、おむつなのか、はたまたぐずってるだけなのか。
特にミルクの場合はおおよそ 3 ～ 4 時間の間隔が必要(新生児期)なので、前回あげたタイミングの把握が大切です。朝起きて泣いているのに気づいた時など、妻の承認をとらずにミルクをあげてよいものか悩みます。
また、ちょっと離れなくてはならないときなども、子供の様子は気になるものです。

そんな課題意識から、こんなツールを作りたいと思いました。

- ミルクやおむつ対応をした記録を共有できる
- 子供が泣いたら通知してくれる

# デモ

実際の現場デモの様子をお見せしたかったのですが、都合によりテーブルの上でやってみます。ショックセンサーが反応したら「泣いてるよ！」と通知し、人間が単押ししたら「ミルクあげたよ」とだけ通知するのがわかると思います。このように接点入力とボタン入力、両方できるのがひげボタンの良いところだと思います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ショックセンサーとひげボタンを組み合わせて、通知する様子 <a href="https://t.co/zp5k2BC0A4">pic.twitter.com/zp5k2BC0A4</a></p>&mdash; Naoki Mikuni (Mick) (@n_mikuni) <a href="https://twitter.com/n_mikuni/status/1208234621369864192?ref_src=twsrc%5Etfw">December 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# 構成 - 各コンポーネントの選定

全体構成は下図のようになります。

![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/6f52074c-cba5-81b7-e829-8201c17e5de4.png)

デバイスとクラウドの詳細や選定理由を紹介します。

## デバイス

既に多くのアドベントカレンダーとネタがかぶってしまいましたが、[SORACOM LTE-M Button Plus](https://soracom.jp/products/gadgets/button_plus/) (以下、ひげボタン) を使いました。
シングル・ダブル・ロングの 3 種類の入力ができることと、接点入力により泣き声検出ができるのではないかという希望を持てたことが採用理由です。
ミルクやおむつ対応時は手動でシングル (短く一回押す)・ダブル (短く二回押す) で送り、泣いた際はショックセンサで検知 + 接点出力でロング (長く CLOSE) で送ります。

接点出力付きのショックセンサは Amazon で見つけた[ワンダーキット/WonderKit ショックセンサーキット](https://www.amazon.co.jp/dp/B00IRTTIWM/)を購入しました。こちらは自分ではんだ付けするタイプでして、久しぶりに楽しく工作できました。Arduino をお持ちであれば[こちらのブログで紹介されている方法](https://blog.soracom.jp/blog/2019/05/07/soracom-lte-m-button-plus-with-arduino/)で比較的いろいろなセンサで接点出力を試せるかと思います。[こちらの記事](https://medium.com/@toolyee/iot%E3%81%AE%E4%B8%80%E7%95%AA%E7%B0%A1%E5%8D%98%E3%81%AA%E3%83%87%E3%83%A2-%E5%BD%93%E7%A4%BE%E6%AF%94-be76fd2c5184?)もおすすめです。

## クラウド

クラウドのバックエンドは、できるだけノンコーディングで作ってみたいという想いから、今回は SORACOM Beam + Azure Logic Apps + LINE Messaging API という組み合わせを採用しました。この構成の欠点は、良い認証の方法を私が考えられていなくて、Azure Logic Apps が公開する URL がわかると他の人もアクセスできてしまうということです。何かいい方法があったらコメントもらえると嬉しいです:pray:
ですが、非常に手軽でコードを書くことなく実装できるので「とりあえず動くものが欲しい」、という方にはおすすめかと思います！
※コード書けるぜ！って方には SORACOM Funk + Azure Function の組み合わせもおすすめです。

# 実装方法

それぞれで実装した方法を紹介します。

## デバイス

**まずははんだ付けからはじめます！**
Amazon で見つけた[ワンダーキット/WonderKit ショックセンサーキット](https://www.amazon.co.jp/dp/B00IRTTIWM/)を
![DSC_0847.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/f538fb4c-1645-e631-b7b5-7ee18b4b230c.jpeg)

楽しくはんだ付けしました
![line_1576146262037_edit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/33752e1c-9c0b-036f-8bea-6d4bc2af72cd.jpeg)

上の図のように、感度や出力時間を調整できるのが特徴です。赤ちゃんの泣き声をうまく検知し、ロング(1.2 秒以上の CLOSE) の長さで出力するよう調整します。

ひげボタンと組み合わせると以下のようになります。ちゃんとケースを用意したいものの、一旦は輪ゴムで留めてみました。
![DSC_0894.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/d3650fdb-da23-ac5d-a338-a57649255d1f.jpeg)


また設置場所については**乳幼児の近くにむき出しの電気製品を置くのは怖い**という至極まっとうな指摘を受けてセンサはベッドの下に、ボタンはマットレスとフェンスの間にはさみました。
![DSC_0290.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/1e91c60b-6172-6799-db00-957918dba772.jpeg)


やはり、デバイスの準備や設置が一番の難所でした。

## LINE Messaging API

以下の URL より作成を開始できます。お持ちの LINE アカウントでログインします。
https://developers.line.biz/console/channel/new?type=messaging-api&provider=new

「チャネルの種類」には "Messaging API"、他の項目は適宜設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/c2410bc1-b5a3-bf21-c828-ed4e5c499e0b.png)

チャネルを作成したら "Messaging API 設定" の QR コードより友達追加しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/8a9eda90-be40-6371-6e97-7c1a99483e37.png)

同様に "Messaging API 設定" の最下部にある「チャネルアクセストークン (ロングターム)」を発行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/2b52427e-7da5-a294-b5a9-53ad390cc47a.png)

発行したチャネルアクセストークンと "チャネル基本設定" 最下部に記載された「あなたのユーザー ID」は後で使うので控えておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/1e11e57d-ba6f-8370-e5df-da496a4be557.png)

## (飛ばしても可) Azure Logic Apps へ送られるデータを SORACOM Harvest で確認する

こちらは飛ばしても OK です。
Azure Logic Apps は SORACOM Beam 経由で送られたボタンのクリックタイプ (シングル・ダブル・ロング) を解釈して LINE Messaging API に送ります。この解釈のためには、どのような形式でデータが送られてくるのかを Azure Logic Apps 側に JSON スキーマという形であらかじめ登録しておく必要があります。

ボタンから送られてくる情報の形式はどうやって確認すればよいでしょう。そこで使えるのが SORACOM Harvest Data です。

[こちらの公式ドキュメント](https://dev.soracom.io/jp/start/enterprise_button_harvest/)をもとに、ボタンからデータを SORACOM Harvest に格納して、どのような形式で送られているかを確認しましょう。

上記ドキュメントのステップ 3 で確認できるグラフの下に表があり、「データ」という列で JSON 形式を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/dcbc3853-a16f-4fcc-f6cd-ddd0809391f1.png)

こちらの JSON を控えておきましょう。

## Azure Logic Apps

まずはお好きな名前で Azure Logic Apps を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/f57eee82-6c76-4a80-28a7-275f2ee0b6e2.png)

作成が完了したら通知されるのでリソースへ移動します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/0a3b2b88-d52b-6bef-d680-08dfb1a5910b.png)

すぐに Logic Apps デザイナーが開くかと思うので、「一般的なトリガーで開始する」から「HTTP 要求の受信時」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/68e01aa7-e8e0-bacc-64e1-84764fe308b4.png)

※[前章](#飛ばしても可-azure-logic-apps-へ送られるデータを-soracom-harvest-で確認する)で JSON をコピーした方は、ここでコピーしたデータを使います。

「サンプルのペイロードを使用してスキーマを生成する」をクリックして

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/05ab6a7f-b203-f665-7ce8-44d136201180.png)

以下の JSON を貼り付け、「完了」をクリックします。

```json
{"clickType":2,"clickTypeName":"DOUBLE","batteryLevel":1,"binaryParserEnabled":true}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/bb7da475-3457-6556-523a-3d23f6189441.png)

これで、どのような形式でデータが送られてくるかを Azure Logic Apps に登録できました。サンプルの入力で勝手に作ってもらえるのは便利ですね。

次にクリックタイプに応じて LINE Messaging API へメッセージを送る設定をしましょう。「新しいステップ」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/f89ad7f8-c9c7-03e5-56c9-f5104b19315c.png)

クリックタイプに応じて処理を切り替えるため「スイッチ」を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/66bcc249-ac4d-b980-d4d6-6f0b426ab0df.png)

「値の選択」で "clickType" を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/4e044304-419c-08fe-2898-16ce26bc15ac.png)

「+」ボタンで分岐を増やし、「次の値と等しい」に "1", "2", "3" と入力していきます。1 は単押し、2 は 二度押し、3 は長押しを意味しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/c2d61f0a-084a-accd-a32d-974725d3dd9f.png)

各ケースに、LINE Messaging API に送信するアクションを追加します。

まずはケース 1 に追加しましょう。「アクションの追加」をクリックして

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/28206586-a0fb-06c2-233d-bcb822222ae9.png)

"HTTP" で検索・選択し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/3d75d9cb-35ce-c126-d36c-2fb37aa2664e.png)

"HTTP" を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/451db46c-2c1f-8f0f-5a66-2cb65ffe0a07.png)

以下の内容を選択・入力します

- 方法 : POST
- URI : `https://api.line.me/v2/bot/message/push`
- ヘッダー

| キー |値 |
|:-----------------|:------------------|
| Authorization |Bearer [[LINE Messaging API の章](#line-messaging-api) で控えたチャネルアクセストークン]|
| Content-Type | application/json   |

- 本文 (一部書き換えが必要です)

```
{
  "messages": [
    {
      "text": "(要書き換え!!) クリックタイプに応じたメッセージ",
      "type": "text"
    }
  ],
  "to": "(要書き換え!!) LINE Messaging API の章で控えたユーザー ID"
}
```

ケース 2, 3 についても同様にアクションを追加します。ちなみに私はそれぞれ以下のようなメッセージにしました。

| ケース | メッセージ |
|:-----------------|:------------------|
| 1 | ミルクあげたよ|
| 2 | おむつ替えたよ|
| 3 | 泣いてるよ！|

こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/100dab7b-e290-6ec6-4dd0-ddf9f8aa50f7.png)


最後に Logic Apps デザイナーの「保存を」クリックすると「HTTP 要求の受信時」に SORACOM Beam からアクセスするための URL が表示されるので、控えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/889a7b33-e5c6-31d6-6690-a4a72d4352a5.png)

Azure Logic Apps に慣れている方は、メッセージを変数化して HTTP 要求を最後ひとまとめにしたり、Key Vault でチャネルアクセストークンを安全にしたりを試してみてください。

## SORACOM Beam

まずはボタンの SIM の所属するグループを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/24c579c3-99df-3eac-7bb6-d8ccbc3b1d79.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/68285d04-96a9-9f9c-47e1-280c98c29f01.png)

作成したグループ名をクリックし、SORACOM Beam 設定から「UDP → HTTP/HTTPS エントリポイント」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/c7f6c10d-95fe-c470-4e96-e70e92d185f9.png)

「転送先」の各パラメータを以下のように埋めます。

| パラメータ | 値 |
|:-----------------|:------------------|
| プロトコル | https |
| ホスト名 | コピーした URL のホスト名 (例 : prod-21.japaneast.logic.azure.com) |
| ポート番号 | 443 |
| パス | コピーした URL の "/workflows..." 以下全て|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/cb9b1484-d987-58cf-ce34-51562bcef28e.png)

最後に忘れず「保存」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125247/23a5127b-1731-f879-dc96-c0ca37140ea1.png)

以上ですべての設定が完了しました。

# おわりに

妻からは「朝起こされなくて済む」と割と好評で、子供もよりスムーズな対応を提供されるようになったのできっと好評だと信じています。
来年はベビーカーの IoT 化をやってみたいと思います。

# 参考

SORACOM Beam + Azure Logic Apps の組み合わせは、こちらの記事を参考にさせて頂きました。ありがとうございます。
[SORACOM Beam をトリガーとして Azure Logic Apps を動かす方法](https://qiita.com/ko2a/items/254b8bfffee5a62f5f10)