Problème de gestion de gif dans une picture element

Hello,

J’ai un soucis que je n’arrive pas à résoudre avec plusieurs approches différentes dans un epicture element, je détaille le truc le plus simple les autres sont alambiqués donc un esp dans la voiture diffuse un ibeacon, qui est recherché par les BL proxy de la maison, pour faire simple j’en prend 1 seul ici. quelque soit l’approche j’ai toujours le soucis sur un gif non bouclé

ibeacon detecté > esp passe à on gif montée / ibeacon non detecté > esp passe à off gif descente, là ou ça se corse c’est que si je repase à on , le gif ne se charge pas, idem pour off, donc si vous avez des idées … ( j’ai tenté un horodatage en intercalant 1 png en début et en fin sans succès), idem avec un template de sens de montée/ descente ( qui à le même effet sur le gif)

donc si vous avez des idées je prend :wink: merci

b

j’ai testé plusieurs navigateurs dans le doute, donc ça ne vient pas de mon firefox.

cdt

Salut,

Je ne comprends peut-être pas bien mais un binary_sensor n’étant QUE on/off et puisque ce binary_sensor est géré par ton ESP.
Le fait qu’il soit unknow montre :

  • soit ton binary est mal géré,
  • soit ta communication esp - ha ne marche pas bien

En tout cas, le fait que ça s’affiche ou pas avec un gif, c’est une état supplémentaire qui n’a de lien avec l’erreur précédente QUE parce que tu te sers de ça pour afficher la voiture dans un picture element.
Et que vue la copie d’écran, les bonnes valeurs dans le binary_sensor, provoque les bonnes actions dans ta carte

On est d’accord ?

Hello,

ce n’est pas un soucis d’entité ou d’état unknow. je le met volontairement en unavailable au début pour ne rien afficher.

Pour faire simple, je change l’état de l’entité dans les outils dev pour que ça soit plus facile
cache et historique du navigateur vide.

je passe l’esp à on, il charge le gif de montée, ça affiche le gif de montée.
je passe l’esp à off, il charge le gif de descente, ça affiche le gif de descente.
je repasse l’esp à on, il ne charge pas le gif, il bascule de la position en bas à la position haute sans charger le gif
je repasse l’esp à off, il ne charge pas le gif, il bascule de la position en haut à la position basse sans charger le gif

je ferme et rouvre le navigateur, je retrouve un fonctionnement normal, 1fois on, 1 fois off, ensuite il ne charge pas le gif… on voit les 4 étapes visuellement sur le gif du 1er post

Donc c’est un souci de vocabulaire …

L’esp ne charge pas de gif… L’esp te donne une entité binary_sensor qui vaut on ou off…
La carte affiche le gif en fonction de l’état du binary_sensor.

Déduire les infos de fonctionnent d’une image, c’est pas le plus facile. Si l’image complete un code (esp ou yaml) ok, mais autrement c’est moins utile.
Accesoirement, je vois un état unavailable dans ton entité…
Partage la partie de la carte concernée plutot

Re,

aucun soucis avec le code, c’est du basique de chez basique pour picture element


type: picture-elements
image: /local/plan3D/plan 3D.png
elements:
  - type: conditional
    conditions:
      - entity: binary_sensor.esp3_veranda_clio_ibeacon_presence
        state: "on"
    elements:
      - type: image
        image: /local/plan3D/montee.gif
  - type: conditional
    conditions:
      - entity: binary_sensor.esp3_veranda_clio_ibeacon_presence
        state: "off"
    elements:
      - type: image
        image: /local/plan3D/descente.gif

le code fonctionne, la carte fonctionne, c’est juste que visuellement sur la carte si l’entité passe à on j’ai le gif montée qui s’affiche, si l’entité passe à off le gif descente s’affiche, si il repasse à on, visuellement la voiture passe de position basse à position haute, sans montrer le gif, comme si c’était stocké dans le cache du navigateur.

Du coup au lieu d’afficher position1 gifgifgifgifgif position2 ( le gif donc ) ça affiche position1 … position2 ( en espérant être clair )

Breuk

Il y a bien mieux que les conditional pour ça

      type: image
      entity: binary_sensor.esp3_veranda_clio_ibeacon_presence
      image: /local/plan3D/vide.gif
      style:
        top: 50%
        left: 50%
        width: 100%
      state_image:
        'off': /local/plan3D/descente.gif
        'on': /local/plan3D/montee.gif
      tap_action:
        action: none

Et attention au cache navigateur, si a un moment tu te trompes lors de la conception de la carte (inversion d’image) ça reste un moment avec les inversions alors que le code est bon

Pour l’image vide, 1x1 pixel transparent, c’est top

Monter ??? ça affiche plutot

re,

c’est vrai je n’ai pas tenté comme ça, j’essayerai, et je couperai mon 1er gif explicatif 1er post en 2, ça sera plus explicite, merci en attendant

cdt

1 « J'aime »

Re,

J’ai testé le code de la carte, comme prévu, à part que c’est plus propre, ça ne change par grand chose mais, en supprimant la condition, j’ai l’impression, que je peux recharger le gif plus rapidement

je suis donc passé de ça

 - type: conditional
    conditions:
      - entity: binary_sensor.esp3_veranda_clio_ibeacon_presence
        state: "on"
    elements:
      - type: image
        image: /local/plan3D/montee.gif
  - type: conditional
    conditions:
      - entity: binary_sensor.esp3_veranda_clio_ibeacon_presence
        state: "off"
    elements:
      - type: image
        image: /local/plan3D/descente.gif

à ça

type: image
      entity: binary_sensor.esp3_veranda_clio_ibeacon_presence
      #!! ligne supprimée >> image: /local/plan3D/vide.gif !!
      style:
        top: 50%
        left: 50%
        width: 100%
      state_image:
        'off': /local/plan3D/descente.gif
      tap_action:  
        action: none

pour autant j’ai tjs le phénomène que j’ai décomposé en 2 gifs pour qua ça soit plus clair
ibeacon est à on > esp passe à on > déclenchement de montee.gif, esp passe à off déclenchement de descente.gif, ça c’est ok

1

esp repasse à on, esp repasse à off, montee.gif et descente.gif ne sont pas chargés, on passe de la position de départ à la position d’arrivée. Bon dans l’absolu, qd on part on ne revient pas de suite et quand on arrive on ne repart pas tout de suite, mais je voudrais bien comprendre le phénomène, voir le contourner si c’est possible ( et je ne trouve pas )

2

je prends toutes les idées, merci

cdt

Re,

J’ai remis un peu les mains dedans et avec l’aide de claude ai, j’ai fini par trouver un truc qui fonctionne.

1

      - type: custom:hui-element
        card_type: markdown
        entity: binary_sensor.esp3_veranda_clio_ibeacon_presence
        content: >
          <img style="width: 100%; height: 100%; object-fit: contain;" 
          src="/local/plan3D/{{ 'montee' if
          is_state('binary_sensor.esp3_veranda_clio_ibeacon_presence', 'on')
          else 'descente' }}.gif?t={{
          as_timestamp(states.binary_sensor.esp3_veranda_clio_ibeacon_presence.last_changed)
          }}">
        style:
          top: 50%
          left: 51%
          width: 120%
          height: 120%
          transform: translate(-50%, -50%) scale(0.85)
          transition: opacity 0.3
          pointer-events: none
          background: transparent
        card_mod:
          style: |
            ha-card {
              background: transparent !important;
              box-shadow: none !important;
              border: none !important;
            }
            ha-markdown {
              background: transparent !important;
            }

J’avais déjà tenté cette approche sans y parvenir, mais là ça fonctionne

  • Ajoute un paramètre unique basé sur le timestamp du dernier changement d’état

  • Force le navigateur à recharger le GIF depuis le début (contourne le cache)
    vu que l’url change à chaque fois /local/plan3D/montee.gif?t=1729350123/local/plan3D/montee.gif?t=1729350456

  • Se met à jour uniquement quand l’état change

et du coup en creusant un peu plus, abracadabra

1

      - type: custom:hui-element
        card_type: markdown
        entity: binary_sensor.esp3_veranda_clio_ibeacon_presence
        content: >
          <img style="width: 100%; height: 100%; object-fit: contain;" 
          src="/local/plan3D/{{ 'montee' if
          is_state('binary_sensor.esp3_veranda_clio_ibeacon_presence', 'on')
          else 'descente' }}.gif?t={{
          as_timestamp(states.binary_sensor.esp3_veranda_clio_ibeacon_presence.last_changed)
          }}">
        style:
          top: 50%
          left: 51%
          width: 120%
          height: 120%
          transform: translate(-50%, -50%) scale(0.85)
          transition: opacity 0.3
          pointer-events: none
          background: transparent
        card_mod:
          style: |
            ha-card {
              background: transparent !important;
              box-shadow: none !important;
              border: none !important;
              {% if is_state('binary_sensor.esp3_veranda_clio_ibeacon_presence', 'off') %}
              opacity: 0;
              transition: opacity 0.5s 3s;
              {% else %}
              opacity: 1;
              transition: opacity 0.5s 0s;
              {% endif %}
            }
            ha-markdown {
              background: transparent !important;
            }

cdt

1 « J'aime »

Ce sujet a été automatiquement fermé après 2 jours. Aucune réponse n’est permise dorénavant.

Hello,

Bon alors l’approche précédente est totalement fonctionnelle, mais, elle est assez lourde à charger

La soluce des soluces :smiley:

on va simplifier ( testé sous firefox )

et passer sur ce code ( les style me sont propres sur ma picture element, il faudra adapter, tout comme les entités ) il n’est pas encore parfaitement positionné mais 100% fonctionnel

sur le on la voiture apparait, puis monte
sur le off la voiture recule, puis disparait

Peek 22-02-2026 11-35

:slight_smile:

      - type: image
        entity: binary_sensor.esp3_veranda_clio_ibeacon_presence
        image: /local/plan3D/Transparent 1920x1080.png
        style:
          top: 50%
          left: 51%
          width: 120%
          height: 120%
          transform: translate(-50%, -50%) scale(0.85)
          pointer-events: none
          z-index: 10
        card_mod:
          style: |
            :host {
              /* On force l'image en fond du composant entier */
              background-image: url("/local/plan3D/{{ 'montee' if is_state('binary_sensor.esp3_veranda_clio_ibeacon_presence', 'on') else 'descente' }}.gif?t={{ as_timestamp(states.binary_sensor.esp3_veranda_clio_ibeacon_presence.last_changed) | int }}") !important;
              background-size: contain;
              background-repeat: no-repeat;
              background-position: center;

              /* Gestion de l'opacité */
              {% if is_state('binary_sensor.esp3_veranda_clio_ibeacon_presence', 'off') %}
                opacity: 0;
                transition: opacity 0.5s 3s;
              {% else %}
                opacity: 1;
                transition: opacity 0.5s 0s;
              {% endif %}
            }
            img {
              /* On rend l'image source totalement invisible pour ne voir que le background */
              display: block;
              opacity: 0;
              width: 100%;
              height: 100%;
            }

cdt