视频演示

点击查看【bilibili】

一. 概述

为满足用户需求,SBOX支持用户配置规则引擎,以实现用户逻辑。

二. 创建规则引擎

1. 创建规则

登录网关管理界面->服务->规则引擎->添加规则,在弹框内依次写入规则ID(同一网关下不能重复)、Name、PollingTime。
image.png

2. 添加逻辑

完成规则创建之后,点击编辑->规则配置,添加相应代码逻辑,相关函数及示例见标题3。
image.png

三. 相关函数

1. 获取本地子设备数据

  1. method.GetDevData("deviceId", "pointId")

该函数用来获取子设备数据点的数据,deviceId为子设备的ID(获取方式见附录); pointId为数据点的ID(获取方式见附录)。
例子:

  1. point = method.GetDevData("modbus_tcp_model", "hum")
  2. if point > 20 {
  3. println(point)
  4. }

2. 创建数据变量

  1. method.NewData()

该函数创建一个新的map类型的数据变量。

3. 本地设备数据下发

  1. method.Set("deviceId", data)

该函数需要两个参数,其中,第一个为子设备的ID(获取方式见附录),第二个为method.NewData()变量。
例子:

  1. newData = method.NewData()
  2. newData["pointId"] = 3//其中 pointId 为数据点的ID
  3. method.Set("modbus_tcp_model", newData)

4. 设备数据转发

  1. method.Shift("serviceId", "topic", data)

该函数需要三个参数,其中,第一个为转发服务的ID(获取方式见附录), 第二个为转发的主题,第三个为method.NewData()变量。当第一个参数(转发服务ID)为空(“”)时, 将转发到所有转发服务。
例子:

  1. newData = method.NewData()
  2. newData["pointId"] = 3//其中 pointId 为数据点的ID
  3. method.Shift("serviceId", "SBOX/data/send", newData)

5. 数据联动

假设网关1和网关2已配置相同云平台转发。网关1的子设备有数据点A,网关2的子设备有数据点B。 数据点A和数据点B要进行关联。数据点B等于数据点A的2倍。此时就可以使用网关的规则引擎,完成上述功能。

5.1. 星原云数据联动

  1. method.SparksDataSet("gatewayMac", "deviceId", "pointId", value)

该函数需要传入4个参数。其中

  • gatewayMac: 要关联的网关的唯一ID,可以在网关详情页面查找(获取方式见附录)。
  • deviceId: 要关联的子设备标识(获取方式见附录)。
  • pointId:要关联的数据点ID(获取方式见附录)。
  • value: 要下发的值,数据类型可以为bool、整形、float。

例子

5.2 阿里云数据联动

使用阿里云数据联动,由于需要配置用户的accessKey和accessSecret,所以不建议使用该功能(可以使用阿里云规则引擎)。如必须使用,建议创建RAM用户,并设置相关权限。

  1. 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数据联动

不支持。可以使用thingsboard规则引擎。

5.4 私有云(MQTT)数据联动

  1. method.StandMQTTDataSet("topic","gatewayMac", "deviceId", "pointId", value)

该函数需要传入5个参数。其中

  • topic: 数据下发使用的主题。如果A、B两个网关数据下发主题配置相同,则该参数置空即可。网关会根据自身配置,自动生成主题。
  • gatewayMac: 远端网关的唯一ID(获取方式见附录)。
  • deviceId:远端网关下的子设备标识(获取方式见附录)。
  • pointId: 要关联的数据点ID(获取方式见附录)。
  • value: 要下发的值,数据类型可以为bool、整形、float。

案例:

  1. pointB := method.GetDevData("modbus", "pointB") //获取本地标识为modbus设备的数据点pointB的值,并赋值给变量pointB
  2. if pointB == 123 { //如果pointB的值为123
  3. val := 321 //新建一个变量,赋值321
  4. method.StandMQTTDataSet("","92320e7f173f", "td", "D1", val)//配置远端网关92320e7f173f,子设备td,数据点D1的值为321
  5. }

6. 获取TF卡剩余容量

  1. method.TFCardFree()

该函数返回TF卡剩余容量,保留两位小数,单位MB。
例子:

  1. free = method.TFCardFree()
  2. if free < 300{
  3. //do something
  4. }

注意:为保证系统稳定,当TF卡剩余容量不足300M时,便开启回滚机制,删除历史最早的数据,释放空间。

四.注意事项

  1. 网关bool值判断需要使用0和1进行,但bool值下发,则使用bool类型。例如:
    1. switch01 := method.GetDevData("modbus", "switch01")
    2. if switch01 == 1{
    3. val := true
    4. method.SparksDataSet("gatewayMac", "deviceId", "pointId", val)
    5. }

五. 相关案例

1. 数据联动

有一个modbus TCP设备,设备ID为modbus_tcp_model,数据点表如下图。
image.png
要求: 当土湿度大于20时, 光照度置为80,并新建一个数据点”soilHum_warning”,将土湿度乘以3转发到所有服务;当土湿度等于20时,光照度置为50; 当湿度小于20时,光照度设置为7。

  1. soilHum := method.GetDevData("modbus_tcp_model", "soilHum")
  2. if soilHum > 20 {
  3. //数据下发
  4. setData = method.NewData()
  5. setData["light"] = 80
  6. method.Set("modbus_tcp_model", setData)
  7. //转发
  8. shiftData = method.NewData()
  9. shiftData["soilHum_warning"] = soilHum*3
  10. method.Shift("", "modbus_tcp_model", shiftData)
  11. }else if soilHum == 20{
  12. setData = method.NewData()
  13. setData["light"] = 50
  14. method.Set("modbus_tcp_model", setData)
  15. }else{
  16. setData = method.NewData()
  17. setData["light"] = 7
  18. method.Set("modbus_tcp_model", setData)
  19. }

2. TF卡剩余容量判断并写入PLC

有一个modbus TCP设备,设备ID为modbus_tcp_model,数据点表如下图。
image.png
要求:

  1. 将TF卡剩余容量写入标识为”TFFree”数据点。
  2. 当TF卡剩余容量小于100M时,标识为”TFStatus”的数据点置为flase;TF卡剩余容量大于等于100M时,标识为”TFStatus”的数据点置为true;
    1. freeData = method.NewData()
    2. statusData = method.NewData()
    3. free = method.TFCardFree()
    4. freeData["TFFree"] = free
    5. method.Set("modbus_tcp_model", freeData)
    6. if free < 100{
    7. statusData["TFStatus"] = false
    8. method.Set("modbus_tcp_model", statusData)
    9. }else{
    10. statusData["TFStatus"] = true
    11. method.Set("modbus_tcp_model", statusData)
    12. }

    附录

    1. 获取网关唯一ID

    image.png

    2. 获取子设备唯一ID(标识)

    image.png

    3. 获取数据点的唯一ID(标识)

    网关管理界面->服务->子设备(通附录->标题2界面)。点击”点表”。
    image.png