Microsoft Teamsへ湿度データをもとに「乾燥アラート」メッセージを投稿する

冬になり、空気の乾燥が気になる季節になりました。
空気の乾燥はウィルスが活性化すると言われていますし、オフィスなどの環境を快適に保つためにも湿度の変化をアラートしてくれたら、ある程度の対策もできるはずですよね。
というわけで、今回は湿度センサーで収集したデータをもとに、Microsoft Teamsを利用して、空気が乾燥してきたらアラートを投稿する仕組みを作ってみました。
#システム構成
PCの中にインストールしたGravioがセンサーからの情報を処理、乾燥しているか判断し、Microsoft TeamsへHTTPリクエストにて投稿します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247209/c2c6bb9b-909b-d4e1-1148-e26534520893.png)

#事前準備
##準備したものと今回試した環境
・ノートPC
　-Windows 10 バージョン1809
・[Gravio](https://www.gravio.com/jp/gpromo/1901-casual-iot)
　-Gravio Studio Version.2.0.2065
　-Gravio Server Version.2.0.2153
・Gravioレンタルデバイス
　-温湿度センサー

温湿度センサーでは、温度、湿度、大気圧データを収集することができます。今回は、湿度データのみを使用してアラートシステムを作っていきます。

##湿度に関して
一般に居室内の湿度の理想値は**50%~60%**のようですね。
**50%**を下回ると、ウィルスが活性化するそうです。
したがって、今回は50%を下回った際にアラートメッセージを発出するように設定してみたいと思います。。

#Microsoft Teamsの設定
Microsoft Teamsに湿度に関する情報をシェアするチャネルを作成します。今回は"乾燥アラートチャネル"と言う名前のチャネルを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247209/47238a9a-87c0-2f9e-8b55-199a31bb719a.png)
チャネル名を入力し、追加を押すことで一覧に追加されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247209/e5bfc64e-d367-deca-99a5-e63aca894764.png)
追加されたチャネルの設定から、Webhook用のコネクタを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247209/ad28ae51-96ae-fccb-4b6b-5c9e692f757b.png)

コネクタの一覧からIncoming Webhookを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247209/1b16c588-9afa-1d58-fee4-a05b8c89ba2f.png)
Webhookの名前を設定し作成をクリックすると、投稿用URLが生成されますので、コピーします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247209/d9fd240a-bd4f-b1fe-8b01-101e49f20676.png)

以上で、Microsoft Teamsの設定が完了しました。

#Gravioの設定
Gravioのインストール方法はこちらを御覧ください！
[Gravioのインストール方法](https://qiita.com/mikawan/items/56aaecc05db56723523a)
##センサーの設定
湿度データを収集する設定をします。
###センサーとペアリング
温湿度センサーとペアリングします。
センサーがチカチカっと光り、以下の画面が表示されれば、ペアリング完了です。
![温度センサーペアリング](https://qiita-image-store.s3.amazonaws.com/0/247209/6506bf18-8f91-b280-5d84-731aaf969f94.png)
ペアリングについては、[こちら](https://www.gravio.com/jp/sensor-setup-guide)をご参照ください。
###エリア・レイヤーを登録する
画面右上の”＋”ボタンをクリックし、エリアを作成します。
エリアを作成すると自動的にレイヤーが作成され、SENSING DEVICE TYPEに"Aqara-Humidity"を選択します。
###レイヤーにデバイスを登録する
一番右のデバイスウィンドウの”⊕”ボタンを選択し、デバイスを追加します。
追加されたデバイスの右に表示されているステータスボタンを有効にすると、湿度データを収集し始めます。

##動作（アクション）の設定
乾燥アラートを通知するWebhookのアクションを設定します。

###１．アクションカードの作成
サーバ管理画面より、アクションボタンをクリックし、アクション管理画面を表示します。
アクション管理画面の右上の”＋”をクリックし新しいアクションカードを作成します。
作成したアクションカードをダブルクリックし、アクションを設定します。
###２．アイコン（コンポーネント）を並べて設定する
ステップの追加の"+"をクリックし、コンポーネントを追加します。
今回は、"HTTPPost"コンポーネントを使用します。
追加したコンポーネントのプロパティに以下を設定します。

|項目|設定値|
|:---|:---|
|URL|先程作成したWebhookのアドレス|
|HTTP METHOD|POST|
|Content-Type|application/json|
|Query String|null|
|Body|"{\"text\":\"湿度"+ av.Data +"%です。加湿をしましょう\"}"|
|Authorization Type|None|
|Authorization Body|null|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/247209/128ba895-50f8-a578-8b04-39e263820eb0.png)

以上でアクションの設定が終了しました。

textの設定では、動作タイミングのセンサーデータを可変数として使用することができます。データを使用する場合は、av.Dataを使用します。また、データと定型文を組み合わせる際は、データと定型文を”+”でつなぎます。

##STEP3　動作タイミング（トリガー）の設定
湿度が50%以下になった際に、Microsoft Teamsへ投稿する設定をします。

|項目|設定値|
|:---|:---|
|エリア|設定した湿度データのレイヤー|
|レイヤー|設定した湿度データのレイヤー|
|アクション名|作成したアクションカード|
|Interval|5|
|Classic/Threshold Trigger|Classic Trigger|
|Humidity|<=50|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/247209/4fa09ff4-6034-0412-9ac3-b79a445af422.png)

トリガーを有効にすることで、湿度が50%以下になるとMicrosoft Teamsに乾燥アラートが投稿されます。

#動作確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247209/146040e1-9ae3-1fb7-7418-dd211e831821.png)
息をはきかけたり、ホットドリンクなどが入っているカップに近づけてみることで、湿度の変化が発生します。設定した湿度になるとアラートが投稿されることを確認してみましょう。

#あとがき
Gravioを使って簡単にセンサーデータをMicrosoft Teamsにメッセージを投稿できるこの仕組みを利用することで、様々なことができますね。
湿度管理で居室の環境を改善してみませんか？

インフルエンザ対策としてこれからの時期に活躍しそうですね！
※加湿器は別途ご用意ください！

##参考

[Gravioとは？](https://www.gravio.com/jp-blog-article/2018-11-02-about-gravio)

[温度センサーのデータをエクセルで簡単に表示]
(https://qiita.com/mikawan/items/3d93543566680afda868)

[Slackとボタンスイッチセンサーで「呼び出しシステム」を作ってみた！](https://qiita.com/mikawan/items/ac196bbb5506a3251c55)

[Microsoft Teams に PowerShell で投稿してみる](https://qiita.com/miyamiya/items/ccae505b8e97b5b532a7)