05/05/2018

Afficher les données d'un IoT en Qt

Qt
Iot

Un exemple d'utilisation de Qt pour l'affichage des données récoltées par un capteur de température 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 chaîne 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() } }