
昨天帮隔壁工位刚学物联网的学弟调ESP32温湿度模块,他折腾半天把数据传到公云又怕隐私泄露,索性教他写个本地跑的告警脚本,全程没复杂依赖,顺着步骤走很快就能跑通。
先把本地依赖装对
- 先确保电脑装了Python3.8及以上版本,打开终端执行下面的命令安装依赖,别用sudo装,很容易把系统自带Python环境搞崩:
pip install paho-mqtt numpy - 本地搭轻量MQTT消息 broker,Windows用户直接下载Mosquitto安装包勾选开机启动即可,Mac用户直接用Homebrew安装:
brew install mosquitto brew services start mosquitto
新手别图省事直接用公网MQTT服务器,本地部署的broker延迟低,还不会把家里的环境数据传到第三方,默认端口是1883,初始配置不用加账号密码,先跑通功能再折腾鉴权不迟。
写核心代码,先跑通数据接收
- 新建一个名为temp_alert.py的文件,先写MQTT连接和订阅逻辑,注意把订阅主题改成你自己ESP32上报数据用的主题,我这里用的是home/sensor/temp:
import paho.mqtt.client as mqtt import numpy as np from collections import deque # 用滑动窗口存最近的传感器数据,不用额外搭数据库 data_window = deque(maxlen=20) BROKER_ADDR = "127.0.0.1" SUB_TOPIC = "home/sensor/temp" def on_connect(client, userdata, flags, rc): print("MQTT连接成功,开始订阅传感器数据") client.subscribe(SUB_TOPIC) def on_message(client, userdata, msg): temp = float(msg.payload.decode()) print(f"收到温度数据: {temp}℃") data_window.append(temp) check_alert(temp) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect(BROKER_ADDR, 1883, 60) client.loop_forever() - 确认ESP32端和电脑在同一个局域网,把传感器读到的温湿度值转成字符串,发到你设置的MQTT主题上就行,不用加额外的加密配置,本地通信足够安全。
加个简易异常判定,不用调用大模型接口
说白了没必要一上来就接大模型做异常检测,用简单的统计方法对新手来说足够好用,在刚才的文件里补上check_alert函数就行:
def check_alert(current_temp):
if len(data_window) < 10:
return # 先攒够10条数据再判定,初始样本太少容易误报
# 计算窗口内数据的均值和标准差,偏离过大就触发告警
mean = np.mean(data_window)
std = np.std(data_window)
if abs(current_temp - mean) > 2 * std:
normal_range = f"{mean-2*std:.1f}~{mean+2*std:.1f}℃"
print(f"⚠️ 温度异常!当前值偏离正常区间,近期正常范围大概{normal_range}")
# 要加声音提醒、消息推送的话可以在这里补代码,先把打印逻辑跑通
别一开始就写死温度阈值,不同季节、不同房间的正常温度差很多,用滑动窗口统计的方式不用反复改配置,窗口大小看传感器上报频率,1分钟报一次的话20条就够用,上报频率高可以适当调大maxlen的值。
最后在终端执行
python temp_alert.py,看到终端能正常打印收到的温度值,对着温湿度传感器哈口气模拟温度骤变,能弹出异常提示就算搭建完成。
反正这脚本占资源很少,扔在树莓派或者家里常开的小主机上跑就行,想加湿度、烟雾传感器的判定直接照着逻辑改,没必要一开始就上重得要死的商用物联网平台。
评论一下?