應用腳本建置器
Schema 的資料來源來自於物聯網裝置發送,或是資料經過處理之後的結果。在這個教學中,我們藉由利用腳本建置器與排程功能來模擬一台智慧電表定時回報總用電量的功能。
{
"schemaname":"Electro",
"key_schema":[{"name":"StartTime","type":"DT"},{"name":"EndDeviceMAC","type":"S","length":32},
{"name":"GatewayID","type":"S","length":64},{"name":"UserID","type":"S","length":256},
{"name":"ClusterID","type":"S","length":64},{"name":"AttributeID","type":"S","length":64}
],
"attributes":[{"name":"EndTime","type":"DT"},{"name":"EndDeviceType","type":"S","length":32},
{"name":"AttributeValue","type":"D"},{"name":"AttributeTotalValue","type":"L"}
]
}
{
"StartTime": "2018-12-01 00:00:00",
"EndTime": "2018-12-01 00:00:00",
"AttributeTotalValue": 12345,
"EndDeviceMac": "mac_A",
"GatewayID": "gateway_A",
"UserID": "user_A",
"ClusterID": "65452",
"AttributeID": "attribute_A",
"EndDeviceType": "type_A",
"AttributeValue": 0
}
function main(){
var sid = '{SID}';
var progkey = '{Progkey}';
var service = '{Service}';
var datetime = new Date(Omni.getDatetime('UTC'));
datetime.setHours(datetime.getHours() - 1);
datetime.setMinutes(0);
datetime.setSeconds(0);
var entries = new Array();
/* add 60 data to Electro */
for(var i = 0; i < 60 ; i++){
entries.push(getEntries(datetime));
datetime.setMinutes(datetime.getMinutes() + 1);
}
/* Request Object of PutEntries */
var putReq = {
sid: sid,
progKey: progkey,
service: service,
body: JSON.stringify(buildPutEntries(entries))
};
Omni.putEntries(putReq);
}
var getEntries = function(time){
var timestamp = time.getTime();
var M = 999999999;
var value = timestamp % M;
return {
StartTime: dateFormat(time),
EndTime: dateFormat(time),
AttributeTotalValue: value,
EndDeviceMAC: 'mac_A',
GatewayID: 'gateway_A',
UserID: 'user_A',
ClusterID: '65452',
AttributeID: 'attribute_A',
EndDeviceType: 'type_A',
AttrivuteValue: '0'
};
}
var buildPutEntries = function(entries){
return {schemaname: "Electro",
entries:entries};
};
var dateFormat = function(time){
return time.getFullYear() + '-' + (time.getMonth() + 1) + '-' + time.getDate() + ' ' + timeChcck(time.getHours()) + ':' + timeChcck(time.getMinutes()) + ':' + timeChcck(time.getSeconds());
};
var timeChcck = function(value){
if(value < 10)
return '0' + value;
return value;
};
{
"schemaname":"ElectroHour"
"key_schema":[
{"name":"Time","type":"DT"},{"name":"EndDeviceMAC","type":"S","length":32},
{"name":"GatewayID","type":"S","length":64},{"name":"ClusterID","type":"S","length":64},
{"name":"AttributeID","type":"S","length":64}
],
"attributes":[
{"name":"AttributeValue_MAX","type":"D"},{"name":"AttributeValue_MIN","type":"D"},
{"name":"AttributeValue_AVG","type":"D"},{"name":"AttributeValue_COUNT","type":"UL"},
{"name":"AttributeValue_STDDEV_POP","type":"D"},{"name":"LastModified","type":"DT"}
]
}
{
"Time": "2018-12-01 00:00:00",
"LastModified": "2018-12-01 00:00:00",
"AttributeValue_AVG": 4,
"EndDeviceMac": "mac_A",
"GatewayID": "gateway_A",
"ClusterID": "65452",
"AttributeID": "attribute_A",
"AttributeValue_MAX": null,
"AttributeValue_MIN": null,
"AttributeValue_COUNT": 1,
"AttributeValue_STDDEV_POP": null
}
function main(){
var sid = '{SID}';
var progkey = '{Progkey}';
var service = '{Service}';
var K = 10 * 60000; // 10 minutes
var start = new Date(Omni.getDatetime('UTC'));
start.setHours(start.getHours() - 1);
start.setMinutes(0);
start.setSeconds(0);
var end = new Date(Omni.getDatetime('UTC'));
end.setMinutes(0);
end.setSeconds(0);
/* Request Object of Query */
var queryReq = {
sid: sid,
progKey: progkey,
service: service,
body: JSON.stringify(buildQueryBody(start, end))
};
var rs = Omni.queryEntries(queryReq);
var entries = rs.entries;
if(entries){
var first = entries[0];
var last = entries[entries.length - 1];
var firstTime = new Date(first['StartTime']);
var lastTime = new Date(last['StartTime']);
if((firstTime - start.getTime() <= K ) && (end.getTime() - lastTime <= K)){
var electroValue = last['AttributeTotalValue'] - first['AttributeTotalValue'];
/* Request Object of PutEntries */
var putReq = {
sid: sid,
progKey: progkey,
service: service,
body: JSON.stringify(buildPutEntries(start, electroValue))
};
Omni.putEntries(putReq);
}
}
}
var buildQueryBody = function(initail, finish){
return {schemaname:"Electro",
keyconditions:[["ClusterID","=","65452"],["StartTime","BETWEEN",[dateFormat(initail),dateFormat(finish)]]]};
};
var buildPutEntries = function(time, value){
var modified = dateFormat(new Date(Omni.getDatetime('UTC')));
return {schemaname: "ElectroHour",
entries: [{
Time: dateFormat(time),
LastModified: modified,
AttributeValue_AVG: value,
EndDeviceMAC:'mac_A',
GatewayID: 'gateway_A',
ClusterID: '65452',
AttributeID: 'attribute_A',
AttributeValue_MAX: 0,
AttributeValue_MIN: 0,
AttributeValue_COUNT: 1,
AttributeValue_STDDEV_POP: 0
}]
};
};
var dateFormat = function(time){
return time.getFullYear() + '-' + (time.getMonth() + 1) + '-' + time.getDate() + ' ' + timeChcck(time.getHours()) + ':' + timeChcck(time.getMinutes()) + ':' + timeChcck(time.getSeconds());
};
var timeChcck = function(value){
if(value < 10)
return '0' + value;
return value;
};