概要
ブロックが持つ各機能の動作を定義するために、機能が持つ4つのメソッド {Initialize, Receive, Execute, Result} を実装します。
4つのメソッドの概要は以下の通りです。
| メソッド | 概要 |
| Initialize | 機能の初期化時に呼ばれます。 内部変数の確保やスケジューラーの設定といった、初期化処理が必要な場合に実装します。 |
| Receive | 入力コネクタからメッセージを受け取った際に呼ばれます。入力コネクタが複数あり、どれから受け取ったか区別したい場合に実装します。 |
| Execute | 機能実行時に呼ばれます。 通常、手続きはこのメソッドに記述します。 |
| Result | Executeメソッドが完了し、出力コネクタから次のブロックにメッセージを送信する際に呼ばれます。 出力コネクタが複数あり、どのコネクタからメッセージを出力するかを選びたい場合に実装します。 デフォルトでは全ての出力コネクタから出力されます。 |
また、ソフトウェアブロック開発で利用可能な共通の仕組みとして、
– 処理制御
– コネクタ制御
– 変数・定数
– ライブラリ
が用意されています。
処理制御
各メソッドの戻り値により、処理を中断するか継続するか(次のメソッドを呼ぶかどうか)を制御することができます。
例えば下記ソースコードの場合は、処理が継続し、次のメソッドが実行されます。
Receive / Execute / Result
return { resultType : "continue" }
制御は戻り値の”resultType”の値によって行います。”resultType”の値には以下の3つのパターンがあります。
| resultType | 処理制御 |
| “continue” | 次のメソッドを呼ぶ。 “resultType”が明示的に指定されなかった場合には、デフォルト値として”continue”が指定されたとみなされます。 |
| “stop” | 次のメソッドを呼びません。 |
| “pause” | 次のメソッドを呼びません。 Web APIなどの非同期のレスポンスが返ってくるのを待つなど、特定の条件が満たされるのを待つ場合に利用します。 |
コネクタ制御
ブロックの機能の入力コネクタが複数ある場合、どのコネクタから入力されたかを区別して処理を変えることができます。どの入力コネクタでメッセージを受け取ったかは、”Receive”メソッド内で参照可能な定数 “index” に格納されています。
入力コネクタIDを参照するサンプルソースコードは以下の通りです。
Receive
if ( index == 0 ) { //1番目のコネクタから入力
log( "message from #0" );
}
機能の出力コネクタが複数ある場合、通常、機能の実行完了後は全ての出力コネクタからメッセージが出力されますが、出力するコネクタを選択することもできます。設定は、”Result”メソッド内で戻り値に”indexes”としてコネクタID配列を指定します。
出力コネクタIDを設定するサンプルソースコードは以下の通りです。
Result
return {
indexes : [0, 1], //1番目, 2番目のコネクタから出力
resultType : "continue"
}
タスクスケジューラ
タスクスケジューラを設定すると機能をタイマー実行させることができます。
設定は、Initializeメソッドの戻り値に”taskConfig”オブジェクトを指定することで行います。下記の場合は、100秒間隔で機能が実行されます。
Initialize
return {
resultType : "pause",
taskConfig : {
mode : "interval",
seconds : 100
}
}
“taskConfig”の設定パターンは下記の通りです。
| 設定パターン | 例 |
| 一定間隔で実行 | |
| 毎日、指定した時間に実行 | |
| 指定した日時に実行 | |
変数・定数
ブロックの機能内のメソッドから共通にアクセスできる定数・変数が用意されています。定数・変数には下記の種類があります。
定数 : properties
定数 : index (“Receive”メソッド内のみアクセス可能)
ブロックの機能の入力コネクタが複数ある場合、何番目のコネクタで受け取ったかを示す値です。
参照は下記のように行います。
Receive
if ( index == 0 ) { //1番目のコネクタから入力
log( "message from #0" );
}
変数 : runtimeValues
ブロックの同一機能内のメソッド間で共有できる変数です。主にブロックの機能の状態変数としての利用を想定しています。
変数の初期化は”Initialize”メソッド内で行います。下記のように戻り値にruntimeValuesオブジェクトとして指定します。
Initialize
return {
runtimeValues : { count : 0 } //"count"という変数を定義して初期化する
}
変数へのアクセスは、各メソッド内でruntimeValuesオブジェクトを参照・更新して行います。ただし、更新を行った場合は、メソッドの戻り値として、runtimeValuesオブジェクトを必ず指定してください。忘れると、更新が反映されません。
Execute
runtimeValues.count++;
if ( runtimeValues.count == properties.Limit ) {
runtimeValues.count = 0;
return {
resultType : "continue", //処理を継続
runtimeValues : runtimeValues //runtimeValuesとして返す
};
} else {
return {
resultType : "pause", //処理を停止
runtimeValues : runtimeValues //runtimeValuesとして返す
}
}
変数 : messageValues
ブロック間でデータを受け渡すための変数です。レシピ作成画面上の接続元から接続先に送られるメッセージのデータを参照・更新できます。
変数へのアクセスは、各メソッド内でmessageValuesオブジェクトを参照・更新して行います。ただし、更新を行った場合は、メソッドの戻り値として、messageValuesオブジェクトを必ず指定してください。指定を忘れると、更新が反映されません。
メッセージ送信側ブロックのソースコード例は下記の通りです。
Execute
var msgVal = {};
msgVal.date = new Date(); //メッセージに情報(e.g. 実行日時)を追加
return {
messageValues : msgVal, //messageValuesとして返す
resultType : "continue"
}
メッセージ受信側ブロックのソースコード例は下記の通りです。
Execute
var date = messageValues.date;
ライブラリ
SDKではソフトウェアブロック開発で共通利用可能な関数の整備を進めています。
現状、下記2つの関数を用意しています。
Ajax
非同期HTTP通信機能です。
指定可能な主なパラメータは下記の通りで、基本的にはjQueryのajaxメソッドに準拠しております。
| パラメータ | 説明 |
| url | アクセスしたいURL |
| data | URLに送信したいデータオブジェクト |
| type | HTTP通信の種類 {GET / POST} |
| contentType | サーバにデータを送信する際に用いるcontent-typeヘッダの値 |
| dataType | サーバから返されるデータの型 {xml / html / script / json / jsonp / text} |
| timeout | タイムアウト時間(ミリ秒) |
| beforeSend | リクエスト送信前にコールバックされるイベントハンドラ |
| success | 通信が成功した場合にコールバックされるイベントハンドラ |
| error | 通信が失敗した場合にコールバックされるイベントハンドラ |
Ajaxは非同期通信のため、応答を待ちたい場合はメソッドの戻り値に resultType: “pause”を指定してください。
天気予報Webサービス(OpenWeatherMap service)を利用した天気チェック(詳細は「天気予報ブロック」を参照してください)のサンプルソースコードは以下の通りです。
Execute
//デイリーの天気予報を取得するAPI
var apiURL = "http://api.openweathermap.org/data/2.5/forecast/daily";
//APIを叩く際のパラメータ
//プロパティの値を渡す
var data = {
"q" : properties.location,
"cnt" : 1,
"APPID" : '1111111111' //取得したAPP Keyに置き換えてください
};
ajax ({
url : apiURL,
data : data,
type : "get",
timeout : 5000,
success : function ( contents ) {
//正しいデータが取れているかチェック
if ( !contents.list || !contents.list[ 0 ] || !contents.list[ 0 ].weather || !contents.list[ 0 ].weather[ 0 ] || !contents.list[ 0 ].weather[ 0 ].id ) {
log("Weather : Invalid data");
runtimeValues.outputIndex = -1;
callbackSuccess( {
resultType : "continue",
runtimeValues : runtimeValues
} );
}
//天気を示すID部分を抜き出し、数値に変換する
var idNum = contents.list[ 0 ].weather[ 0 ].id + 0;
//天気に応じて outputIndex の値を変更する
if ( ( 200 <= idNum && idNum <= 531 ) || ( 600 <= idNum && idNum <= 622 ) ) { //「雨」なら
runtimeValues.outputIndex = 2;
} else if ( 701 <= idNum && idNum <= 781 ) { //「くもり」なら
runtimeValues.outputIndex = 1;
} else if ( 800 <= idNum && idNum <= 802 ) { //「晴れ」なら
runtimeValues.outputIndex = 0;
} else { //それ以外なら「くもり」
runtimeValues.outputIndex = 1;
}
callbackSuccess( {
resultType : "continue",
runtimeValues : runtimeValues
} );
},
error : function ( request, errorMessage ) {
log("Weather : Network error");
runtimeValues.outputIndex = -1;
callbackSuccess( {
resultType : "continue",
runtimeValues : runtimeValues
} );
}
});
return {
resultType : "pause"
};




