自动化不触发调试全流程
自动化不触发——最常见的 Home Assistant 困惑
自动化写好了,点 Save,然后…没反应。Home Assistant 的 Traces(执行追踪) 功能就是为了这种情况设计的。
第一步:确认自动化已启用
自动化详情页顶部有个开关图标 → 确认是开的。Home Assistant 不会自动禁用新自动化,但有时候手动关了忘了开。
也可以在 Developer Tools → States 里搜 automation. → 找到你的自动化 → 看状态是 on 还是 off。
第二步:手动触发测试
先绕过触发器,手动执行一次自动化:
- Settings → Automations & scenes → 找到你的自动化 → 点进去
- 右上角 Run / Execute 按钮 → 点击立即执行一次
- 观察是否按预期执行了动作
手动执行也没执行动作?
那问题在动作里:
- 检查 Service 名和 Entity ID 是否正确(拼写错误是最常见的)
- 检查 YAML 格式(特别是模板里的 Jinja2 语法)
- Developer Tools → Services → 手动调用那个 Service → 看能不能成功
- 如果 Service 本身调用失败 → 检查实体是否
unavailable、Service 是否存在
手动执行动作没问题?
那问题在触发器或条件里 → 继续第三步。
第三步:看 Traces(执行追踪)—— 最重要的工具
Traces 是 Home Assistant 调试自动化的核心。它会记录每次自动化执行的完整轨迹:
- 哪个触发器命中了(如果有多个)
- 条件是否满足(每个条件的判断结果)
- 动作按顺序执行了没有
- 哪一步出错了
打开 Traces
- Settings → Automations & scenes → 找到自动化 → 点进去
- 右上角 Traces 按钮
- 弹出的面板列出最近几次触发 → 点其中一个展开
Traces 阅读指南
Traces 里每个步骤显示:
| 区域 | 含义 |
|---|---|
| Trigger | 哪个触发器命中了、触发时间、触发值 |
| Condition | 每个条件的判断结果(✅ / ❌) |
| Action | 每个动作的执行状态 |
场景 A:触发器根本没命中
Traces 列表里没有任何记录 → 说明触发器从未触发过:
- 检查触发实体是否正确:比如你写的是
sensor.temp但实际实体是sensor.temperature - 手动触发实体状态变化:比如 state trigger → 手动用 Developer Tools → Set States 把实体改成触发值 → 看自动化会不会响应
- 检查触发器的
for参数:如果设了for: minutes: 5,那要持续 5 分钟才触发——等够时间 - 检查触发条件的方向:state trigger 写了
from: "on", to: "off"→ 确认实体确实从 on 变成了 off,而不是反过来
场景 B:触发器命中了但条件没满足
Traces 显示 ✅ Trigger Hit → ❌ Condition Failed
检查每个条件的判断:
| 错误 | 修复 |
|---|---|
| 条件里的实体不存在 | 用 Developer Tools → States 确认 |
| 条件的 state 写错了 | 比如 Home Assistant 实际存的是 home 而你写的是 home_state |
| 时间条件对不上 | 可能时区没设对,或 before/after 写反了 |
| 模板条件返回空 | Developer Tools → Template 单独测试 |
场景 C:条件全通过但动作没执行
Traces 显示 ✅ Trigger Hit → ✅ All Conditions → ❌ Action Failed
- 看哪个 Action 标注了 Failed
- 检查 Service 名拼写
- 检查 target entity 是否
unavailable - 如果用了模板生成 target → 在 Developer Tools → Template 里单独测试模板输出
场景 D:动作部分执行了部分没执行
Home Assistant 自动化的动作是顺序执行的——上一个失败了不会中断,继续执行下一个。Traces 里会标出哪个成功哪个失败。
- 把失败的动作单独拿出来手动测试(Developer Tools → Services)
- 看是不是目标实体不可用、或者动作参数有问题
第四步:调试触发器
用 Developer Tools → Events 实时监听
- Developer Tools → Events
- 选 Listen to →
state_changed - Start Listening
- 手动操作触发源(比如去开客厅灯 → 模拟触发器)
- 看右侧实时输出的事件 JSON → 确认实体 ID 和状态变化是否和你写的 trigger 一致
手动模拟触发器
用 Developer Tools → Automations 可以直接"模拟"某个触发器被命中:
- Developer Tools → Automations → 找你的自动化 → Trigger 按钮
- 模拟触发后 → 去 Traces 里看执行轨迹
第五步:常见陷阱速查
| 陷阱 | 说明 | 修复 |
|---|---|---|
| 实体 ID 拼错 | sensor.tempature vs sensor.temperature | Developer Tools → States 里找对 |
触发器的 from / to 写反 | from: on, to: off 但实际是开灯 | 去掉 from,只留 to 就好 |
| 时区问题 | 服务器时区不是 Asia/Shanghai | Home Assistant OS 设置里改,或 docker run 时 -e TZ=Asia/Shanghai |
| 条件和触发器的 for 混淆 | 想防抖用了 condition 而不是 trigger 的 for | trigger 的 for 是"持续多久才触发",condition 是"触发后检查前提" |
| 执行模式不对 | mode: single 导致同一个触发器排队时忽略新触发 | 改成 mode: queued 或 restart |
| 模板语法错 | Jinja2 模板有语法错误导致整个 automation YAML 验证失败 | Home Assistant 保存前会验证 YAML → 应该会弹错误提示 |
| 自动化没 Reload | 手动编辑了 automations.yaml 没 reload | Settings → Automations & scenes → 右上角菜单 → Reload automations |
| Entity 状态是 unknown | 触发器或条件引用了 unknown 状态 | 等实体状态刷新,或检查集成是否正常 |
终极手段:YAML 调试法
把自动化简化到只剩触发器 + 一条最简单的动作:
alias: 测试
trigger:
- platform: state
entity_id: sensor.temperature
above: 30
action:
- service: notify.mobile_app_me
data:
title: "触发了"
message: "温度 {{ states('sensor.temperature') }}"
如果这个能触发 → 问题在你原来的条件或复杂动作里。然后逐步加回条件 → 看哪一步开始不行了。
如果这个也不触发 → 问题在触发器本身或实体状态。
不要做的事
- 不要反复重启 Home Assistant → 浪费时间,Traces 不会丢
- 不要在 Traces 没看完之前就改触发器 → 先确认问题在哪再改
- 不要同时改多个东西 → 一次只改一个变量,才能定位到根因