応用的なデータ取得の例¶
ここでは、より応用的なデータ取得のサンプルを提供します。
JPEG型のデータを取得し、画像ファイルとして保存する¶
以下のサンプルでは、intdashサーバーにJPEG型で保存されている画像データをintdash SDK for Pythonを使って取得し、画像ファイル(.jpg)としてローカル環境に保存します。
時系列データを取得する¶
本シナリオでは、時系列データの取得には client.data_points
エンドポイントを使用します。
start
および end
には、取得対象範囲の始点と終点を指定してください。
id_queries
で data_type
と channel
を指定することにより、取得対象のデータを指定します。
※ 通常、 id_queries
では data_id
も指定しますが、JPEG型の data_id
は常に 'jpeg'
であるため指定する必要はありません。
import intdash
from intdash import timeutils
client = intdash.Client(
url = "https://example.intdash.jp",
edge_token = "your_token",
)
dps = client.data_points.list(
edge_name='sdk_edge1',
start=timeutils.str2timestamp('2020-07-17 00:00:00+09:00'), # change appropriately.
end=timeutils.str2timestamp('2020-07-18 00:00:00+09:00'), # change appropriately.
id_queries=[
intdash.IdQuery(
data_type=intdash.DataType.jpeg,
channel=1
)
]
)
取得したデータを画像ファイルとして保存する¶
取得したバイナリデータを、そのままJPEGファイルとして保存します。 ここではサンプルとして、取得した時系列データのうち最初のデータポイントのみを保存します。
import pandas as pd
data = dps[0] # Specifies first data.
# Use the timestamp as the file name.
with open(f'./{pd.Timestamp(data.time).value}.jpg', 'wb') as fout:
fout.write(data.data_payload)
全データポイントを保存したい場合は、上記を繰り返します。
import os
import pandas as pd
save_dir='./images'
for d in dps:
if not os.path.isdir(save_dir):
os.makedirs(save_dir)
# Use the timestamps as the file names.
with open(f'{save_dir}/{pd.Timestamp(d.time).value}.jpg', 'wb') as fout:
fout.write(d.data_payload)
JSON型のデータから、信号定義に従って物理値を取得する¶
以下のサンプルでは、intdashに文字列型で格納されているJSONデータを、サーバー側でデシリアライズして、JSONデータ内に含まれている数値を取得します。
まず、JSONデータが文字列として取得できることを確認します。
import intdash
from intdash import timeutils
client = intdash.Client(
url = "https://example.intdash.jp",
edge_token = "your_token",
)
dps = client.data_points.list(
edge_name='sdk_edge1',
start=timeutils.str2timestamp('2020-07-09 00:00:00+09:00'), # change appropriately.
end=timeutils.str2timestamp('2020-07-10 00:00:00+09:00'), # change appropriately.
id_queries=[intdash.IdQuery(
data_type=intdash.DataType.string,
data_id='json_data',
channel=1
)]
)
print(dps[0].data_payload)
# b"\tjson_data{'sp_ACCY': 0.041493, 'sp_ACCZ': 0.217996, 'sp_ACCX': 0.048094}"
注釈
intdashでは、JSON型のデータは文字列( intdash.DataType.string
)として扱われます。
JSONデータ用の信号定義を登録する¶
JSON文字列内の値を数値として取得する信号定義を作成します。
JSON(String) 信号定義サンプル のとおり、intdashサーバーに信号定義を登録してください。
信号定義にはラベル( label
)が設定されています。
信号定義により変換されたデータは、ラベルを指定して取得します。
本シナリオで使用するラベルは以下のとおりです。
JSON内のキー |
変換後の数値に与えられたラベル |
---|---|
sp_ACCX |
json_ACCX |
sp_ACCY |
json_ACCY |
sp_ACCZ |
json_ACCZ |
信号定義を確認する¶
上の手順で登録した信号定義が登録されていることを確認します。
以下のように、 label='json'
と指定することで、 json
から始まるラベルを持つ信号定義のリストを取得することができます。
signals = client.signals.list(label='json')
for s in signals:
print(s.label, end=', ')
信号定義を指定して時系列データを取得する¶
使用したい信号定義をラベルを使って指定し、データを取得します。
start
および end
には、取得対象範囲の始点と終点を指定してください。
dps = client.data_points.list(
edge_name='sdk_edge1',
start=timeutils.str2timestamp('2020-07-09 00:00:00+09:00'), # change appropriately.
end=timeutils.str2timestamp('2020-07-10 00:00:00+09:00'), # change appropriately.
labels=['json_ACCX', 'json_ACCY', 'json_ACCZ']
)
print(dps[0])
# time: 2020-07-09T08:34:11.095032000Z
# measurement_uuid: 82827deb-31b0-4093-aa64-28a717fbca06
# data_type: 11
# channel: 1
# data_id: json_ACCX
# data_payload: b'\tjson_ACCX\x94\x84D\xda\xc6\x9f\xa8?'
data_payload をペイロードから数値に変換し、 json_ACCX
の値が取得できることを確認します。
intdash.data.Float.from_payload(dps[0].data_payload).value
# 0.048094