【なつやすみの】有名ミュージシャンの気分を味わえちゃう装置を作ってみた【じゆうけんきゅう】

#はじめに
日本人なら、誰もが夢見ること……
それは……

<font color="red">$\rm\large{Mステの入場シーンを体験すること！！！}$</font>
<img width="600" alt="C3vMndMUYAAhNeU.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/ae190a78-aa3b-0665-e157-44a6805ed125.jpeg">[1]

Soracomの[IoTスターターキット](https://soracom.jp/store/5243/)を使って、おうちでアーティスト気分を味わおう！！！

(本記事はQiitaエンジニアフェスタ2021のSORACOMテーマの記事です🎉)
#☆MOKUJI☆
1．大まかな方針
2．使ったもの
3．作業手順
4．完成！！
5．詰まったポイント
6．参考にしたもの


#1．大まかな方針

<img width="500" alt="Mステシステム構成図.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/401106cd-b402-e7ef-8070-bcac7eaaebc5.png">


上のイメージが**有名ミュージシャンの気分を味わえちゃう装置**のシステム構成図です。
階段を下りる前に、デバイスに向かって手を振ることによって、イベントがクラウドに送信され、それをトリガーにiPhoneから例の曲が流れ始めます。
下る気分はまるで**Mr.Children**
![0569f8b9f4c739439f00213b65a1cb03931da640.43.2.9.2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/04cf0e35-5ada-7224-aa88-48b3acb5a36a.jpeg)[2]

また、QiitaエンジニアフェスタにあたってSORACOMさんからIoTデバイスを貸していただいたので、
①Internet of Thingらしく、**無線接続**
②**SORACOMのプラットフォーム**を使用
の2点をなるべく意識してみました。

#2．使ったもの
[Wio LTE JP Version](https://soracom.jp/store/5301/)(SIM/アンテナ付き)・・・1台(貸出)
[超音波距離センサー](https://www.seeedstudio.com/Grove-Ultrasonic-Distance-Sensor.html)・・・1台(貸出)
スタンド・・・1個(家で眠ってた100均の樹脂製ケース)
結束バンド・・・4本(家にあったやつ)
モバイルバッテリー・・・1台(家にあったやつ)
iPhone8・・・1台(ぼくの相棒)
<img width="500" alt="IMG_0354.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/d2859a8b-e403-b026-3af3-c3068f251b91.jpeg">


#3．作業手順
##3.1　ジェスチャーシステムのセットアップ
SORACOMレシピの[ジェスチャーシステム](https://soracom.jp/recipes_index/2958/)を参考にセットアップをしていきます。
内容被っちゃうので、基本はレシピ見てください
(やったことは①PCに開発環境をセットアップ②動作プログラムの作成③ボードに書き込み)
工夫した点だけ書きます。
###ジェスチャーの定義
レシピでは、「物体からの距離が 20cm 以下の状態が 120ms 以上 500ms 以内を1回とカウントし、1.8秒以内に 2 回カウントしたとき」にイベントが発生します。
ようするに手を2回振れば反応します。
これを実際に試してみたところ、少し反応しづらかったので緩めに調整してみました。

```c
float state_change_distance = 300.0; // mm(変更前：200.0)
unsigned long state_entry_min = 120; // ms
unsigned long state_entry_max = 500; // ms
int required_as_event = 2; // times
unsigned long event_timeout = 2000; // ms(変更前：2000)
```
###スタンド
家で眠っていた穴あき樹脂製ケースに、結束バンドでボードもろもろ括り付けて、スタンドアローンの装置の完成！！
<img width="500" alt="IMG_4766.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/5dafd03c-c4ad-756d-d659-5bf67c961289.jpeg">
##3.2　メール通知のセットアップ(Lagoonの設定)
iPhoneで曲を流す手段として、オートメーションの利用を考えていたので、そのトリガーとなるメールの通知をSORACOM Lagoonというサービスを使って行います。Lagoonは、デバイスから送られてきた情報をダッシュボード上で管理し、条件を満たしたら通知するという機能を持っています。
![soracom2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/c54fe53b-a50a-7633-2663-4e7967ff9d86.png)
イベントを検知すると上記のようなグラフが表示されます。
この値の変化に対して、指定した条件を満たすとAlertをメール送信することができます。
今回は単純に、ジェスチャーが検知されると`` {"event": 1}``が送信されるので、過去1分間の``event``の最大値が0.9以上(1分毎にチェック)という条件を設定して、通知を行います。



##3.3　例の曲を流すセットアップ(iPhoneの設定)
メールが来るようになったので、前述の通り、オートメーションの準備を行います。
<img width="400" alt="20210824_152810511_iOS.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/e424c52b-f7f9-0834-5129-2cc51728012a.png">
設定はシンプルにこんな感じ。
ただ、色々な障害に阻まれオートメーションの利用は断念しました・・・🥺
一応、色々トライしたので過程は次々節に残しておきます。
結局、メールの着信音を例の曲にすることで完成！！！

#4．完成！！
<img width="500" alt="IMG_4768.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/179968fe-e6b5-d501-738f-6468177385ab.jpeg">

完成したものは・・・

**センサーに向かって手を振ると、１分以内にMステの曲が流れ始める装置！！！**

・・・んーーーータイムラグ！！！！

原因は明らかで、Lagoonで通知を出す間隔を１分以下に出来ないからです。
まだまだMステシステムの完成は遠い・・・

でも、曲を流して階段下りてるだけで謎の満足感が得られたので、OKです！！！！

(ちなみに、有料版なら5秒間隔まで狭められるらしいです。)

#5．詰まった点
こっからは遭遇したトラブルと改善策のコーナー
これから作る人に役立ちますように
##Lagoonの通知メールが送信されない
###原因1：条件の設定が悪かった
検知の間隔(``Evaluate every 1m``)と過去何秒間まで遡ってチェックするかという条件(``WHEN max() OF query(A,10s,now) IS ABOVE 0.9``の10sの部分)が一致していなかった。
そりゃ動いたり動かなかったりするわ。

###原因2：``no data``時の処理が``Keep Last State``になってた
値が``no data``だったときの処理(``If no data or all values are null``)をメール通知が来ないように``Keep Last State``にしていたのですが、これだと条件がずっとTrueになってしまい、Alertが送信されないらしい。(Alertは条件がFalse→Trueになった時のみ送信される)
対処法としては、``ok``に設定した後、Notification settingsの「Disable Resolve Message」という設定をONにする。
![soracom_alertsetting2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/a6e994b5-7b8b-041c-b014-b5ebee68f353.png)




##メールを受信してもiPhoneのオートメーションが実行されない
###原因1：Gmailアプリでの受信をオートメーションのトリガーにすることはできない
Gmailをよく使っていた僕には大打撃。iPhone標準メールアプリでのGmail受信はトリガーにできるので、意外とこのことに気づかなかったりします。
標準メールアプリのGmail受信をトリガーに変更しました。

###原因2：GmailはiPhoneの標準メールアプリにおいてpush通知に対応していない
設定を変えたものの、手動で更新しないとメールが来ない・・・
どうやら標準メールアプリで使えるアドレスの中でも、push(勝手にとってきてくれる)に対応しているものとしていないものがあるようです。
iCloudやoutlookはプッシュ通知に対応しているようなので、iCoudのメアドを利用しました。

###原因3：メール受信時のオートメーションは実行前に必ず確認ステップがある
これが結構面倒で、メールを受信した後に出てくる確認画面をクリックしないと曲が流れ始めません。
オートメーションを謳うなら、全部自動化させてくれ😠
最終的に、これが原因でオートメーションの利用を断念・・・
着信音の設定で、SORACOMからのメールだけ着信時に例の曲が流れるように変更しました
(やってることはオートメーションとおんなじなんだけど、着信音使ったらなんか負けた気分になる・・・)

#謝辞
IoTデバイスを無料で貸し出してくれたSORACOMさんにこの場を借りてお礼を申し上げます。
前から、自作IoTシステムに興味があったのですが、なかなか手が出ず、ボードやセンサーまで貸し出してくれるこの様な機会があってとても助かりました。
また、相談室の時間でもわからないことを解決して頂きました。ありがとうございました🙇

#参考にしたもの
[1]テレビ朝日、ミュージックステーション2017/3/2放送回
[2]テレビ朝日、ミュージックステーション2014/12/26放送回
[3]SORACOM レシピ：『[IoTでジェスチャーシステム](https://soracom.jp/recipes_index/2958/)』 
[3]Soracom Users『[Alert Rule](https://users.soracom.io/ja-jp/docs/lagoon-v2/alert-rules/)』(Alertの設定方法)