Script Builder 使用說明

服務介紹

  • 腳本建置器( Script Builder),提供用戶透過 JavaScript 語法,以及 OmniThings 所提供的演算函式進行雲端運算。所執行的腳本將於 Omnithings 伺服器上進行運算,用戶可讀取出自身所建置 Schema 內之資料,建立(商業)邏輯後進行運算,亦可將運算所得的結果再存入 OmniThings Schema。腳本內必須包含主程式區塊( main function),OmniThings 腳本運算服務將辨識主程式區塊進行運算。

專有名詞

  1. - SID:
    每個應用在 ASUSCloud Platform 都需要有一個獨立的 SID(Security ID),每一個 SID 會對應到一把 Program Key。
  2. - Schema:
    描述 entry 的 attribute 組成 ,組成內需包含 key schema。當進行資料查詢時,必須送出至少一項 key schema 內的 attribute 為查詢條件。
  3. - Service:
    每個用戶在系統內專屬的資料集代號,若將 Service 比喻為系統配發的資料庫,而 Schema 則為用戶於資料庫內建立的資料表。

腳本排程管理

  • 腳本排程管理提供用戶將已建立之腳本檔案建立排程,排程將於所設定之時間點於OmniThings伺服器上自動執行

參數說明

參數 說明
腳本檔 為所要加入排程設定之腳本檔案
週期 排程所排定之執行週期,目前服務提供週期:每小時、每日、每週、每月
指定時間 設定於週期內所欲執行排程之時間點:
  • 每小時可指定至某時刻(0, 15, 30, 45分)
  • 每日可指定至某小時
  • 每週可指定星期幾
  • 每月可指定特定日

Omni Utility 函式說明

  • OmniThings 腳本建置器提供基本函式功能供運算使用。

  • Omni.sum([]: Numbers) - 數值加總

進行陣列數值加總運算

var main = function(){
 
    var numbers = [1, 2, 3, 7, 5.5, 3.3];
    var sum = Omni.sum(numbers);
   
    return {sum:sum};
}
------------------------------------
{"sum":21.8}    //回傳結果

  • Omni.avg([]: Numbers) - 數值平均

進行陣列數值平均運算

var main = function(){
 
    var numbers = [1, 2, 3, 7, 5.5, 3.3];
    var avg = Omni.avg(numbers);
   
    return {avg:avg};
}
------------------------------------
{"avg":3.6333333333333333}    //回傳結果

  • Omni.min([]: Numbers) - 最小值

判斷陣列中最小值

var main = function(){
 
    var numbers = [1, 2, 3, 7, 5.5, 3.3];
    var min = Omni.min(numbers);
   
    return {min:min};
}
------------------------------------
{"min":1}    //回傳結果

  • Omni.max([]: Numbers) - 最大值

判斷陣列中最大值

var main = function(){
 
    var numbers = [1, 2, 3, 7, 5.5, 3.3];
    var max = Omni.max(numbers);
   
    return {max:max};
}
------------------------------------
{"max":7}    //回傳結果

  • Omni.stddev_samp([]: Numbers) - 樣本標準差

進行陣列數值樣本標準差運算

var main = function(){
 
    var numbers = [1, 2, 3, 7, 5.5, 3.3];
    var samp = Omni.samp(numbers);
   
    return {samp:samp};
}
------------------------------------
{"samp":2.23308456325923}    //回傳結果

  • Omni.stddev_pop([]: Numbers) - 母體標準差

進行陣列數值母體標準差運算

var main = function(){
 
    var numbers = [1, 2, 3, 7, 5.5, 3.3];
    var pop = Omni.pop(numbers);
   
    return {pop:pop};
}
------------------------------------
{"pop":2.038517980189421}    //回傳結果

  • Omni.getDate(TimeZone: String) - 取得日期

取得系統日期

var main = function(){
    return {"date":Omni.getDate('Asia/Taipei')}
}
------------------------------------
{"date":"2018-01-29"}    //回傳結果

  • Omni.getDatetime(TimeZone: String) - 取得日期時間

取得系統日期時間

var main = function(){
    return {"datetime":Omni.getDatetime('Asia/Taipei')}
}
------------------------------------
{"datetime":"2018-01-29 00:18:16"}    //回傳結果

  • Omni.queryEntries({sid: String, progKey: String, service: String, body: String}) - TSDBase Query

執行 TSDBase 查詢指令
參數 說明
SID 具備欲查詢schema查詢權限之SID
progKey SID參數所對應之progKey
service 所欲查詢schema所屬之Service
body 查詢之內容條件

  • Omni.putEntries({sid: String, progKey: String, service: String, body: String}) - TSDBase PutEntries

執行 TSDBase 寫入指令
參數 說明
SID 具備欲查詢schema查詢權限之SID
progKey SID參數所對應之progKey
service 所欲查詢schema所屬之Service
body 查詢之內容條件

參考範例

範例一 - 陣列運算

本範例示範透過Omni函式進行矩陣運算


/* Script 運作起始於 main function */
var main = function(){
 
    var numbers = [1, 2, 3, 7, 5.5, 3.3];
    var sum = Omni.sum(numbers);
    var avg = Omni.avg(numbers);
    var max = Omni.max(numbers);
    var min = Omni.min(numbers);
    var samp = Omni.stddev_samp(numbers);
    var pop = Omni.stddev_pop(numbers);

    return {sum:sum,avg:avg,max:max,min:min,samp:samp,pop:pop};
}

範例二 - TSDBase資料讀寫

本範例示範透過Omni函式進行TSDBase資料存取功能


/* Script 運作起始於 main function */
function main(){

	/* Request Object of Query */
	var queryReq = {
		sid: "{SID}", 
		progKey: "{ProgKey}",
		service: "SmartCity",
		body: JSON.stringify(buildQueryBody())
	};

	var rs = Omni.queryEntries(queryReq);

	var entries = rs.entries;
	var s_d0 = mapBy(entries, 's_d0');
	var s_t0 = mapBy(entries, 's_t0');
	var s_h0 = mapBy(entries, 's_h0');

	/* Request Object of PutEntries */
	var putReq = {
		sid: "{SID}", 
		progKey: "{ProgKey}",
		service: "IOT47009100",
		body: JSON.stringify(buildPutEntries('28C2DDDD4414', Omni.getDatetime('Asia/Taipei'), Omni.sum(s_d0),Omni.avg(s_d0),Omni.stddev_samp(s_d0)))
	};
	
	var status = Omni.putEntries(putReq);

	return {status:status};
}

var mapBy = function(entries, name){
	var ary = new Array();
	var i = 0;
	for(; i< entries.length; i++){
		ary.push(entries[i][name]);
	}
	return ary;
};

var buildQueryBody = function(){
	var date = Omni.getDate('Asia/Taipei');
	var initial = date + ' 00:00:00';
	var finish = date + ' 00:59:59';
	var body = {schemaname:"AirBox",
				limit:10000,
				keyconditions:[["device_id","=","28C2DDDD4414"],["time","BETWEEN",[initial,finish]]],
				query_attributes:["time","device_id","s_0","s_1","s_2","s_3","s_d0","s_t0","s_h0"]};

	return body;
};


var buildPutEntries = function(id, time, sum, avg, stddev){
	return {schemaname: "EntryTest",
			entries: [{time:time, id:id, sum:sum, avg:avg, dev_std:stddev}]};
}