上周三下午,手机又响了。不是微信,是家里监控的推送——"Front Door Motion Detected"。

这种通知一天能收十几条。风刮树枝、邻居家的猫、送外卖的,全都是一个样:有人来了,但不知道是谁、来干嘛、待了多久。最后变成狼来了,真有事反而懒得看。

打开网易新闻 查看精彩图片

所以动手改了一套系统。核心目标很简单:让监控通知告诉我"发生了什么",而不是"有东西在动"。

这套方案完全本地运行,没往云端传过任何画面。用到的东西也不复杂:Frigate做运动检测,Home Assistant串自动化,Gemma 4在本地跑视觉理解,最后把结果推送到手机

现在收到的通知长这样:"A person wearing a dark shirt approached the gate, waited briefly, and left."(一个穿深色衬衫的人走近大门,短暂停留后离开。)

不是模板填空,是模型看了画面之后写的描述。能区分是送货员、等人、还是可疑徘徊。信息密度高了,误点进去确认的次数少了。

Frigate:开源NVR做底座

Frigate是个开源的网络录像机系统,专门给IP摄像头做实时目标检测。它直接分析RTSP视频流,在本地完成人、车、动物的识别,不需要订阅云服务。

WiFi摄像头走RTSP协议把画面喂给Frigate。配置里写好流地址,它就开始24小时盯着画面跑检测。检测到人的瞬间,触发后续流程。

Frigate的检测只到"这是个人"为止。接下来要把画面送给Gemma 4,让它看图说话。

Gemma 4 E2B:轻量视觉模型本地部署

选的模型是gemma4:e2b,通过Ollama在本地运行。硬件环境是一台Proxmox虚拟机,开了GPU直通加速推理。

E2B这个变体是特意挑的。三个原因:够轻,本地能跑得动;延迟低,从检测到推送到手机控制在几秒内;输出简洁,不做过度发挥,刚好适合监控场景的描述需求。

部署结构是:Frigate检测到事件→截取关键帧→送进Gemma 4→生成文字摘要→Frigate把摘要和录像片段打包成事件→Home Assistant读取事件→触发手机推送。

没有Gemma 4的时候,系统只知道"A person was detected."有了之后,能输出人在做什么、移动轨迹、停留时长、事件重要性判断。这一步让通知从信号变成了信息。

Home Assistant:自动化中枢

Home Assistant在这里当胶水。它监听Frigate生成的事件,解析里面的AI摘要字段,然后组装成富文本通知发到手机。

通知带缩略图,能直接看到画面关键帧。点进去可以播放完整录像。整个链路从画面变化到手机震动,大概3-5秒。

配置主要是两份YAML:一份给Frigate,定义检测区域、模型调用方式、提示词模板;一份给Home Assistant,写自动化规则,什么事件触发什么格式的通知。GitHub Gist上有完整配置可以参考。

提示词需要根据自家场景调。比如关心的是"人有没有进院子",邻居可能关心"车有没有堵车库门"。在Frigate配置里改prompt,让Gemma 4侧重描述不同细节。

实际用下来的变化

最直观的是通知点开率下降。以前每条都点进去看,现在扫一眼文字就知道要不要管。真正需要看录像的情况,从每天十几次降到一两次。

另一个意外收获是检索方便。Frigate的事件库带AI摘要,搜"delivery"能找出所有送货相关的录像,不用翻时间轴。

隐私方面,所有画面和推理都在本地。Gemma 4不联网,Ollama不往外传数据,手机通知走Home Assistant的加密通道。对不想把家门口画面上传厂商服务器的用户来说,这是硬性需求。

硬件成本:一台能跑Gemma 4的机器,用的是带独显的迷你主机;摄像头用支持RTSP的WiFi型号,海康、TP-Link、Reolink都有兼容款。Frigate和Home Assistant都是开源免费。

部署门槛主要在调配置。RTSP流地址要查摄像头说明书,GPU直通要看Proxmox文档,提示词要试几次才能稳定输出想要的格式。但搞过一次之后,复制到别的摄像头只是改几行参数。