脚本

更新时间:2018-10-12 18:08:50

脚本作为应用组建的重要补充,为用户提供更加灵活的方式来实现项目的业务逻辑。当前平台支持的脚本语言为node.js。编程语法及支持的内容都和标准node.js相同。

新建脚本

通过点击项目工作台左侧的“脚本”按钮,进入脚本管理页面。

image.png | left | 747x326

点击列表右上侧的“新建脚本”按钮会弹出新建脚本弹窗。

image.png | center | 500x289.7822445561139

用户需要为脚本命名,现阶段仅支持Node.js脚本。点击确认后,进入脚本编辑流程。

image.png | left | 747x327

新建出的脚本文件,平台会为用户自动生成必须的初始化代码。如下所示:

const IIoTClient = require('./iiot-sdk/iiot-sdk.js'); 
 module.exports.handler = function(event, context, callback) { 
 const client = new IIoTClient({ 
 appKey: process.env['appKey'], 
 appSecret: process.env['appSecret'] 
 }); 

  // 插入您的代码

  callback(null, 'hello'); 
 }

用户可以快速地在已有的代码中开始自己的业务逻辑的书写。其中IIoTClient为系统为用户实例化的一个可以对平台数据源,设备进行操作的对象实例。由于脚本的语法本身完全与Node.js相同,所以在此不对脚本的基础使用作介绍,下面会重点介绍如何通过脚本对项目中的数据源和设备进行操作。

数据源操作

数据写入

说明:将脚本内计算的数据写入指定的数据源节点内。



/**

* @param params 数据源写入参数

* {

*      "id" : 582,                    //int, 数据源Id

*      "name" : "SourceTable",        //String, 数据源标识。标识和Id,二者选一即可

*      "nodes" : ["field1","field2"],      //数据表字段名数组

*      "data" : [["f1","f2"],["f3","f4"]]  //数据内容数组

* }
 @returns {}

*/
pushDataToDataSource(params);

数据拉取

说明:通过一定规则条件从指定数据源节点获取数据。


/**

* @param params 数据源拉取参数

* {
      "id":123                               //数据源ID
      "name":"SourceForTest",                //数据源名称,名称、ID至少填一个
     "expr":{
     "condition":[{
         "col":"city",
       "op":"EQUAL",
       "value":"北京"
      }],
     "op":"AND"
    },
    "nodes":[                              //需要查询的列名
           {"name":"field1"},
        {"name":"field2"}
    ],
    "page":{"to":1, "size":15},             //分页信息
    "orderby":[{"col":"id", "type":"asc"}]  //排序信息

* }

* @returns {*}

*/
pullDataFromDataSource(params);

操作示例

const IIoTClient = require('./iiot-sdk/iiot-sdk.js');
module.exports.handler = function(event, context, callback) {

    const client = new IIoTClient({
        appKey: process.env['appKey'],
        appSecret: process.env['appSecret']
    });

    const params = {'data':[['北京',10.1,'2018-04-26 00:00:00'],['北京',19.8,'2018-04-26 02:00:00']],'id':15132,'name':'数据源名称','nodes':['city','temp','time']};

    client.pushDataToDataSource(params).then(value => {
        console.log('ok, data : ' + JSON.stringify(value));
        callback(null, value);
    }, error => {
        console.error('failed, data :'  + JSON.stringify(error));
        callback(error);
    });
}

设备操作

获取设备属性

说明:获取指定设备对应属性的快照数据。</span>

    /**
     * @param params
     * {
            "productKey":""                 //产品标识符
            "deviceName":"",                //设备名称
            "propertyIdentifier":""         //属性标识符
     *  }
     * @returns {*}
     */
    getDeviceProperty(params);

设置设备属性

说明:设置指定设备属性</span>

/**
 * @param params
 * {
        "productKey":""                 //产品标识符
        "deviceName":"",                //设备名称
        "properties":{                  //属性标识符
            "property1":"xxx",
            "property2":"xxx"
        }
 *  }
 * @returns {*}
 */
setDeviceProperty(params);

调用设备方法

说明:调用设备提供的方法,需要指定方法名与方法参数。</span>

/**
 * @param params 数据源拉取参数
 * {
        "productKey":""                 //产品标识符
        "deviceName":"",                //设备名称
        "method":""                     //服务方法名
        "inputParams":{                 //服务方法
            "param1":"xxx",
            "param2":"xxx"
        }
 *  }
 * @returns {*}
 */
invokeDeviceService(params);

调用示例

获取设备的“temperature”属性:

const IIoTClient = require('./iiot-sdk/iiot-sdk.js');
module.exports.handler = function(event, context, callback) {

    const client = new IIoTClient({
        appKey: process.env['appKey'],
        appSecret: process.env['appSecret']
    });

    const params = {"productKey":"xxxxxxxxxx","deviceName":"dfadfa",
        "propertyIdentifier":"temperature"};

    client.getDeviceProperty(params).then(value => {
        console.log('ok, data : ' + JSON.stringify(value));
        callback(null, value);
    }, error => {
        console.error('failed, data :'  + JSON.stringify(error));
        callback(error);
    });
}

设置设备的“temperature”属性:

const IIoTClient = require('./iiot-sdk/iiot-sdk.js');
module.exports.handler = function(event, context, callback) {

    const client = new IIoTClient({
        appKey: process.env['appKey'],
        appSecret: process.env['appSecret']
    });

    const params = {"productKey":"xxxxxxxxxx","deviceName":"dfadfa","properties":{"temperature", 26.5};

    client.setDeviceProperty(params).then(value => {
        console.log('ok, data : ' + JSON.stringify(value));
        callback(null, value);
    }, error => {
        console.error('failed, data :'  + JSON.stringify(error));
        callback(error);
    });
}

调用设备的设置温度服务

const IIoTClient = require('./iiot-sdk/iiot-sdk.js');
module.exports.handler = function(event, context, callback) {

    const client = new IIoTClient({
        appKey: process.env['appKey'],
        appSecret: process.env['appSecret']
    });

    const params = {"productKey":"xxxxxxxxxx","deviceName":"dfadfa","inputParams":{
            "param1":"xxx",
            "param2":"xxx"
        }};

    client.invokeDeviceService(params).then(value => {
        console.log('ok, data : ' + JSON.stringify(value));
        callback(null, value);
    }, error => {
        console.error('failed, data :'  + JSON.stringify(error));
        callback(error);
    });
}

脚本执行

在完成编码后,用户需要先对脚本进行保存,保存按钮位于编辑器的右上部分。在完成保存后,通过编辑器的左上侧的执行按钮来完成一次脚本的执行。同时,可以在编辑器的调试输出窗口中看到脚本的执行返回情况。通过反复执行和观察输出,完成脚本的调试。

组态触发

image.png | left | 747x260

通过在组态中绑定脚本与输入框,将数据的内容作为输入参数调用脚本。传入的参数对应脚本入口函数handler的event参数,格式为JSON字符串。在脚本中可以通过event做JSON转换后获取配置的参数值。
例如图中示例,“确定”按钮关联了输入框与脚本“006”,并制定输入框内容对应参数名为“arg1”。当输入框填写“test”并点击“确认”按钮后,会向后台脚本发起调用请求,并携带参数'{"arg1":"test"}'。后台脚本通过var eventJson = JSON.parse(event) 获取event JSON对象,然后通过eventJson.arg1在脚本内获取输入框填写内容。
event是有脚本调用方封装数据格式传入脚本中,一般是JSON格式,脚本内通过解析event的格式来获取脚本调用的入参数据。在组态触发中event封装的为输入框组合的数据。

规则触发

规则触发关联脚本执行时,会在后台封装event数据格式,携带设备标识参数。触发器服务会对设备上报属性、上报事件发送不同的even数据格式。

<设备属性触发>

{
    "source":"DEVICE_STATUS",  //消息来源
    "timestamp":1523844349000, //消息时间戳(毫秒级)
    "context":{  //消息的上下文数据,比如设备id,设备分组,场景id等
      "deviceName":"test001",
      "productKey":"a1OvAcS1uxy",
    "sceneId":"1q2w3e"
    },
    "bodyData":{ //消息的主要数据,比如设备上报的属性数据
      "LightSwitch":{
            "time":1524216467962,
            "value":0
        }
    }
}

<设备事件触发>

{
    "source":"DEVICE_EVENT",  //消息来源
    "timestamp":1523844349000, //消息时间戳(毫秒级)
    "context":{  //消息的上下文数据,比如设备id,设备分组,场景id等
      "deviceName":"test001",
      "productKey":"a1OvAcS1uxy",
    "eventCode":"Shortage",
    "sceneId":"1q2w3e"
    },
    "bodyData":{ //消息的主要数据,比如设备上报的属性数据
      "x":0,
        "y":1,
        "inventory":10    
  }
}

results matching ""

    No results matching ""