IoT 시계열 데이터 처리 정보 - Azure Time Series Insights의 집계 처리

개요



Azure Time Series Insights는 시계열 데이터에 대한 임시 저장소 역할을 합니다. IoT에서는 데이터가 시계열인 경우가 많으며 센서의 데이터인지 여부에 따라 시각화나 분석 전에 데이터를 처리해야 합니다. 특히 시계열 데이터는 데이터의 결손이나, 시간 간격의 불균일성, 노이즈 등에 대해서 처리를 실시할 필요가 많이 발생합니다. 일정한 시간 간격으로 처리된 데이터를 출력할 수 있으면, 임시 스토어로서도 상당히 유용하게 될 것으로 생각됩니다.



Azure Time Series Insights를 사용하면 API 및 JSON 기반 쿼리 언어로 다양한 집계 작업을 수행할 수 있습니다. API 호출을 Python에서 가고 싶습니다.
이전 기사에서 만든 환경을 사용합니다.



Azure API는 인증으로 Oauth2.0을 인증으로 사용합니다. 처리는 이하의 순서로 실시합니다.

디렉토리에 등록하고 키 발급



어플리케이션의 등록을 실시해, 이하의 3개의 항목을 메모합니다.

A: 디렉토리 ID

B: 애플리케이션 ID

C: 키

리소스(서비스)에 등록된 애플리케이션에 대한 액세스 권한을 설정합니다. Time Series Insights 포털 페이지로 이동하여 설정합니다.



API를 통해 액세스 토큰 발급



이전 단계에서 메모한 내용을 메시지 본문에 URLENCODE하고 https에서 API URL로 POST합니다.
AUTH_API_URL = "https://login.windows.net/AのディレクトリID/oauth2/token?api-version=1.0"
 token_query = {
      'grant_type': 'client_credentials',
      'resource': 'https://api.timeseries.azure.com/',
      'client_id':’BのアプリケーションID', 
      'client_secret':'Cのキー'
 }
 token_request = urllib2.Request(AUTH_API_URL,urllib.urlencode(token_query))
 token_request.add_header('Content-Type','application/x-www-form-urlencoded')
 response = urllib2.urlopen(token_request)

Time Series Insights를 만들고 FQDN 기록



만드는 방법은 여기을 참조하십시오. D의 FQDN을 기록해 둡니다.



액세스 토큰을 이용하여 서비스 이용



위가 성공하면 액세스하기 위한 토큰이 리턴됩니다. 해당 토큰을 사용하여 Time Series Insights의 집계 기능에 액세스합니다.

집계는 JSON 형식으로 쿼리를 정의하고 Websocket API로 보내 집계를 수행합니다. API 참조는 여기입니다.

쿼리는 JSON으로 작성됩니다. 참조는 여기입니다.

아래는 온도(temperature) 습도(humidity)를 집계하는 쿼리 예입니다. 1분 단위로 집계하고 있습니다. 이 처리로 시간 간격을 일정하게 합니다(평균)
{
  "content": {
    "searchSpan": {
      "from": "2017-08-08T00:00:00.000Z",
      "to": "2017-08-08T02:00:00.000Z"
    },
    "aggregates": [
      {
        "dimension": {
          "dateHistogram": {
            "input": {
              "builtInProperty": "$ts"
            },
            "breaks": { "size": "1m" }
          }
        },
        "measures": [
          {
            "avg": {
              "input": {
                "property": "temperature",
                "type": "Double"
              }
            }
          },
          {
            "avg": {
              "input": {
                "property": "humidity",
                "type": "Double"
              }
            }
          },
          {
            "count": { }
          }
        ]
      }
    ]
  },
  "headers": {
    "Authorization": "アクセストークンをセットする"
  }
}

쿼리를 제출하고 결과를 CSV로 표시하는 파이썬 코드입니다.
AUTH_API_URL = "https://login.windows.net/AのディレクトリID/oauth2/token?api-version=1.0"
REST_API_URL = "wss://DのFQDN.env.timeseries.azure.com/aggregates?api-version=2016-12-12"
import urllib2
import urllib
import json
import websocket
import ssl
try:
        token_query = {
                'grant_type': 'client_credentials',
                'resource': 'https://api.timeseries.azure.com/',
      'client_id':'BのアプリケーションID', 
      'client_secret':'Cのキー'
        }
         token_request = urllib2.Request(AUTH_API_URL,urllib.urlencode(token_query))
         token_request.add_header('Content-Type','application/x-www-form-urlencoded')
         response = urllib2.urlopen(token_request)
         result_token=response.read()
         token=json.loads(result_token)
         query_file = open('c:\\local\query4.json') -- JSONクエリをファイルから読み込んでいる
          request_query=json.load(query_file)
          request_query['headers']['Authorization']="Bearer "+token['access_token']--アクセストークンをクエリにセット

          wSocket = websocket.create_connection(REST_API_URL,sslopt={"cert_reqs": ssl.CERT_NONE})
          wSocket.send(json.dumps(request_query))
          result_wSocket =  wSocket.recv()
         dataset=json.loads(result_wSocket)--受信したJSONをPythonオブジェクトに変換
          index=0
          print "timestamp,","temperature,","humidity"
          for dimension in dataset['content'][0]['dimension']:
                         print dimension,",",dataset['content'][0]['measures'][index][0],",",dataset['content'][0]['measures'][index][1]
                         index=index+1
        wSocket.close()
except urllib2.HTTPError as e:
        print("HTTP Error: {0} - {1}".format(e.code, e.reason))
except urllib2.URLError as e:
        print("URL Error: {0}".format(e.reason))
except Exception as e:
        print("General Exception: {0}".format(e))

좋은 웹페이지 즐겨찾기