Afficher les données d’un IoT sous forme d’une jauge

Un exemple d’utilisation de Qt pour l’affichage des données récoltées par un capteur de temperature sous la forme d’une belle jauge, belle comme un compte-tours de voiture ancienne.

compte-tours

Sur la base de l’exemple QtQuick, gentiment fourni par Qt dans le répertoire C:\Qt\Examples\Qt-5.11.0\quick\customitems\dialcontrol, qui propose une jolie jauge et un slider pour faire varie la valeur de la jauge, j’ai fait cette petite adaptation afin d’aller lire la dernière valeur du capteur de température et de l’afficher dans la jauge.

La première partie du code est la description de l’interface. Notez l’appel au composant Dial qui est un assemblage complexe d’images qui forment la jauge (aiguille, fond, ombres…). Pour faire varier l’aiguille de la jauge, il suffit de assigner une valeur à la variable dial.value.

Un Timer est utilisé pour appeler la fonction getLastTempFromIoTHUB() à interval régulier. Cette fonction fait un appel Rest GET pour obtenir en réponse une chaine au format JSON contenant la température. Cette réponse est transformée ensuite en valeur numérique pour pouvoir être chargée dans la variable dial.value et ainsi faire varier l’aiguille de notre jauge.


import QtQuick 2.9
import "content"

Rectangle {
    color: "#545454"
    width: 300; height: 300

    // initialisation du compteur défini dans Dial.qml
    Dial {
        id: dial
        anchors.centerIn: parent
        value: 0
    }

    // Un timer pour afficher la temp toutes les 5 minutes
    Timer {
        interval: 10000*5; running: true; repeat: true
        onTriggered: function() {
            getLastTempFromIoTHUB();
            time.text = Date().toString()
        }
    }

    // Un timer pour afficher la temp (presque) immédiatement
    Timer {
        interval: 500; running: true; repeat: false
        onTriggered: function() {
            getLastTempFromIoTHUB();
            time.text = Date().toString()
        }
    }

    // Le champ texte amélioré pour affichage de l'heure de rafraichissement
    Rectangle {
        id: container
        anchors { bottom: parent.bottom; left: parent.left
            right: parent.right; leftMargin: 20; rightMargin: 20
            bottomMargin: 10
        }
        height: 16
        radius: 8
        opacity: 0.7
        antialiasing: true
        gradient: Gradient {
            GradientStop { position: 0.0; color: "gray" }
            GradientStop { position: 1.0; color: "white" }
        }

        Text {
            id: time
            anchors.left: parent.left
            anchors.margins: 10
            text: qsTr("Please wait...")
        }
    }

    QuitButton {
        anchors.right: parent.right
        anchors.top: parent.top
        anchors.margins: 10
    }

    function getLastTempFromIoTHUB() {

      // Create the XMLHttpRequest object
      var xhr = new XMLHttpRequest

      // Listen to the readyStateChanged signal
      xhr.onreadystatechange = function() {
        // If the state changed to DONE, we can parse the response
        if (xhr.readyState === XMLHttpRequest.DONE) {
          // The responseText looks like this {"ip":"xxx.xxx.xxx.xxx"}
          // Parse the responseText string to JSON format
          var responseJSON = JSON.parse(xhr.responseText)
          // Read the ip property of the response
          var ip = responseJSON.ip
          // Display the ip in the AppText item
          var temp = responseJSON[0].data[0][1]

          if (temp !== null) {
              // rafraichir le compteur
              dial.value = (temp - (temp*15)/100) ; // Enlève 15% de marge d'erreur
              // Afficher dans la console la temp
              console.log(Date().toString() + "| Device#1 TEMP: " + (temp|0) + "°");
          }
        }
      }

      // Define the target of your request
      xhr.open("GET", "https://iothub.white-apps.io/mesures/last_temp?device_id=1&limit=1")

      // Execute the request
      xhr.send()
    }
}