IoTで使うPython入門Step3-番外編 (2) Machinistへ接続①

 さまざまなクラウド・サービスができて、IoT関連もサポートされています。ただ、大規模なクラウドでは多彩なサービスが提供されているがゆえメニューは複雑なので、迷子になってしまいます。
 ここでは、IIJが始めたシンプルなクラウドを利用します。

提供されているサービス

 コースが三つあり、今回は無料のを利用します。https://machinist.iij.jp/ のページに行き、フリーの新規登録を選びます(2018/12/13にはフリー以外は選べなかった)。

 ダッシュボードが開きます。右上の設定アイコンをクリックします。

 プロフィールをクリックします。

 通信時に必要となるAPIキーをコピーします。クリップ・ボードに入るので、テキスト・ファイルにコピーし保存します。

Pythonでデータをアップする

 サンプルに従って、JSONのデータdataを作ります。

  • agent エージェントはGPIO
  • metrics name メトリックスはtemperature
  • data_point value 測定データは仮に20.6℃
data = {
"agent": "GPIO",
"metrics": [
{
"name": "temperature",
"namespace": "1F Sensor",
"data_point": {
"value": 20.6
}
}
]
}

 ヘッダを作ります。必要なのは、最初の2行だけです。

headers = {
"Content-Type": "application/json",
"Authorization": "Bearer ここにAPIキーをコピペする",
"User-Agent": "Python3"
}

 プログラムです。APIキーは埋め込みではなく独立させました。
 data{}はテキスト・データなので、 json.dumps()でJSONデータ形式へ変換します。このときstrではなくbytesにするためにencode()します。
 urllib.request()でヘッダ、本体をpostします。
 res.read()で戻ってきたメッセージを読みます。JSON形式でなくプレーンなテキストを送ったときには400とか、いろいろなエラーが返ってきます。

import urllib.request
import json
APIKEY = "xxxxx"
Url = "https://gw.machinist.iij.jp/endpoint"
method = "POST"
data = {
"agent": "GPIO",
"metrics": [
{
"name": "temperature",
"namespace": "1F Sensor",
"data_point": {
"value": 20.6
}
}
]
}

headers = {
"Content-Type": "application/json",
"Authorization": "Bearer " + APIKEY,
"User-Agent": "Python3"
}

senddata = json.dumps(data).encode("ascii")
req = urllib.request.Request(Url, data=senddata, method=method, headers=headers)
with urllib.request.urlopen(req) as res:
html = res.read().decode("ascii")
print(html)
seikei = json.loads(html)
print(seikei)
toridasu = json.dumps(seikei, sort_keys=True, indent=4)
print(toridasu)
if "Succeeded" in html:
print("send OK")

 ファイル名をm-1b.pyとしてデスクトップに保存します。Windows 10にPython3をインストールしました。
 タスクバーにある「ここに入力して検索」にcmdと入力してコマンド・プロンプトを起動します。cd desktopでディレクトリを移動し、py m-1b.py で実行します。データのアップが完了すると、 "message": "Succeeded"が返されます。

 Webに行きます。

 メトリック数をクリックすると、データが表示されます。

使いやすく

 データを送る部分を独立した関数sendMachinist()にしました。引数に温度データを入れて呼び出します。
 10秒おきにダミー・データを送ります。

import urllib.request
import json
import time
APIKEY = "xxxxxx"
Url = "https://gw.machinist.iij.jp/endpoint"
method = "POST"

def sendMachinist(sokuteidata):
data = {
"agent": "GPIO",
"metrics": [
{
"name": "temperature",
"namespace": "1F Sensor",
"data_point": {
"value": sokuteidata
}
}
]
}

headers = {
"Content-Type": "application/json",
"Authorization": "Bearer " + APIKEY,
"User-Agent": "Python3"
}

senddata = json.dumps(data).encode("ascii")
req = urllib.request.Request(Url, data=senddata, method=method, headers=headers)
with urllib.request.urlopen(req) as res:
html = res.read().decode("ascii")
if "Succeeded" in html:
print("send OK")

i = 2
for sdata in range(10):
sendMachinist(sdata+i*3);
time.sleep(10);

 送信プログラムを実行している画面です。

 Webの画面です。