可视化编辑器与 YAML 两种写法

两种写法,一条自动化

Home Assistant 最讨人喜欢的一点,是它对新手和进阶用户同时友好:你可以完全在网页里用表单点点填填做出一条自动化,也可以打开 YAML 文件手写。两种写法操作的是同一份东西——可视化编辑器保存时,写出的就是我们上一章看到的 automations.yaml。

这带来一个非常重要的实践建议:两种写法混着用。调试逻辑时用编辑器,因为它能即时点「执行」试效果;要批量管理、做精细控制时切到 YAML,因为它可复制、可比较、可备份。理解两者如何互相转换,是从「会用 HA」到「玩转 HA」的必修课。

还有第三种存在:Blueprint(蓝图)。蓝图是别人打包好的自动化模板,导入后只要填几个实体就能用,适合拿来当学习材料——拆开一份优秀蓝图,比从空白开始写十条都长见识。蓝图本质也是 YAML,只是带了参数化描述,本篇末尾会再提一句它的定位。

可视化编辑器:边填边试

在「设置 → 自动化与场景 → 自动化」里点右下角的加号,就进入了编辑器。界面分三栏:触发、条件、动作,各占一块。每一块里点「添加」就会弹出平台选择列表,选完后展开一张表单。

编辑器有几个不那么显眼但很关键的功能:

  • 立即执行:右上角的「执行」按钮。严格来说它执行的是「动作」,触发器会被跳过,所以它适合用来单独验证动作部分。
  • 在建中测试:不用保存就能逐步点击「执行」观察结果,改错了刷新即走。
  • 复制与粘贴:编辑器支持把一条自动化的配置整体序列化后粘贴,跨实例搬家时特别好用。
  • 可视化条件嵌套:AND、OR、NOT 可以任意组合嵌套,表单上表现为可折叠的层级块。

新手常犯的错是「在编辑器里无论如何都搞不定某个逻辑」——往往是因为那个逻辑需要模板。编辑器对模板的支持停在「填一个文本框」的层面,复杂的 Jinja2 表达式还是在 YAML 里写、在模板编辑器里调更顺手。

编辑器还有一个限制:它只覆盖「一条自动化内部」的逻辑。一旦你想跨自动化共享变量、复用动作序列,就得请出 helper 实体和脚本——那是第 2 章的内容。所以别把编辑器的不顺手当成自己学不会,多数时候只是该换工具了。

YAML:可复制可版本化

automations.yaml 是所有自动化的归宿,每条自动化以 - alias: 开头。一个最小骨架:

- alias: 客厅灯日落开灯
  trigger:
    - platform: sun
      event: sunset
  action:
    - service: light.turn_on
      target:
        entity_id: light.living
  mode: single

YAML 的优势在三个场景里特别突出:批量修改(查找替换一行命令搞定)、版本管理(放进 Git 就有了每次改动的记录)、复杂结构(choose 分支、模板嵌套在纯文本里更清晰)。反过来,YAML 的坑也很有名:缩进错一格,整条自动化不加载,而且报错信息常常不直接指向那一行。

来看一个结构稍复杂的例子,它包含分支与变量,是编辑器里点起来很啰嗦、YAML 里却一目了然的典型:

- alias: 温度高时处理
  trigger:
    - platform: numeric_state
      entity_id: sensor.living_temp
      above: 28
      for: "00:05:00"
  action:
    - choose:
        - conditions:
            - condition: state
              entity_id: input_boolean.guest_mode
              state: "on"
          sequence:
            - service: climate.set_temperature
              target:
                entity_id: climate.ac
              data:
                temperature: 24
      default:
        - service: climate.set_temperature
          target:
            entity_id: climate.ac
          data:
            temperature: 26
  mode: restart

choose 的含义和 if/else 一致:命中哪个 conditions 就执行对应 sequence,都不中就走 default。这段逻辑用编辑器也能搭,要点好几层嵌套;YAML 里改一个数字却只在一行之内。逻辑越复杂,YAML 的可读性优势越大,前提是缩进别错。

编辑器与 YAML 对比

两种写法的对应关系可以列一张表:

维度 可视化编辑器 YAML
上手难度 低,表单引导 中,需懂缩进
批量操作 不方便 极方便
模板支持 只有文本框 完整支持
即时测试 可点「执行」 需保存重载
版本管理 无 可入 Git

模板编辑器:YAML 的最佳搭档

写 YAML 自动化绕不开模板。HA 在「开发者工具 → 模板」里提供了一个实时渲染环境:左边写 Jinja2,右边立刻出结果。任何模板在塞进自动化之前,都应该先在这里跑一遍。

一个典型流程:先在模板编辑器里写一句 现在室温是 {{ states('sensor.living_temp') }} 度,确认能取到值;再把它扩展成判断语句;最后整段贴进自动化的 condition 或模板触发器里。比起把模板直接写进自动化、保存、重载、触发一遍才知道结果,这个流程能省下大量等待时间。模板的具体语法会在「Jinja2 速学」一篇系统讲,这里只强调习惯:先调后用。

顺带一提,模板渲染结果带不带引号、是字符串还是数字,在 YAML 里会决定后续能不能比较。模板编辑器右侧会同时给出生成结果的类型,盯紧它能少走弯路。

从编辑器到 YAML 的迁移路径

多数人的成长路径是这样的:

  1. 先用编辑器搭出大致逻辑,边搭边用「执行」按钮验证。
  2. 打开 automations.yaml 对照看生成的配置,理解每一项的含义。
  3. 复杂逻辑直接写 YAML,配合模板编辑器调试。
  4. 把 configs 目录纳入备份或 Git,从此改出问题也能一键回滚。

从编辑器到 YAML 的四步

有个细节值得提醒:带有 id: 字段的自动化可以在编辑器里精确定位;而 YAML 里手写的自动化如果缺 id,编辑器打开时会自动补一个。两种写法互相编辑同一份文件,所以保存前留意不要在两个界面同时改同一条自动化。

最后说说蓝图。蓝图把一份自动化打包成「填空题」,常见于官方社区分享的「双击开关切换灯光」「闹钟联动多种设备」这类通用场景。它的价值在于降低复用门槛,短板是定制空间被原作者限定。把蓝图当作起点而非终点,导入后切换到 YAML 编辑器拆开看懂,你的进步会比从零写快得多。

包管理与 include 拆分

当自动化多到几十条,全塞在一个 automations.yaml 里会很难找。两种主流拆法:

  • 按文件 include:在 configuration.yaml 里写 automation: !include automations.yaml 的变体,把不同房间的自动化拆成不同文件。
  • 集成包(packages):把某个主题的自动化、脚本、helper 全部装进一个目录,整体作为一个包加载,搬家或分享时拷一个目录就行。

这一步属于「组织与复用」章节的重点,这里先点到为止。对大多数家庭场景,几十条自动化按房间拆两三个文件已经够用,不必一上来就上包管理。

再多说一句 include 的注意点:!include 只是简单合并列表,被包含文件里仍要写顶格的 - alias: 列表项;拆分后务必在「开发者工具 → YAML」里点一次重载确认无报错,再关掉编辑器。养成「改完即重载」的肌肉记忆,能避免「改了半天为什么不生效」的虚惊一场。

延伸阅读

  • 配置拆分与 packages 的完整做法,见本系列「helper 实体」与「场景与脚本」两篇。
  • 如果你把 HA 跑在 OpenWrt 设备上,《OpenWrt 入门》 里关于存储与服务管理的章节值得一看。
  • 备份与版本管理可以参考 《NAS 搭建指南》 中的文件同步方案。