1.3.3.4 规则引擎服务配置

优质
小牛编辑
132浏览
2023-12-01

规则引擎服务配置

更新时间:2018-07-04 00:06:12

概述

规则引擎服务是Link Develop平台提供的官方服务之一,能够为开发者提供规则管理、规则定义和规则的运行环境。通过规则引擎服务,可以满足不同场景下的自动化需求,例如配置触发条件和联动规则,实现设备间的互联互通和消息推送等能力。

服务配置入口

规则引擎配置服务入口位于可用资源-官方资源-服务:

undefined

新增规则

点击“配置”进入规则的配置页面,显示“开发环境”和“生产环境”下所有的规则,您可以首先在开发环境中对新增规则,编辑规则内容并进行调试,调试通过后发布到生产环境中进行实际的运行。

image.png | center | 704x374

点击“新增规则”后,在弹窗中填写规则的名称和描述,例如我们可以创建一条“自动关灯”的规则,当灯泡的功率过大时,自动触发关灯操作。点击“确定”完成规则创建。

image.png | center | 704x400

规则创建成功,在列表中显示新创建的“自动关灯”规则,当前状态为“已停止”。

image.png | center | 704x357

点击“编辑”可以编辑规则的基本信息,点击“删除”可以删除该规则,请注意,仅当规则处于“已停止”状态才可删除该规则。

定义规则内容

规则创建后,可以开始对规则进行定义,点击“详情”进入规则内容编辑页面,您可以在编辑器中编辑规则所要执行的具体内容,规则采用 JSON 格式进行描述,您可以订阅设备上报消息(属性或事件)作为输入,通过处理节点进行运算,条件匹配后触发指定的动作,如设置设备属性的目标值或执行指定的服务。
在示例中,订阅了灯泡的功率 ActivePower,当上报的数据大于500时,将灯的状态 LightStatus 置为 0,实现自动关灯。

image.png | center | 704x395

点击“保存”,保存该规则的内容,请注意,保存规则时将对规则中的设备进行租户校验,您仅能对您所拥有的设备进行消息订阅和结果执行,支持测试设备和正式设备,否则将提示保存失败。

运行规则

完成规则定义后,您可以在规则的详情页面直接点击状态切换为“运行”或者返回规则列表,点击状态切换为“运行”。此时规则将开始运行在“开发环境”中,您可以在规则的详情页面查看该规则的执行日志。
如示例中,灯泡上报了 ActivePower 达到500w以上,触发了属性设置的动作,将灯的状态 LightStatus 置为0,实现自动关灯操作。

image.png | center | 704x379

此时,您可以在设备详情页面查看到该设备触发了一次服务调用,下发了属性设置。

image.png | center | 704x363

发布到生产环境

规则在开发环境中正常运行后,您可以将规则发布到生产环境中,点击规则列表中的“发布到生产环境”,在弹窗中点击“确定”完成规则发布。
发布到生产环境前,请注意:

  • 不同环境的规则对应不同环境下的设备,即开发环境对应测试设备,生产环境对应正式设备,规则调试通过后,您需要将开发环境中的测试设备 DeviceName 修改为正式设备的 DeviceName,才能确保生产环境的规则被正常触发;

  • 如果该规则首次发布到生产环境,将自动在生产环境创建一条相同的规则,如果该条规则已经发布过,将自动停止生产环境中对应的规则,更新规则内容后会自动运行生产环境中的规则。

image.png | center | 704x378

规则发布成功,您可以直接查看生产环境中的规则详情。“生产环境”的规则列表中将出现刚刚发布的规则,点击可将规则切换为“运行”状态。

image.png | center | 704x347

点击“详情”,可查看生产环境中该规则的详情,生产环境下的规则不支持规则内容编辑,仅提供查看。

image.png | center | 704x377

如果您要删除生产环境中的规则,可以点击规则列表的“删除”按钮,在弹窗中确认后删除该规则。请注意,仅当规则处于停止状态时才可进行删除操作。

image.png | center | 704x372

查看规则引擎 API 列表

在项目资源管理的“可用服务”列表中,点击“详情”查看规则的 API 列表。

image.png | center | 704x369

您可以查看不同版本的规则 API 列表。

image.png | center | 704x401

点击 API 的详情,查看请求该 API 时所需的参数和示例。

image.png | center | 704x409

规则引擎 DSL 概述

规则引擎采用 json 格式进行描述,包含规则的输入节点(如设备上报的相关数据)、处理节点(如数据的临界值)、输出节点(如触发指定设备的某个服务调用),一条完整的规则必须包含以上三个节点,称之为规则引擎的 DSL。

规则引擎 DSL 字段描述说明:

{
    "name":"",   //场景名称
    "pipelines":[    //场景规则流,当前限制为一条
        {
            "id":"",    //规则流id
            "name":"", //规则流名称,可空
            "options":{        //扩展参数,可空
                "smartConnect":0    //是否智能生成拓扑连接,可空,默认为:0
            },
            "infoLevel":"INFO",    //日常输出等级,默认为:INFO
            "type":"alink/pipeline",    //规则流类型,默认为:alink/pipeline
            "data":{
                "nodes":[             //节点集
                    {
                        "id":"", //节点id,不可空,在本规则的节点集合(nodes)中是唯一
                        "name":"",    //节点名称,可空
                        "uri":"",        //节点类型,请参照节点说明
                        "params":{        //节点参数,格式为key:value
                        },
                        "output":{        //输出配置
                            "connections":[    //下游节点,若没有下游节点,可空,支持多个下游节点
                                {
                                    "to":""    //下游节点id
                                }
                            ]
                        }
                    }
                ]
            }
        }
    ]
}

示例

示例1:每隔5秒打印一条“hello world”

{
    "name":"scene",
    "pipelines":[
        {
            "name":"Flow 1",
            "id":"52c1394c.ff3e48",
            "infoLevel":"INFO",
            "options":{
                "smartConnect":0
            },
            "type":"alink/pipeline",
            "data":{
                "nodes":[
                    {
                        "id":"e8ab2675.af8928",
                        "name":"",
                        "output":{
                            "connections":[
                                {
                                    "to":"b9c08482.40c3c8"    //指定下游节点
                                }
                            ]
                        },
                        "params":{
                            "cron":"5/5 * * * * ?"
                        },
                        "uri":"source/timer"    //定时器节点
                    },
                    {
                        "id":"b9c08482.40c3c8",
                        "name":"",
                        "output":{
                            "connections":[ ]
                        },
                        "params":{
                            "output":"hello world"
                        },
                        "uri":"action/dump"    //打印日志节点
                    }
                ]
            }
        }
    ]
}

示例2:当功率大于500,关灯。

{
    "name":"scene",
    "pipelines":[
        {
            "name":"Flow 1",
            "id":"52c1394c.ff3e48",
            "infoLevel":"INFO",
            "options":{
                "smartConnect":0
            },
            "type":"alink/pipeline",
            "data":{
                "nodes":[
                    {
                        "id":"e8ab2675.af8928",
                        "name":"",
                        "output":{
                            "connections":[
                                {
                                    "to":"b9c08482.40c3c8"
                                }
                            ]
                        },
                        "params":{
                            "productKey":"00VusjRNhRk",
                            "attributeName": "PowerRatio"
                        },
                        "uri":"source/tmp/device_status"
                    },
                    {
                        "id":"b9c08482.40c3c8",
                        "name":"",
                        "output":{
                            "connections":[
                                {
                                    "to":"b9c08482.40c222"
                                }
                            ]
                        },
                        "params":{
                            "condition":"data.items.PowerRatio.value >= 500"
                        },
                        "uri":"route/filter"
                    },
                    {
                        "id":"b9c08482.40c222",
                        "name":"",
                        "output":{
                            "connections":[ ]
                        },
                        "params":{
                            "productKey":"00VusjRNhRk",
                            "deviceName":"8g6RVYttKhfG5HETQe61",
                            "propertyItems":{
                                "LightStatus":"0"
                            }
                        },
                        "uri":"processor/device/setDeviceStatus"
                    }
                ]
            }
        }
    ]
}

规则节点

输入节点

订阅设备状态消息节点

节点类型(uri):source/tmp/device_status
参数(params):
    productKey:产品名称(必须)
    attributeName:属性名称(必须)
    deviceName:设备名称(可空)
要求:需要校验租户权限

订阅设备事件消息节点

节点类型(uri):source/tmp/device_event
参数(params):
    productKey:产品名称(必须)
    eventCode:事件code(必须)
    deviceName:设备名称(可空)
要求:需要校验租户权限

处理节点

数据过滤节点

节点类型(uri): route/filter
参数(params):
    condition: 表达式,支持运算符:>, >=, =, <, <=, !=, &&, ||
            获取设备数据的格式为:data.items.[这里是属性名称].value,
            比如获取灯具的属性LightStatus数据,表达式为:data.items.LightStatus.value
使用的表达式语言:MVEL

输出节点

设置设备状态节点

节点类型(uri): processor/device/setDeviceStatus
参数(params):
    productKey: 产品key(必须)
    deviceName: 设备名称(必须)
    propertyItems: 设备属性集合(json对象格式,必须),格式为key:value
要求:需要校验租户权限

调用设备服务节点

节点类型(uri): processor/device/invokeDeviceService
参数(params):
    productKey: 产品key(必须)
    deviceName: 设备名称(必须)
    serviceName: 服务名称(必须)
    serviceArgs: 服务参数集合(json对象格式,必须),格式为key:value
要求:需要校验租户权限

消息格式

设备状态消息

{
    "batchId": "test_batch_id_001",
    "gmtCreate": 1510292739881,
    "group": "group_1",
    "groupId": "00000000000000000000000",
    "iotId": "0300MSKL03667c544f69342a74Sv4Za4",
    "items": {
        "attribute_9": {
            "time": 1510292697471,
            "value": 560542025
        },
        "attribute_8": {
            "time": 1510292697470,
            "value": 715665571
        }
    },
    "productKey": "X5eCzh6fEH7"
}

设备事件消息

{
    "batchId":"a481eaffb2504f2cbe94e35661a3b59d",
    "eventCode":"TestEvent",
    "eventName":"测试事件",
    "eventType":"error",
    "groupId":"6b5edcaf6f8e4eedbc38acaa58484d32",
    "iotId":"C9MHksmm8e8awufuu6LJ0010796800",
    "items":{
        "TestEvent":{
            "value":{
                "outparam":2
            }
        }
    },
    "productKey":"a18DAcXIew7",
    "timestamp":1512460881845
}