TDengine 与开源可视化编程工具 Node-RED 集成

在这里插入图片描述

简介

Node-RED 是由 IBM 开发的基于 Node.js 的开源可视化编程工具,通过图形化界面组装连接各种节点,实现物联网设备、API 及在线服务的连接。同时支持多协议、跨平台,社区活跃,适用于智能家居、工业自动化等场景的事件驱动应用开发,其主要特点是低代码、可视化。

TDengine 与 Node-RED 深度融合为工业 IoT 场景提供全栈式解决方案。通过 Node-RED 的 MQTT/OPC UA/Modbus 等协议节点,实现 PLC、传感器等设备毫秒级数据采集。同时 Node-RED 中基于 TDengine 的毫秒级实时查询结果,触发继电器动作、阀门开合等物理控制,实现更实时的联动控制。

node-red-node-tdengine 是 TDengine 为 Node-RED 开发的官方插件,由两个节点组成:

  • tdengine-operator:提供 SQL 语句执行能力,可实现数据写入/查询/元数据管理等功能。
  • tdengine-consumer:提供数据订阅消费能力,可实现从指定订阅服务器消费指定 TOPIC 的功能。

前置条件

准备以下环境:

  • TDengine 3.3.2.0 及以上版本集群已部署并正常运行(企业/社区/云服务版均可)。
  • taosAdapter 能够正常运行,详细参考 taosAdapter 参考手册。
  • Node-RED 3.0.0 及以上版本,Node-RED 安装。
  • Node.js 语言连接器 3.1.8 及以上版本,可从 npmjs.com 下载。
  • node-red-node-tdengine 插件 1.0.0 及以上版本,可从 npmjs.com 下载。

以上各安装组件调用关系如下图:

在这里插入图片描述

配置数据源

插件数据源在节点属性中配置,通过 Node.js 语言连接器 连接数据源,配置步骤如下:

  1. 启动 Node-RED 服务,使用浏览器进入 Node-RED 主页。

  2. 画布左侧在节点选择区域选择 tdengine-operator 或 tdengine-consumer 节点拖至画布。

  3. 双击画布中选中节点,弹出属性设置窗口,填写数据库连接信息:

    • tdengine-operator 节点连接串格式:ws://user:password@host:port
    • tdengine-consumer 节点连接串格式:ws://host:port

    更多详细内容请点击画布右侧上方区域中字典图标按钮,参考在线帮助文档。

  4. 配置完成后,点击右上角“部署”按钮,节点状态为绿色,表示数据源配置正确且连接正常。

验证方法

tdengine-operator

参考下一节“使用示例->采集数据”章节:

  1. 配置好 tdengine-operator 数据库连接属性。
  2. 节点前增加 inject 节点,配置 msg.topic 为预期写入 SQL。
  3. 点击 inject 节点“注入”按钮触发 SQL 执行。
  4. 使用 taos-CLI 查询预期写入数据是否存在,验证写入成功。

tdengine-consumer

参考下一节“使用示例->数据订阅”章节:

  1. 配置好 tdengine-consumer 节点订阅各属性。
  2. 其后增加 debug 节点。
  3. 在节点属性中勾选“节点状态”,下拉列表中选择“消息数量”。
  4. 使用 taos-CLI 向 TOPIC 所在表写入一条数据。
  5. 观察 debug 节点计数预期会加 1。
  6. 验证输出 payload 数据预期与写入数据一致。
  7. 全部符合预期即为验证成功。

使用示例

场景准备

场景介绍

某生产车间有多台智能电表,电表每一秒产生一条数据,数据准备存储在 TDengine 数据库中,要求实时输出每分钟各智能电表平均电流、电压及用电量,同时要对电流 > 25A 或电压 > 230V 负载过大设备进行报警。

我们使用 Node-RED + TDengine 来实现需求:

  • 使用 Inject + function 节点模拟设备产生数据。
  • tdengine-operator 节点负责写入数据。
  • 实时统计使用 tdengine-operator 节点查询功能。
  • 过载报警使用 tdengine-consumer 订阅功能。

假设:

  • TDengine 服务器:www.example.com
  • WEBSOCKET 端口:6041。
  • 用户名/密码:默认。
  • 模拟设备:三台(d0,d1,d2)。
数据建模

使用数据库管理工具 taos-CLI,为采集数据进行手工建模,采用一张设备一张表建模思路:

  • 创建超级表:meters。
  • 创建子表:d0,d1,d2。

建模 SQL 如下:

create database test;
create stable test.meters (ts timestamp, current float, voltage int, phase float ) tags (groupid int, location varchar(24));
create table test.d0 using test.meters tags(1, 'workshop1');
create table test.d1 using test.meters tags(2, 'workshop1');
create table test.d2 using test.meters tags(2, 'workshop2');

业务处理

数据采集

示例使用生成随机数方式模拟真实设备生产数据,tdengine-operator 节点配置 TDengine 数据源连接信息,并把数据写入 TDengine,同时使用 debug 节点监控写入成功数据量并展示于界面。

操作步骤如下:

  • 增加写入节点

    1. 在节点选择区域选择 tdengine-operator 节点,拖动至画布中。
    2. 双击节点打开属性设置,名称填写 ‘td-writer’,数据库项右侧点击“+”号图标。
    3. 弹出窗口中,名称填写 ‘db-server’,连接类型选择使用字符串连接,输入:
    ws://root:taosdata@www.example.com:6041 
    
    1. 点击“添加”并返回。
  • 模拟设备产生数据

    1. 在节点选择区域选择 function 节点,拖动至画布 td-writer 节点前。
    2. 双击节点打开属性设置,名称填写‘write d0’,下面选项卡选择“运行函数”,填写如下内容后保存并返回画布。
       // generate randconst value2 = Math.floor(Math.random() * (30 - 5 + 1)) + 5; // 5-30const value3 = Math.floor(Math.random() * (240 - 198 + 1)) + 198; // 198-240const value4 = Math.floor(Math.random() * (3 - 1 + 1)) + 1; // 1-3// sqlmsg.topic = `insert into test.d0 values (now, ${value2}, ${value3}, ${value4});`;return msg;
    
    1. 在节点选择区域选择 inject 节点,拖动至画布 write d0 节点前。

    2. 双击节点打开属性设置,名称填写‘inject1’,下拉列表中选择“周期性执行”,周期选择每隔 1 秒,保存并返回画布。

    3. 重复 1 ~ 4 步完成另外两台设备 (d1,d2) 流程。

  • 增加信息输出

    1. 在节点选择区域选择 debug 节点,拖动至画布 td-writer 节点后。
    2. 双击节点打开属性设置,勾选“节点状态”,下拉列表中选择消息数量。

以上节点增加完成后,依次把上面节点按顺序连接起来,形成一条流水线,数据采集流程制作完成。

点击右上角“部署”按钮发布修改内容,运行成功后可以看到:

  • td-writer 节点状态变成绿色,表示流程工作正常。
  • debug 节点下的数字表示成功采集次数。

在这里插入图片描述

向下游节点输出写入成功结果,若失败抛出异常:

{"topic":  "insert into test.d1 values (now, 20, 203, 2);","isQuery":  false,"payload":{"affectRows": 1,"totalTime":  2,"timing":     "961982"}
}
数据查询

查询流程由三个节点(inject/tdengine-operator/debug)组成,完成每分钟实时输出各智能电表平均电流、电压及用电量需求。
由 inject 节点完成触发查询请求,结果输出至下游 debug 节点中,节点上显示查询执行成功数量。

操作步骤如下:

  1. 将 inject 节点拖动至画布中,双击节点设置属性,名称填写 ‘query’, msg.topic 填写并保存并返回画布:
select tbname, avg(current), avg(voltage), sum(p) 
from ( select tbname,current,voltage,current*voltage/60 as p from test.meters where  ts > now-60s partition by tbname)
group by tbname;
  1. 将 tdengine-operator 节点拖动至画布中,双击节点设置属性,“数据库”选择前面已创建好的数据源 ‘db-server’,保存并返回画布。
  2. 将 debug 节点拖动至画布中,双击节点设置属性,勾选“节点状态”,下拉列表中选择“消息数量”,保存并返回画布。
  3. 依次把以上节点按顺序连接起来,点击“部署”按钮发布修改内容。

流程启动成功后:

  • td-reader 节点状态变成“绿色”,表示流程工作正常。
  • debug 节点显示查询成功次数。

在这里插入图片描述

向下游节点输出查询结果,若失败抛出异常:

{"topic":  "select tbname,avg(current) ...","isQuery":  true,"payload": [{"tbname":      "d2","avg(current)": 26.7,"avg(voltage)": 235,"sum(p)":       6329},{"tbname":       "d0","avg(current)": 16.5,"avg(voltage)": 222,"sum(p)":       121},{"tbname":       "d1","avg(current)": 29,"avg(voltage)": 202,"sum(p)":       5833}]
}
数据订阅

数据订阅流程由两个节点(tdengine-consumer/debug)组成,实现过载告警。
debug 节点展示向下游节点推送数据次数,生产中可把 debug 节点更换为处理订阅数据的功能节点。

操作步骤如下:

  1. 使用 taos-CLI 手工创建订阅主题”topic_overload“, SQL 如下:
create topic topic_overload as select tbname,* from test.meters where current > 25 or voltage > 230;
  1. tdengine-consumer 节点拖动至画布中,双击节点设置属性,填写如下内容后保存并返回画布。

    • 名称:td-consumer
    • 订阅服务器:ws://www.example.com:6041
    • 用户名:root
    • 密码:taosdata
    • 订阅主题:topic_overload
    • 消费开始位置:latest
    • 其它项保持默认
  2. 将 debug 节点拖动至画布中,双击节点设置属性,勾选“节点状态”,下拉列表中选择“消息数量”,保存并返回画布。

  3. 依次把以上节点按顺序连接起来,点击”部署“按钮发布修改内容。

流程启动成功后可看到 td-consumer 节点状态变成“绿色”表示流程工作正常,debug 节点数字表示消费次数,如下图:

在这里插入图片描述

向下游节点推送的过载设备警告信息,若失败抛出异常:

{"topic": "topic_overload","payload": [{"tbname":   "d1","ts":       "1750140456777","current":  31,"voltage":  217,"phase":    2,"groupid":  4,"location": "California.MountainView"}],"database":  "test","vgroup_id": 4,"precision": 0
}

异常捕获

在数据采集、查询及订阅流程中,发生错误均按抛出异常机制来处理,需建立异常监控流程:

  1. 将 catch 节点拖动至画布中。
  2. 双击节点打开属性设置,名称填写 ‘catch all except’,捕获范围选择“所有节点”。
  3. 将 debug 节点拖动至画布 catch all except 节点后。
  4. 双击节点设置属性,勾选“节点状态”,下拉列表中选择“消息数量”,保存并返回画布。
  5. 依次把以上节点按顺序连接起来,点击”部署“按钮发布修改内容。
    流程启动后监控所有节点异常产生:
  • debug 节点展示发生异常数量。
  • 可通过 NODE-RED 日志系统查看异常详细。

在这里插入图片描述

运行效果

以上流程制作完成后,点击“部署”发布,进入运行状态,如下:
在这里插入图片描述

总结

本文通过工业监控场景展示了:

  1. Node-RED 与 TDengine 的三种集成模式:
    • 数据采集(tdengine-operator 写入)
    • 实时查询(tdengine-operator 查询)
    • 事件驱动(tdengine-consumer 订阅)
  2. 完整的错误处理机制
  3. 生产环境部署参考方案

本文侧重从示例角度介绍,全部功能文档请在 Node-RED 节点在线文档中获取。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV——图像形态学

图像形态学 一、像素的距离二、像素的邻域三、膨胀与腐蚀3.1、结构元素3.2、腐蚀3.3、膨胀 四、形态学操作4.1、开运算和闭运算4.2、顶帽和黑帽4.3、形态学梯度4.4、击中击不中 一、像素的距离 图像中像素之间的距离有多种度量方式,其中常用的有欧式距离、棋盘距离…

在Django中把Base64字符串保存为ImageField

在数据model中使用ImageField来管理avatar。 class User(models.Model):AVATAR_COLORS ((#212736, Black),(#2161FD, Blue),(#36B37E, Green),(#F5121D, Red),(#FE802F, Orange),(#9254DE, Purple),(#EB2F96, Magenta),)def generate_filename(self, filename):url "av…

使用 R 处理图像

在 R 中进行图像处理,使用像 imager 这样的包,可以实现强大的数字图像分析和处理。本博客将基于"图像数据分析"文档的概念,演示使用 imager 包进行的关键技术——图像增强、去噪和直方图均衡化,并通过可视化结果展示这些…

一命速通Prometheus+Grafana+Consul+VictoriaMetrics

Prometheus业务 搭建及使用 注意:优先看完提供的博客链接,可以快速了解该工具的功能及其搭建和使用。 prometheusgrafana 一、PrometheusGrafana普罗米修斯,搭建和使用_普罗米修斯 grafana-CSDN博客 ./prometheus --config.fileprometheus.ym…

蚂蚁百宝箱快速创建智能体AI小程序

蚂蚁百宝箱官网https://tbox.alipay.com/community?operationSource1006/ 以下是一篇关于蚂蚁百宝箱快速创建智能体 AI 小程序的图文并茂的博客: 标题:蚂蚁百宝箱快速创建智能体 AI 小程序,开启智能应用新体验 引言 在数字化飞速发展的当…

大模型面试题:RL Scaling Law 中的“过优化”现象及其缓解方法是啥?

更多面试题,请看 大模型面试题总结-CSDN博客 或者 https://gitee.com/lilitom/ai_interview_questions/blob/master/README.md 最好将URL复制到浏览器中打开,不然可能无法直接打开 ---------------------------------------------------------------…

Filecoin系列 - IPLD 技术分析

1. 用途 1.1 存储数据 为了成功地将数据加到 Filecoin 网络, 需要成功完成以下步骤: 客户端导入数据生成CAR文件: 数据必须打包成 CAR file (内容可寻址档案) - CAR是IPLD规范的序列化归档文件.存储交易: 存储供应商和客户之间的存储交易必须由客户发起, 并由存储供应商接受…

Apptrace如何帮我精准追踪移动广告效果?

开发者视角:Apptrace如何帮我精准追踪移动广告效果?​​ 作为独立开发者,我最头疼的就是​“广告投放到底有没有用?”​——钱花出去了,用户是刷量机器人还是真实用户?哪个渠道的ROI最高?Apptr…

【MySQL篇07】:redo log日志与buffer pool详解

文章目录 1. Buffer Pool 缓冲池2. redo log (重做日志)redo log 的作用:为什么需要 redo log buffer?什么时候刷盘呢? 3. 总结一下 redo log 和 Buffer Pool 在更新数据时的协同工作关键组件关系图刷盘完成后 1. Buffer Pool 缓冲池 首先&a…

Qt Library库系列----Serial串口

前言 每次写串口相关的功能时,总是需要重新写或者复制原来写过的文件,容易出错不说,这也不是码农的风格,所以还是得有一套自己得代码库,方便调用,又能保持神秘感。 一、开发需求 1.有个实例类;…

第八节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 用户管理(下)

Vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 对接后端登录接口(上) ✅ 第四节:Vben Ad…

Redis 性能瓶颈时如何处理?

当 Redis 遇到性能瓶颈时,需要从多个维度进行排查和优化。以下是系统化的解决方案,涵盖硬件、配置、数据模型、网络等关键点: 一、硬件资源优化 内存瓶颈 现象:频繁触发 OOM 或 used_memory 接近物理内存。解决: 升级服…

多相机三维人脸扫描仪:超写实数字人模型制作“加速器”

超写实数字人,又称“数字分身”,是以真人形象为原型构建的高仿真虚拟形象,按维度可分为2D数字人与3D数字人。这类数字人已广泛应用于影视制作、游戏交互、品牌直播等场景,其核心价值在于通过技术手段实现真人形象的数字化复刻&…

ceph 自动调整 pg_num

要让 Ceph 的 pool 自动调整 pg_num(PG 数量),你需要启用 PG autoscaler。这是从 Ceph Octopus(15.x) 开始引入的功能,能根据池的容量和对象数量自动建议或调整 pg_num,以实现负载均衡。 ✅ 一步步开启 Pool 的 pg_num 自动调整 1. 启用 PG autoscaler 模块(通常默认启…

Python Beautiful Soup 4【HTML/XML解析库】 简介

全面剖析大模型 图解大模型:生成式AI原理与实战 大语言模型大模型应用开发Transformer DeepSeek模型原理开发深度学习 图灵出品 大模型强化学习详解 大模型算法:强化学习、微调与对齐(全彩)详解强化学习 RLHF GRPO DPO SFT CoT D…

AI Agent开发与安全

AI Agent的核心演进 Level 1:LLM Agent(聊天机器人) 特点:靠提示词工程赋予人设(如星座占卜、角色扮演),但存在幻觉问题,输出不可控。局限:娱乐性强,难胜任严…

NumPy玩转数据科学

本文在创作过程中借助 AI 工具辅助资料整理与内容优化。图片来源网络。 文章目录 一、引言二、NumPy 概述2.1 NumPy 的定义与发展2.2 NumPy 的重要性 三、NumPy 的多维数组支持3.1 多维数组的概念3.2 多维数组的创建与操作3.2.1 数组的创建3.2.2 数组的索引和切片3.2.3 数组的运…

【uniapp小程序开发】图表组件ucharts的使用(入门)

一、插件的安装 安装非常简单,打开uniapp的插件市场,导入到项目中即可 下载地址:https://ext.dcloud.net.cn/plugin?id271 二、开始实践 先看页面的效果 页面中实现了三个基本图形的展示:折线图、饼图和柱状图。 上图左一&a…

APISIX+etcd高可用集群部署方案详解

#作者:任少近 文章目录 一、背景二、部署etcd1、etcd的svc部署yaml2、Etcd 服务定义说明3、etcd的statefulset部署yaml4、Etcd 状态集(StatefulSet)配置说明5、查看集群状态 三、部署apisix的deployment部署1、apisix部署yaml文件2、APISIX …

Excel常用公式大全

资源宝整理分享:https://www.httple.net Excel常用公式大全可以帮助用户提高工作效率,掌握常用的Excel公式,让数据处理和计算工作更加便捷高效。了解公式学习方法、用途,不再死记硬背,拒绝漫无目的。 命令用途注释说…