AmbientのPythonライブラリーです。Ambientにデーターを送信する機能と、Ambientに蓄積されたデーターを読み込む機能があります。

インストール

ライブラリーはGithubに公開しました。Githubから次のようにライブラリーをインストールできます。

$ pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git
$ pip3 list | grep ambient
  ambient      0.1.6

ライブラリーの読み込み

ライブラリーの読み込みは次のようにおこないます。

import ambient

Ambientへのデーター送信

最初にチャネルIdとライトキーを指定してAmbientのインスタンスを作り、send()メソッドでデーターを送信します。

am = ambient.Ambient(チャネルId, ライトキー[, リードキー[, ユーザーキー]])
r = am.send({'d1': 数値, 'd2': 数値}[, timeout = timeout])
パラメーター

データーは上記のような辞書形式で渡します。キーは’d1’から’d8’までのいずれかを指定します。この形式でデーターを送信した場合、Ambientはデーターを受信した時刻を合わせて記録します。次のようにデーターを測定した時刻を指定することもできます。

r = am.send({'created': 'YYYY-MM-DD HH:mm:ss.sss', 'd1': 1.1, 'd2': 2.2})

また、次のように複数のデーターを一括で送信することもできます。

data = [
    {'created': '2017-02-18 12:00:00', 'd1': 1.1, 'd2': 2.1},
    {'created': '2017-02-18 12:01:00', 'd1': 1.5, 'd2': 3.8},
    {'created': '2017-02-18 12:02:00', 'd1': 1.0, 'd2': 0.8}
]
r = am.send(data)

timeoutはサーバー接続のタイムアウト値(秒)です。省略時は30.0秒になります。

戻り値

PythonのRequestsの戻り値と同じものが返ります。特に

r.status_code

に、サーバーにデーターを送信したときの結果(ステータスコード)がセットされます。送信に成功していれば200がセットされます。

例外

ambientライブラリーは内部でrequests(MicroPythonの場合はurequests)を使って処理しています。

requestsは通信エラーがあったとき、例外を発生させます。requestsが発生させる例外はrequestsドキュメントの「エラーと例外」に書かれています。それによると、原因によりConnectionError、HTTPError、Timeout、TooManyRedirectsが発生し、それらをまとめてrequests.exceptions.RequestExceptionで例外処理できるとのことです。

ambientライブラリーでデーターを送受信する時は、次のように例外を受けることができます。

import ambient
import requests

    try:
        ret = am.send(data)
        print('sent to Ambient (ret = %d)' % ret.status_code)
    except requests.exceptions.RequestException as e:
        print('request failed: ', e)

Ambientからのデーター読み込み

データー送信と同様に最初にチャネルIdとライトキー、リードキーを指定してインスタンスを作ります。読み込みしかしない場合、ライトキーは”を指定しても大丈夫です。

am = ambient.Ambient(チャネルId, ライトキー, リードキー[, ユーザーキー])

データーの読み込みにはデーター件数を指定する方法、日付を指定する方法、期間を指定する方法があります。

件数を指定してデーターを読み込む

d = am.read(n=件数[, skip=スキップ件数[, timeout = timeout]])
パラメーター
  • n: 読み込むデーター件数を指定します。最新のn件のデーターが読み込まれます。
  • skip: スキップ件数。最新からスキップ件のデーターを読み飛ばし、その先n件のデーターが読み込まれます。
  • timeout:サーバー接続のタイムアウト値(秒)。省略時は30.0秒。
戻り値
  • 次のような辞書形式(JSON形式)の配列が返されます。
[
    {'created': '2017-02-25T15:01:48.000Z', 'd1': 数値, 'd2': 数値, 'd3': 数値},
    {'created': '2017-02-25T15:06:47.000Z', 'd1': 数値, 'd2': 数値, 'd3': 数値},
    ...
]

データーの生成時刻’created’は協定世界時(UTC)で表示されます。データーは生成時刻の昇順(古いものから新しいものへ)で並びます。

日付を指定してデーターを読み込む

d = am.read(date='YYYY-mm-dd'[, timeout = timeout])
パラメーター
  • date=’YYYY-mm-dd’: 指定した日付のデーターを読み込みます。
  • timeout:サーバー接続のタイムアウト値(秒)。省略時は30.0秒。
戻り値

件数を指定した場合と同じ辞書形式の配列が返されます。

期間を指定してデーターを読み込む

d = am.read(start='YYYY-mm-dd HH:MM:SS', end='YYYY-mm-dd HH:MM:SS'[, timeout = timeout])
パラメーター
  • start=’YYYY-mm-dd HH:MM:SS’:
  • end=’YYYY-mm-dd HH:MM:SS’:
    startからendまでの期間のデーターを読み込みます。
  • timeout:サーバー接続のタイムアウト値(秒)。省略時は30.0秒。
戻り値

件数を指定した場合と同じ辞書形式の配列が返されます。

チャネル情報の取得

データー名やチャネルの位置情報など、Ambientで指定したチャネル情報を取得します。

prop = am.getprop([timeout = timeout])
パラメーター
  • timeout:サーバー接続のタイムアウト値(秒)。省略時は30.0秒。
戻り値

チャネル情報が辞書形式で返されます。d1からd8までのデーターに設定した名前は

prop['d1']['name']

で参照できます。

ダウンロードデーターの扱い

Ambientからライブラリーでデーターを読み込む方法とは別に、チャネルに保存したデーターをダウンロードし、そのファイルをPythonで読み込むこともできます。

次のようにするとチャネルに保存したデーターがcsv形式でファイルにダウンロードされます。

ファイルのエンコーディングはUTF-8形式で、先頭にバイトオーダーマーク (0xEF 0xBB 0xBF) というデーターが付与されています。

Pythonでこのファイルを読み込む時は、次のようにします。encoding=’utf_8_sig’を指定してください。

import csv
csv_file = open('./data100.csv', 'r', encoding='utf_8_sig')
f = csv.reader(csv_file)

ダウンロードしたデーターの先頭行は次のような形式です。チャネル設定でデーター名を設定している場合はd1〜d8がデーター名になります。

created,d1,d2,d3,d4,d5,d6,d7,d8

encoding=’utf_8_sig’を指定しないと、0xEF 0xBB 0xBFがデーターとして扱われ、次のようになってしまいます。

0xEF 0xBB 0xBF created,d1,d2,d3,d4,d5,d6,d7,d8

先頭行をprintすると’created’の前にバイトオーダーマークがついてしまっています。扱いにくいので、encoding=’utf_8_sig’を指定するようにしてください。

head = next(f)
print(head)
# ['\ufeffcreated', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8']

Python pandas で読み込む時は、次のようにします。ここでもencoding=’utf_8_sig’を指定してください。

import pandas as pd
df = pd.read_csv('./data100.csv', encoding='utf_8_sig')

encoding=’utf_8_sig’を指定しないと、’created’の前にバイトオーダーマークがついてしまいます。カラムを確認すると、’created’と表示されるのですが、実際には頭にバイトオーダーマークがついています。必ずencoding=’utf_8_sig’を指定してください。

df.columns
# Index(['created', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8'], dtype='object')
df['created']
# KeyError: 'created'

コードサンプル

コードサンプルは「AmbientのデーターをPythonで扱う」をご覧ください。