回家与离家:存在检测实战
从「远程开关」到「懂你回家」
全书到这里,工具箱已经齐了。第 3 章我们开始造轮子——从最经典也最能提升幸福感的场景开始:回家与离家。灯在你进门前就亮起,空调提前运转,离家后全屋自动熄灭——这些都建立在同一块地基上:知道家里有没有人。
存在检测是所有场景里最容易翻车的一个: GPS 漂移会让你「在外地突然回家」,路由器检测慢半拍会让你在门口干等。本篇不讲花活,只讲稳。
存在检测也是全书的第一个综合练习:触发器、条件、helper 标记、多设备共识、容错兜底全部用上。把这篇啃下来,后面的场景都是同一套套路的变体。
检测手段横向对比
| 手段 | 原理 | 精度 | 延迟 | 短板 |
|---|---|---|---|---|
| 手机 App 集成 | 系统定位 | 高,可园区级 | 秒级 | 耗电、依赖网络 |
| 路由器 device tracker | 设备在线 | 低,只能判断连接 | 分钟级 | 手机关 WiFi 睡眠 |
| 蓝牙信标 | 近距离扫描 | 中 | 中 | 需要额外硬件 |
| mmWave 存在传感器 | 微波雷达检测人体微动 | 高,房间级 | 秒级 | 每个房间一台 |
| 门窗传感器 逻辑推导 | 门窗开合事件 | 低 | 即时 | 无法判断是谁 |
没有银弹。成熟方案都是组合:定位管「谁回来了」,mmWave 管「这个房间还有没有人」,门窗传感器做即时辅助。
选型还要看家里人:独居青年一个手机定位就够;三口之家得多人共识;有老人小孩不帶手机的家庭,雷达和门窗才是主力。先数清楚家里有几种「人会出现的信号」,再决定上什么传感器,比跟风买硬件靠谱。
方案一:手机定位 zone 触发
最经典的回家自动化就是手机进入家庭围栏。HA 的 zone 触发器搭配手机 App 集成(自身会向 HA 上报定位)使用。
- alias: 某人回家
trigger:
- platform: zone
entity_id: device_tracker.alice_phone
zone: zone.home
event: enter
condition:
- condition: sun
after: sunset
action:
- service: light.turn_on
target:
entity_id: light.entry
mode: single
围栏半径别设太小:50 到 150 米之间,太小会因定位漂移频繁漏触发,太大又会提前过多。定位漂移的经典事故是「手机在原地不动,但定位抖出了围栏又抖回来」,于是半夜全屋灯亮——所以回家自动化必须配夜间条件或勿扰模式兜底。
除了围栏大小,定位上报频率也影响体验。手机 App 集成通常允许调整上报间隔:太频繁耗电,太稀疏又让你进了家门五分钟才触发。一般 1 到 5 分钟是甜区,配合手机端的省电设置基本无感。另外值得提醒:进门那一刻如果要等定位上报,体验会比「开门即亮」差半口气——所以实战里很多人把 zone 触发和门窗传感器触发叠加,谁先来表达谁。
方案二:路由器 device tracker
路由器集成(如 OpenWrt、软路由厂商集成)能把连接的设备变成 device tracker。优点是不装 App、不耗手机电;缺点是判断慢:手机 WiFi 休眠时会被误判离线。
缓解办法是同一台手机双来源共识:定位说回家了且路由器也看到设备上线,才算「到家」。两个条件互相印证,误判率急剧下降。具体做法可参考 《软路由指南》 里的设备在线检测章节。
另一个老玩家的经验之谈:路由器检测适合做「离家」而不太适合做「回家」。因为回家是「祝你体验好」的场景,慢几秒就扫兴;离家是「节能安防」场景,晚两分钟无人在意。快场景用快传感器,慢场景用慢传感器,资源花在刀刃上。
方案三:mmWave 房间级存在
毫米波雷达能检测人体呼吸级微动,不像人体传感器(PIR)那样「坐着一动不动就灭灯」。这是目前体验最好的房间级方案:书房里坐着看书,灯就不会因为「几分钟没动作」而熄灭。
典型联动:mmWave 传感器实体 on/off 表示「房间有人」,配合自动化做灯光保持;离开超过 2 分钟才关灯。毫米波雷达又能在床上精确感知睡眠状态,是「智能卧室」的核心传感器。灯光场景里,mmWave 是存在检测的首选。
安装位置有讲究:雷达要装在能覆盖主要活动区域的地方,避免正对窗帘(风吹草动也可能误触),高度按产品说明。多雷达的户型可以做一个「家里有几个人」的模板传感器,把各房间 on 的数量求和,联动自然比「任意有人」更细腻。
mmWave 与定位不是竞争而是互补:定位管「谁」,雷达管「在」。两者拼起来,才是完整的「存在」。
离家逻辑:多设备共识
回家可以是「任意一人」,离家必须是「所有人」。模板条件判断所有 tracker 都不在家:
condition:
- condition: template
value_template: >-
{{ states.device_tracker
| selectattr('state', 'eq', 'home')
| rejectattr('attributes.source_type', 'eq', 'router')
| list | length == 0 }}
这段模板的意思是:所有定位来源为手机的 tracker 都不在家(排除路由器来源是因为它慢且不稳)。离家自动化宁可慢,不可错: delaying 几分钟再判定,远好过「下楼扔垃圾全屋断电」。
模板解析两句:states.device_tracker 拿到所有 tracker 实体,selectattr 按状态过滤出还在家的,rejectattr 再排除路由器来源,最后数剩下几个。模板语法会在「Jinja2 速学」一篇系统讲,这里你只要知道这个模式:先过滤、再计数、再判断,几乎所有「多设备共识」都是这个套路。

回家场景的加分细节
稳了之后,体验差距全在细节:
- 玄关灯优先:进门前第一盏灯是体面感的来源。
- 渐亮而非瞬亮:light.turn_on 带 transition 参数,夜里不刺眼。
- 空调提前量:离家模式触发后,夏天提前 15 分钟把空调开起来。
- 分人场景:不同家人回家可以触发不同动作,模板里判断
trigger.entity_id是谁即可。 - 过渡照明:深夜回家只亮低亮度的地脚灯,而不是全屋通明,这点对有孩子的家庭特别重要。
- 语音欢迎播报:有本地语音助手时,回家自动播报一句天气提示。
再补一个容易被忽略的:回家场景要能被手动触发。在仪表盘放一个「我回来了」按钮,调用回家脚本。定位总会有不灵的时候,给家人一个「兜底开关」,他们对整套系统的信任度会高得多。
家人反馈最真实的体验指标:他们还愿不愿意手动开灯。如果一个月后家人仍然手动开灯,说明自动化还不够稳,而不是他们不领情。
出现「不领情」时通常有一个具体原因:曾经被自动化坑过(半夜灯全亮、看个电视灯灭了)。修好那一次事故,比再加十个新场景更管用。信任是这套系统最贵的资产。
一个完整的「回家模式」结构
把工具串起来,整个模式由三部分组成:
- 触发:zone 触发 或 任意 mmWave 从无常驻(回家瞬间)。
- 条件:夜间条件、勿扰条件、度假模式未启用。
- 动作:开玄关灯(带渐亮)、关离家标记(input_boolean)、按需开空调。
用 helper 做标记(input_boolean.someone_home),所有自动化看这一个开关,就不再各自判断 tracker——单一事实来源是复杂场景不乱的关键。
离家标记同理:所有人离开后设为 off,回家任意一人设为 on。夜间或度假模式下,离家自动化还会顺手关掉所有灯和插座、开启安防。一个布尔开关,撑起半个家的自动化。
度假模式还值得单说一句:它会「伪造在家」——按固定随机时间开关几盏灯、偶尔拉窗帘,让屋子看起来有人住。对长期出差的人,这比贴纸条可信得多。

延伸阅读
- 传感器数据如何接入见本系列「触发器全家桶」。
- 状态标记持久化见「状态持久化与开机还原」。
- 网络层方案可参考 《OpenWrt 入门》 与 《软路由指南》。
