Création d'un bouton sous Lovelace (switch)

Bonjour,
Bonne et heureuse année à vous tous que Home Assistant vous apporte de nouvelles aides dans votre vie de 2025 :wink:

Mon problème

J’ai utilisé une ancienne télécommande Nice 2 boutons reliée à un ESP32 que je pilote via un script ESPHome. Ça fonctionne à merveille, et j’ai donc 2 switch possible :

  • switch.portail_pieton
  • switch.portail_voiture

Maintenant, je souhaiterais intégrer ces 2 switchs dans un dashboard lovelace de ce type :

avec ce fonctionnement :

  1. Je clique sur le bouton Ouverture piéton
  2. l’information secondaire passe de Fermé à En mouvement et le switch ESPHome switch.portail_pieton est activé (dans ESPHome, il bascule de off à on durant 3s pour éviter de rester trop longtemps « appuyé » sur le bouton de la télécommande)
  3. L’appui sur le bouton de la télécommande va ouvrir le portail. cette ouverture dure un certain temps <temps_ouverture_portail>
  4. Un tempo de <temps_ouverture_portail> bloque l’appui sur ces 2 boutons Ouverture piéton et Ouverture voiture
  5. Après ce <temps_ouverture_portail>, l’information secondaire passe de En mouvement à Ouvert

Et inversement pour la fermeture :

  1. Je clique sur le bouton Ouverture piéton
  2. l’information secondaire passe de Ouvert à En mouvement
  3. Un tempo de <temps_ouverture_portail> bloque l’appui sur ces 2 boutons Ouverture piéton et Ouverture voiture
  4. Après ce <temps_ouverture_portail>, l’information secondaire passe de En mouvement à Fermé

Comment faire pour associer le clic du bouton Ouverture piéton à un script qui :

  • inactiverait les 2 boutons durant <temps_ouverture_portail>
  • déclencherait le switch.portail_pieton
  • changerait les options de l’input select portail_pieton_state

L’état actuel de ce que j’ai pu faire

ESPHome

Voici le code de l'ESP qui pilote la télécommande :
# Module Definition

switch:
  - platform: gpio
    pin: 26
    id: relay_pieton
    inverted: True
    interlock: [relay_voiture]
    name: "Portail piéton"
    icon: "mdi:gate"
    on_turn_on:
    - delay: 3000ms
    - switch.turn_off: relay_pieton
  - platform: gpio
    pin: 25
    id: relay_voiture
    inverted: True
    interlock: [relay_pieton]
    name: "Portail voiture"
    icon: "mdi:gate"
    on_turn_on:
    - delay: 3000ms
    - switch.turn_off: relay_voiture

Ces 2 switchs me permette de piloter le portail via la page ESPHome :

Lovelace

J’ai créé deux input select pour les états des ouvertures piéton et voiture (voici celui de l’ouverture piéton) :

J’ai créé 2 scripts qui permettent de passer d’un état à un autre et d’actionner le « bouton de la télécommande » via switch.portail_xxxxxx :

Gestion portail piéton
alias: Gestion portail piéton
sequence:
  - choose:
      - conditions:
          - condition: state
            entity_id: input_select.portail_pieton_state
            state: closed
        sequence:
          - action: input_select.select_option
            metadata: {}
            data:
              option: moving
            target:
              entity_id: input_select.portail_pieton_state
          - action: switch.toggle
            metadata: {}
            data: {}
            target:
              entity_id: switch.portail_pieton
          - delay:
              hours: 0
              minutes: 0
              seconds: 25
              milliseconds: 0
          - action: input_select.select_option
            metadata: {}
            data:
              option: opened
            target:
              entity_id: input_select.portail_pieton_state
      - conditions:
          - condition: state
            entity_id: input_select.portail_pieton_state
            state: opened
        sequence:
          - action: input_select.select_option
            metadata: {}
            data:
              option: moving
            target:
              entity_id: input_select.portail_pieton_state
          - action: switch.toggle
            metadata: {}
            data: {}
            target:
              entity_id: switch.portail_pieton
          - delay:
              hours: 0
              minutes: 0
              seconds: 30
              milliseconds: 0
          - action: input_select.select_option
            metadata: {}
            data:
              option: closed
            target:
              entity_id: input_select.portail_pieton_state
description: ""
Gestion portail voiture
alias: Gestion portail voiture
sequence:
  - choose:
      - conditions:
          - condition: state
            entity_id: input_select.portail_voiture_state
            state: closed
        sequence:
          - action: input_select.select_option
            metadata: {}
            data:
              option: moving
            target:
              entity_id: input_select.portail_voiture_state
          - action: switch.toggle
            metadata: {}
            data: {}
            target:
              entity_id: switch.portail_voiture
          - delay:
              hours: 0
              minutes: 0
              seconds: 36
              milliseconds: 0
          - action: input_select.select_option
            metadata: {}
            data:
              option: opened
            target:
              entity_id: input_select.portail_voiture_state
      - conditions:
          - condition: state
            entity_id: input_select.portail_voiture_state
            state: opened
        sequence:
          - action: input_select.select_option
            metadata: {}
            data:
              option: moving
            target:
              entity_id: input_select.portail_voiture_state
          - action: switch.toggle
            metadata: {}
            data: {}
            target:
              entity_id: switch.portail_voiture
          - delay:
              hours: 0
              minutes: 0
              seconds: 36
              milliseconds: 0
          - action: input_select.select_option
            metadata: {}
            data:
              option: closed
            target:
              entity_id: input_select.portail_voiture_state
description: ""

Et mon code de la carte qui contient les boutons :

code carte lovelace
type: conditional
conditions: []
card:
  type: horizontal-stack
  cards:
    - type: custom:mushroom-template-card
      primary: Ouverture Piéton
      secondary: |-
        {% if is_state('input_select.portail_pieton_state', 'closed') %}
          Fermé
        {% elif is_state('input_select.portail_pieton_state', 'moving') %}
          En mouvement
        {% elif is_state('input_select.portail_pieton_state', 'opened') %}
          Ouvert
        {% endif %}
      icon: |-
        {% if is_state('input_select.portail_pieton_state', 'closed') %}
          mdi:power-on
        {% elif is_state('input_select.portail_pieton_state', 'moving') %}
          mdi:power-cycle
        {% elif is_state('input_select.portail_pieton_state', 'opened') %}
          mdi:power-off
        {% endif %}
      icon_color: |-
        {% if is_state('input_select.portail_pieton_state', 'closed') %}
          green
        {% elif is_state('input_select.portail_pieton_state', 'moving') %}
          grey
        {% elif is_state('input_select.portail_pieton_state', 'opened') %}
          red
        {% endif %}
      tap_action:
        action: perform-action
        perform_action: script.gestion_portail_pieton
        target: {}
    - type: custom:mushroom-template-card
      primary: Ouverture voiture
      secondary: |-
        {% if is_state('input_select.portail_voiture_state', 'closed') %}
          Fermé
        {% elif is_state('input_select.portail_voiture_state', 'moving') %}
          En mouvement
        {% elif is_state('input_select.portail_voiture_state', 'opened') %}
          Ouvert
        {% endif %}
      icon: |-
        {% if is_state('input_select.portail_voiture_state', 'closed') %}
          mdi:power-on
        {% elif is_state('input_select.portail_voiture_state', 'moving') %}
          mdi:power-cycle
        {% elif is_state('input_select.portail_voiture_state', 'opened') %}
          mdi:power-off
        {% endif %}
      tap_action:
        action: perform-action
        perform_action: script.gestion_portail_voiture
        target: {}
      icon_color: |-
        {% if is_state('input_select.portail_voiture_state', 'closed') %}
          green
        {% elif is_state('input_select.portail_voiture_state', 'moving') %}
          grey
        {% elif is_state('input_select.portail_voiture_state', 'opened') %}
          red
        {% endif %}

En cliquant sur le bouton Ouverture Piéton, je vois bien le bouton Ouverture Piéton évoluer comme prévu et le portail s’ouvre bien.

Par contre je n’arrive pas à « bloquer » un nouvel appui sur le même ou l’autre bouton pendant le délai d’ouverture du portail.
Des idées :thinking: ?

Bonjour,

sont deux entités qui ont pour effet de réélement faire ouvrir chacun des portails.

Tu as eu la bonne idée de rajouter 2 input pour te souvenir de l’état (ouvert/fermé/mouvement)

Il faut créer 2 [edit] input_boolean (entrée>interrupteur) qui activeront des automatimes (et pas des scripts) je les nomme inter.

Exemple pour le portailvoiture
déclencheur : interportailvoiture change d’état
condition : si etatportailpieton n’est pas mouvement
action :
etat portailvoiture = mouvement
si interportailvoiture=« on » alors switch.portail_voiture = ouvrir
si interportailvoiture=« off » alors switch.portail_voiture = fermer
attendre 30s
si interportailvoiture=« on » alors etatportailvoiture = ouvert
si interportailvoiture=« off » alors etatportailvoiture = fermé

Merci pour l’info mais impossible de créer un switch via l’UI, je cherche dans Paramètres > Appareils et services > Entrées mais je trouve pas de switch :sob:

Et j’essaie de basculer ma configuration sur Lovelace au maximum donc c’est pas pour rebidouiller dans mon fichier configuration.yaml

Salut
Fait la traduction de switch en français tu vas trouver :wink:

La traduction de switch est commutateur mais je ne le trouve pas dans la liste des entrées que l’on peut créée :


J’ai essayé avec Template puis Modéliser un commutateur, c’est qui se rapproche le plus de la traduction switch mais comment le renseigner avec ce que me propose @armavi :

switch → commutateur/interrupteur

1 « J'aime »

J’ai édité ma réponse initiale pour préciser.
On aurait pu mettre un sélecteur input_select
Voire 2 boutons en changeant les automatismes

Tu as compris le tout est de désolidariser l’action (réalisé par l’ESP) et la commande.

Il est probable, qu’on pourrait faire plus propre avec un template cover.

Merci pour ta réponse @armavi , je n’ai pas utilisé de input_boolean car je ne maitrisais pas assez la façon de les utiliser mais ton algo m’a fait réfléchir et j’ai trouver une solution pour bloquer l’utilisation des boutons le temps du mouvement.

Dans mes 2 scripts, j’ai utilisé une condition ET sur les 2 input_select pour qu’ils ne soient pas en position moving.

Et voici ce que cela donne :

Gestion portail piéton
alias: Gestion portail piéton
sequence:
  - choose:
      - conditions:
          // Vérifie qu'aucune demande d'ouverture n'est en cours (état moving)
          - condition: and
            conditions:
              - condition: not
                conditions:
                  - condition: state
                    entity_id: input_select.portail_pieton_state
                    state: moving
              - condition: not
                conditions:
                  - condition: state
                    entity_id: input_select.portail_voiture_state
                    state: moving
        sequence:
          - choose:
              // Séquence pour ouvrir le portail piéton (état précédent closed)
              - conditions:
                  - condition: state
                    entity_id: input_select.portail_pieton_state
                    state: closed
                sequence:
                  // Défini l'état à moving
                  - action: input_select.select_option
                    metadata: {}
                    data:
                      option: moving
                    target:
                      entity_id: input_select.portail_pieton_state
                  // Appuie sur le bouton de la télécommande d'ouverture piéton
                  - action: switch.toggle
                    metadata: {}
                    data: {}
                    target:
                      entity_id: switch.portail_pieton
                  // Attend le délai d'ouverture du portail piéton
                  - delay:
                      hours: 0
                      minutes: 0
                      seconds: 25
                      milliseconds: 0
                  // Défini l'état à opened
                  - action: input_select.select_option
                    metadata: {}
                    data:
                      option: opened
                    target:
                      entity_id: input_select.portail_pieton_state
              // Séquence pour fermer le portail piéton (état précédent opened)
              - conditions:
                  - condition: state
                    entity_id: input_select.portail_pieton_state
                    state: opened
                sequence:
                  // Défini l'état à moving
                  - action: input_select.select_option
                    metadata: {}
                    data:
                      option: moving
                    target:
                      entity_id: input_select.portail_pieton_state
                  // Appuie sur le bouton de la télécommande d'ouverture piéton
                  - action: switch.toggle
                    metadata: {}
                    data: {}
                    target:
                      entity_id: switch.portail_pieton
                  // Attend le délai de fermeture du portail piéton
                  - delay:
                      hours: 0
                      minutes: 0
                      seconds: 30
                      milliseconds: 0
                  // Défini l'état à closed
                  - action: input_select.select_option
                    metadata: {}
                    data:
                      option: closed
                    target:
                      entity_id: input_select.portail_pieton_state
description: ""
Gestion portail voiture
alias: Gestion portail voiture
sequence:
  - choose:
      - conditions:
          // Vérifie qu'aucune demande d'ouverture n'est en cours (état moving)
          - condition: and
            conditions:
              - condition: not
                conditions:
                  - condition: state
                    entity_id: input_select.portail_pieton_state
                    state: moving
              - condition: not
                conditions:
                  - condition: state
                    entity_id: input_select.portail_voiture_state
                    state: moving
        sequence:
          - choose:
              // Séquence pour ouvrir le portail voiture (état précédent closed)
              - conditions:
                  - condition: state
                    entity_id: input_select.portail_voiture_state
                    state: closed
                sequence:
                  // Défini l'état à moving
                  - action: input_select.select_option
                    metadata: {}
                    data:
                      option: moving
                    target:
                      entity_id: input_select.portail_voiture_state
                  // Appuie sur le bouton de la télécommande d'ouverture voiture
                  - action: switch.toggle
                    metadata: {}
                    data: {}
                    target:
                      entity_id: switch.portail_voiture
                  // Attend le délai d'ouverture du portail voiture
                  - delay:
                      hours: 0
                      minutes: 0
                      seconds: 36
                      milliseconds: 0
                  // Défini l'état à opened
                  - action: input_select.select_option
                    metadata: {}
                    data:
                      option: opened
                    target:
                      entity_id: input_select.portail_voiture_state
              // Séquence pour fermer le portail voiture (état précédent opened)
              - conditions:
                  - condition: state
                    entity_id: input_select.portail_voiture_state
                    state: opened
                sequence:
                  // Défini l'état à moving
                  - action: input_select.select_option
                    metadata: {}
                    data:
                      option: moving
                    target:
                      entity_id: input_select.portail_voiture_state
                  // Appuie sur le bouton de la télécommande d'ouverture voiture
                  - action: switch.toggle
                    metadata: {}
                    data: {}
                    target:
                      entity_id: switch.portail_voiture
                  // Attend le délai de fermeture du portail voiture
                  - delay:
                      hours: 0
                      minutes: 0
                      seconds: 36
                      milliseconds: 0
                  // Défini l'état à closed
                  - action: input_select.select_option
                    metadata: {}
                    data:
                      option: closed
                    target:
                      entity_id: input_select.portail_voiture_state
description: ""

Merci beaucoup @armavi pour ta réponse qui m’a aidé à résoudre mon problème, même si je n’ai pas réussi à appliqué ta solution, ta réponse a été constructive pour la résolution de mon problème.
C’est ce que j’aime sur ce forum, toujours quelqu’un pour aider !!

1 « J'aime »