规则引擎服务配置
更新时间:2018-03-15 12:08:57
概述
规则引擎服务是Link Develop平台提供的官方服务之一,能够为开发者提供规则管理、规则定义和规则的运行环境。通过规则引擎服务,可以满足不同场景下的自动化需求,例如配置触发条件和联动规则,实现设备间的互联互通和消息推送等能力。
添加规则引擎服务
使用规则引擎服务之前,需要先在项目的资源管理中添加该官方服务。点击“资源管理”,查看项目的可用资源。
进入“可用服务”标签页,点击“新增官方服务”。
在弹窗的列表中选择“规则引擎服务”,点击确认完成添加。
添加完成后,您可以在“可用服务”列表中看到新增的“规则引擎服务”。点击“配置”可进入规则引擎的配置界面,进行规则的新增、内容编辑和发布等操作。点击“详情”您可以直接查看规则引擎服务所提供的API接口和示例。
新增规则
点击“配置”进入规则的配置页面,显示“开发环境”和“生产环境”下所有的规则,您可以首先在开发环境中对新增规则,编辑规则内容并进行调试,调试通过后发布到生产环境中进行实际的运行。
点击“新增规则”后,在弹窗中填写规则的名称和描述,例如我们可以创建一条“自动关灯”的规则,当灯泡的功率过大时,自动触发关灯操作。点击“确定”完成规则创建。
规则创建成功,在列表中显示新创建的“自动关灯”规则,当前状态为“已停止”。
点击“编辑”可以编辑规则的基本信息,点击“删除”可以删除该规则,请注意,仅当规则处于“已停止”状态才可删除该规则。
定义规则内容
规则创建后,可以开始对规则进行定义,点击“详情”进入规则内容编辑页面,您可以在编辑器中编辑规则所要执行的具体内容,规则采用 JSON 格式进行描述,您可以订阅设备上报消息(属性或事件)作为输入,通过处理节点进行运算,条件匹配后触发指定的动作,如设置设备属性的目标值或执行指定的服务。
在示例中,订阅了灯泡的功率 ActivePower,当上报的数据大于500时,将灯的状态 LightStatus 置为 0,实现自动关灯。
点击“保存”,保存该规则的内容,请注意,保存规则时将对规则中的设备进行租户校验,您仅能对您所拥有的设备进行消息订阅和结果执行,支持测试设备和正式设备,否则将提示保存失败。
运行规则
完成规则定义后,您可以在规则的详情页面直接点击状态切换为“运行”或者返回规则列表,点击状态切换为“运行”。此时规则将开始运行在“开发环境”中,您可以在规则的详情页面查看该规则的执行日志。
如示例中,灯泡上报了 ActivePower 达到500w以上,触发了属性设置的动作,将灯的状态 LightStatus 置为0,实现自动关灯操作。
此时,您可以在设备详情页面查看到该设备触发了一次服务调用,下发了属性设置。
发布到生产环境
规则在开发环境中正常运行后,您可以将规则发布到生产环境中,点击规则列表中的“发布到生产环境”,在弹窗中点击“确定”完成规则发布。
发布到生产环境前,请注意:
不同环境的规则对应不同环境下的设备,即开发环境对应测试设备,生产环境对应正式设备,规则调试通过后,您需要将开发环境中的测试设备 DeviceName 修改为正式设备的 DeviceName,才能确保生产环境的规则被正常触发;
如果该规则首次发布到生产环境,将自动在生产环境创建一条相同的规则,如果该条规则已经发布过,将自动停止生产环境中对应的规则,更新规则内容后会自动运行生产环境中的规则。
规则发布成功,您可以直接查看生产环境中的规则详情。“生产环境”的规则列表中将出现刚刚发布的规则,点击可将规则切换为“运行”状态。
点击“详情”,可查看生产环境中该规则的详情,生产环境下的规则不支持规则内容编辑,仅提供查看。
如果您要删除生产环境中的规则,可以点击规则列表的“删除”按钮,在弹窗中确认后删除该规则。请注意,仅当规则处于停止状态时才可进行删除操作。
查看规则引擎 API 列表
在项目资源管理的“可用服务”列表中,点击“详情”查看规则的 API 列表。
您可以查看不同版本的规则 API 列表。
点击 API 的详情,查看请求该 API 时所需的参数和示例。
规则引擎 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
}