视频演示
一. 概述
为满足用户需求,SBOX支持用户配置规则引擎,以实现用户逻辑。
二. 创建规则引擎
1. 创建规则
登录网关管理界面->服务->规则引擎->添加规则,在弹框内依次写入规则ID(同一网关下不能重复)、Name、PollingTime。
2. 添加逻辑
完成规则创建之后,点击编辑->规则配置,添加相应代码逻辑,相关函数及示例见标题3。
三. 相关函数
1. 获取本地子设备数据
method.GetDevData("deviceId", "pointId")
该函数用来获取子设备数据点的数据,deviceId为子设备的ID(获取方式见附录); pointId为数据点的ID(获取方式见附录)。
例子:
point = method.GetDevData("modbus_tcp_model", "hum")
if point > 20 {
println(point)
}
2. 创建数据变量
method.NewData()
3. 本地设备数据下发
method.Set("deviceId", data)
该函数需要两个参数,其中,第一个为子设备的ID(获取方式见附录),第二个为method.NewData()变量。
例子:
newData = method.NewData()
newData["pointId"] = 3//其中 pointId 为数据点的ID
method.Set("modbus_tcp_model", newData)
4. 设备数据转发
method.Shift("serviceId", "topic", data)
该函数需要三个参数,其中,第一个为转发服务的ID(获取方式见附录), 第二个为转发的主题,第三个为method.NewData()变量。当第一个参数(转发服务ID)为空(“”)时, 将转发到所有转发服务。
例子:
newData = method.NewData()
newData["pointId"] = 3//其中 pointId 为数据点的ID
method.Shift("serviceId", "SBOX/data/send", newData)
5. 数据联动
假设网关1和网关2已配置相同云平台转发。网关1的子设备有数据点A,网关2的子设备有数据点B。 数据点A和数据点B要进行关联。数据点B等于数据点A的2倍。此时就可以使用网关的规则引擎,完成上述功能。
5.1. 星原云数据联动
method.SparksDataSet("gatewayMac", "deviceId", "pointId", value)
该函数需要传入4个参数。其中
- gatewayMac: 要关联的网关的唯一ID,可以在网关详情页面查找(获取方式见附录)。
- deviceId: 要关联的子设备标识(获取方式见附录)。
- pointId:要关联的数据点ID(获取方式见附录)。
- value: 要下发的值,数据类型可以为bool、整形、float。
5.2 阿里云数据联动
使用阿里云数据联动,由于需要配置用户的accessKey和accessSecret,所以不建议使用该功能(可以使用阿里云规则引擎)。如必须使用,建议创建RAM用户,并设置相关权限。
method.AliDataSet("accessKey", "accessSecret", "productKey", "deviceName", "pointId", value)
该函数需要传入6个参数。其中
- accessKey和accessSecret: 阿里云颁发给用户的访问服务所用的密钥ID和Secret。登录阿里云控制台,将光标移至账号头像上,然后单击accesskeys,跳转至用户信息管理页,即可创建、查看AccessKey和accessSecret。
- productKey: 要关联的阿里云网关子设备的productKey。
- deviceName:要关联的阿里云网关子设备的deviceName。
- pointId: 要关联的数据点ID(获取方式见附录)。
- value: 要下发的值,数据类型可以为bool、整形、float。
5.3 Thingsboard数据联动
5.4 私有云(MQTT)数据联动
method.StandMQTTDataSet("topic","gatewayMac", "deviceId", "pointId", value)
该函数需要传入5个参数。其中
- topic: 数据下发使用的主题。如果A、B两个网关数据下发主题配置相同,则该参数置空即可。网关会根据自身配置,自动生成主题。
- gatewayMac: 远端网关的唯一ID(获取方式见附录)。
- deviceId:远端网关下的子设备标识(获取方式见附录)。
- pointId: 要关联的数据点ID(获取方式见附录)。
- value: 要下发的值,数据类型可以为bool、整形、float。
案例:
pointB := method.GetDevData("modbus", "pointB") //获取本地标识为modbus设备的数据点pointB的值,并赋值给变量pointB
if pointB == 123 { //如果pointB的值为123
val := 321 //新建一个变量,赋值321
method.StandMQTTDataSet("","92320e7f173f", "td", "D1", val)//配置远端网关92320e7f173f,子设备td,数据点D1的值为321
}
6. 获取TF卡剩余容量
method.TFCardFree()
该函数返回TF卡剩余容量,保留两位小数,单位MB。
例子:
free = method.TFCardFree()
if free < 300{
//do something
}
注意:为保证系统稳定,当TF卡剩余容量不足300M时,便开启回滚机制,删除历史最早的数据,释放空间。
四.注意事项
- 网关bool值判断需要使用0和1进行,但bool值下发,则使用bool类型。例如:
switch01 := method.GetDevData("modbus", "switch01")
if switch01 == 1{
val := true
method.SparksDataSet("gatewayMac", "deviceId", "pointId", val)
}
五. 相关案例
1. 数据联动
有一个modbus TCP设备,设备ID为modbus_tcp_model
,数据点表如下图。
要求: 当土湿度大于20时, 光照度置为80,并新建一个数据点”soilHum_warning”,将土湿度乘以3,转发到所有服务;当土湿度等于20时,光照度置为50; 当湿度小于20时,光照度设置为7。
soilHum := method.GetDevData("modbus_tcp_model", "soilHum")
if soilHum > 20 {
//数据下发
setData = method.NewData()
setData["light"] = 80
method.Set("modbus_tcp_model", setData)
//转发
shiftData = method.NewData()
shiftData["soilHum_warning"] = soilHum*3
method.Shift("", "modbus_tcp_model", shiftData)
}else if soilHum == 20{
setData = method.NewData()
setData["light"] = 50
method.Set("modbus_tcp_model", setData)
}else{
setData = method.NewData()
setData["light"] = 7
method.Set("modbus_tcp_model", setData)
}
2. TF卡剩余容量判断并写入PLC
有一个modbus TCP设备,设备ID为modbus_tcp_model
,数据点表如下图。
要求:
- 将TF卡剩余容量写入标识为”TFFree”数据点。
- 当TF卡剩余容量小于100M时,标识为”TFStatus”的数据点置为flase;TF卡剩余容量大于等于100M时,标识为”TFStatus”的数据点置为true;
freeData = method.NewData()
statusData = method.NewData()
free = method.TFCardFree()
freeData["TFFree"] = free
method.Set("modbus_tcp_model", freeData)
if free < 100{
statusData["TFStatus"] = false
method.Set("modbus_tcp_model", statusData)
}else{
statusData["TFStatus"] = true
method.Set("modbus_tcp_model", statusData)
}
附录
1. 获取网关唯一ID
2. 获取子设备唯一ID(标识)
3. 获取数据点的唯一ID(标识)
网关管理界面->服务->子设备(通附录->标题2界面)。点击”点表”。