Как отследить нажатие кнопки настенного сенсорного выключателя Sonoff Touch (esphome) - d51x/openhab-docs-russian GitHub Wiki

Имеется настенный сенсорный выключатель Sonoff Touch. Прошит прошивкой Esphome. Настроена публикация данных в кастомные топики, которых по дефолту нет в прошивке.

Интеграция с OpenHAB по Mqtt. Данные публикуются вот так:

image

Факт нажатия кнопки отслеживается по топику esp/bedroom1-light-switch/button/state

Когда кнопка нажимается, то значение в топике станет OFF на мгновение и вернется на ON

Поэтому можно настроить channel (тип Trigger) для устройства

image

Воспользуемся JINJA трансформацией, чтобы при нажатии кнопки срабатывал trigger со значением pressed.

JINJA:{{ value == "OFF" ? "pressed" : "" }}

Когда кнопка будет отпущена, значение тригера вернется на пустое.

Тем самым можно отслеживать факт физического нажатия на кнопку и строить автоматизации, понимая как включен свет - автоматически или в ручную.

Например, созданим правило для фиксации ручного нажатия:

image

image

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