Bonne nouvelle pour les utilisateurs de Node.js: nous publions aujourd'hui une nouvelle librairie Yoctopuce dédiée à cet environnement. Très facile à installer, Node.js est une alternative intéressante à PHP, notablement plus efficace. Vous pouvez désormais l'utiliser aussi pour piloter vos modules Yoctopuce, y compris pour une utilisation par Callbacks HTTP.
Node.js est d'abord un outil en ligne de commande, basé sur la machine virtuelle Javascript de Google, qui permet de lancer des applications écrites en Javascript. Il inclut un gestionnaire de packages appelé 'npm' qui permet très facilement d'installer de puissantes librairies. A l'aide de ces deux outils, il est possible de mettre en place très rapidement des applications réseau et des services web légers qui tournent sur de nombreuses platformes. Vous pourrez même trouver des hébergements supportant Node.js pour vos applications Web.
Voici un petit exemple Node.js qui affiche chaque 5 secondes la température mesurée par tous les senseurs connectés au YoctoHub-Ethernet dont l'adresse IP est 192.168.1.89:
var YAPI = yoctolib.YAPI;
var YTemperature = yoctolib.YTemperature;
// Connection au YoctoHub-Ethernet
YAPI.RegisterHub('http://192.168.1.89');
setInterval( function() {
var sensor = YTemperature.FirstTemperature()
while(sensor) {
console.log(sensor.get_friendlyName() + ": " +
sensor.get_currentValue() + " °C")
sensor = sensor.nextTemperature();
}
}, 5000); // chaque 5000[ms]
Voici les étapes pour le tester:
- Dans un répertoire de votre choix, tapez: npm install yoctolib
- Sauvez le code ci-dessus dans un fichier nommé test.js
- Pour le lancer, tapez: node test.js
Facile, n'est-ce pas ? Vous trouverez d'autres exemples similaires qui montrent comment utiliser chacun de nos modules dans le répertoire example de notre librairie Node.js, disponible sur notre site web et sur GitHub.
Le code d'exemple fonctionne avec n'importe quel type de capteur de température connecté à un YoctoHub-Ethernet
Si nos librairies de programmations vous sont familières, vous avez probablement remarqué que cette nouvelle librairie suit les mêmes conventions que les autres langages. Il y a toutefois une chose particulière avec Node.js: ce langage hérite du modèle d'entrées/sorties non-bloquantes de Javascript, qui le rend très efficace... mais aussi un parfois un peu pénible. Pour chaque opération qui n'est pas instantanée, il faut normalement utiliser une fonction asynchrone qui appelle un callback lorsqu'elle est terminée. Cela tend à découper les tâches procédurales en morceaux moins lisibles, mais bon... on s'y fait.
Dans l'exemple ci-dessus, ce n'était pas nécessaire: le support de quelques fonctions synchrones est encore possible en Node.js. Mais dans certains cas, c'est nécessaire, comme par exemple pour implémenter un service web qui utilise notre librairie par Callback HTTP (cf. notre lecteur de flux RSS et notre passerelle pour la domotique). Voici un petit service web qui reçoit les mesures de températures de tout YoctoHub-Ethernet configuré pour le contacter par Callback HTTP sur le port 8044:
var yoctolib = require('yoctolib');
var YAPI = yoctolib.YAPI;
var YTemperature = yoctolib.YTemperature;
// On instancie un serveur HTTP
http.createServer(function (message, response) {
// Vous pouvez filtrer les requêtes par URL si nécessaire
console.log('requête '+message.method+' sur l'URL '+message.url);
// Le code ci-dessous prépare la librairie en mode Callback HTTP
// pour interagir avec les modules branchés sur le Hub
YAPI.RegisterHub_async('http://callback/', function(ctx, retcode, errmsg) {
if(retcode == YAPI.SUCCESS) {
// Affiche toutes les températures disponibles
YAPI.UpdateDeviceList();
var sensor = YTemperature.FirstTemperature()
while(sensor) {
console.log(sensor.get_friendlyName() + ": " +
sensor.get_currentValue() + " °C")
sensor = sensor.nextTemperature();
}
}
// Remet l'API dans son état original et ferme la connection
YAPI.FreeAPI();
}, null, message, response);
}).listen(8044);
console.log('Enregistreur de température Node.js lancé sur le port 8044');
Remarquez l'utilisation de la fonction RegisterHub_async à la place de RegisterHub, nécessaire pour le fonctionnement de la librairie en mode Callback HTTP. Dans notre cas, toutes les autres fonctions de la librairie peuvent être utilisées en mode standard (synchrone), mais dans d'autres cas vous pourriez avoir besoin d'utiliser par exemple sensor.get_currentValue_async() à la place de la fonction sensor.get_currentValue(). Dans la librairie Node.js, toutes les fonctions bloquantes sont disponibles en version _async.
La librairie Node.js actuelle est entièrement écrite en Javascript. Elle hérite en réalité presque tout le code de la librairie Javascript standard. C'est pourquoi il n'est actuellement pas possible d'accéder aux modules USB locaux sans utiliser le VirtualHub. Mais il n'est pas exclus que cela devienne possible dans le futur en Node.js, en utilisant un wrapper vers notre librairie C, tel qu'entrepris il y a quelque temps par un de nos utilisateurs.
Last but not least, kudos à @mrose17 (un des fondateurs du projet @TheThingSystem), qui a initié le port cette librairie pour Node.js, et sans l'expertise de qui cette librairie n'aurait pas pu voir le jour aussi rapidement.