概要
SORACOM Harvest Dataのデータをダウンロードし、CSVで取得する中編です。
前編を読んでない方は前編からお読みください。
取得するデータ
取得するデータは以下のレシピで取得できるGPSマルチユニットの温湿度データとします。
今回の手法でやる場合はバイナリパーサー設定が必要となります。
SIMグループ設定画面で「SORACOM Air for セルラー設定」の「バイナリパーサー」をONにして、フォーマットを「@gpsmultiunit
」として保存します。
またAPIでSIM IDが必要となります。
SIM管理画面から対象のSIMのIDをメモしておいてください。
SIM IDの列が表示されない場合、以下手順で表示できます。
JSONデータダウンロード
ここからTalend Open Studio(以降TOSとします)でSORACOM Harvest DataをJSONでダウンロードします。
ジョブ作成
APIキーとトークンの取得(認証)
SORACOM APIを使うにはまず、認証を行い、実行に必要なAPIキーとトークンを取得してからデータダウンロードを実施します。
-
作成したジョブをダブルクリックして開いたら、右のパレット検索で「tREST」を出して、デザインワークスペースに置きます。
-
表示された画面で「Download and install all modules available」をクリックする。
-
tRESTの各属性を設定し、tLogRowとつなぐ
- URL:
"https://api.soracom.io/v1/auth"
- HTTP Method:
POST
- HTTP Header(name):
"Content-Type"
- HTTP Header(value):
"application/json"
- HTTP Body:
"{\"authKeyId\": \"keyId-で始まるSAMユーザーの認証キーID\", \"authKey\": \"secret-で始まるSAMユーザーの認証シークレット\"}"
1
- URL:
-
取得したJSON文字列をJSONデータに変換するため、tLogRowを削除し、tExtractJSONFieldsを置いて、「Edit Schema」の隣の「...」をクリックする。
globalMap.put("apiKey", row3.apiKey);
globalMap.put("token", row3.token);
以上で認証情報の取得が完了です。
データの取得
ここから少し難易度が上がります。
先ほど取得した認証情報(APIキーとトークン)を使って、Harvest Dataからデータを取得します。
-
初期処理を行うため、tJavaを上に追加し、コードを記入して、先ほど作成した認証サブジョブに「OnSubjobOk」でつなぎます。
// 開始時刻と終了時刻をセット String from_str = "2023/07/23 0:00:00"; String to_str = "2023/07/23 23:59:59"; // 開始時刻と終了時刻を日付に変換 Date from_dt = TalendDate.parseDate("yyyy/MM/dd hh:mm:ss", from_str); Date to_dt = TalendDate.parseDate("yyyy/MM/dd hh:mm:ss", to_str); // 開始時刻と終了時刻をUNIX時間に変換 long from_lng = (long)from_dt.getTime(); long to_lng = (long)to_dt.getTime(); // グローバルにセット globalMap.put("from", from_lng); globalMap.put("to", to_lng);
-
続いて認証サブジョブの下にtRESTを置いてOnSubjobOkで繋ぎ、設定値を設定する。
- URL:
"https://api.soracom.io/v1/sims/(SIM ID)/data?from=" + globalMap.get("from").toString() + "&to=" + globalMap.get("to").toString() + "&sort=asc&limit=5000"
- HTTP Headers:
name value "X-Soracom-API-Key" (String)globalMap.get("apiKey") "X-Soracom-Token" (String)globalMap.get("token")
- URL:
-
取得したデータはUnixTimeになっているので、tMapで変換する。
time列(Long)をdatetime列(Date)に変換する。new java.util.Date((long)(row5.time))
Date-Patternは
"yyyy-MM-dd HH:mm:ss"
にする。 -
最後にtFileOutputJSONでファイルに書き出す。
※ TOSのフォルダは\(円マークやバックスラッシュ)ではなく、/(スラッシュ)で表記する必要があります。
以上でHarvest DataからJSONが以下のような形でダウンロードできます。
{
"data": [
{
"datetime": "2023-07-23 20:30:00",
"content": "{\"lat\":null,\"lon\":null,\"bat\":3,\"rs\":4,\"temp\":27.3,\"humi\":57.1,\"x\":null,\"y\":null,\"z\":null,\"type\":0,\"binaryParserEnabled\":true}"
},
{
"datetime": "2023-07-23 20:30:55",
"content": "{\"lat\":null,\"lon\":null,\"bat\":3,\"rs\":4,\"temp\":27.1,\"humi\":57.5,\"x\":null,\"y\":null,\"z\":null,\"type\":0,\"binaryParserEnabled\":true}"
},
…
]
}
※ 実際には1行です。
JSONデータのCSV変換
PythonでJSONデータをCSVに変換します。
Pythonおよびpandasライブラリをインストールしたパソコンに以下のコードのファイルを「soracom_json_csv.py」という名前で保存します。
import os
import sys
import json
from pandas import json_normalize
def json_to_csv(json_file, csv_file):
json_open = open(json_file, 'r', encoding='UTF-8')
json_data = json.load(json_open)['data']
# contentの文字列を変換
for i in range(len(json_data)):
json_data[i]["content"] = json.loads(json_data[i]["content"])
# CSV変換と保存
norm = json_normalize(json_data)
norm.to_csv(csv_file)
if __name__ == "__main__":
args = sys.argv
if len(args) < 2:
print(f"エラー: ファイルが指定されていません。 (引数:{len(args) - 1})")
sys.exit(1)
file_name = args[1]
if not os.path.exists(file_name):
print(f"エラー: 指定されたファイルが存在しません。 ({file_name})")
sys.exit(1)
json_file = file_name
csv_file = json_file.replace(".json", ".csv")
json_to_csv(json_file, csv_file)
コマンドプロンプトで引数にJSONファイルのパスを与えて実行すると、拡張子がCSVのファイルが作成されます。
> python soracom_json_csv.py (ダウンロードしたJSONファイルのパス)
以上でCSVファイルの変換ができるようになりました。
次回は最終回で、JSONダウンロードとCSV変換を自動実行できるようにします。