[Tuto] Afficher des prévisions sous forme de graphique

Bon allez je me lance dans mon premier tuto, et j’en suis pas peu fier !
Tout d’abord merci à @Bison pour l’aide qu’il m’a apporté, le bloc code est 90% de son fait !

Ce tuto vous permettra donc d’afficher dans JC sous forme de graphique (historique) une prévision. Dans mon cas la prévision de pluie dans l’heure mais ça pourrait être le vent, la température, … du moment que vous avez ces infos stockées dans des commandes (une commande par créneau de prévision).
J’ai eu l’idée en voyant ce que proposait @Djelau dans ce fil pour un affichage sur le dashboard jeedom.

On commence une fois n’est pas coutume avec le rendu final (j’ai triché car j’ai pas de pluie chez moi en ce moment :stuck_out_tongue: , ne faites pas attention à la parenthèse du titre qui n’est pas raccord avec la courbe) :

Les prérequis :

  • activer dans les paramètres Jeedom l’historisation dans le futur (voir plus bas)
  • avoir un plugin qui remonte des infos de prévision dans des commandes. Dans mon cas j’utilise le plugin-meteofrance et ses commandes « Rainrain » qui donne une intensité de pluie de 1 à 4 par créneau de 5 à 10 minutes dans l’heure qui vient. Mais ça pourrait être aussi des commandes issus du script de @Djelau qui récupère 60 infos depuis l’API Openweathermap.

Ce qu’il va falloir faire :
1- concaténer toutes les commandes de prévision dans une seule qui sera ensuite historisée dans le futur
2- les afficher dans un widget historique JC.

On y va !
0- pour activer les dates dans le futur pour l’historique ça se passe ici :
Réglages > Système > Configuration puis onglet Equipements : cocher « Autoriser les dates dans le futur » (merci Bison !)
1- pour rassembler les commandes de prévision dans une seule il faut :

  • créer un virtuel avec une commande de type « Autre », ici appelée Prévision pluie et noter son id (
    1509 dans mon cas). Subtilité : l’historisation de cette commande doit se faire sans lissage (donc chosir « Aucun » dans la Config avancée de la commande, et également il faut autoriser la répétition de valeurs. Sans cela les heures remontées ne seront pas exactes.
  • créer le scénario avec le bloc code ci-dessous, et qui a comme déclencheur une commande de prévision (ou toutes. En tous cas l’idée c’est que ce scénario se lance dès qu’une prévision change). Dans mon cas j’ai mis en déclencheur la commande « Date de début de prévision » du plugin meteofrance qui se met à jour toutes les 5 minutes.
    Le code en question :
history::removes(1509,$_startTime=date('Y-m-d H:i:s', strtotime(date() . '-24 hour')), $_endTime=date('Y-m-d H:i:s', strtotime(date() . '+24 hour')));

$tmp_date = cmd::byId(1268)->execCmd();
$str_datetime = date('Y-m-d '.substr($tmp_date,0,2).':'.substr($tmp_date,2,2).':00');


$a = array(
  $value=cmd::byId(1270)->execCmd()-1,
  $value=cmd::byId(1272)->execCmd()-1,
  $value=cmd::byId(1274)->execCmd()-1,
  $value=cmd::byId(1276)->execCmd()-1,
  $value=cmd::byId(1278)->execCmd()-1,
  $value=cmd::byId(1280)->execCmd()-1,
  $value=cmd::byId(1282)->execCmd()-1,
  $value=cmd::byId(1284)->execCmd()-1,       $value=cmd::byId(1286)->execCmd()-1);

foreach ($a as $key => $value) {	
  if ($key<=6)
  {$d = date('Y-m-d H:i:s', strtotime($str_datetime . '+'.($key*5).' minute'));}
  else
  {$d = date('Y-m-d H:i:s', strtotime($str_datetime . '+'.($key*10-30).' minute'));}
  cmd::byId(1509)->event($value, $d);
}

Un peu d’explications:

  • premier bloc je nettoie l’historique à ±24h de la commande à historiser, pour ne pas que les nouvelles valeurs se télescopent aux anciennes (pas sûr que ce soit utile, mais au moins ça saturera pas l’espace disque!). Pour rappel l’id 1509 c’est ma commande virtuelle qui est historisée.
  • ensuite dans $tmp_date je récupère la date (et heure-minutes) de début de prévision, fournie par le plugin meteofrance (« Rainheure » ou id 1268). Cette valeur est au format HHMM donc je la convertis en « Y-m-d HH:ii:SS » dans $str_datetime.
    Ensuite je crée un array $a que je remplis avec les 9 valeurs « Rainrain » fournies par le plugin meteofrance que j’appelle grâce à leur id (id 1270 à 1286). On peut imaginer en avoir 60 si on prend le script de Djelau mentionné plus haut. A noter que je soustrais 1 à chaque valeur car l’info fournie par meteofrance est une intensité de pluie qui va de 1 à 4, et je préfère avoir 0 si pas de pluie annoncée.
    Enfin pour chaque valeur existant dans l’array j’y associe la date en partant de la date initiale str_datetime que j’incrémente de 5 minutes à chaque fois (le pas utilisé par meteofrance), et je stocke le couple valeur/date dans l’historique de la commande finale (id 1509).
    Petite subtilité : les 3 dernières précisions fournies par meteofrance passent sur un créneau de 10 minutes au lieu de 5, donc si on est à la 6e valeur ou plus je change le pas d’incrémentation. D’où le if/else.

Voilà, on a enfin une commande avec 9 valeurs historisées dans le futur, maintenant on peut jouer avec JC pour l’afficher !

2- Dans JC je crée un widget Historique avec la valeur historisée en statut, et en infos supplémentaires les commandes du plugin meteofrance : « Pluie dans l’heure » et « Durée avant la prochaine pluie », que j’ajoute entre parenthèses dans le titre.
Je mets deux images de parapluie sous condition : si « Pluie dans l’heure » =9 (le minimum possible d’après meteofrance) alors parapluie fermé gris, si > 9 parapluie ouvert rouge.


Je le paramètre avec « Dates dans le futur », intervalle de 1 jour, type Ligne et interpolation Paliers(j’ai essayé en type Barres et ça affiche tout au même niveau, étrange…).

En personnalisation je masque le statut (car toujours à zéro puisque la commande n’a des valeurs que dans le futur), je masque la légende verticale et je regle l’axe vertical de 0 à 4.
Et pis c’est tout !

Voilà, je vous laisse vous l’approprier et surtout le critiquer (de manière constructive :smiley: ) pour l’améliorer. J’ai tout fait sur mobile donc le formatage est peut-être mouen, et bien évidemment le bloc code est à la hauteur de mes connaissances : limitées :slight_smile: !

2 « J'aime »

Maintenant que je suis lancé on m’arrête plus :smiley: ! J’ai appliqué le même concept pour les prévisions de température, également fournies par le plugin-meteofrance. Seule subtilité : les 9 prévisions en question (commandes « MeteoHour0Json », « MeteoHour1Json », etc… ) sont sous la forme d’une chaîne de caractères issue d’un Json dont il faut donc extraire l’info de température souhaitée avec la fonction substr(). Je vous passe les détails, mon code est moche :stuck_out_tongue:
Même subtilité que pour l’historique ci-dessus : il faut bien choisir « Aucun » lissage pour la commande à historiser sinon les heures ne seront pas exactes.

Le résultat :

Edit : le code est maintenant propre (et les lectures des json correctes :slight_smile: ) grâce à @jpty, je le partage donc ci-dessous.
Précisions :

  • l’id 1524 correspond à la commande à historiser dans le futur. On commence par vider son historique avant de le remplir
  • l’id 1258 correspond à la commande MeteoHour0Json du plugin météofrance, les suivantes 'Hour1, Hour2" ayant les id consécutifs on peut utiliser l’incrémentation de la boucle for pour les récupérer !
    Ce scénario bloc code est en mode provoqué aveec la commande MeteoHour9Json (la dernière à se mettre à jour) en déclencheur.
history::removes(1524,$_startTime=date('Y-m-d H:i:s', strtotime(date() . '-24 hour')), $_endTime=date('Y-m-d H:i:s', strtotime(date() . '+24 hour')));


for ($i = 0; $i < 9; $i++) {
 $d = date("Y-m-d H:i:s",meteofrance::getJsonInfo(1258+$i,'dt'));    $value=meteofrance::getJsonInfo(1259+$i,'T>value');
 cmd::byId(1524)->event($value, $d);
}
3 « J'aime »

Un seul déclencheur sur MeteoHour9Json devrait être suffisant. Toutes les MeteoHour#Json se mettent à jour ensemble et la 9 est la dernière.
Ca éviterait les MAJ multiples.

Au top, j’édite :slight_smile: ! Merci encore pour ton aide.