JAWS-Festa 2015登壇資料 URL の訂正

JAWS Festa 2015 「Raspberry Pi と AWS でIoT」資料ダウンロード先の訂正

http://jft2015.jaws-ug.jp/speaker/yukihito-kataoka/
JAWS Festa 2015 IoTトラック 「Raspberry Pi と AWS でIoT」資料ダウンロード先のURLが間違っていました。
誠に申し訳けございません。

お詫びと同時に、以下URLに訂正させて頂きます。
http://goo.gl/forms/41oaevDrAA

広告

6.S3静的htmlのJavaScriptでグラフ表示

jPlot

s3の静的サイトにグラフを表示するJavaSciptプログラムを含んだhtmlをアップします。

S3に保管したJSONのデータは、S3の静的サイト内からAJAXで利用できます。
上の画像は html 内の javascript プログラムで以下の処理を行って表示しています。
・JSONの1日のセンサ生データGET
・1分毎のJSONデータを1時間平均に計算
・グラフで表示

グラフには jqPlot を利用しています。

jqPlot
http://www.jqplot.com/

実際のhtml5内の javascript プログラムは以下で確認できます。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/tree/master/S3WebSite

実際にRaspberry Pi から AWS S3 にアップされたJSONデータのサンプルは以下で確認できます。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/tree/master/S3WebSite/Hub01

実際の動きは、以下のサイトで確認できます。
http://s.ykata.net/

こちらのjavascriptプログラムの詳細は上記サイトをご参照ください。

最初のページに 戻る

5.センサ値をクラウドに保管・表示

5.1.node.js の設定

参考情報

m_shige1979のささやかな抵抗と欲望の日々(id:m_shige1979さん )
http://m-shige1979.hatenablog.com/entry/2014/06/17/211645

以下の手順で、開発言語 node.js (Javascript) と、Amazon AWS にデータをアップするためのモジュールを設定します。

$ wget http://node-arm.herokuapp.com/node_latest_armhf.deb
$ sudo dpkg -i node_latest_armhf.deb
$ npm install aws-sdk
aws-sdk@2.1.34 node_modules/aws-sdk
├── xml2js@0.2.8
├── sax@0.5.3
└── xmlbuilder@0.4.2

$ npm install sax@0.5.8
$ npm install xml2js@0.2.8
$ npm install xmlbuilder@0.4.2
$ npm install sax@0.5.3

$ npm install aws-sdk

5.2.AWSコンソールの設定

AWSのコンソールにログインします。
今回は
Cognito => アクセスID認証
Identity and Access Management => アクセスIDの利用権限設定
S3 => 静的Webサイト sensor.ykata.net で公開する設定例
を利用します。

Cognito は現時点で日本のリージョンでは使えません。(夏頃 東京リージョン でも使えるらしいです。)
「バージニア北部」を選択します。
AWS-01

詳細はそれぞれ以下で確認してください。
http://aws.amazon.com/jp/cognito/
http://aws.amazon.com/jp/iam/
http://aws.amazon.com/jp/s3/

先ず Cognito を設定します。
Create new identity pool を行います。
AWS-02

以下 identity pool name が SensorHUB2 の例です。
Create Pool します。
AWS-03


以下自動作成してくれた権限設定はそのままで、許可 します。
Unauthのロール名は設定で使いますので控えておきます。
AWS-04

この画面に来ると設定は完了です。
Get AWS Credentials の赤字部分は設定で使いますので控えておきます。
Go to Dashboad します。

AWS-05

ダッシュボード画面が表示され、以上でCognitoの設定完了です。
AWS-06

Identity and Access Management (IAM)で、先に設定した Cognito で発行される アクセスID の利用権限を設定します。
ロールを選択します。
AWS-07

Cognito の Unauthのロール名 を選択します。
AWS-08

S3をデータ保管先として利用しますので、ポリシーのアタッチ を行います。
AWS-09

Amazon S3 Full Access を選択し、 ポリシーのアタッチ を行います。
AWS-10

以上で IAM の設定は完了しました。
AWS-11

S3にデータを保管する バケット を作成します。
このバケットは JSON でデータを保管するとともに、グラフなどで情報を閲覧するWebサイトとして利用する設定も行います。
AWS-12

バケット名を公開するドメインと同じにすると、公開Webとしても使えます。
リージョンは Cognito と同じになるよう注意して、作成 してください。
AWS-13

バケットができたら、公開Webとして使うための バケットポリシーを追加 します。
AWS-14

ポリシーエディタが起動します。
最初から作成するのは難しいので、AWS Policy Generator を利用します。
AWS-15

以下の例のように入力します。
AWS-16

ARNは arn:aws:s3:::バケット名/* を入力します。
今回の例では arn:aws:s3:::sensor.ykata.net/* となります。
Add Statement します。
AWS-17

以下のように追加されたら、Generate Policy します。
AWS-18

以上、完成したポリシーをコピーして、ページを閉じます。
AWS-19

最初の画面で、ペースト し、保存 します。
AWS-20

保存 して、静的ウエッブサイトホスティング の設定をします。
AWS-21

ウエッブサイトホスティングを有効にします。
インデックスドキュメントを index.html に設定して 保存 します。
AWS-22

以上で設定は完了しました。

S3のバケット内で右クリックすると、アップロードというメニューがあります。
そちらを開いて、htmlなどのファイルをアップすると、Webとして利用できます。

5.3.CognitoによるアクセスIDの発行

Cognitoで実際に アクセスID が node.js のプログラムで発行されるか、確認してみます。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/blob/master/cognito.js

$ nano cognito.js
var AWS = require(‘aws-sdk’);
var awsRegion = “us-east-1”;
var cognitoParams = {
AccountId: “AWSのアカウントID”,
RoleArn: “arn:aws:iam::AWSのアカウントID:role/Cognito_SensorHUBUnauth_Role”,
IdentityPoolId: “us-east-1:AWSのIdentityPoolId”
};

AWS.config.region = awsRegion;
AWS.config.credentials = new AWS.CognitoIdentityCredentials(cognitoParams);
AWS.config.credentials.get(function(err) {
if (!err) {
console.log(“Cognito Identity Id: ” + AWS.config.credentials.identityId);
}
});

実行してみると、実際にIdを獲得している様子が分かります。

$ node cognito.js
Cognito Identity Id: us-east-1:7a465491-dc91-44e7-9d8c-f08dd674c532

5.4.センサ値をS3へ発行

実際にCognitoで発行、取得したIdにS3にアクセスし、データを保管します。

先ずは、センサ値をCSV形式で出力しLCDに表示する Python プログラムを作成します。
ブロッグではインデントが表示されないので、動くコードは以下を参照してください。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/blob/master/getSensor.py

$ nano getSensor.py
#!/usr/bin/python
import time
import wiringpi2
import os
import sys
import struct
import subprocess
from time import sleep
from notsmb import notSMB
#from TSL2561 import TSL2561
from tsl2561_lux import Luxmeter

tmpVal = -999
humVal = -999
co2Val = -999
luxVal = -999

“”” LUX Setting “””
##tsl = TSL2561()
tsl=Luxmeter()

i = 0
while True:
try:
# luxVal = int(tsl.readLux())
luxVal = int(tsl.getLux())
if luxVal <= 200000 and luxVal > 100:
break
i = i + 1
if i > 5:
break
sleep(0.5)
except:
blank =0;
sleep(0.5)

“”” CO2 Setting “””
I2CBUS = 1
CO2_ADDR = 0x68
READ = 0x22
readBytes = [0x00, 0x08, 0x2A]
bus = notSMB(I2CBUS)

i = 0
while True:
try:
resp = bus.i2c(CO2_ADDR,[0x22,0x00,0x08,0x2A],4)
time.sleep(0.1)
co2Val = (resp[1]*256) + resp[2]

if co2Val < 8000:
break

i = i + 1
if i > 5:
break
except:
blank =0;
sleep(0.5)

“”” Temperature Humidity Setting “””
wiringpi2.wiringPiSetup()
i2c = wiringpi2.I2C()
dev = i2c.setup(0x40)

i2c.writeReg16(dev,0x02,0x10)
i2c.writeReg8(dev,0x00,0x00)
sleep((6350.0 + 6500.0 + 500.0)/1000000.0)
tmpVal = ((struct.unpack(‘4B’, os.read(dev,4)))[0] << 8 | (struct.unpack(‘4B’, os.read(dev,4)))[1])
humVal = ((struct.unpack(‘4B’, os.read(dev,4)))[2] << 8 | (struct.unpack(‘4B’, os.read(dev,4)))[3])
os.close(dev)
tmpVal = round(((tmpVal / 65535.0) * 165 – 40), 1)
humVal = round(((humVal / 65535.0) * 100), 1)

sleep(0.5)

line = time.strftime(‘%Y/%m/%d,’) + time.strftime(‘%H:%M:%S,’)
line = line + str(tmpVal) + “,” + str(humVal) + “,” + str(co2Val) + “,” + str(luxVal)
print line

parm1 = time.strftime(‘%m/%d_%H:%M’)
parm2 = “T:” + str(tmpVal) + “*c_H:” + str(humVal) + “%”
parm3 = “CO2:” + str(co2Val) + “ppm”
parm4 = “Lig:” + str(luxVal) + “LUX”
cmd = “/var/www/bin/oled %s %s %s %s” % (parm1, parm2, parm3, parm4)
subprocess.Popen( cmd.strip().split(” “) )

この python プログラムで得たセンサの計測値を AWS の S3 にJSONで保管する node.js のプログラムを作成します。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/blob/master/sensor.js

$ nano  sensor.js
var execSync = require(‘child_process’).execSync;
var id = “Hub01”;

var AWS = require(‘aws-sdk’);
var awsRegion = “us-east-1”;

// 1タイムアクセスID作成
var cognitoParams = {
AccountId: “AWSのアカウントID”,
RoleArn: “arn:aws:iam::AWSのアカウントID:role/Cognito_SensorHUBUnauth_Role”,
IdentityPoolId: “us-east-1:AWSのIdentityPoolId”
};
AWS.config.region = awsRegion;
AWS.config.credentials = new AWS.CognitoIdentityCredentials(cognitoParams);
AWS.config.credentials.get(function(err) {
if (!err) {
// console.log(“Cognito Identity Id: ” + AWS.config.credentials.identityId);
}
});

// S3
var s3 = new AWS.S3();
var bucket = ‘s.ykata.net’;
// センサ値取得
var result = “” + execSync(‘sudo /pi/home/getSensor.py’);

// 現在値をJSONでS3にアップ
var vRes = result.replace(/[\n\r]/g,””).split(“,”);
var vKeyN = id + “/now.json”;
var vKeyF = vRes[0].replace(/\//g,”_”);
var vKeyD = id + “/” + vKeyF + “.json”;
var vJson = ‘{“Date”:”‘+vRes[0]+'”,”Time”:”‘+vRes[1]+'”,”Temperature”:’+vRes[2]+’,’;
vJson = vJson + ‘”Humidity”:’+vRes[3]+’,”CO2″:’+vRes[4]+’,”Illuminance”:’+vRes[5]+’}’;
var params1 = {
Bucket: bucket,
Key: vKeyN,
ContentType: ‘application/json’,
Body: vJson
};
s3.upload(params1, function(err) {
if(err) {
console.log(“Error uploading data 01 : “, err);
}
});

// 1日のデータをファイルに保管し、JSONでS3にアップ
var fs = require(‘fs’);
var path = ‘./’+vKeyF;
var fsData = “”;
var fsUPData = “”;
try {
fs.statSync(path);
fsData = fs.readFileSync(path, ‘utf8’);
fsUPData = fsData + “,” + vJson;
} catch (e) {
execSync(‘echo “” >> ‘ + path);
execSync(‘chmod 666 ‘ + path);
fsUPData = vJson;
}
fs.writeFileSync(path, fsUPData,’utf8′);
var params2 = {
Bucket: bucket,
Key: vKeyD,
ContentType: ‘application/json’,
Body: ‘[‘ + fsUPData + ‘]’
};
s3.upload(params2, function(err) {
if(err) {
console.log(“Error uploading data 02 : “, err);
}
});

このプログラムを cron に登録すると、毎分のデータをJSONで AWS S3 にアップするようになります。
cron の記載はフルパスで記載します。

$ crontab -e
* * * * *  /usr/local/bin/node /home/pi/sensor.js 2>> /home/pi/cron.log

続きは 6.S3静的htmlのJavaScriptでグラフ表示 へ

 

AWSとRaspberry Pi でIoT入門 (第9回JAWS-UG佐賀)

- Raspberry Pi で農業(施設園芸)用センサ、クラウド環境分析システム構築入門 -

JAWS-UG佐賀で上記内容で話をさせて頂きました。
理論中心の座学だけでなく、実践を見て頂きたくも仕事の本番環境は全て公開できません。
そこで、新しいセンサを評価がてら、実際の機器、作業で、センサによる値の計測から、クラウドAWSでのデータ保管、グラフによるデータ解析を行う一連のデモシステムを作成しました。

折角のご縁で、時間を頂いて話を聞きに来られた訳ですので、少しでもお役に立ちたく思います。
そこで、興味のある方に是非「ダイブ」(実際に試)して頂くための、デモシステムを構築した記録を以下にまとめました。
是非、ご参照ください。

以下で紹介するプログラムのソースコードは以下に公開しています。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo

1.Raspberry Pi 初期設定
https://yukataoka.wordpress.com/2015/06/20/raspi01/

2.OSインストール後の設定
https://yukataoka.wordpress.com/2015/06/20/raspi02/

3.センサなどを使うための詳細設定
https://yukataoka.wordpress.com/2015/06/20/raspi03/

4.センサの設定とプログラミング
https://yukataoka.wordpress.com/2015/06/20/raspi04/

5.センサ値をクラウドに保管・表示
https://yukataoka.wordpress.com/2015/06/20/raspi05/

6.S3静的htmlのJavaScriptでグラフ表示
https://yukataoka.wordpress.com/2015/06/20/raspi06/

当日のスライド。
(後日公開予定)

実際のWebコンテンツ
http://s.ykata.net/