0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SORACOM Harvest DataのデータをCSV形式で自動取得する(中編)

Last updated at Posted at 2023-07-31

概要

SORACOM Harvest Dataのデータをダウンロードし、CSVで取得する中編です。
前編を読んでない方は前編からお読みください。

取得するデータ

取得するデータは以下のレシピで取得できるGPSマルチユニットの温湿度データとします。

今回の手法でやる場合はバイナリパーサー設定が必要となります。
SIMグループ設定画面で「SORACOM Air for セルラー設定」の「バイナリパーサー」をONにして、フォーマットを「@gpsmultiunit」として保存します。
image.png

またAPIでSIM IDが必要となります。
SIM管理画面から対象のSIMのIDをメモしておいてください。
image.png
SIM IDの列が表示されない場合、以下手順で表示できます。

  1. SIM管理画面右上部の歯車アイコンをクリックする。
    image.png
  2. SIM IDをONにして、「閉じる」をクリックする。
    image.png

JSONデータダウンロード

ここからTalend Open Studio(以降TOSとします)でSORACOM Harvest DataをJSONでダウンロードします。

ジョブ作成

  1. TOSを起動、プロジェクトを選択して、画面が表示されたら「Job Design」を右クリックし、「Create job」を選択する。
    image.png

  2. Nameを「HarvestData」として「Finish」をクリックする。
    image.png

APIキーとトークンの取得(認証)

SORACOM APIを使うにはまず、認証を行い、実行に必要なAPIキーとトークンを取得してからデータダウンロードを実施します。

  1. 作成したジョブをダブルクリックして開いたら、右のパレット検索で「tREST」を出して、デザインワークスペースに置きます。
    image.png

  2. tRESTをダブルクリックすると、初回のみ警告が表示されるので、「Install...」をクリックする。
    image.png

  3. 表示された画面で「Download and install all modules available」をクリックする。
    image.png

  4. 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
      image.png
  5. この状態で実行すると、apiKeyとoperatorId、tokenのJSONっぽい文字列が取得できる。
    image.png

  6. 取得したJSON文字列をJSONデータに変換するため、tLogRowを削除し、tExtractJSONFieldsを置いて、「Edit Schema」の隣の「...」をクリックする。
    image.png

  7. 設定画面が表示されるので、カラムを3つ追加し、「apiKey」「operatorId」「token」とする。
    image.png

  8. 追加した列の値をそれぞれ「"apiKey"」「"operatorId"」「"token"」とする。
    image.png

  9. tLogRowを追加して実行すると、JSONに変換されたことが確認できる。
    image.png

  10. tJavaRowで認証情報(APIキーとトークン)をグローバル変数にセットする。
    image.png

globalMap.put("apiKey", row3.apiKey);
globalMap.put("token", row3.token);

以上で認証情報の取得が完了です。

データの取得

ここから少し難易度が上がります。
先ほど取得した認証情報(APIキーとトークン)を使って、Harvest Dataからデータを取得します。

  1. 初期処理を行うため、tJavaを上に追加し、コードを記入して、先ほど作成した認証サブジョブに「OnSubjobOk」でつなぎます。
    image.png

    // 開始時刻と終了時刻をセット
    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);
    
  2. 続いて認証サブジョブの下に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")

    image.png

  3. tLogRowをつないで実行すると、それっぽい値が取得できる。
    image.png

  4. tLogRowを削除し、tExtractJSONFieldsを置いて取得したデータを時刻とcontentに分離する。
    image.png

  5. 取得したデータはUnixTimeになっているので、tMapで変換する。
    image.png
    image.png
    time列(Long)をdatetime列(Date)に変換する。

    new java.util.Date((long)(row5.time))
    

    Date-Patternは"yyyy-MM-dd HH:mm:ss"にする。

  6. tLogRowをつなげて動かすと、datetimeとcontentに分かれて出力されていることがわかる。
    image.png

  7. 最後にtFileOutputJSONでファイルに書き出す。
    image.png
    ※ 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ファイルのパス)

image.png

以上でCSVファイルの変換ができるようになりました。

次回は最終回で、JSONダウンロードとCSV変換を自動実行できるようにします。

  1. SAMユーザーの認証キーIDと認証シークレットは前編で取得したもの

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?