跳到主要内容

规则引擎

一、说明

ThingsGateway 网关规则引擎

触发器:

  • 报警状态触发器
  • 设备状态触发器
  • 变量状态触发器
  • 时间间隔触发器

执行器:

  • RPC写入
  • 自定义脚本

其他:

  • 自定义数据脚本
  • 条件脚本

二、设计

2.1、开始/结束

规则只能由开始节点 作为起点

结束节点不强制需求

2.2、触发器

报警状态触发器

填写 变量名称 ,当变量报警变化时,进入下一步

设备状态触发器

填写 采集设备名称 ,当设备状态变化时,进入下一步

变量状态触发器

填写 变量名称 ,当变量状态变化时,进入下一步

时间间隔触发器

填写 间隔时间(ms) ,当周期时间触发时,进入下一步

2.3、脚本

条件

脚本返回bool,值为true时进入下一步

数据

脚本返回数据值,可以是任意类型,结果会传入下一步

例子

//raw是上一个节点传入值

return (JToken.FromObject(raw))["Value"];

2.4、执行

RPC写入

填写 变量名称 ,把上一节点的数据写入变量

自定义执行

自定义脚本,脚本类需继承 IExexcuteExpressions

接口定义

namespace ThingsGateway.RulesEngine;

public interface IExexcuteExpressions
{

public TouchSocket.Core.ILog Logger { get; set; }

Task<NodeOutput> ExecuteAsync(NodeInput input, CancellationToken cancellationToken);
}

其他类型


using Newtonsoft.Json.Linq;

namespace ThingsGateway.RulesEngine;

public class NodeInput
{
private object input;
public JToken JToken
{
get
{
return JToken.FromObject(input); ;
}
}

public object Value
{
get
{
return input;
}
set
{
input = value;
}
}
}


public class NodeOutput
{
private object output;
public JToken JToken
{
get
{
return JToken.FromObject(output); ;
}
}

public object Value
{
get
{
return output;
}
set
{
output = value;
}
}
}

接口方法中可自由发挥,比如邮件发送,Webhook等等

案例



using ThingsGateway.Gateway.Application;
using ThingsGateway.RulesEngine;


public class TestEx : IExexcuteExpressions
{

public TouchSocket.Core.ILog Logger { get; set; }

public async System.Threading.Tasks.Task<NodeOutput> ExecuteAsync(NodeInput input, System.Threading.CancellationToken cancellationToken)
{


//想上传mqtt,可以自己写mqtt上传代码,或者通过mqtt插件的公开方法上传

//直接获取mqttclient插件类型的第一个设备
//var driver = GlobalData.ReadOnlyChannels.FirstOrDefault(a => a.Value.PluginName == "ThingsGateway.Plugin.Mqtt.MqttClient").Value?.ReadDeviceRuntimes?.FirstOrDefault().Value?.Driver;
//if (driver != null)
//{
// //找到对应的MqttClient插件设备
// var mqttClient = (ThingsGateway.Plugin.Mqtt.MqttClient)driver;
// if (mqttClient == null)
// throw new("mqttClient NOT FOUND");
// var result = await mqttClient.MqttUpAsync("test", "test", default);// 主题 和 负载
// if (!result.IsSuccess)
// throw new(result.ErrorMessage);
// return new NodeOutput() { Value = result };
//}
//throw new("mqttClient NOT FOUND");


//通过设备名称找出mqttClient插件
//var driver = GlobalData.ReadOnlyDevices.FirstOrDefault(a => a.Value.Name == "mqttDevice1").Value?.Driver;
//if (driver != null)
//{
// //找到对应的MqttClient插件设备
// var mqttClient = (ThingsGateway.Plugin.Mqtt.MqttClient)driver;
// if (mqttClient == null)
// throw new("mqttClient NOT FOUND");
// var result = await mqttClient.MqttUpAsync("test", "test", default);// 主题 和 负载
// if (!result.IsSuccess)
// throw new(result.ErrorMessage);
// return new NodeOutput() { Value = result };
//}
//throw new("mqttClient NOT FOUND");
}
}







三、日志查看