Comment utiliser Jsonrpc API pour récupérer l'historique d'un capteur et l'utiliser dans un design (texte/html) + créer un highchart avec?

Bonjour,
Après plusieurs jours de recherche sans succès. J’ai finis par essayé d’utiliser Jquery POST pour récupérer l’historique de mon capteur cependant quand je test avec la commande ping par exemple. (code ci-dessous)

Texte/Html

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="“UTF-8”" />
  </head>
  <body>
    <script>
    function test() {
       $.post('/core/api/jeeApi.php',
              {
         "jsonrpc":"2.0",
         "method":"ping",
         "params": {
           "apikey": "XXXXXXXXXXXXXXXTvgDPcTL"
         },
      }, // data to be submit
       function(data, status, jqXHR) {// success callback
            console.log(data);
        })
    }
    </script>
  </body>
</html>

J’ai cette erreur dans la console…

test()
undefined

Object { jsonrpc: "2.0", id: 99999, error: {…} }
​
error: Object { code: 1, message: "Requête invalide. Version JSON-RPC invalide : " }
​​

Cependant j’ai bien spécifié dans le code la bonne version de jsonrpc
Si quelqu’un a une solution pour que je puisse récupérer ce fameux historique dans un « texte/html » je pourrais faire un graphique perso avec HighCharts.
(Si j’arrive à avancer je vous tiendrez au courant sur le HighCharts)
Merci :slight_smile:

Salut,

S’il s’agit d’afficher l’historique d’une commande dans un design Jeedom, nul besoin de passer par l’api jsonrpc.

A voir ce que tu veux faire exactement mais à priori c’est plutôt l’api js qu’il te faut utiliser avec cette fonction en particulier :

jeedom.history.get ({
  cmd_id: XX,
  dateStart: YYYY-MM-DD, 
  dateEnd: YYYY-MM-DD,
  success:  function(result) {
    /* result contient les historiques de la commande XX sur la période dateStart → dateEnd */
  }
})

Merci, c’est ce qu’il me fallait, avec ça je peux faire result.data pour avoir la liste des valeurs de mon capteur. Par contre pour les dates ils faut les mettre entre guillemets sinon sa donne les mauvaise dates.

dateStart: "YYYY-MM-DD", 
dateEnd: "YYYY-MM-DD",

Je n’ai pas trouvé de documentation sur l’api js de jeedom, tu pourrais me passer un lien stp ?:slight_smile:
Et du coup j’obtiens une liste de liste avec deux valeur.

​
0: Array [ 1617238800000, -19.81 ]
​​
1: Array [ 1617253200000, -19.91 ]
​​
2: Array [ 1617260400000, -19.38 ]
​​
3: Array [ 1617267600000, -20.87 ]

J’imagine que la première valeur représente la date à laquelle la température a était prise ?
Encore merci, je tournais en rond depuis 2 jours :sweat_smile:

Pour le moment, la documentation est le code du core :
core/core/js at alpha · jeedom/core (github.com)

Il s’agit d’un timestamp. Pour le convertir en date en js :

var date = new Date(result.data[i][0])

Par contre il faudra sûrement adapter au bon fuseau horaire…

J’ai réussi à créer une liste de toute les valeurs mais là je galère pour afficher les valeurs dans le HighCharts. Le HighCharts se créer avant que ma listes sois totalement créer du coup c’est vide. :confused:

Pour le moment j’ai ce résultat
image
Et dans la console ça me donne ça, j’ai bien compris que la liste est mise à jours seulement après que le HighCharts soit créer. J’ai donc essayé de faire de l’asynchrone mais j’y arrive pas :confused:

debut
Array(3) [ 1, 2, 3 ]
fin
Array(12) [ 1, 2, 3, -19.91, -20.67, -20.51, -20.06, -20.46, -20.87, -19.38, … ]
Array(9) [ Date Mon Apr 12 2021 03:00:00 GMT+0200 (heure d’été d’Europe centrale), Date Mon Apr 12 2021 05:00:00 GMT+0200 (heure d’été d’Europe centrale), ... ]

Et voici mon code pour le moment

<!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>

    <figure class="highcharts-figure">
      <div id="container"></div>
    </figure>
    <script>
      var date=[], temperature=[1,2,3];
      
      jeedom.history.get ({
        cmd_id: 1434,
        dateStart: "2021-04-12", 
        dateEnd: "2021-04-23",
        success:  function(result) {
          for(let i = 0; i<result.data.length; i++){
            date.push(new Date(result.data[i][0]))
            temperature.push(result.data[i][1])
          }
          console.log(temperature)
          console.log(date)
        }
      })
        console.log("debut");
      	console.log(temperature);
        Highcharts.chart('container', {

          title: {
            text: 'Solar Employment Growth by Sector, 2010-2016'
          },

          subtitle: {
            text: 'Source: thesolarfoundation.com'
          },

          yAxis: {
            title: {
              text: "Temp"
            }
          },

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

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

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

          series: [{
            name: "Temperature",
            data: temperature,
            tooltip: {
            valueSuffix: ' °C'
          }
            
          }],

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

        });
      
        console.log("fin");
    </script>
  </body>
</html>

Salut,

Avec un peu de patience, un widget qui devrait répondre à ton besoin devrait arriver :wink:

nooLineChartsDraft

1 « J'aime »

Comment ça « il devrait arriver » ?

1 « J'aime »

La réponse se trouve ici :wink:

2 « J'aime »

J’ai réussi à faire ce que je voulais, pour le moment c’est un graphique assez basique mais je vais le mettre à jours au fur et à mesure de mon travaille :slight_smile:
Maintenant il ne me reste plus qu’à personnaliser le HighCharts
(Si vous voyez des amélioration possible nécessité pas )

Et voici mon 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>
    <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()-30))); // Date d'il y a 30 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());
        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}/${year}`;
      }
      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 chart  = new Highcharts.chart('container', {
          chart: {
            zoomType: 'x' // Permet de zommer sur le graphique
          },

          title: {
            text: 'Température du frigo'
          },

          subtitle: {
            text: '30 derniers jours'
          },

          yAxis: {
            title: {
              text: " Température en °C"
            }
          },

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

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

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

          series: [
            {
            name: "Temperature",
            data: [], //On ajoute à cette liste les données du capteur de température
            tooltip: {
            valueSuffix: ' °C'
          }
            
          }
                  ],

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

        });
		console.log("ajout des données ..");
      jeedom.history.get ({
        cmd_id: 1434, //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[0].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>

Maintenant on peux mettre plusieurs commandes, modifier facilement le nombre de jours afficher et plusieurs autre améliorations…
J’ai ajouté quelques options que j’ai trouvé sur HighCharts.com, comme les bandes de couleurs ainsi que les températures affiché sans passer la souris dessus. J’espère que ça pourra être utile à quelqu’un :wink:
(les bandes représente les seuils d’alerte, quand la température atteint un seuil un mail est envoyé grâce à un petit scénario)

image

<!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>
    <script>
      //------------------ Paramètres ------------------//
      var nbJoursDePlage = 60;
      var commandes = [
        [1434, { // id de la commande
            name: "Température du frigo",
            data: [], //On ajoute à cette liste les données du capteur de température
            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().setDate(dateFin.getDate()-nbJoursDePlage))); // Date d'il y a 30 jours
      dateFin = formattedDate(dateFin); // // Date d'aujourd'hui formaté
      
      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());

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

        return `${year}-${month}-${day}`;
      }
      //------------------ Création du HighChart ------------------//
        var chart  = new Highcharts.chart('container', {
          chart: {
            zoomType: 'x', // Permet de zommer sur le graphique,
            type: 'line'
          },

          title: {
            text: 'Température du frigo'
          },

          subtitle: {
            text: nbJoursDePlage +' derniers jours'
          },

          yAxis: {
            title: {
              text: " Température en °C"
            },
          minorGridLineWidth: 0,
          gridLineWidth: 0,
          alternateGridColor: null,
          plotBands: [
            { // Normal
            from: -50,
            to: -15,
            color: 'rgba(0, 0, 0, 0)',
            label: {
              text: 'Normal',
              style: {
                color: '#606060'
              }
            }
          }, { // Alerte
            from: -15,
            to: -10,
            color: 'rgba(68, 170, 213, 0.1)',
            label: {
              text: 'Alerte',
              style: {
                color: '#606060'
              }
            }
          }, { // Alerte Critique
            from: -10,
            to: 30,
            color: 'rgba(255, 0, 0, 0.1)',
            label: {
              text: 'Alerte Critique',
              style: {
                color: '#606060'
              }
            }
          }]
          },

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

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

          plotOptions: {
            line: {
              dataLabels: {
                enabled: true
              },
              enableMouseTracking: true
            },
            series: {
              label: {
                connectorAllowed: false
              },
              //pointStart: 2020
            }
          },

          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>
  </body>
</html>
1 « J'aime »