Gravioで測定していたCO2の測定結果のグラフがギザギザして気持ち悪いので移動平均をとってみた。
GravioにはStatisticsコンポーネントというのがあって、簡単にデータの統計が計算できる。
使用環境
- Raspberry Pi 4 Model B w/4GB RAM
- Ubuntu Server 20.04.2 LTS
- Gravio HubKit v4.3.0-6722
- Gravio Studio v4.3.4162.0
- Gracio CO2センサー (Gravio Standardの契約が必要)
- PowerBI
事前準備
- 「Gravio 4とPower BIでCO2を可視化する」「Gravio 4で2つの部屋のCO2濃度をPowerBIで可視化する」を参考にCO2データを取得できるようにしておいてください。
アクションにコンポーネントを追加する
「Gravio 4で2つの部屋のCO2濃度をPowerBIで可視化する」でロケーション付きでポストしていたアクションの中に、Sensor Data DBコンポーネント、Statisticsコンポーネント、HTTP Requestコンポーネントの3つのコンポーネントを追加します。
Sensor Data DBでは、移動平均を取るための過去データを取得します。
Statisticsでは取得してきた過去データから統計値を計算します。
HTTP Requestでは移動平均の値を別途PowerBIにポストします。
つまり、上のStep 1では生データを、Step 4では移動平均をPower BIにポストするということですね。
各コンポーネントの中身です。
まずはSensorDataDBです。今回は10分間の移動平均を取りたいと思います。
「エリアID」と「レイヤーID」には対象のレイヤーを指定します。
「From Previous」と「タイムスケール」で「10分」となるように指定します。
これで、10分間のデータが取得できます。
次にStatisticsです。統計データを計算する対象を指定します。

今回はSensorDataDBから取得したデータの統計を取りますので、「値式」には cv.Payload.Dataを指定します。SensorDataDBからの出力はペイロードのDataとして渡されますからね。
最後にHTTPRequestで平均値をPowerBIにポストします。
PowerBIへ投げるために、Step 1と同じように「HTTPメソッド」と「URL」を指定します。
ポストする内容は同じようにcv.Payloadに指定します。ここで、Statisticsコンポーネントの計算結果はcv.Statisticsとして格納されています。ですから、ここではこのように平均値を参照します。
エリア名にもわかりやすいように 10分移動平均と追加しておきます。
cv.Payload = [{"Location": tv.AreaName + "10分移動平均", "Timestamp": tv.Timestamp, "CO2": cv.Statistics.Average}]
結果
PowerBIに移動平均を送ることができました。移動平均にするとグラフが滑らかになりますね。
まぁ、BIツールならそちら側で移動平均を計算することも簡単だとは思いますが、エッジで計算するのもの簡単ですね。これくらいの修正なら慣れれば3分ですよ。😁
発展
Statisticsコンポーネントでは他にも最大値や最小値、中央値なども計算できます。いろいろポストすると面白いと思います。
また、今回はCO2データを取得するたびに計算してましたが、1時間に1回、1日に1回実行することでもっと粒度の大きな傾向がつかめてくると思います。
ぜひいろいろ試してみてください。



