pythonを使ってMeasurement/Eventデータを取得しcsvに変換する方法

投稿日 / 投稿者名

2018.8.1 / フスレント

はじめに

本レポートは、Things Cloud の利用例をより知っていただくための実利用レポートとして作成したものです。
Things Cloud は極力後方互換性を持つよう開発されていますが、今後のリリースにより、一部画面やコマンド、手順などが変更となったり、利用できない可能性があることをあらかじめご了承ください。
なお、作成にあたり、以下バージョンを用いています。

概要

本セクションでは、Measurement/Eventデータを取得する方法についてご紹介します。
pythonを使ってMeasurement/Eventデータを取得し、取得したデータをcsvに変換する方法を学びます。

前提条件

所要時間(目安)

この手順に沿って、Measurement/Eventデータ取得し、取得したデータをcsvに変換する場合の所要時間。

つくるもの

今回はAPI経由でMeasurement/Eventデータを取得するコード実施します。

  1. 指定した期間内のメジャーメントデータを取得して、取得したメジャーメントデータをcsvファイルに変換
    取得するメジャーメントデータを格納するcsvファイルの列名は以下のように作成されます。
    time,id,self,m_id,m_self,type,unit,value
  2. 指定した期間内のイベントデータを取得して、取得したイベントデータをcsvファイルに変換
    取得するイベントデータを格納するcsvファイルの列名は以下のように作成されます。
    Creation Time,time,id,self,source_id,source_name,source_self,text,type

1. データの取得

1.1 ユーザー名とパスワードの入力

下記のコードを実行するとテナントのURLおよびユーザー名としてメールまた、パスワードを入力し、入力したパスワードとユーザー名をbase64に変換することができます。

import base64
import getpass

print('input tenant url:')
tenant_url = input()
print('input username:')
username = input()
pswd = getpass.getpass('Password:')
s = username + ':' + pswd
s = 'Basic ' + str(base64.b64encode(s.encode('utf-8')))[2:-1]

1.2 取得したい期間の指定

下記のコードに開始と終了の日付を入力すると取得したいメジャーメントデータの期間を指定することができます。
日付は年月日をYYYY-MM-DDの形で入力します。(例:2018年6月20日なら2018-06-20)また、メジャーメントデータは2000個以上のデータを取得することができないため、指定した期間内で取得するデータの個数を指定する必要があります。

print('date from: YYYY-MM-DD')
dateFrom = input()
print('date to: YYYY-MM-DD')
dateTo = input()
print('input number of data:')
number_data = input()

1.3 指定した期間内のデータをjson型で取得

下記のコードを実行すると、Things cloud で用意された REST API を利用して,温度のメジャーメントデータを取得することができます。 温度のメジャーメントデータをレスポンスとする URI に対して GET リクエストを行うことで、温度のメジャーメントの一覧を取得することができます。

import requests
import json

url = tenant_url + '/measurement/measurements'
querystring={"dateTo":dateTo, "dateFrom":dateFrom, "fragmentType":"c8y_Temperature", "pageSize":"2000"}
response = requests.request('GET', url, headers = headers, param = querystring)

data = response.text
x = json.loads(data)

温度メジャーメントデータだけではなく、他の種類のメジャーメントデータを取得したい場合は上記コードの3行目の最後の部分であるfragmentTypeを変えれば良いです。 例えば温度メジャーメントデータを取得したい場合は3行目は以下になります。

url = tenant_url + '/measurement/measurements' + '?dateFrom=' + dateFrom + '&dateTo=' dateTo + '&fragmentType=c8y_SpeedMeasurement'

1.4 csvファイルへの格納

下記のコードを実行するとcsv_measurement.csvファイルが作成され、そのファイル内に取得したデータを格納することができます。

import csv

with open('csv_measurements1.csv','w') as f:
    writer = csv.writer(f, lineterminator='\n')
    writer.writerow(['time', 'id', 'self', 'm_id', 'm_self', 'type', 'unit', 'value'])
    for _x in x['measurements']:
        writer.writerow([_x['time'],
                _x['id'],
                _x['self'],
                _x['source']['id'],
                _x['source']['self'],
                _x['type'],
                _x['c8y_Temperature']['T']['unit'],
                _x['c8y_Temperature']['T']['value']])

1.5 まとめ

以上のコードをまとめると下記のようになります。

import requests
import json
import csv
import base64
import getpass

print('input tenant URL:')
tenant_url = input()
url = tenant_url + '/measurement/measurements'
print('input username:')
username = input()
pswd = getpass.getpass('Password:')
s = username + ':' + pswd
s = 'Basic ' + str(base64.b64encode(s.encode('utf-8')))[2:-1]
headers={}
headers['authorization'] = s
print('date from: YYYY-MM-DD')
dateFrom = input()
print('date to: YYYY-MM-DD')
dateTo = input()

querystring={"dateTo":dateTo, "dateFrom":dateFrom, "fragmentType":"c8y_Temperature", "pageSize":"2000"}

response = requests.request('GET', url, headers = headers, params = querystring)

data = response.text
x = json.loads(data)

with open('csv_measurements1.csv', 'w') as f:
    writer = csv.writer(f, lineterminator='\n')
    writer.writerow(['time','id','self','m_id','m_self','type','unit','value'])
    for _x in x['measurements']:
        writer.writerow([_x['time'],
                _x['id'],
                _x['self'],
                _x['source']['id'],
                _x['source']['self'],
                _x['type'],
                _x['c8y_Temperature']['T']['unit'],
                _x['c8y_Temperature']['T']['value']])

上記のコードを用いて温度(フラグメント:c8y_Temnperature)のメジャーメントデータを取得します。
メジャーメントデータには複数のフラグメントタイプがあり、上記のコード内のフラグメントタイプを変更すると多様なメジャーメントデータを取得できます。
例えば速度(フラグメント:c8y_SpeedMeasurement)のメジャーメントデータを取得します。取得したメジャーメントデータをcsvファイルとして保存したいならソースコードの後ろのデータをcsvファイルに変換する部分のcsvファイルの列名を速度(フラグメント:c8y_SpeedMeasurement) のメジャーメントデータの構造に合わせるだけで取得したデータをcsvファイルとして保存できます。

2. イベントデータの取得

Eventデータの取得するコードは上記のMeasurementデータの取得コードと同じです。
しかし、データの中身のキーが異なるため、csvファイルの列名とURLの最後の部分が異なります。イベントデータのURLはテナントURLの後に”/event/events"を追加して以下の通りです。

<<tenant URL/event/events>>

2.1 csvファイルへの格納

1.5でのcsvファイルへの格納で説明したコードを以下のように変えてください。

with open('csv_events.csv', 'w') as f:
    writer = csv.writer(f, lineterminator='\n')
    writer.writerow(['Creation Time', 'time', 'id', 'self', 'source_id', 'source_name', 'source_self', 'text', 'type'])
    for _x in x['events']:
        writer.writerow([_x['creationTime'],
                _x['time'],
                _x['id'],
                _x['self'],
                _x['source']['id'],
                _x['source']['name'],
                _x['source']['self'],
                _x['text'],
                _x['type']])

2.2 まとめ

イベントデータを取得し、csvファイルに格納するまでのコードをまとめると以下の通りです。

import requests
import json
import csv
import base64
import getpass


print('input tenant URL')
tenant_url = input()
url = tenant_url + '/event/events'
print('input username:')
username = input()
pswd = getpass.getpass('Password:')
s = username + ':' + pswd
s = 'Basic ' + str(base64.b64encode(s.encode('utf-8')))[2:-1]
headers={}
headers['authorization'] = s

print('date from: YYYY-MM-DD')
dateFrom = input()
print('date to: YYYY-MM-DD')
dateTo = input()
print('input number of data:')
number_data = input()

querystring={"dateTo":dateTo, "dateFrom":dateFrom, "pageSize":"2000"}
response = requests.request('GET', url, headers = headers, param = querystring)

data = response.text
x = json.loads(data)

with open('csv_events.csv','w') as f:
    writer = csv.writer(f, lineterminator='\n')
    writer.writerow(['Creation Time','time','id','self','source_id','source_name','source_self','text','type'])
    for _x in x['events']:
        writer.writerow([_x['creationTime'],
                _x['time'],
                _x['id'],
                _x['self'],
                _x['source']['id'],
                _x['source']['name'],
                _x['source']['self'],
                _x['text'],
                _x['type']])

pythonを使ったMeasurement/Eventデータの取得とcsv変換方法の紹介は以上です。