本帖最后由 chiunownow 于 2019-2-15 20:28 编辑
2月15日更新
可能是我描述的不够清楚,我需要实现的具体功能是这样的:
- 智能插座是用来控制烘干机的,根据烘干衣服的数量,通常需要设定3~6小时不等的运行时常
- 我用的控客mini k有时不时离线的问题。如果离线时正好碰上定时关闭,那么HA的关闭命令会被插座忽略,关闭将会失败
- 为了解决关闭失败的问题,我用轮询+重试的方式,保证定时关闭可以执行成功。
- 为了知道关闭是否成功,加入了关闭失败与关闭成功的通知
- 我的这package,在关闭之后,会延迟一分钟再check插座是否为关的状态。如果为关,则发送关闭成功通知,如果关闭失败(设备state为on或unavailable)则10分钟后再重试关闭。
- 关闭一分钟后再check状态,是因为HA向unavailable的插座发送关闭命令的五秒钟之内,可能会出现插座未关闭,但HA里的state为off的情况。
- 目前这个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
|