Node-RED实战:无线温湿度传感器数据自动记录Excel全攻略
1. 项目概述与核心价值如果你正在寻找一种简单、可靠且可视化的方法将分散在各地的无线温湿度传感器数据自动记录到Excel表格里那么你来对地方了。无论是用于监控仓库的存储环境、记录实验室的温湿度变化还是追踪家里的舒适度手动抄表不仅效率低下还容易出错。本教程将手把手带你利用Node-RED这个强大的“胶水”工具搭建一套全自动的数据采集与存储系统。整个过程无需编写复杂的后端代码通过拖拽节点和简单配置即可完成特别适合设备运维、环境工程师以及任何希望将物理世界数据数字化的爱好者。我们将以NCD的长距离无线温湿度传感器和USB网关为例但核心逻辑适用于绝大多数通过串口或网络上报数据的物联网设备。通过本教程你不仅能学会如何让Node-RED“认识”你的硬件、解析原始数据更重要的是我将分享两种将数据写入Excel的方法及其各自的适用场景和避坑要点。一种方法生成通用的CSV文件任何电子表格软件都能打开另一种则利用专用节点生成更标准的.xlsx文件。我会详细解释每一步背后的“为什么”比如如何从调试信息中提取有效数据、如何格式化时间戳、以及如何避免数据被意外覆盖等实际开发中必然会遇到的问题。最终你将获得一个7x24小时稳定运行的数据记录仪所有历史数据都整齐地躺在Excel里随时等待你的分析与调用。2. 核心硬件与软件环境搭建在开始连线画流程图之前扎实的基础环境是成功的一半。这部分我们不仅要列出清单更要搞清楚每样东西的作用以及选择它们的理由避免后续出现“硬件不兼容”或“软件跑不起来”的尴尬。2.1 硬件选型与连接要点本次演示的核心硬件包括传感器和网关两部分。NCD长距离无线温湿度传感器这是我们的数据源头。选择这类工业级传感器而非廉价的蓝牙模块主要看中其传输距离远视距可达数公里、穿透能力强得益于Sub-1GHz频段以及功耗低、电池寿命长的特点。它通常以固定的时间间隔如每30秒主动向网关发送一次数据包包内包含了传感器IDMAC地址、温度、湿度、电池电压等信息。NCD长距离无线Mesh调制解调器USB接口这是连接传感器与电脑的桥梁。它负责接收空中所有兼容传感器的无线信号并通过USB串口将原始数据流传输给Node-RED。选择带USB接口的型号是为了简化连接电脑将其识别为一个虚拟串口COM口无需额外的网络配置。硬件连接实操与注意事项供电确保传感器已安装好电池并上电。网关通过USB线连接到运行Node-RED的电脑或服务器上USB线同时负责供电和数据传输。识别串口连接后在电脑的设备管理器Windows或使用ls /dev/tty*命令Linux/macOS中找到新增的串口设备记下其端口号如COM3或/dev/ttyUSB0。这是后续在Node-RED中配置的关键。天线与位置确保网关和传感器的天线已安装牢固。初期测试时建议将传感器放置在距离网关较近如同一房间内的位置以排除信号干扰问题。2.2 Node-RED安装与核心节点部署Node-RED是我们的“大脑”和“调度中心”。它是一个基于Node.js的开源流程编排工具用可视化的方式连接硬件设备、API和在线服务。安装Node-RED 官方推荐通过npmNode.js包管理器安装这是最通用和便于管理的方式。npm install -g --unsafe-perm node-red安装完成后在命令行输入node-red即可启动服务。默认会监听本地的1880端口。打开浏览器访问http://localhost:1880就能看到Node-RED的流编辑器界面了。安装必要的节点包 Node-RED的基础功能有限强大的生态依赖于各种社区贡献的节点包。我们需要安装两个ncd-red-wireless这是与NCD无线硬件通信的核心驱动。它提供了“无线网关”和具体传感器类型的节点负责管理串口连接、解析二进制数据包。npm install ncd-red-wirelessnode-red-dashboard这是一个用于构建实时仪表板的UI节点集。虽然本教程核心是存Excel但有一个可视化面板能直观地看到数据变化对于调试和监控至关重要。npm install node-red-dashboard安装后需要重启Node-RED在运行node-red的命令行窗口按CtrlC然后重新输入node-red。注意安装节点包时请确保你的命令行当前目录是Node-RED的用户数据目录通常是~/.node-red或者使用-g全局安装。如果在错误的目录安装节点将不会出现在面板中。一个简单的检查方法是在Node-RED编辑器中左侧节点面板的顶部应该能看到“dashboard”和“ncd”分类。3. Node-RED流设计与数据接入解析环境就绪现在我们进入核心的流程设计环节。Node-RED的“流”就是一系列连接起来的节点数据从左边流入经过中间节点的处理最终从右边流出。我们的目标是构建一个从“串口读取”到“数据可视/存储”的完整管道。3.1 创建无线网关并连接传感器首先我们需要让Node-RED与物理网关建立通信。拖放无线网关节点在左侧节点面板的搜索框中输入“wireless”找到属于“ncd”分类下的“wireless gateway”节点将其拖放到中间的流程画布上。配置串口连接双击画布上的网关节点进行配置。你会看到一个“Serial Device”字段旁边有一个铅笔图标。点击它。在弹出的二级配置窗口中点击“Serial Port”字段旁的放大镜图标。系统会自动扫描可用的串口列表中应该会出现你之前记下的端口号如COM3。关键步骤选中正确的端口后务必点击右上角的**“添加”**按钮。这个操作会将这个串口配置保存为一个可复用的“串口设备”之后其他节点也能选择它。很多新手会直接点“完成”导致配置不生效。添加后回到主配置“Serial Device”下拉菜单中就会出现你刚添加的设备选择它然后点击“完成”。添加调试节点并部署从面板拖一个“debug”节点到画布放在网关节点右侧。用连线将网关节点的输出点右侧的小灰点连接到debug节点的输入点左侧的小灰点。最后点击右上角红色的**“部署”**按钮。部署的意义在Node-RED中任何对节点或流程的修改都必须点击“部署”后才会生效。这是一个必须养成的重要习惯。部署成功后如果硬件连接正确你应该能在右侧的“调试”标签页中看到不断刷新的数据消息。这些消息是原始的、未解析的JSON对象包含了从串口收到的所有原始信息。这是我们确认硬件到软件链路畅通无阻的第一步。3.2 过滤与解析特定传感器数据现在数据进来了但它是所有传感器数据的混合流。我们需要从中筛选出我们关心的那个温湿度传感器的数据。添加无线传感器节点在节点面板中再次搜索“wireless”这次选择“wireless”节点不是gateway拖到画布上。这个节点本质上是一个过滤器。配置传感器节点双击新节点进行配置。Serial Device选择刚才在网关节点中创建的同一个串口设备。Mac Address点击旁边的放大镜图标。神奇的事情发生了——由于网关节点已经在运行并缓存了扫描到的设备这里会直接列出所有在线传感器的MAC地址。选择你目标传感器的地址。选择后“Sensor Type”会自动识别并填充如“Temperature/Humidity”。你还可以在“Name”字段给它起个易记的名字比如“仓库1号温湿度”。点击“完成”。现在这个节点就只会允许指定MAC地址的传感器数据通过其他数据将被过滤掉。实操心得如果放大镜里没有出现设备请检查1) 传感器是否在网关通信范围内且已上电2) 网关节点是否已成功部署并运行蓝色小圆点下方没有红色错误标志3) 可以尝试按下传感器上的复位按钮强制它发送一次配置信号网关会立即捕获到。4. 数据格式化与CSV文件存储方案数据已经能精确地流向我们指定的节点了接下来要解决如何将它变成Excel能识别的格式并保存下来。我们先介绍最通用、最兼容的CSV方案。4.1 使用Function节点构造数据对象从传感器节点输出的msg对象其payload通常是一个包含了温度、湿度、电量等字段的复杂对象。我们需要从中提取所需字段并添加一个关键元素时间戳。没有时间戳的数据其价值大打折扣。添加Function节点在面板中搜索“function”将其拖出放在传感器节点右侧并连线。编写处理函数双击Function节点在代码编辑框中输入以下JavaScript代码// 获取当前时间并格式化为本地字符串方便阅读 var timestamp new Date().toLocaleString(); // 从上一节点传来的消息中提取温度和湿度值 // 根据ncd-red-wireless节点的输出结构数据通常在msg.payload中 var temperature msg.payload.temperatureC; // 假设温度字段名为temperatureC单位摄氏度 var humidity msg.payload.humidity; // 假设湿度字段名为humidity单位百分比 // 构建一个新的消息对象我们将传递这个对象给后续节点 var newMsg { payload: { timestamp: timestamp, temperature: temperature, humidity: humidity } }; // 将原消息的其他属性如topic等合并到新消息中避免丢失 // 但为了CSV输出的整洁我们通常只传递需要的payload return newMsg;关键解释msg是流入节点的数据包。我们创建了一个新的newMsg对象其payload属性是一个我们自定义的、结构清晰的对象。return newMsg;语句将这个新数据包发送给下一个节点。调试技巧如果你不确定msg.payload里具体有什么字段名可以先用一个debug节点连接到传感器节点后面部署后查看调试输出。你会看到一个可以展开的JSON对象里面所有字段一目了然。根据实际看到的字段名可能是tempC、rh等来修改上面的代码。4.2 配置CSV节点并写入文件现在msg.payload已经是一个包含timestamptemperaturehumidity三个键值对的对象了。CSV节点的作用就是将这个对象转换成一行逗号分隔的文本。添加CSV节点搜索“csv”节点并拖出连接到Function节点之后。配置CSV格式双击CSV节点进行配置。Columns这里定义Excel表格的表头。按照我们数据对象的键名填写timestamp, temperature, humidity。注意这里的名字必须和Function节点中newMsg.payload的属性名完全一致顺序即为列顺序。Output选择“a message per row”。这表示每收到一条消息就输出一行CSV字符串。其他选项保持默认点击“完成”。添加File节点进行存储搜索“file”节点选择“writes msg.payload”的那个即写文件节点拖出并连接到CSV节点之后。配置文件存储双击File节点。Filename这是最重要的设置。输入你想要保存文件的完整路径和文件名例如C:\SensorData\environment.csv或/home/pi/data/sensor_log.csv。关键设置在“Filename”框的右侧有一个下拉菜单默认是“Overwrite file”。务必将其改为“Append to file”。这是整个流程的“生命线”如果选择覆盖那么每次新数据都会清空之前的所有记录你最终只会得到最后一条数据。其他选项确保“Create directory”被勾选这样如果路径不存在Node-RED会自动创建文件夹。至此CSV存储流已构建完成无线传感器 - Function节点 - CSV节点 - File节点。点击“部署”后每当传感器上报一次数据你的指定路径下就会新增一行数据格式如下“2023/10/27 下午3:30:25” 23.5 45.2 “2023/10/27 下午3:31:25” 23.6 45.1 ...用Excel直接打开这个CSV文件就能看到带时间戳的完整历史数据表了。5. 使用专用Excel节点实现高级存储CSV方案虽然通用但有时我们希望直接生成标准的.xlsx文件或者进行更复杂的表格操作如写入特定单元格、应用格式。这时我们可以使用社区开发的node-red-contrib-excel节点。5.1 安装Excel节点并构建新流首先需要安装这个第三方节点包。在Node-RED的用户目录通常是~/.node-red下运行命令npm install node-red-contrib-excel安装完成后重启Node-RED。在节点面板中应该能看到一个新的“excel”分类。构建流程这个方案的流程前半部分与CSV方案完全相同无线网关 - 无线传感器过滤。之后我们进行分流。5.2 通过JSON节点格式化数据Excel节点对输入数据的格式有一定要求。一个稳妥的做法是先用一个JSON节点将数据包装成数组形式。添加JSON节点在传感器节点后连接一个“json”节点Node-RED内置节点用于字符串与JSON对象转换。配置JSON节点双击它在“Action”中选择“Convert between JSON string and JavaScript object”。通常传感器节点输出的已经是JavaScript对象所以这个节点在某些情况下可以确保格式统一但并非绝对必须。更常见的做法是如果后续Excel节点需要特定格式可以在这里用Function节点构造好。5.3 配置Excel节点并理解其局限性添加Excel节点从“excel”分类中拖出“excel”节点连接到JSON或Function节点之后。配置Excel节点双击进行配置。Operation选择“Append Row(s) to Worksheet”。这是最常用的追加数据模式。File指定要写入的.xlsx文件路径如./data/sensor_data.xlsx。Worksheet可以指定工作表名称默认为“Sheet1”。Data is选择“an array of row objects”。这意味着我们需要提供一个对象数组每个对象代表一行对象的属性名将成为列标题。因此我们需在之前的Function节点中构造一个形如[ {“timestamp”: “...” “temperature”: 23.5 “humidity”: 45.2} ]的数组作为msg.payload。重要局限性揭示根据社区反馈和我的实测这个Excel节点在“Append”模式下工作良好但如果你误操作或重新部署流有时可能会遇到文件被锁死或格式错误的问题。最大的一个坑点是如果选择“Write Worksheet”等模式它可能会覆盖整个工作表。因此对于单纯的数据记录CSV方案的稳定性和简单性往往更胜一筹。Excel节点的优势在于可以在流中动态创建文件、操作多个工作表或单元格格式适合更复杂的报表生成场景。6. 流程优化、监控与故障排查实录一个能跑通的流只是一个开始一个健壮的、可维护的流才是最终目标。下面分享一些提升稳定性和可操作性的技巧以及常见问题的解决方法。6.1 添加数据可视化与状态监控在存储数据的同时我们肯定想实时看到数据变化。node-red-dashboard节点派上用场了。创建仪表板组在传感器节点后分出一条线选中传感器节点的输出线拖动即可创建分支连接一个“chart”节点来自dashboard分类。配置图表类型为“折线图”并指定X轴和Y轴对应的数据字段如msg.payload.timestamp和msg.payload.temperature。创建数值显示再分一条线连接一个“gauge”仪表节点和一个“text”节点分别用于显示当前的温湿度数值。部署并访问仪表板部署后打开浏览器访问http://localhost:1880/ui你就能看到一个专业的实时监控面板了。这不仅能让你安心更是调试时判断数据是否正常的直观依据。6.2 注入节点与手动触发调试时我们可能不想干等传感器上报。这时可以使用“inject”节点。添加Inject节点拖一个“inject”节点到画布将其输出连接到无线网关节点的输入。配置Inject节点双击它可以配置一个固定的时间间隔如每5秒自动触发或者手动点击节点上的按钮来触发。触发时它会向网关节点发送一个信号通常可以模拟“请求数据”或“执行扫描”的命令具体取决于网关节点支持的功能。这对于测试硬件连接和数据处理流程非常有用。6.3 常见问题排查速查表以下是我在多次部署类似系统中遇到的典型问题及解决方案问题现象可能原因排查步骤与解决方案调试面板无任何输出1. 硬件未连接或未供电。2. 串口号错误。3. Node-RED流未部署。1. 检查USB线、传感器电池。2. 确认设备管理器中串口存在并在网关节点中正确选择。3. 点击右上角“部署”按钮确认节点无红色错误状态。能看到网关数据但无线传感器节点后无输出1. 传感器MAC地址未正确选择或传感器未入网。2. 传感器类型不匹配。1. 检查传感器节点配置的MAC地址是否与调试信息中的一致。按下传感器复位键重新在列表中选择。2. 确认选择的传感器类型与实际硬件相符。CSV/Excel文件未生成或为空1. 文件路径无写入权限。2. File节点模式误设为“覆盖”。3. 上游数据格式错误。1. 使用绝对路径并确保Node-RED进程有该路径的写权限。2.重点检查File节点必须设置为“Append to file”。3. 在File节点前连接一个debug节点查看流入File节点的msg.payload是否是预期的CSV字符串或数据对象。数据记录时间戳不对系统时区设置错误。Node-RED运行在服务器上时服务器时区可能不是本地时区。在Function节点中使用new Date().toLocaleString(‘zh-CN’ {timeZone: ‘Asia/Shanghai’})来指定时区。流程修改后不生效未重新部署。牢记任何节点配置更改、连线修改后都必须点击**“部署”**。Dashboard无法访问Dashboard节点未正确配置或未部署。1. 确保已安装node-red-dashboard并重启。2. 检查每个UI节点如chart gauge是否都设置了所属的“Group”和“Tab”。3. 访问地址是http://你的IP:1880/ui。6.4 高级技巧数据清洗与错误处理在实际环境中传感器可能会偶尔上报异常值如湿度超过100%。我们可以在Function节点中加入简单的数据清洗逻辑。var temp msg.payload.temperatureC; var humi msg.payload.humidity; // 数据有效性检查 if (temp 60 || temp -20) { // 温度值异常可以选择丢弃、记录错误或使用上一个有效值 // 例如temp null; 或者 return null; (不发送消息) node.warn(“收到异常温度值: ” temp); // 这里我们选择不处理这条消息 return null; } if (humi 100 || humi 0) { node.warn(“收到异常湿度值: ” humi); return null; } // 只有数据有效时才构造新消息 var newMsg { payload: { timestamp: new Date().toLocaleString(), temperature: temp, humidity: humi } }; return newMsg;通过在Function节点中return null;可以阻止无效数据继续向下游流动避免污染你的数据记录。最后别忘了给你的流起个清晰的名字并添加一些“comment”节点来做注释。当几个月后你需要回头修改或者将项目交接给同事时这些良好的习惯会为你节省大量时间。这套基于Node-RED的系统其魅力在于稳定运行后几乎无需维护却能持续不断地为你积累宝贵的环境数据资产。