Gravio 4で温度をSlackに投稿してみる

Gravioでセンサーの値を確認するのには[Slack](https://slack.com/intl/ja-jp/)を使うのがとても便利です。Gravio Studioのデータビューアーでももちろん確認はできるのですが、Slackであればスマホでどこでも見ることができますからね。トリガーで条件を指定しておけばある条件を満たしたときだけ投稿するということも可能です。

Gravio 4では、メッセージの作り方が少し変わりましたので紹介しておきます。

# 使用環境

* Windows 10 20H2 (19042.746)
* Gravio HubKit v4.1.4049.0
* Gravio Studio v4.1.5432.0

# 事前準備
Slackのワークスペースを作成し、メッセージを投稿するためのトークンを取得しておいてください。
(参考)
https://api.slack.com/authentication/basics
https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21

# 手順
## Slack Post Messageコンポーネントを配置
新しくアクションを作成し、**Slack Post Message**コンポーネントを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/0f303a99-8ac2-c4ba-defe-2be74919a646.png)

## プロパティを設定
プロパティを設定します。

| プロパティ | 値 | 例 |
|:-----------|:------------|:---|
|チャンネル|投稿先のチャンネル、もしくはユーザー<br/>|`#general`、`@ktamura`|
|テキスト|投稿したいメッセージ|`Hello World!`|
| トークン |Slackで作成したアプリのトークン| |
テスト時には、自分のユーザーIDを指定しておくと自分のSlackbotに投稿されるので、他の人に迷惑をかけることはありませんｗ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/f4d0a73d-9ea7-c58b-f2a4-07e810ccb357.png)

## 実行
実行ボタンで実行すると、下にコンソールが現れ、実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/8d677162-61ad-5b49-024f-d14d32981bff.png)

Slackには、このように投稿されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/743145e3-efd3-b8ae-0b8a-a1f806fe2ee8.png)

## センサーからの値を埋め込む
センサーからの値をメッセージに埋め込むには **Pre Mappings** を使います。
Pre Mappingsはコンポーネントを実行する前に前処理を実行します。多くの場合は、コンポーネントのプロパティを生成したいときに使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/93687d10-d3a1-cff5-69cd-574a8833aeca.png)

このように、**Slack Post Message**を選択した状態で、 **Pre Mappings**の右にある「+」をクリックしてマッピングを追加し、左辺に `cp.Text`、右辺に`"現在の温度は" + tv.Data + "℃です"`
と入力します。
左辺の`cp.Text`の`cp`はコンポーネントプロパティ（**c**omponent **p**roperty）で、`Text`はそのプロパティ名です。入力が終わると左のPropertiesのテキストがグレーになったと思います。つまり、プロパティ テキストにこのマッピングを代入するよということです。
右辺にはプロパティに設定する式を指定してます。文字列を合成しているだけですが、 `tv.Data`の`tv`はトリガー変数(**t**rigger **v**ariable)の意味です。トリガー変数の`Data`には、トリガーからこのアクションが実行されたときに、センサーのデータがセットされてきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/6fd463e4-ccb2-60ed-1aea-37dfd57658c2.png)

実行すると、こんな感じ。Gravio Studioから実行すると`tv.Data`にはダミーのセンサー値として0が渡されますので、これでOKです。

## 温度センサーをペアリングして、トリガーを設定する
実際の温度を埋め込んでみます。温度センサーをペアリングして、このように温度センサーのレイヤーにバインドします。センサーを有効にするのを忘れないでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/3e7c2b62-a8c7-3d3c-a53d-0871f30551a7.png)

トリガーはこのように設定します。エリア、キーレイヤーには温度センサーのエリア、レイヤーを指定します。Temperatureのところには「任意の値」を選んでおきます。センサーのデータを受信するたびにアクションが実行されます。アクション名には、上で作成したアクションを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/c59f4df6-d8a2-cd51-ea7c-ae426bf7bb62.png)
保存して、トリガーを有効にします。

温度センサーの横のスリットに息を吹きかけたりして温度変化を与えてください。下のように温度がSlackに投稿されてきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/1130373e-0ab9-26e3-7ec8-ae4661ad4d3a.png)

Gravioの温度センサーは温度変化などがあったときにだけデータを送信します。変化がないときはほとんどデータを送信しませんので確認するときはセンサーを温めるなどするようにしてください。

# ポイント
* Slackでメッセージを投稿するにはSlack Post Messageコンポーネントを使う
* メッセージを合成するにはPre Mappingsを使って `cp.Text`に渡す
* センサーからの温度を使うには `tv.Data`を使う

# 参考
* [Slack Post Component](https://doc.gravio.com/manuals/gravio4/1/ja/topic/slackpostmessage-action-component)
* [アクション内で利用できる変数と変数型](https://doc.gravio.com/manuals/gravio4/1/ja/topic/available-variables-in-action)
* [アクション内でObject型の変数の値を参照する方法
](https://doc.gravio.com/manuals/gravio4/1/ja/topic/read-variables-in-action)
* [Pre Mappings / Post Mappingsでの式の記述の仕方](https://doc.gravio.com/manuals/gravio4/1/ja/topic/premappings-postmappings)
* [Pre Mappings / Post Mappingsの式の中で利用できる関数](https://doc.gravio.com/manuals/gravio4/1/ja/topic/pre-mappings-post-mappings)
* [Basic app setup | Slack](https://api.slack.com/authentication/basics
)