Widget changement de couleur fond tuile et clignotement suivant valeur binaire

Bonjour,

Widget permettant de changer la couleur de fond d’une tuile et de la faire clignoter.
Celui ci est fonctionnel sur un jeedom de test. Je suis plus « bidouilleur » que développeur. Est il en accord avec « les bonnes manières de faire sous jeedom » ?
Toutes critiques seront bienvenues

  • Créer un widget « Code »
  • Remplir les options :
    Version : Dashboard / Mobile
    Type : info
    Sous-type : Binaire
    Nom : ce que vous voulez dans mon cas TuileCouleurCligne
  • Copier/coller le code ci dessous :
<!-- Liste des paramètres a passer par l'équipement:
	couleur_1     couleur souhaitée pour valeur info = 1, format   r, g, b
 	couleur_0     couleur souhaitée pour valeur info = 0, format   r, g, b                                                        
	clignote      1 (fait clignoter tuile pour valeur info = 1)   0(fait clignoter tuile pour valeur info = 0)     -->
<div class="cmd cmd-widget #history# colorTuile-#uid#" data-type="info" data-subtype="binary" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#" style="min-width:0px; min-height:0px; margin-right:0px; margin-left:0px; padding:0px !important;">

	<script>
      	jeedom.cmd.update['#id#'] = function(_options){
       		if (_options.display_value == 1) {
        		$('.colorTuile-#uid#').closest('.eqLogic-widget').css('--eq-bg-color', '#couleur_1#');
              	if(#clignote# == 1) {	
              		$('.colorTuile-#uid#').closest('.eqLogic-widget').addClass("clignoteElement");
                }else {
					$('.colorTuile-#uid#').closest('.eqLogic-widget').removeClass("clignoteElement");
				}	
            }else {
			    $('.colorTuile-#uid#').closest('.eqLogic-widget').css('--eq-bg-color', '#couleur_0#');
              	if(#clignote# == 0) {	
              		$('.colorTuile-#uid#').closest('.eqLogic-widget').addClass("clignoteElement");
                }else {
					$('.colorTuile-#uid#').closest('.eqLogic-widget').removeClass("clignoteElement");
				}
    		}
		}	
	</script>
		
</div>

Nous avons donc un nouveau widget nommé TuileCouleurCligne il s’applique sur une commande info binaire (valeur 1 ou 0)

Il y a 3 paramètres optionnels à passer au widget :
couleur_1 → couleur souhaitée pour valeur info = 1, format r, g, b (ex pour du rouge : 255, 0, 0 )
couleur_0 → couleur souhaitée pour valeur info = 0, format r, g, b
clignote → 1 (fait clignoter tuile pour valeur info = 1) 0(fait clignoter tuile pour valeur info = 0)

Principe de fonctionnement :

Dans un virtuel on duplique une commande info binaire sur laquelle on applique ce widget.

  1. Celui-ci va modifier la variable css de la tuile —eq-bg-color suivant la valeur de l’info (1 ou 0) et donc modifier la couleur de fond de la tuile.
  2. Il va ajouter ou retirer la class clignoteElement à la tuile. Cette classe va être défini dans la personnalisation css de jeedom
    Ajouter le code suivant dans custom.css accessible par le menu Réglages > Système > Configuration puis
    L’onglet Interface et Personnalisation avancée.
/* class clignoteElement  */
	.clignoteElement {
		animation-duration: 1.2s;
		animation-name: cligne;
		animation-iteration-count: infinite;
		transition: none;
	}
	@keyframes cligne {
		0%   { opacity:1; }
		40%   {opacity:0; }
		100% { opacity:1; }
	}

Remarque :
– Je pense que cette class clignoteElement peut être utilisée par d’autre widget, pour faire clignoter du texte par exemple .
– Si on désire seulement changer la couleur de fond le code du widget sera

<!-- Liste des paramètres a passer par l'équipement:
	couleur_1     couleur souhaitée pour valeur info = 1, format   r, g, b
	couleur_0     couleur souhaitée pour valeur info = 0, format   r, g, b -->
<div class="cmd cmd-widget #history# colorTuile-#uid#" data-type="info" data-subtype="binary" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#" style="min-width:0px; min-height:0px; margin-right:0px; margin-left:0px; padding:0px !important;">

	<script>
		jeedom.cmd.update['#id#'] = function(_options){
			if (_options.display_value == 1) {
				$('.colorTuile-#uid#').closest('.eqLogic-widget').css('--eq-bg-color', '#couleur_1#');
            }else {
				$('.colorTuile-#uid#').closest('.eqLogic-widget').css('--eq-bg-color', '#couleur_0#');
			}
		} 
	</script>
</div>

Et on ne s’occupera pas de custom.css.

Il doit pouvoir se modifier pour des infos numériques sans trop de difficultés.
Cordialement

3 « J'aime »

Bonjour et merci @bluc83 pour le code.

Du coup, je me suis permis de l’adapter a mon besoin, a savoir :

  • Faire clignoter avec la couleur de mon choix lorsque qu’une valeur est supérieure a celle définie.

C`est donc une info Numeric

Paramètres optionnels a renseigner :

  • clignote (0 ou 1)
  • color (en RGB)
  • valueMin ( Valeur minimum , ex: en saisissant 20 , au delà, la tuile change de couleur et clignote.)

<div class="cmd cmd-widget #history# colorTuile-#uid#" data-type="info" data-subtype="numeric" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#" style="min-width:0px; min-height:0px; margin-right:0px; margin-left:0px; padding:0px !important;">
  <div class="cmd-widget-body">
    <div class="cmd-widget-value">#state#</div>
  </div>
  <script>
    jeedom.cmd.update['#id#'] = function(_options) {
      
      var value = parseFloat(_options.display_value);
  	  var valueMin = '#valueMin#';
      var color = '#color#';
      
/* Exemples de code couleur RGB:
    Rouge : rgb(255, 0, 0)
	Vert : rgb(0, 255, 0)
	Bleu : rgb(0, 0, 255)
	Jaune : rgb(255, 255, 0)
	Violet : rgb(128, 0, 128)
	Blanc : rgb(255, 255, 255)
	Noir : rgb(0, 0, 0)
	Gris : rgb(128, 128, 128)
	Orange : rgb(255, 165, 0)
	Rose : rgb(255, 192, 203)
	Marron : rgb(165, 42, 42)
	Turquoise : rgb(64, 224, 208)
 */


      if (value >= valueMin) {
        $('.colorTuile-#uid#').closest('.eqLogic-widget').css('--eq-bg-color', color);
        if (#clignote# === 1) {
          $('.colorTuile-#uid#').closest('.eqLogic-widget').addClass('clignoteElement');
        } else {
          $('.colorTuile-#uid#').closest('.eqLogic-widget').removeClass('clignoteElement');
        }
      } 
    };
  </script>
</div>

Bonjour,

Il semble que dans ton widget tu gère si value >= valueMin mais qu’en est-il si cette valeur redescend en dessous de valueMin :wink:

Salut

En dessous de valueMin, pas de changement, la tuile reste dans son aspect d’origine, pas de couleur ni clignotement.

Je te propose de tester ton propre widget,
sans même l’avoir essayé je peut déja dire :

  • Si la valeur, par un update, redescend en dessous de valueMin ta tuile continuera de clignoter.
  • Si tu actualise le Dashboard alors que la valeur > valueMin il ne se passera rien.
  • La valeur affiché dans le widget n’est jamais mise a jour en cas d’update.
  • Qu’en est-il du background lorsque la valeur < valueMin

Je te remercie pour tes remarques.

Le code n’est évidemment pas optimisé mais pourtant fonctionne comme je souhaite pour mon besoin.

Je l’ai mis pour le plugin Alerte Pollen.
Le passage ce matin de sa valeur 2 à 3 à bi n fait clignoté la tuile.
Après un refresh, effectivement il faut attendre que la valeur soit mise à jour.
La valeur n’est pas affichée, perso je m’en moque, j’ai déjà un widget dédié pour la valeur. Je souhaite juste faire clignoter la tuile.
En dessous de valurMin, tuile originale.

Pas de soucis, si il te convient comme ceci, cest ton choix. Je te souhaites juste que personne ne l’utilise, sous peine de recevoir des commentaires comme quoi le widget ne se met pas a jours… Je me permet de dire ceci car tu as un statut de dev, chose que je me serai pas permis pour un simple user :wink:

2 « J'aime »

Je ne sais pas comment et pourquoi j’ai le statut Dev.

Si tu penses que le code est bancale, il serait donc judicieux que je supprime le code du post.

Ou mieux, si tu as le temps, l’envie et/ou les compétences, tu peux peut-être le corriger pour les copains. :wink:

J’ai pu enlever mon status Dev, merci.

Le plus gênant c`est lors d’un refresh de la page ou cette valeur n’est pas mise instantanément à jour.

Sinon, ca va plutôt bien :

chrome_aInIoccOYp

Si tu as une idée pour pallier a ce pb de refresh, n’hésite pas :wink:

Bonjour,

Force simplement le refresh en utilisant :

jeedom.cmd.refreshValue([{cmd_id :'#id#',display_value: '#state#', valueDate: '#valueDate#', collectDate: '#collectDate#', alertLevel: '#alertLevel#', unit: '#unite#'}])

a mettre après la fonction jeedom.cmd.update['#id#']

Merci

Cependant, ca n’a pas fonctionné.

Mais j’ai solutionné en ajoutant en fin de script :

            jeedom.cmd.update['#id#']({
            valueDate: '#valueDate#',
            collectDate: '#collectDate#',
            alertLevel: '#alertLevel#'

Du coup, code corrigé:


<div class="cmd cmd-widget #history# colorTuile-#uid#" data-type="info" data-subtype="numeric" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#" style="min-width:0px; min-height:0px; margin-right:0px; margin-left:0px; padding:0px !important;">
  <div class="cmd-widget-body">
  </div>
  <script>

    jeedom.cmd.update['#id#'] = function(_options)

{

      var value = parseFloat(_options.display_value);
  	  var valueMin = '#valueMin#';
      var color = '#color#';
      
/* Exemples de code couleur RGB:
    Rouge : rgb(255, 0, 0)
	Vert : rgb(0, 255, 0)
	Bleu : rgb(0, 0, 255)
	Jaune : rgb(255, 255, 0)
	Violet : rgb(128, 0, 128)
	Blanc : rgb(255, 255, 255)
	Noir : rgb(0, 0, 0)
	Gris : rgb(128, 128, 128)
	Orange : rgb(255, 165, 0)
	Rose : rgb(255, 192, 203)
	Marron : rgb(165, 42, 42)
	Turquoise : rgb(64, 224, 208)
 */

if (_options.display_value >= valueMin)  {
        		$('.colorTuile-#uid#').closest('.eqLogic-widget').css('--eq-bg-color', color);
              	if(#clignote# == 1) {	
              		$('.colorTuile-#uid#').closest('.eqLogic-widget').addClass("clignoteElement");
                }else {
					$('.colorTuile-#uid#').closest('.eqLogic-widget').removeClass("clignoteElement");
				}	
            }else {
			    $('.colorTuile-#uid#').closest('.eqLogic-widget').css('--eq-bg-color', '#couleur_0#');
              	if(#clignote# == 0) {	
              		$('.colorTuile-#uid#').closest('.eqLogic-widget').addClass("clignoteElement");
                }else {
					$('.colorTuile-#uid#').closest('.eqLogic-widget').removeClass("clignoteElement");
				}
    		}      
    }
            jeedom.cmd.update['#id#']({
            valueDate: '#valueDate#',
            collectDate: '#collectDate#',
            alertLevel: '#alertLevel#'
        });
    
  </script>
</div>

Prochaine étape, et la je sens que ca va pas etre fastoche (pour moi) .

  • Définir des plages de valeurs , par ex. Clignotement vert de value 10 a 20 et clignotement rouge de 20 a 30

En quel version de Jeedom es-tu ?

J’en doute, il manque display_value: '#state#' pour mettre a jour la valeur

Ensuite, pour la couleur de fond, c’est compliqué, je m’y serait pas frotté , car pour le retour a l’état initial sa ne marche pas, et il est certainement plus compliqué de réinitialiser, car sa dépend aussi du thème que l’user a choisi en config.

Jeedom 4.3.17

Je l’ai volontairement enlevé de la class car je ne veux pas d’affichage de valeur.
Et c’est tout ok, idem après refresh.

Met ta valeur au dessus de #valueMin# et refresh la page…

donc
jeedom.cmd.refreshValue([{cmd_id :'#id#',display_value: '#state#', valueDate: '#valueDate#', collectDate: '#collectDate#', alertLevel: '#alertLevel#', unit: '#unite#'}])
devrait fonctionner !

Du coup, Jai modifié afin d’avoir 2 plages de couleurs

ex avec en paramètres:
Valeur pivot 1 (valueMin1) = 15
Valeur pivot 2 (valueMin2) = 25

En dessous de 15 : Pas de changement, tuile par défaut
De 16 à 24 : Passage tuile en Rouge (color1)
Au partir de 25 : Passage tuile en Bleu (color2)

Sans clignotement:
chrome_rRPft8gTm5

Avec clignotement:
chrome_djvypDoQ2I

<div class="cmd cmd-widget #history# colorTuile-#uid#" data-type="info" data-subtype="numeric" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#" style="min-width:0px; min-height:0px; margin-right:0px; margin-left:0px; padding:0px !important;">
  <div class="cmd-widget-body"> 
  </div>
  <script>

    jeedom.cmd.update['#id#'] = function(_options)
    
    {

      var value = parseFloat(_options.display_value);
      var valueMin1 = '#valueMin1#';
      var valueMin2 = '#valueMin2#';
      var color1 = '#color1#';
      var color2 = '#color2#';
      
      /* Exemples de code couleur RGB:
         Rouge : rgb(255, 0, 0)
         Vert : rgb(0, 255, 0)
         Bleu : rgb(0, 0, 255)
         Jaune : rgb(255, 255, 0)
         Violet : rgb(128, 0, 128)
         Blanc : rgb(255, 255, 255)
         Noir : rgb(0, 0, 0)
         Gris : rgb(128, 128, 128)
         Orange : rgb(255, 165, 0)
         Rose : rgb(255, 192, 203)
         Marron : rgb(165, 42, 42)
         Turquoise : rgb(64, 224, 208)
      */

      if (_options.display_value >= valueMin1 && _options.display_value <= valueMin2)  {
        $('.colorTuile-#uid#').closest('.eqLogic-widget').css('--eq-bg-color', color1);
        if (#clignote# == 1) {	
          $('.colorTuile-#uid#').closest('.eqLogic-widget').addClass("clignoteElement");
        } else {
          $('.colorTuile-#uid#').closest('.eqLogic-widget').removeClass("clignoteElement");
        }	
        }
      
      if (_options.display_value >= valueMin2)  {
        $('.colorTuile-#uid#').closest('.eqLogic-widget').css('--eq-bg-color', color2);
        if (#clignote# == 1) {	
          $('.colorTuile-#uid#').closest('.eqLogic-widget').addClass("clignoteElement");
        } else {
          $('.colorTuile-#uid#').closest('.eqLogic-widget').removeClass("clignoteElement");
 		}
        }   
      
      else if (_options.display_value <= valueMin1)  {
        $('.colorTuile-#uid#').closest('.eqLogic-widget').css('--eq-bg-color', color);
        if (#clignote# == 1) {	
          $('.colorTuile-#uid#').closest('.eqLogic-widget').addClass("clignoteElement");
          $('.colorTuile-#uid#').closest('.eqLogic-widget').removeClass("clignoteElement");
 		}
        }      
      
    }
        
        
    jeedom.cmd.refreshValue([{cmd_id :'#id#',display_value: '#state#', valueDate: '#valueDate#', collectDate: '#collectDate#', alertLevel: '#alertLevel#', unit: '#unite#'}])
      
    
  </script>
</div>

Bonsoir,
Avec plaisir et très content que tu y trouves une utilité.
Cordialement