技术文档:TSD REST API
TSD 服务的 REST API 可用于从 proficloud 获取 TSD 数据。
你需要什么:
- 一个用户帐户
- 至少一台设备向时序数据发送数据(需要设备的UUID)
- 您要读取的Metric的名称(提示:检查仪表板系统)
- 您喜欢用来查询 REST-API 的任何工具或编程语言
要访问 API,必须通过 OAuth 进行身份验证。
可以通过用户名和密码(在初始身份验证时)或通过刷新令牌(由初始登录提供)来请求令牌。
响应会生成具有相应到期时间的访问令牌和刷新令牌。 访问令牌应该被重复使用,直到它过期,刷新令牌可用于获取新令牌,而无需再次提供用户名和密码。
TSD REST API 使用 JSON 有效负载,可以从任何能够使用 REST API 的编程语言或工具中使用。 本教程提供 Python 示例,当然也可以使用其他语言或工具。
以下教程展示了检索和更新令牌的示例,还展示了查询数据的不同可能性!
#In this Python example we will use the requests library: import requests import json url = "https://tsd.proficloud.io/epts/token" username = "demohmi2020@phoenixcontact-sb.io" password = "GoDigital2020!" uuid = '355f6856-e9a4-469f-8f22-3f8b037d064a' metrics = "auto~pressure,auto~temperature,auto~watt"
验证
首先,我们需要以用户身份在 REST API 上进行身份验证。 访问令牌用于对每个 REST 调用的用户进行身份验证,刷新令牌可用于更新令牌而无需用户名和密码。
Initial token retrieval / username & password
Initially, tokens can be retrieved with the username and password:
#Headers: header = { "Content-Type": "application/json" } #Payload: data = { "username": username, "password": password } #Send post request token_response = requests.post(url, json=data, headers=header) if token_response.ok: access_token = token_response.json().get("access_token") expires_in = token_response.json().get("expires_in") refresh_token = token_response.json().get("refresh_token") refresh_expires_in = token_response.json().get("refresh_expires_in") print("Access token: ...{}...(length: {}, expires in {}s)".format(access_token[500:600], len(access_token), expires_in)) print("Refresh token: ...{}... (length: {}, expires in {}s, 0 means infinite)".format(refresh_token[500:600], len(refresh_token), refresh_expires_in))
Access token: ...MzQtODljYWYzMDE2MmZmIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwczovL3Byb2ZpY2xvdWQuaW8iLCJodHRw...(length: 1726, expires in 86400s) Refresh token: ...mF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjJhMjFhZmRhLTRmMDUtNDA5Ny1hZTM0LTg5Y2FmMzAxNjJmZiIsInJlYWxtX... (length: 1079, expires in 0s, 0 means infinite)
Token renewal
The refresh token can be used to obtain new tokens, without the need for a username and password. In [3]:
#Headers: header = { "Content-Type": "application/json" } #Payload: data = { "refresh_token": refresh_token } #Send post request token_response = requests.post(url, json=data, headers=header) if token_response.ok: access_token = token_response.json().get("access_token") expires_in = token_response.json().get("expires_in") refresh_token = token_response.json().get("refresh_token") refresh_expires_in = token_response.json().get("refresh_expires_in") print("Access token: ...{}...(length: {}, expires in {}s)".format(access_token[500:600], len(access_token), expires_in)) print("Refresh token: ...{}... (length: {}, expires in {}s, 0 means infinite)".format(refresh_token[500:600], len(refresh_token), refresh_expires_in))
Access token: ...MzQtODljYWYzMDE2MmZmIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwczovL3Byb2ZpY2xvdWQuaW8iLCJodHRw...(length: 1726, expires in 86400s) Refresh token: ...mF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjJhMjFhZmRhLTRmMDUtNDA5Ny1hZTM0LTg5Y2FmMzAxNjJmZiIsInJlYWxtX... (length: 1079, expires in 0s, 0 means infinite)
Querying data
There are three options when it comes to querying data from the TSD REST API:
- Query last data points
- Query historical raw data
- Query historical data using database queries (advanced users)
Query last data points
The endpoint /epts/last returns the most recent time series data. (EPTS stands for “endpoint time-series”)
The base url is https://tsd.proficloud.io/epts/last with the following possible parameters. The request method is “GET”.
Authentication happens via header “Authorization” with value “Bearer ACCESS_TOKEN“.
Parameters:
- uuid: One or more UUIDs, comma separated without spaces
- timeSeriesName: One or more metrics, comma separated without spaces
The response yields in status code 200 and contains a JSON object containing the time series. Possible errors are:
- 401 – Unauthorized.
- 500 – e.g. wrong input parameters, content-type, etc. Error message given in response body.
header = { "Content-Type": "application/json", "Authorization": "Bearer {}".format(access_token) } url = "https://tsd.proficloud.io/epts/last?uuid={}&timeSeriesName={}".format(uuid, metrics) result = requests.get(url, headers=header) if result.ok: print(json.dumps(result.json(), indent=4))
{ "355f6856-e9a4-469f-8f22-3f8b037d064a": { "auto~pressure": [ { "timestamp": "2020-07-21T11:43:05Z", "values": { "value": 1000 } } ], "auto~temperature": [ { "timestamp": "2020-07-21T11:43:05Z", "values": { "value": 60 } } ], "auto~watt": [ { "timestamp": "2020-07-21T11:43:05Z", "values": { "value": 5000 } } ] } }
Query historical raw data
The endpoint /epts/data returns a block time series data from the selected range. (EPTS stands for “endpoint time-series”)
The base url is https://tsd.proficloud.io/epts/data with the following possible parameters. The request method is “GET”.
Authentication happens via header “Authorization” with value “Bearer ACCESS_TOKEN“.
Parameters:
- uuid: One or more UUIDs, comma separated without spaces
- timeSeriesName: One or more metrics, comma separated without spaces
- fromDate: ISO-8601 encoded start time to retrieve data points from (example: 2017-04-20T00:00:00.000Z)
- toDate: ISO-8601 encoded end time to retrieve data points to (example: 2017-04-20T00:00:00.000Z)
The response yields in status code 200 and contains a JSON object containing the time series. Possible errors are:
- 401 – Unauthorized.
- 500 – e.g. wrong input parameters, content-type, etc. Error message given in response body.
header = { "Content-Type": "application/json", "Authorization": "Bearer {}".format(access_token) } #Dates are ISO-8601! fromDate = "2020-07-21T10:45:00.000Z" toDate = "2020-07-21T10:45:05.000Z" url = "https://tsd.proficloud.io/epts/data?uuid={}&timeSeriesName={}&fromDate={}&toDate={}".format(uuid, metrics, fromDate, toDate) result = requests.get(url, headers=header) if result.ok: print(json.dumps(result.json(), indent=4))
[ { "355f6856-e9a4-469f-8f22-3f8b037d064a": { "auto~pressure": [ { "timestamp": "2020-07-21T10:45:01Z", "values": { "value": 10 } }, { "timestamp": "2020-07-21T10:45:02Z", "values": { "value": 0 } }, { "timestamp": "2020-07-21T10:45:03Z", "values": { "value": 10 } }, { "timestamp": "2020-07-21T10:45:04Z", "values": { "value": 100 } } ] } }, { "355f6856-e9a4-469f-8f22-3f8b037d064a": { "auto~temperature": [ { "timestamp": "2020-07-21T10:45:01Z", "values": { "value": 50 } }, { "timestamp": "2020-07-21T10:45:02Z", "values": { "value": 35 } }, { "timestamp": "2020-07-21T10:45:03Z", "values": { "value": 45 } }, { "timestamp": "2020-07-21T10:45:04Z", "values": { "value": 55 } } ] } }, { "355f6856-e9a4-469f-8f22-3f8b037d064a": { "auto~watt": [ { "timestamp": "2020-07-21T10:45:01Z", "values": { "value": 800 } }, { "timestamp": "2020-07-21T10:45:02Z", "values": { "value": 300 } }, { "timestamp": "2020-07-21T10:45:03Z", "values": { "value": 800 } }, { "timestamp": "2020-07-21T10:45:04Z", "values": { "value": 1500 } } ] } } ]
Query historical data using database queries (advanced users)
For advanced users, we also offer the ability to formulate custom queries to read data through the endpoint /query.
The base url is https://tsd.proficloud.io/query with the following possible parameters. The request method is “GET”.
Authentication happens via header “Authorization” with value “Bearer ACCESS_TOKEN“.
Parameters:
- q: Query for reading tsd data InfluxDB-Style. An example is shown below, detailed information on the queries can be found here
The response yields in status code 200 and contains a JSON object containing the time series. Possible errors are:
- 401 – Unauthorized.
- 500 – e.g. wrong input parameters, content-type, etc. Error message given in response body.
query = "SELECT mean(\"value\") FROM \"auto~watt\" WHERE (\"uuid\" = '355f6856-e9a4-469f-8f22-3f8b037d064a') AND time >= now() - 30s GROUP BY time(10s) fill(none)" header = { "Content-Type": "application/json", "Authorization": "Bearer {}".format(access_token) } url = "https://tsd.proficloud.io/query?q={}".format(query) result = requests.get(url, headers=header) if result.ok: print(json.dumps(result.json(), indent=4))
{ "results": [ { "statement_id": 0, "series": [ { "name": "auto~watt", "columns": [ "time", "mean" ], "values": [ [ "2020-07-21T13:01:30Z", 4520 ], [ "2020-07-21T13:01:40Z", 7690 ], [ "2020-07-21T13:01:50Z", 23500 ] ] } ] } ] }