J’ai pas mal cherché pour trouver un widget « pluviomètre » sympa en v3, mais sans succès
Du coup, j’ai fait comme pour les autres de ma station météo, je me le suis fabriqué :
Voici donc comment le reproduire pour ceux que ça intéresse.
Tout d’abord, je me suis inspiré du widget de ‹ Desaydrone › qu’on peut voir sur ce lien : Multi Progress Bar · Desaydrone/jeedom_v4_widget Wiki · GitHub
Merci à lui pour l’idée et le code.
Puis je me suis créé une sorte de petit pluviomètre sous totoshop que voici (je sais, je ne suis pas super doué lol) :
Libre à vous de faire mieux, ça ne devrait pas être difficile
Et je me suis ensuite attaqué au script pour afficher une progress bar verticale avec effet d’animation via les classes CSS « progress-bar-striped active », qui permettent de conserver le sommet bien plat au lieu de faire des vagues.
On peut faire deux réglages en les passant dans les paramètres de l’équipement :
- « min_max » = « minimum,maximum » (min et max du niveau de la « cuve » de pluie)
- « position_valeur » = « int » ou « ext » : affichage des valeur et unités dans le niveau de pluie, ou à l’extérieur gauche de la jauge, comme sur le pluviomètre ‹ semaine › de mon screenshot.
Voici comment faire sur votre équipement :
Et voici le code du script, à coller dans un nouveau Widget de type ‹ info › et sous-type ‹ numérique › (je vous ai laissé tous mes commentaires pour pouvoir le modifier à votre sauce si vous le souhaitez :
<!-- Widget perso LMQT, inspiré du widget de 'Desaydrone' : https://github.com/Desaydrone/jeedom_v4_widget/wiki/Multi-Progress-Bar
& https://community.jeedom.com/t/centralisation-de-mes-petits-widget/19715
Infos sur la commande "progressbar" : https://www.w3schools.com/bootstrap/bootstrap_progressbars.asp
Il est aussi possible de faire le remplissage avec un dégradé en guise de background : https://www.pierre-giraud.com/html-css-apprendre-coder-cours/degrade-lineaire-linear-gradient/
Valeurs à passer en paramètres de l'équipement (onglet affichage) (sans les guillemets) :
"min_max" = "minimum,maximum" : min et max du niveau de la "cuve" de pluie. Si rien en option et rien dans l'équipement, ce sera 0 à 100%.
"position_valeur" = "int" ou "ext" : affichage des valeur et unités dans le niveau de pluie (par défaut), ou à l'extérieur gauche de la jauge (si précisé).
Nota : Il n'y a pas de valeurs normées sur les précipitations, mais Météo France considère habituellement ces valeurs moyennes :
Pluie faible continue = 1 à 3 mm/h
Pluie modérée = 4 à 7 mm/h
Pluie forte = 8 mm/h et plus
Pluies orageuses = parfois plus de 100 mm/h
Moyenne annuelle France = De 500 à 2400 mm suivant la localisation (point médian 800)
Moyenne mensuelle France= De 20 à 300 mm suivant la localisation (point médian 100)
-->
<div style="padding:0;width:110px;height:150px;" class="tooltips cmd cmd-widget"
data-type="info" data-subtype="numeric" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#"
title="Date de valeur : #valueDate#<br/>Date de collecte : #collectDate#" >
<div style="font-weight: bold;font-size : 12px;#hideCmdName#">#name_display#</div> <!-- Le titre -->
<!-- ########## Progress bar verticale ########## -->
<div class="imgfond" style="height:140px;"> <!-- le div auquel on ajoute l'image de fond -->
<div class="progress vertical" style="position:relative;top:6px;"> <!-- On décale vers le bas pour être 'dans' l'image de fond -->
<div class="progress-bar vertical_bar#id# progress-bar-striped active" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100">
<div class="texte_horizontal#id#"><span><!--#state# #unite#--></span></div> <!-- Valeur et unité DANS le remplissage, ajoutées via le javascript -->
</div>
</div>
<!-- div historique -->
</div>
<!-- ########## Fin progress bar verticale ########## -->
<div class="texte_vertical#id#" style="padding:0;top:25px;left:7px;"><!--#state# #unite#--></div> <!-- Valeur et unité HORS du remplissage, ajoutées via le javascript -->
<div style="width:110px;#displayHistory#;font-size: 9px;position:absolute;top:132px;" class="center-block col-xs-12">
<span title="Min" class="tooltips">#minHistoryValue#</span>|<span title="Moyenne" class="tooltips" >#averageHistoryValue#</span>|<span title="Max" class="tooltips">#maxHistoryValue#</span> <i class="#tendance#"></i>
</div>
</div>
<style>
:root {
--v_ColNivPluie#id#: '#000000';
}
.imgfond {
background-image:url(montheme/icones/meteo/pluviometre-02-120x120.png);
background-repeat:no-repeat;
background-size : 120px 120px;
background-position: top 1px center;
}
.vertical { /* Le cadre du remplissage */
width: 59px;
height: 95px; /* à prendre en compte dans le script pour la calcul du 100% de remplissage */
margin-right: 0px;
border-radius: 2px !important;
transform: rotate(180deg);
margin: 0 auto;
background-color: transparent;
}
.vertical_bar#id# { /* Le remplissage en lui-même */
width: 100%;
height: 100%;
transition: height 0.6s ease;
display: flex;
background-color: var(--v_ColNivPluie#id#) !important;
height: #value#%; /*la hauteur est modifiée via le javascript*/
}
.texte_horizontal#id# {
position: relative;
margin: auto;
color: white;
font-size: 12px;
text-shadow: 1px 1px black;
transform: rotate(180deg);
}
.texte_vertical#id# {
position: absolute;
display:inline-block;
margin: auto;
font-family: Arial, sans-serif; /*Roboto;*/
font-weight: normal;
font-size: 12px;
color: white;
text-shadow: 1px 1px black;
writing-mode: vertical-lr;
text-orientation: sideways;
transform: rotate(-180deg);
text-align: center;
}
</style>
<script>
// ##### DEBUT RECUPERATION PARAMETRES #####
// Paramètres min et max du graphisme de remplissage :
var v_min_max = !("#min_max#" == '#'+'min_max#');
if (v_min_max == false) { // pas de paramètres passés, donc on prends les valeurs du virtuel si définies, sinon de 0 à 100
var v_GraphMin = ('#minValue#' == '') ? 0 : parseInt('#minValue#');
var v_GraphMax = ('#maxValue#' == '') ? 100 : parseInt('#maxValue#');
} else { // On a des paramètres en option, on les prends
var v_min_max = '#min_max#' ;
var v_min_max_liste = v_min_max.split(",");
var v_GraphMin = parseFloat(v_min_max_liste[0]);
var v_GraphMax = parseFloat(v_min_max_liste[1]);
}
// Position 'int' ou 'ext' de l'affichage de la valeur et unité :
var v_pos_valeur = 'int' // Par défaut, affichage de la valeur DANS le remplissage du graphisme
var v_pos_valeur_test = !("#position_valeur#" == '#'+'position_valeur#');
if (v_pos_valeur_test == true) { // On a des paramètres en option, on les prends
v_pos_valeur = '#position_valeur#';
} else { // pas de paramètres passés, donc on prends la valeur 'in' par défaut
v_pos_valeur = 'int';
}
// ##### FIN RECUPERATION PARAMETRES #####
jeedom.cmd.update['#id#'] = function(_options) {
var cmd = $('.cmd[data-cmd_id=#id#]');
var valeur = _options.display_value;
var unite = ('#unite#' == '') ? 'numerique' : '#unite#';
// ##### DEBUT Transformation de la valeur en pourcentage pour déterminer la hauteur du cadre de remplissage #####
if (unite != '%') { // L'unité n'est pas définie sur %, donc on convertit :
valeur = parseFloat(((valeur * 100) / v_GraphMax));
valeur = (valeur * 0.95).toFixed(1); // On prends le pourcentage de la hauteur définie pour le cadre ".vertical" qui est de 95px, donc x0.95
}
if (valeur < 0 || valeur > 100) {
valeur = 0;
cmd.find('.texte_horizontal#id#').empty().append('Err');
cmd.find('.texte_vertical#id#').empty().append('Err');
} else {
cmd.find('.vertical_bar#id#').attr('style', 'height: ' + valeur + '%;');
}
cmd.find('.texte_horizontal#id#').empty().append('#state#' + ' #unite#'); // Soit on affiche les valeurs et unité ici pour mises à jours auto, soit directement dans les div mais nécessite F5.
cmd.find('.texte_vertical#id#').empty().append('#state#' + ' #unite#');
// ##### FIN Transformation de la valeur en pourcentage pour déterminer la hauteur du cadre de remplissage #####
// Dégradé de bleu clair à moyen ("#E3F2FD,#BBDEFB,#90CAF9,#64B5F6,#2196F3") :
// Dégradé de bleu moyen à foncé ("#BBDEFB,#90CAF9,#64B5F6,#2196F3,#1E88E5") :
if(valeur < 20) {
document.documentElement.style.setProperty('--v_ColNivPluie#id#', '#BBDEFB');
} else if(valeur >= 20 && valeur < 40) {
document.documentElement.style.setProperty('--v_ColNivPluie#id#', '#90CAF9');
} else if(valeur >= 40 && valeur < 60) {
document.documentElement.style.setProperty('--v_ColNivPluie#id#', '#64B5F6');
} else if(valeur >= 60 && valeur < 80) {
document.documentElement.style.setProperty('--v_ColNivPluie#id#', '#2196F3');
} else if(valeur >= 80) {
document.documentElement.style.setProperty('--v_ColNivPluie#id#', '#1E88E5');
}
// Masquage des valeur et unité DANS ou HORS du graphique :
if (v_pos_valeur == 'int') {
cmd.find('.texte_vertical#id#').hide();
cmd.find('.texte_horizontal#id#').show();
} else {
cmd.find('.texte_vertical#id#').show();
cmd.find('.texte_horizontal#id#').hide();
}
// Création du tooltip :
var v_title = '→ #state# #unite# ←';
v_title = v_title + ' \nVariable «display_value» = ' + _options.display_value;
v_title = v_title + '\nHauteur calculée = ' + valeur + '%';
v_title = v_title + '\nOptions de l\'équipement = ' + v_min_max;
v_title = v_title + '\nValeurs min & max = ' + v_GraphMin + ' / ' + v_GraphMax;
v_title = v_title + '\n\nValeur du ' + _options.valueDate + '\nCollectée le ' + _options.collectDate;
$('.cmd[data-cmd_id=#id#]').attr('title', v_title);
}
jeedom.cmd.update['#id#']({
display_value: '#state#',
valueDate: '#valueDate#',
collectDate: '#collectDate#',
alertLevel: '#alertLevel#'
});
</script>
NOTA :
- attention aux guillemets et apostrophes lors du copier-coller
- pensez bien à modifier le chemin de l’image suivant où vous la placez chez vous
Voilà, bonne perso à tous
Suite à plusieurs demandes, voici les petites modif nécessaires pour la v4 (il s’agit du code complet bien entendu, donc à recopier tel-quel) :
<!-- Widget perso LMQT, inspiré du widget de 'Desaydrone' : https://github.com/Desaydrone/jeedom_v4_widget/wiki/Multi-Progress-Bar
& https://community.jeedom.com/t/centralisation-de-mes-petits-widget/19715
Infos sur la commande "progressbar" : https://www.w3schools.com/bootstrap/bootstrap_progressbars.asp
Il est aussi possible de faire le remplissage avec un dégradé en guise de background : https://www.pierre-giraud.com/html-css-apprendre-coder-cours/degrade-lineaire-linear-gradient/
Valeurs à passer en paramètres de l'équipement (onglet affichage) (sans les guillemets) :
"min_max" = "minimum,maximum" : min et max du niveau de la "cuve" de pluie. Si rien en option et rien dans l'équipement, ce sera 0 à 100%.
"position_valeur" = "int" ou "ext" : affichage des valeur et unités dans le niveau de pluie (par défaut), ou à l'extérieur gauche de la jauge (si précisé).
Nota : Il n'y a pas de valeurs normées sur les précipitations, mais Météo France considère habituellement ces valeurs moyennes :
Pluie faible continue = 1 à 3 mm/h
Pluie modérée = 4 à 7 mm/h
Pluie forte = 8 mm/h et plus
Pluies orageuses = parfois plus de 100 mm/h
Moyenne annuelle France = De 500 à 2400 mm suivant la localisation (point médian 800)
Moyenne mensuelle France= De 20 à 300 mm suivant la localisation (point médian 100)
-->
<div style="padding:0;width:110px;height:150px;" class="tooltips cmd cmd-widget"
data-type="info" data-subtype="numeric" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#"
title="Date de valeur : #valueDate#<br/>Date de collecte : #collectDate#" >
<div class="cmdName #hide_name#" style="font-weight: bold;font-size : 12px">#name_display#</div> <!-- Le titre -->
<!-- ########## Progress bar verticale ########## -->
<div class="imgfond" style="height:140px;"> <!-- le div auquel on ajoute l'image de fond -->
<div class="progress vertical" style="position:relative;top:6px;"> <!-- On décale vers le bas pour être 'dans' l'image de fond -->
<div class="progress-bar vertical_bar#id# progress-bar-striped active" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100">
<div class="texte_horizontal#id#"><span><!--#state# #unite#--></span></div> <!-- Valeur et unité DANS le remplissage, ajoutées via le javascript -->
</div>
</div>
<!-- div historique -->
</div>
<!-- ########## Fin progress bar verticale ########## -->
<div class="texte_vertical#id#" style="padding:0;top:25px;left:7px;"><!--#state# #unite#--></div> <!-- Valeur et unité HORS du remplissage, ajoutées via le javascript -->
<div style="width:110px;font-size: 9px;position:absolute;top:132px;" class="cmdStats #hide_history# center-block col-xs-12">
<span title="Min" class="tooltips">#minHistoryValue#</span>|<span title="Moyenne" class="tooltips" >#averageHistoryValue#</span>|<span title="Max" class="tooltips">#maxHistoryValue#</span> <i class="#tendance#"></i>
</div>
</div>
<style>
:root {
--v_ColNivPluie#id#: '#000000';
}
.imgfond {
background-image:url(montheme/icones/meteo/pluviometre-02-120x120.png);
background-repeat:no-repeat;
background-size : 120px 120px;
background-position: top 1px center;
}
.vertical { /* Le cadre du remplissage */
width: 59px;
height: 95px; /* à prendre en compte dans le script pour la calcul du 100% de remplissage */
margin-right: 0px;
border-radius: 2px !important;
transform: rotate(180deg);
margin: 0 auto;
background-color: transparent;
}
.vertical_bar#id# { /* Le remplissage en lui-même */
width: 100%;
height: 100%;
transition: height 0.6s ease;
display: flex;
background-color: var(--v_ColNivPluie#id#) !important;
height: #value#%; /*la hauteur est modifiée via le javascript*/
}
.texte_horizontal#id# {
position: relative;
margin: auto;
color: white;
font-size: 12px;
text-shadow: 1px 1px black;
transform: rotate(180deg);
}
.texte_vertical#id# {
position: absolute;
display:inline-block;
margin: auto;
font-family: Arial, sans-serif; /*Roboto;*/
font-weight: normal;
font-size: 12px;
color: white;
text-shadow: 1px 1px black;
writing-mode: vertical-lr;
text-orientation: sideways;
transform: rotate(-180deg);
text-align: center;
}
</style>
<script>
// ##### DEBUT RECUPERATION PARAMETRES #####
// Paramètres min et max du graphisme de remplissage :
var v_min_max = !("#min_max#" == '#'+'min_max#');
if (v_min_max == false) { // pas de paramètres passés, donc on prends les valeurs du virtuel si définies, sinon de 0 à 100
var v_GraphMin = ('#minValue#' == '') ? 0 : parseInt('#minValue#');
var v_GraphMax = ('#maxValue#' == '') ? 100 : parseInt('#maxValue#');
} else { // On a des paramètres en option, on les prends
var v_min_max = '#min_max#' ;
var v_min_max_liste = v_min_max.split(",");
var v_GraphMin = parseFloat(v_min_max_liste[0]);
var v_GraphMax = parseFloat(v_min_max_liste[1]);
}
// Position 'int' ou 'ext' de l'affichage de la valeur et unité :
var v_pos_valeur = 'int' // Par défaut, affichage de la valeur DANS le remplissage du graphisme
var v_pos_valeur_test = !("#position_valeur#" == '#'+'position_valeur#');
if (v_pos_valeur_test == true) { // On a des paramètres en option, on les prends
v_pos_valeur = '#position_valeur#';
} else { // pas de paramètres passés, donc on prends la valeur 'in' par défaut
v_pos_valeur = 'int';
}
// ##### FIN RECUPERATION PARAMETRES #####
jeedom.cmd.update['#id#'] = function(_options) {
var cmd = $('.cmd[data-cmd_id=#id#]');
var valeur = _options.display_value;
var unite = ('#unite#' == '') ? 'numerique' : '#unite#';
// ##### DEBUT Transformation de la valeur en pourcentage pour déterminer la hauteur du cadre de remplissage #####
if (unite != '%') { // L'unité n'est pas définie sur %, donc on convertit :
valeur = parseFloat(((valeur * 100) / v_GraphMax));
if (valeur > 100) { valeur = 100 }; // La valeur peut dépasser le max de la jauge car il est définit manuellement. Donc on la borne à 100% ici.
valeur = (valeur * 0.95).toFixed(1); // On prends le pourcentage de la hauteur définie pour le cadre ".vertical" qui est de 95px, donc x0.95
}
if (valeur < 0 || valeur > 100) {
valeur = 0;
cmd.find('.texte_horizontal#id#').empty().append('Err');
cmd.find('.texte_vertical#id#').empty().append('Err');
} else {
cmd.find('.vertical_bar#id#').attr('style', 'height: ' + valeur + '%;');
}
cmd.find('.texte_horizontal#id#').empty().append(_options.display_value + ' #unite#'); // Soit on affiche les valeurs et unité ici pour mises à jours auto, soit directement dans les div mais nécessite F5.
cmd.find('.texte_vertical#id#').empty().append(_options.display_value + ' #unite#');
// ##### FIN Transformation de la valeur en pourcentage pour déterminer la hauteur du cadre de remplissage #####
// Dégradé de bleu clair à moyen ("#E3F2FD,#BBDEFB,#90CAF9,#64B5F6,#2196F3") :
// Dégradé de bleu moyen à foncé ("#BBDEFB,#90CAF9,#64B5F6,#2196F3,#1E88E5") :
if(valeur < 20) {
document.documentElement.style.setProperty('--v_ColNivPluie#id#', '#BBDEFB');
} else if(valeur >= 20 && valeur < 40) {
document.documentElement.style.setProperty('--v_ColNivPluie#id#', '#90CAF9');
} else if(valeur >= 40 && valeur < 60) {
document.documentElement.style.setProperty('--v_ColNivPluie#id#', '#64B5F6');
} else if(valeur >= 60 && valeur < 80) {
document.documentElement.style.setProperty('--v_ColNivPluie#id#', '#2196F3');
} else if(valeur >= 80) {
document.documentElement.style.setProperty('--v_ColNivPluie#id#', '#1E88E5');
}
// Masquage des valeur et unité DANS ou HORS du graphique :
if (v_pos_valeur == 'int') {
cmd.find('.texte_vertical#id#').hide();
cmd.find('.texte_horizontal#id#').show();
} else {
cmd.find('.texte_vertical#id#').show();
cmd.find('.texte_horizontal#id#').hide();
}
// Création du tooltip :
var v_title = '→ #state# #unite# ←';
v_title = v_title + ' <br>Variable «display_value» = ' + _options.display_value;
v_title = v_title + '<br>Hauteur calculée = ' + valeur + '%';
v_title = v_title + '<br>Options de l\'équipement = ' + v_min_max;
v_title = v_title + '<br>Valeurs min & max = ' + v_GraphMin + ' / ' + v_GraphMax;
v_title = v_title + '<br><br>Valeur du ' + _options.valueDate + '<br>Collectée le ' + _options.collectDate;
$('.cmd[data-cmd_id=#id#]').attr('title', v_title);
}
jeedom.cmd.update['#id#']({
display_value: '#state#',
valueDate: '#valueDate#',
collectDate: '#collectDate#',
alertLevel: '#alertLevel#'
});
</script>