You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:45:02