Wie esphome-Ausgang aktivieren solange GUI-Button gedrückt ist

vielleicht finde ich ja einfach nicht die richtigen Suchbegiffe, aber ich finde keine Lösung für mein Problem.

Ich möchte einen esp32-Ausgang solange aktiv haben, wie auf der Homeassistant-GUI ein Button gedrückt gehalten wird.

Aus lauter Verzweifelung habe ich schon versucht einen sich selbst abschalten Switch

switch:
  - name: bLED
    id: bLED
    platform: gpio
    pin:
      number:  GPIO2
      inverted: true
    on_turn_on:
    - delay: 200ms
    - switch.turn_off: bLED

mit einem Button zu kombinieren, der in der hold_action immer wieder das turn_on Kommando schickt.

type: custom:button-card
name: mach was
entity: switch.d1_mini_bled
hold_action:
  action: call-service
  service: switch.turn_on
  target:
    entity_id: switch.d1_mini_bled
  repeat: 100

funktioniert aber leider auch nicht richtig, weil der Switch anscheinend neue turn_on Kommandos ignoriert, solange die vorherige on_turn_on Aktion noch läuft.

Hat jemand eine bessere Lösung, oder eine Idee, wie man meinen Ansatz verbessern könnte?

Gut das Problem hier ist ja, dass du im Endeffekt keine Hold-Aktion brauchst sondern einen Trigger sobald du nicht mehr gedrückt hast und den stellt diese custom Button Integration nicht zur Verfügung.

Was mir einfallen würde, dass du deine Idee sozusagen in eine Automation packst. Das ist natürlich auch bei weitem keine schöne Lösung und extrem “hacky”:

Solang du den Button gedrückt haltest wird alle 100 ms eine Automation aufgerufen.

Dies Automation schaltet die LED ein und zb. 200 ms später wieder aus. Die Automation stellst du so ein, dass die alte bei erneutem Aufruf abgebrochen wird und sie neu gestartet wird (= Modus “neu starten”). Damit wird sie alle 100 ms neu aufgerufen und sobald der Button losgelassen wird kann sie zum ersten mal komplett durchlaufen und schaltet die LED nach 200 ms wieder aus.

richtig, die Hold-Aktion ist der Workaround dafür, dass ich keinen einzigen Button gefunden habe der eine Release-Action hat.

den Modus gibt es nicht zufällig auch für die esphome Switch-Actions?

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)

die automation Lösung funktioniert :sunglasses:

button

type: custom:button-card
name: push-button
entity: switch.d1_mini_hz_bled
tap_action: 
  action: call-service
  service: automation.trigger
  service_data:
    entity_id: automation.push_button
hold_action:
  action: call-service
  service: automation.trigger
  service_data:
    entity_id: automation.push_button
  repeat: 125

automation

alias: push-button
trigger:
action:
  - service: switch.turn_on
    target:
      entity_id: switch.d1_mini_hz_bled
  - delay:
      milliseconds: 150
  - service: switch.turn_off
    target:
      entity_id: switch.d1_mini_hz_bled
mode: restart

auf dem ESP gibt es nur noch einen ganz normalen Switch

mit den Zeiten weiter runter zu gehen bringt - zumindest mit meinem Aufbau - nichts.
Kürzer als ~150ms wird der Impuls am Ausgang nicht

Update:

ich habe weiter rumgetüftelt und noch eine Variante gefunden.
Diese verlegt das Timing des Abschaltens nach esphome.
Das gefällt mir besser als obige Lösung, weil der Abschaltbefehl seitens der GUI nicht verschütt gehen kann.

HA-GUI

type: custom:button-card
name: push-button
entity: switch.d1_mini_hz_bled
tap_action:
  action: call-service
  service: switch.turn_on
  target:
    entity_id: switch.d1_mini_hz_bled_t
hold_action:
  action: call-service
  service: switch.turn_on
  target:
    entity_id: switch.d1_mini_hz_bled_t
  repeat: 75

EspHome

switch:
  - platform: template
    name: "bLED_t"
    turn_on_action:
      - script.execute: bLED_s

  - name: bLED
    id: bLED
    platform: gpio
    pin:
      number:  GPIO2
      inverted: true

script:
  - id: bLED_s
    mode: restart
    then:
      - switch.turn_on: bLED
      - delay: 100ms
      - switch.turn_off: bLED

Den Template Switch braucht es, weil die turn_on_action des eigentlichen Switchs nicht triggert wenn der Switch noch an ist :sunglasses:

Update 2:

der Missbrauch des Template-Sensors hat mir keine Ruhe gelassen und ein Hinweis in User-Defines Services in https://community.home-assistant.io/t/push-and-hold-gui-button-to-control-esphome-output/748831 führte zur folgenden Lösung

Homeassistant:

type: custom:button-card
name: push-button-V
icon: mdi:lightbulb
size: 50%
aspect_ratio: 2/1
entity: switch.d1_mini_tests_bled
tap_action:
  action: call-service
  service: esphome.d1_mini_tests_run_bled_script
hold_action:
  action: call-service
  service: esphome.d1_mini_tests_run_bled_script
  repeat: 75

esphome:

api:
  services: 
    - service: run_bled_script
      then:
      - script.execute: bLED_s

script:
  - id: bLED_s
    mode: restart
    then:
      - switch.turn_on: bLED
      - delay: 100ms
      - switch.turn_off: bLED

switch:
  - name: bLED
    id: bLED
    platform: gpio
    pin:
      number:  GPIO2
      inverted: true

Ich denke, das ist erst mal die Lösung für mein Problem, bis jemand vorbeikommt und etwas Besseres, Ordentlicheres oder Korrekteres vorschlägt :sunglasses: