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

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

[技术探讨] 求教,如何优雅地在HA里实现轮询和重试?

[复制链接]

21

主题

188

帖子

1483

积分

金牌会员

Rank: 6Rank: 6

积分
1483
金钱
1290
HASS币
60
发表于 2019-2-13 14:17:32 | 显示全部楼层 |阅读模式
本帖最后由 chiunownow 于 2019-2-15 20:28 编辑

2月15日更新

可能是我描述的不够清楚,我需要实现的具体功能是这样的:

  1. 智能插座是用来控制烘干机的,根据烘干衣服的数量,通常需要设定3~6小时不等的运行时常
  2. 我用的控客mini k有时不时离线的问题。如果离线时正好碰上定时关闭,那么HA的关闭命令会被插座忽略,关闭将会失败
  3. 为了解决关闭失败的问题,我用轮询+重试的方式,保证定时关闭可以执行成功。
  4. 为了知道关闭是否成功,加入了关闭失败与关闭成功的通知
  5. 我的这package,在关闭之后,会延迟一分钟再check插座是否为关的状态。如果为关,则发送关闭成功通知,如果关闭失败(设备state为on或unavailable)则10分钟后再重试关闭。
  6. 关闭一分钟后再check状态,是因为HA向unavailable的插座发送关闭命令的五秒钟之内,可能会出现插座未关闭,但HA里的state为off的情况。
  7. 目前这个package对功能的实现几乎是完美的,但就是方式不够优雅。用上了两个脚本去作为fake switch,作为其他程序的触发器。想知道有没有更合理的组件可以使用,更优雅的实现方式,而不是这种歪门斜路

问题描述

我用一个插座来接烘干机,然后写了一个脚本用来定时给烘干机断电。因为插座有时不时离线的问题,为了了解关闭是否成功以及确保关闭成功,加入了轮询和通知。

但是脚本和自动化似乎都因为ha的限制,不能够自己调用自己,所以用了一个这样的骚操作来实现轮询

脚本1 没有任何功能 加了一个delay 让脚本有开关而不是执行按钮
脚本2 延迟五秒后打开脚本1的开关
自动化1 当脚本1开关打开时自动运行,判断开关处于‘开’或者‘不可用’时,发送通知,延迟9分55秒后尝试关闭插座,然后执行及脚本2

流程:脚本1触发自动化1-自动化1触发脚本2-脚本2触发脚本1

但是这样的实现方式似乎很不优雅。想请教各位大神,有没有什么更优雅的方法来实现这样的功能呢?

Package代码

input_number:
  dryer_off_time:
    name: 烘衣时长
    initial: 4
    min: 0
    max: 10
    step: 1
    unit_of_measurement: 小时
script:
  dryer_timer:
    alias: 开始烘衣定时
    sequence:
      - data:
          entity_id: switch.kong_ke_cha_zuo_bai
        service: switch.turn_on
      - delay:
          hours: '{{ states(''input_number.dryer_off_time'') | int }}'
      - data:
          entity_id: switch.kong_ke_cha_zuo_bai
        service: switch.turn_off
      - delay: 00:01:00
      - data:
          entity_id: script.fake_switch_for_dryer
        service: script.turn_on

  fake_switch_for_dryer:
    sequence: 
      - delay: 00:00:01
  fake_switch_2_for_dryer:
    sequence:
      - delay: 00:00:05
      - data:
          entity_id: script.fake_switch_for_dryer
        service: script.turn_on

automation: 
  - alias: check_switch_bai_auto_trun_off
    trigger: 
      platform: state
      entity_id: script.fake_switch_for_dryer
      from: 'off'
      to: 'on'
    condition:
      condition: or
      conditions:
          - condition: state
            entity_id: switch.kong_ke_cha_zuo_bai
            state: 'on'
          - condition: state
            entity_id: switch.kong_ke_cha_zuo_bai
            state: 'unavailable'
    action: 
      - data:
          entity_id: switch.kong_ke_cha_zuo_bai
        service: switch.turn_off
      - data:
          message: 烘衣机自动关闭可能失败,正在每隔十分钟重试一次。请自行检查插座开关状态。
          title: 自动关闭失败
        service: notify.ios_nownows_iphone
      - delay: 00:09:55
      - data:
          entity_id: script.fake_switch_2_for_dryer
        service: script.turn_on
  - alias: send_success_message
    trigger: 
      platform: state
      entity_id: script.fake_switch_for_dryer
      from: 'off'
      to: 'on'
    condition:
      - condition: state
        entity_id: switch.kong_ke_cha_zuo_bai
        state: 'off'
        for: 
          seconds: 10
    action:
      - data:
          message: 侦测到烘衣机开关已保持关闭状态10秒,大概率关闭成功。
          title: 自动关闭成功
        service: notify.ios_nownows_iphone


回复

使用道具 举报

39

主题

749

帖子

4833

积分

论坛元老

Freddy.

Rank: 8Rank: 8

积分
4833
金钱
4059
HASS币
0

最佳新人卓越贡献

发表于 2019-2-13 14:26:13 | 显示全部楼层
写个时间触发的定时自动化不就好了。。。
回复

使用道具 举报

123

主题

4661

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
16410
金钱
11664
HASS币
45
发表于 2019-2-13 17:35:35 | 显示全部楼层
感觉直接隔一定时间查询确认一次,比较靠谱。
回复

使用道具 举报

21

主题

188

帖子

1483

积分

金牌会员

Rank: 6Rank: 6

积分
1483
金钱
1290
HASS币
60
 楼主| 发表于 2019-2-13 23:33:28 | 显示全部楼层
定时触发不行啊。假设开关我要打开四小时,下一次定时出发时间是六点 现在是五点,那不就六点的时候开关就被关掉了么。
目前这个方式运行还挺稳的,关闭失败或成功都会通知,失败时每次重试都会通知。就是我觉得并不一定是最好的实现方式。
回复

使用道具 举报

8

主题

870

帖子

5218

积分

论坛元老

Rank: 8Rank: 8

积分
5218
金钱
4348
HASS币
0
发表于 2019-2-14 10:37:11 | 显示全部楼层
假设开关我要打开四小时,下一次定时出发时间是六点 现在是五点,那不就六点的时候开关就被关掉了么。
可以累加吗,比如5+4  9点的时候再定时?
回复

使用道具 举报

21

主题

188

帖子

1483

积分

金牌会员

Rank: 6Rank: 6

积分
1483
金钱
1290
HASS币
60
 楼主| 发表于 2019-2-15 20:29:09 | 显示全部楼层

2月15日更新

可能是我描述的不够清楚,我需要实现的具体功能是这样的:

  1. 智能插座是用来控制烘干机的,根据烘干衣服的数量,通常需要设定3~6小时不等的运行时常
  2. 我用的控客mini k有时不时离线的问题。如果离线时正好碰上定时关闭,那么HA的关闭命令会被插座忽略,关闭将会失败
  3. 为了解决关闭失败的问题,我用轮询+重试的方式,保证定时关闭可以执行成功。
  4. 为了知道关闭是否成功,加入了关闭失败与关闭成功的通知
  5. 我的这package,在关闭之后,会延迟一分钟再check插座是否为关的状态。如果为关,则发送关闭成功通知,如果关闭失败(设备state为on或unavailable)则10分钟后再重试关闭。
  6. 关闭一分钟后再check状态,是因为HA向unavailable的插座发送关闭命令的五秒钟之内,可能会出现插座未关闭,但HA里的state为off的情况。
  7. 目前这个package对功能的实现几乎是完美的,但就是方式不够优雅。用上了两个脚本去作为fake switch,作为其他程序的触发器。想知道有没有更合理的组件可以使用,更优雅的实现方式,而不是这种歪门斜路
回复

使用道具 举报

8

主题

2073

帖子

6053

积分

论坛元老

流水无味

Rank: 8Rank: 8

积分
6053
金钱
3980
HASS币
145

灌水之王

发表于 2019-2-17 12:28:43 | 显示全部楼层
用了nodered后 怎么看官方自动化都一脸懵逼
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 17:23 , Processed in 0.161394 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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