CO2濃度が高くなったからGravioからLINE WORKSに「換気してね」と送ってみた

以前、GravioからとLINEやSlackにメッセージを送る記事は書いてみましたが、業務で使うのにはLINE WORKSを使ってる会社も多いって聞いたので、LINE WORKSにもメッセージを送ってみることにします。

# TL;DR

- GravioでCO2センサーの値を拾います
- アクション内のHTTPRequestコンポーネントをつかってLINE WORKSに「換気してね」とポストするAPIを呼び出します。
- CO2濃度が1000ppmを超えていたらトリガーでアクションを実行します

# 使用環境

- Raspberry Pi 4 Model B w/4GB RAM
- Ubuntu Server 20.04.3 LTS
- Gravio HubKit v4.4.0-6902
- Gravio Studio v4.4.4247.0
- Gracio CO2センサー (Gravio Standardの契約が必要)
- LINE WORKS

# 事前準備

- [https://line.worksmobile.com/jp/](https://line.worksmobile.com/jp/) から「LINE WORKS」にサインアップして管理者権限をもらっておいてください
- 「[Gravio 4とPower BIでCO2を可視化する](https://qiita.com/zrock/items/08148659ebf523f5c160)」を参考にCO2データを取得できるようにしておいてください。
- GravioからインターネットにでていくときのPublic IPアドレスを調べておいてください。下記のようなサイトで調べることができます。会社ネットワークの場合は、IT管理者さんなどに聞いてみてもいいでしょう。
    [https://www.cman.jp/network/support/go_access.cgi](https://www.cman.jp/network/support/go_access.cgi)
    

# 手順

## LINE WORKSでの設定

### APIのトークンを発行する

LINE WORKSの[Developer Console](https://developers.worksmobile.com/jp/?lang=ja#)にログインします。
今回はAPIの2.0は使わずに従来バージョンを使いますので、「API」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e8f322ca-32a2-89d7-3eab-337ea0d200f0.png)

まずはAPI IDを発行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/f03bf826-52ec-c5da-c540-e3678e1866e4.png)

API IDはコピーしてどこかに保存しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/55679d60-5736-54dc-50c3-484080205c8a.png)

次にServer API Consumer Keyを発行します。Service API Consumer Keyではないので要注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/14842436-3cf4-bf27-a90a-e4b08cdce518.png)
APIの利用範囲を指定します。今回、とりあえずすべてチェックしました。投稿だけであれば「追加」だけでいいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e1c6861e-e34d-135f-a9f3-46828f2b0b50.png)
Tokenの設定をします。有効期限はとりあえず「365日」、自動延長も「はい」を指定しておきます。これも用途に応じて適切に指定してくださいね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/a9f651ef-5fee-43c8-2ee3-97e54925962a.png)

これまたKeyをコピーしてどこかに保存しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/ac3c3aa8-4880-50d5-8fdd-de330eb482ce.png)

最後にServer List（固定IPタイプ）を使います。Gravioでは現時点ではこっちしか使えません。ID登録タイプと間違えないようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/968f3fb7-b49d-2795-6adc-e8bd6c939e9e.png)

サーバー名に「Gravio」、Keyはさきほど生成したもの、IPには準備段階で取得しておいたパブリックなIPアドレスを指定してトークンを発行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/77b1caaf-ef90-d6bd-05f4-b89fefcd299f.png)

Tokenが発行されますので、これもコピーしてどこかに保存しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/90709362-7a36-1b1a-5531-d3723a4f49af.png)

### Botを作成する

Botメニューに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/3c830f02-fd9d-5dad-7d73-bc1ea6a4cd8a.png)

Botの設定をします。
プロフィール画像は適当に指定しておくとわかりやすいです。
Bot名、説明もわかりやすく入力しておきます。
API Interfaceには「従来のAPI」を選択します。
Callback URLには「Off」を選択します。Gravioの場合、ローカルネットワークに設置することが多くコールバックを受けることができないためです。そもそもGravio自身もコールバックを受ける仕組みがないですしね。
「複数人のトークルームに招待可」もチェックしておきます。ここは運用に応じて決めてください。
最後に管理者を決めて保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/643dc1c6-44bf-39f2-44a8-09c7c95c8122.png)

できました。Bot Noをどこかに保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/8ff457b6-87ed-3089-04a3-8ed022580303.png)

Developer Consoleはここまでです。

### Botを追加する

LINE WORKSのサイトにログインして、管理者画面に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/0f27a32f-00b1-5d97-806b-47b27354bc83.png)


Botの登録及び管理者画面に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e1e7c6ab-169e-da68-4adf-57bc25cd37f0.png)


「Bot追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/a070f4b9-1974-7d1d-e36b-bbe38316d3ea.png)

先ほどDeveloper Consoleで作成したBotが一覧に出てくるので、「追加」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/4cf0f2d6-a3b5-d82c-7f1b-83dafb09c2a6.png)

前の画面に戻って追加したBotの詳細を表示します。公開設定が「非公開」になっています。「修正」ボタンをクリックして変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/c854d4b9-93be-be16-bd5c-b8182c7e10a5.png)

「公開設定」をチェックして簡単にトークルームに追加できるようにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/5965f493-1475-4c4b-6fc1-b67668b9094a.png)

あとから戻ってくるので、管理者画面はそのまま残しておいてください。

### トークルームを作成する

LINE WORKSに戻って、通知を送る先のトークルームを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/1a0752a8-86ab-117d-431b-3c2829860115.png)

通知に入れたいメンバーと上で追加したBotを選択して「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/65cd04b3-1504-bbfb-a02b-daedf5035ac0.png)

トークルームができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/03cbc66a-e0c5-ff0a-dfcf-1b8dc56b5e4f.png)

トークルームIDが必要なのでこれから取得します。いろいろやり方はあるようですが、管理者権限があれば一番簡単な方法を紹介しておきます。

まず、トークルーム上でなにかトークします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/f5c7c8f8-e3ac-1dcf-cad2-857364737d5d.png)

ここで開いておいた管理者画面に移動し、「監査」「トーク」を開きます。ここにはトークルームで発言した内容が表示されていると思いますので、その一番右に表示されている「トークルームID」をメモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/6c03227c-4cae-1364-1b6b-d83150329208.png)

ちなみに、監査ログに表示されるまで少しタイムラグがあります。今回の場合、ポストしてから10分以内には表示されました。

### LINE WORKSで取っておいたデータの一覧
さて、ここまでで準備が整いました。長かったですが、最終的にGravioでの投稿に必要となる情報は以下の情報です。
取り忘れてるものがないかチェックしておいてください。

- API ID
- Server API Consumer Key
- Server Token
- Bot No.
- トークルームID

## Gravioでの設定

### アクションを作成する

アクションは簡単です。HTTP Requestコンポーネントを配置します。
プロパティには以下のように指定します。

|プロパティ|値|
|---|---|
|HTTP メソッド|POST|
|URL|https://apis.worksmobile.com/r/＜APIID＞/message/v1/bot/＜BotNo＞/message/push<br/>APIID、BotNoはそれぞれLINE WORKSでBotを登録した際に取得したAPI ID、Bot No|
|認証方式|Bearer認証|
|トークン|LINE WORKSのServer Listに追加した際に取得したToken|

Pre Mappingsではヘッダとボディを次のように指定します。Server API Consumer Key、トークルームIDにはそれぞれLINE WORKSで取得した値を指定します。

```
cp.Headers = {"consumerKey": "＜Server API Consumer Key＞"}
cv.Payload = {
  "roomId": "＜トークルームID＞",
  "content": {
    "type": "text",
    "text": "CO2が" + tv.Data + "ppmです。換気しましょう。"
  }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/eef69798-cf68-8bb8-141f-08145c8c85b0.png)

実行してみましょう。トークルームにメッセージがポストされましたね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/4ceb602b-9abb-7212-38f2-7831d3a03806.png)

### トリガーで連携

さて、ここまできたらあとは簡単です。トリガーを作成して、CO2センサーの値が1000ppmを超えたときに上で作ったアクションを実行するように指定します。

CO2が1000ppmを下回るまでずっとメッセージが来るのはうざいので、「閾値によるトリガーを利用」をチェックしておきます。こうしておくと、1000ppmを超えたときに一度アクションが実行されるだけで、あとは値が1000ppmを下回るまではアクションが実行されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/cbe0a547-b913-c8db-feb2-8f8994a9d61b.png)

作成したら有効にするのを忘れないでくださいね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/1257e4f5-008a-f530-3271-916342997a9a.png)

### 結果の確認

CO2センサーに息を吹きかけてみましょう。どうですか？トークルームに値付きでメッセージが投稿されましたか？![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/3db76be4-d458-5a7a-bdf1-108bbac083d3.png)

だめなら設定を見直してみましょうね。

# ポイント

- LINE WORKSのAPI Tokenを取得するときにServer（固定IP）を選ぶ
    - つまり、DHCPでPublic IPが変わってしまったら動かなくなるので注意！
- Gravioのトリガーでは「閾値によるトリガーを利用」をチェックしておく

# 参考
- [LINE WORKS](https://line.worksmobile.com/jp/)
- [LINE WORKS Developers](https://developers.worksmobile.com/jp/?lang=ja)
- [LINE WORKS トークBot API](https://developers.worksmobile.com/jp/document/5?lang=ja)
- [CMAN グローバルIPアドレス確認](https://www.cman.jp/network/support/go_access.cgi)
- [Gravio](https://www.gravio.com/jp)
- [HTTP Requestコンポーネント](https://doc.gravio.com/manuals/gravio4/1/ja/topic/httprequest)
- [Pre Mappings / Post Mappingsでの式の記述の仕方](https://doc.gravio.com/manuals/gravio4/1/ja/topic/premappings-postmappings)
- [Gravio 4とPower BIでCO2を可視化する](https://qiita.com/zrock/items/08148659ebf523f5c160)