Gravio 4とPower BIでCO2を可視化する

[Gravio][]は、Standard以上だとCO2センサーをレンタルできます。簡単に使えるPower BIのストリーミングデータセットを使ってグラフ化してみます。

# 使用環境

* Raspberry Pi 4 Model B w/4GB RAM
* Ubuntu Server 20.04.1 LTS
* Gravio HubKit v4.1.0-6380
* Gravio Studio v4.1.5432.0
* Gravio CO2センサー
* Microsoft Power BI

※Gravio CO2センサーはStandardプランを契約するとレンタルすることができます。

# 手順
## CO2センサーをペアリング
まずはCO2センサーをGravioとペアリングします。詳しい手順は[こちら][Gravio-CO2]へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/b7f00cb2-0af3-3e22-1524-a632775be6e8.png)

## Gravio-CO2のレイヤーを作成
新しくレイヤーを作成し、Gravio-CO2を選択します。レイヤー名は適当に `CO2`などとしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/640ef2aa-ad02-5860-2eca-c16d31ce94f9.png)

## レイヤーにセンサーを登録
作成したレイヤーを選択し、右上の「+」をクリックしてCO2センサーを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e217862e-284a-b16d-2484-60fca3c61bd8.png)
ダイアログをクローズし、センサーを有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/2506bde5-ccee-e092-a12c-e0ca2f9f7290.png)

## データを確認
データビューアに移動し、データを確認します。10秒間隔でCO2濃度が取得できているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/aee3b88d-76ca-47eb-2a70-7b0e8762eb28.png)

## Power BIでストリーミングデータセットを作成
Power BIで新しいストリーミングデータセットを作成します。
項目を次のように設定します。


| 名前|型||
|:---|:--|:--|
|Location|テキスト|いくつかのCO2センサーをそれぞれグラフ化できるように場所を入れておきます|
|Timestamp|日時|データの取得日時|
|CO2|数値|測定したCO2濃度|

また「**履歴データの解析**」を**オン**にします。これを忘れるとレポートを作成できませんので注意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/31c342c5-40a5-47d9-089d-57d7675e3a9a.png)

作成できたら、プッシュURLの値を保存しておいてください。Gravioのアクションで使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/ae848273-947e-8912-8b4e-788d9f9a35c5.png)

## アクションでCO2濃度をPowerBIへ送信
Gravio Studioで新しいアクションを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/6fc34a7c-9460-2d09-28fa-9d8861ed8bdc.png)

**HTTP Request**コンポーネントを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/d4e378b1-e61a-2ce2-fd77-9c78ff4a32c7.png)

**HTTP Request**のプロパティでは以下を設定します。

| プロパティ | 値 | 例 |
|:-----------|:------------|:---|
|HTTPメソッド|POST||
|URL|ストリーミングデータセットのプッシュURL|https://api.powerbi.com/beta/xxx/datasets/xxx/rows?key=xxx|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/4693c979-0a6a-63f9-6781-f4f30b2c7251.png)

また、Pre Mappingsで以下のように設定します。

```
cv.Payload = [{"Location": "My Room", "Timestamp": tv.Timestamp, "CO2": tv.Data}]
```

ここでは、**HTTP Request**が送るHTTPリクエストのボディを `cv.Payload`として渡しています。
Pre MappingsではJSON形式の式が利用できますのでこのような設定になっています。中身はストリーミングデータセットで出てきたサンプルと同様です。
`Timestamp`と`CO2`にはそれぞれ`tv.XXXX`という値を渡しています。これらは、トリガー変数と言って、センサーからトリガー経由で渡ってきた情報が格納されています。Gravio 3では`av.XXXX`でしたが、Gravio 4では`tv.XXXX`に変わっています。`tv.Timestamp`はセンサーの受信日時、`tv.Data`はセンサーの値、ここではCO2濃度になります。
詳しくは、「[アクション内で利用できる変数と変数型][Gravio-Variables]」や「[Pre Mappings / Post Mappingsでの式の記述の仕方][Gravio-Mappings]」を参考にしてみてください。
また、**HTTP Request**については、[HTTP Requestのヘルプ][Gravio-HTTPRequest]が参考になります。 

ここでこのアクションを実行すると下のように `200 Success`が出力され終了します。ここでエラーになった場合は、ストリーミングデータセットの定義と`cv.Payload`に定義した内容、URLなどを確認してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/276cc361-39ac-3717-f34e-2dd48520d3de.png)


## データ受信でPower BIへ送信するためのトリガーを作成
最後にセンサーデータを受信したタイミングで先程のアクションが実行されるようにトリガーを設定します。
設定内容は以下のとおりです。エリアとキーレイヤーを指定し、データ受診時に常に送られるように値のところは「**任意の値**」を指定するようにしてください。あとは、アクションも指定しておくことをお忘れなく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/df52a729-b522-b2df-b8f4-eea3aa4716b8.png)

最後にトリガーを有効にするのも忘れずに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e6e76199-fd8e-2591-66ae-111750c014c3.png)

## 結果
これでCO2の結果がどんどんPowerBIに送られるようになりました。見てみましょう。

Power BIの左のサイドバーから作成したストリーミングデータセットのメニューから「レポートの作成」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/3e16bae1-ba7a-0d3a-b051-2dfc1787508c.png)

「視覚化」のところから折れ線グラフをクリックします、。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/6e933862-eca8-75bb-79f1-321c66055ebf.png)

グラフエリアが追加されるので適当なサイズに大きくし、左の「フィールド」から、「Timestamp」、「CO2」、「Location」の順にチェックを入れます、すると、視覚化のところの「軸」に「Timestamp」が、「凡例」に「Location」が、「値」に「CO2」が設定され、グラフが描かれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/7c34337c-e03e-ebc2-3063-441bfd79dbcb.png)

最後に「値」のところのドロップダウンを開くと「合計」にチェックが入ってますので、「平均」にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/d1439af0-eb8e-559f-8e42-54f19e6563cc.png)

これで、右上の「保存」ボタンをクリックして名前を付けて保存します。

これでいつでもCO2濃度の推移がわかりますね。ちなみに、自動で更新されないので、右上の更新ボタンをクリックすると最新のデータで描画されます。
また、時間軸はUTCになりますので、日本時間では9時間足して考えてくださいね。
ちなみに、最初のデータが `0`になっているのは、Gravio Studioからアクションを試しに実行したためです。トリガーと連携されていないので、`tv.Data`にはダミーで`0`が渡されます。
ちなみに、データをクリアしたい場合は、ストリーミングデータセットの「履歴データ」を一度オフにして保存後、もう一度オンにするとクリアされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/fcc38eab-4a0a-16e1-f2f5-26cebf9c9033.png)

# ポイント
* Power BIのストリーミングデータセットを活用する
* ストリーミングデータセットは「履歴データ」をオンにするのを忘れずに
* Power BIにAPI経由で送るにはHTTP Requestコンポーネントを使用する
* HTTP Requestコンポーネントで送るボディを作成するには、Pre Mappingsで`cv.Payload`に設定する
* センサーデータは`tv.Data`で参照する。Gravio Studioから実行した場合、ダミーで`0`が渡される

# 参考
* [Gravio][]
* [CO2センサーのセットアップ][Gravio-CO2]
* [HTTP Requestコンポーネント][Gravio-HTTPRequest]
* [アクション内で利用できる変数と変数型][Gravio-Variables]
* [Pre Mappings / Post Mappingsでの式の記述の仕方][Gravio-Mappings]
* [Power BI](https://powerbi.microsoft.com/ja-jp/)


[Gravio]:https://www.gravio.com/jp
[Gravio-CO2]:https://www.gravio.com/jp/sensor-setup-guide#Gravio-CO2
[Gravio-HTTPRequest]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/http-post-action-component
[Gravio-Variables]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/available-variables-in-action
[Gravio-Mappings]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/premappings-postmappings