NodeRed 如何动态解析 Tasmota 上报的 MQTT JSON 获取设备属性
实现方案
完全可以通过遍历JSON属性的方式实现动态取值,核心思路是跳过固定的Time字段,遍历剩余键即可获取所有传感器的动态键名和对应属性值。
场景1:统一提取所有传感器数据为结构化数组
该方案会把所有传感器数据整理为标准数组格式,方便后续节点批量处理:
const rawData = msg.payload; const sensorResult = []; for (const key in rawData) { // 跳过固定的时间字段 if (key === 'Time') continue; const currentSensor = rawData[key]; // 可选校验:仅保留符合传感器结构的字段 if (!currentSensor.mac || currentSensor.Temperature === undefined) continue; sensorResult.push({ // 存入动态键名方便识别 sensorId: key, mac: currentSensor.mac, temperature: currentSensor.Temperature, humidity: currentSensor.Humidity, battery: currentSensor.Battery, rssi: currentSensor.RSSI, dewPoint: currentSensor.DewPoint }); } // 可根据需求调整输出字段,此处将结构化数据存入msg新增字段 msg.sensorList = sensorResult; // 如果你需要直接输出所有温度值的数组,可替换为以下代码: // msg.payload = sensorResult.map(item => item.temperature); return msg;
场景2:每个传感器输出独立消息
如果需要每个传感器单独触发后续流程,可使用NodeRed Function节点的多输出特性:
const rawData = msg.payload; const outputMessages = []; for (const key in rawData) { if (key === 'Time') continue; const currentSensor = rawData[key]; if (!currentSensor.mac || currentSensor.Temperature === undefined) continue; // 每条消息对应一个传感器,payload直接存储温度值,兼容你原有逻辑的输出格式 outputMessages.push({ payload: currentSensor.Temperature, sensorId: key, mac: currentSensor.mac, humidity: currentSensor.Humidity }); } // 返回消息数组,对应Function节点第一个输出端口的多条消息 return [outputMessages];
可选优化
如果你的传感器键名有统一前缀(如示例中的MJ_HT_V1),可以在遍历时添加前缀校验,避免其他意外字段干扰:
// 在跳过Time字段后新增判断 if (!key.startsWith('MJ_HT_V1')) continue;
内容的提问来源于stack exchange,提问作者donvonhill
相关产品推荐
相关产品推荐

