Gravio 4からCO2データをMachinistに送って可視化する

GravioでCO2データを可視化シリーズの第3弾でございます。
今回はIIJが提供するサービス「[Machinist][]」です。無料で直近1ヶ月分、10メトリックまでのデータを保存できます。月額680円で100メトリック6ヶ月分まで保存できますので、Gravio Basicの500円と合わせても1000円ちょっとで使えて便利ですね。(2021/2/19現在)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/d4a0c645-ab86-769b-7763-f8af0c2e2c55.png)

過去2回はこちらをどうぞ。

* [Gravio 4からCO2データをAmbientに送って可視化する](https://qiita.com/zrock/items/8b78ad085025bf5e760a)
* [Gravio 4とPower BIでCO2を可視化する](https://qiita.com/zrock/items/08148659ebf523f5c160)

# 使用環境

* 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
* Gracio CO2センサー (Gravio Standardの契約が必要)
* Machinist

# 事前準備
* https://machinist.iij.jp/ から「[Machinist][]」にサインアップしておいてください
* 「[Gravio 4とPower BIでCO2を可視化する][CO2-PowerBI]」を参考にCO2データを取得できるようにしておいてください。

# 手順

## APIキーを取得する

Machinistにログインして、「アカウント設定」に移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/72cc209c-a1c4-a76f-5a7e-181741e622a1.png)

APIキーを新規作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/c760aa6f-a0bd-6304-9199-7abe7a15839d.png)

名前は「Gravio」としておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/dc394f64-e348-d0a5-8808-18ab72fac2dc.png)

作成したAPIキーをコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e39bbcae-0aa2-b070-36b6-1e811d62b527.png)

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

Gravio Studioを使ってアクションを作成します。いつものように**HTTP Request**コンポーネントです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/523a5357-e233-5942-f315-40d4e32ebe1d.png)

各プロパティには以下を指定します。

|プロパティ|値|
|:---|:---|
|HTTPメソッド|POST|
|URL|https://gw.machinist.iij.jp/endpoint|
|Content-Type|(デフォルト)|
|認証方式|Bearer認証|
|トークン|*上で取得したMachinistのAPIキー*|

Pre Mappingでは、cv.Payloadに以下のJSONを指定します。

```:cv.Payload
{ "agent": "Gravio", "metrics": [ {"name": tv.KindName, "namespace": tv.AreaName, "tags": {"location": tv.AreaName},  "data_point": {"timestamp": ToInt(ToDate(tv.Timestamp)), "value": tv.Data} } ]}
```
今回`tv.Data`以外にもいくつかトリガー変数を渡しています。
メトリックの名前には`tv.KindName`というデータの種別名を使います。名前空間とタグ `location`を使って`tv.AreaName`でエリア名を使ってみます。また、時刻情報には`tv.Timestamp`を使います。ここで、Machinistの`timestamp`にはUnix時刻を指定しなければなりません。tv.Timestampをそのまま使ってしまうと文字列でシリアライズされるので、一度`ToDate()`で時刻型にしてから`ToInt()`でUnix時刻に変換しています。

実行すると、結果のJSONに`Succeeded`と返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/ae8cbb1f-d862-773d-261f-d9893b7d0e36.png)

## 結果の確認

Machinistのダッシュボードに移動すると、メトリック数が `1` となってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/3daffe25-91f2-1f32-9cd9-403a643511b0.png)

これをダブルクリックすると、このようにダミーのエリア名や種別名、データ `0`でデータが届いていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/ba897477-6e62-2e92-f66b-7bcc22b00efa.png)

## トリガーで連携

トリガーを作成し、有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/c29411e8-ae61-4a9f-8def-c911b1a2ec3b.png)

Machinistのメトリックのところにリアルメトリックが追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/a52b06c2-4f81-dbfb-1127-8b37f84684bc.png)

ダブルクリックして大きくしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/7ca72df6-1f7e-1f96-bc47-361f2e2073ae.png)

チャートのツールバーの左端の「▶」をクリックするチオリアルタイムにチャートが更新されていきます。
ちなみに、値は1分間の最後の値が表示されるようです。

ツールバーを色々いじってみるといい感じで集計されたりするので面白いですよ。

## チャートを公開してみる

Machinistではチャートを公開することも可能です。

カスタムチャートに移動し作成してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/02744b48-c899-b953-68c0-bf3b89846ae8.png)

メトリックを選択して保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/91c03485-95f5-5079-2bf5-869b236087f6.png)


チャートが作成されるので、チャートに下にある「チャートの共有」を「有効」にして、その下で細かい調整を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/706a5053-7a48-73ec-8c11-0935b80ce877.png)


最後に一番下にある「共有リンクを作成する」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/c17e5808-88aa-95b4-4012-c1681ddf36d9.png)

リンクが表示されるので、このURLをコピーして共有します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e8f17d8f-f243-9f1d-34b7-2f08c99c2501.png)

共有できました。埋め込み用のiframeのコードも作成できますので、サイトに埋め込んでみても面白いですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/f3477d8f-ecc3-6225-ca9b-ff3fe0c7d697.png)

# ポイント
* Machinistにデータを送るには、APIキーを取得し、それをBearer認証のトークンに渡す。データはJSON形式。
* 送信データの`timestamp`はUnix時刻。省略することも可能。
* チャートを公開することも可能

# 参考
* [Gravio 4とPower BIでCO2を可視化する][CO2-PowerBI]
* [Machinist][]
* [Machinistのデータの送信手順](https://machinist.iij.jp/getting-started/getting_started/store_metrics.html)
* [Machinistの送信データ使用詳細](https://machinist.iij.jp/getting-started/spec/data_format.html)
* [Gravio][]
* [HTTP Requestコンポーネント][Gravio-HTTPRequest]
* [Pre Mappings / Post Mappingsでの式の記述の仕方][Gravio-Mappings]


[CO2-PowerBI]:https://qiita.com/zrock/items/08148659ebf523f5c160
[Machinist]:https://machinist.iij.jp/
[Gravio]:https://www.gravio.com/jp
[Gravio-HTTPRequest]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/http-post-action-component
[Gravio-Mappings]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/premappings-postmappings