LoginSignup
1
0

More than 1 year has passed since last update.

netatomのstationデータをAWS Elasticsearch Serverへ流し、そのデータ描画をする

Posted at

この記事は何?

前の記事の続きとなります。
netatmoのデータ取得ができたので、このデータを使ってAWS Elasticsearch Serverでデータ取得から描画まで行います。

AWS Elasticsearch Serviceとは?

概要だけつまむと、データレイクのElasticsearchと可視化BIツールのkibanaが合体したサービス。各サービスの結合と必要な設定を担当してくれます。

AWS Elasticsearch Serviceの環境構築

AWS Elasticsearch Serviceの新規環境構築していきます。
スクリーンショット 2021-08-16 14.01.29.png
AWSコンソールを開きElasticsearch Serviceから新しいドメイン作成から環境構築します。
スクリーンショット 2021-08-16 18.39.18.png

途中の設定のうち今回は動くことを目標とするため、デフォルトから2つ設定を変更します。
1つがネットワーク構築です。これをパブリックアクセスとすることでどこからでもアクセスが可能と変更します。
このままだとどこからでもアクセスし放題のため、次でアクセス制限をかけます。
スクリーンショット 2021-08-16 18.21.17.png
2つ目のアクセス制限です。アクセスポリシーからCIDR表記でアクセス制限をかけます。
スクリーンショット 2021-08-16 18.22.06.png

これから最後まで設定して、最終的に新しくドメインを取得することができ、elasticsearchとkibanaの環境が得られました。

スクリーンショット 2021-08-16 18.36.18.png

Elasticsearchにデータを挿入する

前章で取得したnetatmoのアクセストークンを使ってデータをkibanaに流し込みます。
この時ポイントは2つあり、netatmoのデータを加工しElasticsearchが時系列として扱えるよう日付データを追加し、kibanaのエンドポイントを都度変更しデータの上書きをしないようにしています。

時系列データを扱うため、このプログラムをlambdaで定期実行にしたり、cronで定期実行にしたりして時系列として扱えるようにします。

import datetime
import json
import requests
from requests.auth import HTTPBasicAuth


def get_date_suffix():
    now = datetime.datetime.now()
    return now.strftime('%Y%m%d%H%M%S')


def get_station_data():
    netatmo_headers = {'Content-Type': 'application/x-www-form-urlencoded', 'charset': 'UTF-8'}
    netatmo_url = 'https://api.netatmo.com/api/getstationsdata'
    netatmo_data = {
        'access_token': 'アクセストークン'
    }

    resp = requests.post(url=netatmo_url, headers=netatmo_headers, data=netatmo_data)
    json_data = json.loads(resp.text)

    # netatmoのデータがタイムスタンプ形式から、Elasticsearchで扱える形である「yyyy/mm/dd hh:mm:ss」へと変換し、カラムを追加する。
    unix_time = datetime.datetime.fromtimestamp(json_data['body']['devices'][0]['dashboard_data']['time_utc'])
    json_data['body']['devices'][0]['dashboard_data']['@timestamp'] = unix_time.strftime("%Y/%m/%d %H:%M:%S")

    resp_data = json.dumps(json_data)
    return resp_data

# エンドポイントを上書きしないように、リクエストのたびにURIの末尾を変更している
url = 'AWS Elasticsearch Service記載のエンドポイント' + '/trg/_doc/trg-kawahara' + get_date_suffix()
headers = {
    'Content-Type': 'application/json'
}
data = get_station_data()
auth = HTTPBasicAuth('kibanaのユーザーID', 'kibanaのパスワード')

basic_auth_req = requests.post(url=url, headers=headers, data=data, auth=auth)
print(basic_auth_req.text)

レスポンスは下のようにsuccessfulが帰ってきます。

{
  "_index": "trg",
  "_type": "_doc",
  "_id": "trg-kawahara20210816192617",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

kibanaでのデータ操作:データにindexをはる

kibanaの画面からはStack Managementでデータ操作をします。

スクリーンショット 2021-08-16 18.51.59.png

Stack ManagmentからCreateincex patternから投入データのindexを貼り、このindexを貼ったデータを使ってplotしてくことになります。
そのためまずindexを作ります。

スクリーンショット 2021-08-16 18.52.17.png

注目点はConfigure settingsで先ほどpythonで書いた日付データが時系列データとして出てくることです。

スクリーンショット 2021-08-16 19.35.11.png

これでデータにindexがはれたので、次は描画する部分を作ります。

kibanaでのデータ操作:描画する

データの準備ができたため、あとはデータから描画するところを作ります。
kibanaでは描画する機能をDashboardといい、Dashboardを操作して描画するものを作ります。

スクリーンショット 2021-08-17 9.22.01.png

Create newから新しい図を作成します。

スクリーンショット 2021-08-17 9.47.18.png

今回は折れ線グラフを描画したいため、Lineを選択します。

スクリーンショット 2021-08-17 9.46.23.png

選択するデータのメトリクスは下図のように、Y軸にCO2濃度を、X軸に時系列をとります。
設定するだけでは何も出ないため、設定を反映します。
図の設定が終わったら、Updateをクリックして設定を反映することで、描画することができます。

スクリーンショット 2021-08-17 9.43.31.png

あとは保存をすることで、Dashboardに描画する図が完成します。

スクリーンショット 2021-08-17 9.51.19.png

これでデータ挿入からデータ操作、描画まで一連の動作が完了です。
あとはこれを自分の欲しい図に沿って設定値を変更していくことが必要になっていきます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0