Document
Everything about obniz

ObnizはAWS Lambdaなどのサーバーレスでも使うことができます. サーバーレスサービスで使うことで,web hookなどにも対応しやすくなり,最小限のコストでいろいろなものが作れます

ここではAWS Lambdaでobnizを使ってみます.

Nodeファイルの作成

AWS Lambdaのnodeはv6.10ですが,obnizはv7.6以上で動きます なのでそのままでは動きませんが,obnizにはv6.10用のコードも付いていますので,そちらを使うことで使えます

まず,lambdaで動かすnode packageを作り,obnizをインストールします

mkdir obniz_lambda
cd obniz_lambda
npm install obniz

lambdaでは“index.js”が必要なので,それも作ります

touch index.js

そうすると,フォルダ構成はこのようになっています.

index.jsの中に動かしたいobnizコードを書きます. たとえば,次のコードはディスプレイに“Hello World”を表示し,PIN0~2に繋がったサーボモータを動かすコードです.

var Obniz = require("./node_modules/obniz/index-for-node6.10.js");

exports.handler = function(event, context, callback) {
  var obniz = new Obniz("YOUR OBNIZ_ID_HERE");
  obniz.onconnect = function () {

    var servo = obniz.wired("ServoMotor", {gnd:0, vcc:1, signal:2});
    servo.angle(90.0);

    obniz.display.clear();
    obniz.display.print("Hello World");

    obniz.wait(500).then(function(){
      servo.angle(0.0);
      obniz.close();
      callback(null, "success");
    });

  };
};

YOUR OBNIZ_ID_HERE のところは自分の持っているobnizIDに置き換えてください

コードのポイントはいくつかあります.

require(“./node_modules/obniz/index-for-node6.10.js”) は node v6.10 のobnizコードをロードするための書き方です.

exports.handler = function … のように書くことで,lambdaで使う関数を作成します. 何かイベント(Web hookやS3にファイルが作成されたなど)が起きたときにこの関数が呼ばれます. どんなイベントのときに呼ばれるかは後ほど設定します.

callback(null, “success”); はコールバック関数です.node.jsは非同期の言語なので,処理が終了したらコールバックを呼ぶ必要があります. また,この際に注意する必要があるのが,websocketです.websocketのコネクションを切断しないとlambda関数が終了せず,タイムアウトになってしまうので, きちんとobniz.close();を呼ぶ必要があります

AWS Lambdaの設定

LambdaにはコードはZIPでアップロードするので,zipファイルを作成します. このzipファイルは必要なnode_moduleを含み,index.jsがトップに来る必要があります. 間違えてフォルダごと圧縮しないように気をつけてください.(index.jsがobniz_lambda/index.jsなどの下位の階層に来てしまいます)

zip -r obniz_lambda_codes.zip index.js node_modules/ package-lock.json

ファイルの構成はこうなっています.

AWS Lambdaにアクセスしてログインします. https://aws.amazon.com/console/?nc1=h_ls

サービスからLambda を選んでください,リージョンも好きな場所変更します.(今回はTokyoにしています)

“Create Function”を押します

今回はまっさらな状態から作るので,“Author from scratch”を選び,項目を入力します.

Name : なんでもいいです. 私は“obniz_lambda”にしました Runtime : Node.js 6.10 Role : Choose an existing role Exisiting role : lambda_basic_execution

入力が終わったら “Create Function” を押します.

Function code のセクションで,ZIPにしたコードをアップロードします. code entry type を “Upload a .ZIP file” にして, “obniz_lambda_codes.zip” をアップロードします.

右上のSaveボタンを忘れずに押します. もし,3秒以上のコードが動く可能性がある場合は,“Basic setting”でタイムアウト時間を延長して保存します.

それではテストをしてみましょう “select a test event” の部分から,“Configure test events”を選択肢ます

イベントの名前をつけたら,作成します. 他のフィールドはそのままで大丈夫です.

テストをするために, obnizを電源につなげ,モータをつなげ,wifiにも接続します.

testボタンを押してテストを開始します.obnizに一瞬だけ"Hello World"が表示され,サーボモータが動いたと思います. 画面では "Execution result : successed."が表示されます.

もし失敗したら,コードや設定を見直してみてください. とくに, “YOUR OBNIZ CODE”を変更したか,timeoutが適切になっているかが注意点です.

AWS API Gatewayの設定

lambdaのイベントはいろいろなものがありますが,今回は外部のWebからアクセスできるように,API Gatewayの設定をします

Designerの中で“API Gateway”を選択肢ます,

“Configure triggers”が出てくるので,記入します. API name: なんでもいいです.“LambdaMicroservice”のデフォルトのままで大丈夫です Deployment stage : なんでもいいです.“prod” のデフォルトのままで大丈夫です Security : “Open” にします.セキュリティなしのどこからでの接続できる設定です.

保存するとこういう表示になります

API Gatewayの名前の部分(画像では“vbm34885sg”)をクリックしてAPI Gatewayの設定ページに行きます. とはいっても,設定は全て自動でされています.

この状態では非公開API担っているので,デプロイして後悔します. Actions → Deploy API を押します.

モーダルビューが出てくるので,Deployment stageを “prod” にしてデプロイします.

ブラウザから試す

デプロイすると自動で“prod Stage Editor”に移動します. Invoke URL(日本語だと URL の呼び出し)の横に書かれているのがAPI全体のベースアドレスです. lambdaと紐付けたURLは prod → / → /obniz_lambda → GETのページに有ります

Invoke URL(日本語だと URL の呼び出し)の横のURLがAPIのアドレスです. GETでアクセスすればlambdaが呼ばれる設定になっているので,そのままクリックすればobnizが動きます

デモとコード

http://www.youtube.com/watch?v=PZLQIo7apTQ

github : https://github.com/9wick/obniz_lambda