AWS IoT SiteWiseから履歴データを取得してCSVに変換する

2022.08.02

CX事業本部Delivery部のakkyです。 産業装置やセンサーからAWS IoT SiteWiseへ収集したデータをExcelにインポートしたり、機械学習で使用したりする場合などには、データがCSV形式で取得できると便利です。

今回は、AWS CLIを使用してIoT SiteWiseから履歴データを取得し、jqでデータをCSVに変換する方法をご紹介します。

動作環境

  • Windows 10 Pro
  • AWS CLI 2.7.20
  • jq 1.6

単一の測定値を取得する

IoT SiteWiseで収集したデータのうち、アセットのなかの単一の測定値の履歴を取得するには、AWS CLIでget-asset-property-value-historyコマンドを使用します。

assetIdとpropertyId、またはpropertyAliasで項目を指定します。start-dateとend-dateはUNIX時間で指定します。具体的には以下のようなコマンドになります。

aws iotsitewise get-asset-property-value-history --asset-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx --property-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx --start-date 1659366000 --end-date 1659367000 > history.json

jqコマンドを使用し、doubleValueとtimeInSecondsをCSVファイルに保存する場合は、以下のようにします。

cat ./history.json | jq -r ".assetPropertyValueHistory[] | [.timestamp.timeInSeconds, .value.doubleValue] | @csv" > history.csv

複数の測定値を取得する

同時に取得した複数の値をセットで送信・記録している場合には、同じ時刻の値を同じ行にまとめたCSVファイルが欲しくなります。

このような場合には、単一の測定値を取得するget-asset-property-value-historyコマンドを複数回実行してマージするのは面倒です。もっと簡単に複数の値を同時に取得できるbatch-get-asset-property-value-historyコマンドがあります。

なお、バッチ実行コマンドは2022年5月に実装されたばかりなので、AWS CLIのバージョンが古い場合にはエラーになってしまいます。実際に私の手元の2.5.5では動きませんでした。最新版にアップデートしてからお試しください。

今回は、HumidityとTemperatureという二つの値を同時に取得してみます。単一の測定値の取得の場合とは引数の形式が異なり、--entriesに取得したい測定値のアセットIDとプロパティ、時間をカンマ区切りで書きます。なお、別の測定値は半角スペースで区切ります。entryIdはアセットの名前ではなく、このコマンドの結果を区別するためにつける値です。

aws iotsitewise batch-get-asset-property-value-history --entries entryId=Humidity,assetId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx,propertyId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx,startDate=1659366000,endDate=1659367000 entryId=Temperature,assetId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx,propertyId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx,startDate=1659366000,endDate=1659367000 > history.json

CSVへの変換は以下のコマンドで行います。 デバッグを行うためにJSONの途中にhumidityとtemperatureという名前を付けています。それぞれの測定値を結合したあとにtimestampでグループ化して再び結合しました。

cat .\history.json | jq -r "[(.successEntries[0].assetPropertyValueHistory[] | {humidity:.value.doubleValue, timestamp:.timestamp.timeInSeconds}), (.successEntries[1].assetPropertyValueHistory[] | {temperature:.value.doubleValue, timestamp:.timestamp.timeInSeconds})] | group_by(.timestamp) | .[] | [.[0].timestamp, .[0].humidity, .[1].temperature] | @csv" > history.csv

このコマンドを実行すると、以下のようなCSVファイルが得られます。

1659366032,68.1930542,28.69682312
1659366093,68.27793121,28.70140076
1659366153,68.27335358,28.72562408
1659366214,68.28308105,28.71417999
1659366273,68.20735931,28.75709534