- Home Assistant 中的脚本允许您定义可重用的操作序列,将逻辑与执行时间分离。
- 脚本有多种执行模式(单次、重启、排队、并行),用于控制脚本在多次调用时的行为。
- 使用变量和字段可以将脚本变成可配置的模块,非常适合复杂的集成和重用。
- 脚本结合自动化、场景、群组和区域,可以构建一个强大、安全且易于维护的家庭自动化系统。
如果您使用 Home Assistant 已有一段时间,您可能已经熟悉自动化、场景和群组,但您可能不太清楚…… Home Assistant 中的脚本以及何时值得使用它们这很可惜,因为如果使用得当,它们是充分利用家庭自动化系统的最强大工具之一。
本文将探讨脚本的定义、脚本与自动化流程的区别,以及如何配置脚本。 图形界面,类似于使用 Home Assistant 脚本语法的 YAML这包括不同的执行模式、如何传递变量、如何等待(或不等待)它们完成,以及如何将它们与场景、组和区域集成。目标是,读完本文后,您将对如何在日常工作中使用这些功能有清晰而实用的理解。
Home Assistant 中的脚本是什么?它有什么用途?
在 Home Assistant 中,脚本本质上是一个 按照您定义的顺序执行的一系列操作它们不会自行触发:当您从界面、另一个自动化、另一个脚本或通过服务“打开它们”(调用脚本)时,它们才会运行。
脚本集成创建了一个 每个脚本的实体,类型为 script.name_you_choose从实际角度来看,该实体的行为就像你可以激活、停用或从操作中调用的东西一样,就像你使用 light.turn_on 或 switch.turn_off 之类的服务一样。
脚本的妙处在于它允许你封装重复的逻辑:而不是重复编写相同的代码。 多个自动化流程中的步骤顺序您可以创建一个可重用的脚本,并在所有程序中调用它。这简化了配置,减少了错误,并使维护安装变得更加容易。
一个简单的例子:你可以编写一个脚本来处理“夜间模式”(关闭灯光、放下百叶窗、调节暖气并激活柔和的照明场景),然后 从不同的自动化流程中调用该脚本。:通过按下物理按钮、在特定时间或当您注意到大家都睡着时。
从更技术的角度来看,这些脚本依赖于 基于 YAML 的 Home Assistant 脚本语法它采用与自动化相同的理念,但没有触发器。您可以自行决定何时触发;脚本仅定义执行什么操作以及如何执行。
脚本、自动化、场景、组和区域之间的区别
刚开始使用 Home Assistant 时,很容易对脚本、自动化、场景、群组和区域感到困惑,因为它们的功能看起来往往很相似。然而,它们各自都有其独特的用途。 在家庭自动化生态系统中扮演着非常特殊的角色.
自动化定义了“何时”:它们具有一个或多个触发器(时间、运动检测、状态更改、事件等)、可选条件以及一系列操作。相比之下, 脚本定义了“做什么”和“怎么做”。也就是说,指的是行动的顺序,而不是执行的时间。
与此同时,这些场景旨在留下一组设备。 具体最终状态:哪些灯亮着,亮度如何,颜色如何,哪些百叶窗亮着。 它们仍然会进行增加或减少操作,例如空调是否开启等等。它们没有条件逻辑或循环;它们只是“绘制”一个预定义的状态。
群组和区域运作方式截然不同:群组将相似的实体(例如,单个灯光组中的多个灯光)聚集在一起。 将它们作为一个整体来打开或关闭。区域通常用于存在和地理位置(家庭、工作、健身房区域),以便您可以知道设备或人员是否在某个区域内或区域外。
通常的问题是:“使用群组、区域还是场景更好?”它们实际上并不相互竞争,而是相互补充。 场景定义状态,组简化关节控制,区域用于检测位置。脚本是协调复杂工作流程的主要工具,而自动化则负责决定何时实施这些工作流程。
何时使用脚本,何时使用自动化
对于初学者来说,一个常见的问题是:什么时候应该使用脚本,什么时候应该使用自动化?一般来说,答案是: 自动化非常适合对事件做出反应。 (门开了,夜幕降临,有人回家了)脚本非常适合用来打包你想要响应这些事件而运行的逻辑。
如果你需要的功能非常简单,比如检测到移动时打开灯,那么一个简单的自动化流程,执行一两个操作就足够了。但如果操作变得冗长,涉及多次服务调用、等待、内部条件等等,通常的做法是…… 将该部分提取到一个单独的脚本中 让自动化程序负责调用它。
脚本的另一个优势在于,当你想在多个地方重复使用完全相同的操作序列时。与其在三个独立的自动化流程中重复编写相同的逻辑, 你创建一个脚本,并从三个地方调用它。如果你决定更改某些内容,只需更新脚本即可。
它们在与外部设备或略微复杂的服务交互时也非常有用,这时你需要…… 多个串联步骤、重试、等待或状态检查将所有这些内容集中在一个脚本中,对调试和维护系统大有裨益。
我们可以这样总结:如果你的主要需求是“当X发生时,执行某些操作”,那就从自动化入手;如果你想要的是“使这个流程复杂化,并能够从多个地方调用”, 将其设置为脚本并重复使用.
创建脚本的方法:图形界面和 YAML
Home Assistant 允许您通过两种方式创建脚本:通过 Web 界面(内置脚本编辑器)或手动在 YAML 文件中创建。两种方式都完全有效,并且通常可以很好地配合使用,尤其是在您喜欢……的情况下。 将视觉舒适度与先进的灵活性相结合.
在界面中,您可以进入脚本部分并从头开始创建一个新的脚本。编辑器允许您定义名称、描述和图标,以及以“块”的形式添加操作(例如,打开灯、等待 X 秒、调用服务、运行模板等)。对于还不熟悉 YAML 语法的用户, 此选项最方便用户使用,且最不容易出现格式错误。.
如果您希望完全控制脚本,您可以将其编写在 configuration.yaml 文件中,或者编写在单独的文件中,并使用 !include 指令包含这些脚本。 使用 WSL 运行脚本。在 YAML 中,您可以定义脚本别名、顺序、模式、字段……并充分利用其全部功能。 Home Assistant 脚本语法,包括 Jinja 模板 用于高级逻辑。
无论采用何种方法,Home Assistant 内部都使用相同的执行逻辑。通过 UI 创建的脚本和纯 YAML 定义的脚本在功能上没有区别;区别在于…… UI 提供更直观的环境,而 YAML 提供对文本的更直接控制。.
需要理解的关键是,脚本的“序列”是一系列按顺序执行的操作,而且你已经知道的许多自动化选项(例如 wait_template、choose、repeat 等)也可以在脚本中使用,用于创建 高度复杂的自动化流程.
Home Assistant 中的脚本执行模式
在 Home Assistant 中,脚本最重要(也最常被忽视)的部分之一是其执行“模式”。这种模式决定了脚本的行为方式。 当你在它已经运行时尝试启动它时当您从多个自动化程序调用它,或者用户有点不耐烦并连续运行它几次时,这种情况经常发生。
Home Assistant 提供四种主要模式: 单次、重启、排队和并行每一种情况都有其具体情况,重要的是选择最符合你预期行为的那种情况。
模式 单 最简单的解释是:如果脚本已经在运行,而你尝试再次启动它,它不会启动新的执行。相反,Home Assistant 会发出警告并直接忽略这次新的尝试。这在以下情况下非常有用: 重复编写脚本没有意义。例如,一个“关闭所有程序”的脚本,你不想与之重叠。
在模式下 重新开始当脚本仍在运行时再次启动时,当前执行会立即停止并从头开始。这种模式非常适合优先级较高的情况。 让最终的命令成为主导命令。例如,一个脚本可以根据配置文件调整房间的照明和温度,并且您希望任何新的调用都能覆盖之前的调用。
模式 排队 它会将执行任务排队:脚本运行时收到的每个调用都会被保存到队列中,并在前一个调用完成后执行。Home Assistant 会确保所有执行任务都能完成。 按接收顺序当操作不应该重叠,但你又需要处理所有这些操作时,例如使用多个快速请求控制同一设备,这非常有用。
最后是模式 并行 它允许每次新的调用生成一个独立的执行过程,因此 同一个脚本的多个线程可以同时运行。需要谨慎使用此功能,因为如果所有线程都操作相同的实体,则可能会导致意外行为,但对于非阻塞任务或操作不同资源的任务来说,它非常强大。
在脚本中使用变量和字段
向脚本传递变量可以使其获得更大的灵活性。例如,你可以使用类似“函数”的东西来代替固定的脚本,比如告诉脚本要打开哪盏灯、使用什么亮度级别等等。 设备应该保持开启状态多长时间?.
通过图形界面,可以完成此操作。 在脚本中添加“字段”在脚本编辑器中,您可以打开三点菜单并选择该选项 “添加字段”以定义自定义条目执行此操作后,将显示“字段”部分,您可以在其中配置每个字段的名称、类型(文本、数字、实体选择器等)和其他选项。
然后,这些字段会在脚本模板中使用,并使用您定义的键。例如,如果您创建一个名为“brightness_level”(当然,这样拼写更好)的字段,则可以在操作中引用它。 一个使用该值来调整服务的模板就像灯光的亮度一样。
有趣的是,当从界面的其他部分(例如,从自动化流程)使用该脚本时, 这些字段将显示为编辑器中的可配置输入项。这样就可以使用不同的参数重复使用同一个脚本,而无需重复编写逻辑。
除了编辑器中定义的字段外,您还可以将变量传递给脚本。 在行动数据中 当你调用它时,无论你是直接调用 script.name 实体,还是使用 script.turn_on 服务,这都有效。你发送的所有键都将作为变量在脚本模板中使用,即使你没有将它们定义为字段。
调用脚本:script.NAME 与 script.turn_on
在 Home Assistant 中,从操作运行脚本主要有两种方式:直接调用脚本。 脚本实体(例如,script.night_mode) 或者使用通用服务脚本.turn_on并将实体作为目标传递。
乍一看,它们似乎相同,但关键区别在于等待行为。当您“直接”调用脚本(将其用作脚本操作)时,调用它的自动化或脚本…… 等待被调用的脚本执行完毕。 在继续进行下一步操作之前。
在这种模式下,如果被调用的脚本由于某些错误而失败并被中止, 调用该脚本或自动化程序的程序也会被中止。当你需要所有操作都像原子块一样运行时,这种行为非常有用:要么所有操作都正确执行,要么中止高级操作。
但是,如果您使用这项服务 script.turn_on 启动一个或多个脚本打电话的人不会等他们说完,而是直接让他们开始(按照你列出的顺序),然后继续做自己的事,不会耽搁。
在第二种情况下,脚本中可能发生的任何错误都会被调用。 它们不会影响打电话的人。这为“后台运行”模式打开了大门:您可以启动一个脚本来执行繁重的工作(例如,记录数据、调整多个设备等),同时您的自动化程序继续执行自己的任务。
一个有趣的模式是将 script.turn_on 与稍后等待(例如,使用 wait_template)结合起来。 等待后台脚本达到特定状态,但不会因故障而导致整个系统崩溃。这是一种巧妙的解耦流程的方法,可以使您的家庭自动化系统更能抵御偶尔出现的错误。
脚本、安全性和最佳实践
在复杂的家庭自动化系统中,脚本的功能不仅限于开灯或移动百叶窗;它们还可以控制敏感设备、泄露数据或与外部服务交互。因此,应用脚本至关重要。 在 Home Assistant 中设计脚本时应遵循良好的安全实践。.
如果您的脚本连接到远程服务、API 或处理令牌和凭据,则应使用 Home Assistant 的密钥选项,而不是 直接在 YAML 中硬编码密码或 API 密钥这样可以保持配置更简洁,而且如果共享代码片段,也不会泄露敏感信息。
此外,建议您的脚本在执行敏感操作之前包含一些状态检查逻辑。例如,您可以在更改设备状态之前验证设备是否处于预期状态,或者验证某些特定条件是否已满足。 安全条件已满足(家中无人,门已锁好等)。 在下达影响实际通行权限的命令之前。
在更先进的环境中,当定制化解决方案、人工智能或数据分析系统集成在一起时,网络安全变得至关重要。在这些情况下,网络安全问题十分常见。 将 Home Assistant 与特定开发项目和安全审计相结合可以通过外部供应商或该领域的专家来实现。
同时,定期检查脚本和自动化流程也是一个好习惯,以确保它们没有过时,没有引用已删除的实体,并且 你不会积累不必要的逻辑,以免导致奇怪的行为。干净整洁的基座是保持安装稳定安全的关键。
智能家居中的脚本和数据分析
脚本可以发挥重要作用的另一个领域是数据收集和处理。最终,Home Assistant 会记录大量关于能耗、温度、设备状态、用户在场情况等信息, 这些脚本可以起到粘合剂的作用,用于准备这些数据。 在发送或处理之前。
例如,您可以创建脚本,定期收集某些值并将其发送到业务分析系统(例如 Power BI 仪表板或其他可视化工具),或者使用其他方式处理这些值。 Python 分析。 这样, 您可以将家庭自动化系统转变为有关使用习惯和能源效率的真实数据来源。这有助于你做出更明智的决定。
如果将此与高级逻辑或外部人工智能模型结合使用,您可以更进一步:您的脚本可以调用服务来分析模式、建议日程调整或进行检测。 设备行为异常所有这些都可以通过自动化或附加脚本集成回 Home Assistant。
在类似场景下,定制开发公司通常会提供特定的解决方案,将 Home Assistant 与个性化仪表盘、能耗预测算法或智能警报系统连接起来。脚本成为实现这些功能的实际机制。 Home Assistant 与外部生态系统进行通信。.
有趣的是,通过良好的规划,你不仅可以让你的家更舒适、更自动化,还可以让它在数据方面更高效、更透明,所有这一切都可以通过系统协调完成。 精心设计的脚本和自动化流程,能够在恰当的时机触发它们。.
了解了这一切之后,我们就能清楚地认识到,Home Assistant 中的脚本远不止是一项高级新功能:它们是构建复杂设置逻辑、重用操作、分离“做什么”和“何时做”、集成外部服务、确保安全以及准备数据以供更深入分析的关键工具。通过合理组合脚本、自动化、场景、群组和区域,您的系统可以从简单的设备集合转变为一个强大的智能家居系统。 一个连贯、灵活的家庭自动化平台,能够随着业务增长而扩展,而不会变得混乱。.
对字节世界和一般技术充满热情的作家。我喜欢通过写作分享我的知识,这就是我在这个博客中要做的,向您展示有关小工具、软件、硬件、技术趋势等的所有最有趣的事情。我的目标是帮助您以简单而有趣的方式畅游数字世界。