侧边栏壁纸
  • 累计撰写 55 篇文章
  • 累计收到 2 条评论

用Python搭个本地运行的物联网设备状态告警脚本

2026-10-9 / 0 评论 / 3 阅读

用Python搭个本地运行的物联网设备状态告警脚本

昨晚蹲在机柜旁边调家里的温湿度节点,突然想起之前试过用云平台做告警,延迟高就算了,还得把设备数据全传上去,干脆自己用Python撸了个本地跑的轻量脚本,所有检测逻辑全在本地跑,不用把设备状态传到第三方云平台,隐私性好很多,凑合用着还挺顺。

先把需要的包装上

我这边用的是Python3.9以上的版本,太低的版本可能有类型注解兼容问题,装包直接用pip就行,不同系统的通知依赖不一样,别装错了:

pip install requests ping3 python-dotenv win10toast  # Windows用户装这个
# Mac用户把win10toast换成pync,Linux用户换成notify2即可

核心逻辑其实没几行

说白了就是定时ping你要监控的物联网设备IP——不管是ESP32采集节点、智能网关还是NAS都能测,连续几次ping不通就触发通知,我额外加了个本地Ollama的小接口让它帮忙生成排查提示,嫌麻烦完全可以跳过AI部分,不影响核心功能。

  1. 先在脚本同目录下建个.env配置文件,把要监控的设备IP和参数填进去,连续失败阈值别设太低,不然家里路由器偶尔抽风就会疯狂弹通知:
    MONITOR_IPS = ["192.168.31.100","192.168.31.120","192.168.31.200"]
    PING_INTERVAL = 60  # 轮询间隔,单位秒,别设太小心把弱性能设备ping炸
    FAIL_THRESHOLD = 3  # 连续失败次数达标才告警,过滤偶发网络波动
  2. 核心的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
  3. 系统通知部分直接调用对应系统的弹窗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部分我还没细测,上次书房的温湿度节点离线,它提示我“看看是不是猫碰了”,结果还真说中了,有点离谱。

反正整套代码加起来也就百来行,要接企业微信、钉钉推送的话自己改下告警发送的部分就行,比买现成的物联网监控平台省事儿多了。

评论一下?

OωO
取消