Intégrer graphique highcharts sur html display

Bonjour à tous, travaillant en ce moment sur de le gestion de système photovoltaïque je souhaiterai avoir un coup de main pour intégrer un graphique issu du site highcharts, puis y intégrer les valeurs de puissances mesurées par mes sondes.
Je rencontres 2 soucis :

  • tout d’abord pour intégrer le graph de démo du lien suivant sur ma page du plugin Html Display,

En copiant le code html et javascript, la tuile reste vide.

  • puis lier les valeurs des #id# jeedom au data du code.

Merci pour votre aide.

bonjour, pour ne pas te laisser en plan sans un petit mot :

1 c’est faisable assez rapidement
2 c’est faisable mais complexe !

:grinning:

  • puis lier les valeurs des #id# jeedom au data du code.

a) pour base de comment faire ; je te met un lien

b) en remontant le sujet tu y trouveras un widget ! « qui je croit te conviendra » que tu peux adapté au plug htmldisplay « puisque c’est le sujeti initial » si c’est ton souhait, mais rien ne t’y oblige :grinning:

vu qu’on est dans le sujet html display !

un tableau interactif highcharts
Sans-titre6

pour base de travail, j’avais envie de tester

(avoir un petit niveau quand même)

breve explication
c’est via la fonction js testeur d’expression (jeedom.scenario.testExpression)

              function testExpression(expressionE, nbr_name, nbr_cat) { 
                 jeedom.scenario.testExpression({
		expression: expressionE,
		success:  function(data) {
    // console.log(data.result);
	var valeurvariable = JSON.parse('['+nbr_name+','+data.result+']');
      //   console.log(valeurvariable);
 chart.series[nbr_cat].addPoint(valeurvariable, false);
 chart.redraw();
              }

		})    
 }

et la fonction est appelé 2 fois

           testExpression(expression1,1,0); // PA : YERVOY 0
          testExpression(expression2,1,1); // PA : SPRYCEL 1

pour l’exemple 2 variables

dans le code

		var expression1 = 'variable(variable_YERVOY)';
        var expression2 = 'variable(variable_SPRYCEL)';

ça modifie les 2 valeurs à 0 dans le code

var dataA = ['1, 0, 1, 1, 1', '2, 0, 2, 2, 2', '3, 3, 3, 3, 3', '4, 4, 4, 4, 4', dataA4];

amusez vous bien

<div>

<figure class="highcharts-figure">
    <div id="container" class="SHOW"></div>
    <p class="highcharts-description">
        This demo shows a smoothed area chart with an x-axis plot band
        highlighting an area of interest at the last two points. Plot bands
        and plot lines are commonly used to draw attention to certain areas or
        thresholds.
    </p>
  <script>
    var test=12;
        $(function() {
		var seriesA = "";
		var q;
		var seriesANew;
		var categoriesA = ['Benefits Investigation (BI)', 'Prior Authorization (PA)', 'Third Party Referrals', 'Appeals', 'Healthcare Assist (HCA)', 'Co-pay Claims'];
		var nameA = ['YERVOY', 'SPRYCEL', 'OPDIVO-YERVOY', 'OPDIVO', 'IXEMPRA'];
		var nameACount = nameA.length;
		var expression1 = 'variable(variable_YERVOY)';
        var expression2 = 'variable(variable_SPRYCEL)';
		var valeurvariable;
      
    var dataA4 = [3, 4, 4, 2, 1];
		var dataA = ['1, 0, 1, 1, 1', '2, 0, 2, 2, 2', '3, 3, 3, 3, 3', '4, 4, 4, 4, 4', dataA4];
		var visibilityA = [true, true, false, true, false];

		// add crosshair to xAxis upon clicking on an xAxis data label
		/*
    var addPlotBand = function(axis, index) {
				axis.removePlotBand('plot-band');
				axis.addPlotBand({
					from: index - 0.5,
					to: index + 0.5,
					color: '#FCFFC5',
					id: 'plot-band'
				});
			};
     */

		//create the series based on the above variables
		for (var q = 0; q < nameACount; q++) {
				seriesA += '{ "name": "' + nameA[q] + '",';
				seriesA += ' "data": [' + dataA[q] + '],';
				seriesA += ' "visible": ' + visibilityA[q] + ' },';
			}
      
    seriesANew = '[' + seriesA.substr(0, seriesA.length - 1) + ']';
		seriesANew = JSON.parse(seriesANew);
      
//	 console.log(seriesANew);

		/* --

			The variable 'seriesANew' returns the following:

			{ name: "YERVOY", data: [5, 3, 4, 7, 2], visible: false },{ name: "SPRYCEL", data: [2, 2, 3, 2, 1], visible: false },{ name: "OPDIVO-YERVOY", data: [3, 4, 4, 2, 1], visible: true },{ name: "OPDIVO", data: [3, 4, 4, 2, 2], visible: true },{ name: "IXEMPRA", data: [3, 4, 4, 2, 1], visible: true }

			I want to take this data and pass it into the 'series' option.

		-- */
                    
var chart = new Highcharts.Chart('container', {      
  				chart: {
				type: 'bar',
				renderTo: 'container'
			},
			title: {
				text: null
			},
			tooltip: {
				enabled: true
			},
			xAxis: {
				categories: categoriesA,
				crosshair: false,
				lineColor: '#fff',
				lineWidth: 1,
				minorGridLineWidth: 0,
				minorTickLength: 0,
				tickLength: 0,
				labels: {
					/* events: {
						click: function() {
							var chart = $('#container').highcharts(),
								xAxis = chart.xAxis[0],
								textStr = this.textStr;
							Highcharts.each(chart.xAxis[0].categories, function(p, i) {
								if (p === textStr) {
									addPlotBand(xAxis, i);
								}
							});
						},
						touchstart: function() {
							var chart = $('#container').highcharts(),
								xAxis = chart.xAxis[0],
								textStr = this.textStr;
							Highcharts.each(chart.xAxis[0].categories, function(p, i) {
								if (p === textStr) {
									addPlotBand(xAxis, i);
								}
							});
						},
					}
          */
				}
			},
			yAxis: {
				min: 0,
				title: {
					text: '# Cases'
				},
				stackLabels: {
					enabled: true,
					style: {
						fontWeight: 'bold',
						color: (Highcharts.theme && Highcharts.theme.textColor) || 'gray'
					}
				},
				lineWidth: 1,
				gridLineDashStyle: 'longdash',
				tickInterval: 2,
				labels: {
					enabled: false,
				}
			},
			legend: {
				reversed: true,
				x: 10
			},
			plotOptions: {
				series: {
					stacking: 'normal',
					states: {
						hover: {
							enabled: false
						}
					}
				}
			},
      
      series: seriesANew

			/* series: [{
				name: nameA[0],
				data: dataA0,
				visible: visibilityA[0]
			}, {
				name: nameA[1],
				data: dataA1,
				visible: visibilityA[1]
			}, {
				name: nameA[2],
				data: dataA2,
				visible: visibilityA[2]
			}, {
				name: nameA[3],
				data: dataA3,
				visible: visibilityA[3]
			}, {
				name: nameA[4],
				data: dataA4,
				visible: visibilityA[4]
			}] */

			/*--

				instead of the above series option, I want to load my data variable 'seriesANew' instead like this:

				series: [seriesANew]

				is this possible??

			-- */


		});
          
           testExpression(expression1,1,0); // PA : YERVOY 0
          testExpression(expression2,1,1); // PA : SPRYCEL 1
          
              function testExpression(expressionE, nbr_name, nbr_cat) { 
                 jeedom.scenario.testExpression({
		expression: expressionE,
		success:  function(data) {
    // console.log(data.result);
	var valeurvariable = JSON.parse('['+nbr_name+','+data.result+']');
      //   console.log(valeurvariable);
 chart.series[nbr_cat].addPoint(valeurvariable, false);
 chart.redraw();
              }

		})    
 }

    		}); 
    
  </script>
    <style>

.highcharts-figure,
.highcharts-data-table table {
    min-width: 310px;
    max-width: 800px;
    margin: 1em auto;
}

.highcharts-data-table table {
    font-family: Verdana, sans-serif;
    border-collapse: collapse;
    border: 1px solid #ebebeb;
    margin: 10px auto;
    text-align: center;
    width: 100%;
    max-width: 500px;
}

.highcharts-data-table caption {
    padding: 1em 0;
    font-size: 1.2em;
    color: #555;
}

.highcharts-data-table th {
    font-weight: 600;
    padding: 0.5em;
}

.highcharts-data-table td,
.highcharts-data-table th,
.highcharts-data-table caption {
    padding: 0.5em;
}

.highcharts-data-table thead tr,
.highcharts-data-table tr:nth-child(even) {
    background: #f8f8f8;
}

.highcharts-data-table tr:hover {
    background: #f1f7ff;
}
  </style>
</figure>
</div>
1 « J'aime »

Bonjour @ajja17orange , un grand merci pour ces détails! J’ai de quoi creuser pour un petit moment… j’ai réussi à me faire une bonne base avec des morceaux codes par-ci par là…
Je vois qu’en fait il y énormément de possibilités, c’est hyper intéressant !

J’étais parti sur la fonction jeedom.history.get mais je bute quand il faut chercher deux variables, et je me suis inspirer justement du code de Kokyro dans le lien que tu m’as indiqué .
J’ai testé également le Widget NooChart mais il n’a pas l’air de bien fonctionner, c’est d’ailleurs dommage :

https://github.com/noodom/jeedom_widgets/tree/master/nooChart

1 « J'aime »

J’étais parti sur la fonction jeedom.history.get mais je bute quand il faut chercher deux variables

comme mon exemple « test expression » :
tu crées une fonction sur history
avec des variables en arguments

et tu fais des lancement de la fonction.

J’ai testé également le Widget NooChart mais il n’a pas l’air de bien fonctionner, c’est d’ailleurs dommage :

a lui tous seul highchart c’est un pavé.

c’est surtout pour noodom que c’est dommage pour le temps passé pour crée, pour debug ou aller dans desiderata de chacun c’est encore pire.

Bonjour @ajja17orange , à partir de ton code j’ai donc essayé d’adapter à mon besoin.

1/ création de deux variables : Puis-je sur la valeur rattacher l’ID de la mesure à afficher ?

image

2/ j’ai retranscris le nom des variables sur le code (idem pour les légendes)

image

Il me reste à définir les valeurs de l’axe des X sur les dates (dernières 24h).
Sur quelles lignes dois-intervenir ?

Merci beaucoup pour ces réponses :slight_smile:

si tu arrives y avant moi. (je suis pas chez moi) je regarderai pour jouer

J’ai réussi mais avec mon programme basé directement sur le site highcharts comme décrit au début de mon post.
Il a deux courbes avec possibilité de rajout simple, zoom et reset zoom, il se base sur la fonction jeedom.history.get
Il est ok sauf un soucis de décalage d’heure de 2h (=> résolu), et un affichage bizarre de date, je bosse dessus.

Ceux qui ont une idée pour m’aider sont les bienvenus :slight_smile:

Voici le rendu et le code :

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="“UTF-8”" />
  </head>
  <body>
    <script src="https://code.highcharts.com/highcharts.js"></script>
    <script src="https://code.highcharts.com/modules/series-label.js"></script>
    <script src="https://code.highcharts.com/modules/exporting.js"></script>
    <script src="https://code.highcharts.com/modules/export-data.js"></script>
    <script src="https://code.highcharts.com/modules/accessibility.js"></script>
    <script src="https://code.highcharts.com/modules/boost.js"></script>  

    <figure class="highcharts-figure">
      <div id="container"></div>
    </figure>
    <style>
    #container{
      height: 400px;
      }
    
      .highcharts-figure,
		.highcharts-data-table table {
  		min-width: 310px;
		max-width: 1200px;
		margin: 1em auto;
		}
      
      .highcharts-data-table table {
  		font-family: Verdana, sans-serif;
  		border-collapse: collapse;
  		border: 1px solid #ebebeb;
  		margin: 10px auto;
  		text-align: center;
  		width: 100%;
  		max-width: 500px;
		}
        
		.highcharts-data-table caption {
  		padding: 1em 0;
  		font-size: 1.2em;
  		color: #555;
		}
      
      .highcharts-data-table th {
  		font-weight: 600;
  		padding: 0.5em;
		}
      
      .highcharts-data-table td,
		.highcharts-data-table th,
		.highcharts-data-table caption {
		padding: 0.5em;
		}
      
      .highcharts-data-table thead tr,
		.highcharts-data-table tr:nth-child(even) {
	 	background: #f8f8f8;
		}
      
      .highcharts-data-table tr:hover {
		background: #f1f7ff;
		}
    
    </style>
    
    <script>
      var date=[]; // Liste des catégories qui sont ici des dates
      var dateFin = new Date(); // Date d'aujourd'hui non formaté
      var dateDebut = formattedDateForCode(new Date(new Date().setDate(dateFin.getDate()-1))); // Date d'il y a 1 jours
      dateFin = formattedDateForCode(dateFin); // // Date d'aujourd'hui formaté
      
      function formattedDate(d = new Date) { // formate une date pour son affichage
        let hours = String(d.getHours() - 2); // ici rajout du - 2 pour corriger le décalage heure
        let minutes = String(d.getMinutes());
        let month = String(d.getMonth() + 1);
        let day = String(d.getDate());
        let year = String(d.getFullYear());
        
        if (minutes.length < 2) minutes = '0' + minutes;
        if (month.length < 2) month = '0' + month;
        if (day.length < 2) day = '0' + day;

        return `${hours}h${minutes} - ${day}/${month}`;
      }
      function formattedDateForCode(d = new Date) { // formate une date pour l'utiliser dans "jeedom.history.get"
        let month = String(d.getMonth() + 1);
        let day = String(d.getDate());
        let year = String(d.getFullYear());

        if (month.length < 2) month = '0' + month;
        if (day.length < 2) day = '0' + day;

        return `${year}-${month}-${day}`;
      }
        
      
       var commandes = [
         [109465, { // id de la commande
            name: "Clim",
            data: [], //On ajoute à cette liste les données du capteur de température
            tooltip: {
            valueSuffix: 'W'
          }
            
          }    
         
         ],
         
         [4974, { // id de la commande
            name: "Piscine",
            data: [], //On ajoute à cette liste les données du capteur de température
            tooltip: {
            valueSuffix: 'W'
          }
            
          }    
         
         ],
         
         
      ];

      var chart  = new Highcharts.chart('container', {
          chart: {
            type: 'areaspline',
            zoomType: 'x' // Permet de zommer sur le graphique
            
          },

          title: {
            text: 'Production Solaire'
          },

          subtitle: {
            text: 'Dernières 24h'
          },

          yAxis: {
            title: {
              text: " Puissance (W)"
            }
          },

          xAxis: {
            accessibility: {
              categories: date,
            }
          },

          legend: {
            layout: 'vertical',
            align: 'right',
            verticalAlign: 'down'
          },

          plotOptions: {
            series: {
              label: {
                connectorAllowed: false
              },
              //pointStart: 2022
            }
          },

          series: [
            {
            name: "Clim",
            data: [], //On ajoute à cette liste les données du capteur de puissance
            tooltip: {
            valueSuffix: 'W'
          }   
          },
           {
            name: "Piscine",
            data: [], //On ajoute à cette liste les données du capteur de puissance
            tooltip: {
            valueSuffix: 'W'
          }   
          } 
            
            
                  ],
       
          responsive: {
            rules: [{
              condition: {
                maxWidth: 500
              },
              chartOptions: {
                legend: {
                  layout: 'horizontal',
                  align: 'center',
                  verticalAlign: 'bottom'
                }
              }
            }]
          }

        });
      
		console.log("ajout des données ..");
     
      for(let j = 0; j<2; j++)
      {
        
      jeedom.history.get ({
        
        cmd_id: commandes[j][0], // id de la commande historisé (boucle)
        dateStart: dateDebut, 
        dateEnd: dateFin,
        success:  function(result) {
          for(let i = 0; i<result.data.length; i++){
            
           chart.series[j].addPoint(result.data[i][1], false) // false permet de ne pas redesiner chart à chaque fois qu'on rajoute un point, et donc gagner enormement en performance
           date.push(formattedDate(new Date(result.data[i][0])))
          }
          chart.redraw(); // On dessine les donnée une fois les avoirs ajouté
          chart.xAxis[0].setCategories(date); // Et on ajoute les catégorie (ici des dates)
        }
    
        })
      
      }
    </script>
  </body>
</html>


la variable nbHeurePlage = pour le nombre d’heure

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="“UTF-8”" />
  </head>
  <body>

    <figure class="highcharts-figure">
      <div id="container"></div>
    </figure>
   
    <script>
       //------------------ Paramètres ------------------//
      var nbHeurePlage = 48;
      var commandes = [
   [819, { // id de la commande
            name: "Sondes Sud",
            data: [], //On ajoute à cette liste les données du capteur de température
//                        color: '#00A7F3',
           color: {
                linearGradient : {
                    x1: 1,
                    y1: 0,
                    x2: 0,
                    y2: 1
                }, 
                stops : [
              //      [0, Highcharts.Color('#FC4474').setOpacity(1).get('rgba')],
              [0, Highcharts.Color('#6000FF').setOpacity(0.7).get('rgba')],     
             [1, Highcharts.Color('#5D48A1').setOpacity(0.4).get('rgba')],
                ]
            },
            fillColor : {
                linearGradient : {
                    x1: 1,
                    y1: 0,
                    x2: 0,
                    y2: 1
                },
                stops : [
                    [0, Highcharts.Color('#6000FF').setOpacity(0.4).get('rgba')],
                    [1, Highcharts.Color('#5D48A1').setOpacity(0).get('rgba')],
                ]
            },
       type: 'areaspline',
     tooltip: {
            valueSuffix: ' °C'
     
          }
            
          }]
     ,      /*        */         [825, { // id de la commande
            name: "Sondes Nord",
            data: [], //On ajoute à cette liste les données du capteur de température
    color: '#0FA2E3',   
        type: 'spline',
       tooltip: {
            valueSuffix: ' °C'
          }
            
          }]
   
      ];
        
      var series = commandes.reduce( // commandes sans les id des commandes
                (accumulator, currentValue) => accumulator.concat(currentValue)
              ).filter(function (v,i) { return (i%2); }); // Avec reduce je retire les sous listes et avec filter j'enlève les id (index pair)
      var dateFin = new Date(); // Date d'aujourd'hui non formaté
          var dateDebut =  formattedDate(new Date(new Date().setHours(dateFin.getHours()-nbHeurePlage)));

      dateFin = formattedDate(dateFin); // // Date d'aujourd'hui formaté

      console.log("dateDebut :" +dateDebut); 
       console.log("date fin :" +dateFin); 
      function formattedDate(d = new Date) { // formate une date pour l'utiliser dans "jeedom.history.get"
        let month = String(d.getMonth() + 1);
        let day = String(d.getDate());
        let year = String(d.getFullYear());
		let hour = String(d.getHours());
        let minut = String(d.getMinutes());
        
        if (month.length < 2) month = '0' + month;
        if (day.length < 2) day = '0' + day;
		if (hour.length < 2) hour = '0' + hour;
        if (minut.length < 2) minut = '0' + minut;
        return `${year}-${month}-${day} ${hour}:${minut}`;

      }
      //------------------ Création du HighChart ------------------//
      var chart  = new Highcharts.chart('container', {
          chart: {
            zoomType: 'x' // Permet de zommer sur le graphique
            
          },

          title: {
            text: 'Production Solaire'
          },

          subtitle: {
            text: 'Dernières '+nbHeurePlage+' h'
          },

          yAxis: {
            title: {
              text: " Puissance (W)"
            }
          },

         xAxis: {
            type: 'datetime',
            dateTimeLabelFormats: { // don't display the dummy year
              month: '%e. %b',
              year: '%b'
            },
          },

          legend: {
            layout: 'vertical',
            align: 'right',
            verticalAlign: 'down'
          },

      plotOptions: {
            series: {
              label: {
                connectorAllowed: false
              },
            }
          },

         series:  series, 
          responsive: {
            rules: [{
              condition: {
                maxWidth: 500
              },
              chartOptions: {
                legend: {
                  layout: 'horizontal',
                  align: 'center',
                  verticalAlign: 'bottom'
                }
              }
            }]
          }

        });
      //------------------ Ajout des données dans chart ------------------//
	console.log("ajout des données ..");
      
    for(let j = 0; j<commandes.length; j++){
      jeedom.history.get ({
        cmd_id: commandes[j][0], //id de la commande historisé (capteur de température)
        dateStart: dateDebut, 
        dateEnd: dateFin,
        success:  function(result) {
          for(let i = 0; i<result.data.length; i++){
            chart.series[j].addPoint(
              [result.data[i][0],
               result.data[i][1]], false) // false permet de ne pas redesiner chart à chaque fois qu'on rajoute un point, et donc gagner enormement en performance
          }
          chart.redraw(); // On dessine les donnée une fois les avoirs ajouté
        }
      })
    }
    </script>
        <style>
      
      .highcharts-data-table table {
  		font-family: Verdana, sans-serif;
  		border-collapse: collapse;
  		border: 1px solid #ebebeb;
  		margin: 10px auto;
  		text-align: center;
  		width: 100%;
  		max-width: 500px;
		}
        
		.highcharts-data-table caption {
  		padding: 1em 0;
  		font-size: 1.2em;
  		color: #555;
		}
      
      .highcharts-data-table th {
  		font-weight: 600;
  		padding: 0.5em;
		}
      
      .highcharts-data-table td,
		.highcharts-data-table th,
		.highcharts-data-table caption {
		padding: 0.5em;
		}
      
      .highcharts-data-table thead tr,
		.highcharts-data-table tr:nth-child(even) {
	 	background: #f8f8f8;
		}
      
      .highcharts-data-table tr:hover {
		background: #f1f7ff;
		}
    
    </style>
  </body>
</html>

avec quelques trucs avec lequel j’ai joué, « gradiant », type different selon serie,… que tu peux enlevé facilement.

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