ThingsBoard 3.4 -- 规则链使用

规则链的使用

创建规则链

在这里插入图片描述
调试模式用于调试日志的输出,测试阶段建议选择

配置规则

  • 点击规则链,进入详情页面
    ![[Pasted image 20231227102822.png]]

  • 打开规则链进行规则配置
    ![[Pasted image 20231227102902.png]]

  • 规则链节点类型分为6类,每一类下面又包含多个小类

    • 过滤器/筛选器:过滤器节点用于消息过滤和路由
      • asset profile switch:根据设备配置文件的名称路由传入消息。规则节点可以连接到其他规则节点
      • device profile switch:根据设备配置文件的名称路由传入消息。
      • check alarm status:检查警报状态是否与指定状态之一匹配。
      • check fields presence: 检查消息和/或元数据中是否存在指定字段。
      • check relation:检查消息的发起者和其他实体之间是否存在关系。
      • entity type:按消息发起者实体的类型过滤传入消息。
      • entity type switch:按消息发起者实体的类型切换传入消息。
      • message type:根据一种或多种预定义或自定义消息类型过滤传入消息。
      • message type switch:按消息类型值路由传入消息。
      • script:使用传入消息评估布尔函数(自定义脚本)
      • switch:将传入消息路由到一个或多个输出连接(自定义脚本)
      • GPS geofencing filter:通过基于 GPS 的地理围栏过滤传入消息
    • 丰富节点:丰富节点用于更新传入消息的元数据(数据预处理)
      • Calculate delta:根据之前的时间序列读数和当前读数计算“增量”并将其添加到消息中
      • Customer attributes:节点找到消息发起者实体的客户,并将客户属性或最新遥测值添加到消息元数据中。
      • Device attributes:节点使用配置的查询查找消息发起者实体的相关设备,并将属性(客户端共享服务器范围)和最新遥测值添加到消息元数据中。
      • Originator attributes:将消息发起者属性(客户端共享服务器范围)和最新遥测值添加到消息元数据中。
      • Originator fields:节点获取消息发起者实体的字段值并将它们添加到消息元数据中。
      • Related attributes:节点使用配置的查询查找消息发起者实体的相关实体,并将属性或最新遥测值添加到消息元数据中。
      • Tenant attributes:节点找到消息发起者实体的租户,并将租户属性或最新遥测值添加到消息元数据中
      • Originator telemetry:将节点配置中选择的特定时间范围内的消息发起者遥测值添加到消息元数据。
      • Tenant details:规则节点 将租户详细信息中的字段添加到消息正文或元数据。
      • Customer details:规则节点 将客户详细信息中的字段添加到消息正文或元数据。
    • 变换节点:转换节点用于更改传入消息字段,如发起者、消息类型、有效负载和元数据。
      • Change originator:当提交的消息应作为来自另一个实体的消息进行处理时,使用此节点。例如,设备提交遥测数据,遥测数据应复制到更高级别的资产或客户。在这种情况下,管理员应在保存时间序列节点之前添加此节点。
      • Script Transformation Node:使用配置的 JavaScript 函数更改消息有效负载、元数据或消息类型。
      • To Email Node:通过使用从消息元数据派生的值填充电子邮件字段,将消息转换为电子邮件消息
    • 动作节点:操作节点根据传入的消息执行各种操作。
      • Math Function Node
      • Create Alarm Node
      • Clear Alarm Node
    • 外部节点:使用的外部节点用于与外部系统交互
      • AWS
      • Kafka
      • MQTT
      • RabbitMQ
      • REST API Call
    • 规则节点:用于控制消息处理流程。
      • Acknowledge Node:节点会将消息标记为已成功处理(已确认)。如果您不想重新处理失败的消息,这很有用
      • Checkpoint Node:将消息的副本发布到选定的规则引擎队列。
      • Rule Chain Node:将消息转发到选定的规则链。复用共性链路
  • 定义一个规则:JSON在最后

    • 将设备类型为“HTTP设备配置”下的设备,提取“温度”遥测属性字段,转换数值为华式温度,并保存到属性中,判断温度超过50度或低于10度,产生告警;温度在50~10中间告警恢复;将产生的告警发送到kafka中
      ![[Pasted image 20231227143454.png]]

创建设备配置

![[Pasted image 20231227134024.png]]

创建设备

![[Pasted image 20231227134128.png]]

数据接收

curl -v -X POST http://192.168.0.16:8080/api/v1/vl4hijxt4ihg4szr2xdl/telemetry --header Content-Type:application/json --data "{temperature:60,mac:\"HTTP设备\"}"

链路追踪

  • 打开规则中的Debug模式
    ![[Pasted image 20231227143809.png]]

  • 查看消息的输入与输出
    ![[Pasted image 20231227143826.png]]

  • 观察最终结果-属性
    ![[Pasted image 20231227143847.png]]
    ![[Pasted image 20231227144058.png]]

  • 观察最终结果-告警
    在这里插入图片描述
    在这里插入图片描述

  • 观察最终结果-kafka
    ![[Pasted image 20231227144017.png]]
    ![[Pasted image 20231227144037.png]]

规则链文件

{
  "ruleChain": {
    "additionalInfo": {
      "description": ""
    },
    "name": "device profile switch example",
    "type": "CORE",
    "firstRuleNodeId": null,
    "root": false,
    "debugMode": false,
    "configuration": null,
    "externalId": null
  },
  "metadata": {
    "firstNodeIndex": 0,
    "nodes": [
      {
        "additionalInfo": {
          "description": "设备配置选择",
          "layoutX": 125,
          "layoutY": 334
        },
        "type": "org.thingsboard.rule.engine.filter.TbDeviceTypeSwitchNode",
        "name": "to device rule chain",
        "debugMode": true,
        "singletonMode": false,
        "configurationVersion": 0,
        "configuration": {
          "version": 0
        },
        "externalId": null
      },
      {
        "additionalInfo": {
          "description": "",
          "layoutX": 306,
          "layoutY": 580
        },
        "type": "org.thingsboard.rule.engine.transform.TbTransformMsgNode",
        "name": "修改温度",
        "debugMode": true,
        "singletonMode": false,
        "configurationVersion": 0,
        "configuration": {
          "scriptLang": "JS",
          "jsScript": "var hsTemp = msg.temperature * 33.8\nmsg.hsTemp = hsTemp\nreturn {msg: msg, metadata: metadata, msgType: msgType};",
          "tbelScript": "return {msg: msg, metadata: metadata, msgType: msgType};"
        },
        "externalId": null
      },
      {
        "additionalInfo": {
          "description": "",
          "layoutX": 877,
          "layoutY": 517
        },
        "type": "org.thingsboard.rule.engine.action.TbCreateAlarmNode",
        "name": "温度预警",
        "debugMode": true,
        "singletonMode": false,
        "configurationVersion": 0,
        "configuration": {
          "scriptLang": "TBEL",
          "alarmDetailsBuildJs": "var details = {};\nif (metadata.prevAlarmDetails) {\n    details = JSON.parse(metadata.prevAlarmDetails);\n    //remove prevAlarmDetails from metadata\n    delete metadata.prevAlarmDetails;\n    //now metadata is the same as it comes IN this rule node\n}\n\n\nreturn details;",
          "alarmDetailsBuildTbel": "var details = {};\nif (metadata.prevAlarmDetails != null) {\n    details = JSON.parse(metadata.prevAlarmDetails);\n    //remove prevAlarmDetails from metadata\n    // metadata.remove('prevAlarmDetails');\n    //now metadata is the same as it comes IN this rule node\n}\n\n\nreturn details;",
          "useMessageAlarmData": false,
          "overwriteAlarmDetails": false,
          "alarmType": "General Alarm",
          "severity": "CRITICAL",
          "propagate": false,
          "relationTypes": [],
          "propagateToOwner": false,
          "propagateToTenant": false,
          "dynamicSeverity": false
        },
        "externalId": null
      },
      {
        "additionalInfo": {
          "description": "",
          "layoutX": 882,
          "layoutY": 355
        },
        "type": "org.thingsboard.rule.engine.action.TbClearAlarmNode",
        "name": "消除",
        "debugMode": false,
        "singletonMode": false,
        "configurationVersion": 0,
        "configuration": {
          "alarmType": "General Alarm",
          "scriptLang": "TBEL",
          "alarmDetailsBuildJs": "var details = {};\nif (metadata.prevAlarmDetails) {\n    details = JSON.parse(metadata.prevAlarmDetails);\n    //remove prevAlarmDetails from metadata\n    delete metadata.prevAlarmDetails;\n    //now metadata is the same as it comes IN this rule node\n}\n\n\nreturn details;",
          "alarmDetailsBuildTbel": "var details = {};\nif (metadata.prevAlarmDetails != null) {\n    details = JSON.parse(metadata.prevAlarmDetails);\n    //remove prevAlarmDetails from metadata\n    metadata.remove('prevAlarmDetails');\n    //now metadata is the same as it comes IN this rule node\n}\n\n\nreturn details;"
        },
        "externalId": null
      },
      {
        "additionalInfo": {
          "description": "",
          "layoutX": 531,
          "layoutY": 477
        },
        "type": "org.thingsboard.rule.engine.filter.TbJsFilterNode",
        "name": "temperature",
        "debugMode": true,
        "singletonMode": false,
        "configurationVersion": 0,
        "configuration": {
          "scriptLang": "TBEL",
          "jsScript": "return msg.temperature > 20;",
          "tbelScript": "return msg.temperature > 50 || msg.temperature < 10;"
        },
        "externalId": null
      },
      {
        "additionalInfo": {
          "description": "",
          "layoutX": 1198,
          "layoutY": 420
        },
        "type": "org.thingsboard.rule.engine.kafka.TbKafkaNode",
        "name": "告警消息",
        "debugMode": true,
        "singletonMode": false,
        "configurationVersion": 0,
        "configuration": {
          "topicPattern": "tb_test_topic",
          "keyPattern": " $[metadataKey]",
          "bootstrapServers": "192.168.0.11:9092,192.168.0.12:9092,192.168.0.13:9092",
          "retries": 0,
          "batchSize": 16384,
          "linger": 0,
          "bufferMemory": 33554432,
          "acks": "-1",
          "keySerializer": "org.apache.kafka.common.serialization.StringSerializer",
          "valueSerializer": "org.apache.kafka.common.serialization.StringSerializer",
          "otherProperties": {},
          "addMetadataKeyValuesAsKafkaHeaders": true,
          "kafkaHeadersCharset": "UTF-8"
        },
        "externalId": null
      },
      {
        "additionalInfo": {
          "description": "",
          "layoutX": 861,
          "layoutY": 615
        },
        "type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode",
        "name": "保存属性",
        "debugMode": true,
        "singletonMode": false,
        "configurationVersion": 1,
        "configuration": {
          "scope": "SERVER_SCOPE",
          "notifyDevice": false,
          "sendAttributesUpdatedNotification": false,
          "updateAttributesOnlyOnValueChange": true
        },
        "externalId": null
      },
      {
        "additionalInfo": {
          "description": "",
          "layoutX": 860,
          "layoutY": 720
        },
        "type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
        "name": "保存遥测",
        "debugMode": false,
        "singletonMode": false,
        "configurationVersion": 0,
        "configuration": {
          "defaultTTL": 0,
          "skipLatestPersistence": false,
          "useServerTs": false
        },
        "externalId": null
      },
      {
        "additionalInfo": {
          "description": "",
          "layoutX": 529,
          "layoutY": 651
        },
        "type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode",
        "name": "消息类型配置",
        "debugMode": true,
        "singletonMode": false,
        "configurationVersion": 0,
        "configuration": {
          "version": 0
        },
        "externalId": null
      }
    ],
    "connections": [
      {
        "fromIndex": 0,
        "toIndex": 1,
        "type": "HTTP设备配置"
      },
      {
        "fromIndex": 1,
        "toIndex": 4,
        "type": "Success"
      },
      {
        "fromIndex": 1,
        "toIndex": 8,
        "type": "Success"
      },
      {
        "fromIndex": 2,
        "toIndex": 5,
        "type": "Created"
      },
      {
        "fromIndex": 2,
        "toIndex": 5,
        "type": "Updated"
      },
      {
        "fromIndex": 3,
        "toIndex": 5,
        "type": "Cleared"
      },
      {
        "fromIndex": 4,
        "toIndex": 2,
        "type": "True"
      },
      {
        "fromIndex": 4,
        "toIndex": 3,
        "type": "False"
      },
      {
        "fromIndex": 8,
        "toIndex": 6,
        "type": "Post attributes"
      },
      {
        "fromIndex": 8,
        "toIndex": 7,
        "type": "Post telemetry"
      }
    ],
    "ruleChainConnections": null
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/273527.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot对接WebSocket实现消息推送

1.修改pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 2.增加配置WebSocketConfig.java import org.springframework.context.annotation.Bean…

网络隔离后,怎样建立高效安全的数据安全交换通道?

数据安全对企业生存发展有着举足轻重的影响&#xff0c;数据资产的外泄、破坏都会导致企业无可挽回的经济损失和核心竞争力缺失。数据流动才能让其释放价值&#xff0c;想要保护企业核心资产&#xff0c;就要实现数据安全交换。 很多企业为了防止知识产权、商业机密数据泄露&am…

2023安洵杯-秦岭防御军wp

reverse 感觉有点点简单## import base64 def ba64_decode(str1_1):mapp "4KBbSzwWClkZ2gsr1qAQu0FtxOm6/iVcJHPY9GNp7EaRoDf8UvIjnL5MydTX3eh"data_1 [0] * 4flag_1 [0] * 3for i in range(32, 127):for y in range(32, 127):for k in range(32, 127):flag_1[0]…

【目标跟踪】解决多目标跟踪遮挡问题

文章目录 前言一、判定遮挡目标二、扩展目标框三、结论 前言 目标跟踪在发生遮挡时&#xff0c;极其容易发生Id Switch。网上许多算法忽视跟踪遮挡问题,同时网上相关资料也很少。博主为了解决跟踪遮挡&#xff0c;翻阅大量论文。分享其中一篇论文。论文链接&#xff1a;https:…

dl转置卷积

转置卷积 转置卷积&#xff0c;顾名思义&#xff0c;通过名字我们应该就能看出来&#xff0c;其作用和卷积相反&#xff0c;它可以使得图像的像素增多 上图的意思是&#xff0c;输入是22的图像&#xff0c;卷积核为22的矩阵&#xff0c;然后变换成3*3的矩阵 代码如下 import…

Python 运维(四):使用 PyInstaller 将 Python 程序打包成可执行文件

大家好&#xff0c;我是水滴~~ PyInstaller是一款强大的Python打包工具&#xff0c;通过将Python程序转换成可执行文件&#xff0c;它简化了程序的分享和分发过程。本文从简介、安装、使用以及典型案例四个方面对PyInstaller进行了介绍。 文章内容包含大量的示例代码&#xf…

Vue学习之第一、二章——Vue核心与组件化编程

第一章. Vue核心 1.1 Vue简介 1.1.1 官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/ 1.1.2 Vue特点 遵循 MVVM 模式编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发它本身只关注 UI, 也可以引入其它第三方库开发项目 1.2 初始Vue 这里可以参考&a…

uni-app 命令行创建

1. 首先创建项目&#xff0c;命令如下: npx degit dcloudio/uni-preset-vue#vite-ts uni-app-demo如果出现报错&#xff0c;如下图. 大概率就是没有目录C:\Users\Administrator\AppData\Roaming\npm 解决办法&#xff1a; 创建目录 C:\Users\Administrator\AppData\Roaming\n…

关于Zoom ZTP和AudioCodes Ltd桌面电话缺陷暴露,导致用户遭受窃听的动态情报

一、基本内容 近期SySS安全研究员发布分析报告显示&#xff0c;Zoom的零接触&#xff08;ZTP&#xff09;和AudioCodes Ltd桌面电话配置功能中发现高危漏洞&#xff0c;可以获得对设备的完全远程控制并不受限制的访问可以被武器化&#xff0c;以窃听房间或电话、通过设备并攻击…

LazyForEach常见使用问题

目录 1、渲染结果非预期 2、重新渲染时图片闪烁 3、ObjectLink属性变化UI未更新 上篇文章中我们介绍了LazyForEach的基本使用&#xff0c;展示了如何使用LazyForEach构造一个列表&#xff0c;并演示数据的添加、删除、修改如何与LazyForEach配合并正确的更新UI。本篇将介绍使…

【kafka消息里会有乱序消费的情况吗?如果有,是怎么解决的?】

文章目录 什么是消息乱序消费了&#xff1f;顺序生产&#xff0c;顺序存储&#xff0c;顺序消费如何解决乱序数据库乐观锁是怎么解决这个乱序问题吗 保证消息顺序消费两种方案固定分区方案乐观锁实现方案 前几天刷着视频看见评论区有大佬问了这个问题&#xff1a;你们的kafka消…

策略模式(组件协作)

策略模式&#xff08;组件协作&#xff09; 链接&#xff1a;策略模式实例代码 注解 目的 正常情况下&#xff0c;一个类/对象中会包含其所有可能会使用的内外方法&#xff0c;但是一般情况下&#xff0c;这些常使用的类都是由不同的父类继承、组合得来的&#xff0c;来实现…

《软件需求分析报告》

第1章 序言 第2章 引言 2.1 项目概述 2.2 编写目的 2.3 文档约定 2.4 预期读者及阅读建议 第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 …

创建servlet的三种方式

目录 ​编辑 1.实现Servlet接口的方式 2.继承GenericServlet抽象类的方式 3.继承HttpServlet的方式 1.实现Servlet接口的方式 因为是实现 Servlet 接口&#xff0c;所以我们需要实现接口里的方法。 import javax.servlet.*; import javax.servlet.annotation.WebServlet;…

DS八大排序之归并排序和计数排序

前言 前几期我们详细介绍了插入排序&#xff08;直接插入排序和希尔排序&#xff09;、选择排序&#xff08;直接选择和堆排序&#xff09;、交换排序&#xff08;冒泡排序和快速排序&#xff09;。并对快排的各个版本做了详细的介绍&#xff0c;本期我们来介绍把最后两个即外…

k8s面试之——简述网络模型

kubernetes网络模型是kubernetes集群中管理容器网络通信的一种机制&#xff0c;用于实现pod间、pod与外部网络间的通信和互联&#xff0c;并提供了多种网络插件和配置选项来满足不同应用场景下的需求。kubernetes网络模型可以分为一下几个部分&#xff1a; 1. pod网络模型 在…

经典文献阅读之--OccNeRF(基于神经辐射场的自监督多相机占用预测)

0. 简介 作为基于视觉感知的基本任务&#xff0c;3D占据预测重建了周围环境的3D结构。它为自动驾驶规划和导航提供了详细信息。然而&#xff0c;大多数现有方法严重依赖于激光雷达点云来生成占据地面真实性&#xff0c;而这在基于视觉的系统中是不可用的。之前我们介绍了《经典…

cephfs cap机制介绍

一、Cap&#xff1a;概述 cap是文件系统层面的&#xff0c;包括元数据、数据操作。cap 和mds分布式锁是对应的cap是MDS分配给client对inode的操作能力权限。不同的客户端&#xff0c;或者同一客户端不同时刻&#xff0c;对同一inode持有cap可能是不同的•作用&#xff1a;MDS通…

学习笔记13——Spring整合Mybatis、junit、AOP、事务

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://baobeihuijia.com/bbhj/ Mybatis - Spring&#xff08;使用第三方包new一个对象bean&#xff09; 原始的Mybatis与数据库交互【通过sqlmapconfig来配置和连接】 初始化SqlSessionFactory获得连接获取数据层接口…

Python pandas 操作 excel 详解

文章目录 1 概述1.1 pandas 和 openpyxl 区别1.2 Series 和 DataFrame 2 常用操作2.1 创建 Excel&#xff1a;to_excel()2.2 读取 Excel&#xff1a;read_excel()2.2.1 header&#xff1a;标题的行索引2.2.2 index_col&#xff1a;索引列2.2.3 dtype&#xff1a;数据类型2.2.4 …