Presque tous les senseurs Yoctopuce contiennent un enregistreur de données a.k.a. datalogger. On a déjà abordé le sujet plusieurs fois, mais cette semaine on refait un tour d'horizon dans le cadre de notre série pour les débutants. Suivez le guide...
Le datalogger présent sur les senseurs Yoctopuce permet d'enregistrer indépendamment chacune des fonctions présentes sur le module. La fréquence d'enregistrement est configurable de 1 enregistrement par heure jusqu'à 100 enregistrements par seconde. Pour les fréquences d'enregistrement au dessus de 1Hz, le datalogger n'enregistre que des valeurs instantanées alors que pour les fréquence inférieures à un 1Hz les valeurs enregistrées sont la valeur moyenne, la valeur maximum et la valeur minimum pour chaque période.
A propos de la taille
Les valeurs sont enregistrées en boucle: lorsque la mémoire du datalogger est pleine les données les plus anciennes sont écrasées. La capacité exacte du datalogger n'est jamais documentée formellement parce qu'elle a une petite tendance changer en fonction de la date de production de chaque module et de la version des firmwares utilisés.
En fonction des modules, certaines parties du firmware sont stockées sur la mémoire flash du module, réduisant ainsi légèrement la place disponible pour le datalogger. Mais surtout, le marché des mémoires flash bouge beaucoup: normalement les capacités augmentent et les prix descendent au cours du temps. C'est pourquoi les premiers modules Yoctopuce produits il y a sept ans ne disposait que de mémoire de 8Mbits alors qu'aujourd'hui on utilise des mémoires 32Mbits pour un coût comparable. On a même pu fabriquer pendant un temps des modules avec des mémoires de 64Mbits avant que le fabriquant ne soit racheté par un plus gros que lui, qui a malheureusement décidé d'arrêter de les produire.
Les données du datalogger sont stockées dans ce composant
Vous pouvez connaitre la taille de la mémoire flash de votre module en consultant le log du module à l'aide du VirtualHub. En gros si votre module a été acheté à partir de 2014, vous êtes assuré de pouvoir stocker au moins un demi million de valeurs dans la mémoire du datalogger.
Configurer et enclencher l'enregistrement
Il existe diverses manières d'exploiter le datalogger présent dans votre module.
Le VirtualHub
Les versions récentes du VirtualHub offre une petite interface simple pour configurer et déclencher le datalogger. Elle permet de choisir les fonctions à enregistrer et la fréquence d'enregistrement. Elle permet aussi faire en sorte que le datalogger parte automatiquement au démarrage du module ou encore lorsque le Yocto-button est appuyé.
VirtualHub: l'interface du contrôle du datalogger
Notez qu'afin de rester simple, cette interface ne permet pas de configurer des fréquences d'enregistrement différentes pour les diverses fonctions bien que le datalogger en soit parfaitement capable.
L'API en ligne de commande
L'api en ligne commande vous permet de configurer précisément l'enregistrement de chaque fonction. Imaginons que nous disposions d'un module Yocto-Meteo dont le numéro de série est METEOMK1-2AE60 et que nous souhaitions enregistrer la température toutes les 15 secondes, la commande de configuration est
YTemperature METEOMK1-2AE60.temperature set_logFrequency 4/m
Pour ensuite lancer le datalogger il suffit de taper
YTemperature METEOMK1-2AE60.temperature startDataLogger
Notez que cela va déclencher l'enregistrement pour toutes les fonctions du module dont le paramètre logFrequency n'est pas à "OFF". En effet cet appel est en fait strictement équivalent à
YDatalogger METEOMK1-2AE60.datalogger set_recording ON
Par programmation
Comme toutes les autres fonctionnalités des modules Yoctopuce, le datalogger est bien évidement contrôlable par programmation, voici un bout de code en Python qui configure la fréquence d'enregistrement et enclenche le datalogger, les appels sont similaires dans les autres langages.
t.set_logFrequency("4/m")
t.startDataLogger()
Stopper l'enregistrement
Vous pouvez stopper l'enregistrement de deux manières, soit en mettant la fréquence d'enregistrement de la fonction concernée à "OFF" soit en stoppant le datalogger, mais dans ce cas, cela arrêtera l'enregistrement de toutes les autres fonctions. Pour cela, il y a plusieurs manières:
Le VirtualHub
Toujours depuis l'interface de gestion du datalogger, il suffit de mettre le parametre recording à OFF.
L'API en ligne de commande
Depuis la ligne de commande, on peut agir sur la fonction concernée, ou sur le datalogger complet.
YTemperature METEOMK1-2AE60.temperature set_logFrequency OFF
ou encore
YTemperature METEOMK1-2AE60.temperature stopDataLogger
Par programmation
Pour faire la même chose en Python et dans tous les autres langages de programmation, on écrira:
t.set_logFrequency("OFF")
ou encore:
t.stopDataLogger()
Récupérer les données
Évidement, à un moment ou un autre, vous allez vouloir récupérer les données enregistrées dans le datalogger. Ici encore, vous avez trois manières principales de le faire.
Le VirtualHub
Dans la fenêtre de configuration de chaque module, vous trouverez une section datalogger, qui vous permettra de télécharger les données enregistrées au format CSV dès qu'elles sont disponibles. Notez que vous obtiendrez ainsi les données dans leur intégralité, pour toutes les fonctions.
VirtualHub: récupérer les donnaées
L'API en ligne de commande
Vous pouvez bien sûr récupérer les données via l'API en ligne de commande, la commande get_recordedData vous fera cela très bien. Elle prends deux paramètres startTime et endTime qui sont des timestamp Unix correspondant aux dates de début et de fin des donnés que vous souhaitez récupérer. Utilisez 0 0 pour récupérer l'intégralité des données. Voici un exemple qui affiche le contenu des données pour la fonction température:
YTemperature METEOMK1-2AE60.temperature get_recordedData 0 0
Si vous préférez l'avoir au format CSV, ajoutez un "-c"
YTemperature -c METEOMK1-2AE60.temperature get_recordedData 0 0
Par programmation
La récupération de données du datalogger par programmation est un peut-être une des tâches les plus compliquée à réaliser avec l'API Yoctopuce. Rassurez-vous, rien de bien méchant. Le problème vient du fait que c'est un processus plutôt lent,on y reviendra, c'est pourquoi la récupération doit se faire de manière incrémentale: personne n'aime voir une application complètement paralysée parce qu'elle fait des opérations d'entrée/sortie.
- Il faut dans un premier temps appeler la fonction get_recordedData avec les timestamps du début et de la fin de la période à récupérer; ou 0,0 pour tout récupérer. Cet appel renvoie un objet de type YDataset qui sert au reste de l'opération.
- Il faut ensuite appeler au moins une fois la méthode loadMore() de l'objet YDataset.
- A ce moment, vous pouvez déjà appeler la méthode get_summary() qui vous donnera un objet YMeasure résumant le contenu du datalogger; ou encore get_preview() qui retournera un avant-goût du contenu du datalogger sous la forme d'un tableau d'objets YMeasure résumant le contenu à raison d'environ un élément pour 120 à 250 enregistrements.
- Pour récupérer tout le reste du datalogger, il faut ensuite appeler loadMore() en boucle. Chaque appel renvoie le pourcentage des données déjà récupérées. Il faut donc s'arrêter quand cette valeur atteint 100.
- Finalement, l'appel à get_measures() permet de récupérer toutes les mesures sous la forme d'un tableau d'objets YMeasure.
dataset = t.get_recordedData(0, 0)
dataset.loadMore()
summary = dataset.get_summary()
progress = 0
while progress < 100:
progress = dataset.loadMore()
details = dataset.get_measures()
Extraire les données d'un object YMeasure est tout simplement trivial:
print("from %s to %s : min=%.3f%s avg=%.3f%s max=%.3f%s" % (
m.get_startTimeUTC_asDatetime().strftime(fmt),
m.get_endTimeUTC_asDatetime().strftime(fmt),
m.get_minValue(), t.get_unit(),
m.get_averageValue(), t.get_unit(),
m.get_maxValue(), t.get_unit()))
Notez que le processus de récupération des données est relativement lent, il s'agit d'un effet de bord d'une des plus grosses qualités des modules Yoctopuce: l'absence de driver. Afin d'éviter l'utilisation de drivers spécifiques, tous les modules Yoctopuce fonctionnent en USB 1.1 et utilisent un protocole HID, du même genre que celui qui est utilisé par les claviers et les souris. Grâce à cela les modules Yoctopuce sont véritablement plug-and-play: vous les connectez et ça marche immédiatement. Le revers de la médaille c'est que le taux transfert maximum est, dans le meilleurs de cas, 64ko par seconde. Donc si vous avez plusieurs méga-octets de données à sortir d'un datalogger, attendez-vous à ce que cela prenne un peu de temps.
Effacer le contenu du datalogger
Effacer le contenu du datalogger est relativement trivial, c'est l'affaire d'un clic dans le VirtualHub ou d'un appel tant dans la ligne de commande que dans l'API.
YTemperature METEOMK1-2AE60.datalogger forgetAllDataStreams
d = YDatalogger.FindDatalogger('METEOMK1-2AE60.datalogger') d.forgetAllDataStreams()
Pour finir
Vous savez maintenant tout ce qu'il a y savoir pour débuter avec les datalogger des modules Yoctopuce. Pour finir, quelques remarques plus générales:
- Ne configurez pas la fréquence d'enregistrement plus haute que ce dont vous avez besoin pour votre application. D'une part vous allez vous retrouver avec une montagne de données particulièrement difficile à gérer. D'autre part, il est complètement inutile d'enregistrer plus vite que la vitesse d'échantillonnage du capteur.
- Si vous travaillez en callback HTTP, vous pourrez sans problème envoyer des commandes au datalogger, en revanche vous ne pourrez pas récupérer les données enregistrées dedans. Par contre, ça marche en callback Websockets.