2016年02月02日

Raspberry PiからAPIでDynamoDBに保存したデータを取得してみる【GET】


◆今回のゴール

前回は、センサーで取得した気温をAPIでPOSTして、DynamoDBにデータをためることをやりました。

今回は、DynamoDBに溜めたデータをGET APIで取得します。

それではやってみましょう。

GETのAPIとFunctionはすでに前回の手順の中で作成済みです。

RaspberryPiでGETをするプログラムをPythonで書いていきます。


スポンサードリンク


今回は【Python3】を使用します。
任意のディレクトリに「raspi_get.py」という名前で新しくファイルをつくります。
 $ sudo vi raspi_get.py 

下記の通り編集して、保存します。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import httplib2
import urllib.parse
import json

param = sys.argv

url = "https://●●●●●●.●●●●●●●.ap-northeast-1.amazonaws.com/prod/raspi/%s" % param[1]

myheaders = {
  "x-api-key" : "●●●●●●●●●●●●●●●",
  "Content-type" : "application/json",
  "Accept" : "application/json"
}

if (len(param) > 2):
  url = url + "?" + param[2]


print (url)
h = httplib2.Http()

resp, content = h.request(url, "GET",  headers = myheaders )

print (resp.status)
print (resp.reason)

print (content)

10行目は、前回手順「4-5、endpointの確認」で確認したURLに置き換えます。
13行目は、前回手順「4-5、API Keyの作成」で発行したAPI Key に置き換えます。

保存したら、実行権限を付けます。
$ sudo chmod +x raspi_get.py 

実行する


実行する際、第1引数はセンサーの識別子、第2引数は検索条件を付与します。
前回、気温をPOSTする際に識別子を「temperature」としているので、これを付与します。

第1引数は必須
第2引数はオプションです。


データはJSON形式で取得できます。

直近50件分のデータを取得
第2引数を省略した場合、直近50件分のデータが取得できます。
「50」という上限は、Lambdaの関数内で定義しています。
./raspi_get.py temperature

b'{"Items":[{"value":{"N":"25.5"},"date":{"S":"2016-01-02T00:00:01Z"},"type":{"S":"temperature"}},{"value":{"N":"29.5"},"date":{"S":"2016-01-28T05:00:01Z"},"type":{"S":"temperature"}},{"value":{"N":"21.7"},"date":{"S":"2016-01-23T00:00:01Z"},"type":{"S":"temperature"}}
以下略


直近n件分のデータを取得
第2引数にlimitで指定した件数のデータが取得できます。
ただし50件以上のデータは取得できないようにしています。
./raspi_get.py temperature 'limit=2'

b'{"Items":[{"value":{"N":"24.1"},"date":{"S":"2016-02-02T00:57:59Z"},"type":{"S":"temperature"}},{"value":{"N":"29.5"},"date":{"S":"2016-01-26T05:21:45Z"},"type":{"S":"temperature"}}],"Count":2,"ScannedCount":2,"LastEvaluatedKey":{"date":{"S":"2016-01-26T05:21:45Z"},"type":{"S":"temperature"}}}'


期間指定【指定日時〜現在】
第2引数にdate1を指定します。
「date1で指定した日時〜現在」の期間からデータが取得できます。
ここで指定する日時は協定世界時(UTC)です。
$ ./raspi_get.py temperature 'date1=2016-01-26T00:00:00Z'

b'{"Items":[{"value":{"N":"24.1"},"date":{"S":"2016-02-02T00:57:59Z"},"type":{"S":"temperature"}},{"value":{"N":"29.5"},"date":{"S":"2016-01-26T05:21:45Z"},"type":{"S":"temperature"}},{"value":{"N":"28.7"},"date":{"S":"2016-01-26T03:29:26Z"},"type":{"S":"temperature"}},{"value":{"N":"28.8"},"date":{"S":"2016-01-26T03:29:10Z"},"type":{"S":"temperature"}}],"Count":4,"ScannedCount":4}'


期間指定【指定日時〜指定日時】
第2引数にdate1、date2を指定します。
「date1で指定した日時〜date2で指定した日時」の期間からデータが取得できます。
ここで指定する日時は協定世界時(UTC)です。
$ ./raspi_get.py temperature 'date1=2016-01-04T15:00:00Z&date2=2016-01-05T20:00:00Z'

b'{"Items":[{"value":{"N":"22.5"},"date":{"S":"2016-01-05T19:00:05Z"},"type":{"S":"temperature"}},{"value":{"N":"22.7"},"date":{"S":"2016-01-05T18:00:10Z"},"type":{"S":"temperature"}},{"value":{"N":"22.9"},
中略
"Count":27,"ScannedCount":27}'


件数指定と期間指定の組み合わせ
limitとdate1、date2を指定します。
「date1で指定した日時〜date2で指定した日時」の期間から直近n件分のデータが取得できます。
$ ./raspi_get.py temperature 'limit=3&date1=2016-01-04T15:00:00Z&date2=2016-01-05T20:00:00Z'

b'{"Items":[{"value":{"N":"22.5"},"date":{"S":"2016-01-05T19:00:05Z"},"type":{"S":"temperature"}},{"value":{"N":"22.7"},"date":{"S":"2016-01-05T18:00:10Z"},"type":{"S":"temperature"}},{"value":{"N":"22.9"},"date":{"S":"2016-01-05T17:00:05Z"},"type":{"S":"temperature"}}],"Count":3,"ScannedCount":3,"LastEvaluatedKey":{"date":{"S":"2016-01-05T17:00:05Z"},"type":{"S":"temperature"}}}'


いろいろな条件を指定して、データを取得することができました。 呼び出し方を変えたり、LambdaのFunctionを改造することで、自分の使いやすいようにカスタマイズしてください。

posted by Raspberry Pi at 10:32 | Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。