応用的なデータ取得の例

ここでは、より応用的なデータ取得のサンプルを提供します。

JPEG型のデータを取得し、画像ファイルとして保存する

以下のサンプルでは、intdashサーバーにJPEG型で保存されている画像データをintdash SDK for Pythonを使って取得し、画像ファイル(.jpg)としてローカル環境に保存します。

時系列データを取得する

本シナリオでは、時系列データの取得には client.data_points エンドポイントを使用します。

start および end には、取得対象範囲の始点と終点を指定してください。

id_queriesdata_typechannel を指定することにより、取得対象のデータを指定します。

※ 通常、 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