05/05/2018
Afficher les données d'un IoT en Qt
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.
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()
}
}