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の画面です。