『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 414|回复: 6

[技术讨论] 【已解决】怎么让自动化每隔几天运行一次

[复制链接]

5

主题

39

帖子

157

积分

注册会员

Rank: 2

积分
157
金钱
118
HASS币
0
发表于 2024-12-26 00:44:48 | 显示全部楼层 |阅读模式
本帖最后由 sanmoking 于 2024-12-27 15:51 编辑

先建议新手看一下这个官方页面,我是翻译着看的:Input Datetime - Home Assistant然后新手的话,可能需要安装 Date and/or time 这个集成,
然后在/homeassistant/configuration.yaml里面新建一个时间参数(是这么叫的吧
20241226_115552.png
然后需要重启ha,重启之后,就可以在辅助元素看到这个参数了:
20241227_121646.png

新手的话,可以去建个新脚本,仅仅就是试试设置一下这个参数:
20241226_115638.png
action: input_datetime.set_datetime
target:
  entity_id: input_datetime.backup_last_run
data:
  datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
然后去开发者工具里面的模板界面试试能不能获取到这个值:
20241226_115651.png
{{ states('input_datetime.backup_last_run')  }}


正常获取到的话就万事具备了,就可以用到你的自动化里面了,刚那个临时脚本也可以删掉。。

下边就是我一开始帖子提问想要实现的诉求,就是间隔几天自动备份一下整个ha:
alias: 自动备份
description: ""
triggers:
  - trigger: time
    at: "03:30:00"
conditions:
  - condition: template
    value_template: >
      {{ (now().date() - (states('input_datetime.backup_last_run') |as_datetime).date()).days >= 5 }}
actions:
  - action: hassio.backup_full
    data:
      compressed: true
  - action: clean_up_snapshots_service.clean_up
    data:
      number_of_snapshots_to_keep: 10
  - action: rest_command.wework_robot
    data:
      title: HomeAssistant进行了自动备份
      message: >-
        ——{{ now().strftime("%Y-%m-%d %H:%M:%S") }}——\n上次备份时间是{{ (now().date() -(states('input_datetime.backup_last_run') | as_datetime).date()).days}}天前:\n{{states('input_datetime.backup_last_run') }}
  - action: input_datetime.set_datetime
    target:
      entity_id: input_datetime.backup_last_run
    data:
      datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
mode: single
这里面对于新手来说还有个大坑,就是论坛帖的代码,复制之后直接粘贴有可能代码的缩进有问题,造成错误,要自己手动修改一下,可以看截图:

20241227_120816.png        20241227_121051.png

整个自动化里面,actions: 前边是条件,每天3点半运行,满5天执行一次,后边用了四个action:
第一个,就是执行全局完整备份,
第二个,是我安装了个自动清理备份的集成,我设置的只保留最近的10个,也就是50天,相关内容:GitHub - tmonck/clean_up_snapshots第三个,给我的微信发通知,用的企业微信群机器人通道,可有可无;
第四个,就是更新一下这个上次备份时间Input Datetime参数。


20241227_121944.png



再补充说一下,这样搞了之后还有一个好处就是,比如前天我这个自动化备份的任务运行过了一次,按计划下一次自动运行是3天后,但是假如今天我调整了很多重要参数增加了很多改动,必须要手动进行一次备份任务,那手动运行这个自动化任务之后,它就会更新上次备份时间,下次运行时间就自动变成五天后,而不是原本的三天后,不用人工去修改自动化下次运行时间了。



结帖。















下边是我最初的原帖提问的,现在我已经搞定了,就重新来编辑一下这个帖子,把整个回答更新一下,以便后来者参考。另外再次感谢大佬们在下边的回贴。。


                               
登录/注册后可看大图

我搞了个自动化,根据日期是不是双数来判断间隔2天,但是比如31号之后1号,不就bug了嘛,间隔5天一样bug,另外假设我3号运行了一次,间隔5天那是8号,这咋搞哦。。。



回复

使用道具 举报

0

主题

8

帖子

922

积分

高级会员

Rank: 4

积分
922
金钱
914
HASS币
0
发表于 2024-12-26 01:29:21 | 显示全部楼层
本帖最后由 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 触发器
    • 每天的某个时间点(例如早上 8 点)触发自动化。
  • 条件模板
    • 使用 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,初始值应正确设置为某个合理的日期时间。

根据需求选择最适合的方法,每种方法都可以灵活调整以适应不同场景!

回复

使用道具 举报

17

主题

194

帖子

1911

积分

金牌会员

Rank: 6Rank: 6

积分
1911
金钱
1717
HASS币
0
发表于 2024-12-26 08:40:17 | 显示全部楼层
{{now()-this.attributes.last_triggered > timedelta( hours = 24 )}}
这是2天一次,间隔3天就把最后的24改成48,依次类推
回复

使用道具 举报

5

主题

39

帖子

157

积分

注册会员

Rank: 2

积分
157
金钱
118
HASS币
0
 楼主| 发表于 2024-12-26 22:09:19 | 显示全部楼层
x10n9 发表于 2024-12-26 01:29
ChatGPT帮到你

在 Home Assistant 中,要实现每隔几天运行一次的自动化,可以通过以下方式:

嗯嗯嗯,感谢大佬,我还没有进行测试,但是从描述来看,我需要方案二:
方案一并不能检测到上一次运行的时间,即使昨天手动运行了,今天的天数是3的整数,还是会运行一遍;
方案二很合适,要的就是这个结果;
方案三不能保证中间机器会不会重启什么的,所以要求自动化一直处于运行状态也不现实。
回复

使用道具 举报

5

主题

39

帖子

157

积分

注册会员

Rank: 2

积分
157
金钱
118
HASS币
0
 楼主| 发表于 2024-12-26 22:10:52 | 显示全部楼层
csl0524 发表于 2024-12-26 08:40
{{now()-this.attributes.last_triggered > timedelta( hours = 24 )}}
这是2天一次,间隔3天就把最后的24 ...

我试试,看着是满足需要的,那个this.attributes.last_triggered 即使上次运行是手动运行的也可以的话就很合适了
回复

使用道具 举报

4

主题

116

帖子

895

积分

高级会员

Rank: 4

积分
895
金钱
779
HASS币
0
发表于 2024-12-27 10:25:03 | 显示全部楼层
但是这玩意设置个每周几运行不就好了吗
回复

使用道具 举报

5

主题

39

帖子

157

积分

注册会员

Rank: 2

积分
157
金钱
118
HASS币
0
 楼主| 发表于 2024-12-27 15:41:33 | 显示全部楼层
本帖最后由 sanmoking 于 2024-12-27 15:44 编辑
lswq 发表于 2024-12-27 10:25
但是这玩意设置个每周几运行不就好了吗

每周几是固定7天可以的,如果比如每隔三天就不好搞了,周一周四周日,然后周日和第二周周一就连续了。。。再比如你设置的周一周三周五周日每隔一天运行一次,但是你周二提前手动运行了自动化动作,那隔一天就变成周四了,还要改自动化的话就太麻烦了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2025-1-21 18:06 , Processed in 0.100141 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表