Home Assistant 中文文档 下载 App

自动化不触发调试全流程

自动化不触发——最常见的 Home Assistant 困惑

自动化写好了,点 Save,然后…没反应。Home Assistant 的 Traces(执行追踪) 功能就是为了这种情况设计的。

第一步:确认自动化已启用

自动化详情页顶部有个开关图标 → 确认是开的。Home Assistant 不会自动禁用新自动化,但有时候手动关了忘了开。

也可以在 Developer Tools → States 里搜 automation. → 找到你的自动化 → 看状态是 on 还是 off。

第二步:手动触发测试

先绕过触发器,手动执行一次自动化:

  1. Settings → Automations & scenes → 找到你的自动化 → 点进去
  2. 右上角 Run / Execute 按钮 → 点击立即执行一次
  3. 观察是否按预期执行了动作

手动执行也没执行动作?

那问题在动作里:

手动执行动作没问题?

那问题在触发器或条件里 → 继续第三步。

第三步:看 Traces(执行追踪)—— 最重要的工具

Traces 是 Home Assistant 调试自动化的核心。它会记录每次自动化执行的完整轨迹:

打开 Traces

  1. Settings → Automations & scenes → 找到自动化 → 点进去
  2. 右上角 Traces 按钮
  3. 弹出的面板列出最近几次触发 → 点其中一个展开

Traces 阅读指南

Traces 里每个步骤显示:

区域含义
Trigger哪个触发器命中了、触发时间、触发值
Condition每个条件的判断结果(✅ / ❌)
Action每个动作的执行状态

场景 A:触发器根本没命中

Traces 列表里没有任何记录 → 说明触发器从未触发过:

  1. 检查触发实体是否正确:比如你写的是 sensor.temp 但实际实体是 sensor.temperature
  2. 手动触发实体状态变化:比如 state trigger → 手动用 Developer Tools → Set States 把实体改成触发值 → 看自动化会不会响应
  3. 检查触发器的 for 参数:如果设了 for: minutes: 5,那要持续 5 分钟才触发——等够时间
  4. 检查触发条件的方向: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

  1. 看哪个 Action 标注了 Failed
  2. 检查 Service 名拼写
  3. 检查 target entity 是否 unavailable
  4. 如果用了模板生成 target → 在 Developer Tools → Template 里单独测试模板输出

场景 D:动作部分执行了部分没执行

Home Assistant 自动化的动作是顺序执行的——上一个失败了不会中断,继续执行下一个。Traces 里会标出哪个成功哪个失败。

第四步:调试触发器

用 Developer Tools → Events 实时监听

  1. Developer Tools → Events
  2. 选 Listen to → state_changed
  3. Start Listening
  4. 手动操作触发源(比如去开客厅灯 → 模拟触发器)
  5. 看右侧实时输出的事件 JSON → 确认实体 ID 和状态变化是否和你写的 trigger 一致

手动模拟触发器

用 Developer Tools → Automations 可以直接"模拟"某个触发器被命中:

  1. Developer Tools → Automations → 找你的自动化 → Trigger 按钮
  2. 模拟触发后 → 去 Traces 里看执行轨迹

第五步:常见陷阱速查

陷阱说明修复
实体 ID 拼错sensor.tempature vs sensor.temperatureDeveloper Tools → States 里找对
触发器的 from / to 写反from: on, to: off 但实际是开灯去掉 from,只留 to 就好
时区问题服务器时区不是 Asia/ShanghaiHome Assistant OS 设置里改,或 docker run 时 -e TZ=Asia/Shanghai
条件和触发器的 for 混淆想防抖用了 condition 而不是 trigger 的 fortrigger 的 for 是"持续多久才触发",condition 是"触发后检查前提"
执行模式不对mode: single 导致同一个触发器排队时忽略新触发改成 mode: queued 或 restart
模板语法错Jinja2 模板有语法错误导致整个 automation YAML 验证失败Home Assistant 保存前会验证 YAML → 应该会弹错误提示
自动化没 Reload手动编辑了 automations.yaml 没 reloadSettings → 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') }}"

如果这个能触发 → 问题在你原来的条件或复杂动作里。然后逐步加回条件 → 看哪一步开始不行了。

如果这个也不触发 → 问题在触发器本身或实体状态。

不要做的事