GravioのLINE WORKSコンポーネントを使ってCO2濃度が高くなったら「換気してね」と送ってみた

少し前に「[CO2濃度が高くなったからGravioからLINE WORKSに「換気してね」と送ってみた](https://qiita.com/zrock/items/8ffe8bdb3c1b41f34d6d)」でGravioからLINE WORKSへ汎用のHTTP Requestコンポーネントを使ってメッセージを送る記事を書いてみた。
さて、先日、クリスマスプレゼントのようにGravio 4.4.2がリリース、 [LINE WORKSコンポーネント](https://doc.gravio.com/manuals/gravio4/1/ja/topic/line-works) が追加され、前記事より超簡単になった上にスタンプ、画像も送れるようになり、パブリックIPの固定も必要なくなった。これは試さずにはいられないので早速試してみる。

# TL;DR

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

# 使用環境

- Raspberry Pi 4 Model B w/4GB RAM
- Ubuntu Server 20.04.3 LTS
- Gravio HubKit v4.4.2-6958
- Gravio Studio v4.4.4287.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コンポーネントのおかげで要らなくなりました！**
    

# 手順

## 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（ID登録タイプ）の「追加」ボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/f224ad57-72f7-4653-2f98-0b2105fb218d.png)

サーバー名に「Gravio」、Keyはさきほど生成したものを選択して保存してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/8b2aba2d-4660-1702-9157-752d4f9e3132.png)

IDが発行され、認証キーもダウンロードできるようになります。これらをどこかに保存しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/fea34371-2f69-9166-ef1b-6d1c296f8b49.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 ID
- Server認証キー（ファイル）
- Bot No.
- トークルームID

## Gravioでの設定

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

アクションは前回よりさらに簡単になりました。まずLINE WORKSコンポーネントを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/87549881-d717-c8fa-5915-4947e5fe1f75.png)

プロパティには以下のように指定します。せっかくなのでスタンプも追加してみましょう。LINE WORKSで使えるスタンプは [こちら](https://static.worksmobile.net/static/wm/media/message-bot-api/line_works_sticker_list_new.pdf) から見ることができます。

|プロパティ|値|
|---|---|
|パッケージID|1|
|スタンプID|3|
|送信先種類|「トークルームID」|
|送信先ID|監査ログで取得したロークルームID|
|API ID|Developer Consoleで取得したAPI ID|
|Consumer Key|Developer Consoleで取得したConsumer Key|
|Server ID|Developer Consoleで取得したServer ID|
|API ID|Developer Consoleで取得したAPI ID|
|認証キー|「ファイルを選択する」をクリックしてDeveloper Consoleからダウンロードしたファイルを選択するとキーが展開されます|
|Bot No|Developer Consoleで取得したBot No|

Pre Mappingsではヘッダとボディを次のように指定します。JSONじゃないので簡単ですね。ただし、変数名がHTTP Requestのときの `cv.Payload`ではなく`cp.Message`なので注意してください。

```
cp.Message = "CO2が" + tv.Data + "ppmです。換気しましょう"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/4be2423d-1150-0512-bad2-6dd9036e7232.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/72ab7914-4bb8-407c-699d-f0630f6fa360.png)



実行してみましょう。トークルームにメッセージがポストされましたね！アクションを直接実行しているので0ppmになってます。スタンプも送られているので、より危機感がでてますねｗ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/a3f3ea8e-64da-26fa-42ba-c8cafcc44a73.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/d2c089ba-e84b-6240-5953-23c3b13080a5.png)

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

# ポイント

- LINE WORKSのAPI Tokenを取得するときにServer（ID登録タイプ）を選ぶ
    - HTTP Requestのときと同じく固定IPタイプを使うことも可能だが、選択するメリットはない（たぶん）
- スタンプや画像も一緒に投稿することでより注意喚起できる
- Gravioのトリガーでは「閾値によるトリガーを利用」をチェックしておく

# 参考
- [LINE WORKS](https://line.worksmobile.com/jp/)
- [LINE WORKS Developers](https://developers.worksmobile.com/jp/?lang=ja)
- [LINE WORKS スタンプ一覧](https://static.worksmobile.net/static/wm/media/message-bot-api/line_works_sticker_list_new.pdf)
- [Gravio](https://www.gravio.com/jp)
- [LINE WORKSコンポーネント](https://doc.gravio.com/manuals/gravio4/1/ja/topic/line-works)
- [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)
- [CO2濃度が高くなったからGravioからLINE WORKSに「換気してね」と送ってみた](https://qiita.com/zrock/items/8ffe8bdb3c1b41f34d6d)