本帖最后由 neroxps 于 2020-7-10 17:53 编辑
delay的目的:用手机控制热水器,怕小孩子反复乱点烧坏设备,所以想实现一个小功能,就是手机点击开/关之后,先判断与上次开/关的时间,如果小于10秒无效(延时),大于10秒再触发开关,这样。在10秒之内连续点击开关是不管用的。(开关只能10秒用一次,杜绝安全风险)
你的需求就是要switch 点击后,10秒之后,十秒内不再触发是吧。
楼主可以试试以下代码,我没上机测试过,但是编译是过的
substitutions:
devicename: 'test'
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
api_password: !secret api_password
ota_password: !secret ota_password
hotport_ssid: !secret hotport_ssid
hotport_password: !secret hotport_password
esphome:
name: $devicename
platform: ESP8266
board: esp12e
wifi:
# 设置ID 可以在 lambda 下用 id($id_name) 调用,继承 WiFiComponent 类。
id: wifi_state
ssid: $wifi_ssid
password: $wifi_password
# 启动 AP 模式
ap:
ssid: $hotport_ssid
password: $hotport_password
# AP 模式启动后,需要使用门户修改 SSID 和 Password 的需要启动 captive_portal
## 但在门户修改 SSID 之后,还需要手动重启 SSID 配置才会生效.
captive_portal:
# Enable logging
logger:
# Enable Home Assistant API
api:
password: $api_password
reboot_timeout: 0s
ota:
password: $ota_password
# 设置初始时间变量,初始是0
globals:
- id: my_global_time
type: unsigned long
restore_value: no
initial_value: "0"
# 物理按键
binary_sensor:
- platform: gpio
pin: GPIO13
internal: true
name: "Button"
on_press:
then:
- switch.toggle: uart_switch
uart:
baud_rate: 9600
tx_pin: TX
# 假设是继电器
switch:
- platform: uart
name: "uart_on"
id: uart_on
internal: true
data: [0xA0, 0x01, 0x01, 0xA2]
- platform: uart
name: "uart_off"
id: uart_Off
internal: true
data: [0xA0, 0x01, 0x01, 0xA1]
# 整合 uart 开和关
- platform: template
name: "UART Switch"
id: uart_switch
internal: true
turn_on_action:
- switch.toggle: uart_on
turn_off_action:
- switch.toggle: uart_Off
# 作为 HA 前台开关
- platform: template
name: "Template Switch"
lambda: |-
if (id(uart_switch).state) {
return true;
} else {
return false;
}
turn_on_action:
- script.execute: my_script
turn_off_action:
- script.execute: my_script
# 开或者关的触发脚本
script:
- id: my_script
then:
- lambda: |-
unsigned long currentTime = millis();
if ( currentTime > id(my_global_time ) + 10000){
id(uart_switch).toggle();
}
id(my_global_time) = currentTime;
#
# // 定义变量 currentTime 获取当前时间
# unsigned long currentTime = millis();
# // 判断当前时间大于上一次时间10秒(10000毫秒)则切换 switch_relay 的状态
# if (currentTime > id(my_global_time) + 10000){
# id(switch_relay).toggle();
# }
# // 保存当前时间
# id(my_global_time) = currentTime;
test.zip
(1.28 KB, 下载次数: 9)
更新了下,楼主可以试试,编译过了,HA 那边的控制按钮是10秒之后才反应,物理按钮是立刻反应。
|