Button-card ouverture fermeture et état porte garage

Bonjour,

Mon problème

Je me permets d’ouvrir ce sujet car je ne n’arrive pas à trouver une solution à mon problème, j’ai beau tourner mon code en vain.

J’ai installé un module zigbee (tuya TS0603) de porte de garage qui marche bien.
Maintenant je souhaite ajouter UN bouton à mon dashboard pour ouvrir, fermer et donner l’état.

Voici mon code, qui fonctionne pour ouvrir et donner l’état mai je n’arrive pas à fermer, il me manque une condition « si la capteur retourne une valeur off alors switch.turn_on ».

type: custom:button-card
entity: binary_sensor.garage_garage_door_contact
icon: mdi:garage-variant
show_icon: true
show_state: false
show_name: false
size: 20%
state:
  - value: "off"
    icon: mdi:garage-variant
  - value: "on"
    icon: mdi:garage-open-variant
    color: red
tap_action:
  action: call-service
  service: switch.turn_off
  target: null
  entity_id: switch.garage_state

Merci d’avance pour votre aide.

Ma configuration


System Information

version core-2026.3.4
installation_type Home Assistant OS
dev false
hassio true
docker true
container_arch aarch64
user root
virtualenv false
python_version 3.14.2
os_name Linux
os_version 6.12.47-haos-raspi
arch aarch64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
HACS Data ok
GitHub API Calls Remaining 5000
Installed Version 2.0.5
Stage running
Available Repositories 2931
Downloaded Repositories 19
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 17.1
update_channel stable
supervisor_version supervisor-2026.03.2
agent_version 1.8.1
docker_version 29.1.3
disk_total 109.3 GB
disk_used 5.7 GB
nameservers 2001:861:4140:8b40:d627:ffff:fe0d:f644, 192.168.1.254
healthy true
supported true
host_connectivity true
supervisor_connectivity true
ntp_synchronized true
virtualization
board rpi4-64
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (10.0.2), File editor (5.8.0), Mosquitto broker (6.5.2), Zigbee2MQTT (2.9.1-1), eufy-security-ws (2.1.0), go2rtc (1.9.14)
Dashboards
dashboards 4
resources 15
views 5
mode storage
Network Configuration
adapters lo (disabled), end0 (enabled, default, auto), hassio (disabled), docker0 (disabled), veth06d2a1d (disabled), veth3f8ae30 (disabled), veth8ea32cf (disabled), veth07164ed (disabled), vethb257f73 (disabled), vethea3537b (disabled), veth3c7482f (disabled), vethfc71d71 (disabled), veth6d4c2de (disabled)
ipv4_addresses lo (127.0.0.1/8), end0 (192.168.1.2/24), hassio (172.30.32.1/23), docker0 (172.30.232.1/23), veth06d2a1d (), veth3f8ae30 (), veth8ea32cf (), veth07164ed (), vethb257f73 (), vethea3537b (), veth3c7482f (), vethfc71d71 (), veth6d4c2de ()
ipv6_addresses lo (::1/128), end0 (2001:861:4140:8b40:552d:c895:4a3c:4b6b/64, fe80::a3f8:b8ed:3ae8:e9bc/64), hassio (fe80::945d:eff:fe6f:b48d/64), docker0 (fe80::fce4:3dff:fe1f:f913/64), veth06d2a1d (fe80::e892:70ff:fe91:d817/64), veth3f8ae30 (fe80::a496:55ff:fe9e:ff6c/64), veth8ea32cf (fe80::409:4dff:fe18:6703/64), veth07164ed (fe80::68ac:b7ff:fe11:1957/64), vethb257f73 (fe80::6876:bfff:feb7:66d4/64), vethea3537b (fe80::461:64ff:feda:c68d/64), veth3c7482f (fe80::a46f:2cff:fe53:21eb/64), vethfc71d71 (fe80::d879:4eff:fe18:a3f5/64), veth6d4c2de (fe80::6431:13ff:fe80:17af/64)
announce_addresses 192.168.1.2, 2001:861:4140:8b40:552d:c895:4a3c:4b6b, fe80::a3f8:b8ed:3ae8:e9bc
Recorder
oldest_recorder_run 10 mars 2026 à 23:16
current_recorder_run 28 mars 2026 à 22:40
estimated_db_size 76.48 MiB
database_engine sqlite
database_version 3.49.2
___

Salut,
Fais une automatisation qui vas gérer cela et appelle ton automatisation sur la tap_action

Merci pour ta réponse @ddfdom, mais je ne suis pas sur de savoir comment on appelle l’automatisation sur la tap_action.

Pa exemple je viens de créer l’automatisation ouvrir garage ci-dessous, j’ai fait pareil pour la fermeture aussi:

Salut

Si c’est un bouton, pourquoi faire un turn_off. Pour moi sur un bouton il n’y a que que du turn _on à faire.

par contre pardon c’est un script et pas une automatisation (ça ne change pas grand chose)
et j’utilise ce code dans custom buton card

tap_action:
  action: call-service
  service: script.lock_and_go

Hello,

Tu as tenté avec ? je ne connais pas le module

tap_action:
  action: call-service
  service: switch.toggle

cdt

salut ,
une simple carte button ne te conviendrais pas ?

show_name: true
show_icon: true
type: button
entity: switch.0xa4c138f6b1522d5f_l2
show_state: true
name: garage
tap_action:
  action: more-info
hold_action:
  action: toggle
uix:
  style: |
    :host {
      --uix-icon-color: 
      {% if states('binary_sensor.capteur_ouverture_fin_de_course') == 'on' %}
      lightskyblue;
      {% else %}
      grey;
      {% endif %}
      --secondary-text-color:
      salmon;
      --uix-icon:
      {% if states('binary_sensor.capteur_ouverture_fin_de_course') == 'on' %}
      mdi:garage-open-variant;
      {% else %}
      mdi:garage-variant;
      {% endif %}
      }
    ha-card {
      color: lightskyblue;
      --ha-card-background: rgba(0,0,0,0);
    }


Salut à tous, désolé petit soucis de santé du coup j’ai pas pu me connecter.

J’ai essayé toutes les solutions proposées et rien ne fonctionne pour l’instant. je suis sur que ça viens de moi. Voici les erreurs ou problème que je rencontre

@ddfdom: je n’ai pas réussi à faire le script du coup j’ai un peu abandonné.

@Tochy: Échec de l’exécution de l’action switch/turn_on. expected a dictionary for dictionary value @ data[‹ target ›]. Got None

@freetronic: Échec de l’exécution de l’action switch/toggle. must contain at least one of entity_id, device_id, area_id, floor_id, label_id.

@lopesmaxime: c’est exactement la solution que je cherche même le code uix ne semble pas fonctionner chez moi pourtant uix est bien installé (je viens de l’installer à la place de card-mod).

voici mon nouveau code


show_name: true
show_icon: true
type: button
entity: switch.garage_state
show_state: true
name: garage
tap_action:
  action: more-info
hold_action:
  action: toggle
uix:
  style: |
    :host {
      --uix-icon-color: 
      {% if states('binary_sensor.garage_garage_door_contact) == 'on' %}
      lightskyblue;
      {% else %}
      grey;
      {% endif %}
      --secondary-text-color:
      salmon;
      --uix-icon:
      {% if states('binary_sensor.garage_garage_door_contact') == 'on' %}
      mdi:garage-open-variant;
      {% else %}
      mdi:garage-variant;
      {% endif %}
      }
    ha-card {
      color: lightskyblue;
      --ha-card-background: rgba(0,0,0,0);
    }

Et tu as mis quoi dans ton script ?
Il y’a juste une condition
Lorsque tu déclenche le script si la porte est ouverte alors tu fermes sinon tu ouvres

Pas bien compliqué

Mais sinon module supporte le ronfle effectivement autant l’utiliser c’est bien plus simple

Si je compare avec le code de @lopesmaxime il manque l’apostrophe a la fin de binary_sensor.garage_garage_door_contact

Bonjour,
pas besoin de passer par la carte button et uix, tu peux tout faire avec button-card.

type: custom:button-card
entity: switch.garage_state
icon: | 
  [[[
   return states['binary_sensor.garage_garage_door_contact'].state == "on" ? "mdi:garage-open-variant" : "mdi:garage-variant";
  ]]]
color: |
  [[[
   return states['binary_sensor.garage_garage_door_contact'].state == "on" ? "red" : "green";
  ]]]
show_icon: true
show_state: false
show_name: false
size: 20%

Merci beaucoup @WarC0zes, c’est exactement ce que je cherchais. Juste une petite question: avec ce code je suis obligé d’appuyer 2 fois pour fermer. Il y aurai un moyen pour améliorer ça?
Et aussi les couleurs restent blanche ou bleu, le rouge et vert comme demandé ne semblent pas être pris en compte.
Merci

Non, tu cliques sur la carte et ça toggle le switch. j’ai pas testé le code, mais ça devrait être bon, je vérifierai quand j’ai 5 min.

edit :
Voici le code corrigé. :wink:

type: custom:button-card
entity: switch.garage_state
icon: | 
  [[[
   return states['binary_sensor.garage_garage_door_contact'].state == "on" ? "mdi:garage-open-variant" : "mdi:garage-variant";
  ]]]
show_icon: true
show_state: false
show_name: false
size: 20%
styles:
  icon:
    - color: |
        [[[
         return states['binary_sensor.garage_garage_door_contact'].state == "on" ? "red" : "green";
        ]]]

J’ai fait une automatisation pour ça :

alias: Basculer Bouton Porte Garage
description: ""
mode: single
triggers:
  - type: turned_on
    device_id: 9435c84d518b27aef2d31ceb799f48dd
    entity_id: 14fb1d215a8d0c59d24b86751e89043f
    domain: switch
    trigger: device
conditions: []
actions:
  - delay:
      hours: 0
      minutes: 0
      seconds: 0
      milliseconds: 50
  - type: turn_off
    device_id: 9435c84d518b27aef2d31ceb799f48dd
    entity_id: 14fb1d215a8d0c59d24b86751e89043f
    domain: switch

Si ça t’intérresse moi j’ai fais ça comme carte :

Nickel merci, la couleur est maintenant bon.

Mais je confirme bien que je dois appuyer 2 fois pour fermer.
Enfaite le switch fonctionne comme ceci dans zigbee2mqtt:
pour fermer il faut qu’il part de l’état « vrai » vers « faux » donc quand je l’ouvre il passe de vrai à faux donc ok, mais quand je ferme, j’appuie une 1ère fois Faux vers Vrai NOK et une 2ème fois de Vrai vers Faux donc OK.

Ça, je ne saurais pas te dire. C’est plus un problème de ton module, pas de la carte.

surement passer par une automatisation comme utilise @Popoff

et tu utilises l’automatisation dans la carte avec un tap_action.

bonjour
normalement tu swich sur contact sec donc tu devrais avoir le reglage du inching que tu regle sur 1s comme sa il repasse a OFF automatiquement apres la durée defini .

Si il a le même type de module que moi il n’y a pas de réglages.

@Loul1 je n’ai pas été assez précis. Comme dit @WarC0zes mon automatisation permet de faire ce que tu souhaites je pense.

En fait ton module génère un interrupteur on/off sauf que le contact ne s’active uniquement quand tu passe de off à on.

L’automatisation sert du coup à basculer l’interrupteur sur off 50ms après qu’il ait été mis sur on.

Ainsi la fois suivante tu peus rappuyer dessus pour que le contact s’active.

Merci @WarC0zes et @popoff, les 2 solutions proposées fonctionnent très bien :slightly_smiling_face: