回家与离家:存在检测实战

从「远程开关」到「懂你回家」

全书到这里,工具箱已经齐了。第 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 是谁即可。
  • 过渡照明:深夜回家只亮低亮度的地脚灯,而不是全屋通明,这点对有孩子的家庭特别重要。
  • 语音欢迎播报:有本地语音助手时,回家自动播报一句天气提示。

再补一个容易被忽略的:回家场景要能被手动触发。在仪表盘放一个「我回来了」按钮,调用回家脚本。定位总会有不灵的时候,给家人一个「兜底开关」,他们对整套系统的信任度会高得多。

家人反馈最真实的体验指标:他们还愿不愿意手动开灯。如果一个月后家人仍然手动开灯,说明自动化还不够稳,而不是他们不领情。

出现「不领情」时通常有一个具体原因:曾经被自动化坑过(半夜灯全亮、看个电视灯灭了)。修好那一次事故,比再加十个新场景更管用。信任是这套系统最贵的资产。

一个完整的「回家模式」结构

把工具串起来,整个模式由三部分组成:

  1. 触发:zone 触发 或 任意 mmWave 从无常驻(回家瞬间)。
  2. 条件:夜间条件、勿扰条件、度假模式未启用。
  3. 动作:开玄关灯(带渐亮)、关离家标记(input_boolean)、按需开空调。

用 helper 做标记(input_boolean.someone_home),所有自动化看这一个开关,就不再各自判断 tracker——单一事实来源是复杂场景不乱的关键。

离家标记同理:所有人离开后设为 off,回家任意一人设为 on。夜间或度假模式下,离家自动化还会顺手关掉所有灯和插座、开启安防。一个布尔开关,撑起半个家的自动化。

度假模式还值得单说一句:它会「伪造在家」——按固定随机时间开关几盏灯、偶尔拉窗帘,让屋子看起来有人住。对长期出差的人,这比贴纸条可信得多。

回家模式链路

延伸阅读

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