応用的なデータ取得の例 =================================== ここでは、より応用的なデータ取得のサンプルを提供します。 .. contents:: :local: :depth: 1 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'`` であるため指定する必要はありません。 .. code-block:: python 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ファイルとして保存します。 ここではサンプルとして、取得した時系列データのうち最初のデータポイントのみを保存します。 .. code-block:: python 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) 全データポイントを保存したい場合は、上記を繰り返します。 .. code-block:: python 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データが文字列として取得できることを確認します。 .. code-block:: python 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}" .. note:: intdashでは、JSON型のデータは文字列( ``intdash.DataType.string`` )として扱われます。 JSONデータ用の信号定義を登録する ************************************** JSON文字列内の値を数値として取得する信号定義を作成します。 :doc:`signals/json` のとおり、intdashサーバーに信号定義を登録してください。 信号定義にはラベル( ``label`` )が設定されています。 信号定義により変換されたデータは、ラベルを指定して取得します。 本シナリオで使用するラベルは以下のとおりです。 +--------------+------------------------------------+ | JSON内のキー | 変換後の数値に与えられたラベル | +==============+====================================+ | sp_ACCX | json_ACCX | +--------------+------------------------------------+ | sp_ACCY | json_ACCY | +--------------+------------------------------------+ | sp_ACCZ | json_ACCZ | +--------------+------------------------------------+ 信号定義を確認する ************************************** 上の手順で登録した信号定義が登録されていることを確認します。 以下のように、 ``label='json'`` と指定することで、 ``json`` から始まるラベルを持つ信号定義のリストを取得することができます。 .. code-block:: python signals = client.signals.list(label='json') for s in signals: print(s.label, end=', ') 信号定義を指定して時系列データを取得する ********************************************** 使用したい信号定義をラベルを使って指定し、データを取得します。 ``start`` および ``end`` には、取得対象範囲の始点と終点を指定してください。 .. code-block:: python 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'] ) .. code-block:: python 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`` の値が取得できることを確認します。 .. code-block:: python intdash.data.Float.from_payload(dps[0].data_payload).value # 0.048094