Moyen simple de faire réactualiser un widget Dashboard?

Bonjour,

J’ai bricolé un widget pour faire afficher dans mon équipement NotifHeure sur le dashboard la customapp qui est en cours d’affichage. Mais ça ne se met à jour qu’au rechargement de la page.
Il me semble que ce n’était pas possible avant mais est ce que c’est possible maintenant en 4.5.2 ?

Enregistrement de l’écran 2026-01-23 à 15.46.44
Cordialement

Salut,

Je pense que tu devrais poster le code de ton widget afin que les cadors puissent l’analyser et te proposer une correction :wink:

Normalement ça doit se mettre à jour, et en effet sans le code difficile d’aider :wink:

Le voici, c’est que j’avais surement un peu honte de mes maigres capacité :see_no_evil:
C’est du code pompé sur des exemples et soumis à l’ia pour correction.
Mais bon j’assume :rofl:

<style>
.led-display {
  width: 90%; /* réduit légèrement la largeur pour effet afficheur */
  overflow: hidden;
  white-space: nowrap;
  background: #4A4646; /* noir adouci */
  font-family: monospace;
  font-size: 18px;
  padding: 5px 15px;
  box-sizing: border-box;
  border-radius: 5px;
}

.led-display span {
  display: inline-block;
  padding-left: 100%;
  animation: scrollText 10s linear infinite, rainbowText 5s linear infinite;
  background: linear-gradient(90deg, red, orange, yellow, #75F077, #FA6B83, #66ADFF, violet);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
}

@keyframes scrollText {
  0% { transform: translateX(0%); }
  100% { transform: translateX(-100%); }
}

@keyframes rainbowText {
  0%   { background-position: 0% 0%; }
  100% { background-position: 100% 0%; }
}
</style>

<div class="led-display" id="ledDisplay_#id#">
  <span>#value#</span>
</div>

1 « J'aime »

Si je ne me goure pas tu dois mettre la classe cmd-widget pour le div et faire afficher #state#

<div class="led-display cmd-widget" id="ledDisplay_#id#">
  <span>#state#</span> 
</div>

Salut

Pour rester dans l’esprit, voici du code généré par ia à partir de ton code. À tester si ok (et jeter sinon :sweat_smile:)

Reformaté quand je serai sur mon ordi…

<div class="cmd cmd-widget #history#" data-type="info" data-subtype="string" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#">
  <div class="title #hide_name#">
    <div class="cmdName">#name_display#</div>
  </div>
  
  <div class="led-display-#id#" id="led-container-#id#">
    <span class="scrolling-text-#id#">#state#</span>
  </div>

  <style>
    .led-display-#id# {
      width: 100%; 
      overflow: hidden;
      white-space: nowrap;
      background: #1a1a1a; /* Fond très sombre type écran éteint */
      font-family: "Courier New", Courier, monospace;
      font-size: 1.3em;
      font-weight: bold;
      padding: 10px 0;
      box-sizing: border-box;
      border-radius: 6px;
      border: 2px solid #333;
      box-shadow: inset 0 0 10px #000; /* Effet de profondeur */
    }

    .scrolling-text-#id# {
      display: inline-block;
      padding-left: 100%;
      white-space: nowrap;
      animation: scrollText-#id# 12s linear infinite, rainbowText-#id# 5s linear infinite;
      background: linear-gradient(90deg, #ff0000, #ff8000, #ffff00, #00ff00, #00ffff, #0000ff, #8b00ff);
      background-size: 400% auto;
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
      will-change: transform; /* Optimisation fluidité */
    }

    @keyframes scrollText-#id# {
      0% { transform: translateX(0); }
      100% { transform: translateX(-100%); }
    }

    @keyframes rainbowText-#id# {
      0% { background-position: 0% 50%; }
      100% { background-position: 100% 50%; }
    }
  </style>

  <script>
    jeedom.cmd.update['#id#'] = function(_options) {
      const cmd = $('.cmd[data-cmd_id=#id#]');
      // Mise à jour sécurisée du texte
      cmd.find('.scrolling-text-#id#').text(_options.display_value);
      
      // On ajuste la durée de l'animation selon la longueur du texte (optionnel)
      // Plus le texte est long, plus on ralentit pour rester lisible
      let duration = Math.max(8, _options.display_value.length * 0.5);
      cmd.find('.scrolling-text-#id#').css('animation-duration', duration + 's, 5s');
    }
    
    // Initialisation
    jeedom.cmd.update['#id#']({
      display_value: '#state#',
      collectDate: '#collectDate#',
      readOnly: '#readOnly#'
    });
  </script>
</div>

Bonsoir,
#state# ça ne marchait pas, elle ne prenait pas la valeur du texte. Pourtant c’est sensé marcher d’après les docs, j’avais essayé.
C’est que je mets à jour une commande d’un équipement mqtt avec un event dans un scénario, et j’applique le widget sur cette commande ce qui explique sans doute la non mise à jour de #state#
J’ai du coup quand même réussi a faire ce que je voulais, mais je pense plus compliqué car au début ça marchait mais dés que je l’appliquais sur 2 commandes, seule une se mettait à jour.
J’ai testé et ça marche ta version, donc je ne jette pas, je garde pour tester plus longuement en // :smiley:
Merci

<style>
.led-display {
    width: 90%;
    overflow: hidden;
    white-space: nowrap;
    background: #4A4646;
    font-family: monospace;
    font-size: 18px;
    padding: 5px 15px;
    box-sizing: border-box;
    border-radius: 5px;
}

.led-display span {
    display: inline-block;
    padding-left: 100%;
    animation: scrollText 10s linear infinite, rainbowText 5s linear infinite;
    background: linear-gradient(90deg, red, orange, yellow, #75F077, #FA6B83, #66ADFF, violet);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
}

@keyframes scrollText {
    0% { transform: translateX(0%); }
    100% { transform: translateX(-100%); }
}

@keyframes rainbowText {
    0%   { background-position: 0% 0%; }
    100% { background-position: 100% 0%; }
}
</style>

<div class="led-display cmd-widget" id="ledDisplay_#id#">
  <span class="ledState" data-cmdid="#id#">#state#</span>
</div>

<script>
(function(){
    var cmdId = '#id#';

    // Fonction de mise à jour globale pour tous les widgets affichant cette commande
    jeedom.cmd.update[cmdId] = function(_options) {
        if(_options && _options.display_value !== undefined) {
            // Sélectionne tous les spans correspondant à cette commande
            var spans = document.querySelectorAll('.ledState[data-cmdid="'+cmdId+'"]');
            spans.forEach(function(span){
                span.innerHTML = _options.display_value;
            });
        }
    };
})();
</script>

J’allais te dire que tu pouvais aussi essayer #display_value# à la place de #state#

Ce que tu as posté fonctionne ou c’est sur ça que tu n’arrives à mettre à jour qu’une seule commande ?

Bonjour Noyax,
Ma dernière version fonctionne bien appliquée sur plusieurs commandes
J’ai 3 afficheurs répartis dans la maison, donc 3 équipements Jmqtt sur le dashboard. Ce widget est sur une commande text qui est le message en cours d’affichage.
Cordialement
Edit :
J’ai peaufiné un peu ce matin le rendu pour refléter le mieux possible les leds awtrix. Ca me convient c’est assez réaliste :slight_smile:

<style>
.led-display {
    width: 90%;
    overflow: hidden;
    white-space: nowrap;
    background: #4A4646;
    font-family: monospace;
    font-size: 18px;
    padding: 5px 10px;
    box-sizing: border-box;
    border-radius: 5px;
}

.led-display span {
    display: inline-block;
    animation: scrollText 15s linear infinite,
               rainbowText 5s linear infinite;
    background: linear-gradient(
  90deg,
  #C85A5A,
  #E07A3F,
  #E6C85C,
  #75F077,
  #FA6B83,
  #66ADFF,
  #B58AD9
);
    background-size: 200% 100%;
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    will-change: transform;
}

@keyframes scrollText {
    0%   { transform: translateX(100%); }
    100% { transform: translateX(-100%); }
}

@keyframes rainbowText {
    0%   { background-position: 0% 0%; }
    100% { background-position: 200% 0%; }
}
</style>

<div class="led-display cmd-widget" id="ledDisplay_#id#">
  <span class="ledState" data-cmdid="#id#">#state#</span>
</div>

<script>
(function(){
    var cmdId = '#id#';

    jeedom.cmd.update[cmdId] = function(_options) {
        if (_options && _options.display_value !== undefined) {
            document
              .querySelectorAll('.ledState[data-cmdid="'+cmdId+'"]')
              .forEach(span => span.textContent = _options.display_value);
        }
    };
})();
</script>

1 « J'aime »