本帖最后由 x10n9 于 2024-12-26 01:32 编辑
ChatGPT帮到你
在 Home Assistant 中,要实现每隔几天运行一次的自动化,可以通过以下方式:
方法 1:使用 time_pattern 触发器结合条件如果自动化需要基于某一天(如启动日期)开始,每隔固定天数触发,可以结合 time_pattern 和条件模板实现。
示例:每隔 3 天运行一次
automation:
alias: "每隔 3 天运行一次"
trigger:
- platform: time
at: "08:00:00" # 每天特定时间触发
condition:
- condition: template
value_template: >
{{ (as_timestamp(now()) | timestamp_custom('%j') | int) % 3 == 0 }}
action:
- service: notify.mobile_app
data:
message: "今天是运行日!"
原理:- time 触发器:
- 条件模板:
- 使用 now() 获取当前日期,转换为一年中的第几天(%j),通过模运算确定是否是 3 的倍数。
- 当模运算结果为 0 时,表示满足条件(即每隔 3 天触发一次)。
方法 2:使用 input_datetime 和状态跟踪通过一个辅助元素(如 input_datetime)记录上一次执行时间,然后结合模板计算是否已过指定的天数。
示例:每隔 5 天运行一次
automation:
alias: "每隔 5 天运行一次"
trigger:
- platform: time
at: "08:00:00" # 每天特定时间触发
condition:
- condition: template
value_template: >
{{ (now().date() - (states('input_datetime.last_run') | as_datetime).date()).days >= 5 }}
action:
- service: notify.mobile_app
data:
message: "每隔 5 天的任务执行!"
- service: input_datetime.set_datetime
target:
entity_id: input_datetime.last_run
data:
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
原理:- time 触发器:
- input_datetime 记录上次运行时间:
- input_datetime.last_run 用于存储上次自动化运行的日期时间。
- 条件模板:
- 比较当前日期与上次运行日期的天数差,如果大于等于 5 天,则条件满足。
- 更新 input_datetime:
- 每次运行后,将当前日期时间存储到 input_datetime.last_run,以便下次检查。
辅助元素配置:在 configuration.yaml 中定义 input_datetime:
input_datetime: last_run: name: 上次运行时间 has_date: true has_time: true 方法 3:使用 time 模块触发 + 固定周期触发器如果你的自动化不依赖具体时间,而是基于固定周期(比如每隔 7 天)运行,可以直接使用 time 平台的 time_pattern 模式。
示例:每隔 7 天运行一次
automation:
alias: "每隔 7 天运行一次"
trigger:
- platform: time_pattern
days: "/7" # 每 7 天触发一次
hours: 8 # 每天的 08:00
action:
- service: notify.mobile_app
data:
message: "每隔 7 天的任务执行!"
原理:- days: "/7":表示每隔 7 天触发一次。
- hours: 8:仅在每天早上 8 点评估。
注意事项- 自动化状态:确保自动化在运行状态(enabled),否则不会触发。
- 时间触发精度:
- 使用 time 或 time_pattern 会在指定时间点检查触发。
- 使用 template 条件时,计算的逻辑需要明确无误。
- 辅助元素初始化:如果使用 input_datetime,初始值应正确设置为某个合理的日期时间。
根据需求选择最适合的方法,每种方法都可以灵活调整以适应不同场景!
|