ESP Home long_press Funktion für Buttons

Ich habe eine Platine mit einem ESP32, welche unter anderem mehrere Relais schalten kann, ich habe hier den Code, den ich verwende:

esphome:
  name: kc868-a6
  friendly_name: kc868-a6

esp32:
  board: esp32dev
  framework:
    type: arduino

captive_portal:
# I2C configuration
i2c:
  sda: 4
  scl: 15
  scan: true
  id: bus_a

# PCF8574 configuration
pcf8574:
  - id: 'pcf8574_hub_out_1'  # for output channel 1-8
    address: 0x24

# Individual outputs
button:
  - platform: template
    name: "a6-light1"
    on_press:
      - switch.turn_on: relay1
      - delay: 500ms
      - switch.turn_off: relay1

switch:
  # Physical GPIO switches (relay outputs)
  - platform: gpio
    id: relay1
    pin:
      pcf8574: pcf8574_hub_out_1
      number: 0
      mode: OUTPUT
      inverted: true

das funktioniert soweit, wenn man einen (virtuellen) Button betätigt, wird das entsprechende Relais für 500ms eingeschaltet.
Ich würde jetzt gerne noch eine zusätzliche Funktion haben, wenn man einen Button länger drückt (long-press) sollte das Relais eingeschaltet werden und so lange ein bleiben, wie man die Taste hält, das sollte soweit ich weiß ja möglich sein, leider konnte ich es bis jetzt nicht lösen.

In dem Code ist jetzt nur ein Relais (zwecks Übersichtlichkeit) es sind aber 6 Stück, aber wenn ich es für eines machen, kann ist es nur ein copy & paste, das schaffe ich :slight_smile:

LG
Andreas

Ich habe vor längerer Zeit mal was aus dem Internet kopiert, als ich auf der Suche für einen Beispielcode für meine Rollladensteuerung war.
Dort wurden unterschiedliche Tastendrücke über ‘binary_sensor’ und ‘on_multi_click’ ausgewertet.
Hab den Code nicht getestet aber vielleicht bringt dich das auf den richtigen Weg…

### Schaltersteuerung
binary_sensor:
  - platform: gpio
    pin: GPIO13
    name: "Shelly 2.5 Open Button"
    internal: true
    id: switch1
    filters:
      - delayed_on_off: 20ms
    on_multi_click:
      # Einzelclick
      - timing:
          - ON for at most 400ms
          - OFF for at least 300ms
        then:
          - cover.open: rolladen
          - delay: 2s
          - cover.stop: rolladen
      # Doppelclick
      - timing:
          - ON for at most 400ms
          - OFF for at most 300ms
          - ON for at most 400ms
          - OFF for at least 300ms
        then:
          - cover.open: rolladen
      # 3fach click
      - timing:
          - ON for at most 400ms
          - OFF for at most 300ms
          - ON for at most 400ms
          - OFF for at most 300ms
          - ON for at most 400ms
          - OFF for at least 300ms
        then:
          - cover.open: rolladen
          - lambda: |-
              if (!id(block_control).state) {
                id(floor_up_state) = true;
                id(floor_down_state) = false;
                id(house_up_state) = false;
                id(house_down_state) = false;
              }
          - delay: 2s
          - lambda: |-
              id(floor_up_state) = false;
              id(floor_down_state) = false;
              id(house_up_state) = false;
              id(house_down_state) = false;
      # 4fach click
      - timing:
          - ON for at most 400ms
          - OFF for at most 300ms
          - ON for at most 400ms
          - OFF for at most 300ms
          - ON for at most 400ms
          - OFF for at most 300ms
          - ON for at most 400ms
          - OFF for at least 50ms
        then:
          - cover.open: rolladen
          - lambda: |-
              if (!id(block_control).state) {
                id(floor_up_state) = false;
                id(floor_down_state) = false;
                id(house_up_state) = true;
                id(house_down_state) = false;
              }
          - delay: 2s
          - lambda: |-
              id(floor_up_state) = false;
              id(floor_down_state) = false;
              id(house_up_state) = false;
              id(house_down_state) = false;
      # Halten
      - timing:
          - ON for at least 2s
        then:
          - lambda: |-
              id(manual_mode) = true;
          - cover.open: rolladen
    # Taste losgelassen - Manual Mode STOP
    on_release:
      then:
        - lambda: |-
            if(id(manual_mode)) {
              id(manual_mode) = false;
              auto call = id(rolladen).make_call();
              call.set_command_stop();
              call.perform();
            }