Azure IoT Hub と Azure Functions と LINE Notify による通知を組み合わせる（簡単な動作テスト）

以下の記事に書いたように Azure IoT Hub を試してみました。

- [Azure IoT Hub へのデータ送信と Azure Stream Analytics による可視化の下準備を試す（公式ドキュメントやサンプルをピックアップしつつ） - Qiita](https://qiita.com/youtoy/items/0ca9be93c9189e71b5d1)

そして、その後に調査をしていた際に以下の記事を見かけました。

- [Azure IoT Hubで受け取ったデータを利用する方法（Azure function） - Qiita](https://qiita.com/kmaepu/items/016608d1b810a9bd6470)

つい最近、以下のようなことをやっていたのがあり、ふと上記の 2つの内容を組み合わせたものを動かしてみたいと思って、今回の記事の内容を試しました。

- [Azure Functions と LINE Notify の組み合わせ（Node.js を利用、ポータルで開発） - Qiita](https://qiita.com/youtoy/items/1f4dcd6dca2ea3a2fd97)

## Azure IoT Hub にセンサーのデータを送る
Azure IoT Hub にセンサーのデータを送る部分は、[冒頭に掲載していた 1つ目の過去記事](https://qiita.com/youtoy/items/0ca9be93c9189e71b5d1)の手順を進めてください。

## センサーで得られた値を条件にして LINE に通知を送る
### Azure IoT Hub と Azure Functions を連携させる
Azure IoT Hub と Azure Functions を連携させる部分は、[冒頭に掲載していた「Azure IoT Hubで受け取ったデータを利用する方法（Azure function） 」という記事](https://qiita.com/kmaepu/items/016608d1b810a9bd6470)に書かれた手順を進めてください。

そして、ログに温度の情報が出力されていれば OK です。

### Azure Functions で LINE Notify を使う
Azure Functions で LINE Notify を使う部分は、[上で掲載していた 2つ目の過去記事](https://qiita.com/youtoy/items/1f4dcd6dca2ea3a2fd97)の手順がベースになります。

Azureポータル上でのパッケージのインストールや環境変数の設定は、過去記事の通りです。
プログラムは過去記事のものと異なる内容で、具体的には以下となります。

```javascript
module.exports = function (context, IoTHubMessages) {
  context.log(
    `JavaScript eventhub trigger function called for message array: ${IoTHubMessages}`
  );

  IoTHubMessages.forEach(async (message) => {
    const inputTemperature = message.temperature.toFixed(2);
    if (inputTemperature > 28) {
      const axios = require("axios");
      const querystring = require("querystring");

      const messageLineNotify = `28度をこえています！: ${inputTemperature} 度`;
      context.log(messageLineNotify);

      const res = await axios({
        method: "post",
        url: "https://notify-api.line.me/api/notify",
        headers: {
          Authorization: "Bearer " + process.env["LINE_NOTIFY_TOKEN"],
          "Content-Type": "application/x-www-form-urlencoded",
        },
        data: querystring.stringify({
          message: messageLineNotify,
        }),
      });
      context.log(res.data);
    }
    context.log(`受信したメッセージ： 温度は ${inputTemperature} 度です`);
  });

  context.done();
};
```

LINEアプリに通知を送る処理ですが、受信した温度の値が 28度をこえている場合に実行するようにしています。

#### 改善すべき部分
今回、短時間での簡単な動作テストを行うだけだったため、上記のような構成・プログラムにしましたが、改善すべきと思われる点があります。

今回の内容について、以下の部分は対処が必要になると思われます。

- センサーデータを頻繁に受けとると、Azure Functions の処理が高頻度に実行される
- 通知を行う条件を連続して満たすと、LINE通知が連続して行われる（※内容的に、条件を満たした状況では、連続してその状態が続くと想定される）

データを受けとるごとに処理をし、個々のデータに対して条件判定をするような形に近いため、その部分に対処が必要という感じです。
長時間の運用をしていくのであれば、[Azure IoT Hub の料金](https://azure.microsoft.com/ja-jp/pricing/details/iot-hub/)や[Azure Functions の料金](　https://azure.microsoft.com/ja-jp/pricing/details/functions/)の無料枠の範囲にも注意しつつ、考慮をする必要があるところかと思います。

### 動作させた結果
動作させてみたところ、温度の値が条件を満たした際に LINEアプリに通知が来るのを確認できました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Azure IoT Hub と Azure Functions、そして LINE Notify を組み合わせてみた。<br><br>Azure IoT Hub にセンサーから温度のデータが送られてきた際に、特定の条件を満たした時に LINE に通知がくる、という構成。<br>（センサーの部分は、Node.js で作ったダミーでやってます） <a href="https://t.co/EI9pHNnFTm">pic.twitter.com/EI9pHNnFTm</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1454850354126864391?ref_src=twsrc%5Etfw">October 31, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## おわりに
Azure IoT Hub に送られてきた数値データを Azure Functions で処理し、ある条件を満たしていた場合に LINE Notify による通知を行う、という仕組みを試しました。

Azure関連のサービスはいろいろありますが、自分が馴染みのある JavaScript が使えるものは、気になるものを試していって今後も理解を深めていければと思います。