Utilisation de l'enregistreur de données

Utilisation de l'enregistreur de données

La plupart de nos capteurs USB comportent un enregistreur de donnée intégré (data logger). L'activation de l'enregistreur est triviale, mais à l'utilisation on constate que l'interface de programmation pour récupérer les données n'est pas très intuitive. Nous nous apprêtons donc à lui apporter quelques améliorations afin de faciliter son utilisation. Voici un aperçu de ce qui va probablement changer, pour vous donner l'occasion de nous donner votre feedback avant que les choix soient arrêtés.



Voici un récapitulatif des observations que nous avons reçues concernant l'enregistreur de données:

1. Fréquence d'enregistrement. La méthode actuelle (une mesure par seconde, compressée ultérieurement en une mesure par minute, puis une mesure par heure) est "subtile" mais pas la plus pratique. Une fréquence fixe laissée à choix l'utilisateur serait plus simple à utiliser. Pour certains capteurs (par exemple Yocto-Volt, Yocto-Thermocouple), une période de mesure inférieure à la seconde serait souhaitable.

2. Découpage des mesures en "streams". Le fait de devoir rechercher d'abord la liste des pages de données (streams), puis les données page par page complique la tâche de l'utilisateur. Il serait souhaitable que la librairie prenne cela en charge de manière transparente.

3. Temps de lecture des mesures. En raison du nombre de données stockées, leur chargement peut prendre un temps perceptible. La librairie devrait dans l'idéal fournir un mécanisme capable de charger ces données en tâche de fond, afin de ne pas reporter ce travail sur l'utilisateur de la librairie. Elle devrait aussi pouvoir fournir rapidement un aperçu des données disponibles.

4. Utilisation combinée de l'enregistreur et des mesures directes. L'interface de l'enregistreur de données est entièrement distincte de l'interface de lecture directe des mesures. Lorsque l'on veut représenter dans un même graphique des données historiques et des données instantanées, cela oblige à traiter les deux types de données séparément. Il serait souhaitable d'avoir accès aux données historiques et instantanées par une interface unique.

5. Mesures horodatées. Pour associer une heure réelle à un flux de mesures, il est actuellement nécessaire de faire un appel explicite à une fonction de configuration de l'enregistreur de données lors de son lancement. De ce fait, les mesures ne sont souvent pas horodatées, ce qui n'est pas pratique.

6. Utilisation par avec l'API par Callback HTTP. L'utilisation du dataLogger par l'API en mode Callback HTTP est actuellement très difficile. Il serait pourtant utile de pouvoir récupérer par callback HTTP au moins les dernières valeurs enregistrées / moyennées par le module de manière autonome.

Tout un programme... voici donc ce que nous vous proposons de changer:

Nouveauté 1: Fréquence d'enregistrement fixe mais réglable

A la demande générale, les prochains firmware de nos senseurs passeront automatiquement à un enregistrement à fréquence fixe, initialement configuré à un échantillon par seconde pour maintenir la compatibilité avec les firmware précédents. La fréquence d'enregistrement sera configurable par l'interface de programmation et dans la page de configuration du module, accessible par le VirtualHub. Il sera possible de monter à une fréquence de 10 enregistrements par seconde. Pour économiser la place sur la mémoire flash, il sera possible de sélectionner les capteurs spécifiques dont les mesures doivent être enregistrées.

Contrairement à la version actuelle, qui n'utilise qu'une mesure discrète, la valeur stockée sera désormais la moyenne des valeurs observées durant la période d'échantillonnage. Les valeurs minimales et maximales pourront aussi être stockées. La "subtile" fonction de compression des données sera supprimée afin de garder tout l'espace mémoire de la flash pour les mesures à la fréquence choisie.

Si vous aviez besoin d'un firmware avec l'ancien comportement, faites-le nous savoir: nous pourrons vous en fournir un. Mais a priori les mises à jour proposées par le VirtualHub seront toujours des firmwares avec enregistrement à fréquence fixe.

Nouveauté 2: Lecture des enregistrements par fonction callback

Pour vous simplifier la récupération des données mesurées, provenant de l'enregistreur aussi bien que de mesures courantes, il sera possible d'enregistrer sur chaque fonction un callback notifiant une mesure périodique. Ce callback aura la forme suivante:

timedValueCallback(sensor, time, minVal, avgVal, maxVal, progress, userCtx)


Pour récupérer les mesures de l'enregistreur correspondant à une période donnée, il suffira donc de quelques lignes de code, comme par exemple:

var endTime = +new Date() / 1000; // JavaScript idiom for current UTC timestamp
var startTime = endTime - 86400;

tempSensor.registerTimedValueCallback(callback, startTime, endTime, userCtx);
humSensor.registerTimedValueCallback(callback, startTime, endTime, userCtx);


La méthode registerTimedValueCallback aura pour effet de rechercher toutes les mesures disponibles durant la période spécifiée, et d'appeler les fonctions de callback spécifiées pour chaque record existant. Le chargement des données se fera en tâche de fond sans que vous ayez à vous en préoccuper, et les callbacks seront appelés lors des appels à YAPI.HandleEvent() ou YAPI.Sleep(), comme c'est le cas pour les notifications de valeurs immédiates. La dernière valeur connue pour l'intervalle spécifié sera signalée par le compteur progress valant 100.

De plus, le même callback pourra être appelé pour toutes les nouvelles mesures, au fur et à mesure qu'elles apparaissent, si la période spécifiée couvre le futur. Il vous sera ainsi possible de construire un graphique mis à jour dynamiquement, sans effort supplémentaire.

Les anciennes fonctions de lecture des données bloquantes directement par la fonction dataLogger seront maintenues pour la compatibilité arrière.

Nouveauté 3: Récupération directe d'une mesure

Pour les cas où une interface encore plus simple que le callback est souhaitable, nous fournirons une API bloquante permettant de rechercher le résumé des mesures disponibles, et la mesure la plus proche d'une heure donnée.

Nouveauté 4: Horodatage automatique

L'enregistreur disposera désormais d'un réglage permettant de récupérer automatiquement l'heure UTC du VirtualHub ou du YoctoHub-Ethernet auquel il est connecté. Cette fonctionnalité sera activée par défaut, mais pourra être désactivée si vous préférez utiliser une autre base de temps gérée par vos soins (comme l'heure locale par exemple).

Nouveauté 5: Accès simplifié par API REST et par callback HTTP

Une nouvelle URL sera disponible sur le VirtualHub (et sur le YoctoHub-Ethernet) permettant de récupérer par une simple requête REST au format JSON les 5 dernières mesures enregistrées pour chaque capteur. Ces mêmes mesures seront aussi fournies aux callbacks HTTP.

Un petit exemple

Pour vous donner un petit avant-goût de ce qu'il sera possible de faire avec la nouvelle méthode de lecture des enregistrements de données par callback, nous l'avons prototypée pour l'API JavaScript. La version finale exigera l'utilisation d'un nouveau firmware pour charger plus efficacement les nouvelles mesures, mais cette version "émulée" fonctionne déjà avec les firmware existants.

La page web démontrée ci-dessous est purement en pur JavaScript. Vous trouverez le code source de cette page ici. Elle détecte automatiquement les modules connectés sur la machine (en utilisant le VirtualHub), et montre l'historique des mesures ainsi que les nouvelles mesures en live.

  



Pour la représentation du graphique, nous avons utilisé la librairie Highstock JS, l'une des plus flexible pour faire des graphes en JavaScript. Elle est gratuite pour les utilisateurs non-commerciaux, mais payante pour les entreprises comme nous. Voilà comment nous construisons le graphique:

// (ce code travaille sur un tableau de capteurs détectés)
var now = +new Date() / 1000;
for(var i = 0; i < sensors.length; i++) {
    sensors[i].registerTimedValueCallback(initialCallback, 0, now, [ ]);
}

// Callback utilisé pour charger les données depuis le datalogger
function initialCallback(sensor, timeUTC, minVal, avgVal, maxVal, progress, userCtx)
{
    // Enregistre une mesure
    userCtx.push( [timeUTC*1000,avgVal] );

    // Met à jour la barre d'avancement
    var serial = sensor.get_module().get_serialNumber();
    document.getElementById(serial+"gauge").style.width = (2*progress)+"px";
   
    // Lorsque toutes les mesures sont chargées, dessine le graph
    if(progress == 100) {
        var sensorId = sensor.get_hardwareId();
        document.getElementById(serial+".progress").style.display = "none";
        document.getElementById(sensorId).style.height = "400px";
        chart = new Highcharts.StockChart({
            chart : { type: 'line', zoomType: 'x', renderTo: sensorId },
            scrollbar: { liveRedraw: true },
            title: { text: sensorId },
            rangeSelector: {
                buttons: [{ count:5, type:'minute', text:'5min' },
                          { count:1, type:'hour', text: 'hour' },
                          { count:1, type:'day', text: 'day' },
                          { type:'all', text: 'All' }],
                          selected: 2 },
            xAxis : { minRange: 60 * 1000 }, // one minute
            series : [{ name: sensor.functionId, data : userCtx }]    
        });

        // active la mise à jour continue du graph
        sensor.registerTimedValueCallback(liveCallback, 0, -1, chart);
    }
}

// Callback utilisé pour la mise à jour continue
function liveCallback(sensor, timeUTC, minVal, avgVal, maxVal, progress, userCtx)
{
        userCtx.series[0].addPoint( [timeUTC*1000, avgVal], true );
}



Qu'en pensez-vous ?

Est-ce que ces changements planifiés vous conviennent ? Faites-nous part de vos remarques et suggestions et remarques, par e-mail ou en commentaire sur ce post.

Bien sur, tout cela ne se fera pas en une semaine, mais sauf contre-ordre, les changements arriveront progressivement derant les prochain mois.

Commenter 3 commentaires Retour au blog



1 - bsg75 Dimanche 30 juin 2013 18H49

Ces améliorations sont toutes pertinentes avec en particulier la fonction d'horodatage automatique (c'est un peu compliqué sinon).
Quand pensez-vous mettre à jour le firmware?
Merci pour l'ensemble des produits d'une très grande qualité, la documentation on ne peut plus professionnelle, et le support toujours réactif
Nicolas

2 - mvuilleu (Yocto-Team)Lundi 01 juillet 2013 11H56

@bsg75: Nous attendons encore un peu de feedback, mais a priori les premières améliorations devraient apparaître dans le courant du mois d'août je pense. Elles commenceront par le changement de format de mesure et l'horodatage automatique. Les API par callback n'apparaitront probablement pas avant le courant de l'automne.

3 - bsg75 Jeudi 04 juillet 2013 16H11

je pense en effet que les deux améliorations citées seront les bienvenues

Yoctopuce, get your stuff connected.