pythonを使ってMeasurement/Eventデータを取得しcsvに変換する方法
投稿日 / 投稿者名
2018.8.1 / フスレント
はじめに
本レポートは、Things Cloud の利用例をより知っていただくための実利用レポートとして作成したものです。
Things Cloud は極力後方互換性を持つよう開発されていますが、今後のリリースにより、一部画面やコマンド、手順などが変更となったり、利用できない可能性があることをあらかじめご了承ください。
なお、作成にあたり、以下バージョンを用いています。
- ver.8.15.8(backend/UI)
概要
本セクションでは、Measurement/Eventデータを取得する方法についてご紹介します。
pythonを使ってMeasurement/Eventデータを取得し、取得したデータをcsvに変換する方法を学びます。
前提条件
-
リファレンス > メジャーメント を読み、Measurementについて理解していること。
-
リファレンス > イベント を読み、ウィジェットプラグインの基本的な作り方を理解していること。
-
次の言語/フレームワークを扱えること。
- python3.x
- pip3
- requests(2.19.1)
所要時間(目安)
この手順に沿って、Measurement/Eventデータ取得し、取得したデータをcsvに変換する場合の所要時間。
- 20分
つくるもの
今回はAPI経由でMeasurement/Eventデータを取得するコード実施します。
- 指定した期間内のメジャーメントデータを取得して、取得したメジャーメントデータをcsvファイルに変換
取得するメジャーメントデータを格納するcsvファイルの列名は以下のように作成されます。
time,id,self,m_id,m_self,type,unit,value - 指定した期間内のイベントデータを取得して、取得したイベントデータを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変換方法の紹介は以上です。