
昨晚蹲在机柜旁边调家里的温湿度节点,突然想起之前试过用云平台做告警,延迟高就算了,还得把设备数据全传上去,干脆自己用Python撸了个本地跑的轻量脚本,所有检测逻辑全在本地跑,不用把设备状态传到第三方云平台,隐私性好很多,凑合用着还挺顺。
先把需要的包装上
我这边用的是Python3.9以上的版本,太低的版本可能有类型注解兼容问题,装包直接用pip就行,不同系统的通知依赖不一样,别装错了:
pip install requests ping3 python-dotenv win10toast # Windows用户装这个
# Mac用户把win10toast换成pync,Linux用户换成notify2即可
核心逻辑其实没几行
说白了就是定时ping你要监控的物联网设备IP——不管是ESP32采集节点、智能网关还是NAS都能测,连续几次ping不通就触发通知,我额外加了个本地Ollama的小接口让它帮忙生成排查提示,嫌麻烦完全可以跳过AI部分,不影响核心功能。
- 先在脚本同目录下建个.env配置文件,把要监控的设备IP和参数填进去,连续失败阈值别设太低,不然家里路由器偶尔抽风就会疯狂弹通知:
MONITOR_IPS = ["192.168.31.100","192.168.31.120","192.168.31.200"] PING_INTERVAL = 60 # 轮询间隔,单位秒,别设太小心把弱性能设备ping炸 FAIL_THRESHOLD = 3 # 连续失败次数达标才告警,过滤偶发网络波动 - 核心的ping检测部分代码直接抄就行,不用改太多:
from ping3 import ping from dotenv import load_dotenv import os load_dotenv() # 读取配置 ip_list = [ip.strip() for ip in os.getenv("MONITOR_IPS").strip('[]').replace('"','').split(',')] fail_count = {ip:0 for ip in ip_list} def check_device(ip): resp_time = ping(ip, timeout=2) return resp_time is not None - 系统通知部分直接调用对应系统的弹窗API就行,想加AI排查提示的话,本地开着Ollama跑个qwen2:0.5b的小模型就行,占资源很少,代码加个请求:
# 可选AI分析模块,不用直接删掉 import requests def get_ai_tips(failed_ip): prompt = f"局域网设备{failed_ip}连续离线,用10字以内给个口语化排查方向" try: res = requests.post("http://localhost:11434/api/generate", json={"model":"qwen2:0.5b","prompt":prompt,"stream":False}, timeout=5) return res.json()["response"].strip() except: return "先检查电源和网线"
提醒下:别直接拿这个往生产环境套啊,我就是写来家里凑合用的,没做并发优化,监控设备超过10个的话得自己改协程版本;另外路由器开了AP隔离的话,跨网段设备是ping不通的,先测好局域网连通性再跑。
平时我直接把脚本丢Windows启动文件夹里,开机自己后台静默跑,不用额外开服务。哦对了,那个AI部分我还没细测,上次书房的温湿度节点离线,它提示我“看看是不是猫碰了”,结果还真说中了,有点离谱。
反正整套代码加起来也就百来行,要接企业微信、钉钉推送的话自己改下告警发送的部分就行,比买现成的物联网监控平台省事儿多了。
评论一下?