Activer plusieurs appareils différents avec un seul bouton sur Lovelace

Bonjour,

J’ai installé un module Shelly 1 pour commander mon portail (contact sec 24V) ainsi que le système Meross (simple) pour commander l’ouverture de mon unique porte de garage.
J’aimerais bien ouvrir ou fermer ces 2 portes via un seul bouton.
J’ai essayé plusieurs solutions mais c’est pas le top:

  1. Une automatisation, mais ce ,n’est pas le plus propre car les actions s’effectuent les unes après les autres et en plus, la manière dont Lovelace les présente n’est pas géniale.
  2. Créer un script: à nouveau, ça fonctionne mais je n’arrive pas à avoir un bouton toggle, je dois cliquer sur un texte où il est marqué Exécuter.
  3. Créer un groupe dans les entrées, mais cela ne fonctionne qu’avec des entités du même type.
  4. Toujours dans les entrées, j’ai créé un bouton, puis une automatisation qui dit que quand j’appuie sur ce bouton, les 2 portes doivent s’ouvrir. J’ai peut-être mal configuré car rien ne se passe… En même temps, c’est la première fois que j’utilise les entrées et j’ai peut-être fait un truc de travers.

Bref, si quelqu’un a une bonne idée ou expérience pour actionner 2 entités différentes avec un seul bouton, je suis preneur.

Merci pour vos lumières.

Ma configuration


[center]## System Information

version core-2024.4.3
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.12.2
os_name Linux
os_version 6.1.73-haos-raspi
arch aarch64
timezone Europe/Brussels
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 5000
Installed Version 1.34.0
Stage running
Available Repositories 1400
Downloaded Repositories 36
HACS Data ok
Home Assistant Cloud
logged_in true
subscription_expiration 28 avril 2024 à 02:00
relayer_connected true
relayer_region eu-central-1
remote_enabled true
remote_connected true
alexa_enabled false
google_enabled true
remote_server eu-central-1-19.ui.nabu.casa
certificate_status ready
instance_id f0fd017040d14711b17f54352dde68e6
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 12.2
update_channel stable
supervisor_version supervisor-2024.04.0
agent_version 1.6.0
docker_version 25.0.5
disk_total 116.6 GB
disk_used 10.3 GB
healthy true
supported true
board rpi5-64
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.13.0), File editor (5.8.0), Samba share (12.3.1), Home Assistant Google Drive Backup (0.112.1), Studio Code Server (5.15.0), Spotify Connect (0.13.0), OpenThread Border Router (2.5.1), Matter Server (5.5.1), Mosquitto broker (6.4.0)
Dashboards
dashboards 2
resources 33
views 6
mode storage
Recorder
oldest_recorder_run 13 avril 2024 à 04:43
current_recorder_run 23 avril 2024 à 18:14
estimated_db_size 559.07 MiB
database_engine sqlite
database_version 3.44.2
Spotify
api_endpoint_reachable ok
[/center] Comment récupérer ma configuration : Dans votre HA, Menu latéral `Paramètres` > `Système` > `Corrections` puis les trois petits points en haut a droite > `Informations Système` puis une fois en bas `Copier` ___

Tu utilise le service switch.toggle et tu lui fait activer tes deux entitées.

Je connaissais pas encore bien les services :sweat_smile:
Mais ma porte de garage n’apparait pas dans les appareils car c’est un volet roulant (cover) alors que mon garage est un switch …

Il y a une autre possibilité ?

Une automatisation qui déclanche les actions l’une apres l’autre. Il n’y aura que quelques centimètres de seconde entre les deux.

1 « J'aime »

Ah bien oui, c’etait ma premiere idée… bon, je vais y revenir alors :slightly_smiling_face:
Merci pour tes réponses

Par contre, je n’arrive pas à créer un bouton cliquable directement sur ma carte Lovelace: c’est l’automatisation qui peut être activée ou pas via un toggle mais je suis obligé d’ouvir l’automatisation pour aller cliquer sur « Exécuter ». Y a t il un moyen de récupérer l’action « exécuter » directement ?

Tu crée une carte bouton et dans les actions tu sélectionnes lancer un service. Tu sélectionnes le service qui lance une automatisation.

Merci, tu m’as mis sur la voie avec la carte « bouton ». Mais je n’arrivais pas à lancer le service de l’automatisation. A mon avis, je ne choisissais pas la bonne entité , bien que j’ai bien compris comment choisir l’action pour lancer le service d’une automatisation…
Bref, comme je présente les données dans un horizontal stack, je me suis dis que je pouvais aussi peut-être créer une entrée bouton. Ensuite, j’ai créé mon automatisation avec l’appui sur ce bouton comme déclencheur. Enfin, j’ai intégré cela dans ma carte horizontal stack en m’inspirant du code yaml de la carte bouton. Cela donne ce qui suit et ça fonctionne, mais la mise en forme visuelle de ma carte Lovelace n’est pas géniale…
Précisions:

  • Les toggles du garage (entité de type cover) et du portail (entité de type interrupteur) n’agissent pas de la même manière, même si le visuel de l’état ouvert ou fermé est le même.
  • La manière dont il est renvoyé aux états ouvert ou fermé n’est pas la même non plus: avec le portail, j’ai utilisé un Shelly Plus 1 et j’ai utilisé le contact SW pour récupérer le signal envoyé par la carte électronique du portail normalement pour une lampe (et j’ai réglé la carte du portail comme quoi la lampe doit être allumée quand le portail est ouvert).

Tout cela rend compliqué la présentation visuelle, et je ne maîtrise pas encore bien les rouages de Home Assistant encore assez nouveau pour moi.

Mais j’ai pas trouvé d’autre chemin… J’aurais peut-être pu faire plus simple…

Tu sélectionnes quoi comme entité pour la carte Bouton quand tu lances un service d’automation ?

image

type: horizontal-stack
cards:
  - type: horizontal-stack
    cards:
      - type: entities
        entities:
          - entity: input_button.portail_et_garage
            show_name: true
            show_icon: true
            toggle: true
            show_state: false
            tap_action:
              action: toggle
          - entity: switch.portail_switch_0
            type: custom:multiple-entity-row
            name: Portail
            icon: mdi:gate
            show_state: false
            state_color: true
            toggle: true
            entities:
              - entity: switch.portail_switch_0
                name: false
                toggle: true
              - icon: ' '
                styles:
                  width: 67px
                  text-align: left;
              - entity: binary_sensor.shellyplus1_e465b8f31738_input_0_input
                name: false
                styles:
                  width: 75px
                  text-align: right;
          - entity: cover.porte_de_garage
            type: custom:multiple-entity-row
            name: Garage
            icon: mdi:garage
            show_state: false
            state_color: false
            toggle: false
            entities:
              - entity: cover.porte_de_garage
                name: false
                toggle: true
              - icon: ' '
                styles:
                  width: 100px
                  text-align: left;
              - entity: cover.porte_de_garage
                name: false

Salut,

En fait tu aurais pu faire sans créer d’entrée bouton, et sans automatisations, mais avec une carte bouton qui lance un script… mais bon ça donne le même résultat au final.
Sur une carte bouton, si tu n’as pas d’entité, tu peux en choisir n’importe laquelle, à partir du moment que tu changes l’action en « appeler un service »… ça n’a pas d’importance.

Pour la visualisation, tu voudrais quoi comme résultat idéalement?

Idéalement, j’aimerais bien 3 boutons un à côté de l’autre sur lesquels il suffit que j’appuie pour ouvrir ou fermer, comme j’ai fait ici avec mes luminaires mais en en prenant 3: Portail et Garage, Portail, Garage. S’il faut mettre un bouton, j’aimerais autant que ce soit celui que j’ai entouré, autrement un simple appui sur l’icône est encore mieux.

Ce qui complique, c’est de renvoyer l’état ouvert ou fermé du portail et du garage…

On saurait faire cela ?

image

Bonjour Matt1

Ce qui complique, c’est de renvoyer l’état ouvert ou fermé du portail et du garage…

Tout dépend de quel état il est question, théorique ou physique.
Le physique récupère la valeur des contacteurs de butée ouverture et fermeture.
Le presque physique analyse la durée d’ouverture et fermeture par le courant consommé.
La théorie indique simplement dans quel état devrait être le portail ou le garage.

Que se passe-t-il si un objet ou un enfant ou la belle-mère est coincé et bloque le mécanisme ?

Il n’y aura que quelques :rofl: centimètres :joy: de seconde entre les deux.

Bonjour,
Il s’agit d’un état physique. Quand le portail arrive en ouverture complète, j’ai programmé la carte électronique pour qu’elle envoie un signal (normalement pour allumer une lampe de portail, lampe que je n’ai pas installée). Dans les options programmables, j’aurais tout aussi bien pu demander un signal quand le portail est fermé, quand il s’ouvre, quand il est ouvert à moitié,… il y a plusieurs options.
J’ai installé le module de cette manière pour éviter de devoir rajouter des capteurs et des fils pas très gracieux…
Quand il y a un objet détecté dans le chemin (avant de le toucher car j’ai un capteur qui détecte les objets ou les personnes installé avec le portail), alors le portail s’arrête. Cela m’évite aussi de défoncer ma voiture si jamais je fais une fausse manipulation en passant dans l’ouverture :sweat_smile:
Les centimètres de secondes :joy:
J’avais pas relevé… :joy:

Tout ce que tu veux faire est facilement faisable avec une carte custom:button-card :
image

type: custom:button-card
aspect_ratio: 4/3
custom_fields:
  fond:
    card:
      type: custom:button-card
      styles:
        card:
          - background-color: rgba(255,255,255,0.0)
          - border: none
      tap_action:
        action: none
      hold_action:
        action: none
  ncarte:
    card:
      type: custom:button-card
      name: Maison
      styles:
        name:
          - font-size: 1.4em
          - font-weight: bold
          - justify-self: start
          - color: rgba(0,0,0,0.6)
        card:
          - background-color: rgba(255,255,255,0.0)
          - border: none
      tap_action:
        action: none
      hold_action:
        action: none
  ngarage:
    card:
      type: custom:button-card
      name: 'Garage :'
      aspect_ratio: 10/0.9
      styles:
        name:
          - font-size: 1.0em
          - font-weight: bold
          - justify-self: start
          - padding-left: 4%
          - color: rgba(0,0,0,0.6)
        card:
          - background-color: rgba(255,255,255,0.5)
      tap_action:
        action: none
      hold_action:
        action: none
  garage:
    card:
      type: custom:button-card
      aspect_ratio: 10/0.9
      show_icon: false
      name: |
        [[[
          if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'off' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on')
            return "(fermé)";
          else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'off')
            return "(ouvert)";
          else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_de_vibration_porte_du_garage_vibration'].state == 'on')
            return "(en mouvement)";
          else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_de_vibration_porte_du_garage_vibration'].state == 'off')
            return "(partiellement ouvert)";
        ]]]
      styles:
        name:
          - font-size: |
              [[[
                if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'off' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on')
                  return '1.0em';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'off')
                  return '1.0em';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_de_vibration_porte_du_garage_vibration'].state == 'on')
                  return '0.9em';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_de_vibration_porte_du_garage_vibration'].state == 'off')
                  return '0.8em';
              ]]]
          - font-weight: bold
          - align-self: end
          - color: |
              [[[
                if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'off' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on')
                  return 'rgba(0,128,0,0.7)';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'off')
                  return 'rgba(255,0,0,0.7)';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_de_vibration_porte_du_garage_vibration'].state == 'on')
                  return 'rgba(255,140,0,0.7)';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_de_vibration_porte_du_garage_vibration'].state == 'off')
                  return 'rgba(255,140,0,0.7)';
              ]]]
          - animation: |
              [[[
                if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'off')
                  return 'blink 2s ease infinite';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_de_vibration_porte_du_garage_vibration'].state == 'on')
                  return 'blink 2s ease infinite';
              ]]]
        card:
          - background-color: rgba(255,255,255,0.0)
          - border: none
          - padding-left: |
              [[[
                if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'off' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on')
                  return '20%';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'off')
                  return '20%';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_de_vibration_porte_du_garage_vibration'].state == 'on')
                  return '25%';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_de_vibration_porte_du_garage_vibration'].state == 'off')
                  return '30%';
              ]]]
          - padding-top: |
              [[[
                if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'off' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on')
                  return '8.2%';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'off')
                  return '8%';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_de_vibration_porte_du_garage_vibration'].state == 'on')
                  return '8%';
                else if (states['binary_sensor.garage_detecteur_de_fermeture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_d_ouverture_porte_du_garage_contact'].state == 'on' && states['binary_sensor.garage_detecteur_de_vibration_porte_du_garage_vibration'].state == 'off')
                  return '7.8%';
              ]]]
      tap_action:
        action: none
      hold_action:
        action: none
  nportail:
    card:
      type: custom:button-card
      name: 'Portail :'
      aspect_ratio: 10/0.9
      styles:
        name:
          - font-size: 1.0em
          - font-weight: bold
          - justify-self: start
          - padding-left: 4%
          - color: rgba(0,0,0,0.6)
        card:
          - background-color: rgba(255,255,255,0.7)
      tap_action:
        action: none
      hold_action:
        action: none
  portail:
    card:
      type: custom:button-card
      aspect_ratio: 10/0.9
      show_icon: false
      name: (fermé)
      styles:
        name:
          - font-size: 1.0em ]]]
          - font-weight: bold
          - align-self: end
          - color: rgba(0,128,0,0.7)
          - animation: ''
        card:
          - background-color: rgba(255,255,255,0.0)
          - border: none
          - padding-left: 20%
          - padding-top: 8.5%
      tap_action:
        action: none
      hold_action:
        action: none
  nlampe:
    card:
      type: custom:button-card
      name: Lampe extérieure
      styles:
        name:
          - font-size: 0.7em
          - font-weight: bold
          - color: rgba(0,0,0,0.6)
        card:
          - background-color: rgba(255,255,255,0.0)
          - border: none
      tap_action:
        action: none
      hold_action:
        action: none
  lampe:
    card:
      type: custom:button-card
      size: 75%
      entity: light.entree_lampe_exterieure_lumiere
      icon: phu:wall-fuzo
      show_name: false
      state:
        - value: 'off'
          styles:
            icon:
              - color: dimgray
            card:
              - box-shadow: none
              - border-radius: 50%
              - background-color: rgba(242,242,242,0.7)
              - width: 48px
              - height: 48px
        - value: 'on'
          styles:
            icon:
              - color: rgb(255,255,128)
            card:
              - border-radius: 50%
              - box-shadow: 0px 0px 6px 3px rgba(255,255,128,0.8)
              - background-color: rgba(0,0,0,0.5)
              - width: 48px
              - height: 48px
  nyann:
    card:
      type: custom:button-card
      name: Yannick
      styles:
        name:
          - font-size: 0.7em
          - font-weight: bold
          - color: rgba(0,0,0,0.6)
        card:
          - background-color: rgba(255,255,255,0.0)
          - border: none
      tap_action:
        action: none
      hold_action:
        action: none
  yann:
    card:
      type: custom:button-card
      aspect_ratio: 1/1
      size: 100%
      entity: device_tracker.yannick_lecorvaisier
      show_icon: false
      show_entity_picture: true
      show_name: false
      styles:
        card:
          - border-radius: 50%
          - background-color: rgba(255,255,255,0.7)
          - width: 48px
          - height: 48px
      state:
        - value: home
          entity_picture: /local/images/yannick_home.png
          styles:
            entity_picture:
              - opacity: 0.8
        - value: not_home
          entity_picture: /local/images/yannick_out.png
          styles:
            entity_picture:
              - opacity: 0.8
      tap_action:
        action: none
      hold_action:
        action: none
  nvero:
    card:
      type: custom:button-card
      name: Véronique
      styles:
        name:
          - font-size: 0.7em
          - font-weight: bold
          - color: rgba(0,0,0,0.6)
        card:
          - background-color: rgba(255,255,255,0.0)
          - border: none
      tap_action:
        action: none
      hold_action:
        action: none
  vero:
    card:
      type: custom:button-card
      aspect_ratio: 1/1
      size: 90%
      entity: device_tracker.veronique_lecorvaisier
      show_icon: false
      show_entity_picture: true
      show_name: false
      styles:
        card:
          - border-radius: 50%
          - background-color: rgba(255,255,255,0.7)
          - width: 48px
          - height: 48px
      state:
        - value: home
          entity_picture: /local/images/vero_home.png
          styles:
            entity_picture:
              - opacity: 0.8
        - value: not_home
          entity_picture: /local/images/vero_out.png
          styles:
            entity_picture:
              - opacity: 0.8
      tap_action:
        action: none
      hold_action:
        action: none
  garageup:
    card:
      type: custom:button-card
      show_name: false
      styles:
        card:
          - background-color: rgba(255,255,255,0.0)
          - background-image: url(/local/images/icones/garage_ouvrir.png)
          - background-size: cover
          - border: none
          - height: 48px
          - width: 48px
      tap_action:
        action: call-service
        service: script.garage_porte_du_garage_ouvrir
  garagestop:
    card:
      type: custom:button-card
      show_name: false
      styles:
        card:
          - background-color: rgba(255,255,255,0.0)
          - background-image: url(/local/images/icones/garage_stopper.png)
          - background-size: cover
          - border: none
          - height: 48px
          - width: 48px
      tap_action:
        action: call-service
        service: script.garage_porte_du_garage_arreter
  garagedown:
    card:
      type: custom:button-card
      show_name: false
      styles:
        card:
          - background-color: rgba(255,255,255,0.0)
          - background-image: url(/local/images/icones/garage_fermer.png)
          - background-size: cover
          - border: none
          - height: 48px
          - width: 48px
      tap_action:
        action: call-service
        service: script.garage_porte_du_garage_fermer
  port_open:
    card:
      type: custom:button-card
      show_name: false
      styles:
        card:
          - background-color: rgba(255,255,255,0.0)
          - background-image: url(/local/images/icones/portail_ouvrir.png)
          - background-size: cover
          - border: none
          - height: 48px
          - width: 48px
      tap_action:
        action: call-service
        service: script.ouvrir_portail
  port_close:
    card:
      type: custom:button-card
      show_name: false
      styles:
        card:
          - background-color: rgba(255,255,255,0.0)
          - background-image: url(/local/images/icones/portail_fermer.png)
          - background-size: cover
          - border: none
          - height: 48px
          - width: 48px
      tap_action:
        action: call-service
        service: script.fermer_portail
  ncourrier:
    card:
      type: custom:button-card
      entity: input_boolean.maison_courrier
      show_icon: false
      name: 'Courrier :'
      styles:
        name:
          - font-size: 0.7em
          - font-weight: bold
          - color: rgba(0,0,0,0.6)
      state:
        - value: 'off'
          styles:
            card:
              - background-color: rgba(255,255,255,0.0)
              - border: none
            name:
              - color: rgba(0,0,0,0.6)
        - value: 'on'
          styles:
            card:
              - background-color: rgba(255,0,0,0.7)
              - border: 1px solid lightgray
            name:
              - color: rgba(255,255,255,1.0)
      tap_action:
        action: none
      hold_action:
        action: none
  courrier:
    card:
      type: custom:button-card
      entity: input_boolean.maison_courrier
      show_name: false
      show_icon: false
      styles:
        card:
          - background-color: rgba(255,255,255,1.0)
          - background-image: url(/local/images/icones/courrier.png)
          - background-size: cover
          - border-radius: 50%
          - border: none
          - height: 48px
          - width: 48px
      state:
        - value: 'off'
          styles:
            card:
              - background-color: rgba(255,255,255,1.0)
        - value: 'on'
          styles:
            card:
              - background-color: rgba(255,0,0,1.0)
              - animation: shadowcolorswap 3s linear infinite
      extra_styles: |
        @keyframes shadowcolorswap {
          0% {
            box-shadow: none;
          }
          25% {
            box-shadow: 0px 0px 6px 3px rgba(255,0,0,0.8);
          }
          50% {
            box-shadow: none;
          }
          75% {
            box-shadow: 0px 0px 6px 3px rgba(255,0,0,0.8);
          }
          100% {
            box-shadow: none;
          }
      tap_action:
        action: call-service
        service: script.reinitialiser_courrier
styles:
  custom_fields:
    fond:
      - background-image: url(/local/images/maison.png)
      - position: absolute
      - left: 0
      - top: 0
      - width: 100%
      - height: 100%
      - background-size: cover
      - background-position: center
      - opacity: 0.5
    ncarte:
      - position: absolute
      - left: 10px
      - top: '-3px'
    ngarage:
      - width: 60%
      - position: absolute
      - left: 33%
      - top: 14%
    garage:
      - width: 60%
      - position: absolute
      - left: 33%
      - top: 14%
    nportail:
      - width: 60%
      - position: absolute
      - left: 33%
      - top: 47%
    portail:
      - width: 60%
      - position: absolute
      - left: 33%
      - top: 47%
    nlampe:
      - position: absolute
      - left: 5%
      - top: 28%
    lampe:
      - position: absolute
      - left: 10%
      - top: 35%
    garageup:
      - position: absolute
      - left: 54%
      - top: 23%
    garagestop:
      - position: absolute
      - left: 68%
      - top: 23%
    garagedown:
      - position: absolute
      - left: 82%
      - top: 23%
    port_open:
      - position: absolute
      - left: 56%
      - top: 57%
    port_close:
      - position: absolute
      - left: 70%
      - top: 57%
    nyann:
      - width: 15%
      - position: absolute
      - left: 5%
      - top: 72%
    yann:
      - border-radius: 50%
      - position: absolute
      - left: 7%
      - top: 78%
    nvero:
      - width: 20%
      - position: absolute
      - left: 20%
      - top: 72%
    vero:
      - border-radius: 50%
      - width: 60px
      - position: absolute
      - left: 24%
      - top: 78%
    ncourrier:
      - border-radius: 50%
      - width: 60px
      - position: absolute
      - left: 82.5%
      - top: 72%
    courrier:
      - border-radius: 50%
      - width: 60px
      - position: absolute
      - left: 84%
      - top: 80%

Ne regarde que le code pour le portail (le garage n’est plus fonctionnel pour le moment, il faut que je réappaire les détecteurs d’ouverture et fermeture).

Pour l’ouverture simultanée du portail et du garage, la meilleure solution est d’appeler un script qui effectuera en parallèle les deux actions.

1 « J'aime »

Ah merci beaucoup, je regarde cela en rentrant !
C’est superbe la présentation sur ta carte :+1::+1::+1: