[WIDGET] Historique et Tendance

ah oui a chaque actu ! j’y avais pas pensé
oui on peux en css
https://forum.jeedom.com/viewtopic.php?f=24&t=48039&p=777651&sid=ec95e78a7754f555996eb30e143e039c#p777622

donc dans l’update (script)
.fa-cog et css opacity à 0
genre
$(’.fa-cog]’).css('opacity,‹ 0 ›);

y joindre une temps

ou avant et une fois le résultat obtenue joué sur l’opacité

ou autre methode css pour caché
display :none, flex,…

Le mode dev de ton navigateur lorsque la roue tourne
Clic icône de gauche t’aide a voir les class/id (avec la roue il te faut être rapide)
Tous comme la console avec l api js pour voir se que retourne la commande

1 « J'aime »

Bonjour,

Merci pour l’info, c’est mieux car la roue crantée est maintenant masquée avec $(’.fa-cog’).css(‹ opacity ›, 0);

Il me reste que l’écran ‹ flashe › à chaque mise à jour. Y-a-t’il un moyen pour empêcher cela ?

Merci beaucoup.

se que tu nommes « écran flashé » doit être un fond d’écran légèrement opaque.?

je regarderai

Salut,

Ce que je nomme flashe, c’est l’écran qui s’assombrit. Effectivement, ‹ flash › n’est pas le bon terme. :slight_smile:

Merci

Voilà la dernière version de mon code. Pour la roue crantée et l’écran qui devient légèrement opaque, j’ai utilisé la méthode barbare d’ajouter la classe hidden sur jqueryLoadingDiv.

Ça fait maintenant exactement ce que je veux. :smiley:

<div class="cmd cmd-widget #history#" data-type="info" data-subtype="numeric" data-template="tile" 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="myrow">
    <div class="mycolumn state" style="font-size: 250%; white-space: nowrap;"></div>
    <div class="mycolumn mytendance" style="font-size: 100%; white-space: nowrap" >
      <i class="fas fa-arrow-minus"></i>
    </div>
    <div class="mycolumn" style="font-size: 100%; white-space: nowrap" >
 		&nbsp;
    </div>
    <div class="mycolumn cmdStats #hide_history#" style="font-size: 100%; white-space: nowrap;text-align: right;">
      <div class="myrow">
        <div class="mycolumn minHistoryValue" style="font-size: 100%; white-space: nowrap;"></div>
      </div>
      <div class="myrow">
        <div class="mycolumn maxHistoryValue" style="font-size: 100%; white-space: nowrap;"></div>
      </div>
    </div>
  </div>
  <div class="myrow">
    <div class="mycolumn" style="font-size: 80%; font-weight: normal; white-space: nowrap;" >
      M&agrave;J
    </div>
    <div class="mycolumn" style="white-space: nowrap;" >
      <span class="timeCmd" style="font-size: 80%; font-weight: normal"  data-type="info"></span>
    </div>
  </div>

  <style>
    .myrow {
      display: flex;
      flex-direction: row;
      width: 100%;
    }

    .mycolumn {
      display: flex;
      flex-direction: column;
      flex: 1;
      justify-content: center;
    }      
  </style>

  <script>
    durationSinceLastUpdate = function(_date,_el){
      var arrDate = _date.split(/-|\s|:/);
      var timeInMillis = new Date(arrDate[0], arrDate[1] -1, arrDate[2], arrDate[3], arrDate[4], arrDate[5]).getTime();

      if(timeInMillis < (Date.now()+ clientServerDiffDatetime)){
        var d = ((Date.now() + clientServerDiffDatetime) - timeInMillis) / 1000;
        var j = Math.floor(d / 86400);
        var h = Math.floor(d % 86400 / 3600);
        var m = Math.floor(d % 3600 / 60);
        var s = Math.floor( d - (j*86400 + h*3600 + m*60) );
        if (d > 86399) {
          var interval = 3600000;
          _el.empty().append(((j + " j")));
        } else if (d > 3599 && d < 86400) {
          var interval = 60000;
          _el.empty().append(((h + " h")));
        } else {
          var interval = 10000;
          _el.empty().append(((m + " min" )));
        }
      }else{
        _el.empty().append("-");
      }
    }     

    function getHistory(id, start, end, unite) {
      jeedom.history.get ({ 
        cmd_id:id,
        dateStart:start,
        dateEnd:end,  
        success:  function(resultat){
          $('.cmd[data-cmd_id='+id+'] .minHistoryValue').empty().text(resultat.minValue);
          $('.cmd[data-cmd_id='+id+'] .maxHistoryValue').empty().text(resultat.maxValue);
          $('.cmd[data-cmd_id='+id+']').attr('minValue', Number.parseFloat(resultat.minValue));
          $('.cmd[data-cmd_id='+id+']').attr('maxValue', Number.parseFloat(resultat.maxValue));          
        }
      })
    }

    function formatDate(date) {
      var d = date.getDate();
      var m = date.getMonth() + 1; //Month from 0 to 11
      var y = date.getFullYear();
      var hh = date.getHours();
      var mn = date.getMinutes();
      var ss = date.getSeconds();

      return ((y + '-' + (m<=9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d)+' '+(hh<=9 ? '0' + hh : hh)+':'+(mn<=9 ? '0' + mn : mn)+':'+(ss<=9 ? '0' + ss : ss)));
    }
    
    jeedom.cmd.update['#id#'] = function(_options){
      var cmd = $('.cmd[data-cmd_id=#id#]');
                        
      cmd.attr('title','Date de valeur : '+_options.valueDate+'<br/>Date de collecte : '+_options.collectDate)
      
      var oldValue = Number.parseFloat(cmd.attr('currentValue'));      
      var newValue = Number.parseFloat(_options.display_value).toFixed(1);
      $('.cmd[data-cmd_id=#id#] .state').empty().append(newValue + " #unite#");			
      cmd.attr('currentValue', newValue);	

      if (newValue > oldValue + 0.1) {
        $('.cmd[data-cmd_id=#id#] .mytendance').empty().html('<i class="fas fa-arrow-up"></i>');
      }
      else if (newValue < oldValue - 0.1) {
        $('.cmd[data-cmd_id=#id#] .mytendance').html('<i class="fas fa-arrow-down"></i>');
      }
      else {
        $('.cmd[data-cmd_id=#id#] .mytendance').empty().html('<i class="fas fa-minus"></i>');        
      }
      
      var loadingDiv = document.getElementById("jqueryLoadingDiv");
      loadingDiv.className='hidden';
      
      var today = new Date();
      var yesterday = new Date();
      yesterday.setDate(today.getDate() - 1);
      
      getHistory('#id#', formatDate(yesterday), formatDate(today));
                              
      durationSinceLastUpdate(_options.valueDate, cmd.find('.timeCmd'));      
    }

    jeedom.cmd.update['#id#']({display_value:'#state#',valueDate:'#valueDate#',collectDate:'#collectDate#',alertLevel:'#alertLevel#'/*,minHistoryValue:'#minHistoryValue#'*/});
  </script>
</div>
1 « J'aime »

Bonsoir à la communauté :slight_smile:

Petite mise à jour de mon ‹ widget code ›, simple et efficace. Min/Max sur 24h, durée depuis le dernier changement, flèche de tendance.

tuile%202

<div class="cmd cmd-widget #history#" data-type="info" data-subtype="numeric" data-template="tile" 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="myrow">
    <div class="mycolumn state" style="font-size: 300%; white-space: nowrap;">-</div>
    <div class="mycolumn mytendance">
      <i class="fas fa-arrow-minus"></i>
    </div>
    <div class="mycolumn cmdStats #hide_history#" style="line-height: 1; font-size: 100%; white-space: nowrap; text-align: right;">
      <div class="myrow">
        <div class="mycolumn minHistoryValue" style="font-size: 110%; font-family:consolas; white-space: nowrap;">-</div>
      </div>
      <div class="myrow">
        <div class="mycolumn maxHistoryValue" style="font-size: 110%; font-family:consolas; white-space: nowrap;">-</div>
      </div>
      <div class="myrow">
        <div class="mycolumn timeCmd" style="font-size: 110%; font-family:consolas; white-space: nowrap;">-</div>
      </div> 
    </div>       
  </div>
  
  <style>
    .myrow {
      display: flex;
      flex-direction: row;
      width: 100%;
    }

    .mycolumn {
      display: flex;
      flex-direction: column;
      flex: 1;
      justify-content: center;
    }      
  </style>

  <script>
    durationSinceLastUpdate = function(_date,_el){
      var arrDate = _date.split(/-|\s|:/);
      var timeInMillis = new Date(arrDate[0], arrDate[1] -1, arrDate[2], arrDate[3], arrDate[4], arrDate[5]).getTime();

      if(timeInMillis < (Date.now()+ clientServerDiffDatetime)){
        var d = ((Date.now() + clientServerDiffDatetime) - timeInMillis) / 1000;
        var j = Math.floor(d / 86400);
        var h = Math.floor(d % 86400 / 3600);
        var m = Math.floor(d % 3600 / 60);
        var s = Math.floor( d - (j*86400 + h*3600 + m*60) );
        if (d > 86399) {
          var interval = 3600000;
          _el.empty().append((j + " j").padStart(6," ").replace(/ /g, '&nbsp;'));
        } else if (d > 3599 && d < 86400) {
          var interval = 60000;
          _el.empty().append((h + " h").padStart(6," ").replace(/ /g, '&nbsp;'));
        } else {
          var interval = 10000;
          _el.empty().append((m + " min").padStart(6," ").replace(/ /g, '&nbsp;'));
        }
      }else{
        _el.empty().append(("-").padStart(6," ").replace(/ /g, '&nbsp;'));
      }
    }     

    function getHistory(id, start, end, unite) {
       // console.log(id + ', requesting history');
       jeedom.history.get ({ 
        cmd_id:id,
        dateStart:start,
        dateEnd:end,  
        success:  function(resultat){
          // This function is run asynchronously
          
          $('.cmd[data-cmd_id='+id+'] .minHistoryValue').empty().text(resultat.minValue);
          $('.cmd[data-cmd_id='+id+'] .maxHistoryValue').empty().text(resultat.maxValue);
 
          var prevDifferentValue;
          var currentValue;

          $( resultat.data ).each(function( index ) {
            var num = resultat.data[index][1];            

            if (currentValue != num) {
              prevDifferentValue=currentValue;
              currentValue=num;
            }

            if (num == resultat.maxValue) {
              var maxdate = new Date(resultat.data[index][0]);
              $('.cmd[data-cmd_id='+id+'] .maxHistoryValue').attr('title','Max ' + resultat.maxValue + ' ' + unite + ' // ' + formatDate(maxdate));
            }

            if (num == resultat.minValue) {
              var minidate = new Date(resultat.data[index][0]);
              $('.cmd[data-cmd_id='+id+'] .minHistoryValue').attr('title','Min ' + resultat.minValue + ' ' + unite + ' // ' + formatDate(minidate));
            }     
          });
          
          // console.log(id + ', currentValue ' + currentValue + ', prevDifferentValue ' + prevDifferentValue);
          
          if (currentValue >= prevDifferentValue + 0.1) {
            $('.cmd[data-cmd_id='+id+'] .mytendance').empty().html('<i class="fas fa-arrow-up"></i>');
          }
          else if (currentValue <= prevDifferentValue - 0.1) {
            $('.cmd[data-cmd_id='+id+'] .mytendance').html('<i class="fas fa-arrow-down"></i>');
          }
          else {
            $('.cmd[data-cmd_id='+id+'] .mytendance').empty().html('<i class="fas fa-minus"></i>');        
          }
          
          $('.cmd[data-cmd_id='+id+'] .mytendance').attr('title','Evolution ' + prevDifferentValue + ' --> ' + currentValue);
 
        }
      })
    }

    function formatDate(date) {
      var d = date.getDate();
      var m = date.getMonth() + 1; //Month from 0 to 11
      var y = date.getFullYear();
      var hh = date.getHours();
      var mn = date.getMinutes();
      var ss = date.getSeconds();

      return ((y + '-' + (m<=9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d)+' '+(hh<=9 ? '0' + hh : hh)+':'+(mn<=9 ? '0' + mn : mn)+':'+(ss<=9 ? '0' + ss : ss)));
    }
    
    jeedom.cmd.update['#id#'] = function(_options){
      $('.cmd[data-cmd_id=#id#] .state').attr('title','Date de valeur : '+_options.valueDate+'<br/>Date de collecte : '+_options.collectDate)
      $('.cmd[data-cmd_id=#id#] .state').attr('valueDate',_options.valueDate)
      
      var loadingDiv = document.getElementById("jqueryLoadingDiv");
      loadingDiv.className='hidden';
      
      var today = new Date();
      var yesterday = new Date();
      yesterday.setDate(today.getDate() - 1);
      
      getHistory('#id#', formatDate(yesterday), formatDate(today), '#unite#');

      $('.cmd[data-cmd_id=#id#] .state').empty().append(Number.parseFloat(_options.display_value).toFixed(1) + " #unite#");			
            
      durationSinceLastUpdate(_options.valueDate, $('.cmd[data-cmd_id=#id#]').find('.timeCmd'));      

      // Every 60s, durationSinceLastUpdate is computed
      var _el = $('.cmd[data-cmd_id=#id#]').find('.timeCmd');
      if(_el.attr('data-interval') != undefined){
        clearInterval(_el.attr('data-interval'));
      }  
      var myinterval = setInterval(function(){      
        durationSinceLastUpdate($('.cmd[data-cmd_id=#id#] .state').attr('valueDate'), _el);      
      }, 60000);
      _el.attr('data-interval', myinterval);
    }

    jeedom.cmd.update['#id#']({display_value:'#state#',valueDate:'#valueDate#',collectDate:'#collectDate#',alertLevel:'#alertLevel#'/*,minHistoryValue:'#minHistoryValue#'*/});

  </script>
</div>
1 « J'aime »

vu que tu partages, et je ne sais pas si tu as saisi comment cherché l’info
jeedom quand on met rien
jeedom nous offres les info brut

exemple
tu as mis le dernier changement de valeur, hors si tu as mis en lissage ne pas répeter tu peux te retrouvé avec un temps +++ ex 20mn, et le retour de l’equipement sans changement de valeur peut être aussi important ! pour le mettre dans ton info ou un design,…

on retrouve la date de la derniére communication « update » dans le paramêtre du virtuel (ou équipement)
param
ensuite informations (onglet) afin d’avoir l’info brut
param%20brut

et on retrouve cette info

le code js api brut « afin d’avoir le retour dans la console »
il est simplifié, à toi d’ingrémenté ensuite. avec update ou non

jeedom.cmd.byId me donne eqLogic_id →
jeedom.eqLogic.byId me donne lastcommunication

<div class="cmd" data-cmd_id="3641">
	<script>
		jeedom.cmd.update['3641'] = function(_options){
      jeedom.cmd.byId({ 
            id: 3641,
      })
	//		$('.cmd[data-cmd_id=#id#]').attr('title','Valeur du '+_options.valueDate+', collectée le '+_options.collectDate)
	//		$('.cmd[data-cmd_id=#id#] .state').empty().append(_options.display_value);
	
           jeedom.eqLogic.byId ({
				id: 392, // id objet
   //                             success:  function(valeur_courante) {
     //                             alert(valeur_courante);
//	    $('.cmd[data-cmd_id=#id#]').attr('data-state', _options.display_value);
//  alert(valeur_courante);
		})
           	}
		jeedom.cmd.update['3641']();
	</script>
</div>

soit en indiquant l’id
il va cherché l’id équipements
et du résultat va cherché la dernière communication
et te l’affiche

      <div class="myrow">
        <script>
	jeedom.cmd.byId({ 
	id: 3641,
		success:  function(resultat){
 //$('.myrow').empty().text(resultat.eqLogic_id);
                    
			jeedom.eqLogic.byId ({
			id: resultat.eqLogic_id, 
				success:  function(resultat_info) {
				$('.myrow').empty().text(resultat_info.status.lastCommunication);
                  }
			})

		}

	})
	</script>
</div>

Bonsoir la communauté,

Merci beaucoup pour l’information et la précision. En fait, c’est bien la date du dernier changement qui m’intéresse (et pas la date de la dernière réception d’une valeur). Et tu as bien raison, j’ai parfois des durées très importantes. :slight_smile: Dans ces cas là, cela m’indique que la valeur est stable. Si la valeur devient très très importante (ex. Plusieurs heures), c’est que j’ai un problème de communication.

Bonjour,
J’aime bien votre Widget mais quand j’utilise votre code, je n’obtiens pas la même chose (NB : Je suis nul en code :wink: ) :
image

et j’ai l’erreur suivante au chargement du design :
Uncaught TypeError: Cannot read property ‹ split › of undefined

Une idée ?

Bonsoir,
Quelle version de Jeedom utilisez-vous ?

Bonjour,

Le widget est exactement ce que je recherche mais lorsque je l’applique j’ai ça :

image

il y a t’il quelque chose à faire de plus ?

Je suis en Jeedom V4.0.61

Merci

Salut,

Et en agrandissant la tuile ?

Non pas mieux :frowning_face:

Tu as pensé à cocher « Afficher les stats » dans affichage de ta commande ?

Bonjour @ajja17orange
Je peux retrouver ton widget sonde température quelque part ?

tu as plus d’info ?
Il y en a 1 ou 2 de n’adapterai pas en v4 « vu le temps que ça prend, enfin ça peu me piquer »
celui du sujet j’ai pas, hormis le refaire !

Salut, merci mais je ne vois pas cette option

Pas grave je vais fouiller. Merci.

Salut,

Si j’ai bien compris ta question et que ce qu’il te manque c’est le min/max alors pour les voir tu vas dans ton virtuel « Salle de douche » ensuite onglet « Commandes »,
Tu cliques sur l’engrenage de ta température et ensuite onglet « Affichage » puis tu coche « Afficher les statistiques »

Salut,

Mais je n’ai pas la case Afficher les statistiques