Gravio 4でCO2データをCSVに出力する

# はじめに
[CO2センサーのデータを格納し始めて][Prev]約２週間経過。そろそろデータも溜まって来たのでCSVにでも出力してみることにする。
出力には[SensorDataDB][Gravio-SensorDataDB]コンポーネントを使う。これがいろいろ細かいところまで行き届いてるので便利。

# 使用環境

* 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センサー

# 事前準備
* [Gravio 4とPower BIでCO2を可視化する][Prev]でCO2データの取得をしておく

# 手順

## アクションの作成
いつものようにアクションを作成して、[Sensor Data DB] → [Join] → [CSV Write]とコンポーネントをつなげる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/8294c19a-46ca-4ee3-ce90-667b29c77fd8.png)


## Sensor Data DBコンポーネントの設定
まずは[Sensor Data DB][Gravio-SensorDataDB]コンポーネントで取得するデータの設定。
エリアとレイヤーを指定し、とりあえず全データを取得してみるので、「全てのレコード」をチェックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/64f08e7d-56d2-c6af-21b4-b7edb36c9d98.png)

## Joinコンポーネントの設定
Joinコンポーネントはそのままでよい。とりあえずデフォルトのまま。
[Sensor Data DB][Gravio-SensorDataDB]のまま[CSV Write][Gravio-CSVWrite]にわたすと、1レコードずつファイルに出力されるので、Joinで全てのレコードをまとめると考えればよいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/bebcd091-c9fb-2705-574a-7ac469749c41.png)

## CSV Writeコンポーネントの設定
最後に[CSV Write][Gravio-CSVWrite]コンポーネントの設定。
ファイル名だけ指定しておきましょう。ここで指定したファイルはHubKitのデータフォルダに作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/a79179dc-74bd-0909-f29a-6755a0f5d56a.png)

## 実行
実行してみます。
データが多いと結構時間がかかりますのでご注意を。ちなみに、私の場合は約2週間、11万件くらいをラズパイで実行して30秒くらいかかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/329dd441-c76e-4921-b97c-b19dfd2186cc.png)

## ダウンロード
アクション一覧の画面に戻って、データフォルダを開き、ファイルができてることを確認したら、ダウンロードしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/bf91f4f6-3fe7-df78-a0c3-648ab132ca68.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e35f8cbf-73dc-dfb1-4ade-9a34d3f35e2b.png)

CSVができました。

# 上級編
上級編というほどではないですが、いろいろパラメータを弄ってみます。

## 過去１日のデータを取得
From Previousに `1` を、タイムスケールに `日` を指定します。前からの流れだと、「全てのレコード」のチェックを外すのも忘れずに。
これで、実行した時刻から遡って１日分のデータが取得できます。これなら３秒くらい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/f2986560-953c-baa1-f684-0d0c0f57bb54.png)

## 昨日のデータを取得
上と同じでいいですが、「時間を丸める」をチェックします。
すると、ちょうど昨日の分のデータを取ってきてくれます。自分で時刻を丸める必要がありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/c522f04b-8b0b-e696-0aa3-d3bea391263b.png)

## 過去1000件取得
時間で区切るのではなく、件数で区切ることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e76a0a79-77f2-da49-34dd-2261cff5c26d.png)

# まとめ
[Sensor Data DB][Gravio-SensorDataDB]コンポーネントを使うと、過去に受信したデータをまとめて処理することができます。
[Sensor Data DB][Gravio-SensorDataDB]コンポーネントでは、取得する範囲を時間で指定したり、件数で指定することができ、さらに時間を丸めることで、いい感じの時間範囲のデータを取得することができます。
CSVへの出力は、[CSV Write][Gravio-CSVWrite]コンポーネントを使います。ただし、[Sensor Data DB][Gravio-SensorDataDB]コンポーネントからの出力はレコード単位になっているので、間にJoinコンポーネントを挟むことでレコードをまとめてCSVに書き出すことができます。

# 参考
* [Gravio][]
* [Sensor Data DBコンポーネント][Gravio-SensorDataDB]
* [Joinコンポーネント][Gravio-Join]
* [CSV Writeコンポーネント][Gravio-CSVWrite]

[Prev]:https://qiita.com/zrock/items/08148659ebf523f5c160
[Gravio]:https://www.gravio.com/jp
[Gravio-Join]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/join
[Gravio-SensorDataDB]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/sensordb-recent
[Gravio-CSVWrite]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/writecsvfile