1. 项目概述:打造一个智能化的家庭安防与通知中枢
最近在折腾智能家居,总想把手头闲置的设备都利用起来。我手头有一台老旧的安卓手机,性能一般但摄像头还行,一直想把它变成一个常开的监控摄像头。同时,家里的智能设备都接入了 Home Assistant,如果能把这台“摄像头”也接进去,再结合企业微信的推送能力,不就能实现一个低成本的、高度自定义的家庭安防和状态通知系统了吗?比如,当摄像头检测到门口有人移动时,不仅能在 Home Assistant 里弹窗提醒,还能立刻给我的企业微信发一条带截图的消息,甚至能联动家里的智能灯闪烁报警。
这个想法听起来复杂,但拆解开来就是三个核心组件的联动:reCamera(将安卓手机变为网络摄像头)、Home Assistant(智能家居中枢,负责接收视频流、分析事件并触发自动化)、企业微信(作为高效、可靠的消息推送渠道)。整个过程不涉及任何复杂的硬件改造,核心在于软件配置与网络服务的打通。无论是想 DIY 一个宝宝看护器、宠物监视器,还是简单的门口安防,这套方案都提供了一个非常灵活和可扩展的框架。下面,我就把自己从零搭建、踩坑、到最终稳定运行的完整过程记录下来,分享给同样爱折腾的你。
2. 核心组件选型与部署思路
在开始动手之前,我们需要明确每个组件扮演的角色以及为什么选择它们。一个清晰的架构图能在脑海中形成,后续的配置才不会乱。
2.1 为什么是 reCamera?
市面上将手机变成摄像头的 App 很多,比如 IP Webcam、DroidCam。我选择reCamera的原因主要有几点:
- 纯粹的 RTSP 服务器:它不像一些 App 附带复杂的网页界面或云服务,reCamera 启动后就是一个标准的 RTSP(实时流传输协议)视频流服务器。这对于 Home Assistant 这类需要直接拉取流媒体的平台来说,兼容性最好,也最稳定。
- 低资源消耗:由于功能单一,它在老旧手机上的后台运行资源占用相对较低,更不容易被系统“杀掉”进程。
- 无广告与隐私可控:数据流完全在本地局域网内,不经过任何第三方服务器,隐私安全有保障。
它的作用就是让安卓手机化身为一个标准的网络摄像头,为 Home Assistant 提供视频源。
2.2 Home Assistant 的核心枢纽作用
Home Assistant 在这里是绝对的大脑。它需要完成以下任务:
- 集成摄像头:通过
generic或onvif集成,接入 reCamera 提供的 RTSP 视频流。 - 事件分析与自动化:利用其强大的图像处理或运动检测功能(例如内置的
image_processing或camera组件的运动检测属性),对视频流进行实时分析。 - 触发与执行:当检测到预设的事件(如运动、人脸、包裹)后,触发自动化流程。
- 调用消息服务:在自动化中,调用集成的企业微信通知服务,将报警信息、快照图片发送出去。
我选择将 Home Assistant 安装在一台常年开机的VirtualBox 虚拟机中。这样既保证了 7x24 小时运行,又便于备份和迁移。当然,树莓派、旧电脑、NAS 也都是不错的选择。
2.3 企业微信作为推送渠道的优势
为什么不用 Telegram、钉钉或者普通的微信?企业微信在智能家居通知场景下有独特优势:
- 高送达率与稳定性:企业微信的消息通道非常稳定,几乎不会被屏蔽或延迟,这对于安防报警至关重要。
- 丰富的消息格式:支持文本、图片、文件、图文链接等多种格式,非常适合发送带截图的报警信息。
- 易于管理的接收群组:可以创建一个专门的家庭通知“群聊”,将家庭成员都拉进来,实现消息的集中接收与管理。
- 免费且配额充足:对于个人或家庭使用,企业微信自建应用的消息推送 API 调用频率完全够用,没有费用。
它的角色就是最终的消息“喇叭”,将 Home Assistant 的分析结果,及时、可靠地推送到家人的手机上。
3. 分步部署与配置实战
理论清晰后,我们进入实操环节。请严格按照步骤进行,我会标注出所有容易踩坑的地方。
3.1 第一步:部署并配置 Home Assistant
我采用的是 VirtualBox 虚拟机方案,这是兼顾灵活性与性能的折中选择。
1. 创建虚拟机
- 在 VirtualBox 中新建一台虚拟机,系统类型选择Linux,版本选择Other Linux (64-bit)。
- 内存建议分配2GB 或以上,虽然 HA 最低要求不高,但后续加载集成和运行自动化需要一定内存。
- 硬盘创建VDI格式的动态分配磁盘,大小建议32GB以上,为日志、数据库和后续扩展留足空间。
- 网络连接务必选择“桥接网卡”。这是关键!它会让虚拟机获得一个和你主机在同一网段的独立 IP 地址,方便局域网内其他设备(如手机)访问。
2. 安装 Home Assistant OS
- 从 Home Assistant 官网下载最新的HA OS for Generic x86-64镜像(通常是
.img.gz文件)。 - 使用工具(如
StarWind V2V Converter)将.img.gz解压并转换为 VirtualBox 可用的.vdi磁盘文件。 - 在虚拟机设置中,用这个转换好的
.vdi文件替换掉之前创建的空白虚拟磁盘。 - 启动虚拟机。首次启动会进行初始化,时间较长。完成后,在浏览器中输入虚拟机的 IP 地址(如
http://192.168.1.xxx:8123)即可访问 HA 的初始化界面。
注意:如果启动后无法通过 IP 访问,请检查主机防火墙是否放行了 8123 端口,并确认虚拟机网络模式是否为桥接。
3. 基础配置与集成安装
- 完成初始化设置(创建账号、位置等)。
- 进入“配置” -> “设备与服务”。我们先为后续工作安装两个可能的必要集成:
- ONVIF:如果 reCamera 支持 ONVIF,用这个集成会更方便。
- Generic Camera:这是一个万能摄像头集成,通过直接输入 RTSP 地址来添加摄像头。
- 可以在“集成”页面右下角点击“添加集成”搜索并安装它们。
3.2 第二步:在安卓手机上设置 reCamera
1. 安装与基础设置
- 在安卓手机上下载并安装 reCamera。
- 打开 App,你会看到一个非常简洁的界面。核心设置如下:
- 分辨率与码率:根据手机性能和网络情况选择,例如
1080p,码率2000kbps。太高可能导致流不稳定。 - 帧率:
15或20fps 对于安防监控足够。 - 方向:根据手机摆放位置调整横屏或竖屏。
- 分辨率与码率:根据手机性能和网络情况选择,例如
- 最重要的信息是 App 首页显示的RTSP 地址。通常格式为:
rtsp://<手机IP地址>:8554/。记下这个地址,例如rtsp://192.168.1.105:8554/。
2. 确保手机常亮与网络稳定
- 在手机系统设置中,为 reCamera App 开启“后台无限制”、“电池优化忽略”等权限,防止系统休眠断流。
- 将手机连接电源,并固定放置在需要监控的位置(如靠窗的插座旁)。
- 确保手机连接的 Wi-Fi 信号强度良好。这是流是否稳定的基础。
实操心得:建议将手机调至飞行模式后再打开 Wi-Fi,避免来电或短信干扰。同时,在开发者选项中开启“充电时不休眠”。可以将 reCamera 的启动项添加到手机的任务管理器或自动化工具(如 Tasker)中,实现插电自启动,进一步提升可靠性。
3.3 第三步:将 reCamera 接入 Home Assistant
现在,我们需要在 HA 中“看到”手机摄像头。
方法一:通过 Generic Camera 集成(推荐,最通用)
- 进入 HA“配置” -> “设备与服务” -> “添加集成”。
- 搜索并选择“Generic Camera”。
- 在配置页面填写:
- 名称:给你的摄像头起个名字,如
Front Door Camera。 - 静止图像 URL:留空或填写 RTSP 地址(某些卡片预览需要)。
- 流源:这是关键。填入 reCamera 的 RTSP 地址,例如
rtsp://192.168.1.105:8554/。 - 验证:选择
basic(如果 reCamera 设置了用户名密码)。
- 名称:给你的摄像头起个名字,如
- 提交后,集成添加成功。你可以在“概览”页添加一个
picture-glance或webrtc卡片来验证视频流是否正常。
方法二:通过 ONVIF 集成(如果支持)
- 确保 reCamera 设置中开启了 ONVIF 服务(部分版本支持)。
- 在 HA 添加“ONVIF”集成。
- 配置时,HA 可能会自动发现设备。如果未发现,手动输入手机的 IP 地址、端口(通常是 80)、用户名和密码。
- ONVIF 集成通常会同时添加摄像头实体和运动传感器实体,更加方便。
注意事项:首次添加后,视频流加载可能会有几秒到十几秒的延迟,这是正常的缓冲过程。如果长时间黑屏或报错,请检查:1. RTSP 地址是否正确;2. 手机和 HA 主机是否在同一局域网;3. 防火墙是否阻止了 8554 端口。
3.4 第四步:配置企业微信自建应用与 HA 通知
这是联动中最关键的一步,打通从 HA 到手机的通知通道。
1. 创建企业微信企业
- 如果没有企业,需要先注册一个。使用个人手机号即可注册,过程很简单,相当于创建一个“团队”。
- 注册成功后,记下你的企业 ID (CorpID)。可以在“我的企业” -> “企业信息”底部找到。
2. 创建自建应用
- 进入“应用管理” -> “自建应用” -> “创建应用”。
- 上传一个 logo,填写应用名称(如“家庭安防助手”),选择可见范围(可以选你自己,或者创建一个包含家庭成员的企业微信部门)。
- 创建成功后,进入应用详情页,记录下
AgentId和Secret。这两项至关重要,且Secret只显示一次,务必妥善保存。
3. 在 Home Assistant 中配置企业微信通知
- 在 HA 中,我们通常通过RESTful 命令或专门的集成来调用企业微信 API。这里以配置一个
rest_command为例,它非常灵活。 - 编辑 HA 的
configuration.yaml文件,添加以下内容:
rest_command: wecom_alert: url: "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={{ access_token }}" method: POST content_type: "application/json;charset=utf-8" payload: > { "touser": "{{ userid | default('@all') }}", "msgtype": "{{ msgtype }}", "agentid": "你的AgentId", "{% if msgtype == 'text' %} text: { "content": "{{ content }}" } {% elif msgtype == 'image' %} image: { "media_id": "{{ media_id }}" } {% elif msgtype == 'textcard' %} textcard: { "title": "{{ title }}", "description": "{{ description }}", "url": "{{ url }}", "btntxt": "详情" } {% endif %}" }- 同时,我们需要一个自动化或脚本,来获取动态的
access_token(令牌有效期2小时)。可以创建一个shell_command调用 curl,或者更优雅地,使用 HA 的rest传感器。这里提供一个脚本思路,在scripts.yaml中:
get_wecom_token: alias: “获取企业微信令牌” sequence: - service: rest_command.get_token data: url: “https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=你的CorpID&corpsecret=你的Secret” method: GET - service: python_script.set_token # 假设你用Python脚本解析响应并存储token重要提示:上述
rest_command配置是一个高度简化的示例。在实际生产中,你需要处理access_token的自动获取、刷新和存储。强烈建议使用社区成熟的集成,如WeCom(通过 HACS 安装),它能帮你自动化管理令牌和提供更简单的服务调用。例如,安装后,你只需要在集成界面配置 CorpID, Secret, AgentId,就可以直接调用notify.wecom服务发送消息,远比手动管理 RESTful 命令方便。
4. 构建自动化:从检测到通知的完整链路
组件都已就位,现在我们来编织逻辑,让系统“活”起来。
4.1 在 HA 中实现运动检测
我们有多种方式检测 reCamera 画面中的运动:
方法 A:使用 Camera 实体自带的运动检测属性一些摄像头集成(包括某些配置下的 Generic Camera)会提供一个二进制传感器实体,例如binary_sensor.front_door_camera_motion_detected。你可以直接在自动化中监听这个传感器的状态变化(从off到on)。
方法 B:使用 Image Processing 集成这是更强大和灵活的方式。以image_processing中的dlib或opencv组件为例。
- 通过 HACS 安装“Image Processing”相关集成,或在
configuration.yaml中配置。 - 配置一个面部识别或运动检测的 image_processing 实体,其源就是 reCamera 实体。
- 该实体会在检测到目标时,其
found类属性会发生变化,并可以输出识别到的数量、置信度以及快照。
方法 C:使用 Frigate NVR 或 Double-Take这是更专业的方案。你可以将 reCamera 的 RTSP 流同时推送给Frigate(一款 AI 本地视频分析软件),利用其 YOLO 模型进行人、车、宠物等对象的精准检测。Frigate 再通过 MQTT 将事件发送给 HA。此方案功能最强,但部署复杂度也最高。
为了简单起见,我们假设使用方法 A,即摄像头自身提供了运动传感器。
4.2 编写核心自动化
我们创建一个自动化,当门口摄像头检测到运动时,先抓拍一张图片,然后将图片上传到企业微信的临时素材库获取media_id,最后发送一条图文消息。
以下是一个概念性的自动化 YAML 代码(使用假设的wecom集成服务):
alias: “前门移动检测报警” description: “当 reCamera 检测到运动时,发送企业微信通知” trigger: - platform: state entity_id: binary_sensor.front_door_motion # 替换为你的运动传感器实体 from: “off” to: “on” condition: [] # 可以添加条件,如只在夜间触发 action: # 动作1:从摄像头抓拍一张快照 - service: camera.snapshot data: entity_id: camera.front_door_camera filename: “/tmp/front_door_latest.jpg” # 动作2:将图片上传到企业微信,获取 media_id (这里需要自定义服务或脚本) # 假设我们有一个自定义脚本 `wecom.upload_media` 来处理上传 - service: script.wecom_upload_media data: file_path: “/tmp/front_door_latest.jpg” type: “image” response_variable: upload_response # 动作3:解析上传响应,获取 media_id - variables: media_id: “{{ upload_response.media_id }}” # 动作4:发送企业微信图文消息 - service: notify.wecom # 假设 wecom 集成提供的服务 data: message: “前门检测到移动!请查看。” title: “家庭安防警报” data: image: media_id: “{{ media_id }}” msgtype: image实操心得:在实际操作中,将图片上传并发送的步骤可能需要一个Python 脚本或更复杂的
rest_command序列来实现。这正是社区集成(如WeCom)的价值所在,它将这些底层 API 调用封装成了简单的服务。如果你手动实现,请务必参考企业微信官方文档的“上传临时素材”和“发送应用消息”部分。
4.3 消息内容与格式优化
企业微信支持多种消息格式,我们可以让通知更友好:
- 文本卡片 (textcard):非常适合报警,可以包含标题、描述和一个跳转链接(比如链接到 HA 的摄像头直播页面)。
- 图文 (news):可以发送多张图片和详细描述。
- Markdown:如果你需要格式化文本,Markdown 是不错的选择。
在自动化中,你可以根据不同的警报级别(如“一般移动” vs “检测到人脸”)选择不同的消息格式和内容。
5. 进阶优化与故障排查实录
系统跑起来只是第一步,让它稳定、可靠、智能才是目标。
5.1 提升系统稳定性的技巧
网络优化:
- 为 HA 虚拟机、安卓手机在路由器中设置静态 IP(DHCP 保留),防止 IP 变化导致流中断。
- 如果视频流卡顿,尝试降低 reCamera 的分辨率或帧率。RTSP 流对网络抖动比较敏感。
电源与设备管理:
- 安卓手机长期插电运行,建议使用智能插座。在 HA 中设置一个自动化,每周定时给智能插座断电几秒钟再通电,实现手机软重启,清理长期运行可能产生的内存泄漏。
- 在 HA 中创建一个
ping传感器,监控手机是否在线。如果掉线,发送企业微信通知告警。
HA 自动化防误报:
- 在运动检测自动化中加入“防抖” (debounce)条件。例如,使用
for条件,要求运动状态持续 2 秒才触发,避免光影瞬间变化导致的误报。 - 利用
condition结合其他传感器,例如:只在sun_below_horizon(日落之后)且person_at_home(家中无人)的情况下,才触发高警戒级别的报警。
- 在运动检测自动化中加入“防抖” (debounce)条件。例如,使用
5.2 企业微信接入的常见问题与解决
以下是我在配置过程中遇到的实际问题及解决方案:
| 问题现象 | 可能原因 | 排查与解决 |
|---|---|---|
HA 调用企业微信 API 返回81013错误 | user & party & tag all invalid | 这是接收人参数错误。检查touser字段:1. 确保填写的用户 ID 存在于该自建应用的可见范围内。 2. 如果要发给多人,用竖线分隔,如 “UserID1|UserID2”。3. 发送给所有人使用 “@all”。 |
消息发送失败,返回40001 | invalid credential | 访问令牌无效或已过期。 1. 确保你的 access_token获取逻辑正确。2. 令牌有效期为 2 小时,必须实现定时刷新或失败重试机制。 3. 检查 CorpID 和 Secret 是否正确。 |
| 图片无法发送或显示 | media_id无效或过期 | 1. 临时素材media_id有效期仅为 3 天,且仅能用于发送消息,不可重复使用。2. 确保上传图片的 API 调用成功,并正确解析出了 media_id。3. 图片大小不能超过 2MB,支持 JPG/PNG 格式。 |
| 在 Ubuntu/Debian 等 Linux 系统上,相关工具链出现问题 | 如deepin-wine运行企业微信桌面版失败 | 我们的方案完全不依赖桌面版客户端。所有操作通过API完成,与操作系统无关。HA 可以运行在任何平台(虚拟机、Docker、树莓派),只要网络能通,就能调用企业微信 API。 |
| 消息有延迟 | 网络延迟或自动化执行慢 | 1. 检查 HA 自动化执行日志,看每个动作耗时。 2. 图片上传步骤最耗时,可以考虑先发送文本警报,再异步上传和发送图片。 3. 确保 HA 主机和手机的网络连接质量。 |
5.3 功能扩展思路
当基础联动稳定后,你可以考虑以下扩展,让系统更强大:
- 多摄像头管理与轮询:接入多个 reCamera 手机,监控不同房间。在 HA 中为每个摄像头创建独立的运动检测自动化和通知规则。
- 与其它智能设备深度联动:
- 触发报警时,联动智能音箱语音播报。
- 触发报警时,联动智能灯泡闪烁红光。
- 晚上检测到门口有人,自动点亮门厅灯。
- 引入更先进的 AI 识别:如前所述,使用Frigate + Coral USB 加速棒,实现精准的人形检测、宠物检测、车辆识别,大幅降低误报率。
- 消息路由与分级:根据警报的严重程度,将消息发送到不同的企业微信群。例如,“检测到人”发送到核心家庭群,“检测到猫”发送到宠物爱好者群。
- 状态反馈与确认:在企业微信收到的消息卡片中,可以嵌入链接,点击后跳转到一个 HA 的临时控制面板,上面有实时视频流和“误报,忽略”、“确认报警,我已查看”等按钮,实现人机交互闭环。
整个项目从构思到实现,最深的体会是:智能家居的乐趣不在于购买最贵的设备,而在于利用手头资源,通过软件和逻辑的编织,创造出真正贴合自己需求的自动化场景。reCamera 让旧手机重生,Home Assistant 提供了无限可能的舞台,而企业微信则架起了从智能世界到指尖的可靠桥梁。这套方案的核心成本几乎为零,但带来的安全感和便利性却是实实在在的。如果你也遇到了视频流偶尔中断的问题,不妨检查一下路由器的 Wi-Fi 信道拥堵情况,换个信道或许有奇效。