Graphe d' historique de consommation par mois

Bonjour,
Je souhaite pouvoir afficher dans JC un graphe d’historique de consommation par mois sur une année (avec des barres), et…ben j’y arrive pas :frowning: . J’ai essayé avec le widget historique mais il n’y a pas de fonction groupement et ça rend du coup la chose plus compliquée. Je sais seulement le faire sur l’outil d’historique de Jeedom.

Quelqu’un peut il m’aider ? Quel est le best practice ?

Pour info:

Je dispose en entrée d’un historique quotidien de ma conso du jour (enfin la veille), du mois en cours, ou de l’année en cours (plugin enedis).

J’obtiens le graphe attendu avec l’outil d’analyse d’historique de Jeedom en prenant l’historique de ma conso du jour ET en sélection le groupement de somme par mois.

Merci d’avance pour vos tuyaux :slightly_smiling_face:

Bonjour @Jerome_Lescure

même pb. Impossible à gérer coté JC qui ne fait qu’afficher les données
Pour ma part, j’ai un virtuel historisé qui fait la somme des consos jour et positionne la valeur au dernier jour du mois

bloc code du virtuel :

$cmdSource = '#[Electricité][Données Enedis][Consommation Jour]#';
$cmdCible = '#[Electricité][_Données Enedis][Consommation mois]#' ;

$annees = array('2022','2023') ;
$touslesmois = array('January','February','March','April','May','June','July','August','September','October','November','December') ;
  
$cmdSourceId = cmd::byString($cmdSource)->getId();

foreach ( $annees as $annee ) {
  foreach ($touslesmois as $mois ) {
    $debut = date("Y-m-d 00:00:00", strtotime('first day of '.$mois.' '.$annee)) ;
    $fin = date("Y-m-d 23:59:00", strtotime('last day of '.$mois.' '.$annee)) ;
    $now = date("Y-m-d 23:59:00", strtotime('now')) ;
    
    $sum_conso = history::getStatistique($cmdSourceId, $debut, $fin)["sum"];

    if ( $sum_conso > 0 ) {
      $scenario->setLog($mois.' '.$annee.' --> '.$debut.' --> '.$fin.' --> '.round($sum_conso,0).'kWh');
      cmd::byString($cmdCible)->event(round($sum_conso,0),$fin);
    }
  }
} 

Lancé toutes les nuit à 6h

Normalement, tu as juste à modifier $cmdSource et $cmdCible

Il recalcul à chaque fois tous l’historique, donc si tu veux les données su rles années anterieures, il suffit de rajouter les années voulues dans $annees

Norbert

1 « J'aime »

Oh Norbert, c’est trop sympas d’avoir partagé ton scénario. C’est exactement ce que je voulais m’épargner de faire car ça prends toujours trop de temps pour un (très) ancien codeur comme moi dans nos journées chargées.
Je vais l’adapter et ne manquerai pas de donner des nouvelles.

Très bonne journée à toi

Jérôme

1 « J'aime »

J’ai juste un doute pour le mois en cours, ca fait longtemps que je n’ai pas verifié, mais comme je force la valeur au dernier jour du mois, je ne pense pas qu’elle s’affiche dans JC

Petite réflexion pour ceux qui bossent derrière JC:
ce serait une évolution qui, je pense, répondrait à une grosse demande, de permettre au widget Historique différentes formes de regroupement comme le fait l’outil d’historique de Jeedom.
Maintenant, je dis ça, je sais ce que c’est qu’une backlog et je suis déjà tellement impressionné par le travail abattu sur ce projet avec de surcroit une belle stabilité. :wink:

tu m’en diras tant … on groule sous les sujets identiques, ya qu’a voir sur le forum ! :smiley:

1 « J'aime »

Oui, en effet, ça pose un problème avec l’affichage du mois en cours.
J’ai fait un mini correctif mais on peut dire que tu as fait 99.9% du boulot ! :wink:
J’ai simplement changé la date de la valeur historisée chaque mois sur le premier jour du mois au lieu du dernier et ça fonctionne ($debut à la place de $fin sur la dernière ligne de code) !!! :smiley:

$cmdSource = '#[Energie][Linky][Consommation Jour]#';
$cmdCible = '#[Energie][Electricité][Consommation Mois]#' ;

$annees = array('2020','2021','2022','2023') ;
$touslesmois = array('January','February','March','April','May','June','July','August','September','October','November','December') ;
  
$cmdSourceId = cmd::byString($cmdSource)->getId();

foreach ( $annees as $annee ) {
  foreach ($touslesmois as $mois ) {
    $debut = date("Y-m-d 00:00:00", strtotime('first day of '.$mois.' '.$annee)) ;
    $now = date("Y-m-d 23:59:00", strtotime('now')) ;
    $fin = date("Y-m-d 23:59:00", strtotime('last day of '.$mois.' '.$annee)) ;
    
    $sum_conso = history::getStatistique($cmdSourceId, $debut, $fin)["sum"];

    if ( $sum_conso > 0 ) {
      $scenario->setLog($mois.' '.$annee.' --> '.$debut.' --> '.$fin.' --> '.round($sum_conso,0).'kWh');
      cmd::byString($cmdCible)->event(round($sum_conso,0),$debut);
    }
  }
} 

1 « J'aime »

Par contre, petit soucis indépendant de mon fix:
à chaque fois qu’on rentre dans le widget, celui ci redéfinit la période sur les 30 derniers jours, du coup si on veut avoir une vue persistente sur 1 an, il faut afficher la carte et empécher de voir les détails. C’est embétant quand même lorsqu’on a un aperçu sous forme de vignette et qu’en cliquant dessus on retombe sur une période d’1 mois…

C’est quand même étonnant qu’il n’ai pas été prévu de pouvoir définir la plage dans l’édition du widget.
Ou même sans même ajouter cette fonctionnalité, il suffirait que l’« Intervalle historique » fonctionne car au dela de 30 jours ça ne semble aps marcher…

Si si, en edition (sur app), tu peux definir « intervale historique »

Merci pour la correction pour le mois en cours !!! c’était tout simple

Si ca t’intéresse, j’ai rajouter

  1. un test qui evite de re-enregistrer l’instorique d’un mois si la valeur est la meme
  2. quelques stats dans le script :
    1. Estimation mois en cours
    2. Variation par rapport à l’année derniere

IL suffit de creer quelques autres commandes virtuelles :

$cmdSource = '#[Energie][Linky][Consommation Jour]#';
$cmdCible = '#[Energie][Electricité][Consommation Mois]#' ;
$cmdEstimation='#[Electricité][_Données Enedis][Estimation mois]#';
$cmdVariation='#[Electricité][_Données Enedis][Variation N-1]#';
$cmdDate='#[Electricité][_Données Enedis][Date valeur]';

//$cmd_historique_mois_source = '#[Electricité][Données Enedis][Consommation Jour]#';
//$cmd_historique_mois_cible = '#[Energies][Données Energies ][Enedis par mois]#' ;

$annees = array('2021','2022','2023') ;
$touslesmois = array('January','February','March','April','May','June','July','August','September','October','November','December') ;
  
$cmdSourceId = cmd::byString($cmdSource)->getId();
$cmdCibleId = cmd::byString($cmdCible)->getId();

// integration des historiques mensuels
foreach ( $annees as $annee ) {
  foreach ($touslesmois as $mois ) {
    $debut = date("Y-m-d 00:00:00", strtotime('first day of '.$mois.' '.$annee)) ;
    $fin = date("Y-m-d 23:59:00", strtotime('last day of '.$mois.' '.$annee)) ;
    $now = date("Y-m-d 23:59:00", strtotime('now')) ;
    
    // Calcul de la conso du mois
    $sum_conso = round(history::getStatistique($cmdSourceId, $debut, $fin)["sum"],0);
    
    // verif d'une valeur déjà presenee
    try {
      $conso_archive = history::byCmdIdAtDatetime($cmdCibleId, $debut)->getValue() ;
    }
    catch(\Throwable $e) {
      $conso_archive = 0 ;
    }
    if ( $sum_conso > 0 ) {
      if ( $conso_archive != $sum_conso ) {
      	$scenario->setLog($mois.' '.$annee.' --> '.$sum_conso.' kWh');
      	cmd::byString($cmdCible)->event($sum_conso,$debut);
      }
      else $scenario->setLog($mois.' '.$annee.' --> Valeur déjà presente ('.$sum_conso.' kWh)') ;
    }
  }
} 

// calcul de l'estimation mensuelle et de la variation par rapport à l'année N-1
$ndayMonth = cal_days_in_month(CAL_GREGORIAN, date("m", strtotime('now')) , date("Y", strtotime('now')));
$day = date_create(cmd::byString($cmdSource)->getValueDate())->format('d') ;
$year = date_create(cmd::byString($cmdSource)->getValueDate())->format('Y') ;
$month = date_create(cmd::byString($cmdSource)->getValueDate())->format('m') ;
$dateValue = date_fr(date_create(cmd::byString($cmdSource)->getValueDate())->format('d M')) ;
$value = cmd::byString($cmdCible)->execCmd() ;

// Estiumaiton mois complet
$estimationMonth = round($value * $ndayMonth / $day,0) ;

// Variation par rapport à l'année N-1
$valueNmoin1 = history::byCmdIdAtDatetime($cmdCibleId, $year - 1 .'-'.$month.'-01 00:00:00')->getValue() ;
$variationNmoins1 = round( ( $estimationMonth - $valueNmoin1 ) * 100 / $valueNmoin1,0) ;

$scenario->setLog('Date: '.$dateValue.', Estimation '.$estimationMonth.' kWh, '.$variationNmoins1.'%');
cmd::byString($cmdEstimation)->event($estimationMonth) ;
cmd::byString($cmdVariation)->event($variationNmoins1) ;
cmd::byString($cmdDate)->event($dateValue) ;

Le résultat :

4 « J'aime »

Comment fais tu pour avoir une fonction de plein écran (petit bouton avec icone en forme de cadrage rectangulaire) dans le coin superieur droit de tes graphes ?

1 « J'aime »

Je suis un utilisateur privilégié (alpha testeur) … :wink:
Donc un petit teasing de ce qui arrive mais :shushing_face: sinon, je vais me faire engueuler par les chefs

3 « J'aime »

Haha, ça marche le teasing !! Tiens du coup je souffle une idée qui permettrait d’alléger beaucoup les interfaces utilisateurs notamment avec les historique, c’est un « CAROUSEL » de widget. On pourrait par exemple mettre l’historique par jour, par mois, par an et n’en voir qu’un à la fois.
Je dis ça je dis rien, c’est peut être déjà en backlog…

1 « J'aime »

Un widget carroussel dans lequel ou pourrait mettre plusieurs widgets :thinking:interessant

1 « J'aime »

Un peu compliqué car il y a déjà une action pour slider dans l’historique (quand on le zoom)

1 « J'aime »

Peut être que le slide pourrait ne s’appliquer que sur les zones pour lesquelles un slide n’est pas déjà défini (titre, …). L’idée c’est que de toute façon ce soit pas un carousel spécifique aux historiques mais à n’importe quel widget
Cela pourrait égalment être simplement des flèches sur les côté, ou même des onglets; enfin on peut imaginer toutes les commandes que l’on trouve habituellement sur un carousel web.

Cas d’utilisation avec onglet:
image

Cas d’utilisation avec des flèches:
image

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.