Gestion porte de garage avec template COVER problème état

Bonjour,
J’ai une porte de garage sectionnelle motorisée. J’ai un contact qui remonte via un ESP32 qui indique si la porte est fermée

J’utilise un template COVER, le code:

  porte_garage:
        device_class: garage
        friendly_name: "Commande porte garage"
        value_template: "{{ is_state('binary_sensor.porte_garage', 'on') }}"
        open_cover:
          - service: switch.turn_on
            target:
              entity_id: switch.sonoff_100173bbc2
        close_cover:
          - service: switch.turn_on
            target:
              entity_id: switch.sonoff_100173bbc2

Pour déclencher l’ouverture ou la fermeture de la porte le SWITCH sonoff envoi une impulsion de 0.5 Seconde.

Coté interfaçe :

Jusqu’ici rien d’exceptionnel, lorsque la porte est fermée et que je clique sur l’ouverture, le switch de détection de fermeture change d’état immédiatement et de ce fait l’icone passe en vert (garage ouvert).
Par contre lorsque la porte est ouverte, (vu que je n’ai pas un switch qui indique la fin de course d’ouverture), la porte se referme bien sauf que tant qu’elle n’arrive pas en fin de course de fermeture je ne sais pas si la commande a été prise en compte ! Je visualise au bout d’environ 20 secondes que l’état est bien « fermé ».
Ce que je souhaiterais faire, c’est que le statut fermé/ouvert soit « en mouvement » ou bien que l’icone fermeture s’affiche 20 secondes en rouge lorsque j’appuis sur l’icone de fermeture ce qui validerait le fait que la commande est bien prise en compte.
Je ne sais absolument pas comment faire, si vous pouvez m’aider !
merci par avance.

Salut @Ricky11
Regarde ce post, il me semble que ça correspond à ce que tu recherches

Il suffit de mettre un timer et de le démarrer quand tu cliques sur Fermeture. Quand le timer est actif, tu indiques « Fermeture » à la place de « Fermé ». Quand ta porte arrive en fin de course et que ton capteur change d’état, tu arrêtes le timer et tu le réinitialises.

1 - Créer une entrée « Minuteur » (timer) et la définir sur 20 secondes
2 - créer une entrée « Liste déroulante » et ajouter 3 éléments à la liste : « Fermé », « Ouvert », « Fermeture »
2 - modifier le script utilisé lors de l’appui sur le bouton « Fermeture » en ajoutant le démarrage du timer
3 - créer une automatisation avec en déclencheur le passage du timer de « Inactif » à « Actif » avec en action définir l’input_select (liste déroulante) sur « Fermeture »
4 - créer une automatisation vec en déclencheur le passage du timer de « Actif » à « Inactif » avec en action définir l’input_select (liste déroulante) sur « Fermé »
etc.

Ceci dit, si ton problème est de savoir si la commande de fermeture a été prise en compte

, je ne vois pas d’autre solution que d’installer un contact de détection de la position ouverte. Toute les autres solution proposées ne peuvent pas créer une information qui n’existe pas dans le système.

1 « J'aime »

OK, merci pour ton retour, il y a beaucoup de notions (timer, liste déroulante…) que je ne connais pas encore, mais je m’attèle au truc, …

aller c’est parti…

1 - Créer une entrée « Minuteur » (timer) et la définir sur 20 secondes

2 - créer une entrée « Liste déroulante » et ajouter 3 éléments à la liste : « Fermé », « Ouvert », « Fermeture »

2 - modifier le script utilisé lors de l’appui sur le bouton « Fermeture » en ajoutant le démarrage du timer

==> Là je bloque sur cette partie je ne sais pas comment faire !!

3 - créer une automatisation avec en déclencheur le passage du timer de « Inactif » à « Actif » avec en action définir l’input_select (liste déroulante) sur « Fermeture »

alias: Fermeture porte garage
description: ""
triggers:
  - trigger: state
    entity_id:
      - timer.minuteur_porte_garage
    from: idle
    to: active
conditions: []
actions:
  - action: input_select.select_option
    metadata: {}
    data:
      option: Fermeture
    target:
      entity_id: input_select.etats_porte_garage
mode: single

4 - créer une automatisation vec en déclencheur le passage du timer de « Actif » à « Inactif » avec en action définir l’input_select (liste déroulante) sur « Fermé »
etc.

alias: Porte garage fermée
description: ""
triggers:
  - trigger: state
    entity_id:
      - timer.minuteur_porte_garage
    from: active
    to: idle
conditions: []
actions:
  - action: input_select.select_option
    metadata: {}
    data:
      option: Fermé
    target:
      entity_id: input_select.etats_porte_garage
mode: single

Qu’est ce qui déclenche la fermeture de ta porte de garage quand tu appuies sur le bouton de droite ?

Oui effectivement c’est le bouton de droite…
le code Yaml

type: custom:mushroom-cover-card
entity: cover.porte_garage
show_buttons_control: true
name: "porte Garage "
tap_action:
  action: perform-action
  perform_action: timer.start
  target:
    entity_id: timer.minuteur_porte_garage
card_mod:
  style: |
    ha-state-icon {
     {% set state = states('cover.porte_garage') %}
     {% if state == 'open' %}
       color: green;
       --card-mod-icon: mdi:window-shutter-open;
     {% else %}
       color: red;
       --card-mod-icon: mdi:window-shutter;
     {% endif %}  
    }

merci pour ton aide car je patine dans la semoule… :woozy_face:

Là, à priori, quand tu cliques sur le bouton de droite, ça ne fait que déclencher ton timer. La partie qui actionne l’entité permettant de descendre (ou fermer) ta porte de garage n’est pas accessible directement en Yaml.
Je n’utilise pas les cartes mushrooms donc c’est un peu compliqué pour moi de t’aider avec cette carte. Je peux te faire un exemple fonctionnel avec une custom:button-card (sans card_mod). tout ce qu’il me faudrait c’est l’entité sur laquelle agit ta carte mushroom.

J’ai refais un test ça déclenche bien la fermeture de la porte de garage, mais je ne vois pas l’indication « fermeture »…

sinon le template dans le fichier configuration.yaml

      porte_garage:
        device_class: garage
        friendly_name: "Commande porte garage"
        value_template: "{{ is_state('binary_sensor.porte_garage', 'on') }}"
        open_cover:
          - service: switch.turn_on
            target:
              entity_id: switch.sonoff_100173bbc2
        close_cover:
          - service: switch.turn_on
            target:
              entity_id: switch.sonoff_100173bbc2

Bonjour. Merci pour ton retour, mais j’ai essayé de comprendre comment ça fonctionne et je n’y suis pas parvenu. :woozy_face:

essai

Voici un exemple fonctionnel avec custom:button-card.

Voici le code :

type: custom:button-card
name: Porte Garage
label: |
  [[[
    if (states['timer.essai_timer'].state === 'active') return 'Fermeture';
    if (states['input_boolean.essai_capteur_garage'].state === 'off') return 'Ouverte';
    if (states['input_boolean.essai_capteur_garage'].state === 'on') return 'Fermée';
    return 'État inconnu';
  ]]]
show_label: true
custom_fields:
  my_icon:
    card:
      type: custom:button-card
      icon: |
        [[[
          if (states['timer.essai_timer'].state === 'active') return 'mdi:window-shutter-cog';
          if (states['input_boolean.essai_capteur_garage'].state === 'off') return 'mdi:window-shutter-open';
          if (states['input_boolean.essai_capteur_garage'].state === 'on') return 'mdi:window-shutter';
          return 'mdi:window-shutter-alert';
        ]]]
      styles:
        card:
          - background-color: rgba(44,44,44,1)
          - border-radius: 50%
          - width: 60px
          - height: 60px
          - display: flex
          - align-items: center
          - justify-content: center
          - pointer-events: none
          - cursor: default
        icon:
          - color: |
              [[[
                if (states['timer.essai_timer'].state === 'active') return 'orange';
                if (states['input_boolean.essai_capteur_garage'].state === 'off') return 'red';
                if (states['input_boolean.essai_capteur_garage'].state === 'on') return 'green';
                return 'lightgray';
              ]]]
          - animation: |
              [[[
                return states['timer.essai_timer'].state === 'active' ? 'blink 1.5s infinite' : 'none';
              ]]]
          - width: 40px
  button_up:
    card:
      type: custom:button-card
      icon: mdi:arrow-up
      tap_action:
        action: call-service
        service: script.essai_garage_ouverture
      styles:
        card:
          - background-color: rgba(44,44,44,1)
          - width: 105px
          - height: 42px
          - pointer-events: |
              [[[
                return states['input_boolean.essai_capteur_garage'].state === 'on' ? 'auto' : 'none';
              ]]]
          - cursor: |
              [[[
                return states['input_boolean.essai_capteur_garage'].state === 'on' ? 'pointer' : 'default';
              ]]]
        icon:
          - color: |
              [[[
                return states['input_boolean.essai_capteur_garage'].state === 'on' ? 'rgba(255,255,255,0.8)' : 'rgba(255,255,255,0.1)';
              ]]]
  button_down:
    card:
      type: custom:button-card
      icon: mdi:arrow-down
      tap_action:
        action: call-service
        service: script.essai_garage_fermeture
      styles:
        card:
          - background-color: rgba(44,44,44,1)
          - width: 105px
          - height: 42px
          - pointer-events: |
              [[[
                return states['input_boolean.essai_capteur_garage'].state === 'off' ? 'auto' : 'none';
              ]]]
          - cursor: |
              [[[
                return states['input_boolean.essai_capteur_garage'].state === 'off' ? 'pointer' : 'default';
              ]]]
        icon:
          - color: |
              [[[
                return states['input_boolean.essai_capteur_garage'].state === 'off' ? 'rgba(255,255,255,0.8)' : 'rgba(255,255,255,0.1)';
              ]]]
styles:
  card:
    - height: 130px
    - width: 250px
    - background-color: rgba(28, 28, 28, 1)
    - border-radius: 12px
    - box-shadow: none
    - border: 1px solid rgba(44,44,44,1)
    - pointer-events: |
        [[[
          return (['Ouverte', 'Fermée'].includes(states['input_select.essai_garage'].state)) ? 'none' : 'auto';
        ]]]
    - cursor: |
        [[[
          return (['Ouverte', 'Fermée'].includes(states['input_select.essai_garage'].state)) ? 'default' : 'pointer';
        ]]]
  grid:
    - grid-template-areas: >-
        "my_icon n" "my_icon l" "button_up button_down" "timer_status
        timer_status"
    - grid-template-columns: 70px auto
    - grid-template-rows: 30px 40px 42px 42px
    - align-items: flex-start
    - padding-left: 10px
  name:
    - font-size: 14px
    - font-weight: bold
    - color: rgba(255,255,255,0.8)
    - justify-self: start
    - text-align: left
  label:
    - font-size: 12px
    - color: |
        [[[
          const s = states['timer.essai_timer'].state;
          return s === 'active' ? 'orange' : 'rgba(255,255,255,0.8)';
        ]]]
    - justify-self: start
    - text-align: left
    - margin-top: 4px
  custom_fields:
    button_up:
      - position: absolute
      - top: 80px
      - left: 15px
    button_down:
      - position: absolute
      - top: 80px
      - right: 15px

Pour l’utiliser, il te faut custom:button-card et copier le code complet dans une nouvelle carte.
Il faudra remplacer timer.essai_timer par ton propre minuteur. input_boolean.essai_capteur_garage par ton capteur de fermeture de ta porte du garage et input_select.essai_garage par ta liste déroulante.

Par ailleurs, il te faudra un script pour la fermeture et un script pour l’ouverture :

sequence:
  - action: timer.start
    metadata: {}
    data: {}
    target:
      entity_id: timer.essai_timer
  - action: input_select.select_option
    metadata: {}
    data:
      option: Fermeture
    target:
      entity_id: input_select.essai_garage
alias: essai_garage_fermeture
description: ""
sequence:
  - action: input_boolean.turn_off
    metadata: {}
    data: {}
    target:
      entity_id: input_boolean.essai_capteur_garage
  - action: input_select.select_option
    metadata: {}
    data:
      option: Ouverte
    target:
      entity_id: input_select.essai_garage
alias: essai_garage_ouverture
description: ""

Si tu as des questions, n’hésites pas.

La vache… Sacré boulot…je suis absent quelques jours mais je suis impatient de pouvoir tester ça dès mon retour !
Un grand merci.

Pas de souci, teste ça tranquillement quand tu pourras et n’hésites pas à poser des questions si besoin. Il est possible aussi d’utiliser le timer pour l’ouverture (avec les états de ton capteur de fermeture et notamment le passage de fermé à ouvert et inversement) mais l’idéal, comme l’a dit @Gilles2 c’est de mettre un capteur d’ouverture.

J’ai commencé a me mettre sur le truc, mais déjà des questions, mon capteur (contact de fermeture) c’est binary_sensor.porte_garage il faut que je le transforme en boolean ?

Salut, non tu dois utiliser ton capteur. J’ai mis un boolean pour te donner un exemple.

Par définition, un capteur d’ouverture, de vibrations, de mouvement, etc. c’est un boolean (ouvert ou fermé, true ou false, etc.)

ok alors je continu…en tapant le code j’ai déjà ça !!


le code en mettant mes entités

type: custom:button-card
name: Porte Garage
label: |
  [[[
    if (states['timer.timergarage'].state === 'active') return 'Fermeture';
    if (states['binary_sensor.porte_garage'].state === 'off') return 'Ouverte';
    if (states['binary_sensor.porte_garage'].state === 'on') return 'Fermée';
    return 'État inconnu';
  ]]]
show_label: true
custom_fields:
  my_icon:
    card:
      type: custom:button-card
      icon: |
        [[[
          if (states['timer.timergarage'].state === 'active') return 'mdi:window-shutter-cog';
          if (states['binary_sensor.porte_garage'].state === 'off') return 'mdi:window-shutter-open';
          if (states['binary_sensor.porte_garage'].state === 'on') return 'mdi:window-shutter';
          return 'mdi:window-shutter-alert';
        ]]]
      styles:
        card:
          - background-color: rgba(44,44,44,1)
          - border-radius: 50%
          - width: 60px
          - height: 60px
          - display: flex
          - align-items: center
          - justify-content: center
          - pointer-events: none
          - cursor: default
        icon:
          - color: |
              [[[
                if (states['timer.timergarage'].state === 'active') return 'orange';
                if (states['binary_sensor.porte_garage'].state === 'off') return 'red';
                if (states['binary_sensor.porte_garage'].state === 'on') return 'green';
                return 'lightgray';
              ]]]
          - animation: |
              [[[
                return states['timer.timergarage'].state === 'active' ? 'blink 1.5s infinite' : 'none';
              ]]]
          - width: 40px
  button_up:
    card:
      type: custom:button-card
      icon: mdi:arrow-up
      tap_action:
        action: call-service
        service: script.essai_garage_ouverture
      styles:
        card:
          - background-color: rgba(44,44,44,1)
          - width: 105px
          - height: 42px
          - pointer-events: |
              [[[
                return states['binary_sensor.porte_garage'].state === 'on' ? 'auto' : 'none';
              ]]]
          - cursor: |
              [[[
                return states['binary_sensor.porte_garage'].state === 'on' ? 'pointer' : 'default';
              ]]]
        icon:
          - color: |
              [[[
                return states['binary_sensor.porte_garage'].state === 'on' ? 'rgba(255,255,255,0.8)' : 'rgba(255,255,255,0.1)';
              ]]]
  button_down:
    card:
      type: custom:button-card
      icon: mdi:arrow-down
      tap_action:
        action: call-service
        service: script.essai_garage_fermeture
      styles:
        card:
          - background-color: rgba(44,44,44,1)
          - width: 105px
          - height: 42px
          - pointer-events: |
              [[[
                return states['binary_sensor.porte_garage'].state === 'off' ? 'auto' : 'none';
              ]]]
          - cursor: |
              [[[
                return states['binary_sensor.porte_garage'].state === 'off' ? 'pointer' : 'default';
              ]]]
        icon:
          - color: |
              [[[
                return states['binary_sensor.porte_garage'].state === 'off' ? 'rgba(255,255,255,0.8)' : 'rgba(255,255,255,0.1)';
              ]]]
styles:
  card:
    - height: 130px
    - width: 250px
    - background-color: rgba(28, 28, 28, 1)
    - border-radius: 12px
    - box-shadow: none
    - border: 1px solid rgba(44,44,44,1)
    - pointer-events: |
        [[[
          return (['Ouverte', 'Fermée'].includes(states['input_select.etatportegarage'].state)) ? 'none' : 'auto';
        ]]]
    - cursor: |
        [[[
          return (['Ouverte', 'Fermée'].includes(states['input_select.etatportegarage'].state)) ? 'default' : 'pointer';
        ]]]
  grid:
    - grid-template-areas: >-
        "my_icon n" "my_icon l" "button_up button_down" "timer_status
        timer_status"
    - grid-template-columns: 70px auto
    - grid-template-rows: 30px 40px 42px 42px
    - align-items: flex-start
    - padding-left: 10px
  name:
    - font-size: 14px
    - font-weight: bold
    - color: rgba(255,255,255,0.8)
    - justify-self: start
    - text-align: left
  label:
    - font-size: 12px
    - color: |
        [[[
          const s = states['timer.timergarage'].state;
          return s === 'active' ? 'orange' : 'rgba(255,255,255,0.8)';
        ]]]
    - justify-self: start
    - text-align: left
    - margin-top: 4px
  custom_fields:
    button_up:
      - position: absolute
      - top: 80px
      - left: 15px
    button_down:
      - position: absolute
      - top: 80px
      - right: 15px

j’attaque les scripts :grinning:

On est pas mal, là, pour un début :crazy_face:

Sinon, je n’ai plus internet depuis 01h00 du matin. Je passe par mon téléphone portable là et la connexion n’est pas top donc si tu n’as pas de réponse, ne t’étonnes pas trop…

Est-ce qu’il y a quelqu’un qui utilise Starlink sur le forum. Si oui, ça marche bien ?

Avant d’avoir la 4G j’avais une connexion STARLINK, c’est ultra stable et ça fonctionne feu de dieu, mais c’est cher ! 50€ par mois