Как отследить нажатие кнопки настенного сенсорного выключателя Sonoff Touch (esphome) - d51x/openhab-docs-russian GitHub Wiki
Имеется настенный сенсорный выключатель Sonoff Touch. Прошит прошивкой Esphome. Настроена публикация данных в кастомные топики, которых по дефолту нет в прошивке.
Интеграция с OpenHAB по Mqtt. Данные публикуются вот так:
Факт нажатия кнопки отслеживается по топику esp/bedroom1-light-switch/button/state
Когда кнопка нажимается, то значение в топике станет OFF
на мгновение и вернется на ON
Поэтому можно настроить channel (тип Trigger) для устройства
Воспользуемся JINJA трансформацией, чтобы при нажатии кнопки срабатывал trigger со значением pressed
.
JINJA:{{ value == "OFF" ? "pressed" : "" }}
Когда кнопка будет отпущена, значение тригера вернется на пустое.
Тем самым можно отслеживать факт физического нажатия на кнопку и строить автоматизации, понимая как включен свет - автоматически или в ручную.
Например, созданим правило для фиксации ручного нажатия:
Item bedroom1_Light_is_manual_or_auto
имеет тип String, в который я записываю значение manual
и auto
для дальнейшего использования в других правилах.
Конфиг для сборки и прошивки
substitutions:
devicename: bedroom1-light-switch
BTN_PIN: "GPIO0"
RELAY_PIN: "GPIO12"
TOPIC_PREFIX: "esp"
esphome:
name: $devicename
esp8266:
board: esp8285
restore_from_flash: true
# Enable logging
logger:
baud_rate: 115200
level: WARN
logs:
mqtt.component: WARN
mqtt.client: WARN
# Enable Home Assistant API
# api:
# reboot_timeout: 0s
# password: ""
ota:
password: ""
<<: !include wifi.yaml
# captive_portal:
mdns:
disabled: false
web_server:
port: 80
include_internal: true
version: 2
local: true
mqtt:
broker: 192.168.2.63
discovery: true
id: mqtt_client
topic_prefix: $TOPIC_PREFIX/$devicename
log_topic:
topic: $TOPIC_PREFIX/$devicename/debug
level: NONE
globals:
- id: time_sync_done
type: bool
time:
- platform: sntp
id: sntp_time
on_time_sync:
then:
lambda: |-
id(time_sync_done) = true;
sensor:
- platform: uptime
name: "Uptime"
state_topic: $TOPIC_PREFIX/$devicename/uptime
- platform: wifi_signal
name: "WiFi Signal"
state_topic: $TOPIC_PREFIX/$devicename/rssi
update_interval: 5s
filters:
- delta: 3.0
- platform: debug
free:
name: "Heap Free"
state_topic: $TOPIC_PREFIX/$devicename/free
debug:
update_interval: 5s
text_sensor:
- platform: version
name: "ESPHome Version"
state_topic: $TOPIC_PREFIX/$devicename/version
- platform: wifi_info
ip_address:
name: WiFi IP Address
state_topic: $TOPIC_PREFIX/$devicename/ip
ssid:
name: WiFi SSID
state_topic: $TOPIC_PREFIX/$devicename/ssid
switch:
- platform: restart
name: "Restart"
internal: true
light:
- platform: binary
name: "Light"
output: light_relay
id: light_id
restore_mode: RESTORE_DEFAULT_OFF
state_topic: $TOPIC_PREFIX/$devicename/light/state
command_topic: $TOPIC_PREFIX/$devicename/light/command
output:
- id: light_relay
platform: gpio
pin: $RELAY_PIN
binary_sensor:
- platform: gpio
pin:
number: $BTN_PIN
mode:
input: true
name: "Button State"
id: button_state
state_topic: $TOPIC_PREFIX/$devicename/button/state
filters:
- delayed_on: 30ms
- delayed_off: 30ms
on_press:
then:
- light.toggle:
id: light_id
PS рядом с файлом конфига должен лежать файл wifi.yaml
с содержимым:
wifi:
networks:
- ssid: !secret wifi.ssid1
password: !secret wifi.pass1
- ssid: !secret wifi.ssid2
password: !secret wifi.pass2
- ssid: !secret wifi.ssid3
password: !secret wifi.pass3
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: $devicename
password: !secret wifi.ap_pass
#power_save_mode: none
А так же файл secret.yaml
wifi.ap_pass: xxxx
wifi.ssid1: xxxx
wifi.pass1: xxxx
wifi.ssid2: xxx
wifi.pass2: xxx
wifi.ssid3: xxx
wifi.pass3: xxx