Dans la seconde partie de ce projet, je vous ai présenté les capteurs de la station en détail, ainsi que mon installation. Maintenant que toutes les données parviennent à la station de base, nous allons nous intéresser au raccordement de celle ci à un ordinateur, et surtout à la collecte automatisée de ces données depuis une machine sous Linux.

câble de connection entre la station et le PC

câble de connection entre la station et le PC

Connection physique

Le câble de connection fourni se branche d’un coté sur un port série, et de l’autre sur un port RJ11. La prise rj11 se branche sur la station. En revanche, pour le port série, ma machine n’en dispose pas. Heureusement, LaCrosse fournit un adaptateur usb-série. L’installation est des plus simples sous linux : j’ai branché l’adaptateur série, puis attendu quelques secondes. Et voila.

J’ai alors pu brancher le cable rj11-serie à l’adaptateur usb-série, et la connection est établie. Reste maintenant à vérifier que l’on transmet des données.

Logiciel de récupération des données : Open2300

Sous linux, j’ai découvert Open2300, qui permet de communiquer avec les stations météo de la série WS23xx de LaCrosse. Il est possible d’utiliser ce programme sous windows via MinGW. L’installation est particulierement simple : téléchargez les sources sur le site officiel, décompressez les, rendez vous dans le répertoire créé, puis tapez make. Si la commande make n’est pas installée sur votre système, il suffira sous ubuntu de taper “sudo apt-get install make”, ou sinon de chercher make dans le gestionnaire de paquets puis de l’installer. Une fois la compilation terminée, le programme est presque utilisable.

Avant de pouvoir s’en servir, toutefois, il y a l’épineuse étape de la configuration. Dans le répertoire d’Open2300, vous trouverez un fichier “open2300-dist.conf”. Faites en une copie sous le nom de “open2300.conf”. Ouvrez ce fichier,  et cherchez la ligne “SERIAL_DEVICE”. Si votre station est branchée directement sur un port série, la valeur suivante sur la même ligne devra être “/dev/ttyS0” (sans les guillemets). Si vous utilisez l’adaptateur USB, alors ce sera “/dev/ttyUSB0”. Enfin, sous Windows, ce sera COM1. Bien sur si vous avez d’autres dispositifs série, la valeur pourra etre /dev/ttyS1 ou /dev/ttyUSB1, ou encore COM2. En clair, le dernier chiffre représente le numéro de l’interface série. S’il n’y en a pas d’autre, ce sera à 0 sous linux, et 1 sous windows.

Enfin, dernier détail, il faut donner les droits en écriture sur le port série via la commande “sudo chmod 660 /dev/ttyUSB0” (bien sur, mettez la valeur qui correspond à celle située dans votre fichier de configuration pour le nom du dispositif série).

En fait ce n’était pas si compliqué non? Maintenant Open2300 est paré pour la lecture des données! Pour vérifier cela il suffit alors de lancer l’une des commandes d’open2300, par exemple fetch2300 en tapant “./fetch2300”. Vous devriez alors voir les données de la station apparaître à l’écran. Divers programmes sont présents, par exemple xml2300 qui retourne les données sous forme de XML.

Collecte automatisée et continue des données

On est maintenant capables de collecter les données de la station météo à tout instant. Toutefois, ce fonctionnement ne me suffit pas, puisque je souhaite récupérer les données de la station à chaque fois que possible, et ce de façon automatisée. Nous pourrions pour cela utiliser un cron, mais j’ai préféré faire un petit programme C :

#include <stdio.h>

#include <unistd.h>

#include <time.h>

int main ()

{

int i=0,time01=0,timeStart=time(NULL);//temps de début de l’application

while(1)//boucle infinie, le programme devra etre arrêté par ctrl+C

{

 

time01=time(NULL);//on récupere le temps actuel

printf(“record %d – h+%8ds\n”,i,time01-timeStart);//affichage d’une ligne de log

if(fork()==0)

{execlp(“./cmd.sh”,”./cmd.sh”,NULL);}

//appel du script

else

{

 

wait(NULL);//on attend que le script se termine

//tant que 8s ne se sont pas écoulées

while(time(NULL)<(time01+8))

{sleep(1);}//on attend

}

i++;

}

}

Ce programme s’accompagne d’un petit script shell :

#!/bin/bash

./fetch2300 >> log2.txt

date +%H%M%S >> log2.txt

Le programme C appelle toutes les 8 secondes (ou plus, mais jamais moins) le script Shell, puis affiche le nombre d’enregistrement, et le temps écoulé depuis le début de l’exécution. Le script, quand à lui, appelle le programme fetch2300, et ajoute le résultat à un fichier log2.txt, puis ajoute l’heure, la minute et la seconde à laquelle cette opération s’est terminée dans le même fichier, à la suite.
L’exécution donne le résultat suivant :
capture du log d'exécution après plus de 24h d'exécution
Dans mon cas, j’ai également modifié fetch2300 afin qu’il ne retourne pas les minimum et maximum (puisque je récupère TOUTES les mesures, je peux facilement calculer ces données), ni les prévisions et tendance de la station (ces données sont calculées, et en outre semblent peu fiables dans mon cas). En outre, j’ai fait en sorte que tous les affichages se fassent sur une seule ligne. Ainsi, chaque ligne correspond à un jeu de mesures. J’ai conservé uniquement les données qui correspondent à des mesures physiques de la station: température interieure, extérieure, hygrométrie interieure, exterieure, vitesse du vent, direction du vent (et les 6 mesures de cette valeur que retourne la station), les précipitations sur 1h, 24h et totales, et enfin pression atmosphérique. Cela me donne quelque chose de ce genre :
“26.7 26.3 58 80 0.0 NNE 22.5 22.5 22.5 22.5 22.5 22.5 0.00 7.25 7.77 1019.600 000336”
à minuit, ou:
“29.2 33.1 56 54 4.0 S 180.0 135.0 157.5 112.5 135.0 90.0 0.00 0.00 7.77 1020.300 125138” à 12h51.
L’objectif était ici de réduire la taille des données, car un enregistrement toutes les 8s, cela fait tout de même 10800 enregistrements par jour! En outre, ce format pourra facilement être exploité par mes applications de réseaux de neurones artificiels sans conversions. Je pourrai encore réduire la taille des données dans une prochaine version, mais il s’agit là d’une simple ébauche.

Travail à faire :

Il reste encore à améliorer ce programme, pour proposer divers modes de sortie, un mode réellement minimal, et des modes plus détaillés. Il faudra également que je mette en place un système d’envoi de données vers des serveurs web. Dans ce cas, je réduirai la fréquence d’envoi, en envoyant par exemple des moyennes, car le stockage d’autant de données remplirait mes bases de données (j’ai calculé que cela me ferait environ 350Mio/an) bien trop rapidement. En revanche, la valeur courante pourrait être envoyée à la fréquence maximale, et serait écrasée à chaque fois.

Une partie importante concerne l’étiquetage des données. Pour l’instant, je peux regarder le ciel, et dire s’il fait beau, nuageux, ou s’il pleut. Pour détecter s’il pleut ou pas, c’est simple, il suffit de mesurer la variation des précipitations enregistrées. Si elles augmentent pour deux mesures successives, c’est qu’il pleut. En revanche, je ne vois pas de moyen simple de déterminer si le ciel est ensoleillé, ou s’il est nuageux à partir des données collectées. La solution pour automatiser ce traitement sera de récupérer des données météo en ligne via une source fiable afin d’étiqueter les données.

Il conviendra de mettre au propre le code réalisé (faire un nouvel exécutable plutôt que modifier fetch2300), et probablement réaliser une interface graphique pour contrôler tout cela. Enfin, vu que ce système aura un fonctionnement de type serveur, avec envoi vers d’autres serveurs des données, il faudra pouvoir le contrôler à distance, mais également qu’il soit capable de stocker les informations en cas de coupure d’internet, et d’envoyer tous les enregistrements dès le retour de la connexion. La résistance aux coupures électriques est assurée par le fait que le serveur tourne sur un ordinateur portable, la batterie permettant 3h d’autonomie en cas de coupure, la station météo basculant quand à elle sur les piles en cas de coupure secteur.

Réseaux sociaux