树莓派Node-Red例1:时间戳转换存入TXT文件

本文介绍如何使用Node-RED将时间戳转换为易读的日期和秒格式,并将其保存到TXT文件中。通过安装node-red-contrib-simpletime模块,可以轻松实现时间格式的转换。

本例实现把时间戳转换成可供人阅读的日期和秒格式并存入txt文件.

首先先安装 node-red-contrib-simpletime,安装方法如图:

也可以命令行安装,可参考https://flows.nodered.org/node/node-red-contrib-simpletime:

npm install node-red-contrib-simpletime

可导入代码如下:

[{
	"id": "9b114162.97a71",
	"type": "tab",
	"label": "流程1",
	"disabled": false,
	"info": ""
}, {
	"id": "a30a6c48.6e8f",
	"type": "ui_tab",
	"z": "",
	"name": "Temp",
	"icon": "dashboard"
}, {
	"id": "4c107418.fdb2bc",
	"type": "inject",
	"z": "9b114162.97a71",
	"name": "",
	"topic": "",
	"payload": "",
	"payloadType": "date",
	"repeat": "",
	"crontab": "",
	"once": false,
	"onceDelay": 0.1,
	"x": 290,
	"y": 200,
	"wires": [
		["759d788a.a96ee8"]
Node-RED 中,如果你希望将**两条消息(msg)合并成一条消息**,如来自不同时间点的两个 `msg.payload` 数据(如温度和湿度),可以使用以下几种方式实现。最常见的需求是:等待两个相关的部分消息到达后,组合它们为一个完整的对象。 --- ## ✅ 场景说明 假设你有两个输入: - 消息1: `{ payload: { temp: 25 } }` - 消息2: `{ payload: { humi: 60 } } }` 你想把它们合并为: ```js { payload: { temp: 25, humi: 60 } } ``` 但这两个消息可能来自不同的设备或不同时间点,你需要“等齐了”再发出去。 --- ## ✅ 推荐方案:使用 **Join 节点 + RBE 节点 或 Function 节点缓存** ### ✅ 方法一:使用 `join` 节点(推荐、可视化) ### 步骤: #### 1. 给每条消息添加唯一关联 ID 和序号 你可以通过 `function` 节点标记每组消息属于同一个批次: ```js // 假设用时间戳作为分组依据(或设备ID) msg.topic = "sensor-data"; msg.part = { id: "th-group", // 同一组 index: context.get("index") || 0, // 第0个或第1个 count: 2 // 总共2条 }; context.set("index", 1 - (context.get("index") || 0)); // 切换0/1 return msg; ``` > ⚠️ 更好的做法是使用 `msg.msgid` 或外部触发事件来标识一组数据。 #### 2. 使用 `join` 节点配置如下: - Type: `Merge incoming messages into a single message` - Mode: `Collection of messages` → `Using key/value pairs` - On: `msg.part` - Timeout: 可选(比如 5秒超时) 这样当收到两个带有相同 `part.id` 的消息时,`join` 节点会自动合并它们。 #### 3. 输出结果示: ```js { payload: { temp: 25, humi: 60 } } ``` --- ### ✅ 方法二:使用 `Function` 节点手动缓存与合并(灵活控制) 适用于需要自定义逻辑的情况。 #### 示代码(Function 节点): ```js // 使用 flow 上下文缓存上一条消息 let cache = flow.get("sensorCache") || {}; const inputKey = msg.input; // 区分来源,如 input="temp" 或 input="humi" const deviceId = msg.deviceId || "default"; // 如果有多个设备,按设备分组 if (!cache[deviceId]) { cache[deviceId] = {}; } // 存入当前字段 cache[deviceId][inputKey] = msg.payload; // 判断是否齐了 if (cache[deviceId].temp !== undefined && cache[deviceId].humi !== undefined) { // 合并为完整消息 const mergedMsg = { payload: { temp: cache[deviceId].temp, humi: cache[deviceId].humi }, topic: "merged-sensor-data", deviceId: deviceId }; // 清除已处理的缓存(防止重复发送) delete cache[deviceId]; flow.set("sensorCache", cache); return mergedMsg; } else { // 缓存未满,不输出 flow.set("sensorCache", cache); return null; } ``` > 💡 提示:`inputKey` 可以通过前级节点设置,如: ```js msg.input = "temp"; // 或 "humi" ``` --- ### ✅ 方法三:使用 `trigger` 或 `delay` 节点防抖合并 如果你知道两条消息会在短时间内连续到达(如 <1s),可以用 `delay` 节点做缓冲,配合 `join` 实现“窗口内合并”。 #### 流程图示意: ``` [Msg1] ──┐ ├── [Join] → {payload: [...]} [Msg2] ──┘ ``` - 设置 Join 节点为:`Collect 2 messages before sending` - 使用 `msg.seqId` 或 `msg.group` 来区分批次 --- ## 🔍 注意事项 | 问题 | 解决方法 | |------|----------| | 消息乱序或丢失 | 使用超时机制清除缓存 | | 多设备干扰 | 用 `deviceId` 或 `topic` 分组缓存 | | 内存泄漏风险 | 定期清理长期未完成的缓存(可用 `context()` 生命周期管理) | --- ## ✅ 扩展技巧:使用 `batch` 或 `gate` 控制流 - 使用 `node-red-node-batch` 插件批量收集消息 - 使用 `gate` 节点控制只在数据齐全时才允许通过 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

armcsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值