Raspberry Pi - Open2300, station météo

Posté le par | Réponse(s) : 23

Comment utiliser son Raspberry Pi pour traiter des données provenant d'une station La Crosse Technology WS23xx, envoyer ces données et les afficher sur une page Web et diffuser les images de sa webcam sur la page Web?

Cela fait depuis mi-octobre que j'ai en main le fameux Raspberry Pi et j'avoue que ce nano PC n'en fini pas de me surprendre. La première fois que j'ai eu connaissance du projet RPi, j'ai de suite été séduit par le concept (au sens philosophique du terme) et je me suis mis dans l'idée de soulager mon PC d'une tâche que je lui demande de faire 24h/24, 7j/7 et 365j/an depuis bientôt 2 ans : traiter et envoyer des données météo issues de ma station météo vers Route 63, mon site perso consacré à l'Auvergne.

Pourquoi ai-je mis autant de temps à mettre en application ce projet? Par manque de temps et de connaissances. En effet, installer Open2300 n'est pas vraiment compliqué, traiter les données, je sais le faire puisque, depuis 2 ans, je bascule les datas vers le Route 63. Le seul et unique problème était la connexion entre la station météo et le Raspberry Pi qui doit se faire par usb (je le faisais jusqu'à maintenant via le connecteur série d'origine). Certes, la station est livrée avec tout le câblage nécessaire, y compris un adaptateur usb-serie reconnu par le RPi mais qui plante systématiquement. J'ai donc pris le temps de faire des recherches et, sans surprise, le soucis venait bien de ce fichu adaptateur usb-serie, je reviendrai là dessus plus bas.

« Avec le temps, un mystère sans espoir de révélation devient une frustration » (Ronald Wright) Dans mon cas, cette frustration m'a appris la patience et la détermination! (j'ai encore beaucoup à apprendre...).

La station météo

La Crosse Technology WS2355 est une station météo qui a la particularité d’être connectable à un ordinateur par RS232. Elle se compose d'une base, d'un capteur thermo/hygro (envoyant ses données à la base en 433 MHz) sur lequel viennent se relier (via câble RJ11 - câble et connecteur téléphonique) un module anémomètre/girouette et un module pluviomètre. Les données mises à jour toutes les minutes sont collectées sur la base.

La base est reliée à l'ordinateur par un câble série sur le port RS232 (désignés par les noms COM1, COM2, etc).

Télécharger, compiler et configurer de open2300

La station est livrée avec un CD contenant le logiciel Heavy Weather qui ne fonctionne exclusivement sous Windows (j'ai réussi à le faire tourner sous Ubuntu grâce à WINE mais très, TRÈS gourmand en ressource CPU et Heavy Weather n'est pas vraiment user friendly...).

Il existe une alternative Open source exploitable dans un environnement GNU/Linux. Open2300 est un ensemble d'outils (écrits en langage C pour la plupart) qui permet de lire (et écrire) des données en provenance d'une station météo Lacrosse WS2300/WS2305/WS2310/WS2315. Il comprend une bibliothèque de fonctions pour vos propres programmes. Open2300 est un projet Open source depuis Avril 2003. Il a été inscrit sur Sourceforge en Février 2004.

Voici la procédure pour installer Open2300 sur RPi et permettre l’accès aux données des stations météo de la gamme WS23xx. L’enregistrement des données dans une base de données MySQL est possible mais ici, je ne traiterai que de l'enregistrement des données dans le but de les afficher dans une page Web.

Tout d'abord, nous allons télécharger open2300, le décompresser, puis aller dans le répertoire des sources :

~$ mkdir Téléchargements
~$ cd Téléchargements
~/Téléchargements $ wget http://heanet.dl.sourceforge.net/project/open2300/open2300/1.10/open2300-1.10.zip
~/Téléchargements $ unzip open2300-1.10.zip
~/Téléchargements $ cd open2300-1.10

Puis il faut compiler open2300 avec la commande make et make install.

~/Téléchargements/open2300-1.10 $ make
~/Téléchargements/open2300-1.10 $ sudo make install

Enfin, il ne reste qu'à relier l’adaptateur sur le Raspberry Pi et la station à l’adaptateur. Sur le Raspberry Pi, tapez la commande suivante, une ligne décrivant l’adaptateur apparaîtra s’il est bien reconnu :

~$ lsusb       // retourne la ligne suivante :
Bus 001 Device 008: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port

Pour info : l'adaptateur qui m'a été vendu avec la station et un autre adaptateur qui sommeillait dans une boite depuis des lustres ne fonctionnent pas (le premier plante complètement Raspbian, le second mouline et revoie "could not reset". Il sont de type :

Bus 001 Device 010: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
et
Bus 001 Device 011: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter

Pour vérifier sous quel nom apparaît l’adaptateur dans le système, tapez la commande :

~$ sudo ls -l /dev/tty* | grep dialout     // retourne la ligne suivante :
crw-rw---T 1 root dialout   5,  3 janv.  1  1970 /dev/ttyprintk
crw-rw---T 1 root dialout 188,  0 janv.  1  1970 /dev/ttyUSB0

L’adaptateur doit apparaître sous le nom ttyUSBx, "ttyUSB0" dans mon cas. On va ensuite configurer open2300 grâce à son fichier de configuration "open2300-dist.conf" en utilisant l'éditeur de texte de votre choix.

Lors de l'installation, ce fichier de configuration n'est pas copié dans le système de fichier, on va donc le copier puis le modifier :

~/Téléchargements/open2300-1.10 $ sudo cp open2300-dist.conf /etc/open2300.conf
~/Téléchargements/open2300-1.10 $ sudo nano /etc/open2300.conf

Modifier la ligne :

SERIAL_DEVICE                 /dev/ttyS0  # /dev/ttyS0, /dev/ttyS1, COM1, COM$
par
SERIAL_DEVICE                 /dev/ttyUSB0  # /dev/ttyS0, /dev/ttyS1, COM1, COM$

Je vous laisse le soin de configurer selon vos besoins les unités de mesure et "Citizens Weather" si vous souhaitez utiliser ces services, vos paramètres mySQL. À noter que le service "Weather Underground" ne fonctionne plus.

Au début du fichier de configuration, il est noté que les emplacements par défaut dans lequel Open2300 va rechercher ce fichier de configuration. Il le recherchera dans cette séquence:

  • ./open2300.conf (répertoire de travail courant)
  • /usr/local/etc/open2300.conf (typical Linux location)
  • /etc/open2300.conf (typical Linux location) // celle que j'ai choisie

On peut désormais récupérer les données de la station et pour cela, on va utiliser fetch2300 :

~$ fetch2300
ou
~/Téléchargements/open2300-1.10 $ ./fetch2300     // si vous êtes dans le répertoire open2300-1.10

Vous devriez voir apparaître les dernières valeurs que la base d'accueil de la station a récoltées :

pi@raspberrypi ~ $ fetch2300
Date 2013-Apr-02
Time 11:36:59
Ti 20.5
Timin 15.2
Timax 21.3
TTimin 05:51
DTimin 2013-01-25
TTimax 18:52
DTimax 2013-01-01
To 7.6
Tomin -10.9
Tomax 23.1
TTomin 17:24
DTomin 2013-03-02
TTomax 15:17
DTomax 2013-03-22
DP 2.1
DPmin -14.3
DPmax 11.2
TDPmin 17:24
DDPmin 2013-03-02
[...]

Si fetch2300 retourne un message d'erreur « Could not reset », il faut modifier les droits sur l’adaptateur série avec la commande :

~$ sudo chmod a+rwx /dev/ttyUSB0

Votre Raspberry Pi est désormais capable de récupérer les données de la station, passons à l'étape suivante.

Traiter les données avec Open2300 et PHP

En fonction de vos besoins, vous pouvez traiter vos données de différente manière : utiliser vos données dans une base de donnée MySQL puis accéder à ces données dans un programme dédié ou les afficher dans une page Web par exemple. Je ne souhaite pas passer par la base de donnée car je souhaite privilégier un traitement "plus simple des données" afin de les afficher sur une page dédiée. J'ai donc opté, depuis deux ans, pour le traitement en PHP couplé à l'utilisation de scripts shell pour automatiser une série d'opérations et cron pour les exécuter périodiquement.

En premier lieu, il nous faudra installer PHP et autres modules PHP pour traiter les données :

~$ sudo apt-get update
~$ sudo apt-get install php5 php5-common php5-cgi php5-cli php5-gd

Nous allons ensuite créer un dossier (le mien se nomme "ws2355").

~$ cd ~     // pour revenir dans le répertoire utilisateur /home/pi symbolisé par ~$
~$ mkdir ws2355
~$ cd ws2355

Dans ce dossier, nous créons quatre scripts (deux en PHP, deux écrits en shell) et un dossier "data".

~/ws2355 $ mkdir data
~/ws2355 $ nano config.php      // éditez WEATHER_DATA_PATH si nécessaire
<?php
define("WEATHER_DATA_PATH", "/home/pi/ws2355/data/");
define("WS_LOG_FILE", "ws2308.log");
?>
~/ws2355 $ nano weather.sh     // éditez ce fichier selon votre configuration
#!/bin/sh
# récupération des données courantes
cd /home/pi/ws2355
/usr/bin/fetch2300 > /home/pi/ws2355/data/current.txt
sleep 3s
# Alimentation historique
/usr/bin/histlog2300 /home/pi/ws2355/data/ws2308.log
sleep 3s
# Calcul des fichiers mensuels
/usr/bin/php5-cgi /home/pi/ws2355/loaddata.php
/usr/bin/php5 /home/pi/ws2355/loaddata.php
# Exécution du second script "sendweather"
/home/pi/ws2355/sendweather
~/ws2355 $ nano sendweather    // éditez ce fichier selon votre configuration
#!/bin/sh
cd /home/pi/ws2355/data/
# Modifier ci-dessous adresse.ftp.fr par votre adresse ftp ainsi que les répertoires dans lesquels vont être transférés current.txt et le fichier d'archive de données.
ftp -i <<**
open adresse.ftp.fr
cd meteo
put current.txt
cd data
put current.txt
mput `find *.txt -newer current.txt -printf " %f"`
disconnect
bye
**
# Si vous utilisez (aussi) le RPi comme serveur web, les données peuvent y être compiées également. Pour cela, décommentez les lignes suivantes :
# cp -u /home/pi/ws2355/data/current.txt /var/www/meteo/
# cp -u /home/pi/ws2355/data/current.txt /var/www/meteo/data
# cp -R -u /home/pi/ws2355/data/* /var/www/meteo/data
~/ws2355 $ nano /home/pi/.netrc         // éditer ce fichier caché avec vos identifiants FTP (une ligne vide finale est nécessaire)
machine ftpperso.free.fr
login votre_login
password votre_mot_de_passe

  • weather.sh : récupère les données courantes, alimente l'historique dans ws2308.log, lance le calcul des fichiers mensuels et exécute le script sendweather. (weather.sh fait appelle à loaddata.php/config.php).
  • sendweather : se connecte au site Web distant via FTP et y place les données (current.txt et mxxxxxx.txt). Ce script a besoin du fichier caché .netrc paramétré avec vos identifiants FTP.
  • .netrc : ce fichier contient des séquences de connexions automatiques à des sites distants pour transfert de fichiers (voir commande ftp). Vu que ce fichier peut contenir des mots de passe, la protection doit être assurée en conséquence par la commande chmod 600 .netrc. Ce fichier doit se situer dans le dossier du user pi :
~/ws2355 $ cd ~
~$ sudo chmod 600 .netrc

Il ne reste qu'à rendre exécutable nos 4 scripts :

~$ cd ws2355
~/ws2355 $ chmod u+x config.php loaddata.php sendweather weather.sh

Vous trouverez les 5 fichiers compressés en tar.gz ou zip (n'oubliez pas de les placer correctement dans leurs répertoires.

Côté serveur Web, il reste à s'assurer de créer les chemins qui correspondent à vos paramètres sendweather. Dans mon exemple, il faut créer à la racine un dossier "/meteo" et "/meteo/data".

Ça y est votre Raspberry Pi est en mesure de collecter les données de votre station météo et de les traiter. Il est bon de tester tout cela et de préférence dans un terminal car on a peut-être oublié un paramètre. Votre terminal se fera plaisir de retourner un message d'erreur en cas de problème 😉

~$ sh /home/pi/ws2355/weather.sh

Cette commande va lancer tout le processus détaillé ci-dessus et va créer current.txt et mxxxxxx.txt dans les cibles qui ont été définies.

Automatiser la collecte des données

On va maintenant automatiser la collecte des données. Dans un premier temps, on définit l'intervalle de temps au cours de laquelle la station météo enregistre les données de l'historique :

~$ interval2300 10     // correspond à 10 minutes

Maintenant, que la station enregistre les données à intervalle de temps souhaité, on va automatiser l’exécution du script weather.sh lui aussi à un certain intervalle de temps. Pour cela deux méthodes :

  • La méthode graphique consiste à installer un gestionnaire de tache
~$ sudo apt-get install gnome-schedule

On le trouve dans menu > Outils système > Tâches Planifiées.

Nouveau >Tâche récurrente

Puis renseigner :

Description : Collecte données météo

Commande : /home/pi/ws2355/weather.sh

Date et heure > Minute : */15

Valider et cliquer sur l'icône "Lancer la tâche sélectionnée".

  • En ligne de commande avec crontab

crontab est en fait une commande qui permet de lire et de modifier un fichier appelé la "crontab". Ce fichier contient la liste des programmes que vous souhaitez exécuter régulièrement, et à quelle heure vous souhaitez qu'ils soient exécutés.

Pour afficher la crontab actuelle :

~$ crontab -l
no crontab for pi

Modification de la crontab :

~$ crontab -e

La console bascule sur un affichage nano, il suffit d'y ajouter votre commande :

*/15 * * * * sh /home/pi/ws2355/weather.sh

Enregistrez et de quittez Nano, la crontab indique qu'elle "installe" les changements et en tient compte. Si ce n'est pas le cas, rebooter. Plus d'info sur crontab ici.

Afficher les données sur une page Web

Il est temps de mettre en page toutes les données collectées. Je vais partir du principe que, sous la racine du serveur Web, deux dossiers "meteo" et "meteo/data" ont été créés.

Je ne vais pas ici entamer un cours sur HTML et CSS, je vais juste vous proposer un canevas qui vous aidera à afficher les données perçues. À vous d'enjoliver le tout en CSS.

Dans le dossier "meteo", doivent être présents un certain nombre de fichiers :

  • index.php : ici ce n'est pas un script PHP mais une simple page HTML. L'extension PHP indique au serveur qu'il devra tenir compte d'un certain nombre de script PHP dont cette page HTML fait appel.
  • day.php : script qui permet de faire les calculs sur les données journalières.
  • month.php : script qui permet de faire les calculs sur les données mensuelles.
  • daygraph.php : script qui permet d'organiser les données sous forme de graphiques pour la journée ou pour le mois.
  • form.php : script qui permet de gérer les zones de saisie pour afficher les historiques par date.
  • 6 icônes pour la tendance barométrique.

Je ne vais pas détailler tous ces scripts ici, aussi je vous les mets à disposition dans le paquetage compressé en tar.gz ou zip (à décompresser à la racine de votre serveur Web).

Votre page Web est désormais prête à recevoir les données de votre station météo. Les plus audacieux ou courageux d'entre vous s'amuseront certainement à archiver en parallèle toutes ces données avec MySQL afin d'en faire de magnifiques statistiques.

Quoiqu'il en soit, un Raspberry Pi comme serveur Web personnel, gérant des données météo est la solution la moins onéreuse que j'ai trouvé pour sa faible consommation électrique (autour de 5 watts) et pour la fiabilité du système.

Parallèlement, vous pouvez ajouter à votre page météo une weather cam, toujours propulsée par votre Raspberry Pi et sa PiCam.


Licence Creative Commons
Cet article, sauf mention contraire expresse, est publié sous licence Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported Licence.

Vous avez aimé cet article ? Alors partagez-le avec vos amis en cliquant sur les boutons ci-dessous :
Google Plus Twitter Facebook Linkedin Framasphere email Flattr !

23 commentaires sur “Raspberry Pi - Open2300, station météo

    • Bonjour, si le luxmètre fonctionne avec une base de réception à base de WS23xx, je pense que oui, fetch2300 interrogera les données de la base et j'imagine qu'une ligne de données correspondant s'affichera mais n'ayant pas le module je pourrai répondre affirmativement. Par ailleurs, je n'ai rien lu à propos du luxmètre donc ce qui me fait douter. J'aimerai bien savoir d'ailleurs si cela fonctionne, si quelqu'un peut faire un retour d'expérience, ce serait super.

  1. Merci beaucoup pour cet article.Je l'ai suivi à la lettre avec ma station WS2355 et mon Raspberry et cela fonctionne très bien.Pour moi, l'adaptateur COM/USB livré avec la station fonctionne bien. Par contre j'ai du modifié un ou deux scripts php qui ne passaient pas en 5.3.Pour la partie serveur Web, j'ai réalisé ma propre interface.Contactez moi si cela vous intéresse.Encore MERCI!

  2. Merci pour cet article dont j'ai largement abusé. Une seule question : On sait quels adaptateurs USB - série il ne faut pas utiliser mais quel est le modèle de celui qui fonctionne. Parce qu'il faut visiblement associer 2 susceptibles, la framboise et ws23xx qui ont chacune leur manies. Quel est donc le conciliateur ?

    • Bonjour, très honnêtement, je ne sais pas lesquels fonctionnent et les autres pas. j'ai parcouru de nombreux site et, il semble comme en témoigne Dechorgnat, que l'adaptateur fourni dans la boite de la station WS2355 fonctionne. En ce qui me concerne, il ne marche ni avec le RPi, ni avec mon ordi de bureau sous Debian et Ubuntu, ni avec mon laptop sous Windows. J'en ai conclu que le problème est matériel et vient de l'adaptateur lui-même et le problème semble se produire chez une poignée d'utilisateurs. Quoiqu'il en soit, j'ai acheté cet adaptateur et fonctionne parfaitement bien.
      il est de type USB type A Male RS-232 / DB9 Male. Dans tout les cas il faut un chipset PL2303 (à vérifier avec un lsusb).

  3. Merci.
    Ma station est tellement vieille que, soit il n'y avait pas de câble, soit il est perdu depuis longtemps, parce que jusqu'à maintenant, elle est branchée sur un vrai port série sur un PC. Weather.sh et autre scripts copient les données sur le raspberry par la suite. C'est pour ça que je m'inquiète pour le jour où ce sera en direct. La station est à 500 km de là où j'habite et j'ai lu tant d'horreur sur ces adaptateurs… Mais là, avoir un lien sur un, qui de plus est toujours encore en vente…

  4. Bonjour,

    Un grand merci pour votre tuto excellent.
    J'ai tout installé de A à Z grâce à vos explications.

    Une seule chose ne fonctionne pas chez moi : l'automatisation.

    Que ce soit en ligne de commande crontab ou via l'interface graphique : le fichier current.txt reste vide : 0 octets).

    Alors qu'en lançant moi-même le sh /home/pi/ws2355/weather.sh cela fonctionne à tous les coups...

    Une idée ?

    Merci d'avance,
    Thomas

    • Je ne suis pas familier de crontab -e et préfère utiliser midnight commander.
      D'abord l'installer avec un
      apt-get install mc
      Le lancer avec un
      sudo mc
      Lui indiquer d'utiliser l'éditeur interne plus simple d'utilisation si on n'est pas expert en vi et en nano.
      Options (F9 pour avoir les menus si on n'est pas en session graphique) -> Configuration -> Utiliser l'éditeur intégré.
      On édite le fichier /etc/crontab en lançant l'éditeur avec F4, dans le mien, j'ai la ligne

      7,17,27,37,47,57 * * * * pi sh /home/pi/ws2355/weather.sh
      soit on lance toutes les 10 mn, à 7, la commande.

      Après il faut une commande
      service cron restart
      pour que cron en tienne compte. On doit trouver des traces des actions de cron dans je ne sais plus quel fichier du répertoire /var/log et on peut suivre aussi ce que lance le script avec une commande
      ps ax

    • Salut Thomas,
      Ma réponse est une sorte de doublon avec celle de Txo. En fait, il fallait donner à crontab le programme qui gère le script (ajouter sh devant le chemin du script) :
      */15 * * * * sh /home/pi/ws2355/weather.sh
      J'ai d'ailleurs modifié l'article.
      En tout cas, content que tout fonctionne 🙂

  5. Bonjour,

    Merci pour cette réponse !

    Après de nombreux tests depuis hier soir, j'ai réussi à m'en sortir en consultant le log du cron et en ajoutant ces 2 lignes à mon crontab :

    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/home/pi/ws2355/

    Cela fonctionne impeccablement 😉

  6. Bonjour, je viens d installer mon RPI et open2300 tous fonctionne bien ( presque ) j ai un bug dans le relevé des données par le fichier wu2300 vers Wunderground. La valeur des rafales de vent est fausse. Quand j envoie ces données par mon PC et Ubuntu la donnée est correcte. La source open2300-10.1 et la version de php5 sont identiques !
    Avez vous aussi ce bug ?
    Qu'elle piste pour une correction ?

    merci

  7. Bonsoir,

    J'essaie de faire fonctionner votre script sans utiliser le ftp car ma page est en /var/www avec le raspberry en server.
    J'arrive à visualiser la page "actuellement" mais je n'arrives pas à faire fonctionner les graphs. J'explore donc les bugs un à un dans les différents scripts. Pour le moment quand je lance sh weather.sh j'ai une ligne d'erreur:

    pi@raspberrypi ~/ws2355 $ sh weather.sh
    weather.sh: 1: weather.sh: #!/bin/sh: not found

    Dans le dossier /bin je n'ai pas de sh. Comment faire ?

    Merci pour votre aide

  8. Bonjour et merci pour le tuto !
    J'avais déjà utilisé open2300 avec ma station WS-2350 il y a quelques années sous debian...
    J'ai été confronté au même problème que vous : j'avais un adaptateur portserie / USB qui ne fonctionnait pas :

    Bus 001 Device 010: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

    Et étant donnée que je ne voulais pas en acheté un autre et que je savais qu'il fonctionnait très bien, j'ai trouvé la solution...
    Il faut installer le driver à la mano !
    Le driver pour raspberry : http://www.ftdichip.com/Drivers/D2XX/Linux/libftd2xx-arm-v6-hf-1.3.6.tgz
    Le site du constructeur avec les autres drivers pour autres distributions : http://www.ftdichip.com/Drivers/D2XX.htm

    • Bonjour et merci d'avoir commenté avec une très pertinente précision. J'avoue qu'à l'époque, je n'avais pas cherché à plus loin et que la solution de facilité était d'en acheter un compatible. Vu le prix d'un adaptateur, ça vaut vraiment le coup de d'installer le driver.

      Merci beaucoup pour ce retour, j'update l'article dès que j'ai un moment 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *