ESP32温湿度数据上云后,我用Node-RED+MQTT做了个自动化的微信推送
当你已经成功将ESP32采集的温湿度数据上传到MQTT服务器时,这些数据如果只是静静地躺在服务器里,那它们就只是一串数字而已。但如果我们能让这些数据"活"起来,在特定条件下自动触发通知或控制其他设备,这才是物联网项目的真正价值所在。本文将带你使用Node-RED这个强大的低代码工具,构建一个完整的"监测-判断-告警"系统,当温度或湿度超过设定阈值时,自动发送微信通知。
1. 环境准备与基础配置
在开始构建自动化流程前,我们需要确保几个关键组件已经就绪:
- MQTT Broker:继续使用之前ESP32连接的那个MQTT服务器(如EMQX公共服务器)
- Node-RED环境:可以在本地电脑安装,也可以使用树莓派等设备部署
- 微信推送服务:推荐使用Server酱这类第三方服务,它们提供了简单的HTTP API
安装Node-RED非常简单,如果你使用npm,只需运行:
npm install -g --unsafe-perm node-red然后通过node-red命令启动服务,默认会在1880端口运行。
提示:对于生产环境,建议为Node-RED设置密码认证,避免未授权访问。
2. 构建MQTT数据订阅流
Node-RED的核心概念是"流"(Flow),即通过连接不同的节点来处理数据。我们的第一个任务是订阅ESP32发布的温湿度数据。
- 从左侧面板拖拽一个
mqtt in节点到工作区 - 双击节点进行配置:
- Server:新建一个连接到你的MQTT服务器
- Topic:填写ESP32发布数据的主题(如
TEST/DHT11)
- 添加一个
debug节点并连接到mqtt in节点,用于查看原始数据
此时你的流应该看起来像这样:
[mqtt in] -> [debug]点击右上角的"部署"按钮,然后在调试面板中你应该能看到类似这样的消息:
"Temp: 25.5'C Humidity: 60%"3. 数据解析与阈值判断
原始数据是字符串格式,我们需要将其解析为可操作的数值,并设置条件判断。
3.1 解析温湿度数据
- 添加一个
function节点,编写以下JavaScript代码处理数据:
var payload = msg.payload; // 使用正则表达式提取温度和湿度 var tempMatch = payload.match(/Temp: ([\d.]+)/); var humiMatch = payload.match(/Humidity: ([\d.]+)/); if (tempMatch && humiMatch) { msg.temperature = parseFloat(tempMatch[1]); msg.humidity = parseFloat(humiMatch[1]); return msg; } return null;3.2 设置阈值触发条件
添加一个switch节点来设置条件判断:
- Property:
msg.temperature - 条件1:
>=30 (高温告警) - 条件2:
<=10 (低温告警)
同样方法为湿度设置一个switch节点:
- Property:
msg.humidity - 条件1:
>=70 (高湿告警) - 条件2:
<=30 (低湿告警)
4. 实现微信推送通知
当温度或湿度超过阈值时,我们需要触发微信通知。这里以Server酱为例:
首先在Server酱官网注册并获取SCKEY
在Node-RED中添加一个
http request节点,配置如下:- Method:GET
- URL:
https://sc.ftqq.com/{SCKEY}.send - Query Parameters:
text:警报标题desp:警报详情
在触发分支后添加一个
template节点来构造推送内容:
温度警报!当前温度:{{temperature}}°C 湿度:{{humidity}}% 时间:{{timestamp}}- 最后将
template节点连接到http request节点
完整的流程结构应该是:
[mqtt in] -> [解析function] -> [温度switch] -> [警报template] -> [http request] -> [湿度switch] -> [警报template] -> [http request]5. 进阶功能扩展
基础告警功能实现后,我们可以考虑添加更多实用功能:
5.1 数据持久化存储
添加MySQL或InfluxDB节点存储历史数据,便于后续分析:
// 示例:InfluxDB写入配置 [{ "measurement": "environment", "tags": { "device": "ESP32-DHT11" }, "fields": { "temperature": msg.temperature, "humidity": msg.humidity } }]5.2 多平台通知集成
除了微信,还可以添加邮件、Slack等通知方式:
| 通知方式 | 配置节点 | 特点 |
|---|---|---|
| 邮件 | e-mail | 适合正式通知 |
| Slack | slack | 适合团队协作 |
| 短信 | twilio | 即时性强 |
5.3 可视化仪表板
Node-RED内置Dashboard功能,可以快速创建监控界面:
- 安装
node-red-dashboard插件 - 添加
chart和gauge节点 - 配置仪表板布局和更新频率
6. 实际应用中的优化建议
在真实环境中运行一段时间后,我发现几个可以提升稳定性和用户体验的点:
- 添加数据校验:在解析函数中检查数据有效性,避免错误数据触发误报
- 设置静默期:同一警报在短时间内不重复发送
- 心跳检测:监控设备是否在线,添加离线告警
- 动态阈值:根据不同时段设置不同的告警阈值
实现心跳检测的示例代码:
// 在function节点中添加 context.lastSeen = context.lastSeen || 0; var now = Date.now(); if (now - context.lastSeen > 300000) { // 5分钟无数据 msg.alert = "设备离线告警"; return msg; } context.lastSeen = now;这个项目最有趣的部分是看到简单的温湿度数据如何通过几层处理,最终转化为有实际价值的业务告警。当第一次收到微信推送的温度警报时,那种"物联网真的在工作"的成就感是难以言喻的。